diff options
Diffstat (limited to 'src/crt0.asm')
-rw-r--r-- | src/crt0.asm | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/crt0.asm b/src/crt0.asm new file mode 100644 index 0000000..71f35c5 --- /dev/null +++ b/src/crt0.asm @@ -0,0 +1,113 @@ +#include <zeta/zeta.h> + + .module crt0 + .globl _main + + .area _HEADER (ABS) + ;; Reset vector + .org 0x0000 + ld sp, #0x00 + xor a + ld i, a + jp init + ;; ISR table + .org 0x0010 +_ctc0_isr_ptr: + .dw #0 +_ctc1_isr_ptr: + .dw #0 +_ctc2_isr_ptr: + .dw #0 + .globl _ctc3_isr_ptr +_ctc3_isr_ptr: + .dw #_ctc3_isr + .globl _rx_isr_ptr +_rx_isr_ptr: + .dw #_rx_isr + ;; Init code +init: + ;; Init windows + xor a + out (WIN_0_CTRL), A + ld a, #0x80 + out (WIN_1_CTRL), A + ld a, #0x81 + out (WIN_2_CTRL), A + ld a, #0x82 + out (WIN_3_CTRL), A + + ;; Enable extended memory + ld a, #0x01 + out (#0x84), A + + ;; Disable PIO interrupts + ld a, #0x07 + out (PORT_A_CTRL), a + ld a, #0x07 + out (PORT_B_CTRL), a + + ld a, #PIO_MODE_3 + out (#PORT_A_CTRL), a + xor a + out (#PORT_A_CTRL), a + + + ld a, #1 + ld b, #1 +2$: + xor b + out (PORT_A_DATA), a + jr 2$ + + call gsinit + call _main +1$: + halt + jr 1$ + + ;; 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 |