home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
apple
/
aplcat99.lbr
/
APLCAT.AZM
/
APLCAT.ASM
Wrap
Assembly Source File
|
1986-12-21
|
26KB
|
1,329 lines
;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