; B5AB-3.INS	Apple ][+ or//e, ALS CP/M Card, Apple Super Serial Card
; 02-Nov-86	BYE5 insert
;
;	   6551 Asynchronous Communications Interface Adapter (ACIA)
;	        with internal baudrate generator
;
;
; This version is for Apple ][+ or //e computers using the Advanced Logic
; Systems (ALS) CP/M Card and Apple Super Serial Card.  The ALS CP/M
; Card runs CP/M Plus.
;
;
; Note:  This is an insert, not an overlay.
;
;------------------------------------------------------------------
; B5AB-3.INS	Created insert.  Tested with BYE510.
; 02-Nov-86
;
;						- Jerry Levy
;						  1129 Dundee Dr.
;						  Dresher, PA 19025
;						  (215) 657-0898
;						  (voice - evenings)
;
;-------------------------------------------------------------------
;
; CONNECTING MODEM TO SSC:
;
;	MODEM=DCE			Super Serial Card
;
;	TXD	2  -------->	2	RXD	received data
;	RXD	3  <--------	3	TXD	tranmitted data
;	SG	7  ---------	7	SG	signal ground
;	DCD	8  -------->	6	DSR	data set ready (carrier)
;	DTR	20 <-------	20	DTR	data terminal ready
;				8-->20  DCD-->DTR (SSC side only)
;
; This cable configuration uses DSR signal at the SSC to check carrier.
; Also, Serial card DCD wired to DTR so that modem result codes are
; received when carrier is off.
;
;
; Set SSC switches (SW1 switches 1,2,3,4 below are set for 1200 baud):
;	SW1:	ON - 2,3,4,5,6,7	OFF - 1
;	SW2:	ON - 1,2,4		OFF - 3,5,6,7
;		
; Set modem switches as defined in B5IM-1.DOC.
; 	Hayes 1200 switches:
;		UP   - 1,2,4,6,7
;		DOWN - 3,5,8	
;
; THESE CABLING AND SWITCH SETTINGS WORK PROPERLY WITH BYE5 AND ARE
; COMPATIBLE WITH IMP WITHOUT ANY CHANGES. ANY OTHER CONFIGURATIONS
; MIGHT REQUIRE RESETTING SOME MODEM SWITCHES WHEN GOING FROM BYE5
; TO IMP, MDM7, MEX, ETC.
;
;------------------------------------------------------------------------
;
; For the Apple //e, a user-entered Control-Q can trash the local display
; by reverting back to 40-column mode.  In later versions of BYE5 just
; set one of the FILTx noise filters to trap Control-Q.
;
;------------------------------------------------------------------------
;
; If not using a bulletin board program, add the following conditional
; to the list of them appearing after EXITFCB:
;
;	IF	EXFILE AND NOT (MBBS OR QBBS OR OXGATE OR METAL OR PBBS)
;	DB	0,'BYE     COM'
;	DB	0,0,0,0,0,0,0
;	DB	0,0,0,0,0,0,0
;	DB	0,0,0,0,0,0,0
;	ENDIF
;
; Necessary with BYE510, probably with BYE 509, also.  Check that the
; RBBS conditionals inside the NOT () are all valid RBBS options in the 
; RBBS option section of the BYE509-or-later version you are using.   Also
; check that all valid RBBS options do appear inside the ().  Later BYE
; versions may include this, so check the EXITFCB label first.  
;------------------------------------------------------------------------
;
SLOT	EQU	2		; Slot 2 is normal
OFFS	EQU	16*SLOT		; This is the slot offset
;......
;
;	Modem port addresses.  Apple addresses for direct access of
;	SSC 6551 ACIA registers
;
PORT	EQU	0C088H+OFFS	; SSC ACIA Data port	
STPORT	EQU	PORT+1		; Status port (read) or reset port (write)
CPORT	EQU	PORT+2		; SSC ACIA Command port
BRPORT	EQU	PORT+3		; SSC ACIA Control/Baudrate port
;
;======================================================================
;
; Initialize bios addresses for use by PEEK and POKE routines.
;
; The APRD and APWRT stuff is specific to the Apple ][ or //e with ALS
; CP/M Card.
;
;
ALSINIT:
	PUSH PSW ! PUSH B ! PUSH D ! PUSH H
	LHLD	0001H			; Point to WBOOT jump in bios jmp table
	LXI	D,3*20H			; Offset to APPLE READ bios jump
	DAD	D			; Add them
	SHLD APRD+1 ! SHLD APR+1	; Store locally
	INX H ! INX H ! INX H		; Bump hl to point to APPLE WRITE jump
	SHLD APWRT+1 ! SHLD APWR+1	; Store locally
	POP H ! POP D ! POP B ! POP PSW
	RET
;.....
;
; The following two  routines are specific to the Apple ][ or //e with ALS
; CP/M Card.  The routines respectively read from and write to modem hardware
; (Apple Super Serial Card ACIA registers) directly.
;
;.....
;
;
; Peek at 1 byte from Apple 6502 address space
;
;     ENTRY: HL = Address in Apple
;     EXIT:  A = Data
;
PEEK:	PUSH	D	; Preserve, then restore regs
	PUSH	B
APRD:	CALL	ALS1	; ALS1 overwrites its address here with that
	POP	B	;   of APPLE READ bios routine
	POP	D
	RET
;.....
;
;
; Poke 1 byte to Apple 6502 address space
;
;     ENTRY: HL = Address in Apple
;     EXIT:  A = Data
;
POKE:	PUSH	D
	PUSH	B
APWRT:	CALL	ALS2	; ALS2 overwrites its address here with that
	POP	B	;   of APPLE WRITE bios routine
	POP	D
	RET
;.....
;
;
; Either ALS1 or ALS2 -- only one of them -- gets called once to initialize
; local addresses for direct bios calls to Apple Read and Apple Write routines.
;
ALS1:	CALL	ALSINIT
APR:	CALL	0000	; Filled in by ALSINIT so we do the Apple Read that
	RET		; this particular call to PEEK was supposed to do

ALS2:	CALL	ALSINIT
APWR:	CALL	0000	; Filled in by ALSINIT so we do the Apple Write
	RET		; this call to POKE was supposed to do
;.....
;
;
; Read the baud rate port of the ACIA
;
RD$BRPORT:
	PUSH	H
	LXI	H,BRPORT
	CALL	PEEK
	POP	H
	RET
;.....
;
;
; Read the command port of ACIA
;
RD$CPORT:
	PUSH	H
	LXI	H,CPORT
	CALL	PEEK
	POP	H
	RET
;.....
;
;
; Read data port of ACIA
;
RD$PORT:
	PUSH	H
	LXI	H,PORT
	CALL	PEEK
	POP	H
	RET
;.....
;
;
; Read the status port of the ACIA
;
RD$STPORT:
	PUSH	H
	LXI	H,STPORT
	CALL	PEEK
	POP	H
	RET
;.....
;
;
; Write to the baud rate port of the ACIA
;
WR$BRPORT:
	PUSH	H
	LXI	H,BRPORT
	CALL	POKE
	POP	H
	RET
;.....
;
;
; Write to the command port of ACIA
;
WR$CPORT:
	PUSH	H
	LXI	H,CPORT
	CALL	POKE
	POP	H
	RET
;.....
;
;
; Write to the serial data port of the ACIA
;
WR$PORT:
	PUSH	H
	LXI	H,PORT
	CALL	POKE
	POP	H
	RET
;.....
;
;
;----------------------------------------------------------------------
;
;
; Check for a carrier, if none return with the zero flag set.
;
MDCARCK:
	CALL	RD$STPORT	; Get status
	ANI	40H		; Check DSR pin for DCD (see above)
	XRI	40H		; Reverse the zero flag (the 6551
	RET			; Has status 0 for DCD/DSR true)
;......
;
; This routine will turn off the serial card and hang up the phone.
;
MDINIT:
	MVI	A,4AH		; Turn off DTR
	CALL	WR$CPORT
	PUSH	B		; Save register
	MVI	B,20		; Delay 2 sec to drop carrier
;
OFFTI:	CALL	DELAY		; 1 sec per loop
	DCR	B
	JNZ	OFFTI		; Keep going until finished
	POP	B		; Restore register
	MVI	A,4BH		; Raise DTR and set parity
	CALL	WR$CPORT
	MVI	A,18H		; Set 1200, 8 bits, 1 stop
	CALL	WR$BRPORT
;
	  IF	IMODEM
	CALL	IMINIT
	  ENDIF			; IMODEM
;
	RET
;......
;
;
; Super Serial Card status checks.  NOT READY indication if bit 3 of STPORT
; byte equals zero (for receive-readiness check), or bit 4 equals 
; zero (for transmit-readiness check).
;......
;
; Check the status to see if a character is waiting to be received.
; Return with zero flag set, if not.  If yes, clear flag and return with
; 0FFH in A.
;
MDINST:	CALL	RD$STPORT	; Get modem status
	ANI	08H		; Is data available?
	RZ			; "no" returns zero as bit 3 (zero flag set)
	ORI	0FFH		; Otherwise return true with 0FFH in A
	RET
;.....
;
;
; Check if transmit register is empty.  If empty, ready to transmit another
; character and returns with zero flag clear.  If busy,  returns with zero
; flag set.
;
MDOUTST:
	CALL	RD$STPORT	; Get modem status
	ANI	10H		; Ready to transmit?
	RET			; "no" returns zero as bit 4 (zero flag set)
;.......
;
;
; Input a character from the modem port.
;
MDINP:	JMP	RD$PORT		; Get character
;......
;
;
; Output one character in register A.  Remember, that is register A, not C.
;
MDOUTP:	JMP	WR$PORT		; Send character
;.......
;
;
; Reinitialize the modem and hang up the phone by dropping DTR and
; leaving it inactive.
;
MDQUIT:
	 IF IMODEM		; If using a smart modem
	CALL	IMQUIT		; Tell it to shut down
	 ENDIF			; IMODEM
;				; Fall into MDSTOP
;
;
; Called by the main program after caller types BYE
;
MDSTOP:
	MVI	A,4AH		; Drop DTA
	JMP	WR$CPORT
;.....
;
;
; If you do not support a particular baud rate, put it here
; before SETINV:
;
;
SET2400:
	MVI	A,1AH
	JMP	WR$BRPORT
;.....
;
;
SET4800:
	MVI	A,1CH
	JMP	WR$BRPORT
;.....
;
;
SET9600:
	MVI	A,1EH
	JMP	WR$BRPORT
;.....
;
;
SETINV:	ORI	0FFH
	RET
;.....
;
;
SET300:	MVI	A,16H
	JMP	WR$BRPORT	; Go change the baud rate
;.....
;
;
SET1200:
	MVI	A,18H
	JMP	WR$BRPORT
;.....
;
;			end of insert
;-------------------------------------------------------------------
