;---------------------------------------------------------------------
;    **   **   **  ***   ***   ****     **    ***  **  ****
;   ****  *** *** ** ** **     ** **   ****  **    ** **  **
;  **  ** ** * ** ** **  ***   *****  **  **  ***  ** **
;  ****** **   ** ** **    **  **  ** ******    ** ** **
;  **  ** **   ** ** ** *  **  **  ** **  ** *  ** ** **  **
;  **  ** **   **  ***   ***   *****  **  **  ***  **  ****
;---------------------------------------------------------------------
; Serial extension source code, V1.1
; By François Lionet
; AMOS and AMOS Compiler (c) Europress Software 1991
; To be used with AMOS1.3 and over
;--------------------------------------------------------------------- 
; This file is public domain
;---------------------------------------------------------------------
;
; Please refer to the _Music.s file for more informations...
;
;---------------------------------------------------------------------

		XREF		_LVOOpenDevice
		XREF		_LVOCloseDevice
		XREF		_LVOCheckIO
		XREF		_LVOWaitIO
		XREF		_LVOAbortIO
		XREF		_LVOSendIO
		XREF		_LVODoIO

* AMIGA's includes
		INCDIR		":Includes/I/"
		INCLUDE		"Exec/Types.I"
		INCLUDE		"Exec/Exec.I"
		INCLUDE 	"Devices/Serial.I"

*************** AMOS includes
ExtNb		equ	6-1

		INCDIR		":AMOS1.3/Comp/"
 		Include	"_Equ.s"
		RsSet	DataLong
		Include "_Pointe.s"
		Include	"_WEqu.s"
		Include "_CEqu.s"
		Include	"_LEqu.s"

Dlea		MACRO
		move.l	ExtAdr+ExtNb*16(a5),\2
		add.w	#\1-DT,\2
		ENDM
Dload		MACRO
		move.l	ExtAdr+ExtNb*16(a5),\1
		ENDM

* Number of serial channels allowed
NSerial		equ	4

******************************************************************
*	Header
Start	dc.l	C_Tk-C_Off
	dc.l	C_Lib-C_Tk
	dc.l	C_Title-C_Lib
	dc.l	C_End-C_Title
	dc.w	0	

******************************************************************
*	Offsets to library
C_Off   dc.w (L1-L0)/2,(L2-L1)/2,(L3-L2)/2,(L4-L3)/2
        dc.w (L5-L4)/2,(L6-L5)/2,(L7-L6)/2,(L8-L7)/2
        dc.w (L9-L8)/2,(L10-L9)/2,(L11-L10)/2,(L12-L11)/2
        dc.w (L13-L12)/2,(L14-L13)/2,(L15-L14)/2,(L16-L15)/2
        dc.w (L17-L16)/2,(L18-L17)/2,(L19-L18)/2,(L20-L19)/2
        dc.w (L21-L20)/2,(L22-L21)/2,(L23-L22)/2,(L24-L23)/2
        dc.w (L25-L24)/2,(L26-L25)/2,(L27-L26)/2,(L28-L27)/2
        dc.w (L29-L28)/2,(L30-L29)/2,(L31-L30)/2,(L32-L31)/2
        dc.w (L33-L32)/2,(L34-L33)/2,(L35-L34)/2

******************************************************************
*	TOKEN TABLE
C_Tk	dc.w 	1,0
	dc.b 	$80,-1
	dc.w	L_SerOp2,-1
	dc.b	"!serial ope","n"+$80,"I0,0",-2
	dc.w	L_SerOp5,-1
	dc.b	$80,"I0,0,0,0,0",-1
	dc.w	L_SerClo0,-1
	dc.b	"!serial clos","e"+$80,"I",-2
	dc.w	L_SerClo1,-1
	dc.b	$80,"I0",-1
	dc.w	L_SerSp,-1
	dc.b	"serial spee","d"+$80,"I0,0",-1
	dc.w	-1,L_SerChk
	dc.b	"serial chec","k"+$80,"00",-1
	dc.w 	L_SerSend,-1
	dc.b	"serial sen","d"+$80,"I0,2",-1
	dc.w 	L_SerSp,-1
	dc.b	"serial spee","d"+$80,"I0,0",-1
	dc.w 	L_SerBit,-1
	dc.b	"serial bit","s"+$00

