Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .equ PIXELS, 0x8000000
- .equ CHARS, 0x9000000
- .equ JTAG, 0x10001000
- .equ SIZE, 0x80000
- STACK:
- .space 0x1000
- BUFFER:
- .space 0x1000
- MEMORY:
- .space 0x10000
- console_cursor:
- .hword 0x0000 # x
- .hword 0x0000 # y
- .equ vk_enter, 0x0a
- .equ vk_backspace, 0x7f
- .equ _exit_, 0x01
- .equ _info_, 0x02
- .equ _clear_, 0x03
- .equ _help_, 0x04
- .align 2
- version_message:
- .string "HardCoded (v 1.0.0) Nios II Command Line"
- info_message:
- .string "This command tool was build by http://twitch.tv/hard_coded
- This message is a bit longer because of more lines
- Testing testing
- Last line :D !!!"
- help_message:
- .string "This command shows all the available commands
- help Shows this message.
- clear Clears the screen.
- info Show info about the author.
- exit Exits the console.\n"
- error_message:
- .string "Invalid command\n"
- command_0:
- .string "exit"
- command_1:
- .string "info"
- command_2:
- .string "clear"
- command_3:
- .string "help"
- .text
- .global _start
- .macro COLOR reg, r, g, b
- mov \reg, \r
- roli \reg, \reg, 5
- add \reg, \reg, \g
- roli \reg, \reg, 6
- add \reg, \reg, \b
- .endm
- .macro MOD reg, a, b
- PUSH r20
- PUSH r21
- movi r20, \b
- div r20, \a, r20
- movi r21, \b
- mul r20, r20, r21
- sub \reg, \a, r20
- POP r21
- POP r20
- .endm
- .macro PUSH reg
- subi sp, sp, 8
- stw \reg, 0(sp)
- .endm
- .macro POP reg
- ldw \reg, 0(sp)
- addi sp, sp, 8
- .endm
- .macro PUSHA
- subi sp, sp, 128
- stw r8, 0(sp)
- stw r9, 8(sp)
- stw r10, 16(sp)
- stw r11, 24(sp)
- stw r12, 32(sp)
- stw r13, 40(sp)
- stw r14, 48(sp)
- stw r15, 56(sp)
- stw r16, 64(sp)
- stw r17, 72(sp)
- stw r18, 80(sp)
- stw r19, 88(sp)
- stw r20, 96(sp)
- stw r21, 104(sp)
- stw r22, 112(sp)
- stw r23, 120(sp)
- .endm
- .macro POPA
- ldw r8, 0(sp)
- ldw r9, 8(sp)
- ldw r10, 16(sp)
- ldw r11, 24(sp)
- ldw r12, 32(sp)
- ldw r13, 40(sp)
- ldw r14, 48(sp)
- ldw r15, 56(sp)
- ldw r16, 64(sp)
- ldw r17, 72(sp)
- ldw r18, 80(sp)
- ldw r19, 88(sp)
- ldw r20, 96(sp)
- ldw r21, 104(sp)
- ldw r22, 112(sp)
- ldw r23, 120(sp)
- addi sp, sp, 128
- .endm
- .macro COMPARE_STRINGS str1, str2
- PUSH r4
- PUSH r5
- mov r4, \str1
- mov r5, \str2
- call compare_zero_terminated_string
- POP r5
- POP r4
- .endm
- .macro CONSOLE_POS x1, y1
- PUSH r8
- PUSH r9
- movia r8, console_cursor
- mov r9, \x1
- sth r9, 0(r8)
- mov r9, \y1
- sth r9, 2(r8)
- POP r9
- POP r8
- .endm
- .macro LOAD_CONSOLE_POS x1, y1
- PUSH r8
- movia r8, console_cursor
- ldh \x1, 0(r8)
- ldh \y1, 2(r8)
- POP r8
- .endm
- .macro CONSOLE_WRITE x, y, str
- PUSH r6
- PUSH r5
- PUSH r4
- movia r4, \str
- mov r5, \x
- mov r6, \y
- call console_write
- POP r4
- POP r5
- POP r6
- .endm
- .macro CONSOLE_WRITE_CHAR x, y, char
- PUSH r6
- PUSH r5
- PUSH r4
- mov r4, \char
- mov r5, \x
- mov r6, \y
- call console_write_char
- POP r4
- POP r5
- POP r6
- .endm
- # r2: return
- # r4: str1
- # r5: str2
- compare_zero_terminated_string:
- PUSHA
- mov r8, r4
- mov r9, r5
- movi r2, 1
- cztsl:
- ldb r10, 0(r8)
- ldb r11, 0(r9)
- bne r10, r11, cztse
- beq r10, zero, cztse_
- addi r8, r8, 1
- addi r9, r9, 1
- br cztsl
- cztse:
- movi r2, 0
- cztse_:
- POPA
- ret
- # r2: return
- pull_jtag_char:
- PUSHA
- movia r8, JTAG
- ldwio r9, 0(r8)
- andi r8, r9, 0x8000
- bne r8, r0, pjce
- mov r9, r0
- pjce:
- andi r8, r9, 0x00ff
- mov r2, r8
- POPA
- ret
- # r4: char
- # r5: x
- # r6: y
- console_write_char:
- PUSHA
- PUSH ra
- movia r8, MEMORY
- stb r4, 0(r8)
- stb r0, 1(r8)
- mov r4, r8
- call console_write
- POP ra
- POPA
- ret
- # r4: string
- # r5: x
- # r6: y
- console_write:
- PUSHA
- PUSH ra
- mov r8, r4
- mov r10, r5
- mov r11, r6
- mov r17, r11
- muli r15, r11, 0x80
- add r16, r10, r15 # index
- movia r13, CHARS
- add r13, r13, r16
- movi r14, 0x0a
- movi r21, 0x0d
- movia r19, 0x3a
- cwl:
- ldb r12, 0(r8) # read char
- beq r12, zero, cwe # if zero return
- beq r12, r21, cwlso # skip 0x0d
- beq r12, r14, cwln # newline
- bgt r11, r19, cwlsb # shiftbuffer
- cwlsbr:
- stbio r12, 0(r13) # write char
- cwls: # skip
- addi r13, r13, 1
- cwlso:
- addi r8, r8, 1
- br cwl
- cwlsb: # shiftbuffer
- movi r18, 1
- CONSOLE_POS r10, r11
- call _SHIFT_BUFFER
- LOAD_CONSOLE_POS r10, r11
- #muli r20, r18, 0x80
- subi r13, r13, 0x80
- #subi r11, r11, 1
- #addi r11, r11, 1
- #sub r17, r17, r18
- br cwlsbr
- cwlsbnl: # shiftbuffer newline
- movi r18, 1
- CONSOLE_POS r10, r11
- call _SHIFT_BUFFER
- LOAD_CONSOLE_POS r10, r11
- #muli r20, r18, 0x80
- subi r13, r13, 0x100
- #subi r18, r18, 1
- sub r17, r17, r18
- br cwl
- cwln: # newline
- addi r8, r8, 1 # pointer
- addi r11, r11, 1 # row
- movi r10, 0
- addi r17, r17, 1
- muli r15, r17, 0x80
- movia r13, CHARS
- add r13, r13, r15
- bgt r11, r19, cwlsbnl # shiftbuffer
- br cwl
- cwe:
- CONSOLE_POS r10, r11
- POP ra
- POPA
- ret
- _CLEAR_TEXT:
- PUSH r8
- PUSH r9
- movia r8, CHARS
- movia r9, CHARS+0x2000
- _ctl:
- stwio zero, 0(r8)
- addi r8, r8, 4
- blt r8, r9, _ctl
- POP r9
- POP r8
- ret
- # r18: rows
- _SHIFT_BUFFER:
- PUSHA
- mov r19, r18
- muli r18, r18, 0x80
- movia r8, CHARS
- movia r9, CHARS+0x2000
- add r8, r8, r18
- sub r12, r8, r18
- _sbl:
- ldwio r10, 0(r8)
- stwio r10, 0(r12)
- addi r8, r8, 4
- addi r12, r12, 4
- blt r8, r9, _sbl
- movia r8, CHARS+0x2000
- sub r8, r8, r18
- movia r9, CHARS+0x2000
- _sblc:
- stwio zero, 0(r8)
- addi r8, r8, 4
- blt r8, r9, _sblc
- LOAD_CONSOLE_POS r10, r11
- sub r11, r11, r19
- CONSOLE_POS r10, r11
- POPA
- ret
- _CLEAR_SCREEN:
- PUSH r8
- PUSH r9
- movia r8, PIXELS
- movia r9, PIXELS+0x80000
- _csl:
- stwio zero, 0(r8)
- addi r8, r8, 4
- blt r8, r9, _csl
- POP r9
- POP r8
- ret
- _start:
- movi sp, 0xffc
- call _CLEAR_SCREEN
- call _CLEAR_TEXT
- CONSOLE_WRITE zero, zero, version_message
- movi r10, 0
- movi r11, 3
- movi r2, 0x3e
- CONSOLE_WRITE_CHAR r10, r11, r2
- movi r10, 2
- movi r11, 3
- CONSOLE_POS r10, r11
- br CONSOLE
- # ============== [ CONSOLE ] ============== #
- CONSOLE:
- LOAD_CONSOLE_POS r10, r11 # x, y
- movi r10, 2
- movi r12, 0x3e
- CONSOLE_WRITE_CHAR r0, r11, r12
- LOAD_CONSOLE_POS r10, r11
- movi r10, 2
- CONSOLE_POS r10, r11
- CONSOLE_LOOP:
- call pull_jtag_char /* Read JTAG Input */
- beq r2, r0, CONSOLE_LOOP
- CONSOLE_WORK:
- movi r14, 2
- #========
- bne r2, r0, KEYBOARD
- br CONSOLE_LOOP
- KEYBOARD:
- movi r8, vk_backspace
- beq r2, r8, key1
- movi r8, vk_enter
- beq r2, r8, key2
- br key3
- key1:
- movi r14, 2
- beq r10, r14, key1_end # x == 2
- subi r10, r10, 1
- movi r12, 0x20
- CONSOLE_WRITE_CHAR r10, r11, r12
- LOAD_CONSOLE_POS r10, r11
- movia r13, BUFFER-2
- add r13, r13, r10
- stb zero, 0(r13)
- key1_end:
- br CONSOLE_LOOP
- key2: # Execute buffer
- call EXECUTE_COMMAND # Get command code
- br CON_COMMAND
- key3: # Append character
- CONSOLE_WRITE_CHAR r10, r11, r2
- LOAD_CONSOLE_POS r10, r11
- movia r13, BUFFER-2
- add r13, r13, r10
- stb r2, 0(r13)
- stb zero, 1(r13)
- addi r10, r10, 1
- CONSOLE_POS r10, r11
- br CONSOLE_LOOP
- CON_COMMAND:
- # r3: Command code
- movi r2, _exit_
- beq r3, r2, _con_exit
- movi r2, _info_
- beq r3, r2, _con_info
- movi r2, _clear_
- beq r3, r2, _con_clear
- movi r2, _help_
- beq r3, r2, _con_help
- br _con_unknown
- _con_exit:
- movi sp, 0
- br end
- _con_info:
- movi r10, 0
- addi r11, r11, 1
- CONSOLE_WRITE r10, r11, info_message
- LOAD_CONSOLE_POS r10, r11
- movi r10, 0
- addi r11, r11, 1
- CONSOLE_POS r10, r11
- br CONSOLE
- _con_clear:
- br _start
- _con_help:
- movi r10, 0
- addi r11, r11, 1
- CONSOLE_WRITE r10, r11, help_message
- LOAD_CONSOLE_POS r10, r11
- movi r10, 0
- addi r11, r11, 1
- CONSOLE_POS r10, r11
- br CONSOLE
- _con_unknown:
- movi r10, 0
- addi r11, r11, 1
- CONSOLE_WRITE r10, r11, error_message
- LOAD_CONSOLE_POS r10, r11
- movi r10, 0
- addi r11, r11, 1
- CONSOLE_POS r10, r11
- #call _SHIFT_BUFFER
- br CONSOLE
- br end
- .macro ADD_COMMAND command, code
- movia r4, \command
- COMPARE_STRINGS r4, r5
- movi r8, \code
- bne r2, r0, _com_val
- .endm
- EXECUTE_COMMAND:
- PUSHA
- PUSH ra
- movi r3, 0
- movia r5, BUFFER
- ADD_COMMAND command_0, _exit_
- ADD_COMMAND command_1, _info_
- ADD_COMMAND command_2, _clear_
- ADD_COMMAND command_3, _help_
- br _com_end
- _com_val:
- mov r3, r8
- _com_end:
- movia r13, BUFFER # replace r13 < r5
- stb zero, 0(r13) # replace r13 < r5
- POP ra
- POPA
- ret
- _DRAW_COLOR_PALETTE:
- PUSHA # Stores all values
- movia r3, PIXELS+SIZE
- movia r4, SIZE
- movi r5, 0 # Index
- _loop:
- sub r7, r3, r4 # Pixel Index
- # Get (X,Y) position
- MOD r8, r5, 0x400
- movi r20, 0x200
- div r9, r5, r20
- # r5 = XY Index
- # r8 = X Position
- # r9 = Y Position
- MOD r8, r8, 0x20
- movi r20, 7
- div r24, r9, r20
- MOD r9, r9, 0x20
- #movi r9, 0x20
- # Color palette
- MOD r7, r5, 0x100
- muli r7, r7, 2
- movi r20, 0x200
- div r20, r5, r20
- muli r20, r20, 0x400
- add r7, r7, r20
- movia r20, PIXELS
- add r7, r7, r20
- MOD r10, r5, 0x100
- movi r20, 0x20
- div r10, r10, r20
- movia r20, 0x4000
- div r20, r5, r20
- muli r20, r20, 8
- add r10, r10, r20
- COLOR r2, r10, r9, r8
- sthio r2, 0(r7)
- movia r2, 0x10000
- bge r5, r2, _loop_end
- subi r4, r4, 2
- addi r5, r5, 1
- movi r2, 2
- bge r4, r2, _loop
- _loop_end:
- POPA # Load all the values
- mov sp, zero
- ret
- end:
- .end:
- .fill 0x100, 1, 0xaa
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement