Skip to content

Commit 82a0f79

Browse files
committed
feat: add test
1 parent 2d91fa8 commit 82a0f79

4 files changed

Lines changed: 467 additions & 0 deletions

File tree

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
org 32768
2+
.core.__START_PROGRAM:
3+
di
4+
push ix
5+
push iy
6+
exx
7+
push hl
8+
exx
9+
ld (.core.__CALL_BACK__), sp
10+
ei
11+
jp .core.__MAIN_PROGRAM__
12+
.core.__CALL_BACK__:
13+
DEFW 0
14+
.core.ZXBASIC_USER_DATA:
15+
; Defines USER DATA Length in bytes
16+
.core.ZXBASIC_USER_DATA_LEN EQU .core.ZXBASIC_USER_DATA_END - .core.ZXBASIC_USER_DATA
17+
.core.__LABEL__.ZXBASIC_USER_DATA_LEN EQU .core.ZXBASIC_USER_DATA_LEN
18+
.core.__LABEL__.ZXBASIC_USER_DATA EQU .core.ZXBASIC_USER_DATA
19+
_var_neg:
20+
DEFB 00h
21+
DEFB 80h
22+
DEFB 0FEh
23+
DEFB 0FFh
24+
_var:
25+
DEFB 00h
26+
DEFB 80h
27+
DEFB 01h
28+
DEFB 00h
29+
_var_neg_fl:
30+
DEFB 81h
31+
DEFB 0C0h
32+
DEFB 00h
33+
DEFB 00h
34+
DEFB 00h
35+
_r_int:
36+
DEFB 00, 00
37+
_r_long:
38+
DEFB 00, 00, 00, 00
39+
_r_ulong:
40+
DEFB 00, 00, 00, 00
41+
.core.ZXBASIC_USER_DATA_END:
42+
.core.__MAIN_PROGRAM__:
43+
ld hl, (_var_neg)
44+
ld de, (_var_neg + 2)
45+
ex de, hl
46+
ld (_r_int), hl
47+
ld hl, 65534
48+
ld (_r_int), hl
49+
ld hl, (_var_neg)
50+
ld de, (_var_neg + 2)
51+
ex de, hl
52+
ld de, 0
53+
ld (_r_long), hl
54+
ld (_r_long + 2), de
55+
ld hl, (_var_neg)
56+
ld de, (_var_neg + 2)
57+
ex de, hl
58+
ld de, 0
59+
ld (_r_ulong), hl
60+
ld (_r_ulong + 2), de
61+
ld hl, (_var)
62+
ld de, (_var + 2)
63+
ex de, hl
64+
ld (_r_int), hl
65+
ld hl, 1
66+
ld (_r_int), hl
67+
ld hl, (_var)
68+
ld de, (_var + 2)
69+
ex de, hl
70+
ld de, 0
71+
ld (_r_long), hl
72+
ld (_r_long + 2), de
73+
ld hl, (_var)
74+
ld de, (_var + 2)
75+
ex de, hl
76+
ld de, 0
77+
ld (_r_ulong), hl
78+
ld (_r_ulong + 2), de
79+
ld a, (_var_neg_fl)
80+
ld de, (_var_neg_fl + 1)
81+
ld bc, (_var_neg_fl + 3)
82+
call .core.__FTOU32REG
83+
ld (_r_int), hl
84+
ld hl, 65534
85+
ld (_r_int), hl
86+
ld a, (_var_neg_fl)
87+
ld de, (_var_neg_fl + 1)
88+
ld bc, (_var_neg_fl + 3)
89+
call .core.__FTOU32REG
90+
ld (_r_long), hl
91+
ld (_r_long + 2), de
92+
ld a, (_var_neg_fl)
93+
ld de, (_var_neg_fl + 1)
94+
ld bc, (_var_neg_fl + 3)
95+
call .core.__FTOU32REG
96+
ld (_r_ulong), hl
97+
ld (_r_ulong + 2), de
98+
ld hl, 0
99+
ld b, h
100+
ld c, l
101+
.core.__END_PROGRAM:
102+
di
103+
ld hl, (.core.__CALL_BACK__)
104+
ld sp, hl
105+
exx
106+
pop hl
107+
exx
108+
pop iy
109+
pop ix
110+
ei
111+
ret
112+
;; --- end of user code ---
113+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/ftou32reg.asm"
114+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/neg32.asm"
115+
push namespace core
116+
__ABS32:
117+
bit 7, d
118+
ret z
119+
__NEG32: ; Negates DEHL (Two's complement)
120+
ld a, l
121+
cpl
122+
ld l, a
123+
ld a, h
124+
cpl
125+
ld h, a
126+
ld a, e
127+
cpl
128+
ld e, a
129+
ld a, d
130+
cpl
131+
ld d, a
132+
inc l
133+
ret nz
134+
inc h
135+
ret nz
136+
inc de
137+
ret
138+
pop namespace
139+
#line 2 "/zxbasic/src/lib/arch/zx48k/runtime/ftou32reg.asm"
140+
push namespace core
141+
__FTOU32REG: ; Converts a Float to (un)signed 32 bit integer (NOTE: It's ALWAYS 32 bit signed)
142+
; Input FP number in A EDCB (A exponent, EDCB mantissa)
143+
; Output: DEHL 32 bit number (signed)
144+
PROC
145+
LOCAL __IS_FLOAT
146+
LOCAL __NEGATE
147+
or a
148+
jr nz, __IS_FLOAT
149+
; Here if it is a ZX ROM Integer
150+
ld h, c
151+
ld l, d
152+
ld d, e
153+
ret
154+
__IS_FLOAT: ; Jumps here if it is a true floating point number
155+
ld h, e
156+
push hl ; Stores it for later (Contains Sign in H)
157+
push de
158+
push bc
159+
exx
160+
pop de ; Loads mantissa into C'B' E'D'
161+
pop bc ;
162+
set 7, c ; Highest mantissa bit is always 1
163+
exx
164+
ld hl, 0 ; DEHL = 0
165+
ld d, h
166+
ld e, l
167+
;ld a, c ; Get exponent
168+
sub 128 ; Exponent -= 128
169+
jr z, __FTOU32REG_END ; If it was <= 128, we are done (Integers must be > 128)
170+
jr c, __FTOU32REG_END ; It was decimal (0.xxx). We are done (return 0)
171+
ld b, a ; Loop counter = exponent - 128
172+
__FTOU32REG_LOOP:
173+
exx ; Shift C'B' E'D' << 1, output bit stays in Carry
174+
sla d
175+
rl e
176+
rl b
177+
rl c
178+
exx ; Shift DEHL << 1, inserting the carry on the right
179+
rl l
180+
rl h
181+
rl e
182+
rl d
183+
djnz __FTOU32REG_LOOP
184+
__FTOU32REG_END:
185+
pop af ; Take the sign bit
186+
or a ; Sets SGN bit to 1 if negative
187+
jp m, __NEGATE ; Negates DEHL
188+
ret
189+
__NEGATE:
190+
exx
191+
ld a, d
192+
or e
193+
or b
194+
or c
195+
exx
196+
jr z, __END
197+
inc l
198+
jr nz, __END
199+
inc h
200+
jr nz, __END
201+
inc de
202+
LOCAL __END
203+
__END:
204+
jp __NEG32
205+
ENDP
206+
__FTOU8: ; Converts float in C ED LH to Unsigned byte in A
207+
call __FTOU32REG
208+
ld a, l
209+
ret
210+
pop namespace
211+
#line 72 "arch/zx48k/cast_const_to_int.bas"
212+
END
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
dim var_neg as fixed = -1.5
2+
const const_neg as fixed = -1.5
3+
dim var as Fixed = 1.5
4+
const const_ as fixed = 1.5
5+
dim var_neg_fl as Float = -1.5
6+
const const_neg_fl as Float = -1.5
7+
8+
DIM r_int as Integer
9+
DIM r_long as Long
10+
DIM r_ulong as ULong
11+
12+
LET r_int = cast(integer, var_neg)
13+
LET r_int = cast(integer, const_neg)
14+
LET r_long = cast(long, var_neg)
15+
LET r_ulong = cast(ulong, var_neg)
16+
17+
LET r_int = cast(integer, var)
18+
LET r_int = cast(integer, const_)
19+
LET r_long = cast(long, var)
20+
LET r_ulong = cast(ulong, var)
21+
22+
LET r_int = cast(integer, var_neg_fl)
23+
LET r_int = cast(integer, const_neg_fl)
24+
LET r_long = cast(long, var_neg_fl)
25+
LET r_ulong = cast(ulong, var_neg_fl)

0 commit comments

Comments
 (0)