CP/M MACRO ASSEM 2.0 #001 Terminal Driver Software ; *************************************************************** ; * * ; * ZRT-80 VIDEO TERMINAL DRIVER PROGRAM * ; * WRITTEN BY * ; * WILLIAM WHITE * ; * 437 OGDEN LANE * ; * NEW BRAUNFELS, TEXAS 78130 * ; * * ; *************************************************************** ; ; COPYRIGHT WILLIAM WHITE AND DIGITAL RESEARCH COMPUTERS, (C) 1983 ; TITLE 'Terminal Driver Software' ; ; CREATED MARCH 7, 1983 ; LAST MODIFIED AUGUST 18, 1983 ; VERSION 1.01 ; ; THIS SOURCE FILE IS ASSEMBLED USING THE DIGITAL RESEARCH MAC ; 8080 MACRO ASSEMBLER WITH THE Z80 MACRO LIBRARY FOR Z-80 INSTRUCTIONS ; ; SPECIAL THANKS TO MARK KAUFMAN AND WALLY KULECZ FOR HELP WITH THE PROJECT. ; MACLIB Z80 ; 0000 = FALSE EQU 0 FFFF = TRUE EQU NOT FALSE ; ; OPTIONS: VIDEO MONITOR SELECTION FFFF = NORMAL EQU TRUE ; NORMAL SELECTION OF SCREEN FORMATS 0000 = MOTOROL EQU FALSE ; MOTOROLA HIGH RESOLUTION MONITOR ; ; ; SYSTEM MEMORY ORGANIZTION: ; 0000 = ORGN EQU 00000H ; START OF PROGRAM 1000 = EPROM2 EQU 01000H ; START OF SECOND EPROM 4000 = RAM EQU 04000H ; START OF SCRATCHPAD RAM 0400 = RAMLEN EQU 00400H ; LENGTH OF RAM C000 = SCREEN EQU 0C000H ; SCREEN REFRESH MEMORY ; ; SYSTEM I/O PORTS ; ; INS8250 0000 = RECEIVE EQU 0 ; SEE INS8250 DATA SHEET FOR DETAILS 0000 = XMIT EQU 0 0000 = LOBAUD EQU 0 0001 = INTEN EQU 1 0001 = HIBAUD EQU 1 0002 = INTID EQU 2 0003 = LINCTL EQU 3 0004 = MODCTL EQU 4 ; BIT 3=CHRGEN, 2=LED, 1=RTS, 0=DTR 0005 = LINSTAT EQU 5 0006 = MODSTAT EQU 6 ; BIT 7=RLSD, 6=CAPSLOCK, 5=DSR, 4=CTS ; 6845S PORTS 0008 = CRTADDR EQU 8 ; SET THE ADDRESS OF THE PORT WANTED CP/M MACRO ASSEM 2.0 #002 Terminal Driver Software 0009 = CRTDATA EQU 9 ; TRANSFER DATA TO/FROM PORT ; STAT1 AND STAT2 DEFINE DEFAULT VALUES FOR OPTIONS ; SEE DEFINITIONS AT DIP1, DIP2 RESPECTIVELY ; NOTE THAT THESE PORTS ARE INVERTED I.E. A ZERO IS ON, A ONE IS OFF 0018 = STAT1 EQU 18H ; DIP SWITCH 2 0020 = STAT2 EQU 20H ; DIP SWITCH 3 0010 = KBD EQU 10H ; KEYBOARD INPUT PORT 0030 = BEEP EQU 30H ; SHORT DURATION 0038 = BELL EQU 38H ; LONG DURATION ; ASCII EQUATES 0007 = BEL EQU 'G'-64 0008 = BS EQU 'H'-64 0009 = HT EQU 'I'-64 000A = LF EQU 'J'-64 000D = CR EQU 'M'-64 0011 = XON EQU 'Q'-64 0013 = XOFF EQU 'S'-64 001B = ESC EQU '['-64 0020 = SPACE EQU ' ' 007F = DEL EQU 127 ; MISC EQUATES ; CURSOR SIZE DEFINITIONS 0000 = CSTART EQU 0 ; START RASTER 0007 = CEND EQU 7 ; END RASTER - 1 ; MACRO DEFINITIONS ; MASK WILL PLACE HL IN THE RAGE C000 TO FFFF MASK MACRO MOV A,H ORI 11000000B MOV H,A ENDM ; MASK8 WILL PLACE HL IN THE RANGE C000 TO DFFF MASK8 MACRO MOV A,H ORI 11000000B ANI 11011111B MOV H,A ENDM ; MASKH8: PLACE HL IN RANGE E000 TO FFFF MASKH8 MACRO MOV A,H ORI 11100000B MOV H,A ENDM ; SUBHLE WILL SUBTRACT: HL:=HL-E CP/M MACRO ASSEM 2.0 #003 Terminal Driver Software ; USES D SUBHLE MACRO ANA A MVI D,0 DSBC D ENDM ; ADDHLE WILL ADD: HL:=HL+E ; USES D ADDHLE MACRO MVI D,0 DAD D ENDM ; TURNON: TURN A BIT IN MEMORY ON TURNON MACRO ?A,?B LXI H,?A SETB ?B,M ENDM ; TURNOFF: TURN OFF A BIT IN MEMORY TURNOFF MACRO ?A,?B LXI H,?A RES ?B,M ENDM PAGE CP/M MACRO ASSEM 2.0 #004 Terminal Driver Software ; ********************************* ; * * ; * INITIALIZATION * ; * * ; ********************************* 0000 ORG ORGN ; START OF ROM 0000 C3C200 RESET JMP STARTUP ; COPYRIGHT NOTICE 0003 436F707972 DB 'Copyright 1983 Wm. White ' 001C 4469676974 DB 'Digital Research Comp' PAGE CP/M MACRO ASSEM 2.0 #005 Terminal Driver Software ; ********************************* ; * * ; * INTERRUPTS * ; * * ; ********************************* ; THE MASKABLE INTERRUPT (38H) IS THE INS8250 UART. ; IT WILL INTERRUPT ON EITHER RECEIVED DATA OR STATUS LINE CHANGE IF $>(ORGN+38H) ; CHECK FOR ERRORS 'overrun error at 38h.' ENDIF 0038 ORG ORGN + 38H 0038 F5 RXVISR PUSH PSW ; FIND CAUSE OF INTERRUPT 0039 DB02 IN INTID 003B E606 ANI 6 003D FE04 CPI 4 JRZ RXINT ; RECEIVER INTERRUPT 003F+28 DB 28H 0040+49 DB RXINT-$-1 ; MODEM STATUS LINE HAS CHANGED: ; COPY DSR TO RTS OUTPUT 0041 DB06 IN MODSTAT BIT 5,A 0043+CB6F DB 0CBH,5*8+A+40H JRNZ RTSNL 0045+20 DB 20H 0046+2D DB RTSNL-$-1 0047 CD6501 CALL RTSLOW JR PRETI ; END ROUTINE 004A+18 DB 18H 004B+4A DB PRETI-$-1 ; *************************************************************** ; NON-MASKABLE INTERRUPT * IF $>(ORGN+66H) ; CHECK FOR ERRORS * 'Error at 66h.' ; * ENDIF ; * 0066 ORG ORGN+66H ; * ; * 0066 F5 KEYVISR PUSH PSW ; SAVE REGISTERS * 0067 DB10 IN KBD ; GET KEYBOARD CHARACTER * 0069 322B41 STA KBUFF ; SAVE IN BUFFER * 006C 3EFF MVI A,0FFH ; SET FLAG * 006E 322A41 STA KFLAG ; * 0071 F1 POP PSW ; RESTORE * RETN ; RETURN & RESTORE INT STATUS * 0072+ED45 DB 0EDH,45H ; * ; *************************************************************** CP/M MACRO ASSEM 2.0 #006 Terminal Driver Software ; UART INTERRUPT SERVICE ROUTINE CONTINUED: ; SET RTS HIGH IF X-ON MODE OR COMPUTER IS NOT WAITING ON TERMINAL 0074 DB18 RTSNL IN STAT1 0076 2F CMA BIT 6,A ; CHECK FOR X-ON CONTROL 0077+CB77 DB 0CBH,6*8+A+40H JRZ RTSW 0079+28 DB 28H 007A+05 DB RTSW-$-1 007B CD5D01 CALL RTSHI JR PRETI 007E+18 DB 18H 007F+16 DB PRETI-$-1 0080 3A2741 RTSW LDA DIP3 BIT A,5 0083+CB7D DB 0CBH,A*8+5+40H 0085 CC5D01 CZ RTSHI JR PRETI 0088+18 DB 18H 0089+0C DB PRETI-$-1 ; RECEIVER INTERRUPT: GET A CHARACTER 008A DB20 RXINT IN STAT2 008C 2F CMA BIT 5,A ; CHECK FOR LOCAL 008D+CB6F DB 0CBH,5*8+A+40H 008F DB00 IN RECEIVE ; GET CHR FROM UART RES A,7 ; RID OF PARITY, NO CHECK! 0091+CBBF DB 0CBH,A*8+7+80H 0093 CCF404 CZ STORX ; STORE THE RX CHR IN THE FIFO ; POP & RETI 0096 F1 PRETI POP PSW 0097 FB EI RETI 0098+ED4D DB 0EDH,4DH ; KEYBOARD LOOKUP TABLE ; BIT 7 IS THE ALTERNATE KEYBOARD MODE BIT. ; BIT 7 SET ON SECOND BYTE SENDS ESC FIRST ; ; THESE TABLES MAY ALSO BE USED TO RECODE KEYBOARD CODES. 009A 31D3 KTHEATH DB '1','S'+80H ; FUNCTION KEY 1 009C 32D4 DB '2','T'+80H ; 2 009E 33D5 DB '3','U'+80H ; 3 00A0 34D6 DB '4','V'+80H ; 4 00A2 35D7 DB '5','W'+80H ; 5 00A4 36D0 DB '6','P'+80H ; BLUE 00A6 37D1 DB '7','Q'+80H ; RED 00A8 38D2 DB '8','R'+80H ; GRAY CP/M MACRO ASSEM 2.0 #007 Terminal Driver Software 0008 = KLHEATH EQU ($-KTHEATH)/2 00AA 0000 KTADM DB 0,0 ; EMPTY TABLE 0001 = KLADM EQU ($-KTADM)/2 00AC 31F0 KTBEE DB '1','p'+80H 00AE 32F1 DB '2','q'+80H 00B0 33F2 DB '3','r'+80H 00B2 34F3 DB '4','s'+80H 00B4 35F4 DB '5','t'+80H 00B6 36F5 DB '6','u'+80H 00B8 37F6 DB '7','v'+80H 00BA 38F7 DB '8','w'+80H 00BC 39F8 DB '9','x'+80H 00BE 30F9 DB '0','y'+80H 000A = KLBEE EQU ($-KTBEE)/2 00C0 0000 KTADDS DB 0,0 0001 = KLADDS EQU ($-KTADDS)/2 PAGE CP/M MACRO ASSEM 2.0 #008 Terminal Driver Software ; ********************************* ; * * ; * INITIALIZATION * ; * * ; ********************************* ; INITIALIZE ALL BUFFERS, POINTERS, FLAGS, AND I/O 00C2 310044 STARTUP LXI SP,STACK 00C5 F3 DI IM1 00C6+ED56 DB 0EDH,56H ; CLEAR BUFFER SPACE IN RAM 00C8 211041 LXI H,RAMBUFF 00CB 061C MVI B,BUFFSIZ 00CD 3600 STRTCLR MVI M,0 00CF 23 INX H DJNZ STRTCLR 00D0+10 DB 10H 00D1+FB DB STRTCLR-$-1 ; INITIALIZE FIFO'S 00D2 210040 LXI H,RXFIFO 00D5 221041 SHLD RXINP 00D8 221241 SHLD RXOUT 00DB 210041 LXI H,TXFIFO 00DE 221441 SHLD TXINP 00E1 221641 SHLD TXOUT ; SETUP THE FLAGS IN DIP1,2,3,4 00E4 DB18 IN STAT1 00E6 2F CMA 00E7 322541 STA DIP1 00EA DB20 IN STAT2 00EC 2F CMA 00ED 322641 STA DIP2 00F0 3E12 MVI A,INIT3 00F2 322741 STA DIP3 00F5 3E06 MVI A,INIT4 00F7 322841 STA DIP4 ; INITIALIZE CRTC 00FA CD7001 CALL CRTCMOD ; SET THE MODE 00FD CD4A02 CALL CURSMOD ; SET THE CURSOR 0100 CD2E02 CALL STATMOD ; SET THE STATUS LINE ; INITIALIZE UART 0103 CD1E01 CALL SETBAUD ; SET THE BAUD RATE FROM DIP1 0106 3E09 MVI A,9 0108 D301 OUT INTEN ; ENABLE INT FOR RX & MODSTAT 010A 3E01 MVI A,INITMOD CP/M MACRO ASSEM 2.0 #009 Terminal Driver Software 010C 322941 STA MODCOPY ; COPY OF DATA SENT TO MODEM PORT 010F D304 OUT MODCTL ; SET DTR HIGH 0111 FF RST 7 ; EXECUTE INTERRUPT ROUTINE ONCE ; THIS READS INPUT PORT & SETS OUTPUTS ; CHECK FOR EPROM ISTALLED IN SECOND ROM SOCKET. 0112 3A0010 LDA EPROM2 ; FIRST BYTE MUST BE A JMP INSTRUCTION 0115 FEC3 CPI 0C3H 0117 CC0010 CZ EPROM2 ; EXECUTE THE PROGRAM NOW IF THERE. ; 011A FB EI ; LET THE RECEIVER INTERRUPT 011B C3C702 JMP MAIN ; EXECUTE MAIN PROGRAM ; SET BAUD RATE ; TAKE DATA FROM 4 BITS OF DIP1 AND SETUP 8250 011E 3A2541 SETBAUD LDA DIP1 0121 E60F ANI 15 ; KEEP 4 BITS 0123 07 RLC 0124 5F MOV E,A 0125 1600 MVI D,0 0127 213D01 LXI H,BAUDTAB ; BAUD RATE DIVISOR TABLE 012A 19 DAD D ; PROGRAM 8250 012B 3E83 MVI A,083H 012D D303 OUT LINCTL 012F 7E MOV A,M 0130 D300 OUT LOBAUD 0132 23 INX H 0133 7E MOV A,M 0134 D301 OUT HIBAUD ; SET 2 STOP BITS FOR 110 BAUD OR LOWER 0136 E604 ANI 04H ; BIT 2 IS ON FOR THESE 0138 F603 ORI 3 ; 8 BITS, NO PARITY, NORMAL MODE 013A D303 OUT LINCTL 013C C9 RET ; TABLE OF BAUD RATE DIVISORS ; XTAL = 2.4576 MHZ 013D 0800 BAUDTAB DW 8 ; 19,200 013F 1000 DW 16 ; 9600 0141 1500 DW 21 ; 7200 0143 2000 DW 32 ; 4800 0145 2B00 DW 43 ; 3600 0147 4000 DW 64 ; 2400 0149 4D00 DW 77 ; 2000 014B 5500 DW 85 ; 1800 014D 8000 DW 128 ; 1200 014F 0001 DW 256 ; 600 0151 0002 DW 512 ; 300 0153 0004 DW 1024 ; 150 0155 7604 DW 1142 ; 134.5 0157 7405 DW 1396 ; 110 0159 0008 DW 2048 ; 75 CP/M MACRO ASSEM 2.0 #010 Terminal Driver Software 015B 000C DW 3072 ; 50 ; SET RTS HIGH 015D 3A2941 RTSHI LDA MODCOPY 0160 F606 ORI 6 0162 C36A01 JMP RTSO ; SET RTS LOW 0165 3A2941 RTSLOW LDA MODCOPY 0168 E6F9 ANI 0F9H 016A 322941 RTSO STA MODCOPY 016D D304 OUT MODCTL 016F C9 RET PAGE CP/M MACRO ASSEM 2.0 #011 Terminal Driver Software ; ********************************* ; * * ; * CRTC ROUTINES * ; * * ; ********************************* ; PROCEDURE CRTCMOD ; READ MODE FROM 3 BITS OF DIP2 AND SETUP THE CRTC ACCORDINGLY ; CLEAR THE SCREEN AND SET CRTC CURSOR POSITION 0170 3A2641 CRTCMOD LDA DIP2 0173 E607 ANI 111B ; LOOKUP IN TABLE (16 BYTE ENTRIES) 0175 21AE01 LXI H,CRTTABL 0178 07 RLC 0179 07 RLC 017A 07 RLC 017B 07 RLC 017C 5F MOV E,A 017D 1600 MVI D,0 017F 19 DAD D 0180 7E MOV A,M ; GET CPL 0181 321F41 STA CPL 0184 23 INX H 0185 7E MOV A,M ; GET LPS 0186 322041 STA LPS 0189 23 INX H 018A 7E MOV A,M ; GET VSYN 018B 321E41 STA VSYN 018E 23 INX H 018F 7E MOV A,M ; GET SCRSIZ 0190 321C41 STA SCRSIZ 0193 23 INX H 0194 7E MOV A,M 0195 321D41 STA SCRSIZ+1 0198 23 INX H ; LOAD UP CRTC REGISTERS 0199 0E00 MVI C,0 ; REGISTER COUNTER 019B 060A MVI B,10 ; INIT 10 REGISTERS 019D 79 CRT1 MOV A,C ; GET REGISTER NUMBER 019E D308 OUT CRTADDR 01A0 7E MOV A,M ; GET DATA 01A1 D309 OUT CRTDATA 01A3 23 INX H 01A4 0C INR C DJNZ CRT1 01A5+10 DB 10H 01A6+F6 DB CRT1-$-1 01A7 CD1906 CALL ESCREEN 01AA CD7702 CALL SETCURS 01AD C9 RET ; CRTTABL IS A TABLE OF INITALIZATION VALUES FOR THE CRT CONTROLLER ; CP/M MACRO ASSEM 2.0 #012 Terminal Driver Software ; EACH 16 BYTE ENTRY HAS: ; CPL,LPS,VSYN,SCRSIZ,D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,0 ; CPL IS THE NUMBER OF CHARACTERS / LINE ; LPS IS THE NUMBER OF LINES / SCREEN ; VSYN IS THE VERTICAL SYNC POSITION FOR STATUS LINE DISPLAY ; SCRSIZ THE SCREEN SIZE IN BYTES ; WHERE DI IS CRTC PORT DATA ; ; NOTE: THE BOARD MUST HAVE AT LEAST 1 MEMORY CHIP FOR EACH ; 2048 CHARACTERS ON THE SCREEN. ; ; XTAL=20.000 MHZ ; ; REGISTERS ARE: ; 0 HORIZONTAL TOTAL 5 VERT TOTAL ADJ ; 1 HORIZONTAL DISPLAYED 6 VERTICAL DISPLAYED ; 2 HORIZ SYNC POS 7 VERT SYNC POS ; 3 SYNC WIDTH 8 INTERLACE & SKEW ; 4 VERTICAL TOTAL 9 MAXIMUM RASTER ; ; OTHER FORMATS CAN BE PROGRAMMED: REFER TO HITACHI DATA SHEET ON ; THE HD6845S OR THE MOTOROLA DATA SHEET ON THE MC6845*1 TO DETERMINE ; CORRECT VALUES FOR REGISTERS. THE DOT CLOCK CAN TYPICALLY BE RUN UP ; TO ABOUT 25MHZ WITHOUT MODIFICATION. THE DOT CLOCK FREQUENCY CAN BE ; CHANGED WITHOUT AFFECTING ANY OTHER CIRCUITRY ON THE BOARD. ; CRTTABL ; 0 1 2 3 4 5 6 7 8 9 X ; 80 LINES X 24 CHARACTERS, 15748HZ HORIZONTAL, 60 HZ VERTICAL, 10 RASTERS/LINE 01AE 501819 DB 80,24,25 01B1 8007 DW 1920 01B3 7E50616819 DB 7EH,50H,61H,68H,19H,03H,18H,18H,50H,09H,0 ; 80 X 48, 15748, 60, 9 01BE 503034 DB 80,48,52 01C1 000F DW 3840 01C3 7E50616839 DB 7EH,50H,61H,68H,39H,03H,30H,34H,53H,07H,0 ; 80 X 24 17544, 60, 11 01CE 501819 DB 80,24,25 01D1 8007 DW 1920 01D3 71505A6819 DB 71H,50H,5AH,68H,19H,06H,18H,18H,50H,0AH,0 ; 80 X 48, 18691, 60, 11 01DE 503034 DB 80,48,52 01E1 000F DW 3840 01E3 6A50556837 DB 6AH,50H,55H,68H,37H,07H,30H,34H,53H,09H,0 ; 96 X 24, 15748, 60, 10 01EE 601819 DB 96,24,25 01F1 0009 DW 2304 01F3 7E60676819 DB 7EH,60H,67H,68H,19H,03H,18H,18H,50H,09H,0 ; 80 X 24, 15748, 50, 11 01FE 50181A DB 80,24,1AH 0201 8007 DW 1920 CP/M MACRO ASSEM 2.0 #013 Terminal Driver Software 0203 7E5061681B DB 7EH,50H,61H,68H,1BH,07H,18H,1AH,50H,0AH,0 IF NORMAL ; THESE TWO CAN BE REPLACED BY SPECIALS ; 80 X 48, 15748, 50, 020E 503033 DB 80,48,51 0211 000F DW 3840 0213 7E50616838 DB 7EH,50H,61H,68H,38H,03H,30H,33H,53H,09H,0 ; 96 X 24, 15748, 50, 11 021E 60181A DB 96,24,26 0221 0009 DW 2304 0223 7E6067681B DB 7EH,60H,67H,68H,1BH,07H,18H,19H,50H,0AH,0 ENDIF IF MOTOROL ; SPECIAL MONITOR SETUP: ; ; CRTC PARAMETERS FOR USE WITH MOTOROLA M4408-540 HIGH RESOLUTION MONITOR: ; THIS MONITOR IS A VERTICAL PAGE FORMAT MONITOR THAT ALLOWS OPERATION WITH ; UP TO 66 LINES OF 96 CHARACTERS WITH THIS TERMINAL. THIS IS THE EXACT ; CAPACITY OF AN 8-1/2 X 11 INCH PAGE ON AN ELITE TYPEWRITER. IT IS ACTUALLY ; POSSIBLE TO RUN BETTER THAN 80 LINES BUT 66 SEEMS MORE PRACTICAL. ; ; THIS MONITOR HAS A NOMINAL HORIZONTAL FREQUENCY OF 30.5KHZ AND A VERTICAL ; FREQUENCY OF 60 HZ. THE VIDEO BANDWIDTH IS 50MHZ. ; ; IN ORDER TO USE THIS BOARD WITH THE MONITOR, THE DOT CLOCK IS RUN AT ; 32 MHZ, (AND SLIGHTLY MODIFIED), THE DOT CLOCK COUNTER IS REPLACED WITH ; A SCHOTTKY CHIP (74S196). ; ; 96 X 33, 29000, 60, 15 DB 96,33,35 DW 96*33 DB 111,96,97,104,35,9,33,34,81,12,0 ; 96 X 66, 29000, 60, 15 DB 96,66,70 DW 96*66 DB 111,96,97,104,72,6,66,70,83,11,0 ENDIF ; ; ; SET DISPLAY REGISTER ; TURN ON EXTRA DISPLAY LINE WHEN STATUS LINE IS ENABLED ; CHANGE VERTICAL SYNC POSITION ; THIS HELPS CENTER THE DISPLAY IN THE USEABLE AREA OF THE MONITOR 022E 3E06 STATMOD MVI A,6 ; VERTICAL DISPLAYED 0230 D308 OUT CRTADDR 0232 3A2841 LDA DIP4 BIT 0,A ; CHECK FOR STATUS 0235+CB47 DB 0CBH,0*8+A+40H 0237 3A2041 LDA LPS JRZ NOSTAT 023A+28 DB 28H 023B+01 DB NOSTAT-$-1 023C 3C INR A CP/M MACRO ASSEM 2.0 #014 Terminal Driver Software 023D D309 NOSTAT OUT CRTDATA 023F C8 RZ ; NO STATUS ; IF STATUS LINE ENABLED, THEN CHANGE VERTICAL SYNC POSITION 0240 3E07 MVI A,7 0242 D308 OUT CRTADDR 0244 3A1E41 LDA VSYN 0247 D309 OUT CRTDATA 0249 C9 RET ; SET CURSOR MODE ; USE CURSOR ENABLE,BLOCK CURSOR, BLINK BITS IN DIP3, DIP4 024A 3A2741 CURSMOD LDA DIP3 ; SEE IF CURSOR IS ENABLED BIT 4,A 024D+CB67 DB 0CBH,4*8+A+40H 024F 0E20 MVI C,20H ; CURSOR DISABLED JRZ CURSMEN 0251+28 DB 28H 0252+08 DB CURSMEN-$-1 ; CURSOR IS ENABLED: CHECK FOR BLINK/NON-BLINK BIT 1,A ; CHECK FOR BLINK 0253+CB4F DB 0CBH,1*8+A+40H 0255 0E00 MVI C,0 ; NO BLINK JRZ CURSMEN 0257+28 DB 28H 0258+02 DB CURSMEN-$-1 0259 0E60 MVI C,60H ; CURSOR BLINK ; FIND CORRECT TYPE OF CURSOR 025B 3A2841 CURSMEN LDA DIP4 BIT 1,A 025E+CB4F DB 0CBH,1*8+A+40H 0260 0600 MVI B,CSTART ; TOP LINE FOR BLOCK CURSOR JRNZ CURSBLK 0262+20 DB 20H 0263+02 DB CURSBLK-$-1 ; UNDERSCORE CURSOR 0264 0607 MVI B,CEND ; SINGLE LINE 0266 3E0A CURSBLK MVI A,10 0268 D308 OUT CRTADDR 026A 78 MOV A,B 026B B1 ORA C ; ENABLE/DISABLE 026C D309 OUT CRTDATA 026E 3E0B MVI A,11 0270 D308 OUT CRTADDR 0272 3E07 MVI A,CEND ; BOTTOM 0274 D309 OUT CRTDATA 0276 C9 RET ; ********************************* ; * * ; * HOUSEKEEPING ROUTINES FOR CRT * ; * * ; ********************************* CP/M MACRO ASSEM 2.0 #015 Terminal Driver Software ; SETCURS ; SEND THE CURSOR POSITION TO THE CRT CONTROLLER 0277 3E0F SETCURS MVI A,15 0279 D308 OUT CRTADDR 027B 3A1841 LDA CURSOR 027E D309 OUT CRTDATA 0280 3E0E MVI A,14 0282 D308 OUT CRTADDR 0284 3A1941 LDA CURSOR+1 0287 D309 OUT CRTDATA 0289 C9 RET ; SETHOME ; SAVE NEW POSITION OF HOME AND COPY THE STATUS LINE. ; IF STATUS ENABLED, COPY CPL BYTES FROM HOME+SCRSIZ TO NEWHOME+SCRSIZ SETHOME MASK ; PUT IN PROPER RANGE 028A+7C MOV A,H 028B+F6C0 ORI 11000000B 028D+67 MOV H,A 028E 3A2841 LDA DIP4 BIT 0,A 0291+CB47 DB 0CBH,0*8+A+40H JRZ SETHNO ; NO STATUS 0293+28 DB 28H 0294+20 DB SETHNO-$-1 0295 E5 PUSH H ; SAVE NEW HOME LBCD SCRSIZ 0296+ED4B DB 0EDH,4BH 0298+1C41 DW SCRSIZ 029A 09 DAD B MASK8 029B+7C MOV A,H 029C+F6C0 ORI 11000000B 029E+E6DF ANI 11011111B 02A0+67 MOV H,A 02A1 EB XCHG ; DE=NEWHOME+SCRSIZ 02A2 2A1A41 LHLD HOME 02A5 09 DAD B ; HL=HOME+SCRSIZ MASK8 02A6+7C MOV A,H 02A7+F6C0 ORI 11000000B 02A9+E6DF ANI 11011111B 02AB+67 MOV H,A LBCD CPL 02AC+ED4B DB 0EDH,4BH 02AE+1F41 DW CPL 02B0 0600 MVI B,0 LDIR ; COPY STATUS LINE 02B2+EDB0 DB 0EDH,0B0H CP/M MACRO ASSEM 2.0 #016 Terminal Driver Software 02B4 E1 POP H ; SAVE NEW HOME 02B5 221A41 SETHNO SHLD HOME ; 02B8 3E0D MVI A,13 02BA D308 OUT CRTADDR 02BC 7D MOV A,L ; GET LOW(HOME) 02BD D309 OUT CRTDATA 02BF 3E0C MVI A,12 02C1 D308 OUT CRTADDR 02C3 7C MOV A,H ; GET HIGH(HOME) 02C4 D309 OUT CRTDATA 02C6 C9 RET PAGE CP/M MACRO ASSEM 2.0 #017 Terminal Driver Software ; ********************************* ; * * ; * MAIN PROGRAM LOOP * ; * * ; ********************************* 02C7 21C702 MAIN LXI H,MAIN ; ANY ROUTINE CALLED WILL RETURN HERE 02CA E5 PUSH H 02CB CD1A05 CALL FETCHRX ; GET A CHARACTER ; PROCESS THE CHARACTER: ; CASE ; CHR=DEL DO NOTHING ; CHR<32 CONTROL CHARACTER: LOOKUP ROUTINE & EXEC ; CHR>=32 PRINTABLE CHARACTER: WRITE TO SCREEN 02CE FE7F CPI DEL 02D0 C8 RZ ; DO NOTHING 02D1 FE20 CPI 32 JRC CONTROL ; CONTROL CHARACTER 02D3+38 DB 38H 02D4+06 DB CONTROL-$-1 ; IT IS A PRINTING CHARACTER 02D5 CDAD07 CALL WRITE ; PUT IT ON THE SCREEN 02D8 C3D107 JMP CINC ; INCREMENT CURSOR POSITION ; CONTROL CHARACTER: ; TAKE THE CHARACTER AND LOOK FOR A MATCH IN THE CONTROL CODE TABLE ; FOR THE PROTOCOL BEING USED. ; CR, LF, HT ARE HANDLED AS SPECIAL CASES 02DB FE09 CONTROL CPI HT ; CHECK FOR COMMONLY USED CODES FIRST 02DD CAB908 JZ CTAB ; THIS IMPROVES THE SPEED OF EXECUTION 02E0 FE0D CPI CR 02E2 CA1208 JZ HCR 02E5 FE0A CPI LF 02E7 CAF107 JZ HLF 02EA 21FB02 LXI H,CTLTAB ; FIND CORRECT TABLE FOR EMULATION MODE 02ED CD6604 CALL SELECT ; SELECT A CONTROL TABLE, LOOKUP ROUTINE 02F0 E9 PCHL ; EXECUTE THE ROUTINE ; ESC CHARACTER RECEIVED: ; TAKE NEXT CHARACTER AND LOOKUP ROUTINE ASSOCIATED WITH IT ; ACCORDING TO THE SELECTED PROTOCOL. 02F1 CD1A05 ESCSEQ CALL FETCHRX 02F4 210B03 LXI H,ESCTAB 02F7 CD6604 CALL SELECT 02FA E9 PCHL ; CTLTAB IS A TABLE WITH 4 ENTRIES, ONE FOR EACH EMULATION MODE ; TERMINALS ARE: CP/M MACRO ASSEM 2.0 #018 Terminal Driver Software ; 0. HEATHKIT H-19 ; 1. LEAR SEIGLER ADM-3 ; 2. BEEHIVE ; 3. ADDS REGENT 200 02FB 2B03 CTLTAB DW CTHEATH 02FD 03 DB 3 ; WIDTH 02FE 03 DB CLHEATH ; LENGTH ; 02FF A903 DW CTADM 0301 03 DB 3 ; WIDTH 0302 09 DB CLADM ; LENGTH ; 0303 C403 DW CTBEE 0305 03 DB 3 ; WIDTH 0306 03 DB CLBEE ; LENGTH ; 0307 1B04 DW CTADDS 0309 03 DB 3 ; WIDTH 030A 09 DB CLADDS ; LENGTH ; 030B 3403 ESCTAB DW ETHEATH ; TABLE 030D 03 DB 3 ; WIDTH 030E 27 DB ELHEATH ; LENGTH ; 030F 3403 DW ETADM ; TABLE 0311 03 DB 3 ; WIDTH 0312 27 DB ELADM ; LENGTH ; 0313 CD03 DW ETBEE ; TABLE 0315 03 DB 3 ; WIDTH 0316 1A DB ELBEE ; LENGTH ; 0317 3604 DW ETADDS ; TABLE 0319 03 DB 3 ; WIDTH 031A 13 DB ELADDS ; LENGTH ; ; KEY CODE LOOKUP TABLE 031B 9A00 KEYTAB DW KTHEATH 031D 0208 DB 2,KLHEATH 031F AA00 DW KTADM 0321 0201 DB 2,KLADM 0323 AC00 DW KTBEE 0325 020A DB 2,KLBEE 0327 C000 DW KTADDS 0329 0201 DB 2,KLADDS ; CONTROL CODE TABLE FOR HEATH TERMINAL ; NOTE THAT CR,LF,HT ARE ALREADY TAKEN CARE OF 032B 1B CTHEATH DB ESC ; ESCAPE SEQUENCE 032C F102 DW ESCSEQ 032E 07 DB BEL ; RING BELL CP/M MACRO ASSEM 2.0 #019 Terminal Driver Software 032F 230B DW RING 0331 08 DB BS ; BACK-SPACE 0332 8608 DW CLEFT 0003 = CLHEATH EQU ($-CTHEATH) / 3 ; ESCAPE CODES FOR HEATH AND ADM TERMINAL ETADM ETHEATH 0334 3D DB '=' ; CURSOR ADDRESSING FOR ADM3 0335 EE08 DW CADDR ; CURSOR FUNCTIONS 0337 59 DB 'Y' ; CURSOR ADDRESSING FOR HEATH 0338 EE08 DW CADDR 033A 48 DB 'H' ; HOME CURSOR 033B CC08 DW CHOME 033D 43 DB 'C' ; CURSOR RIGHT, STOP AT RIGHT MARGIN 033E 9908 DW CRIGHT 0340 44 DB 'D' ; CURSOR LEFT, STOP AT LEFT MARGIN 0341 8608 DW CLEFT 0343 42 DB 'B' ; CURSOR DOWN, DON'T SCROLL 0344 AD08 DW CDOWN 0346 41 DB 'A' ; CURSOR UP, DON'T SCROLL 0347 A508 DW CUP 0349 49 DB 'I' ; REVERSE LINE FEED 034A 4E08 DW CRLF 034C 6E DB 'n' ; CURSOR POSITION REPORT 034D 2F09 DW CREP 034F 6A DB 'j' ; SAVE CURSOR POSITION 0350 DA08 DW CSAV 0352 6B DB 'k' ; RESTORE CURSOR POSITION 0353 E708 DW CRESTO ; EDIT AND ERASE 0355 45 DB 'E' ; ERASE SCREEN 0356 1906 DW ESCREEN 0358 62 DB 'b' ; ERASE START TO CURSOR, INCLUSIVE 0359 4D06 DW EBEGIN 035B 4A DB 'J' ; ERASE CURSOR TO END, INCLUSIVE 035C 6306 DW EEND 035E 6C DB 'l' ; ERASE LINE 035F 3206 DW ELINE 0361 6F DB 'o' ; ERASE LEFT TO CURSOR, INCLUSIVE 0362 7D06 DW ELEFT 0364 4B DB 'K' ; ERASE CURSOR TO RIGHT, INCLUSIVE 0365 9906 DW ERIGHT 0367 4C DB 'L' ; INSERT LINE 0368 DF06 DW INSLINE 036A 4D DB 'M' ; DELETE LINE 036B 2807 DW DELLINE 036D 4E DB 'N' ; DELETE CHARACTER 036E 8907 DW DELCHR ; MODES 0370 40 DB '@' ; ENTER INSERT CHARACTER MODE 0371 E709 DW INSON 0373 4F DB 'O' ; EXIT INSERT CHARACTER MODE CP/M MACRO ASSEM 2.0 #020 Terminal Driver Software 0374 ED09 DW INSOFF 0376 70 DB 'p' ; ENTER INVERSE VIDEO MODE 0377 F309 DW INVON 0379 71 DB 'q' ; EXIT INVERSE VIDEO MODE 037A F909 DW INVOFF 037C 46 DB 'F' ; ENTER GRAPHICS MODE 037D FF09 DW GRON 037F 47 DB 'G' ; EXIT GRAPHICS MODE 0380 050A DW GROFF 0382 72 DB 'r' ; SET BAUD RATE 0383 7109 DW SETBRG 0385 78 DB 'x' ; SET MODE -- TAKES ONE CHR 0386 8609 DW SETMODE 0388 79 DB 'y' ; RESET MODE -- TAKES ONE CHR 0389 9109 DW RESMODE 038B 7B DB '{' ; ENABLE KEYBOARD 038C 110A DW KEYOFF 038E 7D DB '}' ; DISABLE KEYBOARD 038F 0B0A DW KEYON 0391 76 DB 'v' ; ENABLE WRAPAROUND MODE 0392 170A DW WRAPON 0394 77 DB 'w' ; DISABLE WRAPAROUND MODE 0395 1D0A DW WRAPOFF ; MISC 0397 7A DB 'z' ; RESET TO POWER ON STATE 0398 0000 DW RESET 039A 1B DB ESC ; SAME AS FIRST ESCAPE 039B F102 DW ESCSEQ ; ADDED FEATURES 039D 74 DB 't' ; TEST ROUTINES 039E 9C09 DW TESTMOD 03A0 73 DB 's' ; SET SCREEN FORMAT 03A1 5A09 DW SETCRTC 03A3 66 DB 'f' ; ALTERNATE CHARACTER SET 03A4 470A DW ALTON 03A6 67 DB 'g' ; STANDARD CHARACTER SET 03A7 520A DW ALTOFF 0027 = ELHEATH EQU ($-ETHEATH)/3 ; END OF HEATH TABLE 0027 = ELADM EQU ($-ETADM)/3 ; END OF ADM3 TABLE ; ADM-3 ASSIGNMENTS 03A9 08 CTADM DB BS ; BACK-SPACE 03AA 8608 DW CLEFT 03AC 07 DB BEL ; RIGHT BELL 03AD 230B DW RING 03AF 0B DB 'K'-64 ; CURSOR UP 03B0 A508 DW CUP 03B2 0C DB 'L'-64 ; CURSOR RIGHT 03B3 9908 DW CRIGHT 03B5 0E DB 'N'-64 ; KEYBOARD ENABLE 03B6 110A DW KEYOFF 03B8 11 DB 'Q'-64 ; KEYBOARD DISABLE CP/M MACRO ASSEM 2.0 #021 Terminal Driver Software 03B9 0B0A DW KEYON 03BB 1A DB 'Z'-64 ; ERASE SCREEN 03BC 1906 DW ESCREEN 03BE 1B DB '['-64 ; ESCAPE CODE 03BF F102 DW ESCSEQ 03C1 1E DB '^'-64 03C2 CC08 DW CHOME 0009 = CLADM EQU ($-CTADM)/3 ; BEEHIVE TERMINAL ASSIGNMENTS: ; ONLY THOSE CODES THAT ARE IMPLEMENTED ARE INCLUDED. ; MANY FEATURES ON THE BEEHIVE TERMINALS ARE NOT INCLUDED. 03C4 07 CTBEE DB BEL ; RING BELL 03C5 230B DW RING 03C7 08 DB BS ; BACK-SPACE 03C8 8608 DW CLEFT 03CA 1B DB ESC ; ESCAPE CODE 03CB F102 DW ESCSEQ 0003 = CLBEE EQU ($-CTBEE)/3 03CD 37 ETBEE DB '7' ; SET BAUD RATE 03CE 7109 DW SETBRG 03D0 51 DB 'Q' ; INSERT MODE ON 03D1 E709 DW INSON 03D3 40 DB '@' ; INSERT MODE OFF 03D4 ED09 DW INSOFF 03D6 41 DB 'A' ; CURSOR UP 03D7 A508 DW CUP 03D9 42 DB 'B' ; CURSOR DOWN 03DA AD08 DW CDOWN 03DC 43 DB 'C' ; CURSOR RIGHT 03DD 9908 DW CRIGHT 03DF 44 DB 'D' ; CURSOR LEFT 03E0 8608 DW CLEFT 03E2 45 DB 'E' ; ERASE SCREEN 03E3 1906 DW ESCREEN 03E5 46 DB 'F' ; CURSOR ADDRESSING 03E6 EE08 DW CADDR 03E8 47 DB 'G' ; READ CURSOR POSN 03E9 4A09 DW CREAD 03EB 48 DB 'H' ; CURSOR HOME 03EC CC08 DW CHOME 03EE 4A DB 'J' ; ERASE TO END 03EF 6306 DW EEND 03F1 4B DB 'K' ; ERASE RIGHT 03F2 9906 DW ERIGHT 03F4 4C DB 'L' ; INSERT LINE 03F5 DF06 DW INSLINE 03F7 4D DB 'M' ; DELETE LINE 03F8 2807 DW DELLINE 03FA 50 DB 'P' ; DELETE CHARACTER 03FB 8907 DW DELCHR 03FD 52 DB 'R' ; GRAPHICS ON 03FE FF09 DW GRON CP/M MACRO ASSEM 2.0 #022 Terminal Driver Software 0400 53 DB 'S' ; GRAPHICS OFF 0401 050A DW GROFF 0403 56 DB 'V' ; RESET TERMINAL 0404 0000 DW RESET 0406 59 DB 'Y' ; CURSOR ADDRESSING 0407 EE08 DW CADDR 0409 5A DB 'Z' ; TOGGLE CURSOR ON/OFF 040A 8D0A DW CURSTOG 040C 5C DB '\' ; REPORT CURSOR POSITION 040D 2F09 DW CREP 040F 62 DB 'b' ; KEYBOARD ENABLE 0410 110A DW KEYOFF 0412 63 DB 'c' ; KEYBOARD DISABLE 0413 0B0A DW KEYON 0415 6C DB 'l' ; INVERSE VIDEO 0416 F309 DW INVON 0418 6D DB 'm' ; NORMAL VIDEO 0419 F909 DW INVOFF 001A = ELBEE EQU ($-ETBEE)/3 ; ADDS REGENT 200 TERMINAL ASSIGNMENTS 041B 08 CTADDS DB BS ; BACK-SPACE 041C 8608 DW CLEFT 041E 1B DB ESC ; ESCAPE 041F F102 DW ESCSEQ 0421 07 DB BEL ; RING BELL 0422 230B DW RING 0424 01 DB 'A'-64 ; HOME CURSOR 0425 CC08 DW CHOME 0427 02 DB 'B'-64 ; KEYBOARD UNLOCK 0428 110A DW KEYOFF 042A 06 DB 'F'-64 ; CURSOR RIGHT 042B 9908 DW CRIGHT 042D 0C DB 'L'-64 ; ERASE SCREEN 042E 1906 DW ESCREEN 0430 15 DB 'U'-64 ; CURSOR LEFT 0431 8608 DW CLEFT 0433 19 DB 'Y'-64 ; KEYBOARD LOCK 0434 0B0A DW KEYON 0009 = CLADDS EQU ($-CTADDS)/3 0436 45 ETADDS DB 'E' ; DELETE CHARACTER 0437 8907 DW DELCHR 0439 46 DB 'F' ; INSERT CHARACTER 043A D706 DW HINSCHR 043C 6C DB 'l' ; DELETE LINE 043D 2807 DW DELLINE 043F 4D DB 'M' ; INSERT LINE 0440 DF06 DW INSLINE 0442 59 DB 'Y' ; CURSOR ADDRESSING 0443 EE08 DW CADDR 0445 6B DB 'k' ; ERASE TO END 0446 6306 DW EEND CP/M MACRO ASSEM 2.0 #023 Terminal Driver Software 0448 4B DB 'K' ; ERASE TO RIGHT 0449 9906 DW ERIGHT 044B 5A DB 'Z' ; NEXT CHR IS GRAPHIC 044C 5109 DW GRAPHIC 044E 73 DB 's' ; RESET TERMINAL 044F 0000 DW RESET 0451 41 DB 'A' ; SET BAUD RATE 0452 1E01 DW SETBAUD 0013 = ELADDS EQU ($-CTADDS)/3 PAGE CP/M MACRO ASSEM 2.0 #024 Terminal Driver Software ; ********************************* ; * * ; * GENERAL PURPOSE ROUTINES * ; * * ; ********************************* ; SEARCH A TABLE FOR AN ENTRY MATCHING THE ACCUMULATOR ; HL IS TABLE START ; D IS TABLE LENGTH ; E IS TABLE WIDTH ; A IS CHARACTER TO MATCH ; RETURN: ; A IS CHARACTER AFTER MATCH, OR SAME CHARACTER IF NO MATCH ; HL IS ADDRESS OF CHARACTER AFTER MATCH ; C IS SET IF NO MATCH FOUND 0454 4F SEARCH MOV C,A ; SAVE CHR 0455 BE SRCH1 CMP M ; CHECK THIS ENTRY JRZ SRCH3 ; MATCH 0456+28 DB 28H 0457+0B DB SRCH3-$-1 ; NO MATCH: 0458 43 MOV B,E ; WIDTH 0459 79 MOV A,C ; GET CHR 045A 23 SRCH2 INX H ; ADVANCE E BYTES DJNZ SRCH2 045B+10 DB 10H 045C+FD DB SRCH2-$-1 045D 15 DCR D ; LENGTH-1 JRNZ SRCH1 045E+20 DB 20H 045F+F5 DB SRCH1-$-1 0460 79 MOV A,C 0461 37 STC 0462 C9 RET ; MATCH: 0463 23 SRCH3 INX H 0464 7E MOV A,M 0465 C9 RET ; SELECT A PAIR VALUES FOR HL,DE BASED ON ; THE EMULATION MODE SELECTED AND TABLE ADDRESS IN HL ; THERE EXISTS A TABLE AT (HL) WITH 4 FOUR BYTE ENTRIES ; LOOKUP THE ADDRESS OF THE ROUTINE USING SEARCH ; AND RETURN IT IN HL 0466 F5 SELECT PUSH PSW 0467 DB20 IN STAT2 ; ITS IN BITS 3,4 0469 2F CMA 046A 0F RRC 046B E60C ANI 00001100B 046D 5F MOV E,A CP/M MACRO ASSEM 2.0 #025 Terminal Driver Software 046E 1600 MVI D,0 0470 19 DAD D ; HL NOW POINTS TO ENTRY 0471 5E MOV E,M 0472 23 INX H 0473 56 MOV D,M 0474 23 INX H 0475 4E MOV C,M 0476 23 INX H 0477 46 MOV B,M 0478 EB XCHG 0479 50 MOV D,B 047A 59 MOV E,C ; H,L,D,E HAVE BEEN LOADED. 047B F1 POP PSW ; SEARCH FOR THE ADDRESS 047C CD5404 CALL SEARCH 047F DA8604 JC NOROUTN ; NO ROUTINE FOUND: DO NOOP 0482 23 INX H 0483 66 MOV H,M ; GET H 0484 6F MOV L,A ; GET L 0485 C9 RET ; NO CARRY 0486 218904 NOROUTN LXI H,NOOP 0489 C9 NOOP RET ; READ KEYBOARD CHARACTER AND PUT IN FIFOS ; KEYBD ; ; THERE IS A KEYBOARD TRANSLATION TABLE FOR EACH TERMINAL TYPE. ; ANY ENTRY IN THE TABLE WITH BIT 7 SET WILL SEND AN ESC CHAR FIRST ; ; GET A KEYBOARD CHARACTER ; LOOKUP TRANSLATED VALUE IN TABLE ; IF CAPSLOCK THEN MAP A-Z TO A-Z ; IF BIT 7 THEN SEND ESC ; SEND CHARACTER ; ; CHECK FOR AVAILABLE CHARACTER 048A 212A41 LXI H,KFLAG BIT 0,M ; CHECK FOR FLAG 048D+CB46 DB 0CBH,0*8+M+40H 048F C8 RZ ; CHECK FOR KEYBOARD LOCK 0490 3A2741 LDA DIP3 BIT 3,A 0493+CB5F DB 0CBH,3*8+A+40H 0495 C0 RNZ ; GET A CHARACTER 0496 3600 MVI M,0 ; CLEAR FLAG 0498 23 INX H ; GOTO BUFF CP/M MACRO ASSEM 2.0 #026 Terminal Driver Software 0499 46 MOV B,M ; GET CHR 049A 78 MOV A,B ; GET CHR WITH 8 BITS RES 7,B ; CLEAR BIT 7 ON CHARACTER 049B+CBB8 DB 0CBH,7*8+B+80H ; LOOKUP NEW VALUE BASED ON CHARACTER AND TERMINAL TYPE 049D C5 PUSH B 049E 211B03 LXI H,KEYTAB 04A1 CD6604 CALL SELECT ; FIND NEW VALUE FOR THIS TERMINAL 04A4 C1 POP B JRC KEYCVT 04A5+38 DB 38H 04A6+01 DB KEYCVT-$-1 04A7 47 MOV B,A ; SAVE NEW CHARACTER ; IF CAPSLOCK AND LOWER CASE ALPHABETIC THEN CONVERT CASE 04A8 DB06 KEYCVT IN MODSTAT BIT 6,A ; CHECK BIT 04AA+CB77 DB 0CBH,6*8+A+40H JRZ KEYFINI ; NO CAPSLOCK 04AC+28 DB 28H 04AD+0C DB KEYFINI-$-1 ; THEN IF CHR >= 'A' AND CHR <= 'Z' 04AE 78 MOV A,B ; GET CHR 04AF FE61 CPI 'a' JRC KEYFINI ; ELSE DO NOTHING 04B1+38 DB 38H 04B2+07 DB KEYFINI-$-1 04B3 FE7B CPI 'z'+1 JRNC KEYFINI 04B5+30 DB 30H 04B6+03 DB KEYFINI-$-1 ; THEN CHR := CHR - 32 04B7 D620 SUI 32 04B9 47 MOV B,A KEYFINI ; READY TO SEND THE CHAR: ; IF PRINTABLE AND COL=CPL-8 THEN DING BELL 04BA 78 MOV A,B ; LOOK AT CHR 04BB FE20 CPI ' ' JRC NODING 04BD+38 DB 38H 04BE+10 DB NODING-$-1 04BF FE7F CPI 7FH JRNC NODING 04C1+30 DB 30H 04C2+0C DB NODING-$-1 04C3 3A1F41 LDA CPL 04C6 D608 SUI 8 04C8 212141 LXI H,COLUMN 04CB BE CMP M 04CC CC2C0B CZ DING NODING CP/M MACRO ASSEM 2.0 #027 Terminal Driver Software ; IF BIT7 SET THEN BIT 7,B 04CF+CB78 DB 0CBH,7*8+B+40H ; SEND ESC 04D1 3E1B MVI A,ESC 04D3 C4D904 CNZ SEND ; SEND CHR AND 7FH 04D6 78 MOV A,B RES 7,A 04D7+CBBF DB 0CBH,7*8+A+80H SEND ; IF LOCAL OR LOCAL COPY 04D9 F5 PUSH PSW 04DA DB20 IN STAT2 04DC 2F CMA 04DD E660 ANI 01100000B JRZ SENDNLC 04DF+28 DB 28H 04E0+05 DB SENDNLC-$-1 ; THEN STORX 04E1 F1 POP PSW 04E2 F5 PUSH PSW 04E3 CDF404 CALL STORX ; IF NOT LOCAL 04E6 DB20 SENDNLC IN STAT2 04E8 2F CMA 04E9 E620 ANI 00100000B JRNZ SENDL 04EB+20 DB 20H 04EC+05 DB SENDL-$-1 ; THEN STOTX 04ED F1 POP PSW 04EE CD9005 CALL STOTX 04F1 C9 RET ; RET 04F2 F1 SENDL POP PSW 04F3 C9 RET ; CHARACTER FIFO BUFFER ROUTINES: ; STORX: SAVE A RECEIVED CHARACTER ; TAKE CARE OF XON/XOFF PROTOCOL 04F4 F5 STORX PUSH PSW 04F5 E5 PUSH H ; SAVE CHARACTER, ADVANCE POINTER 04F6 2A1041 LHLD RXINP 04F9 77 MOV M,A ; SAVE CHARACTER 04FA 2C INR L ; NO CARRY TO H 04FB 221041 SHLD RXINP ; IF NOT XOFF SENT 04FE 3A2741 LDA DIP3 BIT 5,A 0501+CB6F DB 0CBH,5*8+A+40H JRNZ SRX CP/M MACRO ASSEM 2.0 #028 Terminal Driver Software 0503+20 DB 20H 0504+12 DB SRX-$-1 ; THEN IF FULL 0505 3A1241 LDA RXOUT ; POS OF LAST CHR SENT 0508 95 SUB L NEG ; OUT-INP IS NUMBER OF CHRS IN BUFFER 0509+ED44 DB 0EDH,44H 050B FEC0 CPI 256 * 3/4 ; COMPARE TO 3/4 FULL JRNZ SRX ; DO NOTHING 050D+20 DB 20H 050E+08 DB SRX-$-1 ; THEN SEND XOFF 050F CD5405 CALL SNDXOFF ; SET XOFFSENT FLAG 0512 212741 LXI H,DIP3 SETB 5,M 0515+CBEE DB 0CBH,5*8+M+0C0H ; RETURN 0517 E1 SRX POP H 0518 F1 POP PSW 0519 C9 RET ; FETCHRX: FETCH A RECEIVED CHARACTER ; ANY TIME THE TERINAL IS IDLE, THIS ROUTINE IS EXECUTING ; TAKE CARE OF XON/XOFF PROTOCOL ; CHECK KEYBOARD BUFFER FOR CHARACTER ; TRANSMIT A CHARACTER IF TBE AND CHR IS AVAIL 051A C5 FETCHRX PUSH B 051B D5 PUSH D 051C E5 PUSH H ; TRANSMIT IF POSSIBLE 051D CD8A04 FRXAGN CALL KEYBD ; HANDLE THE KEYBOARD 0520 CDB005 CALL TRANSMT ; TAKE CARE OF TRANSMISSIONS ; CHECK FOR RECEIVED CHARACTERS ; IF CHAR AVAILABLE 0523 2A1241 LHLD RXOUT 0526 3A1041 LDA RXINP 0529 BD CMP L JRZ FRXELS ; NOTHING 052A+28 DB 28H 052B+1E DB FRXELS-$-1 ; THEN GET CHARACTER 052C 46 MOV B,M ; GET CHR ; ADVANCE POINTER 052D 2C INR L 052E 221241 SHLD RXOUT ; IF XOFF-SENT 0531 3A2741 LDA DIP3 BIT 5,A 0534+CB6F DB 0CBH,5*8+A+40H CP/M MACRO ASSEM 2.0 #029 Terminal Driver Software JRZ FRXRET 0536+28 DB 28H 0537+17 DB FRXRET-$-1 ; THEN IF BUFFER=1/4 0538 3A1041 LDA RXINP 053B 95 SUB L 053C FE40 CPI 256 * 1/4 ; CHECK FOR 1/4 BUFFER JRNZ FRXRET 053E+20 DB 20H 053F+0F DB FRXRET-$-1 ; THEN SEND XON 0540 CD7205 CALL SNDXON ; RESET FLAG 0543 212741 LXI H,DIP3 RES 5,M 0546+CBAE DB 0CBH,5*8+M+80H JR FRXRET 0548+18 DB 18H 0549+05 DB FRXRET-$-1 ; ELSE FRXELS ; SETCURS 054A CD7702 CALL SETCURS ; GOTO FETCHRX JR FRXAGN 054D+18 DB 18H 054E+CE DB FRXAGN-$-1 ; RETURN 054F 78 FRXRET MOV A,B 0550 E1 POP H 0551 D1 POP D 0552 C1 POP B 0553 C9 RET ; XON/XOFF ROUTINES: ; TURN LED ON/OFF ; IF X PROTOCOL IS ENABLED, THEN ; STOTX AN XON/XOFF ; ELSE ; TURN RTS ON/OFF ; RET 0554 DB18 SNDXOFF IN STAT1 0556 2F CMA BIT 6,A 0557+CB77 DB 0CBH,6*8+A+40H JRZ SXHRD ; SET RTS LOW 0559+28 DB 28H 055A+0A DB SXHRD-$-1 CP/M MACRO ASSEM 2.0 #030 Terminal Driver Software ; SEND X-OFF 055B 3E13 MVI A,XOFF 055D CD9005 CALL STOTX 0560 3A2941 LDA MODCOPY JR SXLED 0563+18 DB 18H 0564+05 DB SXLED-$-1 0565 3A2941 SXHRD LDA MODCOPY RES 1,A ; RTS LOW 0568+CB8F DB 0CBH,1*8+A+80H SXLED RES 2,A ; LED OFF 056A+CB97 DB 0CBH,2*8+A+80H 056C 322941 STA MODCOPY 056F D304 OUT MODCTL 0571 C9 RET 0572 DB18 SNDXON IN STAT1 0574 2F CMA BIT 6,A 0575+CB77 DB 0CBH,6*8+A+40H JRZ SXNRTS 0577+28 DB 28H 0578+0A DB SXNRTS-$-1 0579 3E11 MVI A,XON 057B CD9005 CALL STOTX 057E 3A2941 LDA MODCOPY JR SXNLED 0581+18 DB 18H 0582+05 DB SXNLED-$-1 0583 3A2941 SXNRTS LDA MODCOPY SETB 1,A ; RTS HIGH 0586+CBCF DB 0CBH,1*8+A+0C0H SXNLED SETB 2,A ; LED ON 0588+CBD7 DB 0CBH,2*8+A+0C0H 058A 322941 STA MODCOPY 058D D304 OUT MODCTL 058F C9 RET ; STOTX: SAVE A CHARACTER TO BE TRANSMITTED 0590 E5 STOTX PUSH H 0591 2A1441 LHLD TXINP 0594 77 MOV M,A 0595 2C INR L RES TXFSIZ,L ; KEEP IN BOUNDS 0596+CBA5 DB 0CBH,TXFSIZ*8+L+80H 0598 221441 SHLD TXINP 059B E1 POP H 059C C9 RET ; FETCHTX: FETCH A CHARACTER TO BE TRANSMITTED ; RETURN CARRY IF THERE IS NONE 059D 2A1641 FETCHTX LHLD TXOUT 05A0 7E MOV A,M CP/M MACRO ASSEM 2.0 #031 Terminal Driver Software 05A1 2C INR L RES TXFSIZ,L ; KEEP IN BOUNDS 05A2+CBA5 DB 0CBH,TXFSIZ*8+L+80H 05A4 221641 SHLD TXOUT 05A7 C9 RET ; SEE IF A CHR IS PRESENT TO TRANSMIT 05A8 2A1641 TXCHR LHLD TXOUT 05AB 3A1441 LDA TXINP 05AE BD CMP L 05AF C9 RET ; Z MEANS NONE, NZ MEANS CHR AVAIL ; TRANSMIT A CHARACTER IF BUFFER IS EMPTY AND CHR IS AVAILABLE 05B0 CDA805 TRANSMT CALL TXCHR 05B3 C8 RZ ; NOTHING ; SEE IF TRANSMITTER IS READY TO ACCEPT A CHARACTER ; 1. MUST HAVE CLEAR TO SEND ; 2. UART BUFFER MUST BE EMPTY 05B4 DB06 IN MODSTAT BIT 4,A ; CHECK FOR CTS 05B6+CB67 DB 0CBH,4*8+A+40H 05B8 C8 RZ 05B9 DB05 IN LINSTAT ; BUFFER FULL? BIT 5,A 05BB+CB6F DB 0CBH,5*8+A+40H 05BD C8 RZ ; ALL SYSTEMS ARE GO . . . 05BE CD9D05 CALL FETCHTX ; GET THE CHR TO TRANSMIT ; PROCESS FOR PARITY RES 7,A ; STRIP FIRST 05C1+CBBF DB 0CBH,7*8+A+80H 05C3 47 MOV B,A ; SAVE ; CHECK PARITY OPTIONS ; 5 4 OPTION ; ; 0 0 LOW ; 0 1 HIGH ; 1 1 ODD ; 1 0 EVEN 05C4 DB18 IN STAT1 05C6 07 RLC 05C7 07 RLC 05C8 07 RLC JRC XMPAR ; ADD PARITY 05C9+38 DB 38H 05CA+05 DB XMPAR-$-1 ; NO PARITY: PUT IN BIT 7 AND XMIT 05CB E680 ANI 80H 05CD B0 ORA B JR XMOUT 05CE+18 DB 18H 05CF+0B DB XMOUT-$-1 ; ADD PARITY CP/M MACRO ASSEM 2.0 #032 Terminal Driver Software 05D0 E680 XMPAR ANI 80H 05D2 4F MOV C,A 05D3 78 MOV A,B 05D4 A7 ANA A 05D5 EADA05 JPE PAR 05D8 EE80 XRI 80H ; MAKE PARITY EVEB 05DA A9 PAR XRA C ; CHANGE IF NECCESSARY 05DB D300 XMOUT OUT XMIT 05DD C9 RET PAGE CP/M MACRO ASSEM 2.0 #033 Terminal Driver Software ; ********************************* ; * * ; * ERASING AND EDITING * ; * * ; ********************************* ; CLEAR THE STATUS LINE 05DE 2A1A41 CLRSTAT LHLD HOME LDED SCRSIZ 05E1+ED5B DB 0EDH,5BH 05E3+1C41 DW SCRSIZ 05E5 19 DAD D 05E6 3A1F41 LDA CPL 05E9 47 MOV B,A 05EA 3620 CLRS1 MVI M,SPACE 05EC 23 INX H DJNZ CLRS1 05ED+10 DB 10H 05EE+FB DB CLRS1-$-1 05EF C9 RET ; CHECK FOR STATUS LINE: RETURN Z IF YES, NZ IF NO 05F0 3A2041 DUMPST LDA LPS ; CHECK FOR STATUS LINE. 05F3 212241 LXI H,LINE 05F6 BE CMP M ; IS STATUS LINE? 05F7 C9 RET ; ERASE DE BYTES FROM HL ; DE >= 0 05F8 7A ERASE MOV A,D 05F9 E61F ANI 8191/256 ; 8K MAX 05FB 57 MOV D,A MASK8 05FC+7C MOV A,H 05FD+F6C0 ORI 11000000B 05FF+E6DF ANI 11011111B 0601+67 MOV H,A 0602 3A2741 LDA DIP3 ; CHECK FOR INVERSE VIDEO 0605 E680 ANI 80H 0607 C620 ADI SPACE 0609 47 MOV B,A ; WRITE THIS CHR ; WRITE B INTO DE BYTES AT HL 060A 7A MOV A,D ; CHECK FOR ZERO 060B B3 ORA E 060C C8 RZ 060D 14 INR D 060E 70 ERAS1 MOV M,B ; ERASE ONE 060F 23 INX H 0610 1D DCR E 0611 C20E06 JNZ ERAS1 0614 15 DCR D 0615 C20E06 JNZ ERAS1 0618 C9 RET CP/M MACRO ASSEM 2.0 #034 Terminal Driver Software ; ERASE THE SCREEN ; HOME := SCREEN ; SCREEN := SPACES 0619 CDF005 ESCREEN CALL DUMPST 061C CA3206 JZ ELINE ; JUST ERASE STATUS LINE 061F 2100C0 LXI H,SCREEN 0622 CD8A02 CALL SETHOME 0625 CDCC08 CALL CHOME ; HOME THE CURSOR ; ERASE THE SCREEN NOW 0628 2A1A41 LHLD HOME ; FROM LDED SCRSIZ ; LENGTH 062B+ED5B DB 0EDH,5BH 062D+1C41 DW SCRSIZ 062F C3F805 JMP ERASE ; ELINE: ERASE LINE WITH CURSOR, LEAVE CURSOR ALONE ; FIND START OF LINE ; ERASE CPL BYTES 0632 2A1841 ELINE LHLD CURSOR LDED COLUMN 0635+ED5B DB 0EDH,5BH 0637+2141 DW COLUMN SUBHLE 0639+A7 ANA A 063A+1600 MVI D,0 063C+ED52 DB 0EDH,D*8+42H MASK8 ; KEEP EVERYTHING IN BOUNDS 063E+7C MOV A,H 063F+F6C0 ORI 11000000B 0641+E6DF ANI 11011111B 0643+67 MOV H,A LDED CPL 0644+ED5B DB 0EDH,5BH 0646+1F41 DW CPL 0648 1600 MVI D,0 064A C3F805 JMP ERASE ; EBEGIN: ERASE FROM HOME TO CURSOR INCLUSIVE ; (CURSOR-HOME+1) BYTES FROM HOME 064D CDF005 EBEGIN CALL DUMPST ; DUMP IF STATUS LINE 0650 C8 RZ 0651 2A1841 LHLD CURSOR LDED HOME 0654+ED5B DB 0EDH,5BH 0656+1A41 DW HOME 0658 A7 ANA A DSBC D 0659+ED52 DB 0EDH,D*8+42H 065B 23 INX H 065C EB XCHG 065D 2A1A41 LHLD HOME 0660 C3F805 JMP ERASE ; EEND: ERASE FROM CURSOR TO END OF DISPLAY INCLUSIVE CP/M MACRO ASSEM 2.0 #035 Terminal Driver Software ; (SCRSIZ-CURSOR+HOME) BYTES FROM CURSOR 0663 CDF005 EEND CALL DUMPST 0666 C8 RZ 0667 2A1C41 LHLD SCRSIZ LDED HOME 066A+ED5B DB 0EDH,5BH 066C+1A41 DW HOME 066E 19 DAD D LDED CURSOR 066F+ED5B DB 0EDH,5BH 0671+1841 DW CURSOR 0673 A7 ANA A DSBC D 0674+ED52 DB 0EDH,D*8+42H 0676 EB XCHG 0677 2A1841 LHLD CURSOR 067A C3F805 JMP ERASE ; ELEFT: ERASE FROM LEFT OF LINE TO CURSOR INCLUSIVE ; COL+1 BYTES FROM (CURSOR-COL) 067D 2A1841 ELEFT LHLD CURSOR LDED COLUMN 0680+ED5B DB 0EDH,5BH 0682+2141 DW COLUMN SUBHLE 0684+A7 ANA A 0685+1600 MVI D,0 0687+ED52 DB 0EDH,D*8+42H MASK8 0689+7C MOV A,H 068A+F6C0 ORI 11000000B 068C+E6DF ANI 11011111B 068E+67 MOV H,A LDED COLUMN 068F+ED5B DB 0EDH,5BH 0691+2141 DW COLUMN 0693 1600 MVI D,0 0695 1C INR E 0696 C3F805 JMP ERASE ; ERIGHT: ERASE FROM CURSOR TO RIGHT END OF LINE INCLUSIVE ; (CPL-COL) BYTES FROM CURSOR 0699 212141 ERIGHT LXI H,COLUMN 069C 3A1F41 LDA CPL 069F 96 SUB M 06A0 5F MOV E,A 06A1 1600 MVI D,0 06A3 2A1841 LHLD CURSOR 06A6 C3F805 JMP ERASE ; INSCHR: INSERT A CHARACTER ; MOVE COL...CPL-2 TO COL+1...CPL-1 ; IE FROM CURSOR TO CURSOR+1 WITH (CPL-COL-1) BYTES ; DO NOT CHANGE CHARACTER AT COL. ; HL=CURSOR+CPL-COLUMN-2; DE=CURSOR+CPL-COLUMN-1; BC=CPL-COL-1 CP/M MACRO ASSEM 2.0 #036 Terminal Driver Software 06A9 212141 INSCHR LXI H,COLUMN 06AC 3A1F41 LDA CPL 06AF 96 SUB M 06B0 3D DCR A 06B1 C8 RZ ; ZERO BYTES 06B2 4F MOV C,A 06B3 0600 MVI B,0 06B5 2A1841 LHLD CURSOR LDED CPL 06B8+ED5B DB 0EDH,5BH 06BA+1F41 DW CPL ADDHLE 06BC+1600 MVI D,0 06BE+19 DAD D LDED COLUMN 06BF+ED5B DB 0EDH,5BH 06C1+2141 DW COLUMN SUBHLE 06C3+A7 ANA A 06C4+1600 MVI D,0 06C6+ED52 DB 0EDH,D*8+42H 06C8 2B DCX H MASKH8 06C9+7C MOV A,H 06CA+F6E0 ORI 11100000B 06CC+67 MOV H,A 06CD 54 MOV D,H 06CE 5D MOV E,L 06CF 2B DCX H MASKH8 06D0+7C MOV A,H 06D1+F6E0 ORI 11100000B 06D3+67 MOV H,A LDDR 06D4+EDB8 DB 0EDH,0B8H 06D6 C9 RET ; HINSCHR: INSERT A BLANK 06D7 CDA906 HINSCHR CALL INSCHR 06DA 3E20 MVI A,SPACE 06DC C3AD07 JMP WRITE ; INSLINE: INSERT LINE WITH CURSOR ; CCR ; MOVE (SCRSIZ-CURSOR-CPL+HOME+1) FROM HOME+SCRSIZ-1-CPL TO HOME+SCRSIZ-1 06DF CDF005 INSLINE CALL DUMPST 06E2 C8 RZ 06E3 CDFA07 CALL CCR 06E6 2A1C41 LHLD SCRSIZ LDED HOME 06E9+ED5B DB 0EDH,5BH CP/M MACRO ASSEM 2.0 #037 Terminal Driver Software 06EB+1A41 DW HOME 06ED 19 DAD D LDED CPL 06EE+ED5B DB 0EDH,5BH 06F0+1F41 DW CPL SUBHLE 06F2+A7 ANA A 06F3+1600 MVI D,0 06F5+ED52 DB 0EDH,D*8+42H LDED CURSOR 06F7+ED5B DB 0EDH,5BH 06F9+1841 DW CURSOR 06FB A7 ANA A DSBC D 06FC+ED52 DB 0EDH,D*8+42H 06FE 23 INX H 06FF 7C MOV A,H 0700 E61F ANI 8191/256 0702 47 MOV B,A 0703 4D MOV C,L ; BC:=SCRSIZ+HOME-CURSOR-CPL+1 0704 B1 ORA C ; CHECK FOR ZERO JRZ INSL0 0705+28 DB 28H 0706+1E DB INSL0-$-1 0707 2A1C41 LHLD SCRSIZ LDED HOME 070A+ED5B DB 0EDH,5BH 070C+1A41 DW HOME 070E 19 DAD D 070F 2B DCX H MASKH8 0710+7C MOV A,H 0711+F6E0 ORI 11100000B 0713+67 MOV H,A 0714 E5 PUSH H LDED CPL 0715+ED5B DB 0EDH,5BH 0717+1F41 DW CPL SUBHLE 0719+A7 ANA A 071A+1600 MVI D,0 071C+ED52 DB 0EDH,D*8+42H MASKH8 071E+7C MOV A,H 071F+F6E0 ORI 11100000B 0721+67 MOV H,A 0722 D1 POP D LDDR 0723+EDB8 DB 0EDH,0B8H 0725 C33206 INSL0 JMP ELINE CP/M MACRO ASSEM 2.0 #038 Terminal Driver Software ; DELLINE: DELETE LINE WITH CURSOR, LEAVE CURSOR AT LEFT, FILL WITH SPACES ; AT BOTTOM. ; CCR ; MOVE (SCRSIZ-CURSOR-CPL+HOME+1) FROM CURSOR+CPL TO CURSOR 0728 CDF005 DELLINE CALL DUMPST 072B C8 RZ 072C CDFA07 CALL CCR 072F 2A1C41 LHLD SCRSIZ LDED HOME 0732+ED5B DB 0EDH,5BH 0734+1A41 DW HOME 0736 19 DAD D LDED CPL 0737+ED5B DB 0EDH,5BH 0739+1F41 DW CPL SUBHLE 073B+A7 ANA A 073C+1600 MVI D,0 073E+ED52 DB 0EDH,D*8+42H LDED CURSOR 0740+ED5B DB 0EDH,5BH 0742+1841 DW CURSOR 0744 A7 ANA A DSBC D 0745+ED52 DB 0EDH,D*8+42H 0747 7C MOV A,H ; BC<8K 0748 E61F ANI 8191/256 074A 47 MOV B,A 074B 4D MOV C,L ; BC:=SCRSIZ+HOME-CURSOR-CPL 074C B1 ORA C JRZ DELL0 ; NOTHING TO MOVE 074D+28 DB 28H 074E+1A DB DELL0-$-1 074F 2A1841 LHLD CURSOR MASK8 0752+7C MOV A,H 0753+F6C0 ORI 11000000B 0755+E6DF ANI 11011111B 0757+67 MOV H,A 0758 E5 PUSH H LDED CPL 0759+ED5B DB 0EDH,5BH 075B+1F41 DW CPL ADDHLE 075D+1600 MVI D,0 075F+19 DAD D MASK8 ; HL=CURSOR+CPL 0760+7C MOV A,H 0761+F6C0 ORI 11000000B 0763+E6DF ANI 11011111B 0765+67 MOV H,A CP/M MACRO ASSEM 2.0 #039 Terminal Driver Software 0766 D1 POP D ; DE=CURSOR LDIR 0767+EDB0 DB 0EDH,0B0H ; ERASE BOTTOM LINE ; CPL FROM HOME + SCRSIZ-CPL 0769 2A1A41 DELL0 LHLD HOME LDED SCRSIZ 076C+ED5B DB 0EDH,5BH 076E+1C41 DW SCRSIZ 0770 19 DAD D LDED CPL 0771+ED5B DB 0EDH,5BH 0773+1F41 DW CPL SUBHLE 0775+A7 ANA A 0776+1600 MVI D,0 0778+ED52 DB 0EDH,D*8+42H MASK8 077A+7C MOV A,H 077B+F6C0 ORI 11000000B 077D+E6DF ANI 11011111B 077F+67 MOV H,A LDED CPL 0780+ED5B DB 0EDH,5BH 0782+1F41 DW CPL 0784 1600 MVI D,0 0786 C3F805 JMP ERASE ; DELETE CHARACTER: ; MOVE CPL-COLUMN-1 FROM CURSOR+1 TO CURSOR 0789 212141 DELCHR LXI H,COLUMN 078C 3A1F41 LDA CPL 078F 96 SUB M 0790 3D DCR A 0791 4F MOV C,A 0792 0600 MVI B,0 0794 2A1841 LHLD CURSOR MASK8 0797+7C MOV A,H 0798+F6C0 ORI 11000000B 079A+E6DF ANI 11011111B 079C+67 MOV H,A 079D 54 MOV D,H 079E 5D MOV E,L 079F 23 INX H ; CHECK FOR ZERO BYTES 07A0 79 MOV A,C 07A1 A7 ANA A JRZ DELC0 CP/M MACRO ASSEM 2.0 #040 Terminal Driver Software 07A2+28 DB 28H 07A3+02 DB DELC0-$-1 LDIR 07A4+EDB0 DB 0EDH,0B0H 07A6 EB DELC0 XCHG 07A7 3E20 MVI A,SPACE 07A9 CDB007 CALL WRITEHL 07AC C9 RET PAGE CP/M MACRO ASSEM 2.0 #041 Terminal Driver Software ; ********************************* ; * * ; * CURSOR FUNCTIONS * ; * * ; ********************************* 07AD 2A1841 WRITE LHLD CURSOR 07B0 E5 WRITEHL PUSH H ; WRITE A CHARACTER TO THE SCREEN: ; IF GRAPHICS THEN MAP 60-7F TO 00-1F ; IF INVERSE VIDEO THEN SET B7 ; IF INSERT MODE THEN INSCHR ; STORE CHARACTER 07B1 212741 LXI H,DIP3 BIT 2,M ; CHECK FOR GRAPHICS BIT 07B4+CB56 DB 0CBH,2*8+M+40H JRZ WRNOG 07B6+28 DB 28H 07B7+07 DB WRNOG-$-1 ; GRAPHICS MODE: IF A>=60, SUBTRACT 60H 07B8 FE60 CPI 60H 07BA DABF07 JC WRNOG 07BD D660 SUI 60H ; CHECK FOR INVERSE VIDEO WRNOG BIT 7,M 07BF+CB7E DB 0CBH,7*8+M+40H JRZ WRNOI 07C1+28 DB 28H 07C2+02 DB WRNOI-$-1 07C3 F680 ORI 80H ; TURN ON INVERSE VIDEO WRNOI BIT 6,M ; CHECK FOR INSERT MODE 07C5+CB76 DB 0CBH,6*8+M+40H JRZ WRNINS 07C7+28 DB 28H 07C8+05 DB WRNINS-$-1 07C9 F5 PUSH PSW 07CA CDA906 CALL INSCHR 07CD F1 POP PSW ; PUT CHARACTER ON THE SCREEN 07CE E1 WRNINS POP H 07CF 77 MOV M,A 07D0 C9 RET ; CINC: INCREMENT CURSOR POSITION ; IF COL<>CPL-1 ; THEN COL:=COL+1 ; CURSOR := CURSOR + 1; EXIT ; ELSE IF WRAPAROUND ; THEN CRLF ; EXIT 07D1 212141 CINC LXI H,COLUMN 07D4 3A1F41 LDA CPL 07D7 3D DCR A 07D8 BE CMP M JRZ CINCELS CP/M MACRO ASSEM 2.0 #042 Terminal Driver Software 07D9+28 DB 28H 07DA+0D DB CINCELS-$-1 ; THEN ADVANCE COLUMN, CURSOR, EXIT 07DB 34 INR M 07DC 2A1841 LHLD CURSOR 07DF 23 INX H MASK 07E0+7C MOV A,H 07E1+F6C0 ORI 11000000B 07E3+67 MOV H,A 07E4 221841 SHLD CURSOR 07E7 C9 RET ; IF WRAPAROUND, DO CCRLF 07E8 3A2641 CINCELS LDA DIP2 BIT 7,A ; CHECK WRAP-AROUND 07EB+CB7F DB 0CBH,7*8+A+40H 07ED C8 RZ ; DO NOTHING 07EE C38008 JMP CCRLF ; DO CRLF ; HLF: LINE FEED WITH OPTIONAL CARRIAGE RETURN 07F1 CD1B08 HLF CALL CLF 07F4 3A2741 LDA DIP3 BIT 0,A 07F7+CB47 DB 0CBH,0*8+A+40H 07F9 C8 RZ ; CCR: CARRIAGE RETURN ; CURSOR := CURSOR-COL ; COL:=0 07FA 2A1841 CCR LHLD CURSOR LDED COLUMN 07FD+ED5B DB 0EDH,5BH 07FF+2141 DW COLUMN SUBHLE ; HL := HL - E 0801+A7 ANA A 0802+1600 MVI D,0 0804+ED52 DB 0EDH,D*8+42H MASK 0806+7C MOV A,H 0807+F6C0 ORI 11000000B 0809+67 MOV H,A 080A 221841 SHLD CURSOR 080D AF XRA A 080E 322141 STA COLUMN 0811 C9 RET ; HCR: CARRIAGE RETURN WITH OPTIONAL LINEFEED 0812 CDFA07 HCR CALL CCR 0815 3A2541 LDA DIP1 BIT 7,A 0818+CB7F DB 0CBH,7*8+A+40H 081A C8 RZ ; CLF: LINE FEED AND SCROLL IF AT BOTTOM OF SCREEN ; ; CURSOR := CURSOR + CPL CP/M MACRO ASSEM 2.0 #043 Terminal Driver Software ; IF LINE<>LPS-1 ; THEN LINE := LINE+1 ; ELSE HOME := HOME + CPL ; SETHOME ; ELINE 081B CDF005 CLF CALL DUMPST 081E C8 RZ 081F 2A1841 LHLD CURSOR ; ADVANCE CURSOR LDED CPL 0822+ED5B DB 0EDH,5BH 0824+1F41 DW CPL ADDHLE 0826+1600 MVI D,0 0828+19 DAD D MASK 0829+7C MOV A,H 082A+F6C0 ORI 11000000B 082C+67 MOV H,A 082D 221841 SHLD CURSOR ; CHECK FOR BOTTOM OF SCREEN 0830 212241 LXI H,LINE 0833 3A2041 LDA LPS 0836 BE CMP M ; CHECK FOR STATUS LINE 0837 C8 RZ ; DONT DO NOTHING 0838 3D DCR A 0839 BE CMP M JRZ CLFE ; ELSE SCROLL 083A+28 DB 28H 083B+02 DB CLFE-$-1 ; JUST MOVE DOWN ONE LINE 083C 34 INR M ; INCR LINE 083D C9 RET ; ELSE SCROLL 083E 2A1A41 CLFE LHLD HOME LDED CPL 0841+ED5B DB 0EDH,5BH 0843+1F41 DW CPL ADDHLE 0845+1600 MVI D,0 0847+19 DAD D 0848 CD8A02 CALL SETHOME 084B C33206 JMP ELINE ; ERASE LINE ; CRLF: REVERSE LINE FEED ; CURSOR := CURSOR - CPL ; IF LINE<>0 ; THEN LINE := LINE - 1; ; ELSE HOME := HOME - CPL ; SETHOME ; ELINE 084E CDF005 CRLF CALL DUMPST CP/M MACRO ASSEM 2.0 #044 Terminal Driver Software 0851 C8 RZ 0852 2A1841 LHLD CURSOR LDED CPL 0855+ED5B DB 0EDH,5BH 0857+1F41 DW CPL SUBHLE 0859+A7 ANA A 085A+1600 MVI D,0 085C+ED52 DB 0EDH,D*8+42H MASK 085E+7C MOV A,H 085F+F6C0 ORI 11000000B 0861+67 MOV H,A 0862 221841 SHLD CURSOR 0865 212241 LXI H,LINE 0868 AF XRA A 0869 BE CMP M JRZ CRLFELS ; ELSE SCROLL UP 086A+28 DB 28H 086B+02 DB CRLFELS-$-1 ; 086C 35 DCR M ; DCR LINE 086D C9 RET ; SCROLL UP: 086E 2A1A41 CRLFELS LHLD HOME LDED CPL 0871+ED5B DB 0EDH,5BH 0873+1F41 DW CPL SUBHLE 0875+A7 ANA A 0876+1600 MVI D,0 0878+ED52 DB 0EDH,D*8+42H 087A CD8A02 CALL SETHOME 087D C33206 JMP ELINE ; ERASE & RETURN ; CCRLF ; CR ; LF 0880 CDFA07 CCRLF CALL CCR 0883 C31B08 JMP CLF ; CLEFT ; IF COL <> 0 ; THEN CDEC ; ; CDEC: ; IF COL <> 0 ; THEN COL := COL - 1 ; CURSOR := CURSOR - 1; CLEFT 0886 212141 CDEC LXI H,COLUMN 0889 AF XRA A CP/M MACRO ASSEM 2.0 #045 Terminal Driver Software 088A BE CMP M 088B C8 RZ ; DEC COL & CURSOR 088C 35 DCR M 088D 2A1841 LHLD CURSOR 0890 2B DCX H MASK 0891+7C MOV A,H 0892+F6C0 ORI 11000000B 0894+67 MOV H,A 0895 221841 SHLD CURSOR 0898 C9 RET ; CRIGHT ; IF COL+1 <> CPL ; THEN CINC 0899 212141 CRIGHT LXI H,COLUMN 089C 3A1F41 LDA CPL 089F 3D DCR A 08A0 BE CMP M 08A1 C8 RZ 08A2 C3D107 JMP CINC ; CUP ; IF LINE <> 0 ; THEN RLF 08A5 3A2241 CUP LDA LINE 08A8 A7 ANA A 08A9 C8 RZ 08AA C34E08 JMP CRLF ; CDOWN ; IF LINE+1 <> LPS ; THEN CLF 08AD 212241 CDOWN LXI H,LINE 08B0 3A2041 LDA LPS 08B3 3D DCR A 08B4 BE CMP M 08B5 C8 RZ 08B6 C31B08 JMP CLF ; HORIZONTAL TAB: ; MOVE CURSOR TO A COLUMN THAT IS A MULTIPLE OF 8 CTAB LBCD COLUMN ; FIND OLD LOCATION 08B9+ED4B DB 0EDH,4BH 08BB+2141 DW COLUMN 08BD C5 PUSH B 08BE CDD107 CALL CINC 08C1 C1 POP B 08C2 3A2141 LDA COLUMN 08C5 B9 CMP C 08C6 C8 RZ ; QUIT IF NOTHING HAPPENED 08C7 E607 ANI 7 JRNZ CTAB CP/M MACRO ASSEM 2.0 #046 Terminal Driver Software 08C9+20 DB 20H 08CA+EE DB CTAB-$-1 08CB C9 RET ; CURSOR HOME ; CURSOR:=HOME ; LINE:=0 ; COL:=0 ; 08CC 2A1A41 CHOME LHLD HOME 08CF 221841 SHLD CURSOR 08D2 AF XRA A 08D3 322241 STA LINE 08D6 322141 STA COLUMN 08D9 C9 RET ; CSAV: SAVE CURSOR POSITION FOR LATER RECALL 08DA 3A2141 CSAV LDA COLUMN 08DD 322341 STA STOC 08E0 3A2241 LDA LINE 08E3 322441 STA STOL 08E6 C9 RET ; CRESTO: RESTORE CURSOR POSITION CRESTO LBCD STOC ; GET C,L 08E7+ED4B DB 0EDH,4BH 08E9+2341 DW STOC 08EB C3FC08 JMP SETXY ; CADDR: CURSOR ADDRESSING ; FETCH A LINE, COLUMN 08EE CD1A05 CADDR CALL FETCHRX 08F1 D620 SUI SPACE 08F3 F5 PUSH PSW 08F4 CD1A05 CALL FETCHRX 08F7 D620 SUI SPACE 08F9 4F MOV C,A 08FA F1 POP PSW 08FB 47 MOV B,A ; SETXY: SET THE CURSOR POSITION GIVEN B=LINE, C=COLUMN ; CURSOR := HOME + CPL*LINE + COLUMN ; IF LINE >= LPS THEN LINE=STATUSLINE 08FC 3A1F41 SETXY LDA CPL 08FF B9 CMP C ; CHECK COLUMN VALIDITY JRNC SETXOK 0900+30 DB 30H 0901+02 DB SETXOK-$-1 0902 3D DCR A 0903 4F MOV C,A SETXOK ; CHECK BOUNDS OF LINE SPECIFIED 0904 3A2041 LDA LPS 0907 B8 CMP B JRNC SETYOK CP/M MACRO ASSEM 2.0 #047 Terminal Driver Software 0908+30 DB 30H 0909+01 DB SETYOK-$-1 090A 47 MOV B,A ; MAKE B=LPS SETYOK 090B 79 MOV A,C 090C 322141 STA COLUMN 090F 78 MOV A,B 0910 322241 STA LINE ; CALCULATE NEW CURSOR POSITION 0913 2600 MVI H,0 0915 69 MOV L,C ; HL:=COLUMN LDED HOME 0916+ED5B DB 0EDH,5BH 0918+1A41 DW HOME 091A 19 DAD D ; HL=COLUMN+HOME 091B A7 ANA A JRZ XYLINE0 091C+28 DB 28H 091D+09 DB XYLINE0-$-1 LDED CPL 091E+ED5B DB 0EDH,5BH 0920+1F41 DW CPL 0922 1600 MVI D,0 0924 19 SETXY1 DAD D DJNZ SETXY1 0925+10 DB 10H 0926+FD DB SETXY1-$-1 XYLINE0 MASK 0927+7C MOV A,H 0928+F6C0 ORI 11000000B 092A+67 MOV H,A 092B 221841 SHLD CURSOR 092E C9 RET ; REPORT CURSOR ADDRESS 092F 3E1B CREP MVI A,ESC 0931 CDD904 CALL SEND 0934 3E59 MVI A,'Y' 0936 CDD904 CALL SEND 0939 3A2241 LDA LINE 093C C620 ADI SPACE 093E CDD904 CALL SEND 0941 3A2141 LDA COLUMN 0944 C620 ADI SPACE 0946 CDD904 CALL SEND 0949 C9 RET CP/M MACRO ASSEM 2.0 #048 Terminal Driver Software ; READ CURSOR CHARACTER 094A 2A1841 CREAD LHLD CURSOR 094D 7E MOV A,M 094E C3D904 JMP SEND ; GRAPHIC CHARACTER DISPLAY 0951 CD1A05 GRAPHIC CALL FETCHRX 0954 CDAD07 CALL WRITE 0957 C3D107 JMP CINC PAGE CP/M MACRO ASSEM 2.0 #049 Terminal Driver Software ; ********************************* ; * * ; * CONFIGURATION * ; * * ; ********************************* ; SETCRTC: SET THE CRTC MODE 095A CD1A05 SETCRTC CALL FETCHRX ; GET MODE: A THRU H 095D D641 SUI 'A' 095F D8 RC 0960 E607 ANI 7 0962 47 MOV B,A 0963 212641 LXI H,DIP2 0966 7E MOV A,M 0967 E6F8 ANI 11111000B 0969 B0 ORA B 096A 77 MOV M,A 096B CDA20A CALL STATOFF ; TURN OFF THE STATUS LINE 096E C37001 JMP CRTCMOD ; SETUP CRTC ; SETUP THE BAUD RATE GENERATOR 0971 CD1A05 SETBRG CALL FETCHRX ; GET A CHARACTER 0974 D640 SUI '@' ; MAKE BINARY 0976 D8 RC ; BAD 0977 E60F ANI 15 ; SAVE ONLY 4 BITS 0979 47 MOV B,A 097A 212541 LXI H,DIP1 097D 7E MOV A,M 097E E6F0 ANI 0F0H ; RID OF RATE 0980 B0 ORA B ; PUT IN RATE 0981 77 MOV M,A ; SAVE NEW DIP1 0982 CD1E01 CALL SETBAUD ; MAKE NEW RATE 0985 C9 RET ; SET MODE: TURN ON OR OFF CERTAIN FLAGS 0986 CD1A05 SETMODE CALL FETCHRX 0989 21BD09 LXI H,MODTON ; MODE TABLE 098C 1607 MVI D,MODTONL ; LENGTH 098E C3B309 JMP GOAWAY ; RESET MODE: 0991 CD1A05 RESMODE CALL FETCHRX 0994 21D209 LXI H,MODTOFF ; OFF MODE TABLE 0997 1607 MVI D,MODTOFL 0999 C3B309 JMP GOAWAY ; TEST ROUTINES: ; 1=PRINT ALL CHARACTERS ON SCREEN (INCLUDING CTL & ESC) ; 2=FILL SCREEN WITH TEST PATTERN ; 3=FILL SCREEN WITH CHARACTER ; 4=MODIFY CRTC REGISTER 099C CD1A05 TESTMOD CALL FETCHRX CP/M MACRO ASSEM 2.0 #050 Terminal Driver Software 099F 21A709 LXI H,TESTTAB 09A2 1604 MVI D,TESTLEN 09A4 C3B309 JMP GOAWAY 09A7 31 TESTTAB DB '1' ; DISPLAY EVERY CHARACTER RECEIVED 09A8 AA0A DW TSTPRT ; ( INCLUDING CONTROL CHARACTERS) 09AA 32 DB '2' ; FILL SCREEN WITH TEST PATTERN 09AB B80A DW TSTFILL 09AD 33 DB '3' ; FILL SCREEN WITH CHARACTER 09AE C60A DW TSTFILC 09B0 34 DB '4' ; SEND A VALUE TO A CRTC PORT 09B1 D80A DW TSTCRTC 0004 = TESTLEN EQU ($-TESTTAB)/3 ; LOOKUP ROUTINE AND EXECUTE 09B3 1E03 GOAWAY MVI E,3 09B5 CD5404 CALL SEARCH 09B8 D8 RC ; NOT FOUND. 09B9 23 INX H 09BA 66 MOV H,M 09BB 6F MOV L,A 09BC E9 PCHL ; MODE TABLES 09BD 30 MODTON DB '0' ; BLINKING CURSOR (DEFAULT) 09BE 5D0A DW BLNKON 09C0 31 DB '1' ; STATUS LINE ON 09C1 970A DW STATON 09C3 32 DB '2' ; BELL OFF 09C4 410A DW BELOFF 09C6 34 DB '4' ; BLOCK MODE CURSOR (DEFAULT) 09C7 6D0A DW BLKON 09C9 35 DB '5' ; NO CURSOR 09CA 850A DW CURSOFF 09CC 38 DB '8' ; AUTO LINE-FEED 09CD 230A DW ALFON 09CF 39 DB '9' ; AUTO CARRIAGE-RETURN 09D0 2F0A DW ACRON 0007 = MODTONL EQU ($-MODTON)/3 09D2 30 MODTOFF DB '0' ; NO BLINKING CURSOR 09D3 650A DW BLNKOFF 09D5 31 DB '1' ; NO STATUS LINE (DEFAULT) 09D6 A20A DW STATOFF 09D8 32 DB '2' ; BELL WORKS (DEFAULT) 09D9 3B0A DW BELON 09DB 34 DB '4' ; UNDERSCORE CURSOR 09DC 750A DW BLKOFF 09DE 35 DB '5' ; CURSOR ENABLE (DEFAULT) 09DF 7D0A DW CURSON 09E1 38 DB '8' ; AUTO LF OFF (DEFAULT) 09E2 290A DW ALFOFF 09E4 39 DB '9' ; AUTO CR OFF (DEFAULT) 09E5 350A DW ACROFF 0007 = MODTOFL EQU ($-MODTOFF)/3 CP/M MACRO ASSEM 2.0 #051 Terminal Driver Software ; MODES ON AND OFF: INSON TURNON DIP3,6 ; INSERT MODE 09E7+212741 LXI H,DIP3 09EA+CBF6 DB 0CBH,6*8+M+0C0H 09EC C9 RET INSOFF TURNOFF DIP3,6 09ED+212741 LXI H,DIP3 09F0+CBB6 DB 0CBH,6*8+M+80H 09F2 C9 RET INVON TURNON DIP3,7 ; INVERTED VIDEO 09F3+212741 LXI H,DIP3 09F6+CBFE DB 0CBH,7*8+M+0C0H 09F8 C9 RET INVOFF TURNOFF DIP3,7 09F9+212741 LXI H,DIP3 09FC+CBBE DB 0CBH,7*8+M+80H 09FE C9 RET GRON TURNON DIP3,2 ; GRAPHICS 09FF+212741 LXI H,DIP3 0A02+CBD6 DB 0CBH,2*8+M+0C0H 0A04 C9 RET GROFF TURNOFF DIP3,2 0A05+212741 LXI H,DIP3 0A08+CB96 DB 0CBH,2*8+M+80H 0A0A C9 RET KEYON TURNON DIP3,3 ; KEYBOARD LOCK ON 0A0B+212741 LXI H,DIP3 0A0E+CBDE DB 0CBH,3*8+M+0C0H 0A10 C9 RET KEYOFF TURNOFF DIP3,3 ; KEYBOARD LOCK OFF 0A11+212741 LXI H,DIP3 0A14+CB9E DB 0CBH,3*8+M+80H 0A16 C9 RET WRAPON TURNON DIP2,7 ; WRAPAROUND MODE 0A17+212641 LXI H,DIP2 0A1A+CBFE DB 0CBH,7*8+M+0C0H 0A1C C9 RET WRAPOFF TURNOFF DIP2,7 0A1D+212641 LXI H,DIP2 0A20+CBBE DB 0CBH,7*8+M+80H 0A22 C9 RET ALFON TURNON DIP1,7 ; AUTO LINE-FEED 0A23+212541 LXI H,DIP1 0A26+CBFE DB 0CBH,7*8+M+0C0H 0A28 C9 RET ALFOFF TURNOFF DIP1,7 0A29+212541 LXI H,DIP1 0A2C+CBBE DB 0CBH,7*8+M+80H 0A2E C9 RET ACRON TURNON DIP3,0 ; AUTO CARRIAGE-RETURN 0A2F+212741 LXI H,DIP3 0A32+CBC6 DB 0CBH,0*8+M+0C0H 0A34 C9 RET ACROFF TURNOFF DIP3,0 CP/M MACRO ASSEM 2.0 #052 Terminal Driver Software 0A35+212741 LXI H,DIP3 0A38+CB86 DB 0CBH,0*8+M+80H 0A3A C9 RET BELON TURNON DIP4,2 ; BELL ENABLE 0A3B+212841 LXI H,DIP4 0A3E+CBD6 DB 0CBH,2*8+M+0C0H 0A40 C9 RET BELOFF TURNOFF DIP4,2 0A41+212841 LXI H,DIP4 0A44+CB96 DB 0CBH,2*8+M+80H 0A46 C9 RET ALTON TURNON MODCOPY,3 ; ALTERNATE CHR FONT 0A47+212941 LXI H,MODCOPY 0A4A+CBDE DB 0CBH,3*8+M+0C0H 0A4C 3A2941 LDA MODCOPY 0A4F D304 OUT MODCTL 0A51 C9 RET ALTOFF TURNOFF MODCOPY,3 0A52+212941 LXI H,MODCOPY 0A55+CB9E DB 0CBH,3*8+M+80H 0A57 3A2941 LDA MODCOPY 0A5A D304 OUT MODCTL 0A5C C9 RET BLNKON TURNON DIP3,1 ; BLINKING CURSOR 0A5D+212741 LXI H,DIP3 0A60+CBCE DB 0CBH,1*8+M+0C0H 0A62 C34A02 JMP CURSMOD BLNKOFF TURNOFF DIP3,1 0A65+212741 LXI H,DIP3 0A68+CB8E DB 0CBH,1*8+M+80H 0A6A C34A02 JMP CURSMOD BLKON TURNON DIP4,1 ; BLOCK MODE CURSOR 0A6D+212841 LXI H,DIP4 0A70+CBCE DB 0CBH,1*8+M+0C0H 0A72 C34A02 JMP CURSMOD BLKOFF TURNOFF DIP4,1 0A75+212841 LXI H,DIP4 0A78+CB8E DB 0CBH,1*8+M+80H 0A7A C34A02 JMP CURSMOD CURSON TURNON DIP3,4 ; CURSOR ENABLE 0A7D+212741 LXI H,DIP3 0A80+CBE6 DB 0CBH,4*8+M+0C0H 0A82 C34A02 JMP CURSMOD CURSOFF TURNOFF DIP3,4 0A85+212741 LXI H,DIP3 0A88+CBA6 DB 0CBH,4*8+M+80H 0A8A C34A02 JMP CURSMOD 0A8D 212741 CURSTOG LXI H,DIP3 ; TOGGLE CURSOR ENABLE 0A90 3E10 MVI A,00010000B 0A92 AE XRA M 0A93 77 MOV M,A 0A94 C34A02 JMP CURSMOD 0A97 CDDE05 STATON CALL CLRSTAT ; STATUS LINE ENABLE TURNON DIP4,0 CP/M MACRO ASSEM 2.0 #053 Terminal Driver Software 0A9A+212841 LXI H,DIP4 0A9D+CBC6 DB 0CBH,0*8+M+0C0H 0A9F C32E02 JMP STATMOD STATOFF TURNOFF DIP4,0 0AA2+212841 LXI H,DIP4 0AA5+CB86 DB 0CBH,0*8+M+80H 0AA7 C32E02 JMP STATMOD ; TEST ROUTINES: ; PRINT ALL CHARACTERS ; NOTE: THE ONLY WAY TO EXIT THIS MODE IS TO RESET THE TERMINAL 0AAA CD170A TSTPRT CALL WRAPON ; TURN ON WRAPAROUND 0AAD CD1A05 TSTPRT1 CALL FETCHRX 0AB0 CDAD07 CALL WRITE 0AB3 CDD107 CALL CINC JR TSTPRT1 0AB6+18 DB 18H 0AB7+F5 DB TSTPRT1-$-1 ; FILL SCREEN WITH GARBAGE 0AB8 2100C0 TSTFILL LXI H,SCREEN 0ABB 010020 LXI B,8192 0ABE 75 TSTF1 MOV M,L 0ABF 0B DCX B 0AC0 23 INX H 0AC1 78 MOV A,B 0AC2 B1 ORA C JRNZ TSTF1 0AC3+20 DB 20H 0AC4+F9 DB TSTF1-$-1 0AC5 C9 RET ; FILL SCREEN WITH CHARACTER 0AC6 CD1A05 TSTFILC CALL FETCHRX 0AC9 5F MOV E,A 0ACA 2100C0 LXI H,SCREEN 0ACD 010020 LXI B,8192 0AD0 73 TSTFC1 MOV M,E 0AD1 23 INX H 0AD2 0B DCX B 0AD3 78 MOV A,B 0AD4 B1 ORA C JRNZ TSTFC1 0AD5+20 DB 20H 0AD6+F9 DB TSTFC1-$-1 0AD7 C9 RET ; TSTCRTC: SEND DATA TO THE CRT CONTROLLER ; ESC T 4 AA DD ; WHERE AA IS THE PORT ADDRESS IN THE CRTC (HEX) ; DD IS THE DATA TO SEND THE CRTC (HEX) ; IF AA=11H THEN SET LPS ; IF AA=12H THEN SET CPL ; 0AD8 CD0C0B TSTCRTC CALL HEXBYTE ; GET A BYTE (ADDRESS) 0ADB F5 PUSH PSW CP/M MACRO ASSEM 2.0 #054 Terminal Driver Software 0ADC CD0C0B CALL HEXBYTE ; GET A BYTE (DATA) 0ADF 47 MOV B,A ; SAVE DATA 0AE0 F1 POP PSW ; GET ADDR 0AE1 FE11 CPI 17 JRZ SETLPS 0AE3+28 DB 28H 0AE4+0F DB SETLPS-$-1 JRNC SETCPL 0AE5+30 DB 30H 0AE6+06 DB SETCPL-$-1 0AE7 D308 OUT CRTADDR 0AE9 78 MOV A,B 0AEA D309 OUT CRTDATA 0AEC C9 RET 0AED 78 SETCPL MOV A,B 0AEE 321F41 STA CPL 0AF1 C3F80A JMP SETSIZ 0AF4 78 SETLPS MOV A,B 0AF5 322041 STA LPS ; SET SCREEN SIZE: SCRSIZ := CPL*LPS 0AF8 3A1F41 SETSIZ LDA CPL 0AFB 47 MOV B,A LDED LPS 0AFC+ED5B DB 0EDH,5BH 0AFE+2041 DW LPS 0B00 1600 MVI D,0 0B02 210000 LXI H,0 0B05 19 MULTLP DAD D DJNZ MULTLP 0B06+10 DB 10H 0B07+FD DB MULTLP-$-1 0B08 221C41 SHLD SCRSIZ 0B0B C9 RET ; HEXBYTE: GET A BYTE & RETURN IN A 0B0C CD1D0B HEXBYTE CALL HEXNIB 0B0F 07 RLC 0B10 07 RLC 0B11 07 RLC 0B12 07 RLC 0B13 E6F0 ANI 11110000B 0B15 4F MOV C,A 0B16 C5 PUSH B 0B17 CD1D0B CALL HEXNIB 0B1A C1 POP B 0B1B B1 ORA C 0B1C C9 RET ; HEXNIB: GET A NIBBLE IN HEX ; 0000 = '0' ; 0001 = '1' CP/M MACRO ASSEM 2.0 #055 Terminal Driver Software ; ... ; 1001 = '9' ; 1010 = ':' ; 1011 = ';' ; 1100 = '<' ; 1101 = '=' ; 1110 = '>' ; 1111 = '?' 0B1D CD1A05 HEXNIB CALL FETCHRX 0B20 E60F ANI 0FH 0B22 C9 RET PAGE CP/M MACRO ASSEM 2.0 #056 Terminal Driver Software ; ********************************* ; * * ; * MISC * ; * * ; ********************************* ; RING BELL 0B23 3A2841 RING LDA DIP4 BIT 2,A 0B26+CB57 DB 0CBH,2*8+A+40H 0B28 C8 RZ ; BELL DISABLED 0B29 D338 OUT BELL 0B2B C9 RET ; DING BELL (SHORT DURATION) 0B2C 3A2841 DING LDA DIP4 BIT 2,A 0B2F+CB57 DB 0CBH,2*8+A+40H 0B31 C8 RZ ; BELL OFF 0B32 D330 OUT BEEP 0B34 C9 RET PAGE CP/M MACRO ASSEM 2.0 #057 Terminal Driver Software ; ********************************* ; * * ; * RAM BUFFERS * ; * * ; ********************************* 4000 ORG RAM ; BUFFERS 4000 RXFIFO DS 256 ; 256 BYTE FIFO FOR RECEIVE 4100 TXFIFO DS 16 ; 16 BYTE FIFO FOR TRANSMIT 0004 = TXFSIZ EQU 4 ; 2**4 BYTES ; POINTERS, ETC 4110 = RAMBUFF EQU $ ; START OF FLAGS AND BUFFERS, ETC 4110 RXINP DS 2 ; POINTS TO RXFIFO STORE LOCATION 4112 RXOUT DS 2 ; POINTS TO RXFIFO FETCH LOCATION 4114 TXINP DS 2 ; POINTS TO TXFIFO STORE LOCATION 4116 TXOUT DS 2 ; POINTS TO TXFIFO FETCH LOCATION 4118 CURSOR DS 2 ; ABSOLUTE CURSOR POSITION IN MEMORY 411A HOME DS 2 ; ABSOLUTE POSITION OF FIRST CHR ON SCREEN 411C SCRSIZ DS 2 ; SCREEN SIZE 411E VSYN DS 1 ; VERTICAL SYNC POSITION FOR STATUS LINE ENA 411F CPL DS 1 ; NUMBER OF COLUMNS PER LINE 4120 LPS DS 1 ; NUMBER OF LINES PER SCREEN 4121 COLUMN DS 1 ; CURRENT COLUMN 4122 LINE DS 1 ; CURRENT LINE 4123 STOC DS 1 ; SAVED COLUMN 4124 STOL DS 1 ; SAVED LINE ; DIP1 AND DIP2 ARE RAM COPIES OF THE DIP SWITCH POSITIONS AT POWER UP. 4125 DIP1 DS 1 ; BIT INIT FUNCTION ; 0123 BUAD RATE ; 45 PARITY ; 6 X-CTL OR HARDWARE ; 7 AUTO-LF 4126 DIP2 DS 1 ; 012 SCREEN FORMAT ; 34 EMULATION MODE ; 5 LOCAL ; 6 LOCAL COPY ; 7 WRAP AROUND ; NOTE: DIP 3 AND 4 ARE HYPOTHETICAL ONLY. (JUST USED AS SOFTWARE FLAGS) 4127 DIP3 DS 1 ; VARIOUS FLAGS ; 0 0 AUTO-CR CP/M MACRO ASSEM 2.0 #058 Terminal Driver Software ; 1 1 CURSOR BLINK ; 2 0 GRAPHICS ; 3 0 KEYBOARD LOCK ; 4 1 CURSOR ENABLED ; 5 0 X-OFF SENT ; 6 0 INSERT MODE ; 7 0 INVERSE VIDEO 0012 = INIT3 EQU 00010010B ; INITIAL VALUE FOR DIP3 4128 DIP4 DS 1 ; MORE FLAGS ; 0 0 STATUS LINE ENABLED ; 1 1 BLOCK CURSOR ; 2 1 BELL ENABLE 0006 = INIT4 EQU 110B ; INITIAL VALUE FOR DIP4 4129 MODCOPY DS 1 ; DATA SENT TO UART OUTPUT PORT 0001 = INITMOD EQU 0001B ; INITIAL DATA SENT TO MODEM CONTROL PORT ; 0 1 DTR ; 1 0 RTS ; 2 0 LED ; 3 0 CHRGEN (SELECT FONT) ;KEYBOARD BUFFER AND FLAG: 412A KFLAG DS 1 ; ZERO ==> EMPTY 412B KBUFF DS 1 ; KEYBOARD CHARACTER 001C = BUFFSIZ EQU $-RAMBUFF ; STACK SPACE: 02D4 = STKSIZE EQU RAM+RAMLEN-$ 412C DS STKSIZE 4400 = STACK EQU $ 4400 END CP/M MACRO ASSEM 2.0 #059 Terminal Driver Software 0A35 ACROFF 0A2F ACRON 0A29 ALFOFF 0A23 ALFON 0A52 ALTOFF 0A47 ALTON 013D BAUDTAB 0000 BC 0030 BEEP 0038 BELL 0007 BEL 0A41 BELOFF 0A3B BELON 0A75 BLKOFF 0A6D BLKON 0A65 BLNKOFF 0A5D BLNKON 0008 BS 001C BUFFSIZ 08EE CADDR 07FA CCR 0880 CCRLF 0886 CDEC 08AD CDOWN 0007 CEND 08CC CHOME 07D1 CINC 07E8 CINCELS 0009 CLADDS 0009 CLADM 0003 CLBEE 0886 CLEFT 081B CLF 083E CLFE 0003 CLHEATH 05EA CLRS1 05DE CLRSTAT 4121 COLUMN 02DB CONTROL 411F CPL 000D CR 094A CREAD 092F CREP 08E7 CRESTO 0899 CRIGHT 084E CRLF 086E CRLFELS 019D CRT1 0008 CRTADDR 0170 CRTCMOD 0009 CRTDATA 01AE CRTTABL 08DA CSAV 0000 CSTART 08B9 CTAB 041B CTADDS 03A9 CTADM 03C4 CTBEE 032B CTHEATH 02FB CTLTAB 08A5 CUP 0266 CURSBLK 025B CURSMEN 024A CURSMOD 0A85 CURSOFF 0A7D CURSON 4118 CURSOR 0A8D CURSTOG 0002 DE 007F DEL 07A6 DELC0 0789 DELCHR 0769 DELL0 0728 DELLINE 0B2C DING 4125 DIP1 4126 DIP2 4127 DIP3 4128 DIP4 05F0 DUMPST 064D EBEGIN 0663 EEND 0013 ELADDS 0027 ELADM 001A ELBEE 067D ELEFT 0027 ELHEATH 0632 ELINE 1000 EPROM2 060E ERAS1 05F8 ERASE 0699 ERIGHT 001B ESC 0619 ESCREEN 02F1 ESCSEQ 030B ESCTAB 0436 ETADDS 0334 ETADM 03CD ETBEE 0334 ETHEATH 0000 FALSE 051A FETCHRX 059D FETCHTX 051D FRXAGN 054A FRXELS 054F FRXRET 09B3 GOAWAY 0951 GRAPHIC 0A05 GROFF 09FF GRON 0812 HCR 0B0C HEXBYTE 0B1D HEXNIB 0001 HIBAUD 06D7 HINSCHR 0004 HL 07F1 HLF 411A HOME 0009 HT 0012 INIT3 0006 INIT4 0001 INITMOD 06A9 INSCHR 0725 INSL0 06DF INSLINE 09ED INSOFF 09E7 INSON 0001 INTEN 0002 INTID 09F9 INVOFF 09F3 INVON 0004 IX 0004 IY 0010 KBD 412B KBUFF 048A KEYBD 04A8 KEYCVT 04BA KEYFINI 0A11 KEYOFF 0A0B KEYON 031B KEYTAB 0066 KEYVISR 412A KFLAG 0001 KLADDS 0001 KLADM 000A KLBEE 0008 KLHEATH 00C0 KTADDS 00AA KTADM 00AC KTBEE 009A KTHEATH 000A LF 0003 LINCTL 4122 LINE 0005 LINSTAT 0000 LOBAUD 4120 LPS 02C7 MAIN 4129 MODCOPY 0004 MODCTL 0006 MODSTAT 09D2 MODTOFF 0007 MODTOFL 09BD MODTON 0007 MODTONL 0000 MOTOROL 0B05 MULTLP 04CF NODING 0489 NOOP FFFF NORMAL 0486 NOROUTN 023D NOSTAT 0000 ORGN 05DA PAR 0096 PRETI 4000 RAM 4110 RAMBUFF 0400 RAMLEN 0000 RECEIVE 0000 RESET 0991 RESMODE 0B23 RING 015D RTSHI 0165 RTSLOW 0074 RTSNL 016A RTSO 0080 RTSW 4000 RXFIFO 4110 RXINP 008A RXINT 4112 RXOUT 0038 RXVISR C000 SCREEN 411C SCRSIZ 0454 SEARCH 0466 SELECT 04D9 SEND 04F2 SENDL 04E6 SENDNLC 011E SETBAUD 0971 SETBRG 0AED SETCPL 095A SETCRTC 0277 SETCURS 02B5 SETHNO 028A SETHOME 0AF4 SETLPS 0986 SETMODE 0AF8 SETSIZ 0904 SETXOK 08FC SETXY 0924 SETXY1 090B SETYOK 0554 SNDXOFF 0572 SNDXON 0020 SPACE 0455 SRCH1 045A SRCH2 0463 SRCH3 0517 SRX 4400 STACK 00C2 STARTUP 0018 STAT1 0020 STAT2 022E STATMOD 0AA2 STATOFF 0A97 STATON 02D4 STKSIZE 4123 STOC 4124 STOL 04F4 STORX 0590 STOTX 00CD STRTCLR 0565 SXHRD 056A SXLED 0588 SXNLED 0583 SXNRTS 0004 TESTLEN 099C TESTMOD 09A7 TESTTAB 05B0 TRANSMT FFFF TRUE 0AD8 TSTCRTC 0ABE TSTF1 0AD0 TSTFC1 0AC6 TSTFILC 0AB8 TSTFILL 0AAA TSTPRT 0AAD TSTPRT1 05A8 TXCHR 4100 TXFIFO 0004 TXFSIZ 4114 TXINP 4116 TXOUT 411E VSYN 0A1D WRAPOFF 0A17 WRAPON 07AD WRITE 07B0 WRITEHL 07CE WRNINS 07BF WRNOG 07C5 WRNOI 0000 XMIT 05DB XMOUT 05D0 XMPAR 0013 XOFF 0011 XON 0927 XYLINE0