MiniUnix/usr/source/mdec/dtf.s
/ unix DEC-tape time/mtrack track formatter
nword = 256.
nblock = 578.
endz = 7200.
ps = 177776
tcst = 177340
tccm = 177342
tcwc = 177344
tcba = 177346
tcdt = 177350
mov r5,savr5
mov sp,savsp
start:
mov savr5,r5
mov savsp,sp
jsr pc,4(r5)
<set up to format on drive 0\n\0>
.even
clr r0
mov $cobtab,r1
1:
jsr pc,bcomobv
mov r2,(r1)+
inc r0
cmp r0,$512.
bne 1b
mov $buffer,r0
1:
mov $-1,(r0)+
cmp r0,$buffer+nword+nword
blo 1b
mov savr5,r5
jsr pc,2(r5)
mov $340,ps
mov $tcdt,r5
mov $13,tccm
jsr pc,flag
/ 8Kch for end zone
mov $endz,r4
1:
jsr r0,mtrack; 101101
dec r4
bne 1b
/ foreward guard
mov $199.,r4
1:
jsr r0,mtrack; 10101
dec r4
bne 1b
/ blocks
mov $nblock,r3
1:
jsr r0,mtrack; 10101
jsr r0,mtrack; 10110
jsr r0,mtrack; 11010
jsr r0,mtrack; 01000
jsr r0,mtrack; 01000
jsr r0,mtrack; 01000
jsr r0,mtrack; 01000
mov $nword-4,r4
2:
jsr r0,mtrack; 111000
dec r4
bne 2b
jsr r0,mtrack; 111011
jsr r0,mtrack; 111011
jsr r0,mtrack; 111011
jsr r0,mtrack; 111011
jsr r0,mtrack; 101001
jsr r0,mtrack; 100101
jsr r0,mtrack; 10101
dec r3
bne 1b
/ rear guard
mov $199.,r4
1:
jsr r0,mtrack; 10101
dec r4
bne 1b
/ rear end zone
mov $endz,r4
1:
jsr r0,mtrack; 10010
dec r4
bne 1b
clr tccm
/ end of mtrack pass
/ go back 12 blocks
mov $12.,r0
mov $4002,tccm
1:
incb tccm
jsr pc,flag
dec r0
bne 1b
/ put comobv(nblock-1) in everything
/ up to end zone
mov $nblock-1,r0
mov r0,bn
jsr pc,comobv
mov $17,tccm
jsr pc,flag
1:
movb r1,tcst
mov r0,(r5)
jsr pc,flag1
br 1b
/ reverse pass put in
/ foreward and reverse
/ block numbers
mov $4017,tccm
jsr pc,flag
1:
mov $nword+3.,r4
2:
clrb tcst
clr (r5)
jsr pc,flag
dec r4
bne 2b
clrb tcst
clr (r5)
mov bn,r0
jsr pc,comobv
jsr pc,flag
movb r1,tcst
mov r0,(r5)
jsr pc,flag
dec bn
blt check
clrb tcst
clr (r5)
jsr pc,flag
clrb tcst
clr (r5)
jsr pc,flag
clrb tcst
mov bn,(r5)
jsr pc,flag
clrb tcst
clr (r5)
jsr pc,flag
clrb tcst
clr (r5)
jsr pc,flag
br 1b
/ foreward pass
/ confirm block numbers
/ write all 1's in data
check:
clrb tcst
clr (r5)
jsr pc,flag1
br check
clr r4
1:
mov $3,tccm
jsr pc,flag
cmp (r5),r4
bne error1
mov $-nword,tcwc
mov $buffer,tcba
mov $15,tccm
jsr pc,flag
inc r4
cmp r4,$nblock
bne 1b
mov $3,tccm
jsr pc,flag1
br error2
/ reverse pass
/ confirm block numbers
/ read data and compare
/ to all 1's
1:
mov $4003,tccm
jsr pc,flag
dec r4
cmp r4,(r5)
bne error3
mov $-nword,tcwc
mov $buffer,tcba
mov $4005,tccm
jsr pc,compare
jsr pc,flag
tst r4
bne 1b
mov $4003,tccm
jsr pc,flag1
br error4
jsr pc,compare
jmp start
error1:
mov $1,r0
br 1f
error2:
mov $1,r0
br 1f
error3:
mov $3,r0
br 1f
error4:
mov $4,r0
br 1f
error5:
mov $5,r0
br 1f
error6:
mov $6,r0
br 1f
error7:
mov $7,r0
1:
add $'0,r0
movb r0,0f
mov tcst,-(sp)
mov tccm,-(sp)
mov $1,tccm
mov savr5,r5
jsr pc,4(r5)
<error>
0:
<x\ntcst in r0; tccm in r1\n\0>
.even
mov (sp)+,r1
mov (sp)+,r0
0
rts pc
compare:
mov r0,-(sp)
mov $buffer,r0
1:
cmp (r0)+,$-1
bne error5
cmp r0,$buffer+nword+nword
blo 1b
mov (sp)+,r0
rts pc
mtrack:
mov (r0)+,(r5)
jsr pc,flag
rts r0
flag:
bit $100200,tccm
beq flag
blt error6
rts pc
flag1:
bit $100200,tccm
beq flag1
bge 1f
tst tcst
bge error7
add $2,(sp)
1:
rts pc
comobv:
mov r0,r4
bic $!777,r0
asl r0
mov cobtab(r0),r0
swab r0
clr r1
ror r0
rol r1
asl r0
asl r0
rol r1
swab r4
bic $177401,r4
bis cobtab(r4),r0
rts pc
bcomobv:
mov r0,r2
bic $!70,r2
mov r0,r3
mov $6.,r4
1:
asr r3
dec r4
bne 1b
bic $!7,r3
bis r3,r2
mov r0,r3
mov $6.,r4
1:
asl r3
dec r4
bne 1b
bic $!700,r3
bis r3,r2
com r2
bic $!777,r2
rts pc
bn: .=.+2
savr5: .=.+2
savsp: .=.+2
cobtab: .=.+1024.
buffer: .=.+nword+nword