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