AMErreur:	rs.w 2			*MErreur-ZZ,$8003
ARedo:		rs.w 2			*Redo-ZZ,$0003+Mixed

AExtNames:	rs.w 2			*ExtNames-ZZ,$8004

ASelDrv:	rs.w 2			*SelDrv-ZZ,$8005+Empty
ANmPrt:		rs.w 2			*NmPrt-ZZ,$0005
ANmSer:		rs.w 2			*NmSer-ZZ,$0005

AMesLd1:	rs.w 2			*MesLd1-ZZ,$0006+Empty
AMesLd2:	rs.w 2			*MesLd2-ZZ,$0006+Empty
AMesLd3:	rs.w 2			*MesLd3-ZZ,$0006+Empty
AMesMe1:	rs.w 2			*MesMe1-ZZ,$0006+Empty
AMesMe2:	rs.w 2			*MesMe2-ZZ,$0006+Empty
AMesLdA1:	rs.w 2			*MesLdA1-ZZ,$0006+Empty
AMesLdA2:	rs.w 2			*MesLdA2-ZZ,$0006+Empty
AMesLdA3:	rs.w 2			*MesLdA3-ZZ,$0006+Empty
AAvMe:		rs.w 2			*AvMe-ZZ,$0006+Empty
AAvLd:		rs.w 2			*AvLd-ZZ,$0006+Empty
AAvPrt:		rs.w 2			*AvPrt-ZZ,$0006+Empty
AMesSv1:	rs.w 2			*MesSv1-ZZ,$0006+Empty
AMesSv2:	rs.w 2			*MesSv2-ZZ,$0006+Empty
AMesSBl1:	rs.w 2			*MesSBl1-ZZ,$0006+Empty
AMesSBl2:	rs.w 2			*MesSBl2-ZZ,$0006+Empty
AMesSvA1:	rs.w 2			*MesSvA1-ZZ,$0006+Empty
AMesSvA2:	rs.w 2			*MesSvA2-ZZ,$0006+Empty
AMesSvA3:	rs.w 2			*MesSvA3-ZZ,$0006+Empty
AAvSv:		rs.w 2			*AvSv-ZZ,$0006+Empty
AAvSvA:		rs.w 2			*AvSvA-ZZ,$0006+Empty
AMesAc1:	rs.w 2			*MesAc1-ZZ,$0006+Empty
AMesAc2:	rs.w 2			*MesAc2-ZZ,$0006+Empty
AMesAc3:	rs.w 2			*MesAc3-ZZ,$0006+Empty
AMesAn1:	rs.w 2			*MesAn1-ZZ,$0006+Empty
AMesAn2:	rs.w 2			*MesAn2-ZZ,$0006+Empty
AMesAn3:	rs.w 2			*MesAn3-ZZ,$0006+Empty
AMesEd1:	rs.w 2			*MesEd1-ZZ,$0006+Empty
AMesEd2:	rs.w 2			*MesEd2-ZZ,$0006+Empty
AMesEd3:	rs.w 2			*MesEd3-ZZ,$0006+Empty
AMesRn1:	rs.w 2			*MesRn1-ZZ,$0006+Empty
AMesRn2:	rs.w 2			*MesRn2-ZZ,$0006+Empty
AMesRn3:	rs.w 2			*MesRn3-ZZ,$0006+Empty
AAvAccL:	rs.w 2			*AvAccL-ZZ,$0006+Empty

AEdPName:	rs.w 2			*EdPName-ZZ,$0001
AEdLName:	rs.w 2
ASMark:		rs.w 2			*SMark-ZZ,$0001
AEdTSize:	rs.w 2			*EdTSize-ZZ,$0001
AEdTTab:	rs.w 2			*EdTTab-ZZ,$0001
ASchinp:	rs.w 2			*Schinp-ZZ,$0001
ARepinp:	rs.w 2			*Repinp-ZZ,$0001

AFsTxt:		rs.w 2			*FsTxt-ZZ,$8006+Mixed+Fixed
AFaTxt:		rs.w 2			*FaTxt-ZZ,$8006+Mixed+Fixed
AFsWait:	rs.w 2			*FsWait-ZZ,$0006
AFsDTit:	rs.w 2			*FsDTit-ZZ,$0006
AFsDirSet:	rs.w 2			*FsDirSet-ZZ,$0006

