amos-professional/AMOS/Tutorial/Extensions/__uae____io_Ports_s

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