/ UNIX/v7m RL01/2 disk block 0 bootstrap / Can only boot from unit zero. / Assumes disk at standard address (0174400). core = 24. .. = [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 clr r0 cmp pc,r1 bhis 2f 1: mov (r0)+,(r1)+ cmp r1,$core*2048. blo 1b jmp (sp) / clear core to make things clean 2: clr (r0)+ cmp r0,sp blo 2b / prompt / read in path name / breaking on '/' into 14 ch names mov $trvect,r5 mov $names,r2 1: mov r2,r1 2: jsr pc,getc cmp r0,$'\n beq 1f cmp r0,$'/ beq 3f movb r0,(r1)+ br 2b 3: cmp r2,r1 beq 2b add $14.,r2 br 1b / start of path name decoding / start with first name and root ino 1: mov $names,r2 mov $1,r0 / get next inode 1: clr bno jsr pc,iget tst (r2) beq 1f / read next directory looking for next name 2: jsr pc,rmblk br start mov $buf,r1 3: mov r2,r3 mov r1,r4 add $16.,r1 tst (r4)+ beq 5f 4: cmpb (r3)+,(r4)+ bne 5f cmp r4,r1 blo 4b mov -16.(r1),r0 add $14.,r2 br 1b 5: cmp r1,$buf+512. blo 3b br 2b / last entry was found / read into 0. 1: clr r2 1: jsr pc,rmblk br callout mov $buf,r1 2: mov (r1)+,(r2)+ cmp r1,$buf+512. blo 2b br 1b / subroutine will read in inode / number specified in r0 iget: add $31.,r0 mov r0,r5 ash $-4.,r0 jsr pc,rblka bic $!17,r5 ash $5.,r5 add $buf,r5 mov $inod,r4 1: mov (r5)+,(r4)+ cmp r4,$addr+16. blo 1b rts pc / routine to read in block / number specified by bno / after applying file system / mapping algorithm in inode. / bno is incremented, success / return is a skip, error (eof) / is direct return. LRG = 10000 rmblk: add $2,(sp) mov bno,r0 inc bno bit $LRG,mode bne 1f asl r0 mov addr(r0),r0 bne rblka 2: sub $2,(sp) rts pc / large algorithm / huge algorithm is not implemented 1: clr -(sp) movb r0,(sp) clrb r0 swab r0 asl r0 mov addr(r0),r0 beq 2b jsr pc,rblka mov (sp)+,r0 asl r0 mov buf(r0),r0 beq 2b rblka: mov r0,dska br rblk / read and echo (via fall-through) a teletype character 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: / print a teletype character tps = 177564 tpb = 177566 putc: cmp r0,$'\r bne 9f mov $'\n,r0 9: cmp r0,$'\n bne 2f mov $'\r,r0 jsr pc,(r5) mov $'\n,r0 2: tstb tps bpl 2b mov r0,tpb rts pc / relocate core around / assembler header callout: clr r0 cmp (r0),$407 bne 2f 1: mov 20(r0),(r0)+ cmp r0,sp blo 1b / enter program and / restart if return 2: mov $..,-(sp) clr pc / transfer vector for tty subroutines trvect: br 9b br getc / rl01 & rl02 disk driver. / low order address in dno, / high order in r0. rladdr = 174400 rlcsr = rladdr rlmpr = rladdr+6 nblks = 20. gtsta = 4 / commands seek = 6 rdhdr = 10 read = 14 gsmbo = 1 / get status command gsgs = 2 gsreset = 10 skmbz = 152 / seek command skgo = 1 skdir = 4 sksurf = 20 skhead = 100 / stored in unused bit below cylinder skcyl = 177600 rdsurfsec = 177 / read command rdsurf = 100 rblk: clr r0 mov dska,r1 div $nblks,r0 ash $6,r0 / cylinder << 7 asl r1 / sector bis r0,r1 mov cylin,r3 mov r0,r4 bic $rdsurfsec,r4 mov r4,cylin cmp r4,r3 bhi 1f sub r4, r3 br 2f 1: sub r3,r4 mov r4,r3 bis $skdir,r3 2: bic $!rdsurf,r0 bis r3,r0 bis $skgo+sksurf,r0 bit $skhead,r0 bne 1f bic $sksurf,r0 / do seek 1: bic $skmbz,r0 mov $seek,r3 jsr pc,rlgo / do read mov r1,r0 mov $read,r3 jsr pc,rlgo 3: rts pc / reset drive 4: mov $gsreset+gsgs+gsmbo,r0 mov $gtsta,r3 / send command data (in disk address register) and command (in command / status register) rlgo: mov $rlmpr,r4 mov $-256.,(r4) mov r0,-(r4) mov $buf,-(r4) mov r3,-(r4) 1: tstb (r4) bpl 1b tst (r4) bpl 3b / error - reset drive and seek to known cylinder tst (sp)+ jsr pc,4b mov $seek,r3 mov $skcyl+skgo,r0 jsr pc,rlgo clr cylin br rblk .bss end: inod = ..-1024. mode = inod addr = inod+8. buf = inod+32. bno = buf+514. dska = bno+2 cylin = dska+2 names = cylin+2 .text