#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