diff --git a/build.ts b/build.ts index 14ec2ac..7758a8a 100755 --- a/build.ts +++ b/build.ts @@ -10,6 +10,7 @@ if (Deno.args.length !== 0) { import { TextLineStream } from "jsr:@std/streams@1.1.0"; const asmFilePaths = [ + "src/consts/arch.asm", "src/consts/game.asm", "src/consts/keyboard.asm", "src/consts/map.asm", @@ -17,6 +18,7 @@ const asmFilePaths = [ "src/consts/screen.asm", "src/consts/sprites.asm", + "src/init.asm", "src/main.asm", "src/lib/game.asm", diff --git a/src/consts/arch.asm b/src/consts/arch.asm new file mode 100644 index 0000000..9d8f400 --- /dev/null +++ b/src/consts/arch.asm @@ -0,0 +1,2 @@ +pub const arch.instruction_size = 4 +pub const arch.instruction_increment_shift = 2 \ No newline at end of file diff --git a/src/init.asm b/src/init.asm new file mode 100644 index 0000000..c5688a2 --- /dev/null +++ b/src/init.asm @@ -0,0 +1,70 @@ +; +; Jump table initialisation +; +; r1: sprite id +; r2: pointer address +; r3: pointer value + +; sprite_empty +add r1, zr, sprites.empty +lsl r2, r1, arch.instruction_increment_shift +add r2, r2, ptr.textures_addresses +add r3, zr, sprite_empty +store_32 [r2], r3 +; sprite_unimplemented +add r1, zr, sprites.unimplemented +lsl r2, r1, arch.instruction_increment_shift +add r2, r2, ptr.textures_addresses +add r3, zr, sprite_unimplemented +store_32 [r2], r3 +; sprite_wall_end +add r1, zr, sprites.wall_end +lsl r2, r1, arch.instruction_increment_shift +add r2, r2, ptr.textures_addresses +add r3, zr, sprite_wall_end +store_32 [r2], r3 +; sprite_wall_straight +add r1, zr, sprites.wall_straight +lsl r2, r1, arch.instruction_increment_shift +add r2, r2, ptr.textures_addresses +add r3, zr, sprite_wall_straight +store_32 [r2], r3 +; sprite_wall_corner +add r1, zr, sprites.wall_corner +lsl r2, r1, arch.instruction_increment_shift +add r2, r2, ptr.textures_addresses +add r3, zr, sprite_wall_corner +store_32 [r2], r3 +; sprite_robot +add r1, zr, sprites.robot +lsl r2, r1, arch.instruction_increment_shift +add r2, r2, ptr.textures_addresses +add r3, zr, sprite_robot +store_32 [r2], r3 +; sprite_ghost +add r1, zr, sprites.ghost +lsl r2, r1, arch.instruction_increment_shift +add r2, r2, ptr.textures_addresses +add r3, zr, sprite_ghost +store_32 [r2], r3 +; sprite_coin +add r1, zr, sprites.coin +lsl r2, r1, arch.instruction_increment_shift +add r2, r2, ptr.textures_addresses +add r3, zr, sprite_coin +store_32 [r2], r3 + +; +; Screen initialization +; + +; r1 = screen parameter value +mov r1, screen.mode_index +screen r1, screen.mode_value + +mov r1, screen.offset_index +add r2, zr, ptr.screen +screen r1, r2 + +mov r1, screen.resolution_index +screen r1, screen.resolution_value diff --git a/src/lib/drawing.asm b/src/lib/drawing.asm index 1f49b78..2424274 100644 --- a/src/lib/drawing.asm +++ b/src/lib/drawing.asm @@ -120,48 +120,21 @@ get_tile_address: ; r13: address ; Locals: -; r2: jump address +; r2: pointer address ; */ get_sprite_address: push r1 push r2 cmp r1, sprites.max - jbe get_sprite_address_jmp_table_init + jbe get_sprite_address_ptr mov r1, sprites.unimplemented - get_sprite_address_jmp_table_init: - lsl r2, r1, 3 ; 2*instruction_size = *8 = <<3 - add r2, r2, get_sprite_address_jmp_table_start - jmp r2 + get_sprite_address_ptr: + lsl r2, r1, arch.instruction_increment_shift + add r2, r2, ptr.textures_addresses + load_32 r13, [r2] - get_sprite_address_jmp_table_start: - ; sprite_empty - add r13, zr, sprite_empty - jmp get_sprite_address_return - ; sprite_unimplemented: - add r13, zr, sprite_unimplemented - jmp get_sprite_address_return - ; sprite_wall_end - add r13, zr, sprite_wall_end - jmp get_sprite_address_return - ; sprite_wall_straight - add r13, zr, sprite_wall_straight - jmp get_sprite_address_return - ; sprite_wall_corner - add r13, zr, sprite_wall_corner - jmp get_sprite_address_return - ; sprite_robot - add r13, zr, sprite_robot - jmp get_sprite_address_return - ; sprite_ghost - add r13, zr, sprite_ghost - jmp get_sprite_address_return - ; sprite_coin: - add r13, zr, sprite_coin - ;jmp get_sprite_address_return - - get_sprite_address_return: pop r2 pop r1 ret diff --git a/src/main.asm b/src/main.asm index 312431f..be88511 100644 --- a/src/main.asm +++ b/src/main.asm @@ -1,19 +1,6 @@ include consts/screen -; -; Screen initialization -; - -; r1 = screen parameter value -mov r1, screen.mode_index -screen r1, screen.mode_value - -mov r1, screen.offset_index -add r2, zr, ptr.screen -screen r1, r2 - -mov r1, screen.resolution_index -screen r1, screen.resolution_value +include init call drawing.draw_whole_map diff --git a/src/reserved_space.asm b/src/reserved_space.asm index 6c8104c..41ea207 100644 --- a/src/reserved_space.asm +++ b/src/reserved_space.asm @@ -1,3 +1,14 @@ +; Sprite addresses jump table +pub ptr.textures_addresses: +U32 0 ; empty +U32 0 ; placeholder +U32 0 ; wall_end +U32 0 ; wall_straight +U32 0 ; wall_corner +U32 0 ; robot +U32 0 ; ghost +U32 0 ; coin + ; 0.5 second = 500_000_000 nano second = 0x0000_0000_1DCD_6500 pub ptr.tick_duration_high: U32 0x0000_0000 pub ptr.tick_duration_low: U32 0x1DCD_6500