/ / routine to read from disc to a buffer / wcing the buffer if necessary / mov disc addr,r0 / mov buffer addr,r2 / jsr pc,getb / on return r0 = addr of byte in buffer / getb: mov r3,-(sp) mov r1,-(sp) mov r0,-(sp) mov r2,r3 asr r3 mov r3,r1 ashc $9.,r1 bic $777,r1 add $b1,r1 tst w1(r2) / w ble 1f jsr pc,clean 1: mov (sp),r0 bic $777,r0 /get lowest multiple of 512. mov r0,0f mov r0,b1s(r2) /set start mov afi,r0 sys seek;0:..;0 mov r1,0f sys read;0:..;512. mov b1s(r2),b1e(r2) add $512.,b1e(r2) / set end clr w1(r2) /clear w mov (sp)+,r0 sub b1s(r2),r0 add r1,r0 / set r0=byte addr in buffer mov (sp)+,r1 mov (sp)+,r3 rts pc / / / routine to wc a buffer / mov buffer addr,r2 / mov buffer addr+6,r1 beginning of buffer / jsr pc,clean / clean: mov r0,-(sp) mov b1s(r2),0f mov afout,r0 sys seek;0:..;0 mov r1,0f sys write;0:..;512. clr w1(r2) /clear w mov (sp)+,r0 rts pc / / routine to get buffer addr of byte whose disc / addr is in r0 - also returns addr of write / flag for buffer in r2 / mov disc addr,r0 / jsr pc,bufchar / mov (r0),r0 for read / inc (r2) for write must inc w / c-bit set if char not in either buffer / bufchar: mov r1,-(sp) mov r3,-(sp) clr r3 1: mov r3,r2 asl r2 cmp r0,b1s(r2) blo 2f cmp r0,b1e(r2) bhis 2f sub b1s(r2),r0 mov r3,r1 ashc $9.,r1 bic $777,r1 add r1,r0 add $b1,r0 mov (sp)+,r3 mov (sp)+,r1 clc rts pc 2: inc r3 cmp r3,nbuf blt 1b mov (sp)+,r3 mov (sp)+,r1 sec rts pc / / routine to get a buffer / mov disc addr,r0 / jsr pc,getbuf / mov (r0),r0 (for read) / inc (r2) must inc w for w / getbuf: mov r4,-(sp) mov r3,-(sp) mov $2,r3 clr r2 mov $1,r4 1: cmp r4,nbuf bge 1f cmp u1(r3),u1(r2) bhis 2f mov r3,r2 2: inc r4 add $2.,r3 br 1b 1: mov r2,r3 jsr pc,getb add $stats+6.,r3 inc (r3) mov (sp)+,r3 mov (sp)+,r4 rts pc / / routine to look at next character from string / pointed to by r1; character returned in r0 / c-bit set if character not available (end of file) / r1 is preserved / / mov ...,r1 / jsr pc,lookchar / movb r0,... / lookchar: mov r2,-(sp) jsr pc,plausible cmp w(r1),r(r1) /W,R blos noch mov r(r1),r0 jsr pc,bufchar bec 2f jsr pc,getbuf / 2: inc flag bne 2f jsr pc,fixct br 1f 2: mov flag,u1(r2) 1: mov (sp)+,r2 movb (r0),r0 tst r0 /clears c-bit rts pc / noch: mov (sp)+,r2 clr r0 sec rts pc / / / routine to put a character into the string / pointed to by r1; character in r0 / r0 is preserved; r1 points to the string / after return and must be saved. / / movb ch,r0 / mov ...,r1 / jsr pc,putchar / mov r1,... / putchar: mov r2,-(sp) mov r1,-(sp) mov r0,nchar jsr pc,plausible 1: cmp w(r1),l(r1) /W,L blt 3f mov w(r1),r0 inc r0 sub a(r1),r0 /W-A+1 jsr pc,allocate mov (sp),r0 jsr pc,copy jsr pc,swap jsr pc,release mov (sp),r1 / 3: mov w(r1),r0 jsr pc,bufchar bec 2f jsr pc,getbuf 2: movb nchar,(r0) mov $1,w1(r2) mov nchar,r0 /to preserve r0 for user inc w(r1) inc flag bne 2f jsr pc,fixct br 1f 2: mov flag,u1(r2) 1: mov (sp)+,r1 mov (sp)+,r2 rts pc / / fixct: mov r1,-(sp) mov r3,-(sp) mov nbuf,r1 mov nbuf,flag 2: mov r1,u1(r2) dec r1 bge 1f mov (sp)+,r3 mov (sp)+,r1 rts pc 1: clr r2 mov $2,r3 1: cmp r3,nbuf2 bge 2b cmp u1(r3),u1(r2) blo 2f mov r3,r2 2: add $2,r3 br 1b