124 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| ClockLFSR: ; uses af, bc and clocks one bit of the LFSR.
 | |
| ; at return time, a holds the bottom eight of lfsr state.
 | |
|   ld a, [rLFSR] ;
 | |
|   ld b, a ; b has shifted value ; 1 cycle
 | |
|  
 | |
|   srl b ; second tap is two shifts ; 2 cycles
 | |
|   srl b  ; 2 cycles
 | |
|   xor a, b ; 1 cycle
 | |
|   
 | |
|   srl b ; third tap iis one more shift ; 2 cycles
 | |
|   xor a, b  ; 1 cycle
 | |
|   
 | |
|   srl b ; fourth tap is two more shifts ; 2 cycles
 | |
|   srl b ; 2 cycles
 | |
|   xor a, b  ; 1 cycle
 | |
|   
 | |
|   and a, $1 ; now the zero flag is set iff the tap bit is 0 ; 1 cycle
 | |
|   
 | |
|   ; set carry flag from zero flag
 | |
|   scf ; 1 cycle
 | |
|   jr nz, .noComplementCarry ; 2 or 3 cycles
 | |
|   ccf ; 1 cycle if prev was 2 cycles :)
 | |
| .noComplementCarry
 | |
|   ld a, [rLFSR+1] ; 2 cycles
 | |
|   rra ; 1 cycle ; this should populate with the carry flag 
 | |
|   ld [rLFSR+1], a  ; 2 cycles
 | |
|   ld a, [rLFSR] ; 2 cycles
 | |
|   rra  ; 1 cycle
 | |
|   ld [rLFSR], a  ; 2 cycles
 | |
|   ret ; 37 cycles total. can call roughly 12? of these per scanline
 | |
| 
 | |
| OneRandomByte: ; clocks LFSR 8 times so a is a fresh random byte
 | |
|   call ClockLFSR
 | |
|   call ClockLFSR
 | |
|   call ClockLFSR
 | |
|   call ClockLFSR
 | |
|   call ClockLFSR
 | |
|   call ClockLFSR
 | |
|   call ClockLFSR
 | |
|   call ClockLFSR
 | |
|   ret
 | |
| 
 | |
| RandomUnderD: ; takes d as limit (inclusive)
 | |
|   ; check what the highest bit of d is and dispatch to thee number of bits 
 | |
|   ; we're going to generate
 | |
|   ld d, a 
 | |
|   
 | |
|   ld e, %1111_1111
 | |
|   bit 7, d
 | |
|   jr nz, .inEight
 | |
|   
 | |
|   ld e, %0111_1111
 | |
|   bit 6, d
 | |
|   jr nz, .inSeven
 | |
|   
 | |
|   ld e, %0011_1111
 | |
|   bit 5, d
 | |
|   jr nz, .inSix
 | |
|   
 | |
|   ld e, %0001_1111
 | |
|   bit 4, d
 | |
|   jr nz, .inFive
 | |
|   
 | |
|   ld e, %0000_1111
 | |
|   bit 3, d
 | |
|   jr nz, .inFour
 | |
|   
 | |
|   ld e, %0000_0111
 | |
|   bit 2, d
 | |
|   jr nz, .inThree
 | |
|   
 | |
|   ld e, %0000_0011
 | |
|   bit 1, d
 | |
|   jr nz, .inTwo
 | |
|   
 | |
|   ld e, %0000_0001
 | |
|   bit 0, d
 | |
|   jr nz, .inOne
 | |
|   
 | |
|   ld a, 0 
 | |
|   ret
 | |
|   
 | |
| .inEight
 | |
|   call ClockLFSR
 | |
| .inSeven
 | |
|   call ClockLFSR
 | |
| .inSix
 | |
|   call ClockLFSR
 | |
| .inFive
 | |
|   call ClockLFSR
 | |
| .inFour
 | |
|   call ClockLFSR
 | |
| .inThree
 | |
|   call ClockLFSR
 | |
| .inTwo
 | |
|   call ClockLFSR
 | |
| .inOne
 | |
|   call ClockLFSR
 | |
|   and a, e
 | |
|   cp a, d
 | |
|   ret z
 | |
|   ret c 
 | |
|   jr .inOne
 | |
| 
 | |
| SwapCards: ; takes hl as array, c and e as indices to swap (uses b and d)
 | |
|   inc hl ; first element of array
 | |
|   push hl ; save it for later
 | |
|   ld b, 0
 | |
|   ld d, 0
 | |
|   add hl, bc
 | |
|   ld a, [hl] 
 | |
|   ld b, a ; stash old [hl+0c] in b
 | |
|   pop hl 
 | |
|   push hl 
 | |
|   add hl, de
 | |
|   ld a, [hl]
 | |
|   ld d, a ; stash old [hl+0e] in d
 | |
|   ld [hl], b ; put old [hl+0c] in [hl+0e]
 | |
|   pop hl 
 | |
|   ld b, 0 ; return 0 to b
 | |
|   add hl, bc
 | |
|   ld [hl], d ; put old [hl+0e] in [hl+0c]
 | |
|   ret
 |