diff options
| author | cheapie <cheapiephp@gmail.com> | 2026-11-05 05:02:41 -0600 |
|---|---|---|
| committer | cheapie <cheapiephp@gmail.com> | 2026-11-05 05:02:41 -0600 |
| commit | 747374b7e56717d39d6f5dbef7e1c04cbf0c5355 (patch) | |
| tree | af1f97dfdcbe28874e133f39e09a5168692fd6bf | |
| parent | 588c85a8463fa860b9cf36b8b669ee20a3e7b72b (diff) | |
| download | rvcontroller-747374b7e56717d39d6f5dbef7e1c04cbf0c5355.tar rvcontroller-747374b7e56717d39d6f5dbef7e1c04cbf0c5355.tar.gz rvcontroller-747374b7e56717d39d6f5dbef7e1c04cbf0c5355.tar.bz2 rvcontroller-747374b7e56717d39d6f5dbef7e1c04cbf0c5355.tar.xz rvcontroller-747374b7e56717d39d6f5dbef7e1c04cbf0c5355.zip | |
More work on rrxing2
| -rw-r--r-- | assembly/rrxing2/rrxing2.S | 7 | ||||
| -rw-r--r-- | assembly/rrxing2/ui.S | 145 |
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" |
