summaryrefslogtreecommitdiff
path: root/assembly
diff options
context:
space:
mode:
authorcheapie <cheapiephp@gmail.com>2026-11-05 05:02:41 -0600
committercheapie <cheapiephp@gmail.com>2026-11-05 05:02:41 -0600
commit747374b7e56717d39d6f5dbef7e1c04cbf0c5355 (patch)
treeaf1f97dfdcbe28874e133f39e09a5168692fd6bf /assembly
parent588c85a8463fa860b9cf36b8b669ee20a3e7b72b (diff)
downloadrvcontroller-747374b7e56717d39d6f5dbef7e1c04cbf0c5355.tar
rvcontroller-747374b7e56717d39d6f5dbef7e1c04cbf0c5355.tar.gz
rvcontroller-747374b7e56717d39d6f5dbef7e1c04cbf0c5355.tar.bz2
rvcontroller-747374b7e56717d39d6f5dbef7e1c04cbf0c5355.tar.xz
rvcontroller-747374b7e56717d39d6f5dbef7e1c04cbf0c5355.zip
More work on rrxing2
Diffstat (limited to 'assembly')
-rw-r--r--assembly/rrxing2/rrxing2.S7
-rw-r--r--assembly/rrxing2/ui.S145
2 files changed, 88 insertions, 64 deletions
diff --git a/assembly/rrxing2/rrxing2.S b/assembly/rrxing2/rrxing2.S
index 2118ca1..4501948 100644
--- a/assembly/rrxing2/rrxing2.S
+++ b/assembly/rrxing2/rrxing2.S
@@ -3,6 +3,8 @@ j _start
.include "util.S"
_start:
+li t0,0x400
+csrs mseccfg,t0 # Turn on MLPE (enable Zicfilp)
li sp,0x10000 # Set up stack pointer
la t0,handler
csrw mtvec,t0 # Set up trap handler
@@ -30,7 +32,7 @@ digiline_send signalchannel,lightredmsg
.align 2
handler:
-csrrw x31,mscratch,x31 # Free up x31 to hold the context address
+csrw mscratch,x31 # Free up x31 to hold the context address
la x31,hcontext # Using x register numbers here since trap handlers don't use the usual calling convention
sw x1,0(x31) # Save all the registers to the context
sd x2,4(x31) # Two at a time since we have Zilsd/Zclsd
@@ -51,9 +53,6 @@ sw x30,116(x31)
csrr x30,mscratch # Get the old x31 value back into a register
sw x30,120(x31) # and write that back out too
-li t0,0x400
-csrw mseccfg,t0 # Turn on MLPE (enable Zicfilp)
-
csrr t0,mcause # Read why the trap occurred
li t1,0x80000011 # Interrupt 17 = digilines
diff --git a/assembly/rrxing2/ui.S b/assembly/rrxing2/ui.S
index ef3734d..ba1611a 100644
--- a/assembly/rrxing2/ui.S
+++ b/assembly/rrxing2/ui.S
@@ -1,68 +1,39 @@
+# UI Pages
+# Page 0: Idle/Active Screen
+# Page 1: Main Menu
+# Page 2: Country Selection
+# Page 3: Timing Menu
+# Page 4: Gate Drop Time Adjustment
+# Page 5: Initial Active Time Adjustment
+# Page 6: Extension Time Adjustment
+# Page 7: Invalid Input Message for Time Adjustments
+# Page 8: Diagnostics Menu
+
mainloop:
-la ra,uidrawend # Will call a function to draw the current page, but it will return to the end instead of here
la t0,uipage
-lbu t0,0(t0)
-
-beqz t0,uidrawidle # Page 0: Idle screen
-
-li t1,1
-beq t0,t1,uidrawmainmenu # Page 1: Main menu
-
-li t1,2
-beq t0,t1,uidrawcountryselect # Page 2: Country selection
-
-li t1,3
-beq t0,t1,uidrawadjusttiming # Page 3: Timing adjustments
-
-li t1,4
-beq t0,t1,uidrawgatedropdelay # Page 4: Gate drop delay adjustment
-
-li t1,5
-beq t0,t1,uidrawinitialtime # Page 5: Initial active time adjustment
+lbu t0,0(t0) # Read the desired page number
+addi t2,t0,1 # Landing pad label will be page number + 1 (to avoid 0)
+slli t2,t2,12
+la t1,uidrawpointers
+sh2add t1,t0,t1 # Calculate the location of the pointer to the desired function
+lw t1,0(t1) # Load the pointer from memory
+jalr ra,t1,0 # And call it
-li t1,6
-beq t0,t1,uidrawextensiontime # Page 6: Extension time adjustment
-
-li t1,7
-beq t0,t1,uidrawinvalidinput # Page 7: Invalid (time) input
-
-j uidrawunknown
-
-uidrawend:
wfi # Program is entirely interrupt-driven, so wait for something to happen
j mainloop
handler_console:
li t0,262144 # 2^18, value of MCIP bit
csrc mip,t0
-la ra,uihandlingend # Will call a function to handle input for the current page, but it will return to the end instead of here
la t0,uipage
-lbu t0,0(t0)
-
-beqz t0,uihandleidle # Page 0: Idle screen
-
-li t1,1
-beq t0,t1,uihandlemainmenu # Page 1: Main menu
+lbu t0,0(t0) # Read the desired page number
+addi t2,t0,1 # Landing pad label will be page number + 1 (to avoid 0)
+slli t2,t2,12
+la t1,uihandlepointers
+sh2add t1,t0,t1 # Calculate the location of the pointer to the desired function
+lw t1,0(t1) # Load the pointer from memory
+jalr ra,t1,0 # And call it
-li t1,2
-beq t0,t1,uihandlecountryselect # Page 2: Country selection
-
-li t1,3
-beq t0,t1,uihandleadjusttiming # Page 3: Timing adjustments
-
-li t1,4
-beq t0,t1,uihandlegatedropdelay # Page 4: Gate drop delay adjustment
-
-li t1,5
-beq t0,t1,uihandleinitialtime # Page 5: Initial active time adjustment
-
-li t1,6
-beq t0,t1,uihandleextensiontime # Page 6: Extension time adjustment
-
-li t1,7
-beq t0,t1,uihandleinvalidinput # Page 7: Invalid (time) input
-
-uihandlingend:
li a7,131
ecall # Drop anything else the user may have typed
j handler_epilogue
@@ -77,7 +48,9 @@ addi a1,a1,1
j copystring
1: ret
+.align 2
uidrawidle:
+lpad 1
cm.push {ra},-16
la a0,uiidle+44
la a3,uiidle
@@ -102,7 +75,9 @@ li a7,4
ecall
cm.popret {ra},16
+.align 2
uihandleidle:
+lpad 1
cm.push {ra},-16
li a7,132
ecall # Read one character of input
@@ -130,13 +105,17 @@ jalr ra,t0,0 # And call that function
1: cm.popret {ra},16
ret
+.align 2
uidrawmainmenu:
+lpad 2
la a0,uimainmenu
li a7,4
ecall
ret
+.align 2
uihandlemainmenu:
+lpad 2
li a7,132
ecall # Read one character of input
li t0,'1'
@@ -149,19 +128,28 @@ bne a0,t0,1f
la t1,uipage
li t2,3
sb t2,0(t1) # User entered '2', go to timing adjustment (page 3)
-1: li t0,'0'
+1:li t0,'3'
+bne a0,t0,1f
+la t1,uipage
+li t2,8
+sb t2,0(t1) # User entered '3', go to diagnostics (page 8)
+1:li t0,'0'
bne a0,t0,1f
la t1,uipage
sb x0,0(t1) # User entered '0', go to idle screen (page 0)
1: ret
+.align 2
uidrawcountryselect:
+lpad 3
la a0,uicountryselect
li a7,4
ecall
ret
+.align 2
uihandlecountryselect:
+lpad 3
li a7,132
ecall # Read one character of input
li t0,'1'
@@ -194,13 +182,17 @@ li t2,1
sb t2,0(t1) # User entered '0', return to main menu (page 1) without changing anything
1: ret
+.align 2
uidrawadjusttiming:
+lpad 4
la a0,uiadjusttiming
li a7,4
ecall
ret
+.align 2
uihandleadjusttiming:
+lpad 4
li a7,132
ecall # Read one character of input
li t0,'1'
@@ -226,7 +218,9 @@ sb t2,0(t1) # User entered '0', go to main menu (page 1)
1: ret
ret
+.align 2
uidrawgatedropdelay:
+lpad 5
la a0,uigatedropdelay
la t0,gatedroptime
lbu t0,0(t0) # Load the current setting
@@ -241,7 +235,9 @@ li a7,4
ecall # And print it
ret
+.align 2
uihandlegatedropdelay:
+lpad 5
# Read first digit
li a7,132
ecall
@@ -290,7 +286,9 @@ li t1,3 # Go back to timing adjustment (page 3)
sb t1,0(t0)
ret
+.align 2
uidrawinitialtime:
+lpad 6
la a0,uiinitialtime
la t0,activetime
lbu t0,0(t0) # Load the current setting
@@ -305,7 +303,9 @@ li a7,4
ecall # And print it
ret
+.align 2
uihandleinitialtime:
+lpad 6
# Read first digit
li a7,132
ecall
@@ -354,7 +354,9 @@ li t1,3 # Go back to timing adjustment (page 3)
sb t1,0(t0)
ret
+.align 2
uidrawextensiontime:
+lpad 7
la a0,uiextensiontime
la t0,extensiontime
lbu t0,0(t0) # Load the current setting
@@ -369,7 +371,9 @@ li a7,4
ecall # And print it
ret
+.align 2
uihandleextensiontime:
+lpad 7
# Read first digit
li a7,132
ecall
@@ -418,35 +422,56 @@ li t1,3 # Go back to timing adjustment (page 3)
sb t1,0(t0)
ret
+.align 2
uidrawinvalidinput:
+lpad 8
la a0,uiinvalidinput
li a7,4
ecall
ret
+.align 2
uihandleinvalidinput:
+lpad 8
la t0,uipage
li t1,3 # Go back to timing adjustment (page 3)
sb t1,0(t0)
ret
-uidrawunknown:
-la a0,uiunknown
+.align 2
+uidrawdiagnostics:
+lpad 9
+la a0,uidiagnostics
li a7,4
ecall
ret
+.align 2
+uihandlediagnostics:
+lpad 9
+li a7,132
+ecall # Read one character of input
+li t0,'0'
+bne a0,t0,1f
+la t1,uipage
+li t0,1
+sb t0,0(t1) # User entered '0', go to main menu (page 1)
+1: ret
+
+uidrawpointers: .word uidrawidle,uidrawmainmenu,uidrawcountryselect,uidrawadjusttiming,uidrawgatedropdelay,uidrawinitialtime,uidrawextensiontime,uidrawinvalidinput,uidrawdiagnostics
+uihandlepointers: .word uihandleidle,uihandlemainmenu,uihandlecountryselect,uihandleadjusttiming,uihandlegatedropdelay,uihandleinitialtime,uihandleextensiontime,uihandleinvalidinput,uihandlediagnostics
+
uipage: .byte 0
uiidle: .asciz "\nRailroad Crossing 2\nfor RVController\nMode: ??\n\nPress 'm' for menu\n'a' to activate now"
uiactive: .asciz "\nRailroad Crossing 2\nfor RVController\nMode: ??\nCrossing is active\n\nPress 'm' for menu"
-uimainmenu: .asciz "\nMAIN MENU\n1: Change Country\n2: Adjust Timing\n\n\n0: Exit"
-uiunknown: .asciz "\nInternal error\n\nUnknown UI page\n\n\n"
+uimainmenu: .asciz "\nMAIN MENU\n1: Change Country\n2: Adjust Timing\n3: Diagnostics\n\n0: Exit"
uicountryselect: .asciz "\nCHANGE COUNTRY\n1: Germany\n2: United Kingdom\n3: United States\n\n0: Cancel"
-uiadjusttiming: .asciz "\nADJUST TIMING\n1: Gate Drop Delay\n2: Init. Active Time\n3: Extension Time\n\n0: Cancel"
+uiadjusttiming: .asciz "\nADJUST TIMING\n1: Gate Drop Delay\n2: Init. Active Time\n3: Extension Time\n\n0: Back"
uigatedropdelay: .asciz "\nGATE DROP DELAY\n\nCurrent: XX sec\n\nEnter new time or\n'c' to cancel:"
uiinitialtime: .asciz "\nINIT. ACTIVE TIME\n\nCurrent: XX sec\n\nEnter new time or\n'c' to cancel:"
uiextensiontime: .asciz "\nEXTENSION TIME\n\nCurrent: XX sec\n\nEnter new time or\n'c' to cancel:"
uiinvalidinput: .asciz "\nInvalid entry\n\nPress any key\n\n\n"
+uidiagnostics: .asciz "\nDIAGNOSTICS\n1: Output Test\n\n\n\n0: Back"
uide: .asciz "DE"
uiuk: .asciz "UK"
uius: .asciz "US"