From: Ken Thompson Date: Wed, 14 May 1975 00:49:31 +0000 (-0500) Subject: Research V6 development X-Git-Tag: Research-V6~225 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/e91bac6d2dec9c9c318467a2a59be63e07f82946 Research V6 development Work on file usr/source/s1/dc4.s Synthesized-from: v6 --- diff --git a/usr/source/s1/dc4.s b/usr/source/s1/dc4.s new file mode 100644 index 0000000000..cdc6bda408 --- /dev/null +++ b/usr/source/s1/dc4.s @@ -0,0 +1,408 @@ +.globl getchar +.globl stats +.globl lookchar +.globl fsfile +.globl seekchar +.globl backspace +.globl putchar +.globl alterchar +.globl move +.globl rewind +.globl create +.globl zero +.globl allocate +.globl release +.globl collect +.globl getword, putword +.globl length, position +.globl w, r, a, l +/ +testing = 0 +/ +/ +/ routine to return the length of a string +/ +/ mov ...,r1 +/ jsr pc,length +/ mov r0,... +/ +length: + mov w(r1),r0 + sub a(r1),r0 + rts pc +/ +/ +/ routine to return the read pointer position +/ +/ mov ...,r1 +/ jsr pc,position +/ mov r0,... +/ +position: + mov r(r1),r0 + sub a(r1),r0 + rts pc +/ +/ +/ +/ +/ routine to get a word from the string +/ mov ...,r1 +/ jsr pc,getword +/ mov r0,... +/ +getword: + jsr pc,getchar + bes noch + movb r0,nchar + jsr pc,getchar + bec 2f + dec r(r1) + br noch +2: movb r0,nchar+1 + mov nchar,r0 + tst r0 /tst clears c-bit + rts pc +/ +/ +/ routine to put a word onto the string +/ mov ...,r1 +/ mov ...,r0 +/ jsr pc,putword +/ +putword: + jsr pc,putchar + swab r0 + jsr pc,putchar + swab r0 + rts pc +/ +.bss +nchar: .=.+2 +.text +/ +/ +/ +/ routine to read 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,getchar +/ movb r0,... +/ +getchar: + jsr pc,lookchar + bec 2f + rts pc +2: inc r(r1) + tst r0 /tst clears c-bit + rts pc +/ +noch: clr r0 + sec + 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: + .if testing + jsr pc,plausible + inc stats+6. + .endif + cmp w(r1),r(r1) + blos noch + movb *r(r1),r0 + clc + rts pc +/ +plausible: + cmp r1,$headers + bhis 9f; 4; 9: + cmp r1,$headend + blo 9f; 4; 9: + rts pc +/ +/ +/ +/ routine to move the read pointer of a string to a +/ specified point. If the string is not long enough, +/ the string is extended +/ +/ mov position,r0 +/ mov ...,r1 +/ jsr pc,seekchar +/ +seekchar: + mov r1,-(sp) + mov r0,-(sp) + .if testing + jsr pc,plausible + inc stats+10. + .endif +1: + mov (sp),r0 + add a(r1),r0 + cmp r0,l(r1) + bhi 3f + mov r0,r(r1) + cmp r0,w(r1) + blo 1f + mov r0,w(r1) + br 1f +3: + mov (sp),r0 + jsr pc,allocate + mov 2(sp),r0 + jsr pc,move + jsr pc,swap + jsr pc,release + mov 2(sp),r1 + br 1b +1: + mov (sp)+,r0 + mov (sp)+,r1 + rts pc +/ +/ +/ routine to move read pointer of string to end of string +/ +/ mov ...,r1 +/ jsr pc,fsfile +/ +fsfile: + .if testing + jsr pc,plausible + inc stats+10. + .endif + mov w(r1),r(r1) + rts pc +/ +/ +/ routine to read a string backwards +/ the read pointer is decremented before reading +/ +/ mov ...,r1 +/ jsr pc,backspace +/ mov r0,... +/ +backspace: + .if testing + jsr pc,plausible + inc stats+6. + .endif + cmp a(r1),r(r1) + bhis noch + dec r(r1) + movb *r(r1),r0 + clc + rts pc +/ +/ +/ +/ +/ routine to put a character into the string +/ pointed to by r1; character in r0 +/ r0 and r1 are preserved. +/ +/ movb ch,r0 +/ mov ...,r1 +/ jsr pc,putchar +/ +putchar: + mov r1,-(sp) + mov r0,-(sp) + .if testing + jsr pc,plausible + inc stats+8. + .endif +1: cmp w(r1),l(r1) + blt 3f + mov w(r1),r0 + inc r0 + sub a(r1),r0 /W-A+1 + jsr pc,allocate + mov 2(sp),r0 /r1 + jsr pc,move + jsr pc,swap + jsr pc,release + mov 2(sp),r1 /r1 + cmp w(r1),l(r1) + blt 3f + jmp err +/ +3: movb (sp),*w(r1) + inc w(r1) + mov (sp)+,r0 + tst (sp)+ + rts pc +/ +/ +swap: + mov w(r1),-(sp) + mov w(r0),w(r1) + mov (sp),w(r0) + mov r(r1),(sp) + mov r(r0),r(r1) + mov (sp),r(r0) + mov a(r1),(sp) + mov a(r0),a(r1) + mov (sp),a(r0) + mov l(r1),(sp) + mov l(r0),l(r1) + mov (sp)+,l(r0) + rts pc +/ +/ +/ routine to alter a character in the string +/ pointed to by r1; character in r0 +/ r0 and r1 are preserved. +/ +/ movb ch,r0 +/ mov ...,r1 +/ jsr pc,alterchar +/ +alterchar: + mov r1,-(sp) + mov r0,-(sp) + .if testing + jsr pc,preposterous + inc stats+8. + .endif +1: cmp r(r1),l(r1) + blt 3f + mov l(r1),r0 + inc r0 + sub a(r1),r0 /W-A+1 + jsr pc,allocate + mov 2(sp),r0 /r1 + jsr pc,move + jsr pc,swap + jsr pc,release + mov 2(sp),r1 /r1 + cmp r(r1),l(r1) + blt 3f + jmp err +/ +3: movb (sp),*r(r1) + inc r(r1) + cmp r(r1),w(r1) + ble 1f + mov r(r1),w(r1) +1: + mov (sp)+,r0 + tst (sp)+ + rts pc +/ +/ +/ routine to move the contents of one string +/ to another. +/ +/ mov source,r0 +/ mov dest,r1 +/ jsr pc,move +/ +/ on return, r1 points to the new string and should +/ be saved. r0 is preserved. +/ +move: + mov r3,-(sp) + mov r2,-(sp) + mov r1,-(sp) + mov r0,-(sp) + mov w(r0),r2 + sub a(r0),r2 /W-A + mov l(r1),r3 + sub a(r1),r3 /L-A + cmp r2,r3 + ble 1f + mov r2,r0 + jsr pc,allocate + mov 2(sp),r0 /r1 + jsr pc,swap + jsr pc,release + mov r0,r1 + mov 0(sp),r0 /r0 +/ +1: mov a(r0),(r0) + mov a(r1),(r1) +1: dec r2 + blt 1f + movb *(r0),*(r1) + inc (r0) + inc (r1) + br 1b +/ +/ fix up read ptr of new string +/ +1: mov r(r0),r2 + sub a(r0),r2 + add a(r1),r2 + mov r2,r(r1) +/ +/ restore and return +/ + mov (sp)+,r0 + mov (sp)+,r1 + mov (sp)+,r2 + mov (sp)+,r3 + rts pc +/ +/ +/ routine to rewind read pointer of string +/ pointed to by r1 +/ +/ mov ...,r1 +/ jsr pc,rewind +/ +rewind: + .if testing + jsr pc,plausible + inc stats+10. + .endif + mov a(r1),r(r1) + rts pc +/ +/ routine to rewind write pointer of string +/ pointed to by r1 +/ +/ mov ...,r1 +/ jsr pc,create +/ +create: + .if testing + jsr pc,plausible + inc stats+10. + .endif + mov a(r1),w(r1) + mov a(r1),r(r1) + rts pc +/ +/ +/ routine to zero a string +/ +/ mov ...,r1 +/ jsr pc,zero +/ +zero: + mov r0,-(sp) + .if testing + jsr pc,preposterous + .endif + mov a(r1),r0 +1: cmp r0,l(r1) + bhis 1f + clrb (r0)+ + br 1b +1: mov (sp)+,r0 + rts pc +/ +/