maxtab equ $c8			; 200 entrées
scrlim equ $1e			; 30 opcodes
debug equ 0			; affiche messages debug
vol equ 64			; volume
sndsiz equ 10240		; sound-buffer (10 ko)

 mc68030			; pour scale factor

 rsreset
igfx rs.l 1			; adresse ou 0 si pas d'item gfx
iscr rs.l 1			; adresse ou 0 si pas de script indiqué
icnt rs.w 1			; compteur
ixsi rs.w 1			; taille x
iysi rs.w 1			; taille y
ixpo rs.w 1			; pos x
iypo rs.w 1			; pos y
iflg rs.w 1			; indique buffer dest
isiz so

 include systop.i

debug_output macro
 ifne debug
 ifeq NARG-2
 andi.l #$ffff,\2
 move.l a0,-(a7)	; save
 move.l \2,-(a7)
 lea .truc\@(pc),a0
 zcall printf
 addq.l #4,a7
 move.l (a7)+,a0
 else
 move.l a0,-(a7)
 lea .truc\@(pc),a0
 zcall print
 move.l (a7)+,a0
 endc
 bra.s .ouh\@
.truc\@ dc.b \1,10,0
 even
.ouh\@
 endc
 endm

; on démarre par l'audio (l'écran viendra bien après)
 lea aud1(pc),a0
 lea aud2,a1
 zcall audioalloc

; lire les fichiers
 lea dat(pc),a0
 zcall loadfile
 move.l a1,a4			; a4/d4 = gfxdat
 move.l d0,d4
 lea scr(pc),a0
 zcall loadfile
 move.l a1,a6			; a6/d6 = script
 move.l d0,d6
 beq.s ralh
 btst #0,d6
 bne.s ralh
 bsr initscr
 moveq #0,d7			; script cnt
.loop
 zcall break			; si jamais il faut casser
 bsr read			; opcode
 cmpi.w #scrlim,d1
 bhi.s .oups
 debug_output "debug - cmde = %04lx",d1
 lea exetab(pc),a2
 add.w (a2,d1.w*2),a2
 jsr (a2)
 cmp.l d6,d7
 bne.s .loop
 rts
.oups
 ext.l d1
 move.l d1,-(a7)
 lea err1(pc),a0
 zcall abort

ralh lea err0(pc),a0
 zcall abort


; lecture un mot -> d1
read
 cmp.l d6,d7
 bhs ralh
 move.w (a6,d7.l),d1
 addq.l #2,d7
 rts
; obtient adr var d1 -> a0
getvar
 cmpi.w #maxtab,d1
 bhi.s .ralh
 mulu #isiz,d1
 lea vars,a0
 add.l d1,a0
 rts
.ralh
 lea erre(pc),a0
 zcall abort

; vérifie que c'est pas un item écran (d1)
chknoscr
 cmpi.w #1,d1
 bhi.s .ouf
 lea err5(pc),a0
 zcall abort
.ouf rts
; vérifie qu'on peut blitter là-dessus (dest) - fait getvar en passant
blittable
 cmpi.w #1,d1
 bls getvar
 bsr getvar
 tst.b iflg(a0)
 beq.s .euh
 rts
.euh
 ext.l d1
 move.l d1,-(a7)
 lea err7(pc),a0
 zcall abort

; vérifie qu'il s'agit bien de l'écran
displayable
 cmpi.w #1,d1
 bhi.s .euh
 rts
.euh
 ext.l d1
 move.l d1,-(a7)
 lea erra(pc),a0
 zcall abort


; vérifie que l'objet n'est pas vide (a0), et renvoie a0=son adr
pasvide
 tst.l (a0)
 bne.s .ouf
 lea err6(pc),a0
 zcall abort
.ouf
 move.l (a0),a0
 rts
; vérifie que l'objet ne contient rien
vide
 tst.l (a0)
 beq.s .ouf
 lea err8(pc),a0
 zcall abort
.ouf rts

