Skip to content

Commit 2e885fa

Browse files
authored
Merge pull request #968 from boriel-basic/feature/add_random_library
Feature/add random library
2 parents 6b33360 + 37eaebd commit 2e885fa

File tree

8 files changed

+144
-100
lines changed

8 files changed

+144
-100
lines changed

src/lib/arch/zx48k/runtime/random.asm

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,14 @@ TAKE_FRAMES:
3131
FRAMES EQU 23672
3232
ENDP
3333

34-
RANDOM_SEED_HIGH EQU RAND+6 ; RANDOM seed, 16 higher bits
34+
RANDOM_SEED_HIGH EQU RAND+1 ; RANDOM seed, 16 higher bits
3535
RANDOM_SEED_LOW EQU 23670 ; RANDOM seed, 16 lower bits
3636

3737

3838
RAND:
3939
PROC
40-
LOCAL RAND_LOOP
41-
ld b, 4
42-
RAND_LOOP:
43-
ld hl,(RANDOM_SEED_LOW) ; xz -> yw
4440
ld de,0C0DEh ; yw -> zt
41+
ld hl,(RANDOM_SEED_LOW) ; xz -> yw
4542
ld (RANDOM_SEED_LOW),de ; x = y, z = w
4643
ld a,e ; w = w ^ ( w << 3 )
4744
add a,a
@@ -59,14 +56,6 @@ RAND_LOOP:
5956
ld d,l ; y = z
6057
ld e,a ; w = t
6158
ld (RANDOM_SEED_HIGH),de
62-
push af
63-
djnz RAND_LOOP
64-
pop de
65-
pop af
66-
ld e, a
67-
pop hl
68-
pop af
69-
ld l, a
7059
ret
7160
ENDP
7261

src/lib/arch/zx48k/stdlib/random.bas

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
' ----------------------------------------------------------------
2+
' This file is released under the MIT License
3+
'
4+
' Copyleft (k) 2025
5+
' by Jose Rodriguez-Rosa (a.k.a. Boriel) <http://www.boriel.com>
6+
' ----------------------------------------------------------------
7+
8+
#pragma once
9+
#pragma push(case_insensitive)
10+
#pragma case_insensitive = TRUE
11+
12+
function fastcall randInt() as ULong ' Returns a random ULong
13+
asm
14+
push namespace core
15+
call RAND
16+
pop namespace
17+
end asm
18+
end function
19+
20+
21+
Function fastcall randFixed() as Fixed ' Returns a random Fixed
22+
Asm
23+
push namespace core
24+
call RAND
25+
pop namespace
26+
End Asm
27+
End Function
28+
29+
30+
Function fastcall randomLimit(limit as uByte) as uByte
31+
Asm
32+
push namespace core
33+
PROC
34+
and a
35+
ret z ; Input zero, output zero.
36+
ld b, a ; Save A
37+
ld c,255
38+
1:
39+
rla
40+
jr c, 2f
41+
rr c
42+
jp 1b ; loop back until we find a bit.
43+
2:
44+
call RAND
45+
and c
46+
cp b
47+
ret z
48+
jr nc, 2b
49+
ENDP
50+
pop namespace
51+
End Asm
52+
End Function
53+
54+
#pragma pop(case_insensitive)
55+
#require "random.asm"

src/lib/arch/zxnext/runtime/random.asm

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,14 @@ TAKE_FRAMES:
3131
FRAMES EQU 23672
3232
ENDP
3333

34-
RANDOM_SEED_HIGH EQU RAND+6 ; RANDOM seed, 16 higher bits
34+
RANDOM_SEED_HIGH EQU RAND+1 ; RANDOM seed, 16 higher bits
3535
RANDOM_SEED_LOW EQU 23670 ; RANDOM seed, 16 lower bits
3636

3737

