;Test programs for 8-bit TTL computer. .ORG 0000H ;Get address from switches and jump to it LDI 13H ;JMP instruction STM 0800H ;Start of RAM IN 00H ;Low byte of jump target STM 0801H IN 01H ;High byte of jump target STM 0802H ;Full jump instruction in place now JMP 0800H ;Jump to the jump instruction ;Simple port reflector LOOP: IN 00H OUT 00H IN 01H OUT 01H JMP LOOP ;Simple counter -- run with slow clock LDI 00H LOOPA: OUT 00H INC JMP LOOPA ;Two-byte up counter -- run with fast clock LDI 00H STM 0800H ;Hi byte OUT 01H ;Clear port 1 LEDs LOOPB: OUT 00H ;Output low byte INC JPZ NEXTB ;If zero, jump to increment high byte JMP LOOPB ;Low-byte increment loop NEXTB: LDM 0800H ;Get high byte from memory INC OUT 01H ;Output high byte to port 1 LEDs STM 0800H ;Store high byte LDI 00H JMP LOOPB ;Go back to low-byte increment loop ;8-bit highest factor routine ;Factor test FACSTRT:IN 00H ;Number to factor STM ORIG STM TESTF LOOP15: LDM TESTF DEC STM TESTF LDM ORIG LOOP16: SUB TESTF JPZ DONE ;Factor found JPC LOOP16 ;For A - B, carry set if A >= B JMP LOOP15 ;No carry, means A < B, and not a factor DONE: LDM TESTF OUT 00H JMP FACSTRT ;Test for serial interface with 8-bit code ;Set port to 9600 baud, 8-bit, no parity, 1 stop bit 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 LOOP1: IN 03H ;get status ANDIM 02H ;check RxRDY bit JPZ LOOP1 ;not ready, loop IN 02H ;get char from data port OUT 00H ;put on LEDs STM TEMP ;store the character LOOP2: IN 03H ;get status ANDIM 01H ;check TxRDY bit JPZ LOOP2 ;loop if not ready LDM TEMP ;get char back OUT 02H ;send to UART for output JMP LOOP1 ;start over ;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 ;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 LDI 16 STM BYTE_COUNTER ;initialize line length variable 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 RUN ;Yes, run code LOOP3: IN 03H ;No, output character and validate ANDIM 01H ;check TxRDY bit JPZ LOOP3 ;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 LOOP4: IN 03H ;Output character ANDIM 01H ;check TxRDY bit JPZ LOOP4 LDM TEMP ;When ready, retrieve character and output OUT 02H LOOP5: IN 03H ANDIM 01H JPZ LOOP5 LDI 20H ;Space character OUT 02H ;send to UART for output ;Check if 16 bytes have been displayed. If so, write newline LDM BYTE_COUNTER ;Check if 16 bytes have been displayed DEC STM BYTE_COUNTER JPZ NEXT4 ;Yes, reset counter and write newline JMP NEXT5 ;No, keep going NEXT4: LDI 16 STM BYTE_COUNTER LOOP6: IN 03H ANDIM 01H JPZ LOOP6 LDI 0DH ;Return character OUT 02H ;send to UART for output LOOP7: IN 03H ANDIM 01H JPZ LOOP7 LDI 0AH ;Linefeed character OUT 02H ;send to UART for output ;Code to validate hex character NEXT5: 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 RUN: 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) BYTE_COUNTER .DB 00H ;For length of display line ORIG: .DB 00H TESTF: .DB 00H .END