; obtient un écran, renvoie z=1 s'il n'y était pas
screen
 tas scrf
 bne.s .ok		; z=0
 move.l #320,d1
 move.l #200,d2
 move.l #$10000004,d3
 zcall screen
 sez			; z=1
.ok
 rts
; init scr st
initscr
 lea vars,a0
 lea vars+isiz,a1
 move.l #stscr1,igfx(a0)
 move.l #stscr2,igfx(a1)
 rts

; null opcode
op00
 ext.l d1
 move.l d1,-(a7)
 lea err2(pc),a0
 zcall abort

; quit
op01
 cmp.l d6,d7			; je quitte pas, je teste juste
 bne.s .oups			; (qu'il n'y a rien d'oublié derrière)
 rts
.oups
 lea errf(pc),a0
 zcall abort

; load object
op03
 bsr read			; n° item
 move.w d1,d0
 bsr read			; n° var
 bsr chknoscr
 bsr getvar			; donne a0=var dest
 cmp.w (a4),d0
 bhs.s .euh
 move.w (a4),d2			; nb items
 lea 2(a4,d2.w*2),a1		; tab 1
 move.w (a1,d0.w*2),d3
 cmp.w 2(a4,d0.w*2),d3		; tab 2
 bne.s .oups
 move.w d2,a2			; ext
 add.l a2,a2			; *2
 add.l a2,a2			; *4
 add.l a4,a2			; plus adr deb
 addq.l #2,a2			; plus mot d'entête
 bra.s .do
.loop
 add.w (a1)+,a2
.do
 dbf d0,.loop
 move.l a2,igfx(a0)
 bra read			; à quoi sert ce param ?!
.euh
 ext.l d1
 move.l d1,-(a7)
 lea err3(pc),a0
 zcall abort
.oups lea err4(pc),a0
 zcall abort

; eject item
op04
 bsr read
 bsr chknoscr
 bsr getvar
 clr.l igfx(a0)
 rts

; bitblt
op05
 bsr read
 move.w d1,d5			; conserver pour vérif
 bsr chknoscr			; (pas l'écran !)
 bsr getvar			; src
 bsr pasvide
 move.l a0,a1			; a1 = adr src
 bsr read
 bsr blittable			; dest (a0)
 move.b iflg(a0),d1
 beq.s .scr
 cmp.b d1,d5
 bne.s .ralh
.scr
 bsr pasvide			; pas de blit sur item vide (op1d les crée)
 move.l a0,a2			; a2 = adr dest
 bsr read
 bsr getvar			; pos
 move.w iypo(a0),-(a7)		; yp
 move.w ixpo(a0),-(a7)		; xp
 bsr pasvide			; a0 = pos (d'item non vide à priori)
 move.l a2,-(a7)		; dest
 move.l a1,-(a7)		; src
 bsr decgfx
 lea 12(a7),a7
 cmp.l stscr,a2
 bne.s .back
; blit sur le front buff : mise à jour
 bsr update
.back
 rts
.ralh
 lea errc(pc),a0
 zcall abort

; transparent blt
op06
 zcall waitvbl
 bsr read
; move.w d1,d5		; pour vérif
 bsr getvar
 tst.b iflg(a0)		; src doit être une bitmap créée via 1d
 beq.s .ralh
 move.l a0,a3		; on se garde src
 bsr pasvide
 move.l a0,a1		; voici src (a1)
 bsr read
 move.w d1,d3		; pour vérif
 bsr displayable	; (doit être l'écran !)
 bsr getvar
 bsr pasvide
 move.l a0,a2		; et voici dest (a2)
 bsr read		; a1/a2
 cmp.w d3,d1		; p2=p3 sinon j'comprends plus
 bne.s .ralh
 bsr getvar
 bsr read		; a0	-> -$3c
 bsr getvar
; cmp.w d5,d1		; ben non, pas p1=p4 (enfin pas à chaque fois)
; bne.s .ralh
 move.w iysi(a0),d0
 add.w iypo(a0),d0
 subq.w #1,d0
 move.w d0,-(a7)	; finy
 move.w iypo(a0),-(a7)	; deby
 move.w ixsi(a0),d0
 add.w ixpo(a0),d0
 subq.w #1,d0
 move.w d0,-(a7)	; finx
 move.w ixpo(a0),-(a7)	; debx
 move.l a7,a0
 move.w #-1,-(a7)	; prob. transparent color, toujours ffff (de p2)
 move.w #$a0,-(a7)	; pitch dest (écran donc 160)
 move.w ixsi(a3),d0
 moveq #7,d1		; doit être multiple de 8 pix
 and.w d0,d1
 bne.s .ralh
 lsr.w #1,d0
 move.w d0,-(a7)	; pitch src
 clr.w -(a7)		; yp (p3,dest)
 clr.w -(a7)		; xp (p3,dest)
 move.l a0,-(a7)	; contient debx,finx,deby,finy (p4)
 move.l a2,-(a7)	; dest data
 move.l a1,-(a7)	; src data
 jsr u02da
 lea $16+8(a7),a7
 cmp.l stscr,a2		; si dest était visible, mettre à jour
 beq update
 rts
.ralh
 lea errd(pc),a0
 zcall abort


; fade to palette - repris de "ftlcode"
op08
 bsr read
 bsr chknoscr			; pas 0 ou 1
 cmpi.w #2,d1
 bne.s .norm
; objet 2 est spec
 debug_output "debug attn : fade sur palette vide"
 lea palvide,a0
 bra.s .sui
.norm
 bsr getvar			; a0=palette
 bsr pasvide
.sui
 bsr read			; d1=timing
 bsr screen
 beq.s .rien			; pas de fade initial si pas d'écran
 move.w d1,-(a7)
 move.l a0,-(a7)
 bsr u1700			; fade
 addq.l #6,a7
 rts
; par contre on envoie quand même la palette direct
.rien
 bra loadpal4

c7 equ $7		; norm pal 777 -> c7=7 - $f pour AM direct
u1700 link a6,#-4
 movem.l d4-d7/a4,-(a7)
 lea stpal,a4		; movea.w #$8240,a4
 moveq #0,d4
 bra u17c8
u1722
 move.l a4,a0		; mise à jour
 bsr loadpal4
; attn : param durée
 moveq #0,d0
.re
 zcall waitvbl
 addq.w #1,d0
 cmp.w $c(a6),d0
 ble.s .re
 moveq #0,d5
 bra u17be
u1732 move.w d5,d0
 ext.l d0
 add.l d0,d0
 add.l a4,d0
 movea.l d0,a0
 move.w (a0),d7
 move.w d5,d0
 ext.l d0
 add.l d0,d0
 add.l 8(a6),d0
 movea.l d0,a0
 move.w (a0),d6
 moveq #c7,d0
 and.w d7,d0
 moveq #c7,d1
 and.w d6,d1
 cmp.w d1,d0
 bls.s .u175a
 subq.w #1,d7
.u175a moveq #c7,d0
 and.w d7,d0
 moveq #c7,d1
 and.w d6,d1
 cmp.w d1,d0
 bcc.s u1768
 addq.w #1,d7
u1768 move.w #c7*$10,d0
 and.w d7,d0
 move.w #c7*$10,d1
 and.w d6,d1
 cmp.w d1,d0
 bls.s u1778
 addi.w #$fff0,d7
u1778 move.w #c7*$10,d0
 and.w d7,d0
 move.w #c7*$10,d1
 and.w d6,d1
 cmp.w d1,d0
 bcc.s u1788
 addi.w #$10,d7
u1788 move.w #c7*$100,d0
 and.w d7,d0
 move.w #c7*$100,d1
 and.w d6,d1
 cmp.w d1,d0
 bls.s u179c
 addi.w #$ff00,d7
u179c move.w #c7*$100,d0
 and.w d7,d0
 move.w #c7*$100,d1
 and.w d6,d1
 cmp.w d1,d0
 bcc.s u17b0
 addi.w #$100,d7
u17b0 move.w d5,d0
 ext.l d0
 add.l d0,d0
 add.l a4,d0
 movea.l d0,a0
 move.w d7,(a0)
 addq.w #1,d5
u17be cmpi.w #$10,d5
 blt u1732
 addq.w #1,d4
u17c8 cmpi.w #c7+1,d4
 blt u1722
 move.l 8(a6),a0
 bsr loadpal4
 lea stpal,a1
 moveq #32,d0
 zcall copymem		; mettre aussi à jour stpal
 movem.l (a7)+,d4-d7/a4
 unlk a6
 rts

; waitvbl (nbr)
op0a
 bsr read
 bra.s .do
.loop
 zcall waitvbl
.do
 dbf d1,.loop
 rts

; le son !
op0c
 lea aud2,a2
 clr.l 4(a2)
 zcall dosound			; d'abord, couper le son en cours
 bsr read
 bsr getvar
 bsr pasvide			; -> a0=son
 moveq #0,d0
 move.w (a0)+,d0		; nb samples à la sortie
 cmpi.w #sndsiz,d0
 bhi.s .ralh
 move.l d0,-(a7)
; conversion sample
 lea sndbuf,a1
 lea (a1,d0.w),a2		; fin
 moveq #0,d5
.loop
 bsr.s nibble
 beq.s .zero
 lsl.b #4,d3
 addi.b #$80,d3			; A->20, 6->E0, D->50, etc
 move.b d3,(a1)+
.re
 cmpa.l a2,a1
 blo.s .loop
 bne.s .ralh
 move.l (a7)+,d0		; récup taille
 bsr read			; d1=pitch
 mulu #1143,d1			; *5.7
 divu #200,d1			;
 lea aud2,a2
 lea sndbuf,a1
 move.l a1,(a2)+		; adr
 move.l d0,(a2)+		; tai
 move.w d1,(a2)+		; per
 move.b #vol,(a2)		; vol
 zcall dosound
 rts
.ralh
 lea errsn,a0
 zcall abort
.zero
 moveq #0,d0
.zloop
 bsr.s nibble
 bclr #3,d3
 beq.s .last
 lsl.w #3,d0
 add.w d3,d0
 bra.s .zloop
.last
 lsl.w #3,d0
 add.w d3,d0
 addq.w #3,d0		; nb rep last spl
.rloop
 move.b -1(a1),(a1)+
 subq.w #1,d0
 bne.s .rloop 
 bra.s .re

nibble
 tst.b d5
 bne.s .low
 st d5
 move.b (a0),d3
 lsr.b #4,d3
 rts
.low
 sf d5
 moveq #15,d3
 and.b (a0)+,d3
 rts


; wait key - ça sert pas mais bon... c'était trop facile à faire ;-)
; (et ça évite d'avoir idcmp=0)
op0d
 zcall waitkey
 rts

; set screen
op0e
 bsr read
 bsr displayable		; doit être l'écran
 bsr getvar
 bsr pasvide			; voilà a0=scr
 zcall waitvbl			; on fait pareil
 move.l a0,stscr
 bsr update			; et on met simplement à jour
 bsr read			; mais on a aussi itempalette
 cmpi.w #$ffff,d1
 beq.s .saute
 cmpi.w #2,d1
 bne.s .norm
 lea palvide,a0
 bra loadpal4
.norm
 bsr getvar
 bsr pasvide
 bra loadpal4
.saute rts

; store script addr
op10
 bsr read			; var
 bsr getvar
 bsr vide			; doit être vide
 move.l d7,iscr(a0)
 rts

; décompte
op11
 bsr read
 bsr getvar
 bsr vide
 tst.w icnt(a0)			; éviter qd même le tour de compteur
 beq.s .rien
 subq.w #1,icnt(a0)
.rien
 rts

; rebouclage
op12
 bsr read			; compteur
 bsr getvar
 bsr vide
 move.l a0,a1
 bsr read			; script addr
 bsr getvar
 bsr vide
 tst.w icnt(a1)
 beq.s .fini
 move.l iscr(a0),d7
 beq.s .ralh
.fini
 rts
.ralh
 lea err9(pc),a0
 zcall abort

; init counter
op13
 bsr read			; var
 bsr getvar
 bsr vide			; doit être vide
 bsr read			; val
 move.w d1,icnt(a0)
 rts

; dupliquer var - en fait préparer buffer pour décompression gfx
op1d
 bsr read			; src=dess1
 move.w d1,d5			; garder n°
 bsr getvar
 bsr pasvide
 movem.w (a0),d0-d1		; x,y
 move.w d0,d2			; garder pour write
 move.w d1,d3
 cmpi.w #320,d0
 bhi.s .pasbon
 cmpi.w #200,d1
 bhi.s .pasbon
 lsr.w #1,d0			; pitch
 mulu d1,d0			; * y -> taille gfx en bytes
 moveq #0,d1
 zcall allocmem			; allons-y comme ça
 move.l a0,a1
 bsr read			; dest=vide
 bsr getvar
 bsr vide
 move.l a1,igfx(a0)		; voilà le buffer
 move.b d5,iflg(a0)		; sert de flag mais vérifiera aussi n°
 move.w d2,ixsi(a0)		; donner la taille pour op06
 move.w d3,iysi(a0)		;
 rts
.pasbon
 lea errb(pc),a0
 zcall abort

; set pos
op1e
 bsr read
 bsr getvar
 bsr read
 move.w d1,ixpo(a0)
 bsr read
 move.w d1,iypo(a0)
 rts

; opcodes pas implémentés (parce que pas utilisés !)
op02
op07
op09
op0b
op0f
op14
op15
op16
op17
op18
op19
op1a
op1b
op1c
 ext.l d1
 move.l d1,-(a7)
 lea err1(pc),a0
 zcall abort


; mise à jour du vrai frame buffer
update
 bsr screen			; vérifier qu'il est là, le créer s'il le faut
 movem.l a2-a4,-(a7)
 zcall scrbase
 movem.l (a0),a1-a4		; planes
 move.l stscr,a0
 move.w #3999,d0
.loop move.w (a0)+,(a1)+
 move.w (a0)+,(a2)+
 move.w (a0)+,(a3)+
 move.w (a0)+,(a4)+
 dbf d0,.loop
 movem.l (a7)+,a2-a4
 rts

; palette st -> palette am
loadpal4
 movem.l d6-d7/a0-a1,-(a7)
 move.l a0,a1		; src
 lea ampal,a0		; dest
 moveq #15,d7
.loop
 move.w (a1)+,d6
 add.w d6,d6
 move.w d6,(a0)+
 dbf d7,.loop
 lea ampal,a0
 zcall loadpal4
 movem.l (a7)+,d6-d7/a0-a1
 rts

 include gfxcode.i

; transparent blt
u02da link a6,#-6
 movem.l d4-d7/a2-a5,-(a7)
 movea.l 8(a6),a0
 movea.l $c(a6),a1
 move.w $1c(a6),d0
 move.w $1a(a6),d1
 move.w $18(a6),d2
 move.w $16(a6),d3
 move.w $14(a6),d4
 movea.l $10(a6),a2
 lea u066c(pc),a5
 moveq #$f,d5
 and.w d4,d5
 mulu d2,d3
 adda.l d3,a0
 sub.w d5,d4
 lsr.w #1,d4
 adda.w d4,a0
 moveq #0,d3
 move.w 4(a2),d3
 moveq #0,d4
 move.w (a2),d4
 move.w 6(a2),d7
 sub.w d3,d7
 swap d7
 move.w 2(a2),d7
 sub.w d4,d7
 addq.w #1,d7
 moveq #$f,d6
 and.w d4,d6
 mulu d1,d3
 adda.l d3,a1
 sub.w d6,d4
 lsr.w #1,d4
 adda.w d4,a1
 moveq #$f,d3
 add.w d7,d3
 add.w d5,d3
 andi.w #$fff0,d3
 lsr.w #1,d3
 move.w d2,d4
 sub.w d3,d4
 movea.w d4,a3
 add.w d6,d7
 move.w d7,-2(a6)
 moveq #$f,d3
 add.w d7,d3
 andi.w #$fff0,d3
 lsr.w #1,d3
 sub.w d3,d1
 movea.w d1,a4
 move.w d5,d1
 neg.w d5
 add.w d6,d5
 bpl.s u036e
 addi.w #$10,d5
u036e move.w d6,d3
 add.w d3,d3
 move.w 0(a5,d3.w),-4(a6)
 move.w d7,d3
 add.w d7,d3
 cmpi.w #$20,d3
 bpl.s u039e
 move.w 0(a5,d3.w),d3
 not.w d3
 or.w d3,-4(a6)
 cmp.w d5,d6
 bpl.s u03ac
 add.w d7,d1
 sub.w d6,d1
 cmpi.w #$11,d1
 bpl.s u03ac
 subq.w #8,a3
 bra.s u03ac
u039e andi.w #$1f,d3
 move.w 0(a5,d3.w),d3
 not.w d3
 move.w d3,-6(a6)
u03ac move.w d5,d3
 add.w d3,d3
 movea.w 0(a5,d3.w),a5
 swap d5
 tst.w d0
 bpl.s u03c0
 lea u065a(pc),a2
 bra.s u042a
u03c0 add.w d0,d0
 move.w d0,d3
 add.w d0,d0
 add.w d3,d0
 jmp u03cc(pc,d0.w)
u03cc lea u0528(pc),a2
 bra.s u042a
 lea u053a(pc),a2
 bra.s u042a
 lea u054e(pc),a2
 bra.s u042a
 lea u0562(pc),a2
 bra.s u042a
 lea u0576(pc),a2
 bra.s u042a
 lea u058a(pc),a2
 bra.s u042a
 lea u059e(pc),a2
 bra.s u042a
 lea u05b2(pc),a2
 bra.s u042a
 lea u05c6(pc),a2
 bra.s u042a
 lea u05da(pc),a2
 bra.s u042a
 lea u05ee(pc),a2
 bra.s u042a
 lea u0602(pc),a2
 bra.s u042a
 lea u0614(pc),a2
 bra.s u042a
 lea u0626(pc),a2
 bra.s u042a
 lea u0638(pc),a2
 bra.s u042a
 lea u064a(pc),a2
u042a move.w -4(a6),d5
 swap d5
 tst.w d5
 beq.s u04b2
 move.w a5,d4
 cmp.w d5,d6
 bpl.s u045a
 move.w (a0)+,d1
 ror.w d5,d1
 and.w d4,d1
 swap d1
 move.w (a0)+,d0
 ror.w d5,d0
 and.w d4,d0
 swap d0
 move.w (a0)+,d3
 ror.w d5,d3
 and.w d4,d3
 swap d3
 move.w (a0)+,d2
 ror.w d5,d2
 and.w d4,d2
 swap d2
u045a swap d6
 move.w (a0)+,d0
 ror.w d5,d0
 move.w d0,d6
 swap d1
 and.w d4,d1
 not.w d4
 and.w d4,d0
 or.w d1,d0
 move.w d6,d1
 swap d1
 move.w (a0)+,d1
 ror.w d5,d1
 move.w d1,d6
 swap d0
 and.w d4,d1
 not.w d4
 and.w d4,d0
 or.w d0,d1
 move.w d6,d0
 swap d0
 move.w (a0)+,d2
 ror.w d5,d2
 move.w d2,d6
 swap d3
 and.w d4,d3
 not.w d4
 and.w d4,d2
 or.w d3,d2
 move.w d6,d3
 swap d3
 move.w (a0)+,d3
 ror.w d5,d3
 move.w d3,d6
 swap d2
 and.w d4,d3
 not.w d4
 and.w d4,d2
 or.w d2,d3
 move.w d6,d2
 swap d2
 swap d6
 swap d5
 jmp (a2)
u04b2 movem.w (a0)+,d0-d3
 swap d5
 jmp (a2)
u04ba not.w d4
 and.w d4,d0
 and.w d4,d1
 and.w d4,d2
 and.w d4,d3
 not.w d4
 and.w d4,(a1)
 or.w d0,(a1)+
 and.w d4,(a1)
 or.w d1,(a1)+
 and.w d4,(a1)
 or.w d2,(a1)+
 and.w d4,(a1)
 or.w d3,(a1)+
u04d6 subi.w #$10,d7
 ble.s u0512
 cmpi.w #$10,d7
 bmi.s u04f0
 clr.w d5
 swap d5
u04e6 tst.w d5
 beq.s u04b2
 move.w a5,d4
 bra u045a
u04f0 move.w -6(a6),d5
 swap d5
 cmp.w d7,d5
 bmi.s u04e6
 swap d0
 swap d1
 swap d2
 swap d3
 move.w d0,d4
 move.w d1,d0
 move.w d4,d1
 move.w d2,d4
 move.w d3,d2
 move.w d4,d3
 swap d5
 jmp (a2)
u0512 swap d7
 subq.w #1,d7
 bmi u068c
 swap d7
 move.w -2(a6),d7
 adda.w a3,a0
 adda.w a4,a1
 bra u042a
u0528 move.w d0,d4
 or.w d1,d4
 or.w d2,d4
 or.w d3,d4
 not.w d4
 or.w d5,d4
 bne.s u04ba
 bra u0660
u053a move.w d1,d4
 or.w d2,d4
 or.w d3,d4
 not.w d4
 and.w d0,d4
 or.w d5,d4
 bne u04ba
 bra u0660
u054e move.w d0,d4
 or.w d2,d4
 or.w d3,d4
 not.w d4
 and.w d1,d4
 or.w d5,d4
 bne u04ba
 bra u0660
u0562 move.w d2,d4
 or.w d3,d4
 not.w d4
 and.w d0,d4
 and.w d1,d4
 or.w d5,d4
 bne u04ba
 bra u0660
u0576 move.w d0,d4
 or.w d1,d4
 or.w d3,d4
 not.w d4
 and.w d2,d4
 or.w d5,d4
 bne u04ba
 bra u0660
u058a move.w d1,d4
 or.w d3,d4
 not.w d4
 and.w d0,d4
 and.w d2,d4
 or.w d5,d4
 bne u04ba
 bra u0660
u059e move.w d0,d4
 or.w d3,d4
 not.w d4
 and.w d1,d4
 and.w d2,d4
 or.w d5,d4
 bne u04ba
 bra u0660
u05b2 move.w d3,d4
 not.w d4
 and.w d0,d4
 and.w d1,d4
 and.w d2,d4
 or.w d5,d4
 bne u04ba
 bra u0660
u05c6 move.w d0,d4
 or.w d1,d4
 or.w d2,d4
 not.w d4
 and.w d3,d4
 or.w d5,d4
 bne u04ba
 bra u0660
u05da move.w d1,d4
 or.w d2,d4
 not.w d4
 and.w d0,d4
 and.w d3,d4
 or.w d5,d4
 bne u04ba
 bra u0660
u05ee move.w d0,d4
 or.w d2,d4
 not.w d4
 and.w d1,d4
 and.w d3,d4
 or.w d5,d4
 bne u04ba
 bra u0660
u0602 move.w d2,d4
 not.w d4
 and.w d0,d4
 and.w d1,d4
 and.w d3,d4
 or.w d5,d4
 bne u04ba
 bra.s u0660
u0614 move.w d0,d4
 or.w d1,d4
 not.w d4
 and.w d2,d4
 and.w d3,d4
 or.w d5,d4
 bne u04ba
 bra.s u0660
u0626 move.w d1,d4
 not.w d4
 and.w d0,d4
 and.w d2,d4
 and.w d3,d4
 or.w d5,d4
 bne u04ba
 bra.s u0660
u0638 move.w d0,d4
 not.w d4
 and.w d1,d4
 and.w d2,d4
 and.w d3,d4
 or.w d5,d4
 bne u04ba
 bra.s u0660
u064a move.w d0,d4
 and.w d1,d4
 and.w d2,d4
 and.w d3,d4
 or.w d5,d4
 bne u04ba
 bra.s u0660
u065a move.w d5,d4
 bne u04ba
u0660 move.w d0,(a1)+
 move.w d1,(a1)+
 move.w d2,(a1)+
 move.w d3,(a1)+
 bra u04d6
u068c movem.l (a7)+,d4-d7/a2-a5
 unlk a6
 rts

u066c dc.w $0000,$8000,$c000,$e000,$f000,$f800,$fc00,$fe00
 dc.w $ff00,$ff80,$ffc0,$ffe0,$fff0,$fff8,$fffc,$fffe


exetab
 dc.w op00-exetab
 dc.w op01-exetab,op02-exetab,op03-exetab,op04-exetab,op05-exetab,op06-exetab
 dc.w op07-exetab,op08-exetab,op09-exetab,op0a-exetab,op0b-exetab,op0c-exetab
 dc.w op0d-exetab,op0e-exetab,op0f-exetab,op10-exetab,op11-exetab,op12-exetab
 dc.w op13-exetab,op14-exetab,op15-exetab,op16-exetab,op17-exetab,op18-exetab
 dc.w op19-exetab,op1a-exetab,op1b-exetab,op1c-exetab,op1d-exetab,op1e-exetab

stscr dc.l stscr1		; adr écran en cours (c'est l'item 0)

aud1
 dc.l 3546895		; on aurait pu faire directement avec période st...
 dc.l 65535		; on n'ira pas jusqu'à 64k
 dc.w $80,$400		; min-max à priori
 dc.b 1			; une seule voie
 dc.b 2			; alignement .w suffit
 dc.b 64		; échelle standard à 64
 dc.b %00101010		; no sync, 8bit, chipmem, no pan, mono ok, 0, cpu std
 dc.b 0			; mono
; even	; pas besoin ici

dat dc.b "animate.dat",0
scr dc.b "animate.scr",0
err0 dc.b "script pété",10,0
err1 dc.b "opcode inconnu : %04lx",10,0
err2 dc.b "opcode bugué : %04lx",10,0
err3 dc.b "item animate.dat inexistant : %ld",10,0
err4 dc.b "items compressés pas supportés",10,0
err5 dc.b "pas ça sur une var écran !",10,0
err6 dc.b "opération sur objet vide !",10,0
err7 dc.b "item %ld non blittable",10,0
err8 dc.b "écriture sur objet non vide",10,0
err9 dc.b "rebouclage sur null-script",10,0
erra dc.b "objet non affichable",10,0
errb dc.b "objet n'est pas un gfx",10,0
errc dc.b "blit pas du bon item",10,0
errd dc.b "opcode 0006 est pas bon",10,0
erre dc.b "var hors limites du tab",10,0
errf dc.b "fin script prématurée",10,0
errsn dc.b "sound buffer overflow !",10,0

 include sysbtm.i

 bss
vars ds.b isiz*maxtab
stpal ds.w 16
palvide ds.w 16		; palette vide
ampal ds.w 16
aud2 ds.b 20		; juste une voie mono
scrf ds.b 1
 ds.b 3			; align
stscr1 ds.b 32000
stscr2 ds.b 32000

 bss_c
sndbuf ds.b sndsiz