3838
RAND:
3939
PROC
40-
LOCAL RAND_LOOP
41-
ld b, 4
42-
RAND_LOOP:
43-
ld hl,(RANDOM_SEED_LOW) ; xz -> yw
4440
ld de,0C0DEh ; yw -> zt
41+
ld hl,(RANDOM_SEED_LOW) ; xz -> yw
4542
ld (RANDOM_SEED_LOW),de ; x = y, z = w
4643
ld a,e ; w = w ^ ( w << 3 )
4744
add a,a
@@ -59,14 +56,6 @@ RAND_LOOP:
5956
ld d,l ; y = z
6057
ld e,a ; w = t
6158
ld (RANDOM_SEED_HIGH),de
62-
push af
63-
djnz RAND_LOOP
64-
pop de
65-
pop af
66-
ld e, a
67-
pop hl
68-
pop af
69-
ld l, a
7059
ret
7160
ENDP
7261

src/lib/arch/zxnext/stdlib/random.bas

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
' ----------------------------------------------------------------
2+
' This file is released under the MIT License
3+
'
4+
' Copyleft (k) 2025
5+
' by Jose Rodriguez-Rosa (a.k.a. Boriel) <http://www.boriel.com>
6+
' ----------------------------------------------------------------
7+
8+
#pragma once
9+
#pragma push(case_insensitive)
10+
#pragma case_insensitive = TRUE
11+
12+
function fastcall randInt() as ULong ' Returns a random ULong
13+
asm
14+
push namespace core
15+
call RAND
16+
pop namespace
17+
end asm
18+
end function
19+
20+
21+
Function fastcall randFixed() as Fixed ' Returns a random Fixed
22+
Asm
23+
push namespace core
24+
call RAND
25+
pop namespace
26+
End Asm
27+
End Function
28+
29+
30+
Function fastcall randomLimit(limit as uByte) as uByte
31+
Asm
32+
push namespace core
33+
PROC
34+
and a
35+
ret z ; Input zero, output zero.
36+
ld b, a ; Save A
37+
ld c,255
38+
1:
39+
rla
40+
jr c, 2f
41+
rr c
42+
jp 1b ; loop back until we find a bit.
43+
2:
44+
call RAND
45+
and c
46+
cp b
47+
ret z
48+
jr nc, 2b
49+
ENDP
50+
pop namespace
51+
End Asm
52+
End Function
53+
54+
#pragma pop(case_insensitive)
55+
#require "random.asm"

tests/functional/arch/zx48k/mcleod.asm

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -232,15 +232,12 @@ TAKE_FRAMES:
232232
ret
233233
FRAMES EQU 23672
234234
ENDP
235-
RANDOM_SEED_HIGH EQU RAND+6 ; RANDOM seed, 16 higher bits
235+
RANDOM_SEED_HIGH EQU RAND+1 ; RANDOM seed, 16 higher bits
236236
RANDOM_SEED_LOW EQU 23670 ; RANDOM seed, 16 lower bits
237237
RAND:
238238
PROC
239-
LOCAL RAND_LOOP
240-
ld b, 4
241-
RAND_LOOP:
242-
ld hl,(RANDOM_SEED_LOW) ; xz -> yw
243239
ld de,0C0DEh ; yw -> zt
240+
ld hl,(RANDOM_SEED_LOW) ; xz -> yw
244241
ld (RANDOM_SEED_LOW),de ; x = y, z = w
245242
ld a,e ; w = w ^ ( w << 3 )
246243
add a,a
@@ -258,14 +255,6 @@ RAND_LOOP:
258255
ld d,l ; y = z
259256
ld e,a ; w = t
260257
ld (RANDOM_SEED_HIGH),de
261-
push af
262-
djnz RAND_LOOP
263-
pop de
264-
pop af
265-
ld e, a
266-
pop hl
267-
pop af
268-
ld l, a
269258
ret
270259
ENDP
271260
RND:

