/ UNIX/v7m RK06/7 disk block 0 bootstrap / Can only boot from unit zero. / Assumes disk at standard address (0177440). / / Fred Canter 5/1/81 / / Disk boot program to load and transfer / to a unix file system entry. reset = 5 halt = 0 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 clr r0 mov sp,r1 cmp pc,r1 bhis 2f 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 / initialize the disk hardware / and select the drive. / / Attempt to select rk06 first, / if the drive can't be selected as rk06 / then try to select it as an rk07, / if that fails then halt ! reset mov $21,dtcmd /rk06 drive type + read cmd mov $hkcs1,r0 /Disk CSR address clr 10(r0) /unit 0 select mov $3,(r0) /pack ack for rk06 1: tstb (r0) /wait for ready bpl 1b tst (r0) /error ? bpl 4f /no, drive is rk06 ! bit $40,14(r0) /yes, drive type error ? beq 3f /no, fatal error reset /yes, drive is not rk06 mov $2021,dtcmd /rk07 drive type + read cmd clr 10(r0) /try rk07 unit 0 mov $2003,(r0) /pack ack rk07 2: tstb (r0) /wait for ready bpl 2b tst (r0) /error ? bpl 4f /no, continue boot 3: halt /halt if can't select drive 4: / print CRLF # as a prompt mov $'\r,r0 jsr pc,putc mov $'#,r0 jsr pc,putc / at origin, read pathname, / spread out in array 'names', one / component every 14 bytes. mov $names,r1 1: mov r1,r2 2: jsr pc,getc cmp r0,$'\n bne 4f cmp r1,r2 beq 4b br 1f 4: 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: clr pc / 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 / rk06 & rk07 disk driver. / low order address in dno, / high order in r0. hkcs1 = 177440 hkda = hkcs1+6 hkcs2 = hkcs1+10 hkds = hkcs1+12 hkdc = hkcs1+20 rblk: mov r1,-(sp) mov dno,r1 div $22.*3.,r0 mov r0,*$hkdc clr r0 div $22.,r0 swab r0 bis r1,r0 mov $hkda,r1 mov r0,(r1) mov $buf,-(r1) mov $-256.,-(r1) mov dtcmd,-(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: mov r0,*$tpb 2: tstb *$tps bge 2b 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. dtcmd = bno+2 dno = dtcmd+2 names = dno+2