*************** Editor messages
AConfYes:	rs.w 2			*ConfYes-ZZ,$0001
AConfNo:	rs.w 2			*ConfNo-ZZ,$0001
AConfConf:	rs.w 2			*ConfConf-ZZ,$0001
AConfSave:	rs.w 2			*ConfSave-ZZ,$0001
AConfText:	rs.w 2			*ConfText-ZZ,$0001
ADispText:	rs.w 2			*DispText-ZZ,$0001

AConfYN:	rs.w 2			*ConfYN-ZZ,$0001+Mixed
AConfYi:	rs.w 2			*ConfYi-ZZ,$0001+Mixed
AConfNi:	rs.w 2			*ConfNi-ZZ,$0001+Mixed

*************** Function key
AFkDef1:	rs.w 2			*FkDef1-ZZ,$0000
AFkDef2:	rs.w 2			*FkDef2-ZZ,$0000
AFkDef3:	rs.w 2			*FkDef3-ZZ,$0000
AFkDef4:	rs.w 2			*FkDef4-ZZ,$0000
AFkDef5:	rs.w 2			*FkDef5-ZZ,$0000
AFkIt0:		rs.w 2			*FkIt0-ZZ,$0007+Fixed
AFkIt1:		rs.w 2			*FkIt1-ZZ,$0007+Fixed
AFkLt0:		rs.w 2			*FkLt0-ZZ,$0007+Fixed
AFkLt1:		rs.w 2			*FkLt1-ZZ,$0007+Fixed

*************** Cursor flash
AEdFlCu:	rs.w 2			*EdFlCu-ZZ,$0000
AFolFl:		rs.w 2			*FolFl-ZZ,$0000

*************** Error screen 
AErrLine:	rs.w 2			*ErrLine-ZZ,$000a
AErrFin:	rs.w 2			*ErrFin-ZZ,$000a+Mixed
AFolI2:		rs.w 2			*FolI2-ZZ,$000a+Mixed

*************** Directory
ADirFilt:	rs.w 2			*DirFilt-ZZ,$0010
AChDir0:	rs.w 2			*ChDir0-ZZ,$000b+Mixed
AChDir1:	rs.w 2			*ChDir1-ZZ,$000b+Mixed
AChDir6:	rs.w 2			*CHDir6-ZZ,$000b+Mixed
AChDir3:	rs.w 2			*ChDir3-ZZ,$000b

*************** Info line
AMrgMes		rs.w 2			*MrgMes-ZZ,$0001+Mixed+Fixed
* Caps
AEtCps0:	rs.w 2			*EtCps0-ZZ,$0001+Mixed+Fixed
AEtCps1:	rs.w 2			*EtCps1-ZZ,$0001+Mixed+Fixed
* Insert / OverW
AEtIns0:	rs.w 2			*EtIns0-ZZ,$0001+Mixed+Fixed
AEtIns1:	rs.w 2			*EtIns1-ZZ,$0001+Mixed+Fixed
* Line #
AEtY:		rs.w 2			*EtY-ZZ,$0001+Mixed+Fixed
AEtY1:		rs.w 2			*EtY1-ZZ,$0001+Mixed+Fixed
* Col#
AEtX:		rs.w 2			*EtX-ZZ,$0001+Mixed+Fixed
AEtX1:		rs.w 2			*EtX1-ZZ,$0001+Mixed+Fixed
* Free
AEtFr0:		rs.w 2			*EtFr0-ZZ,$0001+Mixed+Fixed
AEtFr1:		rs.w 2			*EtFr1-ZZ,$0001+Mixed+Fixed
* Chip
AEtCh0:		rs.w 2			*EtCh0-ZZ,$0001+Mixed+Fixed
AEtCh1:		rs.w 2			*EtCh1-ZZ,$0001+Mixed+Fixed
* Fast
AEtFs0:		rs.w 2			*EtFs0-ZZ,$0001+Mixed+Fixed
AEtFs1:		rs.w 2			*EtFs1-ZZ,$0001+Mixed+Fixed
* Editing
AEtNm1:		rs.w 2			*EtNm1-ZZ,$0001+Mixed+Fixed
AEtNm2:		rs.w 2			*EtNm2-ZZ,$0001+Mixed+Fixed

