📄 form5.s
字号:
.globl b1.globl hblk.globl headers.globl initl.globl asmem.globl b1s.globl b1e.globl w1.globl stats.globl lookchar.globl flush.globl fsfile.globl seekchar.globl backspace.globl alterchar.globl zero.globl getchar.globl putchar.globl copy.globl rewind.globl create.globl allocate.globl release.globl collect.globl w,r,a,l.globl getword.globl putword.globl backword.globl alterword/// routine to read next character from string/ pointer to by r1; character returned in r0/ c-bit set if character not availiable (eof)// mov ...,r1/ jsr pc,getchar/ movb r0,.../getchar: jsr pc,lookchar bes 1f inc r(r1) tst r0 /clears c-bit1: rts pc/// routine to read a string backwards/ the read pointer is decremented before reading// mov ...,r1/ jsr pc,backspace/ mov r0,.../backspace: cmp a(r1),r(r1) bhis nochc dec r(r1) jsr pc,lookchar rts pcnochc: clr r0 sec rts pc/// routine to put a word onto the string// mov ...,r1/ mov ...,r0/ jsr pc,putword/putword: mov r0,-(sp) sub $hblk,r0 jsr pc,putchar swab r0 jsr pc,putchar mov (sp)+,r0 rts pc/// routine to get a word from the string// mov ...,r1/ jsr pc,getword/ mov r0,.../getword: jsr pc,lookchar bes 1f movb r0,nchar inc r(r1) jsr pc,lookchar bes 1f movb r0,nchar+1 inc r(r1) mov nchar,r0 add $hblk,r01: rts pc/// routine to alter the word pointed to by r(r1)/ by replacing the word there with r0// mov wd,r0/ mov ...,r1/ jsr pc,alterword/alterword: mov r0,-(sp) sub $hblk,r0 jsr pc,alterchar swab r0 jsr pc,alterchar mov (sp)+,r0 rts pc/// routine to get words backwards from string// mov ...,r1/ jsr pc,backword/ mov r0,.../backword: cmp a(r1),r(r1) bhis nochw dec r(r1) jsr pc,lookchar movb r0,nchar+1 cmp a(r1),r(r1) bhis nochw dec r(r1) jsr pc,lookchar movb r0,nchar mov nchar,r0 add $hblk,r0 rts pc/nochw: clr r0 sec rts pc/// routine to copy the contents of one string/ to another.// mov source,r0/ mov dest,r1/ jsr pc,copy/ mov r1,...// on return, r1 points to the new string and should/ be saved. r0 is preserved./copy: inc stats+12. mov r0,-(sp) mov r1,-(sp) mov r2,-(sp) mov r3,-(sp) mov w(r0),r2 sub a(r0),r2 /W-A (old) mov l(r1),r3 sub a(r1),r3 /L-A (new) cmp r2,r3 blos 1f mov r2,r0 jsr pc,allocate mov 4(sp),r0 /new jsr pc,swap jsr pc,release mov r0,r1 mov 0(sp),r0 /old1: mov a(r1),w(r1) /rewind w pointer cmp r2,$512. blos copy1 /is a short string/ jsr pc,flush jsr pc,reset/ mov a(r0),-(sp)4: mov (sp),0f mov afi,r0 sys seek;0:.. ;0 /set input pointer cmp r2,$512. blos 2f mov $512.,r3 /# output this time mov r3,0f mov r3,3f add r3,(sp) sub r3,r2 /# left to output br 1f2: mov r2,0f mov r2,3f mov r2,r3 clr r21: mov afi,r0 sys read;b1;0:.. bes bad cmp r0,r3 bne bad mov afout,r0 mov (r1),0f add r3,(r1) sys seek;0:.. ;0 sys write;b1;3:.. bes bad tst r2 bgt 4b tst (sp)+// fix up read ptr of new string/copy2: mov 6(sp),r0 /restore r0 mov r(r0),r2 sub a(r0),r2 add a(r1),r2 mov r2,r(r1)// restore and return/ mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r1 mov (sp)+,r0 rts pc/bad: mov $1,r0 sys write;1f;2f-1f 41: <error on copy\n>2: .even/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// copy a short string/copy1: mov r(r0),-(sp) mov a(r0),r(r0) mov nchar,-(sp) mov r0,r2 /old mov r1,r3 /new1: mov r2,r1 jsr pc,getchar bes 1f mov r3,r1 jsr pc,putchar br 1b1: mov r2,r0 mov (sp)+,nchar mov (sp)+,r(r0) mov r3,r1 br copy2////// routine to rewind read pointer of string/ pointed to by r1// mov ...,r1/ jsr pc,rewind/rewind: mov a(r1),r(r1) rts pc/// routine to rewind write pointer of string/ pointed to by r1// mov ...,r1/ jsr pc,create/create: 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),w(r1) clrb r01: cmp w(r1),l(r1) bhis 1f jsr pc,putchar br 1b1: mov a(r1),w(r1) mov (sp)+,r0 rts pc//// routine to move the read pointer of a string to the/ relative position indicated by r0. the string is/ extended if necessary - there is no error return.// mov position,r0/ mov ...,r1/ jsr pc,seekchar/seekchar: mov r1,-(sp) mov r0,-(sp) .if testing jsr pc,preposterous .endif inc stats+10.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 1f3: mov (sp),r0 jsr pc,allocate mov 2(sp),r0 jsr pc,copy jsr pc,swap jsr pc,release mov 2(sp),r1 br 1b1: 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: mov r0,-(sp) .if testing jsr pc,preposterous .endif inc stats+10. mov w(r1),r(r1) mov (sp)+,r0 rts pc/// routine to place the character in r0 at the current/ position of the read pointer - the read pointer/ is not moved.// movb ch,r0/ mov ...,r1/ jsr pc,alterchar/ mov r1,.../alterchar: mov r2,-(sp) mov r1,-(sp) mov r0,nchar .if testing jsr pc,preposterous .endif inc stats+8.1: cmp r(r1),l(r1) /W,L blo 3f mov l(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),r13: mov r(r1),r0 jsr pc,bufchar bec 2f jsr pc,getbuf2: movb nchar,(r0) mov $1,w1(r2) mov nchar,r0 /to preserve r0 for user inc r(r1) cmp r(r1),w(r1) blos 3f mov r(r1),w(r1)3: mov (sp)+,r1 mov (sp)+,r2 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) inc stats+6. .if testing jsr pc,preposterous .endif 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 1f2: 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 .if testing jsr pc,preposterous .endif inc stats+8.1: cmp w(r1),l(r1) /W,L blo 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),r13: mov w(r1),r0 jsr pc,bufchar bec 2f jsr pc,getbuf2: 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 1f2: mov flag,u1(r2)1: mov (sp)+,r1 mov (sp)+,r2 rts pc/// routine to flush contents of all buffers.// jsr pc,flush/flush: mov r1,-(sp) mov r2,-(sp) mov r3,-(sp) clr r31: cmp r3,$numb bhis 1f mov r3,r2 asl r2 tst w1(r2) ble 2f mov r3,r1 ashc $9.,r1 bic $777,r1 add $b1,r1 jsr pc,clean2: inc r3 br 1b1: mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r1 rts pc//reset: mov r3,-(sp) mov r2,-(sp) clr r31: cmp r3,$numb bge 1f mov r3,r2 asl r2 mov $-1.,w1(r2) clr b1s(r2) clr b1e(r2) clr u1(r2) inc r3 br 1b1: clr flag mov (sp)+,r2 mov (sp)+,r3 rts pc/// 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,clean1: 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: inc stats+24. 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 r31: 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 pc2: inc r3 cmp r3,$numb 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,r41: cmp r4,$numb bge 1f cmp u1(r3),u1(r2) bhis 2f mov r3,r22: inc r4 add $2.,r3 br 1b1: mov r2,r3 jsr pc,getb add $stats+14.,r3 inc (r3) mov (sp)+,r3 mov (sp)+,r4 rts pc/// this routine renumbers the time used cell u1(r2)/ of the buffers when the clock overflows/fixct: mov r1,-(sp) mov r3,-(sp) mov $numb,r1 mov $numb,flag2: mov r1,u1(r2) dec r1 bge 1f mov (sp)+,r3 mov (sp)+,r1 rts pc1: clr r2 mov $2,r31: cmp r3,$numb2 bge 2b cmp u1(r3),u1(r2) blo 2f mov r3,r22: add $2,r3 br 1b
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -