LSX/src/rxboot2.s
/disk boot
core = 12.
rootdir = 1
rp = 0
rk = 0
rf = 0
rx = 1
hp = 0
.. = [core*2048.]-512.
reset = 5
large = 10000
start:
mov pc,r2
tst -(r2)
mov $..,sp
mov sp,r1
cmp pc,r1
bhis 2f
reset
1:
mov (r2)+,(r1)+
cmp r1,$end
blo 1b
jmp (sp)
/output message to tty
2:
.if rx
tst r0 / unit number is in r0 (0,1)
jeq 0f
bis $20,readop / set instruct to read unit 1
0:
.endif
mov $nm,r1
1:
movb (r1)+,r0
beq 1f
jsr pc,putc
br 1b
/get command from tty
1:
clr r1
2:
clr r0
3:
movb r0,(r1)+
4:
jsr pc,getc
cmp r0,$'\n
beq 1f
cmp r0,$'@
beq 1b
cmp r0,$'
beq 2b
cmp r0,$'#
bne 3b
dec r1
bgt 4b
br 1b
/put command on stack in exec format
1:
mov sp,r3
clrb (r1)+
clrb (r1)+
bic $1,r1
sub r1,sp
clr r2
1:
tst r1
beq 1f
movb -(r1),-(r3)
beq 1b
2:
mov r3,r4
movb -(r1),-(r3)
bne 2b
mov r4,-(sp)
inc r2
br 1b
1:
mov r2,-(sp)
/look up command path name
.if hp
mov $hpcs1,r0
mov $40,8.(r0) /drive clear
mov $21,(r0) /preset
mov $10000,26.(r0) /fmt22
.endif
decb -(r4)
mov $rootdir,in
1:
jsr pc,geti
mov r4,r3
mov $buf+512.,r5
2:
mov r3,r4
mov r5,r0
add $16.,r5
3:
cmp r0,$buf+512.
blo 4f
jsr pc,getblk
br start
sub $512.,r5
4:
cmp r3,r4
bne 5f
mov (r0)+,in
beq 2b
5:
tstb (r4)+
beq 1f
cmpb (r4),$'/
beq 1b
cmp r0,r5
bhis 5b
cmpb (r4),(r0)+
beq 3b
br 2b
1:
jsr pc,geti
clr r3
1:
jsr pc,getblk
br start
cmp (r0),$407
bne 2f
add $20,r0
2:
mov (r0)+,(r3)+
cmp r0,$buf+512.
blo 2b
jsr pc,getblk
br 1f
br 2b
1:
jsr pc,*$0
geti:
mov in,r1
add $31.,r1
mov r1,-(sp)
asr r1
asr r1
asr r1
asr r1
jsr pc,rblk
mov (sp)+,r1
bic $!17,r1
asl r1
asl r1
asl r1
asl r1
asl r1
add r0,r1
mov $inode,r0
1:
mov (r1)+,(r0)+
cmp r0,$addr+16.
blo 1b
clr r2
rts pc
getblk:
add $2,(sp)
mov r2,r0
inc r2
bit $large,mode
bne 1f
asl r0
mov addr(r0),r1
bne rblk
2:
sub $2,(sp)
clr r0
rts pc
1:
mov r0,-(sp)
clrb r0
swab r0
asl r0
mov addr(r0),r1
beq 2b
jsr pc,rblk
asl (sp)
bic $!776,(sp)
add (sp)+,r0
mov (r0),r1
beq 2b
rpda = 176724
rkda = 177412
rfda = 177466
rxda = 177170
rblk:
.if rx
mov r5,-(sp)
mov r4,-(sp)
mov r3,-(sp)
mov r2,-(sp)
mov $rxda,r4
mov $rxda+2,r3
mov $buf,r2
asl r1
asl r1
mov r1,-(sp) / sectr = blockno * 4
mov r1,r5
add $4,r5 / blkno*4 + 4
L1: bit $40,(r4)
beq L1
mov (pc)+,(r4) / *ptcs = READ|GO|UNIT
readop: 7
mov (sp),r1 / now calculate sector,track
/ sector = (sectr * 3) % 26 + 1
asl r1
add (sp),r1
clr r0
0:
sub $26.,r1
bmi 0f
inc r0
br 0b
0:
add $27.,r1
L6: tstb (r4) /while(ptcs->lobyte == 0);
jeq L6
movb r1,(r3) / ptdb->lobyte = sector
mov r0,r1
/ track = sectr/26 + 1
clr r0
0:
sub $3,r1
bmi 0f
inc r0
br 0b
0:
inc r0
cmp $77., r0 / if(sector == 77.) sector = 0
bne L9
clr r0
L9: tstb (r4) / while(ptcs->lobyte == 0);
jeq L9
movb r0,(r3) / ptcs->lobyte = track
L11: tstb (r4) / while(ptcs->lobyte == 0);
jeq L11
mov $3,(r4) / *ptcs = EMPTY|GO
jbr L16 / do {
L2: movb (r3),(r2)+ / while(ptcs->lobyte < 0)
L16: tstb (r4) / *ptbf++ = ptdb->lobyte
jlt L2 / } while(ptcs->lobyte <= 0)
tstb (r4)
jle L16
inc (sp) / increment blkno and see if it is
cmp (sp),r5 / less than blkno*4 + 4
jlt L1 / yes--loop again.
tst (sp)+
mov (sp)+,r2
mov (sp)+,r3
mov (sp)+,r4
mov (sp)+,r5
mov $buf, r0
rts pc
.endif
.if rx-1
clr r0
.if rp
div $10.,r0
mov r1,-(sp)
mov r0,r1
clr r0
div $20.,r0
bisb r1,1(sp)
mov $rpda,r1
mov (sp)+,(r1)
.endif
.if rk
div $12.,r0
ash $4,r0
add r1,r0
mov $rkda+2,r1
.endif
.if rf
ashc $8.,r0
mov r0,*$rfda+2
ashc $16.,r0
mov $rfda+2,r1
.endif
hpcs1 = 176700
hpda = 176706
hpdc = 176734
.if hp
div $22.,r0
mov r1,-(sp)
mov r0,r1
clr r0
div $19.,r0
mov r0,*$hpdc
bisb r1,1(sp)
mov (sp)+,r0
mov $hpda+2,r1
.endif
mov r0,-(r1)
mov $buf,r0
mov r0,-(r1)
mov $-256.,-(r1)
.if rf+rk+rp
mov $5,-(r1)
.endif
.if hp
mov $71,-(r1)
.endif
1:
tstb (r1)
bge 1b
rts pc
.endif
tks = 177560
tkb = 177562
getc:
mov $tks,r0
inc (r0)
1:
tstb (r0)
bge 1b
mov tkb,r0
bic $!177,r0
cmp r0,$101
blo 1f
cmp r0,$132
bhi 1f
add $40,r0
1:
cmp r0,$15
bne putc
mov $12,r0
tps = 177564
tpb = 177566
putc:
tstb tps
bge putc
cmp r0,$12
bne 1f
mov $15,r0
jsr pc,putc
mov $212,r0
jsr pc,putc
clr r0
jsr pc,putc
mov $12,r0
rts pc
1:
mov r0,tpb
rts pc
nm:
.byte 012
.if rp
<rp boot:\0>
.endif
.if rk
<rk boot:\0>
.endif
.if rf
<rf boot:\0>
.endif
.if hp
<hp boot:\0>
.endif
.if rx
<rx boot:\0>
.endif
.even
in: rootdir
end:
inode = ..-1024.
mode = inode
addr = inode+8.
buf = inode+32.