⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ls_test.psm

📁 和picoblaze完全兼容的mcu ip core
💻 PSM
📖 第 1 页 / 共 5 页
字号:
                     CALL send_hex_byte
                     INPUT s0, line_store7b_output_M
                     CALL send_hex_byte
                     INPUT s0, line_store7b_output_L
                     CALL send_hex_byte
                     CALL send_CR
                     ;
                     ;
       skip_display: OUTPUT s0, line_store_write_en         ;dummy write to enable line stores
                     FETCH s0, auto_inc                     ;increment input value if auto is 'on'
                     ADD sA, s0
                     ADDCY sB, 00
                     ADDCY sC, 00
                     STORE sA, test_data_in0                ;store new line store input value
                     STORE sB, test_data_in1
                     STORE sC, test_data_in2
                     OUTPUT sA, line_store_input_L          ;Write data to register driving line store
                     OUTPUT sB, line_store_input_M
                     OUTPUT sC, line_store_input_H
                     RETURN
                     ;
                     ;
                     ;**************************************************************************************
                     ; UART communication routines
                     ;**************************************************************************************
                     ;
                     ; Read one character from the UART
                     ;
                     ; Character read will be returned in a register called 'UART_data'.
                     ;
                     ; The routine first tests the receiver FIFO buffer to see if data is present.
                     ; If the FIFO is empty, the routine waits until there is a character to read.
                     ; As this could take any amount of time the wait loop could include a call to a
                     ; subroutine which performs a useful function.
                     ;
                     ;
                     ; Registers used s0 and UART_data
                     ;
     read_from_UART: INPUT s0, status_port                  ;test Rx_FIFO buffer
                     TEST s0, rx_data_present               ;wait if empty
                     JUMP NZ, read_character
                     JUMP read_from_UART
     read_character: INPUT UART_data, UART_read_port        ;read from FIFO
                     RETURN
                     ;
                     ;
                     ;
                     ; Transmit one character to the UART
                     ;
                     ; Character supplied in register called 'UART_data'.
                     ;
                     ; The routine first tests the transmit FIFO buffer to see if it is full.
                     ; If the FIFO is full, then the routine waits until it there is space.
                     ;
                     ; Registers used s0
                     ;
       send_to_UART: INPUT s0, status_port                  ;test Tx_FIFO buffer
                     TEST s0, tx_full                       ;wait if full
                     JUMP Z, UART_write
                     JUMP send_to_UART
         UART_write: OUTPUT UART_data, UART_write_port
                     RETURN
                     ;
                     ;
                     ;**************************************************************************************
                     ; Receive ASCII string from UART
                     ;**************************************************************************************
                     ;
                     ;An ASCII string will be read from the UART and stored in scratch pad memory
                     ;commencing at the location specified by a constant named 'string_start'.
                     ;The string will have a maximum length of 16 characters including a
                     ;carriage return (0D) denoting the end of the string.
                     ;
                     ;As each character is read, it is echoed to the UART transmitter.
                     ;Some minor editing is supported using backspace (BS=08) which is used
                     ;to adjust what is stored in scratch pad memory and adjust the display
                     ;on the terminal screen using characters sent to the UART transmitter.
                     ;
                     ;A test is made for the receiver FIFO becoming full. A full status is treated as
                     ;a potential error situation and will result in a 'Overflow Error' message being
                     ;transmitted to the UART, the receiver FIFO being purged of all data and an
                     ;empty string being stored (carriage return at first location).
                     ;
                     ;Registers used s0, s1, s2 and 'UART_data'.
                     ;
     receive_string: LOAD s1, string_start                  ;locate start of string
                     LOAD s2, s1                            ;compute 16 character address
                     ADD s2, 10
  receive_full_test: INPUT s0, status_port                  ;test Rx_FIFO buffer for full
                     TEST s0, rx_full
                     JUMP NZ, read_error
                     CALL read_from_UART                    ;obtain and echo character
                     CALL send_to_UART
                     STORE UART_data, (s1)                  ;write to memory
                     COMPARE UART_data, character_CR        ;test for end of string
                     RETURN Z
                     COMPARE UART_data, character_BS        ;test for back space
                     JUMP Z, BS_edit
                     ADD s1, 01                             ;increment memory pointer
                     COMPARE s1, s2                         ;test for pointer exceeding 16 characters
                     JUMP NZ, receive_full_test             ;next character
                     CALL send_backspace                    ;hold end of string position on terminal display
            BS_edit: SUB s1, 01                             ;memory pointer back one
                     COMPARE s1, string_start               ;test for under flow
                     JUMP C, string_start_again
                     CALL send_space                        ;clear character at current position
                     CALL send_backspace                    ;position cursor
                     JUMP receive_full_test                 ;next character
 string_start_again: CALL send_greater_than                 ;restore '>' at prompt
                     JUMP receive_string                    ;begin again
                     ;Receiver buffer overflow condition
         read_error: CALL send_CR                           ;Transmit error message
                     STORE UART_data, string_start          ;empty string in memory (start with CR)
                     CALL send_Overflow_Error
                     CALL send_CR
 clear_UART_Rx_loop: INPUT s0, status_port                  ;test Rx_FIFO buffer for data
                     TEST s0, rx_data_present
                     RETURN Z                               ;finish when buffer is empty
                     INPUT UART_data, UART_read_port        ;read from FIFO and ignore
                     JUMP clear_UART_Rx_loop
                     ;
                     ;
                     ;**************************************************************************************
                     ; Useful ASCII conversion and handling routines
                     ;**************************************************************************************
                     ;
                     ;
                     ;
                     ; Convert character to upper case
                     ;
                     ; The character supplied in register s0.
                     ; If the character is in the range 'a' to 'z', it is converted
                     ; to the equivalent upper case character in the range 'A' to 'Z'.
                     ; All other characters remain unchanged.
                     ;
                     ; Registers used s0.
                     ;
         upper_case: COMPARE s0, 61                         ;eliminate character codes below 'a' (61 hex)
                     RETURN C
                     COMPARE s0, 7B                         ;eliminate character codes above 'z' (7A hex)
                     RETURN NC
                     AND s0, DF                             ;mask bit5 to convert to upper case
                     RETURN
                     ;
                     ;
                     ;
                     ; Convert string held in scratch pad memory to upper case.
                     ;
                     ; Registers used s0, s1
                     ;
  upper_case_string: LOAD s1, string_start
           ucs_loop: FETCH s0, (s1)
                     COMPARE s0, character_CR
                     RETURN Z
                     CALL upper_case
                     STORE s0, (s1)
                     ADD s1, 01
                     JUMP ucs_loop
                     ;
                     ;
                     ; Convert character '0' to '9' to numerical value in range 0 to 9
                     ;
                     ; The character supplied in register s0. If the character is in the
                     ; range '0' to '9', it is converted to the equivalent decimal value.
                     ; Characters not in the range '0' to '9' are signified by the return
                     ; with the CARRY flag set.
                     ;
                     ; Registers used s0.
                     ;
     onechar_to_value: ADD s0, C6                             ;reject character codes above '9' (39 hex)
                     RETURN C                               ;carry flag is set
                     SUB s0, F6                             ;reject character codes below '0' (30 hex)
                     RETURN                                 ;carry is set if value not in range
                     ;
                     ;
                     ;
                     ; Convert the HEX ASCII characters contained in 's3' and 's2' into
                     ; an equivalent hexadecimal value in register 's0'.
                     ;     The upper nibble is represented by an ASCII character in register s3.
                     ;     The lower nibble is represented by an ASCII character in register s2.
                     ;
                     ; Input characters must be in the range 00 to FF hexadecimal or the CARRY flag
                     ; will be set on return.
                     ;
                     ; Registers used s0, s2 and s3.
                     ;
  ASCII_byte_to_hex: LOAD s0, s3                            ;Take upper nibble
                     CALL ASCII_to_hex                      ;convert to value
                     RETURN C                               ;reject if out of range
                     LOAD s3, s0                            ;remember value
                     SL0 s3                                 ;multiply value by 16 to put in upper nibble
                     SL0 s3
                     SL0 s3
                     SL0 s3
                     LOAD s0, s2                            ;Take lower nibble
                     CALL ASCII_to_hex                      ;convert to value
                     RETURN C                               ;reject if out of range
                     OR s0, s3                              ;merge in the upper nibble with CARRY reset
                     RETURN
                     ;
                     ;
                     ; Routine to convert ASCII data in 's0' to an equivalent HEX value.
                     ;
                     ; If character is not valid for hex, then CARRY is set on return.
                     ;
                     ; Register used s0
                     ;
       ASCII_to_hex: ADD s0, B9                             ;test for above ASCII code 46 ('F')
                     RETURN C
                     SUB s0, E9                             ;normalise 0 to 9 with A-F in 11 to 16 hex
                     RETURN C                               ;reject below ASCII code 30 ('0')
                     SUB s0, 11                             ;isolate A-F down to 00 to 05 hex
                     JUMP NC, ASCII_letter
                     ADD s0, 07                             ;test for above ASCII code 46 ('F')
                     RETURN C
                     SUB s0, F6                             ;convert to range 00 to 09
                     RETURN
       ASCII_letter: ADD s0, 0A                             ;convert to range 0A to 0F
                     RETURN
                     ;
                     ;
                     ;
                     ;
                     ; Routine to convert ASCII data in 's0' to an equivalent DECIMAL value.
                     ;
                     ; If character is not valid for decimal, then CARRY is set on return.
                     ;
                     ; Register used s0
                     ;
   ASCII_to_decimal: ADD s0, C6                             ;test for above ASCII code 39 ('9')
                     RETURN C
                     SUB s0, F6                             ;normalise to 0 to 9
                     RETURN                                 ;carry set for ASCII code below 30 ('0')
                     ;
                     ;
                     ;
                     ; Convert hexadecimal value provided in register s0 into ASCII characters
                     ;
                     ; The value provided must can be any value in the range 00 to FF and will be converted into
                     ; two ASCII characters.
                     ;     The upper nibble will be represented by an ASCII character returned in register s2.
                     ;     The lower nibble will be represented by an ASCII character returned in register s1.
                     ;
                     ; The ASCII representations of '0' to '9' are 30 to 39 hexadecimal which is simply 30 hex
                     ; added to the actual decimal value. The ASCII representations of 'A' to 'F' are 41 to 46
                     ; hexadecimal requiring a further addition of 07 to the 30 already added.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -