#define WRAM 0xC000
#define WRAMLEN 0xFFF
+ ; max update calls per frame
+#define SIM_UPDATE_MAX 8
+
#define STACK_BEGIN 0xDFFF
#define TILE_SIZE 8
+ ; loads de and bc with initial values and stores them
+sim_init:
+ ld de, state_cells
+ ld bc, SCRN0
+
+ ; stores the values of bc and de in
+ ; cell_ptr and screen_ptr
+ sim_store:
+ ld a, e
+ ld [sim_cell_ptr], a
+ ld a, d
+ ld [sim_cell_ptr+1], a
+
+ ld a, c
+ ld [sim_cell_screen_ptr], a
+ ld a, b
+ ld [sim_cell_screen_ptr+1], a
+
+ ret
+
; updates all cells
; eihter until the end of the
; end of the cell list is reached
; increments cell_idx every iteration
; resets cell_idx to 0 when end of cells is reached
sim_update:
- ; TODO
- ; for now we just iterate all
- ; cells in a single go
- ; later we want a limit
- ld de, state_cells
- ld bc, SCRN0
+
+ ; load sim update state
+ ld a, [sim_cell_ptr]
+ ld e, a
+ ld a, [sim_cell_ptr+1]
+ ld d, a
+
+ ld a, [sim_cell_screen_ptr]
+ ld c, a
+ ld a, [sim_cell_screen_ptr+1]
+ ld b, a
+
+ ld a, SIM_UPDATE_MAX+1
+ push af
@loop:
; advance to next cell
.rep i, c_size, 1, inc de
inc bc
-
+
push de
push bc
call cell_update
pop bc
pop de
+ pop af
+ ; loop counter--
+ dec a
+ cp a, 0
+ ; jp and ret
+ jp z, sim_store
+
+ push af
; check if we need to exit
ld a, state_cells_end LO
cp a, e
ld a, state_cells_end HI
cp a, d
jp nz, @loop
-
- ret
+ ; if not reset and ret
+ pop af
+ jp sim_init
; current cell index
; for cell update loop
; big endian
-cell_ptr: .adv 2
+sim_cell_ptr: .adv 2
; cell screen ptr
; points to tile that this cell owns
-cell_screen_ptr: .adv 2
+sim_cell_screen_ptr: .adv 2
state_cells: .adv c_size * MAP_SIZE
state_cells_end: