📄 dc1.s
字号:
mov savk,r32: cmp r3,r2 bhis 4f sub r3,r2 mov (sp)+,r1 mov r3,-(sp) jsr pc,removc mov (sp)+,r0 jsr pc,putchar jsr pc,push br 3f4: mov (sp)+,r1 mov r2,r0 jsr pc,putchar jsr pc,push3: tst negexp jeq loop clr negexp jsr pc,pop mov r1,-(sp) mov $2,r0 jsr pc,allocate mov $1,r0 jsr pc,putchar clr r0 jsr pc,putchar jsr pc,push mov (sp)+,r1 jsr pc,push jmp case057/.bsssav: .=.+2negexp: .=.+2.text// case v for square root/case166: jsr pc,pop jes eh/ jsr pc,fsfile jsr pc,backspace mov r0,savk dec w(r1) mov w(r1),r2 sub a(r1),r2 tst r2 beq sqz jsr pc,backspace tst r0 jmi eh1 mov k,r2 asl r2 sub savk,r2 beq 1f blo 2f jsr pc,add0 br 1f2: neg r2 jsr pc,removc1: jsr pc,sqrt mov k,r0 jsr pc,putchar jsr pc,push jmp loop//sqz: mov savk,r0 jsr pc,putchar jsr pc,push jmp loop.bsssqtemp: .=.+2.text/// case [ for subroutine definition/case133: clr -(sp) clr r0 jsr pc,allocate jsr pc,push1: jsr pc,readc cmp r0,$'] bne 3f tst (sp) beq 1f dec (sp) br 2f3: cmp r0,$'[ bne 2f inc (sp)2: jsr pc,putchar br 1b/1: tst (sp)+ jmp loop/// case x for execute top of stack/case170: jsr pc,in170 jmp loop/in170: jsr pc,pop jes eh mov r1,-(sp) tst *readptr beq 1f mov *readptr,r1 cmp r(r1),w(r1) bne 1f jsr pc,release br 2f1: add $2,readptr cmp readptr,$readtop bhis 1f2: mov (sp)+,r1 mov r1,*readptr beq 2f jsr pc,rewind rts pc2: jsr pc,readc cmp r0,$'\n beq 3f mov r0,savec3: rts pc1:nderr: mov $1,r0 sys write; 1f; 2f-1f jmp reset1: <Nesting depth.\n>2: .even/.datareadptr: readstack.bssreadstack: .=.+100.readtop:.text// case ? for apl box function/case077: add $2,readptr cmp readptr,$readtop bhis nderr clr *readptrin077: mov source,-(sp) clr source jsr pc,readc cmp r0,$'! bne 1f jsr pc,in041 mov (sp)+,source br in0771: mov r0,savec clr r0 jsr pc,allocate2: jsr pc,readc jsr pc,putchar1: jsr pc,readc jsr pc,putchar cmp r0,$'\\ beq 2b cmp r0,$'\n bne 1b mov (sp)+,source mov r1,*readptr jmp loop/// case < for conditional execution/case074: jsr pc,in074 ble neg074 jmp aff074/// case !< for conditional execution/in74a: jsr pc,in074 bgt inneg jmp inaff/in074: jsr pc,in055 /go subtract jsr pc,pop jsr pc,length tst r0 beq 1f jsr pc,fsfile jsr pc,backspace jsr pc,backspace tst r01: rts pc/aff074: jsr pc,release jsr pc,in154 /load from register jmp case170/neg074: jsr pc,release jsr pc,readc jmp loop/// case = for conditional execution/case075: jsr pc,in074 beq aff074 jmp neg074/// case != for conditional execution/in75a: jsr pc,in074 bne inaff jmp inneg/// case > for conditional execution/case076: jsr pc,in074 bge neg074 jmp aff074/// case !> for conditional execution/in76a: jsr pc,in074 blt inneg jmp inaff/inaff: jsr pc,release jsr pc,in154 jsr pc,in170 rts pc/inneg: jsr pc,release jsr pc,readc rts pc/err: mov $1,r0 sys write; 1f; 2f-1f jmp reset1: <Fatal error\n>; 2: .even/eh1: jsr pc,releaseeh: movb ch,1f+2 mov $1,r0 sys write; 1f; 2f-1f mov $readstack,readptr mov errstack,sp jmp loop.data1: <( ) ?\n>2: .even.text/// routine to read and convert a number from the/ input stream. Numbers beginnig with 0 are/ converted as octal. Routine converts/ up to next nonnumeric.//readin: clr dp clr dpt clr r0 jsr pc,allocate mov r1,-(sp) mov strptr,r1 jsr pc,create jsr pc,readc1: cmpb ch,$'0 blt 3f cmpb ch,$'9 bgt 3f mov ch,r0 sub $'0,r04: tst dp beq 8f cmp dpt,$99. beq 5f inc dpt8: mov chptr,r1 jsr pc,create tst r0 beq 2f jsr pc,putchar2: mov r1,chptr mov (sp),r3 mov inbas,r2 jsr pc,mul3 mov r1,(sp) mov r3,r1 jsr pc,release mov (sp),r3 mov chptr,r2 jsr pc,add3 mov r1,(sp) mov r3,r1 jsr pc,release5: jsr pc,readc mov r0,ch br 1b3: cmpb ch,$'A blt 1f cmpb ch,$'F bgt 1f mov ch,r0 sub $67,r0 br 4b1: cmpb ch,$134 /backslash bne 1f jsr pc,readc br 5b1: cmpb ch,$'. bne 1f tst dp bne 1f inc dp clr dpt br 5b1: mov r0,savec// scale up or down2: tst dp bne 1f mov (sp)+,r1 clr r0 jsr pc,putchar rts pc1: mov (sp),r1 jsr pc,scale mov dpt,r0 jsr pc,putchar tst (sp)+ rts pc/.bssdp: .=.+2dpt: .=.+2.text/scale: mov dpt,r2 jsr pc,add0 mov r1,-(sp) mov $1,r0 jsr pc,allocate mov dpt,r0 jsr pc,putchar mov r1,r3 mov inbas,r2 jsr pc,exp3 mov r1,-(sp) mov r3,r1 jsr pc,release mov (sp)+,r2 mov (sp)+,r3 jsr pc,div3 mov r1,-(sp) mov r2,r1 jsr pc,release mov r3,r1 jsr pc,release mov r4,r1 jsr pc,release mov (sp)+,r1 rts pc// routine to read another character from the input/ stream. If the caller does not want the character,/ it is to be placed in the cell savec./ The routine exits to the system on end of file./ Character is returned in r0.// jsr pc,readc/ movb r0,...//readc: tst savec beq 1f movb savec,r0 bic $177400,r0 clr savec rts pc1: tst *readptr bne 1f2: mov source,r0 sys read; ch; 1 bes eof tst r0 beq eof movb ch,r0 bic $177400,r0 rts pc1: mov r1,-(sp) mov *readptr,r1 jsr pc,getchar bes eof1 bic $177400,r0 mov r0,ch mov (sp)+,r1 rts pc/eof: tst source beq 1f clr source br 2b1: sys exit/eof1: mov *readptr,r1 beq 2f jsr pc,release2: sub $2,readptr mov (sp)+,r1 jmp readc/// case p for print/case160: cmp r5,$pdl jeq eh jsr pc,in160 jmp loop//in160:/ mov $1,r0/ sys write; sphdr; 4 br 1f/sphdr: < > .even/1: cmp r5,$pdl bne 1f mov $1,r0 sys write; qm; 1 mov $1,r0 sys write; nl; 1 rts pc// do the conversion/1: mov -2(r5),r1 jsr pc,printf rts pc/// case f for print the stack/case146: mov r5,-(sp)1: cmp r5,$pdl beq 2f1: jsr pc,in160 jsr pc,pop cmp r5,$pdl bne 1b2: mov $stable-2,r21: tst (r2)+ cmp r2,$stable+254. bhi 1f/ mov (r2),r3 beq 1b movb $'0,7f+3 mov r2,r0 sub $stable,r0 asr r0 movb r0,7f+13: mov $1,r0 sys write; 7f; 8f-7f.data7: <" (0)">8: .even.text mov 2(r3),r1 jsr pc,printf tst (r3) beq 1b incb 7b+3 mov (r3),r3 br 3b1: mov (sp)+,r5 jbr loop/// routine to convert to decimal and print the/ top element of the stack.// jsr pc,printf//printf: mov r4,-(sp) mov r3,-(sp) mov r2,-(sp) mov r1,-(sp) mov r0,-(sp) clr -(sp) jsr pc,rewind2: jsr pc,getchar bes 2f cmp r0,$143 blos 2b cmp r0,$-1 beq 2b bis $1,(sp) br 2b2: tst (sp)+ beq 2f jsr pc,length mov r0,0f mov a(r1),3f mov $1,r0 sys 0; 9f.data9: sys write; 3:.=.+2; 0:.=.+2.text jbr prout2: jsr pc,fsfile jsr pc,backspace bec 1f mov $1,r0 sys write; asczero; 1 jbr prout1: jsr pc,length mov r1,-(sp) jsr pc,allocate mov (sp),r0 mov r1,(sp) jsr pc,move mov ll,count/ inc count jsr pc,fsfile jsr pc,backspace mov r0,savk dec w(r1) jsr pc,backspace cmpb r0,$-1 bne 2f mov basptr,r1 jsr pc,fsfile jsr pc,backspace cmp r0,$-1 beq 2f mov (sp),r1 jsr pc,chsign mov $'-,ch jsr pc,wrchar br 1f2:/ mov $' ,ch/ jsr pc,wrchar1: mov strptr,r1 jsr pc,create mov basptr,r1 jsr pc,length cmp r0,$1 jlo dingout bne 1f jsr pc,rewind jsr pc,getchar cmp r0,$1. jeq unout cmp r0,$-1 jeq dingout cmp r0,$10. jeq tenout1: mov log10,r1 mul savk,r1 clr r0 div logo,r0 mov r0,dout clr ct1: mov (sp),r3 mov savk,r2 jsr pc,getdec mov r1,decimal clr dflg mov (sp),r1 mov savk,r2 jsr pc,removc mov r1,(sp)1: mov (sp),r3 mov basptr,r2 jsr pc,div3 mov r1,r2 mov (sp),r1 jsr pc,release mov r2,(sp) mov r4,r1 jsr pc,*outdit mov (sp),r1 jsr pc,length bne 1b/ mov strptr,r1 jsr pc,fsfile1: jsr pc,backspace bes 1f mov r0,ch jsr pc,wrchar br 1b1: mov (sp)+,r1 jsr pc,release tst savk bne 1f mov decimal,r1 jsr pc,release br prout1: mov dot,ch jsr pc,wrchar mov strptr,r1 jsr pc,create mov decimal,-(sp) inc dflg1: mov (sp),r3 mov basptr,r2 jsr pc,mul3 mov r1,(sp) mov r3,r1 jsr pc,release mov (sp),r3 mov savk,r2 jsr pc,getdec mov r1,(sp) mov r3,r1 mov savk,r2 jsr pc,removc jsr pc,*outdit mov strptr,r1 inc ct cmp ct,dout blo 1b mov (sp)+,r1 jsr pc,release mov strptr,r1 jsr pc,rewind1: jsr pc,getchar bes 1f mov r0,ch jsr pc,wrchar br 1b1:// cleanup, print new line and return/prout: mov $1,r0 sys write; nl; 1 mov (sp)+,r0 mov (sp)+,r1 mov (sp)+,r2 mov (sp)+,r3 mov (sp)+,r4 rts pc//// r2 = count/ r3 = pointer (not released)/.bssdflg: .=.+2dout: .=.+2logo: .=.+2log10: .=.+2decimal: .=.+2.textgetdec: mov r3,-(sp) mov r3,r1 jsr pc,rewind jsr pc,length jsr pc,allocate mov r1,-(sp)1: cmp r2,$1 blt 1f mov 2(sp),r1 jsr pc,getchar mov (sp),r1 jsr pc,putchar mov r1,(sp) sub $2,r2 br 1b1: tst r2 beq 1f mov tenptr,r2 mov (sp),r3 jsr pc,mul3 mov r1,(sp) mov r3,r1 jsr pc,length jsr pc,release mov r0,r3 jsr pc,allocate mov r1,-(sp) mov 2(sp),r1 jsr pc,rewind2: tst r3 beq 2f jsr pc,getchar mov (sp),r1 jsr pc,putchar mov r1,(sp) dec r3 mov 2(sp),r1 br 2b2: clr r0 mov (sp),r1 jsr pc,putchar mov 2(sp),r1 jsr pc,release mov (sp),r3 mov tenptr,r2 jsr pc,div3 mov r1,(sp) mov r3,r1 jsr pc,release mov r4,r1 jsr pc,release mov (sp)+,r1 tst (sp)+ mov (sp)+,r3 rts pc1: mov (sp)+,r1 mov (sp)+,r3 rts pctenout: mov savk,ct mov $2,r0 jsr pc,allocate mov r1,-(sp) mov 2(sp),r1 jsr pc,fsfile jsr pc,backspace mov r0,r3 clr r2 dvd $10.,r2 beq 1f3: add $60,r2 mov r2,r0 mov (sp),r1 jsr pc,putchar mov r1,(sp)1: mov (sp),r1 add $60,r3 mov r3,r0 jsr pc,putchar mov 2(sp),r11: jsr pc,backspace bec 2f mov (sp),r1 jsr pc,length cmp r0,ct beq 4f blo 5f sub ct,r0 mov r0,ct1: jsr pc,getchar mov r0,ch jsr pc,wrchar dec ct bne 1b jsr pc,getchar bes 6f jsr pc,backspace4: movb dot,ch jsr pc,wrchar1: jsr pc,getchar bes 1f mov r0,ch jsr pc,wrchar br 1b5: sub r0,ct movb dot,ch jsr pc,wrchar mov $60,ch5: jsr pc,wrchar dec ct bne 5b br 1b1:6: mov (sp)+,r1 jsr pc,release mov (sp)+,r1 jsr pc,release jbr prout2: mov r0,r3 clr r2 dvd $10.,r2 br 3bdot: <.> .evenct: .=.+2//dingout: clr -(sp) br 1funout: mov $1,-(sp)1: mov 2(sp),r1 mov savk,r2 jsr pc,removc mov r1,2(sp) mov strptr,r1 jsr pc,create mov $-1,r0 jsr pc,putchar mov r1,r31: mov 2(sp),r1 jsr pc,length beq 1f mov r1,r2 jsr pc,add3 mov r1,2(sp) mov r2,r1 jsr pc,release mov $1,r0 tst (sp) beq 2f mov $'1,ch jsr pc,wrchar br 1b2: tst delflag jne in177 sys write; ding; 3 br 1b1: tst (sp)+ mov (sp)+,r1 jsr pc,release jmp prout/ding: <> /<bell prefix form feed>sp5: <\\\n >minus: <->one: <1> .even.bsscount: .=.+2.text/bigout: mov r1,-(sp) /big digit tst dflg beq 1f clr r0 jsr pc,allocate mov r1,tptr1: mov strptr,r1 jsr pc,length add fw,r0 dec r0 mov r0,-(sp) /end of field clr -(sp) /negative mov 4(sp),r1 jsr pc,length bne 2f mov $'0,r0 tst dflg beq 3f mov tptr,r1 jsr pc,putchar mov r1,tptr br 1f3: mov strptr,r1 jsr pc,putchar br 1f2: mov 4(sp),r1 /digit jsr pc,fsfile jsr pc,backspace bpl 2f mov $1,(sp) /negative jsr pc,chsign2: mov 4(sp),r3 /digit mov r3,r1 jsr pc,length beq 1f mov tenptr,r2 jsr pc,div3 mov r1,4(sp) /digit mov r3,r1 jsr pc,release mov r4,r1 jsr pc,rewind jsr pc,getchar jsr pc,release add $'0,r0 tst dflg beq 3f mov tptr,r1 jsr pc,putchar mov r1,tptr br 2b3: mov strptr,r1 jsr pc,putchar br 2b1: tst dflg beq 4f mov tptr,r1 jsr pc,length cmp r0,fw1 bhis 2f mov fw1,r1 sub r0,r1 mov r1,-(sp) mov strptr,r13: mov $'0,r0 jsr pc,putchar dec (sp) bne 3b tst (sp)+2: mov tptr,r1 jsr pc,fsfile2: mov tptr,r1 jsr pc,backspace bes 2f mov strptr,r1 jsr pc,putchar br 2b2: mov tptr,r1 jsr pc,release br 1f4: mov strptr,r1 jsr pc,length cmp r0,2(sp) /end of field bhis 1f mov $'0,r0 jsr pc,putchar br 1b1: tst (sp) /negative beq 1f mov $'-,r0 mov strptr,r1 dec w(r1) jsr pc,putchar1: mov strptr,r1 mov $' ,r0 jsr pc,putchar tst (sp)+ tst (sp)+ mov (sp)+,r1 jsr pc,release rts pc/.bsstptr: .=.+2tenptr: .=.+2.text///hexout: mov r1,-(sp) jsr pc,rewind jsr pc,getchar cmp r0,$16. blo 1f jmp err1: add $60,r0 cmp r0,$'9 blos 2f add $'A-'9-1,r02: mov strptr,r1 jsr pc,putchar mov (sp)+,r1 jsr pc,release rts pc//wrchar: tst delflag jne in177 mov $1,r0 tst count bne 7f sys write; sp5; 2 mov ll,count mov $1,r07: dec count sys write; ch; 1 rts pc/// case P for print an ascii string//case120: jsr pc,pop jes eh jsr pc,length mov r0,0f mov a(r1),3f mov $1,r0 sys 0; 9f jsr pc,release jmp loop.data9: sys write; 3:.=.+2; 0:.=.+2.text/// here for unimplemented stuff/junk: movb r0,1f mov $1,r0 sys write; 1f; 2f-1f jmp loop.data1: <0 not in switch.\n>2: .even.text//// routine to place one word onto the pushdown list/ Error exit to system on overflow.//push: mov r1,(r5)+ cmp r5,$pdltop bhis pdlout rts pc/pdlout: mov $1,r0 sys write; 1f; 2f-1f jmp reset1: <Out of pushdown.\n>2: .even/// routine to remove one word from the pushdown list/ carry bit set on empty stack/// jsr pc,pop/pop: cmp r5,$pdl bhi 1f clr r1 sec rts pc1: mov -(r5),r1 clc rts pc////.dataoutdit: hexout.bsssource: .=.+2savec: .=.+2ch: .=.+2.textnl: <\n>asczero: <0>qm: <?\n> .even/.bsschptr: .=.+2strptr: .=.+2basptr: .=.+2scalptr: .=.+2errstack:.=.+2/stable: .=.+512..textcasetab: case012; 012 /nl loop; 040 /sp case041; 041 /! case045; 045 /% case052; 052 /* case053; 053 /+ case055; 055 /- case060; 056 /. case057; 057 // case060; 060 /0 case060; 061 /1 case060; 062 /2 case060; 063 /3 case060; 064 /4 case060; 065 /5 case060; 066 /6 case060; 067 /7 case060; 070 /8 case060; 071 /9 case072; 072 /: case073; 073 /; case074; 074 /< case075; 075 /= case076; 076 /> case077; 077 /? case060; 101 /A case060; 102 /B case060; 103 /C case060; 104 /D case060; 105 /E case060; 106 /F case111; 111 /I case113; 113 /K case114; 114 /L case117; 117 /O case120; 120 /P case121; 121 /Q case123; 123 /S case166; 126 /V case170; 130 /X case172; 132 /Z case133; 133 /[ case136; 136 /^ case137; 137 /_ case143; 143 /c case144; 144 /d case146; 146 /f case151; 151 /i case153; 153 /k case154; 154 /l case157; 157 /o case160; 160 /p case161; 161 /q case163; 163 /s case166; 166 /v case170; 170 /x case172; 172 /z 0;0/.bsspdl: .=.+100.pdltop:.textreset: clr r0 sys seek; 0; 21: clr r0 sys read; rathole; 1 bes 1f tst r0 beq 1f cmpb rathole,$'q bne 1b1: sys exit.bssrathole: .=.+2.text
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -