Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

View File

@@ -0,0 +1,274 @@
;*******************************************************
;
; TCOPY - Example program to write the system tracks
; for a Concurrent CP/M Boot Disk on a
; CompuPro Computer System.
;
;*******************************************************
; This program is used to read a binary image file
; which will be loaded on the disk boot tracks. This
; binary image is used to bootstrap the Concurrent CP/M
; system file. The binary image file which TCOPY reads
; has no CMD header and must be fit within the size of
; the boot tracks we are going to write.
; This program is intended to serve as an example
; to be modified by the OEM for differently sized loaders,
; and differently sized system track(s).
; Note: TCOPY must be run under CP/M-86 1.1 and not under
; Concurrent CP/M since TCOPY performs direct BIOS calls to
; write to the disk.
; The following commands are used to generate TCOPY.CMD
; RASM86 TCOPY
; LINK86 TCOPY
;
;*******************************************************
title 'TCOPY - Copy Track 0'
; CP/M-86 function names
; console functions
c_read equ 1
c_writebuf equ 9
; file functions
f_open equ 15
f_readrand equ 33
f_setdma equ 26
f_setdmaseg equ 51
; drive functions
drv_get equ 25
dph_dpb equ 10
dpb_spt equ 0
dpb_off equ 13
; system functions
s_termcpm equ 0
s_bdosver equ 12
s_dirbios equ 50
bdos_version equ 0022h
; direct Bios Parameter Block
bpb_func equ byte ptr 0
bpb_cx equ word ptr 1
bpb_dx equ word ptr 3
; ASCII linefeed and carriage return
lf equ 10
cr equ 13
;-------------------------------------------------------
CSEG
org 0000h
;use CCP stack
mov cl,c_writebuf ;display sign on message
mov dx,offset sign_on_msg
int 224
mov cl,s_bdosver
int 224
cmp ax,bdos_version! je version_ok
mov dx,offset version_msg
jmp error
version_ok:
mov cl,drv_get ;get default drive number
int 224
mov default_drive,al
add al,'A'
mov dest_drive,al ;set drive letter in message
mov cl,f_open ;open the file given as
mov dx,offset fcb ;the 1st command parameter,
int 224 ;it is put at 05CH by
cmp al,0ffh! jne file_ok ;the program load
mov dx,offset open_msg
jmp error
file_ok:
mov current_dma,offset image_buffer
mov r0,0 ;start with sector 0, assume
mov cx,buf_siz/128 ;no CMD header in the file
file_read:
push cx
mov cl,f_setdma
mov dx,current_dma
int 224
mov cl,f_readrand ;user r0,r1,r2 for random
mov dx,offset fcb ;reads
int 224
pop cx
test al,al! jz read_ok
cmp al,1! je track_write
mov dx,offset read_msg
jmp error
read_ok:
add current_dma,128 ;set the DMA for the next sector
inc r0 ;add one to the random record field
loop file_read
mov dx,offset length_msg ;file is larger than the number
jmp error ; of available sectors to write
; We have the binary image in RAM
; Ask for destination diskette
track_write:
inc r0 ;r0 = number of sectors read
next_diskette:
mov cl,c_writebuf
mov dx,offset new_disk_msg
int 224
mov cl,c_read ;wait for a keystroke
int 224
cmp al,3! jne not_ctrlC ;check for control C
jmp done
not_ctrlC:
; Using CP/M-86 function 50, Direct bios call,
; write the track image in IMAGE_BUFFER to
; track 0, on default drive.
mov cl,default_drive
call select_disk ;select default drive
mov bx,es:dph_dpb[bx] ;get DPB
mov ax,es:dpb_spt[bx] ;get sectors/track
add ax,26 ;add in sectors for track 0
cmp ax,r0! jae size_ok ;check max # of sectors on boot tracks
mov dx,offset length_msg ; file is larger than the number
jmp error ; of available sectors to write
size_ok:
mov ax,es:dpb_off[bx] ;determine sides from OFF value
cmp ax,2! je format_ok
cmp ax,4! je format_ok
mov dx,offset format_msg
jmp error
format_ok:
shr al,1
mov second_track,al ;save track # for cylinder 1, head 0
xor cx,cx
call set_track ;set track to 0
call set_dmaseg ;set DMA segment = DS
mov current_sector,0 ;sectors are relative to 0 in BIOS
mov current_dma,offset image_buffer
mov cx,r0 ;number of 128 byte sectors to write
next_sector:
push cx ;save sector count
call set_dmaoff
call set_sector
call write_sector
add current_dma,128 ;next area of memory to write
inc current_sector ;next sector number
cmp current_sector,26
jb same_track
mov cl,second_track ;cylinder 1, head 0
call set_track
mov current_sector,0
same_track:
pop cx ;restore sector count
loop next_sector
mov cl,c_writebuf ;does the user want to write
mov dx,offset continue_msg ;to another diskette ?
int 224
mov cl,c_read ;get response
int 224
and al,05FH ;make upper case
cmp al,'Y'
jne done
jmp next_diskette
error:
push dx
call crlf
pop dx
mov cl,c_writebuf
int 224
done:
mov cx,s_termcpm
mov dx,cx
int 224
select_disk:
mov al,9 ;BIOS function number of seldsk
xor dx,dx
jmps bios
set_track:
mov al,10 ;BIOS function number of settrk
jmps bios
set_dmaseg:
mov al,17 ;BIOS function number of setdmab
mov cx,ds ;dma segment we want to use
jmps bios
set_dmaoff:
mov al,12 ;BIOS function number of setdma
mov cx,current_dma
jmps bios
set_sector:
mov al,11 ;BIOS function number of setsec
mov cx,current_sector
jmps bios
write_sector:
mov al,14 ;BIOS function number of write sector
jmps bios ;error checking can be added here
bios:
mov bx,offset bpb ;fill in BIOS Paramenter Block
mov bpb_func[bx],al
mov bpb_cx[bx],cx
mov bpb_dx[bx],dx
mov cl,s_dirbios
mov dx,bx
int 224
ret
crlf:
mov dx,offset crlf_msg
mov cl,c_writebuf
int 224
ret
;-------------------------------------------------------
DSEG
org 0000h
fcb equ ds:byte ptr .05Ch
r0 equ ds:word ptr .07Dh
r3 equ ds:byte ptr .07Fh
sign_on_msg db cr,lf,'Example TCOPY for CompuPro Computer System'
db cr,lf,'Writes track image file on boot tracks$'
new_disk_msg db cr,lf,'Put destination diskette in drive '
dest_drive db 'A:'
db cr,lf,'Strike any key when ready $'
continue_msg db cr,lf,'Write another disk (Y/N) ? $'
crlf_msg db cr,lf,'$'
version_msg db 'Requires CP/M-86 1.1$'
format_msg db 'Unrecognized disk format$'
open_msg db 'Give file name containing boot '
db 'image, after TCOPY command$'
read_msg db 'Error reading track image file$'
length_msg db 'File is larger than the the number of boot sectors$'
write_msg db 'Error writing on boot tracks$'
image_buffer rb 26*128+8*8*128 ;area for both tracks
buf_siz equ offset $ - offset image_buffer
bpb rb 5 ;direct Bios Parameter Block
current_dma dw 0
current_sector dw 0
default_drive db 0
second_track db 0
END