--- /dev/null
+( host registers )
+host_ctrl=0x02004000
+host_flags=0x02004001
+host_mbox=0x02004002
+host_swled=0x02004003
+host_sseg0=0x02004004
+host_sseg1=0x02004005
+host_sseg2=0x02004006
+host_sseg3=0x02004007
+
+( ps2 registers )
+ps2_ctrl=0x02004008
+ps2_imask=0x02004009
+ps2_iflag=0x0200400a
+ps2_error=0x0200400b
+ps2_data=0x0200400c
+
+( rs232 registers )
+rs232_ctrl=0x02004010
+rs232_baudl=0x02004011
+rs232_baudh=0x02004012
+rs232_imask=0x02004013
+rs232_iflag=0x02004014
+rs232_data=0x02004015
+
+( ivec -- )
+isr:
+ dup jz reset
+
+ dup + dup + #32 isr_jumptable + @32 >r ;
+
+isr_jumptable:
+ reset isr_1 isr_2 isr_3
+
+isr_1:
+ #8 0x11i8 #32 host_swled !8 drop
+ jmp halt
+
+isr_2:
+ #8 0x22i8 #32 host_swled !8 drop
+ jmp halt
+
+isr_3:
+ #8 0x33i8 #32 host_swled !8 drop
+ jmp halt
+
+ dup #32 host_swled !8 drop
+ #32 rs232_data @8
+ #32 rs232_data !8 drop
+ ien ;
+
+reset:
+ ( Write ISR vec to LEDs )
+ #32 host_swled !8
+
+ ( 9600 baud, enable Tx/Rx, write "A" )
+ #8 0x14i8 #32 rs232_baudh !8 drop
+ #8 0x58i8 #32 rs232_baudl !8 drop
+ #8 0x01i8 #32 rs232_imask !8 drop
+ #8 0x03i8 #32 rs232_ctrl !8 drop
+ #8 0x41i8 #32 rs232_data !8 drop
+ #8 0x41i8 #32 rs232_data !8 drop
+ #8 0x41i8 #32 rs232_data !8 drop
+ #8 0x41i8 #32 rs232_data !8 drop
+
+ ien
+ ( Wait for a flag )
+wait:
+ #32 host_flags @8
+ jz wait
+
+ #32 host_flags @8
+ ( #32 host_swled !8 )
+ #32 host_flags !8 drop
+
+ #8 0x42i8 #32 rs232_data !8 drop
+ jmp wait
+
+ ( Write a value to ram and read it back )
+
+ ( Read value from uart and echo )
+ ( #32 rs232_data @8 )
+ ( #32 rs232_data !8 drop )
+
+ ( Enable uart rx interrupt )
+ ( #8 0x01i8 #32 rs232_imask !8 drop )
+
+ ( Drop return address, enable interrupts, and halt )
+ ( drop ien )
+halt:
+ jmp halt
+
--- /dev/null
+( host registers )
+host_ctrl=0x02004000
+host_flags=0x02004001
+host_mbox=0x02004002
+host_swled=0x02004003
+host_sseg0=0x02004004
+host_sseg1=0x02004005
+host_sseg2=0x02004006
+host_sseg3=0x02004007
+
+( ps2 registers )
+ps2_ctrl=0x02004008
+ps2_imask=0x02004009
+ps2_iflag=0x0200400a
+ps2_error=0x0200400b
+ps2_data=0x0200400c
+
+( rs232 registers )
+uart_ctrl=0x02004010
+uart_baudl=0x02004011
+uart_baudh=0x02004012
+uart_imask=0x02004013
+uart_iflag=0x02004014
+uart_data=0x02004015
+
+( timer registers )
+timer0_ctrl=0x02004018
+timer0_count_l=0x02004019
+timer0_count_m=0x0200401a
+timer0_count_h=0x0200401b
+timer1_ctrl=0x0200401c
+timer1_count_l=0x0200401d
+timer1_count_m=0x0200401e
+timer1_count_h=0x0200401f
+
+
+( ivec -- )
+isr:
+ dup #8 5i8 - jn isr_unk
+ dup + dup + #32 isr_jumptable + @32 >r ;
+
+ align
+isr_jumptable:
+ isr_reset
+ isr_flags
+ isr_ps2
+ isr_uart
+ isr_timer0
+ isr_timer1
+
+
+( reset )
+isr_reset:
+ ( 9600 baud, enable Tx/Rx, write "A" )
+ #8 0x14i8 #32 uart_baudh !8 drop
+ #8 0x58i8 #32 uart_baudl !8 drop
+ #8 0x01i8 #32 uart_imask !8 drop
+ #8 0x13i8 #32 uart_ctrl !8 drop
+ #8 0x41i8 #32 uart_data !8 drop
+ #8 0x41i8 #32 uart_data !8 drop
+ #8 0x41i8 #32 uart_data !8 drop
+ #8 0x41i8 #32 uart_data !8 drop
+
+ ( Enable timer 0 with 1s period, auto-restart )
+ #8 0x02i8 #32 timer0_count_h !8 drop
+ #8 0xfai8 #32 timer0_count_m !8 drop
+ #8 0xf0i8 #32 timer0_count_l !8 drop
+ #8 0x0fi8 #32 timer0_ctrl !8 drop
+
+ ( enable interrupts and halt while waiting )
+ ien jmp start
+
+
+( host flags )
+isr_flags:
+ #32 host_flags @8
+ #32 host_swled !8
+ #32 host_flags !8 drop
+ ien ;
+
+
+( ps2 )
+isr_ps2:
+ #8 0xa5i8 #32 host_swled !8 drop
+ jmp halt
+
+
+( uart )
+isr_uart:
+ ( echo )
+ #32 uart_data @8
+ #32 uart_data !8 drop
+ ien ;
+
+
+( timer 0 )
+isr_timer0:
+ ( clear interrupt flag )
+ #32 timer0_ctrl @8
+ #32 timer0_ctrl !8 drop
+
+ ( say hello )
+ #8 0x41i8 #32 uart_data !8 drop
+
+ ien ;
+
+
+( timer 1 )
+isr_timer1:
+ ( clear interrupt flag )
+ #32 timer1_ctrl @8
+ #32 timer1_ctrl !8 drop
+ ien ;
+
+
+( unknown )
+isr_unk:
+ #8 0xffi8 #32 host_swled !8 drop
+ jmp halt
+
+
+start:
+halt:
+ jmp halt
( reset )
isr_0:
( write something to seven seg display )
- #8 0x3ci8 #32 host_sseg0 !8
- #8 0xa5i8 #32 host_sseg1 !8
- #8 0x5ai8 #32 host_sseg2 !8
- #8 0xc3i8 #32 host_sseg3 !8
+ #8 0x3ci8 #32 host_sseg0 !8 drop
+ #8 0xa5i8 #32 host_sseg1 !8 drop
+ #8 0x5ai8 #32 host_sseg2 !8 drop
+ #8 0xc3i8 #32 host_sseg3 !8 drop
( write 0x1458 to baud register - 9600 baud )
- #8 0x14i8 #32 rs232_baudh !8
- #8 0x58i8 #32 rs232_baudl !8
+ #8 0x14i8 #32 rs232_baudh !8 drop
+ #8 0x58i8 #32 rs232_baudl !8 drop
( enable rx ready interrupt )
- #8 0x01i8 #32 rs232_imask !8
+ #8 0x01i8 #32 rs232_imask !8 drop
( enable transmitter and receiver )
- #8 0x03i8 #32 rs232_ctrl !8
+ #8 0x03i8 #32 rs232_ctrl !8 drop
( Say hi )
- #8 0x41i8 #32 rs232_data !8
+ #8 0x41i8 #32 rs232_data !8 drop
- jmp halt
+ ien jmp halt
( host mailbox flag interrupt )
isr_1:
+ ( Read host flags, write to LEDs, then clear all )
+ #32 host_flags @8
+ #32 host_swled !8
+ #32 host_flags !8 drop
ien ;
( ps2 interrupt )
#32 rs232_iflag @8 #8 0x01i8 & jz _isr_3_ret
( [rs232_data] = [rs232_data] )
- #32 rs232_data dup @8 !8
+ #32 rs232_data @8
+ #32 rs232_data !8 drop
_isr_3_ret:
ien ;