; ================================================================ ; Port address definitions... ; ================================================================ switch_in EQU 0 ; Switch read port leds_out EQU 1 ; LED write port uart_data_rx EQU 2 ; UART receive read port uart_data_tx EQU 3 ; UART transmit write port data_present EQU 4 ; UART stat read port, lsb buffer_full EQU 5 ; UART stat read port, lsb ; ================================================================ ; Useful constant declarations... ; ================================================================ all_clear EQU 0 ; define zero ascii_NUL EQU 0 ; ascii code (null character) ascii_SOH EQU 1 ; ascii code (start of header) ascii_STX EQU 2 ; ascii code (start of text) ascii_ETX EQU 3 ; ascii code (end of text) ascii_EOT EQU 4 ; ascii code (end of xmit) ascii_ENQ EQU 5 ; ascii code (enquiry) ascii_ACK EQU 6 ; ascii code (acknowledge) ascii_BEL EQU 7 ; ascii code (bell) ascii_BS EQU 8 ; ascii code (backspace) ascii_HT EQU 9 ; ascii code (horiz tab) ascii_LF EQU 10 ; ascii code (line feed) ascii_VT EQU 11 ; ascii code (vert tab) ascii_FF EQU 12 ; ascii code (form feed) ascii_CR EQU 13 ; ascii code (carriage return) ascii_SO EQU 14 ; ascii code (shift out) ascii_SI EQU 15 ; ascii code (shift in) ascii_DLE EQU 16 ; ascii code (data link esc) ascii_DC1 EQU 17 ; ascii code (device ctrl 1, xon) ascii_DC2 EQU 18 ; ascii code (device ctrl 2) ascii_DC3 EQU 19 ; ascii code (device ctrl 3, xoff) ascii_DC4 EQU 20 ; ascii code (device ctrl 4) ascii_NAK EQU 21 ; ascii code (negative acknowledge) ascii_SYN EQU 22 ; ascii code (sync idle) ascii_ETB EQU 23 ; ascii code (end xmit block) ascii_CAN EQU 24 ; ascii code (cancel) ascii_EM EQU 25 ; ascii code (end of medium) ascii_SUB EQU 26 ; ascii code (substitute) ascii_ESC EQU 27 ; ascii code (escape) ascii_FS EQU 28 ; ascii code (file separator) ascii_GS EQU 29 ; ascii code (group separator) ascii_RS EQU 30 ; ascii code (record separator) ascii_US EQU 31 ; ascii code (unit space) ascii_SPACE EQU 32 ; ascii code ascii_EXCLAIM EQU 33 ; ascii code ascii_DBLQUOT EQU 34 ; ascii code ascii_NUMSIGN EQU 35 ; ascii code ascii_DOLLAR EQU 36 ; ascii code ascii_PERCENT EQU 37 ; ascii code ascii_AMP EQU 38 ; ascii code ascii_SINQUOT EQU 39 ; ascii code ascii_LPAREN EQU 40 ; ascii code ascii_RPAREN EQU 41 ; ascii code ascii_ASTERISK EQU 42 ; ascii code ascii_PLUS EQU 43 ; ascii code ascii_COMMA EQU 44 ; ascii code ascii_MINUS EQU 45 ; ascii code ascii_PERIOD EQU 46 ; ascii code ascii_FWDSLASH EQU 47 ; ascii code ascii_0 EQU 48 ; ascii code ascii_1 EQU 49 ; ascii code ascii_2 EQU 50 ; ascii code ascii_3 EQU 51 ; ascii code ascii_4 EQU 52 ; ascii code ascii_5 EQU 53 ; ascii code ascii_6 EQU 54 ; ascii code ascii_7 EQU 55 ; ascii code ascii_8 EQU 56 ; ascii code ascii_9 EQU 57 ; ascii code ascii_COLON EQU 58 ; ascii code ascii_SEMI EQU 59 ; ascii code ascii_LESS EQU 60 ; ascii code ascii_EQUAL EQU 61 ; ascii code ascii_GREATER EQU 62 ; ascii code ascii_QUESTION EQU 63 ; ascii code ascii_CIRCAT EQU 64 ; ascii code ascii_A EQU 65 ; ascii code ascii_B EQU 66 ; ascii code ascii_C EQU 67 ; ascii code ascii_D EQU 68 ; ascii code ascii_E EQU 69 ; ascii code ascii_F EQU 70 ; ascii code ascii_G EQU 71 ; ascii code ascii_H EQU 72 ; ascii code ascii_I EQU 73 ; ascii code ascii_J EQU 74 ; ascii code ascii_K EQU 75 ; ascii code ascii_L EQU 76 ; ascii code ascii_M EQU 77 ; ascii code ascii_N EQU 78 ; ascii code ascii_O EQU 79 ; ascii code ascii_P EQU 80 ; ascii code ascii_Q EQU 81 ; ascii code ascii_R EQU 82 ; ascii code ascii_S EQU 83 ; ascii code ascii_T EQU 84 ; ascii code ascii_U EQU 85 ; ascii code ascii_V EQU 86 ; ascii code ascii_W EQU 87 ; ascii code ascii_X EQU 88 ; ascii code ascii_Y EQU 89 ; ascii code ascii_Z EQU 90 ; ascii code ascii_LBKT EQU 91 ; ascii code ascii_BKSLASH EQU 92 ; ascii code ascii_RBKT EQU 93 ; ascii code ascii_CARET EQU 94 ; ascii code ascii_UNDER EQU 95 ; ascii code ascii_TICK EQU 96 ; ascii code ascii_LBRACE EQU $7B ; ascii code ascii_VBAR EQU $7C ; ascii code ascii_RBRACE EQU $7D ; ascii code ascii_TILDE EQU $7E ; ascii code ascii_DEL EQU $7F ; ascii code ; ================================================================ ; Actual assembly program goes here... ; ================================================================ cold_start: LOAD s0, all_clear ; zero out reg s0 LOAD s1, ascii_X ; OUT s1, uart_data_tx ; LOAD s1, ascii_i ; OUT s1, uart_data_tx ; LOAD s1, ascii_l ; OUT s1, uart_data_tx ; LOAD s1, ascii_i ; OUT s1, uart_data_tx ; LOAD s1, ascii_n ; OUT s1, uart_data_tx ; LOAD s1, ascii_x ; OUT s1, uart_data_tx ; LOAD s1, ascii_SPACE ; OUT s1, uart_data_tx ; LOAD s1, ascii_R ; OUT s1, uart_data_tx ; LOAD s1, ascii_u ; OUT s1, uart_data_tx ; LOAD s1, ascii_l ; OUT s1, uart_data_tx ; LOAD s1, ascii_e ; OUT s1, uart_data_tx ; LOAD s1, ascii_s ; OUT s1, uart_data_tx ; LOAD s1, ascii_EXCLAIM ; OUT s1, uart_data_tx ; LOAD s1, ascii_CR ; OUT s1, uart_data_tx ; LOAD s1, ascii_LF ; OUT s1, uart_data_tx ; ; LAB TASK #2 ; Write code to output a short (10 characters ; or less) message to the serial port. loop: IN s1, switch_in ; read switch state OUT s1, leds_out ; write it to leds COMP s1 , switch_in ; if switch value reads 10101010, JUMP rs232_echo ; then go to init_count function, else jump to rs32_echo init_count: ; output leds ; Load the value of 0 into register; count: ; output leds ; increment register by 1 ; is count value 255? ; if no, then loop back to beginning of count ; LAB TASK #1 ; Write code to read the switch state and ; then write it to the LED control port. rs232_echo: IN s1, data_present ; check uart for data XOR s1, s0 ; used to set flags JUMP Z, loop ; nothing, loop again IN s1, uart_data_rx ; read received byte OUT s1, uart_data_tx ; write it back out JUMP loop ; loop again ; LAB TASK #3 ; Write code to check if a byte has been ; received by the uart. If so, write it ; back to the uart transmit port. If not ; don't do anything and just... ; ================================================================ ; ; ================================================================