*************** Editor functions
AKFonc:		rs.w 2			*KFonc-ZZ,$000F+Keys

*************** HELP escape
AEscH1:		rs.w 2			*EscH1-ZZ,$000c+Mixed
AEscH2:		rs.w 2			*EscH2-ZZ,$800c+Fixed
	
*************** Esc screen function keys
AAmiDef:	rs.w 2			*AmiDef-ZZ,$800d+Empty

*************** Auto loaded acc
AAutoLd		rs.w 2			*AutoLd-ZZ,$8011+Empty

*************** Help.Acc
ANameHelp	rs.w 2			*NameHelp-ZZ,$0013+Empty
AHelpLoad	rs.w 2			*HelpLoad-ZZ,$0013+Empty
AHNoF		rs.w 2

*************** Basic header
AEntete:	rs.w 2			*Entete-ZZ,0
*************** FK window
AFkFond:	rs.w 2			*FkFond-ZZ,0 
*************** Edit window
AEdClw:		rs.w 2			*EdClw-ZZ,0 
ASlDInit:	rs.w 2			*SlDInit-ZZ,0 
ASlBInit:	rs.w 2			*SlBInit-ZZ,0 
AEdDBloc	rs.w 2			*EdDBloc-ZZ,0 
AEdFBloc	rs.w 2			*EdFBloc-ZZ,0 
*************** Basic title
ATitle1:	rs.w 2			*Title1-ZZ,$000e+Mixed+Fixed+Empty
ATitle2:	rs.w 2			*Title2-ZZ,0 
*************** Suffix
ASufBas:	rs.w 2			*SufBas-ZZ,0 
ASufBak:	rs.w 2			*SufBak-ZZ,0 
ASufAcc:	rs.w 2			*SufAcc-ZZ,0 
AAutoEx:	rs.w 2			*AutoEx-ZZ,0 
*************** Default icon
ADefIcon	rs.w 2			*DefIcon-ZZ,$0012 
*************** AMOS Logo
ANMouse:	rs.w 2			*NMouse-ZZ,$0012 
ANFonte:	rs.w 2			*NFonte-ZZ,$0012
*************** Default Keyboard
AKyNom:		rs.w 	move.l	(a3)+,d2
	move.l	(a3)+,d1
	move.l	(a3)+,d0
	Rbsr	L_GetSerA1
	move.b	d1,IO_READLEN(a1)
	move.b	d1,IO_WRITELEN(a1)
	move.b	d2,IO_STOPBITS(a1)
	Rbra	L_Stpar
***********************************************************
*	Serial Parity ser,on/off/odd/even/mspon
L_SerPar	equ	15
L15	move.l	(a3)+,d1
	move.l	(a3)+,d0
	Rbsr	L_GetSerA1
	bclr	#SERB_PARTY_ON,IO_SERFLAGS(a1)
	bclr	#SERB_PARTY_ODD,IO_SERFLAGS(a1)
	bclr	#SEXTB_MSPON,IO_EXTFLAGS+3(a1)
	bclr	#SEXTB_MARK,IO_EXTFLAGS+3(a1)
; -1-> NO PARITY
	tst.w	d1
	bmi.s	.parX
; 0--> EVEN
	bne.s	.par1
	bset	#SERB_PARTY_ON,IO_SERFLAGS(a1)
	bra.s	.parX
; 1--> ODD
.par1	cmp.w	#1,d1
	bne.s	.par2
	bset	#SERB_PARTY_ON,IO_SERFLAGS(a1)
	bset	#SERB_PARTY_ODD,IO_SERFLAGS(a1)
	bra.s	.parX
; 2--> SPACE
.par2	cmp.w	#2,d1
	bne.s	.par3
	bset	#SEXTB_MSPON,IO_EXTFLAGS+3(a1)
	bra.s	.parX
; 3--> MARK
.par3	cmp.w	#3,d1
	bne.s	.parX
	bset	#SEXTB_MSPON,IO_EXTFLAGS+3(a1)
	bset	#SEXTB_MARK,IO_EXTFLAGS+3(a1)
