AUSAM/source/mdec/hk07lib
ehk.s 4c / rk06 disk driver
hkcs1 = 177440 / control & status 1
hkda = 177446 / desired track/sector address
hkcs2 = 177450 / control & status 2
hkds = 177452 / drive status
hkdc = 177460 / desired cylinder
ack = 03 / pack acknowledge
rk07 = 2000 / bit set for rk07 drives
ddt = 400 / drive type bit (hkds)
clear = 040 / subsystem clear
inc $-1 / first time ?? dirty but saves space
bne 1f
mov $clear,*$hkcs2
bit $ddt,*$hkds / is it an rk07?
beq 2f
mov $ack+rk07,*$hkcs1
br 0f
2:
mov $ack,*$hkcs1
0:
tstb *$hkcs1
bpl 0b / wait for acknowledge to complete
1:
mov dska,r1
clr r0
div $22.,r0 / r0 = sectors r1 = blocks
mov r1,-(sp)
mov r0,r1
clr r0
div $3.,r0 / r0 = cylinder r1 = track
bisb r1,1(sp)
mov r0,*$hkdc / cylinder wanted
mov $hkda,r1
mov (sp)+,(r1) / track & sector wanted
mov ba,-(r1) / bus address
mov wc,-(r1) / word count
mov $iocom,-(sp)
bit $ddt,*$hkds / an rk07?
beq 1f
bis $rk07,(sp)
1:
mov (sp)+,-(r1)
1:
tstb (r1)
bpl 1b / wait for iocom to complete
rts pc
hhkf.s 4c / format RK06/7 disk packs
/ written since you can't trust DEC shitty one
/
/ ian j
/ UNSW may '79
/
hkcs1 = 177440 / control & status 1
hkwc = 177442 / word count
hkba = 177444 / bus address
hkda = 177446 / track and sector
hkcs2 = 177450 / control & status 2
hkds = 177452 / drive status
hkdc = 177460 / desired cylinder
zero = 2000 / a word of zeros
cack = 2002 / an 'ack' command of the right type
cwhd = 2004 / a 'write header' command
cwrt = 2006 / a 'write' command
table = 2010 / build sector header here
ack = 003 / pack acknowledge
whd = 027 / write header
write = 023 / write data
rk07 = 2000 / this drive is an rk07
clear = 040 / subsystem clear
bai = 020 / bus increment inhibit
ddt = 400 / disk drive type
5 / reset
mov $140000,sp / decent stack
clr *$zero / really a zero now
jsr pc,mesg
<\n\n RK06/7 disk formatter\n\n\0>; .even
jsr pc,mesg
<ready drive 0 and type y\n\0>; .even
jsr pc,getc
mov r0,-(sp)
mov $'\n,r0
jsr pc,putc
cmp (sp)+,$'y
beq 1f
jsr pc,mesg
<\nNo formatting done\n\n\0>; .even
rts pc
1:
mov $clear,*$hkcs2
mov $ack,cack
mov $whd,cwhd
mov $write,cwrt
mov $1233.,r4 / number of tracks on an rk06
bit $ddt,*$hkds / is it an rk07?
beq 1f
mov $rk07+ack,cack
mov $rk07+whd,cwhd
mov $rk07+write,cwrt
mov $2445.,r4 / number of tracks on an rk07
1:
mov cack,*$hkcs1
1:
tstb *$hkcs1
bge 1b / wait for acknowledge
2:
/ calculate cylinder and track address of next track to be done
mov r4,r3
dec r3 / track address
clr r2
div $3,r2 / r2 = cyl r3 = trk
/ set up table of sector headers
mov $22.,r0
mov $table,r1
mov r3,r5
ash $5,r5 / position track no for header
bis $140000,r5 / good sectors all
0:
mov r2,(r1)+ / cylinder is first word
mov r5,(r1)+ / sector/trk is second word
mov r5,(r1)
xor r2,(r1)+ / check sum
inc r5 / next sector
sob r0,0b / all 22 sectors thankyou
/ do the track formatting
swab r3 / postion track no in hibyte
mov r3,*$hkda / want this track
mov r2,*$hkdc / want this cyl
mov $table,*$hkba / 22 sector headers live here
mov $-66.,*$hkwc / 66 words for 22 sector headers
clr *$hkcs2 / drive 0 no BAI
mov cwhd,*$hkcs1 / will format 1 track
1:
tstb *$hkcs1 / wait for format to complete
bge 1b
tst *$hkcs1
blt 2f
/ init the track with all zeros
mov $-5632.,*$hkwc
mov $zero,*$hkba
mov $bai,*$hkcs2
mov r3,*$hkda
mov r2,*$hkdc
mov cwrt,*$hkcs1
1:
tstb *$hkcs1 / wait for write to complete
bge 1b
tst *$hkcs1
blt 2f
dec r4
jne 2b / do them all
/ formatting complete return to loader
jsr pc,mesg
<\n\nFormatting complete\n\nmachine halted\n\0>; .even
0
2:
jsr pc,mesg
<hkf: error\n\0>; .even
rts pc
/ read and echo character from tty.
/ perform normal cr/lf uc/lc mapping.
tks = 177560
tkb = 177562
getc:
tstb *$tks
bge getc
mov tkb,r0
bic $!177,r0
cmp r0,$'A
blo 1f
cmp r0,$'Z
bhi 1f
add $'a-'A,r0
1:
cmp r0,$'\r
bne putc
mov $'\n,r0
/ put a character on the tty.
/ also performs delay.
tps = 177564
tpb = 177566
putc:
cmp r0,$'\n
bne 1f
mov $'\r,r0
jsr pc,putc
mov $'\n,r0
1:
tstb tps
bpl 1b
mov r0,tpb
rts pc
/ write a string to tty
/ jsr pc, mesg; <string\0>; .even
mesg:
movb *(sp),r0
beq 1f
jsr pc,putc
inc (sp)
br mesg
1:
add $2,(sp)
bic $1,(sp)
rts pc
1rhk.s 4c / read rk06
rblk:
iocom = 21
whk.s 4c / write rk06
wblk:
iocom = 23
,