From: j8takagi Date: Mon, 4 Jun 2018 03:15:38 +0000 (+0900) Subject: casl2lib無視ファイルの設定ミスを修正 X-Git-Tag: v0.3p2~3 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b153de269505fe25552d3f1ee2a21dc049239c3;p=YACASL2.git casl2lib無視ファイルの設定ミスを修正 --- diff --git a/as/casl2lib/.gitignore b/as/casl2lib/.gitignore index 04dbd3d..ba131d7 100644 --- a/as/casl2lib/.gitignore +++ b/as/casl2lib/.gitignore @@ -1,3 +1,3 @@ -*.casl +/*.casl doc/call.svg sample/*.pbm diff --git a/as/casl2lib/sample/call_abs.casl b/as/casl2lib/sample/call_abs.casl new file mode 100644 index 0000000..476e902 --- /dev/null +++ b/as/casl2lib/sample/call_abs.casl @@ -0,0 +1,28 @@ +;;; ABSを呼び出す +;;; casl2 call_abs.casl ../stdlib.casl +MAIN START + LAD GR2,0 +MLOOP CPA GR2,MLEN + JZE MFIN + LD GR1,MVAL,GR2 + CALL OUTA + CALL ABS + JOV PUTOV + JMI PUTM + OUT PLUS,=1 + JUMP PUTD +PUTM OUT MINUS,=1 + JUMP PUTD +PUTOV OUT OV,=2 +PUTD CALL OUTA + OUT SEP,MLEN + LAD GR2,1,GR2 + JUMP MLOOP +MFIN RET +MVAL DC 12,-12,1,-1,32767,-32767,0,-32768 +MLEN DC 8 +SEP DC '--------' +PLUS DC '+' +MINUS DC '-' +OV DC 'OV' + END diff --git a/as/casl2lib/sample/call_addl32.casl b/as/casl2lib/sample/call_addl32.casl new file mode 100644 index 0000000..6072b8b --- /dev/null +++ b/as/casl2lib/sample/call_addl32.casl @@ -0,0 +1,13 @@ +MAIN START + LAD GR1,A + LAD GR2,B + CALL ADDL32 + LD GR2,GR0 + LD GR1,1,GR2 + CALL OUTL + LD GR1,0,GR2 + CALL OUTL + RET +A DC 6,10 +B DC 2,65530 + END diff --git a/as/casl2lib/sample/call_divl.casl b/as/casl2lib/sample/call_divl.casl new file mode 100644 index 0000000..e988bea --- /dev/null +++ b/as/casl2lib/sample/call_divl.casl @@ -0,0 +1,38 @@ +MAIN START + LD GR1,XMAX +LOOPX CPA GR1,XMIN + JMI FIN + OUT SEP,SLEN + LD GR2,YMIN +LOOPY CPL GR2,YMAX + JPL XNEXT + CALL OUTL + PUSH 0,GR1 + LD GR1,GR2 + CALL OUTL + POP GR1 + CALL DIVL + JOV WOV + PUSH 0,GR1 + LD GR1,GR0 + CALL OUTL + LD GR1,GR3 + CALL OUTL + POP GR1 +YNEXT OUT SEP,SLEN + LAD GR2,1,GR2 + JUMP LOOPY +WOV OUT Y0MSG,YLEN + JUMP YNEXT +XNEXT LAD GR1,-1,GR1 + JUMP LOOPX +FIN RET +XMAX DC 100 +XMIN DC 0 +YMAX DC 10 +YMIN DC 0 +SEP DC '--------------------' +SLEN DC 20 +Y0MSG DC 'Error: div by 0' +YLEN DC 15 + END diff --git a/as/casl2lib/sample/call_inl.casl b/as/casl2lib/sample/call_inl.casl new file mode 100644 index 0000000..28c6a9c --- /dev/null +++ b/as/casl2lib/sample/call_inl.casl @@ -0,0 +1,25 @@ +;;; casl2 inl.casl ../casl2lib/inl.casl ../casl2lib/outl.casl +MAIN START +LOOP CALL INL ; GR1に数値、GR0に文字列の長さ + JOV OV + AND GR0,GR0 + JZE FIN + CPL GR0,=#FFFF + JZE NAN + CALL OUTL + JUMP LOOP +OV CPL GR0,=#FFFF + JZE LENOV + OUT OVMSG,MLEN1 + JUMP LOOP +NAN OUT NANMSG,MLEN2 + 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 + END diff --git a/as/casl2lib/sample/call_minim.casl b/as/casl2lib/sample/call_minim.casl new file mode 100644 index 0000000..d74aa34 --- /dev/null +++ b/as/casl2lib/sample/call_minim.casl @@ -0,0 +1,11 @@ +;;; casl2 minim.casl $(LIBDIR)/minim.casl $(LIBDIR)/outa.casl +MAIN START + LAD GR1,DATA + LD GR2,CNT + CALL MINIM + LD GR1,GR0 + CALL OUTA + RET +DATA DC 23,78,2,45,67,-39,86 +CNT DC 7 + END diff --git a/as/casl2lib/sample/call_mula.casl b/as/casl2lib/sample/call_mula.casl new file mode 100644 index 0000000..6fa37b6 --- /dev/null +++ b/as/casl2lib/sample/call_mula.casl @@ -0,0 +1,37 @@ +MAIN START + LAD GR3,0 ; Xのインデックス +LOOPX CPA GR3,XCNT + JZE FIN + LD GR1,X,GR3 + LAD GR4,0 ; Yのインデックス +LOOPY CPA GR4,YCNT + JZE XNEXT + LD GR2,Y,GR4 + CALL OUTA + PUSH 0,GR1 + LD GR1,GR2 + CALL OUTA + POP GR1 + CALL MULA + JOV WOV + PUSH 0,GR1 + LD GR1,GR0 + CALL OUTA + POP GR1 +YNEXT OUT SEP,SLEN + LAD GR4,1,GR4 + JUMP LOOPY +WOV OUT YOMSG,YLEN + JUMP YNEXT +XNEXT LAD GR3,1,GR3 + JUMP LOOPX +FIN RET +X DC 0,1,2,127,128,151,217,255,256,257,32767,-32768,-32767,-257,-256,-255,-217,-151,-128,-127,-2,-1 +Y DC 0,1,2,127,128,151,217,255,256,257,32767,-32768,-32767,-257,-256,-255,-217,-151,-128,-127,-2,-1 +XCNT DC 22 +YCNT DC 22 +SEP DC '--------------------' +SLEN DC 20 +YOMSG DC 'Warning: overflow' +YLEN DC 17 + END diff --git a/as/casl2lib/sample/call_mull.casl b/as/casl2lib/sample/call_mull.casl new file mode 100644 index 0000000..6085ce1 --- /dev/null +++ b/as/casl2lib/sample/call_mull.casl @@ -0,0 +1,45 @@ +MAIN START + LAD GR4,0 ; Xのインデックス +LOOPX CPA GR4,XCNT ; (GR4 = XCNT)の場合、ループ脱出 + JZE FIN ; ↓ + LD GR1,X,GR4 ; GR1に、(X+GR4)番地の値を転送 + LAD GR5,0 ; Yのインデックス +LOOPY CPA GR5,YCNT ; (GR5 = YCNT)の場合、ループ脱出 + JZE XNEXT ; ↓ + LD GR2,Y,GR5 ; GR2に、(X+GR5)番地の値を転送 + CALL OUTL ; GR1の数値を出力 + PUSH 0,GR1 ; GR2の数値を出力 + LD GR1,GR2 ; ↓ + CALL OUTL ; ↓ + POP GR1 ; ↓ + CALL MULL ; GR0 <- GR1 * GR2 + JOV WOV ; オーバーフローの場合は、WOVへジャンプ + PUSH 0,GR1 ; GR0の数値を出力 + LD GR1,GR0 ; ↓ + 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へジャンプ +XNEXT LAD GR4,1,GR4 ; GR4 <- GR4 + 1 + JUMP LOOPX ; LOOPXへジャンプ +FIN RET +X DC 0,1,2,127,128,255,256,257,32767,#8000,#FFFF +Y DC 0,1,2,127,128,255,256,257,32767,#8000,#FFFF +XCNT DC 11 +YCNT DC 11 +SEP DC '--------------------' +SLEN DC 20 +YOMSG DC 'overflow' +YLEN DC 8 + END diff --git a/as/casl2lib/sample/call_outa.casl b/as/casl2lib/sample/call_outa.casl new file mode 100644 index 0000000..b2aaf05 --- /dev/null +++ b/as/casl2lib/sample/call_outa.casl @@ -0,0 +1,23 @@ +;; casl2 outi_call.casl outi.casl +MAIN START + LAD GR1,VAL + LAD GR2,0 +LOOP CPA GR2,CNT + JZE FIN + LD GR1,VAL,GR2 + CALL OUTA + LAD GR2,1,GR2 + JUMP LOOP +FIN RET +VAL DC 0 + DC #0001,#0002,#0004,#0008 + DC #0010,#0020,#0040,#0080 + DC #0100,#0200,#0400,#0800 + DC #1000,#2000,#4000,#7FFF + DC #8000 + DC #8001,#C000,#E000,#F000 + DC #F800,#FC00,#FE00,#FF00 + DC #FF80,#FFC0,#FFE0,#FFF0 + DC #FFF8,#FFFC,#FFFE,#FFFF +CNT DC 34 + END diff --git a/as/casl2lib/sample/call_outaq15.casl b/as/casl2lib/sample/call_outaq15.casl new file mode 100644 index 0000000..1ea1f12 --- /dev/null +++ b/as/casl2lib/sample/call_outaq15.casl @@ -0,0 +1,21 @@ +;; outd_q15.caslを呼び出し、33個の数値を表示する +MAIN START + LAD GR2,0 +LOOP LD GR1,VAL,GR2 + CALL OUTAQ15 + LAD GR2,1,GR2 + CPA GR2,CNT + JZE FIN + JUMP LOOP +FIN RET +VAL DC #7FFF,#4000,#2000,#1000 + DC #0800,#0400,#0200,#0100 + DC #0080,#0040,#0020,#0010 + DC #0008,#0004,#0002,#0001 + DC #8000 + DC #8001,#C000,#E000,#F000 + DC #F800,#FC00,#FE00,#FF00 + DC #FF80,#FFC0,#FFE0,#FFF0 + DC #FFF8,#FFFC,#FFFE,#FFFF +CNT DC 33 + END diff --git a/as/casl2lib/sample/call_outb.casl b/as/casl2lib/sample/call_outb.casl new file mode 100644 index 0000000..9ba7189 --- /dev/null +++ b/as/casl2lib/sample/call_outb.casl @@ -0,0 +1,22 @@ +;;; 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 0 + DC #0001,#0002,#0004,#0008 + DC #0010,#0020,#0040,#0080 + DC #0100,#0200,#0400,#0800 + DC #1000,#2000,#4000,#7FFF + DC #8000 + DC #8001,#C000,#E000,#F000 + DC #F800,#FC00,#FE00,#FF00 + DC #FF80,#FFC0,#FFE0,#FFF0 + DC #FFF8,#FFFC,#FFFE,#FFFF +CNT DC 34 + END diff --git a/as/casl2lib/sample/call_outbw.casl b/as/casl2lib/sample/call_outbw.casl new file mode 100644 index 0000000..c77368e --- /dev/null +++ b/as/casl2lib/sample/call_outbw.casl @@ -0,0 +1,22 @@ +;;; casl2 outb_call.casl outb.casl +MAIN START + LAD GR2,0 +LOOP LD GR1,VAL,GR2 + CALL OUTBW + LAD GR2,1,GR2 + CPA GR2,CNT + JZE FIN + JUMP LOOP +FIN RET +VAL DC 0 + DC #0001,#0002,#0004,#0008 + DC #0010,#0020,#0040,#0080 + DC #0100,#0200,#0400,#0800 + DC #1000,#2000,#4000,#7FFF + DC #8000 + DC #8001,#C000,#E000,#F000 + DC #F800,#FC00,#FE00,#FF00 + DC #FF80,#FFC0,#FFE0,#FFF0 + DC #FFF8,#FFFC,#FFFE,#FFFF +CNT DC 34 + END diff --git a/as/casl2lib/sample/call_outbw0.casl b/as/casl2lib/sample/call_outbw0.casl new file mode 100644 index 0000000..ad8c17f --- /dev/null +++ b/as/casl2lib/sample/call_outbw0.casl @@ -0,0 +1,13 @@ +;;; 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 diff --git a/as/casl2lib/sample/call_outl.casl b/as/casl2lib/sample/call_outl.casl new file mode 100644 index 0000000..d20214e --- /dev/null +++ b/as/casl2lib/sample/call_outl.casl @@ -0,0 +1,22 @@ +;;; casl2 outl_call.casl outl.casl +MAIN START + LAD GR2,0 +LOOP LD GR1,VAL,GR2 + CALL OUTL + LAD GR2,1,GR2 + CPA GR2,CNT + JZE FIN + JUMP LOOP +FIN RET +VAL DC 0 + DC #0001,#0002,#0004,#0008 + DC #0010,#0020,#0040,#0080 + DC #0100,#0200,#0400,#0800 + DC #1000,#2000,#4000,#7FFF + DC #8000 + DC #8001,#C000,#E000,#F000 + DC #F800,#FC00,#FE00,#FF00 + DC #FF80,#FFC0,#FFE0,#FFF0 + DC #FFF8,#FFFC,#FFFE,#FFFF +CNT DC 34 + END diff --git a/as/casl2lib/sample/call_outlq15.casl b/as/casl2lib/sample/call_outlq15.casl new file mode 100644 index 0000000..dd06ee0 --- /dev/null +++ b/as/casl2lib/sample/call_outlq15.casl @@ -0,0 +1,21 @@ +;; outd_q15.caslを呼び出し、33個の数値を表示する +MAIN START + LAD GR2,0 +LOOP LD GR1,VAL,GR2 + CALL OUTLQ15 + LAD GR2,1,GR2 + CPA GR2,CNT + JZE FIN + JUMP LOOP +FIN RET +VAL DC #0001,#0002,#0004,#0008 + DC #0010,#0020,#0040,#0080 + DC #0100,#0200,#0400,#0800 + DC #1000,#2000,#4000,#7FFF + DC #8000 + DC #8001,#C000,#E000,#F000 + DC #F800,#FC00,#FE00,#FF00 + DC #FF80,#FFC0,#FFE0,#FFF0 + DC #FFF8,#FFFC,#FFFE,#FFFF +CNT DC 33 + END diff --git a/as/casl2lib/sample/call_pbm16.casl b/as/casl2lib/sample/call_pbm16.casl new file mode 100644 index 0000000..cd0e577 --- /dev/null +++ b/as/casl2lib/sample/call_pbm16.casl @@ -0,0 +1,24 @@ +;;; 「五」を表す16 x 16のpbm画像を出力する +;;; 呼び出し方: +;;; casl2 call_pbm.casl ../pbm16.casl +MAIN START + LAD GR1,GRAPH + CALL PBM16 + RET +GRAPH DC #FFFC ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 + DC #FFFC ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 + DC #FFFC ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 + DC #0700 ; 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 + DC #0700 ; 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 + DC #0700 ; 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 + DC #FFFC ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 + DC #FFFC ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 + DC #FFFC ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 + DC #071C ; 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 + DC #071C ; 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 + DC #071C ; 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 + DC #FFFF ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + DC #FFFF ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + DC #FFFF ; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + DC #0000 ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + END diff --git a/as/casl2lib/sample/call_rev.casl b/as/casl2lib/sample/call_rev.casl new file mode 100644 index 0000000..58252c2 --- /dev/null +++ b/as/casl2lib/sample/call_rev.casl @@ -0,0 +1,10 @@ +MAIN START + OUT STR,LEN + LAD GR1,STR + LD GR2,LEN + CALL REV + OUT STR,LEN + RET +STR DC '12345' +LEN DC 5 + END diff --git a/as/casl2lib/sample/call_strlen.casl b/as/casl2lib/sample/call_strlen.casl new file mode 100644 index 0000000..aee3ef8 --- /dev/null +++ b/as/casl2lib/sample/call_strlen.casl @@ -0,0 +1,12 @@ +;;; call_strlen.casl +;;; +MAIN START + PUSH 0,GR1 + LAD GR1,STR + CALL STRLEN + LD GR1,GR2 + CALL OUTL +FIN POP GR1 + RET +STR DC 'abcdefghij',0 ; 文字列 + END diff --git a/as/casl2lib/src/abs.casl b/as/casl2lib/src/abs.casl new file mode 100644 index 0000000..6f03a67 --- /dev/null +++ b/as/casl2lib/src/abs.casl @@ -0,0 +1,17 @@ +;;; 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 diff --git a/as/casl2lib/src/addl32.casl b/as/casl2lib/src/addl32.casl new file mode 100644 index 0000000..23740bf --- /dev/null +++ b/as/casl2lib/src/addl32.casl @@ -0,0 +1,43 @@ +;;; 2つの32ビット値を加算する +;;; 32ビットの値を、連続する2語の領域に格納 +;;; 入力 GR1:数値1の先頭アドレス GR2:数値2の先頭アドレス +;;; 出力 GR0:和の先頭アドレス +ADDL32 START + RPUSH + ST GR1,X ; X <- GR1:数値1 + ST GR2,Y ; Y <- GR2:数値2 + LD GR3,LEN ; GR3:語を表すインデックス 初期化 + XOR GR4,GR4 ; GR4:キャリー値 初期化 + LAD GR3,-1,GR3 ; ↓ +LOOP AND GR3,GR3 ; ループ先頭。(GR3 = 0)の場合は、ループ脱出 + JMI FIN ; ↓ + LD GR1,X ; GR1 <- (X + GR3)の値 + ADDL GR1,GR3 ; ↓ + LD GR1,0,GR1 ; ↓ + LD GR2,Y ; GR2 <- (Y + GR3)の値 + ADDL GR2,GR3 ; ↓ + LD GR2,0,GR2 ; ↓ + ADDL GR1,GR2 ; GR1 <- GR1 + GR2 + JOV CRRY ; オーバーフロー時は、CRRYへジャンプ + ADDL GR1,GR4 ; GR1 <- GR1 + GR4 + JOV CRRY ; オーバーフロー時は、CRRYへジャンプ + ST GR1,A,GR3 ; (A + GR3) <- GR1 + LAD GR3,-1,GR3 ; GR3 <- GR3 - 1 + XOR GR4,GR4 ; GR4 <- 0 + JUMP LOOP ; ループ先頭へジャンプ +CRRY AND GR3,GR3 ; 最上位の語でオーバーフローした場合、OVへジャンプ + JMI OV ; ↓ + ST GR1,A,GR3 ; (A + GR3) <- GR1 + LAD GR3,-1,GR3 ; GR3 <- GR3 - 1 + LAD GR4,1 ; GR4 <- 1 + JUMP LOOP ; ループ終端 +OV LAD GR3,=#8000 ; 強制的にオーバーフロー発生 + SLL GR3,1 ; ↓ +FIN LAD GR0,A ; GR0 <- A + RPOP + RET +X DS 1 ; 数値1の先頭アドレス +Y DS 1 ; 数値2の先頭アドレス +A DS 2 ; 和 +LEN DC 2 ; 数値の語数 + END diff --git a/as/casl2lib/src/diva.casl b/as/casl2lib/src/diva.casl new file mode 100644 index 0000000..6796eb9 --- /dev/null +++ b/as/casl2lib/src/diva.casl @@ -0,0 +1,41 @@ +;;; 符号付き整数の割算を筆算方式で行う +;;; 入力 GR1:被除数 GR2:除数 +;;; 出力 GR0:商 GR3:剰余 +;;; 次の場合はオーバーフロー +;;; GR1 = -32768; GR2 = -32768; GR2 = 0 +;;; +DIVA START + PUSH 0,GR1 + PUSH 0,GR2 + PUSH 0,GR4 + XOR GR0,GR0 ; 商を初期化 + 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)の場合は、DIVへジャンプ + JPL DIV ; ↓ + XOR GR2,ALLON ; GR2の正負を反転 + ADDA GR2,ONE ; ↓ + JOV FIN ; (GR2 = -32768)の場合は終了 + XOR GR4,ONE ; マイナスフラグを反転 +DIV CALL DIVL ; GR0 <- GR1 / GR2; GR3 <- GR1 mod GR2 + JOV FIN ; (GR2 = 0)の場合は終了 +MIN AND GR4,GR4 ; マイナスフラグがオフの場合、終了 + JZE FIN ; ↓ + XOR GR0,ALLON ; GR1の正負を反転 + ADDA GR0,ONE ; ↓ + XOR GR3,ALLON ; GR3の正負を反転 + ADDA GR3,ONE ; ↓ + JUMP FIN +OV ADDL GR0,=#8000 +FIN POP GR4 + POP GR2 + POP GR1 + RET +ONE DC 1 +ALLON DC #FFFF + END diff --git a/as/casl2lib/src/divl.casl b/as/casl2lib/src/divl.casl new file mode 100644 index 0000000..3591366 --- /dev/null +++ b/as/casl2lib/src/divl.casl @@ -0,0 +1,47 @@ +;;; 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 diff --git a/as/casl2lib/src/inl.casl b/as/casl2lib/src/inl.casl new file mode 100644 index 0000000..3587131 --- /dev/null +++ b/as/casl2lib/src/inl.casl @@ -0,0 +1,22 @@ +;;; 0から65535の範囲にある整数の入力を受け付ける +;;; 入力 (SVC) +;;; 出力 GR1: 入力された数値 +;;; GR0: 文字列の長さ。入力が数字以外の場合は、#FFFF +;;; 65536以上の正数が入力された場合はエラー +INL START + 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 +IBUF DS 5 + END diff --git a/as/casl2lib/src/l2str.casl b/as/casl2lib/src/l2str.casl new file mode 100644 index 0000000..a3dba83 --- /dev/null +++ b/as/casl2lib/src/l2str.casl @@ -0,0 +1,41 @@ +;;; GR1に格納された符号なし整数を文字列に変換する +;;; GR2に文字列の先頭アドレス、GR3に文字列の長さを返す +;;; 依存プログラム: DIVL, REV +L2STR START + PUSH 0,GR1 + PUSH 0,GR4 + XOR GR0,GR0 ; GR0 <- 0 + LD GR4,GR2 ; GR4 <- GR2 + AND GR1,GR1 ; GR1をテスト + JZE ZERO ; GR1が0の場合、ZEROにジャンプ + PUSH 0,GR2 +STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出 + JMI STLST ; ↓ + LAD GR2,10 ; GR2に10進数の「10」を格納。 + 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 ; GR0をGR1にコピー + JUMP STI ; ループ終端 +STLST POP GR2 + LD GR1,NCHAR,GR1 ; GR1を文字に変換 + ST GR1,0,GR4 ; (GR4) <- GR1 + LAD GR4,1,GR4 ; GR4 <- GR4 + 1 + JUMP PRT ; PRTにジャンプ +ZERO LD GR1,NCHAR ; 「0」をSTR領域に格納 + ST GR1,0,GR4 ; ↓ (GR4) <- GR1 + LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 +PRT LD GR1,GR2 ; GR1に文字列のアドレスを格納 + SUBL GR4,GR2 ; GR2 <- GR4 - GR2 + LD GR2,GR4 ; ↓ + CALL REV ; 文字列を逆順に並べ替え + LD GR3,GR2 ; GR3に文字列の長さを格納 + LD GR2,GR4 ; GR2に文字列のアドレスを格納 + POP GR4 + POP GR1 + RET +LEN DS 1 +NCHAR DC '0123456789' + END diff --git a/as/casl2lib/src/max.casl b/as/casl2lib/src/max.casl new file mode 100644 index 0000000..b7afe8f --- /dev/null +++ b/as/casl2lib/src/max.casl @@ -0,0 +1,23 @@ +;;; 連続した複数のWORDを符号付き整数とみなして最大値を返す +;;; 入力: GR1: WORD値を格納したアドレス GR2: 値の個数 +;;; 出力: GR0: 最大値 +MAX START + RPUSH + LD GR0,0,GR1 ; MAX <- GR1アドレスの値 + ST GR0,MAX ; ↓ + LAD GR3,0 ; GR3:インデックス 初期化 +S1 CPA GR3,GR2 ; ループ先頭。(GR2 = GR3)の場合、終了 + JZE RET ; ↓ + LAD GR1,1,GR1 ; GR1 <- GR1 + 1 + LD GR0,0,GR1 ; + CPA GR0,MAX ; + JMI S2 ; + JZE S2 ; + ST GR0,MAX ; +S2 LAD GR3,1,GR3 ; + JUMP S1 ; +RET LD GR0,MAX ; + RPOP + RET +MAX DS 1 ; 最小値を格納 + END diff --git a/as/casl2lib/src/minim.casl b/as/casl2lib/src/minim.casl new file mode 100644 index 0000000..83d973f --- /dev/null +++ b/as/casl2lib/src/minim.casl @@ -0,0 +1,23 @@ +;;; 複数のWORD値の中から、最小値を返す +;;; 入力: GR1: WORD値を格納したアドレス GR2: 値の個数 +;;; 出力: GR0: 最小値 +MINIM START + RPUSH + LD GR0,0,GR1 ; MIN <- GR1アドレスの値 + ST GR0,MIN ; ↓ + LAD GR3,0 ; GR3:インデックス 初期化 +S1 CPA GR3,GR2 ; ループ先頭。(GR2 = GR3)の場合、終了 + JZE RET ; ↓ + LAD GR1,1,GR1 ; GR1 <- GR1 + 1 + LD GR0,0,GR1 ; + CPA GR0,MIN ; + JPL S2 ; + JZE S2 ; + ST GR0,MIN ; +S2 LAD GR3,1,GR3 ; + JUMP S1 ; +RET LD GR0,MIN ; + RPOP + RET +MIN DS 1 ; 最小値を格納 + END diff --git a/as/casl2lib/src/mula.casl b/as/casl2lib/src/mula.casl new file mode 100644 index 0000000..431486a --- /dev/null +++ b/as/casl2lib/src/mula.casl @@ -0,0 +1,41 @@ +;;; -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 diff --git a/as/casl2lib/src/mull.casl b/as/casl2lib/src/mull.casl new file mode 100644 index 0000000..f40c0f6 --- /dev/null +++ b/as/casl2lib/src/mull.casl @@ -0,0 +1,42 @@ +;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う +;;; 入力 GR1:被乗数 GR2:乗数 +;;; 出力 GR0:積の下位WORD GR3:積の上位WORD +;;; 積が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の場合、終了 + JZE FIN ; ↓ + LAD GR4,#FFFF ; GR3 <> 0の場合、オーバーフロー + SLL GR4,1 ; ↓ +FIN POP GR5 + POP GR4 + RET + END diff --git a/as/casl2lib/src/outa.casl b/as/casl2lib/src/outa.casl new file mode 100644 index 0000000..6f8f84d --- /dev/null +++ b/as/casl2lib/src/outa.casl @@ -0,0 +1,44 @@ +;;; 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 diff --git a/as/casl2lib/src/outaq15.casl b/as/casl2lib/src/outaq15.casl new file mode 100644 index 0000000..7c0e01c --- /dev/null +++ b/as/casl2lib/src/outaq15.casl @@ -0,0 +1,46 @@ +;; GR1に格納された値を、10進数の符号付き小数値として表示 +OUTAQ15 START + RPUSH + LAD GR2,10 ; GR2に10進数の「10」を格納 + XOR GR4,GR4 ; 整数値の長さ + XOR GR3,GR3 ; 出力する文字を一時的に格納 + AND GR1,GR1 ; GR1の符号をチェック + JPL STDN ; ↓ GR1が正数の場合、STDNにジャンプ + LD GR3,='-' ; ↓ GR1が負数の場合、「-」をSTR領域に格納 + ST GR3,STR ; ↓ ↓ + LAD GR4,1,GR4 ; ↓ ↓ GR4 <- GR4 + 1 + CPA GR1,=#8000 ; (GR1 = #8000)の場合、MINONEへジャンプ + JZE MINONE ; ↓ + CALL ABS ; GR1を正数に変換 +STDN LD GR3,='0' ; 「0」をSTR領域に格納 + ST GR3,STR,GR4 ; ↓ + AND GR1,GR1 ; GR1が0の場合、PRTへジャンプ + JZE PRT ; ↓ + LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 + LD GR3,='.' ; 「.」をSTR領域に格納 + ST GR3,STR,GR4 ; ↓ + LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 + SLL GR1,1 ; GR1を1回左シフト +;; GR1の内容を小数値と見なし、10進数の文字列に変換してSTRに格納 +TODIG AND GR1,GR1 ; GR1が0の場合は、ループを脱出 + JZE PRT ; ↓ + CALL MULL ; GR1とGR2の、積をGR1、オーバーフロー値をGR3に格納 + LD GR1,GR0 ; GR0をGR1にコピー + ADDA GR3,='0' ; GR1を文字に変換 + ST GR3,STR,GR4 ; (STR + GR4) <- GR1 + LAD GR4,1,GR4 ; GR4 <- GR4 + 1 + JUMP TODIG ; ループ +;; GR1 = -1の場合 +MINONE LD GR1,='1' ; GR1が#8000の場合、-1を出力 + ST GR1,STR,GR4 ; (STR + GR4) <- GR1 + LAD GR4,1,GR4 ; GR4 <- GR4 + 1 + JUMP PRT ; ↓ +;; 値を出力 +PRT ST GR4,LEN ; LEN <- GR4 + OUT STR,LEN ; ↓ + RPOP + RET +STR DS 20 +LEN DS 1 + END + diff --git a/as/casl2lib/src/outb.casl b/as/casl2lib/src/outb.casl new file mode 100644 index 0000000..7ecb73e --- /dev/null +++ b/as/casl2lib/src/outb.casl @@ -0,0 +1,37 @@ +;;; GR1に格納された値を、2進数値として表示 +OUTB START + RPUSH + LD GR2,BIN ; GR2に2進数の「2」を格納。 + XOR GR4,GR4 ; GR4: 2進数値の長さ +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 +EMLOOP CPL GR4,DIG ; ループ先頭。(GR4 = DIG)の場合は、ループ脱出 + JZE PRT ; ↓ + LD GR1,NCHAR ; GR1 <- NCHAR:'0' + 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 +BIN DC 2 +NCHAR DC '01' +SPC DC ' ' +DIG DC 16 + END diff --git a/as/casl2lib/src/outbw.casl b/as/casl2lib/src/outbw.casl new file mode 100644 index 0000000..7616bfe --- /dev/null +++ b/as/casl2lib/src/outbw.casl @@ -0,0 +1,43 @@ +;;; GR1に格納された値を、空白付きの2進数値として表示 +OUTBW START + RPUSH + LD GR2,BIN ; GR2に2進数の「2」を格納。 + XOR GR4,GR4 ; GR4: 2進数値の長さ +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,SPC ; GR1 <- SPC + 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 +EMLOOP CPL GR4,DIG ; ループ先頭。(GR4 = DIG)の場合は、ループ脱出 + JZE PRT ; ↓ + LD GR1,SPC ; GR1 <- SPC + ST GR1,STR,GR4 ; (STR + GR4) <- GR1 + LAD GR4,1,GR4 ; GR4 <- GR4 + 1 + LD GR1,NCHAR ; GR1 <- NCHAR:'0' + 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 32 +LEN DS 1 +BIN DC 2 +NCHAR DC '01' +SPC DC ' ' +DIG DC 31 + END diff --git a/as/casl2lib/src/outl.casl b/as/casl2lib/src/outl.casl new file mode 100644 index 0000000..8e67497 --- /dev/null +++ b/as/casl2lib/src/outl.casl @@ -0,0 +1,36 @@ +;;; GR1に格納された値を、10進数の整数値(0〜65535)として表示 +;;; 依存プログラム: DIVL, REV +OUTL START + RPUSH + LAD GR2,10 ; GR2に10進数の「10」を格納。 + XOR GR0,GR0 ; 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 ; 符号付き2進数で表記した場合を想定 +LEN DS 1 +NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' + END diff --git a/as/casl2lib/src/outlq15.casl b/as/casl2lib/src/outlq15.casl new file mode 100644 index 0000000..2ae4b25 --- /dev/null +++ b/as/casl2lib/src/outlq15.casl @@ -0,0 +1,29 @@ +;; GR1に格納された値を、10進数の符号なし小数値として表示 +OUTLQ15 START + RPUSH + LAD GR2,10 ; GR2に10進数の「10」を格納 + XOR GR4,GR4 ; 整数値の長さ +STDN LD GR3,='0' ; 「0」をSTR領域に格納 + ST GR3,STR,GR4 ; ↓ + AND GR1,GR1 ; GR1が0の場合、PRTへジャンプ + JZE PRT ; ↓ + LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 + LD GR3,='.' ; 「.」をSTR領域に格納 + ST GR3,STR,GR4 ; ↓ + LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 +;; GR1の内容を小数値と見なし、10進数の文字列に変換してSTRに格納 +TODIG AND GR1,GR1 ; GR1が0の場合は、ループを脱出 + JZE PRT ; ↓ + CALL MULL ; GR1とGR2の、積をGR0、オーバーフロー値をGR3に格納 + LD GR1,GR0 ; GR0をGR1にコピー + ADDA GR3,='0' ; GR3を文字に変換 + ST GR3,STR,GR4 ; (STR + GR3) <- GR1 + LAD GR4,1,GR4 ; GR4 <- GR4 + 1 + JUMP TODIG ; ループ +PRT ST GR4,LEN ; LEN <- GR4 + OUT STR,LEN ; 文字列を出力 + RPOP + RET +STR DS 20 +LEN DS 1 + END diff --git a/as/casl2lib/src/outpbm.casl b/as/casl2lib/src/outpbm.casl new file mode 100644 index 0000000..70803c3 --- /dev/null +++ b/as/casl2lib/src/outpbm.casl @@ -0,0 +1,36 @@ +;;; PBM画像ファイルを出力 +;;; GR1: 画像ビット列の先頭アドレス +;;; GR2: 画像の幅 +;;; GR3: 画像の高さ +OUTPBM START + OUT HEADER,HLEN + PUSH 0,GR1 + PUSH 0,GR2 + PUSH 0,GR3 + PUSH 0,GR4 + XOR GR4,GR4 + LD GR1,GR2 + LAD GR2,WIDTH + CALL L2STR + LD GR4,GR0 + LAD GR4,1,GR4 + LD GR1,SPC + ST GR1,WIDTH,GR4 + LAD GR4,1,GR4 + LD GR1,GR3 + LAD GR2,WIDTH,GR4 + CALL L2STR + ADDL GR4,GR0 + ST GR4,WHLEN + OUT WIDTH,WHLEN + POP GR4 + POP GR3 + POP GR2 + POP GR1 + RET +HEADER DC 'P1' +HLEN DC 2 +WIDTH DS 32 +SPC DC ' ' +HEIGHT DS 1 +WHLEN DS 1 diff --git a/as/casl2lib/src/pbm16.casl b/as/casl2lib/src/pbm16.casl new file mode 100644 index 0000000..39671ca --- /dev/null +++ b/as/casl2lib/src/pbm16.casl @@ -0,0 +1,31 @@ +;;; PBM16 +;;; GR1で指定されたアドレス以降のメモリを 16×16 の +;;; 白黒ビットマップ画像データ(白:0 黒:1)とみなし、 +;;; PBM画像ファイルとして出力 +;;; 入力: GR1 画像データの先頭アドレス +;;; 依存副プログラム: outb_w.casl divl.casl rotate.casl +PBM16 START + PUSH 0,GR1 + PUSH 0,GR2 + ST GR1,BEG + OUT L1,L1LEN + OUT L2,L2LEN + XOR GR2,GR2 +LOOP CPL GR2,HEIGHT + JZE FIN + LD GR1,BEG + ADDL GR1,GR2 + LD GR1,0,GR1 + CALL OUTB + LAD GR2,1,GR2 + JUMP LOOP +FIN POP GR2 + POP GR1 + RET +L1 DC 'P1' +L1LEN DC 2 +L2 DC '16 16' +L2LEN DC 5 +HEIGHT DC 16 +BEG DS 1 + END diff --git a/as/casl2lib/src/rev.casl b/as/casl2lib/src/rev.casl new file mode 100644 index 0000000..397c5c4 --- /dev/null +++ b/as/casl2lib/src/rev.casl @@ -0,0 +1,27 @@ +;;; メモリー上にある指定されたアドレス、長さの文字列を逆順に並べ替える +;;; 例: 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 diff --git a/as/casl2lib/src/stdlib.casl b/as/casl2lib/src/stdlib.casl new file mode 100644 index 0000000..16915da --- /dev/null +++ b/as/casl2lib/src/stdlib.casl @@ -0,0 +1 @@ +;; CASL IIライブラリー diff --git a/as/casl2lib/src/str2l.casl b/as/casl2lib/src/str2l.casl new file mode 100644 index 0000000..1394131 --- /dev/null +++ b/as/casl2lib/src/str2l.casl @@ -0,0 +1,63 @@ +;;; 10進数の整数を表す文字列を数値に変換 +;;; 数値の範囲は、0から65535 +;;; 入力 GR1: 文字列を格納するアドレス +;;; GR2: 文字列の長さ。最大5けた +;;; 出力 GR0: 数値 +;;; 文字列が最大長より大きい場合や数値以外の場合は、GR0は#FFFF、OFは1 +;;; 依存プログラム: MULL +STR2L START + 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 ; ↓ + LD GR1,0,GR1 ; ↓ + CPL GR1,ZERO ; (GR1 < '0')の場合、NANへジャンプ + JMI NAN ; ↓ + CPL GR1,NINE ; (GR1 > '9')の場合、NANへジャンプ + JPL NAN ; ↓ + 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 + 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 + POP GR4 + RET +ZERO DC '0' +NINE DC '9' +MAXLEN DC 5 ; 文字列の最大長 +STR DS 1 +LEN DS 1 +NLEN DS 1 + END