0001 0000 ;Program loader 0002 0000 ;Takes input from serial port, creates byte values from hex character pairs 0003 0000 ;Loads byte values sequentially into RAM starting at 0x0810 0004 0000 ;Jumps to location 0x0810 to start execution upon receiving return character 0005 0000 ;Quits without execution if invalid hex character input received 0006 0000 .ORG 0000H 0007 0000 ;Setup routine for serial port 0008 0000 10 4E LDI 4EH ;1 stop bit, no parity, 8-bit char, 16x baud 0009 0002 18 03 OUT 03H ;write to UART control port 0010 0004 10 37 LDI 37H ;enable receive and transmit 0011 0006 18 03 OUT 03H ;write to control port 0012 0008 ;Need to put instruction to store bytes in RAM so can increment the target address 0013 0008 10 12 LDI 12H ;STM instruction 0014 000A 12 00 08 STM STORE_BYTE 0015 000D 10 10 LDI 10H ;Low byte of storage buffer start address 0016 000F 12 01 08 STM STORE_BYTE+1 0017 0012 10 08 LDI 08H ;Hi byte of storage buffer start address 0018 0014 12 02 08 STM STORE_BYTE+2 0019 0017 ;Need to set return jump after STORE_BYTE 0020 0017 10 13 LDI 13H ;JMP instruction for return 0021 0019 12 03 08 STM STORE_BYTE+3 0022 001C 11 E3 00 LDM RETURN ;Lo byte of return address 0023 001F 12 04 08 STM STORE_BYTE+4 0024 0022 11 E4 00 LDM RETURN+1 ;Hi byte of return address 0025 0025 12 05 08 STM STORE_BYTE+5 0026 0028 17 03 GET_HI: IN 03H ;Get hi-order nybble of pair 0027 002A 0C 02 ANDIM 02H ;check RxRDY bit 0028 002C 14 28 00 JPZ GET_HI ;not ready, loop 0029 002F 17 02 IN 02H ;get char from data port 0030 0031 12 06 08 STM TEMP ;Store character 0031 0034 0A 0D SUBIM 0DH ;Carriage return? 0032 0036 14 F7 00 JPZ DONE ;Yes, run code 0033 0039 17 03 LOOP1: IN 03H ;No, output character and validate 0034 003B 0C 01 ANDIM 01H ;check TxRDY bit 0035 003D 14 39 00 JPZ LOOP1 ;loop if not ready 0036 0040 11 06 08 LDM TEMP ;get char back 0037 0043 18 02 OUT 02H ;send to UART for output 0038 0045 ;Code to validate hex character 0039 0045 0F 30 CMP 30H ;Lower limit of hex characters 0040 0047 16 4D 00 JPC NEXT1 ;Char >= 30H, possibly valid 0041 004A 13 6B 00 JMP INVALID ;Char < 30H, invalid hex char 0042 004D 0F 47 NEXT1: CMP 47H ;ASCII for "G" 0043 004F 16 6B 00 JPC INVALID ;Char is G or greater, invalid 0044 0052 0F 41 CMP 41H ;ASCII for "A" 0045 0054 16 5F 00 JPC VALIDAF_HI ;Char is valid A-F 0046 0057 0F 3A CMP 3AH ;ASCII for ":" 0047 0059 16 6B 00 JPC INVALID ;Char is ":" or greater, but < "A", invalid 0048 005C 13 66 00 JMP VALID09_HI ;Char is valid 0-9 0049 005F 0C 0F VALIDAF_HI: ANDIM 0FH ;Mask off high bits 0050 0061 08 09 ADDIM 9 ;Adjust ASCII to binary value 0051 0063 13 6E 00 JMP SHIFT_HI 0052 0066 0C 0F VALID09_HI: ANDIM 0FH ;Mask off high bits 0053 0068 13 6E 00 JMP SHIFT_HI 0054 006B 13 FA 00 INVALID: JMP ERROR ;Invalid hex char, quit 0055 006E 12 07 08 SHIFT_HI: STM BYTE ;Will eventually contain the byte to load 0056 0071 12 06 08 STM TEMP ;Value to add 0057 0074 10 10 LDI 10H ;Multiply x 16 to shift into high-order nybble 0058 0076 12 08 08 STM COUNTER 0059 0079 11 08 08 MULTLOOP: LDM COUNTER 0060 007C 1A DEC 0061 007D 14 8F 00 JPZ GET_LO ;Have added 16 times, done 0062 0080 12 08 08 STM COUNTER 0063 0083 11 06 08 LDM TEMP ;Original nybble 0064 0086 00 07 08 ADD BYTE ;Add to BYTE and store 0065 0089 12 07 08 STM BYTE 0066 008C 13 79 00 JMP MULTLOOP ;Keep adding 0067 008F 17 03 GET_LO: IN 03H ;Get lo-order nybble of pair 0068 0091 0C 02 ANDIM 02H ;check RxRDY bit 0069 0093 14 8F 00 JPZ GET_LO ;not ready, loop 0070 0096 17 02 IN 02H ;get char from data port 0071 0098 12 06 08 STM TEMP ;Store character 0072 009B 17 03 LOOP2: IN 03H ;Output character 0073 009D 0C 01 ANDIM 01H ;check TxRDY bit 0074 009F 14 9B 00 JPZ LOOP2 0075 00A2 11 06 08 LDM TEMP ;When ready, retrieve character and output 0076 00A5 18 02 OUT 02H 0077 00A7 17 03 LOOP3: IN 03H 0078 00A9 0C 01 ANDIM 01H 0079 00AB 14 A7 00 JPZ LOOP3 0080 00AE 10 20 LDI 20H ;Space character 0081 00B0 18 02 OUT 02H ;send to UART for output 0082 00B2 ;Code to validate hex character 0083 00B2 11 06 08 LDM TEMP ;Retrieve character and validate 0084 00B5 0F 30 CMP 30H ;Lower limit of hex characters 0085 00B7 16 BD 00 JPC NEXT2 ;Char >= 30H, possibly valid 0086 00BA 13 6B 00 JMP INVALID ;Char < 30H, invalid hex char 0087 00BD 0F 47 NEXT2: CMP 47H ;ASCII for "G" 0088 00BF 16 6B 00 JPC INVALID ;Char is G or greater, invalid 0089 00C2 0F 41 CMP 41H ;ASCII for "A" 0090 00C4 16 CF 00 JPC VALIDAF_LO ;Char is valid A-F 0091 00C7 0F 3A CMP 3AH ;ASCII for ":" 0092 00C9 16 6B 00 JPC INVALID ;Char is ":" or greater, but < "A", invalid 0093 00CC 13 D9 00 JMP VALID09_LO ;Char is valid 0-9 0094 00CF 0C 0F VALIDAF_LO: ANDIM 0FH ;Mask off high bits 0095 00D1 08 09 ADDIM 9 ;Now lo nybble correct 0096 00D3 00 07 08 ADD BYTE ;Combine with hi nybble stored in BYTE 0097 00D6 13 DE 00 JMP STORE ;Store the byte in RAM 0098 00D9 0C 0F VALID09_LO: ANDIM 0FH ;Mask off high bits 0099 00DB 00 07 08 ADD BYTE ;Now full byte assembled 0100 00DE 18 00 STORE: OUT 00H ;Display on LEDs 0101 00E0 13 00 08 JMP STORE_BYTE ;Store the byte in RAM 0102 00E3 E5 00 RETURN: .DW $+2 ;Address to return from storage instruction 0103 00E5 11 01 08 LDM STORE_BYTE+1 ;Increment byte pointer, lo byte first 0104 00E8 19 INC 0105 00E9 12 01 08 STM STORE_BYTE+1 0106 00EC 11 02 08 LDM STORE_BYTE+2 ;Increment hi byte if a carry occurred when lo byte incremented 0107 00EF 09 00 ADCIM 00H 0108 00F1 12 02 08 STM STORE_BYTE+2 0109 00F4 13 28 00 JMP GET_HI 0110 00F7 13 10 08 DONE: JMP 0810H ;Run program 0111 00FA 18 00 ERROR: OUT 00H ;Display erroneous character on LEDs 0112 00FC 13 FC 00 HALT: JMP HALT ;Halt 0113 0800 .ORG 0800H 0114 0800 000000000000STORE_BYTE: .DB 0,0,0,0,0,0 ;Six spaces for storage instruction and return 0115 0806 00 TEMP: .DB 00H ;Temp storage for character, data 0116 0807 00 BYTE: .DB 00H ;For multiplication (shifting) 0117 0808 00 COUNTER: .DB 00H ;For multiplication (shifting) 0118 0809 .END tasm: Number of errors = 0