;Program loader ;Takes input from serial port, creates byte values from hex character pairs ;Loads byte values sequentially into RAM starting at 0x0810 ;Jumps to location 0x0810 to start execution upon receiving return character ;Quits without execution if invalid hex character input received .ORG 0000H ;Setup routine for serial port LDI 4EH ;1 stop bit, no parity, 8-bit char, 16x baud OUT 03H ;write to UART control port LDI 37H ;enable receive and transmit OUT 03H ;write to control port ;Need to put instruction to store bytes in RAM so can increment the target address LDI 12H ;STM instruction STM STORE_BYTE LDI 10H ;Low byte of storage buffer start address STM STORE_BYTE+1 LDI 08H ;Hi byte of storage buffer start address STM STORE_BYTE+2 ;Need to set return jump after STORE_BYTE LDI 13H ;JMP instruction for return STM STORE_BYTE+3 LDM RETURN ;Lo byte of return address STM STORE_BYTE+4 LDM RETURN+1 ;Hi byte of return address STM STORE_BYTE+5 GET_HI: IN 03H ;Get hi-order nybble of pair ANDIM 02H ;check RxRDY bit JPZ GET_HI ;not ready, loop IN 02H ;get char from data port STM TEMP ;Store character SUBIM 0DH ;Carriage return? JPZ DONE ;Yes, run code LOOP1: IN 03H ;No, output character and validate ANDIM 01H ;check TxRDY bit JPZ LOOP1 ;loop if not ready LDM TEMP ;get char back OUT 02H ;send to UART for output ;Code to validate hex character CMP 30H ;Lower limit of hex characters JPC NEXT1 ;Char >= 30H, possibly valid JMP INVALID ;Char < 30H, invalid hex char NEXT1: CMP 47H ;ASCII for "G" JPC INVALID ;Char is G or greater, invalid CMP 41H ;ASCII for "A" JPC VALIDAF_HI ;Char is valid A-F CMP 3AH ;ASCII for ":" JPC INVALID ;Char is ":" or greater, but < "A", invalid JMP VALID09_HI ;Char is valid 0-9 VALIDAF_HI: ANDIM 0FH ;Mask off high bits ADDIM 9 ;Adjust ASCII to binary value JMP SHIFT_HI VALID09_HI: ANDIM 0FH ;Mask off high bits JMP SHIFT_HI INVALID: JMP ERROR ;Invalid hex char, quit SHIFT_HI: STM BYTE ;Will eventually contain the byte to load STM TEMP ;Value to add LDI 10H ;Multiply x 16 to shift into high-order nybble STM COUNTER MULTLOOP: LDM COUNTER DEC JPZ GET_LO ;Have added 16 times, done STM COUNTER LDM TEMP ;Original nybble ADD BYTE ;Add to BYTE and store STM BYTE JMP MULTLOOP ;Keep adding GET_LO: IN 03H ;Get lo-order nybble of pair ANDIM 02H ;check RxRDY bit JPZ GET_LO ;not ready, loop IN 02H ;get char from data port STM TEMP ;Store character LOOP2: IN 03H ;Output character ANDIM 01H ;check TxRDY bit JPZ LOOP2 LDM TEMP ;When ready, retrieve character and output OUT 02H LOOP3: IN 03H ANDIM 01H JPZ LOOP3 LDI 20H ;Space character OUT 02H ;send to UART for output ;Code to validate hex character LDM TEMP ;Retrieve character and validate CMP 30H ;Lower limit of hex characters JPC NEXT2 ;Char >= 30H, possibly valid JMP INVALID ;Char < 30H, invalid hex char NEXT2: CMP 47H ;ASCII for "G" JPC INVALID ;Char is G or greater, invalid CMP 41H ;ASCII for "A" JPC VALIDAF_LO ;Char is valid A-F CMP 3AH ;ASCII for ":" JPC INVALID ;Char is ":" or greater, but < "A", invalid JMP VALID09_LO ;Char is valid 0-9 VALIDAF_LO: ANDIM 0FH ;Mask off high bits ADDIM 9 ;Now lo nybble correct ADD BYTE ;Combine with hi nybble stored in BYTE JMP STORE ;Store the byte in RAM VALID09_LO: ANDIM 0FH ;Mask off high bits ADD BYTE ;Now full byte assembled STORE: OUT 00H ;Display on LEDs JMP STORE_BYTE ;Store the byte in RAM RETURN: .DW $+2 ;Address to return from storage instruction LDM STORE_BYTE+1 ;Increment byte pointer, lo byte first INC STM STORE_BYTE+1 LDM STORE_BYTE+2 ;Increment hi byte if a carry occurred when lo byte incremented ADCIM 00H STM STORE_BYTE+2 JMP GET_HI DONE: JMP 0810H ;Run program ERROR: OUT 00H ;Display erroneous character on LEDs HALT: JMP HALT ;Halt .ORG 0800H STORE_BYTE: .DB 0,0,0,0,0,0 ;Six spaces for storage instruction and return TEMP: .DB 00H ;Temp storage for character, data BYTE: .DB 00H ;For multiplication (shifting) COUNTER: .DB 00H ;For multiplication (shifting) .END