!M 0000 ; 0001 ORG #8000 8000 ; 0002 .. 08/20/17: D. Hunter 8000 ; 0003 .. UT4V - version modified for MicroVIP 8000 ; 0004 .. uses scratch pad at C000 rather than 8C00 8000 ; 0005 .. replaced output port functions because those are for the CDP18S020 board 8000 ; 0006 .. 8000 ; 0007 .. NOTES: 8000 ; 0008 .. 1. This was written for teletype speeds, use 300 baud for the serial port 8000 ; 0009 .. 2. The RCA list file format is designed to be compatible with the !M command 8000 ; 0010 .. so a listing can be sent to UT4 directly without needing a separate 8000 ; 0011 .. hex or binary file 8000 ; 0012 .. 3. Q (inverted) = serial out, EF2 (inverted) = serial in 8000 ; 0013 ................................................................................. 8000 ; 0014 .. UT4 IS A UTILITY PROGRAM TO ALTER 8000 ; 0015 .. MEMORY, DUMP MEMORY AND BEGIN PROGRAM 8000 ; 0016 .. EXECUTION AT A GIVEN LOCATION. THE COMMANDS ACCEPTED ARE: 8000 ; 0017 .. 8000 ; 0018 .. $PHHHH (BEGIN EXECUTION AT THE SPECIFIED LOCATION WITH R0 AS PROGRAM COUNTER) 8000 ; 0019 .. !MHHHH (PUT DATA AT SPECIFIED LOCATION) 8000 ; 0020 .. ?MHHHH HHHH (OUTPUT DATA FROM SPECIFIED LOCATION FOR SPECIFIC COUNT) 8000 ; 0021 .. 8000 ; 0022 .. AT THE BEGINNING OF A COMMAND ALL CHARACTERS ARE 8000 ; 0023 .. IGNORED UNTIL A ?,! OR $ IS ENCOUNTERED. IN THE ?M AND !M COMMANDS 8000 ; 0024 .. NON HEX CHARACTERS ARE IGNORED AFTER M UNTIL A 8000 ; 0025 .. HEX IS READ, THEN THE FIRST NON HEX CHARACTER MUST BE A SPACE. 8000 ; 0026 .. NON HEX CHARACTERS BETWEEN HEX PAIRS OF THE DATA IN 8000 ; 0027 .. THE !M COMMAND ARE IGNORED EXCEPT FOR CR, SEMICOLON AND COMMA. 8000 ; 0028 .. THE BAUD RATE OF UT4 IS DEPENDENT UPON THE TERMINAL BEING USED. 8000 ; 0029 .. A CR OR LF IS ENTERED AT THE BEGINNING TO SPECIFY THE APPROPRIATE 8000 ; 0030 .. DELAY BETWEEN BITS. UT4 WILL ECHO CHARACTERS IF A CR IS CHOSEN AS THE 8000 ; 0031 .. TIMING CHARACTER. ECHOING WILL NOT TAKE PLACE IF A LF IS INPUT 8000 ; 0032 .. AS THE TIMING CHARACTER. 8000 ; 0033 .. UT4, AT INITIALIZATION, STORES ALL REGISTERS BETWEEN 8C00 AND 8C1F IF IT 8000 ; 0034 .. FINDS RAM THERE. (BUT R0, R1 AND R4.1 ARE CLOBBERED) 8000 ; 0035 8000 ; 0036 PTER: EQU #00 .. AUXILIARY FOR MAIN ROUTINE 8000 ; 0037 CL: EQU #01 .. CLOBBERED 8000 ; 0038 ST: EQU #02 .. STACK POINTER-ONLY 8000 ; 0039 .. REFERENCE TO RAM 8000 ; 0040 SUB: EQU #03 .. SUBROUTINE PC 8000 ; 0041 PC: EQU #05 .. MAIN PROGRAM COUNTER 8000 ; 0042 SWITCH: EQU #01 .. DISTINGUISHES BETWEEN ?M AND !M 8000 ; 0043 DELAY: EQU #0C .. DELAY ROUTINE PROGRAM COUNTER 8000 ; 0044 ASL: EQU #0D .. HEX ASSEMBLY REG ON INPUT. 8000 ; 0045 .. AUX FOR HEX OUTPUT 8000 ; 0046 CENTER: EQU #0D .. USED TO COUNT OUTPUT BYTES 8000 ; 0047 AUX: EQU #0E .. AUX.1 HOLDS BIT-TIME CONSTANT 8000 ; 0048 CHAR: EQU #0F .. CHAR.1 HOLDS I/O BYTE 8000 ; 0049 .. 8000 ; 0050 .. ENTER IN R0 8000 C4; 0051 NOP 8001 F880; 0052 LDI A.1(UT4).. SET PC WHILE 8003 B0; 0053 PHI R0 .. ROM MAPPED TO LOWEST PAGE 8004 ; 0054 .. 8004 ; 0055 .. THE FOLLOWING WRITE REGISTER CONTENTS INTO 8004 ; 0056 .. C000-C01F IF IT EXISTS. BFFE IS ASSUMED NOT 8004 ; 0057 .. TO BE RAM (ELSE ROUTINE OVERRUNS) 8004 F8C0; 0058 LDI #C0 8006 B1; 0059 PHI CL .. CL IS CLOBBERED 8007 ; 0060 .. BY THIS ROUTINE 8007 F81E; 0061 LDI #1E 8009 A1; 0062 PLO CL .. SET UP WHRE RF.0 800A ; 0063 .. IS TO GO, MINUS 1 800A F8A0; 0064 LDI #A0 800C B4; 0065 PHI R4 .. R4.1 STORES A MODIFIED 800D ; 0066 .. INSTRUCTION 800D E1; 0067 SEX CL 800E F8D0; 0068 LOOP2: LDI #D0 8010 51; 0069 STR CL .. SET UP SEP INSTRUCTION 8011 ; 0070 .. FOR RETURN 8011 F3; 0071 XOR .. CHECK THAT IT WROTE 8012 3A29; 0072 BNZ UT4 8014 21; 0073 DEC CL .. PREPARE FOR MODIFIED 8015 ; 0074 .. INSTRUCTION 8015 94; 0075 GHI R4 8016 FC70; 0076 ADI #70 .. SEE IF IT IS IN THE 90'S 8018 331C; 0077 BDF * + #04 801A FC21; 0078 ADI #21 .. IF NO, 8N BECOMES 9N 801C FC7F; 0079 ADI #7F .. IF YES, 9N BECOMES 8(N-1) 801E ; 0080 801E B4; 0081 PHI R4 801F 51; 0082 STR CL .. SET MODIFIED INSTR 8020 ; 0083 .. INTO RAM 8020 F3; 0084 XOR .. CK THAT IT WROTE 8021 3A29; 0085 BNZ UT4 .. EXIT WHEN OUT OF RAM 8023 D1; 0086 SEP CL .. GO TO EXECUTE INSTR 8024 ; 0087 .. (80-9F) 8024 51; 0088 STR CL .. STORE RESULT IN RAM 8025 21; 0089 DEC CL 8026 21; 0090 DEC CL .. BACK UP FOR NEXT BYTE 8027 300E; 0091 BR LOOP2 8029 ; 0092 8029 90; 0093 UT4: GHI R0 802A B5; 0094 PHI PC 802B B3; 0095 PHI SUB .. #80-> PC.1 802C ; 0096 .. AND SUB.1 802C F830; 0097 LDI A.0(UT4A) 802E A5; 0098 PLO PC 802F D5; 0099 SEP PC 8030 E5; 0100 UT4A: SEX PC 8031 71; 0101 DIS 8032 55; 0102 ,#55 .. NOTE PC=5 ASSUMED HERE 8033 65; 0103 OUT 5 8034 01; 0104 ,#01 .. SELECT Q FOR SERIAL OUTPUT 8035 E5; 0105 SEX PC .. NOP 8036 E5; 0106 SEX PC .. NOP 8037 F8FE; 0107 LDI A.0(TIMALC) 8039 A3; 0108 PLO SUB .. READ ONE 803A ; 0109 .. TO SET TIMER 803A D3; 0110 SEP SUB 803B ; 0111 .. 803B ; 0112 .. INITIALIZATION NOW DONE 803B ; 0113 .. 803B F89C; 0114 START: LDI A.0(TYPE5D) 803D A3; 0115 PLO SUB 803E D3; 0116 SEP SUB 803F 0D; 0117 ,#0D .. CR = CARRIAGE RETURN 8040 D3; 0118 ST2: SEP SUB 8041 0A; 0119 ,#0A .. LF = LINE FEED 8042 D3; 0120 SEP SUB 8043 2A; 0121 ,#2A .. * AS PROMPT CHARACTER 8044 F800; 0122 IGNORE: LDI #00 8046 AD; 0123 PLO ASL 8047 BD; 0124 PHI ASL .. PREPARE TO INPUT 8048 ; 0125 .. HEX DIGITS, CLEAR ASL 8048 F83B; 0126 LDI A.0(READAH) 804A A3; 0127 PLO SUB 804B D3; 0128 SEP SUB .. INPUT COMMAND 804C FB24; 0129 XRI #24 .. IS IT $ ? 804E 32D6; 0130 BZ DOLLAR 8050 FB05; 0131 XRI #05 .. IS IT ! ? (TEST WITH $.XOR.!) 8052 A1; 0132 PLO SWITCH .. AND SAVE RESULT 8053 CE; 0133 LSZ .. EQUIV TO BR RDARGS 8054 FB1E; 0134 XRI #1E .. IS IT ? 8056 ; 0135 .. ? (TEST WITH $.XOR.!.XOR.?) 8056 3A44; 0136 BNZ IGNORE .. IGNORE ALL UNTIL A COMMAND IS 8058 ; 0137 .. READ 8058 ; 0138 .. 8058 ; 0139 .. THE FOLLOWING IS COMMON FOR ?M AND !M 8058 ; 0140 .. (SWITCH.0 = 0 FOR THE LATTER) 8058 ; 0141 .. 8058 D3; 0142 RDARGS: SEP SUB .. NOTE SUB AT READAH. NOW 8059 ; 0143 .. READ HEX ARGS 8059 FB4D; 0144 XRI #4D .. SHOULD BE M 805B 3ACC; 0145 BNZ SYNERR 805D D3; 0146 RD1: SEP SUB 805E 3B5D; 0147 BNF * - #01 .. IGNORE NON HEX CHARS. 8060 ; 0148 .. AFTER M. 8060 D3; 0149 SEP SUB 8061 3360; 0150 BDF * - #01 .. READ IN FIRST ARG 8063 ; 0151 .. (LOCATION IN MEMORY) 8063 FB20; 0152 XRI #20 .. NEXT CHAR SHOULD BE A SPACE 8065 3ACC; 0153 BNZ SYNERR 8067 ; 0154 8067 9D; 0155 GHI ASL 8068 B0; 0156 PHI PTER 8069 8D; 0157 GLO ASL 806A A0; 0158 PLO PTER .. PTER NOW POINTS INTO 806B ; 0159 .. USER MEMORY 806B 81; 0160 GLO SWITCH .. LOOK AT SWITCH 806C 32B6; 0161 BZ EX1 .. IF 0 IT WAS ! 806E ; 0162 .. OTHERWISE IT WAS ? 806E ; 0163 806E ; 0164 .. THE FOLLOWING DOES (?M LOC COUNT) COMMAND 806E ; 0165 .. 806E F800; 0166 LDI #00 8070 AD; 0167 PLO ASL 8071 BD; 0168 PHI ASL .. CLEAR ASL 8072 D3; 0169 RD2: SEP SUB 8073 3372; 0170 BDF RD2 .. READ IN SECOND ARG 8075 ; 0171 .. (NUMBER OF BYTES) 8075 FB0D; 0172 XRI #0D .. NEXT CK FOR CR 8077 3ACC; 0173 BNZ SYNERR 8079 F89C; 0174 LDI A.0(TYPE5D) 807B A3; 0175 PLO SUB .. TYPE 807C 8D; 0176 GLO ASL 807D A1; 0177 PLO SWITCH 807E 9D; 0178 GHI ASL 807F B1; 0179 PHI SWITCH 8080 D3; 0180 LINE: SEP SUB 8081 0A; 0181 ,#0A .. LF 8082 90; 0182 LINE1: GHI PTER 8083 BF; 0183 PHI CHAR .. PREPARE LINE READING 8084 F8AE; 0184 LDI A.0(TYPE2) 8086 A3; 0185 PLO SUB 8087 D3; 0186 SEP SUB .. TYPE 2 HEX DIGIT 8088 80; 0187 GLO PTER 8089 BF; 0188 PHI CHAR 808A F8AE; 0189 LDI A.0(TYPE2) 808C A3; 0190 PLO SUB 808D D3; 0191 SEP SUB 808E D3; 0192 SEP SUB .. TYPE SPACE 808F 20; 0193 ,#20 8090 ; 0194 .. 8090 40; 0195 TLOOP: LDA PTER 8091 BF; 0196 PHI CHAR .. FETCH 1 BYTE FOR TYPING 8092 F8AE; 0197 LDI A.0(TYPE2) 8094 A3; 0198 PLO SUB 8095 D3; 0199 SEP SUB .. TYPE 2 HEX 8096 21; 0200 DEC SWITCH 8097 81; 0201 GLO SWITCH 8098 3A9D; 0202 BNZ TL3 .. BRANCH IF NOT DONE YET 809A 91; 0203 GHI SWITCH 809B 323B; 0204 BZ START .. BRANCH IF DONE 809D 80; 0205 TL3: GLO PTER 809E FA0F; 0206 ANI #0F .. IF PTER IS DIV BY 16 80A0 3AA8; 0207 BNZ TL2 80A2 D3; 0208 SEP SUB 80A3 3B; 0209 ,#3B .. IF YES, TYPE ; THEN 80A4 D3; 0210 SEP SUB 80A5 0D; 0211 ,#0D .. CR AND 80A6 3080; 0212 BR LINE 80A8 F6; 0213 TL2: SHR .. DIV BY 2? 80A9 3390; 0214 BDF TLOOP .. IF NO LOOP BACK, ELSE 80AB 308E; 0215 BR TLOOP - #02.. AND THEN LOOP BACK 80AD ; 0216 .. 80AD ; 0217 .. THE FOLLOWING DOES (!M LOC DATA) COMMAND 80AD ; 0218 .. ENTER AT EX1 80AD ; 0219 .. 80AD ; 0220 .. EFFECT OF THE FOLLOWING IS TO READ IN HEX 80AD ; 0221 .. TERMINATING WITH A CR, IGNORING NON-HEX CHARS 80AD ; 0222 .. PAIRS; EXCEPTIONS: A COMMA BEFORE A CR ALLOWS 80AD ; 0223 .. THE INPUT TO CONTINUE ON THE NEXT LINE AND A 80AD ; 0224 .. SEMICOLON ALLOWS AN !M COMMAND TO 80AD ; 0225 .. BE ASSUMED 80AD ; 0226 .. 80AD D3; 0227 EX3: SEP SUB .. INPUT UNTIL A HEX IS READ 80AE 3BAD; 0228 BNF EX3 80B0 ; 0229 .. 80B0 D3; 0230 EX2: SEP SUB .. LOOKING FOR SECOND HEX DIGIT 80B1 3BCC; 0231 BNF SYNERR .. BR IF NOT HEX 80B3 8D; 0232 GLO ASL 80B4 50; 0233 STR PTER .. **SET BYTE** 80B5 10; 0234 INC PTER 80B6 D3; 0235 EX1: SEP SUB .. NOTE SUB AT READAH 80B7 33B0; 0236 BDF EX2 .. BR IF HEX 80B9 FB0D; 0237 XRI #0D .. CHECK IF CR 80BB 323B; 0238 BZ START 80BD FB21; 0239 EX4: XRI #21 .. ELSE CK IF COMMA 80BF ; 0240 .. (TEST WITH CR.XOR.,) 80BF 32AD; 0241 BZ EX3 .. IF ELSE BRANCH 80C1 FB17; 0242 XRI #17 .. CK FOR SEMICOLON (TEST WITH 80C3 ; 0243 .. CR.XOR.,.XOR.;) 80C3 3AB6; 0244 BNZ EX1 .. IGNORE ALL ELSE 80C5 D3; 0245 SEP SUB .. ON SEMI IGNORE ALL UNTIL CR 80C6 ; 0246 .. THEN LOOP BACK 80C6 FB0D; 0247 XRI #0D 80C8 3AC5; 0248 BNZ * - #03 80CA 305D; 0249 BR RD1 .. THEN BRANCH BACK 80CC ; 0250 .. FOR !M COMMAND 80CC ; 0251 .. 80CC F89C; 0252 SYNERR: LDI A.0(TYPE5D) 80CE A3; 0253 PLO SUB .. GENERAL RESULT OF SYNTACTIC ERROR 80CF D3; 0254 SEP SUB 80D0 0D; 0255 ,#0D .. CR 80D1 C081F8; 0256 LBR FSYNER .. FINISH ERROR MSG 80D4 ; 0257 .. 80D4 ; 0258 .. THE FOLLOWING DOES $P HHHH 80D4 ; 0259 ORG #80D6 80D6 D3; 0260 DOLLAR: SEP SUB .. NOTE SUB.0 = READAH 80D7 FB50; 0261 XRI #50 .. SHOULD BE P 80D9 3ACC; 0262 BNZ SYNERR 80DB D3; 0263 D1: SEP SUB 80DC 33DB; 0264 BDF D1 .. ASSEMBLE HEX 80DE ; 0265 .. STRING INTO ASL 80DE FB0D; 0266 XRI #0D .. FIRST NON-HEX MUST BE CR 80E0 3ACC; 0267 BNZ SYNERR 80E2 9D; 0268 GHI ASL 80E3 B0; 0269 PHI R0 80E4 8D; 0270 GLO ASL 80E5 A0; 0271 PLO R0 .. SET UP NEXT PC 80E6 F89C; 0272 LDI A.0(TYPE5D) 80E8 A3; 0273 PLO SUB 80E9 D3; 0274 SEP SUB 80EA 0A; 0275 ,#0A .. LF 80EB E5; 0276 SEX PC 80EC 70; 0277 RET 80ED 00; 0278 ,#00 .. AND USER PROGRAM BEGINS (IN R0) 80EE ; 0279 .. EXIT TO UT4 80EE ; 0280 .. 80EE ; 0281 .. 80EE ; 0282 .. 80EE ; 0283 .. SUBROUTINES 80EE ; 0284 .. 80EE ; 0285 .. DELAY ROUTINE 80EE ; 0286 .. DELAY IS 2(1_AUX.1(3+@SUB)) 80EE ; 0287 .. USED BY TYPE, READ, AND TIMALC. 80EE ; 0288 .. AUX.1 IS ASSUMED TO HOLD A DELAY CONSTANT 80EE ; 0289 .. = ((BIT TIME OF TERMINAL)/(20*INSTR TIME OF COSMAC)) - 1. 80EE ; 0290 .. THIS CONSTANT CAN BE GENERATED 80EE ; 0291 .. AUTOMATICALLY BY THE TIMALC ROUTINE. 80EE ; 0292 .. 80EE D3; 0293 DEXIT: SEP SUB 80EF 9E; 0294 DELAY1: GHI AUX 80F0 F6; 0295 SHR 80F1 AE; 0296 PLO AUX .. SHIFT OUT ECHO FLAG 80F2 2E; 0297 DELAY2: DEC AUX .. AUX.0 HOLDS BASIC BIT DELAY 80F3 43; 0298 LDA SUB 80F4 FF01; 0299 SMI #01 .. PICK UP A CONSTANT 80F6 3AF4; 0300 BNZ * - #02 .. LOOP AS SPECIFIED BY CALL 80F8 8E; 0301 GLO AUX .. DONE YET? 80F9 32EE; 0302 BZ DEXIT 80FB 23; 0303 DEC SUB .. POINTS SUB AT DELAY POINTER 80FC 30F2; 0304 BR DELAY2 80FE ; 0305 .. 80FE ; 0306 .. ROUTINE TO CALCULATE BIT TIME AND ECHO FLAG. 80FE ; 0307 .. WAITS FOR LF (NO ECHO) OR CR (ECHO) TO BE TYPED IN. 80FE ; 0308 .. ALSO SETS UP POINTER TO DELAY ROUTINE. 80FE ; 0309 .. AUX.1 ENDS UP HOLDING, IN THE MOST SIGNIFICANT 7 BITS, 80FE ; 0310 .. THE DELAY CONSTANT. LEAST SIGNIFICANT BIT IS 0 FOR ECHO, 80FE ; 0311 .. 1 FOR NO ECHO 80FE ; 0312 .. 80FE 93; 0313 TIMALC: GHI SUB 80FF BC; 0314 PHI DELAY 8100 F800; 0315 LDI #00 8102 AE; 0316 PLO AUX 8103 AF; 0317 PLO CHAR 8104 F8EF; 0318 LDI A.0(DELAY1) 8106 AC; 0319 PLO DELAY .. DELAY ROUTINE READY 8107 3507; 0320 B2 * .. WAIT FOR START BIT 8109 3D09; 0321 BN2 * .. WAIT FOR FIRST NON-ZERO BIT 810B F803; 0322 LDI #03 .. SET UP FOR 10 EXECUTIONS 810D ; 0323 .. SO ROUND-OFF IS MINIMAL 810D FF01; 0324 TC2: SMI #01 810F 3A0D; 0325 BNZ * - #02 8111 8F; 0326 GLO CHAR .. LOOK TO SEE IF DATA CHANGED 8112 ; 0327 .. PREVIOUSLY 8112 3A17; 0328 BNZ ZRONE .. BR IF IT HAD 8114 3519; 0329 B2 INCR .. ELSE LOOK FOR CHANGE TO 0 NOW 8116 ; 0330 .. BRANCH IF NO 8116 1F; 0331 INC CHAR .. IF YES, SET SWITCH 8117 351E; 0332 ZRONE: B2 DAUX .. LOOK FOR CHANGE TO 1, 8119 ; 0333 .. BR IF YES 8119 1E; 0334 INCR: INC AUX 811A F807; 0335 LDI #07 .. SET UP FOR 20 INSTR LOOP 811C 300D; 0336 BR TC2 811E ; 0337 .. AUX.0 NOW HOLDS #LOOPS IN 2 BIT TIMES 811E 2E; 0338 DAUX: DEC AUX 811F 2E; 0339 DEC AUX .. REDUCE COUNT TO BALANCE FIXED 8120 ; 0340 .. OVERLOAD IN CALLING DELAY 8120 8E; 0341 GLO AUX 8121 F901; 0342 ORI #01 8123 BE; 0343 PHI AUX .. LSB AUX.1 = 8124 DC; 0344 SEP RC .. 1.5 BIT TIME DELAY 8125 0C; 0345 ,#0C 8126 3D2C; 0346 BN2 WAIT .. BR IF LF => NO ECHO, LSB AUX.1=1 8128 9E; 0347 GHI AUX 8129 FAFE; 0348 ANI #FE 812B BE; 0349 PHI AUX .. CR => ECHO, LSB AUX.1=0 812C DC; 0350 WAIT: SEP RC 812D 26; 0351 ,#26 812E D5; 0352 SEP R5 812F ; 0353 .. 812F ; 0354 .. 812F ; 0355 .. 812F ; 0356 .. READ ROUTINE -- READS 1 BYTE INTO CHAR.1 812F ; 0357 .. WHEN ENTERED VIA READAH, THEN 812F ; 0358 .. IF INPUT IS A HEX DIGIT ITS HEX VALUE 812F ; 0359 .. IS SHIFTED INTO ASL FROM THE RIGHT 812F ; 0360 .. AND DF=1, ELSE DF=0; CLOBBERS CHAR, AUX.0 (ASL 812F ; 0361 .. ON READAH). LEAVES BYTE IN D (BUT CLOBBERED IF 812F ; 0362 .. SUBR LINKAGE IS USED). LEAVES PC AT READAH 812F ; 0363 .. ENTRY POINT; EXITS TO R5 812F ; 0364 .. 812F ; 0365 .. WARNING: READ PROCESS HAS NOT FINISHED. DO 812F ; 0366 .. NOT TYPE IMMEDIATELY, OR ELSE ENTER TYPE VIA 812F ; 0367 .. TYPE5D 812F ; 0368 .. 812F ; 0369 ORG #812F 812F FC07; 0370 CKDEC: ADI #07 .. CHECK FOR ASCII DECIMAL POINT 8131 3337; 0371 BDF NFND 8133 FC0A; 0372 ADI #0A 8135 3387; 0373 BDF FND .. SUB NET 30 8137 FC00; 0374 NFND: ADI #00 .. SETS DF = 0 8139 9F; 0375 REXIT: GHI CHAR .. CHAR INTO D 813A D5; 0376 SEP R5 813B F800; 0377 READAH: LDI #00 813D 38; 0378 SKP .. SKIP OVER TO READ1 813E 83; 0379 READ: GLO SUB .. CONSTANT WITH A VALUE 0 813F C8; 0380 LSKP 8140 F801; 0381 TTYRED: LDI #01 8142 AF; 0382 READ1: PLO CHAR .. SET ENTRY FLAG 8143 F880; 0383 READ2: LDI #80 8145 BF; 0384 PHI CHAR .. INITIALIZE INPUT BYTE 8146 ; 0385 .. WHEN SHIFTED 80 IS 1, WILL BE DONE 8146 E3; 0386 SEX SUB 8147 8F; 0387 GLO CHAR 8148 F6; 0388 SHR .. DF=1 ENTRY VIA TTYRED 8149 3B4D; 0389 BNF TTY1-#02 814B ; 0390 .. OUT 7 814B ; 0391 .. ,#80 .. READER ON 814B E3; 0392 SEX SUB .. NOP 814C E3; 0393 SEX SUB .. NOP 814D 3D4D; 0394 BN2 * .. WAIT FOR END OF LAST DATA BIT 814F 354F; 0395 TTY1: B2 * .. WAIT FOR PRESENT START BIT 8151 DC; 0396 SEP RC 8152 02; 0397 ,#02 .. DELAY HALF BIT TIME 8153 354F; 0398 B2 TTY1 .. BR IF NO START BIT 8155 8F; 0399 GLO CHAR 8156 F6; 0400 SHR .. ENTRY VIA TTYRED? 8157 3B5B; 0401 BNF NOBIT .. BR IF NO 8159 ; 0402 .. OUT 7 8159 ; 0403 .. ,#40 8159 E3; 0404 SEX SUB .. NOP 815A E3; 0405 SEX SUB .. NOP 815B ; 0406 .. 815B E2; 0407 NOBIT: SEX R2 815C C4; 0408 NOP .. RESET X, AND DELAY 815D 9E; 0409 BIT: GHI AUX 815E F6; 0410 SHR .. ECHO? 815F 3368; 0411 BDF NOECHO .. BR IF NO 8161 3566; 0412 B2 OUTBIT .. IS THE BIT A 1? 8163 7B; 0413 SEQ .. SET Q 8164 3068; 0414 BR NOECHO 8166 7A; 0415 OUTBIT: REQ .. RESET Q 8167 C4; 0416 NOP .. DELAY 8168 DC; 0417 NOECHO: SEP RC 8169 07; 0418 ,#07 .. WAIT ONE BIT TIME 816A C4; 0419 NOP 816B C4; 0420 NOP .. MORE DELAY 816C 9F; 0421 GHI CHAR 816D F6; 0422 SHR 816E BF; 0423 PHI CHAR .. SHIFT THE INPUT CHAR 816F 3378; 0424 BDF NEXT .. BR IF INPUT FINISHED 8171 ; 0425 .. D=CHAR.1 8171 F980; 0426 ORI #80 8173 3D5B; 0427 BN2 NOBIT .. BR IF INPUT WAS A ZERO 8175 BF; 0428 PHI CHAR 8176 305D; 0429 BR BIT .. CONTINUE LOOP 8178 7A; 0430 NEXT: REQ .. OUTPUT THE STOP BIT 8179 3243; 0431 BZ READ2 .. BR IF D=0 ->CHAR.1 817B ; 0432 .. IS A NULL 817B 8F; 0433 GLO CHAR .. CK ENTRY FLAG 817C 3A39; 0434 BNZ REXIT .. BR IF ENTRY WAS VIA READ 817E 9F; 0435 GHI CHAR 817F FF41; 0436 SMI #41 .. CK FOR ASCII HEX 8181 3B2F; 0437 BNF CKDEC .. (AT TOP OF ROUTINE) 8183 FF06; 0438 SMI #06 .. CK FOR A THRU F 8185 3337; 0439 BDF NFND 8187 ; 0440 .. 8187 ; 0441 .. 8187 FE; 0442 FND: SHL 8188 FE; 0443 SHL 8189 FE; 0444 SHL 818A FE; 0445 SHL 818B FC08; 0446 ADI #08 818D FE; 0447 SHL 818E AE; 0448 FND1: PLO AUX .. READY TO SHIFT INTO RD 818F 8D; 0449 GLO ASL 8190 7E; 0450 SHLC 8191 AD; 0451 PLO ASL .. SHIFT LOW HALF 8192 9D; 0452 GHI ASL 8193 7E; 0453 SHLC 8194 BD; 0454 PHI ASL .. SHIFT HIGH HALF 8195 8E; 0455 GLO AUX 8196 FE; 0456 SHL 8197 3A8E; 0457 BNZ FND1 .. BR IF NOT FINISHED 8199 3039; 0458 BR REXIT 819B ; 0459 .. 819B ; 0460 .. TYPE ROUTINE -- TYPES 1 BYTE FROM @R5!, @R6!, 819B ; 0461 .. OR CHAR.1, OR TYPES A BYTE AS TWO HEX DIGITS 819B ; 0462 .. FROM CHAR.1 FOLLOWS A LINE FEED BY SIX NULLS. 819B ; 0463 .. USES 2 AUXILIARY REGS - AUX AND CHAR - PLUS 819B ; 0464 .. RAM LOCATION @ST.EXITS READY TO TYPE 1 BYTE 819B ; 0465 .. FROM @R5!. EXITS TO R5 819B ; 0466 .. WHEN ENTERED AT TYPE5D, PAUSES TO ALLOW AN 819B ; 0467 .. EARLIER READ TO COMPLETE. 819B ; 0468 .. 819B ; 0469 .. AUX.0 HOLDS OUTPUT CHAR (AT FIRST), THEN 819B ; 0470 .. THE DELAY CONSTNT BETWEEN BITS. CHAR.0 HOLDS 819B ; 0471 .. THE NUMBER OF BITS (11) IN ITS LOWER DIGIT, 819B ; 0472 .. AND IN ITS UPPER DIGIT HOLDS A CODE-- 819B ; 0473 .. 0 FOR BYTE OUTPUT 819B ; 0474 .. 1 FOR FIRST HEX OUTPUT 819B ; 0475 .. 2 FOR LST NULL OUTPUT 819B ; 0476 .. 8 FOR LF OUTPUT 819B ; 0477 .. 819B ; 0478 ORG #819C 819C DC; 0479 TYPE5D: SEP RC 819D 17; 0480 ,#17 .. 3 BIT TIME DELAY 819E 38; 0481 SKP .. SKP TO TYPE 5 819F D5; 0482 TEXIT: SEP R5 81A0 45; 0483 TYPE5: LDA R5 81A1 38; 0484 SKP .. ENTRY FOR UT4 SKIP TO TYPE 81A2 46; 0485 TYPE6: LDA R6 81A3 38; 0486 SKP .. ENTRY FOR G.P. IMMED TH 81A4 9F; 0487 TYPE: GHI CHAR 81A5 AE; 0488 TY1: PLO AUX .. SAVE BYTE FOR LATER 81A6 FB0A; 0489 XRI #0A .. IS IT LINE FEED? 81A8 3ABF; 0490 BNZ TY2 81AA F88B; 0491 LDI #8B .. (# OF BITS) + (# OF NULLS 81AC ; 0492 .. TO FOLLOW LF+1) 81AC 30C1; 0493 BR TY3 81AE 9F; 0494 TYPE2: GHI CHAR .. UT4 ENTRY 81AF F6; 0495 TY4: SHR 81B0 F6; 0496 SHR 81B1 F6; 0497 SHR 81B2 F6; 0498 SHR .. SHIFT FIRST HEX TO RIGHT 81B3 FCF6; 0499 ADI #F6 .. CONVERT TO HEX 81B5 3BB9; 0500 BNF * + #04 .. IF A OR MORE 81B7 FC07; 0501 ADI #07 .. ADD NET 37 81B9 FFC6; 0502 SMI #C6 81BB AE; 0503 PLO AUX .. ELSE ADD NET 30 81BC F81B; 0504 LDI #1B .. 10+(# OF BITS) 81BE C8; 0505 LSKP .. EQUIV TO BR TY3 81BF ; 0506 .. 81BF F80B; 0507 TY2: LDI #0B .. (# OF BITS TO OUTPUT) 81C1 AF; 0508 TY3: PLO CHAR .. SAVE MAIN TALLY VALUE 81C2 ; 0509 .. 81C2 ; 0510 .. 81C2 7B; 0511 BEGIN: SEQ .. START BIT 81C3 8E; 0512 GLO AUX .. GET CHAR TO BE TYPED 81C4 AD; 0513 PLO RD .. SAVE THE CHAR 81C5 ; 0514 .. (AUX.0 CLOBBERED) 81C5 DC; 0515 PREBIT: SEP RC 81C6 07; 0516 ,#07 .. WAIT ONE BIT TIME 81C7 ; 0517 .. RETURN FROM DELAY WITH D=0 81C7 2F; 0518 DEC CHAR .. DEC THE BIT COUNTER 81C8 F5; 0519 SD .. SET DF=1 81C9 8D; 0520 GLO RD 81CA 76; 0521 SHRC 81CB AD; 0522 PLO RD .. SHIFT OUTPUT CHAR 81CC 33D1; 0523 BDF OUT1B .. BR IF THE BIT IS A 1 81CE 7B; 0524 SEQ .. ELSE SET Q TO ZERO 81CF 30D3; 0525 BR OUT1B + #02 81D1 7A; 0526 OUT1B: REQ .. SET Q TO 1 81D2 C4; 0527 NOP .. DELAY 81D3 8F; 0528 GLO CHAR 81D4 FA0F; 0529 ANI #0F .. FINISHED TYPING? 81D6 C4; 0530 NOP 81D7 C4; 0531 NOP .. DELAY (14 INSTR.LOOP) 81D8 3AC5; 0532 BNZ PREBIT .. BR IF NOT FINISHED 81DA 8F; 0533 NXCHAR: GLO CHAR 81DB FCFB; 0534 ADI #FB 81DD AF; 0535 PLO CHAR .. SET UP FOR NEXT CHAR 81DE 3B9F; 0536 BNF TEXIT .. BUT EXIT IF NO MORE 81E0 FF1B; 0537 SMI #1B .. TEST FOR ALTERNATIVES 81E2 329F; 0538 BZ TEXIT .. IF JUST TYPED LST NULL 81E4 3BEA; 0539 BNF HEX2 .. IF JUST TYPED FIRST HEX 81E6 ; 0540 .. JUST TYPE LF OR NULL 81E6 F800; 0541 LDI #00 .. PREPARE TO TYPE NULL 81E8 30F5; 0542 BR HX22 81EA ; 0543 .. 81EA 9F; 0544 HEX2: GHI CHAR 81EB FA0F; 0545 ANI #0F .. GET 2ND HEX DIGIT 81ED FCF6; 0546 ADI #F6 .. CONVERT TO HEX 81EF 3BF3; 0547 BNF * + #04 .. IF A MORE 81F1 FC07; 0548 ADI #07 .. ADD NET 37 81F3 FFC6; 0549 SMI #C6 .. ELSE ALL NET 30 81F5 AE; 0550 HX22: PLO AUX .. STORE CHAR AWAY 81F6 30C2; 0551 BR BEGIN 81F8 ; 0552 .. 81F8 D3; 0553 FSYNER: SEP SUB 81F9 0A; 0554 ,#0A .. LF 81FA D3; 0555 SEP SUB 81FB 3F; 0556 ,#3F .. ? 81FC C0803B; 0557 LBR START 81FF 00; 0558 ,#00 .. FILLER 8200 ; 0559 END 0000