aboutsummaryrefslogtreecommitdiff
path: root/boot/boot.asm
diff options
context:
space:
mode:
Diffstat (limited to 'boot/boot.asm')
-rw-r--r--boot/boot.asm128
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