+++ /dev/null
-outl.casl: outl_main.casl divl1.casl rev.casl
- cat $^ >$@
-outa.casl: outa_main.casl divl1.casl rev.casl abs.casl
- cat $^ >$@
-outb.casl: outb_main.casl divl1.casl rev.casl
- cat $^ >$@
+++ /dev/null
-;;; 入力された数値をGR0で返す
-INL START
- RPUSH
- IN IBUF,ILEN
- LAD GR1,0
- LAD GR2,10 ; 10進数の「10」
- LAD GR3,0 ; 値の一時格納
- LAD GR4,0 ; インデックス
-ISTOL CPL GR4,ILEN ; ループ先頭。(GR4 = ILEN)の場合、ループ脱出
- JZE ICP ; ↓
- LD GR1,IBUF,GR4
- CPL GR1,INCHR ; (GR1 < (INCHR = '0'))の場合、IOVへジャンプ
- JMI IOV ; ↓
- CPL GR1,='9' ; (GR1 > '9')の場合、IOVへジャンプ
- JPL IOV ; ↓
- SUBL GR1,INCHR
- ST GR4,NLEN
- LD GR4,ILEN
- SUBA GR4,NLEN
-MUL10 CPL GR4,=1
- JZE ISNEXT
- CALL MULL
- LD GR1,GR0
- LAD GR4,-1,GR4
- JUMP MUL10
-ISNEXT LD GR4,NLEN
- ADDL GR3,GR1
- LAD GR4,1,GR4
- JUMP ISTOL ; ループ終端
-IOV LAD GR0,1
- ADDL GR0,=#FFFF
- JUMP IFIN
-ICP LD GR0,GR3
-IFIN RPOP
- RET
-INCHR DC '0123456789'
-IBUF DS 5
-ILEN DS 1
-NLEN DS 1
- END
-;GR1の値とGR2の値の積をGR0に格納
-MULL START
- RPUSH
- LAD GR3,1 ; 対象ビット
- LAD GR0,0 ; 積
-MLOOP CPL GR3,GR2 ; ループ先頭。(GR2 = GR3)の場合、ループ脱出
- JPL MFIN ; ↓
- PUSH 0,GR3 ; GR2の、GR3が示したビットが0の場合、MNEXTへジャンプ
- AND GR3,GR2 ; ↓
- POP GR3 ; ↓
- JZE MNEXT ; ↓
- ADDL GR0,GR1 ; GR0 <- GR0 + GR1
- JOV MFIN ; オーバーフローした場合、ループ脱出
-MNEXT SLL GR3,1 ; GR3を1回左シフト
- SLL GR1,1 ; GR1を1回左シフト
- JOV MFIN ; オーバーフローした場合、ループ脱出
- JUMP MLOOP ; ループ終端
-MFIN RPOP
- RET
- END