amos-professional/+W.s

16798 lines
311 KiB
ArmAsm
Raw Permalink Blame History

;
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
; LIBRAIRIE GRAPHIQUE AMOS
;
;
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
; 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.
;
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPT P+
***************************************************************************
IFND EZFlag
EZFlag equ 0
ENDC
***************************************************************************
IncDir "includes/"
Include "exec/types.i"
Include "exec/interrupts.i"
Include "graphics/gfx.i"
Include "graphics/layers.i"
Include "graphics/clip.i"
Include "hardware/intbits.i"
Include "devices/input.i"
Include "devices/inputevent.i"
Include "+Debug.s"
Include "+AMOS_Includes.s"
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Version MACRO
dc.b 0,"$VER: 2.00",0
even
ENDM
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WDebut bra Startall Cold start
bra Endall End
dc.l L_Trappe Length of data zone
bra IceStart Access of System functions
bra IceEnd Stop access of system functions
dc.b "P110" Version Pro 1.10
BugBug movem.l d0-d2/a0-a2,-(sp)
.Ll move.w #$FF0,$DFF180
btst #6,$BFE001
bne.s .Ll
move.w #20,d0
.L0 move.w #10000,d1
.L1 move.w d0,$DFF180
dbra d1,.L1
dbra d0,.L0
btst #6,$BFE001
beq.s .Ill
movem.l (sp)+,d0-d2/a0-a2
rts
.Ill moveq #0,d1
bsr TAMOSWb
movem.l (sp)+,d0-d2/a0-a2
illegal
rts
Version
IFEQ EZFlag
***********************************************************
* COLLISIONS HARD
******* SET HARDCOL
* D1= Sprites
* D2= Enable
* D3= Compare
HColSet and.w #$000F,d1
lsl.w #8,d1
lsl.w #4,d1
and.w #$003F,d2
lsl.w #6,d2
and.w #$003F,d3
or.w d2,d1
or.w d3,d1
move.w d1,Circuits+$98
moveq #0,d0
rts
******* =HARDCOL
* D1= #Sprite / -1 Si bitplanes
HColGet lea T_TColl(a5),a0
move.l a0,a1
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
move.w Circuits+$0E,d2
tst.w d1
bmi.s HCol3
* Sprites
and.w #$0006,d1
lsl.w #2,d1
lea HColT(pc),a0
add.w d1,a0
moveq #0,d3
moveq #%00000011,d4
moveq #0,d1
move.b (a0)+,d0
HCol1 bmi.s HCol2
btst d0,d2
beq.s HCol2
or.w d4,d3
cmp.w #$0100,d3
bcc.s HCol2
moveq #-1,d1
HCol2 lsl.w #2,d4
move.b (a0)+,d0
bne.s HCol1
* Ok!
ror.w #8,d3
move.w d3,(a1)
moveq #0,d0
rts
******* Playfield / Playfield
HCol3 moveq #0,d1
btst #0,d2
beq.s HCol4
moveq #-1,d1
HCol4 rts
******* Table des bits a tester!
HColT dc.b -1,9,10,11,1,5,0,0
dc.b 9,-1,12,13,2,6,0,0
dc.b 10,12,-1,14,3,7,0,0
dc.b 11,13,14,-1,4,8,0,0
ENDC
***********************************************************
* COLLISIONS SOFT
******* Routine collision:
* A3/A2= descripteur sprite concerne
* D0/D1= bob dest DX/DY
* D2= Image!
* D4/D5= bob source DX/DY
* D6/D7= bob source FX/FY
* A4= banque!
******* RETOUR: BNE-> Pas coll
******* BEQ-> Coll
ColRout:
* Pointe le descripteur
and.w #$3FFF,d2
beq ColRF
cmp.w (a4),d2
bhi ColRF
lsl.w #3,d2
lea -8+2(a4,d2.w),a0
move.l 4(a0),d2
ble ColRF
move.l d2,a1
move.l (a0),d2
beq ColRF
move.l d2,a0
* Prend les coordonnees
move.w 6(a0),d2
lsl.w #2,d2
asr.w #2,d2
sub.w d2,d0
sub.w 8(a0),d1
move.w (a0),d2
lsl.w #4,d2
move.w 2(a0),d3
add.w d0,d2
add.w d1,d3
* Croisement?
cmp.w d4,d2
ble ColRF
cmp.w d6,d0
bge ColRF
cmp.w d5,d3
ble ColRF
cmp.w d7,d1
bge ColRF
* Verifie avec le blitter!
movem.l d4-d7/a2/a3,-(sp)
cmp.w d0,d4 * Met le plus a gauche en D0
bge.s ColR1
exg.l d0,d4
exg.l d1,d5
exg.l d2,d6
exg.l d3,d7
exg.l a1,a3
exg.l a0,a2
ColR1: cmp.w d5,d1
bge.s ColR5
move.w d5,-(sp)
sub.w d1,(sp)
clr.w -(sp)
ColR2: cmp.w d3,d7
bge.s ColR3
move.w d7,-(sp)
bra.s ColR4
ColR3: move.w d3,-(sp)
ColR4: sub.w d5,(sp)
bra.s ColR7a
ColR5: clr.w -(sp)
move.w d1,-(sp)
sub.w d5,(sp)
cmp.w d3,d7
bge.s ColR6
move.w d7,-(sp)
bra.s ColR7
ColR6: move.w d3,-(sp)
ColR7: sub.w d1,(sp)
ColR7a: move.w d4,d1
sub.w d0,d1
cmp.w d2,d6
bge.s ColR8
move.w d6,d3
bra.s ColR9
ColR8: move.w d2,d3
ColR9: sub.w d4,d3
move.w d1,d0
lsl.w #8,d0
lsl.w #4,d0
move.w d0,BltCon1(a6)
move.w #%0000110011000000,BltCon0(a6)
lsr.w #4,d3
tst.w d0
beq.s ColRA
addq.w #1,d3
ColRA: move.w d3,d4
move.w (sp)+,d0
ble.s ColRF0
lsl.w #6,d0
or.w d0,d4
lsl.w #1,d3
move.w (a0),d0
lsl.w #1,d0
; addq.w #2,d0
move.w d0,d6
sub.w d3,d0
move.w d0,BltModA(a6)
move.w (a2),d0
lsl.w #1,d0
; addq.w #2,d0
move.w d0,d5
sub.w d3,d0
move.w d0,BltModB(a6)
mulu (sp)+,d5
lea 4(a3,d5.w),a3
move.l a3,BltAdB(a6)
move.w d1,d0
lsr.w #4,d0
lsl.w #1,d0
mulu (sp)+,d6
add.w d0,d6
lea 4(a1,d6.w),a1
move.l a1,BltAdA(a6)
move.w #-1,BltMaskD(a6)
and.w #$000F,d1
lsl.w #1,d1
lea MCls(pc),a1
move.w 0(a1,d1.w),BltMaskG(a6)
move.w d4,BltSize(a6)
movem.l (sp)+,d4-d7/a2/a3
ColRW: bsr BlitWait
btst #13,DmaConR(a6)
rts
* Yapa collision!
ColRF: moveq #1,d0
rts
* Yapa special!
ColRF0: addq.l #4,sp
ColRF1: movem.l (sp)+,d4-d7/a2/a3
moveq #1,d0
rts
***********************************************************
* BOB COLLIDE
* D1= Numero du bob
* D2= Debut a explorer (Bit 31===> TO SPRITE)
* D3= Fin a explorer
BbColl: movem.l a2-a6/d2-d7,-(sp)
lea Circuits,a6
bsr OwnBlit
lea T_TColl(a5),a0
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
moveq #0,d7
move.l T_SprBank(a5),d0
beq BbColX
move.l d0,a4
bsr BobAd
bne BbColX
* Coordonnees du bob a tester!
move.l a1,a2
tst.b BbAct(a2)
bmi BbColX
move.w d1,a0
move.l BbEc(a2),d1
move.w BbX(a2),d4
move.w BbY(a2),d5
move.w BbI(a2),d0
and.w #$3FFF,d0
beq BbColX
cmp.w (a4),d0
bhi BbColX
lsl.w #3,d0
lea -8+2(a4,d0.w),a2
move.l 4(a2),d0
ble BbColX
move.l d0,a3
move.l (a2),d0
beq BbColX
move.l d0,a2
move.w 6(a2),d0
lsl.w #2,d0
asr.w #2,d0
sub.w d0,d4
sub.w 8(a2),d5
move.w d4,d6
move.w d5,d7
move.w (a2),d0
lsl.w #4,d0
add.w d0,d6
add.w 2(a2),d7
btst #31,d2
bne GoToSp
exg.l a0,a5
move.l T_BbDeb(a0),d0
lea T_TColl(a0),a0
******* Explore la table des bobs!
BbCol1: move.l d0,a1
move.w BbNb(a1),d0
cmp.w d2,d0
bcs.s BbColN
cmp.w d3,d0
bhi.s BbColX
cmp.w a5,d0
beq.s BbColN
cmp.l BbEc(a1),d1
bne.s BbColN
tst.b BbAct(a1)
bmi.s BbColN
movem.l d0-d3/a0/a1,-(sp)
move.w BbX(a1),d0
move.w BbY(a1),d1
move.w BbI(a1),d2
bsr ColRout
movem.l (sp)+,d0-d3/a0/a1
bne.s BbColN
swap d2
and.w #$00FF,d0
move.w d0,d2
lsr.w #3,d0
and.w #$7,d2
bset d2,0(a0,d0.w)
bset #31,d7
swap d2
BbColN: move.l BbNext(a1),d0
bne.s BbCol1
******* Fini!
BbColX: bsr DOwnBlit
btst #31,d7
bne.s BbColT
moveq #0,d0
bra.s BbColXx
BbColT moveq #-1,d0
BbColXx movem.l (sp)+,a2-a6/d2-d7
rts
******* Conversion---> HARD
GoToSp: movem.w d2-d3,-(sp)
move.l d1,a0
sub.w d4,d6
sub.w d5,d7
move.w d4,d1
move.w d5,d2
bsr CXyS
move.w d1,d4
move.w d2,d5
add.w d4,d6
add.w d5,d7
movem.w (sp)+,d2-d3
moveq #-1,d1
bra BbToSp
IFEQ EZFlag
***********************************************************
* SPRITE COLLIDE
* D1= Numero du sprite
* D2= Debut a explorer
* D3= Fin a explorer
SpColl: movem.l a2-a6/d2-d7,-(sp)
lea Circuits,a6
bsr OwnBlit
lea T_TColl(a5),a0
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
moveq #0,d7
move.l T_SprBank(a5),d0
beq BbColX
move.l d0,a4
* Coordonnees du sprite a tester!
cmp.w #64,d1
bcc BbColX
lea T_HsTAct(a5),a2
move.w d1,d0
lsl.w #3,d0
add.w d0,a2
move.w 2(a2),d4
move.w 4(a2),d5
move.w 6(a2),d0
and.w #$3FFF,d0
beq BbColX
cmp.w (a4),d0
bhi BbColX
lsl.w #3,d0
lea -8+2(a4,d0.w),a2
move.l 4(a2),d0
ble BbColX
move.l d0,a3
move.l (a2),d0
beq BbColX
move.l d0,a2
move.w 6(a2),d0
lsl.w #2,d0
asr.w #2,d0
sub.w d0,d4
sub.w 8(a2),d5
move.w d4,d6
move.w d5,d7
move.w (a2),d0
lsl.w #4,d0
add.w d0,d6
add.w 2(a2),d7
btst #31,d2
bne SpToBb
ENDC
BbToSp: cmp.w #64,d3
bcc BbColX
cmp.w d2,d3
bcs BbColX
lea T_TColl(a5),a0
lea T_HsTAct(a5),a1
move.w d2,d0
lsl.w #3,d2
add.w d2,a1
move.w d3,a5
******* Explore la table des sprites!
SpCol1: cmp.w d1,d0
beq.s SpColN
tst.w (a1)
bmi.s SpColN
move.w 6(a1),d2
ble.s SpColN
movem.l d0/d1/a0/a1,-(sp)
move.w 2(a1),d0
move.w 4(a1),d1
bsr ColRout
movem.l (sp)+,d0/d1/a0/a1
bne.s SpColN
move.w d0,d2
move.w d0,d3
lsr.w #3,d2
and.w #$7,d3
bset d3,0(a0,d2.w)
bset #31,d7
SpColN: addq.w #1,d0
addq.l #8,a1
cmp.w a5,d0
bls.s SpCol1
bra BbColX
******* Fin de SPRITE/BOB
SpToBb: move.l T_BbDeb(a5),d0
lea T_TColl(a5),a5
SbCol1: move.l d0,a1
move.w BbNb(a1),d0
cmp.w d2,d0
bcs SbColN
cmp.w d3,d0
bhi BbColX
tst.b BbAct(a1)
bmi SbColN
movem.l d0/d2/d3/a1,-(sp)
move.l BbEc(a1),a0
move.w BbX(a1),d1
move.w BbY(a1),d2
bsr CXyS
move.w d1,d0
move.w d2,d1
move.w BbI(a1),d2
bsr ColRout
movem.l (sp)+,d0/d2/d3/a1
bne.s SbColN
and.w #$00FF,d0
move.w d0,d1
lsr.w #3,d0
and.w #$7,d1
bset d1,0(a5,d0.w)
bset #31,d7
SbColN: move.l BbNext(a1),d0
bne.s SbCol1
bra BbColX
***********************************************************
* =COLL(n) ramene la collision d'un bob/sprite
GetCol: lea T_TColl(a5),a0
tst.l d1
bmi.s GetC2
and.w #$FF,d1
move.w d1,d0
lsr.w #3,d0
and.w #$7,d1
btst d1,0(a0,d0.w)
bne.s GetC1
GetC0: moveq #0,d0
rts
GetC1: moveq #-1,d0
rts
* Ramene le premier en collision
GetC2: neg.l d1
cmp.l #255,d1
bcc.s GetC0
move.w d1,d0
lsr.w #3,d0
add.w d0,a0
move.l d1,d0
and.w #7,d1
.loop btst d1,(a0)
bne.s .found
addq.w #1,d0
addq.w #1,d1
cmp.w #8,d1
bcs.s .loop
moveq #0,d1
addq.l #1,a0
cmp.w #256,d0
bcs.s .loop
bra.s GetC0
.found rts
***********************************************************
* HOT SPOT!
* A2= descripteur
* D1= Mode
* D2= Dx
* D3= Dy
SpotH: move.l (a2),d0
beq.s SpoE
move.l d0,a1
tst.w d1
beq.s Spo4
******* Mode FIXE!
move.w (a1),d2
lsl.w #4,d2
move.w 2(a1),d3
subq.w #1,d1
* En X
move.w d1,d0
lsr.w #4,d0
and.w #3,d0
subq.w #1,d0
bhi.s Spo2
beq.s Spo1
moveq #0,d2
Spo1: lsr.w #1,d2
* En Y
Spo2: and.w #3,d1
subq.w #1,d1
bhi.s Spo4
beq.s Spo3
moveq #0,d3
Spo3: lsr.w #1,d3
* Poke, en respectant les FLAGS!
Spo4: and.w #$C000,6(a1)
and.w #$3FFF,d2
or.w d2,6(a1)
move.w d3,8(a1)
moveq #0,d0
rts
SpoE: moveq #-1,d0
rts
***********************************************************
* GET BOB/BLOC
* A1= Ecran
* A2= descripteur
* D2/D3= X1/Y1
* D4/D5= TX/TY
* D6= X2
GetBob: movem.l d1-d7/a0-a6,-(sp)
move.l a1,a5
* Masque droite
move.w d4,d6
and.w #$000F,d6
lsl.w #1,d6
move.w d6,a4
* Taille en octets!
move.w EcNPlan(a5),d7
add.w #15,d4
lsr.w #4,d4
move.w d4,d6
lsl.w #1,d6
move.w d6,d1
mulu d5,d1
mulu d7,d1
******* Efface l'ancien???
move.l (a2),d0
beq.s GtBb1
move.l d0,a1 * Efface le bob
move.w (a1),d0
lsl.w #1,d0
mulu 2(a1),d0
mulu 4(a1),d0
cmp.l d0,d1
beq.s GtBb1
add.l #10,d0
bsr FreeMm
clr.l (a2)
GtBb1: move.l 4(a2),d0
ble.s GtBb2
move.l d0,a1
move.l (a1),d0
bsr FreeMm
GtBb2 clr.l 4(a2)
******* Reserve le mouveau
tst.l (a2)
bne.s GtBb3
move.l d1,d0
add.l #10,d0
bsr ChipMm2
beq GtBbE
move.l d0,(a2)
******* Ca y est!
GtBb3: move.l (a2),a2
move.w d4,(a2)+
move.w d5,(a2)+
move.w d7,(a2)+
clr.w (a2)+
clr.w (a2)+
******* GETTE!
lea Circuits,a6
bsr OwnBlit
subq.w #1,d7
move.w d2,d0
and.w #$000F,d0
bne.s GtBc
******* Au mot!
moveq #-1,d1
move.w d1,BltMaskG(a6)
move.w a4,d0
beq.s GtBbM
lea MCls(pc),a0
move.w 0(a0,d0.w),d1
not.w d1
GtBbM: move.w d1,BltMaskD(a6)
move.w EcTLigne(a5),d1
mulu d1,d3
lsr.w #4,d2
lsl.w #1,d2
ext.l d2
add.l d2,d3
lea EcCurrent(a5),a1
sub.w d6,d1
move.w d1,BltModA(a6)
move.l a2,BltAdD(a6)
clr.w BltModD(a6)
lsl.w #6,d5
or.w d5,d4
move.w #%0000100111110000,BltCon0(a6)
clr.w BltCon1(a6)
GtBb5: move.l (a1)+,a0
add.l d3,a0
move.l a0,BltAdA(a6)
move.w d4,BltSize(a6)
GtBb6: bsr BlitWait
dbra d7,GtBB5
bra GtBbX
******* Au pixel!
GtBc: move.w #%0000010111001100,BltCon0(a6)
moveq #16,d1
sub.w d0,d1
moveq #12,d0
lsl.w d0,d1
move.w d1,BltCon1(a6)
move.w EcTligne(a5),d1
ext.l d1
mulu d1,d3
lsr.w #4,d2
lsl.w #1,d2
ext.l d2
add.l d2,d3
lea EcCurrent(a5),a1
subq.l #2,a2
addq.w #1,d4
or.w #%0000000001000000,d4
subq.w #1,d5
ext.l d6
move.w a4,d2
lea MCls(pc),a0
move.w 0(a0,d2.w),d2
bmi.s GtBc1
not.w d2
GtBc1: move.l (a1)+,a0
add.l d3,a0
move.w d5,d0
GtBc2: move.l a0,BltAdB(a6)
move.w (a2),a4
move.l a2,BltAdD(a6)
move.w d4,BltSize(a6)
move.l a2,a5
add.l d1,a0
add.l d6,a2
GtBc3: bsr BlitWait
move.w a4,(a5)
and.w d2,(a2)
dbra d0,GtBc2
dbra d7,GtBc1
******* FINI! Pas d'erreur
GtBbX: bsr DOwnBlit
movem.l (sp)+,d1-d7/a0-a6
moveq #0,d0
rts
******* Out of mem
GtBbE: movem.l (sp)+,d1-d7/a0-a6
moveq #-1,d0
rts
***********************************************************
* INITIALISATION BOBS / D0= Nombre de bobs!
BbInit:
********
clr.l T_BbDeb(a5)
* Efface ce qui etait reserve
move.w d0,-(sp)
bsr BbEnd
move.w (sp)+,d1
* Reserve la memoire pour les tables priorites
move.w d1,T_BbMax(a5)
ext.l d1
lsl.w #2,d1
move.l d1,d0
bsr FastMm
beq GFatal
move.l d0,T_BbPrio(a5)
move.l d1,d0
bsr FastMm
beq GFatal
move.l d0,T_BbPrio2(a5)
moveq #0,d0
rts
***********************************************************
* FIN DES BOBS
BbEnd:
*******
move.w T_BbMax(a5),d1
ext.l d1
lsl.l #2,d1
move.l T_BbPrio(a5),d0
beq.s BOBE1
move.l d0,a1
move.l d1,d0
bsr FreeMm
BOBE1: move.l T_BbPrio2(a5),d0
beq.s BOBE2
move.l d0,a1
move.l d1,d0
bsr FreeMm
BOBE2: moveq #0,d0
rts
***********************************************************
* BOB X/Y
BobXY: bsr BobAd
bne.s BobxyE
move.w BbX(a1),d1
move.w BbY(a1),d2
move.w BbI(a1),d3
moveq #0,d0
BobxyE: rts
***********************************************************
* PATCH BOB / ICON
* Dessine simplement un bob/icon
* A1- Buffer de calcul
* A2- Descripteur bob/icon
* D1- Image retournee???
* D2/D3- Coordonnees
* D4- Minterms (0 si rien)
* D5- APlan
TPatch
movem.l d1-d7/a0-a6,-(sp)
move.l a1,a4
* Va retourner le bob
move.l a2,a0
move.w d1,d0
and.w #$C000,d0
bsr Retourne
* Parametres de l'ecran courant
move.l T_EcCourant(a5),a0 * Calculssss
move.w EcClipX0(a0),d0
and.w #$FFF0,d0
move.w d0,BbLimG(a4)
move.w EcClipY0(a0),BbLimH(a4)
move.w EcClipX1(a0),d0
add.w #15,d0
and.w #$FFF0,d0
move.w d0,BbLimD(a4)
move.w EcClipY1(a0),BbLimB(a4)
tst.w d4
beq.s Patch1
and.w #$00FF,d4
bset #15,d4
Patch1 move.w d4,BbACon(a4)
move.w d5,BbAPlan(a4)
move.l a0,BbEc(a4)
exg.l d3,d1
bset #31,d3 * Flag PAS POINT CHAUD!
bsr BobCalc
bne.s PatchO
* Gestion de l'autoback
move.l T_EcCourant(a5),a0
tst.w EcAuto(a0)
beq.s Patch2
bsr TAbk1
bsr PBobA
bsr TAbk2
bsr PBobA
bsr TAbk3
bra.s PatchO
Patch2 bsr PBobA
* Fini!
PatchO moveq #0,d0
movem.l (sp)+,d1-d7/a0-a6
rts
* Appelle la routine d'affichage
PBobA lea Circuits,a6
bsr OwnBlit
move.w BbASize(a4),d2
move.w BbTPlan(a4),d4
ext.l d4
move.l BbAData(a4),a0
move.l BbEc(a4),a3
lea EcCurrent(a3),a3
move.w BbAModD(a4),d0
move.w d0,BltModC(a6)
move.w d0,BltModD(a6)
move.l BbADraw(a4),a2
move.l BbAMask(a4),d5
jsr (a2)
bsr BlitWait
bra DOwnBlit
***********************************************************
* CREATION / CHANGEMENT D'UN BOB
* D1= Numero du CANAL
* D2= X
* D3= Y
* D4= Image
* D5= MODE DECOR
* D6= Plans affiches
* D7= Minterms
BobSet:
********
cmp.w T_BbMax(a5),d1
bcc CreBbS
******* Ecris sur l'ancienne - SI PRESENT -
move.l a1,a0
move.l T_BbDeb(a5),d0
beq.s CreBb1
CreBb0: move.l d0,a1
cmp.w BbNb(a1),d1
beq.s CreBb5
bcs.s CreBb2
move.l BbNext(a1),d0
bne.s CreBb0
* Met a la fin!
bsr ResBOB
bne CreBbE
move.l a1,BbPrev(a0)
move.l a0,BbNext(a1)
move.l a0,a1
bra.s CreBb5
* Au tout debut
CreBb1: bsr ResBOB
bne CreBbE
move.l a0,T_BbDeb(a5)
move.l a0,a1
bra.s CreBb5
* Insere la nouvelle
CreBb2: bsr ResBOB
bne CreBbE
move.l BbPrev(a1),d0
move.l a0,BbPrev(a1)
move.l d0,BbPrev(a0)
bne.s CreBb3
move.l T_BbDeb(a5),d1
move.l a0,T_BbDeb(a5)
bra.s CreBb4
CreBb3: move.l d0,a2
move.l BbNext(a2),d1
move.l a0,BbNext(a2)
CreBb4: move.l d1,BbNext(a0)
move.l a0,a1
* Poke les coordonnees
CreBb5: move.l #EntNul,d7
move.b BbAct(a1),d6
bmi.s CreBb9
cmp.l d7,d2
beq.s CreBb6
move.w d2,BbX(a1)
bset #1,d6
CreBb6: cmp.l d7,d3
beq.s CreBb7
move.w d3,BbY(a1)
bset #2,d6
CreBb7: cmp.l d7,d4
beq.s CreBb8
move.w d4,BbI(a1)
bset #0,d6
CreBb8: move.b d6,BbAct(a1)
* Doit actualiser les bob
CreBb9: bset #BitBobs,T_Actualise(a5)
moveq #0,d0
rts
******* Erreur!
CreBbS: moveq #1,d0
CreBbE: tst.w d0
rts
******* CREATION DE LA TABLE!
ResBOB: move.l #BbLong,d0
bsr FastMm
beq.s ResBErr
move.l d0,a0
move.w d1,BbNb(a0)
move.l T_EcCourant(a5),a2
move.l a2,BbEc(a0)
move.w EcTx(a2),BbLimD(a0)
move.w EcTy(a2),BbLimB(a0)
move.w d6,BbAPlan(a0)
and.w #$00FF,d7
beq.s ResBb0
bset #15,d7
ResBb0 move.w d7,BbACon(a0)
move.w #$01,BbDecor(a0)
btst #BitDble,EcFlags(a2)
beq.s ResBb1
addq.w #1,BbDecor(a0)
move.w #Decor,BbDCur2(a0)
ResBb1: tst.w d5
bpl.s ResBb2
clr.w BbDecor(a0)
ResBb2: move.w d5,BbEff(a0)
moveq #0,d0
rts
* Erreur memoire!
ResBErr moveq #-1,d0
rts
***********************************************************
* BOB OFF d1=#
BobOff:
*******
move.l T_BbDeb(a5),d0
beq.s DBb2
DBb1: move.l d0,a1
cmp.w BbNb(a1),d1
beq.s DBb3
bcs.s DBb2
move.l BbNext(a1),d0
bne.s DBb1
DBb2: moveq #1,d0
rts
DBb3: move.b #-1,BbAct(a1)
bset #BitBobs,T_Actualise(a5)
moveq #0,d0
rts
***********************************************************
* ARRET TOUS LES BOBS
BobSOff:
*******
movem.l d0/a1/a2,-(sp)
move.l T_BbDeb(a5),d0
beq.s DBbs2
DBbs1: move.l d0,a1
move.b #-1,BbAct(a1)
move.l BbNext(a1),d0
bne.s DBbs1
DBbs2: bset #BitBobs,T_Actualise(a5)
movem.l (sp)+,d0/a1/a2
moveq #0,d0
rts
***********************************************************
* LIMIT BOB tous, Ecran courant!
* D1= # ou -1, D2/D3->D4/D5
BobLim:
*******
movem.l d2-d7,-(sp)
move.l T_BbDeb(a5),d0
beq LBbX
* Verifie les coordonnees
move.l T_EcCourant(a5),d6
move.l d6,a0
move.l #EntNul,d7
cmp.w d7,d2
bne.s LBba
clr.w d2
LBba: cmp.w d7,d3
bne.s LBbb
clr.w d3
LBbb: cmp.w d7,d4
bne.s LBbc
move.w EcTx(a0),d4
LBbc: cmp.w d7,d5
bne.s LBbd
move.w EcTy(a0),d5
LBbd: and.w #$FFF0,d2
and.w #$FFF0,d4
cmp.w d2,d4
bls.s LbbE
cmp.w d2,d5
bls.s LbbE
cmp.w EcTx(a0),d4
bhi.s LbbE
cmp.w EcTy(a0),d5
bhi.s LbbE
* Change les bobs!
LBb1: move.l d0,a1
tst.w BbAct(a1)
bmi.s LBb3
cmp.l BbEc(a1),d6
bne.s LBb3
tst.w d1
bmi.s LBb2
cmp.w BbNb(a1),d1
bhi.s LBb3
bcs.s LBbX
LBb2: move.w d2,BbLimG(a1)
move.w d3,BbLimH(a1)
move.w d4,BbLimD(a1)
move.w d5,BbLimB(a1)
bset #0,BbAct(a1) ***Bug?
bset #BitBobs,T_Actualise(a5)
LBb3: move.l BbNext(a1),d0
bne.s LBb1
LBbX: moveq #0,d0
LBbXx movem.l (sp)+,d2-d7
rts
LBbE: moveq #-1,d0
bra.s LBbXx
***********************************************************
* PRIORITY ON/OFF
* D1= on/off - Ecran courant (-1 indet)
* D2= normal - reversed (-1 indet)
TPrio tst.l d1
bmi.s TPri2
beq.s TPri1
move.l T_EcCourant(a5),d1
TPri1 move.l d1,T_Priorite(a5)
TPri2 tst.l d2
bmi.s TPri3
move.w d2,T_PriRev(a5)
TPri3 moveq #0,d0
rts
***********************************************************
* ENLEVE LES BOBS D'UN ECRAN!
* A0= Ecran
BbEcOff:
********
movem.l d1-d7/a0/a1,-(sp)
move.l a0,d7
move.l T_BbDeb(a5),d0
beq.s BbEO2
BbEO1: move.l d0,a1
cmp.l BbEc(a1),d7
beq.s BbEO3
move.l BbNext(a1),d0
bne.s BbEO1
BbEO2: movem.l (sp)+,d1-d7/a0/a1
moveq #0,d0
rts
******* Enleve le bob!
BbEO3: move.l BbNext(a1),d0
bsr DelBob
* Encore?
tst.l d0
bne.s BbEO1
bra.s BbEO2
******* Efface la definition du bob (A1)
DelBob: movem.l d0-d7/a0-a2,-(sp)
move.l a1,a2
* Enleve les buffers de decor, s'il y en a!
moveq #0,d0
move.w BbDLBuf(a2),d0
beq.s DBo1
lsl.l #1,d0
move.l BbDABuf(a2),a1
bsr FreeMm
DBo1: moveq #0,d0
move.w BbDLBuf+Decor(a2),d0
beq.s DBo2
lsl.l #1,d0
move.l BbDABuf+Decor(a2),a1
bsr FreeMm
* Enleve le canal d'animation
DBo2: lea BbAct(a2),a0
bsr DAdAMAL
* Enleve le bob
move.l BbNext(a2),d3
move.l BbPrev(a2),d2
beq.s DBo3
move.l d2,a0
move.l d3,BbNext(a0)
bra.s DBo4
DBo3: move.l d3,T_BbDeb(a5)
DBo4: tst.l d3
beq.s DBo5
move.l d3,a0
move.l d2,BbPrev(a0)
DBo5: move.l a2,a1
move.l #BbLong,d0
bsr FreeMm
movem.l (sp)+,d0-d7/a0-a2
rts
***********************************************************
* ADRESSE D'UN BOB: D1= Numero!
BobAd:
*******
move.l T_BbDeb(a5),d0
beq.s AdBb1
AdBb0: move.l d0,a1
cmp.w BbNb(a1),d1
beq.s AdBb2
bcs.s AdBb1
move.l BbNext(a1),d0
bne.s AdBb0
AdBb1 moveq #1,d0
AdBb2 rts
***********************************************************
* PUT BOB n
BobPut: bsr BobAd
bne.s BbPx
move.w BbDecor(a1),BbECpt(a1)
moveq #0,d0
BbPx: rts
***********************************************************
* ACTUALISATION DES BOBS
*******
BobAct: movem.l d2-d7/a2-a6,-(sp)
move.l T_BbPrio(a5),a3
* Banque de sprites chargee?
move.l T_SprBank(a5),d0
beq BbSx
move.l d0,a6
******* Explore les bobs!
move.l T_BbDeb(a5),d0
beq BbSx
clr.w -(sp)
move.l T_Priorite(a5),-(sp)
move.l T_BbPrio2(a5),a5
BbS0: move.l d0,a4
* Flippe les decors!
move.w BbDCur2(a4),d4
move.w BbDCur1(a4),BbDCur2(a4)
move.w d4,BbDCur1(a4)
* Bob modifie?
tst.w BbECpt(a4) * Si PUT BOB---> Pas d'act!
bne.s BbSDec
tst.b BbAct(a4)
beq BbSDec
bmi BbDel
clr.b BbAct(a4)
move.w BbI(a4),d2 * Pointe l'image
moveq #0,d3
move.w d2,d3
and.w #$C000,d3
move.w d3,BbRetour(a4)
and.w #$3FFF,d2
beq BbSort
cmp.w (a6),d2
bhi BbSort
lsl.w #3,d2
lea -8+2(a6,d2.w),a2
tst.l (a2)
beq BbSort
move.l a2,BbARetour(a4)
move.w BbX(a4),d2 * Coordonnees
move.w BbY(a4),d1
move.l BbEc(a4),a0 * Ecran
bsr BobCalc
bne BbSort
******* Sauvegarde du decor!
BbSDec: move.w BbDecor(a4),d0
beq BbSN
move.w BbESize(a4),d1
beq BbSort
* Stocke les parametres
move.w d0,BbDCpt(a4)
move.w BbDCur1(a4),d0
lea 0(a4,d0.w),a2
move.w d1,BbDASize(a2)
move.w BbEMod(a4),BbDMod(a2)
move.w BbAPlan(a4),BbDAPlan(a2)
move.w BbEAEc(a4),BbDAEc(a2)
move.w BbNPlan(a4),d1
move.w d1,BbDNPlan(a2)
tst.w BbEff(a4) * Effacement en couleurs?
bne.s BbSN
addq.w #1,d1
mulu BbETPlan(a4),d1 * Taille du buffer
moveq #0,d0
move.w BbDLBuf(a2),d0
beq.s BbD4
lsl.l #1,d0
cmp.l d0,d1 * Taille suffisante?
bls.s BbD5
* Efface l'ancien buffer?
move.l BbDABuf(a2),a1
bsr FreeMm
clr.l BbDABuf(a2)
clr.w BbDLbuf(a2)
* Reserve le nouveau!
BbD4: move.l d1,d0
bsr ChipMm
beq.s BbD5
move.l d0,BbDABuf(a2)
lsr.l #1,d1
move.w d1,BbDLBuf(a2)
* Ok!
BbD5: bra BbSN
******* BOB ARRETE
BbDel: subq.w #1,BbDecor(a4) * Compte le nombre de REDRAW
bhi.s BbSort
* Efface!
move.l BbNext(a4),d0
move.l a4,a1
move.l a5,-(sp)
move.l W_Base(pc),a5
bsr DelBob
move.l (sp)+,a5
tst.l d0
bne BbS0
bra.s BbBug
******* Calcul des priorites
BbSN: move.l BbEc(a4),d0
cmp.l (sp),d0
bne.s BbPrX
* Priorite!
move.l a4,(a5)+
addq.w #1,4(sp)
bra.s BbSort
* Pas de priorite
BbPrX move.l a4,(a3)+
******* En dehors!
BbSort: move.l BbNext(a4),d0
bne BbS0
BbBug
******* Classe les bobs...
move.l W_Base(pc),a5
addq.l #4,sp
move.w (sp)+,d6
beq.s BbSx
subq.w #1,d6
* Recopie dans la liste
move.l a3,a4
move.l T_BbPrio2(a5),a0
move.w d6,d0
BbPr1 move.l (a0)+,(a3)+
dbra d0,BbPr1
subq.w #1,d6
bmi.s BbSx
* Classe (a bulle!)
BbPr2 moveq #0,d1
move.w d6,d2
move.l a4,a2
move.l (a2)+,a0
BbPr3 move.l (a2)+,a1
move.w BbY(a0),d0 * Compare
cmp.w BbY(a1),d0
blt.s BbPr5
bne.s BbPr4
move.w BbX(a0),d0
cmp.w BbX(a1),d0
ble.s BbPr5
BbPr4 exg a0,a1
move.l a0,-8(a2)
move.l a1,-4(a2)
addq.w #1,d1
BbPr5 move.l a1,a0
dbra d2,BbPr3
tst.w d1
bne.s BbPr2
* Renverser la table???
BbSx: clr.l (a3)
tst.w T_PriRev(a5)
beq.s BbSxX
* Renverse la table!!!
move.l T_BbPrio(a5),a0
cmp.l a3,a0
bcc.s BbSxX
BbSRv move.l (a0),d0
move.l -(a3),(a0)+
move.l d0,(a3)
cmp.l a3,a0
bcs.s BbSRv
* Fini!
BbSxX movem.l (sp)+,d2-d7/a2-a6
rts
******* ROUTINE DE CALCUL DES PARAMS AFFICHAGE BOB/BLOC
* A0-> Ecran
* A2-> Descripteur image
* A4-> Buffer calcul
* D2-> X
* D1-> Y
* D3-> Flags retournement
BobCalc move.l (a2),a1
tst.l 4(a2)
bne.s BbS1
* Va calculer le masque!
bsr Masque
bne BbSOut
* Point chaud retourne?
BbS1: tst.l d3
bmi.s BbHt3
move.w 6(a1),d0
move.w d0,d4
lsl.w #2,d4
asr.w #2,d4
move.w 8(a1),d5
eor.w d0,d3
* En Y?
btst #14,d3
beq.s BbHt1
neg.w d5
add.w 2(a1),d5
* En X?
BbHt1 btst #15,d3
beq.s BbHt2
move.w (a1),d0
lsl.w #4,d0
sub.w d4,d0
move.w d0,d4
BbHt2 sub.w d5,d1
sub.w d4,d2
* Nombre de plans
BbHt3 move.w 4(a1),d0
cmp.w EcNPlan(a0),d0
bls.s BbS1a
move.w EcNPlan(a0),d0
BbS1a: subq.w #1,d0
move.w d0,BbNPlan(a4)
clr.w BbESize(a4)
* Mots de controle?
tst.w BbACon(a4)
beq.s BbS1b
bpl.s BbS1d
move.w BbACon(a4),d0 * MASQUER le minterm
bclr #15,d0
or.w #%0000111100000000,d0
tst.l 4(a2)
bpl.s BbS1c
and.w #%0000011111111111,d0
bra.s BbS1c
BbS1b move.w #%0000111111001010,d0 * FAIRE le minterm
tst.l 4(a2)
bpl.s BbS1c
move.w #%0000011111001010,d0
BbS1c move.w d0,BbACon(a4)
BbS1d move.w d2,d0
and.w #$F,d2
beq BbND
******* DECALES!
lsl.w #8,d2 * Registres de controle
lsl.w #4,d2
move.w d2,BbACon1(a4)
or.w BbACon(a4),d2
move.w d2,BbACon0(a4)
move.w (a1),d4 * Taille en X
lsl.w #1,d4
move.w d4,d3
move.w 2(a1),d5 * Taille en Y
move.w d4,d2
mulu d5,d2
move.w d2,BbTPLan(a4) * Taille plan!
add.w d5,d2
add.w d5,d2
move.w d2,BbETPlan(a4) * Effacement: prend les bords!
move.w d5,d2
add.w d1,d2
cmp.w BbLimB(a4),d2 * Limite en BAS!
ble BbDe2
sub.w BbLimB(a4),d2
sub.w d2,d5
bls BbSOut
BbDe2:
moveq #0,d7
cmp.w BbLimH(a4),d1 * Teste la limite en HAUT!
bge.s BbDe1
sub.w BbLimH(a4),d1
neg.w d1
sub.w d1,d5
bls BbSOut
move.w d1,d7
mulu d4,d7
move.w BbLimH(a4),d1
BbDe1:
move.w EcTLigne(a0),d2
move.w d2,d6
mulu d1,d6
lsl.w #3,d4
move.w d4,d1
add.w d0,d1
clr.w BbAMaskD(a4)
cmp.w BbLimD(a4),d1 * Teste la limite a DROITE
ble.s BbDe4
sub.w BbLimD(a4),d1
and.w #$FFF0,d1
add.w #16,d1
sub.w d1,d4
bmi BbSOut
move.w d0,d1
and.w #$000F,d1
lsl.w #1,d1
lea MCls2(pc),a0
move.w 0(a0,d1.w),d1
not.w d1
move.w d1,BbAMaskD(a4)
BbDe4:
moveq #-1,d1
cmp.w BbLimG(a4),d0 * Teste la limite a GAUCHE
bge.s BbDe3
move.w d0,d1
sub.w BbLimG(a4),d0
neg.w d0
sub.w d0,d4
bls BbSOut
add.w #16,d4
lsr.w #4,d0
lsl.w #1,d0
add.w d0,d7
bset #31,d7
subq.l #2,d6
lea MCls2(pc),a0 * Masque a gauche
and.w #$000F,d1
lsl.w #1,d1
move.w 0(a0,d1.w),d1
move.w BbLimG(a4),d0
BbDe3: move.w d1,BbAMaskG(a4)
add.w #16,d4
lsr.w #4,d0 * Adresse ecran
lsl.w #1,d0
ext.l d0 BUG !
add.l d0,d6
lsr.l #1,d6
move.w d6,BbAAEc(a4)
lsr.w #4,d4 * Modulo ecran
move.w d4,d0
lsl.w #1,d4
sub.w d4,d3
move.w d3,BbAModO(a4)
sub.w d4,d2
move.w d2,BbAModD(a4)
move.w d0,d1
lea BbAP(pc),a0
tst.l d7
bpl.s BbDe5
addq.w #1,d6 Suite BUG !
subq.w #1,d1
addq.w #2,d2
bne.s BbDe5
lea BbAL(pc),a0
BbDe5: lsl.w #6,d5
or.w d5,d1
move.w d1,BbESize(a4)
or.w d5,d0
move.w d0,BbASize(a4)
move.w d2,BbEMod(a4)
move.w d6,BbEAEc(a4)
move.l a0,BbADraw(a4)
move.l 4(a2),a2 * Adresses bob
lea 4(a2,d7.w),a2
move.l a2,BbAMask(a4)
lea 10(a1,d7.w),a2
move.l a2,BbAData(a4)
moveq #0,d0
rts
* Sortie
BbSOut moveq #-1,d0
rts
* NON DECALES: Teste limites en H G
BbND: move.w d0,d2
move.w d1,d3
moveq #0,d4
moveq #0,d5
cmp.w BbLimG(a4),d0
bge.s BbS2
move.w BbLimG(a4),d4
sub.w d0,d4
lsr.w #4,d4
move.w BbLimG(a4),d0
BbS2: cmp.w BbLimH(a4),d1
bge.s BbS3
move.w BbLimH(a4),d5
sub.w d1,d5
move.w BbLimH(a4),d1
BbS3: lsr.w #4,d0
lsl.w #1,d0
ext.l d0 BUG !
mulu EcTLigne(a0),d1
add.l d0,d1
lsr.l #1,d1
move.w d1,BbAAEc(a4)
move.w d1,BbEAEc(a4)
move.w (a1),d6
move.w 2(a1),d7
move.w d6,d0
lsl.w #1,d0
move.w d0,d1
mulu d7,d1
move.w d1,BbTPlan(a4)
move.w d1,BbETPlan(a4)
mulu d5,d0
add.w d4,d0
add.w d4,d0
move.l 4(a2),a2
lea 4(a2,d0.w),a2
move.l a2,BbAMask(a4)
lea 10(a1,d0.w),a2
move.l a2,BbAData(a4)
move.w BbACon(a4),BbACon0(a4)
clr.w BbACon1(a4)
move.w d6,d0
lsl.w #4,d0
add.w d0,d2
add.w d7,d3
move.w d6,d0
move.w d7,d1
cmp.w BbLimD(a4),d2
ble.s BbS4
sub.w BbLimD(a4),d2
lsr.w #4,d2
sub.w d2,d0
BbS4: cmp.w BbLimB(a4),d3
ble.s BbS5
sub.w BbLimB(a4),d3
sub.w d3,d1
BbS5: sub.w d4,d0
ble BbSOut
sub.w d5,d1
ble BbSout
sub.w d0,d6
lsl.w #1,d6
move.w d6,BbAModO(a4)
move.w EcTLigne(a0),d6
sub.w d0,d6
sub.w d0,d6
move.w d6,BbAModD(a4)
move.w d6,BbEMod(a4)
lsl.w #6,d1
or.w d1,d0
move.w d0,BbASize(a4)
move.w d0,BbESize(a4)
lea BbA16(pc),a0
move.l a0,BbADraw(a4)
moveq #0,d0
rts
***********************************************************
* RETOURNEUR DE SPRITES!
******* Initialisation: fabrique la table
RbInit lea TRetour(pc),a0
moveq #0,d0
IRet1: moveq #7,d3
move.b d0,d1
IRet2: lsr.b #1,d1
roxl.b #1,d2
dbra d3,IRet2
move.b d2,(a0)+
addq.b #1,d0
bne.s IRet1
rts
******* Fin, libere la memoire
RbEnd rts
******* Entree trappe
* A1/D0
RevTrap move.l a1,a0
move.l d1,d0
******* Retourne un sprite, s'il faut.
* A0---> Descripteur
* D0---> Flags seuls
Retourne
move.l (a0),d1
beq.s RetBobX
move.l d1,a1
move.w 6(a1),d1
and.w #$C000,d1
eor.w d0,d1
beq.s RetBobX
* En X?
btst #15,d1
beq.s RetBb1
bsr RBobX
* En Y?
RetBb1 btst #14,d1
beq.s RetBb2
bsr RBobY
* Poke les flags
RetBb2 move.w 6(a1),d1
and.w #$3FFF,d1
or.w d0,d1
move.w d1,6(a1)
* Ca y est!
RetBobX rts
******* Retourne le bob en X
RBobX movem.l a0-a3/d0-d7,-(sp)
* Retourne le point chaud
move.w 6(a1),d0
lsl.w #2,d0
asr.w #2,d0
move.w (a1),d6
move.w d6,d1
lsl.w #4,d1
sub.w d0,d1
move.w d1,6(a1)
* Retourne le dessin
moveq #0,d0
moveq #0,d1
lea TRetour(pc),a3
move.w 2(a1),d7
move.w 4(a1),d3
lea 10(a1),a1
move.l a0,-(sp)
bsr RBbX
move.l (sp)+,a0
* Retourne le masque
move.l 4(a0),d2
ble.s RBobXx
move.l d2,a1
addq.l #4,a1
moveq #0,d3
bsr RBBis
* Fini
RBobXx movem.l (sp)+,a0-a3/d0-d7
rts
******* Retourne le bob en Y
RBobY movem.l a0-a2/d0-d7,-(sp)
* Retourne le point chaud
move.w 2(a1),d7
move.w d7,d0
sub.w 8(a1),d0
move.w d0,8(a1)
* Retourne le dessin
move.w (a1),d6
move.w 4(a1),d5
lea 10(a1),a1
move.l a0,-(sp)
bsr RBbY
move.l (sp)+,a0
* Retourne le masque
move.l 4(a0),d0
ble.s RBobYx
move.l d0,a1
addq.l #4,a1
moveq #0,d5
bsr RBbY1
* Fini
RBobYx movem.l (sp)+,a0-a2/d0-d7
rts
************************
* Retourne en X
* A1-> Ad plan
* D7-> Ty
* D6-> Tx
* D3-> Nb plans
RBbX subq.w #1,d7 * Base cpt Y
subq.w #1,d3 * Cpt nombre de plans
moveq #0,d4
move.w d6,d4
lsr.w #1,d6
subq.w #1,d6
move.w d6,a2 * Base cpt en X
RBBis btst #0,d4
bne.s RBbI0
* Nombre PAIR de plans
RBbx0 move.w d7,d5 * Cpt Y
RBbx1 add.l d4,a1
move.l a1,a0
move.w a2,d6
RBbx2 move.b -(a0),d0
move.b (a1),d1
move.b 0(a3,d1.w),(a0)
move.b 0(a3,d0.w),(a1)+
move.b -(a0),d0
move.b (a1),d1
move.b 0(a3,d1.w),(a0)
move.b 0(a3,d0.w),(a1)+
dbra d6,RBbx2
dbra d5,RBbX1
dbra d3,RBbX0
rts
* Nombre IMPAIR de plans
RBbI0 move.w d7,d5 * Cpt Y
RBbI1 add.l d4,a1
move.l a1,a0
move.b -(a0),d0
move.b (a1),d1
move.b 0(a3,d1.w),(a0)
move.b 0(a3,d0.w),(a1)+
move.w a2,d6
bmi.s RBbI3
RBbI2 move.b -(a0),d0
move.b (a1),d1
move.b 0(a3,d1.w),(a0)
move.b 0(a3,d0.w),(a1)+
move.b -(a0),d0
move.b (a1),d1
move.b 0(a3,d1.w),(a0)
move.b 0(a3,d0.w),(a1)+
dbra d6,RBbI2
RBbI3 dbra d5,RBbI1
dbra d3,RBbI0
rts
************************
* Retournement VERTICAL
* D5= NPlan
* D6= TX
* D7= TY
RBbY move.w d6,d4
lsl.w #1,d4
ext.l d4
move.w d7,d3
lsr.w #1,d3
mulu d4,d3
move.l d4,d2
lsr.w #1,d7
bcc.s RBbY0
add.l d4,d2
add.l d4,d3
RBbY0 neg.l d2
subq.w #1,d7
move.w d7,a2
subq.w #1,d6
subq.w #1,d5
lsl.w #1,d4
* Boucle de retournement
RBbY1 add.w d3,a1
lea 0(a1,d2.w),a0
move.w a2,d7
RBbY2 move.w d6,d1
RBbY3 move.w (a1),d0
move.w (a0),(a1)+
move.w d0,(a0)+
dbra d1,RBbY3
sub.l d4,a0
dbra d7,RBbY2
dbra d5,RBbY1
rts
***********************************************************
* CALCUL DU MASQUE, 1 MOT BLANC A DROITE!
* A2= descripteur
Masque:
*******
movem.l d1-d7/a0-a2,-(sp)
move.l (a2),a1
move.w (a1),d2
lsl.w #1,d2
mulu 2(a1),d2 * D2= Taille plan
move.l d2,d3
addq.l #4,d3 * D3= Taille memoire
move.w 4(a1),d4
subq.w #2,d4 * D4= Nb de plans
move.w d2,d5
lsr.w #1,d5
subq.w #1,d5
* Reserve la memoire pour le masque
move.l 4(a2),d0
bne.s Mas0
MasM move.l d3,d0
bsr ChipMm2
beq.s MasErr
move.l d0,4(a2)
* Calcule le masque
Mas0: bmi.s MasM
move.l d0,a2 * Adresse du masque
move.l d3,(a2)+ * Taille du masque
lea 10(a1),a1 * Pointe le premier plan
Mas2: move.l a1,a0
move.w (a0),d0
move.w d4,d3
bmi.s Mas4
Mas3: add.l d2,a0
or.w (a0),d0
dbra d3,Mas3
Mas4: move.w d0,(a2)+
addq.l #2,a1
dbra d5,Mas2
* Pas d'erreur
movem.l (sp)+,d1-d7/a0-a2
moveq #0,d0
rts
* Erreur!
MasErr: movem.l (sp)+,d1-d7/a0-a2
moveq #-1,d0
rts
********************************************************
* EFFACEMENT DE TOUS LES BOBS DES ECRANS
********
BobEff: movem.l d2-d7/a2-a6,-(sp)
lea Circuits,a6
move.l T_BbDeb(a5),d0
beq BbExX
******* Initialise le blitter
bsr OwnBlit
move.w #0,BltModA(a6)
move.w #0,BltCon1(a6)
moveq #-1,d1
move.w d1,BltMaskG(a6)
move.w d1,BltMaskD(a6)
******* Explore la liste des bobs
BbE0: move.l d0,a5
tst.w BbECpt(a5) * Compteur PUT BOB
bne.s BbE5
move.l BbEc(a5),a3
lea EcLogic(a3),a3
move.w BbDCur2(a5),d4
lea 0(a5,d4.w),a4
move.w BbDASize(a4),d2 * D2= BltSize
beq.s BbE4
move.w BbDAEc(a4),d3 * D3= Decalage ecran
ext.l d3
lsl.l #1,d3
move.w BbEff(a5),d4
bne.s BbEFc
* Effacement NORMAL
tst.l BbDABuf(a4)
beq.s BbE4
move.w BbDAPlan(a4),d1
move.w BbDNPlan(a4),d0
bsr BlitWait
move.w BbDMod(a4),BltModD(a6)
move.l BbDABuf(a4),BltAdA(a6) * Adresse buffer
move.w #%0000100111110000,BltCon0(a6)
BbE1: lsr.w #1,d1
bcc.s BbE3
move.l (a3),a2
add.l d3,a2
bsr BlitWait
move.l a2,BltAdD(a6)
move.w d2,BltSize(a6)
BbE3: addq.l #4,a3
dbra d0,BbE1
* Un autre?
BbE4: move.l BbNext(a5),d0
bne.s BbE0
bra.s BbEx
BbE5: subq.w #1,BbECpt(a5)
bne.s BbE4
bra.s BbE4
* Effacement COLORE!
BbEfC: subq.w #1,d4
move.w BbDAPlan(a4),d1
move.w BbDNPlan(a4),d0
bsr BlitWait
move.w BbDMod(a4),BltModD(a6)
move.w #%0000000111110000,BltCon0(a6)
moveq #0,d5
BbEfc1:
lsr.w #1,d4
subx.w d5,d5
lsr.w #1,d1
bcc.s BbEfc4
move.l (a3),a2
add.l d3,a2
bsr BlitWait
move.w d5,BltDatA(a6)
move.l a2,BltAdD(a6)
move.w d2,BltSize(a6)
BbEfc4: addq.l #4,a3
moveq #0,d5
dbra d0,BbEfc1
* Un autre?
move.l BbNext(a5),d0
bne BbE0
* FINI: remet le blitter
BbEx: bsr BlitWait
bsr DOwnBlit
BbExX: movem.l (sp)+,d2-d7/a2-a6
rts
********************************************************
* SAISIE ET DESSIN DE TOUS LES BOBS
********
BobAff movem.l d2-d7/a2-a6,-(sp)
lea Circuits,a6
bsr OwnBlit
******* SAISIE
move.l T_BbDeb(a5),d0
beq BbGx
* Initialise le blitter
move.w #0,BltModD(a6)
move.w #%0000100111110000,BltCon0(a6)
move.w #0,BltCon1(a6)
moveq #-1,d1
move.w d1,BltMaskG(a6)
move.w d1,BltMaskD(a6)
* Explore les bobs
BbG0: move.l d0,a5
tst.w BbDCpt(a5) * Nombre de saisies
beq.s BbG4
tst.w BbEff(a5) * Decor colore?
bne.s BbG4
move.l BbEc(a5),a3 * Adresse ecran
lea EcLogic(a3),a3
move.w BbDCur1(a5),d4
lea 0(a5,d4.w),a4
tst.l BbDABuf(a4) * Adress buffer 0?
beq.s BbG4
move.w BbDASize(a4),d2 * D2= BltSize
beq.s BbG4
subq.w #1,BbDCpt(a5) * Une saisie de moins
move.w BbDAEc(a4),d3 * D3= Decalage ecran
ext.l d3
lsl.l #1,d3
move.w BbDAPlan(a4),d1
move.w BbDNPlan(a4),d0
bsr BlitWait
move.l BbDABuf(a4),d7
move.l d7,BltAdD(a6) * Adresse buffer
move.w BbDMod(a4),BltModA(a6)
BbG1: lsr.w #1,d1
bcc.s BbG3
move.l (a3),a2
add.l d3,a2
bsr BlitWait
move.l a2,BltAdA(a6)
move.w d2,BltSize(a6)
BbG3: addq.l #4,a3
dbra d0,BbG1
* Un autre?
BbG4: move.l BbNext(a5),d0
bne.s BbG0
BbGx:
******* AFFICHAGE
move.l W_Base(pc),a5
move.l T_BbPrio(a5),a5
* Explore tous les bobs
move.l (a5)+,d0
beq BbAx
* Valeurs communes au 16 et autre
BbA0: move.l d0,a4
move.w BbASize(a4),d2
beq.s BbAn
* Va retourner le bob???
move.w BbRetour(a4),d0
move.l BbARetour(a4),a0
bsr Retourne
* Va dessiner
moveq #0,d4
move.w BbTPlan(a4),d4
move.l BbAData(a4),a0
move.l BbEc(a4),a3
lea EcLogic(a3),a3
move.w BbAModD(a4),d0
move.l BbADraw(a4),a1
bsr BlitWait
move.w d0,BltModC(a6)
move.w d0,BltModD(a6)
move.l BbAMask(a4),d5
jsr (a1)
* Un autre?
BbAn: move.l (a5)+,d0
bne BbA0
******* FINI: remet le blitter
BbAx: bsr BlitWait
bsr DOwnBlit
movem.l (sp)+,d2-d7/a2-a6
rts
******* ROUTINE DESSIN au pixel
BbAp: bmi BMAp
move.w BbACon0(a4),BltCon0(a6)
move.w BbACon1(a4),BltCon1(a6)
move.w BbAAEc(a4),d3
ext.l d3
lsl.l #1,d3
move.w BbAModO(a4),d0
move.w d0,BltModA(a6)
move.w d0,BltModB(a6)
move.w BbAMaskG(a4),BltMaskG(a6)
move.w BbAMaskD(a4),BltMaskD(a6)
move.w #0,BltDatA(a6)
move.w BbAPlan(a4),d1
move.w BbNPlan(a4),d0
BbAp1: lsr.w #1,d1
bcc.s BbAp4
BbAp2:
move.l (a3),a2
add.l d3,a2
bsr BlitWait
move.l d5,BltAdA(a6)
move.l a0,BltAdB(a6)
move.l a2,BltAdC(a6)
move.l a2,BltAdD(a6)
move.w d2,BltSize(a6)
BbAp4: add.l d4,a0
addq.l #4,a3
dbra d0,BbAp1
rts
******* ROUTINE DESSIN au pixel trop grand
BbAL: bmi BmAp
move.w d2,d6
lsr.w #6,d6
and.w #%0111111,d2
or.w #%1000000,d2
move.w BbACon0(a4),BltCon0(a6)
move.w BbACon1(a4),BltCon1(a6)
move.w BbAAEc(a4),d3
ext.l d3
lsl.l #1,d3
move.w BbAModO(a4),d0
move.w d0,BltModA(a6)
move.w d0,BltModB(a6)
move.w BbAMaskG(a4),BltMaskG(a6)
move.w BbAMaskD(a4),BltMaskD(a6)
move.w #0,BltDatA(a6)
move.w BbAPlan(a4),d1
move.w BbNPlan(a4),d0
BbAl1: lsr.w #1,d1
bcc.s BbAl5
BbAl2:
move.l (a3),a2
add.l d3,a2
move.w d6,d7
bsr BlitWait
move.l d5,BltAdA(a6)
move.l a0,BltAdB(a6)
move.l a2,BltAdC(a6)
move.l a2,BltAdD(a6)
BbAl3 bsr BlitWait
move.w #0,BltDatA(a6)
move.w d2,BltSize(a6)
subq.w #1,d7
bne.s BbAl3
BbAl5: add.l d4,a0
addq.l #4,a3
dbra d0,BbAl1
rts
******* ROUTINE DESSIN: Multiple de 16!
BbA16: bmi BMA16
move.w BbAAEc(a4),d3 * D3= Decalage ecran
ext.l d3
lsl.l #1,d3
move.w BbAModO(a4),d0 * Valeur MODULO
move.w d0,BltModA(a6)
move.w d0,BltModB(a6)
move.w BbACon0(a4),BltCon0(a6) * Registres de controle
move.w #0,BltCon1(a6)
moveq #-1,d0
move.w d0,BltMaskG(a6)
move.w d0,BltMaskD(a6)
move.w BbAPlan(a4),d1
move.w BbNPlan(a4),d0
BbA1: lsr.w #1,d1
bcc.s BbA4
move.l (a3),a2
add.l d3,a2
bsr BlitWait
move.l d5,BltAdA(a6)
move.l a0,BltAdB(a6)
move.l a2,BltAdC(a6)
move.l a2,BltAdD(a6)
move.w d2,BltSize(a6)
BbA4: add.l d4,a0
addq.l #4,a3
dbra d0,BbA1
rts
******* ROUTINE DESSIN SANS MASQUE, Multiple de 16!
BMA16: move.w BbAAEc(a4),d3
ext.l d3
lsl.l #1,d3
move.w BbAModO(a4),BltModB(a6)
move.w BbACon0(a4),d0 *If minterm replace use
cmp.b #$CA,d0 *fast blit , ideal for
bne.s Normal_BMA16 *fast icon pasting in games!
move.w BbAModO(a4),BltModA(a6) *
move.w #%100111110000,BltCon0(a6)*
move.w #0,BltCon1(a6) *
moveq #-1,d0 *
move.w d0,BltMaskG(a6) *
move.w d0,BltMaskD(a6) *
move.w d0,BltDatB(a6) *
move.w d0,BltDatC(a6) *
move.w BbAPlan(a4),d1 *
move.w BbNPlan(a4),d0 *
BMA1f: lsr.w #1,d1 *
bcc.s BMA3f *
move.l (a3),a2 *
add.l d3,a2 *
bsr BlitWait *
move.l a0,BltAdA(a6) *
move.l a2,BltAdD(a6) *
move.w d2,BltSize(a6) *
BMA3f: add.l d4,a0 *
addq.l #4,a3 *
dbra d0,BMA1f *
rts *
Normal_BMA16:
move.w BbACon0(a4),BltCon0(a6)
move.w #0,BltCon1(a6)
moveq #-1,d0
move.w d0,BltMaskG(a6)
move.w d0,BltMaskD(a6)
move.w d0,BltDatA(a6)
move.w BbAPlan(a4),d1
move.w BbNPlan(a4),d0
BMA1: lsr.w #1,d1
bcc.s BMA3
move.l (a3),a2
add.l d3,a2
bsr BlitWait
move.l a0,BltAdB(a6)
move.l a2,BltAdC(a6)
move.l a2,BltAdD(a6)
move.w d2,BltSize(a6)
BMA3: add.l d4,a0
addq.l #4,a3
dbra d0,BMA1
rts
******* ROUTINE DESSIN SANS MASQUE, Pixel!
BMAp:
move.w BbAAEc(a4),d3
ext.l d3
lsl.l #1,d3
move.w BbAModO(a4),BltModB(a6)
move.w BbACon0(a4),BltCon0(a6)
move.w BbACon1(a4),BltCon1(a6)
move.w BbAMaskG(a4),BltMaskG(a6)
move.w BbAMaskD(a4),BltMaskD(a6)
move.w #-1,BltDatA(a6)
move.w BbAPlan(a4),d1
move.w BbNPlan(a4),d0
BMAp1: lsr.w #1,d1
bcc.s BMAp4
move.l (a3),a2
add.l d3,a2
bsr BlitWait
move.l a0,BltAdB(a6)
move.l a2,BltAdC(a6)
move.l a2,BltAdD(a6)
move.w d2,BltSize(a6)
BMAp4: add.l d4,a0
addq.l #4,a3
dbra d0,BMAp1
rts
******* ROUTINE DESSIN SANS MASQUE au pixel trop grand
BmAL: move.w d2,d6
lsr.w #6,d6
and.w #%0111111,d2
or.w #%1000000,d2
move.w BbACon0(a4),BltCon0(a6)
move.w BbACon1(a4),BltCon1(a6)
move.w BbAAEc(a4),d3
ext.l d3
lsl.l #1,d3
move.w BbAModO(a4),BltModB(a6)
move.w BbAMaskG(a4),BltMaskG(a6)
move.w BbAMaskD(a4),BltMaskD(a6)
move.w #0,BltDatA(a6)
move.w BbAPlan(a4),d1
move.w BbNPlan(a4),d0
BmAl1: lsr.w #1,d1
bcc.s Bmal7
move.l (a3),a2
add.l d3,a2
move.w d6,d7
bsr BlitWait
move.l a0,BltAdB(a6)
move.l a2,BltAdC(a6)
move.l a2,BltAdD(a6)
Bmal3: bsr BlitWait
move.w #-1,BltDatA(a6)
move.w d2,BltSize(a6)
subq.w #1,d7
bne.s Bmal3
Bmal7: add.l d4,a0
addq.l #4,a3
dbra d0,BmAl1
rts
******************************************************************
* Screen copy a0,d0,d1,d4,d5 to a1,d2,d3,d6
*
* a0 Origin Bit Map Struc. a1 Destination Bit Map Struc.
* d0 Origin X (16 a factor!) d2 Destination X (16 a factor!)
* d1 Origin Y d3 Destination Y
* d4 Width X (Must be multiple of 16!)
* d5 height Y
* d6 Minterm
*
* If minterm is $CC and d0,d2,d4 are on word boundaries
* then blit is done and result is 0 otherwise not done
* and result is -1.
*
* Uses only A and D channels for blit,
* therefore twice as fast as normal screen copy!
*
WScCpy: cmp.b #$CC,d6
bne.s NoWScCpy
move.w d0,d7
and.w #$f,d7
bne.s NoWScCpy
move.w d2,d7
and.w #$f,d7
bne.s NoWScCpy
move.w d4,d7
and.w #$f,d7
bne.s NoWScCpy
bra.s DoWScCpy
NoWScCpy:
moveq.l #-1,d7
rts
DoWScCpy:
moveq.l #0,d7
cmp.w d1,d3
blt.s Ascending_Blit
bgt.s Descending_Blit
cmp.w d0,d2
blt.s Ascending_Blit
Descending_Blit:
addq.l #2,d7
add.w d4,d0
sub.w #16,d0
add.w d5,d1
subq.w #1,d1
add.w d4,d2
sub.w #16,d2
add.w d5,d3
subq.w #1,d3
Ascending_Blit:
lsl.w #6,d5
lsr.w #4,d0
lsl.w #1,d0
lsr.w #4,d2
lsl.w #1,d2
lsr.w #4,d4
lsl.w #1,d4
move.w (a0),d6
mulu d6,d1
and.l #$FFFF,d0
add.l d1,d0
sub.w d4,d6
move.w (a1),d1
mulu d1,d3
and.l #$FFFF,d2
add.l d3,d2
sub.w d4,d1
lsr.w #1,d4
add.w d4,d5
moveq.l #0,d4
move.b 5(a0),d4
moveq.l #0,d3
move.b 5(a1),d3
lea 8(a0),a0
lea 8(a1),a1
lea circuits,a6
bsr OwnBlit
move.w #%100111110000,BltCon0(a6)
move.w d7,BltCon1(a6)
moveq.l #-1,d7
move.w d7,BltDatB(a6)
move.w d7,BltDatC(a6)
move.w d7,BltMaskD(a6)
move.w d7,BltMaskG(a6)
move.w d6,BltModA(a6)
move.w d1,BltModD(a6)
bra.s Start_Blit
Blit_Loop:
move.l (a0)+,a2
add.l d0,a2
move.l (a1)+,a3
add.l d2,a3
bsr BlitWait
move.l a2,BltAdA(a6)
move.l a3,BltAdC(a6)
move.l a3,BltAdD(a6)
move.w d5,BltSize(a6)
Start_Blit:
subq.w #1,d4
bmi.s Blit_out
dbra d3,Blit_Loop
Blit_out:
bsr BlitWait
bsr DownBlit
moveq.l #0,d7
rts
***********************************************************
* Calcul de PEN/PAPER
***********************************************************
AdColor:move.w WiNPlan(a5),d1
move.w WiPaper(a5),d2
move.w WiPen(a5),d3
move.w d2,d4
move.w d3,d5
lea TAdCol(pc),a0
lea WiColor(a5),a1
lea WiColFl(a5),a2
ACol: moveq #16,d0
btst d1,WiSys+1(a5)
bne.s ACol1
clr.w d0
lsr.w #1,d2
roxl.w #1,d0
lsr.w #1,d3
roxl.w #1,d0
lsl.w #2,d0
ACol1 move.l 0(a0,d0.w),d0
add.l a0,d0
move.l d0,(a1)+
lsr.w #1,d4
subx.w d0,d0
move.w d0,(a2)+
lsr.w #1,d5
subx.w d0,d0
move.w d0,(a2)+
dbra d1,ACol
rts
;-----------------------------------------------------------------
; **** *** **** ****
; * * * * * ******************************************
; **** * * * **** * SCREENS
; * * * * * ******************************************
; **** * **** ****
;-----------------------------------------------------------------
***********************************************************
* DEMARRAGE A FROID DES ECRANS
* D0= taille memoire pour liste copper
***********************************************************
EcInit:
* Reserve la memoire pour liste copper ecrans
move.l #EcTCop,d0
bsr FastMm
beq GFatal
move.l d0,T_EcCop(a5)
* Petit buffer en CHIP pour les operations graphiques
move.l #256,d0
bsr ChipMm
beq GFatal
move.l d0,T_ChipBuf(a5)
* Taille affichage par defaut
move.w #311+EcYBase,T_EcYMax(a5) PAL
move.l $4.w,a0
cmp.b #50,530(a0) VBlankFrequency=50?
beq.s .NoNTSC
move.w #261+EcYBase,T_EcYMax(a5) NTSC!
.NoNTSC
* Autre inits
bsr EcRaz
bsr EcCopper
tst.b T_AMOSHere(a5)
beq.s .Skip
lea Circuits,a6
clr.w CopJmp1(a6)
move.w #$82A0,DmaCon(a6)
.Skip
; Installe le vecteur
lea EcIn(pc),a0
move.l a0,T_EcVect(a5)
moveq #0,d0
rts
**********************************************************
* ARRET FINAL DES ECRANS
**********************************************************
EcEnd: moveq #0,d1
moveq #EcMax-1,d2
bsr EcDAll
bsr RazCBloc
bsr RazBloc
moveq #-1,d1
bsr TrDel
* Efface la memoire du buffer CHIP
move.l T_ChipBuf(a5),d0
beq.s .skip
move.l d0,a1
move.l #256,d0
bsr FreeMm
.skip
* Efface la memoire liste copper
move.l T_EcCop(a5),d0
beq.s EcEnd1
move.l d0,a1
move.l #EcTCop,d0
bsr FreeMm
EcEnd1: rts
******* Jumps to screen functions
EcIn: bra EcRaz ;Raz:
bra EcCopper ;CopMake:
bra EcCopper ;*
bra EcCree ;Cree:
bra EcDel ;Del:
bra EcFirst ;First:
bra EcLast ;Last:
bra EcMarch ;Active:
bra EcForceCop ;CopForce:
bra EcView ;AView:
bra EcOffs ;OffSet:
bra EcEnd ;Visible:
bra EcDAll ;DelAll:
bra EcGCol ;GCol:
bra EcSCol ;SCol:
bra EcSPal ;SPal:
bra EcSColB ;SColB:
bra FlStop ;FlRaz:
bra FlStart ;Flash:
bra ShStop ;ShRaz:
bra ShStart ;Shift:
bra EcHide ;EHide:
bra MakeCBloc ;CBlGet:
bra DrawCBloc ;CBlPut:
bra FreeCBloc ;CBlDel:
bra RazCBloc ;CBlRaz:
bra EcLibre ;Libre:
bra EcCClo ;CCloEc:
bra EcCrnt ;Current:
bra EcDouble ;Double:
bra ScSwap ;SwapSc:
bra ScSwapS ;SwapScS:
bra EcAdres ;AdrEc:
bra Duale ;SetDual:
bra DualP ;PriDual:
bra EcCls ;ClsEc:
bra SPat ;Pattern:
bra TGFonts ;GFonts:
bra TFFonts ;FFonts:
bra TGFont ;GFont:
bra TSFont ;SFont:
bra TSClip ;SetClip:
bra MakeBloc ;- BlGet: Routine blocs normaux
bra DelBloc ;-BlDel:
bra RazBloc ;-BlRaz:
bra DrawBloc ;-BlPut:
bra SliVer ;- VerSli: Slider vertical
bra SliHor ;- HorSli: Slider horizontal
bra SliSet ;- SetSli: Set slider params
bra StaMn ;- MnStart: Sauve l'ecran
bra StoMn ;- MnStop: Remet l'ecran
bra TRDel ;- RainDel: Delete RAINBOW
bra TRSet ;- RainSet: Set RAINBOW
bra TRDo ;- RainDo: Do RAINBOW
bra TRHide ;- RainHide: Hide / Show RAINBOW
bra TRVar ;- RainVar: Var RAINBOW
bra FadeTOn ;- FadeOn: Fade
bra FadeTOf ;- FadeOf: Fade Off
bra TCopOn ;- CopOnOff: Copper ON/OFF
bra TCopRes ;- CopReset: Copper RESET
bra TCopSw ;- CopSwap: Copper SWAP
bra TCopWt ;- CopWait: Copper WAIT
bra TCopMv ;- CopMove: Copper MOVE
bra TCopMl ;- CopMoveL: Copper MOVEL
bra TCopBs ;- CopBase: Copper BASE ADDRESS
bra TAbk1 ;- AutoBack1: Autoback 1
bra TAbk2 ;- AutoBack2: Autoback 2
bra TAbk3 ;- AutoBack3: Autoback 3
bra TAbk4 ;- AutoBack4: Autoback 4
bra TPaint ;- SuPaint: Super paint!
bra RevBloc ;- BlRev: Retourne le bloc
bra RevTrap ;- DoRev: Retourne dans la banque
bra TAmosWB ;- AMOS_WB AMOS/WorkBench
bra WScCpy ;- ScCpyW New_W_2.s
bra TMaxRaw ;- MaxRaw Maximum raw number
bra TNTSC ;- NTSC NTSC?
bra SliPour ;- PourSli Calculs slider
***********************************************************
* Instructions de gestion des ecrans
***********************************************************
******* MAX RAW
TMaxRaw move.w T_EcYMax(a5),d1
sub.w #EcYBase,d1
ext.l d1
moveq #0,d0
rts
******* NTSC?
TNTSC moveq #0,d0
moveq #0,d1 PAL
move.l $4.w,a0
cmp.b #50,530(a0) VBlankFrequency=50?
beq.s .NoNTSC
moveq #-1,d1 NTSC!
.NoNTSC rts
******* SCREEN SWAP D1
ScSwap: movem.l d1-d7/a1-a6,-(sp)
bsr EcGet
beq EcE3
move.l d0,a4
btst #BitDble,EcFlags(a4)
beq EcOk
move.w EcNumber(a4),d0
lea T_SwapList(a5),a0
tst.l (a0)
beq.s ScSw2
ScSw1: cmp.w SwapL-2(a0),d0 * Screen already swapped!
beq EcOk
lea SwapL(a0),a0
tst.l (a0)
bne.s ScSw1
ScSw2: move.w d0,SwapL-2(a0)
lsl.w #6,d0
add.w #CopL1*EcMax,d0
lea T_CopMark(a5),a1 * Garde l'adresse pour la fin!
add.w d0,a1
move.l a0,a6
addq.l #4,a0
move.w EcNPlan(a4),d0 * Nombre de bit planes
subq.w #1,d0
move.w d0,(a0)+
move.l EcDEcran(a4),d2
lea EcLogic(a4),a2
lea EcPhysic(a4),a3
move.w d0,d3
ScSw3: move.l (a2),d1 * Screen swap!
move.l (a3),(a2)+
move.l d1,(a3)+
add.l d2,d1
move.l d1,(a0)+
dbra d3,ScSw3
lea EcLogic(a4),a0 * Update les outputs!
lea EcCurrent(a4),a2
move.l Ec_BitMap(a4),a3
lea bm_Planes(a3),a3
move.w d0,d3
ScSw4 move.l (a0),(a2)+
move.l (a0)+,(a3)+
dbra d3,ScSw4
* Autorise le screen swap
tst.w T_CopON(a5) * Pas si COPPER OFF!
beq EcOk
btst #2,EcCon0+1(a4) * Interlace?
bne EcOk
clr.l SwapL(a6) * Empeche le suivant
move.l a1,(a6)
bra EcOk
******* SCREEN SWAP DE TOUS LES ECRANS UTILISATEUR
ScSwapS movem.l d1-d7/a1-a6,-(sp)
lea T_EcAdr(a5),a1
moveq #8-1,d6
lea T_SwapList(a5),a0
clr.l (a0)
* Explore tous les ecrans
ScSwS0: move.l (a1)+,d0
bne.s ScSwS2
ScSwS1: dbra d6,ScSwS0
bra EcOk
* Swappe un ecran!
ScSwS2: move.l d0,a4
btst #BitDble,EcFlags(a4)
beq.s ScSwS1
move.w EcNumber(a4),d0
move.w d0,SwapL-2(a0)
lsl.w #6,d0
add.w #CopL1*EcMax,d0
lea T_CopMark(a5),a2 * Garde l'adresse pour la fin!
add.w d0,a2
move.l a2,d7
move.l a0,a6
addq.l #4,a0
move.w EcNPlan(a4),d0 * Nombre de bit planes
subq.w #1,d0
move.w d0,(a0)+
move.l EcDEcran(a4),d2
lea EcLogic(a4),a2
lea EcPhysic(a4),a3
move.w d0,d3
ScSwS3: move.l (a2),d1 * Screen swap!
move.l (a3),(a2)+
move.l d1,(a3)+
add.l d2,d1
move.l d1,(a0)+
dbra d3,ScSwS3
lea EcLogic(a4),a0 * Update les outputs!
lea EcCurrent(a4),a2
move.l Ec_BitMap(a4),a3
lea bm_Planes(a3),a3
move.w d0,d3
ScSwS4 move.l (a0),(a2)+
move.l (a0)+,(a3)+
dbra d3,ScSwS4
* Autorise le screen swap
lea SwapL(a6),a0
tst.w T_CopON(a5) * Si COPPER ON!
beq ScSwS1
btst #2,EcCon0+1(a4) * Interlace?
bne ScSwS1
clr.l SwapL(a6) * Empeche le suivant!
move.l d7,(a6)
bra ScSwS1
******* SCREEN CLONE N
EcCClo: movem.l d1-d7/a1-a6,-(sp)
move.l d1,-(sp)
bsr EcGet
beq.s EcCT0
addq.l #4,sp
bra EcE2
* Reserve la RAM / Verifie les parametres
EcCT0: move.l #EcLong,d0
bsr FastMm
beq EcE1
move.l d0,a4
move.l d0,a1
move.w #EcLong-1,d0
move.l T_EcCourant(a5),a0
EcCT1: move.b (a0)+,(a1)+
dbra d0,EcCT1
* Pas de zones
clr.l EcAZones(a4)
clr.w EcNZones(a4)
* Pas de fenetre!
clr.l EcWindow(a4)
* Pas de pattern
clr.l EcPat(a4)
* Pas de fonte
clr.w EcFontFlag(a4)
* Cree l'ecran dans les tables
bset #BitClone,EcFlags(a4)
move.l (sp)+,d1
move.w d1,EcNumber(a4)
* Entrelace?
bsr InterPlus
* Met dans la displaylist
bsr EcGet
move.l a4,(a0)
bsr EcFirst
bra EcTout
******* DOUBLE BUFFER: Passe en double buffer!
EcDouble:
movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
* Deja en double?
btst #BitDble,EcFlags(a4)
bne EcE25
* Reserve la RAM / Copie le contenu
move.w EcNplan(a4),d6
subq.w #1,d6
lea EcPhysic(a4),a2
lea EcLogic(a4),a3
lea EcCurrent(a4),a6
EcDb1: move.l EcTPlan(a4),d0 * Reserve!
bsr ChipMm
beq EcDbE
move.l d0,(a3)+
move.l d0,(a6)+
move.l d0,a1 * Copie!
move.l (a2)+,a0
move.l EcTPlan(a4),d0
lsr.w #4,d0
subq.w #1,d0
EcDb2: move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
dbra d0,EcDb2
dbra d6,EcDb1
* Met le flag!
bset #BitDble,EcFlags(a4)
move.w #2,EcAuto(a4)
* Enleve le BUG!
bsr TAbk1
bsr TAbk2
bsr TAbk3
bra EcOk
* Erreur! Efface l'ecran entier
EcDbE moveq #0,d1
move.w EcNumber(a4),d1
bsr EcDel
bra EcE1
IFEQ EZFlag
******* Dual Playfield D1,D2
* D1= Ecran 1
* D2= Ecran 2
Duale: movem.l d1-d7/a1-a6,-(sp)
cmp.w d1,d2
beq EcE26
move.w d2,d7
addq.w #1,d7
exg d1,d2
bsr EcGet
beq EcE3
move.l d0,a1
move.w d2,d1
bsr EcGet
beq EcE3
move.l d0,a0
tst.w EcDual(a0) * Pas deja dual!
bne EcE26
tst.w EcDual(a1)
bne EcE26
moveq #3,d2
move.w EcCon0(a0),d0 * Meme resolution!
bpl.s EcDu1
moveq #2,d2
EcDu1: and.w #%1000111111111111,d0
move.w EcCon0(a1),d1
and.w #%1000111111111111,d1
cmp.w d0,d1
bne EcE26
move.w EcNPlan(a0),d3
move.w EcNPlan(a1),d4
cmp.w d2,d3
bhi EcE26
cmp.w d2,d4
bhi EcE26
move.w d3,d2 * Nombre total de plans
add.w d4,d2
cmp.w d3,d4 * Combinaisons autorisees?
beq.s EcDu2
addq.w #1,d4
cmp.w d3,d4
bne EcE26
EcDu2: moveq #12,d1
lsl.w d1,d2
or.w d2,d0
bset #10,d0 * Mode DUAL PLAYFIELD!
move.w d0,EcCon0(a0)
move.w EcCon2(a0),d0 * Priorites sprites-> 2 ieme plan!
and.w #%111,d0
lsl.w #3,d0
or.w d0,EcCon2(a0)
and.w #%111111,EcCon2(a0)
bset #BitHide,EcFlags(a1) * Cache le deuxieme
move.w d7,EcDual(a0) * Met les flags!
neg.w d7
move.w d7,EcDual(a1)
bra EcTout
******* DUAL PRIORITY n,m
DualP: movem.l d1-d7/a1-a6,-(sp)
cmp.w d1,d2
beq EcE27
exg d1,d2
bsr EcGet
beq EcE3
move.l d0,a1
move.w d2,d1
bsr EcGet
beq EcE3
move.l d0,a0
moveq #0,d0
tst.w EcDual(a0)
beq EcE27
tst.w EcDual(a1)
beq EcE27
bmi.s EcDup1
move.l a1,a0
moveq #-1,d0
EcDup1: move.w EcCon2(a0),d1
bclr #6,d1
tst.w d0
beq.s EcDup2
bset #6,d1
EcDup2: move.w d1,EcCon2(a0)
bra EcOtoV
ENDC
******* Creation de l'ecran
* D1= #
* D2= TX
* D3= TY
* D4= NB PLANS
* D5= MODE
* D6= NB COULEURS
* A1= PALETTE
EcCree: movem.l d1-d7/a1-a6,-(sp)
; Verifie les parametres
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
and.l #$FFFFFFF0,d2
beq EcE4
cmp.l #1024,d2
bcc EcE4
tst.l d3
beq EcE4
cmp.l #1024,d3
bcc EcE4
tst.l d4
beq EcE4
cmp.l #EcMaxPlans,d4
bhi EcE4
; Ecran deja reserve?
; ~~~~~~~~~~~~~~~~~~~~~~~~~
ReEc: move.l d1,-(sp)
bsr EcGet
beq.s EcCr0
; Efface l'ecran deja r<>serve
move.l (sp)+,d1
bsr EcDel
bra.s ReEc
; Reserve la RAM pour la structure
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EcCr0: move.l #EcLong,d0
bsr FastMm
beq EcEE1
move.l d0,a4
; Couleurs
; ~~~~~~~~
move.w d6,EcNbCol(a4)
moveq #31,d0
lea EcPal(a4),a2
EcCr4: move.w (a1)+,(a2)+
dbra d0,EcCr4
; Taille de l'ecran
; ~~~~~~~~~~~~~~~~~
move.w d2,EcTx(a4)
move.w d2,EcTxM(a4)
subq.w #1,EcTxM(a4)
move.w d2,d7
lsr.w #3,d7
move.w d7,EcTLigne(a4)
move.w d3,EcTy(a4)
move.w d3,EcTyM(a4)
subq.w #1,EcTyM(a4)
mulu d3,d7
move.l d7,EcTPlan(a4)
move.w d4,EcNPlan(a4)
; Parametres d'affichage -1-
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l T_GfxBase(a5),a0 EcCon0
move.w 164(a0),d0
and.w #%0000001111111011,d0
move.w d4,d1
lsl.w #8,d1
lsl.w #4,d1
or.w d0,d1
or.w d1,d5
move.w d5,EcCon0(a4)
move.w #%00100100,EcCon2(a4) EcCon2
; Creation de la structure BitMap / Reservation des bitmaps
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
moveq #40,d0 bm_SIZEOF
bsr FastMm
beq EcMdd
move.l d0,Ec_BitMap(a4)
move.l d0,a0
move.w EcNPlan(a4),d0 Creation de BitMap
ext.l d0
move.w EcTx(a4),d1
ext.l d1
move.w EcTy(a4),d2
ext.l d2
move.l T_GfxBase(a5),a6
jsr _LVOInitBitMap(a6)
; Reserve la RAM
; ~~~~~~~~~~~~~~
move.w d4,d6
subq.w #1,d6
move.l Ec_BitMap(a4),a1
moveq #0,d2
EcCra: move.l d7,d0
bsr ChipMm
beq EcMdd
move.l d0,bm_Planes(a1,d2.w)
move.l d0,EcCurrent(a4,d2.w)
move.l d0,EcLogic(a4,d2.w)
move.l d0,EcPhysic(a4,d2.w)
addq.l #4,d2
dbra d6,EcCra
; Ouverture d'un rastport intuition REEL
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l T_LayBase(a5),a6
jsr _LVONewLayerInfo(a6) Creation de LayerInfo
move.l d0,Ec_LayerInfo(a4)
beq EcMdd
move.l d0,a0 Creation du layer
move.l Ec_BitMap(a4),a1
moveq #0,d0
moveq #0,d1
move.w EcTx(a4),d2
subq.w #1,d2
ext.l d2
move.w EcTy(a4),d3
subq.w #1,d3
ext.l d3
moveq #LAYERSIMPLE,d4
sub.l a2,a2
jsr _LVOCreateUpfrontLayer(a6)
move.l d0,Ec_Layer(a4)
beq EcMdd
move.l d0,a0 Rastport courant
move.l lr_rp(a0),Ec_RastPort(a4)
bsr BlitWait
bsr WVbl
bsr BlitWait
; Zones
; ~~~~~~~~~~~
clr.l EcAZones(a4)
clr.w EcNZones(a4)
; Additionne l'ecran dans les tables
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l (sp),d1
lea Circuits,a6
bsr EcGet
move.l a4,(a0) Branche
move.w d1,EcNumber(a4) Un numero!
move.l a4,a0 Devient l'ecran courant
bsr Ec_Active
move.l (sp),d1
bsr EcFirst Et devant les autres
bsr InterPlus Si entrelace
; Parametres d'affichage -2-
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.w T_DefWX(a5),d2 Affichage par defaut
move.w T_DefWY(a5),d3
move.w EcTx(a4),d4
tst.w EcCon0(a4)
bpl.s EcCr6
lsr.w #1,d4
EcCr6 move.w EcTy(a4),d5
cmp.w #320+16,d4
bcs.s EcCr7
move.w T_DefWX2(a5),d2
EcCr7 cmp.w #256,d5
bcs.s EcCr8
btst #2,EcCon0+1(a4)
beq.s EcCr7a
cmp.w #256*2,d5
bcs.s EcCr8
EcCr7a move.w T_DefWY2(a5),d3
EcCr8 ext.l d2
ext.l d3
ext.l d4
ext.l d5
move.l (sp),d1
bsr EcView
; Cree la fenetre de texte plein ecran
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clr.l EcWindow(a4)
moveq #0,d1
moveq #0,d2
moveq #0,d3
move.w EcTx(a4),d4
lsr.w #4,d4
lsl.w #1,d4
move.w EcTy(a4),d5
lsr.w #3,d5
moveq #1,d6
moveq #0,d7
sub.l a1,a1
bsr WOpen
bne EcM1
; Initialisation des parametres graphiques
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l EcWindow(a4),a0
move.b WiPen+1(a0),d1
move.b d1,EcInkA(a4)
move.b WiPaper+1(a0),d0
move.b d0,EcInkB(a4)
move.b d1,EcFInkC(a4)
move.b d1,EcIInkC(a4)
move.b d0,EcFInkA(a4)
move.b d0,EcFInkB(a4)
move.b d0,EcIInkA(a4)
move.b d0,EcIInkB(a4)
move.w #1,EcIPat(a4)
move.w #2,EcFPat(a4)
move.b #1,EcMode(a4)
move.w #-1,EcLine(a4)
move.l Ec_RastPort(a4),a1
moveq #0,d0
move.b EcInkA(a4),d0 Ink A
GfxA5 _LVOSetAPen
move.b EcInkB(a4),d0 Ink B
GfxA5 _LVOSetBPen
move.b EcMode(a4),d0 Draw Mode
GfxA5 _LVOSetDrMd
; move.w EcCont(a4),32(a1) Cont
move.w EcLine(a4),34(a1) Line
clr.w 36(a1) X
clr.w 38(a1) Y
move.l T_DefaultFont(a5),a0 Fonte systeme
GfxA5 _LVOSetFont
clr.w EcClipX0(a4) Par default
clr.w EcClipY0(a4)
move.w EcTx(a4),EcClipX1(a4)
move.w EcTy(a4),EcClipY1(a4)
; Pas d'erreur
; ~~~~~~~~~~~~~
addq.l #4,sp
move.l T_EcCourant(a5),a0 * Ramene l'adresse definition
; Doit recalculer les ecrans
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
EcTout: addq.w #1,T_EcYAct(a5)
; Doit actualiser ECRANS
; ~~~~~~~~~~~~~~~~~~~~~~
EcOtoV: bset #BitEcrans,T_Actualise(a5)
EcOk: movem.l (sp)+,d1-d7/a1-a6
moveq #0,d0
rts
; Erreur creation d'un ecran
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EcM1: move.l (sp),d1
bsr EcDel
bra.s EcEE1
EcMdd bsr EcDDel * Efface la structure
EcEE1 addq.l #4,sp
EcE1: moveq #1,d0
bra.s EcOut
EcE4: moveq #4,d0 * Sans effacement
bra.s EcOut
EcE3: moveq #3,d0 * 3 : SCREEN NOT OPENED
bra.s EcOut
EcE25: moveq #25,d0 * 25: Screen already double buffered
bra.s EcOut
EcE26: moveq #26,d0 * Can't set dual-playfield
bra.s EcOut
EcE27: moveq #27,d0 * Screen not dual playfield
bra.s EcOut
EcE2: moveq #2,d0 * 2 : SCREEN ALREADY OPENED
* Sortie erreur ecrans
EcOut: movem.l (sp)+,d1-d7/a1-a6
tst.l d0
rts
******* Un ecran entrelace en plus!
InterPlus:
btst #2,EcCon0+1(a4)
beq.s IntPls
movem.l d0/a0/a1,-(sp)
clr.w T_InterBit(a5)
lea T_InterList(a5),a0
IntP0 tst.l (a0)
addq.l #8,a0
bne.s IntP0
clr.l (a0)
move.l a4,-8(a0)
move.w EcNumber(a4),d0
lsl.w #6,d0
add.w #CopL1*EcMax,d0
ext.l d0
lea T_CopMark(a5),a1
add.l a1,d0
move.l d0,-4(a0)
movem.l (sp)+,d0/a0/a1
IntPls rts
; Sauve les contenu du rasport de l'ecran courant
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ec_Push movem.l a0-a1/d0,-(sp)
tst.w T_PaPeek(a5)
bne.s .Pasave
move.l T_RastPort(a5),d0
beq.s .Pasave
move.l d0,a0
lea T_EcSave(a5),a1
move.b 25(a0),(a1)+ 0 EcInkA(a1)
move.b 26(a0),(a1)+ 1 EcInkB(a1)
move.b 27(a0),(a1)+ 2 EcOutL(a1)
move.b 28(a0),(a1)+ 3 EcMode(a1)
move.w 32(a0),(a1)+ 4 EcCont(a1)
move.w 34(a0),(a1)+ 6 EcLine(a1)
move.w 36(a0),(a1)+ 8 EcX(a1)
move.w 38(a0),(a1)+ 10 EcY(a1)
move.l 8(a0),(a1)+ 12 EcPat
move.b 29(a0),(a1)+ 16 EcPatY
addq.l #1,a1
lea 52(a0),a0
moveq #14-1,d0 18 Fonte
.Loop move.b (a0)+,(a1)+
dbra d0,.Loop
; Sauve le clip rectangle
move.l T_EcCourant(a5),a0
move.w EcClipX0(a0),(a1)+ 32
move.w EcClipY0(a0),(a1)+ 34
move.w EcClipX1(a0),(a1)+ 36
move.w EcClipY1(a0),(a1)+ 38
.Pasave movem.l (sp)+,a0-a1/d0
rts
; Restore les modes graphiques de l'ecran courant
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ec_Pull movem.l a0-a2/d0-d3,-(sp)
tst.w T_PaPeek(a5)
bne.s .Papull
lea T_EcSave(a5),a2
move.l T_RastPort(a5),d0
beq.s .Papull
move.l d0,a1
; Change le RASTPORT
; ~~~~~~~~~~~~~~~~~~
moveq #0,d0 Ink A
move.b (a2)+,d0
GfxA5 SetAPen
moveq #0,d0 Ink B
move.b (a2)+,d0
GfxA5 SetBPen
move.b (a2)+,27(a1) OutL
moveq #0,d0
move.b (a2)+,d0
GfxA5 SetDrMd Draw Mode
move.w (a2)+,32(a1) Cont
move.w (a2)+,34(a1) Line
move.w (a2)+,36(a1) X
move.w (a2)+,38(a1) Y
move.l (a2)+,8(a1) EcPat
move.b (a2)+,29(a1) EcPatY
addq.l #1,a2
lea 52(a1),a1 Fonte
moveq #14-1,d0
.Loop move.b (a2)+,(a1)+
dbra d0,.Loop
; Restore le clip rectangle
; ~~~~~~~~~~~~~~~~~~~~~~~~~
move.w (a2)+,d0
move.w (a2)+,d1
move.w (a2)+,d2
move.w (a2)+,d3
bsr Ec_SetClip
.Papull movem.l (sp)+,a0-a2/d0-d3
rts
******* VIEW: change le point de vue d'un ecran
* D1= #
* D2= WX
* D3= WY
* D4= WTx
* D5= WTy
EcView: movem.l d1-d7/a1-a6,-(sp)
bsr EcGet
beq EcE3
move.l d0,a4
* WX
cmp.l #EntNul,d2
beq.s EcV2
move.w d2,EcAWX(a4)
bset #1,EcAW(a4)
* WTX
EcV2: cmp.l #EntNul,d4
beq.s EcV3
move.w d4,EcAWTx(a4)
bset #1,EcAWT(a4)
* WY
EcV3: cmp.l #EntNul,d3
beq.s EcV4
move.w d3,EcAWY(a4)
bset #2,EcAW(a4)
* WTy
EcV4: cmp.l #EntNul,d5
beq EcOtoV
move.w d5,EcAWTy(a4)
bset #2,EcAWT(a4)
bra EcOtoV
******* Fait passer l'ecran D1 en premier
EcFirst:movem.l d1-d7/a1-a6,-(sp)
bsr EcGet
beq EcE3
lea T_EcPri(a5),a0
move.l a0,a1
move.l (a1),d1
move.l d0,(a0)
EcF1: addq.l #4,a0
EcF2: addq.l #4,a1
move.l d1,d2
move.l (a1),d1
move.l d2,(a0)
bmi.s EcF3
beq.s EcF2
cmp.l d2,d0
beq.s EcF2
bne.s EcF1
EcF3: bra EcTout
******* Fait passer l'ecran D1 en dernier
EcLast: movem.l d1-d7/a1-a6,-(sp)
bsr EcGet
beq EcE3
lea T_EcPri(a5),a0
move.l a0,a1
EcL1: move.l (a1)+,d1
move.l d1,(a0)
bmi.s EcL2
beq.s EcL1
cmp.l d1,d0
beq.s EcL1
addq.l #4,a0
bra.s EcL1
EcL2: move.l d0,(a0)+
move.l #-1,(a0)+
bra EcTout
; Arret ecran special creation!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A4= Adresse!
EcDDel movem.l d1-d7/a1-a6,-(sp)
bra.s EcDD
; Arret d'un ecran D1
; ~~~~~~~~~~~~~~~~~~~~~~~~~
EcDel: movem.l d1-d7/a1-a6,-(sp)
bsr EcGet
beq EcE3
move.l d0,a4
clr.l (a0) ;Arrete dans la table
lea T_EcPri(a5),a0 ;Arrete dans les priorites
move.l a0,a1
EcD1: move.l (a1)+,d0
move.l d0,(a0)
bmi.s EcD2
beq.s EcD1
cmp.l d0,a4
beq.s EcD1
addq.l #4,a0
bra.s EcD1
; Entrelace?
; ~~~~~~~~~~
EcD2 btst #2,EcCon0+1(a4)
beq.s EcDit3
clr.w T_InterBit(a5)
lea T_InterList(a5),a0
move.l a0,a1
EcDit0 move.l (a1),d0
beq.s EcDit2
cmp.l d0,a4
beq.s EcDit1
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
bra.s EcDit0
EcDit1 lea 8(a1),a1
bra.s EcDit0
EcDit2 clr.l (a0)
; Enleve les screen swaps!
; ~~~~~~~~~~~~~~~~~~~~~~~~
EcDit3 lea T_SwapList(a5),a0
clr.l (a0)
; Recalcule la liste copper
; ~~~~~~~~~~~~~~~~~~~~~~~~~
bsr WVbl
bset #BitHide,EcFlags(a4)
bsr EcForceCop
bsr WVbl
; Entree sans recalcul des listes copper
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EcDD: move.l EcAZones(a4),d0 Les zones
beq.s .Nozone
move.l d0,a1
move.w EcNZones(a4),d0
mulu #8,d0
bsr FreeMm
.Nozone lea EcAW(a4),a0 Les animations
bsr DAdAMAL
lea EcAWT(a4),a0
bsr DAdAMAL
lea EcAV(a4),a0
bsr DAdAMAL
move.l a4,a0 Les bobs
bsr BbEcOff
move.l T_EcCourant(a5),d3
move.l a4,a0 Active l'ecran
bsr Ec_Active Pour les effacements
bsr WiDelA Toutes les fenetres
bsr FlStop Animations de couleur
bsr ShStop
bsr FaStop
bsr EffPat Le pattern
bsr CFont La fonte
; Si ECRAN COURANT: met le + prioritaire pas clone, <8 si possible!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.l a4,d3
bne.s EcD3
lea T_EcPri(a5),a0 1ere boucle: <8
EcDc2: move.l (a0)+,d3
bmi.s EcDc3
move.l d3,a1
btst #BitClone,EcFlags(a1)
bne.s EcDc2
cmp.w #8,EcNumber(a1)
bcc.s EcDc2
bra.s EcD3
EcDc3 lea T_EcPri(a5),a0 2ieme n'importe!
EcDc4 move.l (a0)+,d3
bmi.s EcDc5
move.l d3,a1
btst #BitClone,EcFlags(a1)
bne.s EcDc4
bra.s EcD3
EcDc5 moveq #0,d3
EcD3: move.l d3,a0
bsr Ec_Active
; Liberation des memoires, si pas clone...
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
btst #BitClone,EcFlags(a4) Si clone, rien a liberer...
bne PaClon
move.l a6,-(sp)
; Ferme le ClipRect
; ~~~~~~~~~~~~~~~~~
tst.l Ec_Region(a4)
beq.s .Paclip
move.l T_LayBase(a5),a6 Enleve le ClipRegion
move.l Ec_Layer(a4),a0
sub.l a1,a1
jsr _LVOInstallClipRegion(a6)
move.l Ec_Region(a4),a0 Enleve la region
move.l T_GfxBase(a5),a6
jsr _LVODisposeRegion(a6)
.Paclip
; Ferme le layer
; ~~~~~~~~~~~~~~
move.l T_LayBase(a5),a6
move.l Ec_Layer(a4),d0
beq.s .Nola1
move.l d0,a1
sub.l a0,a0
move.l T_LayBase(a5),a6
jsr _LVODeleteLayer(a6) Enleve le layer
.Nola1 bsr BlitWait Blitter Wait!
bsr WVbl
bsr BlitWait
move.l Ec_LayerInfo(a4),d0 Enleve Layer Info
beq.s .Nola2
move.l d0,a0
jsr _LVODisposeLayerInfo(a6) Enleve le layer info
.Nola2
; Liberation des bitmaps
; ~~~~~~~~~~~~~~~~~~~~~~
bsr BlitWait Correction du bug dans les
bsr WVbl layers...
bsr BlitWait
moveq #EcMaxPlans-1,d7
lea EcLogic(a4),a2
lea EcPhysic(a4),a3
EcFr0: move.l (a2),d2
beq.s EcFr1
move.l d2,a1
move.l EcTPlan(a4),d0
bsr FreeMm
EcFr1: clr.l (a2)+
cmp.l (a3)+,d2
bne.s EcFr2
clr.l -4(a3)
EcFr2: dbra d7,EcFr0
moveq #EcMaxPlans-1,d7
lea EcPhysic(a4),a2
EcFr3: move.l (a2),d0
beq.s EcFr4
move.l d0,a1
move.l EcTPlan(a4),d0
bsr FreeMm
EcFr4: clr.l (a2)+
dbra d7,EcFr3
move.l (sp)+,a6
; La structure Bitmap
; ~~~~~~~~~~~~~~~~~~~
move.l Ec_BitMap(a4),d0
beq.s .PaBM
move.l d0,a1
moveq #40,d0
bsr FreeMm
.PaBM
; Libere les structures
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
PaClon move.l a4,a1 La structure AMOS
move.l #EcLong,d0
bsr FreeMm
move.l T_EcCourant(a5),a0
bra EcOk
******* Initialisation des ecrans
EcRaz: lea T_EcAdr(a5),a0
moveq #EcMax-1,d0
EcR1: clr.l (a0)+
dbra d0,EcR1
move.l #-1,T_EcPri(a5)
lea T_CopMark(a5),a0
move.w #CopML/4-1,d0
EcR2: clr.l (a0)+
dbra d0,EcR2
move.w #1,T_EcYAct(a5)
moveq #0,d0
rts
******* Arret de tous les ecrans entre D1-D2
EcDAll: bsr EcDel
addq.l #1,d1
cmp.l d2,d1
bls.s EcDAll
moveq #0,d0
rts
******* SCREEN OFFSET n,dx,dy
EcOffs: bsr EcGet
beq EcME
move.l d0,a0
cmp.l #EntNul,d2
beq.s EcO1
move.w d2,EcAVX(a0)
bset #1,EcAV(a0)
EcO1: cmp.l #EntNul,d3
beq.s EcO2
move.w d3,EcAVY(a0)
bset #2,EcAV(a0)
EcO2: bra.s EcTu
******* HIDE/SHOW ecran D1,d2
EcHide: bsr EcGet
beq EcME
move.l d0,a0
tst.w EcDual(a0) * Pas DUAL PLAYFIELD
bmi.s EcTut
bclr #BitHide,EcFlags(a0)
tst.w d2
beq.s EcTut
bset #BitHide,EcFlags(a0)
EcTut: addq.w #1,T_EcYAct(a5)
EcTu: bset #BitEcrans,T_Actualise(a5)
moveq #0,d0
rts
***********************************************************
* GESTION DE L'AUTOBACK!
******* AUTOBACK 1
TAbk1: movem.l a3-a6,-(sp)
move.l W_Base(pc),a5
move.l T_EcCourant(a5),a0
move.w EcAuto(a0),d0
subq.w #1,d0
ble.s TAbk1X
bsr WVbl
bsr BobEff
TAbk1X: movem.l (sp)+,a3-a6
rts
******* AUTOBACK 2
TAbk2 move.l W_Base(pc),a1
move.l T_EcCourant(a1),a0
move.w EcAuto(a0),d0
subq.w #1,d0
bmi.s TAbk2X
bne.s TAbk2B
* Autoback simple---> change le rastport / current
moveq #EcMaxPlans-1,d0
move.l Ec_BitMap(a0),a1
addq.l #8,a1
lea EcCurrent(a0),a2
lea EcPhysic(a0),a0
TAbk2A move.l (a0),(a1)+
move.l (a0)+,(a2)+
dbra d0,TAbk2A
TAbk2X rts
* Autoback total---> screen swap
TAbk2B movem.l a3-a6,-(sp)
move.l a1,a5
bsr BobAct
bsr BobAff
bsr ScSwapS
bsr WVbl
bsr BobEff
movem.l (sp)+,a3-a6
rts
******* AUTOBACK 3
TAbk3 move.l W_Base(pc),a1
move.l T_EcCourant(a1),a0
move.w EcAuto(a0),d0
subq.w #1,d0
bmi.s TAbk3X
bne.s TAbk3B
* Simple ---> remet le rasport / current
moveq #EcMaxPlans-1,d0
move.l Ec_BitMap(a0),a1
addq.l #8,a1
lea EcCurrent(a0),a2
lea EcLogic(a0),a0
TAbk3A move.l (a0),(a1)+
move.l (a0)+,(a2)+
dbra d0,TAbk3A
TAbk3X rts
* Total ---> Re screen swap!
TAbk3B movem.l a3-a6,-(sp)
move.l a1,a5
bsr BobAct
bsr BobAff
bsr ScSwapS
bsr WVbl
bclr #BitBobs,T_Actualise(a5)
movem.l (sp)+,a3-a6
rts
******* AUTOBACK 4 -> ecrans single buffer!
TAbk4: movem.l a3-a6,-(sp)
move.l W_Base(pc),a5
move.l T_EcCourant(a5),a0
move.w EcAuto(a0),d0
subq.w #1,d0
ble.s TAbk4X
bsr BobAct
bsr BobAff
TAbk4X: movem.l (sp)+,a3-a6
rts
***********************************************************
* CLS
* D1= Couleur
* D2= X
* D3= Y
* D4= X2
* D5= Y2
EcCls: movem.l d1-d7/a0/a1/a5/a6,-(sp)
move.l T_EcCourant(a5),a5
tst.w d2
bpl.s Cls5b
moveq #0,d2
Cls5b: cmp.w EcTx(a5),d2
bls.s Cls5c
move.w EcTx(a5),d2
Cls5c: tst.w d3
bpl.s Cls5d
moveq #0,d3
Cls5d: cmp.w EcTy(a5),d3
bls.s Cls5e
move.w EcTy(a5),d3
Cls5e: tst.w d4
bpl.s Cls5f
moveq #0,d4
Cls5f: cmp.w EcTx(a5),d4
bls.s Cls5g
move.w EcTx(a5),d4
Cls5g: tst.w d5
bpl.s Cls5h
moveq #0,d5
Cls5h: cmp.w EcTy(a5),d5
bls.s Cls5i
move.w EcTy(a5),d5
Cls5i: cmp.w d2,d4
bls Cls5x
sub.w d3,d5
bls Cls5x
* Gestion de l'autoback!
tst.w EcAuto(a5)
beq.s Cls5W
movem.l d0-d7/a0-a2,-(sp)
bsr TAbk1
movem.l (sp),d0-d7/a0-a2
bsr ClsR
bsr TAbk2
movem.l (sp)+,d0-d7/a0-a2
bsr ClsR
bsr TAbk3
bra.s Cls5X
Cls5W bsr ClsR
Cls5X: movem.l (sp)+,d1-d7/a0/a1/a5/a6
moveq #0,d0
rts
* Routine d'effacement!
ClsR: lea Circuits,a6
bsr OwnBlit
lea MCls(pc),a0 * Masques
move.w d2,d0
and.w #$000F,d0
lsl.w #1,d0
move.w 0(a0,d0.w),BltMaskG(a6)
moveq #0,d6
moveq #-1,d7
move.w d4,d0
and.w #$000F,d0
beq.s Cls5j
moveq #1,d6
lsl.w #1,d0
move.w 0(a0,d0.w),d7
not.w d7
Cls5j: move.w d7,BltMaskD(a6)
lsr.w #4,d2 * Taille en X
lsr.w #4,d4
sub.w d2,d4
add.w d6,d4
lsl.w #6,d5 * Taille blitter
or.w d4,d5
move.w EcTLigne(a5),d0 * Adresse ecran
mulu d0,d3
lsl.w #1,d2
ext.l d2
add.l d2,d3
lsl.w #1,d4 * Mod C et D
sub.w d4,d0
move.w d0,BltModC(a6)
move.w d0,BltModD(a6)
lea EcCurrent(a5),a0
move.w #%0000001111001010,BltCon0(a6)
clr.w BltCon1(a6)
move.w #-1,BltDatA(a6)
move.w EcNPlan(a5),d7
subq.w #1,d7
moveq #-1,d6
Cls5k: moveq #0,d0
lsr.w #1,d1
subx.w d0,d0
move.w d0,BltDatB(a6)
move.l (a0)+,a1
lsr.w #1,d6
bcc.s Cls5m
add.l d3,a1
move.l a1,BltAdC(a6)
move.l a1,BltAdD(a6)
move.w d5,BltSize(a6)
Cls5l: bsr BlitWait
Cls5m: dbra d7,Cls5k
* Remet le blitter et revient
bra DOwnBlit
******* Table des masques
MCls: dc.w %1111111111111111
dc.w %0111111111111111
dc.w %0011111111111111
dc.w %0001111111111111
dc.w %0000111111111111
dc.w %0000011111111111
dc.w %0000001111111111
dc.w %0000000111111111
dc.w %0000000011111111
dc.w %0000000001111111
dc.w %0000000000111111
dc.w %0000000000011111
dc.w %0000000000001111
dc.w %0000000000000111
dc.w %0000000000000011
dc.w %0000000000000001
MCls2: dc.w %0000000000000000
dc.w %0000000000000001
dc.w %0000000000000011
dc.w %0000000000000111
dc.w %0000000000001111
dc.w %0000000000011111
dc.w %0000000000111111
dc.w %0000000001111111
dc.w %0000000011111111
dc.w %0000000111111111
dc.w %0000001111111111
dc.w %0000011111111111
dc.w %0000111111111111
dc.w %0001111111111111
dc.w %0011111111111111
dc.w %0111111111111111
; Active l'ecran D1 - si pas ecran CLONE!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EcMarch bsr EcGet
beq.s EcME
move.l d0,a0
btst #BitClone,EcFlags(a0)
bne.s EcCl
bsr Ec_Active
EcMOk moveq #0,d0
rts
EcME moveq #3,d0
rts
EcCl moveq #4,d0
rts
; Routine d'activation de l'ecran A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ec_Active
move.l a0,T_EcCourant(a5)
move.l a0,d0
beq.s .Skip
move.l Ec_RastPort(a0),T_RastPort(a5)
move.l a1,-(sp)
lea WRastPort(pc),a1
move.l Ec_RastPort(a0),(a1)
move.l (sp)+,a1
.Skip rts
******* RETURNS CURRENT USERS SCREEN ADDRESS
EcCrnt move.l T_EcCourant(a5),a0
move.w EcNumber(a0),d0
cmp.w #8,d0
bcs.s EcCr
moveq #-1,d0
EcCr: rts
******* ADRESSE ECRAN D1
EcAdres cmp.w #8,d1
bcs EcGet
moveq #0,d0
rts
******* SET COLOUR D1,D2
EcSCol: move.l T_EcCourant(a5),a0
and.w #31,d1
lsl.w #1,d1
and.w #$FFF,d2
move.w d2,EcPal(a0,d1.w)
* Poke dans le copper
lsl.w #1,d1
move.w EcNumber(a0),d0
lsl.w #7,d0
lea T_CopMark(a5),a0
add.w d0,a0
cmp.w #PalMax*4,d1
bcs.s ECol0
lea 64(a0),a0
ECol0: move.l (a0)+,d0
beq.s ECol1
move.l d0,a1
move.w d2,2(a1,d1.w)
bra.s ECol0
ECol1: moveq #0,d0
rts
******* GET COLOUR D1
EcGCol: move.l T_EcCourant(a5),a0
and.l #31,d1
lsl.w #1,d1
move.w EcPal(a0,d1.w),d1
moveq #0,d0
rts
******* SET PALETTE A1
EcSPal movem.l a2-a3/d2-d4,-(sp)
move.l T_EcCourant(a5),a0
move.w EcNumber(a0),d2
lsl.l #7,d2
lea T_CopMark(a5),a2
add.w d2,a2
move.l a2,d2
lea EcPal(a0),a0
moveq #0,d0
moveq #0,d1
moveq #31,d4
* Boucle de pokage
EcSP1 move.w (a1)+,d1
bmi.s EcSP3
and.w #$FFF,d1
* Poke dans la table
move.w d1,(a0)
* Poke dans le copper
move.l d2,a2
cmp.w #PalMax*4,d0
bcs.s EcSP2
lea 64(a2),a2
EcSP2: move.l (a2)+,d3
beq.s EcSP3
move.l d3,a3
move.w d1,2(a3,d0.w)
bra.s EcSP2
EcSP3: addq.l #2,a0
addq.w #4,d0
dbra d4,EcSP1
movem.l (sp)+,a2-a3/d2-d4
moveq #0,d0
rts
******* COLOUR BACK D1
EcSColB and.w #$FFF,d1
move.w d1,T_EcFond(a5)
moveq #0,d0
rts
******* RAINBOW HIDE
TRHide tst.w d1
bpl.s Trh
move.w T_Rainbow(a5),T_OldRain(a5)
clr.w T_RainBow(a5)
rts
Trh: move.w T_OldRain(a5),T_RainBow(a5)
rts
******* Adresse RainBow
RainAd move.l d1,d0
bmi RainEr
cmp.w #NbRain,d0
bcc RainEr
mulu #RainLong,d0
lea T_RainTable(a5),a0
add.w d0,a0
moveq #0,d0
rts
RainEr moveq #1,d0
rts
******* DO RAINBOW
* D1= #Rainbow
* D2= Base
* D3= Debut
* D4= Taille
TRDo bsr RainAd
bne RainEr
move.b RnAct(a0),d0
tst.w RnLong(a0)
beq.s RainEr
move.l #EntNul,d5
cmp.l d2,d5
beq.s TRDo1
move.w d2,RnX(a0)
bset #1,d0
TRDo1 cmp.l d3,d5
beq.s TRDo2
move.w d3,RnY(a0)
bset #2,d0
TRDo2 cmp.l d4,d5
beq.s TRDo3
move.w d4,RnI(a0)
bset #0,d0
TRDo3 move.b d0,RnAct(a0)
* Force l'actualisation
RainAct bset #BitEcrans,T_Actualise(a5)
moveq #0,d0
rts
******* ADRESSE VAR RAINBOW
TRVar bsr RainAd
bne RainEr
move.l RnBuf(a0),d0
beq RainEr
move.l d0,a1
tst.l d2
bmi RainEr
lsl.w #1,d2
cmp.w RnLong(a0),d2
bcc RainEr
add.w d2,a1
move.l a1,a0
moveq #0,d0
rts
******* SET RAINBOW
* D1= Numero
* D2= Nb de lignes
* D3= Couleur modifiee
* D4= Chaine R
* D5= Chaine G
* D6= Chaine B
* D7= Valeur de depart
TRSet
clr.l T_AMALSp(a5)
* Efface l'ancien
bsr RnDel
bne RainEr
* Cree le nouveau
bsr RainAd
movem.l d1-d7/a1-a3,-(sp)
move.l sp,a3
move.l a0,a1
and.w #31,d3 * Couleur du rainbow
cmp.w #PalMax,d3
bcc TrSynt
move.w d3,RnColor(a1)
move.w d7,d3
move.w d2,d0 * Reserve le buffer
ext.l d0
lsl.l #1,d0
move.w d0,d1
bsr FastMm2
beq TROmm
move.l d0,RnBuf(a1)
move.w d1,RnLong(a1)
clr.w RnAct(a0) * Rien a faire pour le moment
move.w #-1,RnI(a0) * Rien <EFBFBD> afficher
clr.w RnX(a0) * Position base
clr.w RnY(a0) * Position Y
clr.l RnDY(a0) * Rien en route!
clr.w RnTY(a0) * Vraiment rien!
move.l d0,a2
move.l Buffer(a5),a1
move.l a1,-(sp) * 12(sp)-> Base
clr.w -(sp) * 10(sp)-> Position
move.w #1,-(sp) * 8(sp)-> Nb Mvt
clr.w -(sp) * 6(sp)-> Vitesse
move.w #1,-(sp) * 4(sp)-> Cpt
clr.w -(sp) * 2(sp)-> Plus
move.w d3,d0
and.w #$000F,d0
move.w d0,-(sp) * 0(sp)-> Valeur!
move.l d6,a0
bsr RainTok
bne TrSynt
move.l a1,-(sp) * 12(sp)-> Base
clr.w -(sp) * 10(sp)-> Position
move.w #1,-(sp) * 8(sp)-> Nb Mvt
clr.w -(sp) * 6(sp)-> Vitesse
move.w #1,-(sp) * 4(sp)-> Cpt
clr.w -(sp) * 2(sp)-> Plus
move.w d3,d0
lsr.w #4,d0
and.w #$000F,d0
move.w d0,-(sp) * 0(sp)-> Valeur!
move.l d5,a0
bsr RainTok
bne TrSynt
move.l a1,-(sp) * 12(sp)-> Base
clr.w -(sp) * 10(sp)-> Position
move.w #1,-(sp) * 8(sp)-> Nb Mvt
clr.w -(sp) * 6(sp)-> Vitesse
move.w #1,-(sp) * 4(sp)-> Cpt
clr.w -(sp) * 2(sp)-> Plus
lsr.w #8,d3
and.w #$000F,d3
move.w d3,-(sp) * 0(sp)-> Valeur!
move.l d4,a0
bsr RainTok
bne TrSynt
subq.w #1,d2
* Rempli la table
Trs1 move.l sp,a0
moveq #2,d0
Trs2 tst.w 4(a0)
beq.s Trs5
subq.w #1,4(a0)
bne.s Trs5
move.w 6(a0),4(a0)
move.w 2(a0),d1
add.w (a0),d1
and.w #$000F,d1
move.w d1,(a0)
tst.w 8(a0)
beq.s Trs5
subq.w #1,8(a0)
bne.s Trs5
move.w 10(a0),d1
move.l 12(a0),a1
Trs3 move.w 0(a1,d1.w),4(a0)
bpl.s Trs4
clr.w d1
bra.s Trs3
Trs4 move.w 4(a0),6(a0)
move.w 2(a1,d1.w),2(a0)
move.w 4(a1,d1.w),8(a0)
addq.l #6,d1
move.w d1,10(a0)
Trs5 lea 16(a0),a0
dbra d0,Trs2
move.w (sp),d0
lsl.w #8,d0
move.w 16(sp),d1
lsl.w #4,d1
or.w d1,d0
or.w 32(sp),d0
move.w d0,(a2)+
dbra d2,Trs1
move.w #1,T_RainBow(a5)
moveq #0,d0
* A y est!
TrOut move.l a3,sp
movem.l (sp)+,d1-d7/a1-a3
rts
* Out of mem!
TrOMm moveq #-1,d0
bra.s TrOut
* Syntax error!
TrSynt move.l a3,sp
movem.l (sp)+,d1-d7/a1-a3
bsr TRDel
moveq #1,d0
rts
******* Tokenisation RAINBOW
RainTok movem.l a2/d1-d4,-(sp)
clr.l (a1)
clr.w 4(a1)
move.w (a0)+,d0
lea 0(a0,d0.w),a2
move.b (a2),d4
clr.b (a2)
bsr AniChr
beq.s RainT2
RainT1 cmp.b #"(",d0
bne.s RainTE
bsr AniLong
ble RainTE
move.w d0,(a1)+
bsr AniChr
cmp.b #",",d0
bne RainTE
bsr AniLong
move.w d0,(a1)+
bsr AniChr
cmp.b #",",d0
bne RainTE
bsr AniLong
blt RainTE
move.w d0,(a1)+
bsr AniChr
cmp.b #")",d0
bne RainTE
move.w #-1,(a1)
clr.l 2(a1)
bsr AniChr
bne.s RainT1
RainT2 addq.l #6,a1
move.b d4,(a2)
movem.l (sp)+,a2/d1-d4
moveq #0,d0
rts
RainEE addq.l #4,sp
RainTE move.b d4,(a2)
movem.l (sp)+,a2/d1-d4
moveq #1,d0
rts
******* Effacement RAINBOW D1
TRDel tst.l d1
bpl.s RnDel
clr.w T_RainBow(a5)
clr.w T_OldRain(a5)
moveq #NbRain-1,d1
TRDel0 bsr RnDel
bne RainEr
subq.w #1,d1
bne.s TRDel0
* Routine!
RnDel: bsr RainAd
bne RainEr
move.l a1,-(sp)
tst.l RnBuf(a0)
beq.s RnDel1
clr.l (a0)
move.l RnBuf(a0),a1
clr.l RnBuf(a0)
move.w RnLong(a0),d0
clr.w RnLong(a0)
ext.l d0
bsr FreeMm
RnDel1 movem.l (sp)+,a1
moveq #0,d0
rts
***********************************************************
*-----* Ss programme ---> adresse d'un ecran
EcGet: move.w d1,d0
lsl.w #2,d0
lea T_EcAdr(a5),a0
add.w d0,a0
move.l (a0),d0
rts
EcGE: moveq #0,d0
rts
******* Trouve le premier ecran libre
EcLibre:lea T_EcAdr(a5),a0
moveq #-1,d1
EcL: addq.l #1,d1
tst.l (a0)+
beq.s EcGE
cmp.w #EcMax,d1
bcs.s EcL
moveq #-1,d0
rts
; SET CLIP ecran courant
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TSClip: move.l T_EcCourant(a5),a0
tst.w d1
bpl.s SClip1
; RAZ clipping!
; ~~~~~~~~~~~~~
moveq #0,d0
moveq #0,d1
move.w EcTx(a0),d2
move.w EcTy(a0),d3
bra.s SClipX
; Clippe!
; ~~~~~~~
SClip1 move.l #Entnul,d0
cmp.l d0,d2
bne.s SClip2
moveq #0,d2
move.w EcClipX0(a0),d2
SClip2 cmp.l d0,d3
bne.s SClip3
moveq #0,d3
move.w EcClipY0(a0),d3
SClip3 cmp.l d0,d4
bne.s SClip4
moveq #0,d4
move.w EcClipX1(a0),d4
SClip4 cmp.l d0,d5
bne.s SClip5
moveq #0,d5
move.w EcClipY1(a0),d5
SClip5: tst.l d2
bmi.s SClipE
tst.l d3
bmi.s SClipE
move.w EcTx(a0),d0
ext.l d0
cmp.l d0,d4
bhi.s SClipE
move.w EcTy(a0),d0
cmp.l d0,d5
bhi.s SClipE
cmp.l d2,d4
ble.s SClipE
cmp.l d3,d5
ble.s SClipE
move.w d2,d0
move.w d3,d1
move.w d4,d2
move.w d5,d3
SClipX bsr Ec_SetClip
moveq #0,d0
rts
SClipE: moveq #1,d0
rts
; Change le clip rectangle dans l'ecran
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ec_SetClip
movem.l d2-d4/a4/a6,-(sp)
move.l T_EcCourant(a5),a4
tst.l Ec_Region(a4)
bne.s .Deja
; Faut-il creer un cliprect?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
lea EcClipX0(a4),a0
cmp.w (a0)+,d0
bne.s .Nou
cmp.w (a0)+,d1
bne.s .Nou
cmp.w (a0)+,d2
bne.s .Nou
cmp.w (a0)+,d3
beq.s .Exit
; Installe la clipping region
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Nou movem.w d0-d3,-(sp) Sauve
movem.w d0-d3,-(sp) Pour structure
subq.w #1,4(sp)
subq.w #1,6(sp)
move.l T_GfxBase(a5),a6
jsr _LVONewRegion(a6) Prend une nouvelle region
move.l d0,Ec_Region(a4)
beq.s .Out Out of memory
move.l sp,a1
move.l d0,a0
jsr _LVOOrRectRegion(a6)
tst.l d0
beq.s .Out
move.l T_LayBase(a5),a6 Installe le CLIP
move.l Ec_Layer(a4),a0
move.l Ec_Region(a4),a1
jsr _LVOInstallClipRegion(a6)
addq.l #8,sp
movem.w (sp)+,d0-d3
; Poke dans les structures
; ~~~~~~~~~~~~~~~~~~~~~~~~
.Deja lea EcClipX0(a4),a0
movem.w d0-d3,(a0)
subq.w #1,d2
subq.w #1,d3
move.l Ec_Layer(a4),a0 Layer
move.l 8(a0),a0 ClipRect
movem.w d0-d3,16(a0) Poke les nouveaux!
bra.s .Exit
.Out addq.l #8,sp
movem.w (sp)+,d0-d3
.Exit movem.l (sp)+,d2-d4/a4/a6
rts
******* PAINT non crashant!!!
* D1= X
* D2= Y
* D3= couleur
* D4= Mode
* D5= Buffer 1024 octets
PntTBuf equ 2048
PntPos equ EcCurs
PntDeb equ EcCurs+4
TPaint movem.l d1-d7/a0-a6,-(sp)
move.w d1,a2
move.w d2,a3
move.l d5,a1
move.l T_EcCourant(a5),a5
move.l EcCurs(a5),-(sp) * Room for addresses!
move.l EcCurs+4(a5),-(sp)
moveq #0,d7
cmp.w EcClipX0(a5),a2
bcs NoPaint
cmp.w EcClipX1(a5),a2
bcc NoPaint
cmp.w EcClipY0(a5),a3
bcs NoPaint
cmp.w EcClipY1(a5),a3
bcc NoPaint
move.l WRastPort(pc),a4
move.l 12(a4),d0
beq NoPaint
move.l d0,a4
* Calcul des parametres blitter
move.w d3,-(sp)
move.w EcClipX1(a5),d6
add.w #15,d6
and.w #$FFF0,d6
move.w EcClipX0(a5),d1
and.w #$FFF0,d1
move.w d1,d2
sub.w d1,d6
lsr.w #4,d6
move.w EcClipY1(a5),d1
sub.w EcClipY0(a5),d1
move.w d1,d3
lsl.w #6,d1
or.w d6,d1
move.w d1,-(sp) * Largeur/hauteur blitter
ext.l d6
lsl.w #1,d6 * Delta ligne carre
move.w EcTLigne(a5),d1
sub.w d6,d1
move.w d1,-(sp) * Modulo origine
move.w EcClipY0(a5),d0
mulu EcTLigne(a5),d0
lsr.w #3,d2
add.w d2,d0
move.w d0,-(sp) * Adresse depart carre
mulu d6,d3 * Verifie la taille du tempras
cmp.l 4(a4),d3
bhi PntE2
move.l (a4),a4
* Met a UN toutes les couleurs AUTRES!!!
move.w #%11110000,d3
move.w #%00001111,d4
move.w #%11111100,d5
move.w #%11001111,d7
bsr PMask
******* PAINT LOOP!
moveq #0,d5
bset #13,d5
lea 1024-16*4-16(a1),a0
move.l a0,d1
move.l a1,PntPos(a5)
move.l a1,PntDeb(a5)
moveq #15,d0
Pnt0 clr.l (a1)+
dbra d0,Pnt0
moveq #-1,d0
move.l d0,(a1)+
move.l d0,(a1)+
move.w #-1,(a1)+
clr.w (a1)+
move.w EcClipX0(a5),d4
sub.w d4,a2
move.w EcClipX1(a5),d2
sub.w d4,d2
and.w #$000F,d4
move.w EcClipY1(a5),d3
sub.w EcClipY0(a5),d3
sub.w EcClipY0(a5),a3
* Screen adress
Pnt1 move.w a3,d0
mulu d6,d0
move.w a2,d7
add.w d4,d7
ror.l #3,d7
add.w d7,d0
rol.l #3,d7
and.w #7,d7
neg.w d7
addq.w #7,d7
lea 0(a4,d0.l),a0
* Go to the left
bset #15,d5
bset #14,d5
bset #13,d5
beq.s Pnt5
Pnt2 subq.w #1,a2
addq.w #1,d7
cmp.w #8,d7
bcs.s Pnt3
moveq #0,d7
subq.l #1,a0
Pnt3 btst d7,(a0)
bne.s Pnt4
cmp.w d2,a2
bcc.s Pnt4
cmp.w d3,a3
bcs.s Pnt2
* Go to the right
Pnt4 addq.w #1,a2
subq.w #1,d7
bcc.s Pnt5
moveq #7,d7
addq.l #1,a0
* Look UP
Pnt5 subq.w #1,a3
sub.l d6,a0
btst d7,(a0)
bne.s Pnt6
cmp.w d3,a3
bcc.s Pnt6
bclr #15,d5
beq.s Pnt7
move.w a2,(a1)+
move.w a3,(a1)
or.w d5,(a1)+
cmp.l d1,a1
bcs.s Pnt7
bsr PntNBuf
bra.s Pnt7
Pnt6 bset #15,d5
* Plot in the middle
Pnt7 addq.w #1,a3
add.l d6,a0
bset d7,(a0)
* Look down
addq.w #1,a3
btst d7,(a0,d6.l)
bne.s Pnt8
cmp.w d3,a3
bcc.s Pnt8
bclr #14,d5
beq.s Pnt9
move.w a2,(a1)+
move.w a3,(a1)
or.w d5,(a1)+
cmp.l d1,a1
bcs.s Pnt9
bsr PntNBuf
bra.s Pnt9
Pnt8 bset #14,d5
* One pixel to the right?
Pnt9 bclr #13,d5
subq.w #1,a3
addq.w #1,a2
subq.w #1,d7
bcc.s Pnt10
moveq #7,d7
addq.l #1,a0
* Fait un essai FAST
move.w a0,d0
btst #0,d0
bne.s PntFX
move.w a2,d0
add.w #15,d0
cmp.w d2,d0
bcc.s PntFX
move.w a3,d0
beq.s PntFX
addq.w #1,d0
cmp.w d3,d0
bcc.s PntFX
move.l d1,-(sp)
moveq #-1,d0
btst #15,d5
bne.s PntF1
moveq #0,d0
PntF1 moveq #-1,d1
btst #14,d5
bne.s PntF2
moveq #0,d1
PntF2 tst.w (a0)
bne.s PntF3
cmp.w (a0,d6.l),d1
bne.s PntF3
sub.l d6,a0
cmp.w (a0),d0
add.l d6,a0
bne.s PntF3
move.w #-1,(a0)+
lea 16(a2),a2
cmp.w d2,a2
bcs.s PntF2
PntF3 move.l (sp)+,d1
PntFX
* A droite!
Pnt10 btst d7,(a0)
bne.s Pnt11
cmp.w d2,a2
bcc.s Pnt11
cmp.w d3,a3
bcs Pnt5
* Change line!
Pnt11 move.w -(a1),d5
move.w d5,d0
and.w #%0001111111111111,d0
move.w d0,a3
and.w #%1110000000000000,d5
move.w -(a1),d0
move.w d0,a2
bpl Pnt1
subq.l #4,PntPos(a5)
move.l -(a1),d1
move.l -(a1),a1
bpl.s Pnt11
******* Masks the tempras
move.w #%00001100,d3
move.w #%11000000,d4
move.w d3,d5
move.w d4,d7
bsr PMask
******* Copper copy!
* Initialisation
bsr OwnBlit
move.w #-1,BltMaskG(a6)
move.w #-1,BltMaskD(a6)
move.w 2(sp),d0
move.w d0,BltModC(a6)
move.w d0,BltModD(a6)
clr.w BltModA(a6)
move.w #%0000101111001010,BltCon0(a6)
clr.w BltCon1(a6)
lea EcCurrent(a5),a0
move.l WRastPort(pc),a1
move.b 25(a1),d7
move.b 26(a1),d6
move.w EcNPlan(a5),d5
move.w 4(sp),d3
and.w #%0111111,d3
or.w #%1000000,d3
* Calcul des patterns
lea FoPat(pc),a2
move.l a2,a3
sub.l a5,a5
move.l 8(a1),d0
beq.s PntP4
move.l d0,a2
moveq #1,d2
move.b 29(a1),d0
move.b d0,d1
bpl.s PntP2
neg.b d1
PntP2 lsl.w #1,d2
subq.b #1,d1
bne.s PntP2
PntP3 lsl.w #1,d2
lea 0(a2,d2.w),a3
tst.b d0
bpl.s PntP4
move.l d2,a5
PntP4
* Fait un plan
PntCc1 bsr BlitWait
move.l a2,a1
moveq #0,d0
move.w (sp),d0
add.l (a0)+,d0
move.l d0,BltAdC(a6)
move.l d0,BltAdD(a6)
move.l a4,BltAdA(a6)
move.w 4(sp),d4
lsr.w #6,d4
* Fait une ligne
PntCc2 moveq #0,d0
roxr.w #1,d7
subx.w d0,d0
roxl.w #1,d7
move.w (a1)+,d1
and.w d1,d0
not.w d1
moveq #0,d2
roxr.w #1,d6
subx.w d2,d2
roxl.w #1,d6
and.w d2,d1
or.w d1,d0
bsr BlitWait
move.w d0,BltDatB(a6)
move.w d3,BltSize(a6)
cmp.l a3,a1
bcs.s PntCc3
move.l a2,a1
PntCc3 subq.w #1,d4
bne.s PntCc2
add.l a5,a2
add.l a5,a3
lsr.w #1,d6
lsr.w #1,d7
subq.w #1,d5
bne.s PntCc1
bsr DOwnBlit
******* Copper copy!
PntEnd moveq #0,d7
PntE1 move.l W_Base(pc),a5
move.l T_EcCourant(a5),a5
bsr PntDBuf
PntE2 addq.l #8,sp
NoPaint move.l d7,d1
move.l (sp)+,EcCurs+4(a5)
move.l (sp)+,EcCurs(a5)
movem.l (sp)+,d1-d7/a0-a6
rts
* Erreur!
PntErr moveq #-1,d7
bra.s PntE1
******* Routine, masque la zone dessin
PMask lea $Dff000,a6
bsr OwnBlit
lea EcCurrent(a5),a0
move.w 4+6(sp),d0
move.w EcNPlan(a5),d1
PMsk1 move.w #-1,BltMaskG(a6)
move.w #-1,BltMaskD(a6)
moveq #0,d2
move.w 4(sp),d2
add.l (a0)+,d2
move.l d2,BltAdA(a6)
move.w 4+2(sp),BltModA(a6)
move.l a4,BltAdB(a6)
clr.w BltModB(a6)
move.l a4,BltAdD(a6)
clr.w BltModD(a6)
move.w d3,d2
lsr.w #1,d0
bcc.s PMsk2
move.w d4,d2
PMsk2 or.w #%0000110100000000,d2
move.w d2,BltCon0(a6)
clr.w BltCon1(a6)
move.w 4+4(sp),BltSize(a6)
move.w d5,d3
move.w d7,d4
bsr BlitWait
subq.w #1,d1
bne.s PMsk1
bra DOwnBlit
******* Reserves a new buffer!
PntNBuf movem.l a0/a2/a3,-(sp)
move.l PntPos(a5),a2
move.l (a2),d0
bmi.s PntMem
bne.s PntB1
move.l #PntTBuf,d0
bsr FastMM2
beq.s PntMem
PntB1 move.l d0,(a2)+
move.l a2,PntPos(a5)
exg d0,a1
move.l d1,(a1)+
move.l d0,(a1)+
move.w #-2,(a1)+
clr.w (a1)+
lea PntTBuf-16(a1),a0
move.l a0,d1
movem.l (sp)+,a0/a2/a3
rts
PntMem lea 12+4(sp),sp
bra PntErr
******* Erases all new buffers
PntDBuf move.l PntDeb(a5),a2
PntDb0 move.l (a2)+,d0
bmi.s PntDb1
beq.s PntDb1
move.l d0,a1
move.l #PntTBuf,d0
bsr FreeMM
bra.s PntDb0
PntDb1 rts
******* SET PATTERN ecran courant!
SPat: movem.l d1-d7/a0-a6,-(sp)
* Efface l'ancien
bsr EffPat
* Met le nouveau
tst.w d1
beq SPatX
bmi.s SPat1
* Patterns charge avec la banque!
move.l T_MouBank(a5),a2
moveq #4,d2
bsr SoMouse
bmi SPatE
subq.w #1,d1
beq.s SPat2
move.w d1,d2
bsr SoMouse
bmi SPatE
bra.s SPat2
* Patterns dans la banque de sprites!
SPat1: move.l T_SprBank(a5),d0
beq SPatX
move.l d0,a2
neg.w d1
cmp.w (a2)+,d1
bhi SPatX
lsl.w #3,d1
move.l -8(a2,d1.w),d0
beq SPatX
move.l d0,a2
******* Change!
SPat2: move.w (a2)+,d4
move.w (a2)+,d5
move.w (a2)+,d6
addq.l #4,a2
moveq #1,d0
moveq #0,d3
SPat3: cmp.w d5,d0 * Cherche le multiple de 8 <= TY
beq.s SPat5
bcc.s SPat4
lsl.w #1,d0
addq.w #1,d3
cmp.w #8,d3
bcs.s SPat3
bra.s SPatE
SPat4: subq.w #1,d3
beq.s SPatE
lsr.w #1,d0
SPat5: move.w d0,d7
cmp.w #1,d6
beq.s SPat6
neg.b d3
SPat6: lsl.w #1,d0
mulu d6,d0
move.w d0,d1
bsr ChipMm
beq SPatE
move.l T_EcCourant(a5),a0 * Poke!
move.l d0,EcPat(a0)
move.w d1,EcPatL(a0)
move.b d3,EcPatY(a0)
move.l T_RastPort(a5),a0
move.l d0,8(a0)
move.b d3,29(a0)
* Copie le motif
move.l d0,a1
subq.w #1,d6
lsl.w #1,d2
lsl.w #1,d4
mulu d4,d5
subq.w #1,d7
SPat7: move.w d7,d3
move.l a2,a0
SPat8: move.w (a0),(a1)+
add.w d4,a0
dbra d3,SPat8
SPat9: add.w d5,a2
dbra d6,SPat7
* Pas d'erreur
SPatX: moveq #0,d0
SPatex: movem.l (sp)+,d1-d7/a0-a6
rts
* Erreur quelconque
SPatE: moveq #1,d0
bra.s SPatex
******* Efface le pattern de l'ecran courant
EffPat: movem.l a0-a1/d0-d2,-(sp)
move.l T_EcCourant(a5),a0
move.l EcPat(a0),d0
beq.s EffPx
move.l d0,a1
move.w EcPatL(a0),d0
ext.l d0
clr.l EcPat(a0)
clr.w EcPatL(a0)
clr.b EcPatY(a0)
bsr FreeMm
EffPx: move.l T_RastPort(a5),a0
clr.l 8(a0)
clr.b 29(a0)
movem.l (sp)+,a0-a1/d0-d2
rts
******* Routine
SoMouse subq.w #1,d2
Som0: move.w (a2)+,d0
bmi.s SomE
mulu (a2)+,d0
mulu (a2)+,d0
lsl.w #1,d0
lea 4(a2,d0.w),a2
dbra d2,Som0
moveq #0,d0
rts
SomE: moveq #-1,d0
rts
******* GET FONTS A0= buffer D1= type
TGFonts movem.l d1-d7/a1-a6,-(sp)
move.w d1,-(sp)
* Ouvre la librairie disk font
bsr OpenDFont
beq IgfE
* Efface les anciens
bsr TFFonts
* Demande la taille
moveq #8,d0
move.l a1,a0
move.w (sp),d1
move.l T_FntBase(a5),a6
jsr AvailFonts(a6)
tst.l d0
beq.s IgfX
* Refait en reservant
addq.l #8,d0
move.l d0,d1
bsr FastMm
beq.s IgfE
move.l d0,a0
move.l d0,T_FontInfos(a5)
move.w d1,T_FontILong(a5)
move.l d1,d0
move.w (sp),d1
move.l T_FntBase(a5),a6
jsr AvailFonts(a6)
tst.l d0
beq.s IgfX
bsr TFFonts
IgfX: addq.l #2,sp
movem.l (sp)+,d1-d7/a1-a6
tst.w d0
rts
IgfE: moveq #-1,d0
bra.s IgfX
******* Init DISKFONT Library
OpenDFont
movem.l a0-a1/a6/d0-d1,-(sp)
moveq #0,d0
lea FntName(pc),a1
move.l $4.w,a6
jsr OpenLib(a6)
move.l d0,T_FntBase(a5)
movem.l (sp)+,a0-a1/a6/d0-d1
tst.l T_FntBase(a5)
rts
******* Libere le buffer des infos fontes
TFFonts movem.l d0/a1,-(sp)
move.l T_FontInfos(a5),d0
beq.s FrfX
move.l d0,a1
move.w T_FontILong(a5),d0
ext.l d0
bsr FreeMm
clr.l T_FontInfos(a5)
clr.w T_FontILong(a5)
FrfX: movem.l (sp)+,d0/a1
moveq #0,d0
rts
******* GET FONT D1 / Retour A0= adresse si def existe
TGFont: move.l T_FontInfos(a5),d0
beq.s TgfE
move.l d0,a0
tst.w d1
beq.s TgfV
cmp.w (a0)+,d1
bhi.s TgfV
mulu #10,d1
lea -10(a0,d1.w),a0
Tsf0: moveq #0,d0
rts
TgfE: moveq #-1,d0
rts
TgfV: moveq #1,d0
rts
; SET FONT
; D1= Numero fonte
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
TSFont bsr CFont
tst.w d1
beq.s Tsf0
bsr TGFont
bne .Xx
movem.l d1-d7/a1-a6,-(sp)
move.l a0,a2
move.w (a0),d0
cmp.w #1,d0
beq.s .Ram
; Fonte DISQUE: essaie d'abord en ROM, au cas zou
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l #502,d0 50 Fontes retourn<EFBFBD>es
moveq #1,d1 Fontes RAM
lea -502(sp),sp
move.l sp,a0
move.l T_FntBase(a5),a6
jsr AvailFonts(a6)
move.l sp,a0
move.w (a0)+,d0
subq.w #1,d0
bmi.s .PaRom
.Loop move.w 6(a0),d1
cmp.w 6(a2),d1
bne.s .Next
move.l 2(a0),a1
move.l 2(a2),a3
.Comp move.b (a1)+,d1
beq.s .Found
cmp.b (a3)+,d1
beq.s .Comp
.Next lea 10(a0),a0
dbra d0,.Loop
; Pas trouve en ram, prendre sur disque
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.PaRom lea 502(sp),sp
.Disc lea 2(a2),a0
move.l T_FntBase(a5),a6
jsr OpenDiskFont(a6)
tst.l d0
beq.s .Err
bne.s .Suit
; Ouvre une fonte RAM
; ~~~~~~~~~~~~~~~~~~~
.Found lea 502(sp),sp
.Ram lea 2(a2),a0
move.l T_GfxBase(a5),a6
jsr OpenFont(a6)
tst.l d0
beq.s .Err
; Change le rastport et marque l'ecran
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Suit move.l d0,a0
move.l T_RastPort(a5),a1
move.l T_GfxBase(a5),a6
jsr SetFont(a6)
move.l T_EcCourant(a5),a0
addq.w #1,EcFontFlag(a0)
.Rien moveq #0,d0
.X movem.l (sp)+,d1-d7/a1-a6
.Xx rts
.Err moveq #1,d0
bra.s .X
; Ferme la fonte de l'ecran courant
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CFont: movem.l d0-d1/a0-a1/a6,-(sp)
move.l T_EcCourant(a5),d0
beq.s .Nofont
move.l d0,a0
tst.w EcFontFlag(a0)
beq.s .Nofont
; Ferme la fonte
; ~~~~~~~~~~~~~~
clr.w EcFontFlag(a0)
move.l EcText(a0),a1
move.l T_GfxBase(a5),a6
jsr _LVOCloseFont(a6)
; Remet la fonte systeme
; ~~~~~~~~~~~~~~~~~~~~~~
move.l T_DefaultFont(a5),a0
move.l T_RastPort(a5),a1
jsr _LVOSetFont(a6)
.Nofont movem.l (sp)+,d0-d1/a0-a1/a6
rts
IFEQ EZFlag
******************************************************************
* MARCHE / ARRET de menus
StaMn: bsr Ec_Push
move.w #1,T_PaPeek(a5)
* Branche d'autres zones
move.l T_EcCourant(a5),a0
move.l EcAZones(a0),T_SaveZo(a5)
move.w EcNZones(a0),T_SaveNZo(a5)
clr.l EcAZones(a0)
clr.w EcNZones(a0)
* Clippe tout l'ecran
moveq #0,d0
moveq #0,d1
move.w EcTx(a0),d2
move.w EcTy(a0),d3
bsr Ec_SetClip
* Writing normal
move.l T_RastPort(a5),a1
moveq #1,d0
GfxA5 SetDrMd
* Outline ON
bset #3,33(a1)
move.w #$FFFF,34(a1)
rts
StoMn move.l T_EcCourant(a5),a0
move.l T_SaveZo(a5),EcAZones(a0)
move.w T_SaveNZo(a5),EcNZones(a0)
clr.w T_PaPeek(a5)
bsr Ec_Pull
rts
ENDC
******************************************************************
* SLIDERS
******* Dessine un slider HORIZONTAL
* D1/D2-> TX/TY
* D3-> Total
* D4-> Position
* D5-> Taille
* D6-> X
* D7-> Y
SliHor movem.l d1-d7/a4,-(sp)
move.l T_EcCourant(a5),a4
bsr Ec_Push
cmp.w d3,d4
bhi.s SlPa
move.w d1,d0
bsr SliPour
bsr SlRegs
move.w d0,d2
add.w d6,d2
bsr SliTour
bsr SliDess
move.w d2,d0
add.w d7,d2
bsr SliInt
bsr SliDess
move.w d2,d0
move.w d4,d2
bsr SliTour
bsr SliDess
SlOk: moveq #0,d0
SlGo: bsr Ec_Pull
movem.l (sp)+,d1-d7/a4
tst.w d0
rts
SlPa: moveq #1,d0
bra.s SlGo
SlRegs move.w d4,d0
add.w d1,d4
move.w d5,d1
add.w d2,d5
move.w d4,d2
move.w d5,d3
rts
******* Dessine un slider VERTICAL
SliVer movem.l d1-d7/a4,-(sp)
move.l T_EcCourant(a5),a4
bsr Ec_Push
cmp.w d3,d4
bhi.s SlPa
move.w d2,d0
bsr SliPour
bsr SlRegs
move.w d1,d3
add.w d6,d3
bsr SliTour
bsr SliDess
move.w d3,d1
add.w d7,d3
bsr SliInt
bsr SliDess
move.w d3,d1
move.w d5,d3
bsr SliTour
bsr SliDess
bra.s SlOk
******* Dessine l'interieur du slider
* D0= X
* D1= Y
* D2= X1
* D2= X2
SliInt movem.l d0-d7,-(sp)
move.b EcIInkA(a4),d4
move.b EcIInkB(a4),d5
move.b EcIInkC(a4),d6
move.w EcIPat(a4),d7
bsr SliPut
bra.s SliSx
******* Dessine le TOUR du slider
* D6= X
* D7= Y
* D1= TX
* D2= TY
SliTour movem.l d0-d7,-(sp)
move.b EcFInkA(a4),d4
move.b EcFInkB(a4),d5
move.b EcFInkC(a4),d6
move.w EcFPat(a4),d7
bsr SliPut
SliSx movem.l (sp)+,d0-d7
rts
******* Dessine la bar
SliDess cmp.w d0,d2
bls.s SliDx
cmp.w d1,d3
bls.s SliDx
move.l T_RastPort(a5),a1
GfxA5 RectFill
SliDx rts
******* Change les parametres pour dessiner le slider
SliPut:
* Change les encres
move.l T_RastPort(a5),a1
move.b d6,27(a1) * Ink C
move.w d5,d0 * Ink B
GfxA5 SetBPen
move.w d6,d0 * Ink A
GfxA5 SetAPen
* Lignes continues, outlined
move.w #$FFFF,34(a1)
bset #3,33(a1)
* Pattern
move.w d7,d1
bsr SPat
rts
******* Calcule les pourcentages
SliPour move.w d0,-(sp)
movem.l d1/d2,-(sp)
movem.l d6/d7,-(sp)
moveq #0,d6
move.w d0,d7
cmp.w d3,d5
bcs.s Poub
tst.w d3
bne.s Poua
moveq #1,d3
Poua: move.w d3,d5
Poub bclr #31,d7 * Flag DBug
move.w d5,d1 * Si position + taille
add.w d4,d1 >= maximum: dessin plein...
cmp.w d3,d1
bcs.s .Deb
bset #31,d7
.Deb
move.w d0,d1 * Calculs *65536
swap d0
clr.w d0
divu d3,d0
bvs.s Pou1
mulu d0,d4
swap d4
mulu d5,d0
cmp.w #$8000,d0
bcs.s .Skip
add.l #$00010000,d0
.Skip swap d0
bra.s Pou3
Pou1: moveq #0,d0 * Calculs *256
move.w d1,d0
lsl.l #8,d0
divu d3,d0
bvs.s Pou2
mulu d0,d4
lsr.l #8,d4
mulu d5,d0
cmp.b #$80,d0
bcs.s .Skip
add.l #$00000100,d0
.Skip lsr.l #8,d0
bra.s Pou3
Pou2: moveq #0,d0 * Calculs normaux
move.w d1,d0
divu d3,d0
mulu d0,d4
mulu d5,d0
Pou3: cmp.w #4,d0 * Ty >= 4
bcc.s SlPo1
moveq #4,d0
SlPo1: move.w d4,d6
cmp.w d1,d6 * Sort en bas?
bcs.s SlPo3
move.w d1,d6
sub.w d0,d6
SlPo3: move.w d6,d7 * Fin du slider
add.w d0,d7
cmp.w d1,d7 * Sort en bas?
bls.s SlPoF
move.w d1,d6
move.w d1,d7
sub.w d0,d6
SlPoF: sub.w d6,d7 * TAILLE du centre!
; La fin
movem.l (sp)+,d4/d5
movem.l (sp)+,d1/d2
move.w (sp)+,d0
btst #31,d7
beq.s .Ok
move.w d0,d6 * Positionne EXACTEMENT <EFBFBD> la fin! GRRRRRRR
sub.w d7,d6
.Ok moveq #0,d0
rts
******* Set Slider params!
* D0- InkFa
* D1- InkFb
* D2- InkFc
* D3- Pattern
* D4- InkIa
* D5- InkIb
* D6- InkIc
* D7- Pattern
SliSet: move.l T_EcCourant(a5),a0
move.l #EntNul,a1
cmp.l a1,d0
beq.s Slip0
move.b d0,EcFInkA(a0)
Slip0 cmp.l a1,d1
beq.s Slip1
move.b d1,EcFInkB(a0)
Slip1 cmp.l a1,d2
beq.s Slip2
move.b d2,EcFInkC(a0)
Slip2 cmp.l a1,d3
beq.s Slip3
move.w d3,EcFPat(a0)
Slip3 cmp.l a1,d4
beq.s Slip4
move.b d4,EcIInkA(a0)
Slip4 cmp.l a1,d5
beq.s Slip5
move.b d5,EcIInkB(a0)
Slip5 cmp.l a1,d6
beq.s Slip6
move.b d6,EcIInkC(a0)
Slip6 cmp.l a1,d7
beq.s Slip7
move.w d7,EcIPat(a0)
Slip7 moveq #0,d0
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INITIALISATION DU FLASHEUR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FlInit: clr T_nbflash(a5)
move #lflash*FlMax-1,d0
lea T_tflash(a5),a0
razfl1: clr.b (a0)+
dbra d0,razfl1
rts
; FLASH OFF: arrete les flash de l'ecran active
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FlStop: move.l T_EcCourant(a5),d0
addq.b #1,T_NbFlash+1(a5) Inhibe les interruptions
moveq #FlMax-1,d1
lea T_TFlash(a5),a0
FlS1 tst.w (a0)
beq.s FlS3
cmp.l 4(a0),d0
bne.s FlS3
clr.w (a0)
FlS3 lea LFlash(a0),a0
dbra d1,FlS1
FlSx bsr FlCalc Nombre de flash reels
subq.b #1,T_NbFlash+1(a5) Redemarre
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; FLASH X,A$ d1=numero de la couleur, a1=adresse de la chaine
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FlStart movem.l a2-a6/d2-d7,-(sp)
cmp.b #FlMax,T_NbFlash(a5)
bcc FlToo
addq.b #1,T_NbFlash+1(a5) ;Arrete les flashes
clr d5
; Trouve une position dans la table
lea T_tflash(a5),a0 ;trouve la position dans la table
moveq #FlMax-1,d0
addq #1,d1
lsl #1,d1
move.l T_EcCourant(a5),d2 ;ecran ouvert!
flshi1: tst.w (a0) ;premiere place libre
beq.s flspoke
cmp.w (a0),d1 ;Meme couleur Meme ecran
bne.s flshi0
cmp.l 4(a0),d2
beq.s flspoke
flshi0: lea lflash(a0),a0
dbra d0,flshi1
bra.s flsont ;par securite
flsynt clr.w (a0) ;arrete la couleur
flsont moveq #8,d0
flout bsr FlCalc ;Nombre de flash REEL
subq.b #1,T_NbFlash+1(a5) ;Deshinibe
tst.w d0
FlExit movem.l (sp)+,d2-d7/a2-a6
rts
; Place trouvee: poke dans la table
flspoke moveq #lflash-1,d0 ;nettoie la table
move.l a0,a2
flshi3: clr.b (a2)+
dbra d0,flshi3
moveq #0,d0
tst.b (a1) ;flash 1,"": arret de la couleur
beq.s flout
move.l a0,a2
move.w d1,(a2)+ ;Numero de la couleur
move.w #1,(a2)+ ;Compteur
move.l d2,(a2)+ ;Adresse de l'ecran
clr.w (a2)+ ;Position
moveq #-1,d4
flshi4: move.b (a1)+,d0
cmp.b #"(",d0
bne flshi5
addq.l #1,d4
cmp #16,d4 ;16 couleurs autorisees!
bcc flsynt
moveq #12,d2
clr.l d1
bsr GetHexa
beq FlSynt
lsl.w d2,d1
lsl.l #4,d1
bsr GetHexa
beq FlSynt
lsl.w d2,d1
lsl.l #4,d1
bsr GetHexa
beq FlSynt
lsl.w d2,d1
lsl.l #4,d1
swap d1
move.w d1,2(a2) ;poke la couleur!
cmp.b #",",(a1)+
bne flsynt
bsr dechexa
bne flsynt
tst d1
beq flsynt
move.w d1,(a2) ;poke la vitesse
addq.l #4,a2
cmp.b #")",d0
bne flsynt
bra flshi4
flshi5: tst.b d0 ;la chaine doit etre finie!
bne flsynt
clr.l d0 ;pas d'erreur
bra flout
; Erreurs flash
FlToo moveq #7,d0 * Too many flash
bra FlExit
; Calcule le nombre exact de flash
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FlCalc movem.l a0-a1/d0-d1,-(sp)
addq.b #1,T_NbFlash+1(a5)
moveq #0,d0
moveq #FlMax-1,d1
lea T_tflash(a5),a0 ;trouve la position dans la table
.Loop tst.w (a0)
beq.s .Next
addq.w #1,d0
.Next lea lflash(a0),a0
dbra d1,.Loop
move.b d0,T_NbFlash(a5)
subq.b #1,T_NbFlash+1(a5)
movem.l (sp)+,a0-a1/d0-d1
rts
IFEQ EZFlag
***********************************************************
* START SHIFT
* D1= Numero du shift
* D2= Vitesse
* D3= Col debut
* D4= Col fin
* D5= Direction
* D6= Rotation?
***********************************************************
ShStart movem.l a2/d3/d4,-(sp)
move.l T_EcCourant(a5),a0
lea T_TShift(a5),a1
move.l a1,a2
clr.w (a1)+
move.w d2,(a1)+
move.l a0,(a1)+
and.w #31,d3 *** 256 couleurs!
and.w #31,d4
cmp.w d3,d4
bls.s .Err
lsl.w #1,d3
lsl.w #1,d4
move.w d3,(a1)+
move.w d4,(a1)+
move.b d5,(a1)+
move.b d6,(a1)+
move.w #1,(a2)
moveq #0,d0
.Out movem.l (sp)+,a2/d3/d4
rts
.Err: moveq #9,d0
bra.s .Out
***********************************************************
* Initialisation de la table des shifts
***********************************************************
ShInit: lea T_TShift(a5),a0
move.w #LShift/2-1,d0
ShI: clr.w (a0)+
dbra d0,ShI
rts
***********************************************************
* Arret des shifts d'un ecran
***********************************************************
ShStop: move.l T_EcCourant(a5),d0
lea T_TShift(a5),a0
tst.w (a0)
beq.s ShStX
cmp.l 4(a0),d0
bne.s ShStX
clr.w (a0)
ShStX: moveq #0,d0
rts
***********************************************************
* INTERRUPTIONS SHIFTER
***********************************************************
Shifter:lea T_TShift(a5),a0
tst.w (a0)
beq.s ShfX
subq.w #1,(a0)
bne.s ShfX
* Shifte!
move.w 2(a0),(a0)
addq.l #4,a0
move.l (a0)+,a1
move.w EcNumber(a1),d0
lsl.w #7,d0
lea 0(a3,d0.w),a4
lea EcPal(a1),a1
move.w (a0)+,d0
move.w (a0)+,d1
move.w d0,d2
move.w d1,d3
tst.b (a0)+
bne.s Shf6
* En montant!
move.w 0(a1,d3.w),d5
Shf5: move.w -2(a1,d3.w),0(a1,d3.w)
subq.w #2,d3
cmp.w d2,d3
bne.s Shf5
bra.s Shf8
* En descendant
Shf6: move.w 0(a1,d2.w),d5
Shf7: move.w 2(a1,d2.w),0(a1,d2.w)
addq.w #2,d2
cmp.w d2,d3
bne.s Shf7
* Poke dans les listes copper les couleurs D0-D1
Shf8: tst.b (a0)+ * Rotation???
beq.s Shf8a
move.w d5,0(a1,d2.w)
Shf8a: move.w d0,d2
lsl.w #1,d2
Shf9: move.w 0(a1,d0.w),d3
move.l a4,a2
cmp.w #PalMax*2,d0
bcs.s ShfC
lea 64(a2),a2
ShfC: move.l (a2)+,d4
beq.s ShfB
ShfA: move.l d4,a0
move.w d3,2(a0,d2.w)
move.l (a2)+,d4
bne.s ShfA
ShfB: addq.w #2,d0
addq.w #4,d2
cmp.w d1,d0
bls.s Shf9
* Fini!
ShfX rts
ENDC
***********************************************************
* FADE OFF
FadeTOf clr.w T_FadeFlag(a5)
moveq #0,d0
rts
***********************************************************
* ARRETE LE FADE DE L'ECRAN COURANT!
FaStop move.l T_EcCourant(a5),a0
lea EcPal(a0),a0
cmp.l T_FadePal(a5),a0
bne.s FaStp
clr.w T_FadeFlag(a5)
FaStp rts
***********************************************************
* INSTRUCTION FADE
* A1= Nouvelle palette
* D1= Vitesse
FadeTOn movem.l d1-d7/a1-a3,-(sp)
move.l T_EcCourant(a5),a2
* Params
DoF1 clr.w T_FadeFlag(a5)
move.w #1,T_FadeCpt(a5)
move.w d1,T_FadeVit(a5)
move.w EcNumber(a2),d0
lsl.w #7,d0
lea T_CopMark(a5),a3
add.w d0,a3
move.l a3,T_FadeCop(a5)
lea EcPal(a2),a2
move.l a2,T_FadePal(a5)
* Explore toutes la palette (marquee)
moveq #0,d7
moveq #0,d6
lea T_FadeCol(a5),a3
DoF2 move.w (a1)+,d2
bmi.s DoF5
move.w d7,(a3)+
moveq #8,d4
moveq #0,d5
move.w 0(a2,d7.w),d0
DoF3 move.w d0,d1
lsr.w d4,d1
and.w #$000F,d1
move.w d2,d3
lsr.w d4,d3
and.w #$000F,d3
move.b d1,(a3)+
move.b d3,(a3)+
cmp.b d1,d3
beq.s DoF4
or.w #$1,d5
DoF4 subq.w #4,d4
bpl.s DoF3
add.w d5,d6
tst.w d5
bne.s DoF5
subq.l #8,a3
DoF5 addq.w #2,d7
cmp.w #32*2,d7
bcs.s DoF2
* Demarre -ou non!-
move.w d6,T_FadeFlag(a5)
subq.w #1,d6
move.w d6,T_FadeNb(a5)
DoFx movem.l (sp)+,d1-d7/a1-a3
moveq #0,d0
rts
***********************************************************
* INTERRUPTIONS FADEUR
* Attention! Change A3!!!
***********************************************************
FadeI tst.w T_FadeFlag(a5)
beq.s FadX
subq.w #1,T_FadeCpt(a5)
beq.s Fad0
FadX rts
* Fade!
Fad0 move.w T_FadeVit(a5),T_FadeCpt(a5)
move.l T_FadePal(a5),a1
move.l T_FadeCop(a5),d3
move.w T_FadeNb(a5),d7
lea T_FadeCol(a5),a2
moveq #0,d6
* Boucle
Fad1 move.w (a2)+,d5
bmi.s FadN0
moveq #0,d4
moveq #0,d0
move.b (a2)+,d0
cmp.b (a2)+,d0 * R
beq.s Fad4
bhi.s Fad2
addq.w #1,d0
bra.s Fad3
Fad2 subq.w #1,d0
Fad3 addq.w #1,d4
move.b d0,-2(a2)
Fad4 moveq #0,d1
move.b (a2)+,d1
cmp.b (a2)+,d1 * G
beq.s Fad7
bhi.s Fad5
addq.w #1,d1
bra.s Fad6
Fad5 subq.w #1,d1
Fad6 addq.w #1,d4
move.b d1,-2(a2)
Fad7 moveq #0,d2
move.b (a2)+,d2
cmp.b (a2)+,d2 * B
beq.s FadA
bhi.s Fad8
addq.w #1,d2
bra.s Fad9
Fad8 subq.w #1,d2
Fad9 addq.w #1,d4
move.b d2,-2(a2)
* Calcule la couleur
FadA tst.w d4
beq.s FadN1
addq.w #1,d6
lsl.w #4,d0
or.w d1,d0
lsl.w #4,d0
or.w d2,d0
* Poke dans l'ecran
move.w d0,0(a1,d5.w)
* Poke dans les listes copper
lsl.w #1,d5
move.l d3,a3
cmp.w #PalMax*4,d5
bcs.s FadC
lea 64(a3),a3
FadC move.l (a3)+,d1
beq.s FadN
FadB move.l d1,a4
move.w d0,2(a4,d5.w)
move.l (a3)+,d1
bne.s FadB
* Couleur suivante
FadN dbra d7,Fad1
move.w d6,T_FadeFlag(a5)
rts
* Rien dans cette couleur
FadN0 addq.l #6,a2
dbra d7,Fad1
move.w d6,T_FadeFlag(a5)
rts
* Plus rien maintenant
FadN1 move.w #-1,-8(a2)
bra.s FadN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INTERRUPTIONS FLASHEUR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FlInt: tst.b T_NbFlash+1(a5) Autorisee?
bne.s FlShXX
move.b T_NbFlash(a5),d7 Nombre en route
beq.s FlShXX
addq.b #1,T_NbFlash+1(a5) Inhibe!
lea T_tflash-lflash+2(a5),a0
FlShLL lea lflash-2(a0),a0
FlShL move.w (a0)+,d0
beq.s FlShLL
; Flashe!
sub.w #1,(a0) * Compteur
bne.s FlShN
lea 2(a0),a1
move.l (a1)+,a2 * Adresse de l'ecran
add.w (a1)+,a1 * Pointe
move.w (a1)+,(a0)
bne.s Flsh4
lea 6(a0),a1
clr.w (a1)+
move.w (a1)+,(a0)
FlSh4: addq.w #4,6(a0) * Pointe le suivant
move.w (a1),d2
move.w d2,EcPal-2(a2,d0.w) * Change dans la definition
lsl.w #1,d0
move.w EcNumber(a2),d1
lsl.w #7,d1
lea 0(a3,d1.w),a2
cmp.w #PalMax*4+4,d0
bcs.s FlSh5
lea 64(a2),a2
FlSh5: move.l (a2)+,d1 * Change toutes les definitions
beq.s FlShN
FlSh6: move.l d1,a1
move.w d2,2-4(a1,d0.w)
move.l (a2)+,d1
bne.s FlSh6
; Encore un actif?
FlShN subq.b #1,d7
bne.s FlShLL
; Fini!
FlShX subq.b #1,T_NbFlash+1(a5) Retabli les interruptions
FlShXX rts
***********************************************************
* FABRIQUE LA COPPER LISTE A PARTIR DES ECRANS
*
******* ACTUALISATION DES ECRANS
EcForceCop: * Entree en forcant le calcul
addq.w #1,T_EcYAct(a5)
EcCopper: * Entree normale
movem.l d1-d7/a1-a6,-(sp)
* Suite actualisation
move.w T_EcYAct(a5),d7
lea T_EcPri(a5),a0
move.l (a0)+,d0
beq EcA6
bmi EcActX
EcAct0: move.l d0,a1
* Changement en WY
move.b EcAW(a1),d0
beq.s EcA2
btst #2,d0
beq.s EcAct1
move.w EcAWY(a1),d1
add.w #EcYBase,d1
bpl.s EcAa
moveq #0,d1
EcAa: move.w d1,EcWY(a1)
addq.w #1,d7
* Changement en WX
EcAct1: btst #1,d0
beq.s EcAct2
move.w EcAWX(a1),d1
and.w #$FFF0,d1
move.w d1,EcWX(a1)
* Changement en WTY
EcAct2: clr.w EcAW(a1)
EcA2: move.b EcAWT(a1),d0
beq.s EcA4
btst #2,d0
beq.s EcAct3
move.w EcAWTY(a1),d1
beq.s EcAct3
cmp.w EcTY(a1),d1
bcs.s EcAc
EcAg: move.w EcTY(a1),d1
EcAc: btst #2,EcCon0+1(a1)
beq.s EcA2a
lsr.w #1,d1
EcA2a: move.w d1,EcWTy(a1)
addq.w #1,d7
* Changement en WTX
EcAct3: btst #1,d0
beq.s EcAct4
move.w EcAWTX(a1),d1
and.w #$FFF0,d1
beq.s EcAct4
move.w EcTx(a1),d2
tst.w EcCon0(a1)
bpl.s EcAe
lsr.w #1,d2
EcAe: cmp.w d2,d1
bcs.s EcAf
move.w d2,d1
EcAf: move.w d1,EcWTx(a1)
* Changement en OY
EcAct4: clr.w EcAWT(a1)
EcA4: move.b EcAV(a1),d0
beq.s EcA6
btst #2,d0
beq.s EcAct5
move.w EcAVY(a1),EcVY(a1)
* Changement en OX
EcAct5: btst #1,d0
beq.s EcAct6
move.w EcAVX(a1),EcVX(a1)
* Encore un ecran?
EcAct6: clr.w EcAV(a1)
EcA6: move.l (a0)+,d0
beq.s EcA6
bpl EcAct0
EcActX:
******* Calcul des nouvelles priorites?
move.l T_EcCop(a5),a1
;-----> Si pas de changement Y/TY/Priorite, pas de calcul
tst.w d7
beq PaDecoup
clr.w T_EcYAct(a5)
;-----> Decoupe les ecrans en tranches
lea T_EcBuf(a5),a3
moveq #0,d2 ;Limite en haut
MkD0: lea T_EcPri(a5),a2
move.w #10000,d3 ;Limite en bas
moveq #-1,d5
moveq #0,d1
MkD1: addq.w #4,d1
move.l (a2)+,d0
bmi.s MkD3
beq.s MkD1
move.l d0,a0
tst.b EcFlags(a0)
bmi.s MkD1
move.w EcWY(a0),d0
subq.w #1,d0
cmp.w d2,d0
bls.s MkD2
cmp.w d3,d0
bcc.s MkD2
move.w d0,d3
move.w d3,d4
add.w EcWTy(a0),d4
addq.w #1,d4
move.w d1,d5
bra.s MkD1
MkD2: add.w EcWTy(a0),d0
addq.w #1,d0
cmp.w d2,d0
bls.s MkD1
cmp.w d3,d0
bcc.s MkD1
move.w d0,d3
move.w d1,d5
bset #15,d5
bra.s MkD1
MkD3: cmp.w #-1,d5 ;Fini?
beq.s MkD5
cmp.w #EcYStrt-1,d2 ;Passe le haut de l'ecran?
bcc.s MkD3a
cmp.w #EcYStrt-1,d3
bcs.s MkD3a
move.w #EcYStrt-1,(a3)+ ;Marque le haut de l'ecran
clr.w (a3)+
move.w #$8000,(a3)+
MkD3a:
MkD3b:
move.w d3,(a3)+
move.w d4,(a3)+
move.w d5,(a3)+
; Re-Explore la liste en cas d'egalite SI DEBUT DE FENETRE
and.w #$7fff,d5
lea T_EcPri(a5),a2
moveq #0,d1
MkD4: addq.w #4,d1
move.l (a2)+,d0
bmi.s MkD4a
beq.s MkD4
move.l d0,a0
tst.b EcFlags(a0)
bmi.s MkD4
move.w EcWY(a0),d0
subq.w #1,d0
cmp.w d0,d3
bne.s MkD4
cmp.w d5,d1
beq.s MkD4
move.w d3,(a3)+
move.w d3,d4
addq.w #1,d4
add.w EcWTy(a0),d4
move.w d4,(a3)+
move.w d1,(a3)+
bra.s MkD4
; Remonte la limite
MkD4a: move.w d3,d2
bra MkD0
; Fin de la liste
MkD5: move.w #-1,(a3)+
PaDecoup:
;-----> Analyse de la table / creation de la liste
clr.w T_InterInter(a5)
lea T_EcPri(a5),a2
lea T_EcBuf(a5),a3
MkA1: move.w (a3),d0
bmi MkAFin
move.w 2(a3),d1
move.w 4(a3),d2
bmi MkA4
; Debut d'une fenetre: doit-on l'afficher?
lea T_EcBuf(a5),a0
MkA2: cmp.l a3,a0
bcc MkA8
tst.w 4(a0)
bmi.s MkA3
cmp.w (a0),d0
bcs.s MkA3
cmp.w 2(a0),d0
bcc.s MkA3
cmp.w 4(a0),d2
bcc MkA10
MkA3: lea 6(a0),a0
bra.s MkA2
; Fin d'une fenetre: doit-on en reafficher une autre?
MkA4: and.w #$7FFF,d2
cmp.w #$100,d2 ;Si fin de l'ecran --> marque!
beq MkA9a
clr.w d3
MkA4a: addq.w #6,d3 ;Cherche UN DEBUT devant
cmp.w 0(a3,d3.w),d0
bne.s MkA4b
tst.w 4(a3,d3.w)
bmi.s MkA4a
lea 0(a3,d3.w),a3 ;Va faire le debut!
bra MkA1
MkA4b: lea T_EcBuf(a5),a0 ;Cherche la fenetre a reafficher
move.w #1000,d3
MkA5: cmp.l a3,a0
bcc.s MkA7
tst.w 4(a0)
bmi.s MkA6
cmp.w (a0),d0
bcs.s MkA6
cmp.w 2(a0),d0
bcc.s MkA6
cmp.w 4(a0),d3
bcs.s MkA6
move.w 4(a0),d3
MkA6: lea 6(a0),a0
bra.s MkA5
MkA7: cmp.w #1000,d3
beq.s MkA9
cmp.w d2,d3
bls.s MkA10
move.w d3,d2
; Peut creer la fenetre
MkA8: move.l -4(a2,d2.w),a0
move.w (a3),d0
cmp.w #EcYStrt-1,d0 * Sort en haut?
bcs.s MkA10
move.w T_EcYMax(a5),d1 * Sort en bas?
subq.w #2,d1
cmp.w d1,d0
bcc.s MkA10
move.w d0,(a1)+
move.l a0,(a1)+
btst #2,EcCon0+1(a0)
beq.s MkA10
move.w #%100,T_InterInter(a5)
bra.s MkA10
; Fin normale de la fenetre
MkA9: tst.w d2
beq.s MkA10
move.w (a3),d0
MkA9a: cmp.w #EcYStrt-1,d0
bcs.s MkA10
move.w T_EcYMax(a5),d1
subq.w #1,d1
cmp.w d1,d0
bcc.s MkA11
neg.w d0
move.w d0,(a1)+
; Passe a une autre
MkA10: lea 6(a3),a3
bra MkA1
; C'est la fin
MkA11 neg.w d1
move.w d1,(a1)+
* Marque la fin des ecrans
MkAFin: clr.w (a1)
******* Fabrique la liste copper
* Avec RAINBOW ou non!
* Plus de screen swap
clr.w T_Cop255(a5)
clr.w T_InterBit(a5)
clr.l T_SwapList(a5)
* Nettoie les marqueurs
clr.l T_CopMark+CopL1*0(a5)
clr.l T_CopMark+CopL1*0+64(a5)
clr.l T_CopMark+CopL1*1(a5)
clr.l T_CopMark+CopL1*1+64(a5)
clr.l T_CopMark+CopL1*2(a5)
clr.l T_CopMark+CopL1*2+64(a5)
clr.l T_CopMark+CopL1*3(a5)
clr.l T_CopMark+CopL1*3+64(a5)
clr.l T_CopMark+CopL1*4(a5)
clr.l T_CopMark+CopL1*4+64(a5)
clr.l T_CopMark+CopL1*5(a5)
clr.l T_CopMark+CopL1*5+64(a5)
clr.l T_CopMark+CopL1*6(a5)
clr.l T_CopMark+CopL1*6+64(a5)
clr.l T_CopMark+CopL1*7(a5)
clr.l T_CopMark+CopL1*7+64(a5)
clr.l T_CopMark+CopL1*8(a5)
clr.l T_CopMark+CopL1*8+64(a5)
clr.l T_CopMark+CopL1*9(a5)
clr.l T_CopMark+CopL1*9+64(a5)
clr.l T_CopMark+CopL1*10(a5)
clr.l T_CopMark+CopL1*10+64(a5)
clr.l T_CopMark+CopL1*11(a5)
clr.l T_CopMark+CopL1*11+64(a5)
clr.l T_CopMark+CopL1*12+CopL2*0(a5)
clr.l T_CopMark+CopL1*12+CopL2*1(a5)
clr.l T_CopMark+CopL1*12+CopL2*2(a5)
clr.l T_CopMark+CopL1*12+CopL2*3(a5)
clr.l T_CopMark+CopL1*12+CopL2*4(a5)
clr.l T_CopMark+CopL1*12+CopL2*5(a5)
clr.l T_CopMark+CopL1*12+CopL2*6(a5)
clr.l T_CopMark+CopL1*12+CopL2*7(a5)
clr.l T_CopMark+CopL1*12+CopL2*8(a5)
clr.l T_CopMark+CopL1*12+CopL2*9(a5)
* Copper manuel???
tst.w T_CopON(a5)
beq PasCop
* Liste copper logique
move.l T_CopLogic(a5),a1
lea 64+4(a1),a1 * Saute les sprites
* Rainbow?
tst.w T_RainBow(a5)
bne.s CopBow
******* Fabrique NORMAL
MCop0 move.l T_EcCop(a5),a2
MCop1 move.w (a2)+,d0
beq.s MCopX
bmi.s MCop2
* Debut d'un ecran
move.l (a2)+,a0
bsr EcCopHo
bra.s MCop1
* Fin d'un ecran
MCop2 neg.w d0
bsr EcCopBa
bra.s MCop1
* Fin de la liste
MCopX: subq.l #2,a2
cmp.l T_EcCop(a5),a2
bne.s .Skip
move.w T_EcYMax(a5),d0
subq.w #1,d0
bsr EcCopBa
.Skip move.l #$FFFFFFFE,(a1)+
******* Swappe les listes
MCopSw move.l T_CopLogic(a5),a0
move.l T_CopPhysic(a5),a1
move.l a1,T_CopLogic(a5)
move.l a0,T_CopPhysic(a5)
* Poke dans le copper, si AMOS est la!
tst.b T_AMOSHere(a5)
beq.s PasCop
move.l a0,Circuits+Cop1Lc
move.w T_InterInter(a5),T_InterBit(a5)
* Fini!
PasCop movem.l (sp)+,d1-d7/a1-a6
moveq #0,d0
rts
******* Actualise les RAINBOWS
CopBow lea T_RainTable(a5),a0
moveq #0,d4
moveq #NbRain-1,d6
moveq #0,d5
RainA1 tst.w RnLong(a0)
beq.s RainA5
addq.w #1,d5
tst.w RnI(a0)
bmi.s RainA5
addq.w #1,d4
move.b RnAct(a0),d7
beq.s RainA5
clr.b RnAct(a0)
* Taille en Y
bclr #0,d7
beq.s RainA2
move.w RnI(a0),d0
move.w d0,RnTY(a0)
bset #2,d7
* Position en Y
RainA2 bclr #2,d7
beq.s RainA4
clr.l RnDY(a0)
move.w RnY(a0),d1
cmp.w #28,d1
bcc.s RainA3
moveq #28,d1
RainA3 move.w RnTy(a0),d0
add.w #EcYBase,d1
move.w d1,RnDY(a0)
add.w d0,d1
move.w d1,RnFY(a0)
* Position de la base
RainA4 bclr #1,d7
beq.s RainA5
move.w RnX(a0),d0
lsl.w #1,d0
cmp.w RnLong(a0),d0
bcc.s RainA5
lsr.w #1,d0
move.w d0,RnBase(a0)
* Rainbow suivant
RainA5 lea RainLong(a0),a0
dbra d6,RainA1
* Securite!
move.w d5,T_RainBow(a5)
tst.w d4
beq MCop0
******* Fabrique la liste
move.l T_EcCop(a5),a2
move.w #EcYBase,d0
moveq #-1,d3
moveq #-1,d4
moveq #0,d7
Rain1 move.w (a2)+,d1
beq Rain3
bmi.s Rain2
* Debut d'un ecran
bsr Rain
move.l (a2)+,a0
movem.l d0/d3-d7,-(sp)
bsr EcCopHo
movem.l (sp)+,d0/d3-d7
clr.w d3
tst.w d4
bmi.s Rain1e
cmp.w #PalMax*4,d4
bcs.s Rain1d
lea 64(a4),a4
Rain1d move.l (a4),a0
move.w 2(a0,d4.w),d3
bclr #31,d3
Rain1e cmp.w d7,d0
bcc.s Rain1a
move.w (a3)+,2(a0,d4.w)
cmp.l a6,a3
bcs.s Rain1a
move.l d6,a3
Rain1a addq.w #1,d0
move.w (a2),d1
bpl.s Rain1b
neg.w d1
Rain1b cmp.w d0,d1
beq.s Rain1
cmp.w d7,d0
bcc.s Rain2a
move.w d5,(a1)+
move.w (a3)+,(a1)+
bra.s Rain1c
* Fin d'un ecran
Rain2 neg.w d1
bsr Rain
bsr EcCopBa
tst.w d4
bne.s Rain1b
move.w T_EcFond(a5),d3
cmp.w d7,d0
bcc.s Rain2a
move.l a1,a0 * Recherche la couleur
Rain1z cmp.w #$0180,-(a0)
bne.s Rain1z
move.w (a3)+,2(a0)
Rain1c cmp.l a6,a3
bcs.s Rain2a
move.l d6,a3
Rain2a addq.w #1,d0
bra Rain1
* Fin des ecrans
Rain3 subq.l #2,a2
cmp.l T_EcCop(a5),a2
bne.s .Skip
move.w T_EcYMax(a5),d0
subq.w #1,d0
bsr Rain
bsr EcCopBa
.Skip move.l #$FFFFFFFE,(a1)+
bra MCopSw
******* Fabrique le rainbow ---> Y=D1
RainD1 move.w d0,d2
sub.w #EcYBase,d2
cmp.w #256,d2 * Attente -> ligne -> D0
bcs.s RainD2
tst.w T_Cop255(a5)
bne.s RainD2
move.w #$FFE1,(a1)+
move.w #$FFFE,(a1)+
addq.w #1,T_Cop255(a5)
RainD2 lsl.w #8,d2
or.w #$03,d2
move.w d2,(a1)+
move.w #$FFFE,(a1)+
move.w d5,(a1)+ * Change la couleur
move.w (a3)+,(a1)+
cmp.l a6,a3
bcs.s RainD3
move.l d6,a3
RainD3 addq.w #1,d0
* Entree!
Rain cmp.w d7,d0
bcc.s RainNx
RainD0 cmp.w d1,d0
bcs.s RainD1
RainDX move.w d1,d0
rts
******* Trouve le rainbow comprenant D0
RainNX tst.l d3
bmi.s RainN0
tst.w d3 * Si RIEN au dessus
bpl.s Rain0a
move.w #Color00,(a1)+ * Couleur 0 d'office!
move.w T_EcFond(a5),(a1)+
bset #31,d3
bra.s RainN0
Rain0a move.w d5,(a1)+
move.w d3,(a1)+
bset #31,d3
RainN0 lea T_RainTable(a5),a0 * Cherche le 1er
moveq #NbRain-1,d2
RainN1 cmp.w (a0),d0
bcs.s RainN2
cmp.w RnFY(a0),d0
bcs.s RainN5
RainN2 lea RainLong(a0),a0
dbra d2,RainN1
lea T_RainTable(a5),a0 * Trouve le 1er plus bas
moveq #0,d7
moveq #NbRain-1,d2
move.w d1,d6
RainN3 cmp.w RnFY(a0),d0
bcc.s RainN4
cmp.w (a0),d1
bcs.s RainN4
cmp.w (a0),d6
bcs.s RainN4
move.w (a0),d6
move.l a0,d7
RainN4 lea RainLong(a0),a0
dbra d2,RainN3
tst.l d7
beq RainDX
move.l d7,a0
move.w (a0),d0
* Debut d'un RainBow
RainN5 move.w d0,d5
sub.w (a0),d5
add.w RnBase(a0),d5
lsl.w #1,d5
move.l RnBuf(a0),d6
move.l d6,a3
move.l a3,a6
add.w RnLong(a0),a6
add.w d5,a3
cmp.l a6,a3
bcs.s RainD7
RainN6 sub.w RnLong(a0),a3
cmp.l a6,a3
bcc.s RainN6
RainD7 move.w RnFY(a0),d7
* Nouvelle couleur
move.w d4,d2
move.w RnColor(a0),d4
move.w d4,d5
lsl.w #2,d4
lsl.w #1,d5
add.w #Color00,d5
* Reprend la couleur!
tst.w d3
bmi.s RainD9
cmp.w d4,d2
beq.s RainD9
move.l (a4),a0
move.w 2(a0,d4.w),d3
RainD9 bclr #31,d3
bra RainD0
******* Creation de la ligne COPPER de definition d'un ecran!
* D0= Y ecran
* A0= Adresse de l'ecran
EcCopHo
* Decalage PHYSIQUE dans la fenetre
move.w d0,d1
sub.w EcWY(a0),d1
addq.w #1,d1
btst #2,EcCon0+1(a0) * par 2 si entrelace!
beq.s MkC4a
lsl.w #1,d1
MkC4a
* Attend jusqu'a la ligne D0
move.w d0,d2
sub.w #EcYBase,d2
bsr WaitD2
* Preparation image
move.w #DmaCon,(a1)+ ;Arret DMA
move.w #$0100,(a1)+
* Debut de la palette
move.l a1,-(sp)
moveq #PalMax-1,d3
move.w #Color00,d2
lea EcPal(a0),a4
MkC5: move.w d2,(a1)+
addq.w #2,d2
move.w (a4)+,(a1)+
dbra d3,MkC5
IFEQ EZFlag
* Dual playfield???
move.w EcDual(a0),d2
bne CreeDual
PluDual:
ENDC
* Ecran normal!
add.w EcVY(a0),d1 * Decalage ecran
mulu EcTLigne(a0),d1
move.w EcVx(a0),d2
lsr.w #4,d2
lsl.w #1,d2
add.w d2,d1
move.l a1,d3
* Poke les adresses des bitplanes
moveq #EcPhysic,d2
move.w EcNPlan(a0),d6
subq.w #1,d6
move.w #Bpl1PtH,d7
MkC0: move.l 0(a0,d2.w),d5
add.l d1,d5
move.w d7,(a1)+
addq.w #2,d7
swap d5
move.w d5,(a1)+
move.w d7,(a1)+
addq.w #2,d7
swap d5
move.w d5,(a1)+
addq.l #4,d2
dbra d6,MkC0
* Marque les adresses SCREEN SWAP
move.w EcNumber(a0),d2 * Marque les adresse
cmp.w #10,d2 * Si ecran utilisateur!
bcc.s MrkC2
lsl.w #6,d2
lea CopL1*EcMax+T_CopMark(a5),a4
add.w d2,a4
MrkC1 tst.l (a4)
addq.l #8,a4
bne.s MrkC1
clr.l (a4)
move.l d3,-8(a4) * Adresse dans liste
move.l d1,-4(a4) * Decalage
MrkC2:
* Calcule les valeurs non plantantes!
move.w #465+16,d3
tst.w EcCon0(a0)
bpl.s MkC1c
move.w #465,d3
MkC1c move.w EcWX(a0),d1
addq.w #1,d1
move.w EcWTx(a0),d2
move.w d1,d6
add.w d2,d6
cmp.w d3,d6
bcs.s MkC1a
sub.w d3,d6
add.w #16,d6
sub.w d6,d2
bra.s MkC1b
MkC1a: cmp.w #176,d6
bhi.s MkC1b
sub.w #176,d6
sub.w d6,d1
MkC1b: move.w d1,EcWXr(a0)
move.w d2,EcWTxr(a0)
* Calcul et poke DIW Start/Stop
move.w #DiwStrt,(a1)+ ;DiwStrt Y = 0
move.w d1,(a1)
or.w #$0100,(a1)+
move.w #DiwStop,(a1)+ ;DiwStop Y = 311
add.w d2,d1
and.w #$00ff,d1
or.w #$3700,d1
move.w d1,(a1)+
* Calcul des valeurs modulo ---> d4
move.w EcTLigne(a0),d4
move.w EcWTxr(a0),d5
lsr.w #3,d5
btst #7,EcCon0(a0)
bne.s MkC2a
lsr.w #1,d5
MkC2a: lsl.w #1,d5
sub.w d5,d4
bpl.s MkC2
clr.w d4
MkC2:
* Calcul DDF Start/Stop---> D1/D2
move.w EcWXr(a0),d1
move.w EcWTxr(a0),d2
move.w EcVX(a0),d6
btst #7,EcCon0(a0)
bne.s MkCH
* Lowres
sub.w #17,d1
lsr.w #1,d1
and.w #$FFF8,d1
lsr.w #1,d2
subq.w #8,d2
add.w d1,d2
and.w #15,d6 ;Scrolling?
beq.s MkC3
subq.w #8,d1
subq.w #2,d4
neg.w d6
add.w #16,d6
bra.s MkC3
* Hires
MkCH: sub.w #9,d1
lsr.w #1,d1
and.w #$FFFC,d1
lsr.w #1,d2
subq.w #8,d2
add.w d1,d2
and.w #15,d6 ;Scrolling?
lsr.w #1,d6
beq.s MkC3
subq.w #4,d1
subq.w #4,d4
neg.w d6
addq.w #8,d6
MkC3: move.w d6,d5
lsl.w #4,d5
or.w d6,d5
* Poke les valeurs
move.w #DdfStrt,(a1)+
move.w d1,(a1)+
move.w #DdfStop,(a1)+
move.w d2,(a1)+
* Interlace?
move.w EcCon0(a0),d1
btst #2,d1
beq.s MkCi1
move.w EcTx(a0),d2
lsr.w #3,d2
add.w d2,d4
MkCi1 move.w #Bpl1Mod,(a1)+
move.w d4,(a1)+
move.w #Bpl2Mod,(a1)+
move.w d4,(a1)+
* Registres de controle
move.w #BplCon0,(a1)+
or.w T_InterInter(a5),d1
move.w d1,(a1)+
move.w #BplCon1,(a1)+
move.w d5,(a1)+
move.w #BplCon2,(a1)+
move.w EcCon2(a0),(a1)+
* Reactive le DMA au debut de la fenetre
FiniCop move.l (sp)+,d4
addq.w #1,d0
move.w (a2),d1
bpl.s FiCp1
neg.w d1
FiCp1 cmp.w d0,d1
beq.s MkC9
move.w d0,d2
sub.w #EcYBase,d2
bsr WaitD2
move.w #DmaCon,(a1)+
move.w #$8300,(a1)+
* Fin de la palette!
move.l a1,d3
moveq #32-PalMax-1,d1
move.w #Color00+PalMax*2,d2
lea EcPal+PalMax*2(a0),a4
MkC7: move.w d2,(a1)+
addq.w #2,d2
move.w (a4)+,(a1)+
dbra d1,MkC7
* Adresse de la 2ieme palette
move.w EcNumber(a0),d2
lsl.w #7,d2
lea T_CopMark+64(a5),a4
add.w d2,a4
MkC8: tst.l (a4)+
bne.s MkC8
clr.l (a4)
sub.l #4*PalMax,d3
move.l d3,-(a4)
* Adresse de la 1ere palette dans la liste copper
MkC9 move.w EcNumber(a0),d2 * Marque les adresse
lsl.w #7,d2
lea T_CopMark(a5),a4
add.w d2,a4
MkC10: tst.l (a4)+
bne.s MkC10
clr.l (a4)
move.l d4,-(a4)
* Fini!
rts
IFEQ EZFlag
******* Creation liste copper pour ecrans DUAL PLAYFIED!
CreeDual:
* Adresse du deuxieme ecran
move.l a2,-(sp)
lsl.w #2,d2
lea T_EcAdr(a5),a2
move.l -4(a2,d2.w),d2 * On a efface le deuxieme!
bne.s CrDu1
move.l (sp)+,a2
clr.w EcDual(a0) * Transforme en ecran simple!
move.w EcCon0(a0),d2
and.w #%1000101111111111,d2
move.w EcNPlan(a0),d7
lsl.w #8,d7
lsl.w #4,d7
or.w d7,d2
move.w d2,EcCon0(a0)
bra PluDual
CrDu1: move.l d2,a2
* Adresses bitplanes PAIRS!
move.w d1,-(sp)
add.w EcVY(a0),d1 * Decalage ecran
mulu EcTLigne(a0),d1
move.w EcVx(a0),d2
lsr.w #4,d2
lsl.w #1,d2
add.w d2,d1
move.l a1,d3
moveq #EcPhysic,d2
move.w EcNPlan(a0),d6
subq.w #1,d6
move.w #Bpl1PtH,d7
MkDC1: move.l 0(a0,d2.w),d5
add.l d1,d5
move.w d7,(a1)+
addq.w #2,d7
swap d5
move.w d5,(a1)+
move.w d7,(a1)+
addq.w #2,d7
swap d5
move.w d5,(a1)+
addq.l #4,d2
addq.w #4,d7
dbra d6,MkDC1
move.w EcNumber(a0),d2 * Marque les adresses
cmp.w #8,d2
bcc.s MrkDC2
lsl.w #6,d2
lea CopL1*EcMax+T_CopMark(a5),a4
add.w d2,a4
MrkDC1 tst.l (a4)
addq.l #8,a4
bne.s MrkDC1
clr.l (a4)
move.l d3,-8(a4)
move.l d1,-4(a4)
* Adresses bitplanes IMPAIRS!
MrkDC2 move.w (sp)+,d1
add.w EcVY(a2),d1 * Decalage ecran
mulu EcTLigne(a2),d1
move.w EcVx(a2),d2
lsr.w #4,d2
lsl.w #1,d2
add.w d2,d1
move.l a1,d3
moveq #EcPhysic,d2
move.w EcNPlan(a2),d6
subq.w #1,d6
move.w #Bpl1PtH+4,d7
MkdC12: move.l 0(a2,d2.w),d5
add.l d1,d5
move.w d7,(a1)+
addq.w #2,d7
swap d5
move.w d5,(a1)+
move.w d7,(a1)+
addq.w #2,d7
swap d5
move.w d5,(a1)+
addq.l #4,d2
addq.w #4,d7
dbra d6,MkdC12
move.w EcNumber(a2),d2 * Marque les adresses
cmp.w #8,d2
bcc.s MrkDC4
lsl.w #6,d2
lea CopL1*EcMax+T_CopMark(a5),a4
add.w d2,a4
MrkDC3 tst.l (a4)
addq.l #8,a4
bne.s MrkDC3
clr.l (a4)
move.l d3,-8(a4)
move.l d1,-4(a4)
MrkDC4
* Calcule les valeurs non plantantes!
move.w #465+16,d3
tst.w EcCon0(a0)
bpl.s MkdC1c
sub.w #16,d3
MkdC1c move.w EcWX(a0),d1
addq.w #1,d1
move.w EcWTx(a0),d2
move.w d1,d6
add.w d2,d6
cmp.w d3,d6
bcs.s MkdC1a
sub.w d3,d6
add.w #16,d6
sub.w d6,d2
bra.s MkdC1b
MkdC1a: cmp.w #176,d6
bhi.s MkdC1b
sub.w #176,d6
sub.w d6,d1
MkdC1b: move.w d1,EcWXr(a0)
move.w d2,EcWTxr(a0)
move.w #DiwStrt,(a1)+ ;DiwStrt Y = 0
move.w d1,(a1)
or.w #$0100,(a1)+
move.w #DiwStop,(a1)+ ;DiwStop Y = 311
add.w d2,d1
and.w #$00ff,d1
or.w #$3700,d1
move.w d1,(a1)+
* Calcul des valeurs modulo ---> D4/D5
move.w EcTLigne(a0),d4
move.w EcTLigne(a2),d5
move.w EcWTxr(a0),d6
move.w EcWTxr(a2),d7
lsr.w #3,d6
lsr.w #3,d7
btst #7,EcCon0(a0)
bne.s MkdC2
lsr.w #1,d6
lsr.w #1,d7
MkdC2: lsl.w #1,d6
lsl.w #1,d7
sub.w d6,d4
bpl.s MkdC2a
clr.w d4
MkdC2a: sub.w d7,d5
bpl.s MkdC2b
clr.w d5
MkdC2b:
* Calcul DDF Start/Stop---> D1/D2
move.w EcVX(a0),d6
move.w EcVX(a2),d7
move.w d6,d1
and.w #15,d1
bne.s Mkd2d
and.w #$FFF0,d7
Mkd2d: move.w d7,d1
and.w #15,d1
bne.s Mkd2e
and.w #$FFF0,d6
Mkd2e: move.w EcWXr(a0),d1
move.w EcWTxr(a0),d2
btst #7,EcCon0(a0)
bne.s MkdCH
* Lowres
sub.w #17,d1
lsr.w #1,d1
and.w #$FFF8,d1
lsr.w #1,d2
subq.w #8,d2
add.w d1,d2
and.w #15,d6
and.w #15,d7
beq.s MkdC3
subq.w #8,d1
subq.w #2,d4
subq.w #2,d5
neg.w d6
add.w #16,d6
neg.w d7
add.w #16,d7
bra.s MkdC3
* Hires
MkdCH: sub.w #9,d1
lsr.w #1,d1
and.w #$FFFC,d1
lsr.w #1,d2
subq.w #8,d2
add.w d1,d2
and.w #15,d6
and.w #15,d7
lsr.w #1,d6
lsr.w #1,d7
beq.s MkdC3
subq.w #4,d1
subq.w #4,d4
subq.w #4,d5
neg.w d6
addq.w #8,d6
neg.w d7
addq.w #8,d7
MkdC3: lsl.w #4,d7
or.w d7,d6
* Poke les valeurs
move.w #DdfStrt,(a1)+
move.w d1,(a1)+
move.w #DdfStop,(a1)+
move.w d2,(a1)+
move.w #Bpl1Mod,(a1)+
move.w d4,(a1)+
move.w #Bpl2Mod,(a1)+
move.w d5,(a1)+
* Registres de controle
move.w #BplCon0,(a1)+
move.w EcCon0(a0),d1
or.w T_InterInter(a5),d1
move.w d1,(a1)+
move.w #BplCon1,(a1)+
move.w d6,(a1)+
move.w #BplCon2,(a1)+
move.w EcCon2(a0),(a1)+
* Fini! Retourne au programme normal
move.l (sp)+,a2
bra FiniCop
ENDC
******* Cree la ligne COPPER de fin de fenetre
EcCopBa move.w d0,d2
sub.w #EcYBase,d2
bsr WaitD2
move.w #DmaCon,(a1)+
move.w #$0100,(a1)+
move.w #Color00,(a1)+
move.w T_EcFond(a5),(a1)+
rts
******* Attente copper jusqu'a la ligne D2
WaitD2: cmp.w #256,d2
bcs.s WCop
tst.w T_Cop255(a5)
bne.s WCop
move.w #$FFDF,(a1)+
move.w #$FFFE,(a1)+
addq.w #1,T_Cop255(a5)
WCop: lsl.w #8,d2
or.w #$03,d2
move.w d2,(a1)+
move.w #$FFFE,(a1)+
rts
***********************************************************
* INITIALISATION GENERALE LISTE COPPERS
* D0= longueur des listes (physic et logic)
CpInit:
* Reserve la memoire pour les listes
move.l d0,T_CopLong(a5)
bsr ChipMm
beq GFatal
move.l d0,T_CopLogic(a5)
move.l d0,a0
move.l T_CopLong(a5),d0
bsr ChipMm
beq GFatal
move.l d0,T_CopPhysic(a5)
move.l d0,a1
* Copper en ROUTE!
move.w #-1,T_CopON(a5)
* Marque les offsets des listes sprites au debut...
HsCop move.l #$1003FFFE,(a0)+ Legere attente!
move.l -4(a0),(a1)+
move.w #$120,d0
CpI1: move.w d0,(a0)+
move.w d0,(a1)+
addq.w #2,d0
addq.l #2,a0
addq.l #2,a1
cmp.w #$13e,d0
bls.s CpI1
moveq #0,d0
rts
***********************************************************
* LIBERATION DES LISTES COPPER
CpEnd: move.l T_CopLogic(a5),d0
beq.s CpE1
move.l d0,a1
move.l T_CopLong(a5),d0
bsr FreeMm
CpE1: move.l T_CopPhysic(a5),d0
beq.s CpE2
move.l d0,a1
move.l T_CopLong(a5),d0
bsr FreeMm
CpE2: rts
***********************************************************
* GESTION DIRECTE COPPER
***********************************************************
IFEQ EZFlag
******* COPPER ON/OFF
TCopOn tst.w d1
bne.s ICpo1
* Copper OFF -> Hide!
tst.w T_CopON(a5)
beq.s ICpoX
clr.w T_CopON(a5)
bsr EcForceCop * RAZ des pointeurs
clr.l T_HsChange(a5) * Plus de HS!
move.w #-1,T_MouShow(a5) * Plus de souris
move.l T_CopLogic(a5),T_CopPos(a5) * Init!
bsr WVbl
bra TCopSw
* Copper ON -> Recalcule!
ICpo1 tst.w T_CopON(a5)
bne.s ICpoX
bsr WVbl
move.l T_CopLogic(a5),a0 * Remet les listes sprites
move.l a0,a1
bsr HsCop
bsr TCpSw
bsr WVbl
move.l T_CopLogic(a5),a0
move.l a0,a1
bsr HsCop
bsr TCpSw
bsr WVbl
move.w #-1,T_CopON(a5) * Remet!
bsr HsAff
clr.w T_MouShow(a5)
bsr EcForceCop * Recalcule les listes
bsr WVbl
ICpoX moveq #0,d0
rts
******* COPSWAP
TCopSw tst.w T_CopON(a5)
bne CopEr1
move.l T_CopPos(a5),a0
move.l #$FFFFFFFE,(a0)
TCpSw move.l T_CopLogic(a5),a0
move.l T_CopPhysic(a5),a1
move.l a1,T_CopLogic(a5)
move.l a0,T_CopPhysic(a5)
move.l a0,Circuits+Cop1Lc
******* COPRESET
TCopRes tst.w T_CopON(a5)
bne CopEr1
move.l T_CopLogic(a5),T_CopPos(a5)
clr.w T_Cop255(a5)
moveq #0,d0
rts
******* COP WAIT x,y
* D1= X
* D2= Y
* D3= Masque X
* D4= Masque Y
TCopWt tst.w T_CopON(a5)
bne CopEr1
cmp.w #313,d1
bcc CopEr3
cmp.w #313,d2
bcc CopEr3
move.l T_CopPos(a5),a1
cmp.w #256,d2
bcs.s CopW1
tst.w T_Cop255(a5)
bne.s CopW1
move.w #$FFE1,(a1)+
move.w #$FFFE,(a1)+
addq.w #1,T_Cop255(a5)
CopW1 lsl.w #8,d2 * Position en X/Y
lsr.w #1,d1
and.w #$00FE,d1
or.w #$01,d1
or.w d2,d1
move.w d1,(a1)+
lsl.w #8,d4 * Masque en X/Y
lsr.w #1,d3
and.w #$00FE,d3
or.w d4,d3
move.w d3,(a1)+
CopFin move.l a1,T_CopPos(a5)
sub.l T_CopLogic(a5),a1
cmp.l T_CopLong(a5),a1
bcc CopEr2
moveq #0,d0
rts
CopEr1 moveq #1,d0 * Copper not desactivated
rts
CopEr2 moveq #2,d0 * Copper list too long
rts
CopEr3 moveq #3,d0 * Copper param out of range
rts
******* CMOVE ad,value
* D1= AD
* D2= Value
TCopMv tst.w T_CopON(a5)
bne.s CopEr1
move.l T_CopPos(a5),a1
cmp.w #512,d1
bcc.s CopEr3
and.w #$01FE,d1
move.w d1,(a1)+
move.w d2,(a1)+
bra CopFin
******* CMOVEL ad,value
TCopMl swap d2
bsr TCopMv
swap d2
addq.w #2,d1
bra TCopMv
******* CBASE
TCopBs move.l T_CopLogic(a5),d1
moveq #0,d0
rts
ENDC
;-----------------------------------------------------------------
; **** *** **** ****
; * * * * * ******************************************
; **** * * * **** * DIVERS
; * * * * * ******************************************
; **** * **** ****
;-----------------------------------------------------------------
;-----> Wait mouse key
WaitMK: bsr MBout
cmp.w #2,d1
bne.s WaitMk
Att: bsr MBout
cmp.w #0,d1
bne.s Att
rts
;-----> OWN BLITTER
OwnBlit:movem.l d0/d1/a0/a1/a6,-(sp)
move.l GfxBase(pc),a6
jsr _LVOOwnBlitter(a6) OwnBlitter
movem.l (sp)+,d0/d1/a0/a1/a6
;-----> Wait blitter fini
BlitWait
move.l a6,-(sp)
move.l GfxBase(pc),a6
jsr _LVOWaitBlit(a6)
move.l (sp)+,a6
rts
;-----> DISOWN BLITTER
DOwnBlit
movem.l d0/d1/a0/a1/a6,-(sp)
move.l GfxBase(pc),a6
jsr DisownBlitter(a6)
movem.l (sp)+,d0/d1/a0/a1/a6
rts
;-----> Position du faisceau
PosVbl: move.l $004(a6),d0
lsr.l #8,d0
and.w #$1FF,d0
rts
******* RESERVATION MEMOIRE
FastMm movem.l a0/d1,-(sp)
move.l #CLEAR|PUBLIC,d1
bsr WMemReserve
move.l a0,d0
movem.l (sp)+,a0/d1
rts
FastMm2 movem.l a0/d1,-(sp)
move.l #PUBLIC,d1
bsr WMemReserve
move.l a0,d0
movem.l (sp)+,a0/d1
rts
ChipMm movem.l a0/d1,-(sp)
move.l #CLEAR|PUBLIC|CHIP,d1
bsr WMemReserve
move.l a0,d0
movem.l (sp)+,a0/d1
rts
ChipMm2 movem.l a0/d1,-(sp)
move.l #PUBLIC|CHIP,d1
bsr WMemReserve
move.l a0,d0
movem.l (sp)+,a0/d1
rts
FreeMm bra WMemFree
; Mini CHRGET: (a1)--->d0
miniget:move.b (a1)+,d0 ;beq: fini
beq.s mini5 ;bmi: lettre
cmp.b #32,d0 ;bne: chiffre
beq.s miniget
cmp.b #"0",d0
blt.s mini2
cmp.b #"9",d0
bhi.s mini2
moveq #1,d7
rts
mini2: cmp.b #"a",d0 ;transforme en majuscules
bcs.s mini3
sub.b #32,d0
mini3: moveq #-1,d7
mini5: rts
; Prend un chiffre hexa--> D1
Gethexa:clr.w d1
bsr MiniGet
beq.s GhX
move.b d0,d1
sub.b #"0",d1
cmp.b #9,d1
bls.s Gh1
sub.b #7,d1
Gh1: cmp.b #15,d1
bhi.s GhX
moveq #1,d0
rts
GhX: moveq #0,d0
rts
;Conversion dec/hexa a1 -> chiffre en d1
dechexa:clr d1 ; derniere lettre en D0
clr d2
bsr miniget
beq.s Mdh5
bpl.s Mdh2
cmp.b #"-",d0
bne.s Mdh5
moveq #1,d2
Mdh0: bsr miniget
beq.s Mdh3
bmi.s Mdh3
Mdh2: mulu #10,d1
sub.b #48,d0
and #$00ff,d0
add d0,d1
bra.s Mdh0
Mdh3: tst d2
beq.s Mdh4
neg d1
Mdh4: clr d2 ;beq: un chiffre
rts
Mdh5: moveq #1,d2 ;bne: pas de chiffre
rts
;-----------------------------------------------------------------
; **** *** **** ****
; * * * * * ******************************************
; **** * * * **** * AMAL
; * * * * * ******************************************
; **** * **** ****
;-----------------------------------------------------------------
******* CHRGET pour les animations
* SAUTE LES MINUSCULES! GENIAL!
AniChr moveq #0,d0
AniCh0: move.b (a0)+,d0
beq.s AnChX
cmp.b #33,d0
bcs.s AniCh1
cmp.b #"Z",d0
bhi.s AniCh1
AnChX: rts
AniCh1: cmp.b #"|",d0
beq.s AnChX
cmp.b #"!",d0
beq.s AnChX
cmp.b #27,d0
bne.s AniCh0
addq.l #2,a0
bra.s AniCh0
******* Conversion DECIMAL/HEXA-> HEXA
AniLong moveq #1,d3
bsr AniChr
cmp.b #"-",d0
bne.s Adh0
subq.w #1,d3
bsr AniChr
Adh0: cmp.b #"$",d0 * Hexa????
beq.s Adhh0
sub.b #"0",d0
bcs AniE1
cmp.b #10,d0
bcc AniE1
move.l d0,d1
subq.w #1,d3
Adh1: bsr AniChr
sub.b #"0",d0
bcs.s Adh2
cmp.b #10,d0
bcc.s Adh2
add.l d1,d1
move.l d1,d2
lsl.l #2,d1
add.l d2,d1
add.l d0,d1
bra.s Adh1
Adh2: subq.l #1,a0
tst d3
beq.s AdhX
bpl AniE1
neg.l d1
AdhX: move.l d1,d0
rts
* En Hexa!
Adhh0 bsr AniChr
bsr Tohh
bmi AniE1
move.l d0,d1
subq.w #1,d3
Adhh1: bsr AniChr
bsr Tohh
bmi.s Adh2
lsl.l #4,d1
add.l d0,d1
bra.s Adhh1
Tohh sub.b #"0",d0
bcs.s TohhE
cmp.b #10,d0
bcs.s TohhX
sub.b #"A"-"0",d0
bcs.s TohhE
cmp.b #6,d0
bcc.s TohhE
add.b #10,d0
TohhX tst.b d0
rts
TohhE moveq #-1,d0
rts
IFEQ EZFlag
***************************** FORMAT D'UNE SEQUENCE
NbInterne: equ 10
AmPrev: equ 0
AmNext: equ 4
AmLong: equ 8
AmNb: equ 10
AmPos: equ 12
AmAuto: equ 16
AmAct: equ 20
AmBit: equ 24
AmCpt: equ 26
AmDeltX: equ 28
AmDeltY: equ 32
AmVirgX: equ 36
AmVirgY: equ 38
AmFin: equ 40
AmAJsr: equ 44
AmAAd: equ 48
AmAALoop: equ 52
AmACLoop: equ 56
AmACpt: equ 58
AmIRegs: equ 60
AmStart: equ 60+NbInterne*2
***********************************************************
* TOKENISATEUR AMAL
******* ENTREE
* D3==> Type 0=Anim / 1= Move / 2= Move X / 3= Move Y
* A1==> Chaine
* A2/D2==> Buffer tokenisation
* D1==> Buffer variables
******* SORTIE
* D0==> ERREUR?
* A0==> Longueur chaine
TokAMAL:
********
movem.l d1-d7/a1-a6,-(sp)
move.l sp,T_AMALSp(a5)
move.l d7,-(sp)
move.l d7,T_AmBank(a5)
move.l a1,a0 * Debut chaine!
move.l d1,a1
move.l a2,d7 * Bas du buffer
lea 0(a2,d2.w),a5 * Fin du buffer
moveq #0,d6
move.l d6,a6
moveq #0,d5 * Pas d'autotest
moveq #0,d4 * Pas d'erreur
* Init de la table des labels
move.l a1,a3
moveq #26/2,d0
moveq #-1,d1
InA0: move.l d1,(a3)+
dbra d0,InA0
* Table des FOR/NEXT
lea 26*2+26*4(a1),a3 * 256 Octets de plus!
move.l #-1,(a3)+
lea AmJumps(pc),a4 * Table des decalages
* Stos type?
tst.w d3
bne AniStos
* Boucle d'interpretation
AniLoop cmp.l a5,a2
bcc AniTrop
bsr AniChr
beq AnPasse2
move.w d0,d1
bsr AniChr
cmp.b #":",d0
beq AnLab
subq.l #1,a0
cmp.b #"J",d1
beq AnJmp
cmp.b #"L",d1
beq AnLet
cmp.b #"M",d1
beq AnMove
cmp.b #"F",d1
beq AnFor
cmp.b #"N",d1
beq AnNext
cmp.b #"I",d1
beq AnIf
cmp.b #"W",d1
beq AnWait
cmp.b #"P",d1
beq AnPose
cmp.b #"E",d1
beq AnStop
cmp.b #"A",d1
beq AnAni
cmp.b #"D",d1
beq AnDirect
cmp.b #"X",d1
beq AnExit
cmp.b #")",d1
beq AnAutOf
bra AniLoop
******* Trop long! Marque et boucle!
AniTrop:sub.l d7,a2
add.l a2,a6
move.l d7,a2
bra AniLoop
******* AUto test
AnAutOn:addq.l #1,a0
bsr AniChr
tst.w d5
bne AniE5
cmp.b #"(",d0
bne AniE1
bsr AniChr
cmp.b #")",d0
beq.s AnAu1
subq.l #1,a0
move.w $60/2(a4),(a2)+
move.l a2,d5
sub.l d7,d5
swap d5
move.w #1,d5
clr.w (a2)+
bra AniLoop
AnAu1: move.w $64/2(a4),(a2)+
bra AniLoop
******* FIN AUTOTEST / EXIT
AnExit: tst.w d5
beq AniE6
move.w $68/2(a4),(a2)+
clr.w (a2)+
bra AniLoop
AnAutOf tst.w d5
beq AniE6
move.w $68/2(a4),(a2)+
move.l a2,d0
sub.l d7,d0
swap d5
sub.w d5,d0
move.l a0,-(sp)
move.l d7,a0
move.w d0,0(a0,d5.w)
move.l (sp)+,a0
moveq #0,d5
bra AniLoop
******* DIRECT label EXTERNE!
AnDirect:
tst.w d5
beq AniE6
move.w $6C/2(a4),(a2)+
bsr AniChr
sub.b #"A",d0
bcs AniE1
cmp.b #26,d0
bhi AniE1
lsl.w #1,d0
move.l a2,d1
sub.l d7,d1
move.w d1,26*2(a1,d6.w)
move.w d0,26*2+2(a1,d6.w)
addq.w #4,d6
move.w #-1,26*2(a1,d6.w)
clr.w (a2)+
bra AniLoop
******* Un LABEL!
AnLab: sub.b #"A",d1
bcs AniE1
cmp.b #26,d1
bhi AniE1
lsl.w #1,d1
tst.w 0(a1,d1.w)
bpl AniE8
move.l a2,d0
sub.l d7,d0
or.w d5,d0
move.w d0,0(a1,d1.w)
bra AniLoop
******* Un BRANCHEMENT
AnJmp: move.w $1C/2(a4),(a2)+
bsr AniChr
sub.b #"A",d0
bcs AniE1
cmp.b #26,d0
bhi AniE1
lsl.w #1,d0
move.l a2,d1
sub.l d7,d1
or.w d5,d1
move.w d1,26*2(a1,d6.w)
move.w d0,26*2+2(a1,d6.w)
addq.w #4,d6
move.w #-1,26*2(a1,d6.w)
clr.w (a2)+
bra AniLoop
******* For RA=deb To end
AnFor: tst.w d5
bne AniE9
move.w $28/2(a4),(a2)+
bsr AniReg
beq AniE1
cmp.w #$000C/2,d1
bne AniE1
swap d2
move.w d2,-(sp) * Poke le debut
bsr AniChr
cmp.b #"=",d0
bne AniE1
bsr AniExp
bsr AniChr * Poke le TO
cmp.b #"T",d0
bne AniE1
bsr AniExp
move.l a2,(a3)+
move.w (sp)+,d2 * Poke la variable
move.w d2,(a3)+
move.w d2,(a2)+
clr.w (a2)+ * Place pour le TO!
bra AniLoop
******* NEXT RA
AnNext: tst.w d5
bne AniE9
move.w $2C/2(a4),(a2)+
bsr AniReg
beq AniE1
cmp.w #$000C/2,d1
bne AniE1
swap d2
cmp.w -(a3),d2
bne AniE2
move.l -(a3),d0
sub.l a2,d0
move.w d0,(a2)+
bra AniLoop
******* LET
AnLet: move.w $20/2(a4),(a2)+
bsr AniReg
beq AniE1
add.w #$0030/2,d1
movem.l d1-d3,-(sp)
bsr AniChr
cmp.b #"=",d0
bne AniE1
bsr AniExp
movem.l (sp)+,d1-d3
move.w 0(a4,d1.w),(a2)
move.l d2,2(a2)
add.w d3,a2
bra AniLoop
******* TESTS
AnIf: move.w $24/2(a4),(a2)+
bsr AniExp
bsr AniChr
cmp.b #"J",d0
beq AnJmp
cmp.b #"D",d0
beq AnDirect
cmp.b #"X",d0
beq AnExit
bra AniE1
******* MOVE DeltaX,DeltaY,Nbstep
AnMove: tst.w d5
bne AniE9
move.w $18/2(a4),(a2)+
bsr AniExp
bsr AniChr
cmp.b #",",d0
bne AniE1
bsr AniExp
bsr AniChr
cmp.b #",",d0
bne AniE1
bsr AniExp
bra AniLoop
******* PAUSE
AnPose: cmp.b #"L",(a0)
beq.s AnPlay
move.w $0014/2(a4),(a2)+
bra AniLoop
******* END
AnStop: move.w $0000/2(a4),(a2)+
bra AniLoop
******* WAIT
AnWait: tst.w d5
bne AniE9
move.w $0010/2(a4),(a2)+
bra AniLoop
******* PLay Exp
AnPlay: addq.l #1,a0
tst.l (sp)
beq AniE10
move.w $00C0/2(a4),(a2)+
bsr AniExp
bra AniLoop
******* Anim
AnAni: cmp.b #"U",(a0)
beq AnAutOn
move.w $CC/2(a4),(a2)+
bsr AniExp
move.l a2,-(sp)
clr.w (a2)+
bsr AniChr
cmp.b #",",d0
bne AniE1
bsr AniChr
cmp.b #"(",d0
bne AniE1
AnAni1 bsr AniExp
bsr AniChr
cmp.b #",",d0
bne AniE1
bsr AniExp
bsr AniChr
cmp.b #")",d0
bne AniE1
bsr AniChr
cmp.b #"(",d0
beq.s AnAni1
subq.l #1,a0
clr.w (a2)+
move.l (sp),d0
move.l a2,(sp)
exg d0,a2
sub.l a2,d0
move.w d0,(a2)
move.l (sp)+,a2
bra AniLoop
***********************************************************
* COMPATIBLE STOS!
AniStos move.l a0,-(sp)
move.l (sp)+,a0
cmp.w #1,d3
bne.s AnMve
******* ANIMATION!
move.w $04/2(a4),(a2)+
bsr StChr
cmp.b #"(",d0
bne AniE1
AnSt0 bsr AniLong
move.w d0,(a2)+
bsr StChr
cmp.b #",",d0
bne AniE1
bsr AniLong
move.w d0,(a2)+
bmi AniE1
bsr StChr
cmp.b #")",d0
bne AniE1
AnSt1: bsr StChr
beq.s AnSt2
cmp.b #"L",d0
beq.s AnSt3
cmp.b #"(",d0
beq.s AnSt0
bra AniE1
AnSt2 move.w #-1,(a2)+
bra AnPasse2
AnSt3 move.w #-2,(a2)+
bra AnPasse2
* Mouvement X ou Y!
AnMve: move.w $08/2(a4),d0
cmp.w #2,d3
beq.s AnMv1
move.w $0C/2(a4),d0
AnMv1 move.w d0,(a2)+
move.l a2,a3
move.w #$8000,(a2)+ * Debut
clr.w (a2)+ * Loop/End
move.w #$8000,(a2)+ * End
bsr StChr
beq AniE1
cmp.b #"(",d0
beq.s AnMv2
subq.l #1,a0
bsr AniLong
move.w d0,(a3)
bsr StChr
cmp.b #"(",d0
bne AniE1
AnMv2 bsr AniLong
move.w d0,(a2)+
ble AniE1
bsr StChr
cmp.b #",",d0
bne AniE1
bsr AniLong
move.w d0,(a2)+
bsr StChr
cmp.b #",",d0
bne AniE1
bsr AniLong
move.w d0,(a2)+
bmi AniE1
bsr StChr
cmp.b #")",d0
bne AniE1
bsr StChr
cmp.b #"(",d0
beq.s AnMv2
clr.w (a2)+
tst.b d0
beq AnPasse2
cmp.b #"L",d0
bne.s AnMv3
move.w #-1,2(a3)
bra.s AnMv4
AnMv3 cmp.b #"E",d0
bne AniE1
AnMv4 bsr StChr
beq AnPasse2
subq.l #1,a0
bsr AniLong
move.w d0,4(a3)
bra AnPasse2
******* Chrget pour stos type!
StChr: moveq #0,d0
StChr1 move.b (a0)+,d0
beq.s StChr2
cmp.b #32,d0
beq.s StChr1
cmp.b #"a",d0
bcs.s StChr2
cmp.b #"z",d0
bhi.s StChr2
sub.b #32,d0
StChr2 rts
***********************************************************
* DEUXIEME PASSE: affecte les labels!
AnPasse2:
move.w $00/2(a4),(a2)+
sub.l d7,a2
exg.l d7,a2
lea 26*2(a1),a0
moveq #0,d0
AnLoop2 move.w (a0)+,d0
bmi.s AniX
move.w d0,d2
and.w #$0001,d2
and.w #$FFFE,d0
move.w (a0)+,d1
move.w 0(a1,d1.w),d1
bmi Aniee3
move.w d1,d3
and.w #$0001,d3
and.w #$FFFE,d1
cmp.w d2,d3
bne Aniee4
sub.w d0,d1
move.w d1,0(a2,d0.w)
bra.s AnLoop2
******* Tout est fini!
AniX: addq.l #4,sp
cmp.l #0,a6
bne.s AniX2
move.l d7,a0
movem.l (sp)+,d1-d7/a1-a6
moveq #0,d0
rts
AniX2: move.l a6,a0
add.l d7,a0
movem.l (sp)+,d1-d7/a1-a6 * -1-> Pas assez de place!
moveq #-1,d0 * A0= longueur necessaire!
rts
Aniee3: lea 0(a2,d0.w),a0
bra.s Anie3
Aniee4: lea 0(a2,d0.w),a0
bra.s Anie4
ENDC
******* ERREUR!
AniE10: addq.w #1,d4 * PLay only with bank
AniE9: addq.w #1,d4 * Not authorised during autotest
AniE8: addq.w #1,d4 * Label already def
AniE7: addq.w #1,d4 * String too long
AniE6: addq.w #1,d4 * Autotest not opened
AniE5: addq.w #1,d4 * Autotest already on
AniE4: addq.w #1,d4 * Jump To/Within AUTOTEST
AniE3: addq.w #1,d4 * Label not defined
AniE2: addq.w #1,d4 * Next /For
AniE1: move.l W_Base(pc),a5
move.l T_AMALSp(a5),d1 * Vient de RAINBOW?
beq RainEE
move.l d1,sp
addq.w #1,d4 * Syntax error
move.l d4,d0
movem.l (sp)+,d1-d7/a1-a6
sub.l a1,a0 * Offset de l'erreur
tst.w d0
rts
IFEQ EZFlag
***********************************************************
* ROUTINES INTERPRETATION
******* Prend X/Y/A/ ou REG
AniReg: bsr AniChr
AniR: moveq #$00/2,d1
cmp.b #"A",d0
beq.s AniRx
moveq #$04/2,d1
cmp.b #"X",d0
beq.s AniRx
moveq #$08/2,d1
cmp.b #"Y",d0
beq.s AniRx
cmp.b #"R",d0
bne.s AniRe
* R
moveq #$0C/2,d1
bsr AniChr
sub.b #"0",d0
bcs AniRe
cmp.b #NbInterne,d0
bcc.s AniR0
addq.w #1,d0
neg.w d0
bra.s AniR1
AniR0: sub.b #"A"-"0",d0
bcs AniRe
cmp.b #26,d0
bhi AniRe
AniR1: lsl.w #1,d0
move.w d0,d2
swap d2
moveq #4,d3
rts
* Autres
AniRx: moveq #2,d3
rts
* Pas un registre
AniRe: subq.l #1,a0
moveq #0,d3
rts
******* Operande!
AniOpe: bsr AniChr
cmp.b #"K",d0
beq.s AniMou
cmp.b #"J",d0
beq.s AniJoy
cmp.b #"O",d0
beq.s AniOn
cmp.b #"S",d0
beq AniSCol
cmp.b #"B",d0
beq AniBCol
cmp.b #"C",d0
beq AniCol
cmp.b #"Z",d0
beq AniHaz
cmp.b #"V",d0
beq AniVu
cmp.b #"-",d0
beq.s AniOc
cmp.b #"$",d0
beq.s AniOc
cmp.b #"0",d0
bcs.s AniO1
cmp.b #"9",d0
bhi.s AniO1
* Chiffre!
AniOc: subq.l #1,a0
bsr AniLong
move.w $70/2(a4),(a2)+
move.w d0,(a2)+
rts
* =On
AniOn: move.w $50/2(a4),(a2)+
rts
* Saisie du joystick!
AniJoy: bsr AniChr
move.w $80/2(a4),d1
cmp.b #"0",d0
beq.s AniO0
move.w $84/2(a4),d1
cmp.b #"1",d0
bne AniE1
AniO0: move.w d1,(a2)+
rts
* Saisie touches souris!
AniMou: bsr AniChr
move.w $88/2(a4),d1
cmp.b #"1",d0
beq.s AniO0
move.w $8C/2(a4),d1
cmp.b #"2",d0
beq.s AniO0
bra AniE1
* Autres registres
AniO1: bsr AniR
beq AniE1
cmp.w #$04/2,d1
beq.s AniO4
cmp.w #$08/2,d1
beq.s AniO4
* Un registre normal
AniO2: add.w #$0040/2,d1
bra AniO5
* X-Y MOUSE/SCREEN/HARD
AniO4: bsr AniChr
subq.l #1,a0
cmp.b #"S",d0
beq.s AniO4a
cmp.b #"H",d0
beq.s AniO4b
cmp.b #"M",d0
bne.s AniO2
add.w #$0070/2,d1
addq.l #1,a0
bra AniO5
AniO4a: add.w #$0050/2,d1
bra.s AniO4c
AniO4b add.w #$00C0/2,d1
AniO4c: addq.l #1,a0
move.w 0(a4,d1.w),(a2)+
AniPp2: bsr AniChr
cmp.b #"(",d0
bne AniRe
bra.s AniP2
* = Col(n)
AniCol: move.w $005C/2(a4),(a2)+
AniPp1: bsr AniChr
cmp.b #"(",d0
bne AniRe
bsr AniExp
bsr AniChr
cmp.b #")",d0
bne AniRe
rts
* = Spr Col(n,x,y)
AniSCol move.w $00B8/2(a4),(a2)+
bra.s AniCo
* = Bob Col(n,x,y)
AniBCol:move.w $00BC/2(a4),(a2)+
AniCo: bsr AniChr
cmp.b #"C",d0
bne AniRe
AniPp3: bsr AniChr
cmp.b #"(",d0
bne AniRe
bsr AniExp
bsr AniChr
cmp.b #",",d0
bne AniRe
AniP2: bsr AniExp
bsr AniChr
cmp.b #",",d0
bne AniRe
bsr AniExp
bsr AniChr
cmp.b #")",d0
bne AniRe
rts
* Poke!
AniO5: move.w 0(a4,d1.w),(a2)
move.l d2,2(a2)
add.w d3,a2
rts
* =H(xx)
AniHaz move.w $D0/2(a4),(a2)+
bra AniPp1
* =V(xx)
AniVu move.w $D4/2(a4),(a2)+
bra AniPp1
******* EXPRESSION
AniExp: bsr AniOpe
AniE0: bsr AniChr
moveq #$0090/2,d1
cmp.b #"=",d0
beq.s AniEx1
addq.w #4,d1
cmp.b #"<",d0
bne.s AniEx0
cmp.b #">",(a0)
bne.s AniEx1
subq.w #2,d1
addq.l #1,a0
bra.s AniEx1
AniEx0: addq.w #2,d1
cmp.b #">",d0
beq.s AniEx1
addq.w #2,d1
cmp.b #"+",d0
beq.s AniEx1
addq.w #2,d1
cmp.b #"-",d0
beq.s AniEx1
addq.w #2,d1
cmp.b #"/",d0
beq.s AniEx1
addq.w #2,d1
cmp.b #"*",d0
beq.s AniEx1
addq.w #2,d1
cmp.b #"|",d0
beq.s AniEx1
addq.w #2,d1
cmp.b #"&",d0
beq.s AniEx1
cmp.b #"!",d0
beq.s AniXor
* Fin de l'expression
move.w $7c/2(a4),(a2)+
subq.l #1,a0
rts
* Special pour XOR
AniXor moveq #$00D8/2,d1
* Cherche le deuxieme operande
AniEx1 move.w 0(a4,d1.w),-(sp)
bsr AniOpe
move.w (sp)+,(a2)+
bra AniE0
***********************************************************
* INITIALISATION AMAL
AMALInit:
********
clr.l T_AmDeb(a5)
clr.l T_AmChaine(a5)
move.w #$1234,T_AmSeed(a5)
***********************************************************
* CLEAR AMAL
ClrAMAL:
*******
bsr DAllAMAL
lea T_AmRegs(a5),a0
moveq #26/2-1,d0
ClAm: clr.l (a0)+
dbra d0,ClAm
moveq #0,d0
rts
***********************************************************
* SYNCHRO: D1= on/off
SyncO: move.w d1,T_SyncOff(a5)
moveq #0,d0
rts
Sync: tst T_SyncOff(a5)
beq.s Sync1
movem.l d2-d7/a2-a6,-(sp)
bsr Animeur
movem.l (sp)+,d2-d7/a2-a6
Sync1: rts
***********************************************************
* RAMENE L'ADRESSE UN REGISTRE
* D1= -1-> generaux / # du mouvement
* D2= type du mouvement
* D3= numero du registre
RegAMAL:
*******
lea T_AmRegs(a5),a0
lsl.w #1,d3
tst.w d1
bmi.s RgA3
* Registres internes
move.l T_AmDeb(a5),d0
beq.s RgA1
lsl.w #2,d1
add.w d2,d1
RgA0 move.l d0,a1
cmp.w AmNb(a1),d1
beq.s RgA2
bcs.s RgA1
move.l AMNext(a1),d0
bne.s RgA0
RgA1 moveq #-1,d0
rts
RgA2: lea AmIRegs+NbInterne*2-2(a1),a0
neg.w d3
RgA3: add.w d3,a0
moveq #0,d0
rts
***********************************************************
* AMAL PLAY
* D1= Debut
* D2= Fin
* D3= Speed (R0)
* D4= Direction (R1)
SetPlay:
*******
move.l T_AmDeb(a5),d0
beq.s StPx
lsl.w #2,d1
lsl.w #2,d2
move.l #EntNul,d5
StP1: move.l d0,a1
move.w AmNb(a1),d0
cmp.w d2,d0
bhi.s StPx
cmp.w d1,d0
bcs.s StP3
cmp.l d5,d3
beq.s StP2
move.w d3,AmIRegs+NbInterne*2-2(a1)
StP2: cmp.l d5,d4
beq.s StP3
move.w d4,AmIRegs+NbInterne*2-4(a1)
StP3: move.l AMNext(a1),d0
bne.s StP1
StPx: moveq #0,d0
rts
***********************************************************
* CREATION / REMPLACEMENT D'UNE ANIMATION
* A1= Chaine a tokeniser
* A2/D2= Buffer de tokenisation
* D1= Buffer variables
* D3= 0-> Amal / 1-> Anim / 2-> X / 3-> Y
* D4= 0-> Sprite / 1-> Bobs / 2-> Ecrans / 3-> Adresse
* D5= # De l'objet
* D6= # du Canal
CreAMAL:
********
******* Va tokeniser!
bsr TokAMAL
tst.w d0
beq.s CreA0
bpl CreAmE
* Pas assez de place! Reserve et RE-tokenise!
add.w #AmStart+4,a0
move.l a0,d0
move.l d0,d2
bsr FastMm
beq CreME
move.l d0,a2
move.w d2,AmLong(a2)
sub.l #AmStart+4,d2
lea AmStart(a2),a2
bsr TokAMAL
lea -AmStart(a2),a2
sub.l a0,a0
* Ok!
CreA0: move.l a0,d1
move.w d6,d2
******* Insere dans la liste
clr.l T_AmChaine(a5)
clr.l T_AmFreeze(a5)
******* ID complet!
lsl.w #2,d2
add.w d3,d2
******* Efface l'ancienne - SI PRESENT -
move.l a1,a0
move.l T_AmDeb(a5),d0
beq.s CreAm1
CreAm0: move.l d0,a1
cmp.w AmNb(a1),d2
beq.s CreAm2
bcs.s CreAm5
move.l AmNext(a1),d0
bne.s CreAm0
* Met a la fin!
bsr ResAMAL
bne CreAmE
move.l a1,AmPrev(a0)
move.l a0,AmNext(a1)
bra.s CreAm10
* Au tout debut
CreAm1: bsr ResAMAL
bne CreAmE
move.l a0,T_AmDeb(a5)
bra.s CreAm10
* Remplace l'ancienne chaine
CreAm2: move.l AmPrev(a1),d6
move.l AmNext(a1),d7
moveq #0,d0
move.w AmLong(a1),d0
bsr FreeMm
bsr ResAMAL
move.w d0,-(sp)
move.l d6,AmPrev(a0)
move.l d7,AmNext(a0)
beq.s CreAm3
move.l d7,a1
move.l a0,AmPrev(a1)
CreAm3: tst.l d6
bne.s CreAm4
move.l a0,T_AmDeb(a5)
bra.s CreAm4a
CreAm4: move.l d6,a1
move.l a0,AmNext(a1)
CreAm4a move.w (sp)+,d0
beq.s CreAm10
bra.s CreAmE
* Insere la nouvelle
CreAm5: bsr ResAMAL
bne CreAmE
move.l AmPrev(a1),d0
move.l a0,AmPrev(a1)
move.l d0,AmPrev(a0)
bne.s CreAm6
move.l T_AmDeb(a5),d3
move.l a0,T_AmDeb(a5)
bra.s CreAm7
CreAm6: move.l d0,a2
move.l AmNext(a2),d3
move.l a0,AmNext(a2)
CreAm7: move.l d3,AmNext(a0)
******* Pas d'erreur!
CreAm10 move.l T_AmDeb(a5),T_AmChaine(a5)
moveq #0,d0
rts
******* Erreur!
CreAmE: tst.w d0
rts
CreME: moveq #-1,d0
bra.s CreAME
******* CREATION DE LA TABLE!
ResAMAL:tst.l d1
beq.s ResDeja
* Reserve la memoire pour la table, et copie le buffer!
move.l a2,a0
add.w #AmStart+4,d1
moveq #0,d0
move.w d1,d0
bsr FastMm
beq ResAErr
move.l d0,a2
move.w d1,AmLong(a2)
move.w d2,AmNb(a2)
move.l a1,-(sp) * Copie la table
lea AmStart(a2),a1
move.l a1,AmPos(a2)
sub.w #AmStart+4,d1
lsr.w #2,d1
ResAc: move.l (a0)+,(a1)+
dbra d1,ResAc
move.l (sp)+,a1
bra.s ResPas
* Table deja reservee!
ResDeja move.w d2,AmNb(a2)
lea AmStart(a2),a0
move.l a0,AmPos(a2)
* Calcule l'adresse ACT
ResPas: move.l a2,a0
cmp.w #6,d4
beq ResRain
cmp.w #5,d4
beq ResAdd
subq.w #1,d4
bmi.s ResAs
beq.s ResAb
******* Creation ECRANS
lsl.w #2,d5
lea T_EcAdr(a5),a2
move.l 0(a2,d5.w),d5
beq.s ResAee
move.l d5,a2
subq.w #2,d4
bmi.s ResAe3
beq.s ResAe2
* Ecrans OFFSET
add.w #EcAV,a2
bra.s ResAe4
* Ecrans TAILLE
ResAe2: add.w #EcAWT,a2
bra.s ResAe4
* Ecrans position
ResAe3: add.w #EcAW,a2
ResAe4: move.l a2,AmAct(a0)
move.w #$8000+BitEcrans,AmBit(a0)
moveq #0,d0
rts
* Erreur! Screen not opened
ResAee: moveq #-3,d0
bra.s ResAEx
******* Creation BOBS
ResAb: move.w d5,d1
movem.l a0/a1,-(sp)
bsr BobAd
bne.s ResAbe
lea BbAct(a1),a2
movem.l (sp)+,a0/a1
move.l a2,AmAct(a0)
move.w #$8000+BitBobs,AmBit(a0)
moveq #0,d0
rts
* Erreur! BOB not defined
ResAbe: movem.l (sp)+,a0/a1
moveq #-24,d0
bra.s ResAEx
******* Creation SPRITES
ResAs: lsl.w #3,d5
lea T_HsTAct(a5),a2
add.w d5,a2
move.l a2,AmAct(a0)
move.w #$8000+BitSprites,AmBit(a0)
moveq #0,d0
rts
******* Creation ADRESSE
ResAdd: move.l d5,AmAct(a0)
move.l d4,d0
swap d0
and.w #$00FF,d0
add.w #$8000,d0
move.w d0,AmBit(a0)
moveq #0,d0
rts
******* Creation RAINBOW
ResRain lea T_RainTable(a5),a2
mulu #RainLong,d5
lea RnAct(a2,d5.w),a2
move.l a2,AmAct(a0)
move.w #$8000+BitEcrans,AmBit(a0)
moveq #0,d0
rts
******* Erreur memoire!
ResAErr moveq #-1,d0
rts
******* Efface la table si ERREUR!
ResAex: move.l d0,-(sp)
move.l a0,a1
moveq #0,d0
move.w AmLong(a1),d0
bsr FreeMm
move.l (sp)+,d0
rts
***********************************************************
* ARRET D'UN CANAL avec une adresse ACTUALISATION
* A0= Adresse ACTUALISATION
DAdAMAL:
********
movem.l d1-d7/a0-a2,-(sp)
move.l T_AmDeb(a5),d6
clr.l T_AmChaine(a5)
clr.l T_AmFreeze(a5)
move.l d6,d5
beq MvOx
move.l a0,d7
DAdAM1: move.l d5,a1
cmp.l AmAct(a1),d7
beq.s DAdAM2
move.l AmNext(a1),d5
bne.s DAdAM1
bra MvOx
DAdAM2: move.l AmNext(a1),d5
bsr DAMAL
tst.l d5
bne.s DAdAM1
bra MvOx
***********************************************************
* ADRESSE D'UN CANAL: D1= Numero!
* D6= AmDeb!
AdAMAL:
*******
move.l d6,d5
beq.s AdAmal1
lsl.w #2,d1
AdAmal0 move.l d5,a1
move.w AmNb(a1),d0
and.w #$FFFC,d0
cmp.w d0,d1
beq.s AdAmal2
bcs.s AdAmal3
move.l AMNext(a1),d5
bne.s AdAmal0
AdAmal1 rts
AdAmal2 move.l AmNext(a1),d5
move.w AmNb(a1),d7
and.w #$0003,d7
moveq #-1,d0
rts
AdAmNx: tst.l d5
bne.s AdAmal0
rts
AdAmal3 moveq #0,d0
rts
***********************************************************
* =AMAL ADRESSE
* D1= #
TAmAd: move.l T_AmDeb(a5),d6
bsr AdAmal
move.l a1,d1
tst.w d0
rts
***********************************************************
* =MOVON
* D1= #
TMovon move.l T_AmDeb(a5),d6
bsr AdAmal
beq.s TMvo1
TMvo0 cmp.w #2,d7
beq.s TMvo3
cmp.w #3,d7
beq.s TMvo3
bsr AdAmNx
bne.s TMvo0
TMvo1 moveq #0,d1
rts
TMvo3 tst.w AmBit(a1)
bmi.s TMvo1
tst.l AmAJsr(a1)
beq.s TMvo1
TMvo2 moveq #-1,d1
rts
***********************************************************
* = CHANAN
* D1= #
RChan move.l T_AmDeb(a5),d6
bsr AdAmal
beq.s RChan1
tst.w AmBit(a1)
bpl.s RChan2
RChan1 addq.l #4,sp
moveq #0,d1
RChan2 rts
TChanA bsr RChan
tst.l AmAJsr(a1)
beq.s TMvo1
bne.s TMvo2
TChanM bsr RChan
tst.l AmPos(a1)
beq.s TMvo1
bne.s TMvo2
***********************************************************
* OFF/ON/FREEZE
* D1= -1 -> TOUS / D1=#
* D2= Bit a 1--> A Changer
* D3= -1-> OFF / 0-> Freeze / 1-> On
MvOAMAL:
*******
movem.l d1-d7/a0-a2,-(sp)
move.l T_AmDeb(a5),d6
clr.l T_AmFreeze(a5)
clr.l T_AmChaine(a5)
tst.w d1
bmi.s MvOAll
bsr AdAMAL
beq.s MvOx
******* Efface
MvO1: btst d7,d2
beq.s MvO2
bsr OnOfFrz
MvO2: bsr AdAMNx
bne.s MvO1
* FINI!
MvOx: move.l d6,T_AmDeb(a5)
move.l d6,T_AmChaine(a5)
movem.l (sp)+,d1-d7/a0-a2
moveq #0,d0
rts
******* ARRETE TOUT!
MvOAll: move.l d6,d5
beq.s MvOx
MvOA1: move.l d5,a1
move.l AmNext(a1),d5
move.w AmNb(a1),d7
and.w #$0003,d7
btst d7,d2
beq.s MvOA2
bsr OnOfFrz
MvOA2: tst.l d5
bne.s MvOA1
bra MvOx
******************************************* ENLEVE / MET / FREEZE
OnOfFrz tst.w d3
bmi.s DAMAL
beq.s OoF
* On!
and.w #$7FFF,AmBit(a1)
rts
* Freeze
OoF: or.w #$8000,AmBit(a1)
rts
****************************************** Enleve!
* D6= AmDeb!
DAMAL: movem.l d0-d3,-(sp)
move.l AmNext(a1),d3
move.l AmPrev(a1),d2
beq.s DAMAL3
move.l d2,a0
move.l d3,AmNext(a0)
bra.s DAMAL4
DAMAL3: move.l d3,d6
DAMAL4: tst.l d3
beq.s DAMAL5
move.l d3,a0
move.l d2,AmPrev(a0)
DAMAL5: move.w AmLong(a1),d0
ext.l d0
bsr FreeMm
movem.l (sp)+,d0-d3
rts
***********************************************************
* EFFACEMENT TOUS CANAUX
DAllAMAL:
AMALEnd:
********
moveq #-1,d1
moveq #%1111,d2
moveq #-1,d3
bra MvOAMAL
***********************************************************
* FREEZE AMAL
FrzAMAL:
********
tst.l T_AmFreeze(a5)
bne.s FrzA
move.l T_AmChaine(a5),T_AmFreeze(a5)
clr.l T_AmChaine(a5)
FrzA: moveq #0,d0
rts
**********************
* UNFREEZE AMAL
********
UFrzAMAL:
tst.l T_AmChaine(a5)
bne.s UFrzA
move.l T_AmFreeze(a5),d0
beq.s FrzA
move.l d0,T_AmChaine(a5)
UFrzA: clr.l T_AmFreeze(a5)
bra.s FrzA
******* BRANCHEMENT AUX FONCTIONS
AmJumps dc.w AmStop-AmJumps * 00
dc.w AmAnim-AmJumps * 04
dc.w AmMvtX-AmJumps * 08
dc.w AmMvtY-AmJumps * 0C
dc.w AmWait-AmJumps * 10
dc.w AmPose-AmJumps * 14
dc.w AmMove-AmJumps * 18
dc.w AmJump-AmJumps * 1C
dc.w AmLet-AmJumps * 20
dc.w AmIf-AmJumps * 24
dc.w AmFor-AmJumps * 28
dc.w AmNxt-AmJumps * 2C
dc.w AmAEg-AmJumps * 30
dc.w AmXEg-AmJumps * 34
dc.w AmYEg-AmJumps * 38
dc.w AmREg-AmJumps * 3C
dc.w AmEgA-AmJumps * 40
dc.w AmEgX-AmJumps * 44
dc.w AmEgY-AmJumps * 48
dc.w AmEgR-AmJumps * 4C
dc.w AmOn-AmJumps * 50
dc.w AmXS-AmJumps * 54
dc.w AmYS-AmJumps * 58
dc.w AmCol-AmJumps * 5C
dc.w AmAOn-AmJumps * 60
dc.w AmAOff-AmJumps * 64
dc.w AmAExit-AmJumps * 68
dc.w AmDirect-AmJumps * 6C
dc.w AmChif-AmJumps * 70
dc.w AmXMou-AmJumps * 74
dc.w AmYMou-AmJumps * 78
dc.w AmSExp-AmJumps * 7C
dc.w AmJ0-AmJumps * 80
dc.w AmJ1-AmJumps * 84
dc.w AmM1-AmJumps * 88
dc.w AmM2-AmJumps * 8C
dc.w AmEg-AmJumps * 90
dc.w AmDif-AmJumps * 94
dc.w AmInf-AmJumps * 98
dc.w AmSup-AmJumps * 9C
dc.w AmPlus-AmJumps * A0
dc.w AmMoins-AmJumps * A4
dc.w AmDiv-AmJumps * A8
dc.w AmMult-AmJumps * AC
dc.w AmOr-AmJumps * B0
dc.w AmAnd-AmJumps * B4
dc.w AmSCol-AmJumps * B8
dc.w AmBCol-AmJumps * BC
dc.w AmPlay-AmJumps * C0
dc.w AmXH-AmJumps * C4
dc.w AmYH-AmJumps * C8
dc.w AmAni-AmJumps * CC
dc.w AmHaz-AmJumps * D0
dc.w AmVu-AmJumps * D4
dc.w AmXor-AmJumps * D8
***********************************************************
* ANIMEUR / DEPLACEUR
Animeur:
********
lea AMJumps(pc),a4
move.l T_AMChaine(a5),d7
beq.s AMX
move.l d7,d0
clr.l T_AMChaine(a5)
move.w T_Actualise(a5),d5
******* Depart animation!
AmRE: move.l d0,a6
move.w AmBit(a6),d4
bmi.s AmL2
******* Boucle de l'autotest
move.l AmAuto(a6),d0
beq.s AmL1
move.l d0,a3
moveq #20,d6
move.w (a3)+,d0
jsr 0(a4,d0.w)
******* Boucle normale
AmL1: move.l AmPos(a6),d0
beq.s AmRet
move.l d0,a3
moveq #10,d6
move.w (a3)+,d0
jsr 0(a4,d0.w)
******* Appel de l'animation?
AmRet: move.l AmAJsr(a6),d0
beq.s AmL2
move.l d0,a0
jsr (a0)
******* Un Autre?
AmL2: move.l AmNext(a6),d0
bne.s AmRE
* Rebranche les inters
move.w d5,T_Actualise(a5)
move.l d7,T_AmChaine(a5)
AmX: rts
******* MOVE x,y,step
AmMove: subq.w #1,AmCpt(a6)
bmi.s AmMvI
beq.s AmMvX
* Un cran
move.l AmAct(a6),a0
move.w 2(a0),d0
move.w d0,d2
swap d0
move.w AmVirgX(a6),d0
move.w 4(a0),d1
move.w d1,d3
swap d1
move.w AmVirgY(a6),d1
add.l AmDeltX(a6),d0
add.l AmDeltY(a6),d1
AmMv0: move.w d0,AmVirgX(a6)
move.w d1,AmVirgY(a6)
swap d0
swap d1
cmp.w d2,d0
beq.s AmMv1
move.w d0,2(a0)
bset #1,(a0)
bset d4,d5
AmMv1: cmp.w d3,d1
beq.s AmMv2
move.w d1,4(a0)
bset #2,(a0)
bset d4,d5
AmMv2: rts
* Mvt suivant
AmMvX: move.l AmFin(a6),a3
move.w (a3)+,d0
jmp 0(a4,d0.w)
* Init! Calcule les pentes
AmMvI: lea -2(a3),a0
move.l a0,AmPos(a6)
bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
move.l a3,AmFin(a6)
tst.w d3
bgt.s AmMi1
moveq #1,d3
AmMi1: move.w d3,AmCpt(a6)
move.w (sp)+,d1
move.w (sp)+,d0
moveq #0,d2
ext.l d0
bpl.s AmMi2
neg.l d0
bset #0,d2
AmMi2: ext.l d1
bpl.s AmMi3
neg.l d1
bset #1,d2
AmMi3: lsl.l #8,d0
lsl.l #8,d1
divu d3,d0
bvc.s AmMi4
moveq #0,d0
AmMi4: divu d3,d1
bvc.s AmMi5
moveq #0,d1
AmMi5: btst #0,d2
beq.s AmMi6
neg.w d0
AmMi6: btst #1,d2
beq.s AmMi7
neg.w d1
AmMi7: ext.l d0
ext.l d1
lsl.l #8,d0
lsl.l #8,d1
move.l d0,AmDeltX(a6)
move.l d1,AmDeltY(a6)
move.l AmAct(a6),a0
move.w 2(a0),d2
swap d2
move.w #$8000,d2
move.w 4(a0),d3
swap d3
move.w #$8000,d3
add.l d2,d0
add.l d3,d1
bra AmMv0
******* PLAY n
AmPlay: subq.w #1,AmCpt(a6)
bmi AmPli
bne AmX
AmPl0: move.w AmIRegs+NbInterne*2-4(a6),d2
bmi AmMvX
move.l AmAct(a6),a0
* Pas suivant en X
move.l AmDeltX(a6),a1
move.b (a1),d0
beq AmMvX
bmi AmPWx
lsl.b #1,d0
asr.b #1,d0
ext.w d0
bset #1,(a0)
bset d4,d5
tst.w d2
beq.s AmPx1
add.w d0,2(a0)
addq.l #1,AmDeltX(a6)
bra.s AmPy
AmPx1: sub.w d0,2(a0)
subq.l #1,AmDeltX(a6)
bra.s AmPy
* Attente en X!
AmPWx: subq.w #1,AmVirgX(a6)
beq.s Ampwx1
bpl.s Ampy
and.w #$7f,d0
beq.s Ampwx1
move.w d0,AmVirgX(a6)
bra.s AmPy
Ampwx1: tst.w d2
bne.s Ampwx2
subq.l #1,AmDeltX(a6)
bra.s AmPy
Ampwx2: addq.l #1,AmDeltX(a6)
* Pas suivant en Y
AmPy: move.l AmDeltY(a6),a1
move.b (a1),d0
beq AmMvX
bmi AmPWy
lsl.b #1,d0
asr.b #1,d0
ext.w d0
bset #2,(a0)
bset d4,d5
tst.w d2
beq.s AmPy1
add.w d0,4(a0)
addq.l #1,AmDeltY(a6)
bra.s Ampwy3
AmPy1: sub.w d0,4(a0)
subq.l #1,AmDeltY(a6)
bra.s Ampwy3
* Attente en Y!
AmPWy: subq.w #1,AmVirgY(a6)
beq.s Ampwy1
bpl.s Ampwy3
and.w #$7f,d0
beq.s Ampwy1
move.w d0,AmVirgY(a6)
bra.s Ampwy3
Ampwy1: tst.w d2
bne.s Ampwy2
subq.l #1,AmDeltY(a6)
bra.s Ampwy3
Ampwy2: addq.l #1,AmDeltY(a6)
Ampwy3: move.w AmIRegs+NbInterne*2-2(a6),AmCpt(a6)
rts
******* Initialisation!
AmPli: lea -2(a3),a0
move.l a0,AmPos(a6)
bsr AmEvalue
move.l a3,AmFin(a6)
move.l T_AmBank(a5),d0
beq AmMvX
move.l d0,a0
cmp.w 4(a0),d3
bhi AmMvX
lsl.w #1,d3
beq AmMvX
move.w 4+2-2(a0,d3.w),d3
beq AmMvX
lsl.w #1,d3
lea 4(a0,d3.w),a0
move.w (a0)+,AmIRegs+NbInterne*2-2(a6)
move.w #1,AmIRegs+NbInterne*2-4(a6)
move.w (a0)+,d0
lea -4+1(a0,d0.w),a1
move.l a1,AmDeltY(a6)
addq.l #1,a0
move.l a0,AmDeltX(a6)
clr.w AmVirgX(a6)
clr.w AmVirgY(a6)
bra AmPl0
******* ANIM
AmAni: bsr AmEvalue * Initialise l'animation!
move.w d3,AmACLoop(a6)
move.w #1,AmACpt(a6)
lea 2(a3),a0
move.l a0,AmAAd(a6)
move.l a0,AmAALoop(a6)
lea AmDoAni(pc),a0
move.l a0,AmAJsr(a6)
add.w (a3),a3
move.w (a3)+,d0
jmp 0(a4,d0.w)
AmDoAni subq.w #1,AmACpt(a6) * Fait l'animation
bne.s AmDAX
move.l AmAAd(a6),a3
AmDA0 tst.w (a3)
beq.s AmDA1
bsr AmEvalue
move.l AmAct(a6),a0
move.w d3,6(a0)
bset #0,(a0)
bset d4,d5
bsr AmEvalue
move.w d3,AmACpt(a6)
move.l a3,AmAAd(a6)
AmDAX rts
AmDA1 tst.w AmACLoop(a6)
beq AmDA2
subq.w #1,AmACLoop(a6)
beq.s AmDA3
AmDA2 move.l AmAALoop(a6),a3
bra.s AmDA0
AmDA3 clr.l AmAJsr(a6)
rts
******* ST-ANIMATION
AmAnim: move.w #1,AmACpt(a6)
move.l a3,AmAAd(a6)
move.l a3,AmAALoop(a6)
lea StAni(pc),a0
move.l a0,AmAJsr(a6)
clr.l AmPos(a6)
rts
StAni: subq.w #1,AmACpt(a6)
bne.s StA1
move.l AmAAd(a6),a3
StA0 move.w (a3)+,d0
bmi.s StA2
move.l AmAct(a6),a0
move.w d0,6(a0)
bset #0,(a0)
bset d4,d5
move.w (a3)+,AmACpt(a6)
beq.s StA3
move.l a3,AmAAd(a6)
StA1 rts
StA2 cmp.w #-1,d0
beq.s StA3
move.l AmAALoop(a6),a3
bra.s StA0
StA3 clr.l AmAJsr(a6)
rts
******* ST-MOUVEMENT EN X
AmMvtX: move.w #1,AmACpt(a6)
move.l a3,AmAALoop(a6)
lea StMvX(pc),a0
move.l a0,AmAJsr(a6)
clr.l AmPos(a6)
moveq #1,d1
move.l AmAct(a6),a0
lea 2(a0),a1
bra StML
******* ST-MOUVEMENT EN Y
AmMvtY: move.w #1,AmACpt(a6)
move.l a3,AmAALoop(a6)
lea StMvY(pc),a0
move.l a0,AmAJsr(a6)
clr.l AmPos(a6)
moveq #2,d1
move.l AmAct(a6),a0
lea 4(a0),a1
bra StML
* Entree MOVE X
StMvX subq.w #1,AmACpt(a6)
bne.s StMXx
moveq #1,d1
move.l AmAct(a6),a0
lea 2(a0),a1
bra.s StM0
* Entree MOVE Y
StMvY subq.w #1,AmACpt(a6)
bne.s StMXx
moveq #2,d1
move.l AmAct(a6),a0
lea 4(a0),a1
* Fait le mouvement
StM0 move.l AmAAd(a6),a3
move.w (a3)+,AmACpt(a6)
move.w (a1),d0
add.w (a3)+,d0
move.w d0,(a1)
bset d1,(a0)
bset d4,d5
cmp.w AmDeltY(a6),d0 * Condition?
beq.s StM2
subq.w #1,AmDeltX(a6) * Encore un mouvement?
beq.s StM1
StMXx: rts
* Mouvement suivant
StM1 addq.l #2,a3
tst.w (a3)
bne.s StM4
* Condition realisee: on boucle?
StM2: move.l AmAALoop(a6),a3
tst.w 2(a3)
beq.s StMF
StML: move.w (a3)+,d0 * Reinitialisation
cmp.w #$8000,d0
beq.s StM3
move.w d0,(a1)
bset d1,(a0)
bset d4,d5
StM3: addq.l #2,a3
move.w (a3)+,AmDeltY(a6)
StM4: move.l a3,AmAAd(a6)
move.w 4(a3),AmDeltX(a6)
rts
StMF: clr.l AmAJsr(a6)
rts
******* AUTOTEST ON
AmAOn: move.w (a3)+,d0
move.l a3,AmAuto(a6)
lea -2(a3,d0.w),a3
move.w (a3)+,d0
jmp 0(a4,d0.w)
******* AUTOTEST OFF
AmAOff: clr.l AmAuto(a6)
move.w (a3)+,d0
jmp 0(a4,d0.w)
******* AUTOTEST EXIT
AmAExit:rts
******* DIRECT label
AmDirect:
move.w (a3)+,d0
lea -2(a3,d0.w),a0
move.l a0,AmPos(a6)
clr.w AmCpt(a6)
rts
******* STOP GENERAL!
AmStop: clr.l AmPos(a6)
clr.l AmAuto(a6)
rts
******* WAIT VBL
AmPose: move.l a3,AmPos(a6)
rts
******* WAIT
AmWait: clr.l AmPos(a6)
rts
******* RIEN
AmRien: move.w (a3)+,d0
jmp 0(a4,d0.w)
******* LET
AmLet: bsr AmEvalue
move.w (a3)+,d0
jsr 0(a4,d0.w)
move.w d3,(a0)
move.w (a3)+,d0
jmp 0(a4,d0.w)
******* IF
AmIf: bsr AmEvalue
tst.w d3
bne.s AmIfV
addq.l #4,a3
move.w (a3)+,d0
jmp 0(a4,d0.w)
AmIfV: move.w (a3)+,d0
jmp 0(a4,d0.w)
******* FOR
AmFor: bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
lea T_AmRegs(a5),a0
move.w (a3)+,d0
bpl.s AmFr0
lea AmIRegs+NbInterne*2(a6),a0
AmFr0: move.w (sp)+,0(a0,d0.w)
move.w d3,(a3)+
move.w (a3)+,d0
jmp 0(a4,d0.w)
******* NEXT
AmNxt: move.w (a3)+,d0
lea -2(a3,d0.w),a1
lea T_AmRegs(a5),a0
move.w (a1)+,d0
bpl.s AnNx0
lea AmIRegs+NbInterne*2(a6),a0
AnNx0: add.w d0,a0
addq.w #1,(a0)
move.w (a1)+,d0
cmp.w (a0),d0
bge.s AmNx1
* Sortie, on continue
move.w (a3)+,d0
jmp 0(a4,d0.w)
* On reste dans la boucle
AmNx1: move.l a1,AmPos(a6)
rts
******* JUMP
AmJump: add.w (a3),a3
subq.w #1,d6
beq.s AmJp1
move.w (a3)+,d0
jmp 0(a4,d0.w)
AmJp1 lea AmRet(pc),a0
cmp.l (sp),a0
bne.s AmJp2
move.l a3,AmPos(a6)
AmJp2 rts
******* A=
AmAEg: move.l AmAct(a6),a0
bset #0,(a0)
bset d4,d5
addq.l #6,a0
rts
******* X=
AmXEg: move.l AmAct(a6),a0
bset #1,(a0)
bset d4,d5
addq.l #2,a0
rts
******* Y=
AmYEg: move.l AmAct(a6),a0
bset #2,(a0)
bset d4,d5
addq.l #4,a0
rts
******* REG=
AmREg: move.w (a3)+,d0
bmi.s AmREg0
lea T_AmRegs(a5),a0
add.w d0,a0
rts
AmREg0: lea AmIRegs+NbInterne*2(a6),a0
add.w d0,a0
rts
******* EVALUATION D'EXPRESSION
AmEvalue:
move.w (a3)+,d0
jsr 0(a4,d0.w)
move.w d2,d3
AmELoop move.w (a3)+,d0
jsr 0(a4,d0.w)
move.w (a3)+,d0
jmp 0(a4,d0.w)
* =XH(Ec,X)
AmXH: move.w d3,-(sp)
bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
move.w (sp)+,d1
bsr AmEcTo
tst.w EcCon0(a0)
bpl.s AmXH0
asr.w #1,d2
AmXH0: add.w EcWX(a0),d2
move.w (sp)+,d3
rts
* =YH(Ec,Y)
AmYH: move.w d3,-(sp)
bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
move.w (sp)+,d1
bsr AmEcTo
add.w EcWY(a0),d2
sub.w #EcYBase,d2
move.w (sp)+,d3
rts
* =XS(Ec,X)
AmXS: move.w d3,-(sp)
bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
move.w (sp)+,d1
bsr AmEcTo
sub.w EcWx(a0),d2
btst #7,EcCon0(a0)
beq.s AmXs1
asl.w #1,d2
AmXs1: add.w EcVx(a0),d2
move.w (sp)+,d3
rts
* =YS(e,X)
AmYS: move.w d3,-(sp)
bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
move.w (sp)+,d1
bsr AmEcTo
add.w #EcYBase,d2
sub.w EcWy(a0),d2
add.w EcVy(a0),d2
move.w (sp)+,d3
rts
* Routine: Ecto
AmEcTo move.w d3,d2
and.w #$0007,d1
lsl.w #2,d1
lea T_EcAdr(a5),a0
move.l 0(a0,d1.w),d1
beq.s AmEc1
move.l d1,a0
rts
AmEc1: addq.l #4,sp
moveq #-1,d2
move.w (sp)+,d3
rts
* = Bob Coll
AmBCol: move.w T_SyncOff(a5),d0
beq.s AmbbX
movem.l d3-d7/a0-a2,-(sp)
bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
move.w (sp)+,d2
move.w (sp)+,d1
bsr BbColl
movem.l (sp)+,d3-d7/a0-a2
move.w d0,d2
rts
* = Spr Coll
AmSCol: move.w T_SyncOff(a5),d0
beq.s AmbbX
movem.l d3-d7/a0-a2,-(sp)
bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
move.w d3,-(sp)
bsr AmEvalue
move.w (sp)+,d2
move.w (sp)+,d1
bsr SpColl
movem.l (sp)+,d3-d7/a0-a2
move.w d0,d2
rts
AmBbx: moveq #0,d2
rts
* = Col(n)
AmCol: move.w d3,-(sp)
bsr AmEvalue
move.w d3,d1
bsr GetCol
move.w d0,d2
move.w (sp)+,d3
rts
* = Haz(n)
AmHaz: move.w d3,-(sp)
bsr AmEvalue
move.w T_AmSeed(a5),d2
mulu #$3171,d2
add.w Circuits+$06,d2
addq.w #1,d2
move.w d2,T_AmSeed(a5)
lsr.l #8,d2
and.w d3,d2
move.w (sp)+,d3
rts
* =Vu(n)
AmVu move.w d3,-(sp)
bsr AmEvalue
move.w (sp)+,d3
move.l ExtAdr+0*16(a5),d0
beq.s AmVu0
move.l d0,a0
cmp.w #4,d2
bcc.s AmVu0
add.w d2,a0
move.b (a0),d2
clr.b (a0)
rts
AmVu0 moveq #0,d2
rts
* =A
AmEgA: move.l AmAct(a6),a0
move.w 6(a0),d2
rts
* =X
AmEgX: move.l AmAct(a6),a0
move.w 2(a0),d2
rts
* =Y
AmEgY: move.l AmAct(a6),a0
move.w 4(a0),d2
rts
* =RA
AmEgR: move.w (a3)+,d0
bmi.s AEgR0
lea T_AmRegs(a5),a0
move.w 0(a0,d0.w),d2
rts
AEgR0: lea AmIRegs+NbInterne*2(a6),a0
move.w 0(a0,d0.w),d2
rts
* =On
AmOn: tst.w AmCpt(a6)
bmi.s AmO0
beq.s AmO0
AmOnM: moveq #-1,d2
rts
AmO0: moveq #0,d2
rts
AmO1: moveq #1,d2
rts
* =Chiffre
AmChif: move.w (a3)+,d2
rts
* =XMouse
AmXMou: move.w T_XMouse(a5),d2
rts
* =YMouse
AmYMou: move.w T_Ymouse(a5),d2
rts
* =Joy0
AmJ0: moveq #0,d1
bsr ClJoy
move.w d1,d2
rts
* =Joy1
AmJ1: moveq #1,d1
bsr ClJoy
move.w d1,d2
rts
* = Mousekey1
AmM1: moveq #0,d2
btst #6,CiaAPrA
bne.s AmMx
moveq #-1,d2
AmMx: rts
* = Mousekey 2
AmM2: moveq #0,d2
btst #10,$DFF016
beq.s AmMx
moveq #-1,d2
rts
******* OPERATEURS
* Fin de l'evaluation
AmSExp: addq.l #4,sp
rts
* =
AmEg: cmp.w d3,d2
bne.s AmEF
AmEV: moveq #-1,d3
bra AmELoop
AmEF: moveq #0,d3
bra AmELoop
* <
AmInf: cmp.w d2,d3
blt.s AmEV
bra.s AmEF
* >
AmSup: cmp.w d2,d3
bgt.s AmEv
bra.s AmEF
* <>
AmDif: cmp.w d2,d3
bne.s AmEV
bra.s AmEF
* +
AmPlus: add.w d2,d3
bra AmELoop
* -
AmMoins sub.w d2,d3
bra AmELoop
* /
AmDiv: tst.w d2
beq AmELoop
ext.l d3
divs d2,d3
bra AmELoop
* *
AmMult: ext.l d3
muls d2,d3
bra AmELoop
* |
AmOr: or.w d2,d3
bra AmELoop
* !
AmXor: eor.w d2,d3
bra AmELoop
* &
AmAnd: and.w d2,d3
bra AmELoop
ENDC
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ROUTINES AU MILIEU!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Icestart: branch system functions only.
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IceStart
move.l a6,-(sp)
clr.w T_WVersion(a5) Par defaut
cmp.l #"V2.0",d0 Le magic
bne.s .Nomagic
move.w d1,T_WVersion(a5) La version d'AMOS
.Nomagic
lea W_Base(pc),a0
move.l a5,(a0)
lea SyIn(pc),a0
move.l a0,T_SyVect(a5)
bsr WMemInit
; Recherche et stoppe les programmes AMOS lanc<6E>s... (si AMOSPro V2.0)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.w #$0200,T_WVersion(a5)
bcs.s .No20
move.l $4.w,a6
jsr Forbid(a6)
lea TaskName(pc),a1
jsr FindTask(a6)
tst.l d0
beq.s .skip
move.l d0,a0
move.l 10(a0),a1
move.b #"S",(a1) * STOP!!!
move.l a1,T_Stopped(a5)
.skip jsr Permit(a6)
; Change son propre nom...
sub.l a1,a1
jsr FindTask(a6)
move.l d0,a0
move.l d0,T_MyTask(a5)
move.l 10(a0),T_OldName(a5)
lea TaskName(pc),a1
move.l a1,10(a0)
move.l a5,$58(a0) Adresse des datas...
; Fini!
.No20 move.l (sp)+,a6
move.l #"W2.0",d0 Retourne des magic
move.w #$0200,d1
rts
; Normal cold start: start default system
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
StartAll
movem.l a0-a6/d1-d7,-(sp)
move.l sp,T_GPile(a5)
move.l a2,-(sp) Palette par defaut
move.l a0,-(sp)
; Attend que l'autre AMOS soit arrete! (si v2.0)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.w #$0200,T_WVersion(a5)
bcs.s .No20_a
movem.l a0-a3/d0-d3,-(sp)
move.l T_Stopped(a5),d0
beq.s .Wait2
move.l d0,a2
move.w #50*5,d3
.Wait1 move.l T_GfxBase(a5),a6
jsr -270(a6)
cmp.b #"S",(a2)
bne.s .Wait2
dbra d3,.Wait1
.GoEnd bra GFatal
.Wait2 movem.l (sp)+,a0-a3/d0-d3
.No20_a
; Sauve les flags du DMA
; ~~~~~~~~~~~~~~~~~~~~~~
move.b d0,T_AMOSHere(a5)
move.w Circuits+DmaConR,T_OldDma(a5)
bset #7,T_OldDma(a5)
; Amiga-A
; ~~~~~~~
tst.l d1
bne.s .Skip
move.l #$00406141,d1
.Skip move.b d1,T_AmigA_Ascii1(a5)
lsr.l #8,d1
move.b d1,T_AmigA_Ascii2(a5)
lsr.w #8,d1
move.b d1,T_AmigA_Shifts(a5)
; Mouse.Abk (si v2.0)
; ~~~~~~~~~~~~~~~~~~~
cmp.w #2,T_WVersion(a5)
bcs.s .No20_b
move.l a1,d0
bne.s .MSkip
move.l WDebut-4(pc),d0 Prend le HUNK suivant
lsl.l #2,d0
move.l d0,a1
addq.l #4,a1
.MSkip cmp.l #"AmSp",(a1)+
bne GFatal
move.w (a1)+,d1
cmp.w #4,d1
bcs GFatal
move.l a1,T_MouBank(a5)
; Pointe la palette pour l'ouverture des ecrans
subq.w #1,d1
.MLoop move.w (a1)+,d0
mulu (a1)+,d0
mulu (a1)+,d0
lsl.l #1,d0
lea 4(a1,d0.l),a1
dbra d1,.MLoop
move.w #-1,(a1) Stoppe la mouse.abk
lea 16*2(a1),a1 Pointe couleurs 16-32
lea 16*2(a2),a2 Couleurs 16-32 de default palette
moveq #15,d0
.PCopy move.w (a1)+,(a2)+
dbra d0,.PCopy
.No20_b
; Ouverture de la fonte systeme 8x8
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea TopazName(pc),a1 Topaz force si <2.0
cmp.w #$0200,T_WVersion(a5)
bcs.s .Sfont
move.l a3,d0 Sinon, fonte dans a3
beq.s .Sfont
tst.b (a3)
beq.s .Sfont
move.l a3,a1
.Sfont lea -8(sp),sp
move.l sp,a0
move.l a1,(a0)
move.w #8,4(a0)
move.w #$0041,6(a0)
move.l T_GfxBase(a5),a6
jsr _LVOOpenFont(a6)
move.l d0,T_DefaultFont(a5)
bne.s .fOk
lea TopazName(pc),a1
move.l sp,a0 On ressaie avec topaz
move.l a1,(a0)
move.w #8,4(a0)
move.w #$0041,6(a0)
jsr _LVOOpenFont(a6)
move.l d0,T_DefaultFont(a5)
beq GFatal ???
.fOk addq.l #8,sp
; Graphic library
; ~~~~~~~~~~~~~~~
lea GfxBase(pc),a1
move.l T_GfxBase(a5),a0
move.l a0,(a1)
clr.b T_WFlags(a5) Flag AA
btst #2,236(a0)
beq.s .PaAA
bset #WFlag_AA,T_WFlags(a5)
bset #WFlag_LoadView,T_WFlags(a5)
.PaAA move.l $4.w,a0 Kickstart >= V39?
cmp.w #39,$14(a0) Si oui, on fait un LoadView(0)
bcs.s .Pa39
bset #WFlag_LoadView,T_WFlags(a5)
.Pa39
IFNE Debug=2 Si debug
bclr #WFlag_LoadView,T_WFlags(a5) AMIGA-A normal...
ENDC
; Ma propre tache
; ~~~~~~~~~~~~~~~
sub.l a1,a1
move.l $4.w,a6
jsr FindTask(a6)
move.l d0,T_MyTask(a5)
move.l d0,a0
; Ouverture du layer.library
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
moveq #0,d0
lea LayName(pc),a1
move.l $4.w,a6
jsr OpenLib(a6)
move.l d0,T_LayBase(a5)
beq GFatal
; Branche l'input.device
; ~~~~~~~~~~~~~~~~~~~~~~
bsr ClInit
; Open Console Device
; ~~~~~~~~~~~~~~~~~~~
lea ConIo(pc),a1
bsr OpConsole
; Branche le input_handler
; ~~~~~~~~~~~~~~~~~~~~~~~~
lea T_IoDevice(a5),a1
bsr OpInput
lea T_Interrupt(a5),a0
lea IoHandler(pc),a1
move.l a1,IS_CODE(a0)
clr.l IS_DATA(a0)
move.b #100,ln_pri(a0)
lea T_IoDevice(a5),a1
move.l a0,io_Data(a1)
move.w #IND_ADDHANDLER,io_command(a1)
jsr _LVODoIo(a6)
move.w #-1,T_DevHere(a5)
; Parametres par defaut des ecrans
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l (sp),a0
move.w #129,T_DefWX(a5)
move.w #129-16,T_DefWX2(a5)
move.w 10(a0),T_DefWY(a5)
move.w 10(a0),T_DefWY2(a5)
subq.w #8,T_DefWY2(a5)
lea Circuits,a6
move.l (sp),a0
move.l 16(a0),d0
bsr HsInit Hard sprites
move.l (sp),a0
move.w 8(a0),d0
bsr BbInit Bobs
bsr RbInit Retourneur de bobs
move.l (sp),a0
move.l 12(a0),d0
bsr CpInit Copper
bsr EcInit Ecrans
bsr SyInit Systeme
bsr VBLInit Interruptions VBL
bsr WiInit Windows
; Si AA, change le vecteur LOADVIEW
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
btst #WFlag_LoadView,T_WFlags(a5) Si LoadView en route
beq.s .NoLoadView
lea AMOS_LoadView(pc),a0
lea T_AMOSHere(a5),a1 Adresse du test
move.l a1,2(a0) >>> dans le source...
move.l a0,d0 Nouvelle fonction
move.w #-222,a0 LOADVIEW
move.l T_GfxBase(a5),a1 Librairie
move.l $4.w,a6
jsr -420(a6) Set function
lea Old_LoadView(pc),a0 Ancien vecteur
move.l d0,(a0)
bsr Sys_ClearCache Nettoie les caches!
.NoLoadView
; Branche le requester
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.w #$0200,T_WVersion(a5)
bcs.s .No20_c
move.l 4(sp),a0 Palette par defaut
bsr WRequest_Start
; Fabrique la fonte par defaut
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Wi_MakeFonte
bne GFatal
; Envoie le signal a l'AMOS Switcher
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l T_MyTask(a5),a0
move.l a5,$58(a0)
moveq #Switcher_Signal,d3
bsr Send_Switcher
.No20_c
; Tout fini: AMOS to front ?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tst.b T_AMOSHere(a5)
beq.s .Pafr
clr.b T_AMOSHere(a5)
moveq #1,d1
bsr TAMOSWb
.Pafr
; Pas d'erreur
; ~~~~~~~~~~~~
moveq #0,d0
bra.s GFini
; Erreur: EFFACE TOUT, et revient!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GFatal bsr.s EndAll
moveq #-1,d0
GFini move.l T_GPile(a5),a7
movem.l (sp)+,a0-a6/d1-d7
rts
; Arret general
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EndAll lea Circuits,a6
; Remet l'ecran du workbench
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
moveq #0,d1
bsr TAMOSWb
moveq #2,d0
bsr WVbl_d0
; Empeche le switcher de fonctionner (si 2.0)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.w #$0200,T_WVersion(a5)
bcs.s .No20_a
moveq #Switcher_Signal+1,d3
bsr Send_Switcher
; Plus de requester
; ~~~~~~~~~~~~~~~~~~~~~~~
bsr WRequest_Stop
; Efface la fonte
; ~~~~~~~~~~~~~~~~~~~~~
bsr Wi_DelFonte
.No20_a
; Si AA, remet le vecteur LOADVIEW
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
btst #WFlag_LoadView,T_WFlags(a5) Si LoadView en route
beq.s .NoLoadView
move.l Old_LoadView(pc),d0 Ancienne fonction
beq.s .NoLoadView
move.w #-222,a0 LOADVIEW
move.l T_GfxBase(a5),a1 Librairie
move.l $4.w,a6
jsr -420(a6) Set function
.NoLoadView
; Debranche l'input.device
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tst.w T_DevHere(a5)
beq.s .skip0
lea T_Interrupt(a5),a0
lea T_IoDevice(a5),a1
move.l a0,io_Data(a1)
move.w #IND_REMHANDLER,Io_Command(a1)
move.l $4.w,a6
jsr _LVODoIo(a6)
lea T_IoDevice(a5),a1
bsr ClInput
.Skip0
; Arret des toutes les fonctions AMOS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr TFFonts
; bsr WiEnd Rts!
bsr SyEnd
bsr EcEnd
bsr RbEnd
bsr BbEnd
bsr HsEnd
bsr VBLEnd
bsr CpEnd
; Ferme les librairies
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l $4.w,a6
move.l T_FntBase(a5),d0 diskfont.library
beq.s .Lib0
move.l d0,a1
jsr CloseLib(a6)
.Lib0 move.l T_LayBase(a5),d0 layer.library
beq.s .Lib1
move.l d0,a1
jsr CloseLib(a6)
.Lib1 move.l T_GfxBase(a5),d0 graphics.library
beq.s .Lib2
move.l d0,a6 Ferme la fonte par defaut
move.l T_DefaultFont(a5),d0
beq.s .Lib2
move.l d0,a1
jsr _LVOCloseFont(a6)
.Lib2
moveq #0,d0
rts
; Fin d'access au fonctions systeme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IceEnd
; Relance l'ancien AMOS (si 2.0)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.w #$0200,T_WVersion(a5)
bcs.s .No20_a
move.l T_Stopped(a5),d0
beq.s .Skup
move.l d0,a0
move.b #" ",(a0)
; Remet son ancien nom
.Skup move.l T_MyTask(a5),d0
beq.s .Skiip
move.l d0,a0
move.l T_OldName(a5),10(a0)
.Skiip
.No20_a
; Enleve la gestion memoire si definie
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr WMemEnd Plus de memory checking!
rts
; Envoie un signal <20> l'AMOS_Switcher (D3= signal)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Send_Switcher
lea Switcher(pc),a1
move.l $4.w,a6
jsr _LVOFindTask(a6)
tst.l d0
beq.s .PaSwi
move.l d0,a1
moveq #0,d0
bset d3,d0
jsr _LVOSignal(a6)
.PaSwi rts
; Fabrique la fonte par defaut
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Wi_MakeFonte
movem.l a2/d2-d7,-(sp)
moveq #0,d1 Ecran 16x8, 2 couleur
moveq #16,d2
moveq #8,d3
moveq #1,d4
moveq #0,d5
moveq #2,d6
lea Wi_MakeFonte(pc),a1
bsr EcCree
bne .Error
; Boucle de creation
move.l #8*256,d0
SyCall MemFastClear
beq .Error
move.l a0,T_JeuDefo(a5)
move.l a0,a2
lea 32*8(a2),a0
moveq #32,d2
move.w #128,d3
bsr .CreeFont
lea 160*8(a2),a0
move.w #160,d2
move.w #256,d3
bsr .CreeFont
; Poke les caracteres specifiques
lea Def_Font(pc),a0
move.l a2,a1
moveq #(8*32)/4-1,d0
.Copy1 move.l (a0)+,(a1)+
dbra d0,.Copy1
lea 128*8(a2),a1
moveq #(8*32)/4-1,d0
.Copy2 move.l (a0)+,(a1)+
dbra d0,.Copy2
; A y est!
moveq #0,d0
bra.s .Out
; Erreur
.Error moveq #1,d0
; Sortie!
.Out move.l d0,-(sp)
moveq #0,d0
bsr EcDel
move.l (sp)+,d0
movem.l (sp)+,a2/d2-d7
rts
; Saisit les caracteres d2-d3
.CreeFont
movem.l d2/d3/a2/a3/a6,-(sp)
move.l a0,a2
move.l T_EcCourant(a5),a3
.Car move.l T_RastPort(a5),a1 Le rastport
move.w #0,36(a1) Curseur en 0,0
move.w #6,38(a1)
moveq #1,d0 Un caractere
lea .COut(pc),a0
move.b d2,(a0)
move.l T_GfxBase(a5),a6 La fonction
jsr _LVOText(a6)
move.l EcLogic(a3),a0 Boucle de recopie
move.w EcTligne(a3),d0
ext.l d0
moveq #7,d1
.Loop move.b (a0),(a2)+
add.l d0,a0
dbra d1,.Loop
addq.w #1,d2
cmp.w d3,d2
bcs.s .Car
movem.l (sp)+,d2/d3/a2/a3/a6
rts
.COut dc.w 0
; Effacement du jeu de caracteres
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Wi_DelFonte
move.l T_JeuDefo(a5),d0
beq.s .Sip
move.l d0,a1
move.l #8*256,d0
SyCall MemFree
clr.l T_JeuDefo(a5)
.Sip rts
***********************************************************
* Librairies
FntName: dc.b "diskfont.library",0
DevName dc.b "input.device",0
ConName dc.b "console.device",0
LayName dc.b "layers.library",0
TopazName dc.b "topaz.font",0
Switcher dc.b "_Switcher AMOS_",0
TaskName dc.b " AMOS",0
even
***********************************************************
; Patch sur LOADVIEW si AMOS TO FRONT si AA
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AMOS_LoadView
tst.b 0.l T_AMOSHere, modifie lors du patch...
bne.s .Wb
move.l Old_LoadView(pc),-(sp)
.Wb rts
Old_LoadView dc.l 0 Ici et pas ailleurs...
; AMOS / WORKBENCH
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; D1=0 > Workbench
; D1>0 > AMOS
; D1<0 > Rien (trouver valeur)
; Retour D1= AMOS ici(-1), WB ici (0)
TAMOSWb
tst.w d1
beq .ToWB
bmi .Return
; Back to AMOS
; ~~~~~~~~~~~~~~~~~~
.ToAMOS tst.b T_AMOSHere(a5)
bne .Return
move.b #-1,T_AMOSHere+1(a5) Code interdisant les requester
; Load View(0) + WaitTOF si AA
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
btst #WFlag_LoadView,T_WFlags(a5)
beq.s .PaAA0
movem.l d0-d3/a0-a2/a6,-(sp)
move.l T_IntBase(a5),a6 Ouvre un ecran LOWRES
btst #WFlag_WBClosed,T_WFlags(a5) Si WB ferme, le referme!
beq.s .NoWB
jsr -78(a6)
.NoWB
lea NewScreen(pc),a0
jsr OpenScreen(a6)
move.l d0,T_IntScreen(a5)
move.l T_GfxBase(a5),a6 WaitTOF
jsr -$10e(a6)
jsr -$10e(a6)
sub.l a1,a1
move.l T_GfxBase(a5),a6
jsr -$de(a6) LoadView(a0)
jsr -$10e(a6) WaitTOF
jsr -$10e(a6) WaitTOF
move.w $dff07c,d0
cmp.b #$f8,d0 AA Chipset?
bne.s .NoBug
move.w #0,$dff1fc Sprite resolution
move.w #%0000110000000000,$dff106 Sprite width / DualPF palette
.NoBug
movem.l (sp)+,d0-d3/a0-a2/a6
.PaAA0
lea Circuits,a0 Remet les circuits
move.w #$8080,JoyTest(a0)
move.l T_CopPhysic(a5),$80(a0)
clr.w $88(a0)
move.b #-1,T_AMOSHere(a5) AMOS en front!
clr.b T_AMOSHere+1(a5) Flip termine!
bra.s .Return
; Goto workbench
; ~~~~~~~~~~~~~~~~~~~~
.ToWB tst.b T_AMOSHere(a5)
beq.s .Return
clr.b T_AMOSHere(a5) AMOS en fond!
move.b #-1,T_AMOSHere+1(a5) Code interdisant les requesters
move.w T_OldDma(a5),$Dff096 Remet les chips
move.l T_GfxBase(a5),a0
move.l 38(a0),$dff080
clr.w $dff088
; Efface l'ecran si AA
; ~~~~~~~~~~~~~~~~~~~~
btst #WFlag_LoadView,T_WFlags(a5)
beq.s .PaAA1
movem.l d0-d3/a0-a2/a6,-(sp)
move.l T_IntBase(a5),a6 Close Screen
btst #WFlag_WBClosed,T_WFlags(a5) Si WB ferme, le rouvre!
beq.s .NoBW
jsr -210(a6) Reopen workbench
.NoBW move.l T_IntScreen(a5),a0 Close screen
jsr CloseScreen(a6)
move.l T_GfxBase(a5),a6
jsr -$10e(a6) WaitTOF
jsr -$10e(a6) WaitTOF
movem.l (sp)+,d0-d3/a0-a2/a6
.PaAA1
clr.b T_AMOSHere+1(a5) Flip termine!
; Retourne l'etat actuel
; ~~~~~~~~~~~~~~~~~~~~~~
.Return move.b T_AMOSHere(a5),d1
ext.w d1
ext.l d1
moveq #0,d0
rts
; Clear CPU Caches
; ~~~~~~~~~~~~~~~~~~~~~~
Sys_ClearCache
movem.l a0-a1/a6/d0-d1,-(sp)
move.l $4.w,a6
cmp.w #37,$14(a6) A partir de V37
bcs.s .Exit
jsr -$27c(a6) CacheClearU
.Exit movem.l (sp)+,a0-a1/a6/d0-d1
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ZONE DE DONNE CENTRALE (BEARK)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Table des sauts aux affichages texte
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TAdCol dc.l CZero-TAdCol,CNorm-TAdCol
dc.l CInv-TAdCol,CUn-TAdCol
dc.l CNul-TAdCol
; Zone de donnee externe
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ConIo ds.b 32+8
LConBuffer equ 64
ConBuffer ds.b LConBuffer
ConEssai ds.b 32
W_Base ds.l 1
GfxBase ds.l 1
WRastPort ds.l 1
FoPat dc.w -1
; Autoback fenetres
WiAuto ds.b 8*6+WiSAuto+4
even
; Table de retournement bobs
TRetour ds.b 256
NTx: equ 480
NTy: equ 12
NNp: equ 1
NewScreen: dc.w 0,0,NTx,NTy,NNp
dc.b 1,0
dc.w %0010000000000000,%00000110
dc.l 0,0,0,0
ds.b 16
even
; Caracteres speciaux des fontes AMOS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Def_Font IncBin "bin/+WFont.bin"
even
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;-----------------------------------------------------------------
; **** *** **** ****
; * * * * * ******************************************
; **** * * * **** * SYSTEME : SOURIS / CLAVIER / INTER VBL
; * * * * * ******************************************
; **** * **** ****
;-----------------------------------------------------------------
***********************************************************
* DEMARRAGE A FROID DU SYSTEME
***********************************************************
SyInit:
bsr AMALInit
moveq #0,d0
rts
***********************************************************
* ARRET FINAL DU SYSTEME
***********************************************************
SyEnd: bsr AMALEnd
moveq #0,d0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Initialisation / Fin du requester
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Demarrage du requester (a0)= default palette
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WRequest_Start
; Copy default palette
lea 8*2(a0),a0
lea Req_Pal+8*2(pc),a1
moveq #24-1,d0
CPal move.w (a0)+,(a1)+
dbra d0,CPal
; Branch the requester
lea AutoReq(pc),a2
lea EasyReq(pc),a3
bsr.s SetJump
move.l a2,T_PrevAuto(a5)
move.l a3,T_PrevEasy(a5)
move.w #-1,T_ReqFlag(a5) * Default is AMOS request
rts
; Arret du requester
; ~~~~~~~~~~~~~~~~~~~~~~~~
WRequest_Stop
tst.l T_PrevAuto(a5)
beq.s .Skip
move.l T_PrevAuto(a5),a2
move.l T_PrevEasy(a5),a3
bsr.s SetJump
.Skip rts
; Branche A2/a3 sur easy/auto request
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SetJump movem.l a0/a1/a6,-(sp)
move.l $4.w,a6
; AutoRequest
move.l a2,d0
lea -$15c,a0
move.l T_IntBase(a5),a1
jsr SetFunction(a6)
move.l d0,a2
; EasyRequest, seulement si wb>=2.0
move.l $4.w,a0
cmp.w #36,$14(a0)
bcs.s .skip
move.l a3,d0
lea -$1d4-(20*6),a0
move.l T_IntBase(a5),a1
jsr SetFunction(a6)
move.l d0,a3
.skip movem.l (sp)+,a0/a1/a6
rts
******* Table des sauts
SyIn: bra ClInky ;0 -Inkey:
bra ClVide ;1 -ClearKey:
bra ClSh ;2 -Shifts:
bra ClInst ;3 -Instant:
bra ClKeyM ;4 -KeyMap:
bra ClJoy ;5 -Joy:
bra ClPutK ;6 -PutKey:
bra MHide ;7 -Hide:
bra MShow ;8 -Show:
bra MChange ;9 -ChangeM: ChMouse
bra MXy ;10-XyMou: XY Mouse
bra CXyHard ;11-XyHard: Conversion SCREEN-> HARD
bra CXyScr ;12-XyScr: Conversion HARD-> SCREEN
bra MBout ;13-MouseKey:
bra MSetAb ;14-SetM:
bra GetSIn ;15-ScIn: Get screen IN
bra CXyWi ;16-XyWin: Conversion SCREEN-> WINDOW courante
bra MLimA ;17-LimitM: Limit mouse
bra SyZoHd ;18-ZoHd: Zone coordonnees HARD
bra SyResZ ;19-ResZone: Reserve des zones
bra SyRazZ ;20-RazZone: Effacement zones
bra SySetZ ;21-SetZone: Set zone
bra SyMouZ ;22-GetZone: Zone souris!
bra WVbl ;23-WaitVbl:
bra HsSet ;24-SetHs: Affiche un hard sprite
bra HsUSet ;25-USetHs: Efface un hard sprite
bra ClFFk ;26-SetFunk:
bra ClGFFk ;27-GetFunk:
bra HsAff ;28-AffHs: Recalcule les hard sprites
bra HsBank ;29-SetSpBank: Fixe la banque de sprites
bra HsNXYA ;30-NXYAHs: Instruction sprite
bra HsXOff ;31-XOffHs: Sprite off n
bra HsOff ;32-OffHs: All sprite off
bra HsAct ;33-ActHs: Actualisation HSprite
bra HsSBuf ;34-SBufHs: Set nombre de lignes
bra HsStAct ;35-StActHs: Arrete les HS sans deasctiver!
bra HsReAct ;36-ReActHs: Re-Active tous!
bra MStore ;37-StoreM: Stocke etat souris / Show on
bra MRecall ;38-RecallM: Remet la souris
bra HsPri ;39-PriHs: Priorites SPRITES/PLAYFIELD
bra TokAMAL ;40-AMALTok: Tokenise AMAL
bra CreAMAL ;41-AMALCre: Demarre AMAL
bra MvOAMAL ;42-AMALMvO: On/Off/Freeze AMAL
bra DAllAMAL ;43-AMALDAll: Enleve TOUT!
bra Animeur ;44-AMAL: Un coup d'animation
bra RegAMAL ;45-AMALReg: Registre!
bra ClrAMAL ;46-AMALClr: Clear
bra FrzAMAL ;47-AMALFrz: FREEZE all
bra UFrzAMAL ;48-AMALUFrz: UNFREEZE all
bra BobSet ;49-SetBob: Entree set bob
bra BobOff ;50-OffBob: Arret bob
bra BobSOff ;51-OffBobS: Arret tous bobs
bra BobAct ;52-ActBob: Actualisation bobs
bra BobAff ;53-AffBob: Affichage bobs
bra BobEff ;54-EffBob: Effacement bobs
bra ChipMM ;55-SyChip: Reserve CHIP
bra FastMM ;56-SyFast: Reserve FAST
bra BobLim ;57-LimBob: Limite bobs!
bra SyZoGr ;58-ZoGr: Zone coord graphiques
bra GetBob ;59-SprGet: Saisie graphique
bra Masque ;60-MaskMk: Calcul du masque
bra SpotH ;61-SpotHot: Fixe le point chaud
bra BbColl ;62-ColBob: Collisions bob
bra GetCol ;63-ColGet: Fonction collision
bra SpColl ;64-ColSpr: Collisions sprites
bra SyncO ;65-SetSync: Synchro on/off
bra Sync ;66-Synchro: Synchro step
bra SetPlay ;67-PlaySet: Set play direction...
bra BobXY ;68-XYBob: Get XY Bob
bra HsXY ;69-XYSp: Get XY Sprite
bra BobPut ;70-PutBob: Put Bob!
bra TPatch ;71-Patch: Patch icon/bob!
bra MRout ;72-MouRel: Souris relachee
bra MLimEc ;73-LimitMEc: Limit mouse ecran
bra FreeMM ;74-SyFree: Libere mem
bra HColSet ;75-SetHCol: Set HardCol
bra HColGet ;76-GetHCol: Get HardCol
bra TMovon ;77-MovOn: Movon!
bra TKSpeed ;78-KeySpeed: Key speed
bra TChanA ;79-ChanA: =ChanAn
bra TChanM ;80-ChanM: =ChanMv
bra TPrio ;81-SPrio: Set priority
bra TGetDisc ;82-GetDisc: State of disc drive
bra Add_VBL ;83-RestartVBL Restart VBL
bra Rem_VBL ;84-StopVBL Stop VBL
bra ClKWait ;85-KeyWaiting (P) Une touche en attente?
bra WMouScrFront ;86-MouScrFront (P) Coordonnees souris dans ecran front
bra WMemReserve ;87-MemReserve (P) Reservation memoire secure
bra WMemFree ;88-MemFree (P) Liberation memoire secure
bra WMemCheck ;89-MemCheck (P) Verification memoire
bra WMemFastClear ;90-MemFastClear (P)
bra WMemChipClear ;91-MemChipClear
bra WMemFast ;92-MemFast
bra WMemChip ;93-MemChip
bra WSend_FakeEvent ;94-Send_FakeEvent Envoi d'un faux event souris
bra WTest_Cyclique ;95-Test_Cyclique Tests cyclique AMOS
bra WAddFlushRoutine ;96-AddFlushRoutine Ajoute une routine FLUSH
bra WMemFlush ;97-MemFlush Force un memory FLUSH
bra WAddRoutine ;98-AddRoutine Ajoute une routine
bra WCallRoutines ;99-CallRoutines Appelle les routines
bra WRequest_OnOff ;100-Set Requester Change le requester
; ___________________________________________________________________
;
; RESERVATION / LIBERATION MEMOIRE CENTRALISEE / DEBUGGAGE
; ___________________________________________________________________
;
RsReset
Mem_Length rs.l 1
Mem_Pile rs.l 8
Mem_Header equ __Rs
Mem_Border equ 128
Mem_Code equ $AA
MemList_Size equ 1024*8
; Reservations directes
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; IN: D0 length
; OUT: A0 adress / nothing else changed.
WMemFastClear
move.l d1,-(sp)
move.l #Public|Clear,d1
bsr WMemReserve
movem.l (sp)+,d1
rts
WMemFast
move.l d1,-(sp)
move.l #Public,d1
bsr WMemReserve
movem.l (sp)+,d1
rts
WMemChipClear
move.l d1,-(sp)
move.l #Chip|Public|Clear,d1
bsr WMemReserve
movem.l (sp)+,d1
rts
WMemChip
move.l d1,-(sp)
move.l #Chip|Public,d1
bsr WMemReserve
movem.l (sp)+,d1
rts
IFEQ Debug
; Reservation memoire
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; D0= Longueur
; D1= Flags
WMemReserve
movem.l d0-d3/a1/a5-a6,-(sp)
move.l W_Base(pc),a5
move.l d1,d2
move.l d0,d3
move.l $4.w,a6
jsr AllocMem(a6)
tst.l d0
bne.s .MemX
; Out of memory: flush procedure!
bsr WMemFlush
; Try once again
move.l d2,d1
move.l d3,d0
jsr AllocMem(a6)
; Get out, address in A0, Z set.
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.MemX move.l d0,a0
tst.l d0
movem.l (sp)+,d0-d3/a1/a5-a6
rts
; Liberation memoire centralisee
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A1= Debut zone
; D0= Taille zone
WMemFree
movem.l d0-d1/a0-a1/a6,-(sp)
move.l $4.w,a6
jsr FreeMem(a6)
movem.l (sp)+,d0-d1/a0-a1/a6
rts
; Fausses fonctions
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WMemInit
WMemEnd
WMemCheck
rts
ENDC
IFNE Debug
; Initialisation memoire centralisee
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WMemInit
movem.l a0-a1/a5-a6/d0-d1,-(sp)
move.l W_Base(pc),a5
move.l #MemList_Size*4,d0
move.l #Clear|Public,d1
move.l $4.w,a6
jsr AllocMem(a6)
move.l d0,T_MemList(a5)
movem.l (sp)+,a0-a1/a5-a6/d0-d1
rts
; Fin memoire centralisee
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WMemEnd
movem.l a0-a1/a5-a6/d0-d1,-(sp)
bsr WMemCheck
tst.l d0
beq.s .Skip
bsr BugBug
.Skip move.l W_Base(pc),a5
move.l #MemList_Size*4,d0
move.l T_MemList(a5),a1
move.l $4.w,a6
jsr FreeMem(a6)
clr.l T_MemList(a5)
movem.l (sp)+,a0-a1/a5-a6/d0-d1
rts
; Reservation memoire
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; D0= Longueur
; D1= Flags
WMemReserve
movem.l d0-d3/a1-a2/a5-a6,-(sp)
move.l W_Base(pc),a5
; cmp.l #$4FC-Mem_Header-2*Mem_Border,d0
; bne.s .Skip
; jsr BugBug
;.Skip
move.l d1,d2
move.l d0,d3
add.l #Mem_Header+2*Mem_Border,d0
move.l $4.w,a6
jsr AllocMem(a6)
tst.l d0
beq.s .OutM
; Store the adress in the table
.Again move.l T_MemList(a5),a0
.Free tst.l (a0)+
bne.s .Free
move.l d0,-4(a0)
move.l d0,a0
move.l d3,(a0)+ Save length
lea 4*4+4*4(sp),a1
moveq #7,d1
.Save move.l (a1)+,(a0)+ Save Content of pile
dbra d1,.Save
; Put code before and after memory
move.b #Mem_Code,d2
move.w #Mem_Border-1,d1
move.l a0,a1
add.l #Mem_Border,a1
add.l d3,a1
.Code1 move.b d2,(a0)+
move.b d2,(a1)+
dbra d1,.Code1
; All right, memory reserved
add.l #Mem_Header+Mem_Border,d0
bra.s .MemX
; Out of memory: flush procedure!
.OutM bsr WMemFlush
; Try once again
move.l d2,d1
move.l d3,d0
add.l #Mem_Header+2*Mem_Border,d0
jsr AllocMem(a6)
tst.l d0
bne.s .Again
; Get out, address in A0, Z set.
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.MemX move.l d0,a0
tst.l d0
movem.l (sp)+,d0-d3/a1-a2/a5-a6
rts
; Liberation memoire centralisee
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A1= Debut zone
; D0= Taille zone
WMemFree
movem.l d0-d2/a0-a2/a5-a6,-(sp)
move.l W_Base(pc),a5
; Find in the list
sub.l #Mem_Header+Mem_Border,a1
move.l T_MemList(a5),a2
move.w #MemList_Size-1,d2
.Find cmp.l (a2)+,a1
beq.s .Found
dbra d2,.Find
bra.s Mem_NFound
; Found, erase from the list
.Found clr.l -4(a2)
; Check the length
cmp.l Mem_Length(a1),d0
bne.s Mem_BLen
; Check the borders
lea Mem_Header(a1),a0
move.l a0,a2
add.l #Mem_Border,a2
add.l d0,a2
move.w #Mem_Border-1,d1
.Check cmp.b #Mem_Code,(a0)+
bne.s Mem_BCode
cmp.b #Mem_Code,(a2)+
bne.s Mem_BCode
dbra d1,.Check
; Perfect!
add.l #Mem_Header+2*Mem_Border,d0
move.l $4.w,a6
jsr FreeMem(a6)
Mem_Go movem.l (sp)+,d0-d2/a0-a2/a5-a6
rts
; Error messages
; ~~~~~~~~~~~~~~
Mem_NFound
bsr BugBug
bra.s Mem_Go
dc.b "No found"
Mem_BLen
bsr BugBug
bra.s Mem_Go
dc.b "Bad leng"
Mem_BCode
bsr BugBug
bra.s Mem_Go
dc.b "Bad code"
; Check the whole memory list
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WMemCheck
movem.l d1-d2/a0-a2/a5-a6,-(sp)
move.l W_Base(pc),a5
moveq #0,d2
move.l T_MemList(a5),a0
move.w #MemList_Size-1,d0
.List tst.l (a0)+
beq.s .Next
move.l -4(a0),a1
add.l (a1),d2
; Check the borders
move.l (a1),d1
lea Mem_Header(a1),a1
lea 0(a1,d1.l),a2
add.l #Mem_Border,a2
move.w #Mem_Border-1,d1
.Check cmp.b #Mem_Code,(a1)+
bne.s .BCode2
cmp.b #Mem_Code,(a2)+
bne.s .BCode2
dbra d1,.Check
; Next chunk
.Next dbra d0,.list
move.l d2,d0
.Xx movem.l (sp)+,d1-d2/a0-a2/a5-a6
rts
.BCode2
bsr BugBug
moveq #0,d0
bra.s .Xx
dc.b "Bad code"
even
ENDC
; Ajoute une routine flush
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WAddFlushRoutine
move.l a2,-(sp)
lea T_MemFlush(a5),a2
bsr.s WAddRoutine
move.l (sp)+,a2
rts
; Insere une routine dans une liste de routines
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A1= Pointeur sur structure
; A2= Liste des routines
; dc.l 0
; ...routine...
WAddRoutine
tst.l (a1) Deja la?
bmi.s .Deja
move.l (a2),d0
lsr.l #1,d0
bset #31,d0
move.l d0,(a1) Branche dans la liste
move.l a1,(a2)
.Deja rts
; Apelle le memory flush
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WMemFlush
lea T_MemFlush(a5),a1
; Appelle une liste de routine
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A1= Liste des routines
WCallRoutines
move.l (a1),d0
beq.s .Out
clr.l (a1)
.Loop move.l d0,a0
move.l (a0),d0
clr.l (a0)
lsl.l #1,d0
movem.l a0-a6/d0-d7,-(sp)
jsr 4(a0)
movem.l (sp)+,a0-a6/d0-d7
tst.l d0
bne.s .Loop
.Out rts
***********************************************************
* Gestion de la souris
***********************************************************
******* Branche les interruptions
VblInit:
* Init couleurs
bsr FlInit
bsr ShInit
* Init souris
move.l T_MouBank(a5),a0
move.l a0,T_MouDes(a5)
move.w 2(a0),T_MouTY(a5)
clr.w T_MouXOld(a5)
clr.w T_MouYOld(a5)
move.w #-1,T_MouShow(a5)
* Branche les interruptions!
bsr Add_VBL
rts
******* Branche PROPREMENT les interruptions VBL...
Add_VBL
move.l a6,-(sp)
lea T_VBL_Is(a5),a1
move.b #NT_INTERRUPT,Ln_Type(a1)
move.b #100,Ln_Pri(a1)
clr.l Ln_Name(a1)
move.l a5,IS_DATA(a1)
lea VBLIn(pc),a0
move.l a0,IS_CODE(a1)
move.l $4.w,a6
move.l #INTB_VERTB,d0
jsr _LVOAddIntServer(a6)
move.l (sp)+,a6
rts
******* Debranche PROPREMENT les interruptions VBL...
Rem_VBL
VBLEnd
move.l a6,-(sp)
lea T_VBL_Is(a5),a1
tst.l IS_CODE(a1)
beq.s .skip
move.l $4.w,a6
move.l #INTB_VERTB,d0
jsr _LVORemIntServer(a6)
.skip move.l (sp)+,a6
rts
******* Entree des interruptions
VblIn: movem.l d2-d7/a2-a4,-(sp)
lea Circuits,a6
move.l a1,a5
* Fait les switch entrelaces
tst.w T_InterBit(a5)
beq.s SIntX2
lea T_InterList(a5),a5
move.l (a5)+,d0
beq.s SIntX
move.w $4(a6),d6
SInt0 move.l d0,a4 * Adresse ecran
move.l (a5)+,a3 * Adresse marqueur
move.w EcNPlan(a4),d5 * D5 Nb de plans
subq.w #1,d5
move.l (a3)+,d2
beq.s SInt4
SInt1 move.l (a3)+,a0
tst.w d6
bmi.s SInt2
move.w EcTx(a4),d0
lsr.w #3,d0
add.w d0,a0
SInt2 move.w d5,d1
move.l d2,a2
lea EcPhysic(a4),a1
SInt3 move.l (a1)+,d0
add.l a0,d0
move.w d0,6(a2)
swap d0
move.w d0,2(a2)
addq.l #8,a2
dbra d1,SInt3
move.l (a3)+,d2
bne.s SInt1
SInt4 move.l (a5)+,d0
bne.s SInt0
SIntX move.l W_Base(pc),a5
SIntX2
* Fait les screen swaps
lea T_SwapList(a5),a0
move.l (a0),d0
beq.s SSwpX
clr.l (a0)+
SSwp1: move.l a0,a1
move.l d0,a4
move.w (a1)+,d1 * Nb de plans
move.l (a4)+,d0
beq.s SSwp4
SSwp2: move.l (a4)+,d3 * Decalage
move.l d0,a3
move.l a1,a2
move.w d1,d2
SSwp3: move.l (a2)+,d0
add.l d3,d0
move.w d0,6(a3)
swap d0
move.w d0,2(a3)
addq.l #8,a3
dbra d2,SSwp3
move.l (a4)+,d0
bne.s SSwp2
SSwp4: lea SwapL-4(a0),a0
move.l (a0)+,d0
bne.s SSwp1
SSwpX:
* Change l'adresses des sprites hard
move.l T_HsChange(a5),d0
beq.s VblPaHs
clr.l T_HsChange(a5)
bsr HsPCop
VblPaHs:
* Marque le VBL
addq.l #1,T_VBLCount(a5)
addq.l #1,T_VBLTimer(a5)
subq.w #1,T_EveCpt(a5)
bset #BitVBL,T_Actualise(a5)
* Appelle les autres routines
lea VblRout(a5),a4
move.l (a4)+,d0
beq.s VblPaCa
VblCall move.l d0,a0
jsr (a0)
move.l (a4)+,d0
bne.s VblCall
VblPaCa
* Affiche la souris
bsr MousInt
* Couleurs
lea T_CopMark(a5),a3
IFEQ EZFlag
bsr Shifter
ENDC
bsr FlInt
bsr FadeI
IFEQ EZFlag
* Animations
move.w T_SyncOff(a5),d0
bne.s PaSync
bsr Animeur
PaSync:
ENDC
movem.l (sp)+,d2-d7/a2-a4
lea $DFF000,a0
moveq #0,d0
rts
******* WAIT VBL D0, multitache
WVbl_D0 movem.l d0-d1/a0-a1/a6,-(sp)
move.w d0,-(sp)
.Lp move.l T_GfxBase(a5),a6
jsr _LVOWaitTOF(a6)
subq.w #1,(sp)
bne.s .Lp
addq.l #2,sp
movem.l (sp)+,d0-d1/a0-a1/a6
rts
******* WAIT VBL
WVbl: move.l T_VblCount(a5),d0
WVbl1: cmp.l T_VblCount(a5),d0
beq.s WVbl1
moveq #0,d0
rts
******* Traitement de la souris
MousInt:tst.b T_AMOSHere(a5)
beq MouF
move.w T_MouseX(a5),d0
move.w T_MouseY(a5),d1
; Limite la souris
MouV7 cmp.w T_MouXMin(a5),d0
bge.s Mou5
move.w T_MouXMin(a5),d0
Mou5: cmp.w T_MouXMax(a5),d0
ble.s Mou6
move.w T_MouXMax(a5),d0
Mou6: cmp.w T_MouYMin(a5),d1
bge.s Mou7
move.w T_MouYMin(a5),d1
Mou7: cmp.w T_MouYMax(a5),d1
ble.s Mou8
move.w T_MouYMax(a5),d1
Mou8: move.w d0,T_MouseX(a5)
move.w d1,T_MouseY(a5)
lsr.w #1,d0
lsr.w #1,d1
move.w d0,T_XMouse(a5)
move.w d1,T_YMouse(a5)
; Poke les mots de control, si SHOW
move.w T_MouShow(a5),d2
bmi.s MouF
sub.w T_MouHotX(a5),d0
sub.w T_MouHotY(a5),d1
move.l T_HsPhysic(a5),a0 ;Adresse du dessin
move.l T_HsLogic(a5),a1
move.l T_HsInter(a5),a2
ror.w #1,d0
move.b d1,d2
lsl.w #8,d2
move.b d0,d2
move.w d2,(a0)
move.w d2,(a1)
move.w d2,(a2)
clr.w d2
btst #8,d1
beq.s Mou10
bset #8+2,d2
Mou10: add.w T_MouTy(a5),d1
move.b d1,d2
ror.w #8,d2
btst #8,d1
beq.s Mou11
bset #1,d2
Mou11: btst #15,d0
beq.s Mou12
bset #0,d2
Mou12: move.w d2,2(a0)
move.w d2,2(a1)
move.w d2,2(a2)
MouF: rts
***********************************************************
* BOUTONS DE LA SOURIS
***********************************************************
MBout: clr.w d1
tst.b T_AMOSHere(a5)
beq.s MouB3
move.w T_MouXOld(a5),d0
btst #IEQUALIFIERB_LEFTBUTTON,d0
beq.s MouB1
bset #0,d1
MouB1: btst #IEQUALIFIERB_RBUTTON,d0
beq.s MouB2
bset #1,d1
MouB2: btst #IEQUALIFIERB_MIDBUTTON,d0
beq.s MouB3
bset #2,d1
MouB3: moveq #0,d0
rts
******* Bouton relache?
MRout: clr.w d1
clr.w d2
clr.w d3
tst.b T_AMOSHere(a5)
beq.s MouB3
move.w T_OldMk(a5),d2
move.w T_MouXOld(a5),d0
btst #IEQUALIFIERB_LEFTBUTTON,d0
beq.s MouR1
bset #0,d3
btst #0,d2
bne.s MouR1
bset #0,d1
MouR1: btst #IEQUALIFIERB_RBUTTON,d0
beq.s MouR2
bset #1,d3
btst #1,d2
bne.s MouR2
bset #1,d1
MouR2: btst #IEQUALIFIERB_MIDBUTTON,d0
beq.s MouR3
bset #2,d3
btst #2,d2
bne.s MouR3
bset #2,d1
MouR3: move.w d3,T_OldMk(a5)
moveq #0,d0
rts
**********************************************************
* Remember MOUSE
MRecall:move.w T_OMouShow(a5),T_MouShow(a5)
move.w T_OMouSpr(a5),d1
bra.s MChange
**********************************************************
* Store MOUSE/SHOW ON
MStore: move.w T_MouShow(a5),T_OMouShow(a5)
move.w T_MouSpr(a5),T_OMouSpr(a5)
clr.w T_MouShow(a5)
moveq #0,d1
**********************************************************
* CHANGE MOUSE D1
MChange:
*******
move.w T_MouShow(a5),-(sp)
move.w #-1,T_MouShow(a5)
MCh0: move.w d1,d2
cmp.w #3,d1
bcc.s MCh3
* Pointe dans la banque de la souris
move.l T_MouBank(a5),a0
bra.s MCh2
MCh1: move.w (a0)+,d0
mulu (a0)+,d0
mulu (a0)+,d0
lsl.w #1,d0
lea 4(a0,d0.w),a0
MCh2: subq.w #1,d1
bpl.s MCh1
bra.s MCh4
* Pointe dans la banque de sprites
MCh3: move.l T_SprBank(a5),d0
beq.s MChE
move.l d0,a0
subq.w #3,d1
cmp.w (a0)+,d1
bcc.s MChE
lsl.w #3,d1
move.l 0(a0,d1.w),a0
cmp.w #1,(a0) * Verifie ke le sprite est bon!
bne.s MChE
cmp.w #2,4(a0)
bne.s MChE
* Change!
MCh4: move.w d2,T_MouSpr(a5)
move.l a0,T_MouDes(a5)
move.w 2(a0),T_MouTY(a5)
move.w 6(a0),T_MouHotX(a5)
move.w 8(a0),T_MouHotY(a5)
* Re-Affiche la souris???
tst.w (sp)
bmi.s MCh5
bsr HiSho1
bra.s MChX
MCh5: bsr HiHi
* Cbon
MChX: move.w (sp)+,T_MouShow(a5)
moveq #0,d0
rts
* Erreur--> met la souris 1!
MChE: moveq #0,d1
bra MCh0
**********************************************************
* HIDE / HIDE ON: D1= off/on
**********************************************************
MHide: tst.w T_CopON(a5)
beq.s HiSho0
move.w T_MouShow(a5),d0
tst.w d1
bne.s Hid1
subq.w #1,d0
bra.s HiSho
Hid1: moveq #-1,d0
bra.s HiSho
**********************************************************
* SHOW / SHOW ON: D1= off/on
**********************************************************
MShow: tst.w T_CopON(a5) * Si COPPER OFF -> NON!!!
beq.s HiSho0
move.w T_MouShow(a5),d0
tst.w d1
bne.s Sho1
addq.w #1,d0
bra.s HiSho
Sho1: moveq #0,d0
******* Routine commune / affiche - eteint
HiSho: move.w d0,T_MouShow(a5)
beq.s HiSho1
cmp.w #-1,d0
bne.s HiSho0
; HIDE
HiHi: moveq #0,d1
bsr HsUSet
bsr HAa3
HiSho0: moveq #0,d0
rts
; SHOW
HiSho1: move.w #-1,T_MouShow(a5)
moveq #0,d1
move.w T_XMouse(a5),d2
move.w T_YMouse(a5),d3
move.l T_MouDes(a5),a1
bsr HsSet
bsr HAa3
clr.w T_MouShow(a5)
moveq #0,d0
rts
* Appele TROIS fois HsAff!
HAa3: move.w #3,-(sp)
HA3a: tst.l T_HsChange(a5)
bne.s HA3a
bsr HsAff
subq.w #1,(sp)
bne.s HA3a
addq.l #2,sp
rts
**********************************************************
* COORDONNEES
**********************************************************
******* Ecrans D3
* <0 => Rien du tout
* 0 => Ecran courant
* >0 => Ecran+1
EcToD1: tst.w d3
bmi.s EcToD4
bne.s EcToD2
move.l T_EcCourant(a5),a0
rts
EcToD2: lsl.w #2,d3
lea T_EcAdr(a5),a0
move.l -4(a0,d3.w),d3
beq.s EcToD3
move.l d3,a0
rts
EcToD3: addq.l #4,sp
moveq #3,d0
rts
EcToD4: addq.l #4,sp
move.l #EntNul,d1
move.l d1,d2
moveq #0,d0
rts
******* XYMOUSE
MXy: moveq #0,d1
moveq #0,d2
move.w T_XMouse(a5),d1
move.w T_YMouse(a5),d2
moveq #0,d3
rts
******* XYSCREEN: conversion HARD-> SCREEN
* D3-> Ecran
* D1-> X
* D2-> Y
CXyScr bsr EcToD1
* Coordonnee en Y
add.w #EcYBase,d2
sub.w EcWy(a0),d2
btst #2,EcCon0+1(a0)
beq.s XyH0
asl.w #1,d2
XyH0 add.w EcVy(a0),d2
ext.l d2
* Coordonnee en X
XyH1: sub.w EcWx(a0),d1
btst #7,EcCon0(a0)
beq.s XyH2
asl.w #1,d1
XyH2: add.w EcVx(a0),d1
ext.l d1
moveq #0,d0
rts
******* XYHARD : conversion SCREEN -> HARD
* D3= ecran
* D1/D2= x/y
CXyHard bsr EcToD1
* Coordonnee en X
CXyS: tst.w EcCon0(a0)
bpl.s CXyS0
asr.w #1,d1
CXyS0: add.w EcWX(a0),d1
ext.l d1
* Coordonnee en Y
CXyS2: btst #2,EcCon0+1(a0)
beq.s CXyS3
asr.w #1,d2
CXyS3 add.w EcWY(a0),d2
sub.w #EcYBase,d2
ext.l d2
moveq #0,d0
rts
******* XY WINDOW : conversion XY screen -> XY window
* D1/D2= X/Y
CXyWi: move.l T_EcCourant(a5),a0
move.l EcWindow(a0),a0
* En X
sub.w WiDyI(a0),d2
bmi.s CXyw0
divu WiTyCar(a0),d2
cmp.w WiTyI(a0),d2
bcc.s CXyw0
ext.l d2
bra.s CXyw1
CXyw0: move.l #EntNul,d2
* En Y
CXyw1: lsr.w #3,d1
sub.w WiDxI(a0),d1
bmi.s CXyw3
cmp.w WiTxI(a0),d1
bcc.s CXyW3
ext.l d1
CXyw2: move.l d2,d0 D0= Signe
or.l d1,d0
rts
CXyw3: move.l #EntNul,d1
bra.s CXyw2
******* Retourne la souris dans l'ecran de devant
WMouScrFront
move.l d4,-(sp)
move.w T_XMouse(a5),d1
move.w T_YMouse(a5),d2
moveq #0,d3
moveq #16,d4
bsr GetSIn
move.l d1,d3
bmi.s .Out
move.l d1,-(sp)
addq.w #1,d3
move.w T_XMouse(a5),d1
move.w T_YMouse(a5),d2
bsr CXYScr
move.l (sp)+,d0
.Out movem.l (sp)+,d4
rts
.Hors moveq #-1,d0
bra.s .Out
******* Recherche l'ecran contenant X/Y
* D1/D2= X/Y HARD
* D3= 1er ecran
* D4= Ecran MAX
GetSIn: lea T_EcPri(a5),a1
add.w #EcYBase,d2
tst.w d3
beq.s GSin1
bmi.s GSin1
bsr EcToD1
move.l a1,a2
GSin0: tst.l (a2)
bmi.s GSin1
cmp.l (a2)+,a0
bne.s GSin0
lea -4(a2),a1
* Cherche l'ecran dans l'ordre des priorites
GSin1: move.l (a1)+,d0
bmi.s GSinX
move.l d0,a0
cmp.w EcNumber(a0),d4
bls.s GSin1
btst #BitHide,EcFlags(a0)
bne.s GSin1
* Coordonnee en X
move.w d1,d3
sub.w EcWx(a0),d3
bcs.s GSin1
cmp.w EcWTx(a0),d3
bcc.s GSin1
* Coordonnee en Y
move.w d2,d3
sub.w EcWy(a0),d3
bcs.s GSin1
cmp.w EcWTy(a0),d3
bcc.s GSin1
* Trouve!
moveq #0,d1
move.w EcNumber(a0),d1
moveq #0,d0
rts
* Pas trouve!
GSinX: move.l #EntNul,d1
moveq #0,d0
rts
**********************************************************
* SET MOUSE
**********************************************************
******* Set mouse ABSOLU
MSetAb: move.l #EntNul,d0
cmp.l d0,d1
beq.s MSaX
lsl.w #1,d1
cmp.w T_MouXMin(a5),d1
bcc.s MSa1
move.w T_MouXMin(a5),d1
MSa1: cmp.w T_MouXMax(a5),d1
bcs.s MSa2
move.w T_MouXMax(a5),d1
MSa2: move.w d1,T_MouseX(a5)
lsr.w #1,d1
move.w d1,T_XMouse(a5)
MSaX cmp.l d0,d2
beq.s MSaXx
lsl.w #1,d2
cmp.w T_MouYMin(a5),d2
bcc.s MSa3
move.w T_MouYMin(a5),d2
MSa3: cmp.w T_MouYMax(a5),d2
bcs.s MSa4
move.w T_MouYMax(a5),d2
MSa4: move.w d2,T_MouseY(a5)
lsr.w #1,d2
move.w d2,T_YMouse(a5)
MSaXx: moveq #0,d0
rts
**********************************************************
* LIMIT MOUSE D1/D2/D3/D4
**********************************************************
******* LIMIT MOUSE ECRAN
* D1= 0-> ecran courant
* D1>0 -> ecran
MLimEc move.w d1,d3
move.w d1,d4
clr.w d1
clr.w d2
bsr CXyHard
movem.w d1/d2,-(sp)
move.w EcTx(a0),d1
move.w EcTy(a0),d2
subq.w #1,d1
subq.w #1,d2
move.w d4,d3
bsr CXyHard
move.w d1,d3
move.w d2,d4
movem.w (sp)+,d1-d2
******* Absolu
MLimA: cmp.w #458,d3
bls.s MLima1
move.w #458,d3
MLima1 cmp.w #312,d4
bls.s MLima2
move.w #312,d4
MLima2 tst.w d1
bpl.s MLima3
clr.w d1
MLima3 tst.w d2
bpl.s MLima4
clr.w d2
MLima4 cmp.w d3,d1
bls.s MLima5
exg d1,d3
MLima5 cmp.w d4,d2
bls.s MLima6
exg d2,d4
MLima6 lsl.w #1,d1
lsl.w #1,d2
lsl.w #1,d3
lsl.w #1,d4
move.w d1,T_MouXMin(a5)
move.w d3,T_MouXMax(a5)
move.w d2,T_MouYMin(a5)
move.w d4,T_MouYMax(a5)
moveq #0,d0
rts
**********************************************************
* JOYSTICK / d1= # de port
**********************************************************
ClJoy: tst.b T_AMOSHere(a5)
beq.s JoyNo
moveq #6,d0 ;# du bit de FEU
add.w d1,d0
lea Circuits,a0
lsl.w #1,d1
move.w 10(a0,d1.w),d2
; Prend le bouton
clr.w d1
btst d0,CiaAPrA
bne.s Joy1
bset #4,d1
; Teste les directions
Joy1: lea JoyTab(pc),a0
lsl.b #6,d2
lsr.w #6,d2
and.w #$000F,d2
or.b 0(a0,d2.w),d1
Joy2 moveq #0,d0
rts
JoyNo moveq #0,d1
bra.s Joy2
JoyTab: dc.b %0000,%0010,%1010,%1000,%0001,%0000,%0000,%1001
dc.b %0101,%0000,%0000,%0000,%0100,%0110,%0000,%0000
***********************************************************
* RESERVE ZONES D1= nb de zones - Enleve la memoire
***********************************************************
SyResZ: move.l T_EcCourant(a5),a0
tst.l EcAZones(a0)
beq.s SyRz1
* Efface les anciennes zones
move.l EcAZones(a0),a1
move.w EcNZones(a0),d0
mulu #8,d0
bsr FreeMm
clr.l EcAZones(a0)
clr.w EcNZones(a0)
* Reserve les nouvelles
SyRz1: move.w d1,d0
beq.s ZoOk
mulu #8,d0
bsr FastMm
beq RzErr
move.l d0,EcAZones(a0)
move.w d1,EcNZones(a0)
ZoOk moveq #0,d0
rts
RzErr: moveq #1,d0
rts
NoZo: moveq #29,d0
rts
***********************************************************
* RAZ zone D1
***********************************************************
SyRazZ: move.l T_EcCourant(a5),a1
move.l EcAZones(a1),d0
beq NoZo
move.l d0,a0
tst.w d1
beq SyRzz
cmp.w EcNZones(a1),d1
bhi PErr7
lsl.w #3,d1
lea -8(a0,d1.w),a0
clr.l (a0)+
clr.l (a0)
bra ZoOk
* Toutes les zones
SyRzz: move.w EcNZones(a1),d1
subq.w #1,d1
SyRzz1: clr.l (a0)+
clr.l (a0)+
dbra d1,SyRzz1
bra ZoOk
***********************************************************
* SET ZONE dans l'ecran courant
* D1-D2/D3/D4/D5 n-dx/dy/fx/fy
***********************************************************
SySetZ: move.l T_EcCourant(a5),a1
move.l EcAZones(a1),d0
beq NoZo
move.l d0,a0
tst.w d1
beq RzErr
cmp.w EcNZones(a1),d1
bhi RzErr
lsl.w #3,d1
lea -8(a0,d1.w),a0
cmp.w d4,d2
bcc RzErr
cmp.w d5,d3
bcc RzErr
move.w d2,(a0)+
move.w d3,(a0)+
move.w d4,(a0)+
move.w d5,(a0)+
bra ZoOk
***********************************************************
* ZONE GRAPHIC ecran D1/D2 -D3
SyZoGr: bsr EcToD1
move.w d2,d4
move.w d1,d3
move.l a0,a1
moveq #0,d0
bra GZone
***********************************************************
* ZONE HARD ecran D1/D2 - D3
SyZoHd: bsr EcToD1
move.w d2,d4
move.w d1,d3
move.l a0,a1
moveq #0,d0
******* Regarde si les coordonnees HARD D3/D4 sont dans l'ecran A1!
ZoEc: cmp.w EcNumber(a1),d5
bls.s ZoEcX
; Coordonnee en X
move.w d3,d1
sub.w EcWx(a1),d1
bcs.s ZoEcX
cmp.w EcWTx(a1),d1
bcc.s ZoEcX
; Coordonnee en Y
move.w d4,d2
add.w #EcYBase,d2
sub.w EcWy(a1),d2
bcs.s ZoEcX
cmp.w EcWTy(a1),d2
bcc.s ZoEcX
btst #7,EcCon0(a1)
beq.s ZoEc2
lsl.w #1,d1
ZoEc2: btst #2,EcCon0+1(a1)
beq.s ZoEc3
lsl.w #1,d2
ZoEc3: add.w EcVx(a1),d1
add.w EcVy(a1),d2
bsr GZone
rts
ZoEcX: moveq #0,d1
rts
******* Explore la table de l'ecran A1
GZone: movem.l a2/d3,-(sp)
cmp.w EcNumber(a1),d5
bls.s GZo3
move.l EcAZones(a1),d3
beq.s GZo3
move.l d3,a2
move.w EcNZones(a1),d3
subq.w #1,d3
GZo1: tst.l 4(a2)
beq.s GZo2
cmp.w (a2),d1
bcs.s GZo2
cmp.w 2(a2),d2
bcs.s GZo2
cmp.w 4(a2),d1
bhi.s GZo2
cmp.w 6(a2),d2
bhi.s GZo2
move.w EcNZones(a1),d1
sub.w d3,d1
movem.l (sp)+,a2/d3
ext.l d1
rts
GZo2: lea 8(a2),a2
dbra d3,GZo1
GZo3: movem.l (sp)+,a2/d3
moveq #0,d1
rts
***********************************************************
* ZONE pour la souris
SyMouZ: move.w T_XMouse(a5),d3
move.w T_YMouse(a5),d4
moveq #16,d5
lea T_EcPri(a5),a0
HZo1: moveq #0,d1
move.l (a0)+,d0
bmi.s HZoX
move.l d0,a1
bsr ZoEc
beq.s HZo1
swap d1
move.w EcNumber(a1),d1
HZoX: moveq #0,d0
rts
;-----------------------------------------------------------------
; **** *** **** ****
; * * * * * ******************************************
; **** * * * **** * SPRITES HARDWARE
; * * * * * ******************************************
; **** * **** ****
;-----------------------------------------------------------------
***********************************************************
* INITIALISATION SPRITES HARDWARE / D0= Nbre lignes
HsInit: movem.l d1-d7/a1-a6,-(sp)
move.w d0,-(sp)
* Reserve la table
moveq #HsNb,d0
mulu #HsLong,d0
addq.l #4,d0
bsr FastMm
beq GFatal
addq.l #4,d0
move.l d0,T_HsTable(a5)
* Va reserver les buffers
move.w (sp)+,d0
bsr HsRBuf
bne GFatal
* Pas d'erreur
HsOk: movem.l (sp)+,d1-d7/a1-a6
moveq #0,d0
rts
***********************************************************
* CHANGE LA TAILLE DU BUFFER SPRITES
* D1= Nb de lignes
HsSBuf:
*******
movem.l d1-d7/a1-a6,-(sp)
tst.w T_CopOn(a5) * Si COPPER OFF -> RIEN!
beq.s HsOk
addq.w #2,d1
cmp.w T_HsNLine(a5),d1
beq.s HsOK
move.w d1,-(sp)
* Enleve tous les sprites
move.w #-1,T_MouShow(a5)
bsr HsOff
moveq #-1,d1
bsr MHide
* Fait pointer les registres sur RIEN!
clr.w T_HsTCol(a5)
move.l T_CopLogic(a5),a0
add.l T_CopLong(a5),a0
clr.l -(a0)
move.l a0,T_HsChange(a5)
HsCl1: tst.l T_HsChange(a5)
bne.s HsCl1
* Efface la memoire
bsr HsEBuf
* Reserve la nouvelle
move.w (sp)+,d0
bsr HsRBuf
bne.s HsCl2
* Ok! Remet la souris
moveq #-1,d1
bsr MShow
bra HsOk
* Pas assez! Essaie de reserver 16 lignes au moins!
HsCl2: moveq #16,d0 * 1728 octets!
move.w d0,T_HsNLine(a5)
bsr HsRBuf
beq.s HsCl3
moveq #2,d0 * 384 octets!
bsr HsRBuf
bne HsCl4
HsCl3: move.l T_MouBank(a5),T_MouDes(a5)
clr.w T_MouSpr(a5)
moveq #-1,d1
bsr MShow
HsCl4 movem.l (sp)+,d1-d7/a1-a6
moveq #1,d0
rts
******* Reserve le buffer des colonnes
HsRBuf: clr.l T_HsBuffer(a5)
clr.w T_HsPMax(a5)
clr.w T_HsTCol(a5)
move.w d0,T_HsNLine(a5)
mulu #4*8,d0
move.l d0,d1
mulu #3,d0
move.l d0,T_HsTBuf(a5)
bsr ChipMm
beq.s HsRBe
move.l d0,T_HsBuffer(a5)
move.l d0,T_HsPhysic(a5)
add.l d1,d0
move.l d0,T_HsLogic(a5)
add.l d1,d0
move.l d0,T_HsInter(a5)
* Calcule les colonnes
lsr.l #3,d1
move.w d1,T_HsTCol(a5)
lsr.w #2,d1
subq.w #2,d1
move.w d1,T_HsPMax(a5)
* Ok!
moveq #0,d0
rts
* Erreur!
HsRbe: moveq #1,d0
rts
******* Efface le buffer des colonnes
HsEBuf: tst.l T_HsBuffer(a5)
beq.s HsEb1
clr.w T_HsPMax(a5)
clr.w T_HsTCol(a5)
move.l T_HsBuffer(a5),a1
clr.l T_HsBuffer(a5)
move.l T_HsTBuf(a5),d0
bsr FreeMm
HsEb1: rts
******* Poke l'adresse D0 dans les listes copper
HsPCop: move.w T_HsTCol(a5),d1
ext.l d1
move.l T_CopLogic(a5),a0
move.l T_CopPhysic(a5),a1
addq.l #4,a0
addq.l #4,a1
moveq #7,d2
HsPc1: swap d0
move.w d0,2(a0)
move.w d0,2(a1)
swap d0
move.w d0,6(a0)
move.w d0,6(a1)
add.l d1,d0
lea 8(a0),a0
lea 8(a1),a1
dbra d2,HsPc1
rts
***********************************************************
* SET SPRITE PRIORITY (0-1)
HsPri: move.l T_EcCourant(a5),a0
cmp.w #5,d1
bcs.s HsPr1
moveq #0,d1
HsPr1: move.w EcCon2(a0),d2
and.w #%1111000,d2
move.w EcDual(a0),d0
beq.s HsPrP
bpl.s HsPrP
* Ecran DUAL 2 --> Poke dans le DUAL 1!
neg.w d0
lsl.w #2,d0
lea T_EcAdr(a5),a0
move.l -4(a0,d0.w),d0
beq.s HsPrX
move.l d0,a0
lsl.w #3,d1
move.w EcCon2(a0),d2
and.w #%1000111,d2
* Poke!
HsPrP: or.w d1,d2
move.w d2,EcCon2(a0)
HsPrX: moveq #0,d0
rts
***********************************************************
* ARRET SPRITES HARDWARE
HsEnd: movem.l d1-d7/a1-a6,-(sp)
move.l T_HsTable(a5),d0
beq.s HsE1
move.l d0,a1
subq.l #4,a1
moveq #HsNb,d0
mulu #HsLong,d0
addq.l #4,d0
bsr FreeMm
HsE1: bsr HsEBuf
bra HsOk
**********************************************************
* SET SPRITE BANK - A1
HsBank: cmp.l T_SprBank(a5),a1
beq.s HsBk1
* movem.l a0-a2/d0-d7,-(sp)
move.l a1,T_SprBank(a5)
* bsr HsOff
* bsr BobSOff
* movem.l (sp)+,a0-a2/d0-d7
HsBk1: moveq #0,d0
rts
**********************************************************
* Adresse actualisation HS D1--> A0
HsActAd:
cmp.w #HsNb,d1
bcc.s HsAdE
lea T_HsTAct(a5),a0
move.w d1,d0
lsl.w #3,d0
lea 0(a0,d0.w),a0
rts
HsAdE: addq.l #4,sp
moveq #1,d0
rts
**********************************************************
* SPRITE X OFF D1=Sprite
HsXOff:
bsr HsActAd
clr.w (a0)
clr.w 6(a0)
bsr DAdAMAL
bsr HsUSet
bset #BitSprites,T_Actualise(a5)
moveq #0,d0
rts
**********************************************************
* SPRITE OFF
HsOff: moveq #0,d1
HsOO1: bsr HsActAd
clr.w (a0)
clr.w 6(a0)
bsr DAdAMAL
bsr HsUSet
addq.w #1,d1
cmp.w #HsNb,d1
bne.s HsOO1
* Actualise
bset #BitSprites,T_Actualise(a5)
moveq #0,d0
rts
**********************************************************
* =XY SPRITE
HsXY: bsr HsActAd
move.w 2(a0),d1
move.w 4(a0),d2
move.w 6(a0),d3
moveq #0,d0
rts
**********************************************************
* SPRITE n,x,y,a (D1/D2/D3/D4)
HsNxya: bsr HsActAd
move.l #EntNul,d0
cmp.l d0,d2
bne.s HsN1
move.w 2(a0),d2
beq.s HsNErr
HsN1: cmp.l d0,d3
bne.s HsN2
move.w 4(a0),d3
beq.s HsNErr
HsN2: cmp.l d0,d4
bne.s HsN3
move.w 6(a0),d4
HsN3: bset #3,(a0)
addq.l #2,a0
move.w d2,(a0)+
move.w d3,(a0)+
move.w d4,(a0)+
bset #BitSprites,T_Actualise(a5)
moveq #0,d0
rts
HsNErr: moveq #1,d0
rts
**********************************************************
* EFFACE DE L'ECRAN TOUS LES SPRITES HARD
HsStAct:moveq #0,d1
HsSa1: bsr HsUSet
addq.w #1,d1
cmp.w #HsNb,d1
bne.s HsSa1
rts
**********************************************************
* RE-ACTIVE TOUS les sprites HARD
HsReAct:lea T_HsTAct(a5),a0
moveq #HsNb-1,d0
HsRa0: tst.b (a0)
bmi.s HsRa1
bset #3,(a0)
HsRa1: lea 8(a0),a0
dbra d0,HsRa0
rts
**********************************************************
* ACTUALISATION SPRITES HARD
HsAct: movem.l d2-d7/a2-a6,-(sp)
move.l T_SprBank(a5),d0
beq.s HsActX
move.l d0,a2
move.w (a2)+,d6
lea T_HsTAct(a5),a0
move.w #HsNb,d7
subq.w #1,d7
moveq #0,d1
HsAct0: tst.b (a0)
bne.s HsAct2
HsAct1: lea 8(a0),a0
addq.w #1,d1
dbra d7,HsAct0
HsActX: movem.l (sp)+,d2-d7/a2-a6
rts
******* Change!
HsAct2: bmi.s HsAct3
* Dessine
clr.w (a0)
move.w 2(a0),d2
move.w 4(a0),d3
move.w 6(a0),d0
and.w #$3FFF,d0
beq.s HsAct1
cmp.w d6,d0
bhi.s HsAct1
lsl.w #3,d0
move.l -8(a2,d0.w),d0
beq.s HsAct1
move.l d0,a1
bsr HsSet
bra.s HsAct1
* Efface
HsAct3: clr.w (a0)
clr.w 6(a0)
bsr HsUSet
bra.s HsAct1
**********************************************************
* POSITIONNEMENT D'UN SPRITE HARD!
* D1= Nb
* D2= X
* D3= Y
* D4= Retournement?
* A1= Dessin
HsSet: movem.l d1-d7,-(sp)
movem.l a1/a3/a4,-(sp)
move.w d1,d0
mulu #HsLong,d1
move.l T_HsTable(a5),a3
lea 0(a3,d1.w),a4
**************************************** Sprite DIRECT!
cmp.w #8,d0
bcc Hss4
* Si sprite 0: la souris est-elle presente?
tst.w d0
bne.s HsDm
tst.w T_MouShow(a5)
bpl Hss30
* Doit recopier l'image?
HsDm: cmp.l HsImage(a4),a1
beq.s HsD0
move.w 2(a1),d0
addq.w #1,d0
cmp.w T_HsPMax(a5),d0
bcc Hss30
move.l a1,HsImage(a4)
move.w #3,2(a4)
* Poke!
HsD0: move.w #1,(a4)
move.w d2,HsX(a4)
move.w d3,HsY(a4)
* Calcule les mots de controle
move.w 6(a1),d0 * Pas de retournement!
lsl.w #2,d0
asr.w #2,d0
sub.w d0,d2
bpl.s HsD1
clr.w d2
HsD1: sub.w 8(a1),d3
bpl.s HsD2
clr.w d3
HsD2: ror.w #1,d2
move.b d3,d0
lsl.w #8,d0
move.b d2,d0
move.w d0,HsControl(a4)
clr.w d0
btst #8,d3
beq.s HsD3
bset #8+2,d0
HsD3: add.w 2(a1),d3
move.b d3,d0
ror.w #8,d0
btst #8,d3
beq.s HsD4
bset #1,d0
HsD4: btst #15,d2
beq.s HsD5
bset #0,d0
HsD5: move.w d0,HsControl+2(a4)
* A y est, doit actualiser!
bra Hss30
********************************** Sprites partages...
Hss4: tst.l (a4)
beq.s Hss6
cmp.w HsY(a4),d3
bne.s Hss5
cmp.l HsImage(a4),a1
beq.s Hss6
Hss5: move.w (a4),d6
move.w HsNext(a4),d7
clr.l (a4)
move.w d7,2(a3,d6.w)
beq.s Hss6
move.w d6,0(a3,d7.w)
Hss6:
******* Poke!
move.w d2,HsX(a4)
move.w d3,HsY(a4)
move.l a1,HsImage(a4)
******* Calcule les mots de controle
move.w 6(a1),d0
lsl.w #2,d0
asr.w #2,d0
sub.w d0,d2
bpl.s Hss10
clr.w d2
Hss10: sub.w 8(a1),d3
bpl.s Hss11
clr.w d3
Hss11: move.w d3,HsYr(a4)
move.w d3,d5
ror.w #1,d2
move.b d3,d0
lsl.w #8,d0
move.b d2,d0
move.w d0,HsControl(a4)
clr.w d0
btst #8,d3
beq.s Hss12
bset #8+2,d0
Hss12: add.w 2(a1),d3
move.b d3,d0
ror.w #8,d0
btst #8,d3
beq.s Hss13
bset #1,d0
Hss13: btst #15,d2
beq.s Hss14
bset #0,d0
Hss14: move.w d0,HsControl+2(a4)
******* Recalcule???
tst.l (a4)
bne.s Hss30
moveq #-4,d7
move.w HsNext(a3,d7.w),d6
beq.s Hss22
Hss20: move.w d6,d7
cmp.w HsYr(a3,d7.w),d5
bcs.s Hss23
bhi.s Hss21
cmp.w d7,d1 * Si EGAL-> numero joue
bcs.s Hss23
* Prend le suivant!
Hss21: move.w HsNext(a3,d7.w),d6
bne.s Hss20
* Le met ` la fin!
Hss22: move.w d1,HsNext(a3,d7.w)
move.w d7,HsPrev(a3,d1.w)
bra.s Hss30
* L'insere au milieu
Hss23: move.w HsPrev(a3,d7.w),d0
move.w d0,HsPrev(a3,d1.w)
move.w d1,HsPrev(a3,d7.w)
move.w d1,HsNext(a3,d0.w)
move.w d7,HsNext(a3,d1.w)
******* Cibon!
Hss30: movem.l (sp)+,a1/a3/a4
movem.l (sp)+,d1-d7
rts
***********************************************************
* ARRET D'UN SPRITE HARD
HsUSet: movem.l a3/a4/d6/d7,-(sp)
move.w d1,d0
mulu #HsLong,d0
move.l T_HsTable(a5),a3
lea 0(a3,d0.w),a4
cmp.w #8,d1
bcc.s HsOff1
* Sprite FIXE
clr.l (a4)
bra.s HsOff2
* Sprite PATCHE!
HsOff1: tst.l (a4)
beq.s HsOff3
move.w (a4),d6
move.w HsNext(a4),d7
clr.l (a4)
move.w d7,2(a3,d6.w)
beq.s HsOff2
move.w d6,0(a3,d7.w)
HsOff2: clr.w HsX(a4)
clr.w HsY(a4)
clr.l HsImage(a4)
HsOff3: movem.l (sp)+,a3/a4/d6/d7
moveq #0,d0
rts
***********************************************************
* AFFICHAGE DES SPRITES HARDWARE
HsAff: movem.l d1-d7/a1-a6,-(sp)
clr.l T_HsChange(a5)
move.l GfxBase(pc),a6
jsr OwnBlitter(a6) OwnBlitter
lea Circuits,a6
******* Cree la table position / Gestion des SPRITES DIRECTS!
move.l T_HsTable(a5),a4
moveq #7,d7
move.w T_HsTCol(a5),d6
ext.l d6
moveq #0,d5
lea T_HsPosition(a5),a3
move.l T_HsLogic(a5),a2
* Si SOURIS empeche le 1er!
tst.w T_MouShow(a5)
bmi.s HsAd0
clr.l (a3)+
addq.l #4,a3
bra.s HsAd6
* Teste les 8 1ers sprites
HsAd0: tst.w (a4)
bne.s HsAd1
move.l a2,(a3)+
clr.l (a3)+
clr.l (a2) * RAZ colonne
addq.w #1,d5
HsAd6: add.l d6,a2
lea HsLong(a4),a4
dbra d7,HsAd0
bra HsAd7
******* SPRITE DIRECT!
HsAd1: move.l HsControl(a4),d3
tst.w 2(a4)
beq HsAdP
subq.w #1,2(a4)
move.l HsImage(a4),a1
move.w (a1),d1
move.w 2(a1),d2
move.w d1,d4
cmp.w #4,4(a1)
bcc.s HsAd3
lea 10(a1),a1
* Affiche le sprite MONOCOULEUR
HsAd2: clr.l (a3)+
addq.l #4,a3
move.l a2,a0
move.l d3,(a0)+
move.l a1,-(sp)
bsr HsBlit
clr.l (a0)
move.l (sp)+,a1
subq.w #1,d4
beq.s HsAd6
addq.l #2,a1
add.l d6,a2
add.l #$00080000,d3
lea HsLong(a4),a4
dbra d7,HsAd2
bra HsAd7
* Sprite MULTICOLOR
HsAd3: lea 10(a1),a1
btst #0,d7 * Si IMPAIR, colonne vide!
bne.s HsAd4
clr.l (a3)+
addq.l #4,a3
clr.l (a2)
add.l d6,a2
lea HsLong(a4),a4
subq.w #1,d7
bmi HsAd7
HsAd4: clr.l (a3)+
addq.l #4,a3
lea HsLong(a4),a4
subq.w #1,d7
move.l a2,a0
move.l d3,(a0)+
move.l a1,-(sp)
bsr HsBlit
clr.l (a0)
clr.l (a3)+
addq.l #4,a3
add.l d6,a2
move.l a2,a0
bset #7,d3
move.l d3,(a0)+
bclr #7,d3
bsr HsBlit
clr.l (a0)
move.l (sp)+,a1
subq.w #1,d4
beq HsAd6
addq.l #2,a1
add.l d6,a2
add.l #$00080000,d3
lea HsLong(a4),a4
dbra d7,HsAd4
bra.s HsAd7
* Pas de recopie!
HsAdP: move.l HsImage(a4),a1
move.w (a1),d1
cmp.w #4,4(a1)
bcc.s HsAdP2
HsAdP1: clr.l (a3)+ * 4 couleurs
addq.l #4,a3
move.l d3,(a2)
subq.w #1,d1
beq HsAd6
lea HsLong(a4),a4
add.l d6,a2
add.l #$00080000,d3
dbra d7,HsAdP1
bra.s HsAd7
HsAdP2: btst #0,d7 * 16 couleurs
bne HsAdP3
clr.l (a3)+
addq.l #4,a3
clr.l (a2)
add.l d6,a2
lea HsLong(a4),a4
subq.w #1,d7
bmi.s HsAd7
HsAdP3: clr.l (a3)+
addq.l #4,a3
move.l d3,(a2)
add.l d6,a2
lea HsLong(a4),a4
subq.w #1,d7
clr.l (a3)+
addq.l #4,a3
bset #7,d3
move.l d3,(a2)
bclr #7,d3
subq.w #1,d1
beq HsAd6
lea HsLong(a4),a4
add.l d6,a2
add.l #$00080000,d3
dbra d7,HsAdP3
******* FINI! Marque la fin des colonnes
HsAd7: move.l #-1,(a3)
* Encore des colonnes?
tst.w d5
beq HsAFini
******* 1er sprite
move.l T_HsTable(a5),a4
moveq #-4,d4
******* Boucle d'affichage
HsA3: lea T_HsPosition-8(a5),a3 * Passe a la colonne suivante
HsA4: lea 8(a3),a3
HsA4a: tst.l (a3)
bmi.s HsA3
beq.s HsA4
HsA5: move.w HsNext(a4,d4.w),d4 * Prend le sprite
beq HsAFini
move.l HsImage(a4,d4.w),a2
lea 10(a2),a1
move.w (a2),d5
move.l HsControl(a4,d4.w),d3
moveq #8,d6
move.w 2(a2),d2
addq.w #1,d2
cmp.w #4,4(a2)
bcc HsMAff
HsA6: move.w HsYR(a4,d4.w),d0
cmp.w HsYAct(a3),d0
bcs.s HsA10
move.w HsPAct(a3),d1
add.w d2,d1
cmp.w T_HsPMax(a5),d1
bcc.s HsA10
* Peut recopier dans cette colonne!
add.w d2,d0
move.w d0,HsYAct(a3)
move.w HsPAct(a3),d0
move.w d1,HsPAct(a3)
lsl.w #2,d0
move.l (a3),a0
add.w d0,a0
move.l d3,(a0)+
move.w (a2),d1
subq.w #1,d2
move.l a1,-(sp)
bsr HsBlit
clr.l (a0)
move.l (sp)+,a1
subq.w #1,d5 * Encore un plan?
beq.s HsA4
addq.w #1,d2
addq.l #2,a1
moveq #8,d6
add.l #$00080000,d3 * Decale le sprite a droite
bra.s HsA11
* Passe a la colonne suivante!
HsA10: subq.w #1,d6 * Arret apres 8 essais negatifs
beq HsA4a
HsA11: lea 8(a3),a3
HsA12: tst.l (a3)
beq.s HsA10
bpl.s HsA6
lea T_HsPosition(a5),a3
bra.s HsA12
******* Affichage sprite multicolors
HsMAff: moveq #4,d6
lea T_HsPosition(a5),a0 * Situe a colonne PAIRE
move.l a3,d0
sub.l a0,d0
btst #3,d0
beq.s HsMA1
lea 8(a3),a3
bra HsMA7
HsMA1: move.w HsYR(a4,d4.w),d0 * 2ieme colonne
cmp.w HsYAct+8(a3),d0
bcs.s HsMA5
move.w HsPAct+8(a3),d7
add.w d2,d7
cmp.w T_HsPMax(a5),d7
bcc.s HsMA5
cmp.w HsYAct(a3),d0 * 1ere colonne
bcs.s HsMA5
move.w HsPAct(a3),d1
add.w d2,d1
cmp.w T_HsPMax(a5),d1
bcc.s HsMA5
* Recopie dans la 1ere colonne
add.w d2,d0
move.w d0,HsYAct(a3)
move.w d0,HsYAct+8(a3)
move.w HsPAct(a3),d0
move.w d1,HsPAct(a3)
move.w d7,HsPAct+8(a3)
lsl.w #2,d0
move.w d0,d7
move.l (a3),a0
add.w d0,a0
move.l d3,(a0)+
move.w (a2),d1
subq.w #1,d2
move.l a1,-(sp)
bsr HsBlit
clr.l (a0)
* Recopie dans la 2ieme colonne
move.l 8(a3),a0
add.w d7,a0
bset #7,d3
move.l d3,(a0)+
bsr HsBlit
clr.l (a0)
* Encore un plan?
move.l (sp)+,a1
subq.w #1,d5 * Encore un plan?
beq.s HsMA2
bclr #7,d3
addq.w #1,d2
addq.l #2,a1
moveq #4,d6
add.l #$00080000,d3 * Decale le sprite a droite
bra.s HsMA1
* Saute les 2 colonnes
HsMA2: lea 8(a3),a3
bra HsA4
* Passe a la colonne suivante!
HsMA5: subq.w #1,d6 * Arret apres 8 essais negatifs
beq HsA4a
HsMA6: lea 8*2(a3),a3
HsMA7: tst.l (a3)
beq.s HsMA5
bmi.s HsMA8
tst.l 8(a3)
bne HsMA1
beq.s HsMA6
HsMA8: lea T_HsPosition(a5),a3
bra HsMA7
******* FINI
HsAFini tst.w T_CopON(a5) * Copper en route???
beq HsAf1
move.w T_MouShow(a5),d3
move.w #-1,T_MouShow(a5)
move.l T_HsPhysic(a5),d0
move.l T_HsLogic(a5),d1
move.l T_HsInter(a5),d2
move.l d1,T_HsPhysic(a5)
move.l d2,T_HsLogic(a5)
move.l d0,T_HsInter(a5)
move.l d1,T_HsChange(a5)
move.w d3,T_MouShow(a5)
******* Remet le blitter
HsAf1: bsr BlitWait
move.l GfxBase(pc),a6
jsr DisownBlitter(a6)
******* Retour
HsAffX: movem.l (sp)+,d1-d7/a1-a6
rts
******* Recopie par blitter A1->A0 / BitMap->HSprite
* A0= Destination
* A1= Source
* D1= Tx (mots)
* D2= Ty
HsBlit: bsr BlitWait
move.w #%0000001110101010,BltCon0(a6)
clr.w BltCon1(a6)
move.w d1,d0
subq.w #1,d0
lsl.w #1,d0
move.w d0,BltModC(a6)
move.w #2,BltModD(a6)
move.w d2,d0
lsl.w #6,d0
or.w #1,d0
move.w d1,-(sp)
lsl.w #1,d1
mulu d2,d1
move.w #$8040,DmaCon(a6)
move.l a1,BltAdC(a6)
move.l a0,BltAdD(a6)
move.w d0,BltSize(a6)
add.l d1,a1
lea 2(a0),a0
HsBl2: bsr BlitWait
move.l a1,BltAdC(a6)
move.l a0,BltAdD(a6)
move.w d0,BltSize(a6)
add.l d1,a1
move.w (sp)+,d1
move.w d2,d0
lsl.w #2,d0
lea -2(a0,d0.w),a0
rts
;-----------------------------------------------------------------
; **** *** **** ****
; * * * * * ******************************************
; **** * * * **** * BLOCS
; * * * * * ******************************************
; **** * **** ****
;-----------------------------------------------------------------
IFEQ EZFlag
******* FABRIQUE UN BLOC COMPRESSE
* D1= X
* D2= Y
* D3= TX
* D4= TY
CBloc: movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
moveq #0,d0
lsr.w #3,d1
lsr.w #3,d3
move.w d1,d0
add.w d3,d0
cmp.w EcTLigne(a4),d0
bhi CBlE3
move.w d2,d0
add.w d4,d0
mulu EcTLigne(a4),d0
cmp.l EcTPlan(a4),d0
bhi CBlE3
mulu EcTLigne(a4),d2
ext.l d1
add.w d1,d2
subq.w #1,d4
lea EcCurrent(a4),a0
move.w EcNPlan(a4),d0
subq.w #1,d0
sub.l a3,a3
CBl1: move.l a0,a1
move.w d0,d1
CBl2: move.l (a1)+,a2
add.l d2,a2
move.w d3,d5
CBl3: moveq #0,d7
move.b (a2)+,d6
CBl4: subq.w #1,d5
beq.s CBl5
cmp.b (a2),d6
bne.s CBl5
addq.l #1,a2
addq.w #1,d7
cmp.w #64,d7
bcs.s CBl4
subq.w #1,d7
CBl5: tst.w d7
bne.s CBl7
cmp.b #%11000000,d6
bcs.s CBl6
addq.l #1,a3
CBl6: addq.l #1,a3
tst.w d5
bne.s CBl3
bra.s CBl8
CBl7: addq.l #2,a3
tst.w d5
bne.s CBl3
CBl8: dbra d1,CBl2
add.w EcTLigne(a4),d2
dbra d4,CBl1
* Demande la memoire necessaire
lea 20+16(a3),a3
move.l a3,d0
and.l #$FFFFFFF8,d0
move.l d0,a3
bsr FastMm
beq CBlE1
move.l a3,a0
* Fabrique rellement le bloc!
movem.l (sp)+,d1-d7/a1-a6
move.l d0,a1 * Adresse de debut!
movem.l d1-d7/a1-a6,-(sp)
move.l d0,a3
move.l T_EcCourant(a5),a4
clr.l (a3)+ * Pointeur sur le precedent
clr.l (a3)+ * Pointeur sur le suivant
move.l a0,(a3)+ * Longueur utilisee
clr.w (a3)+ * Numero du bloc
move.w d1,(a3)+ * X/8
move.w d2,(a3)+ * Y
lsr.w #3,d1
lsr.w #3,d3
move.w d3,(a3)+ * TX/8
move.w d4,(a3)+ * TY
mulu EcTLigne(a4),d2
ext.l d1
add.l d1,d2
subq.w #1,d4
lea EcCurrent(a4),a0
move.w EcNPlan(a4),d0
move.w d0,(a3)+ * NbPlans
subq.w #1,d0
GBl1: move.l a0,a1
move.w d0,d1
GBl2: move.l (a1)+,a2
add.l d2,a2
move.w d3,d5
GBl3: moveq #0,d7
move.b (a2)+,d6
GBl4: subq.w #1,d5
beq.s GBl5
cmp.b (a2),d6
bne.s GBl5
addq.l #1,a2
addq.w #1,d7
cmp.w #64,d7
bcs.s GBl4
subq.w #1,d7
GBl5: tst.w d7
bne.s GBl7
cmp.b #%11000000,d6
bcs.s GBl6
move.b #%11000000,(a3)+
GBl6: move.b d6,(a3)+
tst.w d5
bne.s GBl3
beq.s GBl8
GBl7: or.b #%11000000,d7
move.b d7,(a3)+
move.b d6,(a3)+
tst.w d5
bne.s GBl3
GBl8: dbra d1,GBl2
add.w EcTLigne(a4),d2
dbra d4,GBl1
movem.l (sp)+,d1-d7/a1-a6
moveq #0,d0
rts
******* RESTORE UN BLOC COMPRESSE
* A1= Adresse bloc
* D1= X (ou -1)
* D2= Y (ou -1)
PBloc: movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
lea 14(a1),a3
tst.w d1
bpl.s PBl1
move.w (a3),d1
PBl1: tst.w d2
bpl.s PBl2
move.w 2(a3),d2
PBl2: addq.l #4,a3
move.w (a3)+,d3
move.w (a3)+,d4
lsr.w #3,d1
* Verifie que ca ne sorte pas
moveq #0,d0
move.w d1,d0
add.w d3,d0
cmp.w EcTLigne(a4),d0
bhi CBlE3
move.w d2,d0
add.w d4,d0
mulu EcTLigne(a4),d0
cmp.l EcTPlan(a4),d0
bhi CBlE3
mulu EcTLigne(a4),d2
ext.l d1
add.l d1,d2
subq.w #1,d3
subq.w #1,d4
lea EcCurrent(a4),a0
move.w (a3)+,d0
cmp.w EcNPlan(a4),d0
bls.s PBl3
move.w EcNPlan(a4),d0
PBl3: subq.w #1,d0
* Decompacte!
PBl4: move.l a0,a1
move.w d0,d1
PBl5: move.l (a1)+,a2
add.l d2,a2
move.w d3,d5
PBl6: move.b (a3)+,d6
cmp.b #%11000000,d6
bcc.s PBl7
move.b d6,(a2)+
dbra d5,PBl6
bra.s PBl9
PBl7: and.w #%00111111,d6
sub.w d6,d5
move.b (a3)+,d7
PBl8: move.b d7,(a2)+
dbra d6,PBl8
subq.w #1,d5
bpl.s PBl6
PBl9: dbra d1,PBl5
add.w EcTLigne(a4),d2
dbra d4,PBl4
movem.l (sp)+,d1-d7/a1-a6
moveq #0,d0
rts
ENDC
******* Erreurs
BlE: equ 19
* Out of mem, general!
CBlE1: moveq #1,d0
bra.s CBlEm
* Erreurs blocs
CBlE3: moveq #BlE+3,d0
CBlEm: movem.l (sp)+,d1-d7/a1-a6
tst.l d0
rts
CBlE2: moveq #BlE+2,d0
rts
IFEQ EZFlag
***********************************************************
* FABRIQUE UN BLOC
* D1/D2/D3/D4 - D5= numero du bloc
***************************************
MakeCBloc:
bsr FindCBloc
beq.s MkCBl1
bsr FreeCBloc
MkCBl1: bsr CBloc
bne.s MkCBlX
* Incorpore le bloc dans la liste
move.w d5,12(a1)
move.l T_AdCBlocs(a5),a0
cmp.l #0,a0
beq.s MkCBl2
move.l a1,0(a0) * 2ieme---> nouveau
MkCBl2: move.l a0,4(a1) * Nouveau---> 2ieme
move.l a1,T_AdCBlocs(a5) * 1ier bloc
MkCBlX: tst.w d0
rts
***********************************************************
* DESSINE UN BLOC
* D1/D2 - D5= numero du bloc
***************************************
DrawCBloc:
bsr FindCBloc
beq.s CBlE2
bra PBloc
***********************************************************
* EFFACE LE BLOC D5
**************************
FreeCBloc:
bsr FindCBloc
beq.s CBlE2
******* LIBERE LE BLOC A1
FrCBloc:
* Enleve le bloc de la liste
cmp.l T_AdCBlocs(a5),a1
bne.s FrCBl0
move.l 4(a1),T_AdCBlocs(a5)
FrCBl0: tst.l (a1)
beq.s FrCBl1
move.l (a1),a0
move.l 4(a1),4(a0)
FrCBl1: tst.l 4(a1)
beq.s FrCBl2
move.l 4(a1),a0
move.l (a1),(a0)
FrCBl2:
* Libere la memoire
move.l 8(a1),d0
bsr FreeMm
moveq #0,d0
rts
***********************************************************
* EFFACE TOUS LES BLOCS
******************************
RazCBloc:
move.l T_AdCBlocs(a5),d0
beq.s RzCblX
move.l d0,a1
bsr FrCBloc
bra.s RazCBloc
RzCBlX: moveq #0,d0
rts
******* TROUVE UN BLOC D5 DANS LA LISTE
* BNE---> trouve / a1=adresse
FindCBloc:
move.l T_AdCBlocs(a5),d0
beq.s FnCBl1
FnCBl0: move.l d0,a1
cmp.w 12(a1),d5
beq.s FnCBl2
move.l 4(a1),d0
bne.s FnCBl0
FnCBl1: moveq #0,d0
rts
FnCBl2: moveq #1,d0
rts
ENDC
;-----------------------------------------------------------------
; **** *** **** ****
; * * * * * ******************************************
; **** * * * **** * BLOCS NON COMPRESSE
; * * * * * ******************************************
; **** * **** ****
;-----------------------------------------------------------------
******* Description d'un bloc
RsReset
BlPrev: rs.l 1
BlNext: rs.l 1
BlNb: rs.w 1
BlX: rs.w 1
BlY: rs.w 1
BlMask: rs.w 1
BlCon: rs.w 1
BlAPlan rs.w 1
BlDesc: rs.l 2
BlLong: equ __Rs
***********************************************************
* FABRIQUE UN BLOC, ECRAN COURANT
* D1- Numero du bloc
* D2/D3/D4/D5
* D6- Flag Masque
***************************************
MakeBloc:
movem.l a2-a6/d2-d7,-(sp)
moveq #0,d7
move.w d6,d7
* Verifie les parametres
move.l T_EcCourant(a5),a0
tst.w d2
bmi BlE3
tst.w d3
bmi BlE3
tst.w d4
ble BlE3
tst.w d5
ble BlE3
move.w d5,d6
add.w d3,d6
cmp.w EcTy(a0),d6
bhi BlE3
move.w d4,d6
add.w d2,d6
cmp.w EcTx(a0),d6
bhi BlE3
* Reserve l'espace pour les datas
bsr FindBloc
bne.s MkBl1
moveq #BlLong,d0
bsr FastMm
beq.s BlE1
move.l d0,a1
bset #31,d7
* Met les parametres
MkBl1: move.w d1,BlNb(a1)
clr.w BlCon(a1)
move.w #$FFFF,BlAPlan(a1)
move.w d2,BlX(a1)
move.w d3,BlY(a1)
* Prend l'image
exg a0,a1
lea BlDesc(a0),a2
bsr GetBob
move.l a0,a1
tst.w d0
bne.s MkBl3
* Fabrique le masque?
move.l #$C0000000,4(a2)
tst.w d7
beq.s MkBlM
bsr Masque
* Incorpore le bloc dans la liste
MkBlM: btst #31,d7
beq.s MkBlX
lea T_AdBlocs(a5),a2
move.l (a2),d0
beq.s MkBl2
move.l d0,a0
move.l a1,BlPrev(a0)
MkBl2: move.l d0,BlNext(a1)
move.l a1,(a2)
MkBlX: moveq #0,d0
BlOut movem.l (sp)+,a2-a6/d2-d7
rts
******* Erreurs
BlE2: moveq #BlE+2,d0 * Not found
bra.s BlOut
BlE3: moveq #BlE+3,d0 * Foncall
bra.s BlOut
MkBl3: bsr FrBloc * Out of mem
BlE1: moveq #1,d0
bra.s BlOut
***********************************************************
* EFFACE LE BLOC D1
**************************
DelBloc:
bsr FindBloc
bne.s FrBloc
moveq #BlE+2,d0
rts
******* LIBERE LE BLOC A1
FrBloc: movem.l a2-a6/d2-d7,-(sp)
move.l a1,a2
* Enleve le dessin
move.l BlDesc(a2),d0
beq.s FrBl1
move.l d0,a1
move.w (a1),d0
mulu 2(a1),d0
mulu 4(a1),d0
addq.l #5,d0
lsl.l #1,d0
bsr FreeMm
* Enleve le masque
FrBl1: move.l BlDesc+4(a2),d0
ble.s FrBl2
move.l d0,a1
move.l (a1),d0
bsr FreeMm
* Enleve le bloc de la liste
FrBl2: move.l a2,a1
lea T_AdBlocs(a5),a2
cmp.l (a2),a1
bne.s FrBl3
move.l BlNext(a1),(a2)
FrBl3: tst.l BlPrev(a1)
beq.s FrBl4
move.l BlPrev(a1),a0
move.l BlNext(a1),BlNext(a0)
FrBl4: tst.l BlNext(a1)
beq.s FrBl5
move.l BlNext(a1),a0
move.l BlPrev(a1),BlPrev(a0)
FrBl5: moveq #BlLong,d0
bsr FreeMm
moveq #0,d0
bra BlOut
***********************************************************
* EFFACE TOUS LES BLOCS
******************************
RazBloc lea T_AdBlocs(a5),a0
move.l (a0),d0
beq.s RzBlX
move.l d0,a1
bsr FrBloc
bra.s RazBloc
RzBlX: moveq #0,d0
rts
***********************************************************
* DESSINE UN BLOC
* D1- Numero du bloc
* D2/D3- Coordonnees
* D4- Plans
* D5- Minterm
* A1- Buffer de calcul
DrawBloc:
movem.l d2-d7/a2-a6,-(sp)
move.l a1,a4
bsr FindBloc
bne.s DrBl0
BlNDef moveq #2,d0
bra BlOut
* Parametres de l'ecran courant
DrBl0: move.l T_EcCourant(a5),a0
move.w EcClipX0(a0),d0
and.w #$FFF0,d0
move.w d0,BbLimG(a4)
move.w EcClipY0(a0),BbLimH(a4)
move.w EcClipX1(a0),d0
add.w #15,d0
and.w #$FFF0,d0
move.w d0,BbLimD(a4)
move.w EcClipY1(a0),BbLimB(a4)
* Parametres du bob
move.l #EntNul,d7
cmp.l d2,d7
bne.s DrBl1
move.w BlX(a1),d2
DrBl1: cmp.l d3,d7
bne.s DrBl2
move.w BlY(a1),d3
DrBl2: move.w BlAPlan(a1),BbAPlan(a4)
cmp.l d4,d7
beq.s DrBl3
move.w d4,BbAPlan(a4)
DrBl3: move.w BlCon(a1),BbACon(a4)
cmp.l d5,d7
beq.s DrBl4
and.w #$00FF,d5
bset #15,d5
move.w d5,BbACon(a4)
DrBl4: move.l a0,BbEc(a4)
move.w d3,d1
moveq #-1,d3
lea BlDesc(a1),a2
bsr BobCalc
bne.s DBlOut
* Appelle la routine d'affichage
lea Circuits,a6
bsr OwnBlit
move.w BbASize(a4),d2
move.w BbTPlan(a4),d4
ext.l d4
move.l BbAData(a4),a0
move.l BbEc(a4),a3
lea EcCurrent(a3),a3
move.w BbAModD(a4),d0
move.w d0,BltModC(a6)
move.w d0,BltModD(a6)
move.l BbADraw(a4),a1
move.l BbAMask(a4),d5
jsr (a1)
* FINI: remet le blitter
bsr BlitWait
bsr DOwnBlit
DBlOut: moveq #0,d0
bra BlOut
******* Retourne un bloc
* D1-> Numero bloc
* D2-> Bit 0 => X / Bit 1 => Y
RevBloc movem.l d2-d7/a2-a6,-(sp)
bsr FindBloc
beq BlNDef
lea BlDesc(a1),a0
move.l (a0),a1
and.w #$3FFF,6(a1)
move.w d2,d0
bsr Retourne
moveq #0,d0
bra BlOut
******* TROUVE UN BLOC D1 DANS LA LISTE
* BNE---> trouve / a1=adresse
FindBloc:
lea T_AdBlocs(a5),a1
move.l (a1),d0
beq.s FnBl1
FnBl0: move.l d0,a1
cmp.w BlNb(a1),d1
beq.s FnBl2
move.l BlNext(a1),d0
bne.s FnBl0
FnBl1: moveq #0,d0
rts
FnBl2: moveq #1,d0
rts
;-----------------------------------------------------------------
; **** *** **** ****
; * * * * * ******************************************
; **** * * * **** * TRAPPE FENETRES
; * * * * * ******************************************
; **** * **** ****
;-----------------------------------------------------------------
; OPEN CONSOLE.DEVICE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OpConsole
lea ConIo(pc),a1
moveq #(Lio+Lmsg)/2-1,d0
.Clean clr.w (a1)+
dbra d0,.Clean
move.l $4.w,a6
lea ConName(pc),a0
lea ConIo(pc),a1
moveq #-1,d0 Console #= -1
moveq #0,d1
jsr OpenDev(a6)
rts
; OPEN INPUT.DEVICE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A1-> pointeur sur zone libre!!!
OpInput
move.l a1,-(sp)
* Clean
moveq #(Lio+Lmsg)/2-1,d0
OpInp1 clr.w (a1)+
dbra d0,OpInp1
* Creates port
sub.l a1,a1
move.l $4.w,a6
jsr FindTask(a6)
move.l (sp),a1
lea Lio(a1),a1
move.l d0,$10(a1)
jsr AddPort(a6)
* Open device
lea DevName(pc),a0
move.l (sp),a1
moveq #0,d0
moveq #0,d1
jsr OpenDev(a6)
move.l (sp)+,a1
lea Lio(a1),a0
move.l a0,14(a1)
rts
; CLOSE input.device
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClInput move.l a1,-(sp)
; Close device
move.l $4.w,a6
jsr CloseDev(a6)
; Close port
move.l (sp)+,a1
lea Lio(a1),a1
jsr RemPort(a6)
rts
; Input handler, branche sur la chaine des inputs.
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IoHandler
move.l a5,-(sp)
move.l W_Base(pc),a5
; Si inhibe, laisse TOUT passer!
tst.w T_Inhibit(a5)
bne.s I_Inhibit
; Continue...
move.b T_AMOSHere(a5),d4 Si AMOS pas la,
ext.w d4
bne.s .Skip
bset #WFlag_Event,T_WFlags(a5) Marque des faux events!
.Skip move.l a0,d0
move.l a0,d2
moveq #0,d3
IeLoop move.b Ie_Class(a0),d1
cmp.b #IeClass_RawMouse,d1
beq.s IeMous
cmp.b #IeClass_Rawkey,d1
beq IeKey
cmp.b #IeClass_DiskInserted,d1
beq.s IeDIn
cmp.b #IeClass_DiskRemoved,d1
beq.s IeDOut
IeLp1 move.l d2,d3
move.l (a0),d2
IeLp2 move.l d2,a0
bne.s IeLoop
IeLpX move.l (sp)+,a5
rts
I_Inhibit
move.l (sp)+,a5
move.l a0,d0
rts
; Disc inserted
IeDIn bset #WFlag_Event,T_WFlags(a5)
move.w #-1,T_DiscIn(a5)
bra.s IeLp1
; Disc removed
IeDOut bset #WFlag_Event,T_WFlags(a5)
clr.w T_DiscIn(a5)
bra.s IeLp1
; Evenement Mouse, fait le mouvement!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IeMous tst.w d4
beq.s IeLp1
bset #WFlag_Event,T_WFlags(a5) Flag: un event!
cmp.l #Fake_Code,ie_X(a0) Un faux evenement?
beq.s IeFake
IeNof move.w T_MouYOld(a5),d1 * Devenir des MOUSERAW
and.w #$0003,d1 * 0-> Normal
beq.s .norm * 1-> Trash
subq.w #2,d1 * 2-> Tout passe
bmi.s IeTrash * 3-> Mouvements seuls
beq.s IeLp1
; Mode key only>>> prend les touches, laisse passer les mouvements
move.w ie_Qualifier(a0),T_MouXOld(a5)
and.w #%1000111111111111,ie_Qualifier(a0)
move.w ie_Code(a0),d1
and.w #$7f,d1
cmp.w #IECODE_LBUTTON,d1
beq.s .ski1
cmp.w #IECODE_RBUTTON,d1
bne.s IeLp1
.ski1 move.w #IECODE_NOBUTTON,ie_Code(a0)
bra.s IeLp1
; Mode normal>>> prend et met a la poubelle
.norm move.w ie_Qualifier(a0),d1
move.w d1,T_MouXOld(a5)
btst #IEQUALIFIERB_RELATIVEMOUSE,d1
beq.s IeTrash
move.w ie_X(a0),d1
add.w d1,T_MouseX(a5)
move.w ie_Y(a0),d1
add.w d1,T_MouseY(a5)
; Event to trash!
IeTrash tst.l d3
beq.s IeTr1
move.l d3,a1
move.l (a0),d2
move.l d2,(a1)
bra IeLp2
IeTr1 move.l (a0),d0
move.l d0,a0
bne IeLoop
move.l (sp)+,a5
rts
; Faux evenement clavier...
; ~~~~~~~~~~~~~~~~~~~~~~~~~
IeFake cmp.w #IEQUALIFIER_RELATIVEMOUSE,ie_Qualifier(a0)
bne IeNof
clr.l ie_X(a0) Plus de decalage
bra IeLp1 On laisse passer
; Event clavier: prend le caractere au vol
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IeKey bset #WFlag_Event,T_WFlags(a5)
bsr Cla_Event
bne.s .IeKy1
.IeKy0 tst.w d4 Event to trash ou non
bne.s IeTrash
bra IeLp1
; AMIGA-A pressed
; ~~~~~~~~~~~~~~~
.IeKy1 tst.w T_NoFlip(a5)
bne.s .IeKy0
btst #WFlag_LoadView,T_WFlags(a5)
bne.s .AA
; Appel de TAMOSWb, rapide...
movem.l a0-a1/d0-d1,-(sp)
moveq #0,d1
tst.w d4
bne.s .Ska
moveq #1,d1
.Ska bsr TAMOSWb
movem.l (sp)+,a0-a1/d0-d1
bra IeTrash
; Marque pour TESTS CYCLIQUES
.AA bset #WFlag_AmigaA,T_WFlags(a5)
bra IeTrash
; Gestion des evenements clavier
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= EVENT KEY
; D4= Flag AMOS / WB
Cla_Event
movem.l a0-a1/d0-d3,-(sp)
move.w Ie_Code(a0),d0
bclr #7,d0
bne .ClaI2
; Appui sur une touche
; ~~~~~~~~~~~~~~~~~~~~
cmp.b #$68,d0 Shifts>>> pas stockes
bcc.s .RawK
cmp.b #$40,d0
bcs.s .RawK
cmp.b #$60,d0
bcc .Cont
; Conversion a la main des codes speciaux
lea Cla_Special-$40(pc),a1
move.b 0(a1,d0.w),d1
bpl .Rien
cmp.b #$FF,d1
beq.s .RawK
; Une touche de fonction AMOS?
moveq #0,d1 Ascii nul
move.b Ie_Qualifier+1(a0),d2 Les shifts
btst #6,d2
beq.s .FFk1
lea T_TFF1(a5),a1 Touches 1-10
bra.s .FFk2
.FFk1 btst #7,d2 Pas AMIGA>>> Touche normale
beq.s .Rien
lea T_TFF2(a5),a1 Touches 11-20
.FFk2 move.w d0,d2
sub.w #$50,d2
mulu #FFkLong,d2
lea 0(a1,d2.w),a1
tst.b (a1)
beq.s .Rien
bsr ClPutK
moveq #0,d2
bra .ClaIX
; Appel de RAWKEYCONVERT et stockage si AMOS present
.RawK move.b Ie_Qualifier+1(a0),d2 Prend CONTROL
and.b #%11110111,Ie_Qualifier+1(a0) Plus de CONTROL
movem.l a0/a2/a6,-(sp)
lea ConIo(pc),a6 Structure IO
move.l 20(a6),a6 io_device
lea ConBuffer(pc),a1 Buffer de sortie
sub.l a2,a2 Current Keymap
moveq #LConBuffer,d1 Longueur du buffer
jsr -$30(a6) RawKeyConvert
move.w d0,d3
movem.l (sp)+,a0/a2/a6
move.b d2,Ie_Qualifier+1(a0) Remet CONTROL
move.w Ie_Code(a0),d0
moveq #0,d1
subq.w #1,d3
bmi.s .Rien
lea ConBuffer(pc),a1 Une seule touche
move.b (a1),d1
.Rien move.b Ie_Qualifier+1(a0),d2 Les shifts!
; Amiga-A?
.A move.b d2,d3
and.b T_AmigA_Shifts(a5),d3
cmp.b T_AmigA_Shifts(a5),d3
bne.s .AAA
cmp.b T_AmigA_Ascii1(a5),d1
beq.s .AA
cmp.b T_AmigA_Ascii2(a5),d1
bne.s .AAA
.AA moveq #-1,d2
bra.s .ClaI1
; AMOS Not here: stop!
.AAA tst.w d4
beq.s .Cont
; Est-ce un CONTROL-C?
btst #3,d2
beq.s .Sto
cmp.b #"C",d1
beq.s .C
cmp.b #"c",d1
bne.s .Sto
.C bset #BitControl,T_Actualise(a5)
bra.s .Cont
; Stocke dans le buffer
.Sto bsr Cla_Stocke On stocke!
; Change la table
.Cont moveq #0,d2
.ClaI1 move.w d0,d1
and.w #$0007,d0
lsr.w #3,d1
lea T_ClTable(a5),a0
bset d0,0(a0,d1.w)
.ClaIX tst.w d2
movem.l (sp)+,a0-a1/d0-d3
rts
; Relachement d'une touche
; ~~~~~~~~~~~~~~~~~~~~~~~~
.ClaI2 move.w d0,d1
and.w #$0007,d0
lsr.w #3,d1
lea T_ClTable(a5),a1
bclr d0,0(a1,d1.w)
.ClaIF moveq #0,d0
movem.l (sp)+,a0-a1/d0-d3
rts
; Table des touches $40->$5f
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
Cla_Special
dc.b $ff,$08,$09,$0d,$0d,$1b,$00,$00 $40>$47
dc.b $00,$00,$ff,$00,$1e,$1f,$1c,$1d $48>$4f
dc.b $fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe $50>$57
dc.b $fe,$fe,$ff,$ff,$ff,$ff,$ff,$00 $58>$5f
; Stocke D0/D1/D2 dans le buffer clavier
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; D0 Rawkey
; D1 Ascii
; D2 Shifts
Cla_Stocke
movem.l a0/d3,-(sp)
lea T_ClBuffer(a5),a0
move.w T_ClTete(a5),d3
addq.w #3,d3
cmp.w #ClLong,d3
bcs.s .ClS11
clr.w d3
.ClS11 cmp.w T_ClQueue(a5),d3
beq.s .ClS12
move.w d3,T_ClTete(a5)
move.b d2,0(a0,d3.w)
move.b d0,1(a0,d3.w)
move.b d1,2(a0,d3.w)
.ClS12 move.b d2,-4(a0)
move.b d0,-3(a0)
move.b d1,-1(a0)
.ClSFin movem.l (sp)+,a0/d3
rts
; Envoi d'un faux event souris au systeme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WSend_FakeEvent
movem.l d0-d1/a1/a6,-(sp)
lea Fake_Event(pc),a0
move.b #IECLASS_RAWMOUSE,ie_Class(a0)
clr.b ie_SubClass(a0)
move.w #IECODE_NOBUTTON,ie_Code(a0)
move.w #IEQUALIFIER_RELATIVEMOUSE,ie_Qualifier(a0)
move.l #Fake_Code,ie_X(a0)
lea T_IoDevice(a5),a1
move.l a0,io_Data(a1)
move.w #IND_WRITEEVENT,io_Command(a1)
move.l #22,io_Length(a1)
move.l $4.w,a6
jsr _LVODoIO(a6)
movem.l (sp)+,d0-d1/a1/a6
rts
Fake_Code equ $789A789A
; Faux evenement souris
Fake_Event dc.l 0 0
dc.b IeClass_RawMouse 4
dc.b 0 5
dc.w IECODE_NOBUTTON 6
dc.w 0 8
dc.w 0 10
dc.w 0 12
dc.l 0 14 Time Stamp
dc.l 0 18 " "
; Initialisation / Vide du buffer clavier
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClInit
ClVide move.w T_ClTete(a5),T_ClQueue(a5)
clr.b T_ClFlag(a5)
moveq #0,d0
rts
; KEY WAIT, retourne BNE si des touches en attente
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClKWait moveq #0,d0
move.w T_ClQueue(a5),d1
cmp.w T_ClTete(a5),d1
rts
; INKEY: D1 haut: SHIFTS/SCANCODE - D1 bas: ASCII
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClInky moveq #0,d1
move.w T_ClQueue(a5),d2
cmp.w T_ClTete(a5),d2
beq.s Ink2
lea T_ClBuffer(a5),a0
addq.w #3,d2
cmp.w #ClLong,d2
bcs.s Ink1
moveq #0,d2
Ink1: move.b 0(a0,d2.w),d1
lsl.w #8,d1
move.b 1(a0,d2.w),d1
swap d1
move.b 2(a0,d2.w),d1
move.w d2,T_ClQueue(a5)
Ink2: moveq #0,d0
rts
; Change KEY MAP A1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClKeyM rts
***********************************************************
* Set key speed D1,d2
* A1---> Buffer libre!!!
***********************************************************
TKSpeed movem.l a3-a6,-(sp)
move.l a1,-(sp)
movem.l d1/d2,-(sp)
bsr OpInput
move.l (sp),d0
bsr CalRep
move.w #IND_SETTHRESH,io_command(a1)
move.l $4.w,a6
jsr DoIO(a6)
move.l 4(sp),d0
move.l 8(sp),a1
bsr CalRep
move.w #IND_SETPERIOD,io_command(a1)
move.l $4.w,a6
jsr DoIO(a6)
move.l 8(sp),a1
bsr ClInput
lea 12(sp),sp
movem.l (sp)+,a3-a6
moveq #0,d0
rts
CalRep ext.l d0
divu #50,d0
move.w d0,d1
swap d0
ext.l d0
mulu #20000,d0
move.l d1,$20(a1) tv_secs
move.l d0,$24(a1) tv_micro
rts
; Get shifts
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClSh: moveq #0,d1
move.b T_ClShift(a5),d1
moveq #0,d0
rts
; Instant key D1: 0=relache / -1= enfonce
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClInst: and.w #$7F,d1
move.w d1,d0
and.w #$0007,d0
lsr.w #3,d1
lea T_ClTable(a5),a0
lea 0(a0,d1.w),a0
moveq #0,d1
btst d0,(a0)
beq.s Inst
moveq #-1,d1
Inst: moveq #0,d0
rts
; PUT KEY: stocke la chaine (A1) dans le buffer
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClPutK: move.l a0,-(sp)
movem.w d0-d3,-(sp)
lea T_ClBuffer(a5),a0
ClPk0: clr.b d0
clr.b d1
move.b (a1)+,d2
beq.s ClPk4
cmp.b #"'",d2 * REM
beq.s ClPk5
cmp.b #1,d2 * ESC
bne.s ClPk1
move.b (a1)+,d0 * Puis SHF/SCAN/ASCI
move.b (a1)+,d1
move.b (a1)+,d2
; Stocke!
ClPk1: move.w T_ClTete(a5),d3
addq.w #3,d3
cmp.w #ClLong,d3
bcs.s ClPk2
clr.w d3
ClPk2: cmp.w T_ClQueue(a5),d3
beq.s ClPk4
move.b d0,0(a0,d3.w)
move.b d1,1(a0,d3.w)
move.b d2,2(a0,d3.w)
move.w d3,T_ClTete(a5)
ClPk3: bra.s ClPk0
ClPk5: move.b (a1)+,d2
beq.s ClPk4
cmp.b #"'",d2
bne.s ClPk5
bra.s ClPk0
ClPk4: movem.w (sp)+,d0-d3
move.l (sp)+,a0
rts
; FUNC KEY: stocke la chaine (A1) en fonc D1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClFFk: movem.l d1-d2,-(sp)
lea T_TFF1(a5),a0
mulu #FFkLong,d1
add.w d1,a0
clr.w d0
ClF1: clr.b (a0)
move.b (a1)+,d2
beq.s ClFx
cmp.b #1,d2
beq.s ClF2
cmp.b #"`",d2
beq.s ClF3
addq.w #1,d0
cmp.w #FFkLong-1,d0
bcc.s ClF1
move.b d2,(a0)+
bra.s ClF1
ClFx: movem.l (sp)+,d1-d2
move.l a1,a0
moveq #0,d0
rts
ClF2: addq.w #4,d0
addq.l #3,a1
cmp.w #FFkLong-1,d0
bcc.s ClF1
move.b d2,(a0)+
move.b -3(a1),(a0)+
move.b -2(a1),(a0)+
move.b -1(a1),(a0)+
bra.s ClF1
ClF3: addq.w #2,d0
cmp.w #FFkLong-1,d0
bcc.s ClF1
move.b #13,(a0)+
move.b #10,(a0)+
bra.s ClF1
; GET KEY: ramene la touche de fonction
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClGFFk: lea T_TFF1(a5),a0
move.w d1,d0
mulu #FFkLong,d0
add.w d0,a0
moveq #0,d0
rts
; RETOUR L'ETAT DU FLAG DISC
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TGetDisc
move.w T_DiscIn(a5),d0
ext.l d0
rts
; Gestion cyclique hors interruptions
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WTest_Cyclique
; Verifie AMOS / WB si AA
; ~~~~~~~~~~~~~~~~~~~~~~~
bclr #WFlag_AmigaA,T_WFlags(a5)
beq.s .NoFlip
moveq #0,d1
tst.b T_AMOSHere(a5)
bne.s .Wb
moveq #1,d1
.Wb bsr TAMOSWb
.NoFlip
; Envoi des faux messages au WB, en cas de blanker
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l $4.w,a0
cmp.w #36,$14(a0)
bcs.s .Noev
subq.w #1,T_FakeEventCpt(a5)
bpl.s .Noev
move.w #50*2,T_FakeEventCpt(a5)
tst.b T_AMOSHere(a5)
beq.s .Noev
bsr WSend_FakeEvent
.Noev
; Verifie l'inhibition
; ~~~~~~~~~~~~~~~~~~~~
move.l T_MyTask(a5),a0
move.l 10(a0),a0
cmp.b #"S",(a0)
bne.s .Skip
bsr AMOS_Stopped
.Skip rts
; Cet AMOS est inhibe par un premier!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AMOS_Stopped
movem.l a0-a6/d0-d7,-(sp)
move.l a0,a4
; Fait revenir le WB / Stoppe les interrupts
move.w #-1,T_Inhibit(a5)
moveq #-1,d1
bsr TAMOSWb
move.w d1,d7
moveq #0,d1
bsr TAMOSWb
; Stoppe les interrupts
bsr Rem_VBL
; Arrete le son
move.w #$000F,$Dff096
; Change le "S"top en "W"
move.b #"W",(a4)
; Attend qu'il se retransforme en " "
.Wait move.l T_GfxBase(a5),a6
jsr -270(a6)
cmp.b #"W",(a4)
beq.s .Wait
; Ramene le programme..
bsr Add_VBL
tst.w d7
beq.s .Skip
moveq #1,d1
bsr TAMOSWb
.Skip clr.w T_Inhibit(a5)
movem.l (sp)+,a0-a6/d0-d7
rts
***********************************************************
* DEMARRAGE A FROID DES FENETRES
***********************************************************
WiInit: lea WiIn(pc),a0
move.l a0,T_WiVect(a5)
rts
******* FONCTIONS FENETRES
WiIn: bra WOutC
bra WPrint
bra WCentre
bra WOpen
bra WLocate
bra WQWind
bra WDel
bra WSBor
bra WSTit
bra WAdr
bra WiMove
bra WiCls
bra WiSize
bra WiSCur
bra WiXYCu
bra WiXGr
bra WiYGr
bra WPrint2
bra WPrint3
bra WiXYWi
***********************************************************
* ARRET FINAL DES FENETRES
***********************************************************
WiEnd: rts
***********************************************************
* Writing FENETRE, loin de la destination!!!
* D1= 0/ Normal - 1/ Or - 2/ Xor - 3/ And - 4/ RIEN
* D2= NORMAL - PAPER only - PEN only
***********************************************************
Writing:move.w d1,d2
and.w #$07,d1
cmp.w #5,d1
bcc.s Wrt0
bclr #7,WiFlags(a5)
lsl.w #1,d1
beq.s Wrt1
bset #7,WiFlags(a5)
Wrt1: lea WrtTab(pc),a1
move.w 0(a1,d1.w),d0
lea WMod1(pc),a0
move.w d0,(a0)
lea WMod2(pc),a0
move.w d0,(a0)
lea WMod3(pc),a0
move.w d0,(a0)
Wrt0: move.w d2,d1
lsr.w #3,d1
and.w #$03,d1
cmp.w #3,d1
bcc.s Wrt3
lsl.w #1,d1
beq.s Wrt2
bset #7,WiFlags(a5)
Wrt2: lea GetTab(pc),a1
lea WGet1(pc),a0
move.w 0(a1,d1.w),(a0)
lea WGet2(pc),a0
move.w 0(a1,d1.w),(a0)
Wrt3: bsr Sys_ClearCache
moveq #0,d0
rts
WrtTab: move.b d0,(a4)
or.b d0,(a4)
eor.b d0,(a4)
and.b d0,(a4)
nop
GetTab: or.b d1,d0
nop
move.w d1,d0
***********************************************************
* DECOR DES FENETRES
******* Fabrique le decor de la fenetre COURANTE!
WiStore movem.l d0-d7/a0-a5,-(sp)
tst.w EcWiDec(a4)
beq WiMdX
move.l EcWindow(a4),d0
beq WiMdX
move.l d0,a5
* Gestion memoire de sauvegarde
move.w WiTxR(a5),d1
mulu WiTyP(a5),d1
mulu EcNPlan(a4),d1
tst.l WiDBuf(a5)
beq.s WiMd0
cmp.l WiTBuf(a5),d1
beq.s WiMd1
* Efface!
move.l WiDBuf(a5),a1
move.l WiTBuf(a5),d0
bsr FreeMm
clr.l WiDBuf(a5)
clr.l WiTBuf(a5)
* Reserve!
WiMd0: move.l d1,d0
bsr FastMm
beq.s WiMdX
move.l d0,WiDBuf(a5)
move.l d1,WiTBuf(a5)
* Copie le contenu de l'ecran!
WiMd1: move.l WiDBuf(a5),a3
move.w WiDyR(a5),d0
move.w EcTLigne(a4),d1
ext.l d1
mulu d1,d0
add.w WiDxR(a5),d0
move.w WiTyP(a5),d2
subq.w #1,d2
move.w WiTxR(a5),d3
move.w d3,WiTxBuf(a5)
subq.w #1,d3
move.w WiNPlan(a5),d5
lea EcLogic(a4),a0
WiMd2: move.w d5,d6
move.l a0,a1
WiMd3: move.l (a1)+,a2
add.l d0,a2
move.w d3,d4
WiMd4: move.b (a2)+,(a3)+
dbra d4,WiMd4
dbra d6,WiMd3
add.l d1,d0
dbra d2,WiMd2
* Ca y est!
WiMdX: movem.l (sp)+,d0-d7/a0-a5
rts
******* Entree EFFACEMENT pour WIND SIZE!
WiEff2: movem.l d0-d7/a0-a3,-(sp)
tst.w EcWiDec(a4)
beq WiEfX
tst.l WiDBuf(a5)
beq WiEfX
* Limite en X
move.w d6,d5
cmp.w WiTxR(a5),d5
bls.s WiEf2a
move.w WiTxR(a5),d5
* Limite en Y
WiEf2a: cmp.w WiTyP(a5),d7
bls.s WiEf2b
move.w WiTyP(a5),d7
* Limite en X
WiEf2b: move.w WiDxR(a5),d0
move.w d0,d2
add.w d5,d2
move.w WiDyR(a5),d1
move.w d1,d3
add.w d7,d3
* Bordure?
tst.w WiBord(a5)
beq.s WiEf2c
addq.w #1,d0
addq.w #8,d1
subq.w #1,d2
subq.w #8,d3
* Pousse!
WiEf2c: move.w d3,-(sp)
move.w d2,-(sp)
move.w d0,-(sp)
moveq #0,d4
moveq #0,d5
ext.l d6
move.w d1,d7
bra WiEf0
******* Efface la fenetre (A5) avec CLIP des fenetres DEVANT!
* Avec D5= 1/0 Avec / Sans bordure
* Entre Y=D6 et Y=D7 seulement!
WiEff: movem.l d0-d7/a0-a3,-(sp)
tst.w EcWiDec(a4)
beq WiEfX
tst.l WiDBuf(a5)
beq WiEfX
* Limites la zone en Y
move.w WiDyR(a5),d0
move.w WiFyR(a5),d1
cmp.w d7,d0
bcc WiEfX
cmp.w d6,d1
bls WiEfX
cmp.w d6,d0
bls.s WiEe1
move.w d0,d6
WiEe1: cmp.w d7,d1
bcc.s WiEe2
move.w d1,d7
WiEe2: move.w d7,-(sp)
exg.l d6,d7
* Donnees inits
moveq #0,d6
move.w WiTxR(a5),d6
move.w WiDxR(a5),d0
add.w d6,d0
move.w d0,-(sp)
move.w WiDxR(a5),-(sp)
moveq #0,d4
moveq #0,d5
WiEf0: move.w (sp),d5
* Va clipper
WiEf1: move.w d5,d4
move.w 2(sp),d5
bsr WiClip
bne WiEf4
* Adresse dans l'ecran
move.w d7,d3
mulu EcTLigne(a4),d3
add.l d4,d3
* Adresse dans le buffer
move.w d7,d0
sub.w WiDyR(a5),d0
move.w EcNPlan(a4),d2
mulu d2,d0
mulu d6,d0
add.w d4,d0
sub.w WiDxR(a5),d0
move.l WiDBuf(a5),a0
add.l d0,a0
subq.w #1,d2
move.w d5,d1
sub.w d4,d1
lea EcLogic(a4),a2
cmp.w #8,d1
bcc.s WiER
** Recopie LENTE!
subq.w #1,d1
WiEf2: move.l (a2)+,a3
add.l d3,a3
move.l a0,a1
move.w d1,d0
WiEf3: move.b (a1)+,(a3)+
dbra d0,WiEf3
add.l d6,a0
dbra d2,WiEf2
cmp.w 2(sp),d5
bcs.s WiEf1
bra.s WiEf4
** Recopie plus RAPIDE!
WiER: move.w d1,d4
lsr.w #2,d1
subq.w #1,d1
and.w #3,d4
subq.w #1,d4
WiEr2: move.l (a2)+,a3
add.l d3,a3
move.l a0,a1
move.w d1,d0
WiEr3: move.b (a1)+,(a3)+
move.b (a1)+,(a3)+
move.b (a1)+,(a3)+
move.b (a1)+,(a3)+
dbra d0,WiEr3
move.w d4,d0
bmi.s WiEr5
WiEr4: move.b (a1)+,(a3)+
dbra d0,WiEr4
WiEr5: add.l d6,a0
dbra d2,WiEr2
cmp.w 2(sp),d5
bcs WiEf1
** Encore une ligne en Y?
WiEf4: addq.w #1,d7
cmp.w 4(sp),d7
bcs WiEf0
addq.l #6,sp
** Ca y est!
WiEfX: movem.l (sp)+,d0-d7/a0-a3
rts
******* Effacement du buffer de decor (a5)
WiEffBuf:
move.l WiDBuf(a5),d0
beq.s WiEbX
move.l d0,a1
move.l WiTBuf(a5),d0
bsr FreeMm
clr.l WiDBuf(a5)
clr.l WiTBuf(a5)
WiEbX: rts
******* Window clipping
WiClip: move.l WiPrev(a5),d0
beq.s WiClpX
WiClp0: move.l d0,a0
move.w d4,d2
move.w d5,d3
* Bonne ligne?
cmp.w WiDyR(a0),d7
bcs.s WiClpN
cmp.w WiFyR(a0),d7
bcc.s WiClpN
* Rapproche les limites
cmp.w WiDxR(a0),d5
bls.s WiClpN
cmp.w WiFxR(a0),d4
bcc.s WiClpN
cmp.w WiDxR(a0),d4
bcc.s WiClp1
move.w WiDxR(a0),d5
bra.s WiClp2
WiClp1: move.w WiFxR(a0),d4
* Encore de la place?
WiClp2: cmp.w d4,d5
bls.s WiClpO
* Encore une fenetre devant?
WiClpN: move.l WiPrev(a0),d0
bne.s WiClp0
WiClpX: moveq #0,d0
rts
* Refaire un tour?
WiClpO: cmp.w d2,d4
bne.s WiClpR
cmp.w d3,d5
bne.s WiClpR
WiClpE: moveq #-1,d0
rts
* Un tour encore pour sortir des chevauchements
WiClpR: cmp.w 4+2(sp),d4
bcc.s WiClpE
move.w d5,d4
move.w 4+2(sp),d5
move.l WiPrev(a5),d0
bra.s WiClp0
***********************************************************
* GESTION DU CURSEUR
***********************************************************
******* AffCur: affiche le curseur si en route
AffCur: btst #1,WiSys(a5)
beq.s AfCFin
movem.l d0-d7/a0-a3,-(sp)
lea WiCuDraw(a5),a0
move.l a0,d6
lea EcCurS(a4),a1
lea EcCurrent(a4),a3
move.l WiAdCur(a5),d2
move.w WiCuCol(a5),d5
move.w WiNPlan(a5),d4
move.w EcTLigne(a4),d3
ext.l d3
; Affiche NORMAL
AfC1: move.l d6,a0
move.l (a3)+,a2
add.l d2,a2
moveq #7,d1
lsr.w #1,d5
bcs.s AfC3
AfC2: move.b (a2),(a1)+ ;Sauve
move.b (a0)+,d0
not.b d0
and.b d0,(a2)
add.l d3,a2
dbra d1,AfC2
bra.s AfC4
AfC3: move.b (a2),(a1)+
move.b (a0)+,d0
or.b d0,(a2)
add.l d3,a2
dbra d1,AfC3
AfC4: dbra d4,AfC1
movem.l (sp)+,d0-d7/a0-a3
AfCFin: rts
******* EffCur: efface le curseur si en route
EffCur: btst #1,WiSys(a5)
beq.s EfCFin
movem.l d3-d7/a0-a2,-(sp)
lea EcCurS(a4),a0
move.w WiNPlan(a5),d6
move.w EcTLigne(a4),d5
ext.l d5
move.l WiAdCur(a5),d4
lea EcCurrent(a4),a2
; Efface NORMAL
EfC1: move.l (a2)+,a1
add.l d4,a1
moveq #7,d3
EfC2: move.b (a0)+,(a1)
add.l d5,a1
dbra d3,EfC2
dbra d6,EfC1
movem.l (sp)+,d3-d7/a0-a2
EfCFin: rts
***********************************************************
* WINDOPEN
* D1= # de fenetre
* D2= X
* D3= Y
* D4= TX
* D5= TY
* D6= Flags / 0=Faire un CLW
* D7= 0 / # de bordure
* A1= # du jeu de caracteres
***********************************************************
WOpen: movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
; Demande de la place memoire
move.l #WiLong,d0
bsr FastMm
bne.s Wo0
moveq #1,d0
bra WOut
Wo0: move.l a5,a3
move.l d0,a5
lea Circuits,a6
; Fenetre deja ouverte?
bsr WindFind
beq WErr2
move.w d1,WiNumber(a5)
move.w EcNPlan(a4),d0
subq.w #1,d0
move.w d0,WiNPlan(a5)
move.w #8,WiTyCar(a5)
* Jeu de caractere
move.l a1,d0
bne WErr5
move.l T_JeuDefo(a3),WiFont(a5)
lsr.w #4,d2
lsl.w #1,d2
cmp.w #16,d7
bhi WErr7
move.w d7,WiBord(a5)
beq.s Wo2
addq.w #1,d2
* Va tout calculer!
Wo2 bsr WiAdr
bne WErr
* Init parametres
clr.w WiSys(a5)
clr.w WiEsc(a5)
moveq #0,d1 ;Writing 0
bsr Writing
move.l EcWindow(a4),d0
beq.s Wo3a
* Une fenetre ouverte: reprend les parametres
move.l d0,a0
move.w WiPaper(a0),WiPaper(a5)
move.w WiPen(a0),WiPen(a5)
move.w WiCuCol(a0),WiCuCol(a5)
move.w WiBorPap(a0),WiBorPap(a5)
move.w WiBorPen(a0),WiBorPen(a5)
move.w WiTab(a0),WiTab(a5)
bra.s Wo4
* Aucune fenetre ouverte: parametre par defaut
Wo3a: move.w #1,WiPaper(a5) ;Paper=1 / Pen=2
move.w #2,WiPen(a5)
move.w #3,WiCuCol(a5)
move.w #4,WiTab(a5)
move.w #1,WiBorPap(a5)
move.w #2,WiBorPen(a5)
cmp.w #1,EcNPlan(a4) ;Si 1 plan
bne.s Wo4
clr.w WiPaper(a5) ;Paper=0 / Pen=1
move.w #1,WiPen(a5)
move.w #1,WiCuCol(a5)
clr.w WiBorPap(a5)
move.w #1,WiBorPen(a5)
Wo4: bsr AdColor
moveq #1,d1 ;Scrollings
bsr Scroll
* Stocke (s'il faut!) la fenetre courante
move.l EcWindow(a4),d0
beq.s Wo5
move.l a5,-(sp)
move.l d0,a5
bsr EffCur
bsr WiStore
move.l (sp)+,a5
Wo5:
* Bordure: Pas de titre
clr.w WiTitH(a5)
clr.w WiTitB(a5)
tst.w WiBord(a5)
beq.s PaBor
bsr DesBord
PaBor:
* Effacement de l'interieur
bsr WiInt
btst #0,d6
beq.s .Skip
bsr Clw
.Skip bsr Home
* Initialisation du curseur nouvelle fenetre
lea DefCurs(pc),a0
lea WiCuDraw(a5),a1
moveq #7,d0
InCu: move.b (a0)+,(a1)+
dbra d0,InCu
bset #1,WiSys(a5)
bsr AffCur
* Premiere fenetre de l'ecran / Fenetre courante
move.l EcWindow(a4),d0
move.l a5,EcWindow(a4)
clr.l WiPrev(a5)
move.l d0,WiNext(a5)
beq WOk
move.l d0,a0
move.l a5,WiPrev(a0)
bra WOk
******* Calcul des adresses fenetres!
WiAdr: move.w d2,WiDxR(a5)
move.w d2,WiDxI(a5)
move.w d3,WiDyI(a5)
* Controle largeur
and.w #$FFFE,d4 * Taille en X paire
beq WAdE3
move.w d2,d0
add.w d4,d0
cmp.w EcTLigne(a4),d0
bhi WAdE4
move.w d0,WiFxR(a5)
* Controle hauteur
move.w WiTyCar(a5),d1
move.w EcTLigne(a4),d0
mulu d1,d0
move.w d0,WiTLigne(a5)
move.w d5,d0
beq WAdE3
mulu d1,d0
move.w d0,WiTyP(a5)
move.w d3,WiDyR(a5)
add.w d3,d0
move.w d0,WiFyR(a5)
mulu EcTLigne(a4),d0
cmp.l EcTPlan(a4),d0
bhi WAdE4
mulu EcTLigne(a4),d3
add.w d2,d3
move.l d3,WiAdhgR(a5)
move.w d4,WiTxR(a5)
move.w d5,WiTyR(a5)
tst.w WiBord(a5)
beq.s Wo3
addq.w #1,WiDxI(a5)
add.w d1,WiDyI(a5)
subq.w #2,d4
bmi WAdE3
beq WAdE3
subq.w #2,d5
bmi WAdE3
beq WAdE3
mulu EcTLigne(a4),d1
add.l d1,d3
addq.l #1,d3
Wo3: move.l d3,WiAdhgI(a5)
move.w d4,WiTxI(a5)
move.w d5,WiTyI(a5)
moveq #0,d0
rts
WAdE3: moveq #12,d0
rts
WAdE4: moveq #13,d0
rts
***********************************************************
* Activation de fenetre: WINDOW
***********************************************************
WQWind: movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
; Trouve l'adresse de la fenetre
bsr WindFind
bne WErr1
; Deja activee?
move.l WiPrev(a0),d0
beq.s QWiF
* Stocke le contenu de la fenetre courante
bsr EffCur
bsr WiStore
* Debranche la fenetre
move.l d0,a1
move.l WiNext(a0),a2
move.l a2,WiNext(a1)
cmp.l #0,a2
beq.s QWi1
move.l a1,WiPrev(a2)
QWi1:
* La met en premier
move.l EcWindow(a4),a1
move.l a0,EcWindow(a4)
clr.l WiPrev(a0)
move.l a1,WiNext(a0)
move.l a0,WiPrev(a1)
move.l a0,a5
move.w WiDyR(a5),d6
move.w WiFyR(a5),d7
bsr WiEff * Redessine
bsr WiEffBuf * Plus besoin de buffer
* Plus d'escape!
bsr AffCur
QWiF clr.w WiEsc(a5)
* Pas d'erreur
WOk: movem.l (sp)+,d1-d7/a1-a6
* clr.w T_WiRep(a5)
moveq #0,d0
rts
* Erreur 1
QWErr1: bsr EffCur
bra WErr1
WOut: movem.l (sp)+,d1-d7/a1-a6
tst.l d0
rts
***********************************************************
* WIND MOVE change la position de la fenetre
***********************************************************
WiMove: movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
tst.w WiNumber(a5)
bne.s WiMv0
moveq #18,d0
bra.s WOut
* Stocke le contenu de la fenetre courante
WiMv0: bsr EffCur
bsr WiStore
move.w WiDyR(a5),d6
move.w WiFyR(a5),d7
* Redessine les autres fenetres
move.l WiNext(a5),d0
beq.s WiMv2
move.l a5,-(sp)
move.l d0,a3
move.l WiPrev(a3),d3
clr.l WiPrev(a3)
WiMv1: move.l d0,a5 * Redessine toutes les autres
bsr WiEff
move.l WiNext(a5),d0
bne.s WiMv1
move.l d3,WiPrev(a3)
move.l (sp)+,a5
* Change les coordonnees
WiMv2: move.w d1,d0
lsr.w #4,d0
lsl.w #1,d0
tst.w WiBord(a5)
beq.s WiMv2a
addq.w #1,d0
WiMv2a: move.w d2,d1
move.w WiDxR(a5),d2
move.w WiDyR(a5),d3
move.w WiTxR(a5),d4
move.w WiTyR(a5),d5
movem.w d2-d5,-(sp)
move.l #EntNul,d7
cmp.l d7,d0
bne.s WiMv3
move.w WiDxR(a5),d0
WiMv3: cmp.l d7,d1
bne.s WiMv4
move.w WiDyR(a5),d1
WiMv4: move.w d0,d2
move.w d1,d3
bsr WiAdr
beq.s WiMv5
movem.w (sp)+,d2-d5
move.l d0,-(sp)
bsr WiAdr
bra.s WiMv6
WiMv5: addq.l #8,sp
clr.l -(sp)
* Redessine la fenetre
WiMv6: bsr WiInt
bsr AdCurs
moveq #0,d6
move.w #10000,d7
bsr WiEff
bsr WiEffBuf
bsr AffCur
move.l (sp)+,d0
bra WOut
***********************************************************
* WIND SIZE change la taille de la fenetre
***********************************************************
WiSize: movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
tst.w WiNumber(a5)
bne.s WiSi0
moveq #18,d0
bra WOut
* Stocke le contenu de la fenetre courante
WiSi0: bsr EffCur
bsr WiStore
move.w WiTxR(a5),d6
move.w WiTyP(a5),d7
clr.w -(sp)
movem.w d6-d7,-(sp)
* Redessine les autres fenetres
move.w WiDyR(a5),d6
move.w WiFyR(a5),d7
move.l WiNext(a5),d0
beq.s WiSi2
move.l a5,-(sp)
move.l d0,a3
move.l WiPrev(a3),d3
clr.l WiPrev(a3)
WiSi1: move.l d0,a5 * Redessine toutes les autres
bsr WiEff
move.l WiNext(a5),d0
bne.s WiSi1
move.l d3,WiPrev(a3)
move.l (sp)+,a5
* Change les coordonnees
WiSi2: move.w d1,d0
move.w d2,d1
move.w WiDxR(a5),d2
move.w WiDyR(a5),d3
move.w WiTxR(a5),d4
move.w WiTyR(a5),d5
movem.w d2-d5,-(sp)
move.l #EntNul,d7
cmp.l d7,d0
bne.s WiSi3
move.w WiTxR(a5),d0
WiSi3: cmp.l d7,d1
bne.s WiSi4
move.w WiTyR(a5),d1
WiSi4: move.w d0,d4
move.w d1,d5
bsr WiAdr
beq.s WiSi5
movem.w (sp)+,d2-d5
move.w d0,4(sp)
bsr WiAdr
bra.s WiSi6
WiSi5: addq.l #8,sp
* Redessinne la fenetre
WiSi6: bsr WiInt
bsr AdCurs
lea Circuits,a6
tst.w WiBord(a5)
beq.s WiSi7
bsr DesBord
WiSi7: bsr Clw
movem.w (sp)+,d6-d7
bsr WiEff2
bsr WiEffBuf
bsr AffCur
move.w (sp)+,d0
ext.l d0
bra WOut
******* BORDER n,pen,paper
WSBor: movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
cmp.l #EntNul,d1
beq.s Wsb1
cmp.l #16,d1
bcc WErr7
tst.w d1
beq.s Wsb1
move.w d1,WiBord(a5)
Wsb1: cmp.l #EntNul,d2
beq.s Wsb2
cmp.w EcNbCol(a4),d2
bcc WErr7
move.w d2,WiBorPap(a5)
Wsb2: cmp.l #EntNul,d3
beq.s Wsb3
cmp.w EcNbCol(a4),d3
bcc WErr7
move.w d3,WiBorPen(a5)
Wsb3: bsr ReBord
bra WOk
******* TITLE D1/D2
WSTit: movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
tst.w WiBord(a5)
beq WErr10
tst.l d1
beq.s WTi1
move.l d1,a0
lea WiTitH(a5),a1
bsr ssWti
WTi1: tst.l d2
beq.s WTi2
move.l d2,a0
lea WiTitB(a5),a1
bsr ssWti
WTi2: bsr ReBord
bra WOk
* routine!
SsWti: moveq #78,d0
sWti1: move.b (a0)+,(a1)+
beq.s sWti2
dbra d0,sWti1
clr.b (a1)
sWti2: rts
******* WINDOW ADRESSE
WAdr: move.l T_EcCourant(a5),a0
move.l EcWindow(a0),a0
moveq #0,d1
move.w WiNumber(a0),d1
moveq #0,d0
rts
******* SET CURS a1
WiSCur: movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
bsr EffCur
lea WiCuDraw(a5),a2
moveq #7,d0
WiScu: move.b (a1)+,(a2)+
dbra d0,WiScu
bsr AffCur
bra WOk
******* Effacement de la fenetre courante
WDel: move.l T_EcCourant(a5),a0
move.l EcWindow(a0),a0
tst.w WiNumber(a0)
bne.s WiD1
moveq #18,d0
rts
WiD1: movem.l d1-d7/a1-a6,-(sp)
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),d0
move.l d0,a5
beq WErr1
bsr EffCur
lea Circuits,a6
bsr CClw
move.l WiNext(a5),-(sp)
moveq #-1,d5
move.w WiDyR(a5),d6 * Zone a clipper!
move.w WiFyR(a5),d7
* Enleve la table de donnees
move.l a5,a1
move.l #WiLong,d0
bsr FreeMm
* Branche la fenetre suivante
move.l (sp)+,a5
move.l a5,EcWindow(a4)
cmp.l #0,a5
beq WOk
clr.l WiPrev(a5)
* Redessine toutes les autres fenetres
move.l a5,-(sp)
bsr WiEff
bsr WiEffBuf
WiD2 move.l WiNext(a5),d0
beq.s WiD3
move.l d0,a5
bsr WiEff
bra.s WiD2
* Remet le curseur
WiD3: move.l (sp)+,a5
bsr AffCur
bra WOk
******* Effacement de toutes les fenetres
WiDelA: bsr WiD1
tst.l d0
beq.s WiDelA
moveq #0,d0
rts
******* CLS effacement de toutes les fenetres SAUF zero!
WiCls: movem.l d1-d7/a0-a6,-(sp)
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),d5
move.l d5,a5
bsr EffCur
WiCls1: move.l d5,a5
move.l WiNext(a5),d5
tst.w WiNumber(a5)
bne.s WiCls2
move.l a5,d7
bra.s WiCls3
WiCls2: bsr WiEffBuf
move.l #WiLong,d0
move.l a5,a1
bsr FreeMm
WiCls3: tst.l d5
bne.s WiCls1
move.l d7,a5
move.l a5,EcWindow(a4)
clr.l WiPrev(a5)
clr.l WiNext(a5)
lea Circuits,a6
bsr Clw
bsr WiEffBuf
bsr AffCur
movem.l (sp)+,d1-d7/a0-a6
moveq #0,d0
rts
******* Recherche la fenetre D1 dans les tables
WindFind:
move.l EcWindow(a4),d0
beq.s WiF2
WiF1: move.l d0,a0
cmp.w WiNumber(a0),d1
beq.s WiF3
move.l WiNext(a0),d0
bne.s WiF1
WiF2: moveq #1,d0
WiF3: rts
***********************************************************
* Dessine la bordure D1
***********************************************************
DesBord:movem.l d1-d7/a1-a6,-(sp)
tst.w WiBord(a5)
beq WErr10
move.w WiBord(a5),d1
lsl.w #1,d1
lea Brd(pc),a1
add.w -2(a1,d1.w),a1
bsr WiExt
; Dessine le haut!
bsr Home
lea WiTitH(a5),a2
bsr DHoriz
; Dessine la droite
move.w WiTx(a5),d1
subq.w #1,d1
moveq #1,d2
bsr Loca
bsr DVert
; Dessine le bas
moveq #0,d1
move.w WiTy(a5),d2
subq.w #1,d2
bsr Loca
lea WiTitB(a5),a2
bsr DHoriz
; Dessine la gauche
moveq #0,d1
moveq #1,d2
bsr Loca
bsr DVert
; Pas d'erreur
bsr WiInt
bra WOk
******* Re dessine le bord, remet le curseur!!!
ReBord move.w WiX(a5),-(sp)
move.w WiY(a5),-(sp)
move.l WiAdCur(a5),-(sp)
bsr DesBord
move.l (sp)+,WiAdCur(a5)
move.w (sp)+,WiY(a5)
move.w (sp)+,WiX(a5)
moveq #0,d0
rts
******* Dessine de la bordure HORIZONTALE
DHoriz:
; Fixe la fenetre pour les bords
bsr SetBord
; Position en Y
move.w WiY(a5),d2
; Dessine la gauche
Dh1: cmp.w WiY(a5),d2
bne.s Dh2
move.b (a1)+,d1
beq.s Dh3
bsr COut
bra.s Dh1
Dh2: move.l a1,a0
bsr Compte
move.l a0,a1
bsr CLeft
Dh3: move.w WiTx(a5),d6
sub.w WiX(a5),d6
; Dessine la droite
move.l a1,a0
bsr Compte
move.l a0,d3
move.w WiTx(a5),d7
sub.w d0,d7
bcc.s Dh10
clr.w d7
Dh10: cmp.w d6,d7
bcc.s Dh11
move.w d6,d7
Dh11: move.w d7,d1
bsr Loca
Dh12: cmp.w WiY(a5),d2
bne.s Dh13
move.b (a1)+,d1
beq.s Dh13
bsr COut
bra.s Dh12
Dh13: move.l d3,a1
; Dessine le milieu
move.l a1,d3
move.w d6,d1
bsr Loca
Dh20: move.w WiTx(a5),d0
sub.w WiX(a5),d0
cmp.w d7,d0
bcc.s Dh22
move.b (a1)+,d1
bne.s Dh21
move.l d3,a1
move.b (a1)+,d1
bne.s Dh21
subq.l #1,a1
moveq #32,d1
Dh21: bsr COut
bra.s Dh20
Dh22: move.l d3,a0
bsr Compte
move.l a0,a1
; Imprime la chaine de de caracteres (A2)
exg a2,a1
move.w d6,d1
bsr Loca
Dh30: move.w WiTx(a5),d0
sub.w WiX(a5),d0
cmp.w d7,d0
bcc.s Dh32
move.b (a1)+,d1
beq.s Dh32
bsr COut
bra.s Dh30
Dh32: exg a1,a2
; Fini! Restore
DhFin: bsr SetNorm
rts
******* Dessin bordure VERTICAL
DVert:
;-----> Fixe fenetre pour les bords
bsr SetBord
;-----> Dessine le bord
move.w WiTx(a5),d4
sub.w WiX(a5),d4
moveq #1,d2
move.w WiTyI(a5),d3
move.l a1,d5
DbV1: cmp.w d3,d2
bhi.s DbV3
move.w d4,d1
bsr Loca
move.b (a1)+,d1
bne.s DbV2
move.l d5,a1
move.b (a1)+,d1
bne.s DbV2
subq.l #1,a1
moveq #32,d1
DbV2: move.w WiX(a5),d6
bsr COut
cmp.w WiX(a5),d6 ;Boucle si code de controle
beq.s DbV1
addq.w #1,d2
bra.s DbV1
DbV3: move.l d5,a0
bsr Compte
move.l a0,a1
bsr SetNorm
rts
******* Scroll off / Ecriture normale
SetBord:move.l (sp)+,a3
move.w WiSys(a5),-(sp)
move.w WiFlags(a5),-(sp)
move.w WiPaper(a5),-(sp)
move.w WiPen(a5),-(sp)
movem.l a1/a2/a3,-(sp)
moveq #0,d1
bsr Scroll
move.w #-1,WiGraph(a5)
and.w #$0001,WiFlags(a5)
move.w WiBorPap(a5),WiPaper(a5)
move.w WiBorPen(a5),WiPen(a5)
bsr AdColor
movem.l (sp)+,a1/a2/a3
jmp (a3)
******* Retour fenetre normale
SetNorm:move.l (sp)+,a3
move.w (sp)+,WiPen(a5)
move.w (sp)+,WiPaper(a5)
move.w (sp)+,WiFlags(a5)
move.w (sp)+,WiSys(a5)
clr.w WiGraph(a5)
movem.l a1/a2/a3,-(sp)
bsr AdColor
movem.l (sp)+,a1/a2/a3
jmp (a3)
***********************************************************
* CLW D1 caracteres au curseur
***********************************************************
RazCur: cmp.w WiX(a5),d1
bcs.s RazC0a
move.w WiX(a5),d1
RazC0a subq.w #1,d1
bmi.s RazC3
move.l WiAdCur(a5),d0
lea EcCurrent(a4),a0
move.w WiNPlan(a5),d2
move.w EcTLigne(a4),d3
ext.l d3
move.w WiTyCar(a5),d4
subq.w #1,d4
lea WiColFl(a5),a3
move.l a4,-(sp)
RazC0: move.l a0,a1
move.l a3,a4
move.w d2,d5
RazC1: move.l (a1)+,a2
add.l d0,a2
move.w (a4)+,d7
addq.l #2,a4
move.w d4,d6
btst d5,WiSys+1(a5)
bne.s RazC2a
RazC2: move.b d7,(a2)
add.l d3,a2
dbra d6,RazC2
RazC2a: dbra d5,RazC1
addq.l #1,d0
dbra d1,RazC0
move.l (sp)+,a4
RazC3: moveq #0,d0
rts
***********************************************************
* CL TO END OF LINE (Vite!)
***********************************************************
ClEol: move.w WiX(a5),d3
move.l WiAdCur(a5),d0
btst #0,d0
beq.s ClEo1
movem.l d0/d3,-(sp)
moveq #1,d1
bsr RazCur
movem.l (sp)+,d0/d3
addq.l #1,d0
subq.w #1,d3
ClEo1 lea EcCurrent(a4),a0
move.w WiTyCar(a5),d2
tst.w d3
ble.s ClEo2
bsr ClFin
ClEo2 moveq #0,d0
rts
***********************************************************
* CLW of ALL window, even border!
***********************************************************
CClw: tst.w WiBord(a5)
beq.s Clw
clr.b WiTitH(a5)
clr.b WiTitB(a5)
move.w #16,WiBord(a5)
move.w WiPaper(a5),WiBorPap(a5)
bsr DesBord
***********************************************************
* CLW
***********************************************************
Clw: move.l WiAdhgI(a5),d0
lea EcCurrent(a4),a0
move.w WiTyCar(a5),d2
mulu WiTyI(a5),d2
move.w WiTxI(a5),d3
bsr ClFin
bra Home
***********************************************************
* CL LIGNE CURSEUR
***********************************************************
ClLine: move.w WiY(a5),d0
mulu WiTLigne(a5),d0
add.l WiAdhgI(a5),d0
lea EcCurrent(a4),a0
move.w WiTyCar(a5),d2
move.w WiTxI(a5),d3
; Fin de CLW
ClFin: subq.w #1,d2
lea WiColFl(a5),a1
move.w EcTLigne(a4),d1
ext.l d1
lsr.w #1,d3
lsl.w #6,d3
or.w #1,d3
move.w WiNPlan(a5),d4
bsr OwnBlit
move.w #%0000000110101010,BltCon0(a6)
clr.w BltCon1(a6)
clr.w BltModD(a6)
move.w #$8040,DmaCon(a6)
Clw1: move.w d4,d5
move.l a0,a2
move.l a1,a3
Clw2: btst d5,WiSys+1(a5)
bne.s .skip
bsr BlitWait
move.l (a2),d7
add.l d0,d7
move.l d7,BltAdD(a6)
move.w (a3),BltDatC(a6)
move.w d3,BltSize(a6)
.skip addq.l #4,a2
addq.l #4,a3
dbra d5,Clw2
add.l d1,d0
dbra d2,Clw1
bsr Blitwait
bsr DOwnBlit
moveq #0,d0
rts
***********************************************************
* SCROLLING VERS LA GAUCHE LIGNE CURSEUR
***********************************************************
ScGLine:move.w WiY(a5),d0
mulu WiTLigne(a5),d0
add.l WiAdhgI(a5),d0
lea EcCurrent(a4),a0
move.w WiTyCar(a5),d2
bra ScGFin
***********************************************************
* SCROLLING VERS LA GAUCHE DE TOUT L'ECRAN
***********************************************************
ScGWi: move.l WiAdhgI(a5),d0
lea EcCurrent(a4),a0
move.w WiTyCar(a5),d2
mulu WiTyI(a5),d2
; Fin de
ScGFin: subq.w #1,d2
lea WiColFl(a5),a1
move.w EcTLigne(a4),d1
ext.l d1
move.w WiTxI(a5),d3
lsr.w #1,d3
lsl.w #6,d3
or.w #1,d3
move.w WiNPlan(a5),d4
move.w WiTxI(a5),d6
subq.w #1,d6
move.l a4,-(sp)
bsr OwnBlit
move.w #%0000010111001100,BltCon0(a6)
move.w #%1000000000000000,BltCon1(a6)
clr.w BltModB(a6)
clr.w BltModD(a6)
move.w #$8040,DmaCon(a6)
ScG1: move.w d4,d5
move.l a0,a4
move.l a1,a3
ScG2: move.l (a4)+,a2
btst d5,WiSys+1(a5)
bne.s .skip
add.l d0,a2
move.l a2,BltAdD(a6) * Scrolle la ligne
move.b 1(a2),d7
lea 2(a2),a2
move.l a2,BltAdB(a6)
lea -2(a2),a2
move.w d3,BltSize(a6)
bsr BlitWait
move.b d7,(a2)
move.b (a3),0(a2,d6.w) * Efface le petit bout
.skip addq.l #4,a3
dbra d5,ScG2
add.l d1,d0
dbra d2,ScG1
bsr DOwnBlit
move.l (sp)+,a4
moveq #0,d0
rts
***********************************************************
* SCROLLING VERS LA DROITE LIGNE CURSEUR
***********************************************************
ScDLine:move.w WiY(a5),d0
mulu WiTLigne(a5),d0
add.l WiAdhgI(a5),d0
lea EcCurrent(a4),a0
move.w WiTyCar(a5),d2
bra ScDFin
***********************************************************
* SCROLLING VERS LA GAUCHE DE TOUT L'ECRAN
***********************************************************
ScDWi: move.l WiAdhgI(a5),d0
lea EcCurrent(a4),a0
move.w WiTyCar(a5),d2
mulu WiTyI(a5),d2
; Fin de
ScDFin: subq.w #1,d2
lea WiColFl(a5),a1
move.w EcTLigne(a4),d1
ext.l d1
move.w WiTxI(a5),d3
lsr.w #1,d3
lsl.w #6,d3
or.w #1,d3
move.w WiNPlan(a5),d4
move.l a4,-(sp)
bsr OwnBlit
move.w #%0000010111001100,BltCon0(a6)
move.w #%1000000000000000,BltCon1(a6)
clr.w BltModB(a6)
clr.w BltModD(a6)
move.w #$8040,DmaCon(a6)
ScD1: move.w d4,d5
move.l a0,a4
move.l a1,a3
ScD2: move.l (a4)+,a2
btst d5,WiSys+1(a5)
bne.s .skip
add.l d0,a2
move.l a2,BltAdB(a6)
move.l a2,BltAdD(a6) * Scrolle la ligne
move.w d3,BltSize(a6)
bsr BlitWait
move.b (a3),(a2)
.skip addq.l #4,a3
dbra d5,ScD2
add.l d1,d0
dbra d2,ScD1
bsr DOwnBlit
move.l (sp)+,a4
moveq #0,d0
rts
***********************************************************
* SCROLLING VERS LE HAUT DU BAS AU CURSEUR
***********************************************************
ScHautBas:
lea EcCurrent(a4),a2
move.w EcTLigne(a4),d0
ext.l d0
move.w WiTLigne(a5),d1
move.w WiY(a5),d2
mulu d1,d2
add.l WiAdhgI(a5),d2
move.l d2,a1 ;Destination
move.l d2,a0
add.w d1,a0 ;Source
; Va scroller
move.w WiTyI(a5),d1
sub.w WiY(a5),d1
subq.w #1,d1
mulu WiTyCar(a5),d1
bsr Scrolle
; Effacer la ligne du bas
move.w WiTyI(a5),d0
subq.w #1,d0
mulu WiTLigne(a5),d0
add.l WiAdhgI(a5),d0
lea EcCurrent(a4),a0
move.w WiTyCar(a5),d2
move.w WiTxI(a5),d3
bra ClFin
***********************************************************
* SCROLLING VERS LE BAS DU HAUT AU CURSEUR
***********************************************************
ScBasHaut:
lea EcCurrent(a4),a2
move.w EcTLigne(a4),d0
ext.l d0
move.w WiTLigne(a5),d1
move.w WiY(a5),d2
addq.w #1,d2
mulu d1,d2
sub.l d0,d2
add.l WiAdhgI(a5),d2
move.l d2,a1 ;Destination
move.l d2,a0
sub.w d1,a0 ;Source
neg.l d0 ;Delta ligne
; Va scroller
move.w WiY(a5),d1
mulu WiTYCar(a5),d1
bsr Scrolle
; Efface la ligne du haut
move.l WiAdhgI(a5),d0
lea EcCurrent(a4),a0
move.w WiTyCar(a5),d2
move.w WiTxI(a5),d3
bra ClFin
***********************************************************
* SCROLLING VERS LE HAUT A LA POSITION DU CURSEUR
***********************************************************
ScHaut: lea EcCurrent(a4),a2
move.w EcTLigne(a4),d0 ;Delta ligne= D0
ext.l d0
move.l WiAdhgI(a5),a1
move.l a1,a0
add.w WiTLigne(a5),a0 ;Source= A0
move.w WiY(a5),d1 ;Nb ligne= D1
mulu WiTyCar(a5),d1
bsr Scrolle
bra ClLine
***********************************************************
* SCROLLING VERS LE BAS A LA POSITION DU CURSEUR
***********************************************************
ScBas: lea EcCurrent(a4),a2
move.w EcTLigne(a4),d0
ext.l d0
move.w WiTLigne(a5),d1
move.w WiTyI(a5),d2
mulu d1,d2
sub.l d0,d2
add.l WiAdhgI(a5),d2
move.l d2,a1 ;Destination
move.l d2,a0
sub.w d1,a0 ;Source
neg.l d0 ;Delta ligne
move.w WiTyI(a5),d1
sub.w WiY(a5),d1
subq.w #1,d1
mulu WiTyCar(a5),d1
bsr Scrolle
bra ClLine
******* Fait le scrolling
Scrolle:subq.w #1,d1
bmi.s ScFin
move.l EcTPlan(a4),d2
move.w WiTxI(a5),d3
lsr.w #1,d3
lsl.w #6,d3
or.w #1,d3
move.w WiNPlan(a5),d4
bsr OwnBlit
move.w #%0000001110101010,BltCon0(a6)
clr.w BltCon1(a6)
clr.w BltModC(a6)
clr.w BltModD(a6)
move.w #$8040,DmaCon(a6)
Sc1: move.w d4,d5
move.l a2,a3
Sc2: btst d5,WiSys+1(a5)
bne.s .skip
bsr BlitWait
move.l (a3),d6
move.l d6,d7
add.l a0,d6
add.l a1,d7
move.l d6,BltAdC(a6)
move.l d7,BltAdD(a6)
move.w d3,BltSize(a6)
.skip addq.l #4,a3
dbra d5,Sc2
add.l d0,a0
add.l d0,a1
dbra d1,Sc1
bsr BlitWait
bsr DOwnBlit
; Va effacer la ligne du curseur
ScFin: rts
***********************************************************
* SCROLLING ON/OFF
***********************************************************
Scroll: bclr #0,WiSys(a5)
tst.w d1
beq.s Scl
bset #0,WiSys(a5)
Scl: moveq #0,d0
rts
***********************************************************
* FIXE LA COULEUR DU CURSEUR
***********************************************************
CurCol: cmp.w EcNbCol(a4),d1
bcc PErr7
move.w d1,WiCuCol(a5)
moveq #0,d0
rts
***********************************************************
* CURSEUR ON/OFF
***********************************************************
Curs: bclr #1,WiSys(a5)
tst.w d1
beq.s Cus
bset #1,WiSys(a5)
Cus: moveq #0,d0
rts
***********************************************************
* JEU NORMAL/JEU GRAPHIQUE
* D1=0 --> Normal / D1=1 --> Graphique
***********************************************************
ChgCar: move.w d1,WiGraph(a5)
moveq #0,d0
rts
***********************************************************
* SHADE on/off
* D1= faux / vrai
***********************************************************
Shade: bclr #1,WiFlags+1(a5)
tst.w d1
beq.s Sha
bset #1,WiFlags+1(a5)
Sha: moveq #0,d0
rts
***********************************************************
* UNDER on/off
* D1= faux / vrai
***********************************************************
Under: bclr #2,WiFlags+1(a5)
tst.w d1
beq.s Und
bset #2,WiFlags+1(a5)
Und: moveq #0,d0
rts
***********************************************************
* INVERSE on/off
* D1= faux / vrai
***********************************************************
Inv: tst.w d1
bne.s InvOn
; Inverse off
bclr #2,WiSys(a5)
beq.s InvF
bra.s Inv1
; Inverse on
InvOn: bset #2,WiSys(a5)
bne.s InvF
Inv1: move.w WiPaper(a5),d0
move.w WiPen(a5),WiPaper(a5)
move.w d0,WiPen(a5)
bsr AdColor
InvF: moveq #0,d0
rts
***********************************************************
* Set PAPER
* D1= paper
***********************************************************
Paper: cmp.w EcNbCol(a4),d1
bcc PErr7
bclr #2,WiSys(a5)
beq.s Pap1
move.w WiPaper(a5),WiPen(a5)
Pap1: move.w d1,WiPaper(a5)
bsr AdColor
moveq #0,d0
rts
***********************************************************
* Set PEN
* D1= pen
***********************************************************
Pen: cmp.w EcNbCol(a4),d1
bcc PErr7
bclr #2,WiSys(a5)
beq.s Pen1
move.w WiPen(a5),WiPaper(a5)
Pen1: move.w d1,WiPen(a5)
bsr AdColor
moveq #0,d0
rts
***********************************************************
* Set PLANES
* D1= planes
***********************************************************
Planes: moveq #0,d0
move.w WiNPlan(a5),d2
moveq #0,d3
.loop btst d3,d1
bne.s .skip
bset d2,d0
.skip addq.w #1,d3
dbra d2,.loop
move.b d0,WiSys+1(a5)
bsr AdColor
moveq #0,d0
rts
***********************************************************
* Curseur LEFT
***********************************************************
CLeft: move.w WiX(a5),d0
addq.w #1,d0
cmp.w WiTx(a5),d0
bhi.s CLt1
move.w d0,WiX(a5)
bsr AdCurs
moveq #0,d0
rts
CLt1: move.w #1,WiX(a5)
bra CUp
***********************************************************
* Curseur RIGHT
***********************************************************
CRight: subq.w #1,WiX(a5)
beq.s CRt1
bsr AdCurs
moveq #0,d0
rts
CRt1: move.w WiTx(a5),WiX(a5)
bra CDown
***********************************************************
* Curseur UP
***********************************************************
CUp: subq.w #1,WiY(a5)
bpl.s CUp1
btst #0,WiSys(a5)
bne.s CUp2
move.w WiTy(a5),d0
subq.w #1,d0
move.w d0,WiY(a5)
CUp1: bsr AdCurs
moveq #0,d0
rts
CUp2: clr.w WiY(a5)
bsr AdCurs
movem.l d2-d7/a1-a3,-(sp)
bsr ScBas
movem.l (sp)+,d2-d7/a1-a3
rts
***********************************************************
* Curseur DOWN
***********************************************************
CDown: move.w WiY(a5),d0
addq.w #1,d0
cmp.w WiTy(a5),d0
bcs.s Cdo1
btst #0,WiSys(a5)
bne.s Cdo2
clr.w d0
Cdo1: move.w d0,WiY(a5)
bsr AdCurs
moveq #0,d0
rts
Cdo2: movem.l d2-d7/a1-a3,-(sp)
bsr ScHaut
movem.l (sp)+,d2-d7/a1-a3
rts
***********************************************************
* A la ligne
***********************************************************
CReturn:move.w WiTx(a5),WiX(a5)
bsr AdCurs
moveq #0,d0
rts
***********************************************************
* Set TAB
***********************************************************
SetTab: cmp.w WiTx(a5),d1
bcc PErr7
move.w d1,WiTab(a5)
moveq #0,d0
rts
***********************************************************
* Next TAB
***********************************************************
Tab: move.w WiTx(a5),d0
sub.w WiX(a5),d0
move.w WiTab(a5),d1
beq.s Tab3
Tab1: cmp.w d0,d1
bhi.s Tab2
add.w WiTab(a5),d1
bra.s Tab1
Tab2: cmp.w WiTx(a5),d1
bcc.s Tab3
move.w WiY(a5),d2
bsr Loca
Tab3: moveq #0,d0
rts
***********************************************************
* Repeter
***********************************************************
Repete: move.l W_Base(pc),a3
tst.w T_WiRep(a3)
bne.s Rep2
; Demarrage du REPEAT
tst.w d1
bne.s Rep1
lea T_WiRepBuf(a3),a0
move.l a0,T_WiRepAd(a3)
addq.w #1,T_WiRep(a3)
move.w #1,WiEsc(a5)
Rep1: moveq #0,d0
rts
; Stockage,
Rep2: add.w #48,d1
lea T_WiRepBuf+WiRepL-1(a3),a0
move.l a0,d2
move.l T_WiRepAd(a3),a0
cmp.b #27,-2(a0)
bne.s Rep3
cmp.b #"R",-1(a0)
beq.s Rep5
Rep3: move.b d1,(a0)+
cmp.l d2,a0
bcc.s Rep4
move.l a0,T_WiRepAd(a3)
RepF: move.w #1,WiEsc(a5)
moveq #0,d0
rts
Rep4: lea 2(a0),a0
moveq #48+1,d1
Rep5: clr.b -2(a0)
move.w d1,d2
sub.w #49,d2
bpl.s Rep6
moveq #0,d2
Rep6: lea T_WiRepBuf(a3),a0
Rep7: move.b (a0)+,d1
beq.s Rep8
bsr COut
bra.s Rep7
Rep8: dbra d2,Rep6
; Fini!
clr.w T_WiRep(a3)
moveq #0,d0
rts
***********************************************************
* Fonction MEMORISER
***********************************************************
MemoCu: tst.w d1
beq.s MeX
cmp.w #1,d1
beq.s ReX
cmp.w #2,d1
beq.s MeY
cmp.w #3,d1
beq.s ReY
bra.s MemFin
* Memorise la position en X
MeX: move.w WiX(a5),WiMx(a5)
bra.s MemFin
* Restitue la position en X
ReX: move.w WiMx(a5),d0
beq.s MemFin
cmp.w WiTx(a5),d0
bhi.s MemFin
move.w d0,WiX(a5)
bsr AdCurs
bra.s MemFin
* Memorise la position en Y
MeY: move.w WiY(a5),WiMy(a5)
bra.s MemFin
* Restitue la position en Y
ReY: move.w WiMy(a5),d0
cmp.w WiTy(a5),d0
bcc.s MemFin
move.w d0,WiY(a5)
bsr AdCurs
* Fini!
MemFin: moveq #0,d0
rts
***********************************************************
* Mouvement relatif du curseur
***********************************************************
DecaX: add.w #48,d1
sub.b #128,d1
ext.w d1
move.w WiTx(a5),d0
sub.w WiX(a5),d0
add.w d0,d1
bra LocaX
DecaY: add.w #48,d1
sub.b #128,d1
ext.w d1
add.w WiY(a5),d1
bra LocaY
***********************************************************
* Fonction ZONES
***********************************************************
WiZone: tst.b d1
bne.s WiZ
; CODE 0 ---> stocke X et Y
move.w WiTx(a5),d0
sub.w WiX(a5),d0
move.w d0,WiZoDX(a5)
move.w WiY(a5),WiZoDY(a5)
moveq #0,d0
rts
; CODE <>0 ---> stocke dans les zones
WiZ: move.w d1,-(sp)
bsr CLeft
move.w (sp)+,d1
and.w #$FF,d1
move.w WiZoDx(a5),d2
move.w WiZoDy(a5),d3
move.w WiTx(a5),d4
sub.w WiX(a5),d4
move.w WiY(a5),d5
addq.w #1,d5
lsl.w #3,d2
lsl.w #3,d4
add.w #7,d4
mulu WiTyCar(a5),d3
mulu WiTyCar(a5),d5
move.w WiDxI(a5),d0
lsl.w #3,d0
add.w d0,d2
add.w d0,d4
add.w WiDyI(a5),d3
add.w WiDyI(a5),d5
move.l a5,-(sp)
move.l W_Base(pc),a5
bsr SySetZ
move.l (sp)+,a5
move.l d0,-(sp)
bsr CRight
move.l (sp)+,d0
rts
***********************************************************
* Fonction ENCADRER
***********************************************************
Encadre:move.l W_Base(pc),a3
tst.b d1
bne.s Enc
; CODE 0 ---> stocke X et Y
move.w WiTx(a5),d0
sub.w WiX(a5),d0
move.w d0,T_WiEncDX(a3)
move.w WiY(a5),T_WiEncDY(a3)
moveq #0,d0
rts
; CODE <>0 ---> encadre
Enc: move.w WiX(a5),-(sp)
move.w WiY(a5),-(sp)
move.w #-1,WiGraph(a5)
and.w #7,d1 ;Pointe la bordure
lsl.w #3,d1
lea TEncadre(pc),a2
lea -8(a2,d1.w),a2
move.w WiTx(a5),d3 ;TX
sub.w WiX(a5),d3
sub.w T_WiEncDX(a3),d3
bmi EncFin
subq.w #1,d3
move.w WiY(a5),d4 ;TY
sub.w T_WiEncDY(a3),d4
bmi EncFin
move.w T_WiEncDX(a3),d1
move.w T_WiEncDY(a3),d2
bsr Loca
; Coin superieur gauche
bsr CLeft
bsr CUp
move.b (a2)+,d1
bsr COut
; Montant haut
move.b (a2)+,d1
move.w d3,d5
bmi.s Enc4
Enc3: bsr COut
dbra d5,Enc3
; Coin superieur droit
Enc4: move.b (a2)+,d1
bsr COut
bsr CLeft
bsr CDown
; Montant droit
move.w d4,d5
bmi.s Enc6
Enc5: move.b (a2),d1
bsr Cout
bsr CLeft
bsr CDown
dbra d5,Enc5
Enc6: addq.l #1,a2
; Coin inferieur droit
move.b (a2)+,d1
bsr COut
bsr CLeft
bsr CLeft
; Montant inferieur
move.w d3,d5
bmi.s Enc8
Enc7: move.b (a2),d1
bsr Cout
bsr CLeft
bsr CLeft
dbra d5,Enc7
Enc8: addq.l #1,a2
; Coin inferieur gauche
move.b (a2)+,d1
bsr COut
bsr CLeft
bsr CUp
; Montant gauche
move.w d4,d5
bmi.s Enc10
Enc9: move.b (a2),d1
bsr Cout
bsr CLeft
bsr CUp
dbra d5,Enc9
Enc10:
; Restore X et Y / Jeu de caracteres
EncFin: clr.w WiGraph(a5)
move.w (sp)+,WiY(a5)
move.w (sp)+,WiX(a5)
bsr AdCurs
moveq #0,d0
rts
***********************************************************
* HOME
***********************************************************
Home: move.w WiTx(a5),WiX(a5)
clr.w WiY(a5)
bsr AdCurs
moveq #0,d0
rts
***********************************************************
* XY WINDOW courant
***********************************************************
WiXYWi: move.l T_EcCourant(a5),a0
move.l EcWindow(a0),a0
moveq #0,d1
moveq #0,d2
move.w WiSys(a0),d0
move.w WiTx(a0),d1
move.w WiTy(a0),d2
rts
***********************************************************
* XYCURS
***********************************************************
WiXYCu: move.l T_EcCourant(a5),a0
move.l EcWindow(a0),a0
moveq #0,d1
moveq #0,d2
move.w WiTx(a0),d1
sub.w WiX(a0),d1
move.w WiY(a0),d2
moveq #0,d0
rts
***********************************************************
* XYGRAPHIC
***********************************************************
WiXGr: move.l T_EcCourant(a5),a0
move.l EcWindow(a0),a0
cmp.w WiTx(a0),d1
bcc.s WiXYo
add.w WiDxI(a0),d1
lsl.w #3,d1
ext.l d1
moveq #0,d0
rts
WiYGr: move.l T_EcCourant(a5),a0
move.l EcWindow(a0),a0
cmp.w WiTy(a0),d1
bcc.s WiXYo
lsl.w #3,d1
add.w WiDyI(a0),d1
ext.l d1
moveq #0,d0
rts
WiXYo: moveq #-1,d1
rts
***********************************************************
* Locate X= D1
***********************************************************
LocaX: move.w WiY(a5),d2
bra.s Loca
***********************************************************
* Locate Y= D1
***********************************************************
LocaY: move.w d1,d2
move.w WiTx(a5),d1
sub.w WiX(a5),d1
bra.s Loca
***********************************************************
* Locate D1/D2
***********************************************************
WLocate:movem.l a4-a6,-(sp)
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
tst.w EcAuto(a4)
bne.s WLo3
bsr RLoca
WLoX movem.l (sp)+,a4-a6
tst.l d0
rts
* Autoback
WLo3 lea RLoca(pc),a0
bsr AutoPrt
bra.s WLoX
* Routine locate
RLoca: bsr EffCur
cmp.l #EntNul,d1
bne.s WLo1
move.w WiTx(a5),d1
sub.w WiX(a5),d1
WLo1: cmp.l #EntNul,d2
bne.s WLo2
move.w WiY(a5),d2
WLo2: bsr Loca
bra AffCur
Loca: cmp.w WiTy(a5),d2
bcc PErr7
move.w WiTx(a5),d0
sub.w d1,d0
bls PErr7
move.w d0,WiX(a5)
move.w d2,WiY(a5)
move.l d2,-(sp)
move.w d2,WiY(a5)
mulu WiTLigne(a5),d2
move.w d1,d0
ext.l d0
add.l d0,d2
add.l WiAdhg(a5),d2
move.l d2,WiAdCur(a5)
move.l (sp)+,d2
moveq #0,d0
rts
***********************************************************
* CHR OUT
***********************************************************
WOutC: movem.l a4-a6,-(sp)
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
lea Circuits,a6
bsr EffCur
bsr COut
bsr AffCur
movem.l (sp)+,a4-a6
tst.l d0
rts
***********************************************************
* IMPRESSION LIGNE Scrollee <EFBFBD> gauche
* A1= Ligne, finie par zero
* D1= Nombre de caracteres <EFBFBD> sauter sur la gauche
* Bit 31= code controle?
* D2= Position minimum <EFBFBD> gauche
* D3= Position maximum <EFBFBD> droite
***********************************************************
WPrint3 movem.l a4-a6/d2-d7,-(sp)
lea Circuits,a6
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
bsr EffCur
move.w WiTx(a5),d5
sub.w WiX(a5),d5
move.w d3,d4
move.w d2,d3
move.l d1,d2
; Impression
.Loop move.b (a1)+,d1
beq.s .Ok
cmp.b #32,d1
bcs.s .Cont
; Un code normal, l'imprimer?
subq.w #1,d2
bge.s .Skip
cmp.w d3,d5
blt.s .Skip0
cmp.w d4,d5
bge.s .Ok
bsr COut
bne .Err
.Skip0 addq.w #1,d5
.Skip bra.s .Loop
; Codes de controle autorises?
.Cont cmp.b #9,d1 TAB?
beq.s .Cont1
tst.l d2
bpl.s .PaCont
cmp.b #27,d1
bne.s .Cont1
bsr COut
move.b (a1)+,d1
bsr COut
move.b (a1)+,d1
.Cont1 bsr COut
bra.s .Loop
.PaCont cmp.b #27,d1
bne.s .Loop
addq.l #2,a1
bra.s .Loop
; Fini!
.Ok moveq #0,d0
move.w d5,d1
.Err bsr AffCur
movem.l (sp)+,a4-a6/d2-d7
tst.w d0
rts
***********************************************************
* PRINT LINE,
* A1= adresse chaine D1= nombre caracteres
***********************************************************
WPrint2 movem.l a4-a6,-(sp)
lea Circuits,a6
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
tst.w EcAuto(a4)
bne.s .WPrt
* Pas autoback!
movem.l a1/d1/d2,-(sp)
bsr.s .RPrt
movem.l (sp)+,a1/d1/d2
movem.l (sp)+,a4-a6
tst.l d0
rts
* AutoBack!
.WPrt lea .RPrt(pc),a0
bsr AutoPrt
movem.l (sp)+,a4-a6
tst.l d0
rts
******* Routine print nb caracteres
.RPrt bsr EffCur
move.w d1,d2
subq.w #1,d2
bmi.s .Out
.Prt move.b (a1)+,d1
bsr COut
tst.w d0
bne.s .Out
dbra d2,.Prt
.Out bra AffCur
***********************************************************
* PRINT LINE, finie par ZERO
* A1= adresse chaine
***********************************************************
WPrint: movem.l a4-a6,-(sp)
lea Circuits,a6
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
tst.w EcAuto(a4)
bne.s WPrt
* Pas autoback!
movem.l a1/d1,-(sp)
bsr RPrt
movem.l (sp)+,a1/d1
movem.l (sp)+,a4-a6
tst.l d0
rts
* AutoBack!
WPrt lea RPrt(pc),a0
bsr AutoPrt
movem.l (sp)+,a4-a6
tst.l d0
rts
******* Routine print normale
RPrt: bsr EffCur
Prt: move.b (a1)+,d1
beq AffCur
bsr COut
tst.w d0
beq.s Prt
bra AffCur
******* Routine print avec autoback
* A0= routine a appeler
AutoPrt movem.l a0-a2/d1-d7,-(sp)
btst #BitDble,EcFlags(a4)
beq.s WPrt5
* Double buffer!
lea WiAuto(pc),a1
lea EcCurS(a5),a0
moveq #(8*6)/4-1,d0
WPrt1 move.l (a0)+,(a1)+
dbra d0,WPrt1
move.l a5,a0
moveq #WiSAuto/4-1,d0
WPrt2 move.l (a0)+,(a1)+
dbra d0,WPrt2
bsr TAbk1
movem.l (sp),a0-a2/d1-d7
jsr (a0)
lea WiAuto(pc),a0
lea EcCurS(a5),a1
moveq #(8*6)/4-1,d0
WPrt3 move.l (a0)+,(a1)+
dbra d0,WPrt3
move.l a5,a1
moveq #WiSAuto/4-1,d0
WPrt4 move.l (a0)+,(a1)+
dbra d0,WPrt4
bsr TAbk2
movem.l (sp),a0-a2/d1-d7
jsr (a0)
move.l d0,-(sp)
bsr TAbk3
move.l (sp)+,d0
movem.l (sp)+,a0-a2/d1-d7
rts
* Single buffer
WPrt5 bsr TAbk1
movem.l (sp),a0-a2/d1-d7
jsr (a0)
move.l d0,-(sp)
bsr TAbk4
move.l (sp)+,d0
movem.l (sp)+,a0-a2/d1-d7
rts
***********************************************************
* CENTRE chaine, finie par ZERO
* A1= adresse chaine
***********************************************************
WCentre:movem.l a4-a6,-(sp)
lea Circuits,a6
move.l T_EcCourant(a5),a4
move.l EcWindow(a4),a5
move.l a1,a0
bsr Compte
move.w WiTx(a5),d1
sub.w d0,d1
lsr.w #1,d1
tst.w EcAuto(a4)
bne.s ABCen
* Pas autob
bsr EffCur
bsr LocaX
bsr Prt
movem.l (sp)+,a4-a6
tst.w d0
rts
* Autob
ABCen lea CPrt(pc),a0
bsr AutoPrt
movem.l (sp)+,a4-a6
tst.w d0
rts
CPrt: bsr EffCur
bsr LocaX
bra Prt
******* Calcul de l'adresse curseur
AdCurs: move.w WiY(a5),d0
mulu WiTLigne(a5),d0
move.w WiTx(a5),d1
sub.w WiX(a5),d1
ext.l d1
add.l d1,d0
add.l WiAdhg(a5),d0
move.l d0,WiAdCur(a5)
rts
******* Mode INTERIEUR
WiInt: move.w WiTxI(a5),WiTx(a5)
move.w WiTyI(a5),WiTy(a5)
move.l WiAdhgI(a5),WiAdhg(a5)
rts
******* Mode EXTERIEUR
WiExt: move.w WiTxR(a5),WiTx(a5)
move.w WiTyR(a5),WiTy(a5)
move.l WiAdhgR(a5),WiAdhg(a5)
rts
******* Compte la chaine de caracteres A0
* D0 compte les caracteres IMPRIMES
* A0 pointe la fin
Compte: clr.w d0
Copt1: tst.b (a0)
beq.s Copt2
addq.w #1,d0
cmp.b #27,(a0)+
bne.s Copt1
subq.w #1,d0
addq.l #2,a0
bra.s Copt1
Copt2: addq.l #1,a0
rts
******* Blitter termine?
BltFini:bra BlitWait
***********************************************************
* AFFICHAGE D'UN CARACTERE
* DANS L'ECRAN LOGIQUE
* - D1= caractere
* - A6= chips
* - A5= window
***********************************************************
COut: movem.l d1-d7/a0-a3,-(sp)
and.w #255,d1
******* Mode escape?
tst.w WiEsc(a5)
bne Esc
******* Code de controle?
cmp.w #32,d1
bcs Cont
PaCont
******* Affiche!
lsl.w #3,d1 ;Pointe le caractere
move.l WiFont(a5),a2
add.w d1,a2
move.w WiNPlan(a5),d2 ;Nombre de plans
lea EcCurrent(a4),a1
move.l WiAdCur(a5),d3 ;Adresse du caractere
move.w EcTLigne(a4),d4
ext.l d4 ;Taille d'une ligne
move.w WiFlags(a5),d7 ;Flags d'ecriture
bne YaFlag
*-----* Pas de flag: rapide
moveq #-1,d6 ;Pour CUn
lea WiColor(a5),a0 ;Definition couleur
COut1: move.l (a0)+,a3
jmp (a3)
; Met a zero le plan
CZero: move.l (a1)+,a3
add.l d3,a3
REPT 7 ;Plan vide
clr.b (a3)
add.l d4,a3
ENDR
clr.b (a3)
dbra d2,COut1
bra COutFin
CNul: addq.l #4,a1
dbra d2,COut1
bra COutFin
; Poke le caractere NORMAL
CNorm: move.l (a1)+,a3
add.l d3,a3
REPT 7 ;Poke l'octet
move.b (a2)+,(a3)
add.l d4,a3
ENDR
move.b (a2),(a3)
subq.l #7,a2
dbra d2,COut1
bra COutFin
; Poke le caractere INVERSE
CInv: move.l (a1)+,a3
add.l d3,a3
REPT 7
move.b (a2)+,d0
not.b d0
move.b d0,(a3)
add.l d4,a3
ENDR
move.b (a2),d0
not.b d0
move.b d0,(a3)
subq.l #7,a2
dbra d2,COut1
bra COutFin
; Poke du blanc
CUn: move.l (a1)+,a3
add.l d3,a3
REPT 7
move.b d6,(a3)
add.l d4,a3
ENDR
move.b d6,(a3)
dbra d2,COut1
;****** Un cran a droite
COutFin:addq.l #1,WiAdCur(a5)
subq.w #1,WiX(a5)
bne.s COutS3
; A la ligne
move.w WiTx(a5),WiX(a5)
move.w WiY(a5),d0
addq.w #1,d0
cmp.w WiTy(a5),d0
bcs.s COutS2
btst #0,WiSys(a5) ;Scroll ON?
beq.s COutS1
; Scrolle!
bsr AdCurs
bsr ScHaut
bra.s COutS3
; Pas scrolle
COutS1: clr.w d0
COutS2: move.w d0,WiY(a5)
bsr AdCurs
COutS3: moveq #0,d0
******* Fini
COutOut:movem.l (sp)+,d1-d7/a0-a3
rts
******* Il y a des flags
YaFlag: moveq #-1,d6
btst #1,d7 ;FLAG 1---> SHADE
beq.s YaF2
move.w #%1010101010101010,d6
YaF2: lea WiColFl(a5),a0
move.l a4,-(sp)
move.l d3,a3
btst #2,d7 ;FLAG 2---> souligne
bne.s YaS5
; Non souligne
YaF5: move.w (a0)+,d5
move.w (a0)+,d7
moveq #7,d3
move.l (a1)+,a4
add.l a3,a4
btst d2,WiSys+1(a5)
bne.s YaF6a
YaF6: move.b (a2)+,d0
and.b d6,d0
ror.w #1,d6
move.b d0,d1
not.b d0
and.b d5,d0
and.b d7,d1
WGet1: or.b d1,d0
WMod1: eor.b d0,(a4)
add.l d4,a4
dbra d3,YaF6
lea -8(a2),a2
YaF6a: dbra d2,YaF5
move.l (sp)+,a4
bra COutFin
; Souligne
YaS5: move.w (a0)+,d5
move.w (a0)+,d7
moveq #6,d3
move.l (a1)+,a4
add.l a3,a4
btst d2,WiSys+1(a5)
bne.s YaS6a
YaS6: move.b (a2)+,d0
and.b d6,d0
ror.w #1,d6
move.b d0,d1
not.b d0
and.b d5,d0
and.b d7,d1
WGet2: or.b d1,d0
WMod2: eor.b d0,(a4)
add.l d4,a4
dbra d3,YaS6
; Souligne!
move.b d7,d0
and.b d6,d0
ror.w #1,d6
WMod3: eor.b d0,(a4)
lea -7(a2),a2
YaS6a: dbra d2,YaS5
move.l (sp)+,a4
bra COutFin
******* Codes de CONTROLE
Cont: tst.w WiGraph(a5)
bne PaCont
lsl.w #2,d1
lea CCont(pc),a0
jsr 0(a0,d1.w)
bra COutOut
******* ESCAPE en marche
;-----> Mise en marche ESC
EscM: move.w #2,WiEsc(a5)
moveq #0,d0
Rien: rts
;-----> ESC
Esc: subq.w #1,WiEsc(a5)
beq.s Esc1
move.w d1,WiEscPar(a5)
bra COutOut
Esc1: move.w WiEscPar(a5),d0
cmp.w #"Z",d0
bhi.s Esc2
sub.w #"A",d0
bcs.s Esc2
lsl.w #2,d0
lea CEsc(pc),a0
sub.w #"0",d1
jsr 0(a0,d0.w)
Esc2: movem.l (sp)+,d1-d7/a0-a3
tst.l d0
rts
***********************************************************
* MESSAGES D'ERREUR
***********************************************************
PErr7: moveq #16,d0
rts
WErr1: moveq #10,d0
bra.s WErr
WErr2: moveq #11,d0
bra.s WErr
WErr3: moveq #12,d0
bra.s WErr
WErr4: moveq #13,d0
bra.s WErr
WErr5: moveq #14,d0
bra.s WErr
WErr6: moveq #15,d0
bra.s WErr
WErr7: moveq #16,d0
bra.s WErr
WErr8: moveq #1,d0
bra.s WErr
WErr10: moveq #19,d0
* Erreurs generales
WErr: move.l d0,-(sp)
cmp.l EcWindow(a4),a5
beq.s WErF
cmp.l #0,a5
beq.s WErF
move.l a5,a1
move.l #WiLong,d0
bsr FreeMm
WErF: move.l (sp)+,d0
movem.l (sp)+,d1-d7/a1-a6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; AMOS REQUESTER ROUTINES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Req_WY equ 100
T_Tit equ 0
T_Text equ T_Tit+80
T_Gad equ T_Text+320
T_Size equ T_Gad+128
; Set request ON / OFF
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
WRequest_OnOff
move.w d0,T_ReqFlag(a5)
rts
; - - - - - - - - - - - - -
AutoReq
; - - - - - - - - - - - - -
movem.l a0-a6/d0-d7,-(sp)
bsr Req_In
bpl.s .Skip
bsr Req_Auto
bra Req_AMOS
.Skip move.l T_PrevAuto(a5),T_ScAdr(a5)
bra.s Req_WB
; - - - - - - - - - - - - -
EasyReq
; - - - - - - - - - - - - -
movem.l a0-a6/d0-d7,-(sp)
bsr Req_In
bpl.s .Skip
bsr Req_Easy
bra Req_AMOS
.Skip move.l T_PrevEasy(a5),T_ScAdr(a5)
bra.s Req_WB
; Dispatch requester between AMOS/WB
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Req_In move.l W_Base(pc),a5
tst.b T_AMOSHere+1(a5) If AMOS / WB flipping running?
bne.s Req_ANo ...no requester at all!
tst.w T_ReqFlag(a5) Ou aller?
beq.s Req_ANo
bmi.s .AMOS
; System requester?
; ~~~~~~~~~~~~~~~~~
tst.b WB_Closed(a5) WB closed!
bne.s .AMOS
.WB moveq #1,d0
rts
; AMOS requester
; ~~~~~~~~~~~~~~
.AMOS tst.b T_AMOSHere(a5) AMOS here?
beq.s .WB
tst.w T_Req_On(a5) Requester already running?
bne.s Req_ANo Always no...
moveq #-1,d0
rts
; Always no!
; ~~~~~~~~~~~~~~~~
Req_ANo addq.l #4,sp
movem.l (sp)+,a0-a6/d0-d7
moveq #0,d0
rts
; WB requester
; ~~~~~~~~~~~~~~~~~~
Req_WB move.b T_AMOSHere(a5),d0 Is AMOS here?
ext.w d0
move.w d0,T_ReqOld(a5)
beq.s .skip1
EcCalD AMOS_WB,0 AMOS To BACK
.skip1 pea .ret(pc)
move.l T_ScAdr(a5),-(sp)
movem.l 8(sp),a0-a6/d0-d7
rts
.ret move.l W_Base(pc),a5
move.l d0,T_Req_Pos(a5)
move.l d0,(sp) en D0
move.w T_ReqOld(a5),d1
beq.s .skip2
EcCalD AMOS_WB,1 AMOS To FRONT
.skip2 movem.l (sp)+,a0-a6/d0-d7 Recupere Req_Pos
rts
; AMOS Normal requester
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
Req_AMOS
move.w #-1,T_Req_On(a5) Requester ON !
SyCall AMALFrz
bsr UnMix1
move.w T_Req_Sx(a5),d2
lsl.w #3,d2
ext.l d2
move.w T_Req_Sy(a5),d3
lsl.w #3,d3
ext.l d3
moveq #3,d4
move.l #$8000,d5
moveq #8,d6
moveq #0,d7
lea Req_Pal(pc),a1
EcCalD Cree,EcReq
bne NoReq
move.l a0,T_ScAdr(a5)
WiCalA Print,Req_Init(pc)
; Top
; ~~~
moveq #0,d0
moveq #0,d1
moveq #0,d2
moveq #0,d3
moveq #4,d4
moveq #3*8,d5
bsr Copy
moveq #4,d0
moveq #1,d4
move.w T_Req_Sx(a5),d6
.lp1 bsr Copy
subq.w #1,d6
cmp.w #9,d6
bcc.s .lp1
moveq #10,d0
moveq #4,d4
bsr Copy
; Middle
; ~~~~~~
moveq #3*8,d3
move.w T_Req_Sy(a5),d7
sub.w #6,d7
.lp2 moveq #0,d0
moveq #3*8,d1
moveq #0,d2
moveq #2,d4
moveq #12,d5
bsr Copy
moveq #6,d0
moveq #1,d4
move.w T_Req_Sx(a5),d6
.lp3 bsr Copy
subq.w #1,d6
cmp.w #5,d6
bcc.s .lp3
moveq #12,d0
moveq #2,d4
bsr Copy
addq.w #8,d3
subq.w #1,d7
bne.s .lp2
; Bottom
; ~~~~~~
moveq #0,d0
moveq #4*8+4,d1
moveq #0,d2
add.w #4,d3
moveq #1,d4
moveq #2*8+4,d5
bsr Copy
moveq #6,d0
moveq #1,d4
move.w T_Req_Sx(a5),d6
.lp4 bsr Copy
subq.w #1,d6
cmp.w #3,d6
bcc.s .lp4
moveq #13,d0
moveq #1,d4
bsr Copy
; Bottom Left
; ~~~~~~~~~~~
move.l T_Req_Pos(a5),a0
.lp5 tst.b (a0)+
bne.s .lp5
sub.l T_Req_Pos(a5),a0
move.w a0,d6
moveq #1,d0
moveq #4*8+4,d1
moveq #1,d2
moveq #2,d4
moveq #2*8,d5
bsr Copy
moveq #3,d0
moveq #1,d4
subq.w #3+1,d6
bmi.s .sk2
.lp6 bsr Copy
dbra d6,.lp6
.sk2 moveq #4,d0
moveq #2,d4
bsr Copy
; Bottom right
; ~~~~~~~~~~~~
move.l T_Req_Neg(a5),d0
move.l d0,a0
beq.s .sk1
.lp7 tst.b (a0)+
bne.s .lp7
sub.l T_Req_Neg(a5),a0
move.w a0,d6
move.w T_Req_Sx(a5),d0
sub.w a0,d0
add.b #48-1,d0
move.l a1,-(sp)
lea XTNeg(pc),a1
move.b d0,(a1)
move.l (sp)+,a1
moveq #8,d0
moveq #4*8+4,d1
move.w T_Req_Sx(a5),d2
sub.w d6,d2
subq.w #2,d2
moveq #2,d4
moveq #2*8,d5
bsr Copy
moveq #10,d0
moveq #1,d4
subq.w #3+1,d6
bmi.s .sk3
.lp8 bsr Copy
dbra d6,.lp8
.sk3 moveq #11,d0
moveq #2,d4
bsr Copy
.sk1
; End of init
; ~~~~~~~~~~~
SyCalD ResZone,2
move.w T_Req_Sy(a5),d0
lsl.w #3,d0
move.w d0,T_Req_Sy(a5)
; Initialise background text
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
WiCalA Centre,T_Tit(a4)
; Print main text
; ~~~~~~~~~~~~~~~
WiCalA Print,Req_Main(pc)
lea T_Text(a4),a1
.lop move.l a1,-(sp)
WiCall Centre
move.l (sp)+,a1
.lop1 tst.b (a1)+
bne.s .lop1
tst.b (a1)
bne.s .lop
; Positive text (left)
; ~~~~~~~~~~~~~~~~~~~~
moveq #1,d0
moveq #"0",d1
bsr PrtZone
; Negative text (right)
; ~~~~~~~~~~~~~~~~~~~~~
move.l T_Req_Neg(a5),d0
beq.s .NoNeg
move.l d0,a0
moveq #2,d0
moveq #"0",d1
bsr PrtZone
; Screen appearance
; ~~~~~~~~~~~~~~~~~
.NoNeg move.l T_ScAdr(a5),a2
move.w #288,d0
move.w T_Req_Sx(a5),d1
lsl.w #1,d1
sub.w d1,d0
move.w d0,EcAWX(a2)
bset #1,EcAW(a2)
moveq #8,d7
moveq #1,d6
move.w T_Req_Sy(a5),d5
lsr.w #1,d5
add.w #Req_WY,d5
bsr AppCentre
; State of disc drive
; ~~~~~~~~~~~~~~~~~~~
SyCall GetDisc
move.w d0,T_DOld(a5)
; Test loop (fun!)
; ~~~~~~~~~~~~~~~~~~~~~~
ReqLoop
bsr UnMix2
move.l a6,-(sp)
move.l T_GfxBase(a5),a6
jsr -270(a6) WaitTOF
move.l (sp)+,a6
bsr UnMix1
; Automatic disc change
; ~~~~~~~~~~~~~~~~~~~~~
move.l T_Req_IDCMP(a5),d0
btst #15,d0
beq.s NoAuto
SyCall GetDisc
cmp.w T_DOld(a5),d0
beq.s NoAuto
move.w d0,T_DOld(a5)
bne ReqYes
; Keyboard
; ~~~~~~~~
NoAuto SyCall Inkey
cmp.w #13,d1 * ASCII-> Return
beq.s ReqYes
cmp.w #27,d1 * ASCII-> ESC
beq.s ReqNo
; Don't you think it is better than this wierd Amiga V and B?
; Sometime I ask myself what they were thinking when they chose such
; key combinations!
swap d1
move.w d1,d0 * Isolate AMIGA keys
and.w #%1100000000000000,d0
beq.s RqL0
cmp.b #$34,d1 * V
beq.s ReqYes
cmp.b #$35,d1 * B
beq.s ReqNo
; Mouse pointer
; ~~~~~~~~~~~~~
RqL0 SyCall GetZone
cmp.w #EcReq,d1
beq.s RqL1
moveq #0,d1
RqL1: swap d1
cmp.w d7,d1
beq.s RqL2
move.w d7,d0
move.w d1,d7
moveq #"0",d1
bsr PrtZone
RqL2: move.w d7,d0
moveq #"1",d1
bsr PrtZone
tst.w d7
beq ReqLoop
SyCall MouseKey
tst.w d1
beq ReqLoop
cmp.w #2,d7
beq.s ReqNo
ReqYes moveq #-1,d0
bra.s ReqGo
ReqNo moveq #0,d0
; End of screen (well done!!!)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ReqGo move.l d0,-(sp)
move.l T_ScAdr(a5),a2
moveq #-8,d7
move.w EcTy(a2),d6
lsr.w #1,d6
move.w T_Req_Sy(a5),d5
lsr.w #1,d5
add.w #Req_WY,d5
bsr AppCentre
EcCalD Del,EcReq
; Back to system!
; ~~~~~~~~~~~~~~~~~~~~~
ReqX bsr UnMix2
bsr ClrData
SyCall AMALUFrz
move.l (sp)+,T_Req_Pos(a5) * Returns answer
clr.w T_Req_On(a5) * No more requester
; Normal exit
; ~~~~~~~~~~~
ReqXX move.l T_Req_Pos(a5),(sp) ReqPos>>> D0
movem.l (sp)+,a0-a6/d0-d7
rts
; Can't open screen!!!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
NoReq clr.l -(sp)
bra.s ReqX
; Print a zone D0-> zone, D1-> inverse or not
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PrtZone subq.w #1,d0
bmi.s PrtX
bne.s PrtNeg
; Print pos text
; ~~~~~~~~~~~~~~
PrtPos tst.l T_Req_Pos(a5)
beq.s .skip
lea TPos1(pc),a1
move.b d1,8(a1)
WiCall Print
move.l T_Req_Pos(a5),a1
WiCall Print
WiCalA Print,TPos2(pc)
.skip bra.s PrtX
; Print neg text
; ~~~~~~~~~~~~~~
PrtNeg tst.l T_Req_Neg(a5)
beq.s .skip
lea TNeg1(pc),a1
move.b d1,8(a1)
WiCall Print
move.l T_Req_Neg(a5),a1
WiCall Print
WiCalA Print,TNeg2(pc)
.skip
PrtX rts
; Screen appearance
; ~~~~~~~~~~~~~~~~~~~~~~~
AppCentre:
move.w d6,d4
move.w d6,EcAWTY(a2)
add.w d6,EcAWTY(a2)
bset #2,EcAWT(a2)
move.w EcTy(a2),d0
lsr.w #1,d0
sub.w d6,d0
move.w d0,EcAVY(a2)
bset #2,EcAV(a2)
move.w d5,EcAWY(a2)
sub.w d6,EcAWY(a2)
bset #2,EcAW(a2)
movem.l a2/d4-d7,-(sp)
SyCall WaitVbl
EcCall CopForce
movem.l (sp)+,a2/d4-d7
add.w d7,d6
bpl.s FsApp2
clr.w d6
FsApp2: move.w EcTy(a2),d0
lsr.w #1,d0
cmp.w d0,d6
bcs.s FsApp3
move.w d0,d6
FsApp3: cmp.w d4,d6
bne.s AppCentre
rts
; Prevent mixes between AMOS and the requester!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UnMix1 movem.l d0-d7/a0-a6,-(sp)
move.l $4.w,a6
jsr Forbid(a6)
EcCall Current
move.w EcNumber(a0),d1
move.w d1,T_ReqOldScreen(a5)
EcCalD Active,EcReq
EcCalD First,EcReq
EcCall CopMake
SyCall WaitVbl
movem.l (sp)+,d0-d7/a0-a6
rts
UnMix2 movem.l d0-d7/a0-a6,-(sp)
move.w T_ReqOldScreen(a5),d1
EcCall Active
move.l $4.w,a6
jsr Permit(a6)
movem.l (sp)+,d0-d7/a0-a6
rts
; Open TEXT data zone
; ~~~~~~~~~~~~~~~~~~~~~~~~~
ResData move.l #T_Size,d0
SyCall SyFast
move.l d0,a4
rts
; Clear TEXT data zone
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
ClrData move.l #T_Size,d0
move.l a4,a1
SyCall SyFree
rts
; WB1.3 requester entry
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
Req_Auto
bsr ResData
move.l #$00008000,T_Req_IDCMP(a5)
lsr.w #3,d2
addq.w #3,d2
and.w #$FFFC,d2
move.w d2,T_Req_Sx(a5)
lsr.w #3,d3
addq.w #2,d3
move.w d3,T_Req_Sy(a5)
move.l a1,a0
lea T_Text(a4),a1
moveq #10,d0
bsr IT_Print
clr.l T_Req_Pos(a5)
lea T_Gad(a4),a1
move.l a2,d0
move.l d0,a0
beq.s .skip1
move.l a1,T_Req_Pos(a5)
moveq #0,d0
bsr IT_Print
.skip1
clr.l T_Req_Neg(a5)
lea T_Gad+64(a4),a1
move.l a3,d0
move.l d0,a0
beq.s .skip2
move.l a1,T_Req_Neg(a5)
moveq #0,d0
bsr IT_Print
.skip2
lea Req_Tit(pc),a0
lea T_Tit(a4),a1
.loop move.b (a0)+,(a1)+
bne.s .loop
rts
; WB2.0 Requester entry
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
Req_Easy
bsr ResData
move.l (a2),T_Req_IDCMP(a5)
lea 8(a1),a2
clr.w T_TxtMaxCx(a5)
lea T_Tit(a4),a1
move.l (a2)+,d0
move.l d0,a0
bne.s .nof
lea Req_Tit(pc),a0
.nof bsr Format
move.l (a2)+,a0
lea T_Text(a4),a1
bsr Format
move.w T_TxtCy(a5),T_Req_Sy(a5)
move.l (a2)+,a0
lea T_Gad(a4),a1
bsr Format
lea T_Gad(a4),a0
move.l a0,T_Req_Pos(a5)
clr.l T_Req_Neg(a5)
.loop move.b (a0)+,d0
beq.s .skp
cmp.b #"|",d0
bne.s .loop
clr.b -1(a0)
move.l a0,T_Req_Neg(a5)
.skp
move.w T_TxtMaxCx(a5),d0
cmp.w #32,d0
bcc.s .skp2
moveq #32,d0
.skp2 add.w #9,d0
and.w #$FFFC,d0
move.w d0,T_Req_Sx(a5)
addq.w #8,T_Req_Sy(a5)
rts
; Call RawDoFmt
; ~~~~~~~~~~~~~~~~~~~
Format clr.w T_TxtCx(a5)
move.w #1,T_TxtCy(a5)
movem.l a2/a3/a6,-(sp)
exg a3,a1
lea .OutC(pc),a2
move.l $4.w,a6
jsr -522(a6)
exg a3,a1
movem.l (sp)+,a2/a3/a6
.XMax move.w T_TxtCx(a5),d0
cmp.w T_TxtMaxCx(a5),d0
bls.s .sk
move.w d0,T_TxtMaxCx(a5)
.sk rts
.OutC movem.l d0/a5,-(sp)
move.l W_Base(pc),a5
addq.w #1,T_TxtCx(a5)
move.b d0,(a3)+
cmp.b #10,d0
bne.s .Skip
clr.b (a3)+
addq.w #1,T_TxtCy(a5)
bsr.s .XMax
clr.w T_TxtCx(a5)
.Skip movem.l (sp)+,d0/a5
clr.b (a3)
rts
; Copy an intuitext into the buffer
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0-> ITEXT
; A1-> Buffer
; D0-> Mettre un 10 a la fin...
IT_Print
movem.l a0-a2/d0-d1,-(sp)
.loop move.l 12(a0),d1
move.l d1,a2
beq.s .skip
.loop1 move.b (a2)+,(a1)+
bne.s .loop1
tst.w d0
beq.s .skip
move.b d0,-1(a1)
clr.b (a1)+
.skip move.l 16(a0),d1
move.l d1,a0
bne.s .loop
movem.l (sp)+,a0-a2/d0-d1
rts
; Routine: copy the binary data
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Copy movem.l d0-d7/a0-a5,-(sp)
mulu #RPic_Sx/8,d1 d1= offset source
add.l d1,d0
lea RPic(pc),a0 a0= adress source
move.w T_Req_Sx(a5),d1
ext.l d1 d1= size of dest line
mulu d1,d3
add.l d2,d3 d3= offset dest
move.l T_ScAdr(a5),a3 a3= dest screen
subq.w #1,d4
subq.w #1,d5
move.w #RPic_Np-1,d2
.loop1 move.l (a3)+,a4
add.l d3,a4
move.l a0,a1
add.l d0,a1
move.w d5,d7
.loop2 move.w d4,d6
move.l a1,a2
move.l a4,a5
.loop3 move.b (a2)+,(a5)+
dbra d6,.loop3
add.w #RPic_Sx/8,a1
add.l d1,a4
dbra d7,.loop2
add.w #(RPic_Sx/8)*RPic_Sy,a0
dbra d2,.loop1
movem.l (sp)+,d0-d7/a0-a5
add.w d4,d2
rts
;--------------------------------------------------------------------
* DATA ZONE
* Title
Req_Tit dc.b "System request",0
Req_Init dc.b 27,"C0",27,"V0",27,"Y1",27,"B2",27,"P7",0
* Main text
Req_Main dc.b 27,"B2",27,"P3",27,"Y4",0
* Positive text
TPos1 dc.b 27,"B4",27,"P3",27,"I0",24,30,30,27,"X2",27,"Z0",0
TPos2 dc.b 27,"Z1",0
* Negative text
TNeg1 dc.b 27,"B4",27,"P3",27,"I0",24,30,30,27,"X"
XTNeg dc.b "0",27,"Z0",0
TNeg2 dc.b 27,"Z2",0
even
; Insertion de l'image de fond
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RPic_Sx equ 112
RPic_Sy equ 56
RPic_Np equ 3
Req_Pal Incbin "bin/ReqPic.bin"
RPic equ Req_Pal+32*2
even
***********************************************************
***********************************************************
* Table des codes de CONTROLE
***********************************************************
CCont: bra Rien ;0
bra Rien ;1
bra Rien ;2
bra Rien ;3
bra Rien ;4
bra Rien ;5
bra Rien ;6
bra ClEol ;7- Clear to EOL
bra CLeft ;8- Backspace
bra Tab ;9- Tab
bra CDown ;10- Curseur bas
bra Rien ;11
bra Home ;12- Home
bra CReturn ;13- A la ligne
bra Rien ;14
bra Rien ;15-
bra ScGLine ;16- Scrolling gauche ligne curseur
bra ScGWi ;17- Scrolling gauche fenetre
bra ScDLine ;18- Scrolling droite ligne curseur
bra ScDWi ;19- Scrolling droite fenetre
bra ScBas ;20
bra ScBasHaut ;21
bra ScHaut ;22
bra ScHautBas ;23
bra Home ;24
bra Clw ;25
bra ClLine ;26
bra EscM ;27- ESCAPE
bra CRight ;28
bra CLeft ;29
bra CUp ;30
bra CDown ;31
***********************************************************
* Table des ESCAPES
***********************************************************
CEsc: bra Rien ;A
bra Paper ;B- Paper
bra Curs ;C- Curseur OFF/ON
bra CurCol ;D- Couleur du curseur
bra Encadre ;E- Encadre!
bra Rien ;F
bra Rien ;G
bra Rien ;H
bra Inv ;I- Inverse on/off
bra Planes ;J- Set active planes
bra ChgCar ;K- 0/1 jeu normal/graphique
bra Rien ;L
bra MemoCu ;M- Memorise le curseur
bra DecaX ;N- Decalage curseur X
bra DecaY ;O- Decalage curseur Y
bra Pen ;P- Pen
bra RazCur ;Q- Efface N caracteres
bra Repete ;R- Repeter
bra Shade ;S- Shade on/off
bra SetTab ;T- Set Tab
bra Under ;U- Underline on/off
bra Scroll ;V- Scroll on/off
bra Writing ;W- Writing
bra LocaX ;X- Fixe X
bra LocaY ;Y- Fixe Y
bra WiZone ;Z- Stocke une zone
***********************************************************
* Bordures
***********************************************************
Brd: dc.w Bor0-Brd,Bor1-Brd,Bor2-Brd,Bor3-Brd
dc.w Bor4-Brd,Bor5-Brd,Bor0-Brd,Bor0-Brd
dc.w Bor0-Brd,Bor0-Brd,Bor0-Brd,Bor0-Brd
dc.w Bor0-Brd,Bor0-Brd,Bor0-Brd,Bor15-Brd
dc.b 0
Bor0: dc.b 136,0 * Haut G
dc.b 138,0 * Haut D
dc.b 137,0 * Haut
dc.b 139,0 * Droite
dc.b 140,0 * Bas G
dc.b 141,0 * Bas D
dc.b 137,0 * Bas
dc.b 139,0 * Gauche
Bor1: dc.b 128,0 * Haut G
dc.b 130,0 * Haut D
dc.b 129,0 * Haut
dc.b 132,0 * Droite
dc.b 133,0 * Bas G
dc.b 135,0 * Bas D
dc.b 134,0 * Bas
dc.b 131,0 * Gauche
Bor2: dc.b 157,0 * Haut G
dc.b 2,0 * Haut D
dc.b 1,0 * Haut
dc.b 3,0 * Droite
dc.b 6,0 * Bas G
dc.b 4,0 * Bas D
dc.b 5,0 * Bas
dc.b 7,0 * Gauche
Bor3: dc.b 8,0 * Haut G
dc.b 10,0 * Haut D
dc.b 9,0 * Haut
dc.b 11,0 * Droite
dc.b 14,0 * Bas G
dc.b 12,0 * Bas D
dc.b 13,0 * Bas
dc.b 15,0 * Gauche
Bor4: dc.b 16,0 * Haut G
dc.b 18,0 * Haut D
dc.b 17,0 * Haut
dc.b 19,0 * Droite
dc.b 22,0 * Bas G
dc.b 20,0 * Bas D
dc.b 21,0 * Bas
dc.b 23,0 * Gauche
Bor5: dc.b 24,0 * Haut G
dc.b 26,0 * Haut D
dc.b 25,0 * Haut
dc.b 158,0 * Droite
dc.b 30,0 * Bas G
dc.b 28,0 * Bas D
dc.b 29,0 * Bas
dc.b 31,0 * Gauche
Bor15 dc.b " ",0
dc.b " ",0
dc.b " ",0
dc.b " ",0
dc.b " ",0
dc.b " ",0
dc.b " ",0
dc.b " ",0
even
***********************************************************
* CODE AMOS HERE?
BufCode dc.w 0
dc.b "I"+$60
dc.b "S"+$60
dc.b " "+$60
dc.b "A"+$60
dc.b "M"+$60
dc.b "O"+$60
dc.b "S"+$60
dc.b " "+$60
dc.b "H"+$60
dc.b "E"+$60
dc.b "R"+$60
dc.b "E"+$60
dc.b 0
***********************************************************
* FONCTIONS ESCAPES
***********************************************************
dc.b 32,32,32,32,32,32,32,32
TEncadre: dc.b 136,137,138,139,141,137,140,139
dc.b 128,129,130,132,135,134,133,131
dc.b 157,1,2,3,4,5,6,7
dc.b 8,9,10,11,12,13,14,15
dc.b 16,17,18,19,20,21,22,23
dc.b 24,25,26,158,28,29,30,31
dc.b 32,32,32,32,32,32,32,32
***********************************************************
* CURSEUR TEXTE
***********************************************************
DefCurs: dc.b %00000000
dc.b %00000000
dc.b %00000000
dc.b %00000000
dc.b %00000000
dc.b %00000000
dc.b %11111111
dc.b %11111111
dc.w 0
IFNE EzFlag
TokAMAL
CreAMAL
MvOAMAL
DAllAMAL
Animeur
RegAMAL
ClrAMAL
FrzAMAL
UFrzAMAL
SpColl
SyncO
Sync
SetPlay
HColSet
HColGet
TMovon
TChanA
TChanM
ShStop
ShStart
MakeCBloc
DrawCBloc
FreeCBloc
RazCBloc
Duale
DualP
StaMn
StoMn
TCopOn
TCopRes
TCopSw
TCopWt
TCopMv
TCopMl
TCopBs
DAdAMAL
AMALInit
AMALEnd
ShInit
rts
ENDC
; Banque MOUSE.ABK par defaut
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SECTION "m",DATA_C
IncBin "bin/+AMOSPro_Mouse.abk"
even