mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
142 lines
3.2 KiB
ArmAsm
142 lines
3.2 KiB
ArmAsm
*********************************************************
|
|
* *
|
|
* Disk Initialization Program for CP/M-68K (tm) *
|
|
* *
|
|
* Copyright Digital Research 1983 *
|
|
* *
|
|
*********************************************************
|
|
*
|
|
*
|
|
*
|
|
prntstr = 9 BDOS Functions
|
|
readbuf = 10
|
|
*
|
|
seldsk = 9 BIOS Functions
|
|
settrk = 10
|
|
setsec = 11
|
|
setdma = 12
|
|
write = 14
|
|
sectran = 16
|
|
flush = 21
|
|
*
|
|
.text
|
|
*
|
|
start: link a6,#0
|
|
move.l 8(a6),a0 base page address
|
|
add #$81,a0 first character of command tail
|
|
scan: cmpi.b #$20,(a0)+ skip over blanks
|
|
beq scan
|
|
cmpi.b #$61,-(a0) get disk letter
|
|
blt upper upshift
|
|
sub #$20,(a0)
|
|
upper: cmpi.b #$41,(a0) compare with range A - P
|
|
blt erxit
|
|
cmpi.b #$50,(a0)
|
|
bgt erxit
|
|
query: move.b (a0),d0 put disk letter in message
|
|
move.b d0,msgdskx
|
|
ext.w d0 put disk letter into range 0 - 15
|
|
sub.w #$41,d0
|
|
move.w d0,dsk
|
|
move.w #prntstr,d0 ask whether it's really ok to init
|
|
move.l #msgdsk,d1
|
|
trap #2
|
|
move.w #readbuf,d0 read reply
|
|
move.l #buf,d1
|
|
trap #2
|
|
move.b buf+2,d0 if answer isn't Y then exit
|
|
cmpi.b #$59,d0
|
|
beq doit
|
|
cmpi.b #$79,d0
|
|
bne exit
|
|
*
|
|
doit: lea buf,a0 init disk buffer to empty directory entries
|
|
move.l #$e5e5e5e5,d0
|
|
move.w #31,d1
|
|
bloop: move.l d0,(a0)+
|
|
dbf d1,bloop
|
|
move.w #setdma,d0 set up dma address for write
|
|
move.l #buf,d1
|
|
trap #3
|
|
move.w #seldsk,d0 select the disk
|
|
move.w dsk,d1
|
|
clr.b d2
|
|
trap #3
|
|
tst.l d0 check for select error
|
|
beq selerx
|
|
move.l d0,a0 get translate table address for sectran
|
|
move.l (a0),xlt
|
|
move.l 14(a0),a0 get DPB address
|
|
move.w (a0),spt get sectors per track
|
|
move.w 8(a0),drm get directory entry count - 1
|
|
move.w 14(a0),trk get starting track (=offset)
|
|
clr.w sect start at sector 0
|
|
clr.w count count of initialized sectors
|
|
*
|
|
dloop: move.w count,d0 while count <= drm ...
|
|
cmp.w drm,d0
|
|
bgt exit
|
|
move.w sect,d1 check for end-of-track
|
|
cmp.w spt,d1
|
|
blt sok
|
|
clr.w sect advance to new track
|
|
add.w #1,trk
|
|
sok: move.w #settrk,d0 set the track
|
|
move.w trk,d1
|
|
trap #3
|
|
move.w #sectran,d0 do sector translate
|
|
move.w sect,d1
|
|
move.l xlt,d2
|
|
trap #3
|
|
move.w d0,d1 set sector
|
|
move.w #setsec,d0
|
|
trap #3
|
|
move.w #write,d0 and write
|
|
clr.w d1
|
|
trap #3
|
|
tst.w d0 check for write error
|
|
bne wrterx
|
|
add #1,sect increment sector number
|
|
add #4,count increment count of directory entries
|
|
bra dloop and loop
|
|
*
|
|
exit: move.w #flush,d0 exit location - flush bios buffers
|
|
trap #3
|
|
unlk a6
|
|
rts and exit to CCP
|
|
*
|
|
erxit: move.l #erstr,d1 miscellaneous errors
|
|
erx: move.w #prntstr,d0 print error message and exit
|
|
trap #2
|
|
bra exit
|
|
*
|
|
selerx: move.l #selstr,d1 disk select error
|
|
bra erx
|
|
wrterx: move.l #wrtstr,d1 disk write error
|
|
bra erx
|
|
*
|
|
.data
|
|
msgdsk: .dc.b 'Do you really want to init disk '
|
|
msgdskx:.dc.b 'x ? $'
|
|
*
|
|
.even
|
|
buf: .dc.b 126,0 dual use buffer -- console input & dsk output
|
|
.ds.b 126
|
|
*
|
|
xlt: .ds.l 1 translate table address
|
|
spt: .ds.w 1 sectors per track
|
|
drm: .ds.w 1 maximum directory entry number
|
|
sect: .ds.w 1 current sector
|
|
trk: .ds.w 1 current track
|
|
dsk: .ds.w 1 selected disk
|
|
count: .ds.w 1 number of directory entries written so far
|
|
*
|
|
erstr: .dc.b 'Error',13,10,'$'
|
|
selstr: .dc.b 'Select Error',13,10,'$'
|
|
wrtstr: .dc.b 'Write Error',13,10,'$'
|
|
*
|
|
copyrt: .dc.b 'CP/M-68K(tm), Version 1.1, Copyright 1983, Digital Research'
|
|
serial: .dc.b 'XXXX-0000-654321'
|
|
*
|
|
.end
|