* PROGRAM NAME: SUPPORT PACKAGE * AUTHOR: RICHARD CONN * DATE: 15 JAN 82 (W6BSK) * VERSION: 1.6 * PREVIOUS VERSIONS: 1.5 (26 JUN 81), 1.3 (18 APR 81), 1.4 (20 MAY 81) * 1.2 (21 MAR 81), 1.1 (04 MAR 81), 1.0 (01 JAN 81) 000F = VERS EQU 15 ; VERSION NUMBER * THE FOLLOWING EQUATE SHOULD BE CHANGED IF YOU HAVE A NON-STANDARD CP/M 0000 = CPM$BASE EQU 0 ; BASE ADDRESS OF CP/M SYSTEM 0005 = BDOS EQU CPM$BASE+5 0000 = FALSE EQU 0 ; DEFINE FALSE FFFF = TRUE EQU NOT FALSE * HOST PROGRAM SELECTION FFFF = TERM EQU TRUE 0000 = TERMBLS EQU FALSE 0000 = XTERM EQU FALSE 0000 = PHONECOM EQU FALSE 0000 = INTERSYS EQU FALSE 0000 = PRINT EQU FALSE * BASE ADDRESS SELECTION IF TERM 5100 = BASE EQU 5100H ENDIF IF TERMBLS BASE EQU 2100H ENDIF IF PRINT BASE EQU 0E00H ENDIF IF PHONECOM BASE EQU 1200H ENDIF IF INTERSYS BASE EQU 0600H ENDIF IF XTERM BASE EQU 1000H ENDIF FFFF = TI$REQUIRED EQU (TERM OR PHONECOM OR TERMBLS) ; TI REQUIRED FLAG 0000 = A1$REQUIRED EQU XTERM ; A1 REQUIRED FLAG I ************************************************************************* * * * **** SUPPORT PACKAGE **** * * * * SUPPORT.ASM, THE SUPPORT PACKAGE SOURCE FILE, IS A GROUP OF * * MACHINE-DEPENDENT SUBROUTINES WHICH IMPLEMENT A NUMBER OF FUNCTIONS * * BEYOND THOSE IMPLEMENTED IN THE CP/M BIOS. THE SUPPORT PACKAGE, * * HEREAFTER REFERRED TO AS SP, CONTAINS THE ROUTINES NECESSARY TO * * INTERFACE WITH SPECIFIC TYPES OF HARDWARE FOR SPECIAL APPLICATIONS * * WITH VARIOUS MAINLINE PROGRAMS. THE SP PROVIDES A MACHINE-INDEPEND- * * ENT INTERFACE WITH THESE MACHINE-DEPENDENT ROUTINES. * * LIKE THE CP/M BIOS, SP PROVIDES THIS INTERFACE VIA A JMP TABLE * * AT THE BEGINNING OF THE SP. THE ENTRIES IN THIS JMP TABLE ARE * * ORDERED AND PRECISELY DEFINED SO THAT ALL SP'S INTERFACE WITH THE * * CALLING MAINLINES IN EXACTLY THE SAME WAY REGARDLESS OF THE MACHINE- * * DEPENDENT HARDWARE CONTROLLED BY THE SP'S. * * BECAUSE OF THE EXTREME MACHINE-DEPENDENCY OF THE SP'S, A UNIQUE * * FEATURE OF THESE SP'S IS THE FIRST ROUTINE IN THE JMP TABLE. THIS * * ROUTINE PASSES BACK TO THE CALLER THREE BYTES (IN THE A, H, AND L * * REGISTERS) WHICH TELL HIM WHICH FUNCTIONAL AREAS OF THE JMP TABLE ARE * * OPERATIONAL AND WHICH ARE NOT. FOR EXAMPLE, THE STANDARD DEFINITION * * OF THE SP ALLOWS FOR TWO SETS OF MODEM SUPPORT ROUTINES, AND BITS 2 * * AND 3 OF THE A REGISTER RETURNED FROM THIS ROUTINE TELLS THE CALLER * * IF THE HARDWARE FOR THESE MODEMS IS AVAILABLE AND THESE ROUTINES ARE * * IMPLEMENTED. SAY, IF JUST MODEM 1 WAS IMPLEMENTED, THE A REGISTER * * WOULD CONTAIN THE FOLLOWING INFORMATION: * * * * --------------------------------- * * | X | X | X | X | 0 | 1 | X | X | X = DON'T CARE. * * --------------------------------- * * BIT NUMBER: 7 6 5 4 3 2 1 0 * * * * THE '1' IN BIT NUMBER 2 SAYS MODEM 1 IS ENABLED AND THE '0' IN BIT * * NUMBER 3 SAYS MODEM 2 IS NOT ENABLED. * * TO MAINTAIN CONSISTENCY OF INTERFACE, THE JMP TABLE ENTRIES * * FOR THE UNIMPLEMENTED ROUTINES ARE STILL PRESENT IN THE JMP TABLE, * * BUT THEY DO NOT DO ANYTHING OTHER THAN EXECUTE A RETURN TO THE CALLER * * WITH A 0 IN THE A REGISTER AND THE ZERO FLAG SET. * * * * THIS FILE IS A VERSION OF THE SUPPORT PACKAGE AS IMPLEMENTED * * WITH THE FOLLOWING FEATURES: * * 1. CRT SCREEN ROUTINES PROGRAMMED FOR THE VIO/C * * 2. TTY ROUTINES PROGRAMMED FOR THE TELETYPE MODEL 43 * * 3. MODEM 1 ROUTINES PROGRAMMED FOR THE DCHAYES * * 4. MODEM 2 ROUTINES PROGRAMMED FOR A SERIAL PORT * * 5. ALTERNATE DEVICE 1 PROGRAMMED FOR THE DJ/2D SERIAL * * PORT * * 6. ALTERNATE DEVICE 2 NOT IMPLEMENTED * * 7. ALTERNATE DEVICE 3 NOT IMPLEMENTED * * 8. TELEPHONE SYSTEM ROUTINES PROGRAMMED FOR THE * * DCHAYES S100 MICROMODEM BOARD. * * * ************************************************************************* * * **** SUPPORT PACKAGE JMP TABLE **** * 5100 ORG BASE ; BASE OF SUPPORT PACKAGE * ENTRY 0: STANDARD SUPPORT PACKAGE ROUTINES 5100 C3C351 JMP SP$STAT ; +000 SUPPORT PACKAGE STATUS ROUTINE 5103 C3E251 JMP SP$END ; +003 SUPPORT PACKAGE LAST ADDRESS ROUTINE * ENTRY POINT FOR NON-IMPLEMENTED ROUTINES 5106 C3E951 NI: JMP SP$ERR ; +006 SUPPORT PACKAGE ERROR ROUTINE * ENTRY POINT FOR FUNCTIONS REQUIRING CONSOLE OUTPUT THROUGH CP/M 5109 C3F751 COUT: JMP SP$COUT ; +009 SUPPORT PACKAGE CONSOLE OUTPUT ROUTINE 510C C31752 JMP SP$VERS ; +012 SUPPORT PACKAGE VERSION NUMBER * ENTRY 1: CRT SCREEN ROUTINES 510F C31A52 JMP CRT$INI ; +015 CRT INITIALIZATION 5112 C34052 JMP CRT$FGND ; +018 CRT TO FOREGROUND 5115 C35052 JMP CRT$BGND ; +021 CRT TO BACKGROUND 5118 C36052 JMP CRT$CLS ; +024 CLEAR SCREEN ROUTINE 511B C36C52 JMP CRT$GXY ; +027 GOTO XY ROUTINE * ENTRY 2: TTY ROUTINES 511E C38B52 JMP TT$INI ; +030 TTY INITIALIZATION 5121 C3B152 JMP TT$ISTAT ; +033 TTY INPUT STATUS 5124 C3B952 JMP TT$OSTAT ; +036 TTY OUTPUT STATUS 5127 C3C152 JMP TT$IN ; +039 TTY INPUT ROUTINE 512A C3CA52 JMP TT$OUT ; +042 TTY OUTPUT ROUTINE * ENTRY 3: MODEM 1 ROUTINES IF TI$REQUIRED ; IF M1 REQUIRED, THEN ... 512D C3D552 JMP M1$INI ; +045 MODEM 1 INITIALIZATION 5130 C37253 JMP M1$ISTAT ; +048 MODEM 1 INPUT STATUS 5133 C37A53 JMP M1$OSTAT ; +051 MODEM 1 OUTPUT STATUS 5136 C38253 JMP M1$IN ; +054 MODEM 1 INPUT ROUTINE 5139 C38B53 JMP M1$OUT ; +057 MODEM 1 OUTPUT ROUTINE 513C C39653 JMP M1$BREAK ; +060 MODEM 1 BREAK ROUTINE ENDIF IF NOT TI$REQUIRED ; ELSE ... JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI ENDIF * ENTRY 4: MODEM 2 ROUTINES 513F C3B853 JMP M2$INI ; +063 MODEM 2 INITIALIZATION 5142 C3E253 JMP M2$ISTAT ; +066 MODEM 2 INPUT STATUS 5145 C3EA53 JMP M2$OSTAT ; +069 MODEM 2 OUTPUT STATUS 5148 C3F253 JMP M2$IN ; +072 MODEM 2 INPUT 514B C3FB53 JMP M2$OUT ; +075 MODEM 2 OUTPUT 514E C30654 JMP M2$BREAK ; +078 MODEM 2 BREAK * ENTRY 5: ALTERNATE 1 ROUTINES IF A1$REQUIRED ; IF ALTERNATE 1 IS REQUIRED, THEN ... JMP A1$INI ; +081 ALTERNATE 1 INIT JMP A1$ISTAT ; +084 ALTERNATE 1 INPUT STATUS JMP A1$OSTAT ; +087 ALTERNATE 1 OUTPUT STATUS JMP A1$IN ; +090 ALTERNATE 1 INPUT JMP A1$OUT ; +093 ALTERNATE 1 OUTPUT ENDIF IF NOT A1$REQUIRED ; ELSE ... 5151 C30651 JMP NI 5154 C30651 JMP NI 5157 C30651 JMP NI 515A C30651 JMP NI 515D C30651 JMP NI ENDIF * ENTRY 6: ALTERNATE 2 ROUTINES 5160 C30651 JMP NI ; +096 5163 C30651 JMP NI ; +099 5166 C30651 JMP NI ; +102 5169 C30651 JMP NI ; +105 516C C30651 JMP NI ; +108 * ENTRY 7: ALTERNATE 3 ROUTINES 516F C30651 JMP NI ; +111 5172 C30651 JMP NI ; +114 5175 C30651 JMP NI ; +117 5178 C30651 JMP NI ; +120 517B C30651 JMP NI ; +123 * ENTRY 8: TELEPHONE SYSTEM INTERFACE ROUTINES IF TI$REQUIRED ; IF TELEPHONE INTEFACE IS REQUIRED, THEN ... 517E C33E54 JMP TI$INI ; +126 INITIALIZATION 5181 C37854 JMP TI$ORG ; +129 SET ORIGINATE MODE 5184 C38A54 JMP TI$ANS ; +132 SET ANSWER MODE 5187 C3AD54 JMP TI$PICK ; +135 PICK UP PHONE 518A C3B454 JMP TI$HANG ; +138 HANG UP PHONE 518D C3C454 JMP TI$WDT ; +141 WAIT UP TO 15 SECS FOR DIAL TONE 5190 C3D054 JMP TI$WANS ; +144 WAIT UP TO 15 SECS FOR ANSWER 5193 C3D654 JMP TI$RST ; +147 RING STATUS DETECT 5196 C3E354 JMP TI$DST ; +150 DIAL TONE STATUS DETECT 5199 C3EC54 JMP TI$CST ; +153 CARRIER STATUS DETECT 519C C3F554 JMP TI$DSTRT ; +156 START DIALING 519F C30055 JMP TI$DSTOP ; +159 STOP DIALING 51A2 C32355 JMP TI$DIGIT ; +162 DIAL DIGIT 51A5 C35E55 JMP T100MS ; +165 0.1 SEC DELAY ROUTINE 51A8 C37F54 JMP TI$PREPANS ; +168 PREPARE FOR ANSWERING PHONE ENDIF IF NOT TI$REQUIRED ; ELSE ... JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI JMP NI ENDIF * * STATUS TABLE -- THIS TABLE CONTAINS THE RETURN STATUS INFO * USER CUSTOMIZED! * STABLE: * A REG 51AB 01 DB 0000$0001B ; ENABLE CRT 51AC 02 DB 0000$0010B ; ENABLE TTY IF TI$REQUIRED ; ENABLE MODEM 1 IF REQUIRED 51AD 04 DB 0000$0100B ; ENABLE MODEM 1 ENDIF IF NOT TI$REQUIRED DB 0000$0000B ; DISABLE MODEM 1 ENDIF 51AE 08 DB 0000$1000B ; ENABLE MODEM 2 IF A1$REQUIRED ; ENABLE ALTERNATE 1 IF REQUIRED DB 0001$0000B ; ENABLE ALTERNATE 1 ENDIF IF NOT A1$REQUIRED 51AF 00 DB 0000$0000B ; DISABLE ALTERNATE 1 ENDIF 51B0 00 DB 0000$0000B ; DISABLE ALTERNATE 2 51B1 00 DB 0000$0000B ; DISABLE ALTERNATE 3 IF TI$REQUIRED ; ENABLE TELEPHONE INTERFACE IF REQUIRED 51B2 80 DB 1000$0000B ; ENABLE TELEPHONE SYSTEM INTERFACE ENDIF IF NOT TI$REQUIRED DB 0000$0000B ; DISABLE TELEPHONE SYSTEM INTERFACE ENDIF * H REG 51B3 00 DB 0000$0000B ; NI 51B4 00 DB 0000$0000B 51B5 00 DB 0000$0000B 51B6 00 DB 0000$0000B 51B7 00 DB 0000$0000B 51B8 00 DB 0000$0000B 51B9 00 DB 0000$0000B 51BA 00 DB 0000$0000B * L REG 51BB 00 DB 0000$0000B ; NI 51BC 00 DB 0000$0000B 51BD 00 DB 0000$0000B 51BE 00 DB 0000$0000B 51BF 00 DB 0000$0000B 51C0 00 DB 0000$0000B 51C1 00 DB 0000$0000B 51C2 00 DB 0000$0000B * * **** END OF SUPPORT PACKAGE JMP TABLE **** * I * * STANDARD SUPPORT PACKAGE ROUTINES * * * STATUS ROUTINE * THIS ROUTINE RETURNS THE STATUS OF THE LOGICAL SECTIONS OF THE SP * IN THE A REGISTER AND THE HL REGISTER PAIR * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A, H, L = STATUS BYTES (RESP) * SP$STAT: 51C3 C5 PUSH B ; SAVE BC 51C4 21AB51 LXI H,STABLE ; STATUS TABLE 51C7 CDD851 CALL STAT ; LOAD 8 BITS INTO A 51CA F5 PUSH PSW ; SAVE A 51CB CDD851 CALL STAT ; LOAD 8 BITS INTO A 51CE F5 PUSH PSW ; SAVE A 51CF CDD851 CALL STAT ; LOAD 8 BITS INTO A 51D2 6F MOV L,A ; L ENTRY 51D3 F1 POP PSW ; GET A 51D4 67 MOV H,A ; H ENTRY 51D5 F1 POP PSW ; A ENTRY 51D6 C1 POP B ; RESTORE BC 51D7 C9 RET STAT: 51D8 0608 MVI B,8 ; 8 BITS 51DA AF XRA A ; A=0 STATL: 51DB B6 ORA M ; MASK IN STATUS BIT 51DC 23 INX H ; PT TO NEXT BYTE 51DD 05 DCR B ; COUNT DOWN 51DE C2DB51 JNZ STATL ; CONTINUE IF NOT DONE 51E1 C9 RET * * END ROUTINE * THIS ROUTINE RETURNS THE END ADDRESS OF THE SUPPORT PACKAGE IN HL; * THIS ADDRESS IS THE ADDRESS OF THE PAGE IMMEDIATELY FOLLOWING THE SUPPORT * PACKAGE * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: HL = ADDRESS OF NEXT PAGE AFTER SUPPORT PACKAGE * SP$END: 51E2 210057 LXI H,ENDALL ; GET ADDRESS OF LAST BYTE IN PACKAGE 51E5 2E00 MVI L,0 ; ROUND TO NEXT PAGE BOUNDARY 51E7 24 INR H 51E8 C9 RET * * ERROR ROUTINE AND RETURN FOR NON-IMPLEMENTED ROUTINES * THIS ROUTINE ZEROES THE A REG AND SETS THE ZERO FLAG TO INDICATE NOT * IMPLEMENTED OR ERROR * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 AND ZERO FLAG IS SET * SP$ERR: 51E9 AF XRA A ; A=0 AND ZERO FLAG SET 51EA C9 RET * * CONSOLE INPUT ROUTINE * THIS ROUTINE INPUTS A CHAR IN THE A REGISTER FROM THE CP/M CONSOLE * DEVICE; ONLY PSW AFFECTED * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=CHAR * SP$CIN: 51EB E5 PUSH H ; SAVE ALL REGS 51EC D5 PUSH D 51ED C5 PUSH B 51EE 0E01 MVI C,1 ; CON: INPUT 51F0 CD0500 CALL BDOS ; CALL BDOS 51F3 C1 POP B ; RESTORE ALL REGS 51F4 D1 POP D 51F5 E1 POP H 51F6 C9 RET * * CONSOLE OUTPUT ROUTINE * THIS ROUTINE SENDS THE CHAR IN THE A REGISTER TO THE CP/M CONSOLE * DEVICE; NO REGISTERS ARE AFFECTED * INPUT PARAMETERS: A=CHARACTER TO OUTPUT * OUTPUT PARAMETERS: NONE * SP$COUT: 51F7 E5 PUSH H ; SAVE ALL REGS 51F8 D5 PUSH D 51F9 C5 PUSH B 51FA F5 PUSH PSW 51FB 0E02 MVI C,2 ; CON: OUTPUT 51FD 5F MOV E,A ; CHAR IN E 51FE CD0500 CALL BDOS ; CALL BDOS 5201 F1 POP PSW ; RESTORE ALL REGS 5202 C1 POP B 5203 D1 POP D 5204 E1 POP H 5205 C9 RET * * PRINT MESSAGE PTED TO BY RETURN ADDRESS; MESSAGE ENDS IN A ZERO * EXAMPLE OF USE: * CALL PRINT$MESSAGE * DB 'THIS IS A TEST',0DH,0AH,0 * [ REST OF CODE ] * NO REGISTERS ARE AFFECTED * PRINT$MESSAGE: 5206 E3 XTHL ; GET RET ADR AND SAVE HL 5207 F5 PUSH PSW ; SAVE PSW PM$LOOP: 5208 7E MOV A,M ; GET NEXT CHAR 5209 23 INX H ; PT TO NEXT CHAR 520A B7 ORA A ; 0=DONE 520B CA1452 JZ PM$DONE 520E CDF751 CALL SP$COUT ; PRINT CHAR 5211 C30852 JMP PM$LOOP PM$DONE: 5214 F1 POP PSW ; RESTORE PSW 5215 E3 XTHL ; PLACE RETURN ADDRESS AND RESTORE HL 5216 C9 RET * * SUPPORT PACKAGE VERSION NUMBER * RETURN THE VERSION NUMBER OF THE SUPPORT PACKAGE IN THE A REG * NO OTHER REGISTERS ARE AFFECTED * SP$VERS: 5217 3E0F MVI A,VERS ; GET VERSION NUMBER 5219 C9 RET * * END OF STANDARD SUPPORT PACKAGE ROUTINES * I * * ENTRY 1: CRT SCREEN ROUTINES * ... AS IMPLEMENTED FOR IMSAI VIO/C BOARD. * 0016 = SWVIDEO EQU 16H ;REVERSE VIDEO COMMAND. 001B = ESCAPE EQU 1BH ;ESCAPE CHARACTER AND 003D = EQUALS EQU 3DH ;EQUAL VALUE FOR VIO/C. * * CRT INITIALIZATION * FUNCTION: TO INITIALIZE THE CRT * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * CRT$INI: 521A F5 PUSH PSW ; SAVE A 521B CD00F8 CALL 0F800H ; INITIALIZE SYSTEM 521E F1 POP PSW ; RESTORE A 521F CD0652 CALL PRINT$MESSAGE 5222 0D0A2A2A20 DB 0DH,0AH,'** VIO/C initialized- **',0DH,0AH,0 523F C9 RET * * CRT FOREGROUND * FUNCTION: TO SET THE CRT TO FOREGROUND INTENSITY * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * CRT$FGND: 5240 F5 PUSH PSW ; SAVE A 5241 3E1B MVI A,ESCAPE 5243 CD0951 CALL COUT 5246 3E16 MVI A,SWVIDEO ; SET FOREGROUND 5248 CD0951 CALL COUT 524B CD6B52 CALL CRT$PAUSE ; DELAY 524E F1 POP PSW 524F C9 RET * * CRT BACKGROUND * FUNCTION: TO SET THE CRT TO BACKGROUND INTENSITY * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * CRT$BGND: 5250 F5 PUSH PSW ; SAVE A 5251 3E1B MVI A,ESCAPE ; SET BACKGROUND 5253 CD0951 CALL COUT 5256 3E16 MVI A,SWVIDEO 5258 CD0951 CALL COUT 525B CD6B52 CALL CRT$PAUSE ; DELAY 525E F1 POP PSW 525F C9 RET * * CRT CLEAR SCREEN ROUTINE * FUNCTION: TO CLEAR THE CRT SCREEN * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * CRT$CLS: 5260 F5 PUSH PSW ; SAVE A 5261 3E1A MVI A,1AH ; CLEAR SCREEN 5263 CD0951 CALL COUT 5266 CD6B52 CALL CRT$PAUSE 5269 F1 POP PSW 526A C9 RET * PAUSE FOR CRT RESPONSE CRT$PAUSE: 526B C9 RET * * CRT GOTOXY ROUTINE : MODIFIED FOR VIO/C * FUNCTION: POSITION CURSOR AT XY COORDINATE ON CRT SCREEN * INPUT PARAMETERS: H=ROW NUMBER (1-24), L=COLUMN NUMBER (1-80); * H,L = 20 IS UPPER LEFT, BUT INPUT IS (1,1). * ALSO NOTE ROW AND COLUMNS MUST BE INTERCHANGED. * OUTPUT PARAMETERS: NONE * CRT$GXY: 526C E5 PUSH H ; SAVE REGS 526D F5 PUSH PSW 526E C5 PUSH B 526F 012020 LXI B,2020H 5272 09 DAD B ; CONVERT TO VIO/C 5273 3E1B MVI A,ESCAPE ; CURSOR POSITIONING 5275 CD0951 CALL COUT 5278 3E3D MVI A,EQUALS 527A CD0951 CALL COUT 527D 7D MOV A,L ; COLUMN 527E CD0951 CALL COUT 5281 7C MOV A,H ; ROW 5282 C61F ADI ' '-1 ; ADJUST TO 0-23 5284 CD0951 CALL COUT 5287 C1 POP B 5288 F1 POP PSW ; RESTORE REGS 5289 E1 POP H 528A C9 RET * * END OF CRT SCREEN ROUTINES * * * ENTRY 2: TTY ROUTINES * 00EA = TTY$STAT EQU 0EAH ; TTY STATUS PORT 00EB = TTY$DATA EQU 0EBH ; TTY DATA PORT 0002 = TTY$TRE EQU 2 ; TRE BIT 0001 = TTY$RRF EQU 1 ; RRF BIT * * TTY INITIALIZATION * FUNCTION: TO INITIALIZE THE TTY PORT * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * TT$INI: 528B 3E03 MVI A,3 ; RESET UART 528D D3EA OUT TTY$STAT 528F 3E05 MVI A,5 ; 7 DATA, ODD PARITY, 2 STOP 5291 D3EA OUT TTY$STAT 5293 CD0652 CALL PRINT$MESSAGE 5296 0D0A2A2A20 DB 0DH,0AH,'** TTY Initialized **',0DH,0AH,0 52B0 C9 RET * * TTY STATUS * FUNCTION: TO RETURN BYTE READY (RRF) STATUS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO BYTE, A=0FFH IF BYTE READY * TT$ISTAT: 52B1 DBEA IN TTY$STAT ; GET STATUS BYTE 52B3 E601 ANI TTY$RRF ; DATA AVAILABLE? 52B5 C8 RZ ; ZERO IF NO DATA 52B6 3EFF MVI A,0FFH ; LOAD WITH FF 52B8 C9 RET * * TTY OUTPUT STATUS * FUNCTION: TO RETURN BUFFER EMPTY (TRE) STATUS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF BUFFER FULL, A=0FFH IF BUFFER EMPTY (TRE) * TT$OSTAT: 52B9 DBEA IN TTY$STAT ; GET STATUS BYTE 52BB E602 ANI TTY$TRE ; BUFFER EMPTY? 52BD C8 RZ ; ZERO IF NOT EMPTY 52BE 3EFF MVI A,0FFH ; LOAD WITH FF 52C0 C9 RET * * TTY INPUT * FUNCTION: TO RETURN A BYTE IN THE A REG FROM THE TTY * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=BYTE (MSB NOT CLEARED) * TT$IN: 52C1 CDB152 CALL TT$ISTAT ; GET STATUS 52C4 CAC152 JZ TT$IN ; CONTINUE UNTIL DATA AVAILABLE 52C7 DBEB IN TTY$DATA ; GET CHAR 52C9 C9 RET * * TTY OUTPUT * FUNCTION: TO OUTPUT THE BYTE IN THE A REG TO THE TTY * INPUT PARAMETERS: A=BYTE * OUTPUT PARAMETERS: NONE * TT$OUT: 52CA F5 PUSH PSW ; SAVE BYTE TT$OUT$LOOP: 52CB CDB952 CALL TT$OSTAT ; CHECK OUTPUT STATUS 52CE CACB52 JZ TT$OUT$LOOP ; WAIT UNTIL EMPTY 52D1 F1 POP PSW ; GET BYTE 52D2 D3EB OUT TTY$DATA ; OUTPUT IT 52D4 C9 RET * * END OF TTY ROUTINE I * * ENTRY 3: MODEM 1 ROUTINES * * MODIFIED FOR DCHAYES S100 MODEM * * ENABLE MODEM 1 IF TI REQUIRED IF TI$REQUIRED ; IF REQUIRED, THEN ... 0080 = DCHS$DATA EQU 080H ; DCHS DATA PORT 0081 = DCHS$STAT EQU 081H ; DCHS STATUS PORT 0082 = DCHS$CTRL EQU 082H ; DCHS CONTROL PORT 0002 = DCHS$TRE EQU 2 ; TRANSMITTER REGISTER EMPTY 0001 = DCHS$RRF EQU 1 ; RECEIVE REGISTER FULL * * MODEM 1 INITIALIZATION * FUNCTION: TO INITIALIZE THE MODEM PORT FOR MODEM 1 * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * M1$INI: 52D5 F5 PUSH PSW 52D6 C5 PUSH B 52D7 CD0652 CALL PRINT$MESSAGE 52DA 0D0A4D6F64 DB 0DH,0AH,'Modem 1 and Telephone Interface Baud Rate Selection' 530F 0D0A202020 DB 0DH,0AH,' Select Baud Rate: 1=300 Baud, 2=110 Baud' 533D 0D0A202020 DB 0DH,0AH,' Selection (1/2/=1)? ',0 535D CDEB51 CALL SP$CIN ; GET RESPONSE 5360 FE32 CPI '2' ; 110 BAUD? 5362 CA6853 JZ TI$INI$B110 5365 3E34 MVI A,B300 ; SELECT 300 BAUD 5367 01 DB 1 ; LXI B,XXXX INSTR TO COVER FOLLOWING MVI A,B600 TI$INI$B110: 5368 3E8E MVI A,B110 ; SELECT 110 BAUD 536A 320854 STA BAUD 536D C1 POP B 536E F1 POP PSW 536F C33E54 JMP TI$INI ; INITIALIZE TELEPHONE INTERFACE * * MODEM 1 INPUT STATUS * FUNCTION: TO RETURN BYTE READY (RRF) STATUS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO BYTE, A=0FFH IF BYTE READY * M1$ISTAT: 5372 DB81 IN DCHS$STAT ; GET STATUS BYTE 5374 E601 ANI DCHS$RRF ; DATA AVAILABLE? 5376 C8 RZ ; ZERO IF NO DATA 5377 3EFF MVI A,0FFH ; LOAD WITH FF 5379 C9 RET * * MODEM 1 OUTPUT STATUS * FUNCTION: TO RETURN BUFFER EMPTY (TRE) STATUS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF BUFFER FULL, A=0FFH IF BUFFER EMPTY * M1$OSTAT: 537A DB81 IN DCHS$STAT ; GET STATUS BYTE 537C E602 ANI DCHS$TRE ; BUFFER EMPTY? 537E C8 RZ ; ZERO IF FULL 537F 3EFF MVI A,0FFH ; LOAD WITH FF 5381 C9 RET * * MODEM 1 INPUT * FUNCTION: TO RETURN A BYTE IN THE A REG FROM THE MODEM * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=BYTE (MSB NOT CLEARED) * M1$IN: 5382 CD7253 CALL M1$ISTAT ; GET STATUS 5385 CA8253 JZ M1$IN ; CONTINUE UNTIL DATA AVAILABLE 5388 DB80 IN DCHS$DATA ; GET BYTE 538A C9 RET * * MODEM 1 OUTPUT * FUNCTION: TO OUTPUT THE BYTE IN THE A REG TO THE MODEM * INPUT PARAMETERS: A=BYTE * OUTPUT PARAMETERS: NONE * M1$OUT: 538B F5 PUSH PSW ; SAVE BYTE M1$OUT$LOOP: 538C CD7A53 CALL M1$OSTAT ; GET STATUS 538F CA8C53 JZ M1$OUT$LOOP ; WAIT UNTIL EMPTY 5392 F1 POP PSW ; GET BYTE 5393 D380 OUT DCHS$DATA ; OUTPUT IT 5395 C9 RET * * MODEM 1 BREAK * FUNCTION: TO RETURN THE STATUS OF THE BREAK FUNCTION FOR MODEM 1 * AND TO EXECUTE THE BREAK IF FUNCTION IS AVAILABLE * INPUT PARAMETERS: A=0 TO RETURN STATUS, A=0FFH TO BREAK * OUTPUT PARAMETERS: A=0 AND ZERO FLAG SET IF BREAK NOT SUPPORTED * M1$BREAK: 5396 B7 ORA A ; DETERMINE FUNCTION 5397 C29E53 JNZ M1$BR1 M1$BR0: 539A 3EFF MVI A,0FFH ; DECLARE BREAK SUPPORTED 539C B7 ORA A ; SET FLAGS 539D C9 RET M1$BR1: 539E 3E0F MVI A,0FH ; TRANSMIT BREAK 53A0 D382 OUT M1$CTRL$PORT 53A2 CD5E55 CALL T100MS ; DELAY 0.34 SEC 53A5 CD5E55 CALL T100MS 53A8 CD5E55 CALL T100MS 53AB CD5E55 CALL T100MS ; 0.4 SEC 53AE 3E07 MVI A,07H ; STOP BREAK 53B0 D382 OUT M1$CTRL$PORT 53B2 CD5E55 CALL T100MS 53B5 C39A53 JMP M1$BR0 ; INDICATE BREAK SUPPORTED ENDIF ; TI$REQUIRED * * END OF MODEM 1 ROUTINES * I * * ENTRY 4: MODEM 2 ROUTINES * 00E8 = M2$STAT EQU 0E8H ; MODEM 2 STATUS PORT 00E9 = M2$DATA EQU 0E9H ; MODEM 2 DATA PORT 0002 = M2$TRE EQU 2 ; TRE BIT 0001 = M2$RRF EQU 1 ; RRF BIT * * MODEM 2 INITIALIZATION * FUNCTION: TO INITIALIZE THE MODEM 2 PORT * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * M2$INI: 53B8 3E03 MVI A,3 ; RESET MODEM 53BA D3E8 OUT M2$STAT 53BC 3E11 MVI A,1$0001B ; 8 DATA BITS, NO PARITY, 2 STOP 53BE D3E8 OUT M2$STAT 53C0 CD0652 CALL PRINT$MESSAGE 53C3 0D0A2A2A20 DB 0DH,0AH,'** Modem 2 Initialized **',0DH,0AH,0 53E1 C9 RET * * MODEM 2 INPUT STATUS * FUNCTION: TO RETURN BYTE READY (RRF) STATUS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO BYTE, A=0FFH IF BYTE READY * M2$ISTAT: 53E2 DBE8 IN M2$STAT ; GET STATUS BYTE 53E4 E601 ANI M2$RRF ; DATA AVAILABLE? 53E6 C8 RZ ; ZERO IF NO DATA 53E7 3EFF MVI A,0FFH ; LOAD WITH FF 53E9 C9 RET * * MODEM 2 OUTPUT STATUS * FUNCTION: TO RETURN BUFFER EMPTY (TRE) STATUS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF BUFFER FULL, A=0FFH IF BUFFER EMPTY (TRE) * M2$OSTAT: 53EA DBE8 IN M2$STAT ; GET STATUS BYTE 53EC E602 ANI M2$TRE ; TRE? 53EE C8 RZ ; ZERO IF NOT EMPTY 53EF 3EFF MVI A,0FFH ; LOAD WITH FF 53F1 C9 RET * * MODEM 2 INPUT * FUNCTION: TO RETURN A BYTE IN THE A REG FROM MODEM 2 * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=BYTE (MSB NOT CLEARED) * M2$IN: 53F2 CDE253 CALL M2$ISTAT ; GET STATUS 53F5 CAF253 JZ M2$IN ; CONTINUE UNTIL DATA AVAILABLE 53F8 DBE9 IN M2$DATA ; GET CHAR 53FA C9 RET * * MODEM 2 OUTPUT * FUNCTION: TO OUTPUT THE BYTE IN THE A REG TO MODEM 2 * INPUT PARAMETERS: A=BYTE * OUTPUT PARAMETERS: NONE * M2$OUT: 53FB F5 PUSH PSW ; SAVE BYTE M2$OUT$LOOP: 53FC CDEA53 CALL M2$OSTAT ; CHECK OUTPUT STATUS 53FF CAFC53 JZ M2$OUT$LOOP ; WAIT UNTIL EMPTY 5402 F1 POP PSW ; GET BYTE 5403 D3E9 OUT M2$DATA ; OUTPUT IT 5405 C9 RET * * MODEM 2 BREAK * FUNCTION: TO RETURN THE STATUS OF THE BREAK FUNCTION FOR MODEM 1 * AND TO EXECUTE THE BREAK IF FUNCTION IS AVAILABLE * INPUT PARAMETERS: A=0 TO RETURN STATUS, A=0FFH TO BREAK * OUTPUT PARAMETERS: A=0 AND ZERO FLAG SET IF BREAK NOT SUPPORTED * M2$BREAK: 5406 AF XRA A ; NOT SUPPORTED 5407 C9 RET * * END OF MODEM 2 ROUTINES * I * * ENTRY 5: ALTERNATE DEVICE 1 ROUTINES * * THE ROUTINES IMPLEMENTED IN THIS SECTION ARE IDENTICAL IN NATURE TO * THE CORRESPONDING ROUTINES IN THE MODEM SECTIONS WITH THE LACK OF A BREAK * ROUTINE. ROUTINES IMPLEMENTED ARE: * A1$INI, A1$ISTAT, A1$OSTAT, A1$IN, A1$OUT * * ENABLE ALTERNATE 1 IF REQUIRED * IF A1$REQUIRED ; IF REQUIRED, THEN ... * * THE FOLLOWING ARE THE I/O ADDRESSES AND STATUS BYTES FOR THE DJ/2D * BOARD. * USTAT EQU 0E3F9H UDATA EQU 0E3F8H ISTAT EQU 4 OSTAT EQU 8 * * ALTERNATE 1 INITIALIZATION * FUNCTION: TO INITIALIZE THE ALTERNATE 1 DEVICE * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * A1$INI: CALL PRINT$MESSAGE DB 0DH,0AH,'** Alternate 1 Initialized **',0DH,0AH,0 RET * * ALTERNATE 1 INPUT STATUS * FUNCTION: TO RETURN BYTE READY (RRF) STATUS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO BYTE, A=0FFH IF BYTE READY * A1$ISTAT: LDA USTAT ; GET STATUS BYTE CMA ; INVERT IT ANI ISTAT ; DATA AVAILABLE? RZ MVI A,0FFH ; LOAD WITH FF RET * * ALTERNATE 1 OUTPUT STATUS * FUNCTION: TO RETURN BUFFER EMPTY (TRE) STATUS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF BUFFER FULL, A=0FFH IF BUFFER EMPTY (TRE) * A1$OSTAT: LDA USTAT ; GET STATUS CMA ; INVERT IT ANI OSTAT ; TRE? RZ MVI A,0FFH ; LOAD WITH FF RET * * ALTERNATE 1 INPUT * FUNCTION: TO RETURN A BYTE IN THE A REG FROM ALTERNATE 1 * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=BYTE (MSB NOT CLEARED) * A1$IN: CALL A1$ISTAT ; GET STATUS JZ A1$IN ; CONTINUE UNTIL DATA AVAILABLE LDA UDATA ; GET DATA CMA ; INVERT IT RET * * ALTERNATE 1 OUTPUT * FUNCTION: TO OUTPUT THE BYTE IN THE A REG TO ALTERNATE 1 * INPUT PARAMETERS: A=BYTE * OUTPUT PARAMETERS: NONE * A1$OUT: PUSH PSW ; SAVE BYTE A1$OUT$LOOP: CALL A1$OSTAT ; CHECK OUTPUT STATUS JZ A1$OUT$LOOP ; WAIT UNTIL EMPTY POP PSW ; GET BYTE CMA ; INVERT IT STA UDATA ; OUTPUT IT CMA RET ENDIF ; ENABLE ALTERNATE 1 I * * ENTRY 6: ALTERNATE DEVICE 2 ROUTINES * * THE ROUTINES IMPLEMENTED IN THIS SECTION ARE IDENTICAL IN NATURE TO * THE CORRESPONDING ROUTINES IN THE MODEM SECTIONS WITH THE LACK OF A BREAK * ROUTINE. ROUTINES IMPLEMENTED ARE: * A2$INI, A2$ISTAT, A2$OSTAT, A2$IN, A2$OUT * * ALTERNATE DEVICE 2 NOT IMPLEMENTED AT THIS TIME. * I * * ENTRY 7: ALTERNATE DEVICE 3 ROUTINES * * THE ROUTINES IMPLEMENTED IN THIS SECTION ARE IDENTICAL IN NATURE TO * THE CORRESPONDING ROUTINES IN THE MODEM SECTIONS WITH THE LACK OF A BREAK * ROUTINE. ROUTINES IMPLEMENTED ARE: * A3$INI, A3$ISTAT, A3$OSTAT, A3$IN, A3$OUT * * ALTERNATE DEVICE 3 NOT IMPLEMENTED AT THIS TIME. * I * * ENTRY 8: TELEPHONE SYSTEM INTERFACE ROUTINES * * ENABLE TELEPHONE INTERFACE IF REQUIRED * IF TI$REQUIRED ; IF REQUIRED, THEN ... 0080 = DATAPORT EQU DCHS$DATA ; DCHS DATA PORT 0081 = STATPORT EQU DATAPORT+1 ; DCHS STATUS/CONTROL PORT 0082 = RATEPORT EQU DATAPORT+2 ; DCHS RATE GENERATOR/MODEM STATUS PORT 0083 = TIMEPORT EQU DATAPORT+3 ; DCHS 50 MS TIMER PORT 0082 = CTRLPORT EQU RATEPORT ; DCHS MODEM CONTROL PORT 0082 = M1$CTRL$PORT EQU CTRLPORT ; DCHS MODEM CONTROL PORT 0000 = RESET EQU 0 ; MODEM IDLE MODE 003F = CLEAR EQU 3FH ; MODEM ANSWER IDLE MODE 0001 = MAKEM EQU 1 ; TELEPHONE LINE MAKE (OFF HOOK) 0000 = BREKM EQU 0 ; TELEPHONE LINE BREAK (ON HOOK) 0087 = ORGIN EQU 87H ; ORIGINATE MODE BIT 0081 = ANSWR EQU 81H ; ANSWER MODE BIT 002F = DTDET EQU 2FH ; SWITCH MODEM FOR DIAL TONE 0001 = DTMASK EQU 1 ; DIAL TONE MASK BIT 0010 = ANSMSK EQU 10H ; ANSWER PHONE MASK BIT 0004 = CTSMSK EQU 4 ; CLEAR-TO-SEND MASK BIT 0080 = RINGMSK EQU 80H ; RING MASK BIT 007F = DTR3 EQU 7FH ; DATA TERMINAL READY (300 BAUD) 005F = DTR6 EQU 5FH ; DATA TERMINAL READY (600 BAUD) 008E = B110 EQU 142 ; TIMER RATE FOR 110 BAUD 0034 = B300 EQU 52 ; TIMER RATE FOR 300 BAUD 001A = B600 EQU 26 ; TIMER RATE FOR 600 BAUD 00FA = D10PPS EQU 250 ; TIMER DIALING RATE 0.1 SEC (10 PPS) 007D = D20PPS EQU 125 ; TIMER DIALING RATE 0.05 SEC (20 PPS) 00FA = TRATE EQU 250 ; TIMER DELAY RATE (0.1 SEC) 0080 = TMPUL EQU 80H ; TIMER PULSES MASK BIT 0007 = INTER EQU 7 ; INTER-DIGIT TIME INTERVAL 005C = SETUART EQU 0101$1100B ; 8 DATA BITS, NO PARITY, 2 STOP BITS * * TELEPHONE INTERFACE BUFFERS (INITIALIZED VALUES) * 5408 34 BAUD: DB B300 ; BAUD RATE 5409 5C UART: DB SETUART ; UART SETTINGS 540A 7F DTRATE: DB DTR3 ; DATA TRANSMISSION RATE * * TELEPHONE INTERFACE SUPPORTING ROUTINES * MWAIT: 540B DB82 IN RATEPORT ; WAIT FOR A MAKE INTERVAL 540D E680 ANI TMPUL 540F C20B54 JNZ MWAIT 5412 C9 RET BWAIT: 5413 DB82 IN RATEPORT ; WAIT FOR A BREAK INTERVAL 5415 E680 ANI TMPUL 5417 CA1354 JZ BWAIT 541A C9 RET TIME15: ; WAIT UP TO 15 SECS FOR STATUS CHANGE IN D 541B C5 PUSH B ; 15 SECOND DELAY 541C 0E96 MVI C,150 ; 15 SECS TIME15$LOOP: 541E CD5E55 CALL T100MS ; WAIT 0.1 SEC 5421 DB82 IN RATEPORT ; TEST STATUS 5423 A2 ANA D ; MASK READY? 5424 CA2E54 JZ TIME15$DONE 5427 0D DCR C ; COUNT DOWN 5428 C21E54 JNZ TIME15$LOOP * NO DIAL TONE 542B AF XRA A ; A=0 542C C1 POP B 542D C9 RET * DIAL TONE TIME15$DONE: 542E 3EFF MVI A,0FFH ; A=0FFH 5430 B7 ORA A ; SET FLAGS 5431 C1 POP B 5432 C9 RET TIMER1: ; WAIT FOR NUMBER OF PULSES IN B 5433 CD1354 CALL BWAIT 5436 CD0B54 CALL MWAIT 5439 05 DCR B ; COUNT DOWN 543A C23354 JNZ TIMER1 543D C9 RET * * TELEPHONE INTERFACE INITIALIZATION * FUNCTION: INITIALIZE THE MODEM/UART INTERFACE * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * TI$INI: 543E CD0652 CALL PRINT$MESSAGE 5441 0D0A2A2A20 DB 0DH,0AH,'** Modem 1 and Telephone Interface Initialized **' 5474 0D0A00 DB 0DH,0AH,0 5477 C9 RET * * SET MODEM TO ORIGINATE * FUNCTION: SET MODEM TO ORIGINATE MODE * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * TI$ORG: 5478 F5 PUSH PSW 5479 3E87 MVI A,ORGIN ; ORIGINATE (SWITCH HOOK) 547B D382 OUT RATEPORT 547D F1 POP PSW 547E C9 RET * * PREPARE MODEM TO ANSWER PHONE * FUNCTION: TO CONDITION MODEM FOR ANSWERING PHONE * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * TI$PREPANS: 547F F5 PUSH PSW 5480 3E3F MVI A,CLEAR ; CLEAR MODEM TO IDLE 5482 D382 OUT CTRLPORT 5484 3E00 MVI A,BREKM ; GO ON-HOOK 5486 D381 OUT STATPORT 5488 F1 POP PSW 5489 C9 RET * * SET MODEM TO ANSWER * FUNCTION: SET MODEM TO ANSWER MODE * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NOT SUCCESSFUL, A=0FFH IF SUCCESSFUL * TI$ANS: 548A CD5E55 CALL T100MS ; WAIT 0.1 SEC 548D CDD654 CALL TI$RST ; STILL RINGING? 5490 CAAB54 JZ TI$ANSF 5493 3E81 MVI A,ANSWR ; ANSWER 5495 D381 OUT STATPORT 5497 CD5E55 CALL T100MS ; WAIT 0.1 SEC 549A 1604 MVI D,CTSMSK ; WAIT FOR CLEAR TO SEND 549C CD1B54 CALL TIME15 549F C8 RZ 54A0 DB80 IN DATAPORT ; CLEAR UART 54A2 3A0854 LDA BAUD ; SET BAUD RATE 54A5 D382 OUT RATEPORT 54A7 3EFF MVI A,0FFH ; SET OK 54A9 B7 ORA A ; SET FLAGS 54AA C9 RET * FAILURE TO ANSWER TI$ANSF: 54AB AF XRA A ; A=0 54AC C9 RET * * PICK UP TELEPHONE * FUNCTION: PLACE THE TELEPHONE OFF HOOK * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO DIAL TONE, A=0FFH IF OK AND DIAL TONE * TI$PICK: 54AD 3E01 MVI A,MAKEM ; PUT IN ORG MODE AND GO OFF HOOK 54AF D381 OUT STATPORT 54B1 C3C454 JMP TI$WDT ; WAIT FOR DIAL TONE AND RET STATUS * * HANG UP TELEPHONE * FUNCTION: PLACE THE TELEPHONE ON HOOK * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * TI$HANG: 54B4 F5 PUSH PSW 54B5 3E00 MVI A,RESET ; IDLE MODEM 54B7 D382 OUT CTRLPORT 54B9 D381 OUT STATPORT * WAIT FOR PHONE TO DISCONNECT LINE TI$HANG$LOOP: 54BB DB82 IN RATEPORT ; GET STATUS 54BD E610 ANI ANSMSK 54BF CABB54 JZ TI$HANG$LOOP 54C2 F1 POP PSW 54C3 C9 RET * * WAIT FOR DIAL TONE * FUNCTION: WAIT FOR DIAL TONE FOR 15 SECS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO DIAL TONE, A=0FFH IF DIAL TONE * TI$WDT: 54C4 D5 PUSH D ; SAVE DE 54C5 3E2F MVI A,DTDET ; DIAL TONE DETECT 54C7 D382 OUT CTRLPORT 54C9 1601 MVI D,DTMASK ; LOOK FOR DIAL TONE TI$W15: 54CB CD1B54 CALL TIME15 ; 15 SEC DELAY 54CE D1 POP D 54CF C9 RET * * WAIT FOR ANSWER * FUNCTION: WAIT FOR ANSWER ON TELEPHONE FOR 15 SECS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO ANSWER, A=0FFH IF ANSWER * TI$WANS: 54D0 D5 PUSH D ; SAVE DE 54D1 1604 MVI D,CTSMSK ; CLEAR TO SEND 54D3 C3CB54 JMP TI$W15 ; WAIT FOR UP TO 15 SECS * * RING STATUS DETECT * FUNCTION: DETERMINES IF PHONE IS RINGING OR NOT * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO RING, A=0FFH IF RING * TI$RST: 54D6 DB81 IN STATPORT ; GET STATUS 54D8 E680 ANI RINGMSK ; RINGING? 54DA CADF54 JZ TI$YES 54DD AF XRA A ; A=0 FOR NO RING 54DE C9 RET TI$YES: 54DF 3EFF MVI A,0FFH ; A=0FFH FOR RING 54E1 B7 ORA A ; SET FLAGS 54E2 C9 RET * * DIAL TONE STATUS DETECT * FUNCTION: DETECT PRESENCE OF DIAL TONE * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO DIAL TONE, A=0FFH IF DIAL TONE * TI$DST: 54E3 DB82 IN RATEPORT ; GET STATUS 54E5 E601 ANI DTMASK ; DIAL TONE? 54E7 CADF54 JZ TI$YES ; A=0FFH FOR DIAL TONE 54EA AF XRA A ; A=0 FOR NO DIAL TONE 54EB C9 RET * * CARRIER STATUS DETECT * FUNCTION: DETERMINE IF CARRIER IS PRESENT * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO CARRIER, A=0FFH IF CARRIER * TI$CST: 54EC DB82 IN RATEPORT ; GET STATUS 54EE E604 ANI CTSMSK ; CLEAR TO SEND? 54F0 CADF54 JZ TI$YES ; A=0FFH FOR CARRIER 54F3 AF XRA A ; A=0 FOR NO CARRIER 54F4 C9 RET * * START DIALING * FUNCTION: INITIATE THE DIALING PROCESS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO DIAL TONE, A=0FFH IF DIAL TONE * TI$DSTRT: 54F5 3E00 MVI A,RESET ; IDLE MODEM 54F7 D382 OUT CTRLPORT 54F9 CDAD54 CALL TI$PICK ; PICK UP PHONE 54FC CDE354 CALL TI$DST ; CHECK FOR DIAL TONE 54FF C9 RET * * STOP DIALING * FUNCTION: TERMINATE THE DIALING PROCESS * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: A=0 IF NO ANSWER, A=0FFH IF ANSWER * TI$DSTOP: 5500 3A0A54 LDA DTRATE ; SET DATA RATE 5503 D382 OUT CTRLPORT 5505 CD5E55 CALL T100MS ; WAIT 0.1 SEC 5508 1604 MVI D,CTSMSK ; WAIT FOR ANSWER 550A CD1B54 CALL TIME15 550D C8 RZ ; ABORT IF NO ANSWER * INITIALIZE UART INIT$UART: 550E 3A0954 LDA UART ; INITIALIZE UART 5511 D381 OUT STATPORT 5513 DB80 IN DATAPORT ; CLEAR UART 5515 3A0854 LDA BAUD ; SET BAUD RATE 5518 D382 OUT RATEPORT 551A 3A0A54 LDA DTRATE ; SET DATA RATE 551D D382 OUT CTRLPORT 551F 3EFF MVI A,0FFH ; OK 5521 B7 ORA A ; SET FLAGS 5522 C9 RET * * DIAL DIGIT * FUNCTION: DIAL AN INDIVIDUAL DIGIT * INPUT PARAMETERS: A=ASCII FOR DIGIT TO DIAL * OUTPUT PARAMETERS: NONE * TI$DIGIT: 5523 F5 PUSH PSW 5524 C5 PUSH B 5525 D630 SUI '0' ; CONVERT TO BINARY 5527 DA5B55 JC TI$DIGIT$SKIP ; SKIP INVALID DIGIT 552A FE0A CPI 10 ; VALID? 552C D25B55 JNC TI$DIGIT$SKIP ; SKIP INVALID DIGIT 552F B7 ORA A ; IF ZERO, MAKE IT A 10 5530 C23555 JNZ TI$DIAL0 5533 3E0A MVI A,10 ; 0 TI$DIAL0: 5535 4F MOV C,A ; NUMBER (1-10) IN C * SET DIAL RATE 5536 3E7D MVI A,D20PPS ; 20 PPS 5538 D382 OUT RATEPORT * WAIT FOR ZERO PULSE 553A CD0B54 CALL MWAIT * WAIT FOR NON-ZERO PULSE 553D CD1354 CALL BWAIT * OUTPUT REQUIRED NUMBER OF PULSES TO DIAL (NUMBER IN C) TI$PULSE: 5540 3E01 MVI A,MAKEM ; START WITH A MAKE 5542 D381 OUT STATPORT 5544 CD0B54 CALL MWAIT ; WAIT FOR MAKE INTERVAL 5547 3E00 MVI A,BREKM ; DO A BREAK 5549 D381 OUT STATPORT 554B CD1354 CALL BWAIT ; WAIT FOR BREAK INTERVAL 554E 0D DCR C ; COUNT PULSES 554F C24055 JNZ TI$PULSE 5552 3E01 MVI A,MAKEM ; WAIT FOR INTERDIGIT TIME ON LAST PULSE 5554 D381 OUT STATPORT 5556 0607 MVI B,INTER ; INTERDIGIT TIME 5558 CD3354 CALL TIMER1 TI$DIGIT$SKIP: 555B C1 POP B ; RESTORE REGS 555C F1 POP PSW 555D C9 RET * * 0.1 SEC DELAY ROUTINE * FUNCTION: PAUSE FOR 0.1 SEC * INPUT PARAMETERS: NONE * OUTPUT PARAMETERS: NONE * T100MS: 555E CD6155 CALL T50MSEC ;100 MS DELAY 5561 F5 T50MSEC PUSH PSW ;50 MS DELAY ROUTINE 5562 C5 PUSH B 5563 3EFF MVI A,0FFH ;DUMMY LOAD TO TIMER 5565 D383 OUT TIMEPORT 5567 DB81 TIMEOT IN STATPORT 5569 E620 ANI 20H 556B CA6755 JZ TIMEOT ;TEST FOR 50 MS TIMEOUT 556E C1 POP B 556F F1 POP PSW 5570 C9 RET ENDIF ; TI REQUIRED * * END OF TELEPHONE INTERFACE ROUTINES * * * END OF SUPPORT PACKAGE * 5700 ORG BASE+600H ; SP IS ALWAYS 1.5K BYTES LONG 5700 00 ENDALL: DB 0 5701 END