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