mirror of
https://github.com/callapple/LLUCE.git
synced 2024-06-20 15:29:29 +00:00
371 lines
10 KiB
ArmAsm
371 lines
10 KiB
ArmAsm
LST RTN
|
|
TTL 'LLUCE - HST GS Port Driver'
|
|
PAG
|
|
*-------------------------------
|
|
* GS Port Driver Bios
|
|
* Written By Andy Nicholas On July 26, 1987
|
|
*
|
|
* Special Version For The USR HST & 19200 Baud
|
|
*-------------------------------
|
|
* Jump Table
|
|
*-------------------------------
|
|
|
|
MODEMDVR = *
|
|
SLOT DB MSLOT*16 ; Serial Card Slot
|
|
MDMSPEED = *
|
|
INITSPD DB 0 ; Initialize Speed
|
|
CALLSPD DB 0 ; Speed Of Call
|
|
|
|
BYTCNT DB 0,0,0
|
|
|
|
MDMINIT BRL INIT
|
|
MDMRSET BRL RINGSET
|
|
MDMRING BRL RING
|
|
MDMANS BRL ANSWER
|
|
MDMHANG BRL HANGUP
|
|
MDMIN BRL INP
|
|
MDMOUT BRL OUT
|
|
MDMDCD BRL M_CHKDCD
|
|
MDMSSPD BRL SETSPD
|
|
MDMINT BRL M_IRQ
|
|
MDMDTR BRL RAISEDTR ; Raise Dtr
|
|
MDMCBUF BRL M_IRQ
|
|
MDMQUIT BRL M_IRQ
|
|
|
|
DOINIT JMP MSLOT*256+$C000
|
|
DOREAD JMP MSLOT*256+$C000
|
|
DOWRITE JMP MSLOT*256+$C000
|
|
DOSTATUS JMP MSLOT*256+$C000
|
|
DOEXT JMP MSLOT*256+$C000
|
|
|
|
* Init The Serial Port Pascal Locations
|
|
*-------------------------------
|
|
|
|
INIT LDA MSLOT*256+$C00D ; Get Init Address
|
|
STA DOINIT+1
|
|
LDA MSLOT*256+$C00E ; Get Read Address
|
|
STA DOREAD+1
|
|
LDA MSLOT*256+$C00F ; Get Write Address
|
|
STA DOWRITE+1
|
|
LDA MSLOT*256+$C010 ; Get Status Address
|
|
STA DOSTATUS+1
|
|
LDA MSLOT*256+$C012
|
|
STA DOEXT+1
|
|
M_IRQ CLC
|
|
RTS
|
|
|
|
* Setup For Call
|
|
*-------------------------------
|
|
|
|
RINGSET JSR HANGUP
|
|
LDA #0 ; Let Modem Reset
|
|
JSR M_WAIT
|
|
JSR M_WAIT
|
|
LDA #0
|
|
JSR GSDTR
|
|
JSR SETSPD
|
|
LDA #0 ; Slight Delay (Let Modem Do Init)
|
|
JSR M_WAIT
|
|
LDX #-1
|
|
:RSET2 INX ; Do Pre-Inc
|
|
LDA INITSTR,X ; Get Modem Init String
|
|
BEQ :RSET3 ; We Are Done
|
|
|
|
JSR OUT ; Output
|
|
BRA :RSET2 ; Loop (Z-Bit Set After Wait)
|
|
|
|
:RSET3 LDY #250 ; Check 50 Times
|
|
:RSET4 DEY COUNT ; Down
|
|
BEQ RINGSET
|
|
|
|
LDA #30 ; Delay Slightly
|
|
JSR M_WAIT
|
|
JSR INP
|
|
BCC :RSET4
|
|
|
|
AND #Clrhi
|
|
CMP #'K' ; Check For "OK"
|
|
BNE :RSET4
|
|
|
|
CLC
|
|
RTS ; Return
|
|
|
|
* Scan For Ring And Handle It
|
|
*-------------------------------
|
|
|
|
RING JSR INP ; Check For A Char
|
|
BCC :RING5 ; Nope...
|
|
|
|
AND #Clrhi ; Strip High
|
|
CMP #'E'
|
|
CLC
|
|
BNE :RING5 ; Keep Checking
|
|
|
|
:RING2 JSR INP ; Check For Char
|
|
BCC :RING2
|
|
|
|
LDY #0 ; Def = 300 Baud
|
|
AND #Clrhi ; Strip High
|
|
CMP #'R' ; Oops, "No Carrier" Message
|
|
BEQ RINGSET
|
|
|
|
CMP #Cr ; Connect 300
|
|
BEQ :RING3
|
|
|
|
CMP #'3' ; Connect 300
|
|
BEQ :RING3
|
|
|
|
INY
|
|
CMP #'1' ; Connect 1200
|
|
BEQ :RING3
|
|
|
|
INY
|
|
CMP #'2' ; Connect 2400
|
|
BEQ :RING3
|
|
|
|
INY
|
|
CMP #'4' ; Connect 4800
|
|
BEQ :RING3
|
|
|
|
INY
|
|
CMP #'9' ; Connect 9600
|
|
BNE :RING2
|
|
|
|
:RING3 JSR SETBYTE ; Set The Correct Speed Byte
|
|
LDY #5
|
|
:RING4 LDA #0 ; Let Carrier's Settle
|
|
JSR M_WAIT
|
|
DEY
|
|
BNE :RING4
|
|
|
|
SEC ; We Have A Connection!
|
|
:RING5 RTS
|
|
|
|
* Input Data
|
|
*-------------------------------
|
|
|
|
INP PHX ; Save X
|
|
PHY
|
|
LDX #MSLOT+$C0 ; Are We Ready?
|
|
LDY #MSLOT*16
|
|
LDA #RXREADY
|
|
JSR DOSTATUS
|
|
BCC :INP2 ; Nope, Exit
|
|
|
|
LDX #MSLOT+$C0 ; Yes, Read
|
|
LDY #MSLOT*16
|
|
JSR DOREAD
|
|
SEC
|
|
:INP1 PLY
|
|
PLX ; Restore & Return
|
|
RTS
|
|
|
|
:INP2 LDA #0
|
|
BEQ :INP1
|
|
|
|
* Output Data
|
|
*-------------------------------
|
|
|
|
OUT PHX ; Save X
|
|
PHY ; Save Y
|
|
PHA ; Save A
|
|
:OUT2 LDX #MSLOT+$C0 ; Ready For Send?
|
|
LDY #MSLOT*16
|
|
LDA #TXREADY
|
|
JSR DOSTATUS
|
|
BCC :OUT2 ; Nope
|
|
|
|
PLA ; Get A
|
|
LDX #MSLOT+$C0
|
|
LDY #MSLOT*16
|
|
JSR DOWRITE ; Send It
|
|
PLY ; Get Y
|
|
PLX ; Get X
|
|
RTS
|
|
|
|
* Check For Carrier Using Get_Port_Stat Routine
|
|
*-------------------------------
|
|
|
|
M_CHKDCD PHX
|
|
PHY
|
|
LDA #<CARRLST
|
|
LDX #>CARRLST
|
|
LDY #0
|
|
JSR DOEXT
|
|
CLC
|
|
LDA CARRBITS
|
|
AND CDBYTE
|
|
BEQ :NOCARR
|
|
|
|
SEC
|
|
:NOCARR PLY
|
|
PLX
|
|
RTS
|
|
|
|
* Send Ata To Phone
|
|
*-------------------------------
|
|
|
|
ANSWER LDX #-1
|
|
:ANSWER2 INX
|
|
LDA ANSSTR,X ; Get Text
|
|
BEQ :ANSWER3 ; We Are Done
|
|
|
|
JSR OUT ; Send It
|
|
BRA :ANSWER2
|
|
|
|
:ANSWER3 RTS
|
|
|
|
* Set DTR On GS Serial Port, And Hangup If Needed
|
|
*-------------------------------
|
|
|
|
HANGUP LDA #$80 ; Blow 'em Off (Hangup)
|
|
GSDTR STA DTRFLAG
|
|
LDA #<DTRLST
|
|
LDX #>DTRLST
|
|
LDY #0
|
|
BRL DOEXT
|
|
|
|
* Wait Routine
|
|
*-------------------------------
|
|
|
|
M_WAIT SEC ; From Apple ][+ Ref Man - Pg 147
|
|
:WAIT2 PHA
|
|
:WAIT3 SBC #1
|
|
BNE :WAIT3
|
|
|
|
PLA
|
|
SBC #1
|
|
BNE :WAIT2
|
|
|
|
RTS
|
|
|
|
* Set The Rs-232 Speed [Speed Offset In Y]
|
|
*
|
|
* 0 = 300 Baud
|
|
* 1 = 1200 Baud
|
|
* 2 = 2400 Baud
|
|
* 3 = 4800 Baud
|
|
* 4 = 9600 Baud
|
|
*-------------------------------
|
|
|
|
SETBYTE LDA #1 ; Find Caller Speed (X300)
|
|
STA CALLSPD
|
|
CPY #0 ; At 300?
|
|
BEQ :DONE ; Yep
|
|
|
|
ASL CALLSPD ; Speed = Speed * 2
|
|
:SETSPD2 ASL CALLSPD ; Speed = Speed * 2
|
|
DEY
|
|
BNE :SETSPD2 ; Loop Until Correct Speed Found
|
|
|
|
:DONE RTS
|
|
|
|
* Reinit The Port For 19200 Baud
|
|
*-------------------------------
|
|
|
|
SETSPD PHX
|
|
PHY
|
|
LDX #MSLOT+$C0
|
|
LDY #MSLOT*16
|
|
JSR DOINIT
|
|
LDX #0
|
|
:SPD2 LDA B19200,X
|
|
BEQ :FINISH
|
|
|
|
JSR OUT
|
|
INX
|
|
BRA :SPD2
|
|
|
|
:FINISH LDX #0
|
|
:SPD3 LDA PORTINIT,X
|
|
BEQ :DONE
|
|
|
|
JSR OUT
|
|
INX
|
|
BRA :SPD3
|
|
|
|
:DONE LDA #<OUTBUF
|
|
LDX #>OUTBUF
|
|
LDY #0
|
|
JSR DOEXT
|
|
PLY
|
|
PLX
|
|
RTS
|
|
|
|
* Raise Dtr
|
|
*-------------------------------
|
|
|
|
RAISEDTR PHX
|
|
PHY
|
|
LDA #0
|
|
JSR GSDTR
|
|
PLY
|
|
PLX
|
|
RTS
|
|
|
|
* Global Data Area
|
|
*-------------------------------
|
|
|
|
B19200 DB 1
|
|
ASC '15B'00 ; Accept 19200 Baud
|
|
|
|
PORTINIT DB 1
|
|
ASC '0D' ; 8 Bits
|
|
DB 1
|
|
ASC '2P' ; No Parity
|
|
DB 1
|
|
ASC 'AD' ; Auto-Tabbing
|
|
DB 1
|
|
ASC 'XD' ; No Xoff Recognition
|
|
DB 1
|
|
ASC 'FD' ; No Find Keyboard
|
|
DB 1
|
|
ASC 'CD' ; No Column Overflow
|
|
DB 1
|
|
ASC 'ED' ; Echo Disabled
|
|
DB 1
|
|
ASC 'MD' ; No Lf Masking
|
|
DB 1
|
|
ASC 'BE' ; Buffering Enabled
|
|
DB 1
|
|
ASC 'Z'
|
|
DB 0 ; No More Control Characters
|
|
|
|
*-------------------------------
|
|
|
|
OUTBUF DB 4 ; Parameters To Set The
|
|
DB SetOutBuffer ; Output Buffer
|
|
DA 0
|
|
ADRL BUFFER ; Buffer It Where
|
|
DA 2 ; Buffer 2 Bytes
|
|
|
|
*-------------------------------
|
|
|
|
CARRLST DB 3 ; Parameter List For
|
|
DB GetPortStat ; Detecting Carrier Drop
|
|
DA 0
|
|
CARRBITS DA 0 ; Carrier Status Here
|
|
|
|
*-------------------------------
|
|
|
|
DTRLST DB 3 ; Parameter List For
|
|
DB SetDTR ; Setting DTR
|
|
DA 0
|
|
DTRFLAG DA 0 ; Bit 7 Affects DTR
|
|
|
|
ASC 'GSPort/HST'
|
|
|
|
DS $3B0-*+MODEMDVR
|
|
|
|
BUFFER DS 15
|
|
|
|
CDBYTE DB DSRSTATE ; Mask Dsr Only (0=Connected)
|
|
|
|
ANSSTR ASC 'ATA'0D00
|
|
DS $10-*+ANSSTR ; DON'T TOUCH
|
|
|
|
INITSTR ASC 'ATS0=1S2=128&S1&D2V1'0D00
|
|
DS $30-*+INITSTR ; DON'T TOUCH
|
|
LST OFF
|
|
|