rti = 2 .globl rm .globl ck .globl loop .globl oct .globl argc .globl arg .globl tfiget .globl asmem .globl qflag .globl vflag .globl getspq .globl q .globl ask .globl getword .globl r .globl w .globl output .globl buffer .globl bufend .globl fv .globl getsp .globl release .globl nothere .globl getn .globl getchar .globl rewind .globl iflag .globl inter / output buffer / r2 = last char in buffer + 1 / r2 returned at beginning of buffer / output: sub $buffer,r2 blos 1f mov r2,0f mov $1,r0 sys write; buffer; 0:.. mov $buffer,r2 1: rts pc / / / routine to find the string pointed to by r0 / in either memory or curly / r1 = where to look / / returns error set if string not there / returns r1 = header of string if there getsp: mov r0,-(sp) mov asmem,r1 jsr pc,rewind /memory 3: jsr pc,getword bes 1f mov r0,r1 jsr pc,rewind mov (sp),r2 2: jsr pc,getchar bes 2f tstb (r2) beq 4f cmpb r0,(r2)+ beq 2b 4: mov asmem,r1 add $2,r(r1) br 3b 2: tstb (r2) bne 4b mov r1,r2 mov asmem,r1 jsr pc,getword tst (sp)+ rts pc 1: mov (sp)+,r0 sec rts pc / / finds header of string with name same as that pointed to by r0 / taking into account ? and * getspq: mov r0,-(sp) mov asmem,r1 tst qflag bgt 1f jsr pc,rewind 1: jsr pc,getword bes 1f mov r0,r1 jsr pc,rewind mov (sp),r2 2: cmpb (r2),$'* bne 3f clr strflg mov $2,qflag inc r2 tstb (r2) beq 6f mov r2,ch 3: jsr pc,getchar bes 2f tstb (r2) bne 3f cmp $2,qflag bne 4f mov ch,r2 3: cmpb (r2),$'? bne 3f inc r2 tst qflag bne 2b mov $1,qflag br 2b 3: cmpb r0,(r2)+ bne 5f inc strflg br 2b 5: cmp $2,qflag bne 4f tst strflg bne 4f dec r2 br 2b 4: mov asmem,r1 add $2,r(r1) br 1b 2: tstb (r2) bne 4b 6: mov r1,r2 mov asmem,r1 jsr pc,getword tst (sp)+ rts pc 1: mov $-1.,qflag mov (sp)+,r0 sec rts pc / / tfiget / jsr r5,tfiget / tfiget: clr r0 sys read; ch; 1 bes 1f tst iflag beq 9f; jmp loop; 9: tst r0 beq 1f movb ch,r0 rts pc 1: jmp q / / routine to print file name and error message / r2 = next free byte in buffer / nothere: mov $buffer,r2 1: tstb (r1) beq 1f movb (r1)+,(r2)+ br 1b 1: sub $buffer,r2 mov r2,0f mov $1,r0 sys write; buffer; 0:.. mov $1,r0 sys write; err4; 16. rts pc / / / routine to put characters from string in buffer / r1 = header of string / on return r2 = next free byte in buffer / getn: mov $buffer,r2 jsr pc,rewind 1: jsr pc,getchar bes 1f movb r0,(r2)+ cmp r2,$bufend bhis 1f br 1b 1: rts pc / ask: mov r2,-(sp) mov r0,r1 jsr pc,getn movb $' ,(r2)+ jsr pc,output jsr pc,tfiget cmpb $'\n,r0 bne 1f 2: mov asmem,r1 add $2,r(r1) mov (sp)+,r2 sec rts pc 1: cmpb r0,$'y beq 4f cmpb r0,$'q beq 3f 1: tst iflag bne 2b jsr pc,tfiget cmpb $'\n,r0 bne 1b br 2b 4: tst iflag bne 2b jsr pc,tfiget cmpb $'\n,r0 bne 1b mov asmem,r1 mov (sp)+,r2 clc rts pc 3: tst iflag bne 2b jsr pc,tfiget cmpb $'\n,r0 bne 1b mov (sp)+,r2 jmp loop inter: inc iflag rti / to remove an entry from asmem - r points to name ptr / rm: mov r3,-(sp) mov asmem,r1 mov r(r1),r3 sub $4,r(r1) mov r(r1),r2 mov r2,-(sp) 1: mov r3,r(r1) jsr pc,getword bes 1f mov r(r1),r3 mov r2,r(r1) jsr pc,alterword mov r(r1),r2 br 1b 1: mov r2,w(r1) mov (sp)+,r(r1) mov (sp)+,r3 rts pc / / check that header pointed to by r2 released / ck: mov r2,-(sp) mov l(r2),r0 sub a(r2),r0 sub $hblk,r2 jsr pc,log2 asl r0 mov r0,ch mov frlist(r0),r0 1: beq 1f cmp r2,r0 beq 2f add $hblk,r0 mov (r0),r0 br 1b 2: mov ch,r0 inc freeb(r0) mov (sp)+,r2 rts pc 1: mov (sp)+,r2 sec rts pc oct: mov r1,-(sp) mov r0,r1 clr r0 div $8.,r0 mov r1,-(sp) add $'0,(sp) tst r0 beq 1f jsr r5,oct 1: movb (sp)+,ch mov $1,r0 sys write; ch; 1 mov (sp)+,r1 rts r5 decml: mov r1,-(sp) mov r0,r1 clr r0 div $10.,r0 mov r1,-(sp) add $'0,(sp) tst r0 beq 1f jsr r5,decml 1: movb (sp)+,ch mov $1,r0 sys write; ch; 1 mov (sp)+,r1 rts r5 / / iflag: 0 qflag: 0 vflag: 0 .data err4: < not in memory.\n> err1: end1: .even .bss freeh: .=.+2 freeb: .=.+32. freen: ch: .=.+2 strflg: .=.+2 buffer: .=.+512. bufend: .=.+2 argc = buffer + 20. arg = buffer + 256. fv: .=.+2 .text