mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
237 lines
5.0 KiB
Plaintext
237 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
|
||
|