@let stack_segment 0x8000 @let vector_table 0x10 @let mmio_segment 0xE000 @let terminal_addr 0xE000 @let keyboard_addr 0xE001 @let sprite_mem 0xE800 @address vector_table keyboard_isr ; 0x10 ISR0 hlt_isr ; 0x11 ISR1 hlt_isr ; 0x12 ISR2 hlt_isr ; 0x13 ISR3 stack_segment ; 0x14 Stack address 0x0 ; 0x15 terminal_addr ; 0x16 Terminal peripheral address keyboard_addr ; 0x17 Keyboard peripheral address @label hlt_isr ldi 0x55 RE hlt @label keyboard_isr spu RA ; use RA, RB spu RB ldi 0x17 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 0x16 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 0x14 RA ldr RA RF jpi main @address program_segment ; set up address for program code