Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

239 lines
5.0 KiB
Plaintext

;****************************************************************
;* *
;* TCOPY - Example program to write the system track *
;* for a Concurrent CP/M-86 Boot Disk on the *
;* IBM Personel Computer *
;* *
;****************************************************************
; This program is used to read a binary image file of
; track 0. This track is used to bootstrap Concurrent
; CP/M-86. The file TCOPY reads has no CMD header and
; must be the same size as the track 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 and not Concurrent
; CP/M-86 since TCOPY performs direct BIOS calls.
; The command
; GENCMD TCOPY
; is used to generate the CMD form of this program.
title 'TCOPY - Copy Track 0'
;CP/M-86, CCP/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
;system functions
s_termcpm equ 0
s_dirbios equ 50
;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
;how many 128 byte records to read for a loader image
records_to_read equ 8 * 4
;8 = number of physical sectors per track
;4 = number of 128 sectors per
;physical sector
cseg ;use CCP stack
mov cl,c_writebuf ;display sign on message
mov dx,offset sign_on_msg
int 224
mov cl,drv_get ;get default drive number
int 224
test al,al ;must run on drive A:
jz drive_ok
mov dx,offset drive_msg
jmp error
drive_ok:
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 ;the program load
jne file_ok
mov dx,offset open_msg
jmp error
file_ok:
mov current_dma,offset track0_buffer
mov r0,0 ;start with sector 0, assume
mov cx,records_to_read ;no CMD header in the file
file_read:
push cx ;keep the record count
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 ;restore the record count
test al,al
jz read_ok
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
; We have the Track 0 image in RAM
; Ask for destination diskette
next_diskette:
mov cl,c_writebuf
mov dx,offset new_disk_msg
int 224
mov cl,c_read ;wait for a keystroke
int 224
; Using CP/M-86 function 50, Direct bios call,
; write the track image in TRACK0_BUFFER to
; track 0, on drive A:.
call select_disk ;select A:
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 track0_buffer
mov cx,32 ;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
pop cx ;restore sector count
loop next_sector
jmp track_ok
select_disk:
mov al,9 ;BIOS function number of seldsk
xor cx,cx ;always drive A:
mov dx,cx
jmps bios
set_track:
mov al,10 ;BIOS function number of settrk
xor cx,cx ;go to track 0
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
track_ok:
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
crlf:
mov dx,offset crlf_msg
mov cl,c_writebuf
int 224
ret
dseg
org 5ch
fcb rb 33
r0 dw 0
r3 db 0
org 100h
sign_on_msg db 'Example TCOPY for IBM PC', cr, lf
db 'Reads track image file and writes '
db 'it on track 0$'
new_disk_msg db cr,lf,'Put destination diskette in A:'
db cr,lf
db 'Strike any key when ready $'
continue_msg db cr,lf,'Write another Track 0 (Y/N) ? $'
crlf_msg db cr,lf,'$'
drive_msg db 'TCOPY runs only on drive A:$'
open_msg db 'Give file name containing track 0 '
db 'image, after TCOPY command$'
read_msg db 'File is not long enough$'
write_msg db 'Error writing on track 0$'
track0_buffer rb 1000H ;4K tracks
bpb rb 5 ;direct Bios Parameter Block
current_dma dw 0
current_sector dw 0