root/as/misc/outd_q15.casl

/* [<][>][^][v][top][bottom][index][help] */
   1 ;; GR1に格納された値を、10進数の小数値として表示
   2 OUTD    START
   3         RPUSH
   4         LAD     GR2,10          ; GR2に10進数の「10」を格納
   5         LAD     GR0,0           ; 負数フラグ。GR1が負数の場合、GR0は1
   6         XOR     GR4,GR4         ; 整数値の長さ
   7         AND     GR1,GR1         ; GR1が0の場合
   8         JZE     ZPRT            ; ↓
   9         JPL     STDN            ; GR1が正数の場合、STDNにジャンプ
  10         LD      GR5,='-'        ; GR1が負数の場合、「-」をSTR領域に格納
  11         ST      GR5,STR         ; ↓
  12         LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
  13         CPA     GR1,=#8000      ; GR1が#8000より大きい場合、MDNへジャンプ
  14         JPL     MDN             ; ↓
  15         LD      GR1,='1'        ; GR1が#8000の場合、-1を出力
  16         ST      GR1,STR,GR4     ; (STR + GR4) <- GR1
  17         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
  18         JUMP    PRT             ; ↓
  19 MDN     CALL    ABS             ; GR1を正数に変換
  20 STDN    LD      GR5,='0'        ; 「0」をSTR領域に格納
  21         ST      GR5,STR,GR4     ; ↓
  22         LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
  23         LD      GR5,='.'        ; 「.」をSTR領域に格納
  24         ST      GR5,STR,GR4     ; ↓
  25         LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
  26 ;; GR1の内容を小数値と見なし、10進数の文字列に変換してSTRに格納
  27 TODIG   AND     GR1,GR1         ; GR1が0の場合は、ループを脱出
  28         JZE     PRT             ; ↓
  29         CALL    MUL             ; GR1とGR2の、積をGR1、オーバーフロー値をGR3に格納
  30         LD      GR5,GR3         ; GR3をGR1にコピー
  31         ADDA    GR5,='0'        ; GR1を文字に変換
  32         ST      GR5,STR,GR4     ; (STR + GR4) <- GR1
  33         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
  34         JUMP    TODIG           ; ループ
  35 ZPRT    LD      GR5,='0'        ; 「0」をSTR領域に格納
  36         ST      GR5,STR,GR4     ; (STR + GR4) <- GR1
  37         LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
  38 PRT     ST      GR4,LEN         ; LEN <- GR4
  39         OUT     STR,LEN         ; ↓
  40         RPOP
  41         RET
  42 STR     DS      20
  43 LEN     DS      1
  44         END
  45 ;; GR1の値を10倍にし、GR3にオーバーフロー値を格納
  46 MUL     START
  47         PUSH    0,GR5
  48         PUSH    0,GR6
  49         LAD     GR3,0           ; GR3は、オーバーフロー値を格納
  50         LAD     GR5,1           ; GR5は、インデックス
  51         LD      GR6,GR1         ; GR6は、GR4の元の値を保持
  52 MLOOP   CPA     GR5,=10         ; GR5が10になったらループ脱出
  53         JZE     MFIN            ; ↓
  54         ADDA    GR1,GR6         ; GR4 <- GR4 + GR6
  55         LAD     GR5,1,GR5       ; GR5 <- GR5 + 1
  56         JOV     MADD            ; オーバーフローした場合、MADDへジャンプ
  57         JUMP    MLOOP           ; ループ
  58 MADD    LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
  59         AND     GR1,=#7FFF      ; GR4の最上位ビットをクリア
  60         JUMP    MLOOP           ; ループ
  61 MFIN    POP     GR6
  62         POP     GR5
  63         RET
  64         END

/* [<][>][^][v][top][bottom][index][help] */