0001 0000 ;Test programs for 8-bit TTL computer. 0002 0000 .ORG 0000H ;Get address from switches and jump to it 0003 0000 10 13 LDI 13H ;JMP instruction 0004 0002 12 00 08 STM 0800H ;Start of RAM 0005 0005 17 00 IN 00H ;Low byte of jump target 0006 0007 12 01 08 STM 0801H 0007 000A 17 01 IN 01H ;High byte of jump target 0008 000C 12 02 08 STM 0802H ;Full jump instruction in place now 0009 000F 13 00 08 JMP 0800H ;Jump to the jump instruction 0010 0012 ;Simple port reflector 0011 0012 17 00 LOOP: IN 00H 0012 0014 18 00 OUT 00H 0013 0016 17 01 IN 01H 0014 0018 18 01 OUT 01H 0015 001A 13 12 00 JMP LOOP 0016 001D ;Simple counter -- run with slow clock 0017 001D 10 00 LDI 00H 0018 001F 18 00 LOOPA: OUT 00H 0019 0021 19 INC 0020 0022 13 1F 00 JMP LOOPA 0021 0025 ;Two-byte up counter -- run with fast clock 0022 0025 10 00 LDI 00H 0023 0027 12 00 08 STM 0800H ;Hi byte 0024 002A 18 01 OUT 01H ;Clear port 1 LEDs 0025 002C 18 00 LOOPB: OUT 00H ;Output low byte 0026 002E 19 INC 0027 002F 14 35 00 JPZ NEXTB ;If zero, jump to increment high byte 0028 0032 13 2C 00 JMP LOOPB ;Low-byte increment loop 0029 0035 11 00 08 NEXTB: LDM 0800H ;Get high byte from memory 0030 0038 19 INC 0031 0039 18 01 OUT 01H ;Output high byte to port 1 LEDs 0032 003B 12 00 08 STM 0800H ;Store high byte 0033 003E 10 00 LDI 00H 0034 0040 13 2C 00 JMP LOOPB ;Go back to low-byte increment loop 0035 0043 ;8-bit highest factor routine 0036 0043 ;Factor test 0037 0043 17 00 FACSTRT:IN 00H ;Number to factor 0038 0045 12 0A 08 STM ORIG 0039 0048 12 0B 08 STM TESTF 0040 004B 11 0B 08 LOOP15: LDM TESTF 0041 004E 1A DEC 0042 004F 12 0B 08 STM TESTF 0043 0052 11 0A 08 LDM ORIG 0044 0055 02 0B 08 LOOP16: SUB TESTF 0045 0058 14 61 00 JPZ DONE ;Factor found 0046 005B 16 55 00 JPC LOOP16 ;For A - B, carry set if A >= B 0047 005E 13 4B 00 JMP LOOP15 ;No carry, means A < B, and not a factor 0048 0061 11 0B 08 DONE: LDM TESTF 0049 0064 18 00 OUT 00H 0050 0066 13 43 00 JMP FACSTRT 0051 0069 ;Test for serial interface with 8-bit code 0052 0069 ;Set port to 9600 baud, 8-bit, no parity, 1 stop bit 0053 0069 10 4E LDI 4EH ;1 stop bit, no parity, 8-bit char, 16x baud 0054 006B 18 03 OUT 03H ;write to UART control port 0055 006D 10 37 LDI 37H ;enable receive and transmit 0056 006F 18 03 OUT 03H ;write to control port 0057 0071 17 03 LOOP1: IN 03H ;get status 0058 0073 0C 02 ANDIM 02H ;check RxRDY bit 0059 0075 14 71 00 JPZ LOOP1 ;not ready, loop 0060 0078 17 02 IN 02H ;get char from data port 0061 007A 18 00 OUT 00H ;put on LEDs 0062 007C 12 06 08 STM TEMP ;store the character 0063 007F 17 03 LOOP2: IN 03H ;get status 0064 0081 0C 01 ANDIM 01H ;check TxRDY bit 0065 0083 14 7F 00 JPZ LOOP2 ;loop if not ready 0066 0086 11 06 08 LDM TEMP ;get char back 0067 0089 18 02 OUT 02H ;send to UART for output 0068 008B 13 71 00 JMP LOOP1 ;start over 0069 008E ;Program loader 0070 008E ;Takes input from serial port, creates byte values from hex character pairs 0071 008E ;Loads byte values sequentially into RAM starting at 0x0810 0072 008E ;Jumps to location 0x0810 to start execution upon receiving return character 0073 008E ;Quits without execution if invalid hex character input received 0074 008E ;Setup routine for serial port 0075 008E 10 4E LDI 4EH ;1 stop bit, no parity, 8-bit char, 16x baud 0076 0090 18 03 OUT 03H ;write to UART control port 0077 0092 10 37 LDI 37H ;enable receive and transmit 0078 0094 18 03 OUT 03H ;write to control port 0079 0096 ;Need to put instruction to store bytes in RAM so can increment the target address 0080 0096 10 12 LDI 12H ;STM instruction 0081 0098 12 00 08 STM STORE_BYTE 0082 009B 10 10 LDI 10H ;Low byte of storage buffer start address 0083 009D 12 01 08 STM STORE_BYTE+1 0084 00A0 10 08 LDI 08H ;Hi byte of storage buffer start address 0085 00A2 12 02 08 STM STORE_BYTE+2 0086 00A5 ;Need to set return jump after STORE_BYTE 0087 00A5 10 13 LDI 13H ;JMP instruction for return 0088 00A7 12 03 08 STM STORE_BYTE+3 0089 00AA 11 9E 01 LDM RETURN ;Lo byte of return address 0090 00AD 12 04 08 STM STORE_BYTE+4 0091 00B0 11 9F 01 LDM RETURN+1 ;Hi byte of return address 0092 00B3 12 05 08 STM STORE_BYTE+5 0093 00B6 10 10 LDI 16 0094 00B8 12 09 08 STM BYTE_COUNTER ;initialize line length variable 0095 00BB 17 03 GET_HI: IN 03H ;Get hi-order nybble of pair 0096 00BD 0C 02 ANDIM 02H ;check RxRDY bit 0097 00BF 14 BB 00 JPZ GET_HI ;not ready, loop 0098 00C2 17 02 IN 02H ;get char from data port 0099 00C4 12 06 08 STM TEMP ;Store character 0100 00C7 0A 0D SUBIM 0DH ;Carriage return? 0101 00C9 14 B2 01 JPZ RUN ;Yes, run code 0102 00CC 17 03 LOOP3: IN 03H ;No, output character and validate 0103 00CE 0C 01 ANDIM 01H ;check TxRDY bit 0104 00D0 14 CC 00 JPZ LOOP3 ;loop if not ready 0105 00D3 11 06 08 LDM TEMP ;get char back 0106 00D6 18 02 OUT 02H ;send to UART for output 0107 00D8 ;Code to validate hex character 0108 00D8 0F 30 CMP 30H ;Lower limit of hex characters 0109 00DA 16 E0 00 JPC NEXT1 ;Char >= 30H, possibly valid 0110 00DD 13 FE 00 JMP INVALID ;Char < 30H, invalid hex char 0111 00E0 0F 47 NEXT1: CMP 47H ;ASCII for "G" 0112 00E2 16 FE 00 JPC INVALID ;Char is G or greater, invalid 0113 00E5 0F 41 CMP 41H ;ASCII for "A" 0114 00E7 16 F2 00 JPC VALIDAF_HI ;Char is valid A-F 0115 00EA 0F 3A CMP 3AH ;ASCII for ":" 0116 00EC 16 FE 00 JPC INVALID ;Char is ":" or greater, but < "A", invalid 0117 00EF 13 F9 00 JMP VALID09_HI ;Char is valid 0-9 0118 00F2 0C 0F VALIDAF_HI: ANDIM 0FH ;Mask off high bits 0119 00F4 08 09 ADDIM 9 ;Adjust ASCII to binary value 0120 00F6 13 01 01 JMP SHIFT_HI 0121 00F9 0C 0F VALID09_HI: ANDIM 0FH ;Mask off high bits 0122 00FB 13 01 01 JMP SHIFT_HI 0123 00FE 13 B5 01 INVALID: JMP ERROR ;Invalid hex char, quit 0124 0101 12 07 08 SHIFT_HI: STM BYTE ;Will eventually contain the byte to load 0125 0104 12 06 08 STM TEMP ;Value to add 0126 0107 10 10 LDI 10H ;Multiply x 16 to shift into high-order nybble 0127 0109 12 08 08 STM COUNTER 0128 010C 11 08 08 MULTLOOP: LDM COUNTER 0129 010F 1A DEC 0130 0110 14 22 01 JPZ GET_LO ;Have added 16 times, done 0131 0113 12 08 08 STM COUNTER 0132 0116 11 06 08 LDM TEMP ;Original nybble 0133 0119 00 07 08 ADD BYTE ;Add to BYTE and store 0134 011C 12 07 08 STM BYTE 0135 011F 13 0C 01 JMP MULTLOOP ;Keep adding 0136 0122 17 03 GET_LO: IN 03H ;Get lo-order nybble of pair 0137 0124 0C 02 ANDIM 02H ;check RxRDY bit 0138 0126 14 22 01 JPZ GET_LO ;not ready, loop 0139 0129 17 02 IN 02H ;get char from data port 0140 012B 12 06 08 STM TEMP ;Store character 0141 012E 17 03 LOOP4: IN 03H ;Output character 0142 0130 0C 01 ANDIM 01H ;check TxRDY bit 0143 0132 14 2E 01 JPZ LOOP4 0144 0135 11 06 08 LDM TEMP ;When ready, retrieve character and output 0145 0138 18 02 OUT 02H 0146 013A 17 03 LOOP5: IN 03H 0147 013C 0C 01 ANDIM 01H 0148 013E 14 3A 01 JPZ LOOP5 0149 0141 10 20 LDI 20H ;Space character 0150 0143 18 02 OUT 02H ;send to UART for output 0151 0145 ;Check if 16 bytes have been displayed. If so, write newline 0152 0145 11 09 08 LDM BYTE_COUNTER ;Check if 16 bytes have been displayed 0153 0148 1A DEC 0154 0149 12 09 08 STM BYTE_COUNTER 0155 014C 14 52 01 JPZ NEXT4 ;Yes, reset counter and write newline 0156 014F 13 6D 01 JMP NEXT5 ;No, keep going 0157 0152 10 10 NEXT4: LDI 16 0158 0154 12 09 08 STM BYTE_COUNTER 0159 0157 17 03 LOOP6: IN 03H 0160 0159 0C 01 ANDIM 01H 0161 015B 14 57 01 JPZ LOOP6 0162 015E 10 0D LDI 0DH ;Return character 0163 0160 18 02 OUT 02H ;send to UART for output 0164 0162 17 03 LOOP7: IN 03H 0165 0164 0C 01 ANDIM 01H 0166 0166 14 62 01 JPZ LOOP7 0167 0169 10 0A LDI 0AH ;Linefeed character 0168 016B 18 02 OUT 02H ;send to UART for output 0169 016D ;Code to validate hex character 0170 016D 11 06 08 NEXT5: LDM TEMP ;Retrieve character and validate 0171 0170 0F 30 CMP 30H ;Lower limit of hex characters 0172 0172 16 78 01 JPC NEXT2 ;Char >= 30H, possibly valid 0173 0175 13 FE 00 JMP INVALID ;Char < 30H, invalid hex char 0174 0178 0F 47 NEXT2: CMP 47H ;ASCII for "G" 0175 017A 16 FE 00 JPC INVALID ;Char is G or greater, invalid 0176 017D 0F 41 CMP 41H ;ASCII for "A" 0177 017F 16 8A 01 JPC VALIDAF_LO ;Char is valid A-F 0178 0182 0F 3A CMP 3AH ;ASCII for ":" 0179 0184 16 FE 00 JPC INVALID ;Char is ":" or greater, but < "A", invalid 0180 0187 13 94 01 JMP VALID09_LO ;Char is valid 0-9 0181 018A 0C 0F VALIDAF_LO: ANDIM 0FH ;Mask off high bits 0182 018C 08 09 ADDIM 9 ;Now lo nybble correct 0183 018E 00 07 08 ADD BYTE ;Combine with hi nybble stored in BYTE 0184 0191 13 99 01 JMP STORE ;Store the byte in RAM 0185 0194 0C 0F VALID09_LO: ANDIM 0FH ;Mask off high bits 0186 0196 00 07 08 ADD BYTE ;Now full byte assembled 0187 0199 18 00 STORE: OUT 00H ;Display on LEDs 0188 019B 13 00 08 JMP STORE_BYTE ;Store the byte in RAM 0189 019E A0 01 RETURN: .DW $+2 ;Address to return from storage instruction 0190 01A0 11 01 08 LDM STORE_BYTE+1 ;Increment byte pointer, lo byte first 0191 01A3 19 INC 0192 01A4 12 01 08 STM STORE_BYTE+1 0193 01A7 11 02 08 LDM STORE_BYTE+2 ;Increment hi byte if a carry occurred when lo byte incremented 0194 01AA 09 00 ADCIM 00H 0195 01AC 12 02 08 STM STORE_BYTE+2 0196 01AF 13 BB 00 JMP GET_HI 0197 01B2 13 10 08 RUN: JMP 0810H ;Run program 0198 01B5 18 00 ERROR: OUT 00H ;Display erroneous character on LEDs 0199 01B7 13 B7 01 HALT: JMP HALT ;Halt 0200 0800 .ORG 0800H 0201 0800 000000000000STORE_BYTE: .DB 0,0,0,0,0,0 ;Six spaces for storage instruction and return 0202 0806 00 TEMP: .DB 00H ;Temp storage for character, data 0203 0807 00 BYTE: .DB 00H ;For multiplication (shifting) 0204 0808 00 COUNTER: .DB 00H ;For multiplication (shifting) 0205 0809 00 BYTE_COUNTER .DB 00H ;For length of display line 0206 080A 00 ORIG: .DB 00H 0207 080B 00 TESTF: .DB 00H 0208 080C .END tasm: Number of errors = 0