LEN DS 1
NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
END
+;;; GR1を符号付き整数とみなし、絶対値に変換
+;;; 入力 GR1: -32768から32767の整数
+;;; 出力 GR1: 入力された整数の絶対値
+;;; OF: 入力されたGR1が-32768の場合、1
+;;; SF: 入力されたGR1が負数(-32767〜-1)の場合、1
+ABS START
+ AND GR1,GR1 ; GR1が0以上の場合は、FINへジャンプ
+ JPL FIN ; ↓
+ JZE FIN ; ↓
+ XOR GR1,ALLON ; GR1のビットを反転
+ ADDA GR1,ONE ; GR1に1を追加
+ JOV FIN ; 足し算でオーバーフローの場合は、OF:1を保持してFINへジャンプ
+ CPL GR1,ALLON ; SF:1を設定
+FIN RET
+ONE DC 1
+ALLON DC #FFFF
+ END
;;; 0〜65535の範囲にある正数の割算(筆算方式)を行う
;;; 入力 GR1:被除数 GR2:除数
;;; 出力 GR0:商 GR3:剰余
Y DS 1
TMP DS 1
END
-;;; メモリー上にある指定されたアドレス、長さの文字列を逆順に並べ替える
-;;; 例: 12345 -> 54321、54321- -> -12345
-;;; 入力 GR1:文字列のアドレス GR2:文字列の長さ
-;;; 出力 (同上)
-REV START
- RPUSH
- LAD GR3,0 ; GR3の初期化
-PU CPL GR3,GR2 ; ループ先頭。(GR3 = GR2)の場合、ループ脱出
- JZE NEXT ; ↓
- LD GR4,GR1 ; GR4 <- GR1
- ADDL GR4,GR3 ; GR4 <- GR4 + GR3
- LD GR5,0,GR4 ; GR5 <- GR4アドレスの値
- PUSH 0,GR5 ; GR5をプッシュ
- LAD GR3,1,GR3 ; GR3 <- GR3 + 1
- JUMP PU ; ループ終端
-NEXT LAD GR3,0 ; GR3の初期化
-PO CPL GR3,GR2 ; ループ先頭。(GR3 = GR2)の場合、ループ脱出
- JZE FIN ; ↓
- POP GR5 ; GR5にポップ
- LD GR4,GR1 ; GR4にGR1の値をコピー
- ADDL GR4,GR3 ; GR4 <- GR4 + GR3
- ST GR5,0,GR4 ; GR4のアドレス <- GR5の値
- LAD GR3,1,GR3 ; GR3 <- GR3 + 1
- JUMP PO ; ループ終端
-FIN RPOP
- RET
- END