home *** CD-ROM | disk | FTP | other *** search
- / disk boot program to load and transfer
- / to a unix entry
-
- / entry is made by jsr pc,*$0
- / so return can be rts pc
-
- core = 28.
- .. = [core*2048.]-512.
-
- / establish sp and check if running below
- / intended origin, if so, copy
- / program up to 'core' K words.
- start:
- mov $..,sp
- mov sp,r1
- cmp pc,r1
- bhis 2f
- clr r0
- cmp (r0),$407
- bne 1f
- mov $20,r0
- 1:
- mov (r0)+,(r1)+
- cmp r1,$end
- blo 1b
- jmp (sp)
-
- / clear core to make things clean
- 2:
- clr (r0)+
- cmp r0,sp
- blo 2b
-
- / at origin, read pathname,
- / initialize rp
-
- clr *$rpcs / selects drive zero
- / spread out in array 'names', one
- / component every 14 bytes.
- mov $names,r1
- 1:
- mov r1,r2
- 2:
- jsr pc,getc
- cmp r0,$'\n
- beq 1f
- cmp r0,$'/
- beq 3f
- movb r0,(r2)+
- br 2b
- 3:
- cmp r1,r2
- beq 2b
- add $14.,r1
- br 1b
-
- / now start reading the inodes
- / starting at the root and
- / going through directories
- 1:
- mov $names,r1
- mov $2,r0
- 1:
- clr bno
- jsr pc,iget
- tst (r1)
- beq 1f
- 2:
- jsr pc,rmblk
- br start
- mov $buf,r2
- 3:
- mov r1,r3
- mov r2,r4
- add $16.,r2
- tst (r4)+
- beq 5f
- 4:
- cmpb (r3)+,(r4)+
- bne 5f
- cmp r4,r2
- blo 4b
- mov -16.(r2),r0
- add $14.,r1
- br 1b
- 5:
- cmp r2,$buf+512.
- blo 3b
- br 2b
-
- / read file into core until
- / a mapping error, (no disk address)
- 1:
- clr r1
- 1:
- jsr pc,rmblk
- br 1f
- mov $buf,r2
- 2:
- mov (r2)+,(r1)+
- cmp r2,$buf+512.
- blo 2b
- br 1b
- / relocate core around
- / assembler header
- 1:
- clr r0
- cmp (r0),$407
- bne 2f
- 1:
- mov 20(r0),(r0)+
- cmp r0,sp
- blo 1b
- / enter program and
- / restart if return
- 2:
- jsr pc,*$0
- br start
-
- / get the inode specified in r0
- iget:
- add $15.,r0
- mov r0,r5
- ash $-3.,r0
- bic $!17777,r0
- mov r0,dno
- clr r0
- jsr pc,rblk
- bic $!7,r5
- ash $6,r5
- add $buf,r5
- mov $inod,r4
- 1:
- mov (r5)+,(r4)+
- cmp r4,$inod+64.
- blo 1b
- rts pc
-
- / read a mapped block
- / offset in file is in bno.
- / skip if success, no skip if fail
- / the algorithm only handles a single
- / indirect block. that means that
- / files longer than 10+128 blocks cannot
- / be loaded.
- rmblk:
- add $2,(sp)
- mov bno,r0
- cmp r0,$10.
- blt 1f
- mov $10.,r0
- 1:
- mov r0,-(sp)
- asl r0
- add (sp)+,r0
- add $addr+1,r0
- movb (r0)+,dno
- movb (r0)+,dno+1
- movb -3(r0),r0
- bne 1f
- tst dno
- beq 2f
- 1:
- jsr pc,rblk
- mov bno,r0
- inc bno
- sub $10.,r0
- blt 1f
- ash $2,r0
- mov buf+2(r0),dno
- mov buf(r0),r0
- bne rblk
- tst dno
- bne rblk
- 2:
- sub $2,(sp)
- 1:
- rts pc
-
- cyl = 0.
- read = 4
- go = 1
-
- rpcs = 176710
- rpda = 176724
- rpca = 176722
- rpba = 176720
- / rp03 disk driver.
- / low order address in dno,
- / high order in r0.
- rblk:
- mov r1,-(sp)
- mov dno,r1
- div $20.*10.,r0
- / add $cyl,r0
- mov r0,*$rpca
- clr r0
- div $10.,r0
- swab r0
- bis r1,r0
- mov r0,*$rpda
- mov $rpba,r1
- mov $buf,(r1)
- mov $-256.,-(r1)
- mov $read+go,-(r1)
- 1:
- tstb (r1)
- bge 1b
- mov (sp)+,r1
- rts pc
-
- tks = 177560
- tkb = 177562
- / read and echo a teletype character
- getc:
- mov $tks,r0
- inc (r0)
- 1:
- tstb (r0)
- bge 1b
- mov tkb,r0
- bic $!177,r0
- cmp r0,$'A
- blo 1f
- cmp r0,$'Z
- bhi 1f
- add $'a-'A,r0
- 1:
-
- tps = 177564
- tpb = 177566
- / print a teletype character
- putc:
- tstb *$tps
- bge putc
- mov r0,*$tpb
- cmp r0,$'\r
- bne 1f
- mov $'\n,r0
- br putc
- 1:
- rts pc
-
- end:
- inod = ..-1024.
- addr = inod+12.
- buf = inod+64.
- bno = buf+512.
- dno = bno+2
- names = dno+2
- reset = 5
-