📄 dc1.s
字号:
.globl log2.globl getchar.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 w, r, a, l/ cmp (sp)+,$2 blo 1f tst (sp)+ mov (sp)+,0f cmpb *0f,$'- beq 8f sys 0; 9f.data9: sys open; 0:.=.+2; 0.text bec 2f mov $1,r0 sys write; 4f; 5f-4f sys exit/4: <Input file.\n>5: .even/2: mov r0,source1: sys signal; 2; 1 ror r0 bcs 1f sys signal; 2; case1771:8: clr delflag mov $pdl,r5/ mov $10.,r0 jsr pc,log2 mov r0,log10 mov $1,r0 jsr pc,allocate mov r1,scalptr clr r0 jsr pc,putchar clr r0 jsr pc,allocate mov r1,basptr mov $10.,r0 jsr pc,putchar mov $1,r0 jsr pc,allocate mov r1,inbas mov $10.,r0 jsr pc,putchar mov $1,r0 jsr pc,allocate mov $10.,r0 jsr pc,putchar mov r1,tenptr clr r0 jsr pc,allocate mov r1,chptr clr r0 jsr pc,allocate mov r1,strptr mov $1,r0 jsr pc,allocate mov $2,r0 jsr pc,putchar mov r1,sqtemp clr r0 jsr pc,allocate mov r1,divxyzloop: tst delflag bne in177 mov sp,errstack jsr pc,readc mov $casetab,r11: tst (r1)+ beq 2f cmp r0,(r1)+ bne 1b jmp *-4(r1)2: jmp eh/// case for new line (which is special for apl box)/case012: br loop/// case q for quit/case161: cmp readptr,$readstack+2 blos 1f mov *readptr,r1 beq 2f jsr pc,release2: sub $2,readptr mov *readptr,r1 beq 2f jsr pc,release2: sub $2,readptr jmp loop1: sys exit/// case Q for controlled quit/case121: jsr pc,pop jes eh jsr pc,length cmp r0,$2 jhi eh1 jsr pc,rewind jsr pc,getchar jmi eh1 jsr pc,release1: cmp readptr,$readstack jlos eh mov *readptr,r1 beq 2f jsr pc,release2: sub $2,readptr sob r0,1b jbr loop/// case of delete character/case177: sys signal; 2; case177 mov $1,delflag mov r0,-(sp) mov 2(sp),r0 cmp -6(r0),$sys+read bne 1f sub $6,2(sp) clr delflag1: mov (sp)+,r0 2 /rti/in177: mov $' ,ch mov $1,r0 sys write; 1f; 1 clr delflag jmp eh/.bssdelflag: .=.+2.text1: <\n> .even/// case digit/case060: movb r0,savec jsr pc,readin jsr pc,push br loop/// case _ for negative numbers/case137: jsr pc,readin jsr pc,fsfile jsr pc,backspace mov r0,savk dec w(r1) jsr pc,chsign mov savk,r0 jsr pc,putchar jsr pc,push jbr loop/// case screamer/case041: jsr pc,in041 jbr loop/in041: jsr pc,readc cmp r0,$'< jeq in74a cmp r0,$'= jeq in75a cmp r0,$'> jeq in76a/ mov $field,r1 movb r0,(r1)+1: jsr pc,readc movb r0,(r1)+ cmpb r0,$'\n bne 1b clrb (r1)+/ sys fork br 9f sys wait mov $1,r0 sys write; screamer; 2 rts pc9: sys exec; 6f; 8f sys exit.data8: 6f; 7f; field; 06: </bin/sh\0>7: <-c\0>screamer: <!\n> .even.bssfield: .=.+70..text/// case d for duplicate/case144: cmp r5,$pdl jeq eh clr r0 jsr pc,allocate mov -2(r5),r0 jsr pc,move jsr pc,push jmp loop/// case z for stack size/case172: clr r0 jsr pc,allocate mov r5,r3 sub $pdl,r3 asr r32: beq 2f clr r2 dvd $100.,r2 mov r3,r0 jsr pc,putchar mov r2,r3 br 2b2: clr r0 jsr pc,putchar jsr pc,push jmp loop/// case c for flush/case143:2: jsr pc,pop jes loop jsr pc,release br 2b// case s for save/case163: tst sfree bne 1f jsr pc,sinit1: jsr pc,readc cmp r5,$pdl bne 2f movb $'s,ch jmp eh2: clr r2 cmpb r0,$128. / check for array blo 1f inc r21: asl r0 mov stable(r0),r1 beq 2f mov r1,r0 mov 2(r0),r1 tst r2 beq 4f mov r1,-(sp) / have array - release elements jsr pc,rewind1: mov (sp),r13: jsr pc,getword bes 1f tst r0 beq 3b mov r0,r1 jsr pc,release br 1b1: mov (sp)+,r14: jsr pc,release jsr pc,pop mov r1,2(r0) jbr loop2: mov sfree,stable(r0) mov stable(r0),r0 mov (r0),sfree beq symout clr (r0) jsr pc,pop mov r1,2(r0) jmp loop/symout: mov $1,r0 sys write; 7f; 8f-7f jmp reset/7: <Symbol table overflow.\n>8: .even//sinit: mov $sfree+4,r01: mov r0,-4(r0) clr -2(r0) add $4,r0 cmp r0,$sfend blos 1b clr sfend-4 rts pc//.bsssfree: .=.+512.sfend:.text/// case S for save/case123: tst sfree bne 1f jsr pc,sinit1: jsr pc,readc cmp r5,$pdl bne 2f movb $'S,ch jbr eh2: clr r3 cmp r0,$128. / check for array blo 1f inc r31: asl r0 mov stable(r0),r1 beq 2f mov sfree,r2 mov (r2),sfree beq symout mov stable(r0),(r2) mov r2,stable(r0) jsr pc,pop tst r3 beq 1f jsr pc,length / to make auto arrays work cmp r0,$1 bhi 1f jsr pc,zero1: mov r1,2(r2) jbr loop2: mov sfree,stable(r0) mov stable(r0),r2 mov (r2),sfree beq symout clr (r2) jsr pc,pop tst r3 beq 1f jsr pc,length cmp r0,$1 bhi 1f jsr pc,zero1: mov r1,2(r2) jbr loop/// case l for load/case154: jsr pc,in154 jmp loop/in154: jsr pc,readc clr r2 cmp r0,$128. / check for array blo 1f inc r21: asl r0 mov stable(r0),r1 beq 1f mov 2(r1),r1 mov r1,-(sp) jsr pc,length jsr pc,allocate tst r2 beq 2f mov r1,-(sp) / have array - copy elements mov 2(sp),r1 jsr pc,rewind3: mov 2(sp),r1 jsr pc,getword bes 3f tst r0 beq 4f mov r0,-(sp) mov r0,r1 jsr pc,length jsr pc,allocate mov (sp)+,r0 jsr pc,move mov r1,r0 mov (sp),r1 jsr pc,putword br 3b4: clr r0 mov (sp),r1 jsr pc,putword br 3b3: mov (sp)+,r1 jsr pc,push tst (sp)+ rts pc2: mov (sp)+,r0 jsr pc,move jsr pc,push rts pc1: clr r0 jsr pc,allocate jsr pc,putword jsr pc,push rts pc// case : for save array/case072: tst sfree bne 1f jsr pc,sinit1: jsr pc,pop jes eh jsr pc,scalint jsr pc,fsfile jsr pc,backspace tst r0 jmi eh1 / neg. index jsr pc,length cmp r0,$2 jhi eh1 / index too high jsr pc,fsfile clr r3 cmp r0,$1 blo 1f beq 2f jsr pc,backspace mov r0,r3 mul $100.,r32: jsr pc,backspace add r0,r3 cmp r3,$2048. jhis eh1 / index too high asl r31: jsr pc,release jsr pc,readc cmp r5,$pdl bne 2f movb $':,ch jmp eh2: asl r0 mov stable(r0),r1 beq 2f mov r1,-(sp) mov 2(r1),r1 mov l(r1),r0 sub a(r1),r0 sub $2,r0 cmp r3,r0 blos 1f mov r1,-(sp) / need more space mov r3,r0 add $2,r0 jsr pc,allocate jsr pc,zero mov (sp)+,r0 jsr pc,move mov r1,-(sp) mov r0,r1 jsr pc,release mov (sp)+,r11: mov r1,-(sp) mov r3,r0 jsr pc,seekchar jsr pc,getword bes 1f sub $2,r(r1) tst r0 beq 1f mov r0,r1 jsr pc,release1: jsr pc,pop jes eh mov r1,r0 mov (sp)+,r1 jsr pc,alterchar swab r0 jsr pc,alterchar mov (sp)+,r0 mov r1,2(r0) jmp loop2: mov sfree,stable(r0) mov stable(r0),r0 mov (r0),sfree jeq symout clr (r0) mov r0,-(sp) mov r3,r0 add $2,r0 jsr pc,allocate jsr pc,zero sub $2,r0 jsr pc,seekchar mov r1,-(sp) br 1b// case ; for load array/case073: tst sfree bne 1f jsr pc,sinit1: jsr pc,pop jes eh jsr pc,scalint jsr pc,fsfile jsr pc,backspace tst r0 jmi eh1 / neg. index jsr pc,length cmp r0,$2 jhi eh1 jsr pc,fsfile clr r3 cmp r0,$1 blo 1f beq 2f jsr pc,backspace mov r0,r3 mul $100.,r32: jsr pc,backspace add r0,r3 cmp r3,$2048. jhis eh1 / index too high asl r31: jsr pc,release jsr pc,readc asl r0 mov stable(r0),r1 beq 1f mov 2(r1),r1 jsr pc,length sub $2,r0 cmp r3,r0 bhi 1f / element not here mov r3,r0 jsr pc,seekchar jsr pc,getword tst r0 beq 1f mov r0,r1 mov r1,-(sp) jsr pc,length jsr pc,allocate mov (sp)+,r0 jsr pc,move jsr pc,push jmp loop1: clr r0 jsr pc,allocate jsr pc,putword jsr pc,push jmp loop/// case L for load/case114: jsr pc,readc clr r2 cmp r0,$128. / check for array blo 1f inc r21: asl r0 mov stable(r0),r1 beq 4f mov (r1),stable(r0) mov sfree,(r1) mov r1,sfree mov 2(r1),r1 tst r2 beq 2f mov r1,-(sp) / have array - assume a throw away jsr pc,rewind1: mov (sp),r13: jsr pc,getword bes 1f tst r0 beq 3b mov r0,r1 jsr pc,release br 1b1: mov (sp)+,r12: jsr pc,push jbr loop4: movb $'L,ch jbr eh/// case - for subtract/case055: jsr pc,in055 jmp loop/in055: jsr pc,pop jes eh jsr pc,fsfile jsr pc,backspace mov r0,savk dec w(r1) jsr pc,chsign mov savk,r0 jsr pc,putchar jsr pc,push br in053/// case + for add/case053: jsr pc,in053 jmp loop/in053: jsr pc,eqk mov $add3,r0 jsr pc,binop jsr pc,pop mov savk,r0 jsr pc,putchar jsr pc,push rts pc/// case * for multiply/case052: jsr pc,pop jes eh mov r1,-(sp) jsr pc,pop jec 1f mov (sp)+,r1 jsr pc,push jbr eh1: jsr pc,fsfile jsr pc,backspace mov r0,savk2 dec w(r1) mov r1,r2 mov (sp)+,r1 jsr pc,fsfile jsr pc,backspace mov r0,savk1 dec w(r1) mov r1,r3 mov $mul3,r0 jsr pc,binop jsr pc,pop cmp savk1,savk2 blo 1f mov savk1,r2 br 2f1: mov savk2,r22: cmp r2,k bhis 1f mov k,r21: add savk2,savk1 cmp r2,savk1 bhis 1f mov r2,-(sp) neg r2 add savk1,r2 jsr pc,removc mov (sp)+,r02: jsr pc,putchar jsr pc,push jmp loop1: mov savk1,r0 br 2b// r1 = string/ r2 = count/ result returned in r1 (old r1 released)/removc: mov r1,-(sp) jsr pc,rewind1: cmp r2,$1 blos 1f jsr pc,getchar sub $2,r2 br 1b1: mov $2,r0 jsr pc,allocate mov r1,-(sp)1: mov 2(sp),r1 jsr pc,getchar bes 1f mov (sp),r1 jsr pc,putchar mov r1,(sp) br 1b1: cmp r2,$1 bne 1f mov (sp),r3 mov tenptr,r2 jsr pc,div3 mov r1,(sp) mov r3,r1 jsr pc,release mov r4,r1 jsr pc,release1: mov 2(sp),r1 jsr pc,release mov (sp)+,r1 tst (sp)+ rts pc// case / for divide/case057: jsr pc,dscale mov $div3,r0 jsr pc,binop mov r4,r1 jsr pc,release jsr pc,pop mov savk,r0 jsr pc,putchar jsr pc,push jmp loop//dscale: jsr pc,pop jes eh mov r1,-(sp) jsr pc,pop bec 1f mov (sp)+,r1 jsr pc,push jmp eh1: mov r1,-(sp) jsr pc,fsfile jsr pc,backspace mov r0,savk1 dec w(r1) jsr pc,rewind mov 2(sp),r1 jsr pc,fsfile jsr pc,backspace mov r0,savk2 dec w(r1) mov k,r2 sub savk1,r2 add savk2,r2 mov k,savk mov (sp)+,r1 tst r2 bmi 1f jsr pc,add0 br 2f1: neg r2 jsr pc,removc2: mov r1,r3 mov (sp)+,r2 rts pc/// case % for remaindering/case045: jsr pc,dscale mov $div3,r0 jsr pc,binop jsr pc,pop jsr pc,release mov r4,r1 mov savk1,r0 add k,r0 jsr pc,putchar jsr pc,push jmp loop//binop: jsr pc,(r0) jsr pc,push mov r2,r1 jsr pc,release mov r3,r1 jsr pc,release rts pc/eqk: jsr pc,pop jes eh mov r1,-(sp) jsr pc,pop bec 1f mov (sp)+,r1 jsr pc,push jbr eh1: mov r1,-(sp) mov 2(sp),r1 jsr pc,fsfile jsr pc,backspace mov r0,savk1 dec w(r1) mov (sp),r1 jsr pc,fsfile jsr pc,backspace mov r0,savk2 dec w(r1) cmp r0,savk1 beq 1f blo 2f mov savk2,savk mov r0,r2 sub savk1,r2 mov 2(sp),r1 jsr pc,add0 mov r1,2(sp) br 4f2: mov savk1,r2 sub savk2,r2 mov (sp),r1 jsr pc,add0 mov r1,(sp)1: mov savk1,savk4: mov 2(sp),r3 mov (sp)+,r2 tst (sp)+ rts pc.bsssavk1: .=.+2savk2: .=.+2savk: .=.+2.text/// r2 = count/ r1 = ptr/ returns ptr in r1add0: mov r1,-(sp) jsr pc,length jsr pc,allocate clr r01: cmp r2,$1 blos 1f jsr pc,putchar sub $2,r2 br 1b1: mov r1,-(sp) mov 2(sp),r1 jsr pc,rewind1: jsr pc,getchar bes 1f mov (sp),r1 jsr pc,putchar mov r1,(sp) mov 2(sp),r1 br 1b1: cmp r2,$1 bne 1f mov (sp),r3 mov tenptr,r2 jsr pc,mul3 mov r1,(sp) mov r3,r1 jsr pc,release1: mov 2(sp),r1 jsr pc,release mov (sp)+,r1 tst (sp)+ rts pc/ case i for input base/case151: jsr pc,in151 jmp loop/in151: jsr pc,pop jes eh jsr pc,scalint mov r1,-(sp) mov inbas,r1 mov (sp)+,inbas jsr pc,release rts pccase111: mov inbas,r1 jsr pc,length inc r0 jsr pc,allocate mov inbas,r0 jsr pc,move clr r0 jsr pc,putchar /scale jsr pc,push jmp loop/.bssinbas: .=.+2.data/// case o for output base/case157: jsr pc,in157 jmp loop/in157: jsr pc,pop jes eh jsr pc,scalint mov r1,-(sp) jsr pc,length jsr pc,allocate mov (sp),r0 jsr pc,move jsr pc,fsfile jsr pc,length1: cmp r0,$1 beq 1f jsr pc,backspace bpl 2f jsr pc,chsign jsr pc,length br 1b2: clr sav mov r0,-(sp)2: jsr pc,backspace bes 2f mov (sp),r2 clr r3 mul $100.,r2 add r0,r3 mov r3,(sp) tst sav beq 3f mov r2,r0 clr r3 mov sav,r2 mul $100.,r2 mov r3,sav add r0,sav br 2b3: mov r2,sav br 2b2: mov (sp)+,r0 tst sav beq 2f mov sav,r0 jsr pc,log2 add $16.,r0 mov r0,logo br 3f1: jsr pc,backspace2: tst r0 bpl 1f mov $15.,logo br 3f1: jsr pc,log2 mov r0,logo3: jsr pc,release mov basptr,r1 jsr pc,release mov (sp),basptr// set field widths for output/ and set output digit handling routines/ mov (sp),r1 mov $bigout,outdit jsr pc,length cmp r0,$1. bne 2f jsr pc,fsfile jsr pc,backspace cmp r0,$16. bhi 2f mov $hexout,outdit2: jsr pc,length jsr pc,allocate mov (sp),r0 jsr pc,move clr (sp) jsr pc,fsfile jsr pc,backspace bpl 2f add $1.,(sp) jsr pc,chsign2: mov r1,r2 mov $1,r0 jsr pc,allocate mov $-1,r0 jsr pc,putchar mov r1,r3 jsr pc,add3 jsr pc,length asl r0 add r0,(sp) jsr pc,fsfile jsr pc,backspace cmp r0,$9. blos 2f add $1,(sp)2: jsr pc,release mov r2,r1 jsr pc,release mov r3,r1 jsr pc,release mov (sp)+,fw mov fw,fw1 dec fw1 cmp outdit,$hexout bne 2f mov $1,fw clr fw12: mov $70.,ll cmp fw,$70. blo 9f; rts pc; 9: mov $70.,r1 clr r0 dvd fw,r0 mov r0,r1 mpy fw,r1 mov r1,ll rts pccase117: mov basptr,r1 jsr pc,length inc r0 jsr pc,allocate mov basptr,r0 jsr pc,move clr r0 jsr pc,putchar /scale jsr pc,push jmp loop/.datafw: 1 /field width for digitsfw1: 0ll: 70. /line length.text/// case k for skale factor/case153: jsr pc,pop jes eh jsr pc,scalint mov w(r1),r0 sub a(r1),r0 cmp r0,$1 jhi eh1 jsr pc,rewind jsr pc,getchar jmi eh1 mov r0,k mov r1,-(sp) mov scalptr,r1 jsr pc,release mov (sp)+,scalptr jmp loop/case113: mov scalptr,r1 jsr pc,length inc r0 jsr pc,allocate mov scalptr,r0 jsr pc,move clr r0 jsr pc,putchar jsr pc,push jmp loopscalint: jsr pc,fsfile jsr pc,backspace dec w(r1) mov r0,r2 jsr pc,removc rts pc// case ^ for exponentiation/case136: jsr pc,pop jes eh jsr pc,scalint jsr pc,fsfile jsr pc,backspace tst r0 bge 1f inc negexp jsr pc,chsign1: jsr pc,length cmp r0,$3 jhis eh1 mov r1,r3 jsr pc,pop jes eh jsr pc,fsfile jsr pc,backspace mov r0,savk dec w(r1) mov r1,r2 jsr pc,exp3 mov r1,-(sp) mov r2,r1 jsr pc,release mov r3,r1 jsr pc,rewind jsr pc,getchar mov r0,-(sp) jsr pc,getchar bes 2f mov r0,r1 mul $100.,r1 add (sp)+,r1 br 3f2: mov (sp)+,r13: mul savk,r1 mov r1,r2 mov r3,r1 jsr pc,release tst negexp bne 4f cmp k,savk blo 1f mov k,r3 br 2f1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -