; vector table fields @let vector_table 0x10 @let vt_ISRO 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 ; memory segments @let stack_segment 0x8000 @let mmio_segment 0xE000 @let terminal_addr 0xE000 @let keyboard_addr 0xE001 @let gr_mode_addr 0xE002 @let sprite_mem 0xE800 ; graphics mode settings @let gr_disabled_mode 0b00 @let gr_text_mode 0b01 @let gr_sprite_mode 0b10 @address vector_table keyboard_isr ; 0x10 hlt_isr ; 0x11 hlt_isr ; 0x12 hlt_isr ; 0x13 stack_segment ; 0x14 terminal_addr ; 0x15 keyboard_addr ; 0x16 gr_mode_addr ; 0x17 @label hlt_isr ldi 0x55 RE hlt @label keyboard_isr spu RA ; use RA, RB spu RB ldi vt_kb_pp_addr RA ; RA := 0x17 Keyboard peripheral address pointer ldr RA RA ; RA := 0xE001 Keyboard peripheral address deref ldr RA RA ; RA := <16-bit keyboard character code> from MMIO register ldi vt_term_pp_addr RB ; RB := 0x16 Terminal peripheral address pointer ldr RB RB ; RB := 0xE000 Terminal peripheral address deref str RA RB ; terminal <- character code spo RB ; restore RA, RB spo RA rti @label program_segment @address 0x0 ; set up stack pointer to point to beginning of stack segment ldi vt_stack_addr RA ldr RA RF ; 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 @address program_segment ; set up address for program code