cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

arand.s (2577B)


      1;/***************************************************************************
      2; *                                                                         *
      3; * Module  : arand.s                                                       *
      4; *                                                                         *
      5; * Purpose : A random number generator using the lagged additive method    *
      6; *                                                                         *
      7; * Version : 1, January 11 1998                                            *
      8; *                                                                         *
      9; * Author  : Luc Van den Borre ( Homepage : NOC.BASE.ORG )                 *
     10; *                                                                         *
     11; **************************************************************************/
     12
     13	.globl	.initrand
     14	.globl	_rand
     15
     16	.area	_DATA
     17
     18.randarr:
     19	.ds	55
     20.raxj:
     21	.ds	0x01
     22.raxk:
     23	.ds	0x01
     24
     25	.area	_CODE
     26
     27	;; arand() operates on an array of 55 arbitrary values (here : bytes).
     28	;; It adds two values of the array together, replaces one of the values
     29	;; with the result, and returns the result.
     30	;; At start, the indices into the array refer to the 55th and 24th element.
     31	;; After each call, each index is decreased, and looped around if necessary.
     32	;; This kind of works, but the values produces are less good than those by
     33	;; rand(), mainly because it operates on bytes instead of words.
     34	;; Ref : D. E. Knuth, "The Art of Computer Programming" , Volume 2
     35	;;
     36	;; Exit conditions
     37	;;   DE = Random number (byte!)
     38	;;
     39	;; Registers used:
     40	;;   all
     41	;;
     42_arand::			; Banked
     43	PUSH	BC
     44	LD	D,#0
     45	LD	HL,#.randarr-1
     46	LD	A,(.raxj)
     47	LD	E,A
     48	DEC	A		; Decrease the pointer
     49	JR	NZ,1$
     50	LD	A,#55
     511$:
     52	LD	(.raxj),A
     53	ADD	HL,DE
     54	LD	B,(HL)
     55
     56	LD	HL,#.randarr-1	; Ooh...
     57	LD	A,(.raxk)
     58	LD	E,A
     59	DEC	A		; Decrease the pointer
     60	JR	NZ,2$
     61	LD	A,#55
     622$:
     63	LD	(.raxk),A
     64	ADD	HL,DE
     65	LD	A,(HL)
     66
     67	ADD	B
     68	LD	(HL),A		; Store new value
     69
     70	POP	BC
     71
     72	LD	D,#0
     73	LD	E,A
     74
     75	RET
     76
     77	;; _initarand calls the _rand function to fill the array with random values
     78	;; Note that this also sets the seed value of the _rand function first,
     79	;; like _initrand
     80	;;
     81	;; Exit conditions
     82	;;   None
     83	;;
     84	;; Registers used:
     85	;;   all
     86	;;
     87_initarand::			; Banked
     88	LDA	HL,2(SP)
     89	CALL	.initrand
     90
     91	PUSH	BC
     92	LD	A,#55
     93	LD	HL,#.randarr
     941$:
     95	DEC	A
     96	LD	(.raxj),A
     97	LD	B,H
     98	LD	C,L
     99	CALL	_rand
    100	LD	H,B
    101	LD	L,C
    102
    103	LD	A, E
    104	LD	(HL+),A
    105	
    106	LD	A,(.raxj)
    107	CP	#0
    108	JR	NZ,1$
    109
    110	LD	A,#24		; Now the array has been filled,set the pointers
    111	LD	(.raxj),A
    112	LD	A,#55
    113	LD	(.raxk),A
    114
    115	POP	BC
    116	RET