; Envoie
.parX	Rbra	L_Stpar	
**********************************************************
*	Serial X ser,value
L_SerX		equ	16
L16	move.l	(a3)+,d1
	move.l	(a3)+,d0
	Rbsr	L_GetSerA1
	bset	#SERB_XDISABLED,IO_SERFLAGS(a1)
	cmp.l	#-1,d1
	Rbeq	L_Stpar
	bclr	#SERB_XDISABLED,IO_SERFLAGS(a1)
	move.l	d1,IO_CTLCHAR(a1)
	Rbra	L_Stpar
**********************************************************
*	Serial Buffer ser,length
L_SerBuf	equ	17
L17	move.l	(a3)+,d1
	move.l	(a3)+,d0
	Rbsr	L_GetSerA1
	move.l	d1,IO_RBUFLEN(a1)
	Rbra	L_Stpar
**********************************************************
*	Serial Fast ser
L_SerFast	equ	18
L18	move.l	(a3)+,d0
	Rbsr	L_GetSerA1
	bclr	#SERB_PARTY_ON,IO_SERFLAGS(a1)
	bclr	#SEXTB_MSPON,IO_EXTFLAGS+3(a1)
	bset	#SERB_XDISABLED,IO_SERFLAGS(a1)
	move.b	#8,IO_READLEN(a1)
	move.b	#8,IO_WRITELEN(a1)
	bset	#SERB_RAD_BOOGIE,IO_SERFLAGS(a1)
	Rbra	L_Stpar
**********************************************************
*	Serial Slow Ser
L_SerSlow	equ	19
L19	move.l	(a3)+,d0
	Rbsr	L_GetSerA1
	bclr	#SERB_RAD_BOOGIE,IO_SERFLAGS(a1)
	Rbra	L_Stpar
**********************************************************
*	=Serial Check(N)
L_SerChk	equ	20
L20	move.l	(a3)+,d0
	Rbsr	L_GetSerA1
	move.l	a6,-(sp)
	move.l	$4.w,a6
	jsr	_LVOCheckIO(a6)
	move.l	(sp)+,a6
	move.l	d0,d3
	beq.s	SerChk1
	moveq	#-1,d3
SerChk1	moveq	#0,d2	
	rts
**********************************************************
*	=Serial Error(n)
L_SerE		equ	21
L21	move.l	(a3)+,d0
	Rbsr	L_GetSerA1
	moveq	#0,d3
	move.b	IO_ERROR(a1),d3
	moveq	#0,d2
	rts

* DOIO function
L_DoDOIO	equ	22
L22	movem.l	a1/a2/a6,-(sp)
	move.w	d0,IO_COMMAND(a1)
	move.l	$4.w,a6
	jsr	_LVODoIO(a6)
	tst.l	d0
	movem.l	(sp)+,a1/a2/a6
	rts
* SENDIO function
L_DoSENDIO	equ	23
L23	movem.l	a1/a2/a6,-(sp)
	move.w	d0,IO_COMMAND(a1)
	move.l	$4.w,a6
	jsr	_LVOSendIO(a6)
	tst.l	d0
	movem.l	(sp)+,a1/a2/a6
	rts
	
;-----> IO #D0 to A1/a2
L_GetSerA1	equ	24
L24	move.l	d0,-(sp)
	Rbsr	L_GetSerial
	move.l	(a2),d0
	Rbeq	L_SerNOp
	move.l	d0,a1
	move.l	(sp)+,d0
	rts
;-----> Find IO address > D0
L_GetSerial	equ	25
L25	cmp.l	#NSerial,d0
	Rbcc	L_IFonc
	lsl.w	#3,d0
	Dlea	SerialIO,a2
	add.w	d0,a2
	rts

*********************************************************************
*	AMIGA.LIB linked code. 
*	In order to make it relocatable, I have been
*	obliged to disassemble the code and include it in this 
*	routine.
L_Amiga.Lib	equ	26
L26	lsl.w	#2,d0
	lea	JJJmp(pc),a0
	jmp	0(a0,d0.w)
JJJmp	bra	_CreatePort
	bra	_DeletePort
	bra	_CreateExtIO
	bra	_DeleteExtIO

