RMDIR := rmdir
ECHO := echo
INSTALL := install
+CHMOD := chmod
prefix ?= ~
casl2libdir ?= $(prefix)/share/casl2lib
all: stdlib.casl libfiles
%.casl: src/%.casl
+ $(CHMOD) +w $@
$(CAT) $^ >$@
+ $(CHMOD) -w $@
%.o: %.casl
$(CASL2OUT)$< $@
;;; 0から65535の範囲にある整数の入力を受け付ける
;;; 入力 (SVC)
;;; 出力 GR1: 入力された数値
-;;; GR0: 文字列の長さ。入力が数字以外の場合は、#FFFF
-;;; 65536以上の正数が入力された場合はエラー
+;;; GR2: 文字列の長さ。
+;;; 入力が数字以外の場合は、SFフラグを設定
+;;; 65535を超える数値の場合は、OFフラグを設定
INL START
+ PUSH 0,GR3
IN IBUF,ILEN ; 入力文字列を格納
LAD GR1,IBUF
LD GR2,ILEN
- CPA GR2,LENMAX
- JPL LENOV
CALL STR2L
JOV FIN
- LD GR0,GR2
- JUMP FIN
-LENOV LAD GR0,#FFFF
- SRA GR0,1
-FIN RET
-ILEN DS 1
-LENMAX DC 5
+ JMI FIN
+ LD GR1,GR3
+FIN POP GR3
+ RET
IBUF DS 5
+ILEN DS 1
+MAXLEN DC 5
END
;;; 10進数の整数を表す文字列を数値に変換
;;; 数値の範囲は、0から65535
-;;; 入力 GR1: 文字列を格納するアドレス
-;;; GR2: 文字列の長さ。最大5けた
-;;; 出力 GR0: 数値
-;;; 文字列が最大長より大きい場合や数値以外の場合は、GR0は#FFFF、OFは1
+;;; 入力 GR1: 文字列を格納するメモリーの先頭アドレス
+;;; GR2: 文字列の長さ。最大5けた
+;;; 出力 GR3: 数値
+;;; 文字列が最大長より大きい場合と数値以外の場合は、GR3は#FFFF、OFは1
+;;; 数値以外の場合、OFは1
;;; 依存プログラム: MULL
STR2L START
PUSH 0,GR1
PUSH 0,GR2
- PUSH 0,GR3
PUSH 0,GR4
PUSH 0,GR5
- XOR GR0,GR0 ; GR0:初期化
- AND GR2,GR2 ; (GR2 = 0)の場合、FINへジャンプ
- JZE FIN ; ↓
- CPL GR2,MAXLEN ; (GR2 > MAXLEN)の場合、LENOVへジャンプ
- JPL LENOV ; ↓
- ST GR1,STR ; STR <- GR1 文字列の開始アドレス
- ST GR2,LEN ; LEN <- GR2
- LAD GR2,10 ; GR2:10進数の「10」
- XOR GR4,GR4 ; GR4:値の一時格納
- XOR GR5,GR5 ; GR5:インデックス
-STOL CPL GR5,LEN ; ループ先頭。(GR5 = LEN)の場合、ループ脱出
- JZE CP ; ↓
- LD GR1,STR ; GR1に、入力文字列中の次の桁を格納
- ADDL GR1,GR5 ; ↓
+ PUSH 0,GR6
+ PUSH 0,GR7
+ XOR GR3,GR3 ; GR3の初期化
+ AND GR2,GR2 ; GR2 = 0の場合、OVへジャンプ
+ JZE OV ; ↓
+ CPL GR2,=5 ; GR2 > 5の場合、OVへジャンプ
+ JPL OV ; ↓
+ XOR GR4,GR4 ; GR4: インデックスの初期化
+ LD GR5,GR1 ; GR5 <- GR1
+ LD GR6,GR2 ; GR6 <- GR2
+ XOR GR1,GR1 ; GR1の初期化
+STOL LD GR1,GR5 ; GR1に、入力文字列中の次の桁を格納
+ ADDL GR1,GR4 ; ↓
LD GR1,0,GR1 ; ↓
- CPL GR1,ZERO ; (GR1 < '0')の場合、NANへジャンプ
- JMI NAN ; ↓
- CPL GR1,NINE ; (GR1 > '9')の場合、NANへジャンプ
- JPL NAN ; ↓
+ LD GR7,ZERO ; GR1 < '0'の場合、FINへジャンプ
+ CPL GR1,GR7 ; ↓
+ JMI FIN ; ↓
+ LD GR7,NINE ; GR1 > '9'の場合、FINへジャンプ
+ CPL GR7,GR1 ; ↓
+ JMI FIN ; ↓
SUBL GR1,ZERO ; GR1の文字を、対応する数値に変換
- ST GR5,NLEN ; GR5 <- LEN - NLEN - 1
- LD GR5,LEN ; ↓
- SUBA GR5,NLEN ; ↓
-MUL10 CPA GR5,=1 ; ループ先頭。GR1 <- 10 ** GR5
- JZE NEXT ; (GR5 = 1)の場合、ループ脱出
- JMI NEXT ; ↓
- CALL MULL ; MULLを呼び出し、GR0 <- GR1 * GR2
- JOV FIN ; ↓ オーバーフロー時は、プログラム終端へジャンプ
- LD GR1,GR0 ; GR1 <- GR0
- LAD GR5,-1,GR5 ; GR5 <- GR5 -1
- JUMP MUL10 ; ループ終端へジャンプ
-NEXT LD GR5,NLEN ; GR5 <- NLEN。復元
- ADDL GR4,GR1 ; GR4 <- GR4 + GR1
- JOV FIN ; ↓
- LAD GR5,1,GR5 ; GR5 <- GR5 + 1
+ ADDL GR3,GR1
+ JOV FIN
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+ CPL GR4,GR6 ; GR4 = GR6の場合、ループ脱出
+ JZE FIN ; ↓
+MUL10 LAD GR2,10 ; GR2:10進数の 10
+ LD GR1,GR3 ; GR1 <- GR3
+ CALL MULL ; MULLを呼び出し、GR3 <- GR1 * GR2
JUMP STOL ; ループ終端
-NAN LAD GR2,#FFFF ; GR2 <- #FFFF
- JUMP FIN ; FINへジャンプ
-CP LD GR1,GR4 ; GR0 <- GR4
- LD GR0,LEN ; GR0 <- LEN
- JUMP FIN ; プログラム終端へジャンプ
-LENOV LAD GR0,#FFFF ; 文字列が最大長より大きい場合、GR0 <- #FFFF
- SRA GR0,1 ; ↓ オーバーフロー発生
-FIN POP GR5
+OV LAD GR7,1 ; オーバーフロー発生
+ SRL GR7,1 ; ↓
+FIN POP GR7
+ POP GR6
+ POP GR5
POP GR4
- POP GR3
POP GR2
POP GR1
RET
ZERO DC '0'
NINE DC '9'
-MAXLEN DC 5 ; 文字列の最大長
-STR DS 1
-LEN DS 1
-NLEN DS 1
END
;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
;;; 入力 GR1:被乗数 GR2:乗数
-;;; 出力 GR0:積の下位WORD GR3:積の上位WORD
+;;; 出力 GR3:積
;;; 積が65535より大きい場合は、オーバーフロー
MULL START
- PUSH 0,GR4
- PUSH 0,GR5
- XOR GR0,GR0 ; 積
- XOR GR3,GR3 ; 上位word
- XOR GR5,GR5 ; 上位wordの一時値
- AND GR1,GR1 ; (GR1 = 0)の場合、終了
- JZE CHKOV ; ↓
- AND GR2,GR2 ; (GR2 = 0)の場合、終了
- JZE CHKOV ; ↓
- LAD GR4,1 ; 対象ビット
-LOOP PUSH 0,GR4 ; ループ先頭。GR2のビット中でGR4が示すビットが0の場合、NEXTへジャンプ
- AND GR4,GR2 ; ↓
- POP GR4 ; ↓
- JZE NEXT1 ; ↓
- ADDL GR3,GR5 ; GR3 <- GR3 + GR5
- ADDL GR0,GR1 ; GR0 <- GR0 + GR1
- JOV AHB1 ; GR0がオーバーフローした場合、AHB1へジャンプ
- JUMP NEXT1 ; ↓
-AHB1 LAD GR3,1,GR3 ; GR3 <- GR3 + 1
-NEXT1 SLL GR4,1 ; GR4を1回左シフト
- JOV CHKOV ; ↓
- SLL GR5,1 ; GR5を1回左シフト
- CPL GR4,GR2 ; (GR4 > GR2)の場合、CHKOVへジャンプ
- JPL CHKOV ; ↓
- SLL GR1,1 ; GR1を1回左シフト
- JOV AHB2 ; GR1がオーバーフローした場合、AHBへジャンプ
- JUMP NEXT2 ; ↓
-AHB2 LAD GR5,1,GR5 ; GR5 <- GR5 + 1
-NEXT2 JUMP LOOP ; ループ終端
-CHKOV AND GR3,GR3 ; GR3 = 0の場合、終了
+ XOR GR3,GR3 ; GR3の初期化
+ AND GR1,GR1 ; GR1 = 0 の場合、FINへジャンプ
JZE FIN ; ↓
- LAD GR4,#FFFF ; GR3 <> 0の場合、オーバーフロー
- SLL GR4,1 ; ↓
-FIN POP GR5
- POP GR4
- RET
+ AND GR2,GR2 ; GR2 = 0 の場合、FINへジャンプ
+ JZE FIN ; ↓
+ PUSH 0,GR1 ; GR1の退避
+ PUSH 0,GR2 ; GR2の退避
+LOOP SRL GR2,1 ; ループ開始。SRLを1つ右シフト
+ JOV ON ; 乗数の最下位ビットが1の場合、ONへジャンプ
+ JUMP NEXT ; NEXTへジャンプ
+ON ADDL GR3,GR1 ; GR3 <- GR3 + GR1
+ JOV POST ; GR3がオーバーフローした場合、POSTへジャンプ
+NEXT AND GR2,GR2 ; GR2 = 0 の場合、POSTへジャンプ
+ JZE POST ; ↓
+ SLL GR1,1 ; GR1を1つ左シフト
+ JOV POST ; GR1がオーバーフローした場合、POSTへジャンプ
+ JUMP LOOP ; ループ終端
+POST POP GR2 ; GR2の復元
+ POP GR1 ; GR1の復元
+FIN RET
END
END
;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
;;; 入力 GR1:被乗数 GR2:乗数
-;;; 出力 GR0:積の下位WORD GR3:積の上位WORD
+;;; 出力 GR3:積
;;; 積が65535より大きい場合は、オーバーフロー
MULL START
- PUSH 0,GR4
- PUSH 0,GR5
- XOR GR0,GR0 ; 積
- XOR GR3,GR3 ; 上位word
- XOR GR5,GR5 ; 上位wordの一時値
- AND GR1,GR1 ; (GR1 = 0)の場合、終了
- JZE CHKOV ; ↓
- AND GR2,GR2 ; (GR2 = 0)の場合、終了
- JZE CHKOV ; ↓
- LAD GR4,1 ; 対象ビット
-LOOP PUSH 0,GR4 ; ループ先頭。GR2のビット中でGR4が示すビットが0の場合、NEXTへジャンプ
- AND GR4,GR2 ; ↓
- POP GR4 ; ↓
- JZE NEXT1 ; ↓
- ADDL GR3,GR5 ; GR3 <- GR3 + GR5
- ADDL GR0,GR1 ; GR0 <- GR0 + GR1
- JOV AHB1 ; GR0がオーバーフローした場合、AHB1へジャンプ
- JUMP NEXT1 ; ↓
-AHB1 LAD GR3,1,GR3 ; GR3 <- GR3 + 1
-NEXT1 SLL GR4,1 ; GR4を1回左シフト
- JOV CHKOV ; ↓
- SLL GR5,1 ; GR5を1回左シフト
- CPL GR4,GR2 ; (GR4 > GR2)の場合、CHKOVへジャンプ
- JPL CHKOV ; ↓
- SLL GR1,1 ; GR1を1回左シフト
- JOV AHB2 ; GR1がオーバーフローした場合、AHBへジャンプ
- JUMP NEXT2 ; ↓
-AHB2 LAD GR5,1,GR5 ; GR5 <- GR5 + 1
-NEXT2 JUMP LOOP ; ループ終端
-CHKOV AND GR3,GR3 ; GR3 = 0の場合、終了
+ XOR GR3,GR3 ; GR3の初期化
+ AND GR1,GR1 ; GR1 = 0 の場合、FINへジャンプ
JZE FIN ; ↓
- LAD GR4,#FFFF ; GR3 <> 0の場合、オーバーフロー
- SLL GR4,1 ; ↓
-FIN POP GR5
- POP GR4
- RET
+ AND GR2,GR2 ; GR2 = 0 の場合、FINへジャンプ
+ JZE FIN ; ↓
+ PUSH 0,GR1 ; GR1の退避
+ PUSH 0,GR2 ; GR2の退避
+LOOP SRL GR2,1 ; ループ開始。SRLを1つ右シフト
+ JOV ON ; 乗数の最下位ビットが1の場合、ONへジャンプ
+ JUMP NEXT ; NEXTへジャンプ
+ON ADDL GR3,GR1 ; GR3 <- GR3 + GR1
+ JOV POST ; GR3がオーバーフローした場合、POSTへジャンプ
+NEXT AND GR2,GR2 ; GR2 = 0 の場合、POSTへジャンプ
+ JZE POST ; ↓
+ SLL GR1,1 ; GR1を1つ左シフト
+ JOV POST ; GR1がオーバーフローした場合、POSTへジャンプ
+ JUMP LOOP ; ループ終端
+POST POP GR2 ; GR2の復元
+ POP GR1 ; GR1の復元
+FIN RET
END
;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
;;; 入力 GR1:被乗数 GR2:乗数
-;;; 出力 GR0:積の下位WORD GR3:積の上位WORD
+;;; 出力 GR3:積
;;; 積が65535より大きい場合は、オーバーフロー
MULL START
- PUSH 0,GR4
- PUSH 0,GR5
- XOR GR0,GR0 ; 積
- XOR GR3,GR3 ; 上位word
- XOR GR5,GR5 ; 上位wordの一時値
- AND GR1,GR1 ; (GR1 = 0)の場合、終了
- JZE CHKOV ; ↓
- AND GR2,GR2 ; (GR2 = 0)の場合、終了
- JZE CHKOV ; ↓
- LAD GR4,1 ; 対象ビット
-LOOP PUSH 0,GR4 ; ループ先頭。GR2のビット中でGR4が示すビットが0の場合、NEXTへジャンプ
- AND GR4,GR2 ; ↓
- POP GR4 ; ↓
- JZE NEXT1 ; ↓
- ADDL GR3,GR5 ; GR3 <- GR3 + GR5
- ADDL GR0,GR1 ; GR0 <- GR0 + GR1
- JOV AHB1 ; GR0がオーバーフローした場合、AHB1へジャンプ
- JUMP NEXT1 ; ↓
-AHB1 LAD GR3,1,GR3 ; GR3 <- GR3 + 1
-NEXT1 SLL GR4,1 ; GR4を1回左シフト
- JOV CHKOV ; ↓
- SLL GR5,1 ; GR5を1回左シフト
- CPL GR4,GR2 ; (GR4 > GR2)の場合、CHKOVへジャンプ
- JPL CHKOV ; ↓
- SLL GR1,1 ; GR1を1回左シフト
- JOV AHB2 ; GR1がオーバーフローした場合、AHBへジャンプ
- JUMP NEXT2 ; ↓
-AHB2 LAD GR5,1,GR5 ; GR5 <- GR5 + 1
-NEXT2 JUMP LOOP ; ループ終端
-CHKOV AND GR3,GR3 ; GR3 = 0の場合、終了
+ XOR GR3,GR3 ; GR3の初期化
+ AND GR1,GR1 ; GR1 = 0 の場合、FINへジャンプ
JZE FIN ; ↓
- LAD GR4,#FFFF ; GR3 <> 0の場合、オーバーフロー
- SLL GR4,1 ; ↓
-FIN POP GR5
- POP GR4
- RET
+ AND GR2,GR2 ; GR2 = 0 の場合、FINへジャンプ
+ JZE FIN ; ↓
+ PUSH 0,GR1 ; GR1の退避
+ PUSH 0,GR2 ; GR2の退避
+LOOP SRL GR2,1 ; ループ開始。SRLを1つ右シフト
+ JOV ON ; 乗数の最下位ビットが1の場合、ONへジャンプ
+ JUMP NEXT ; NEXTへジャンプ
+ON ADDL GR3,GR1 ; GR3 <- GR3 + GR1
+ JOV POST ; GR3がオーバーフローした場合、POSTへジャンプ
+NEXT AND GR2,GR2 ; GR2 = 0 の場合、POSTへジャンプ
+ JZE POST ; ↓
+ SLL GR1,1 ; GR1を1つ左シフト
+ JOV POST ; GR1がオーバーフローした場合、POSTへジャンプ
+ JUMP LOOP ; ループ終端
+POST POP GR2 ; GR2の復元
+ POP GR1 ; GR1の復元
+FIN RET
END
;;; casl2 inl.casl ../casl2lib/inl.casl ../casl2lib/outl.casl
MAIN START
-LOOP CALL INL ; GR1に数値、GR0に文字列の長さ
- JOV OV
- AND GR0,GR0
+LOOP CALL INL ; GR1に数値、GR2に文字列の長さ
+ JOV NAN
+ JMI BIG
+ LD GR2,GR2
JZE FIN
- CPL GR0,=#FFFF
- JZE NAN
CALL OUTL
JUMP LOOP
-OV CPL GR0,=#FFFF
- JZE LENOV
- OUT OVMSG,MLEN1
+NAN OUT NANMSG,NANLEN
JUMP LOOP
-NAN OUT NANMSG,MLEN2
+BIG OUT BIGMSG,BIGLEN
JUMP LOOP
-LENOV OUT LENOVMSG,MLEN3
FIN RET
-OVMSG DC 'Over 65535'
-MLEN1 DC 10
-NANMSG DC 'Not A Number'
-MLEN2 DC 12
-LENOVMSG DC 'Str too long. Stop'
-MLEN3 DC 18
+NANMSG DC 'Not a number'
+NANLEN DC 12
+BIGMSG DC 'Over 65535'
+BIGLEN DC 10
END
LD GR1,GR2 ; ↓
CALL OUTL ; ↓
POP GR1 ; ↓
- CALL MULL ; GR0 <- GR1 * GR2
+ CALL MULL ; GR3 <- GR1 * GR2
JOV WOV ; オーバーフローの場合は、WOVへジャンプ
- PUSH 0,GR1 ; GR0の数値を出力
- LD GR1,GR0 ; ↓
+ PUSH 0,GR1 ; GR3の数値を出力
+ LD GR1,GR3 ; ↓
CALL OUTL ; ↓
POP GR1 ; ↓
YNEXT OUT SEP,SLEN ; 区切り線を出力
LAD GR5,1,GR5 ; GR5 <- GR5 + 1
JUMP LOOPY ; LOOPYへジャンプ
WOV OUT YOMSG,YLEN ; オーバーフローした場合のメッセージを表示
- PUSH 0,GR1 ; GR0の数値を出力
- LD GR1,GR0 ; ↓
- CALL OUTL ; ↓
- POP GR1 ; ↓
- PUSH 0,GR1 ; GR3の数値を出力
- LD GR1,GR3 ; ↓
- CALL OUTL ; ↓
- POP GR3 ; ↓
- JUMP YNEXT ; YNEXTへジャンプ
+ OUT SEP,SLEN ; 区切り線を出力
XNEXT LAD GR4,1,GR4 ; GR4 <- GR4 + 1
JUMP LOOPX ; LOOPXへジャンプ
FIN RET
+++ /dev/null
-;;; casl2 outb_call.casl outb.casl
-MAIN START
- LAD GR2,0
-LOOP LD GR1,VAL,GR2
- CALL OUTB
- LAD GR2,1,GR2
- CPA GR2,CNT
- JZE FIN
- JUMP LOOP
-FIN RET
-VAL DC #0001,#8000
-CNT DC 2
- END
;;; 0から65535の範囲にある整数の入力を受け付ける
;;; 入力 (SVC)
;;; 出力 GR1: 入力された数値
-;;; GR0: 文字列の長さ。入力が数字以外の場合は、#FFFF
-;;; 65536以上の正数が入力された場合はエラー
+;;; GR2: 文字列の長さ。
+;;; 入力が数字以外の場合は、SFフラグを設定
+;;; 65535を超える数値の場合は、OFフラグを設定
INL START
+ PUSH 0,GR3
IN IBUF,ILEN ; 入力文字列を格納
LAD GR1,IBUF
LD GR2,ILEN
- CPA GR2,LENMAX
- JPL LENOV
CALL STR2L
JOV FIN
- LD GR0,GR2
- JUMP FIN
-LENOV LAD GR0,#FFFF
- SRA GR0,1
-FIN RET
-ILEN DS 1
-LENMAX DC 5
+ JMI FIN
+ LD GR1,GR3
+FIN POP GR3
+ RET
IBUF DS 5
+ILEN DS 1
+MAXLEN DC 5
END
;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
;;; 入力 GR1:被乗数 GR2:乗数
-;;; 出力 GR0:積の下位WORD GR3:積の上位WORD
+;;; 出力 GR3:積
;;; 積が65535より大きい場合は、オーバーフロー
MULL START
- PUSH 0,GR4
- PUSH 0,GR5
- XOR GR0,GR0 ; 積
- XOR GR3,GR3 ; 上位word
- XOR GR5,GR5 ; 上位wordの一時値
- AND GR1,GR1 ; (GR1 = 0)の場合、終了
- JZE CHKOV ; ↓
- AND GR2,GR2 ; (GR2 = 0)の場合、終了
- JZE CHKOV ; ↓
- LAD GR4,1 ; 対象ビット
-LOOP PUSH 0,GR4 ; ループ先頭。GR2のビット中でGR4が示すビットが0の場合、NEXTへジャンプ
- AND GR4,GR2 ; ↓
- POP GR4 ; ↓
- JZE NEXT1 ; ↓
- ADDL GR3,GR5 ; GR3 <- GR3 + GR5
- ADDL GR0,GR1 ; GR0 <- GR0 + GR1
- JOV AHB1 ; GR0がオーバーフローした場合、AHB1へジャンプ
- JUMP NEXT1 ; ↓
-AHB1 LAD GR3,1,GR3 ; GR3 <- GR3 + 1
-NEXT1 SLL GR4,1 ; GR4を1回左シフト
- JOV CHKOV ; ↓
- SLL GR5,1 ; GR5を1回左シフト
- CPL GR4,GR2 ; (GR4 > GR2)の場合、CHKOVへジャンプ
- JPL CHKOV ; ↓
- SLL GR1,1 ; GR1を1回左シフト
- JOV AHB2 ; GR1がオーバーフローした場合、AHBへジャンプ
- JUMP NEXT2 ; ↓
-AHB2 LAD GR5,1,GR5 ; GR5 <- GR5 + 1
-NEXT2 JUMP LOOP ; ループ終端
-CHKOV AND GR3,GR3 ; GR3 = 0の場合、終了
+ XOR GR3,GR3 ; GR3の初期化
+ AND GR1,GR1 ; GR1 = 0 の場合、FINへジャンプ
JZE FIN ; ↓
- LAD GR4,#FFFF ; GR3 <> 0の場合、オーバーフロー
- SLL GR4,1 ; ↓
-FIN POP GR5
- POP GR4
- RET
+ AND GR2,GR2 ; GR2 = 0 の場合、FINへジャンプ
+ JZE FIN ; ↓
+ PUSH 0,GR1 ; GR1の退避
+ PUSH 0,GR2 ; GR2の退避
+LOOP SRL GR2,1 ; ループ開始。SRLを1つ右シフト
+ JOV ON ; 乗数の最下位ビットが1の場合、ONへジャンプ
+ JUMP NEXT ; NEXTへジャンプ
+ON ADDL GR3,GR1 ; GR3 <- GR3 + GR1
+ JOV POST ; GR3がオーバーフローした場合、POSTへジャンプ
+NEXT AND GR2,GR2 ; GR2 = 0 の場合、POSTへジャンプ
+ JZE POST ; ↓
+ SLL GR1,1 ; GR1を1つ左シフト
+ JOV POST ; GR1がオーバーフローした場合、POSTへジャンプ
+ JUMP LOOP ; ループ終端
+POST POP GR2 ; GR2の復元
+ POP GR1 ; GR1の復元
+FIN RET
END
;;; 10進数の整数を表す文字列を数値に変換
;;; 数値の範囲は、0から65535
-;;; 入力 GR1: 文字列を格納するアドレス
-;;; GR2: 文字列の長さ。最大5けた
-;;; 出力 GR0: 数値
-;;; 文字列が最大長より大きい場合や数値以外の場合は、GR0は#FFFF、OFは1
+;;; 入力 GR1: 文字列を格納するメモリーの先頭アドレス
+;;; GR2: 文字列の長さ。最大5けた
+;;; 出力 GR3: 数値
+;;; 文字列が最大長より大きい場合と数値以外の場合は、GR3は#FFFF、OFは1
+;;; 数値以外の場合、OFは1
;;; 依存プログラム: MULL
STR2L START
PUSH 0,GR1
PUSH 0,GR2
- PUSH 0,GR3
PUSH 0,GR4
PUSH 0,GR5
- XOR GR0,GR0 ; GR0:初期化
- AND GR2,GR2 ; (GR2 = 0)の場合、FINへジャンプ
- JZE FIN ; ↓
- CPL GR2,MAXLEN ; (GR2 > MAXLEN)の場合、LENOVへジャンプ
- JPL LENOV ; ↓
- ST GR1,STR ; STR <- GR1 文字列の開始アドレス
- ST GR2,LEN ; LEN <- GR2
- LAD GR2,10 ; GR2:10進数の「10」
- XOR GR4,GR4 ; GR4:値の一時格納
- XOR GR5,GR5 ; GR5:インデックス
-STOL CPL GR5,LEN ; ループ先頭。(GR5 = LEN)の場合、ループ脱出
- JZE CP ; ↓
- LD GR1,STR ; GR1に、入力文字列中の次の桁を格納
- ADDL GR1,GR5 ; ↓
+ PUSH 0,GR6
+ PUSH 0,GR7
+ XOR GR3,GR3 ; GR3の初期化
+ AND GR2,GR2 ; GR2 = 0の場合、OVへジャンプ
+ JZE OV ; ↓
+ CPL GR2,=5 ; GR2 > 5の場合、OVへジャンプ
+ JPL OV ; ↓
+ XOR GR4,GR4 ; GR4: インデックスの初期化
+ LD GR5,GR1 ; GR5 <- GR1
+ LD GR6,GR2 ; GR6 <- GR2
+ XOR GR1,GR1 ; GR1の初期化
+STOL LD GR1,GR5 ; GR1に、入力文字列中の次の桁を格納
+ ADDL GR1,GR4 ; ↓
LD GR1,0,GR1 ; ↓
- CPL GR1,ZERO ; (GR1 < '0')の場合、NANへジャンプ
- JMI NAN ; ↓
- CPL GR1,NINE ; (GR1 > '9')の場合、NANへジャンプ
- JPL NAN ; ↓
+ LD GR7,ZERO ; GR1 < '0'の場合、FINへジャンプ
+ CPL GR1,GR7 ; ↓
+ JMI FIN ; ↓
+ LD GR7,NINE ; GR1 > '9'の場合、FINへジャンプ
+ CPL GR7,GR1 ; ↓
+ JMI FIN ; ↓
SUBL GR1,ZERO ; GR1の文字を、対応する数値に変換
- ST GR5,NLEN ; GR5 <- LEN - NLEN - 1
- LD GR5,LEN ; ↓
- SUBA GR5,NLEN ; ↓
-MUL10 CPA GR5,=1 ; ループ先頭。GR1 <- 10 ** GR5
- JZE NEXT ; (GR5 = 1)の場合、ループ脱出
- JMI NEXT ; ↓
- CALL MULL ; MULLを呼び出し、GR0 <- GR1 * GR2
- JOV FIN ; ↓ オーバーフロー時は、プログラム終端へジャンプ
- LD GR1,GR0 ; GR1 <- GR0
- LAD GR5,-1,GR5 ; GR5 <- GR5 -1
- JUMP MUL10 ; ループ終端へジャンプ
-NEXT LD GR5,NLEN ; GR5 <- NLEN。復元
- ADDL GR4,GR1 ; GR4 <- GR4 + GR1
- JOV FIN ; ↓
- LAD GR5,1,GR5 ; GR5 <- GR5 + 1
+ ADDL GR3,GR1
+ JOV FIN
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+ CPL GR4,GR6 ; GR4 = GR6の場合、ループ脱出
+ JZE FIN ; ↓
+MUL10 LAD GR2,10 ; GR2:10進数の 10
+ LD GR1,GR3 ; GR1 <- GR3
+ CALL MULL ; MULLを呼び出し、GR3 <- GR1 * GR2
JUMP STOL ; ループ終端
-NAN LAD GR2,#FFFF ; GR2 <- #FFFF
- JUMP FIN ; FINへジャンプ
-CP LD GR1,GR4 ; GR0 <- GR4
- LD GR0,LEN ; GR0 <- LEN
- JUMP FIN ; プログラム終端へジャンプ
-LENOV LAD GR0,#FFFF ; 文字列が最大長より大きい場合、GR0 <- #FFFF
- SRA GR0,1 ; ↓ オーバーフロー発生
-FIN POP GR5
+OV LAD GR7,1 ; オーバーフロー発生
+ SRL GR7,1 ; ↓
+FIN POP GR7
+ POP GR6
+ POP GR5
POP GR4
- POP GR3
POP GR2
POP GR1
RET
ZERO DC '0'
NINE DC '9'
-MAXLEN DC 5 ; 文字列の最大長
-STR DS 1
-LEN DS 1
-NLEN DS 1
END
;;; 10進数の整数を表す文字列を数値に変換
;;; 数値の範囲は、0から65535
-;;; 入力 GR1: 文字列を格納するアドレス
-;;; GR2: 文字列の長さ。最大5けた
-;;; 出力 GR0: 数値
-;;; 文字列が最大長より大きい場合や数値以外の場合は、GR0は#FFFF、OFは1
+;;; 入力 GR1: 文字列を格納するメモリーの先頭アドレス
+;;; GR2: 文字列の長さ。最大5けた
+;;; 出力 GR3: 数値
+;;; 文字列が最大長より大きい場合と数値以外の場合は、GR3は#FFFF、OFは1
+;;; 数値以外の場合、OFは1
;;; 依存プログラム: MULL
STR2L START
PUSH 0,GR1
PUSH 0,GR2
- PUSH 0,GR3
PUSH 0,GR4
PUSH 0,GR5
- XOR GR0,GR0 ; GR0:初期化
- AND GR2,GR2 ; (GR2 = 0)の場合、FINへジャンプ
- JZE FIN ; ↓
- CPL GR2,MAXLEN ; (GR2 > MAXLEN)の場合、LENOVへジャンプ
- JPL LENOV ; ↓
- ST GR1,STR ; STR <- GR1 文字列の開始アドレス
- ST GR2,LEN ; LEN <- GR2
- LAD GR2,10 ; GR2:10進数の「10」
- XOR GR4,GR4 ; GR4:値の一時格納
- XOR GR5,GR5 ; GR5:インデックス
-STOL CPL GR5,LEN ; ループ先頭。(GR5 = LEN)の場合、ループ脱出
- JZE CP ; ↓
- LD GR1,STR ; GR1に、入力文字列中の次の桁を格納
- ADDL GR1,GR5 ; ↓
+ PUSH 0,GR6
+ PUSH 0,GR7
+ XOR GR3,GR3 ; GR3の初期化
+ AND GR2,GR2 ; GR2 = 0の場合、OVへジャンプ
+ JZE OV ; ↓
+ CPL GR2,=5 ; GR2 > 5の場合、OVへジャンプ
+ JPL OV ; ↓
+ XOR GR4,GR4 ; GR4: インデックスの初期化
+ LD GR5,GR1 ; GR5 <- GR1
+ LD GR6,GR2 ; GR6 <- GR2
+ XOR GR1,GR1 ; GR1の初期化
+STOL LD GR1,GR5 ; GR1に、入力文字列中の次の桁を格納
+ ADDL GR1,GR4 ; ↓
LD GR1,0,GR1 ; ↓
- CPL GR1,ZERO ; (GR1 < '0')の場合、NANへジャンプ
- JMI NAN ; ↓
- CPL GR1,NINE ; (GR1 > '9')の場合、NANへジャンプ
- JPL NAN ; ↓
+ LD GR7,ZERO ; GR1 < '0'の場合、FINへジャンプ
+ CPL GR1,GR7 ; ↓
+ JMI FIN ; ↓
+ LD GR7,NINE ; GR1 > '9'の場合、FINへジャンプ
+ CPL GR7,GR1 ; ↓
+ JMI FIN ; ↓
SUBL GR1,ZERO ; GR1の文字を、対応する数値に変換
- ST GR5,NLEN ; GR5 <- LEN - NLEN - 1
- LD GR5,LEN ; ↓
- SUBA GR5,NLEN ; ↓
-MUL10 CPA GR5,=1 ; ループ先頭。GR1 <- 10 ** GR5
- JZE NEXT ; (GR5 = 1)の場合、ループ脱出
- JMI NEXT ; ↓
- CALL MULL ; MULLを呼び出し、GR0 <- GR1 * GR2
- JOV FIN ; ↓ オーバーフロー時は、プログラム終端へジャンプ
- LD GR1,GR0 ; GR1 <- GR0
- LAD GR5,-1,GR5 ; GR5 <- GR5 -1
- JUMP MUL10 ; ループ終端へジャンプ
-NEXT LD GR5,NLEN ; GR5 <- NLEN。復元
- ADDL GR4,GR1 ; GR4 <- GR4 + GR1
- JOV FIN ; ↓
- LAD GR5,1,GR5 ; GR5 <- GR5 + 1
+ ADDL GR3,GR1
+ JOV FIN
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+ CPL GR4,GR6 ; GR4 = GR6の場合、ループ脱出
+ JZE FIN ; ↓
+MUL10 LAD GR2,10 ; GR2:10進数の 10
+ LD GR1,GR3 ; GR1 <- GR3
+ CALL MULL ; MULLを呼び出し、GR3 <- GR1 * GR2
JUMP STOL ; ループ終端
-NAN LAD GR2,#FFFF ; GR2 <- #FFFF
- JUMP FIN ; FINへジャンプ
-CP LD GR1,GR4 ; GR0 <- GR4
- LD GR0,LEN ; GR0 <- LEN
- JUMP FIN ; プログラム終端へジャンプ
-LENOV LAD GR0,#FFFF ; 文字列が最大長より大きい場合、GR0 <- #FFFF
- SRA GR0,1 ; ↓ オーバーフロー発生
-FIN POP GR5
+OV LAD GR7,1 ; オーバーフロー発生
+ SRL GR7,1 ; ↓
+FIN POP GR7
+ POP GR6
+ POP GR5
POP GR4
- POP GR3
POP GR2
POP GR1
RET
ZERO DC '0'
NINE DC '9'
-MAXLEN DC 5 ; 文字列の最大長
-STR DS 1
-LEN DS 1
-NLEN DS 1
END
;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
;;; 入力 GR1:被乗数 GR2:乗数
-;;; 出力 GR0:積の下位WORD GR3:積の上位WORD
+;;; 出力 GR3:積
;;; 積が65535より大きい場合は、オーバーフロー
MULL START
- PUSH 0,GR4
- PUSH 0,GR5
- XOR GR0,GR0 ; 積
- XOR GR3,GR3 ; 上位word
- XOR GR5,GR5 ; 上位wordの一時値
- AND GR1,GR1 ; (GR1 = 0)の場合、終了
- JZE CHKOV ; ↓
- AND GR2,GR2 ; (GR2 = 0)の場合、終了
- JZE CHKOV ; ↓
- LAD GR4,1 ; 対象ビット
-LOOP PUSH 0,GR4 ; ループ先頭。GR2のビット中でGR4が示すビットが0の場合、NEXTへジャンプ
- AND GR4,GR2 ; ↓
- POP GR4 ; ↓
- JZE NEXT1 ; ↓
- ADDL GR3,GR5 ; GR3 <- GR3 + GR5
- ADDL GR0,GR1 ; GR0 <- GR0 + GR1
- JOV AHB1 ; GR0がオーバーフローした場合、AHB1へジャンプ
- JUMP NEXT1 ; ↓
-AHB1 LAD GR3,1,GR3 ; GR3 <- GR3 + 1
-NEXT1 SLL GR4,1 ; GR4を1回左シフト
- JOV CHKOV ; ↓
- SLL GR5,1 ; GR5を1回左シフト
- CPL GR4,GR2 ; (GR4 > GR2)の場合、CHKOVへジャンプ
- JPL CHKOV ; ↓
- SLL GR1,1 ; GR1を1回左シフト
- JOV AHB2 ; GR1がオーバーフローした場合、AHBへジャンプ
- JUMP NEXT2 ; ↓
-AHB2 LAD GR5,1,GR5 ; GR5 <- GR5 + 1
-NEXT2 JUMP LOOP ; ループ終端
-CHKOV AND GR3,GR3 ; GR3 = 0の場合、終了
+ XOR GR3,GR3 ; GR3の初期化
+ AND GR1,GR1 ; GR1 = 0 の場合、FINへジャンプ
JZE FIN ; ↓
- LAD GR4,#FFFF ; GR3 <> 0の場合、オーバーフロー
- SLL GR4,1 ; ↓
-FIN POP GR5
- POP GR4
- RET
+ AND GR2,GR2 ; GR2 = 0 の場合、FINへジャンプ
+ JZE FIN ; ↓
+ PUSH 0,GR1 ; GR1の退避
+ PUSH 0,GR2 ; GR2の退避
+LOOP SRL GR2,1 ; ループ開始。SRLを1つ右シフト
+ JOV ON ; 乗数の最下位ビットが1の場合、ONへジャンプ
+ JUMP NEXT ; NEXTへジャンプ
+ON ADDL GR3,GR1 ; GR3 <- GR3 + GR1
+ JOV POST ; GR3がオーバーフローした場合、POSTへジャンプ
+NEXT AND GR2,GR2 ; GR2 = 0 の場合、POSTへジャンプ
+ JZE POST ; ↓
+ SLL GR1,1 ; GR1を1つ左シフト
+ JOV POST ; GR1がオーバーフローした場合、POSTへジャンプ
+ JUMP LOOP ; ループ終端
+POST POP GR2 ; GR2の復元
+ POP GR1 ; GR1の復元
+FIN RET
END
-;GR1の値とGR2の値の積をGR0に格納
+;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
+;;; 入力 GR1:被乗数 GR2:乗数
+;;; 出力 GR3:積
+;;; 積が65535より大きい場合は、オーバーフロー
MULL START
- RPUSH
- LAD GR3,0 ; インデックス
- LAD GR0,0 ; 積
-MLOOP CPA GR2,GR3 ; ループ先頭。(GR2 = GR3)の場合、ループ脱出
- JZE MFIN ; ↓
- ADDL GR0,GR1 ; GR0 <- GR0 + GR1
- JOV MFIN ; オーバーフローした場合、ループ脱出
- LAD GR3,1,GR3 ; GR3 <- GR3 + 1
- JUMP MLOOP ; ループ終端
-MFIN RPOP
+ PUSH 0,GR4
+ XOR GR3,GR3 ; 積
+ XOR GR4,GR4 ; インデックス
+LOOP CPL GR2,GR4 ; ループ先頭。GR2 = GR4 の場合、FINへジャンプ
+ JZE FIN ; ↓
+ ADDL GR3,GR1 ; GR3 <- GR3 + GR1
+ JOV FIN ; オーバーフローした場合、FINへジャンプ
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+ JUMP LOOP ; ループ終端
+FIN POP GR4
RET
END
32767
32768
65535
-Over 65535
-Over 65535
-Not A Number
-Not A Number
+Not a number
+Not a number
+Not a number
+Not a number
12345
-Str too long. Stop
+Over 65535
+1234
-../../../../casl2 -M2048 ../../../../as/casl2lib/sample/call_inl.casl ../../../../as/casl2lib/stdlib.casl <teststr.txt
+casl2 -M2048 ../../../../as/casl2lib/sample/call_inl.casl ../../../../as/casl2lib/stdlib.casl <teststr.txt
2
2
--------------------
-2
+1
+127
127
-254
--------------------
+1
128
128
-16384
--------------------
-16384
+1
+255
255
-overflow
-49152
-63
--------------------
-63
+1
+256
256
-16128
--------------------
-16128
+1
+257
257
-overflow
-16128
-63
--------------------
-63
+1
+32767
32767
-overflow
-32705
-31
--------------------
-31
+1
32768
-overflow
32768
-15
--------------------
-15
+1
+65535
65535
-overflow
-65521
-14
--------------------
2
0
2
4
--------------------
-4
+2
127
-508
+254
--------------------
-256
+2
128
-32768
+256
--------------------
-32768
+2
255
-overflow
-32768
-127
+510
--------------------
-127
+2
256
-32512
+512
--------------------
-32512
+2
257
-overflow
-32512
-127
+514
--------------------
-127
+2
32767
-overflow
-32641
-63
+65534
--------------------
-63
+2
32768
overflow
-32768
-31
---------------------
-31
-65535
-overflow
-65505
-30
--------------------
127
0
2
254
--------------------
-254
127
-32258
+127
+16129
--------------------
-16256
+127
128
-overflow
-49152
-31
+16256
--------------------
-31
+127
255
-7905
+32385
--------------------
-3968
+127
256
-overflow
-32768
-15
+32512
--------------------
-15
+127
257
-3855
+32639
--------------------
-3840
+127
32767
overflow
-61696
-1919
---------------------
-1919
-32768
-overflow
-32768
-959
---------------------
-959
-65535
-overflow
-64577
-958
--------------------
128
0
2
256
--------------------
-256
+128
127
-32512
+16256
--------------------
-16384
128
-overflow
-0
-32
+128
+16384
--------------------
-32
+128
255
-8160
+32640
--------------------
-4096
+128
256
-overflow
-0
-16
+32768
--------------------
-16
+128
257
-4112
+32896
--------------------
-4096
+128
32767
overflow
-61440
-2047
---------------------
-2047
-32768
-overflow
-32768
-1023
---------------------
-1023
-65535
-overflow
-64513
-1022
--------------------
255
0
2
510
--------------------
-510
+255
127
-64770
+32385
--------------------
-32640
+255
128
-overflow
-49152
-63
+32640
--------------------
-63
255
-16065
+255
+65025
--------------------
-8064
+255
256
-overflow
-32768
-31
+65280
--------------------
-31
+255
257
-7967
+65535
--------------------
-7936
+255
32767
overflow
-57600
-3967
---------------------
-3967
-32768
-overflow
-32768
-1983
---------------------
-1983
-65535
-overflow
-63553
-1982
--------------------
256
0
2
512
--------------------
-512
+256
127
-65024
+32512
--------------------
-32768
+256
128
-overflow
-0
-64
+32768
--------------------
-64
+256
255
-16320
+65280
--------------------
-8192
+256
256
overflow
-0
-32
---------------------
-32
-257
-8224
---------------------
-8192
-32767
-overflow
-57344
-4095
---------------------
-4095
-32768
-overflow
-32768
-2047
---------------------
-2047
-65535
-overflow
-63489
-2046
--------------------
257
0
2
514
--------------------
-514
+257
127
-65278
+32639
--------------------
-32896
+257
128
-overflow
-16384
-64
+32896
--------------------
-64
+257
255
-16320
---------------------
-8192
-256
-overflow
-0
-32
+65535
--------------------
-32
257
-8224
---------------------
-8192
-32767
-overflow
-57344
-4095
---------------------
-4095
-32768
-overflow
-32768
-2047
---------------------
-2047
-65535
+256
overflow
-63489
-2046
--------------------
32767
0
2
65534
--------------------
-65534
-127
-overflow
-65282
-126
---------------------
-126
-128
-16128
---------------------
-16128
-255
-overflow
-49408
-62
---------------------
-62
-256
-15872
---------------------
-15872
-257
-overflow
-15872
-62
---------------------
-62
32767
+127
overflow
-65474
-30
---------------------
-30
-32768
-overflow
-0
-15
---------------------
-15
-65535
-overflow
-65521
-14
--------------------
32768
0
32768
2
overflow
-0
-1
---------------------
-1
-127
-127
---------------------
-64
-128
-8192
---------------------
-8192
-255
-overflow
-57344
-31
---------------------
-31
-256
-7936
---------------------
-7936
-257
-overflow
-7936
-31
---------------------
-31
-32767
-overflow
-32737
-15
---------------------
-15
-32768
-overflow
-32768
-7
---------------------
-7
-65535
-overflow
-65529
-6
--------------------
65535
0
65535
2
overflow
-65534
-1
---------------------
-1
-127
-127
---------------------
-64
-128
-8192
---------------------
-8192
-255
-overflow
-57344
-31
---------------------
-31
-256
-7936
---------------------
-7936
-257
-overflow
-7936
-31
---------------------
-31
-32767
-overflow
-32737
-15
---------------------
-15
-32768
-overflow
-32768
-7
---------------------
-7
-65535
-overflow
-65529
-6
--------------------
-../../../../casl2 -M2048 ../../../../as/casl2lib/sample/call_mull.casl ../../../../as/casl2lib/stdlib.casl
+# ../../../../casl2 ../../../../as/casl2lib/sample/call_mull.casl ../../../../as/casl2lib/mull.casl ../../../../as/casl2lib/outl.casl
+../../../../casl2 ../../../../as/casl2lib/sample/call_mull.casl ../../../../as/casl2lib/mull.casl ../../../../as/casl2lib/outl.casl