|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 8704 (0x2200)
Types: TextFile
Names: »FXDCVT.SRC«
└─⟦c9df7130d⟧ Bits:30005915 Pascal MT+ Release 5.2 (Jet-80)
└─⟦this⟧ »FXDCVT.SRC«
;ROUTINE TO CONVERT A FLOATING POINT NUMBER TO FIXED POINT FORMAT
;
NAME FXDCVT
ENTRY FXDCVT
EXT ABS
INCLUDE DEFLT.SRC
;
; THIS IS MOD FXDCVT, SO....
$FXDCVT SET 0FFFFH
INCLUDE FCTMAC.SRC
FXDCVT:
; const exp = 13;
; maxlen = 12;
; type sstring = arrayÆ1..14Å of char;
; procedure format( var x: sstring );
; var tpowr: integer; (* power of ten *)
; fracln : 0..255; (* fraction length specified *)
; i, j: 0..255;
; y: arrayÆ1..22Å of char;
; sign: char;
; fixed: boolean;
; begin
L162
ENTR D,2,29
; fixed := false; (* assume no success *)
MOV -6(IX),A
; sign := xÆ2Å;
LXI H,9
ILOD H,1,-1
MOV -5(IX),L
; tpowr := -1;
MVI 0(IX),255
MVI -1(IX),255
; (*$R- *) fracln := ord( xÆ tpowr Å ); (*$R+ *)
R SET 0
MOV L,-1(IX)
MOV H,0(IX)
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,M
MOV -2(IX),E
R SET 1
; tpowr := ord(xÆexpÅ) * 10 + ord(xÆexp+1Å) -11*ord('0');
LXI H,9
ILOD H,1,-12
LXI D,10
MULT D,0
PUSH H
LXI H,9
ILOD H,1,-13
POP D
DADD D,0
PUSH H
LXI H,48
LXI D,11
MULT D,0
POP D
XCHG
DSUB D,0
MOV 0(IX),H
MOV -1(IX),L
; if xÆ exp-1 Å = '-' then tpowr := -tpowr;
LXI H,9
ILOD H,1,-11
MOV A,L
CMPI D,45
MOV A,H
JNZ L281
MOV L,-1(IX)
MOV H,0(IX)
NEGT H
MOV 0(IX),H
MOV -1(IX),L
L281
; for i := 1 to 22 do yÆ i Å := '0';
MVI -3(IX),1
PUSH IX
POP H
DCX H
DCX H
DCX H
PUSH H
LXI H,22
XTHL
L309
MOV D,A
MOV E,M
XTHL
PUSH H
GE D,0
JNC L310
MOV H,A
MOV L,-3(IX)
XCHG
LXI H,-6
ADDR IX
MVI M,48
POP H
XTHL
INR M
JNZ L309
L310
POP D
L329
POP D
; if (tpowr >= 0) and (tpowr+2+fracln <=maxlen) then begin
MOV L,-1(IX)
MOV H,0(IX)
MOV D,A
MOV E,A
GE D,0
JNC L334
MOV L,-1(IX)
MOV H,0(IX)
INX H
INX H
MOV D,A
MOV E,-2(IX)
DADD D,0
LXI D,12
LE D,0
JNC L331
; fixed := true;
MVI -6(IX),1
; yÆ 1 Å := xÆ 3 Å;
LXI H,9
ILOD H,1,-2
MOV -7(IX),L
; if tpowr > 6 then begin
MOV L,-1(IX)
MOV H,0(IX)
LXI D,6
GRET D,0
JNC L377
; for i := 5 to 10 do yÆ i-3 Å := xÆ i Å;
MVI -3(IX),5
PUSH IX
POP H
DCX H
DCX H
DCX H
PUSH H
LXI H,10
XTHL
L394
MOV D,A
MOV E,M
XTHL
PUSH H
GE D,0
JNC L395
MOV H,A
MOV L,-3(IX)
DCX H
DCX H
DCX H
XCHG
LXI H,-6
ADDR IX
MOV D,A
MOV E,-3(IX)
PUSH H
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,M
POP H
MOV M,E
POP H
XTHL
INR M
JNZ L394
L395
POP D
L421
POP D
; for i := 7 to tpowr do yÆi+1Å := '0';
MVI -3(IX),7
PUSH IX
POP H
DCX H
DCX H
DCX H
PUSH H
MOV L,-1(IX)
MOV H,0(IX)
XTHL
L430
MOV D,A
MOV E,M
XTHL
PUSH H
GE D,0
JNC L431
MOV H,A
MOV L,-3(IX)
INX H
XCHG
LXI H,-6
ADDR IX
MVI M,48
POP H
XTHL
INR M
JNZ L430
L431
POP D
L451
POP D
; end
; else begin
JMP L454
L377
; for i := 2 to tpowr + 1 do yÆ i Å := xÆ i+3Å;
MVI -3(IX),2
PUSH IX
POP H
DCX H
DCX H
DCX H
PUSH H
MOV L,-1(IX)
MOV H,0(IX)
INX H
XTHL
L465
MOV D,A
MOV E,M
XTHL
PUSH H
GE D,0
JNC L466
MOV H,A
MOV L,-3(IX)
XCHG
LXI H,-6
ADDR IX
MOV D,A
MOV E,-3(IX)
INX D
INX D
INX D
PUSH H
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,M
POP H
MOV M,E
POP H
XTHL
INR M
JNZ L465
L466
POP D
L493
POP D
; for i := 3+tpowr to 8 do yÆ i Å := xÆ i+2Å;
MOV L,-1(IX)
MOV H,0(IX)
INX H
INX H
INX H
MOV -3(IX),L
XCHG
PUSH IX
POP H
DCX H
DCX H
DCX H
PUSH H
LXI H,8
XTHL
L503
MOV D,A
MOV E,M
XTHL
PUSH H
GE D,0
JNC L504
MOV H,A
MOV L,-3(IX)
XCHG
LXI H,-6
ADDR IX
MOV D,A
MOV E,-3(IX)
INX D
INX D
PUSH H
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,M
POP H
MOV M,E
POP H
XTHL
INR M
JNZ L503
L504
POP D
L530
POP D
; end;
L454
; end;
L331
L333 EQU L331
L334 EQU L333
; if (tpowr < 0) and (fracln+2+tpowr <= maxlen) then begin
MOV L,-1(IX)
MOV H,0(IX)
MOV D,A
MOV E,A
LESS D,0
JNC L539
MOV H,A
MOV L,-2(IX)
INX H
INX H
MOV E,-1(IX)
MOV D,0(IX)
DADD D,0
MOV A,L
CMPI D,13
MOV A,H
JNC L536
; fixed := true;
MVI -6(IX),1
; yÆ 2+abs( tpowr ) Å := xÆ 3 Å;
MOV L,-1(IX)
MOV H,0(IX)
CALL ABS
INX H
INX H
XCHG
LXI H,-6
ADDR IX
XCHG
LXI H,9
ILOD H,1,-2
XCHG
MOV M,E
; for i := 3 to 8 do yÆ i+abs( tpowr ) Å := xÆ i+2 Å;
MVI -3(IX),3
PUSH IX
POP H
DCX H
DCX H
DCX H
PUSH H
LXI H,8
XTHL
L596
MOV D,A
MOV E,M
XTHL
PUSH H
GE D,0
JNC L597
MOV H,A
MOV L,-3(IX)
PUSH H
MOV L,-1(IX)
MOV H,0(IX)
CALL ABS
POP D
DADD D,0
XCHG
LXI H,-6
ADDR IX
MOV D,A
MOV E,-3(IX)
INX D
INX D
PUSH H
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,M
POP H
MOV M,E
POP H
XTHL
INR M
JNZ L596
L597
POP D
L630
POP D
; tpowr := 0; (* fudge to allow mutual code later on *)
MOV 0(IX),A
MOV -1(IX),A
; end;
L536
L538 EQU L536
L539 EQU L538
; if fixed then begin
CMP -6(IX)
JNC L640
; yÆ tpowr+2 Å := '.';
MOV L,-1(IX)
MOV H,0(IX)
INX H
INX H
XCHG
LXI H,-6
ADDR IX
MVI M,46
; for i := 1 to 14 do xÆ i Å := ' ';
MVI -3(IX),1
PUSH IX
POP H
DCX H
DCX H
DCX H
PUSH H
LXI H,14
XTHL
L668
MOV D,A
MOV E,M
XTHL
PUSH H
GE D,0
JNC L669
MOV H,A
MOV L,-3(IX)
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MVI M,32
POP H
XTHL
INR M
JNZ L668
L669
POP D
L688
POP D
; j := tpowr+2+fracln;
MOV L,-1(IX)
MOV H,0(IX)
INX H
INX H
MOV D,A
MOV E,-2(IX)
DADD D,0
MOV -4(IX),L
; for i := 1 to j do xÆ i+(maxlen-j+2) Å := yÆ i Å;
MVI -3(IX),1
PUSH IX
POP H
DCX H
DCX H
DCX H
PUSH H
MOV H,A
MOV L,-4(IX)
XTHL
L705
MOV D,A
MOV E,M
XTHL
PUSH H
GE D,0
JNC L706
MOV H,A
MOV L,-3(IX)
MOV D,A
MOV E,-4(IX)
PUSH H
LXI H,12
DSUB D,0
INX H
INX H
POP D
DADD D,0
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,-3(IX)
PUSH H
LXI H,-6
ADDR IX
MOV D,A
MOV E,M
POP H
MOV M,E
POP H
XTHL
INR M
JNZ L705
L706
POP D
L738
POP D
; (* round if necessary *)
; if (tpowr <= 6) and ( yÆ j+1 Å >= '5' ) then begin
MOV L,-1(IX)
MOV H,0(IX)
LXI D,6
LE D,0
JNC L743
MOV H,A
MOV L,-4(IX)
INX H
XCHG
LXI H,-6
ADDR IX
MOV D,A
MOV E,M
MVI A,52
CMP E
MOV A,D
JNC L740
; xÆ maxlen+2 Å := succ(xÆ maxlen+2 Å );
LXI H,9
ILOD H,1,-13
INX H
XCHG
MOV H,9(IX)
MOV L,8(IX)
LXI B,-13
DADD B
MOV M,E
; i := 0;
MOV -3(IX),A
; while xÆ maxlen+2-i Å = succ( '9' ) do begin
L800
MOV H,A
MOV L,-3(IX)
LXI D,14
XCHG
DSUB D,0
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,M
PUSH D
LXI H,57
INX H
POP D
DSB1 D,0
JNZ L799
; xÆ maxlen+2-i Å := '0';
MOV H,A
MOV L,-3(IX)
LXI D,14
XCHG
DSUB D,0
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MVI M,48
; i :=i+1;
MOV H,A
MOV L,-3(IX)
INX H
MOV -3(IX),L
;
; if xÆmaxlen+2-i Å = '.' then i := i+1;
MOV H,A
MOV L,-3(IX)
LXI D,14
XCHG
DSUB D,0
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,M
MOV A,E
CMPI D,46
MOV A,D
JNZ L845
MOV H,A
MOV L,-3(IX)
INX H
MOV -3(IX),L
L845
; if xÆmaxlen+2-iÅ = ' ' then xÆmaxlen+2-iÅ:='1'
MOV H,A
MOV L,-3(IX)
LXI D,14
XCHG
DSUB D,0
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,M
MOV A,E
CMPI D,32
MOV A,D
JNZ L868
MOV H,A
MOV L,-3(IX)
LXI D,14
XCHG
DSUB D,0
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
; else xÆmaxlen+2-iÅ:=succ(xÆmaxlen+2-iÅ);
MVI M,49
JMP L897
L868
MOV H,A
MOV L,-3(IX)
LXI D,14
XCHG
DSUB D,0
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
PUSH H
MOV H,A
MOV L,-3(IX)
LXI D,14
XCHG
DSUB D,0
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,M
INX D
POP H
MOV M,E
L897
; end;
JMP L800
L799
; if i = j then j := j+1
MOV H,A
MOV L,-3(IX)
MOV D,A
MOV E,-4(IX)
DSB1 D,0
JNZ L929
MOV H,A
MOV L,-4(IX)
; end;
INX H
MOV -4(IX),L
L929
L740
L742 EQU L740
L743 EQU L742
; xÆ maxlen-j+2 Å := sign;
MOV H,A
MOV L,-4(IX)
LXI D,12
XCHG
DSUB D,0
INX H
INX H
XCHG
MOV H,9(IX)
MOV L,8(IX)
DSUB
INX H
MOV D,A
MOV E,-5(IX)
MOV M,E
; end;
L640
; end;
EXIT D,2
«eof»