diff options
author | Thomas Albers Raviola <thomas@thomaslabs.org> | 2025-02-12 01:27:44 +0100 |
---|---|---|
committer | Thomas Albers Raviola <thomas@thomaslabs.org> | 2025-02-12 01:27:44 +0100 |
commit | 779b9834e30de1ba0b4f0755388bebd0c45aa1dc (patch) | |
tree | 218edb656e329884e4b9cab7e84f4ba4b4af0c4a /boot/boot.asm | |
parent | 8ac78b9953908d2a4ffece855296fb7597440cce (diff) |
Restructure rom image and use dependencies for makefiles
Diffstat (limited to 'boot/boot.asm')
-rw-r--r-- | boot/boot.asm | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/boot/boot.asm b/boot/boot.asm new file mode 100644 index 0000000..b598d6e --- /dev/null +++ b/boot/boot.asm @@ -0,0 +1,128 @@ +#include <hardware.h> + .module boot + .globl _main + + .area _HEADER (ABS) + .org 0x0000 +rst_0: + di + jr start + .org 0x0008 +rst_1: + .org 0x0010 +rst_2: + .org 0x0018 +rst_3: + .org 0x0020 +rst_4: + .org 0x0028 +rst_5: + .org 0x0030 +rst_6: + .org 0x0038 +rst_7: + .org 0x0040 +start: + xor a + ld i, a + ld sp, #0x0000 + ;; Init PIO + ld a, #PIO_MODE_3 + out (PORT_B_CTRL), a + ld a, #0x7F + out (PORT_B_CTRL), a + ;; Check keys + in a, (PORT_B_DATA) + bit KEY2_BIT, a + jr z, development_mode + bit KEY3_BIT, a + jr z, command_line + ;; No payload selected; try to load os from sd card + jr temporary_payload +main: + call gsinit + call _main +1$: + halt + jr 1$ + +;;; ROM Payloads +development_mode: + ld hl, #0x1000 ; src + ld de, #0x8000 ; dest + ld bc, #0x1000 ; size + ldir + jp 0x8000 +command_line: + ld hl, #0x2000 ; src + ld de, #0x8000 ; dest + ld bc, #0x1000 ; size + ldir + jp 0x8000 +temporary_payload: + ld hl, #0x3000 ; src + ld de, #0x8000 ; dest + ld bc, #0x5000 ; size + ldir + jp 0x8000 + +;;; Interrupt table + .org 0x0100 +_ctc0_isr_ptr:: + .dw #0 +_ctc1_isr_ptr:: + .dw #0 +_ctc2_isr_ptr:: + .dw #0 +_ctc3_isr_ptr:: + .dw #0 +_port_a_isr_ptr:: + .dw #0 +_port_b_isr_ptr:: + .dw #0 +_rx_isr_ptr:: + .dw #0 + + ;; Ordering of segments for the linker. + .area _HOME + .area _CODE + .area _INITIALIZER + .area _GSINIT + .area _GSFINAL + .area _DATA + .area _INITIALIZED + .area _BSEG + .area _BSS + .area _HEAP + .area _CODE + .area _GSINIT + +gsinit: + ;; Default-initialized global variables. + ld bc, #l__DATA + ld a, b + or a, c + jr Z, zeroed_data + ld hl, #s__DATA + ld (hl), #0x00 + dec bc + ld a, b + or a, c + jr Z, zeroed_data + ld e, l + ld d, h + inc de + ldir +zeroed_data: + ;; Explicitly initialized global variables. + ld bc, #l__INITIALIZER + ld a, b + or a, c + jr Z, gsinit_next + ld de, #s__INITIALIZED + ld hl, #s__INITIALIZER + ldir + +gsinit_next: + .area _GSFINAL + ret |