--- /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