;APLCAT.ASM Version 9.9 revised 5/25/85 ; ;Overlay file for MSFTCAT.OBJ and PCPICAT.OBJ. ; ; ;Deffinitions for use in assembling MODEM9.xx. ; ; M80 EQU 0FFFFH ;SET TO 0 IF ASSEMBLING WITH ASM OR MAC ; FALSE EQU 0 IF NOT M80 TRUE EQU 0FFH ENDIF ;NOT M80 ; IF M80 TRUE EQU NOT FALSE .8080 ;necessary for ALDS version ENDIF ;M80 ; OVERLAY EQU FALSE ;False if doing complete assembly, true if overlay ;only. IF (NOT OVERLAY) AND (NOT M80) +++INCOMPATIBLE ASSEMBLY SWITCHES+++ +++M80 MUST BE TRUE IF OVERLAY IS FALSE+++ ENDIF ;NOT OVERLAY AND NOT M80 ; GLOBAL CKOVLY ; ; IF (NOT OVERLAY) GLOBAL ORIGIN ASEG ORG 0103H .SFCOND ;DON'T PRINT FALSE CONDITIONAL SOURCE ; ; ORIGIN: JMP$START: JMP START ;VECTOR FOR CKOVL EXIT JMP$ILPRT: JMP ILPRT ;AND FOR ILPRINT ; .printx +aplcat.asm+ ENDIF ;not overlay ; MAJVER EQU 9 MINVER EQU 9 VERMONTH EQU 5 VERDAY EQU 25 VERYEAR EQU 85 ; APLICARD EQU FALSE ;TRUE ONLY IF YOU HAVE APPLICARD CPM ;MUST BE FALSE FOR MICROSOFT BOARD ; ; ; CATSLOT EQU 2 ;SLOT OF APPLE CAT SLOT EQU CATSLOT*16 ; VERMSG EQU TRUE ;CHANGE TO TRUE IF YOU HAVE GIVEN AT ;location SYSVER the name of the ;system for which MODEM9 has been ;configured. ; INIT EQU TRUE ;CHANGE TO TRUE IF YOU ARE USING A ;routine at location INITMOD to ;initialize your modem port on MODEM9 ;execution. ; SETUP EQU TRUE ;CHANGE TO TRUE IF YOU ARE USING A ;routine at location SETUPR to change ;baud rate, etc. ; DISCON EQU TRUE ;CHANGE TO TRUE IF YOU HAVE WRITTEN A ;routine at location DISCR to disconnect ;the modem from the telephone line. ; CRDT EQU TRUE ;CHANGE TO TRUE IF YOU HAVE WRITTEN A ;routine at location DETCAR to give carrier ;detect status. ; EOSCLR EQU TRUE ;change to TRUE if you have defined the ;clear to end of screen sequence for ;your terminal. Clear to end of screen is ;used on returning from terminal mode to ;keep the screen from becoming jumbled if ;the remote can positon your cursor. ; SCRNCLR EQU TRUE ;change to TRUE if you have defined the ;home cursor and clear screen sequence ;for you terminal. ; CPM2X EQU TRUE ;TRUE IF CP/M 2.X DBUFSIZ EQU 8 ;BUFFER SIZE FOR FILE TRANSFER IN KBYTES ; ERRCRC EQU 6 ;NUMBER OF TIMES TO TRY CRC MODE BEFORE ;SWITCHING TO CHECKSUM ERRLIM EQU 10 ;NUMBER OF TIMES TO RETRY ;SEND/RECEIVE ERRORS BEFORE QUIT ; ; CRC EQU 'C' ;USED TO REQUEST 'CRC' INSTEAD OF 'CKSUM' ESC EQU '['-40H ; ^[ = ESCAPE SOH EQU 'A'-40H ; ^A = START OF HEADER EOT EQU 'D'-40H ; ^D = END OF TEXT ACK EQU 'F'-40H ; ^F = ACKNOWLEDGE OKNMCH EQU 'F'-40H ; ^F = OKAY NAME MATCH BELL EQU 'G'-40H ; ^G = BELL CHARACTER BKSP EQU 'H'-40H ; ^H = BACKSPACE TAB EQU 'I'-40H ; ^I = TAB LF EQU 'J'-40H ; ^J = LINEFEED CR EQU 'M'-40H ; ^M = CARRIAGE RETURN XON EQU 'Q'-40H ; ^Q = XON CHARACTER XOFF EQU 'S'-40H ; ^S = XOFF CHARACTER NAK EQU 'U'-40H ; ^U = NOT ACKNOWLEDGE CAN EQU 'X'-40H ; ^X = CANCEL SEND/RECEIVE EOFCHAR EQU 'Z'-40H ; ^Z = END OF FILE SPACE EQU ' ' ; SPACE BDNMCH EQU 75H ; BAD NAME MATCH RUB EQU 7FH ; RUB ; ; ; BDOS EQUATES ; RDCON EQU 1 WRCON EQU 2 LSTOUT EQU 5 PRINT EQU 9 RDBUF EQU 10 CONST EQU 11 RESET EQU 13 SELDSK EQU 14 OPEN EQU 15 CLOSE EQU 16 SRCHF EQU 17 SRCHN EQU 18 ERASE EQU 19 READ EQU 20 WRITE EQU 21 MAKE EQU 22 REN EQU 23 CURDSK EQU 25 STDMA EQU 26 GETALC EQU 27 ;CP/M ALLOCATION VECTOR ADDRESS GETPARM EQU 31 ;CURRENT DISK PARAMETERS ADDRESS USER EQU 32 FILSIZ EQU 35 BDOS EQU 5 REIPL EQU 0 FCB EQU 5CH FCBEXT EQU FCB+12 FCBSNO EQU FCB+32 FCBRNO EQU FCB+32 FCB2 EQU 6CH ; XMSPD EQU 03CH ;address used by bye/xmodem for mspeed ; ; ; ;START.ASM ;The user can make the following changes in this section: ; ; a) Set the TRUE/FALSE statements in the lookup table which ; begins with BAKUPBYTE and ends with EOFSEND ; b) Change the control characters that are used for local commands, ; this sequence starts with EXITCHR and ends with EXTCHR ; c) Set STRGOK to TRUE and enter up to ten strings at location ; STRINGS. These strings can be logon sequences or frequently ; used commands that are sent to a remote computer ; ; STRGOK EQU TRUE ;change to TRUE if you want to define ;strings, such as logon sequences, for ;transmission. Up to 10 strings may be ;entered at location STRINGS in this file. ; ;*** Don't change the ORG locations in this file *** ;*** These ORG statements provide standard locations *** ;*** for modification by overlay files or DDT. *** ; IF OVERLAY ;;this will be installed by l80 at link time ;JMP CKOVLY ;First make sure overlay and obj match ; ; JMP$START: JMP START ;SPACE FOR JUMP TO START JMP$ILPRT: JMP ILPRT ;Allows file to assemble as a stand-alone ENDIF ;overlay ; BAKUPBYTE: DB FALSE ;true=make .BAK file CKSUMDFLT: DB FALSE ;true=default to Checksum checking ;false=default to CRC checking TOGLCRC: DB TRUE ;true=allow toggling of Checksum to CRC CONVBKSP: DB FALSE ;true=convert backspace to rub TOGLBK: DB TRUE ;true=allow toggling of bksp to rub ADDLF: DB FALSE ;true=add LF after CR TOGLLF: DB TRUE ;true=allow toggling of LF after CR STRLF: DB TRUE ;true=strip LF after CR in terminal file output TOGSLF: DB TRUE ;true=toggle strip LF after CR in file output SAVCCP: DB TRUE ;TRUE=DO NOT OVERWRITE CCP LOCONEXTCHR: DB FALSE ;true=local command if EXTCHR precedes ;false=not local command if EXTCHR precedes TOGLLOC: DB TRUE ;true=allow toggling of LOCONEXTCHR LSTTST: DB TRUE ;TRUE=ALLOW TOGGLING OF PRINTER ON/OFF ;in terminal mode. Set to false if your ;printer can't keep up with the modem ;***** WARNING ***** ;The three mode bytes XOFFTXT, XONWAIT, and ECHWAIT are mutually exclusive ; modes. Do NOT attempt to set more than one of them at a time, as very ; unpredictable results will ensue. XOFFTST: DB TRUE ;TRUE=ALLOW TESTING OF XOFF FROM REMOTE ;while transmitting a file in terminal mode XONWAIT: DB FALSE ;true=wait for XON after sending CR while ;transmitting a file in terminal mode TOGXOFF: DB TRUE ;true=allow toggling of XOFF/XON testing ECHWAIT: DB FALSE ;true=wait for echo before sending next ;character in terminal mode file output EOFSEND: DB FALSE ;true=send eof in terminal mode file output NAKONLY: DB TRUE ;true=resends a record only after a valid NAK ;false=resends a record after any non-ACK ;true is intended only for use with mainframes ;that send, for example, xoff when buffer is ;full ; SETUPTST: DB SETUP SCRNTEST: DB SCRNCLR TRANLOGON: DB STRGOK DISCFLG: DB DISCON CRDTFLG: DB CRDT CLOCK: DB CLKRATE ; MSPEED: DB 1 ;sets the display time to send a file ;0=110 1=300 2=450 3=600 4=710 ;5=1200 6=2400 7=4800 8=9600 BYTDLY: DB 0 ;default time to send character in ;terminal mode file transfer ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec CRDLY: DB 0 ;default time for extra wait after CR ;in terminal mode file transfer ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec BELRPT: DB 30 ;bell repeat time = value*0.03 sec NOOFCOL: DB 5 ;number of directory columns DIALSW: DB 0 ;DIALER DEFAULT MODE ;0=TOUCHTONE, 1=PULSE IDGT: DB 10H ;interdigit delay value for touch tone dialer ;increase if your exchange needs slower dialing ;should be 10H minimum BYESAV: DB TRUE ;True saves mspeed in 03CH so that xmodem ;can be used after CTLTRP: DB TRUE ;True terminal mode traps control characters ;(except tab,cr,lf,bs,rub) before sending to console ; ; EXITCHR: DB 'E'-40H ; ^E = Exit without disconnect LOGCHR: DB 'O'-40H ; ^O = Send logon LSTCHR: DB 'Z'-40H ; CHANGED DUE TO MAINFRAMES USING CTL P FOR A 'BREAK' UNSAVECHR: DB 'R'-40H ; ^R = Close input text buffer TRANCHR: DB 'T'-40H ; ^T = Transmit file to remote SAVECHR: DB 'Y'-40H ; ^Y = Open input text buffer EXTCHR: DB '^'-40H ; ^^ = Send next character ; ;org 140H ; CLREOS: CALL JMP$ILPRT ; IF EOSCLR DB CLR1,CLR2,CLR3,CLR4,0 ENDIF ;EOSCLR ; IF NOT EOSCLR DB 0,0,0,0,0 ENDIF ;NOT EOSCLR ; RET ; DS CLREOS-$+16 ; CLRSCRN: CALL JMP$ILPRT ; IF SCRNCLR DB SCLR1,SCLR2,SCLR3,SCLR4,0 ENDIF ;SCRNCLR ; IF NOT SCRNCLR DB 0,0,0,0,0 ENDIF ;NOT SCRNCLR ; RET ; ORG 150H .list ; ;ALL STRINGS MUST BE 31 CHARACTERS OR LESS AND MUST BE TERMINATED WITH 0 ; STRINGS: DB 'STRING #0 AT 150H',0 DS STRINGS-$+32*1 DB 'STRING #1 AT 170H',0 DS STRINGS-$+32*2 DB 'STRING #2 AT 190H',0 DS STRINGS-$+32*3 DB 'STRING #3 AT 1B0H',0 DS STRINGS-$+32*4 DB 'STRING #4 AT 1D0H',0 DS STRINGS-$+32*5 DB 'STRING #5 AT 1F0H',0 DS STRINGS-$+32*6 DB 'STRING #6 AT 210H',0 DS STRINGS-$+32*7 DB 'STRING #7 AT 230H',0 DS STRINGS-$+32*8 DB 'STRING #8 AT 250H',0 DS STRINGS-$+32*9 DB 'STRING #9 AT 270H',0 DS STRINGS-$+32*10 ; ; ; ;PHONE NUMBER LIBRARY TABLE. ; ;EACH DB MUST BE 32 CHARACTERS LONG FOR PROPER OPERATION. ;LAST DB MUST BE DB 0. UP TO 26 NUMBERS ARE ALLOWED. ; NUMBLIB: ; '----5---10---15---20---25-----32' DB 'A=AMRAD 1-703-734-1387' ;'A' DB 'B=ROCHESTER RBBS 1-716-425-1785' ;'B' DB 'C=CBBS PASADENA 1-818-799-1632' ;'C' DB 'D=NOVATION 1-818-881-6880' ;'D' DB 'E=TECH. CBBS 1-313-846-6127' ;'E' DB 'F=RON FOWLER 1-313-729-1905R' ;'F' DB 'G=GASNET NASA 1-301-344-9156' ;'G' DB 'H=DAVE HARDY 1-313-846-6127' ;'H' DB 'I=WAYNE HAMMERLY 1-301-953-3753' ;'I' DB 'J=RBBS PASADENA 1-818-356-1034' ;'J' DB 'K=TIM LINEHAN 1-206-357-7400' ;'K' DB 'L=PROGRAM STORE 1-202-337-4694' ;'L' DB 'M=KELLY SMITH 1-805-527-9321' ;'M' DB 'N=SUPERBRAIN SYS 1-617-862-0781' ;'N' DB 'O=R.L.PLOUFFE 1-703-524-2549' ;'O' DB 'P=K.PETERSEN <313-759-6569>' ;'P' DB 'Q=BRUCE RATOFF 1-201-272-1874' ;'Q' DB 'R=MARK PULVER 1-312-789-0499' ;'R' DB 'S=LA CANADA RBBS 1-818-790-3014' ;'S' DB 'T= ' ;'T' DB 'U= ' ;'U' DB 'V= ' ;'V' DB 'W= ' ;'W' DB 'X= ' ;'X' DB 'Y= ' ;'Y' DB 'Z= ' ;'Z' ; ; ALDS1: DB '<= ' ;'<' ALDS2: DB '>= ' ;'>' DB 0 ; END ALDS ; '----5---10---15---20---25-----32' ; IF NOT APLICARD ; INCTLP: LDA STATUS RET DS INCTLP-$+16 ;extra space OUTDATP: STA OUTDAT RET DS OUTDATP-$+16 ;EXTRA SPACE ; ENDIF ;NOT APLICARD ; ; IF APLICARD ; INCTLP: PUSH D LXI D,STATUS CALL PEEK POP D RET DS INCTLP-$+16 ;EXTRA SPACE ; OUTDATP: PUSH D LXI D,OUTDAT CALL POKE POP D RET DS OUTDATP-$+16 ; ENDIF ;APLICARD ; INDATP: ; IF NOT APLICARD ; LDA INDAT ;IN MODEM DATA PORT PUSH PSW LDA XMTRAM STA XMTBYT POP PSW RET ; ENDIF ;NOT APLICARD ; IF APLICARD ; PUSH D LXI D,INDAT CALL PEEK PUSH PSW CALL SXMTBYT POP PSW POP D RET ; ENDIF ;APLICARD ; DS INDATP-$+16 ;extra space ; ANISNDB: ANI MODSNDB RET ;BIT TO TEST FOR SEND READY DS ANISNDB-$+16 ;extra space CPISNDR: CPI MODSNDR ;VALUE OF SEND BIT WHEN READY RET DS CPISNDR-$+16 ;extra space ANIRCVB: ANI MODRCVB ;BIT TO TEST FOR RECEIVE READY RET DS ANIRCVB-$+16 ;extra space CPIRCVR: CPI MODRCVR ;VALUE OF RECEIVE BIT WHEN READY RET DS CPIRCVR-$+16 ;extra space ; VERNUM: CALL JMP$ILPRT DB CR,LF,'MODEM ' DB MAJVER+'0' DB '.' DB MINVER / 10 + '0', MINVER MOD 10 + '0' DB ' - ' DB VERMONTH / 10 + '0', VERMONTH MOD 10 + '0', '/' DB VERDAY / 10 + '0', VERDAY MOD 10 + '0', '/' DB VERYEAR / 10 + '0', VERYEAR MOD 10 + '0' DB CR,LF,0 JMP SYSVER ; ; SYSVER: IF NOT VERMSG CALL JMP$ILPRT DB 'Version for: Apple-Cat in slot ',CATSLOT+30H,CR,LF,0 ;NOTE: 0 MUST BE AT END OF ALL ILPRT MESSAGES RET ENDIF ;NOT VERMSG ; ;This is where the message goes giving the system for ;which MODEM9 has been customized. ; IF VERMSG AND APLICARD CALL JMP$ILPRT DB 'Version for: Apple-Cat in slot ',CATSLOT+'0' DB ' and PCPI CP/M',CR,LF,0 RET ENDIF ;VERMSG AND APLICARD ; IF VERMSG AND NOT APLICARD CALL JMP$ILPRT DB 'Version for: Apple-Cat in slot ',CATSLOT+'0' DB ' and SOFTCARD CP/M',CR,LF,0 RET ENDIF ;VERMSG AND APLICARD ; ; ; ; ;NOVATION APPLE-CAT EQUATES START HERE ; ; IF NOT APLICARD ; COM EQU 0E08CH+SLOT XMTBYT EQU 0E08DH+SLOT CON EQU 0E08AH+SLOT BSRBYT EQU 0E083H+SLOT SHBYT EQU 0E082H+SLOT TONBYT EQU 0E081H+SLOT SQUBYT EQU 0E081H+SLOT SWBYT EQU 0E080H+SLOT RECBYT EQU 0E089H+SLOT INDAT EQU 0E08BH+SLOT OUTDAT EQU 0E08EH+SLOT SPDBYT EQU 0E08BH+SLOT STATUS EQU 0E08FH+SLOT ACBYT EQU 0E08DH+SLOT DEVBYT EQU 0E08FH+SLOT DACBYT EQU 0E080H+SLOT ; ; ENDIF ;NOT APLICARD ; IF APLICARD ; COM EQU 0C08CH+SLOT XMTBYT EQU 0C08DH+SLOT CON EQU 0C08AH+SLOT BSRBYT EQU 0C083H+SLOT SHBYT EQU 0C082H+SLOT TONBYT EQU 0C081H+SLOT SQUBYT EQU 0C081H+SLOT SWBYT EQU 0C080H+SLOT RECBYT EQU 0C089H+SLOT INDAT EQU 0C08BH+SLOT OUTDAT EQU 0C08EH+SLOT SPDBYT EQU 0C08BH+SLOT STATUS EQU 0C08FH+SLOT ACBYT EQU 0C08DH+SLOT DEVBYT EQU 0C08FH+SLOT DACBYT EQU 0C080H+SLOT ; ENDIF ;APLICARD ; MODSNDB EQU 00010000B ;READY TO SEND MODSNDR EQU MODSNDB ;change to 0 if bit is 0 when ;ready to send MODRCVB EQU 00001000B ;RECEIVE READY including framing/overrun MODRCVR EQU 00001000B ;change to 0 if bit is 0 when ;data received ; ; IF NOT APLICARD CLKRATE EQU 2 ;CLOCK SPEED IN MHZ, 8 MHZ MAXIMUM ENDIF ;not aplicard ; IF APLICARD ;NOTE: DO NOT CHANGE RATE TO 6MHZ CLKRATE EQU 1 ;FOR APLICARD: EXTRA PROCESSING OVERHEAD ENDIF ;aplicard ;OF PCPI PEEK/POKE ROUTINES MORE THAN ;COMPENSATES FOR THIS ; IF EOSCLR CLR1 EQU ESC ;ESC Y is the Apple clear to end CLR2 EQU 'Y' ;OF SCREEN SEQUENCE CLR3 EQU 0 ;the unused bytes MUST be 0 CLR4 EQU 0 ENDIF ;EOSCLR ; ;CHANGE SCLR1, SCLR2, SCLR3, AND SCLR4 TO THE APPROPRIATE VALUES FOR ;YOUR TERMINAL IF YOU DO NOT HAVE STANDARD APPLE CALLS IF SCRNCLR SCLR1 EQU ESC ;ESC * is the Apple home cursor SCLR2 EQU '*' ;AND CLEAR SCREEN SEQUENCE SCLR3 EQU 0 ;the unused bytes MUST be 0 SCLR4 EQU 0 ENDIF ;SCRNCLR ; ; ; IF INIT ; INITMOD: JMP AINITMOD ; ENDIF ; ; INIT3: MVI A,1 STA MSPEED CALL XMCK LDA REFLG ORA A RNZ CALL PICKUP ;PICK UP PHONE MVI A,0A1H ; IF NOT APLICARD ; STA RECBYT ;SET RECEIVER FOR 103 MVI A,00000011B ;8 DATA NO PARITY 1 STOP STA CON MVI A,22H ;SET UART TO 300 BAUD STA SPDBYT ; ENDIF ;NOT APLICARD ; IF APLICARD ; PUSH D LXI D,RECBYT CALL POKE MVI A,00000011B ;8DATA NO PAR 1 STOP LXI D,CON CALL POKE MVI A,22H LXI D,SPDBYT CALL POKE POP D ; ENDIF ;APLICARD ; MVI A,0FFH STA SETFLG RET ; ORIG103: MVI A,11H ; IF NOT APLICARD ; STA XMTBYT STA XMTRAM ;103 ORIG RING IRQ OFF MVI A,65H STA RECBYT ; ENDIF ;NOT APLICARD ; IF APLICARD ; STA XMTRAM PUSH D LXI D,XMTBYT CALL POKE POP D ; ENDIF ;APLICARD ; RET ; ANS103: MVI A,10H ; IF NOT APLICARD ; STA XMTBYT STA XMTRAM MVI A,64H STA RECBYT ; ENDIF ;NOT APLICARD ; IF APLICARD ; STA XMTRAM PUSH D LXI D,XMTBYT CALL POKE MVI A,64H LXI D,RECBYT CALL POKE POP D ; ENDIF ;APLICARD ; RET ; INIT2: MVI A,5 STA MSPEED CALL XMCK MVI A,18H STA XMTRAM ;for re-entrance LDA REFLG ORA A RNZ ;return if re entrant MVI A,0FFH STA SETFLG CALL PICKUP MVI A,0 ; IF NOT APLICARD ; STA SPDBYT MVI A,18H STA XMTBYT MVI A,0AH STA DEVBYT MVI A,13H STA CON MVI A,05H STA COM STA MSPEED CALL XMCK MVI A,0FFH STA SETFLG ; ENDIF ;NOT APLICARD ; IF APLICARD ; PUSH D LXI D,SPDBYT CALL POKE MVI A,18H LXI D,XMTBYT CALL POKE MVI A,0AH LXI D,DEVBYT CALL POKE MVI A,13H LXI D,CON CALL POKE MVI A,05H LXI D,COM CALL POKE POP D ; ; ENDIF ;APLICARD ; RET ; ORIG212: LDA REFLG ORA A RNZ MVI A,0A1H ; IF NOT APLICARD ; STA SQUBYT CALL DELAY5 MVI A,21H STA SQUBYT ; ENDIF ;NOT APLICARD ; IF APLICARD ; PUSH D LXI D,SQUBYT CALL POKE CALL DELAY5 MVI A,21H LXI D,SQUBYT CALL POKE POP D ; ENDIF ;APLICARD ; RET ; ANS212: LDA REFLG ORA A RNZ MVI A,81H ; IF NOT APLICARD ; STA SQUBYT CALL DELAY5 MVI A,01 STA SQUBYT ; ENDIF ;NOT APLICARD ; IF APLICARD PUSH D LXI D,SQUBYT CALL POKE CALL DELAY5 MVI A,01 LXI D,SQUBYT CALL POKE POP D ; ENDIF ;APLICARD ; RET ; SETORIG: MVI A,0FFH STA SETFLG LDA MSPEED CPI 1 JZ ORIG103 JMP ORIG212 ;SELECT 212 OR 103 ; SETANS: MVI A,0FFH STA SETFLG ;SHOW MODEM IS SET LDA MSPEED CPI 1 JZ ANS103 JMP ANS212 ; PICKUP: MVI A,0A1H ; IF NOT APLICARD ; STA SQUBYT ; ENDIF ;NOT APLICARD ; IF APLICARD ; PUSH D LXI D,SQUBYT CALL POKE POP D ; ENDIF ;APLICARD ; MVI A,'T' ;FORCE TERMINAL MODE AFTER INIT STA 5DH MVI A,0 STA 80H ;AND RESET COMMAND TAIL LENGTH ;IN CASE MAIN CALLS US AGAIN MVI A,2 ; IF NOT APLICARD ; STA SHBYT MVI A,13H STA CON MVI A,05H STA COM MVI A,0 STA DEVBYT ; ENDIF ;NOT APLICARD ; IF APLICARD ; PUSH D LXI D,SHBYT CALL POKE MVI A,13H LXI D,CON CALL POKE MVI A,05H LXI D,COM CALL POKE MVI A,0 LXI D,DEVBYT CALL POKE POP D ; ENDIF ;APLICARD ; RET ; DELAY5: PUSH PSW PUSH B ;THIS IS A 5-10 MS HARDWARE DELAY LXI B,1000 ;FOR SETTING UP 212 BOARD DELAY5A: DCX B MOV A,B ORA C JNZ DELAY5A POP B POP PSW RET ; D500: ;500 ms delay MVI A,100 ;100 5ms delays D500A: DCR A RZ CALL DELAY5 JMP D500A ; IF (INIT AND SETUP) ; SETUPR: LDA SETFLG ;DONE THIS RECENTLY? XRA A ;IF SO RNZ ;RETURN MVI A,0FFH STA SETFLG STA INFLAG CALL JMP$ILPRT DB 'Enter ''3'' for 300 baud, ''2'' for 1200 baud, ' DB 'or ''V'' for voice mode: ' DB 0 MVI C,1 CALL BDOS PUSH PSW CALL JMP$ILPRT DB CR,LF,0 POP PSW PUSH PSW ANI 01011111B ;FORCE UPPER CASE ETC CPI 'V' JZ SETVOICE POP PSW SUI 30H ;ZAP ASCII BIAS CPI 3 JNZ CK2A CALL INIT3 JMP SETUPR1 ; CK2A: CPI 2 JNZ NOT2 CALL INIT2 JMP SETUPR1 ; NOT2: CALL JMP$ILPRT DB 07h,'Invalid: must be ','2',' or ','3' DB cr,lf,0 JMP SETUPR ; SETUPR1: CALL JMP$ILPRT DB 'ENTER ''O'' for Originate, or ''A'' for Answer ',0 MVI C,1 CALL BDOS PUSH PSW CALL JMP$ILPRT ;TURN UP NEW LINE DB CR,LF,0 POP PSW ANI 01011111B ;FORCE UPPER CASE HI BIT OFF CPI 'O' JZ SETORIG CPI 'A' JZ SETANS CALL JMP$ILPRT DB 07h,'INVALID: Must be ','O',' or ','A' DB cr,lf,0 JMP SETUPR1 ; SETVOICE: POP PSW ;RESTORE STACK FROM SETUPR MVI A,2 ENDIF ;INIT AND SETUP ; IF (INIT AND SETUP) AND (NOT APLICARD) ; STA SHBYT MVI A,18H ;TURN OFF 103 XMTR STA XMTBYT STA XMTRAM MVI A,0A2H ;DISABLE 212 AND TURN ON HANDSET STA SQUBYT MVI A,0 STA SETFLG ; ENDIF ;INIT AND SETUP AND NOT APLICARD ; IF (INIT AND SETUP) AND APLICARD ; PUSH D LXI D,SHBYT CALL POKE MVI A,18H STA XMTRAM LXI D,XMTBYT CALL POKE MVI A,0A2H LXI D,SQUBYT CALL POKE POP D ; ENDIF ;INIT AND SETUP AND APLICARD ; IF (INIT AND SETUP) MVI A,0 STA SETFLG RET ENDIF ;INIT AND SETUP ; ;THESE ARE THE PCPI ROUTINES FOR PASSING ;PARAMATERS TO THE APPLE CAT ; IF APLICARD ; RDBYTE EQU 0FFE0H ;READ A BYTE FROM APPLE (A=BYTE) WRBYTE EQU 0FFE3H ;WRITE A BYTE TO APPLE (C=BYTE) RDWORD EQU 0FFE6H ;READ 2 BYTES FROM APPLE (DE=BYTES) WRWORD EQU 0FFE9H ;WRITE 2 BYTES TO APPLE (DE=BYTES) RDNBYTS EQU 0FFEFH ;READ N BYTES (DE=COUNT, HL=BUFFER) WRNBYTS EQU 0FFEFH ;WRITE N BYTES (DE=COUNT,HL=BUFFER) ; PEEK1BYTE EQU 6 ;COMMAND TO PEEK 1 BYTE IN THE APPLE POKE1BYTE EQU 7 ;COMMAND TO POKE 1 BYTE IN THE APPLE ; ; PEEK: PUSH B ;SAVE B REG MVI C,PEEK1BYTE CALL WRBYTE ;WRBYTE=0FFE3H CALL WRWORD ;WRWORD=FFE6H CALL RDBYTE ;RDBYTE=OFFEOH POP B ;RESTORE B RET ; POKE: ; PUSH PSW ;SAVE A PUSH B ;SAVE B MOV B,A MVI C,POKE1BYTE CALL WRBYTE CALL WRWORD MOV C,B CALL WRBYTE POP B POP PSW RET ; SXMTBYT: PUSH D ;READ XMTRAM AND POKE INTO XMTBYT LDA XMTRAM LXI D,XMTBYT CALL POKE POP D RET ; SXMTRAM: PUSH D ;POKE BYTE IN A INTO XMTRAM AND XMTBYT STA XMTRAM LXI D,XMTBYT CALL POKE POP D RET ; ENDIF ;APLICARD ; AINITMOD: ;MOVED HERE TO MAKE ROOM FOR APLICARD STUFF MVI A,SLOT STA DIALSLOT ;for dialer CALL FIXMT ;in case we are re-entrant LDA INFLAG CPI 0FFH JZ DETCAR MVI A,0FFH STA INFLAG ;MAKE SURE WE ONLY DO THIS ONCE LDA REFLG ORA A CNZ SETUPR ;if re entrant LDA REFLG ORA A RNZ XRA A STA REFLG ; IF NOT APLICARD ; MVI A,6 STA BSRBYT ;DISABLE BSR IRQ MVI A,4 STA COM LDA XMTRAM ORI 00010000B ;SET RING IRQ BIT STA XMTBYT ;DISABLE RING IRQ STA XMTRAM ; MVI A,SLOT ;PUT CATSLOT*16 IN 6502 FF ; ; STA 0F0FFH ;FOR DIALING ROUTINES ; ENDIF ;NOT APLICARD ; IF APLICARD ; PUSH D MVI A,6 LXI D,BSRBYT CALL POKE MVI A,4 LXI D,COM CALL POKE CALL SXMTBYT ORI 00010000B CALL SXMTRAM POP D ; ENDIF ;APLICARD ; ;CHECK IF PRINT ENABLED. IF SO, PATCH LSTST IN APPLE BIOS ;SO ITS ALWAYS 'READY' ; ; IF NOT APLICARD LDA LSTTST CPI 0 JZ FIRSTIN ;NOT PRINTING SO SKIP PATCHING LHLD 0001 ;GET START OF BIOS TABLE MOV A,L ADI 02AH ;GET IT TO POINT TO BIOS 14 VECTOR MOV L,A MVI A,03EH MOV M,A INR L MVI A,0FFH ;INSTALL MVI A,FF RET MOV M,A INR L MVI A,0C9H MOV M,A ENDIF ;NOT APLICARD ; ;NOW BEGINS THE ACTUAL MODEM INITIALIZATION ; FIRSTIN: LDA 80H CPI 0 ;CHECK FOR BAUD CODE IN COMMAND TAIL JZ DISCR ;IF NOTHING THERE, HANG UP THE PHONE MVI A,0FFH STA SETFLG ;This keeps detcar from causing trouble LDA 5DH ANI 7FH CPI '3' ;ASCII '3' FOR 300 BAUD? JNZ CK2 ;NO SEE IF 1200 XRA A STA 80H ;RESET COMMAND TAIL CALL INIT3 JMP ORIG103 ; CK2: CPI '2' ;ASCII '2' FOR 1200 BAUD? JNZ SETUPR CALL INIT2 ;YEP GO SET UP 1200 BAUD JMP ORIG212 ;ORIGINATE ; FIXMT: LDA 080H ORA A RZ LDA INFLAG ;check inflag for T trap ORA A RNZ LDA 05DH ;first byte of command tail CPI 'T' ;check for re-entrant terminal mode JZ FIXMT1 CPI 'E' JZ FIXMT1 CPI 'L' JZ FIXMT1 CPI 'S' JZ FIXMT1 CPI 'R' JZ FIXMT1 RET ; FIXMT1: MVI A,0FFH STA REFLG ;signal re-entrant RET ; REFLG: DB 0 ; DETCAR0: CALL JMP$ILPRT DB 'not ',0 DETCAR1: CALL JMP$ILPRT DB 'present',CR,LF,0 RET ; CKOVLY: LDA OVLEND ;LOCATION OF TEST BYTE IN DIALER ; IF APLICARD CPI 'P' ENDIF ;APLICARD ; IF NOT APLICARD CPI 'M' ENDIF ;NOT APLICARD ; JZ JMP$START ;WE'RE OK ; LXI D,OOPSMSG ;OOPS, WRONG COMBINATION MVI C,PRINT ;TELL OPERATOR WE HAVE A PROBLEM CALL BDOS ;USE BDOS SINCE WE DON'T KNOW WHERE ILPRT IS JMP 0 ;AND RETURN TO CPM ; OOPSMSG: DB BELL,BELL,BELL,BELL DB 'WRONG OVERLAY/.OBJ FILE COMBINATION! ' DB 'ABORTING!',CR,LF,'$' ; ; ; ; IF DISCON DISCR: CALL DISCR1 CALL DELAY5 DISCR1: xra a sta reflg ;reset re-entry flag mvi a,1 ; IF NOT APLICARD ; sta shbyt ;hang up phone mvi a,081H sta squbyt ;disable 212 board mvi a,18h sta xmtbyt sta xmtram ;and 103 xmtr ; ENDIF ;NOT APLICARD ; IF APLICARD ; PUSH D LXI D,SHBYT CALL POKE MVI A,081H LXI D,SQUBYT CALL POKE MVI A,18H LXI D,SQUBYT CALL POKE CALL SXMTRAM POP D ; ENDIF ;APLICARD ; MVI A,0 ;RESET SETUP FLAG STA SETFLG ret ; ENDIF ;DISCON ; ; ; ; DETCAR: LDA SETFLG ;ARE WE SET UP YET? CPI 0 CZ SETUPR ;NO SO SET IT UP DETCARA: LDA CRDTFLG ORA A RZ ;RETURN IF FALSE CALL JMP$ILPRT DB 'Carrier ',0 ; IF NOT APLICARD ; LDA SWBYT ; ENDIF ;NOT APLICARD ; IF APLICARD ; PUSH D LXI D,SWBYT CALL PEEK POP D ; ENDIF ;APLICARD ; ANI 00100000B CPI 00100000B JZ DETCAR1 LDA MSPEED CPI 5 JNZ DETCAR0 ; IF NOT APLICARD ; LDA ACBYT ; ENDIF ;NOT APLICARD ; IF APLICARD ; PUSH D LXI D,ACBYT CALL PEEK POP D ; ENDIF ;APLICARD ; ANI 00000100B ;212 CARRIER? CPI 00000100B JZ DETCAR1 JMP DETCAR0 ; ; XMCK: PUSH PSW LDA BYESAV ORA A JZ NOBYE POP PSW PUSH PSW STA XMSPD NOBYE: POP PSW RET ; DIALSLOT: DS 1 ;FOR DIALER ; ; GIVEPRM: RET GETPRM: RET ; XMTRAM: DB 0 ;Xmtram initially zero INFLAG: DB 0 ;CHECK FOR SECOND INIT ENTRY SETFLG: DB 0 ;CHECK FOR MODEM SETUP OVLEND: ;MARKS END OF OVERLAY ; ;Xlist ; IF (NOT OVERLAY) AND APLICARD .PRINTX +pcpidial+ subttl pcpidial $INCLUDE PCPIDIAL.ASM ENDIF ;not overlay and aplicard ; IF (NOT OVERLAY) AND (NOT APLICARD) .PRINTX +msftdial+ subttl msftdial $INCLUDE MSFTDIAL.ASM ENDIF ;not overlay and not aplicard ; IF (NOT OVERLAY) .printx +main+ subttl MAIN $INCLUDE MAIN.ASM ; ENDIF ;not overlay ; END CKOVLY