tests/functional/arch/zx48k/opt4_keepix.asm

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ _test__leave:
7171
pop ix
7272
ret
7373
;; --- end of user code ---
74-
#line 1 "/zxbasic/src/arch/zx48k/library-asm/addf.asm"
75-
#line 1 "/zxbasic/src/arch/zx48k/library-asm/stackf.asm"
74+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/arith/addf.asm"
75+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/stackf.asm"
7676
; -------------------------------------------------------------
7777
; Functions to manage FP-Stack of the ZX Spectrum ROM CALC
7878
; -------------------------------------------------------------
@@ -111,7 +111,7 @@ __FPSTACK_I16: ; Pushes 16 bits integer in HL into the FP ROM STACK
111111
ld b, a
112112
jp __FPSTACK_PUSH
113113
pop namespace
114-
#line 2 "/zxbasic/src/arch/zx48k/library-asm/addf.asm"
114+
#line 2 "/zxbasic/src/lib/arch/zx48k/runtime/arith/addf.asm"
115115
; -------------------------------------------------------------
116116
; Floating point library using the FP ROM Calculator (ZX 48K)
117117
; All of them uses A EDCB registers as 1st paramter.
@@ -129,8 +129,8 @@ __ADDF: ; Addition
129129
defb 38h; ; END CALC
130130
jp __FPSTACK_POP
131131
pop namespace
132-
#line 53 "opt4_keepix.bas"
133-
#line 1 "/zxbasic/src/arch/zx48k/library-asm/mulf.asm"
132+
#line 53 "arch/zx48k/opt4_keepix.bas"
133+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/arith/mulf.asm"
134134
; -------------------------------------------------------------
135135
; Floating point library using the FP ROM Calculator (ZX 48K)
136136
; All of them uses A EDCB registers as 1st paramter.
@@ -148,13 +148,13 @@ __MULF: ; Multiplication
148148
defb 38h; ; END CALC
149149
jp __FPSTACK_POP
150150
pop namespace
151-
#line 54 "opt4_keepix.bas"
152-
#line 1 "/zxbasic/src/arch/zx48k/library-asm/ploadf.asm"
151+
#line 54 "arch/zx48k/opt4_keepix.bas"
152+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/ploadf.asm"
153153
; Parameter / Local var load
154154
; A => Offset
155155
; IX = Stack Frame
156156
; RESULT: HL => IX + DE
157-
#line 1 "/zxbasic/src/arch/zx48k/library-asm/iloadf.asm"
157+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/iloadf.asm"
158158
; __FASTCALL__ routine which
159159
; loads a 40 bits floating point into A ED CB
160160
; stored at position pointed by POINTER HL
@@ -181,21 +181,21 @@ __LOADF: ; Loads a 40 bits FP number from address pointed by HL
181181
ld b, (hl)
182182
ret
183183
pop namespace
184-
#line 7 "/zxbasic/src/arch/zx48k/library-asm/ploadf.asm"
184+
#line 7 "/zxbasic/src/lib/arch/zx48k/runtime/ploadf.asm"
185185
push namespace core
186186
__PLOADF:
187187
push ix
188188
pop hl
189189
add hl, de
190190
jp __LOADF
191191
pop namespace
192-
#line 55 "opt4_keepix.bas"
193-
#line 1 "/zxbasic/src/arch/zx48k/library-asm/pstoref.asm"
192+
#line 55 "arch/zx48k/opt4_keepix.bas"
193+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/pstoref.asm"
194194
; Stores FP number in A ED CB at location HL+IX
195195
; HL = Offset
196196
; IX = Stack Frame
197197
; A ED CB = FP Number
198-
#line 1 "/zxbasic/src/arch/zx48k/library-asm/storef.asm"
198+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/storef.asm"
199199
push namespace core
200200
__PISTOREF: ; Indect Stores a float (A, E, D, C, B) at location stored in memory, pointed by (IX + HL)
201201
push de
@@ -223,7 +223,7 @@ __STOREF: ; Stores the given FP number in A EDCB at address HL
223223
ld (hl), b
224224
ret
225225
pop namespace
226-
#line 7 "/zxbasic/src/arch/zx48k/library-asm/pstoref.asm"
226+
#line 7 "/zxbasic/src/lib/arch/zx48k/runtime/pstoref.asm"
227227
; Stored a float number in A ED CB into the address pointed by IX + HL
228228
push namespace core
229229
__PSTOREF:
@@ -235,8 +235,8 @@ __PSTOREF:
235235
pop de
236236
jp __STOREF
237237
pop namespace
238-
#line 56 "opt4_keepix.bas"
239-
#line 1 "/zxbasic/src/arch/zx48k/library-asm/random.asm"
238+
#line 56 "arch/zx48k/opt4_keepix.bas"
239+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/random.asm"
240240
; RANDOM functions
241241
push namespace core
242242
RANDOMIZE:
@@ -262,15 +262,12 @@ TAKE_FRAMES:
262262
ret
263263
FRAMES EQU 23672
264264
ENDP
265-
RANDOM_SEED_HIGH EQU RAND+6 ; RANDOM seed, 16 higher bits
265+
RANDOM_SEED_HIGH EQU RAND+1 ; RANDOM seed, 16 higher bits
266266
RANDOM_SEED_LOW EQU 23670 ; RANDOM seed, 16 lower bits
267267
RAND:
268268
PROC
269-
LOCAL RAND_LOOP
270-
ld b, 4
271-
RAND_LOOP:
272-
ld hl,(RANDOM_SEED_LOW) ; xz -> yw
273269
ld de,0C0DEh ; yw -> zt
270+
ld hl,(RANDOM_SEED_LOW) ; xz -> yw
274271
ld (RANDOM_SEED_LOW),de ; x = y, z = w
275272
ld a,e ; w = w ^ ( w << 3 )
276273
add a,a
@@ -288,14 +285,6 @@ RAND_LOOP:
288285
ld d,l ; y = z
289286
ld e,a ; w = t
290287
ld (RANDOM_SEED_HIGH),de
291-
push af
292-
djnz RAND_LOOP
293-
pop de
294-
pop af
295-
ld e, a
296-
pop hl
297-
pop af
298-
ld l, a
299288
ret
300289
ENDP
301290
RND:
@@ -336,5 +325,5 @@ RND_LOOP:
336325
ret
337326
ENDP
338327
pop namespace
339-
#line 57 "opt4_keepix.bas"
328+
#line 57 "arch/zx48k/opt4_keepix.bas"
340329
END

