home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
appleii
/
appacc.m65
< prev
next >
Wrap
Text File
|
2020-01-01
|
9KB
|
349 lines
;*BM
; $Header: appacc.m65,v 1.8 88/12/22 09:17:48 medin Locked $
;********************************
;* *
;* APPLE COMMUNICATIONS CARD *
;* DRIVER FOR KERMIT 3 *
;* *
;* VERSION MODIFICATIONS BY *
;* I. CHUANG *
;* *
;* LAST DATE: 29/JULY/86 *
;* *
;$Log: appacc.m65,v $
;Revision 1.8 88/12/22 09:17:48 medin
; Use the time count for the wait routine
;Revision 1.7 88/03/28 13:24:16 medin
; Correct bug in flow control.
;Revision 1.6 88/01/15 08:42:57 medin
;New origin for 3.81
;Revision 1.5 87/06/29 10:47:49 medin
; Change wait rtn to use apple rom wait, change org for 3.78.
;Revision 1.4 87/05/13 18:08:21 medin
; Change org to correspond with 3.76
;Revision 1.3 87/02/20 23:50:42 medin
; Put version in the hearld so we can keep track of the com drivers
;also. Thanks Rhoda.
;DONT FORGET TO UPDATE THE VERSION
;Revision 1.2 86/12/22 10:49:26 medin
; New initialization from Ike. The acc now initializes itself internally
;and doesnt require the "IN#?" to start the card up. Thanks to Ike for the
;latest and for Rhoda for testing it.
;Revision 1.1 86/10/28 10:35:15 medin
;Initial revision
;********************************
ORG $1003 ; START DEFINITIONS AT $1003
;* VECTOR FOR COM CARDS STARTS HERE
;* LOCATION $1003 FOR DATA
;* LOCATION $1020 FOR ROUTINE JUMPS
;* LOCATION $1040 FOR MAIN ROUTINES
SSCDBD .blkb 1 ;CONT BAUD INDEX(ALA SUPER SERIAL CARD) USED BY
;* INIT
;* 6 - 300 BAUD
;* 7 - 600
;* ECT.
.blkb 1
CRDNAM .word HERLD
KERSLI .blkb 1 ; COM SLOT $N0
KERINS .blkb 1 ; FORCE INITIALIZATION FLAG-WHEN 0
ENDKER .blkb 2 ; ADDRESS OF END OF MAIN KERMIT
FLOWFG .blkb 1 ;FLOW CTRL (XON/OFF) FLG TRUE WHEN HI BIT SET
tl0end .word endcom ;[1.6] end of this routine
timect .blkb 1 ;[1.8] 1 ms delay via rom wait rtn
ORG SSCDBD+29 ;FUTURE EXPANSION
JMP TL2INT ; INITIALIZE COM CARD
JMP TL2CMD ; COMMAND FOR ACIA IN A
;* 0 - HANG UP
;* $0B - SET BAUD
;* $0C - SET BREAK ON THE LINE
;* $91 - XON
;* $93 - XOFF
;* ROUTINE WILL RETURN FALSE(0) IF UNABLE
JMP TL2CP ; CHECK FOR INPUT CH READY-0 FALSE
JMP TL2GPC ; GET INPUT CH
JMP TL2PPC ; PUT OUTPUT CHARACTER
JMP TL2EXI ; RESET CARD AND RESTORE INITIALIZED
ORG SSCDBD+29+32 ; FUTURES
;[1.5]WAIT .blkb 3 ; WAIT ROUTINE-A REG CONTAINS MILLISECONDS
WAIT .blkb 3 ; WAIT ROUTINE-apple rom rtn 220=125ms,198=100ms,25=2ms ...
PRSTR .blkb 3 ; PRINT STRING-X=LSB,Y=MSB OF NULL TERMINATED STRING
URDKEY .blkb 3 ; READ KEYBOARD
PRCRLF .blkb 3 ; PRINT CR AND LF
TELCNC .blkb 3 ;CHECK FOR KEYBOARD CHARACTER
TELSPA .blkb 3 ;SET CHARACTER PARITY
;********************************
;* MAIN CODE STARTS HERE
ORG $7f00 ;[1.9]
START = *
CR = $D ; <CR>
APINC1 = $3 ; FIRST INIT CHAR FOR 6850 ACIA
APINC2 = $11 ; SECOND INIT (8-BITS)
HCTRLQ = $91 ;^Q WITH HIGH BIT SET
HCTRLS = $93 ;^S "
HCTRLZ = $9A ;^Z "
CTRLQ = $11 ; ^Q
CTRLS = $13 ; ^S
CSWL = $36
CSWH = $37
INITKR0 = $15
MSTRINI = $03 ; initialize the acia control register
IRQL = $3FE
IRQH = $3FF
RDKEY = $FD0C ; READ A CH FROM CURRENT INPUT DEVICE
COUT = $FDED ; PRINT A CH TO CURRENT OUTPUT DEVICE
SETIO2 = $FE93 ; PLACE FOR PR#0
KR0PCH = $C08F ; BASE FOR PORT CHAR LOCATION
KR0PST = $C08E ; BASE FOR PORT STROBE LOCATIONS
KBD = $C000 ; KEYBOARD CHARACTER INPUT LOCATION
TEMP .byte 00 ; WORK SPACE FOR DIAL
PINPTR .byte 00 ; INPUT BUFFER POINTER
INPTR .byte 00 ; INPUT BUFFER POINTER FOR GET
POUTPT .byte 00 ; OUTPUT BUFFER POINTER
OUTPTR .byte 00 ; " " " FOR PUT
KSLI .byte 00 ; COM SLOT $0N
DCH:CR .byte 00 ; SAVE AREA FOR CONTROL REGISTER
kwrk01 .byte 1 ;[1.8]
;********************************
;* NOW THE ASCII MESSAGES
HERLD nasc <APPLE COMM CARD V1.9> 1
BAD nasc <*****ERROR***** COM ROUTINES ASSEMBLED TOO LOW IN MEMORY> 1
DIALM2 nasc <AWAITING CARRIER....(ANY KEY ABORTS)> 1
DIALM3 nasc <CONNECTED.> 1
;********************************
;* MAIN INIT: CHECK LOAD LOC OK
TL2INT LDA #START^
CMP ENDKER+1 ;ARE WE LOADED ABOVE MAIN
BEQ DONTNO ;CANT TELL YET
BCC TRBLE ;YES WE ARE IN TROUBLE
BCS SETNM ;OK
DONTNO LDA #START\ ;WELL LETS CHECK 16 BITS
CMP ENDKER
BEQ SETNM ;WHEE JUST EXACTLY RIGHT
BCS SETNM ;OK
TRBLE LDX #BAD\ ;GOT TO TELL SOMEONE
LDY #BAD^
JSR PRSTR ;PRINT THE MESSAGE
JSR PRCRLF ;AND TERMINATE IT PROPERLY
JMP $3D0
;********************************
;* SET THE INTERRUPT VECTOR
SETNM LDA #IRQHND
STA IRQL
LDA #IRQHND^
STA IRQH
lda KERSLI ; CALCULATE $0N FROM $N0
LSR A
LSR A
LSR A
LSR A
STA KSLI ; NOW WE HAVE $0SLOT
; TAX ; slot index to x reg
ldx KERSLI ; get proper slot format
LDA #MSTRINI ; load the new master init code
STA KR0PST,X ; send it
LDA #INITKR0 ; get the operating code
STA KR0PST,X ; send it
;********************************
;* CHECK FOR CARRIER
LDX KERSLI ; GET DEVICE SLOT
LDA KR0PCH,X ; ACCESS DATA
LDA KR0PST,X ; NOW FOR THE STATUS
AND #4 ; DO WE HAVE A CARRIER?
BNE DOINIT ; YES,CARRY ON
LDA #INITKR0
STA DCH:CR
STA KR0PST,X
LDA #1 ; GIVE TRUE RETURN
RTS ; ONLY WAY TO REACH THIS
;********************************
;* NO CARRIER FOUND, SO DO INIT
DOINIT LDX #DIALM2\ ; NOW FOR THE WAITING MSG
LDY #DIALM2^
JSR PRSTR ; PRINT IT
LDX KERSLI ; THE SLOT AGAIN
LDY KSLI ; SLOT*16
LDA #INITKR0
STA DCH:CR
STA KR0PST,X
TLINI8 BIT KBD ; DO WE HAVE A CH FROM THE KEYBOARD
BPL TLINI7 ; NO, TRY FOR CARRIER
JSR RDKEY ; LETS DO THIS RIGHT
LDA #0 ; GIVE A FALSE RETURN (0)
RTS ;GIVE A FALSE RETURN (0)
TLINI7 LDA KR0PCH,X ; THE DATA
LDA KR0PST,X ; AND NOW THE STATUS
AND #4 ; CARRIER?
BNE TLINI8 ; NOT YET TRY AGAIN
JSR PRCRLF ;
LDX #DIALM3\ ; TELL WE GOT CARRIER
LDY #DIALM3^
JSR PRSTR ;
JSR PRCRLF ;
LDA #0 ;START THE BUFFER AT 0
STA PINPTR
STA INPTR
STA POUTPT ; "
STA OUTPTR ; "
LDA #1 ; GIVE A TRUE RETURN (NON 0)
RTS ; FINALLY
TL2CP
LDX KERSLI ; OFFSET INTO I/O LOCATIONS
TL0CP1 LDA KR0PST,X ; TRY FOR A CHARACTER
AND #$01 ; CHECK FOR RECEIVE REGISTER FULL
BEQ TL0CP7
LDA KR0PCH,X ; GET CH
LDY PINPTR ; GET PLACE TO STORE
STA INBUF,Y ; IN BUF
INC PINPTR ; READY FOR NEXT
BIT FLOWFG ; HOW ABOUT FLOW CONTROL
BPL TL0CP7 ; NO
LDA INBUF,Y ; GET INPUT CH
AND #$7F ; DROP PARITY ETC
; BVC TL2CP4 ; YES,HOW ABOUT ^S RECEIVED?, NO
CMP #CTRLQ ; IS THIS CONTINUE(START UP OUTPUTING)
BNE TL2CP4 ; NO, CHECK FOR ^S
LDA FLOWFG ; TATTLE ABOUT THE CONTINUE
AND #$BF ;
STA FLOWFG ;
DEC PINPTR ; FORGET ABOUT THIS CHARACTER
TL2CP2 LDY OUTPTR ; SEE IF ANY TO OUTPUT
CPY POUTPT ; WELL?
BEQ TL0CP7 ; NO MORE WE HAVE PUT ALL
TL2CP3 LDA KR0PST,X ; CHECK STATUS FOR OUTPUT
AND #$10 ; READY?
BEQ TL2CP3 ; NO, SPIN
LDA OUTBUF,Y ; OUTPUT CH
STA KR0PCH,X ; BYE
INC OUTPTR ; READY FOR NEXT
JMP TL2CP2 ;
TL2CP4 CMP #CTRLS ; IS THIS STOP?
BNE TL0CP7 ; NO
LDA #$40 ; YES, TATTLE
ORA FLOWFG ;
STA FLOWFG ; NOW EVERYONE KNOWS
DEC PINPTR ; FORGET ABOUT THE ^S CHARACTER
TL0CP7
LDA PINPTR
CMP INPTR
;*; NO CHARACTER, RETURN FALSE(ZERO)
;*; SUCCESSFUL RETURN, RETURN TRUE(NON 0)
RTS ; ..
TL2GPC
LDX INPTR ;GET WHERE THE CH IS
LDA INBUF,X ;GET CH
INC INPTR
TL0RTC RTS ; AND RETURN
TL2PPC
PHA ; HOLD THE BYTE TO SEND
LDX KERSLI ; GET I/O LOCATION OFFSET
TL0PP1 LDA KR0PST,X ; GET THE STATUS BYTE
AND #$02 ; ISOLATE THE FLAG WE WANT (TRE)
BEQ TL0PP2 ; TRANSMIT REGISTER IS NOT EMPTY, TRY AGAIN
BIT FLOWFG ; FLOW CONTROL?
BPL TL2PP0 ; NO
BVC TL2PP0 ; SHOULD WE STOP OUTPUTING?,NO
LDY POUTPT ; YES, SAVE THIS CH IN BUFFER
PLA
STA OUTBUF,Y ;
INC POUTPT ; TELL HOW MANY
RTS ; THATS ALL
TL2PP0 ;
PLA ; FETCH THE DATA BYTE OFF THE STACK
STA KR0PCH,X ; STUFF IT AT THE PROPER LOC TO SEND IT
RTS ; AND RETURN
TL0PP2 JSR TL0CP1 ;GO CHECK FOR AN INPUT CH
JMP TL0PP1 ;TRY OUTPUT AGAIN
TL2EXI
EXIT9 RTS
TL2CMD ;FIND OUT WHAT COMMAND
BEQ TL0DRP ;ITS D
CMP #$0C
BEQ BREAK
CMP #$B
BEQ TL2RTS
CMP #HCTRLQ
BEQ TL2SAC
CMP #HCTRLS
BEQ TL2SAC
TL2FLS LDA #0
TL2RTS RTS
TL2SAC ;[1.7] LDA FLOWFG ; DO WE HAVE FLOW CONTROL?
;[1.7] BPL TL2FLS ; NO RETURN FALSE
AND #$7F
JSR TELSPA ; SET PARITY
JSR TL2PPC ; OUTPUT CHAR
LDA #1
RTS ; TRUE RETURN
TL0DRP LDX KERSLI
;*STA KR0PCC,X ; SHUT IT DOWN
LDA #1
RTS
BREAK LDY KERSLI ; GET SLOT*16
LDA DCH:CR ; GET SAVED CTRL REG
ORA #$60 ; SET BREAK FLAG
STA KR0PST,Y
;[1.5] LDA #233 ; WAIT FOR 233 MS
;[1.8] lda #220 ;[1.5] wait 125 ms
lda #233 ;[1.8] wait 233 ms
sta kwrk01 ;[1.8]
break3 lda timect ;[1.8] 1 ms at a time
JSR WAIT
dec kwrk01 ;[1.8]
bne break3 ;[1.8]
;[1.8] lda #206 ;[1.5] wait 108 ms for a total of 233ms
;[1.8] jsr WAIT ;[1.5]
LDA DCH:CR ; GET SAVED CTRL REG AGAIN
AND #$9F
LDY KERSLI
STA KR0PST,Y ; STOP BREAK SIGNAL
RTS
;********************************
;* IRQ HANDLER
IRQHND LDA $45
RTI
;********************************
;* BUFFERS
INBUF .blkb 256 ; INPUT BUFFER
OUTBUF .blkb 256 ; OUTPUT BUFFER
endcom ;[1.6]