amos-professional/extensions/+IO_Ports.s
2020-04-26 02:58:13 +02:00

1195 lines
30 KiB
ArmAsm
Raw Blame History

;---------------------------------------------------------------------
; ** ** ** *** *** **** ** *** ** ****
; **** *** *** ** ** ** ** ** **** ** ** ** **
; ** ** ** * ** ** ** *** ***** ** ** *** ** **
; ****** ** ** ** ** ** ** ** ****** ** ** **
; ** ** ** ** ** ** * ** ** ** ** ** * ** ** ** **
; ** ** ** ** *** *** ***** ** ** *** ** ****
;---------------------------------------------------------------------
; Serial / Parallel / Printer extension source code
; By Fran<61>ois Lionet
; AMOS, AMOSPro, AMOS Compiler (c) Europress Software 1990-1992
; To be used with AMOSPro V2.0 and over
;---------------------------------------------------------------------
;
; Published under the MIT Licence
;
; Copyright (c) 1992 Europress Software
; Copyright (c) 2020 Francois Lionet
;
; Permission is hereby granted, free of charge, to any person
; obtaining a copy of this software and associated documentation
; files (the "Software"), to deal in the Software without
; restriction, including without limitation the rights to use,
; copy, modify, merge, publish, distribute, sublicense, and/or
; sell copies of the Software, and to permit persons to whom the
; Software is furnished to do so, subject to the following
; conditions:
;
; The above copyright notice and this permission notice shall be
; included in all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
; ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
; THE USE OR OTHER DEALINGS IN THE SOFTWARE.
;
;---------------------------------------------------------------------
;
; Please refer to the _Music.s file for more informations...
;
;---------------------------------------------------------------------
ExtNb equ 6-1
; AMIGA's includes
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
INCDIR "includes/"
INCLUDE "Exec/Types.I"
INCLUDE "Exec/Exec.I"
INCLUDE "Devices/Serial.I"
INCLUDE "Devices/PrtBase.I"
INCLUDE "Devices/Printer.I"
INCLUDE "Devices/PrtGfx.I"
INCLUDE "Devices/Parallel.I"
;---------------------------------------------------------------------
; Include the files automatically calculated by
; Library_Digest.AMOS
;---------------------------------------------------------------------
Include "+AMOS_Includes.s"
Include "+Version.s"
Include "+IO_Ports_Size.s"
Include "+IO_Ports_Labels.s"
; Number of serial channels allowed
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NSerial equ 4
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
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
dc.b "AP20"
;---------------------------------------------------------------------
; Creates the pointers to functions
;---------------------------------------------------------------------
MCInit
C_Off
REPT Lib_Size
MC
ENDR
;---------------------------------------------------------------------
; TOKEN TABLE
;---------------------------------------------------------------------
; TOKEN_START
C_Tk
dc.w 1,0
dc.b $80,-1
dc.w L_InSerialOpen2,L_Nul
dc.b "!serial ope","n"+$80,"I0,0",-2
dc.w L_InSerialOpen5,L_Nul
dc.b $80,"I0,0,0,0,0",-1
dc.w L_InSerialClose0,L_Nul
dc.b "!serial clos","e"+$80,"I",-2
dc.w L_InSerialClose1,L_Nul
dc.b $80,"I0",-1
dc.w L_InSerialSpeed,L_Nul
dc.b "serial spee","d"+$80,"I0,0",-1
dc.w L_Nul,L_FnSerialCheck
dc.b "serial chec","k"+$80,"00",-1
dc.w L_InSerialSend,L_Nul
dc.b "serial sen","d"+$80,"I0,2",-1
dc.w L_InSerialSpeed,L_Nul
dc.b "serial spee","d"+$80,"I0,0",-1
dc.w L_InSerialBits,L_Nul
dc.b "serial bit","s"+$80,"I0,0,0",-1
dc.w L_InSerialX,L_Nul
dc.b "serial ","x"+$80,"I0,0",-1
dc.w L_InSerialBuf,L_Nul
dc.b "serial bu","f"+$80,"I0,0",-1
dc.w L_InSerialParity,L_Nul
dc.b "serial parit","y"+$80,"I0,0",-1
dc.w L_Nul,L_FnSerialGet
dc.b "serial ge","t"+$80,"00",-1
dc.w L_Nul,L_FnSerialInput
dc.b "serial input","$"+$80,"20",-1
dc.w L_InSerialFast,L_Nul
dc.b "serial fas","t"+$80,"I0",-1
dc.w L_InSerialSlow,L_Nul
dc.b "serial slo","w"+$80,"I0",-1
dc.w L_Nul,L_FnSerialError
dc.b "serial erro","r"+$80,"00",-1
dc.w L_InSerialOut,L_Nul
dc.b "serial ou","t"+$80,"I0,0,0",-1
dc.w L_Nul,L_FnSerialStatus
dc.b "serial statu","s"+$80,"00",-1
dc.w L_Nul,L_FnSerialBase
dc.b "serial bas","e"+$80,"00",-1
dc.w L_InSerialAbort,L_Nul
dc.b "serial abor","t"+$80,"I0",-1
; Printer commands
; ~~~~~~~~~~~~~~~~
dc.w L_InPrinterOpen,L_Nul
dc.b "printer ope","n"+$80,"I",-1
dc.w L_InPrinterClose,L_Nul
dc.b "printer clos","e"+$80,"I",-1
dc.w L_InPrinterSend,L_Nul
dc.b "printer sen","d"+$80,"I2",-1
dc.w L_InPrinterOut,L_Nul
dc.b "printer ou","t"+$80,"I0,0",-1
dc.w L_InPrinterDump0,L_Nul
dc.b "!printer dum","p"+$80,"I",-2
dc.w L_InPrinterDump4,L_Nul
dc.b $80,"I0,0t0,0",-2
dc.w L_InPrinterDump7,L_Nul
dc.b $80,"I0,0t0,0,0,0,0",-1
dc.w L_InPrinterAbort,L_Nul
dc.b "printer abor","t"+$80,"I",-1
dc.w L_Nul,L_FnPrinterCheck
dc.b "printer chec","k"+$80,"0",-1
dc.w L_Nul,L_FnPrinterOnline
dc.b "printer onlin","e"+$80,"0",-1
dc.w L_Nul,L_FnPrinterBase
dc.b "printer bas","e"+$80,"0",-1
dc.w L_Nul,L_FnPrinterError
dc.b "printer erro","r"+$80,"0",-1
; Parallel commands
; ~~~~~~~~~~~~~~~~~
dc.w L_InParallelOpen,L_Nul
dc.b "parallel ope","n"+$80,"I",-1
dc.w L_InParallelClose,L_Nul
dc.b "parallel clos","e"+$80,"I",-1
dc.w L_InParallelSend,L_Nul
dc.b "parallel sen","d"+$80,"I2",-1
dc.w L_InParallelOut,L_Nul
dc.b "parallel ou","t"+$80,"I0,0",-1
dc.w L_InParallelAbort,L_Nul
dc.b "parallel abor","t"+$80,"I",-1
dc.w L_Nul,L_FnParallelCheck
dc.b "parallel chec","k"+$80,"0",-1
dc.w L_Nul,L_FnParallelStatus
dc.b "parallel statu","s"+$80,"0",-1
dc.w L_Nul,L_FnParallelBase
dc.b "parallel bas","e"+$80,"0",-1
dc.w L_Nul,L_FnParallelError
dc.b "parallel erro","r"+$80,"0",-1
dc.w L_Nul,L_FnParallelInput1
dc.b "!parallel input","$"+$80,"20",-2
dc.w L_Nul,L_FnParallelInput2
dc.b $80,"20,0",-2
; TOKEN_END
dc.w 0
dc.l 0 Important!
;---------------------------------------------------------------------
Lib_Ini 0
;---------------------------------------------------------------------
C_Lib
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; COLD START
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Def IOCold
; - - - - - - - - - - - - -
cmp.l #"APex",d1 Version 1.10 or over?
bne.s BadVer
movem.l a3-a6,-(sp)
lea DT(pc),a3
move.l a3,ExtAdr+ExtNb*16(a5)
lea SerDef(pc),a0
move.l a0,ExtAdr+ExtNb*16+4(a5)
lea SerEnd(pc),a0
move.l a0,ExtAdr+ExtNb*16+8(a5)
movem.l (sp)+,a3-a6
moveq #ExtNb,d0 * NO ERRORS
move.w #VerNumber,d1 * Current version
rts
; In case this extension is runned on AMOSPro V1.00
BadVer moveq #-1,d0 * Bad version number
sub.l a0,a0
rts
; SCREEN RESET (called by AMOSPro)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SerDef
; QUIT (called by AMOSPro)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SerEnd Rbsr L_InSerialClose0
Dlea PrinterIO,a2
Rjsr L_Dev.CloseA2
Dlea ParallelIO,a2
Rjsr L_Dev.CloseA2
rts
*************** Data zone
DT
SerialIO ds.l 3*NSerial Serial IO Port
PrinterIO ds.l 3 Printer IO Port
ParallelIO ds.l 3 Parallel IO Port
BufIn dc.l 0
Prt_Query dc.l 0 Espace pour informations
Prt_Request dc.l 0 Ancien requester
; Screen Dump
; ~~~~~~~~~~~
width: dc.w 0
height: dc.w 0
viewModes dc.w 0
depth: dc.w 0
screen dc.l 0
vPort dc.l 0
rPort dc.l 0
colourmap dc.l 0
oldCtable dc.l 0
special dc.w $84
srcX dc.w 0
srcY dc.w 0
pwidth dc.w 0
pheight dc.w 0
temp1 dc.w 0
temp2 dc.w 0
destCols dc.l 0
destRows dc.l 0
ScreenBase: dc.l 0
; Nom des devices
; ~~~~~~~~~~~~~~~
SerName dc.b "serial.device",0
PrtName dc.b "printer.device",0
ParName dc.b "parallel.device",0
even
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Leave one empty routine here!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Empty
; - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; SERIAL OPEN logicnumber,physicnumber[,shared,xdisabled,7wires]
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialOpen2
; - - - - - - - - - - - - -
move.l d3,-(a3)
moveq #0,d3
move.l d3,-(a3)
move.l d3,-(a3)
Rbra L_InSerialOpen5
; - - - - - - - - - - - - -
Lib_Par InSerialOpen5
; - - - - - - - - - - - - -
move.l d3,-(a3)
move.l 16(a3),d0
Rbsr L_GetSerial
; Opening parameters
move.w #IO_SERFLAGS,d5
swap d5
clr.w d5
tst.l (a3)+
beq.s SerOpA
bset #SERB_7WIRE,d5
SerOpA bset #SERB_XDISABLED,d5
tst.l (a3)+
beq.s SerOpB
bclr #SERB_XDISABLED,d5
SerOpB tst.l (a3)+
beq.s SerOpC
bset #SERB_SHARED,d5
SerOpC Dlea SerName,a0
moveq #IOEXTSER_SIZE,d0
move.l (a3),d1
moveq #0,d2
move.w #145,d3
moveq #16,d4
Rjsr L_Dev.Open
move.l (a3)+,d0
addq.l #4,a3
beq.s .PaSet
* If NOT user-serial (#0),
* default settings for French MINITEL: 1200/7/1 Stop/EVEN parity
move.l (a2),a1
move.l #1200,IO_BAUD(a1)
move.b #7,IO_READLEN(a1)
move.b #7,IO_WRITELEN(a1)
move.b #1,IO_STOPBITS(a1)
bset #SERB_XDISABLED,IO_SERFLAGS(a1)
bset #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)
* Call the device at least once
.PaSet move.l (a2),a1
Rbra L_Stpar
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Serclose [N]
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialClose1
; - - - - - - - - - - - - -
move.l d3,d0
Rbsr L_GetSerial
Rjmp L_Dev.CloseA2
; - - - - - - - - - - - - -
Lib_Par InSerialClose0
; - - - - - - - - - - - - -
Dlea SerialIO,a2
moveq #NSerial-1,d2
.Loop Rjsr L_Dev.CloseA2
lea 12(a2),a2
dbra d2,.Loop
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Serial Send ser,A$
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialSend
; - - - - - - - - - - - - -
move.l d3,d2
move.l (a3)+,d0
Rbsr L_GetSerA1
move.l d2,a0
moveq #0,d0
move.w (a0)+,d0
Rbeq L_IOFonc
move.l d0,IO_LENGTH(a1)
move.l a0,IO_DATA(a1)
moveq #CMD_WRITE,d0
Rjmp L_Dev.SendIO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Serial Out ser,address,length
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialOut
; - - - - - - - - - - - - -
move.l d3,d2
Rbmi L_IOFonc
Rbeq L_IOFonc
move.l (a3)+,d1
move.l (a3)+,d0
Rbsr L_GetSerA1
move.l d1,IO_DATA(a1)
move.l d2,IO_LENGTH(a1)
moveq #CMD_WRITE,d0
Rjmp L_Dev.SendIO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =Serial Get(ser)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnSerialGet
; - - - - - - - - - - - - -
move.l d3,d0
Rbsr L_GetSerA1
move.w #SDCMD_QUERY,d0
Rjsr L_Dev.DoIO
moveq #-1,d3
move.l IO_ACTUAL(a1),d0
beq.s .SerINo
Dlea BufIn,a0
move.l a0,IO_DATA(a1)
move.l #1,IO_LENGTH(a1)
moveq #CMD_READ,d0
Rjsr L_Dev.DoIO
moveq #0,d3
Dlea BufIn,a0
move.b (a0),d3
.SerINo Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =Serial Input$(Ser)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnSerialInput
; - - - - - - - - - - - - -
move.l d3,d0
Rbsr L_GetSerA1
moveq #SDCMD_QUERY,d0
Rjsr L_Dev.DoIO
move.l IO_ACTUAL(a1),d4
beq.s .No
cmp.l #String_Max,d4
Rbcc L_IOFonc
* Ask for string space...
movem.l a1/a2,-(sp)
move.l d4,d3
and.w #$FFFE,d3 * Only EVEN!
addq.w #2,d3
Rjsr L_Demande
lea 2(a1,d3.w),a1
move.l a1,HiChaine(a5)
* Send to device...
movem.l (sp)+,a1/a2
move.l a0,d3
move.w d4,(a0)+
move.l a0,IO_DATA(a1)
move.l d4,IO_LENGTH(a1)
moveq #CMD_READ,d0
Rjsr L_Dev.DoIO
bra.s .Out
* Nothing to return
.No move.l ChVide(a5),d3 * Empty string
.Out Ret_String
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Serial Speed ser,baud
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialSpeed
; - - - - - - - - - - - - -
move.l d3,d1
move.l (a3)+,d0
Rbsr L_GetSerA1
move.l d1,IO_BAUD(a1)
Rbra L_Stpar
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Serial Bit ser,number,stop
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialBits
; - - - - - - - - - - - - -
move.l d3,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
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialParity
; - - - - - - - - - - - - -
move.l d3,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
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialX
; - - - - - - - - - - - - -
move.l d3,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 Buf ser,length
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialBuf
; - - - - - - - - - - - - -
move.l d3,d1
move.l (a3)+,d0
Rbsr L_GetSerA1
move.l d1,IO_RBUFLEN(a1)
Rbra L_Stpar
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Serial Fast ser
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialFast
; - - - - - - - - - - - - -
move.l d3,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
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialSlow
; - - - - - - - - - - - - -
move.l d3,d0
Rbsr L_GetSerA1
bclr #SERB_RAD_BOOGIE,IO_SERFLAGS(a1)
Rbra L_Stpar
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =Serial Check(N)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnSerialCheck
; - - - - - - - - - - - - -
move.l d3,d0
Rbsr L_GetSerial
Rjsr L_Dev.CheckIO
move.l d0,d3
beq.s .Out
moveq #-1,d3
.Out Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =Serial Error(n)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnSerialError
; - - - - - - - - - - - - -
move.l d3,d0
Rbsr L_GetSerA1
moveq #0,d3
move.b IO_ERROR(a1),d3
Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =Serial Status(n)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnSerialStatus
; - - - - - - - - - - - - -
move.l d3,d0
Rbsr L_GetSerA1
moveq #SDCMD_QUERY,d0
Rjsr L_Dev.DoIO
moveq #0,d3
move.l (a2),a1
move.w IO_STATUS(a1),d3
Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =SERIAL BASE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnSerialBase
; - - - - - - - - - - - - -
move.l d3,d0
Rbsr L_GetSerA1
move.l a1,d3
Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; SERIAL ABORT channel
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InSerialAbort
; - - - - - - - - - - - - -
move.l d3,d0
Rbsr L_GetSerial
Rjmp L_Dev.AbortIO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Routines
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Def GetSerA1
; - - - - - - - - - - - - - -----> IO #D0 to A1/a2
Rbsr L_GetSerial
Rjmp L_Dev.GetIO
; - - - - - - - - - - - - -
Lib_Def GetSerial
; - - - - - - - - - - - - - -----> Find IO address > D0
cmp.l #NSerial,d0
Rbcc L_IOFonc
mulu #12,d0
Dlea SerialIO,a2
add.w d0,a2
rts
; - - - - - - - - - - - - -
Lib_Def Stpar
; - - - - - - - - - - - - -
moveq #SDCMD_SETPARAMS,d0
Rjmp L_Dev.DoIO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =PRINTER BASE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnPrinterBase
; - - - - - - - - - - - - -
Dlea PrinterIO,a2
Rjsr L_Dev.GetIO
move.l a1,d3
Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =PRINTER CHECK
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnPrinterCheck
; - - - - - - - - - - - - -
Dlea PrinterIO,a2
Rjsr L_Dev.CheckIO
move.l d0,d3
beq.s .Skip
moveq #-1,d3
.Skip Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PRINTER OPEN
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InPrinterOpen
; - - - - - - - - - - - - -
Rjsr L_PRT_Close Ferme LPRINT
Dlea PrtName,a0
Dlea PrinterIO,a2
moveq #64,d0
moveq #0,d1
moveq #0,d2
move.w #161,d3 Premier message erreurs
moveq #7,d4 7 messages
moveq #0,d5
Rjsr L_Dev.Open
; Ask for printer device task, and forbid its requester...
Dload a2
lea PrtName-DT(a2),a1
move.l a6,-(sp)
move.l $4.w,a6
jsr _LVOFindTask(a6)
move.l (sp)+,a6
tst.l d0
beq.s .Skip
move.l d0,a0
move.l $b8(a0),Prt_Request-DT(a2)
move.l #-1,$b8(a0)
.Skip rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PRINTER CLOSE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InPrinterClose
; - - - - - - - - - - - - -
Dload a2
; Restore printer.device requester
tst.l Prt_Request-DT(a2)
beq.s .Skip
lea PrtName-DT(a2),a1
move.l a6,-(sp)
move.l $4.w,a6
jsr _LVOFindTask(a6)
move.l (sp)+,a6
tst.l d0
beq.s .Skip
move.l d0,a0
move.l Prt_Request-DT(a2),$b8(a0)
clr.l Prt_Request-DT(a2)
; Close device
.Skip Dlea PrinterIO,a2
Rjmp L_Dev.CloseA2
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =PRINTER ERROR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnPrinterError
; - - - - - - - - - - - - -
Dlea PrinterIO,a2
Rjsr L_Dev.GetIO
moveq #0,d3
move.b IO_ERROR(a1),d3
Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PRINTER SEND A$
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InPrinterSend
; - - - - - - - - - - - - -
Dlea PrinterIO,a2
Rjsr L_Dev.GetIO
move.l d3,a0
moveq #0,d0
move.w (a0)+,d0
Rbeq L_IOFonc
move.l d0,IO_LENGTH(a1)
move.l a0,IO_DATA(a1)
moveq #CMD_WRITE,d0
Rjmp L_Dev.SendIO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PRINTER OUT ad,lenght
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InPrinterOut
; - - - - - - - - - - - - -
Dlea PrinterIO,a2
Rjsr L_Dev.GetIO
move.l d3,d0
Rbeq L_IOFonc
move.l (a3)+,a0
move.l d0,IO_LENGTH(a1)
move.l a0,IO_DATA(a1)
moveq #PRD_RAWWRITE,d0
Rjmp L_Dev.SendIO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PRINTER ABORT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InPrinterAbort
; - - - - - - - - - - - - -
Dlea PrinterIO,a2
Rjmp L_Dev.AbortIO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =PRINTER ONLINE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnPrinterOnline
; - - - - - - - - - - - - -
Dlea PrinterIO,a2
Rjsr L_Dev.GetIO
Dlea Prt_Query,a0
move.l a0,IO_DATA(a1)
moveq #PRD_QUERY,d0
Rjsr L_Dev.DoIO
Dlea Prt_Query,a0
moveq #0,d3
move.l (a2),a1
cmp.l #1,IO_ACTUAL(a1)
bne.s .Skip
btst #0,(a0)
bne.s .Skip
moveq #-1,d3
.Skip Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PRINTER DUMP [parameters!]
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InPrinterDump0
; - - - - - - - - - - - - -
Dload a2
Rbsr L_GetScr
move.w width-DT(a2),pwidth-DT(a2)
move.w height-DT(a2),pheight-DT(a2)
move.l #0,destCols-DT(a2)
move.l #0,destRows-DT(a2)
move.w #$8c,special-DT(a2) ; ASPECT | FULLROWS | FULLCOLS
Rbra L_Dump
; - - - - - - - - - - - - -
Lib_Par InPrinterDump4
; - - - - - - - - - - - - -
move.l d3,-(a3)
Dload a2
Rbsr L_Dump2a
; Calculate proportional DestX, DestY
clr.l d0
clr.l d1
move.w pwidth-DT(a2),d0
tst.w d0
Rbeq L_IOFonc
move.w width-DT(a2),d1
divu.w d0,d1
tst.w d1
Rbeq L_IOFonc
lea destCols-DT(a2),a0
move.l #$ffff,d0
divu.w d1,d0
move.l d0,(a0)
andi.l #$ffff,(a0)
move.l #$10,d1
move.l (a0),d0
rol.l d1,d0
move.l d0,(a0)
clr.l d0
clr.l d1
move.w pheight-DT(a2),d0
tst.w d0
Rbeq L_IOFonc
move.w height-DT(a2),d1
divu.w d0,d1
tst.w d1
Rbeq L_IOFonc
lea destRows-DT(a2),a0
move.l #$ffff,d0
divu.w d1,d0
move.l d0,(a0)
andi.l #$ffff,(a0)
move.l #$10,d1
move.l (a0),d0
rol.l d1,d0
move.l d0,(a0)
lea special-DT(a2),a0
move.w #$b0,(a0)
Rbra L_Dump
; - - - - - - - - - - - - -
Lib_Par InPrinterDump7
; - - - - - - - - - - - - -
move.l d3,-(a3)
movem.l a4-a6,-(sp)
Dload a2
Rbsr L_Dump3a
Rbra L_Dump
; - - - - - - - - - - - - -
Lib_Def Dump3a
; - - - - - - - - - - - - -
lea special-DT(a2),a0
lea 2(a3),a3
move.w (a3)+,(a0) ; special
lea destRows-DT(a2),a0
move.l (a3)+,(a0) ; destY
lea destCols-DT(a2),a0
move.l (a3)+,(a0) ; destY
Rbra L_Dump2a
; - - - - - - - - - - - - -
Lib_Def Dump2a
; - - - - - - - - - - - - -
lea pheight-DT(a2),a0
lea 2(a3),a3
move.w (a3)+,(a0) ; bottom y
lea pwidth-DT(a2),a0
lea 2(a3),a3
move.w (a3)+,(a0) ; bottom x
lea srcY-DT(a2),a0
lea 2(a3),a3
move.w (a3)+,(a0) ; srcy
lea srcX-DT(a2),a0
lea 2(a3),a3
move.w (a3)+,(a0) ; srcx
Rbsr L_GetScr
; get srcX,Y back
move.w srcX-DT(a2),d0
move.w srcY-DT(a2),d1
; calculate width, height
neg.w d0
neg.w d1
lea pwidth-DT(a2),a0
add.w d0,(a0) ; width = -srcX+bottomX
lea pheight-DT(a2),a0
add.w d1,(a0) ; height = -srcY+bottomY
rts
; - - - - - - - - - - - - -
Lib_Def Dump
; - - - - - - - - - - - - -
; Check the structure
Dlea PrinterIO,a2
Rjsr L_Dev.GetIO
; Initialise colour map
Dload a2
moveq #32,d0
move.l a6,-(sp)
move.l T_GfxBase(a5),a6
jsr -570(a6)
move.l (sp)+,a6
tst.l d0
beq cl5
move.l d0,colourmap-DT(a2)
move.l d0,a0
moveq #0,d0
move.l ScreenBase-DT(a2),a1
lea EcPal(a1),a1
.loop move.w (a1)+,d1
move.w d1,d3
and.w #$f,d3
lsr.w #4,d1
move.w d1,d2
and.w #$f,d2
lsr.w #4,d1
movem.l d0/a0-a1/a6,-(sp)
move.l T_GfxBase(a5),a6
jsr -$276(a6)
movem.l (sp)+,d0/a0-a1/a6
addq.w #1,d0
cmp.w #32,d0
bne.s .loop
; Dump the rast port!!!
move.l PrinterIO-DT(a2),a1 ; IO structure
move.l T_RastPort(a5),32(a1) ; rastPort
move.l colourmap-DT(a2),36(a1) ; colourmap
move.w viewModes-DT(a2),40+2(a1) ; viewmodes
move.w srcX-DT(a2),44(a1) ; srcX
move.w srcY-DT(a2),46(a1) ; srcY
move.w pwidth-DT(a2),48(a1) ; srcWidth
move.w pheight-DT(a2),50(a1) ; srcHeight
move.l destCols-DT(a2),52(a1) ; destCols
move.l destRows-DT(a2),56(a1) ; destRows
move.w special-DT(a2),60(a1) ; special
moveq #11,d0 ; command
Dlea PrinterIO,a2
Rjsr L_Dev.DoIO
move.w d0,-(sp)
Dload a2
; Free colour map
cl8 move.l colourmap-DT(a2),a0
move.l a6,-(sp)
move.l T_GfxBase(a5),a6
jsr -576(a6) ; Free colourmap
move.l (sp)+,a6
cl5
; Return to the user
move.w (sp)+,d0
bne.s .Err
rts
; Error
.Err Rjmp L_Dev.Error
; Return informations about the current screen
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; - - - - - - - - - - - - -
Lib_Def GetScr
; - - - - - - - - - - - - -
move.l ScOnAd(a5),d0
beq.s .Err ; get the address of the screen
move.l d0,a0
move.l a0,ScreenBase-DT(a2)
; Now we need to extract all the information about the screen
move.w EcTx(a0),width-DT(a2) ; width
move.w EcTy(a0),height-DT(a2) ; height
move.w EcCon0(a0),d0
and.w #%1000100010000100,d0 ; Hires / HAM / DualPF / Halfbrite
move.w d0,viewModes-DT(a2) ; View Modes
move.w EcNPlan(a0),depth-DT(a2) ; depth
rts
.Err moveq #47,d0 ; Screen not opened
Rjmp L_Error
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =PARALLEL BASE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnParallelBase
; - - - - - - - - - - - - -
Dlea ParallelIO,a2
Rjsr L_Dev.GetIO
move.l a1,d3
Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =PARALLEL CHECK
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnParallelCheck
; - - - - - - - - - - - - -
Dlea ParallelIO,a2
Rjsr L_Dev.CheckIO
move.l d0,d3
beq.s .Skip
moveq #-1,d3
.Skip Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PARALLEL OPEN
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InParallelOpen
; - - - - - - - - - - - - -
Rjsr L_PRT_Close
Dlea ParName,a0
Dlea ParallelIO,a2
moveq #62,d0
moveq #0,d1
moveq #0,d2
move.w #171,d3 Premier message erreurs
moveq #7,d4 7 messages
moveq #0,d5
Rjmp L_Dev.Open
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PARALLEL CLOSE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InParallelClose
; - - - - - - - - - - - - -
Dlea ParallelIO,a2
Rjmp L_Dev.CloseA2
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PARALLEL SEND A$
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InParallelSend
; - - - - - - - - - - - - -
Dlea ParallelIO,a2
Rjsr L_Dev.GetIO
move.l d3,a0
moveq #0,d0
move.w (a0)+,d0
Rbeq L_IOFonc
move.l d0,IO_LENGTH(a1)
move.l a0,IO_DATA(a1)
moveq #CMD_WRITE,d0
Rjmp L_Dev.DoIO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PARALLEL OUT ad,lenght
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InParallelOut
; - - - - - - - - - - - - -
Dlea ParallelIO,a2
Rjsr L_Dev.GetIO
move.l d3,d0
Rbeq L_IOFonc
move.l (a3)+,a0
move.l d0,IO_LENGTH(a1)
move.l a0,IO_DATA(a1)
moveq #PRD_RAWWRITE,d0
Rjmp L_Dev.DoIO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PARALLEL ABORT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par InParallelAbort
; - - - - - - - - - - - - -
Dlea ParallelIO,a2
Rjmp L_Dev.AbortIO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =PARALLEL STATUS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnParallelStatus
; - - - - - - - - - - - - -
Dlea ParallelIO,a2
Rjsr L_Dev.GetIO
moveq #PDCMD_QUERY,d0
Rjsr L_Dev.DoIO
moveq #0,d3
move.l (a2),a1
move.b $34(a1),d3
Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =PARALLEL ERROR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnParallelError
; - - - - - - - - - - - - -
Dlea ParallelIO,a2
Rjsr L_Dev.GetIO
moveq #0,d3
move.l (a2),a1
move.b IO_ERROR(a1),d3
Ret_Int
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =PARALLEL INPUT$(long[,stop])
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Par FnParallelInput1
; - - - - - - - - - - - - -
Dlea ParallelIO,a2
Rjsr L_Dev.GetIO
bclr #PARB_EOFMODE,IO_PARFLAGS(a1)
move.l d3,-(a3)
Rbra L_ParInput
; - - - - - - - - - - - - -
Lib_Par FnParallelInput2
; - - - - - - - - - - - - -
Dlea ParallelIO,a2
Rjsr L_Dev.GetIO
bset #PARB_EOFMODE,IO_PARFLAGS(a1)
beq.s .Set
cmp.b IO_PTERMARRAY(a1),d3
beq.s .Skip
.Set moveq #7,d0
lea IO_PTERMARRAY(a1),a0
.Loop move.b d3,(a0)+
dbra d0,.Loop
moveq #PDCMD_SETPARAMS,d0
Rjsr L_Dev.DoIO
.Skip Rbra L_ParInput
; - - - - - - - - - - - - -
Lib_Def ParInput
; - - - - - - - - - - - - -
move.l (a3)+,d4
Rble L_IOFonc
cmp.l #String_Max,d4
Rbcc L_IOFonc
* Ask for string space...
movem.l a1/a2,-(sp)
move.l d4,d3
and.l #$FFFE,d3
addq.w #2,d3
Rjsr L_Demande
lea 2(a1,d3.w),a1
move.l a1,HiChaine(a5)
movem.l (sp)+,a1/a2
* Send to device...
move.l a0,d3
move.w d4,(a0)+
move.l a0,IO_DATA(a1)
move.l d4,IO_LENGTH(a1)
moveq #CMD_READ,d0
Rjsr L_Dev.DoIO
Ret_String
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Jump to illegal function call
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Def IOFonc
; - - - - - - - - - - - - -
moveq #23,d0 * Illegal function call
Rjmp L_Error
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Even if you do not have error messages, you MUST
; leave TWO routines empty at the end...
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Empty
Lib_Empty
; - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Finish the library
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_End
; - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TITLE OF THE EXTENSION
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
C_Title dc.b "AMOSPro IO Devices Extension V "
Version
dc.b 0,"$VER: "
Version
dc.b 0
Even
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; END OF THE EXTENSION
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
C_End dc.w 0
even