home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 2
/
crawlyvol2.bin
/
program
/
c
/
bts314b4
/
driver.s
< prev
next >
Wrap
Text File
|
1994-01-05
|
12KB
|
567 lines
; History of DRIVER.S (BINKLEY.IO) (Please set tab=2!)
;
; Following versions (c) St.Slabihoud
;
; 0.9x - beta testversions
; 1.00 - first official driver (only for ST)
; 1.01 - some improvements
; 1.02 - more functions implemented
; 1.03 - TT and STE support
; 1.04 - Falcon support? Hope it works...
; 1.05 - Reading/Writing from/to SCCs with a little bus delay (nop)
; 1.06 - Fast-Sendbyte-Routines (by Uwe Zerbe) removed
; 1.07 - No Bcostat() in SENDBYTE/SENDCHARS any more
; 1.08 - Faster code
MC68000
MFPPORT1 EQU 0x00fffa01
MFPPORT2 EQU 0x00fffa81
SCCA_CNT EQU 0xFFFF8C81
SCCB_CNT EQU 0xFFFF8C85
; This code is called once to get the address of the jumptable.
; It is also allowed to print a small intro.
; Do not forget to save register A2 - PureC needs it!
start: movem.l d1-d7/a1-a6,-(sp)
pea init(pc)
move.w #9,-(sp)
trap #1
addq.w #6,sp
pea get_hardware(pc)
move.w #38,-(sp)
trap #14
addq.w #6,sp
tst.w d0
bne.s no_st
pea _st(pc)
bra.s jump
no_st: subq.w #1,d0
bne.s no_ste
pea _ste(pc)
bra.s jump
no_ste: subq.w #1,d0
bne.s no_tt
pea _tt(pc)
bra.s jump
no_tt: subq.w #1,d0
bne.s no_falcon
pea _falc(pc)
bra.s jump
no_falcon: pea _unkn(pc)
jump: move.w #9,-(sp)
trap #1
addq.w #6,sp
pea _end(pc)
move.w #9,-(sp)
trap #1
addq.w #6,sp
movem.l (sp)+,d1-d7/a1-a6
lea tabelle(pc),a0
move.l a0,d0
rts
get_hardware: move.l $5a0.w,a0
move.l a0,d0 * No Cookie-Jar found -> ST
beq.s ende
loop: cmp.l #'_MCH',(a0)
bne.s not_found
move.l 4(a0),d0
bra.s ende
not_found: addq.w #8,a0
move.l -8(a0),d0
bne.s loop
moveq #0,d0
ende: swap d0
lea HARDWARE(pc),a0
move.w d0,(a0)
rts
; Jumptable: Some functions are called in the SupervisorMode!
; 0 - get dcd status (<>0 : carrier detected)
; 4 - get cts status (<>0 : cts detected)
; 8 - send a byte to seriel port (d0.w : character)
; 12 - send chars to seriel port (a0.l : address, d0.l : number of bytes,
; d1.w : CD check)
; 16 - set defaultport, only called if TOS support Bconmap (d0.w : Port n)
; 20 - read a character from seriel port
; 24 - characters available from seriel port?
; 28 - possible to send a character?
; 32 - peek a byte from seriel buffer (do not read it)
; 36 - turn DTR on
; 40 - turn DTR off
; 44 - Nothing to send?
tabelle:
bra.w get_dcd * 0 Called in supervisor
bra.w get_cts * 4 " " "
bra.w sendbyte * 8
bra.w sendchars * 12
bra.w set_new_port * 16
bra.w modemin * 20
bra.w charavail * 24
bra.w outfull * 28
bra.w peekbyte * 32
bra.w dtr_on * 36 Called in supervisor
bra.w dtr_off * 40 " " "
bra.w outempty * 44
dc.l 0 * 48 reserved
dc.l 0 * 52 "
dc.l 0 * 56 "
dc.l 0 * 60 "
dc.l 0 * 64 "
dc.l 0 * 68 "
dc.l 0 * 72 "
dc.l 0 * 76 "
; Following variables are set by Binkley (Read-Only)
;
; VERSION is the external driver version!
; PORT is the portnumber set in BINKLEY.CFG with "Port".
; TT 1 = MFP (Modem-1)
; 2 = SCC-B (Modem-2)
; 3 = TTMFP (Serial-1) (not usable for Binkley)
; 4 = SCC-A (Serial-2)
; STE 1 = MFP (Modem-1)
; 2 = SCC-B (Serial-2)
; 3 = SCC-A (Modem-2)
; F030 2 = SCC-B (Serial)
; HARDCTS
; FALSE (0) Do not use HardCTS
; TRUE (1) Use HardCTS control
; TIME_RELEASE
; Address of "time_release"-function in BT.
; HARDWARE ("_MCH"-Cookie)
; 0 = ST,MEGA-ST
; 1 = STE,MEGA-STE
; 2 = TT
; 3 = Falcon
VERSION: dc.w 0x0108 * 80
PORT: dc.w 0 * 82 read-only
HARDCTS: dc.w 0 * 84 read-only
TIME_RELEASE: dc.l 0 * 86 read-only
HARDWARE: dc.w 0 * 90 read-only
init: dc.b 13,10
dc.b ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ',13,10
dc.b ' | External Binkley-Driver V1.08 | ',13,10
dc.b ' | (c) St.Slabihoud 1993,1994 | ',13,10
dc.b ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ',13,10,0
_st: dc.b ' | Binkley uses ST hardware | ',13,10,0
_ste: dc.b ' | Binkley uses STE hardware | ',13,10,0
_tt: dc.b ' | Binkley uses TT hardware | ',13,10,0
_falc:dc.b ' | Binkley uses Falcon hardware | ',13,10,0
_unkn:dc.b ' | Unknown hardware | ',13,10,0
_end: dc.b ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ',13,10,13,10,0
EVEN
; Get carrier detect signal
get_dcd:
move.w PORT(pc),d0
tst.w d0
beq.s dcd_mfpport1
subq.w #1,d0
beq.s dcd_mfpport1 * (Modem-1)
subq.w #1,d0
beq.s dcd_sccb_cnt * (Modem-2)
lea HARDWARE(pc),a0
cmp.w #1,(a0) * STE-Hardware?
beq.s dcd_ste
subq.w #1,d0
; beq.s dcd_mfpport2 * (Seriell-1) returns no CD
dcd_ste:
subq.w #1,d0
beq.s dcd_scca_cnt * (Seriell-2)
moveq.l #8,d0
rts
dcd_mfpport1:
moveq.l #0,d0
move.b MFPPORT1,d0 * ~dcd & 2
not.b d0
and.b #2,d0
rts
;dcd_mfpport2:
; moveq.l #0,d0
; move.b MFPPORT2,d0 * ~dcd & 2
; not.b d0
; and.b #2,d0
; rts
dcd_sccb_cnt:
moveq.l #0,d0
move.b #0,SCCB_CNT
nop
nop
move.b SCCB_CNT,d0 * dcd & 8
and.b #8,d0
rts
dcd_scca_cnt:
moveq.l #0,d0
move.b #0,SCCA_CNT
nop
nop
move.b SCCA_CNT,d0 * dcd & 8
and.b #8,d0
rts
; Get CTS signal
get_cts:
move.w PORT(pc),d0
tst.w d0
beq.s cts_mfpport1
subq.w #1,d0
beq.s cts_mfpport1
subq.w #1,d0
beq.s cts_sccb_cnt
lea HARDWARE(pc),a0
cmp.w #1,(a0) * STE-Hardware?
beq.s cts_ste
subq.w #1,d0
; beq.s cts_mfpport2 * (Seriell-1) returns no CTS
cts_ste:
subq.w #1,d0
beq.s cts_scca_cnt
moveq.l #8,d0
rts
cts_mfpport1:
moveq.l #0,d0
move.b MFPPORT1,d0 * ~cts & 4
not.b d0
and.b #4,d0
rts
;cts_mfpport2:
; moveq.l #0,d0
; move.b MFPPORT2,d0 * ~cts & 4
; not.b d0
; and.b #4,d0
; rts
cts_sccb_cnt:
moveq.l #0,d0
move.b #0,SCCB_CNT
nop
nop
move.b SCCB_CNT,d0 * cts & 0x20
and.b #0x20,d0
rts
cts_scca_cnt:
moveq.l #0,d0
move.b #0,SCCA_CNT
nop
nop
move.b SCCA_CNT,d0 * cts & 0x20
and.b #0x20,d0
rts
; ************************* SEND BYTE *****************************
; Send character to RS232
; Call with character in D0.w
sendbyte:
pea (a2)
move.w d0,-(a7)
move.w HARDCTS(pc),d0
beq.s senddirect
pea h_cts(pc) ; HardCTS
move.w #$26,-(a7)
trap #14
addq.w #6,a7
senddirect:
pea $00030001
trap #13 ; Bconout
addq.w #6,a7
move.l (a7)+,a2
rts
; ************************* SEND CHARS ****************************
; Calling with Buffer in A0.l
; Bytes in D0.l
; CD-Check in D1 (0=FALSE,1=TRUE)
sendchars:
movem.l d6/d7/a2/a6,-(a7)
move.l a0,a6 ; Buffer
move.l d0,d6 ; Counter
move.w d1,d7 ; CD check
bra.s endloop
sendloop:
moveq #0,d0
move.b (a6)+,d0
move.w d0,-(a7) ; push SendByte
move.w HARDCTS(pc),d0
beq.s senddirect2
pea h_cts(pc) ; HardCTS
move.w #$26,-(a7)
trap #14
addq.w #6,a7
senddirect2:
pea $00030001
trap #13 ; Bconout
addq.w #6,a7 ; pop D0!
; tst.w d7 ; check CD ==> Can be ignored! <==
; beq.s endloop ; No
; pea get_dcd(pc) ; check CD
; move.w #$26,-(a7)
; trap #14
; addq.w #6,a7
; tst.w d0
; beq.s carrierlost ; Carrier lost
endloop:
subq.l #1,d6
bpl.s sendloop
carrierlost:
movem.l (a7)+,d6/d7/a2/a6
rts
h_cts:
move.w d3,-(a7) ; HardCTS-Function
move.b d0,d3
move.w HARDCTS(pc),d1
beq.b h_ctsend ; No HardCTS --> Exit
bra.b h_cts1
h_cts2:
pea (a2)
move.w #11,-(sp) ; Cconis
trap #1
addq.w #2,sp
move.l (sp)+,a2
tst.w d0
bne.b h_ctsend
move.l TIME_RELEASE(pc),a0
jsr (a0)
h_cts1:
bsr get_cts
tst.w d0
beq.b h_cts2
h_ctsend:
move.b d3,d0
move.w (a7)+,d3
rts
; Calling with portnumber in D0.w ("Port n")
; This function is only called, when your TOS supports "Bconmap".
set_new_port:
subq.w #1,d0 * 1=ST-Port
beq.s port6
subq.w #1,d0 * 2=SCC-B
beq.s port7
subq.w #1,d0 * 3=TTMFP, 3=SCC-A on a STE!
beq.s port8
subq.w #1,d0 * 4=SCC-A
beq.s port9
rts * Unknown port
port6:
moveq #6,d0
bra.s set_it
port7:
moveq #7,d0
bra.s set_it
port8:
moveq #8,d0
bra.s set_it
port9:
moveq #9,d0
set_it:
pea (a2)
move.w d0,-(sp)
move.w #44,-(sp)
trap #14
addq.w #4,sp
move.l (sp)+,a2
rts
; Read a character
; Returns value in D0.w
modemin:
pea (a2)
pea $00020001
trap #13
addq.w #4,sp
move.l (sp)+,a2
and.l #$ff,d0
rts
; If a character available?
charavail:
pea (a2)
pea $00010001
trap #13
addq.w #4,sp
move.l (sp)+,a2
rts
outfull:
pea (a2)
pea $00080001
trap #13
addq.w #4,sp
move.l (sp)+,a2
not.l d0
rts
; Return the next character in the RS232 input buffer
; but don't actually take it.
; Return -1 if buffer was empty
peekbyte:
pea (a2)
clr.w -(sp)
move.w #14,-(sp)
trap #14
addq.w #4,sp
move.l (sp)+,a2
move.l d0,a0
move.w 6(a0),d0
cmp.w 8(a0),d0
bne.s peek2
moveq #-1,d0
rts
peek2:
move.w 6(a0),d0
addq.w #1,d0
cmp.w 4(a0),d0
blo.s peek3
clr.w d0
peek3:
move.l (a0),a0
move.b (a0,d0.w),d0
and.w #255,d0
rts
outempty:
pea (a2)
clr.w -(sp)
move.w #14,-(sp)
trap #14
addq.w #4,sp
move.l (sp)+,a2
move.l d0,a0
lea $e(a0),a0
move.w 6(a0),d0
cmp.w 8(a0),d0
beq.s outempty1
moveq #0,d0
rts
outempty1:
moveq #1,d0
rts
; Set DTR on
dtr_on:
move.w PORT(pc),d0
tst.w d0
beq.s on_mfpport1
subq.w #1,d0
beq.s on_mfpport1
subq.w #1,d0
beq.s on_sccb_cnt
lea HARDWARE(pc),a0
cmp.w #1,(a0) * STE-Hardware?
beq.s on_ste
subq.w #1,d0
; beq.s on_mfpport2
on_ste:
subq.w #1,d0
beq.s on_scca_cnt
rts
on_mfpport1:
pea (a2)
move.w #0xe7,-(sp)
move.w #29,-(sp)
trap #14
addq.w #4,sp
move.l (sp)+,a2
rts
;on_mfpport2:
; rts
on_sccb_cnt:
move.b #5,SCCB_CNT
nop
nop
move.b #$ea,SCCB_CNT
rts
on_scca_cnt:
move.b #5,SCCA_CNT
nop
nop
move.b #$ea,SCCA_CNT
rts
dtr_off:
move.w PORT(pc),d0
tst.w d0
beq.s off_mfpport1
subq.w #1,d0
beq.s off_mfpport1
subq.w #1,d0
beq.s off_sccb_cnt
lea HARDWARE(pc),a0
cmp.w #1,(a0) * STE-Hardware?
beq.s off_ste
subq.w #1,d0
; beq.s off_mfpport2
off_ste:
subq.w #1,d0
beq.s off_scca_cnt
rts
off_mfpport1:
pea (a2)
move.w #0x18,-(sp)
move.w #30,-(sp)
trap #14
addq.w #4,sp
move.l (sp)+,a2
rts
;off_mfpport2:
; rts
off_sccb_cnt:
move.b #5,SCCB_CNT
nop
nop
move.b #$6a,SCCB_CNT
rts
off_scca_cnt:
move.b #5,SCCA_CNT
nop
nop
move.b #$6a,SCCA_CNT
rts