_CreatePort
	MOVEM.L	D2-7/A2,-(A7)
	MOVE.L	$20(A7),D4
	MOVE.B	$27(A7),D3
	MOVE.L	#$FFFFFFFF,-(A7)
	BSR	L7C7DB14
	MOVE.L	D0,D5
	MOVE.L	D5,D6
	MOVEQ	#-1,D2
	CMP.L	D5,D2
	ADDQ.L	#4,A7
	BNE.S	L7C7D97A
	MOVEQ	#0,D0
	BRA	L7C7D9E6
L7C7D97A	MOVE.L	#$10001,-(A7)
	PEA	$22.W
	BSR	L7C7DAD0
	MOVEA.L	D0,A2
	EXG	D7,A2
	TST.L	D7
	EXG	D7,A2
	ADDQ.L	#8,A7
	BNE.S	L7C7D9A4
	MOVE.L	D6,-(A7)
	BSR	L7C7DB28
	MOVEQ	#0,D0
	ADDQ.L	#4,A7
	BRA.S	L7C7D9E6
L7C7D9A4	MOVE.L	D4,$A(A2)
	MOVE.B	D3,9(A2)
	MOVE.B	#4,8(A2)
	CLR.B	$E(A2)
	MOVE.B	D6,$F(A2)
	CLR.L	-(A7)
	BSR	L7C7DB00
	MOVE.L	D0,$10(A2)
	TST.L	D4
	ADDQ.L	#4,A7
	BEQ.S	L7C7D9D8
	MOVE.L	A2,-(A7)
	BSR	L7C7DB3C
	ADDQ.L	#4,A7
	BRA.S	L7C7D9E4
L7C7D9D8	PEA	$14(A2)
	BSR	_NewList
	ADDQ.L	#4,A7
L7C7D9E4	MOVE.L	A2,D0
L7C7D9E6	MOVEM.L	(A7)+,D2-7/A2
	RTS

_DeletePort
	MOVEM.L	D2/A2,-(A7)
	MOVEA.L	$C(A7),A2
	TST.L	$A(A2)
	BEQ.S	L7C7DA04
	MOVE.L	A2,-(A7)
	BSR	L7C7DB50
	ADDQ.L	#4,A7
L7C7DA04	MOVE.B	#$FF,8(A2)
	MOVEQ	#-1,D2
	MOVE.L	D2,$14(A2)
	MOVEQ	#0,D2
	MOVE.B	$F(A2),D2
	MOVE.L	D2,-(A7)
	BSR	L7C7DB28
	PEA	$22.W
	MOVE.L	A2,-(A7)
	BSR	L7C7DAE8
	LEA	$C(A7),A7
	MOVEM.L	(A7)+,D2/A2
	RTS
_CreateExtIO
	MOVEM.L	D2-4,-(A7)
	MOVE.L	$10(A7),D2
	MOVE.L	$14(A7),D3
	TST.L	D2
	BNE.S	L7C7DA54
	MOVEQ	#0,D0
	BRA.S	L7C7DA82
L7C7DA54	MOVE.L	#$10001,-(A7)
	MOVE.L	D3,-(A7)
	BSR	L7C7DAD0
	MOVEA.L	D0,A0
	EXG	D4,A0
	TST.L	D4
	EXG	D4,A0
	ADDQ.L	#8,A7
	BNE.S	L7C7DA72
	MOVEQ	#0,D0
	BRA.S	L7C7DA82
L7C7DA72	MOVE.B	#5,8(A0)
	MOVE.W	D3,$12(A0)
	MOVE.L	D2,$E(A0)
	MOVE.L	A0,D0
L7C7DA82	MOVEM.L	(A7)+,D2-4
	RTS

_DeleteExtIO
	MOVEM.L	D2-3,-(A7)
	MOVEA.L	$C(A7),A0
	EXG	D3,A0
	TST.L	D3
	EXG	D3,A0
	BEQ	L7C7DABE
	MOVE.B	#$FF,8(A0)
	MOVEQ	#-1,D2
	MOVE.L	D2,$14(A0)
	MOVEQ	#-1,D2
	MOVE.L	D2,$18(A0)
	MOVEQ	#0,D2
	MOVE.W	$12(A0),D2
	MOVE.L	D2,-(A7)
	MOVE.L	A0,-(A7)
	BSR	L7C7DAE8
	ADDQ.L	#8,A7
