1030 lines
22 KiB
Plaintext
1030 lines
22 KiB
Plaintext
|
|
;---------------------------------------------------------------------
|
|
; ** ** ** *** *** **** ** *** ** ****
|
|
; **** *** *** ** ** ** ** ** **** ** ** ** **
|
|
; ** ** ** * ** ** ** *** ***** ** ** *** ** **
|
|
; ****** ** ** ** ** ** ** ** ****** ** ** **
|
|
; ** ** ** ** ** ** * ** ** ** ** ** * ** ** ** **
|
|
; ** ** ** ** *** *** ***** ** ** *** ** ****
|
|
;---------------------------------------------------------------------
|
|
; Serial / Parallel / Printer extension source code
|
|
; By François Lionet
|
|
; AMOS, AMOSPro, AMOS Compiler (c) Europress Software 1990-1992
|
|
; To be used with AMOSPro V1.0 and over
|
|
;---------------------------------------------------------------------
|
|
; This file is public domain
|
|
;---------------------------------------------------------------------
|
|
;
|
|
; Please refer to the _Music.s file for more informations...
|
|
;
|
|
;---------------------------------------------------------------------
|
|
|
|
Version MACRO
|
|
dc.b "1.0"
|
|
ENDM
|
|
|
|
|
|
* AMIGA's includes
|
|
INCDIR ":Includes/I/"
|
|
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"
|
|
|
|
*************** AMOS includes
|
|
ExtNb equ 6-1
|
|
|
|
Include "|AMOS_Includes.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,(L36-L35)/2
|
|
dc.w (L37-L36)/2,(L38-L37)/2,(L39-L38)/2,(L40-L39)/2
|
|
dc.w (L41-L40)/2,(L42-L41)/2,(L43-L42)/2,(L44-L43)/2
|
|
dc.w (L45-L44)/2,(L46-L45)/2,(L47-L46)/2,(L48-L47)/2
|
|
dc.w (L49-L48)/2,(L50-L49)/2,(L51-L50)/2,(L52-L51)/2
|
|
dc.w (L53-L52)/2,(L54-L53)/2,(L55-L54)/2,(L56-L55)/2
|
|
dc.w (L57-L56)/2,(L58-L57)/2,(L59-L58)/2,(L60-L59)/2
|
|
dc.w (L61-L60)/2,(L62-L61)/2,(L63-L62)/2,(L64-L63)/2
|
|
dc.w (L65-L64)/2,(L66-L65)/2,(L67-L66)/2,(L68-L67)/2
|
|
dc.w (L69-L68)/2,(L70-L69)/2,(L71-L70)/2,(L72-L71)/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"+$80,"I0,0,0",-1
|
|
dc.w L_SerX,-1
|
|
dc.b "serial ","x"+$80,"I0,0",-1
|
|
dc.w L_SerBuf,-1
|
|
dc.b "serial bu","f"+$80,"I0,0",-1
|
|
dc.w L_SerPar,-1
|
|
dc.b "serial parit","y"+$80,"I0,0",-1
|
|
dc.w -1,L_SerGet
|
|
dc.b "serial ge","t"+$80,"00",-1
|
|
dc.w -1,L_SerInp
|
|
dc.b "serial input","$"+$80,"20",-1
|
|
dc.w L_SerFast,-1
|
|
dc.b "serial fas","t"+$80,"I0",-1
|
|
dc.w L_SerSlow,-1
|
|
dc.b "serial slo","w"+$80,"I0",-1
|
|
dc.w -1,L_SerE
|
|
dc.b "serial erro","r"+$80,"00",-1
|
|
dc.w L_SerOut,-1
|
|
dc.b "serial ou","t"+$80,"I0,0,0",-1
|
|
dc.w -1,L_SerStatus
|
|
dc.b "serial statu","s"+$80,"00",-1
|
|
dc.w -1,L_SerBase
|
|
dc.b "serial bas","e"+$80,"00",-1
|
|
dc.w L_SerAbort,-1
|
|
dc.b "serial abor","t"+$80,"I0",-1
|
|
|
|
; Printer commands
|
|
; ~~~~~~~~~~~~~~~~
|
|
dc.w L_PrtOpen,-1
|
|
dc.b "printer ope","n"+$80,"I",-1
|
|
dc.w L_PrtClose,-1
|
|
dc.b "printer clos","e"+$80,"I",-1
|
|
dc.w L_PrtSend,-1
|
|
dc.b "printer sen","d"+$80,"I2",-1
|
|
dc.w L_PrtRaw,-1
|
|
dc.b "printer ou","t"+$80,"I0,0",-1
|
|
dc.w L_PrtDump1,-1
|
|
dc.b "!printer dum","p"+$80,"I0",-2
|
|
dc.w L_PrtDump2,-1
|
|
dc.b $80,"I0,0t0,0",-2
|
|
dc.w L_PrtDump3,-1
|
|
dc.b $80,"I0,0t0,0,0,0,0",-1
|
|
dc.w L_PrtAbort,-1
|
|
dc.b "printer abor","t"+$80,"I",-1
|
|
dc.w -1,L_PrtCheck
|
|
dc.b "printer chec","k"+$80,"0",-1
|
|
dc.w -1,L_PrtOnLine
|
|
dc.b "printer onlin","e"+$80,"0",-1
|
|
dc.w -1,L_PrtBase
|
|
dc.b "printer bas","e"+$80,"0",-1
|
|
dc.w -1,L_PrtError
|
|
dc.b "printer erro","r"+$80,"0",-1
|
|
; Parallel commands
|
|
; ~~~~~~~~~~~~~~~~~
|
|
dc.w L_ParOpen,-1
|
|
dc.b "parallel ope","n"+$80,"I",-1
|
|
dc.w L_ParClose,-1
|
|
dc.b "parallel clos","e"+$80,"I",-1
|
|
dc.w L_ParSend,-1
|
|
dc.b "parallel sen","d"+$80,"I2",-1
|
|
dc.w L_ParRaw,-1
|
|
dc.b "parallel ou","t"+$80,"I0,0",-1
|
|
dc.w L_ParAbort,-1
|
|
dc.b "parallel abor","t"+$80,"I",-1
|
|
dc.w -1,L_ParCheck
|
|
dc.b "parallel chec","k"+$80,"0",-1
|
|
dc.w -1,L_ParStatus
|
|
dc.b "parallel statu","s"+$80,"0",-1
|
|
dc.w -1,L_ParBase
|
|
dc.b "parallel bas","e"+$80,"0",-1
|
|
dc.w -1,L_ParError
|
|
dc.b "parallel erro","r"+$80,"0",-1
|
|
dc.w -1,L_ParInput1
|
|
dc.b "!parallel input","$"+$80,"20",-2
|
|
dc.w -1,L_ParInput2
|
|
dc.b $80,"20,0",-2
|
|
|
|
dc.w 0
|
|
C_Lib
|
|
|
|
******************************************************************
|
|
* COLD START
|
|
L0 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
|
|
rts
|
|
|
|
******* SCREEN RESET
|
|
SerDef
|
|
******* QUIT
|
|
SerEnd Rbsr L_SCloseA
|
|
Dlea PrinterIO,a2
|
|
Rjsr L_Dev.Close
|
|
Dlea ParallelIO,a2
|
|
Rjsr L_Dev.Close
|
|
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
|
|
|
|
; 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
|
|
|
|
L1
|
|
L2
|
|
|
|
***********************************************************
|
|
* OPEN SERIAL DEVICE
|
|
|
|
******* Seropen logicnumber,physicnumber[,shared,xdisabled,7wires]
|
|
L_SerOp2 equ 3
|
|
L3 clr.l -(a3)
|
|
clr.l -(a3)
|
|
clr.l -(a3)
|
|
Rbra L_SerOp5
|
|
L_SerOp5 equ 4
|
|
L4 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)
|
|
* Appelle le device au moins une fois! BUG!
|
|
.PaSet move.l (a2),a1
|
|
Rbra L_Stpar
|
|
|
|
***********************************************************
|
|
* Serclose [N]
|
|
L_SerClo1 equ 5
|
|
L5 move.l (a3)+,d0
|
|
Rbsr L_GetSerial
|
|
Rjmp L_Dev.Close
|
|
;-----> Close ALL channels
|
|
L_SerClo0 equ 6
|
|
L_SCloseA equ 6
|
|
L6 Dlea SerialIO,a2
|
|
moveq #NSerial-1,d2
|
|
SCloA1 Rjsr L_Dev.Close
|
|
lea 12(a2),a2
|
|
dbra d2,SCloA1
|
|
rts
|
|
L7
|
|
|
|
***********************************************************
|
|
* Serial Send ser,A$
|
|
L_SerSend equ 8
|
|
L8 move.l (a3)+,d2
|
|
move.l (a3)+,d0
|
|
Rbsr L_GetSerA1
|
|
move.l d2,a0
|
|
moveq #0,d0
|
|
move.w (a0)+,d0
|
|
Rbeq L_IFonc
|
|
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
|
|
L_SerOut equ 9
|
|
L9 move.l (a3)+,d2
|
|
Rbmi L_IFonc
|
|
Rbeq L_IFonc
|
|
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)
|
|
L_SerGet equ 10
|
|
L10 move.l (a3)+,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 moveq #0,d2
|
|
rts
|
|
***********************************************************
|
|
* =Serial Input$(Ser)
|
|
L_SerInp equ 11
|
|
L11 move.l (a3)+,d0
|
|
Rbsr L_GetSerA1
|
|
moveq #SDCMD_QUERY,d0
|
|
Rjsr L_Dev.DoIO
|
|
move.l IO_ACTUAL(a1),d4
|
|
beq.s SInpNo
|
|
cmp.l #65530,d4
|
|
Rbcc L_IFonc
|
|
* 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
|
|
moveq #2,d2
|
|
rts
|
|
* Nothing to return
|
|
SInpNo move.l ChVide(a5),d3 * Empty string
|
|
moveq #2,d2
|
|
rts
|
|
|
|
***********************************************************
|
|
* Serial Speed ser,baud
|
|
L_SerSp equ 12
|
|
L12 move.l (a3)+,d1
|
|
move.l (a3)+,d0
|
|
Rbsr L_GetSerA1
|
|
move.l d1,IO_BAUD(a1)
|
|
Rbra L_Stpar
|
|
L_Stpar equ 13
|
|
L13 moveq #SDCMD_SETPARAMS,d0
|
|
Rjmp L_Dev.DoIO
|
|
***********************************************************
|
|
* Serial Bit ser,number,stop
|
|
L_SerBit equ 14
|
|
L14 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_GetSerial
|
|
Rjsr L_Dev.CheckIO
|
|
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
|
|
|
|
**********************************************************
|
|
* =Serial Status(n)
|
|
L_SerStatus equ 22
|
|
L22 move.l (a3)+,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
|
|
moveq #0,d2
|
|
rts
|
|
|
|
**********************************************************
|
|
* =SERIAL BASE
|
|
L_SerBase equ 23
|
|
L23 move.l (a3)+,d0
|
|
Rbsr L_GetSerA1
|
|
move.l a1,d3
|
|
moveq #0,d2
|
|
rts
|
|
|
|
;-----> IO #D0 to A1/a2
|
|
L_GetSerA1 equ 24
|
|
L24 Rbsr L_GetSerial
|
|
Rjmp L_Dev.GetIO
|
|
;-----> Find IO address > D0
|
|
L_GetSerial equ 25
|
|
L25 cmp.l #NSerial,d0
|
|
Rbcc L_IFonc
|
|
mulu #12,d0
|
|
Dlea SerialIO,a2
|
|
add.w d0,a2
|
|
rts
|
|
|
|
*********************************************************************
|
|
* SERIAL ABORT channel
|
|
L_SerAbort equ 26
|
|
L26 move.l (a3)+,d0
|
|
Rbsr L_GetSerial
|
|
Rjmp L_Dev.AbortIO
|
|
|
|
L27
|
|
L28
|
|
*********************************************************************
|
|
* ERRORS
|
|
L_IFonc equ 29
|
|
L29 moveq #23,d0 * Illegal function call
|
|
Rjmp L_Error
|
|
L30
|
|
L31
|
|
L32
|
|
|
|
**********************************************************
|
|
* =PRINTER BASE
|
|
L_PrtBase equ 33
|
|
L33 Dlea PrinterIO,a2
|
|
Rjsr L_Dev.GetIO
|
|
move.l a1,d3
|
|
moveq #0,d2
|
|
rts
|
|
**********************************************************
|
|
* =PRINTER CHECK
|
|
L_PrtCheck equ 34
|
|
L34 Dlea PrinterIO,a2
|
|
Rjsr L_Dev.CheckIO
|
|
move.l d0,d3
|
|
beq.s PrtChk1
|
|
moveq #-1,d3
|
|
PrtChk1 moveq #0,d2
|
|
rts
|
|
|
|
*********************************************************************
|
|
* PRINTER OPEN
|
|
L_PrtOpen equ 35
|
|
L35 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
|
|
Rjmp L_Dev.Open
|
|
|
|
*********************************************************************
|
|
* PRINTER CLOSE
|
|
L_PrtClose equ 36
|
|
L36 Dlea PrinterIO,a2
|
|
Rjmp L_Dev.Close
|
|
|
|
*********************************************************************
|
|
* =PRINTER ERROR
|
|
L_PrtError equ 37
|
|
L37 Dlea PrinterIO,a2
|
|
Rjsr L_Dev.GetIO
|
|
moveq #0,d3
|
|
move.b IO_ERROR(a1),d3
|
|
moveq #0,d2
|
|
rts
|
|
|
|
***********************************************************
|
|
* PRINTER SEND A$
|
|
L_PrtSend equ 38
|
|
L38 Dlea PrinterIO,a2
|
|
Rjsr L_Dev.GetIO
|
|
move.l (a3)+,a0
|
|
moveq #0,d0
|
|
move.w (a0)+,d0
|
|
Rbeq L_IFonc
|
|
move.l d0,IO_LENGTH(a1)
|
|
move.l a0,IO_DATA(a1)
|
|
moveq #CMD_WRITE,d0
|
|
Rjmp L_Dev.SendIO
|
|
|
|
***********************************************************
|
|
* PRINTER SENDRAW ad,lenght
|
|
L_PrtRaw equ 39
|
|
L39 Dlea PrinterIO,a2
|
|
Rjsr L_Dev.GetIO
|
|
move.l (a3)+,d0
|
|
Rbeq L_IFonc
|
|
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
|
|
L_PrtAbort equ 40
|
|
L40 Dlea PrinterIO,a2
|
|
Rjmp L_Dev.AbortIO
|
|
|
|
*********************************************************************
|
|
* =PRINTER ONLINE
|
|
L_PrtOnLine equ 41
|
|
L41 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 moveq #0,d2
|
|
rts
|
|
|
|
*********************************************************************
|
|
* PRINTER DUMP
|
|
|
|
; No parameters
|
|
; ~~~~~~~~~~~~~
|
|
L_PrtDump1 equ 42
|
|
L42 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
|
|
|
|
; Four parameters
|
|
; ~~~~~~~~~~~~~~~
|
|
L_PrtDump2 equ 43
|
|
L43 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_IFonc
|
|
move.w width-DT(a2),d1
|
|
divu.w d0,d1
|
|
tst.w d1
|
|
Rbeq L_IFonc
|
|
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_IFonc
|
|
move.w height-DT(a2),d1
|
|
divu.w d0,d1
|
|
tst.w d1
|
|
Rbeq L_IFonc
|
|
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
|
|
|
|
; Tous les parametres
|
|
; ~~~~~~~~~~~~~~~~~~~
|
|
L_PrtDump3 equ 44
|
|
L44 movem.l a4-a6,-(sp)
|
|
Dload a2
|
|
Rbsr L_Dump3a
|
|
Rbra L_Dump
|
|
|
|
; DUMP Routines...
|
|
; ~~~~~~~~~~~~~~~~
|
|
L_Dump3a equ 45
|
|
L45 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
|
|
L_Dump2a equ 46
|
|
L46 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
|
|
; Do the screen dump
|
|
; ~~~~~~~~~~~~~~~~~~
|
|
L_Dump equ 47
|
|
L47
|
|
; Initialise colour map
|
|
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
|
|
move.w #11,28(a1) ; command
|
|
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
|
|
move.l a6,-(sp)
|
|
move.l $4.w,a6
|
|
jsr _LVOSendIO(a6) ; Do it!!!! (at last)
|
|
move.l (sp)+,a6
|
|
move.w d0,-(sp)
|
|
|
|
; 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
|
|
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
L_GetScr equ 48
|
|
L48 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
|
|
|
|
L49
|
|
L50
|
|
L51
|
|
L52
|
|
**********************************************************
|
|
* =PARALLEL BASE
|
|
L_ParBase equ 53
|
|
L53 Dlea ParallelIO,a2
|
|
Rjsr L_Dev.GetIO
|
|
move.l a1,d3
|
|
moveq #0,d2
|
|
rts
|
|
|
|
**********************************************************
|
|
* =PARALLEL CHECK
|
|
L_ParCheck equ 54
|
|
L54 Dlea ParallelIO,a2
|
|
Rjsr L_Dev.CheckIO
|
|
move.l d0,d3
|
|
beq.s ParChk1
|
|
moveq #-1,d3
|
|
ParChk1 moveq #0,d2
|
|
rts
|
|
|
|
*********************************************************************
|
|
* PARALLEL OPEN
|
|
L_ParOpen equ 55
|
|
L55 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
|
|
L_ParClose equ 56
|
|
L56 Dlea ParallelIO,a2
|
|
Rjmp L_Dev.Close
|
|
|
|
*********************************************************************
|
|
L57
|
|
|
|
***********************************************************
|
|
* PARALLEL SEND A$
|
|
L_ParSend equ 58
|
|
L58 Dlea ParallelIO,a2
|
|
Rjsr L_Dev.GetIO
|
|
move.l (a3)+,a0
|
|
moveq #0,d0
|
|
move.w (a0)+,d0
|
|
Rbeq L_IFonc
|
|
move.l d0,IO_LENGTH(a1)
|
|
move.l a0,IO_DATA(a1)
|
|
moveq #CMD_WRITE,d0
|
|
Rjmp L_Dev.DoIO
|
|
|
|
***********************************************************
|
|
* PARALLEL SENDRAW ad,lenght
|
|
L_ParRaw equ 59
|
|
L59 Dlea ParallelIO,a2
|
|
Rjsr L_Dev.GetIO
|
|
move.l (a3)+,d0
|
|
Rbeq L_IFonc
|
|
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
|
|
L_ParAbort equ 60
|
|
L60 Dlea ParallelIO,a2
|
|
Rjmp L_Dev.AbortIO
|
|
|
|
*********************************************************************
|
|
* =PARALLEL STATUS
|
|
L_ParStatus equ 61
|
|
L61 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
|
|
moveq #0,d2
|
|
rts
|
|
|
|
*********************************************************************
|
|
* =PARALLEL ERROR
|
|
L_ParError equ 62
|
|
L62 Dlea ParallelIO,a2
|
|
Rjsr L_Dev.GetIO
|
|
moveq #0,d3
|
|
move.l (a2),a1
|
|
move.b IO_ERROR(a1),d3
|
|
moveq #0,d2
|
|
rts
|
|
|
|
*********************************************************************
|
|
* =PARALLEL INPUT$(long[,stop])
|
|
L_ParInput1 equ 63
|
|
L63 Dlea ParallelIO,a2
|
|
Rjsr L_Dev.GetIO
|
|
bclr #PARB_EOFMODE,IO_PARFLAGS(a1)
|
|
Rbra L_ParInput
|
|
L_ParInput2 equ 64
|
|
L64 Dlea ParallelIO,a2
|
|
Rjsr L_Dev.GetIO
|
|
move.l (a3)+,d3
|
|
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
|
|
; Appel
|
|
L_ParInput equ 65
|
|
L65 move.l (a3)+,d4
|
|
Rble L_IFonc
|
|
cmp.l #65000,d4
|
|
Rbcc L_IFonc
|
|
* 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
|
|
moveq #2,d2
|
|
rts
|
|
|
|
L66
|
|
L67
|
|
L68
|
|
L69
|
|
|
|
**********************************************************************
|
|
* SPACE FOR ERROR ROUTINES...
|
|
L70
|
|
L71
|
|
L72
|
|
*********************************************************************
|
|
|
|
******* TITLE MESSAGE
|
|
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
|