X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=as%2FFUNC%2Foutd_q15.casl;h=9792d4d37052dd376cba0e11a487edbfc6a8f7d2;hp=58a99511f507fd2b1ec8f833664e78355cf07364;hb=17d01b5658f2cdad6839ab55d27cf1ed4824309b;hpb=1b6f0b08946e6b03cad228ede15e7f066b3680b5 diff --git a/as/FUNC/outd_q15.casl b/as/FUNC/outd_q15.casl index 58a9951..9792d4d 100644 --- a/as/FUNC/outd_q15.casl +++ b/as/FUNC/outd_q15.casl @@ -3,57 +3,45 @@ OUTD START RPUSH LAD GR2,10 ; GR2に10進数の「10」を格納 LAD GR0,0 ; 負数フラグ。GR1が負数の場合、GR0は1 - ST GR0,LEN ; LENを初期化 + XOR GR4,GR4 ; 整数値の長さ AND GR1,GR1 ; GR1が0の場合 JZE ZPRT ; ↓ JPL STDN ; GR1が正数の場合、STDNにジャンプ - PUSH 0,GR1 - LD GR1,='-' ; GR1が負数の場合、「-」をSTR領域に格納 - CALL STSTR ; ↓ - POP GR1 - CPA GR1,=#8000 ; GR1が#8000より大きい場合 + LD GR5,='-' ; GR1が負数の場合、「-」をSTR領域に格納 + ST GR5,STR ; ↓ + LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 + CPA GR1,=#8000 ; GR1が#8000より大きい場合、MDNへジャンプ JPL MDN ; ↓ LD GR1,='1' ; GR1が#8000の場合、-1を出力 - CALL STSTR ; ↓ + ST GR1,STR,GR4 ; (STR + GR4) <- GR1 + LAD GR4,1,GR4 ; GR4 <- GR4 + 1 JUMP PRT ; ↓ MDN CALL ABS ; GR1を正数に変換 -STDN PUSH 0,GR1 ; GR1を退避 - LD GR1,='0' ; 「0」をSTR領域に格納 - CALL STSTR ; ↓ - LD GR1,='.' ; 「.」をSTR領域に格納 - CALL STSTR ; ↓ - POP GR1 ; GR1を復元 +STDN LD GR5,='0' ; 「0」をSTR領域に格納 + ST GR5,STR,GR4 ; ↓ + LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 + LD GR5,='.' ; 「.」をSTR領域に格納 + ST GR5,STR,GR4 ; ↓ + LAD GR4,1,GR4 ; ↓ GR4 <- GR4 + 1 ;; GR1の内容を小数値と見なし、10進数文字に変換してSTRに格納 -TODIG AND GR1,GR1 ; GR4が0の場合は、ループを脱出 +TODIG AND GR1,GR1 ; GR1が0の場合は、ループを脱出 JZE PRT ; ↓ CALL MUL ; GR1とGR2の、積をGR1、オーバーフロー値をGR3に格納 - PUSH 0,GR1 ; G1を退避 - LD GR1,GR3 ; GR3をGR1にコピー - ADDA GR1,='0' ; GR1を文字に変換 - CALL STSTR ; GR1をSTR領域に格納 - POP GR1 ; GR1を復元 + LD GR5,GR3 ; GR3をGR1にコピー + ADDA GR5,='0' ; GR1を文字に変換 + ST GR5,STR,GR4 ; (STR + GR4) <- GR1 + LAD GR4,1,GR4 ; GR4 <- GR4 + 1 JUMP TODIG ; ループ -ZPRT LD GR1,='0' ; 「0」をSTR領域に格納 - CALL STSTR ; ↓ -PRT LAD GR1,STR ; ↓ +ZPRT LD GR5,='0' ; 「0」をSTR領域に格納 + ST GR5,STR,GR4 ; (STR + GR4) <- GR1 + LAD GR4,1,GR4 ; GR4 <- GR4 + 1 +PRT ST GR4,LEN ; LEN <- GR4 OUT STR,LEN ; ↓ RPOP RET STR DS 20 LEN DS 1 END -;; GR1をSTR領域に格納し、LENをインクリメント -STSTR START - PUSH 0,GR1 - PUSH 0,GR2 - LD GR2,LEN ; GR2にLENの値をロード - ST GR1,STR,GR2 ; STR+GR2 <- GR1 - LAD GR2,1,GR2 ; GR2 <- GR2 + 1 - ST GR2,LEN ; LENにGR2を格納 - POP GR2 - POP GR1 - RET - END ;; GR1の値を10倍にし、GR3にオーバーフロー値を格納 MUL START PUSH 0,GR5