1 ;;; 0から65535の範囲にある整数の入力を受け付ける
4 ;;; GR0: 文字列の長さ。入力が数字以外の場合は、#FFFF
5 ;;; 65536以上の正数が入力された場合はエラー
7 IN IBUF,ILEN ; 入力文字列を格納
23 ;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
25 ;;; 出力 GR0:積の下位WORD GR3:積の上位WORD
26 ;;; 積が65535より大きい場合は、オーバーフロー
32 XOR GR5,GR5 ; 上位wordの一時値
33 AND GR1,GR1 ; (GR1 = 0)の場合、終了
35 AND GR2,GR2 ; (GR2 = 0)の場合、終了
38 LOOP PUSH 0,GR4 ; ループ先頭。GR2のビット中でGR4が示すビットが0の場合、NEXTへジャンプ
42 ADDL GR3,GR5 ; GR3 <- GR3 + GR5
43 ADDL GR0,GR1 ; GR0 <- GR0 + GR1
44 JOV AHB1 ; GR0がオーバーフローした場合、AHB1へジャンプ
46 AHB1 LAD GR3,1,GR3 ; GR3 <- GR3 + 1
47 NEXT1 SLL GR4,1 ; GR4を1回左シフト
49 SLL GR5,1 ; GR5を1回左シフト
50 CPL GR4,GR2 ; (GR4 > GR2)の場合、CHKOVへジャンプ
52 SLL GR1,1 ; GR1を1回左シフト
53 JOV AHB2 ; GR1がオーバーフローした場合、AHBへジャンプ
55 AHB2 LAD GR5,1,GR5 ; GR5 <- GR5 + 1
56 NEXT2 JUMP LOOP ; ループ終端
57 CHKOV AND GR3,GR3 ; GR3 = 0の場合、終了
59 LAD GR4,#FFFF ; GR3 <> 0の場合、オーバーフロー
65 ;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
67 ;;; 出力 GR0:積の下位WORD GR3:積の上位WORD
68 ;;; 積が65535より大きい場合は、オーバーフロー
74 XOR GR5,GR5 ; 上位wordの一時値
75 AND GR1,GR1 ; (GR1 = 0)の場合、終了
77 AND GR2,GR2 ; (GR2 = 0)の場合、終了
80 LOOP PUSH 0,GR4 ; ループ先頭。GR2のビット中でGR4が示すビットが0の場合、NEXTへジャンプ
84 ADDL GR3,GR5 ; GR3 <- GR3 + GR5
85 ADDL GR0,GR1 ; GR0 <- GR0 + GR1
86 JOV AHB1 ; GR0がオーバーフローした場合、AHB1へジャンプ
88 AHB1 LAD GR3,1,GR3 ; GR3 <- GR3 + 1
89 NEXT1 SLL GR4,1 ; GR4を1回左シフト
91 SLL GR5,1 ; GR5を1回左シフト
92 CPL GR4,GR2 ; (GR4 > GR2)の場合、CHKOVへジャンプ
94 SLL GR1,1 ; GR1を1回左シフト
95 JOV AHB2 ; GR1がオーバーフローした場合、AHBへジャンプ
97 AHB2 LAD GR5,1,GR5 ; GR5 <- GR5 + 1
98 NEXT2 JUMP LOOP ; ループ終端
99 CHKOV AND GR3,GR3 ; GR3 = 0の場合、終了
101 LAD GR4,#FFFF ; GR3 <> 0の場合、オーバーフロー