X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=as%2Fcasl2lib%2Fouta.casl;h=baf71c9bd56a459fad95d77458d3ecba25a603cc;hp=3f7793d94efacc2a789ddd5d3ffc7adb8aeca321;hb=7ac339dcd755848e9820142422752fbdc8186b5c;hpb=24f3ed4394bc3d9bfe2f387f91e0b7f41ec8555e diff --git a/as/casl2lib/outa.casl b/as/casl2lib/outa.casl index 3f7793d..baf71c9 100644 --- a/as/casl2lib/outa.casl +++ b/as/casl2lib/outa.casl @@ -42,6 +42,23 @@ STR DS 17 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:剰余 @@ -89,30 +106,3 @@ FIN POP GR4 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