Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4e03aada20 | |||
| 3783a98f95 | |||
| dc43e7aa0b | |||
| c7360be7fa | |||
| 356cf3fb94 | |||
| b7bc9956f9 | |||
| 5231f54c27 | |||
| aad1fa45f7 | |||
| 88f10f9f06 | |||
| 6cdb7304c2 | |||
| e6b2d8b086 | |||
| 5588d4c29a | |||
| e3cf5cdfa1 |
BIN
assets/screen.ppm
Normal file
BIN
assets/screen.ppm
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
35
build.ts
35
build.ts
@@ -9,6 +9,10 @@ if (Deno.args.length !== 0) {
|
|||||||
|
|
||||||
import { TextLineStream } from "jsr:@std/streams@1.1.0";
|
import { TextLineStream } from "jsr:@std/streams@1.1.0";
|
||||||
|
|
||||||
|
const instructionLength = 4; // in bytes
|
||||||
|
const mapWidth = 15;
|
||||||
|
const spriteWidth = 17;
|
||||||
|
|
||||||
const asmFilePaths = [
|
const asmFilePaths = [
|
||||||
"src/consts/arch.asm",
|
"src/consts/arch.asm",
|
||||||
"src/consts/game.asm",
|
"src/consts/game.asm",
|
||||||
@@ -23,14 +27,10 @@ const asmFilePaths = [
|
|||||||
|
|
||||||
"src/lib/game.asm",
|
"src/lib/game.asm",
|
||||||
"src/lib/drawing.asm",
|
"src/lib/drawing.asm",
|
||||||
"src/lib/sprite_rotation.asm",
|
|
||||||
];
|
];
|
||||||
|
const initialScreenPath = 'assets/screen.ppm';
|
||||||
const reservedSpacePath = 'src/reserved_space.asm';
|
const reservedSpacePath = 'src/reserved_space.asm';
|
||||||
|
|
||||||
const instructionLength = 4; // in bytes
|
|
||||||
const mapWidth = 15;
|
|
||||||
const spriteWidth = 5;
|
|
||||||
|
|
||||||
const mapMatchingStrings = {
|
const mapMatchingStrings = {
|
||||||
0x00_00_00: '0', // Empty
|
0x00_00_00: '0', // Empty
|
||||||
0xFF_00_00: '1', // Wall
|
0xFF_00_00: '1', // Wall
|
||||||
@@ -38,17 +38,17 @@ const mapMatchingStrings = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const spritesMatchingStrings = {
|
const spritesMatchingStrings = {
|
||||||
0x00_00_00: ' 0', // 0b000_000_00
|
0x00_00_00: '0b000_000_00',
|
||||||
0x00_00_FF: ' 3', // 0b000_000_11
|
0x00_00_FF: '0b000_000_11',
|
||||||
0x00_FF_00: ' 28', // 0b000_111_00
|
0x00_FF_00: '0b000_111_00',
|
||||||
0x99_50_00: ' 68', // 0b010_001_00
|
0x99_50_00: `0b010_001_00`,
|
||||||
0x77_77_77: '110', // 0b011_011_10
|
0x77_77_77: '0b011_011_10',
|
||||||
0xB3_B3_B3: '146', // 0b100_100_10
|
0xB3_B3_B3: '0b100_100_10',
|
||||||
0xFF_00_00: '224', // 0b111_000_00
|
0xFF_00_00: '0b111_000_00',
|
||||||
0xFF_00_FF: '227', // 0b111_000_11
|
0xFF_00_FF: '0b111_000_11',
|
||||||
0xFF_80_00: '240', // 0b111_100_00
|
0xFF_80_00: '0b111_100_00',
|
||||||
0xFF_FF_00: '248', // 0b111_110_00
|
0xFF_FF_00: '0b111_110_00',
|
||||||
0xFF_FF_FF: '255', // 0b111_111_11
|
0xFF_FF_FF: '0b111_111_11',
|
||||||
};
|
};
|
||||||
|
|
||||||
const mapPath = 'assets/map.ppm';
|
const mapPath = 'assets/map.ppm';
|
||||||
@@ -104,6 +104,9 @@ console.log(`
|
|||||||
;
|
;
|
||||||
`);
|
`);
|
||||||
|
|
||||||
|
const screenBytes = await getDataFromPPM(initialScreenPath);
|
||||||
|
console.log(bytesToAsmConstU8('screen', screenBytes, spritesMatchingStrings, 1));
|
||||||
|
|
||||||
console.log(await Deno.readTextFile(reservedSpacePath))
|
console.log(await Deno.readTextFile(reservedSpacePath))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -9,11 +9,6 @@ It thus should be able to run on the architecture and ISA the players have built
|
|||||||
The `main` branch contains a minimal implementation of the game.
|
The `main` branch contains a minimal implementation of the game.
|
||||||
|
|
||||||
The following branches contains variations, allowing comparisons of performances, visuals, gameplay, ...
|
The following branches contains variations, allowing comparisons of performances, visuals, gameplay, ...
|
||||||
- `res-0-prerendered`:
|
|
||||||
- `80x60` screen resolution
|
|
||||||
- `5x5` tile resolution
|
|
||||||
- initial screen prerendered
|
|
||||||
- no sprite rotation
|
|
||||||
- `res-2`:
|
- `res-2`:
|
||||||
- `256x192` screen resolution
|
- `256x192` screen resolution
|
||||||
- `17x17` tile resolution
|
- `17x17` tile resolution
|
||||||
@@ -33,8 +28,8 @@ Usage example:
|
|||||||
```sh
|
```sh
|
||||||
./build.ts > /path/to/the/game/schematics/architecture/Symfony/sandbox/main.asm
|
./build.ts > /path/to/the/game/schematics/architecture/Symfony/sandbox/main.asm
|
||||||
|
|
||||||
# script output can easily be piped to strip it off all comments, leading whitespace, double spaces and empty lines:
|
# script output can easily be piped to strip it off all comments, leading whitespace and empty lines:
|
||||||
./build.ts | sed -r 's/\s*;.*//' | sed -r 's/^\s+//' | sed -r 's/ +/ /' | sed -r '/^\s*$/d' > result.asm
|
./build.ts | sed 's/\s*;.*//' | sed 's/^\s*//' | sed '/^\d*$/d' > result.asm
|
||||||
```
|
```
|
||||||
|
|
||||||
The script is build over Deno's API, so you'll need to have a `deno` binary in your PATH to use it that way.
|
The script is build over Deno's API, so you'll need to have a `deno` binary in your PATH to use it that way.
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
; map size 16x12 (or 15x11 with margins)
|
|
||||||
pub const map.width = 15
|
pub const map.width = 15
|
||||||
pub const map.height = 11
|
pub const map.height = 11
|
||||||
pub const map.size = 165 ; 11*15
|
pub const map.size = 165 ; 11*15
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
; given:
|
; given:
|
||||||
; - 16x12 tiles map
|
; -> 256x192 pixels screen
|
||||||
; - 5x5 pixels tile
|
; -> 15x11 tiles map
|
||||||
|
; => 17x17 pixels tile
|
||||||
|
|
||||||
pub const scene.margin_top = 2
|
pub const scene.margin_top = 2
|
||||||
pub const scene.margin_bottom = 3
|
pub const scene.margin_bottom = 3
|
||||||
pub const scene.margin_left = 2
|
pub const scene.margin_left = 0
|
||||||
pub const scene.margin_right = 3
|
pub const scene.margin_right = 1
|
||||||
@@ -20,7 +20,7 @@ pub const screen.mode_index = 0
|
|||||||
pub const screen.mode_value = 2
|
pub const screen.mode_value = 2
|
||||||
pub const screen.offset_index = 1
|
pub const screen.offset_index = 1
|
||||||
pub const screen.resolution_index = 2
|
pub const screen.resolution_index = 2
|
||||||
pub const screen.resolution_value = 0
|
pub const screen.resolution_value = 2
|
||||||
|
|
||||||
pub const screen.width = 80
|
pub const screen.width = 256
|
||||||
pub const screen.height = 60
|
pub const screen.height = 192
|
||||||
|
|||||||
@@ -1,18 +1,10 @@
|
|||||||
pub const sprites.width = 5
|
pub const sprites.width = 17
|
||||||
pub const sprites.height = 5 ; unused as sprite are all square
|
pub const sprites.height = 17 ; unused as sprite are all square
|
||||||
pub const sprites.size = 25 ; height x width
|
pub const sprites.size = 289 ; height x width
|
||||||
|
|
||||||
pub const sprites.rotation_0 = 0
|
|
||||||
pub const sprites.rotation_90 = 1
|
|
||||||
pub const sprites.rotation_180 = 2
|
|
||||||
pub const sprites.rotation_270 = 3
|
|
||||||
|
|
||||||
pub const sprites.empty = 0
|
pub const sprites.empty = 0
|
||||||
pub const sprites.unimplemented = 1
|
pub const sprites.unimplemented = 1
|
||||||
pub const sprites.wall_end = 2
|
pub const sprites.robot = 2
|
||||||
pub const sprites.wall_straight = 3
|
pub const sprites.ghost = 3
|
||||||
pub const sprites.wall_corner = 4
|
pub const sprites.coin = 4
|
||||||
pub const sprites.robot = 5
|
pub const sprites.max = 4 ; for lookup table
|
||||||
pub const sprites.ghost = 6
|
|
||||||
pub const sprites.coin = 7
|
|
||||||
pub const sprites.max = 7 ; for lookup table
|
|
||||||
|
|||||||
20
src/init.asm
20
src/init.asm
@@ -17,24 +17,6 @@ lsl r2, r1, arch.instruction_increment_shift
|
|||||||
add r2, r2, ptr.textures_addresses
|
add r2, r2, ptr.textures_addresses
|
||||||
add r3, zr, sprite_unimplemented
|
add r3, zr, sprite_unimplemented
|
||||||
store_32 [r2], r3
|
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
|
; sprite_robot
|
||||||
add r1, zr, sprites.robot
|
add r1, zr, sprites.robot
|
||||||
lsl r2, r1, arch.instruction_increment_shift
|
lsl r2, r1, arch.instruction_increment_shift
|
||||||
@@ -63,7 +45,7 @@ mov r1, screen.mode_index
|
|||||||
screen r1, screen.mode_value
|
screen r1, screen.mode_value
|
||||||
|
|
||||||
mov r1, screen.offset_index
|
mov r1, screen.offset_index
|
||||||
add r2, zr, ptr.screen
|
add r2, zr, screen
|
||||||
screen r1, r2
|
screen r1, r2
|
||||||
|
|
||||||
mov r1, screen.resolution_index
|
mov r1, screen.resolution_index
|
||||||
|
|||||||
@@ -5,53 +5,6 @@ include ../consts/scene
|
|||||||
include ../consts/sprites
|
include ../consts/sprites
|
||||||
include sprite_rotation
|
include sprite_rotation
|
||||||
|
|
||||||
; /* Draw the whole (fill the screen memory with the values of the sprites based on the map)
|
|
||||||
|
|
||||||
; Inputs:
|
|
||||||
|
|
||||||
; Outputs:
|
|
||||||
|
|
||||||
; Locals:
|
|
||||||
; r1: x map coord
|
|
||||||
; r2: y map coord
|
|
||||||
; r3: sprite rotation
|
|
||||||
; r4: sprite id
|
|
||||||
; r12: rotation (returned by `sprite and rotation`)
|
|
||||||
; r13: sprite (returned by `get_sprite_id_and_rotation`)
|
|
||||||
; */
|
|
||||||
pub drawing.draw_whole_map:
|
|
||||||
push r1
|
|
||||||
push r2
|
|
||||||
push r3
|
|
||||||
push r4
|
|
||||||
push r12
|
|
||||||
push r13
|
|
||||||
|
|
||||||
mov r1, 0
|
|
||||||
mov r2, 0
|
|
||||||
|
|
||||||
draw_whole_map_loop:
|
|
||||||
call sprite_rotation.get_sprite_id_and_rotation
|
|
||||||
mov r3, r12
|
|
||||||
mov r4, r13
|
|
||||||
call drawing.draw_sprite_at_map_coord
|
|
||||||
add r1, r1, 1
|
|
||||||
cmp r1, map.width
|
|
||||||
jne draw_whole_map_loop
|
|
||||||
mov r1, 0
|
|
||||||
add r2, r2, 1
|
|
||||||
cmp r2, map.height
|
|
||||||
jne draw_whole_map_loop
|
|
||||||
|
|
||||||
pop r13
|
|
||||||
pop r12
|
|
||||||
pop r4
|
|
||||||
pop r3
|
|
||||||
pop r2
|
|
||||||
pop r1
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
; /* Return the top-left pixel address of the tile at the given map coordinates
|
; /* Return the top-left pixel address of the tile at the given map coordinates
|
||||||
|
|
||||||
; Inputs:
|
; Inputs:
|
||||||
@@ -77,7 +30,7 @@ get_tile_address:
|
|||||||
cmp r3, sprites.height
|
cmp r3, sprites.height
|
||||||
jne get_tile_address_offset_per_row_loop
|
jne get_tile_address_offset_per_row_loop
|
||||||
|
|
||||||
add r13, zr, ptr.screen
|
add r13, zr, screen
|
||||||
|
|
||||||
mov r3, 0
|
mov r3, 0
|
||||||
get_tile_address_margin_top_loop:
|
get_tile_address_margin_top_loop:
|
||||||
@@ -144,8 +97,7 @@ get_sprite_address:
|
|||||||
; Inputs:
|
; Inputs:
|
||||||
; r1: map x coord
|
; r1: map x coord
|
||||||
; r2: map y coord
|
; r2: map y coord
|
||||||
; r3: sprite rotation
|
; r3: sprite id
|
||||||
; r4: sprite id
|
|
||||||
|
|
||||||
; Outputs:
|
; Outputs:
|
||||||
|
|
||||||
@@ -158,22 +110,20 @@ pub drawing.draw_sprite_at_map_coord:
|
|||||||
push r1
|
push r1
|
||||||
push r2
|
push r2
|
||||||
push r3
|
push r3
|
||||||
push r4
|
|
||||||
push r13
|
push r13
|
||||||
|
|
||||||
call get_tile_address
|
call get_tile_address
|
||||||
mov r1, r13
|
push r13
|
||||||
push r1
|
|
||||||
|
|
||||||
mov r1, r4
|
mov r1, r3
|
||||||
call get_sprite_address
|
call get_sprite_address
|
||||||
mov r2, r13
|
|
||||||
pop r1
|
|
||||||
|
|
||||||
|
mov r2, r13
|
||||||
|
pop r13
|
||||||
|
mov r1, r13
|
||||||
call draw_sprite
|
call draw_sprite
|
||||||
|
|
||||||
pop r13
|
pop r13
|
||||||
pop r4
|
|
||||||
pop r3
|
pop r3
|
||||||
pop r2
|
pop r2
|
||||||
pop r1
|
pop r1
|
||||||
@@ -184,18 +134,15 @@ pub drawing.draw_sprite_at_map_coord:
|
|||||||
; Inputs:
|
; Inputs:
|
||||||
; r1: screen address
|
; r1: screen address
|
||||||
; r2: sprite address
|
; r2: sprite address
|
||||||
; r3: rotation
|
|
||||||
|
|
||||||
; Outputs:
|
; Outputs:
|
||||||
|
|
||||||
; Locals:
|
; Locals:
|
||||||
; r1: current screen pixel address
|
; r1: current screen pixel address
|
||||||
; r4: x
|
; r2: current sprite pixel address
|
||||||
; r5: y
|
; r3: x
|
||||||
; r6: current sprite pixel address
|
; r4: color
|
||||||
; r7: color
|
; r5: sprite last pixel address + 1
|
||||||
; r8: x increment
|
|
||||||
; r9: y increment
|
|
||||||
; */
|
; */
|
||||||
draw_sprite:
|
draw_sprite:
|
||||||
push r1
|
push r1
|
||||||
@@ -203,67 +150,25 @@ draw_sprite:
|
|||||||
push r3
|
push r3
|
||||||
push r4
|
push r4
|
||||||
push r5
|
push r5
|
||||||
push r6
|
|
||||||
push r7
|
|
||||||
push r8
|
|
||||||
push r9
|
|
||||||
|
|
||||||
mov r6, r2
|
|
||||||
|
|
||||||
; rotation
|
|
||||||
draw_sprite_cmp_rotation_0:
|
|
||||||
cmp r3, sprites.rotation_0
|
|
||||||
jne draw_sprite_cmp_rotation_90
|
|
||||||
mov r8, 1
|
|
||||||
mov r9, 0
|
|
||||||
jmp draw_sprite_loop_init
|
|
||||||
draw_sprite_cmp_rotation_90:
|
|
||||||
cmp r3, sprites.rotation_90
|
|
||||||
jne draw_sprite_cmp_rotation_180
|
|
||||||
add r6, r6, sprites.size
|
|
||||||
sub r6, r6, sprites.width
|
|
||||||
sub r8, zr, sprites.width
|
|
||||||
mov r9, sprites.size
|
|
||||||
add r9, r9, 1
|
|
||||||
jmp draw_sprite_loop_init
|
|
||||||
draw_sprite_cmp_rotation_180:
|
|
||||||
cmp r3, sprites.rotation_180
|
|
||||||
jne draw_sprite_cmp_rotation_270
|
|
||||||
add r6, r6, sprites.size
|
|
||||||
sub r6, r6, 1
|
|
||||||
sub r8, zr, 1
|
|
||||||
mov r9, 0
|
|
||||||
jmp draw_sprite_loop_init
|
|
||||||
draw_sprite_cmp_rotation_270:
|
|
||||||
add r6, r6, sprites.width
|
|
||||||
sub r6, r6, 1
|
|
||||||
mov r8, sprites.width
|
|
||||||
sub r9, zr, sprites.size
|
|
||||||
sub r9, r9, 1
|
|
||||||
|
|
||||||
draw_sprite_loop_init:
|
add r5, r2, sprites.size
|
||||||
mov r4, 0
|
|
||||||
mov r5, 0
|
mov r3, 0
|
||||||
draw_sprite_loop:
|
draw_sprite_loop:
|
||||||
load_8 r7, [r6]
|
load_8 r4, [r2]
|
||||||
store_8 [r1], r7
|
store_8 [r1], r4
|
||||||
add r4, r4, 1
|
|
||||||
add r1, r1, 1
|
add r1, r1, 1
|
||||||
add r6, r6, r8
|
add r2, r2, 1
|
||||||
cmp r4, sprites.width
|
add r3, r3, 1
|
||||||
|
cmp r3, sprites.width
|
||||||
jne draw_sprite_loop
|
jne draw_sprite_loop
|
||||||
mov r4, 0
|
mov r3, 0
|
||||||
add r6, r6, r9
|
|
||||||
add r1, r1, screen.width
|
add r1, r1, screen.width
|
||||||
sub r1, r1, sprites.width
|
sub r1, r1, sprites.width
|
||||||
add r5, r5, 1
|
cmp r5, r2
|
||||||
cmp r5, sprites.width
|
|
||||||
jne draw_sprite_loop
|
jne draw_sprite_loop
|
||||||
|
|
||||||
pop r9
|
|
||||||
pop r8
|
|
||||||
pop r7
|
|
||||||
pop r6
|
|
||||||
pop r5
|
pop r5
|
||||||
pop r4
|
pop r4
|
||||||
pop r3
|
pop r3
|
||||||
|
|||||||
@@ -1,171 +0,0 @@
|
|||||||
include ../consts/offsets
|
|
||||||
include ../consts/map
|
|
||||||
include ../consts/sprites
|
|
||||||
|
|
||||||
; /* Return the sprite id and rotation for the given map coordinates
|
|
||||||
|
|
||||||
; Inputs:
|
|
||||||
; r1: x map coord
|
|
||||||
; r2: y map coord
|
|
||||||
|
|
||||||
; Outputs:
|
|
||||||
; r12: sprite rotation
|
|
||||||
; r13: sprite id
|
|
||||||
|
|
||||||
; Locals:
|
|
||||||
; r3: tile id
|
|
||||||
; r4: map offset
|
|
||||||
; r5: counter
|
|
||||||
; r6: left tile id
|
|
||||||
; r7: up tile id
|
|
||||||
; r8: right tile id
|
|
||||||
; r9: down tile id
|
|
||||||
; */
|
|
||||||
pub sprite_rotation.get_sprite_id_and_rotation:
|
|
||||||
push r1
|
|
||||||
push r2
|
|
||||||
push r3
|
|
||||||
push r4
|
|
||||||
push r5
|
|
||||||
push r6
|
|
||||||
push r7
|
|
||||||
push r8
|
|
||||||
push r9
|
|
||||||
|
|
||||||
add r4, r1, map
|
|
||||||
mov r5, 0
|
|
||||||
get_sprite_id_and_rotation_map_row_loop:
|
|
||||||
cmp r5, r2
|
|
||||||
je get_sprite_id_and_rotation_map_row_loop_end
|
|
||||||
add r4, r4, map.width
|
|
||||||
add r5, r5, 1
|
|
||||||
jmp get_sprite_id_and_rotation_map_row_loop
|
|
||||||
get_sprite_id_and_rotation_map_row_loop_end:
|
|
||||||
|
|
||||||
mov r12, sprites.rotation_0 ; default rotation
|
|
||||||
|
|
||||||
load_8 r3, [r4]
|
|
||||||
lsl r3, r3, 3 ; 2*instruction_size = *8 = <<3
|
|
||||||
add r3, r3, get_sprite_id_and_rotation_jump_table
|
|
||||||
jmp r3
|
|
||||||
|
|
||||||
get_sprite_id_and_rotation_jump_table:
|
|
||||||
; tile_empty
|
|
||||||
mov r13, sprites.empty
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
; tiles_wall
|
|
||||||
jmp get_sprite_id_and_rotation_wall
|
|
||||||
nop
|
|
||||||
; tile_coin
|
|
||||||
mov r13, sprites.coin
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
|
|
||||||
get_sprite_id_and_rotation_wall:
|
|
||||||
mov r6, 0
|
|
||||||
mov r7, 0
|
|
||||||
mov r8, 0
|
|
||||||
mov r9, 0
|
|
||||||
|
|
||||||
get_sprite_id_and_rotation_cmp_left:
|
|
||||||
cmp r1, 0
|
|
||||||
je get_sprite_id_and_rotation_cmp_up
|
|
||||||
sub r4, r4, 1
|
|
||||||
load_8 r6, [r4]
|
|
||||||
add r4, r4, 1
|
|
||||||
get_sprite_id_and_rotation_cmp_up:
|
|
||||||
cmp r2, 0
|
|
||||||
je get_sprite_id_and_rotation_cmp_right
|
|
||||||
sub r4, r4, map.width
|
|
||||||
load_8 r7, [r4]
|
|
||||||
add r4, r4, map.width
|
|
||||||
get_sprite_id_and_rotation_cmp_right:
|
|
||||||
cmp r1, map.max_x
|
|
||||||
je get_sprite_id_and_rotation_cmp_down
|
|
||||||
add r4, r4, 1
|
|
||||||
load_8 r8, [r4]
|
|
||||||
sub r4, r4, 1
|
|
||||||
get_sprite_id_and_rotation_cmp_down:
|
|
||||||
cmp r2, map.max_y
|
|
||||||
je get_sprite_id_and_rotation_check_connections
|
|
||||||
add r4, r4, map.width
|
|
||||||
load_8 r9, [r4]
|
|
||||||
sub r4, r4, map.width
|
|
||||||
|
|
||||||
get_sprite_id_and_rotation_check_connections:
|
|
||||||
get_sprite_id_and_rotation_straight_0:
|
|
||||||
cmp r7, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_straight_90
|
|
||||||
cmp r9, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_straight_90
|
|
||||||
mov r12, sprites.rotation_0
|
|
||||||
mov r13, sprites.wall_straight
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
get_sprite_id_and_rotation_straight_90:
|
|
||||||
cmp r6, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_corner_0
|
|
||||||
cmp r8, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_corner_0
|
|
||||||
mov r12, sprites.rotation_90
|
|
||||||
mov r13, sprites.wall_straight
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
|
|
||||||
get_sprite_id_and_rotation_corner_0:
|
|
||||||
cmp r6, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_corner_180
|
|
||||||
cmp r9, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_corner_90
|
|
||||||
mov r12,sprites.rotation_0
|
|
||||||
mov r13, sprites.wall_corner
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
get_sprite_id_and_rotation_corner_90:
|
|
||||||
cmp r7, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_end_90
|
|
||||||
mov r12,sprites.rotation_90
|
|
||||||
mov r13, sprites.wall_corner
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
get_sprite_id_and_rotation_corner_180:
|
|
||||||
cmp r8, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_end_0
|
|
||||||
cmp r7, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_corner_270
|
|
||||||
mov r12,sprites.rotation_180
|
|
||||||
mov r13, sprites.wall_corner
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
get_sprite_id_and_rotation_corner_270:
|
|
||||||
cmp r9, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_end_270
|
|
||||||
mov r12,sprites.rotation_270
|
|
||||||
mov r13, sprites.wall_corner
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
|
|
||||||
get_sprite_id_and_rotation_end_0:
|
|
||||||
cmp r9, map.tiles.wall
|
|
||||||
jne get_sprite_id_and_rotation_end_180
|
|
||||||
mov r12,sprites.rotation_0
|
|
||||||
mov r13, sprites.wall_end
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
get_sprite_id_and_rotation_end_90:
|
|
||||||
mov r12,sprites.rotation_90
|
|
||||||
mov r13, sprites.wall_end
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
get_sprite_id_and_rotation_end_180:
|
|
||||||
mov r12,sprites.rotation_180
|
|
||||||
mov r13, sprites.wall_end
|
|
||||||
jmp get_sprite_id_and_rotation_return
|
|
||||||
get_sprite_id_and_rotation_end_270:
|
|
||||||
mov r12,sprites.rotation_270
|
|
||||||
mov r13, sprites.wall_end
|
|
||||||
;jmp get_sprite_id_and_rotation_return
|
|
||||||
|
|
||||||
get_sprite_id_and_rotation_return:
|
|
||||||
pop r9
|
|
||||||
pop r8
|
|
||||||
pop r7
|
|
||||||
pop r6
|
|
||||||
pop r5
|
|
||||||
pop r4
|
|
||||||
pop r3
|
|
||||||
pop r2
|
|
||||||
pop r1
|
|
||||||
|
|
||||||
ret
|
|
||||||
31
src/main.asm
31
src/main.asm
@@ -2,8 +2,6 @@ include consts/screen
|
|||||||
|
|
||||||
include init
|
include init
|
||||||
|
|
||||||
call drawing.draw_whole_map
|
|
||||||
|
|
||||||
;
|
;
|
||||||
; State initialization
|
; State initialization
|
||||||
;
|
;
|
||||||
@@ -22,8 +20,7 @@ store_8 [r6], r2
|
|||||||
add r6, r6, 1
|
add r6, r6, 1
|
||||||
store_8 [r6], r5
|
store_8 [r6], r5
|
||||||
|
|
||||||
mov r3, sprites.rotation_0
|
mov r3, sprites.robot
|
||||||
mov r4, sprites.robot
|
|
||||||
call drawing.draw_sprite_at_map_coord
|
call drawing.draw_sprite_at_map_coord
|
||||||
|
|
||||||
; Ghost
|
; Ghost
|
||||||
@@ -41,8 +38,7 @@ store_8 [r6], r2
|
|||||||
add r6, r6, 1
|
add r6, r6, 1
|
||||||
store_8 [r6], r5
|
store_8 [r6], r5
|
||||||
|
|
||||||
mov r3, sprites.rotation_0
|
mov r3, sprites.ghost
|
||||||
mov r4, sprites.ghost
|
|
||||||
call drawing.draw_sprite_at_map_coord
|
call drawing.draw_sprite_at_map_coord
|
||||||
|
|
||||||
;
|
;
|
||||||
@@ -229,15 +225,13 @@ game_loop:
|
|||||||
; clear old position
|
; clear old position
|
||||||
mov r1, r2
|
mov r1, r2
|
||||||
mov r2, r3
|
mov r2, r3
|
||||||
mov r3, sprites.rotation_0
|
mov r3, sprites.empty
|
||||||
mov r4, sprites.empty
|
|
||||||
call drawing.draw_sprite_at_map_coord
|
call drawing.draw_sprite_at_map_coord
|
||||||
|
|
||||||
; draw robot on new position
|
; draw robot on new position
|
||||||
mov r1, r5
|
mov r1, r5
|
||||||
mov r2, r6
|
mov r2, r6
|
||||||
mov r3, sprites.rotation_0
|
mov r3, sprites.robot
|
||||||
mov r4, sprites.robot
|
|
||||||
call drawing.draw_sprite_at_map_coord
|
call drawing.draw_sprite_at_map_coord
|
||||||
|
|
||||||
|
|
||||||
@@ -295,34 +289,27 @@ game_loop:
|
|||||||
store_8 [r1], r8
|
store_8 [r1], r8
|
||||||
|
|
||||||
; get tile at previous position
|
; get tile at previous position
|
||||||
push r2
|
|
||||||
mov r1, r2
|
mov r1, r2
|
||||||
mov r2, r3
|
mov r2, r3
|
||||||
call game.get_tile_address_from_map_coord
|
call game.get_tile_address_from_map_coord
|
||||||
mov r9, r13
|
load_8 r13, [r13]
|
||||||
pop r2
|
|
||||||
|
|
||||||
; draw tile at previous position
|
; draw tile at previous position
|
||||||
load_8 r1, [r9]
|
cmp r13, map.tiles.coin
|
||||||
cmp r1, map.tiles.coin
|
|
||||||
je game_loop_ghost_movement_old_tile_coin
|
je game_loop_ghost_movement_old_tile_coin
|
||||||
; old tile empty
|
; old tile empty
|
||||||
mov r4, sprites.empty
|
mov r3, sprites.empty
|
||||||
jmp game_loop_ghost_movement_draw_old_tile
|
jmp game_loop_ghost_movement_draw_old_tile
|
||||||
game_loop_ghost_movement_old_tile_coin:
|
game_loop_ghost_movement_old_tile_coin:
|
||||||
mov r4, sprites.coin
|
mov r3, sprites.coin
|
||||||
|
|
||||||
game_loop_ghost_movement_draw_old_tile:
|
game_loop_ghost_movement_draw_old_tile:
|
||||||
mov r1, r2
|
|
||||||
mov r2, r3
|
|
||||||
mov r3, sprites.rotation_0
|
|
||||||
call drawing.draw_sprite_at_map_coord
|
call drawing.draw_sprite_at_map_coord
|
||||||
|
|
||||||
; draw ghost on new position
|
; draw ghost on new position
|
||||||
mov r1, r7
|
mov r1, r7
|
||||||
mov r2, r8
|
mov r2, r8
|
||||||
mov r3, sprites.rotation_0
|
mov r3, sprites.ghost
|
||||||
mov r4, sprites.ghost
|
|
||||||
call drawing.draw_sprite_at_map_coord
|
call drawing.draw_sprite_at_map_coord
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
pub ptr.textures_addresses:
|
pub ptr.textures_addresses:
|
||||||
U32 0 ; empty
|
U32 0 ; empty
|
||||||
U32 0 ; placeholder
|
U32 0 ; placeholder
|
||||||
U32 0 ; wall_end
|
|
||||||
U32 0 ; wall_straight
|
|
||||||
U32 0 ; wall_corner
|
|
||||||
U32 0 ; robot
|
U32 0 ; robot
|
||||||
U32 0 ; ghost
|
U32 0 ; ghost
|
||||||
U32 0 ; coin
|
U32 0 ; coin
|
||||||
@@ -31,5 +28,3 @@ U8 0 ; x coord
|
|||||||
U8 0 ; y coord
|
U8 0 ; y coord
|
||||||
U8 0 ; direction
|
U8 0 ; direction
|
||||||
U8 0 ; [padding]
|
U8 0 ; [padding]
|
||||||
|
|
||||||
pub ptr.screen:
|
|
||||||
@@ -23,4 +23,4 @@ Resolution ID | Tile size (in pixels) | Comment
|
|||||||
-- | -- | --
|
-- | -- | --
|
||||||
`0` | `5x5` | with a reminder of 5 pixels en width and 5 pixels in height.
|
`0` | `5x5` | with a reminder of 5 pixels en width and 5 pixels in height.
|
||||||
`1` | `10x10` | with a reminder of 10w and 10h
|
`1` | `10x10` | with a reminder of 10w and 10h
|
||||||
`2` | `17x17` | no reminder
|
`2` | `17x17` | with a reminder of 1w and 5h
|
||||||
|
|||||||
Reference in New Issue
Block a user