aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_asm/builtin_asm/bootstrap.atk16
blob: 2e06fb0361a084e4fb931c3489eabe0c48adac16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
@let SP              RH

; memory segments
@let stack_segment   0x8000
@let heap_segment    0xE7EF ; grows down from 0xE7EF until SP
@let mmio_segment    0xE7F0
@let terminal_addr   0xE7F0
@let keyboard_addr   0xE7F1
@let gr_mode_addr    0xE7F2
@let iset_addr       0xE7F3
@let sprite_mem      0xE800
@let text_mem        0xF800 ; to 0xFFFF
; note: sprite memory & text memory can use the same space
; since they are never used at the same time


; graphics mode settings
@let gr_disabled_mode 0b00
@let gr_text_mode     0b01
@let gr_sprite_mode   0b10

; vector table fields
@let vector_table    0x10
@let vt_ISR0         0x10 ; ISR0
@let vt_ISR1         0x11 ; ISR1
@let vt_ISR2         0x12 ; ISR2
@let vt_ISR3         0x13 ; ISR3
@let vt_stack_addr   0x14 ; Stack address
@let vt_term_pp_addr 0x15 ; Terminal peripheral address
@let vt_kb_pp_addr   0x16 ; Keyboard peripheral address
@let vt_gr_mode_addr 0x17 ; Graphics mode setting address
@let vt_sprite_mem   0x18 ; Sprite memory address
@let vt_text_mem     0x19 ; Text memory buffer address
@let vt_iset_addr    0x1A ; Interrupt set/clear address

@address vector_table
  no_op_isr      ; 0x10
  no_op_isr      ; 0x11
  no_op_isr      ; 0x12
  no_op_isr      ; 0x13
  stack_segment  ; 0x14
  terminal_addr  ; 0x15
  keyboard_addr  ; 0x16
  gr_mode_addr   ; 0x17
  sprite_mem     ; 0x18
  text_mem       ; 0x19
  iset_addr      ; 0x1A

@label no_op_isr
  rti

; Define data segment location to this address
; Programs can use `@data label value` to inject data here
@label data_segment
@data_segment

; Example ISR for keyboard to terminal
; @label keyboard_to_terminal_isr
;   spu RA
;   spu RB
;   ldi vt_kb_pp_addr RA    ; RA := Keyboard peripheral address pointer
;   ldr RA RA               ; RA := Keyboard peripheral address deref
;   ldr RA RA               ; RA := <16-bit keyboard character code> from MMIO register
;   ldi vt_term_pp_addr RB  ; RB := Terminal peripheral address pointer
;   ldr RB RB               ; RB := Terminal peripheral address deref
;   str RA RB               ; terminal <- character code (ASCII?)
;   mov RA RE               ; RE := character code (for debugging)
;   spo RB
;   spo RA
;   rti

@label program_segment

; define short prelude that sets up vital instructions
; NOTE: must be shorter than the vector table offset
@address 0x0
; set up stack pointer to point to beginning of stack segment
  ldi vt_stack_addr RA
  ldr RA SP
  jpi program_segment

@address program_segment
; set graphics mode to disabled
  ldi vt_gr_mode_addr RA
  ldr RA RA
  ldi gr_disabled_mode RB
  str RB RA
; jump to main (user defined)
  jpi main