L7C7DABE	MOVEM.L	(A7)+,D2-3
	RTS
L7C7DAD0
	MOVE.L	A6,-(A7)
	MOVEA.L	$4.w,A6
	MOVEM.L	8(A7),D0-1
	JSR	-$C6(A6)
	MOVEA.L	(A7)+,A6
	RTS
L7C7DAE8
	MOVE.L	A6,-(A7)
	MOVEA.L	$4.w,A6
	MOVEA.L	8(A7),A1
	MOVE.L	$C(A7),D0
	JSR	-$D2(A6)
	MOVEA.L	(A7)+,A6
	RTS
L7C7DB00
	MOVE.L	A6,-(A7)
	MOVEA.L	$4.w,A6
	MOVEA.L	8(A7),A1
	JSR	-$126(A6)
	MOVEA.L	(A7)+,A6
	RTS
L7C7DB14
	MOVE.L	A6,-(A7)
	MOVEA.L	$4.w,A6
	MOVE.L	8(A7),D0
	JSR	-$14A(A6)
	MOVEA.L	(A7)+,A6
	RTS
L7C7DB28
	MOVE.L	A6,-(A7)
	MOVEA.L	$4.w,A6
	MOVE.L	8(A7),D0
	JSR	-$150(A6)
	MOVEA.L	(A7)+,A6
	RTS
L7C7DB3C
	MOVE.L	A6,-(A7)
	MOVEA.L	$4.w,A6
	MOVEA.L	8(A7),A1
	JSR	-$162(A6)
	MOVEA.L	(A7)+,A6
	RTS
L7C7DB50
	MOVE.L	A6,-(A7)
	MOVEA.L	$4.w,A6
	MOVEA.L	8(A7),A1
	JSR	-$168(A6)
	MOVEA.L	(A7)+,A6
	RTS
_NewList
	move.l	4(a7),a0
	move.l	a0,(a0)
	addq.l	#4,(a0)
	clr.l	4(a0)
	move.l	a0,8(a0)
	rts

L27
L28
*********************************************************************
*	ERRORS
L_SerOpE	equ	29
L_IFonc		equ	29
L29	moveq	#23,d0			* Illegal function call
	Rjmp	L_Error
******* Custom errors
L_SerNOp	equ	30	
L30	moveq	#16,d0
	Rbra	L_Custom
L_SerAOp	equ	31
L31	moveq	#17,d0
	Rbra	L_Custom
* General serial error
L_SerError	equ	32
L32	subq.l	#1,d0
	cmp.l	#16,d0
	Rbcs	L_Custom
	moveq	#18,d0
	Rbra	L_Custom

******* Main routine.
L_Custom	equ	33
L33	lea	ErrMess(pc),a0
	moveq	#0,d1			* Can be trapped
	moveq	#ExtNb,d2		* Number of extension
	moveq	#0,d3			* IMPORTANT!!!
	Rjmp	L_ErrorExt		* Jump to routine...
ErrMess
	dc.b	"Device already in use",0		* 0
	dc.b	0					* 1
	dc.b	"Invalid baud rate",0			* 2
	dc.b	"Out of memory (serial device)",0	* 3
	dc.b	"Bad parameter",0			* 4
	dc.b	"Hardware data overrun",0		* 5
	dc.b 	0					* 6
	dc.b	0					* 7
	dc.b	0					* 8
	dc.b	0					* 9
	dc.b	"Timer error",0				* 10
	dc.b	"Buffer overflow",0			* 11
	dc.b	"No data set ready",0			* 12
	dc.b	"No clear to send",0			* 13
	dc.b	0					* 14
	dc.b	0					* 15		
	dc.b	"Serial port not opened",0		* 16	
	dc.b	"Serial port already opened",0		* 17
	dc.b	"Serial error",0			* 18
	even

******* "No errors" routine
L34	moveq	#0,d1
	moveq	#ExtNb,d2
	moveq	#-1,d3
	Rjmp	L_ErrorExt
L35
*********************************************************************

******* TITLE MESSAGE
C_Title	dc.b	31,"Serial extension V1.1",0

******* END OF THE EXTENSION
C_End	dc.w	0
	even
