Advertisement
Guest User

Untitled

a guest
Oct 4th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .equ PIXELS, 0x8000000
  2. .equ CHARS, 0x9000000
  3. .equ JTAG, 0x10001000
  4. .equ SIZE, 0x80000
  5.  
  6. STACK:
  7. .space 0x1000
  8. BUFFER:
  9. .space 0x1000
  10. MEMORY:
  11. .space 0x10000
  12.  
  13. console_cursor:
  14. .hword 0x0000 # x
  15. .hword 0x0000 # y
  16.  
  17. .equ vk_enter, 0x0a
  18. .equ vk_backspace, 0x7f
  19.  
  20. .equ _exit_, 0x01
  21. .equ _info_, 0x02
  22. .equ _clear_, 0x03
  23. .equ _help_, 0x04
  24.  
  25. .align 2
  26. version_message:
  27. .string "HardCoded (v 1.0.0) Nios II Command Line"
  28.  
  29. info_message:
  30. .string "This command tool was build by http://twitch.tv/hard_coded
  31. This message is a bit longer because of more lines
  32. Testing testing
  33. Last line :D !!!"
  34.  
  35. help_message:
  36. .string "This command shows all the available commands
  37.  
  38. help       Shows this message.
  39. clear      Clears the screen.
  40. info       Show info about the author.
  41. exit       Exits the console.\n"
  42.  
  43. error_message:
  44. .string "Invalid command\n"
  45.  
  46. command_0:
  47. .string "exit"
  48.  
  49. command_1:
  50. .string "info"
  51.  
  52. command_2:
  53. .string "clear"
  54.  
  55. command_3:
  56. .string "help"
  57.  
  58. .text
  59. .global _start
  60.  
  61. .macro COLOR reg, r, g, b
  62.     mov \reg, \r
  63.     roli \reg, \reg, 5
  64.     add \reg, \reg, \g
  65.     roli \reg, \reg, 6
  66.     add \reg, \reg, \b
  67. .endm
  68.  
  69. .macro MOD reg, a, b
  70.     PUSH r20
  71.     PUSH r21
  72.     movi r20, \b
  73.     div r20, \a, r20
  74.     movi r21, \b
  75.     mul r20, r20, r21
  76.     sub \reg, \a, r20
  77.     POP r21
  78.     POP r20
  79. .endm
  80.  
  81. .macro PUSH reg
  82.     subi sp, sp, 8
  83.     stw \reg, 0(sp)
  84. .endm
  85. .macro POP reg
  86.     ldw \reg, 0(sp)
  87.     addi sp, sp, 8
  88. .endm
  89. .macro PUSHA
  90.     subi sp, sp, 128
  91.     stw r8, 0(sp)
  92.     stw r9, 8(sp)
  93.     stw r10, 16(sp)
  94.     stw r11, 24(sp)
  95.     stw r12, 32(sp)
  96.     stw r13, 40(sp)
  97.     stw r14, 48(sp)
  98.     stw r15, 56(sp)
  99.     stw r16, 64(sp)
  100.     stw r17, 72(sp)
  101.     stw r18, 80(sp)
  102.     stw r19, 88(sp)
  103.     stw r20, 96(sp)
  104.     stw r21, 104(sp)
  105.     stw r22, 112(sp)
  106.     stw r23, 120(sp)
  107. .endm
  108. .macro POPA
  109.     ldw r8, 0(sp)
  110.     ldw r9, 8(sp)
  111.     ldw r10, 16(sp)
  112.     ldw r11, 24(sp)
  113.     ldw r12, 32(sp)
  114.     ldw r13, 40(sp)
  115.     ldw r14, 48(sp)
  116.     ldw r15, 56(sp)
  117.     ldw r16, 64(sp)
  118.     ldw r17, 72(sp)
  119.     ldw r18, 80(sp)
  120.     ldw r19, 88(sp)
  121.     ldw r20, 96(sp)
  122.     ldw r21, 104(sp)
  123.     ldw r22, 112(sp)
  124.     ldw r23, 120(sp)
  125.     addi sp, sp, 128
  126. .endm
  127.  
  128. .macro COMPARE_STRINGS str1, str2
  129.     PUSH r4
  130.     PUSH r5
  131.     mov r4, \str1
  132.     mov r5, \str2
  133.     call compare_zero_terminated_string
  134.     POP r5
  135.     POP r4
  136. .endm
  137.  
  138. .macro CONSOLE_POS x1, y1
  139.     PUSH r8
  140.     PUSH r9
  141.     movia r8, console_cursor
  142.     mov r9, \x1
  143.     sth r9, 0(r8)
  144.     mov r9, \y1
  145.     sth r9, 2(r8)
  146.     POP r9
  147.     POP r8
  148. .endm
  149.  
  150. .macro LOAD_CONSOLE_POS x1, y1
  151.     PUSH r8
  152.     movia r8, console_cursor
  153.     ldh \x1, 0(r8)
  154.     ldh \y1, 2(r8)
  155.     POP r8
  156. .endm
  157.  
  158. .macro CONSOLE_WRITE x, y, str
  159.     PUSH r6
  160.     PUSH r5
  161.     PUSH r4
  162.     movia r4, \str
  163.     mov r5, \x
  164.     mov r6, \y
  165.     call console_write
  166.     POP r4
  167.     POP r5
  168.     POP r6
  169. .endm
  170.  
  171. .macro CONSOLE_WRITE_CHAR x, y, char
  172.     PUSH r6
  173.     PUSH r5
  174.     PUSH r4
  175.     mov r4, \char
  176.     mov r5, \x
  177.     mov r6, \y
  178.     call console_write_char
  179.     POP r4
  180.     POP r5
  181.     POP r6
  182. .endm
  183.  
  184. # r2: return
  185. # r4: str1
  186. # r5: str2
  187. compare_zero_terminated_string:
  188.     PUSHA
  189.     mov r8, r4
  190.     mov r9, r5
  191.     movi r2, 1
  192.     cztsl:
  193.     ldb r10, 0(r8)
  194.     ldb r11, 0(r9)
  195.     bne r10, r11, cztse
  196.     beq r10, zero, cztse_
  197.     addi r8, r8, 1
  198.     addi r9, r9, 1
  199.     br cztsl
  200.     cztse:
  201.     movi r2, 0
  202.     cztse_:
  203.     POPA
  204.     ret
  205.  
  206.  
  207. # r2: return
  208. pull_jtag_char:
  209.     PUSHA
  210.     movia r8, JTAG
  211.     ldwio r9, 0(r8)
  212.     andi r8, r9, 0x8000
  213.     bne r8, r0, pjce
  214.     mov r9, r0
  215.     pjce:
  216.     andi r8, r9, 0x00ff
  217.     mov r2, r8
  218.     POPA
  219.     ret
  220.  
  221. # r4: char
  222. # r5: x
  223. # r6: y
  224. console_write_char:
  225.     PUSHA
  226.     PUSH ra
  227.     movia r8, MEMORY
  228.     stb r4, 0(r8)
  229.     stb r0, 1(r8)
  230.     mov r4, r8
  231.     call console_write
  232.    
  233.     POP ra
  234.     POPA
  235.     ret
  236.  
  237. # r4: string
  238. # r5: x
  239. # r6: y
  240. console_write:
  241.     PUSHA
  242.     PUSH ra
  243.     mov r8, r4
  244.     mov r10, r5
  245.     mov r11, r6
  246.     mov r17, r11
  247.    
  248.     muli r15, r11, 0x80
  249.     add r16, r10, r15 # index
  250.     movia r13, CHARS
  251.     add r13, r13, r16
  252.    
  253.     movi r14, 0x0a
  254.     movi r21, 0x0d
  255.     movia r19, 0x3a
  256.     cwl:
  257.         ldb r12, 0(r8)      # read char
  258.         beq r12, zero, cwe  # if zero return
  259.         beq r12, r21, cwlso # skip 0x0d
  260.         beq r12, r14, cwln  # newline
  261.         bgt r11, r19, cwlsb # shiftbuffer
  262.     cwlsbr:
  263.         stbio r12, 0(r13) # write char
  264.     cwls: # skip
  265.         addi r13, r13, 1
  266.     cwlso:
  267.         addi r8, r8, 1
  268.         br cwl
  269.     cwlsb: # shiftbuffer
  270.         movi r18, 1
  271.         CONSOLE_POS r10, r11
  272.         call _SHIFT_BUFFER
  273.         LOAD_CONSOLE_POS r10, r11
  274.         #muli r20, r18, 0x80
  275.         subi r13, r13, 0x80
  276.         #subi r11, r11, 1
  277.         #addi r11, r11, 1
  278.         #sub r17, r17, r18
  279.         br cwlsbr
  280.     cwlsbnl: # shiftbuffer newline
  281.         movi r18, 1
  282.         CONSOLE_POS r10, r11
  283.         call _SHIFT_BUFFER
  284.         LOAD_CONSOLE_POS r10, r11
  285.         #muli r20, r18, 0x80
  286.         subi r13, r13, 0x100
  287.         #subi r18, r18, 1
  288.        
  289.         sub r17, r17, r18
  290.         br cwl
  291.     cwln: # newline
  292.         addi r8, r8, 1 # pointer
  293.         addi r11, r11, 1 # row
  294.         movi r10, 0
  295.        
  296.         addi r17, r17, 1
  297.         muli r15, r17, 0x80
  298.        
  299.         movia r13, CHARS
  300.         add r13, r13, r15
  301.         bgt r11, r19, cwlsbnl # shiftbuffer
  302.         br cwl
  303.     cwe:
  304.     CONSOLE_POS r10, r11
  305.     POP ra
  306.     POPA
  307.     ret
  308.  
  309. _CLEAR_TEXT:
  310.     PUSH r8
  311.     PUSH r9
  312.     movia r8, CHARS
  313.     movia r9, CHARS+0x2000
  314.     _ctl:
  315.     stwio zero, 0(r8)
  316.     addi r8, r8, 4
  317.     blt r8, r9, _ctl
  318.     POP r9
  319.     POP r8
  320.     ret
  321.  
  322. # r18: rows
  323. _SHIFT_BUFFER:
  324.     PUSHA
  325.     mov r19, r18
  326.     muli r18, r18, 0x80
  327.     movia r8, CHARS
  328.     movia r9, CHARS+0x2000
  329.     add r8, r8, r18
  330.     sub r12, r8, r18
  331.     _sbl:
  332.     ldwio r10, 0(r8)
  333.     stwio r10, 0(r12)
  334.     addi r8, r8, 4
  335.     addi r12, r12, 4
  336.     blt r8, r9, _sbl
  337.    
  338.     movia r8, CHARS+0x2000
  339.     sub r8, r8, r18
  340.     movia r9, CHARS+0x2000
  341.    
  342.     _sblc:
  343.     stwio zero, 0(r8)
  344.     addi r8, r8, 4
  345.     blt r8, r9, _sblc
  346.     LOAD_CONSOLE_POS r10, r11
  347.     sub r11, r11, r19
  348.     CONSOLE_POS r10, r11
  349.     POPA
  350.     ret
  351.  
  352. _CLEAR_SCREEN:
  353.     PUSH r8
  354.     PUSH r9
  355.     movia r8, PIXELS
  356.     movia r9, PIXELS+0x80000
  357.     _csl:
  358.     stwio zero, 0(r8)
  359.     addi r8, r8, 4
  360.     blt r8, r9, _csl
  361.     POP r9
  362.     POP r8
  363.     ret
  364.  
  365. _start:
  366.     movi sp, 0xffc
  367.    
  368.     call _CLEAR_SCREEN
  369.     call _CLEAR_TEXT
  370.    
  371.     CONSOLE_WRITE zero, zero, version_message
  372.     movi r10, 0
  373.     movi r11, 3
  374.     movi r2, 0x3e
  375.     CONSOLE_WRITE_CHAR r10, r11, r2
  376.     movi r10, 2
  377.     movi r11, 3
  378.     CONSOLE_POS r10, r11
  379.  
  380.     br CONSOLE
  381.  
  382. # ============== [ CONSOLE ] ============== #
  383.  
  384. CONSOLE:
  385.     LOAD_CONSOLE_POS r10, r11 # x, y
  386.    
  387.     movi r10, 2
  388.     movi r12, 0x3e
  389.     CONSOLE_WRITE_CHAR r0, r11, r12
  390.     LOAD_CONSOLE_POS r10, r11
  391.     movi r10, 2
  392.     CONSOLE_POS r10, r11
  393.    
  394.     CONSOLE_LOOP:
  395.         call pull_jtag_char /* Read JTAG Input */
  396.         beq r2, r0, CONSOLE_LOOP
  397.     CONSOLE_WORK:
  398.         movi r14, 2
  399.         #========
  400.         bne r2, r0, KEYBOARD
  401.         br CONSOLE_LOOP
  402.  
  403. KEYBOARD:
  404.     movi r8, vk_backspace
  405.     beq r2, r8, key1
  406.    
  407.     movi r8, vk_enter
  408.     beq r2, r8, key2
  409.    
  410.     br key3
  411.    
  412.     key1:
  413.         movi r14, 2
  414.         beq r10, r14, key1_end # x == 2
  415.         subi r10, r10, 1
  416.         movi r12, 0x20
  417.         CONSOLE_WRITE_CHAR r10, r11, r12
  418.         LOAD_CONSOLE_POS r10, r11
  419.         movia r13, BUFFER-2
  420.         add r13, r13, r10
  421.         stb zero, 0(r13)
  422.  
  423.         key1_end:
  424.             br CONSOLE_LOOP
  425.            
  426.     key2: # Execute buffer
  427.         call EXECUTE_COMMAND # Get command code
  428.         br CON_COMMAND
  429.     key3: # Append character
  430.         CONSOLE_WRITE_CHAR r10, r11, r2
  431.         LOAD_CONSOLE_POS r10, r11
  432.         movia r13, BUFFER-2
  433.         add r13, r13, r10
  434.         stb r2, 0(r13)
  435.         stb zero, 1(r13)
  436.         addi r10, r10, 1
  437.  
  438.         CONSOLE_POS r10, r11
  439.         br CONSOLE_LOOP
  440.  
  441. CON_COMMAND:
  442.     # r3: Command code
  443.     movi r2, _exit_
  444.     beq r3, r2, _con_exit
  445.    
  446.     movi r2, _info_
  447.     beq r3, r2, _con_info
  448.    
  449.     movi r2, _clear_
  450.     beq r3, r2, _con_clear
  451.    
  452.     movi r2, _help_
  453.     beq r3, r2, _con_help
  454.    
  455.     br _con_unknown
  456.     _con_exit:
  457.         movi sp, 0
  458.         br end
  459.     _con_info:
  460.         movi r10, 0
  461.         addi r11, r11, 1
  462.         CONSOLE_WRITE r10, r11, info_message
  463.         LOAD_CONSOLE_POS r10, r11
  464.         movi r10, 0
  465.         addi r11, r11, 1
  466.         CONSOLE_POS r10, r11
  467.         br CONSOLE
  468.     _con_clear:
  469.         br _start
  470.     _con_help:
  471.         movi r10, 0
  472.         addi r11, r11, 1
  473.         CONSOLE_WRITE r10, r11, help_message
  474.         LOAD_CONSOLE_POS r10, r11
  475.         movi r10, 0
  476.         addi r11, r11, 1
  477.         CONSOLE_POS r10, r11
  478.         br CONSOLE
  479.     _con_unknown:
  480.         movi r10, 0
  481.         addi r11, r11, 1
  482.         CONSOLE_WRITE r10, r11, error_message
  483.         LOAD_CONSOLE_POS r10, r11
  484.         movi r10, 0
  485.         addi r11, r11, 1
  486.         CONSOLE_POS r10, r11
  487.         #call _SHIFT_BUFFER
  488.         br CONSOLE
  489.     br end
  490.  
  491.  
  492. .macro ADD_COMMAND command, code
  493.     movia r4, \command
  494.     COMPARE_STRINGS r4, r5
  495.     movi r8, \code
  496.     bne r2, r0, _com_val
  497. .endm
  498.  
  499. EXECUTE_COMMAND:
  500.     PUSHA
  501.     PUSH ra
  502.     movi r3, 0
  503.     movia r5, BUFFER
  504.    
  505.     ADD_COMMAND command_0, _exit_
  506.     ADD_COMMAND command_1, _info_
  507.     ADD_COMMAND command_2, _clear_
  508.     ADD_COMMAND command_3, _help_
  509.    
  510.     br _com_end
  511.     _com_val:
  512.     mov r3, r8
  513.    
  514.     _com_end:
  515.     movia r13, BUFFER # replace r13 < r5
  516.     stb zero, 0(r13)  # replace r13 < r5
  517.     POP ra
  518.     POPA
  519.     ret
  520.  
  521. _DRAW_COLOR_PALETTE:
  522.     PUSHA # Stores all values
  523.  
  524.     movia r3, PIXELS+SIZE
  525.     movia r4, SIZE
  526.     movi  r5, 0 # Index
  527.     _loop:
  528.     sub r7, r3, r4 # Pixel Index
  529.  
  530.     # Get (X,Y) position
  531.     MOD r8, r5, 0x400
  532.     movi r20, 0x200
  533.     div r9, r5, r20
  534.  
  535.     # r5 = XY Index
  536.     # r8 = X Position
  537.     # r9 = Y Position
  538.  
  539.     MOD r8, r8, 0x20
  540.     movi r20, 7
  541.     div r24, r9, r20
  542.     MOD r9, r9, 0x20
  543.     #movi r9, 0x20
  544.  
  545.     # Color palette
  546.     MOD r7, r5, 0x100
  547.     muli r7, r7, 2
  548.     movi r20, 0x200
  549.     div r20, r5, r20
  550.     muli r20, r20, 0x400
  551.     add r7, r7, r20
  552.     movia r20, PIXELS
  553.     add r7, r7, r20
  554.  
  555.     MOD r10, r5, 0x100
  556.     movi r20, 0x20
  557.     div r10, r10, r20
  558.     movia r20, 0x4000
  559.     div r20, r5, r20
  560.     muli r20, r20, 8
  561.     add r10, r10, r20
  562.  
  563.     COLOR r2, r10, r9, r8
  564.     sthio r2, 0(r7)
  565.  
  566.     movia r2, 0x10000
  567.     bge r5, r2, _loop_end
  568.  
  569.     subi r4, r4, 2
  570.     addi r5, r5, 1
  571.     movi r2, 2
  572.     bge r4, r2, _loop
  573.     _loop_end:
  574.  
  575.     POPA # Load all the values
  576.     mov sp, zero
  577.     ret
  578.  
  579.  
  580. end:
  581. .end:
  582. .fill 0x100, 1, 0xaa
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement