prefix = $(HOME)
-CLEANDIR = src test/integration test/unit
-.PHPNY: all clean check install uninstall
-all:
+CLEANDIR = src test/integration test/unit as/casl2lib
+.PHPNY: all build clean check doc casl2lib install uninstall
+all: build casl2lib
+build:
make -C src
+casl2lib:
+ @make -C as/casl2lib
check:
@make -sC test/integration
+doc:
+ @make -sC doc
clean:
@for target in $(CLEANDIR); do $(MAKE) -sC $$target clean; done
install: all
--- /dev/null
+inl.casl
+l2str.casl
+mula.casl
+outa.casl
+outb.casl
+outl.casl
\ No newline at end of file
+++ /dev/null
-.PHONY: clean
-
-$(TARGET): $(SRCFILE)
- @echo ";;; *** This file is auto generated from $(SRCFILE) of `pwd | xargs basename` ***" >$@; \
- cat $^ >>$@
-clean:
- @rm $(TARGET)
-SRCDIR = `ls -d src_*`
-TESTDIR = test
+ECHOHEADER = 'echo ";;; *** This file is auto generated. ***"'
+TARGETS = inl.casl l2str.casl mula.casl outa.casl outb.casl outl.casl
.PHONY: all clean
-all:
- @for target in $(SRCDIR); do $(MAKE) -C $$target; done
+all: $(TARGETS)
+inl.casl: src_inl/inl_main.casl mull.casl
+ @echo ";;; *** This file is auto generated. ***" >$@; \
+ cat $^ >>$@
+l2str.casl: src_l2str/l2str_main.casl divl.casl rev.casl
+ @echo ";;; *** This file is auto generated. ***" >$@; \
+ cat $^ >>$@
+mula.casl: src_mula/mula_main.casl mull.casl
+ @echo ";;; *** This file is auto generated. ***" >$@; \
+ cat $^ >>$@
+outa.casl: src_outa/outa_main.casl divl.casl rev.casl abs.casl
+ @echo ";;; *** This file is auto generated. ***" >$@; \
+ cat $^ >>$@
+outb.casl: src_outb/outb_main.casl divl.casl rev.casl
+ @echo ";;; *** This file is auto generated. ***" >$@; \
+ cat $^ >>$@
+outl.casl: src_outl/outl_main.casl l2str.casl
+ @echo ";;; *** This file is auto generated. ***" >$@; \
+ cat $^ >>$@
clean:
- @for target in $(SRCDIR); do $(MAKE) -C $$target clean; done;
- make -C $(TESTDIR) clean
-check:
- @make -C $(TESTDIR)
+ @for target in $(TARGETS); do rm -f $$target; done
+++ /dev/null
-;;; *** This file is auto generated from inl_main.casl ../mull.casl of src_inl ***
-;;; 0〜65535の範囲にある整数の入力を受け付ける
-;;; 入力 (SVC)
-;;; 出力 GR1: 入力された数値 GR0: 文字の長さ。入力が数字以外の場合は、#FFFF
-;;; 65536以上の正数が入力された場合はエラー
-INL START
- PUSH 0,GR2
- PUSH 0,GR3
- PUSH 0,GR4
- IN IBUF,ILEN ; 入力文字列を格納
- LD GR0,ILEN ; ILEN = 0の場合、FINへジャンプ
- JZE FIN ; ↓
- XOR GR1,GR1 ; GR1:各桁の数値 初期化
- LAD GR2,10 ; GR2:10進数の「10」 初期化
- LAD GR3,0 ; GR3:値の一時格納 初期化
- LAD GR4,0 ; GR4:インデックス 初期化
-STOL CPL GR4,ILEN ; ループ先頭。(GR4 = ILEN)の場合、ループ脱出
- JZE CP ; ↓
- LD GR1,IBUF,GR4 ; GR1に、入力文字列中の次の桁を格納
- CPL GR1,ZERO ; (GR1 < '0')の場合、NANへジャンプ
- JMI NAN ; ↓
- CPL GR1,NINE ; (GR1 > '9')の場合、NANへジャンプ
- JPL NAN ; ↓
- SUBL GR1,ZERO ; GR1の文字を、対応する数値に変換
- ST GR4,NLEN ; GR4 <- ILEN - NLEN - 1
- LD GR4,ILEN ; ↓
- SUBA GR4,NLEN ; ↓
-MUL10 CPA GR4,=1 ; ループ先頭。GR1 <- 10 ** GR4
- JZE NEXT ; (GR4 = 1)の場合、ループ脱出
- JMI NEXT ; ↓
- CALL MULL ; MULLを呼び出し、GR0 <- GR1 * GR2
- JOV FIN ; ↓
- LD GR1,GR0 ; GR1 <- GR0
- LAD GR4,-1,GR4 ; GR4 <- GR4 -1
- JUMP MUL10 ; ループ終端
-NEXT LD GR4,NLEN ; GR4 <- NLEN。復元
- ADDL GR3,GR1 ; GR3 <- GR3 + GR1
- JOV FIN ; ↓
- LAD GR4,1,GR4 ; GR4 <- GR4 + 1
- JUMP STOL ; ループ終端
-NAN LAD GR0,#FFFF ; GR0 <- #FFFF
- JUMP FIN ; FINへジャンプ
-CP LD GR1,GR3 ; GR0 <- GR3
- LD GR0,ILEN ; GR0 <- ILEN
-FIN POP GR4
- POP GR3
- POP GR2
- RET
-ZERO DC '0'
-NINE DC '9'
-IBUF DS 5
-ILEN DS 1
-NLEN DS 1
- END
-
-;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
-;;; 入力 GR1:被乗数 GR2:乗数
-;;; 出力 GR0:積
-;;; 積が65535より大きい場合は、GR0は積の下位16ビットになり、オーバーフロー
-MULL START
- PUSH 0,GR1
- PUSH 0,GR3
- XOR GR0,GR0 ; 積
- AND GR1,GR1 ; (GR1 = 0)の場合、終了
- JZE FIN ; ↓
- AND GR2,GR2 ; (GR2 = 0)の場合、終了
- JZE FIN ; ↓
- LAD GR3,1 ; 対象ビット
-LOOP PUSH 0,GR3 ; ループ先頭。GR2のビット中でGR3が示すビットが0の場合、NEXTへジャンプ
- AND GR3,GR2 ; ↓
- POP GR3 ; ↓
- JZE NEXT ; ↓
- ADDL GR0,GR1 ; GR0 <- GR0 + GR1
- JOV FIN ; GR0がオーバーフローした場合、ループ脱出
-NEXT SLL GR3,1 ; GR3を1回左シフト
- AND GR3,GR3 ; (GR3 = 0)の場合、ループ脱出
- JZE FIN ; ↓
- CPL GR3,GR2 ; (GR3 > GR2)の場合、ループ脱出
- JPL FIN ; ↓
- SLL GR1,1 ; GR1を1回左シフト
- JOV FIN ; GR1がオーバーフローした場合、ループ脱出
- JUMP LOOP ; ループ終端
-FIN POP GR3
- POP GR1
- RET
- END
+++ /dev/null
-;;; -32767〜32767の範囲にある正数のかけ算(筆算方式)を行う
-;;; 入力 GR1:被乗数 GR2:乗数
-;;; 出力 GR0:積
-;;; 被乗数または乗数が-32768の場合は、オーバーフロー
-;;; 積が-32767未満または32767より大きい場合は、GR0は積の下位16ビットになり、オーバーフロー
-MULA START
- RPUSH
- XOR GR0,GR0 ; 積
- AND GR1,GR1 ; (GR1 = 0)の場合、終了
- JZE FIN ; ↓
- AND GR2,GR2 ; (GR2 = 0)の場合、終了
- JZE FIN ; ↓
- LAD GR3,1 ; 対象ビット
- XOR GR4,GR4 ; マイナスフラグ
-CHK1 AND GR1,GR1 ; (GR1 > 0)の場合は、CHK2へジャンプ
- JPL CHK2 ; ↓
- XOR GR1,ALLON ; GR1の正負を反転
- ADDA GR1,ONE ; ↓
- JOV FIN ; (GR1 = -32768)の場合は終了
- XOR GR4,ONE ; GR4 <- 1
-CHK2 AND GR2,GR2 ; (GR1 > 0)の場合は、LOOPへジャンプ
- JPL MUL ; ↓
- XOR GR2,ALLON ; GR2の正負を反転
- ADDA GR2,ONE ; ↓
- JOV FIN ; (GR2 = -32768)の場合は終了
- XOR GR4,ONE ; マイナスフラグを反転
-MUL CALL MULL ; GR0 <- GR1 * GR2
- JOV FIN
- AND GR0,GR0
- JMI OV
-MIN AND GR4,GR4 ; マイナスフラグがオフの場合、終了
- JZE FIN ; ↓
- XOR GR0,ALLON ; GR1の正負を反転
- ADDA GR0,ONE ; ↓
- JUMP FIN
-OV ADDL GR0,=#8000
-FIN RPOP
- RET
-ONE DC 1
-ALLON DC #FFFF
- END
-;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
-;;; 入力 GR1:被乗数 GR2:乗数
-;;; 出力 GR0:積
-;;; 積が65535より大きい場合は、GR0は積の下位16ビットになり、オーバーフロー
-MULL START
- PUSH 0,GR1
- PUSH 0,GR3
- XOR GR0,GR0 ; 積
- AND GR1,GR1 ; (GR1 = 0)の場合、終了
- JZE FIN ; ↓
- AND GR2,GR2 ; (GR2 = 0)の場合、終了
- JZE FIN ; ↓
- LAD GR3,1 ; 対象ビット
-LOOP PUSH 0,GR3 ; ループ先頭。GR2のビット中でGR3が示すビットが0の場合、NEXTへジャンプ
- AND GR3,GR2 ; ↓
- POP GR3 ; ↓
- JZE NEXT ; ↓
- ADDL GR0,GR1 ; GR0 <- GR0 + GR1
- JOV FIN ; GR0がオーバーフローした場合、ループ脱出
-NEXT SLL GR3,1 ; GR3を1回左シフト
- AND GR3,GR3 ; (GR3 = 0)の場合、ループ脱出
- JZE FIN ; ↓
- CPL GR3,GR2 ; (GR3 > GR2)の場合、ループ脱出
- JPL FIN ; ↓
- SLL GR1,1 ; GR1を1回左シフト
- JOV FIN ; GR1がオーバーフローした場合、ループ脱出
- JUMP LOOP ; ループ終端
-FIN POP GR3
- POP GR1
- RET
- END
+++ /dev/null
-;;; GR1に格納された値を、10進数の整数値(-32768〜32767)として表示
-OUTA START
- RPUSH
- LAD GR2,10 ; GR2に10進数の「10」を格納。
- LAD GR0,0 ; GR0 <- 0
- LAD GR4,0 ; 負数フラグ。GR1が負数の場合、GR4は1
- LAD GR5,0 ; 整数値の長さ
- AND GR1,GR1 ; GR1をテスト
- JZE ZPRT ; GR1が0の場合、ZPRTにジャンプ
- JPL STI ; GR1が正数の場合、STIにジャンプ
- LAD GR4,1 ; GR1が負数の場合、GR4をオン
- CALL ABS ; GR1を正数に変換
-STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出
- JMI STLST ; ↓
- CALL DIVL ; GR1とGR2の、商をGR0、剰余をGR3に格納
- LD GR1,GR3 ; GR1にGR3をコピー
- LD GR1,NCHAR,GR1 ; GR1を文字に変換
- ST GR1,STR,GR5 ; (STR + GR5) <- GR1
- LAD GR5,1,GR5 ; GR5 <- GR5 + 1
- LD GR1,GR0 ; GR0をGR1にコピー
- JUMP STI ; ループ終端
-STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換
- ST GR1,STR,GR5 ; (STR + GR5) <- GR1
- LAD GR5,1,GR5 ; GR5 <- GR5 + 1
- AND GR4,GR4 ; 正数の場合
- JZE PRT ; ↓
- LD GR1,='-' ; 負数の場合、「-」をSTR領域に格納
- ST GR1,STR,GR5 ; (STR + GR5) <- GR1
- LAD GR5,1,GR5 ; GR5 <- GR5 + 1
- JUMP PRT ; PRTにジャンプ
-ZPRT LD GR1,NCHAR ; 「0」をSTR領域に格納
- ST GR1,STR,GR5 ; (STR + GR5) <- GR1
- LAD GR5,1,GR5 ; GR5 <- GR5 + 1
-PRT ST GR5,LEN ; LEN <- GR5
- LD GR2,LEN ; GR2にLENの値を格納
- LAD GR1,STR ; GR1に文字列のアドレスを格納
- CALL REV ; 文字列を逆順に並べ替え
- OUT STR,LEN ; 文字列を出力
- RPOP
- RET
-STR DS 17
-LEN DS 1
-NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- END
-;;; 0〜65535の範囲にある正数の割算(筆算方式)を行う
-;;; 入力 GR1:被除数 GR2:除数
-;;; 出力 GR0:商 GR3:剰余
-;;; (GR2 = 0)の場合、GR0 GR3とも0になり、オーバーフロー
-DIVL START
- PUSH 0,GR1
- PUSH 0,GR2
- PUSH 0,GR4
- XOR GR0,GR0 ; GR0:商 初期化
- XOR GR3,GR3 ; GR3:剰余 初期化
- AND GR2,GR2 ; (GR2 = 0)の場合、DIVZEROへジャンプ
- JZE DIVZERO ; ↓
- AND GR1,GR1 ; (GR1 = 0)の場合、FINへジャンプ
- JZE FIN ; ↓
- ST GR2,Y ; YにGR2の初期値を保存
- LAD GR4,1 ; GR4:対象ビットのインデックス 初期化
-SL CPL GR2,GR1 ; ループ先頭。(GR2 > GR1)の場合、LOOPへループ脱出
- JPL LOOP ; ↓
- SLL GR4,1 ; GR4を1回左シフト
- ST GR2,TMP ; GR2の値をTMPに退避
- SLL GR2,1 ; GR2を1回左シフト
- JOV YOV ; オーバーフローの場合は、YOVへジャンプ
- JUMP SL ; ループ終端
-YOV LD GR2,TMP ; GR2の値をTMPから復元
- SRL GR4,1 ; GR4を1回右シフト
- JUMP LPIN ; LPINへジャンプ
-LOOP SRL GR4,1 ; ループ先頭。GR4を1回右シフト
- JZE SETMOD ; (GR4 = 0)の場合、SETMODへループ脱出
- SRL GR2,1 ; GR2を1回右シフト
- CPL GR1,Y ; (GR1 < Y)の場合、SETMODへループ脱出
- JMI SETMOD ; ↓
- CPL GR1,GR2 ; (GR1 < GR2)の場合、ループ先頭へジャンプ
- JMI LOOP ; ↓
-LPIN SUBL GR1,GR2 ; GR1 <- GR1 - GR2
- ADDL GR0,GR4 ; GR0 <- GR0 + GR4
- JUMP LOOP ; ループ終端
-DIVZERO LAD GR3,#8000 ; 強制的にオーバーフローを発生させ、GR3 <- 0
- SLL GR3,1 ; ↓
- JUMP FIN ; FIN へジャンプ
-SETMOD LD GR3,GR1 ; GR3 <- GR1。剰余の設定
-FIN POP GR4
- POP GR2
- POP GR1
- RET
-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
-;;; GR1を絶対値に変換する
-;;; 入力 GR1:-32768〜32767の整数
-;;; 出力 GR1:入力された整数の絶対値
-;;; OF:入力されたGR1が-32768の場合、1
-;;; SF:入力されたGR1が負数(-32767〜-1)の場合、1
-ABS START
- AND GR1,GR1
- JPL FIN
- JZE FIN
- XOR GR1,ALLON
- ADDA GR1,ONE
- JOV FIN
- CPL GR1,ALLON
-FIN RET
-ONE DC 1
-ALLON DC #FFFF
- END
+++ /dev/null
-;;; GR1に格納された値を、2進数値として表示
-OUTB START
- RPUSH
- LAD GR2,2 ; GR2に2進数の「2」を格納。
- LAD GR0,0 ; GR0 <- 0
- XOR GR4,GR4 ; 2進数値の長さ
- AND GR1,GR1 ; GR1をテスト
- JZE ZERO ; GR1が0の場合、ZEROにジャンプ
-STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出
- JMI STLST ; ↓
- CALL DIVL ; GR1とGR2の、商をGR0、剰余をGR3に格納
- LD GR1,GR3 ; GR1にGR3をコピー
- LD GR1,NCHAR,GR1 ; GR1を文字に変換
- ST GR1,STR,GR4 ; (STR + GR4) <- GR1
- LAD GR4,1,GR4 ; GR4 <- GR4 + 1
- LD GR1,GR0 ; GR0をGR1にコピー
- JUMP STI ; ループ終端
-STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換
- ST GR1,STR,GR4 ; (STR + GR4) <- GR1
- LAD GR4,1,GR4 ; GR4 <- GR4 + 1
- JUMP EMB ; EMBにジャンプ
-ZERO LD GR1,NCHAR ; 「0」をSTR領域に格納
- ST GR1,STR,GR4 ; ↓ (STR + GR4) <- GR1
- LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1
-EMB LD GR1,NCHAR ; GR1 <- '0'
-EMLOOP CPA GR4,DIG ; ループ先頭。(GR4 = DIG)の場合は、ループ脱出
- JZE PRT ; ↓
- ST GR1,STR,GR4 ; ↓ (STR + GR4) <- GR1
- LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1
- JUMP EMLOOP ; ループ終端
-PRT ST GR4,LEN ; LEN <- GR4
- LD GR2,LEN ; GR2にLENの値を格納
- LAD GR1,STR ; GR1に文字列のアドレスを格納
- CALL REV ; 文字列を逆順に並べ替え
- OUT STR,LEN ; 文字列を出力
- RPOP
- RET
-STR DS 17
-LEN DS 1
-NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-DIG DC 16
- END
-;;; 0〜65535の範囲にある正数の割算(筆算方式)を行う
-;;; 入力 GR1:被除数 GR2:除数
-;;; 出力 GR0:商 GR3:剰余
-;;; (GR2 = 0)の場合、GR0 GR3とも0になり、オーバーフロー
-DIVL START
- PUSH 0,GR1
- PUSH 0,GR2
- PUSH 0,GR4
- XOR GR0,GR0 ; GR0:商 初期化
- XOR GR3,GR3 ; GR3:剰余 初期化
- AND GR2,GR2 ; (GR2 = 0)の場合、DIVZEROへジャンプ
- JZE DIVZERO ; ↓
- AND GR1,GR1 ; (GR1 = 0)の場合、FINへジャンプ
- JZE FIN ; ↓
- ST GR2,Y ; YにGR2の初期値を保存
- LAD GR4,1 ; GR4:対象ビットのインデックス 初期化
-SL CPL GR2,GR1 ; ループ先頭。(GR2 > GR1)の場合、LOOPへループ脱出
- JPL LOOP ; ↓
- SLL GR4,1 ; GR4を1回左シフト
- ST GR2,TMP ; GR2の値をTMPに退避
- SLL GR2,1 ; GR2を1回左シフト
- JOV YOV ; オーバーフローの場合は、YOVへジャンプ
- JUMP SL ; ループ終端
-YOV LD GR2,TMP ; GR2の値をTMPから復元
- SRL GR4,1 ; GR4を1回右シフト
- JUMP LPIN ; LPINへジャンプ
-LOOP SRL GR4,1 ; ループ先頭。GR4を1回右シフト
- JZE SETMOD ; (GR4 = 0)の場合、SETMODへループ脱出
- SRL GR2,1 ; GR2を1回右シフト
- CPL GR1,Y ; (GR1 < Y)の場合、SETMODへループ脱出
- JMI SETMOD ; ↓
- CPL GR1,GR2 ; (GR1 < GR2)の場合、ループ先頭へジャンプ
- JMI LOOP ; ↓
-LPIN SUBL GR1,GR2 ; GR1 <- GR1 - GR2
- ADDL GR0,GR4 ; GR0 <- GR0 + GR4
- JUMP LOOP ; ループ終端
-DIVZERO LAD GR3,#8000 ; 強制的にオーバーフローを発生させ、GR3 <- 0
- SLL GR3,1 ; ↓
- JUMP FIN ; FIN へジャンプ
-SETMOD LD GR3,GR1 ; GR3 <- GR1。剰余の設定
-FIN POP GR4
- POP GR2
- POP GR1
- RET
-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
+++ /dev/null
-;;; GR1に格納された値を、10進数の整数値(0〜65535)として表示
-OUTL START
- RPUSH
- LAD GR2,10 ; GR2に10進数の「10」を格納。
- LAD GR0,0 ; GR0 <- 0
- XOR GR4,GR4 ; 整数値の長さ
- AND GR1,GR1 ; GR1をテスト
- JZE ZERO ; GR1が0の場合、ZEROにジャンプ
-STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出
- JMI STLST ; ↓
- CALL DIVL ; GR1とGR2の、商をGR0、剰余をGR3に格納
- LD GR1,GR3 ; GR1にGR3をコピー
- LD GR1,NCHAR,GR1 ; GR1を文字に変換
- ST GR1,STR,GR4 ; (STR + GR4) <- GR1
- LAD GR4,1,GR4 ; GR4 <- GR4 + 1
- LD GR1,GR0 ; GR0をGR1にコピー
- JUMP STI ; ループ終端
-STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換
- ST GR1,STR,GR4 ; (STR + GR4) <- GR1
- LAD GR4,1,GR4 ; GR4 <- GR4 + 1
- JUMP PRT ; PRTにジャンプ
-ZERO LD GR1,NCHAR ; 「0」をSTR領域に格納
- ST GR1,STR,GR4 ; ↓ (STR + GR4) <- GR1
- LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1
-PRT ST GR4,LEN ; LEN <- GR4
- LD GR2,LEN ; GR2にLENの値を格納
- LAD GR1,STR ; GR1に文字列のアドレスを格納
- CALL REV ; 文字列を逆順に並べ替え
- OUT STR,LEN ; 文字列を出力
- RPOP
- RET
-STR DS 17
-LEN DS 1
-NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- END
-;;; 0〜65535の範囲にある正数の割算(筆算方式)を行う
-;;; 入力 GR1:被除数 GR2:除数
-;;; 出力 GR0:商 GR3:剰余
-;;; (GR2 = 0)の場合、GR0 GR3とも0になり、オーバーフロー
-DIVL START
- PUSH 0,GR1
- PUSH 0,GR2
- PUSH 0,GR4
- XOR GR0,GR0 ; GR0:商 初期化
- XOR GR3,GR3 ; GR3:剰余 初期化
- AND GR2,GR2 ; (GR2 = 0)の場合、DIVZEROへジャンプ
- JZE DIVZERO ; ↓
- AND GR1,GR1 ; (GR1 = 0)の場合、FINへジャンプ
- JZE FIN ; ↓
- ST GR2,Y ; YにGR2の初期値を保存
- LAD GR4,1 ; GR4:対象ビットのインデックス 初期化
-SL CPL GR2,GR1 ; ループ先頭。(GR2 > GR1)の場合、LOOPへループ脱出
- JPL LOOP ; ↓
- SLL GR4,1 ; GR4を1回左シフト
- ST GR2,TMP ; GR2の値をTMPに退避
- SLL GR2,1 ; GR2を1回左シフト
- JOV YOV ; オーバーフローの場合は、YOVへジャンプ
- JUMP SL ; ループ終端
-YOV LD GR2,TMP ; GR2の値をTMPから復元
- SRL GR4,1 ; GR4を1回右シフト
- JUMP LPIN ; LPINへジャンプ
-LOOP SRL GR4,1 ; ループ先頭。GR4を1回右シフト
- JZE SETMOD ; (GR4 = 0)の場合、SETMODへループ脱出
- SRL GR2,1 ; GR2を1回右シフト
- CPL GR1,Y ; (GR1 < Y)の場合、SETMODへループ脱出
- JMI SETMOD ; ↓
- CPL GR1,GR2 ; (GR1 < GR2)の場合、ループ先頭へジャンプ
- JMI LOOP ; ↓
-LPIN SUBL GR1,GR2 ; GR1 <- GR1 - GR2
- ADDL GR0,GR4 ; GR0 <- GR0 + GR4
- JUMP LOOP ; ループ終端
-DIVZERO LAD GR3,#8000 ; 強制的にオーバーフローを発生させ、GR3 <- 0
- SLL GR3,1 ; ↓
- JUMP FIN ; FIN へジャンプ
-SETMOD LD GR3,GR1 ; GR3 <- GR1。剰余の設定
-FIN POP GR4
- POP GR2
- POP GR1
- RET
-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
+++ /dev/null
-TARGET = ../inl.casl
-SRCFILE = inl_main.casl ../mull.casl
-include ../BUILD.mk
--- /dev/null
+;;; 数値を10進数の整数を表す文字列として格納
+;;; 入力 GR1: 数値(0〜65535) GR2: 文字列を格納するアドレス
+;;; 出力 GR0: 文字列の長さ
+L2STR START
+ PUSH 0,GR1
+ PUSH 0,GR3
+ PUSH 0,GR4
+ LAD GR2,10 ; GR2に10進数の「10」を格納。
+ LAD GR0,0 ; GR0 <- 0
+ LD GR4,GR2 ; GR4 <- GR2
+ AND GR1,GR1 ; GR1をテスト
+ JZE ZERO ; GR1が0の場合、ZEROにジャンプ
+ PUSH 0,GR2 ; GR2を退避
+ LAD GR2,BASE ; GR2 <- BASE:基数10
+STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出
+ JMI STLST ; ↓
+ CALL DIVL ; GR1とGR2の、商をGR0、剰余をGR3に格納
+ LD GR1,GR3 ; GR1にGR3をコピー
+ LD GR1,NCHAR,GR1 ; GR1を文字に変換
+ ST GR1,0,GR4 ; GR4のアドレス <- GR1
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+ LD GR1,GR0 ; GR1 <- GR0:商
+ JUMP STI ; ループ終端
+STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換
+ ST GR1,0,GR4 ; GR4のアドレス <- GR1
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+ POP GR2 ; GR2を復元
+ SUBL GR4,GR2 ; GR4 <- (GR4 - GR2):文字列の長さ
+ JUMP RV ; RVへジャンプ
+ZERO LD GR1,NCHAR ; 「0」をSTR領域に格納
+ ST GR1,0,GR4 ; ↓ GR4のアドレス <- GR1
+ LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1
+RV LD GR1,GR2 ; 文字列を逆順に並べ替え
+ LD GR2,GR4 ; ↓
+ CALL REV ; ↓
+FIN LD GR0,GR2 ; GR0 <- GR2
+ LD GR2,GR1 ; GR2 <- GR1
+ POP GR4
+ POP GR3
+ POP GR1
+ RET
+BASE DC 10
+LEN DS 1
+NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ END
+++ /dev/null
-TARGET = ../mula.casl
-SRCFILE = mula_main.casl ../mull.casl
-include ../BUILD.mk
+++ /dev/null
-TARGET = ../outa.casl
-SRCFILE = outa_main.casl ../divl.casl ../rev.casl ../abs.casl
-include ../BUILD.mk
+++ /dev/null
-TARGET = ../outb.casl
-SRCFILE = outb_main.casl ../divl.casl ../rev.casl
-include ../BUILD.mk
+++ /dev/null
-TARGET = ../outl.casl
-SRCFILE = outl_main.casl ../divl.casl ../rev.casl
-include ../BUILD.mk
OUT STR,LEN ; 文字列を出力
RPOP
RET
-STR DS 17
+STR DS 17 ; 符号付き2進数で表記した場合を想定
LEN DS 1
NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
END
+++ /dev/null
-abs: Test Success 2010-02-14 09:43:43
-addl32: Test Success 2010-02-14 09:43:43
-divl: Test Success 2010-02-14 09:43:45
-inl: Test Success 2010-02-14 09:43:45
-minim: Test Failure 2010-02-14 09:43:45
-mula: Test Success 2010-02-14 09:43:46
-mull: Test Success 2010-02-14 09:43:47
-outa: Test Success 2010-02-14 09:43:47
-outb_call: Test Success 2010-02-12 01:13:06
-outd_q15_call: Test Success 2010-02-12 01:13:06
-outl_call: Test Success 2010-02-12 01:13:06
-rev_call: Test Success 2010-02-12 01:13:07
-sum_call: Test Success 2010-02-12 01:13:08
-../../../../casl2 divl.casl ../../../../as/casl2lib/outl.casl
+../../../../casl2 -M640 divl.casl ../../../../as/casl2lib/outl.casl
--------------------
100
0
YACASL2DIR= ../../../..
CASL2 = $(YACASL2DIR)/casl2
+CASL2FLAG = -M640
LIBDIR = $(YACASL2DIR)/as/casl2lib
ASFILE = divl.casl $(LIBDIR)/outl.casl # DIVLは、outl.caslに含まれる
-CMD = $(CASL2) $(ASFILE)
+CMD = $(CASL2) $(CASL2FLAG) $(ASFILE)
include $(YACASL2DIR)/test/integration/casl2/TEST.mk
-../../../../casl2 inl.casl ../../../../as/casl2lib/inl.casl ../../../../as/casl2lib/outl.casl
+../../../../casl2 -M640 inl.casl ../../../../as/casl2lib/inl.casl ../../../../as/casl2lib/outl.casl
0
1
2
YACASL2DIR= ../../../..
CASL2 = $(YACASL2DIR)/casl2
+CASL2FLAG = -M640
LIBDIR = $(YACASL2DIR)/as/casl2lib
ASFILE = inl.casl $(LIBDIR)/inl.casl $(LIBDIR)/outl.casl
IN = teststr.txt
-CMD = $(CASL2) $(ASFILE) <$(IN)
+CMD = $(CASL2) $(CASL2FLAG) $(ASFILE) <$(IN)
include $(YACASL2DIR)/test/TEST.mk
../../../../casl2 mull.casl ../../../../as/casl2lib/mull.casl ../../../../as/casl2lib/outl.casl
-0
-0
-0
---------------------
-0
-1
-0
---------------------
-0
-2
-0
---------------------
-0
-127
-0
---------------------
-0
-128
-0
---------------------
-0
-255
-0
---------------------
-0
-256
-0
---------------------
-0
-257
-0
---------------------
-0
-32767
-0
---------------------
-0
-32768
-0
---------------------
-0
-65535
-0
---------------------
-1
-0
-0
---------------------
-1
-1
-1
---------------------
-1
-2
-2
---------------------
-1
-127
-127
---------------------
-1
-128
-128
---------------------
-1
-255
-255
---------------------
-1
-256
-256
---------------------
-1
-257
-257
---------------------
-1
-32767
-32767
---------------------
-1
-32768
-32768
---------------------
-1
-65535
-65535
---------------------
-2
-0
-0
---------------------
-2
-1
-2
---------------------
-2
-2
-4
---------------------
-2
-127
-254
---------------------
-2
-128
-256
---------------------
-2
-255
-510
---------------------
-2
-256
-512
---------------------
-2
-257
-514
---------------------
-2
-32767
-65534
---------------------
-2
-32768
-Warning: overflow
---------------------
-2
-65535
-Warning: overflow
---------------------
-127
-0
-0
---------------------
-127
-1
-127
---------------------
-127
-2
-254
---------------------
-127
-127
-16129
---------------------
-127
-128
-16256
---------------------
-127
-255
-32385
---------------------
-127
-256
-32512
---------------------
-127
-257
-32639
---------------------
-127
-32767
-Warning: overflow
---------------------
-127
-32768
-Warning: overflow
---------------------
-127
-65535
-Warning: overflow
---------------------
-128
-0
-0
---------------------
-128
-1
-128
---------------------
-128
-2
-256
---------------------
-128
-127
-16256
---------------------
-128
-128
-16384
---------------------
-128
-255
-32640
---------------------
-128
-256
-32768
---------------------
-128
-257
-32896
---------------------
-128
-32767
-Warning: overflow
---------------------
-128
-32768
-Warning: overflow
---------------------
-128
-65535
-Warning: overflow
---------------------
-255
-0
-0
---------------------
-255
-1
-255
---------------------
-255
-2
-510
---------------------
-255
-127
-32385
---------------------
-255
-128
-32640
---------------------
-255
-255
-65025
---------------------
-255
-256
-65280
---------------------
-255
-257
-65535
---------------------
-255
-32767
-Warning: overflow
---------------------
-255
-32768
-Warning: overflow
---------------------
-255
-65535
-Warning: overflow
---------------------
-256
-0
-0
---------------------
-256
-1
-256
---------------------
-256
-2
-512
---------------------
-256
-127
-32512
---------------------
-256
-128
-32768
---------------------
-256
-255
-65280
---------------------
-256
-256
-Warning: overflow
---------------------
-256
-257
-Warning: overflow
---------------------
-256
-32767
-Warning: overflow
---------------------
-256
-32768
-Warning: overflow
---------------------
-256
-65535
-Warning: overflow
---------------------
-257
-0
-0
---------------------
-257
-1
-257
---------------------
-257
-2
-514
---------------------
-257
-127
-32639
---------------------
-257
-128
-32896
---------------------
-257
-255
-65535
---------------------
-257
-256
-Warning: overflow
---------------------
-257
-257
-Warning: overflow
---------------------
-257
-32767
-Warning: overflow
---------------------
-257
-32768
-Warning: overflow
---------------------
-257
-65535
-Warning: overflow
---------------------
-32767
-0
-0
---------------------
-32767
-1
-32767
---------------------
-32767
-2
-65534
---------------------
-32767
-127
-Warning: overflow
---------------------
-32767
-128
-Warning: overflow
---------------------
-32767
-255
-Warning: overflow
---------------------
-32767
-256
-Warning: overflow
---------------------
-32767
-257
-Warning: overflow
---------------------
-32767
-32767
-Warning: overflow
---------------------
-32767
-32768
-Warning: overflow
---------------------
-32767
-65535
-Warning: overflow
---------------------
-32768
-0
-0
---------------------
-32768
-1
-32768
---------------------
-32768
-2
-Warning: overflow
---------------------
-32768
-127
-Warning: overflow
---------------------
-32768
-128
-Warning: overflow
---------------------
-32768
-255
-Warning: overflow
---------------------
-32768
-256
-Warning: overflow
---------------------
-32768
-257
-Warning: overflow
---------------------
-32768
-32767
-Warning: overflow
---------------------
-32768
-32768
-Warning: overflow
---------------------
-32768
-65535
-Warning: overflow
---------------------
-65535
-0
-0
---------------------
-65535
-1
-65535
---------------------
-65535
-2
-Warning: overflow
---------------------
-65535
-127
-Warning: overflow
---------------------
-65535
-128
-Warning: overflow
---------------------
-65535
-255
-Warning: overflow
---------------------
-65535
-256
-Warning: overflow
---------------------
-65535
-257
-Warning: overflow
---------------------
-65535
-32767
-Warning: overflow
---------------------
-65535
-32768
-Warning: overflow
---------------------
-65535
-65535
-Warning: overflow
---------------------
+Assemble error - 119: 512: out of COMET II memory
+../../../../as/casl2lib/outl.casl: 143: LAD GR3,1,GR3 ; GR3 <- GR3 + 1