;;; 入力された数値を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