tests/functional/arch/zx48k/randomize.asm

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
ei
4242
ret
4343
;; --- end of user code ---
44-
#line 1 "/zxbasic/src/arch/zx48k/library-asm/random.asm"
44+
#line 1 "/zxbasic/src/lib/arch/zx48k/runtime/random.asm"
4545
; RANDOM functions
4646
push namespace core
4747
RANDOMIZE:
@@ -67,15 +67,12 @@ TAKE_FRAMES:
6767
ret
6868
FRAMES EQU 23672
6969
ENDP
70-
RANDOM_SEED_HIGH EQU RAND+6 ; RANDOM seed, 16 higher bits
70+
RANDOM_SEED_HIGH EQU RAND+1 ; RANDOM seed, 16 higher bits
7171
RANDOM_SEED_LOW EQU 23670 ; RANDOM seed, 16 lower bits
7272
RAND:
7373
PROC
74-
LOCAL RAND_LOOP
75-
ld b, 4
76-
RAND_LOOP:
77-
ld hl,(RANDOM_SEED_LOW) ; xz -> yw
7874
ld de,0C0DEh ; yw -> zt
75+
ld hl,(RANDOM_SEED_LOW) ; xz -> yw
7976
ld (RANDOM_SEED_LOW),de ; x = y, z = w
8077
ld a,e ; w = w ^ ( w << 3 )
8178
add a,a
@@ -93,14 +90,6 @@ RAND_LOOP:
9390
ld d,l ; y = z
9491
ld e,a ; w = t
9592
ld (RANDOM_SEED_HIGH),de
96-
push af
97-
djnz RAND_LOOP
98-
pop de
99-
pop af
100-
ld e, a
101-
pop hl
102-
pop af
103-
ld l, a
10493
ret
10594
ENDP
10695
RND:
@@ -141,5 +130,5 @@ RND_LOOP:
141130
ret
142131
ENDP
143132
pop namespace
144-
#line 23 "randomize.bas"
133+
#line 23 "arch/zx48k/randomize.bas"
145134
END

0 commit comments

Comments
 (0)