
; Machaon, partie assembleur version VG5000
; (c) 2012 T&J/GPA
; revision du 15/01/2012

; Assemble avec WINAPE

; Rien de bien violent dans ce bout de code, il ne sert qu'a
; accelerer l'affichage des tableaux du jeu. 
; Les tableaux meme s'ils occupent moins de place que des datas Basic
; ne sont pas optimises. On pourrait facilement diviser l'espace memoire
; par deux en couplant deux "cases" (chaque valeur etant codee sur 4 bits).
; Pas fait sur cette version pour simplifier la mise au point des tableaux.

; Particularite interessante, une des sous-routines va mettre a jour le tableau Basic
; A(11,18). Cela m'a oblige a essayer de comprendre comment est stocke ce tableau en memoire.

; en &49DA, on a un pointeur sur la table des tableaux Basic (coquille dans "Clefs pour VG5000"
; qui indique une table pour des chaines (elles sont en fait stockees avec les variables
; numeriques). 

; Le tableau contient une en-tete de 9 octets :

; &41 = nom du tableau A
; &00 = tableau numerique (&80 pour tableau de chaines)
; &95 &03 = taille en memoire du tableau &0395 = (&C*&13)*4 + 5
; &02 = nombre de dimensions du tableau (1 ou 2)
; &0C &00 = taille de la premiere dimension du tableau ( 11 + element 0)
; &13 &00 = taille de la deuxieme dimension du tableau (18 + element 0)

; Chaque element du tableau numerique occupe 4 octets. Le codage scientifique
; sur quatre octets reste pour l'instant pour moi nebuleux, mais ce n'est pas important
; pour la routine de Machaon, qui utilise des valeurs entre 0 et 6 seulement.

; Le tableau est organise sequentiellement. La premiere dimension est
; prioritaire. Un petit exemple est plus parlant qu'un long discours...
; (A(0,0), A(1,0).... A(18,0) A(1,0) A(1,1) etc... )


; High ram du VG5000 = &7FBE, &7FFF ? A valider

ORG &7000
NOLIST
WRITE "BINARY.BIN"

taille_level equ 187 ; (18x10 cases + 7 octets couleurs, position de depart du papillon et nombre
                     ; de fruits a manger dans un tableau)

level_to_display equ 1 ; (valeur entre 1 et x, transmise avant l'appel de la routine)

base_video equ &4000 ; adresse de base de la zone video du VG5000 (&4000 a &47FF)
more_line equ 80

ptr_tab_tableaux_basic equ &49DA

LD A,level_to_display ; on poke ici le numero de tableau a afficher
JP main

; codage de l'en-tete d'un niveau

; 0 = position x de depart du papillon = b
; 1 = position y de depart du papillon = c
; 2 = couleur du fond des fruits = d
; 3 = couleur des fruits = e
; 4 = couleur des pierres = f
; 5 = couleur des murs = g
; 6 = nombre de fruits a manger pour gagner

level_a

	DB 1,1,2,1,6,1,15
	DB 3,5,2,3,4,4,3,2,5,2,3,3,5,4,2,3,3,2
	DB 3,2,3,3,2,3,3,2,4,4,2,3,3,4,3,3,3,3
	DB 3,3,3,3,3,5,3,3,3,3,3,2,3,3,3,3,5,2
	DB 3,2,2,4,3,4,4,4,3,5,4,3,4,2,3,4,4,4
	DB 3,2,5,4,3,2,2,2,3,3,4,3,4,3,2,3,3,3
	DB 3,3,3,4,3,2,5,2,3,3,4,5,4,3,3,3,4,5
	DB 3,4,4,4,3,3,3,3,3,3,4,3,4,3,4,4,4,3
	DB 3,3,2,3,3,3,5,3,3,4,4,3,4,3,3,5,2,3
	DB 3,4,5,4,3,4,2,3,2,3,3,3,3,3,4,4,3,3
	DB 3,3,3,3,3,3,3,3,5,2,2,2,2,3,5,3,3,2

; Level B

	DB 1,1,1,2,7,3,15
	DB 3,3,3,2,2,3,4,2,3,5,3,2,3,2,3,3,5,3
	DB 3,2,5,2,3,3,4,5,3,3,3,3,3,3,2,3,3,3
	DB 4,3,2,3,3,2,4,5,4,4,3,4,4,4,4,4,3,3
	DB 3,3,3,2,3,3,3,3,4,4,3,4,2,2,2,2,3,2
	DB 3,2,3,2,3,3,3,3,3,5,3,4,5,5,2,2,3,3
	DB 3,4,4,5,4,4,2,3,3,3,3,4,2,2,2,2,3,5
	DB 5,4,3,2,3,4,3,4,4,4,4,4,3,3,3,3,3,3
	DB 3,4,3,3,2,4,3,5,3,2,3,3,3,2,3,3,2,3
	DB 3,4,4,3,4,4,2,3,3,3,3,2,3,3,3,2,2,3
	DB 3,2,3,3,5,3,3,3,2,3,5,3,2,3,5,3,3,3

; Level C

	DB 9,1,6,3,7,4,15
	DB 0,2,2,3,4,3,3,3,3,4,5,4,2,2,2,2,2,4
	DB 0,4,5,3,4,2,3,2,4,4,2,4,2,5,3,3,5,4
	DB 0,2,3,3,3,5,3,5,4,3,3,3,2,3,2,2,3,4
	DB 0,4,4,4,4,4,4,4,4,3,2,3,3,3,2,2,3,4
	DB 0,4,3,2,3,0,5,3,3,5,4,3,2,3,5,2,3,4
	DB 0,4,3,3,3,0,4,4,4,4,4,3,2,3,3,3,3,3
	DB 0,3,3,3,3,0,3,3,3,2,3,3,3,3,3,3,4,2
	DB 0,4,3,3,2,0,4,3,3,3,4,4,4,3,4,3,3,2
	DB 0,4,3,3,2,0,4,5,3,3,2,3,3,5,4,3,5,3
	DB 1,4,5,3,2,0,4,3,3,3,2,5,3,3,4,5,3,3

; Level D

	DB 17,2,6,1,7,4,15
	DB 2,2,2,3,3,5,5,3,3,3,3,2,2,3,5,4,2,2
	DB 3,5,3,3,2,3,3,2,3,4,4,3,3,2,3,4,3,3
	DB 3,3,3,3,3,3,3,2,3,5,3,3,3,3,3,4,0,5
	DB 5,3,3,3,2,2,4,0,4,4,4,3,3,3,3,4,0,3
	DB 4,4,3,3,3,3,4,0,3,2,4,3,2,2,5,4,0,3
	DB 3,3,5,3,2,3,5,0,3,2,4,3,2,2,3,4,3,3
	DB 0,3,3,3,4,3,4,0,3,3,3,3,3,3,3,4,2,3
	DB 0,4,4,3,2,0,4,0,3,3,4,4,4,3,2,4,2,3
	DB 0,5,4,3,2,0,4,0,3,5,4,2,2,3,3,3,3,3
	DB 0,4,4,3,2,5,4,5,3,3,2,5,3,3,3,3,3,3

; Level E

	DB 1,10,6,3,7,4,15
	DB 2,2,5,3,2,4,3,0,5,2,3,3,5,3,3,2,2,2
	DB 2,4,4,4,2,4,2,0,3,0,2,2,4,4,4,2,5,2
	DB 3,3,2,2,3,3,3,0,4,0,2,3,5,2,3,2,3,2
	DB 3,2,3,2,2,2,3,0,4,4,4,3,4,3,4,4,3,3
	DB 3,5,3,3,5,2,3,0,3,0,4,5,3,3,5,2,2,3
	DB 2,2,3,3,3,3,3,0,4,0,2,2,3,2,3,5,2,4
	DB 2,2,3,2,3,2,3,0,4,0,2,2,3,2,3,2,2,3
	DB 5,3,4,5,4,4,3,0,4,0,2,2,3,3,3,3,2,2
	DB 3,3,4,4,2,2,3,0,4,0,3,3,3,2,2,3,2,3
	DB 3,3,3,3,3,3,3,0,4,0,4,2,5,3,3,3,5,5

; Level F

	DB 1,1,6,5,7,4,15
	DB 3,2,3,2,2,3,3,5,3,2,3,4,2,2,2,5,3,3
	DB 3,3,3,5,3,3,3,3,4,3,2,3,2,2,4,4,4,2
	DB 4,0,3,3,3,2,3,3,2,3,3,3,3,3,0,0,3,3
	DB 5,0,3,3,3,3,3,2,3,3,2,3,2,3,4,5,4,3
	DB 2,0,3,2,2,3,3,5,4,3,2,2,2,3,3,4,3,2
	DB 5,0,3,2,3,3,2,3,3,3,2,3,2,3,5,3,3,2
	DB 3,0,5,3,3,2,3,3,2,5,3,3,3,2,2,2,2,3
	DB 4,0,4,3,2,4,4,3,3,3,4,3,3,0,0,0,2,5
	DB 5,0,3,3,5,3,2,3,4,3,2,3,3,4,4,4,2,4
	DB 4,0,4,3,2,3,3,3,2,3,3,2,5,3,3,3,3,5	
	
	
; Level G
			
	DB 1,1,1,3,6,7,15
	DB 2,3,3,2,3,3,3,2,4,3,2,3,3,3,3,2,5,3
	DB 2,3,2,4,4,4,3,3,4,3,2,3,2,2,3,2,3,2
	DB 3,3,3,3,3,5,3,3,4,5,3,3,3,5,3,3,3,3
	DB 3,3,3,3,3,6,2,3,3,3,3,3,4,4,4,3,5,2
	DB 3,4,4,3,3,3,2,3,3,3,2,2,2,3,3,3,3,3
	DB 3,3,3,0,3,3,3,5,3,3,2,5,2,3,3,4,4,3
	DB 2,3,3,0,3,3,3,4,4,4,4,4,3,3,3,3,3,3
	DB 3,3,3,3,3,3,3,4,3,3,3,3,3,3,0,4,3,3
	DB 0,6,2,2,2,4,3,3,3,5,3,5,3,3,0,4,6,3
	DB 0,5,3,3,5,4,3,3,3,2,6,3,3,2,0,4,2,2

;Level H

	DB 1,3,3,1,6,7,15
	DB 3,3,2,3,3,3,2,3,2,5,4,2,4,4,3,2,2,3
	DB 2,3,3,6,3,2,2,5,2,3,4,2,2,4,5,3,3,3
	DB 2,3,4,4,3,2,3,4,2,4,4,2,2,4,3,4,4,3
	DB 3,3,3,3,3,3,3,4,2,3,3,3,3,3,0,3,2,3
	DB 3,4,3,4,4,4,3,4,3,3,3,3,3,4,0,5,3,3
	DB 3,2,6,2,3,3,3,4,6,5,6,3,2,4,0,3,4,4
	DB 3,2,5,2,4,4,3,2,6,6,2,2,2,3,0,3,3,3
	DB 3,2,3,2,3,3,3,3,3,3,3,2,2,3,0,3,3,3
	DB 3,3,3,3,6,6,3,3,3,3,3,3,3,3,4,4,3,3
	DB 0,0,0,0,2,2,3,3,2,3,2,2,3,3,3,3,3,6

; Level I
	DB 9,5,4,3,6,7,18
	DB 3,2,2,2,3,3,3,3,3,3,3,3,2,0,2,3,2,3
	DB 3,3,3,3,3,4,3,3,3,3,2,3,2,0,2,3,2,3
	DB 3,6,6,3,3,4,3,5,3,4,4,4,4,0,2,2,5,2
	DB 5,3,3,3,3,3,3,3,3,2,3,3,3,0,3,3,2,3
	DB 4,4,4,3,5,4,3,3,3,4,3,2,3,0,3,3,3,3
	DB 2,2,2,3,3,4,3,6,0,4,3,3,3,3,3,2,3,3
	DB 3,5,5,3,3,3,6,2,0,3,2,2,3,3,3,6,2,2
	DB 3,2,2,3,3,6,2,2,0,3,3,5,2,3,3,6,2,5
	DB 3,6,2,3,4,4,4,3,0,3,3,3,3,2,3,6,3,3
	DB 3,3,3,3,2,3,3,3,0,4,3,2,3,6,3,3,4,4

; Level J
	DB 9,5,4,6,7,4,17
	DB 3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3
	DB 3,3,3,3,4,6,4,4,2,3,5,2,3,3,2,2,2,5
	DB 3,2,2,3,3,3,3,3,3,3,4,4,2,4,4,5,2,2
	DB 3,5,3,3,3,2,4,4,4,3,3,3,2,3,3,3,3,3
	DB 3,3,0,3,6,3,3,0,3,3,3,3,0,3,0,0,3,3
	DB 4,4,0,3,3,5,2,0,2,3,2,3,0,3,0,0,4,4
	DB 3,3,0,3,2,3,3,0,6,3,3,3,0,3,6,0,3,3
	DB 6,3,0,3,3,2,3,0,3,3,5,3,0,6,3,0,3,3
	DB 3,3,0,3,4,4,3,0,3,2,3,3,0,4,6,3,2,3
	DB 3,3,6,3,3,3,3,3,3,6,5,3,3,4,3,3,3,5

; Level K
	DB 9,5,4,6,3,3,20
	DB 3,3,3,3,3,2,2,2,2,3,2,2,3,3,3,3,2,3
	DB 3,2,2,2,3,3,5,3,3,3,3,3,3,3,2,6,5,3
	DB 3,3,2,6,3,3,3,2,2,2,2,5,2,6,2,2,2,2
	DB 3,2,3,2,2,3,3,3,3,3,2,3,2,3,3,3,3,3
	DB 2,2,5,2,3,6,2,3,2,6,3,3,2,2,2,3,2,2
	DB 3,3,3,3,3,0,2,3,2,2,2,3,3,3,0,3,2,5
	DB 3,3,3,3,2,0,2,3,3,3,3,6,2,3,0,3,3,3
	DB 3,2,6,2,2,0,2,5,2,2,2,3,2,3,0,3,2,3
	DB 5,3,3,5,2,0,2,3,2,5,2,5,2,3,2,2,2,3
	DB 3,6,3,3,3,0,2,3,3,3,2,3,3,3,3,5,2,5

; Level L
	DB 9,5,0,1,3,1,15
	DB 3,3,3,3,2,5,3,3,2,3,2,3,3,2,3,2,3,2
	DB 3,2,3,4,4,4,3,3,3,3,3,3,3,2,3,3,3,2
	DB 3,0,3,2,2,3,3,2,3,4,4,3,3,4,3,3,3,3
	DB 5,0,3,2,3,3,3,3,3,4,3,0,3,4,3,0,0,3
	DB 3,0,3,3,0,3,3,0,0,4,2,0,3,3,3,0,6,3
	DB 3,0,3,3,0,3,6,0,0,4,3,0,6,3,3,0,0,3
	DB 3,3,3,3,0,3,4,0,0,5,3,0,3,2,4,0,3,3
	DB 0,0,0,4,0,5,4,3,3,3,0,0,3,3,4,5,5,0
	DB 0,0,0,4,3,3,4,3,2,3,0,3,6,3,4,4,4,0
	DB 6,6,5,4,2,2,4,3,6,2,0,3,3,3,2,5,0,0

; Level M
	DB 13,2,5,1,3,1,21
	DB 2,3,3,3,2,2,3,3,5,3,3,3,2,2,3,3,3,2
	DB 3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3
	DB 3,6,2,5,2,3,2,6,4,4,6,2,3,2,5,2,6,3
	DB 3,4,4,4,4,3,2,3,2,2,3,2,3,4,4,4,4,3
	DB 2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2
	DB 5,3,3,2,6,2,4,4,3,3,4,4,2,6,2,3,5,5
	DB 2,2,3,3,4,2,2,2,2,3,2,2,2,4,2,3,2,2
	DB 3,3,6,3,4,3,5,2,2,3,2,5,3,4,3,3,2,3
	DB 3,6,3,3,4,3,3,2,3,3,3,3,3,4,2,6,6,3
	DB 3,3,3,2,5,3,3,3,3,5,3,3,3,5,3,3,3,3

; Level N
	DB 2,2,2,1,3,1,15
	DB 3,2,2,2,2,3,4,3,2,2,5,4,3,3,3,2,2,3
	DB 3,2,3,3,2,3,4,3,2,3,3,4,3,2,3,3,2,3
	DB 5,2,3,3,2,3,4,4,3,3,4,4,3,3,2,3,3,6
	DB 3,3,2,3,6,3,3,4,3,6,4,5,3,3,2,3,3,3
	DB 3,3,4,4,4,3,3,4,3,2,4,0,4,4,4,4,3,3
	DB 5,3,3,3,3,3,3,4,2,3,3,0,5,2,3,3,5,3
	DB 3,3,3,2,2,3,0,5,3,3,3,0,3,3,3,3,3,2
	DB 3,2,3,5,3,0,0,4,3,3,2,0,0,2,3,2,3,3
	DB 6,3,3,3,3,0,0,4,3,3,4,0,4,3,3,6,3,3
	DB 3,0,0,0,0,0,0,4,5,6,4,0,4,0,0,0,0,2

; Level O
	DB 5,7,6,1,3,1,19	
	DB 3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,4,3,2
	DB 3,6,3,3,3,3,4,4,4,4,4,2,3,3,3,2,3,3
	DB 3,3,3,3,3,2,3,3,3,3,5,3,3,2,2,4,3,2
	DB 3,2,3,6,3,3,3,4,3,4,4,4,3,4,4,4,3,3
	DB 2,2,3,4,3,3,3,3,3,3,4,3,6,0,3,3,3,2
	DB 3,3,3,4,3,3,3,3,3,3,3,3,6,0,3,3,6,3
	DB 3,2,2,2,3,6,6,3,3,3,6,6,6,0,4,3,3,3
	DB 2,3,3,2,3,3,3,6,6,3,6,3,6,0,2,3,3,2
	DB 3,6,3,2,3,4,4,4,3,3,6,3,6,4,3,2,3,3
	DB 3,3,3,3,3,3,3,3,3,3,6,3,3,4,3,3,3,3
	
; Level P
	DB 18,10,6,1,3,1,16
	DB 2,3,3,2,3,2,2,3,3,2,3,3,2,2,3,2,3,3
	DB 3,3,2,6,3,2,3,3,2,3,3,2,3,3,2,5,3,2
	DB 5,2,2,3,2,3,3,2,2,3,2,6,3,3,3,3,2,3
	DB 3,3,3,2,5,3,2,6,3,2,3,3,2,3,3,2,2,3
	DB 3,6,2,3,3,2,3,3,2,3,5,2,3,3,2,6,3,2
	DB 3,2,2,3,2,2,3,2,3,3,2,2,3,2,3,3,2,3
	DB 2,3,5,2,3,5,2,3,6,2,3,3,2,3,3,2,3,3
	DB 3,2,2,3,3,3,3,3,2,3,5,2,3,3,3,3,5,2
	DB 3,3,3,2,3,2,3,2,2,3,3,3,3,2,2,3,2,3
	DB 2,3,2,3,3,3,6,3,3,3,3,6,2,3,3,3,3,3

	
; encodage dans le tableau Basic des valeurs 0 a 6

tab_basic_values

	db &00,&00 ; 0
	db &00,&81 ; 1
	db &00,&82 ; 2
	db &40,&82 ; 3
	db &00,&83 ; 4
	db &20,&83 ; 5
	db &40,&83 ; 6
	
; on remplit le tableau Basic avec les valeurs du niveau
; fait a la debrouille, pas pige comment marche le codage des
; valeurs numeriques (sur 4 octets en notation scientifique)	
	
; en entree, HL pointe sur le tableau a poker dans A(x,y)
	
fill_tab_basic

	
	PUSH HL
	
	LD HL,(ptr_tab_tableaux_basic) ;on calcule l'emplacement en ram
	
	LD BC,85 ; 19*4 + 9 taille du header du tableau Basic
	
	ADD HL,BC ; on se retrouve sur A(1,1) (en theorie)
	EX DE,HL  ; dans DE, destination

	POP HL ; on recupere le pointeur sur le tablea a afficher

	INC DE ; on passe la valeur A(0,0) pour pointer sur A(1,0) 
	INC DE
	INC DE 
	INC DE
	
	LD A,10 ; longueur du tableau
	
fill_tab_basic2	
	PUSH AF
	PUSH HL	

	LD A,18 ; hauteur 
	
fill_tab_basic1
	PUSH AF
	PUSH HL

	LD A,(HL)
	RLA ; x2
	LD C,A
	LD HL,tab_basic_values
	LD B,&0
	ADD HL,BC ; on pointe sur la table de conversion des valeurs 0-7 en notation numerique
	
	INC DE ; on laisse les deux premiers octets du tableau Basic a 00
	INC DE
	LDI
	LDI
	POP HL
	INC HL
	POP AF
	DEC A
	JR NZ,fill_tab_basic1

	POP HL

	LD BC,18
	ADD HL,BC ; ligne suivante du tableau assembleur	

	INC DE ; on passe la case A(X,0) de la ligne BAsic suivante
	INC DE
	INC DE
	INC DE

	POP AF
	DEC A
	JR NZ,fill_tab_basic2
	
	RET
	
; Codes ASCII des sprites a afficher
; On rajoute &80 pour que le processeur video les considere
; comme des caracteres graphiques.
	
Tab_sprites

; vide1   
	    db 50+&80,50+&80,50+&80,50+&80  ; 0
vide2   db 50+&80,50+&80,50+&80,50+&80  ; 1
rocher  db 40+&80,41+&80,42+&80,43+&80  ; 2
pelouse db 48+&80,48+&80,49+&80,49+&80  ; 3
murs    db 51+&80,51+&80,51+&80,51+&80  ; 4
fruit   db 36+&80,37+&80,38+&80,39+&80  ; 5
bogue   db 52+&80,53+&80,54+&80,55+&80  ; 6

	
; sprite 0 (fond noir) toujours a 0
; sprite 1 (fond de couleur) variable
; sprite 2 (cailloux) fond noir + encre couleur variable
; sprite 3 (pelouse) fond et caracteres couleurs variables
; sprite 4 (murs) fond noir et caractere couleurs variable
; sprite 5 fruits (comme la pelouse)
; sprite 6 bogue (comme la pelouse)

tab_colors_sprites

	db 00,00,00,00,00,00,00

	
; calcul des code couleurs pour chaque caractere en fonction du tableau
; En entree, HL contient la liste des couleurs utilisees dans le tableau a afficher
; A la fin de la routine, la table tab_colors_sprites contient les codes a envoyer
; en memoire video pour afficher les sprites avec les couleurs choisies (un sprite
; = un couple couleur d'avant plan / couleur de fond)

convert_colors

	PUSH HL
	POP IX
	
	LD DE,tab_colors_sprites+1	
	LD A,(IX + &2) ; fond de couleur
	LD (DE),A
	INC DE
	
	LD A,(IX + &4) ; couleur des pierres, fond noir + variable
	LD (DE),A
	INC DE
	
	LD A,(IX+&2)
	ADD A,A
	ADD A,A
	ADD A,A ; 16 = fond de couleur
	ADD A,A
	LD B,A
	LD A,(IX+&3)
	ADD A,B
	LD (DE),A ; couleurs de la pelouse
	INC DE
	
	PUSH AF ; on sauvegarde les couleurs pour plus tard

	LD A,(IX+&5)
	LD (DE),A  ; couleur des murs
	INC DE
	
	POP AF
	LD (DE),A ; on recupere la couleur de la pelouse pour les fruits
	INC DE
	
	LD (DE),A ; on recupere la couleur de la pelouse pour les bogues

	LD HL,tab_colors_sprites
	LD B,7

force_mode_graphique1
	LD A,(HL)
	OR 128
	LD (HL),A
	INC HL	
	DJNZ force_mode_graphique1

	RET

	
; Affichage d'un sprite	
; en entree A = numero de sprite
; DE = adresse video ?

aff_sprite  LD HL,tab_colors_sprites  ; on recupere les couleurs du sprite
	LD C,A
	LD B,&0
	ADD HL,BC
	LD A,(HL)
	EX AF,AF'

	LD A,C			
	ADD A,A ; on multiplie A par la largeur d'un sprite caractere (4)
	ADD A,A
	LD HL,tab_sprites
	LD B,&0
	LD C,A
	ADD HL,BC ; on pointe sur le bon sprite
			
	EX AF,AF'
			
	LDI
	LD (DE),A
	INC DE
	LDI
	LD (DE),A
			
	EX DE,HL	
	LD BC,more_line-3
	ADD HL,BC
	EX DE,HL
	LDI
	LD (DE),A
	INC DE
	LDI
	LD (DE),A
	RET  

	
; affichage des bords de l'aire de jeu
; code a l'arrache, on doit pouvoir optimiser ca en terme de place memoire	
	
aff_bordures	

	LD A,(tab_colors_sprites+4)
	LD HL,base_video+2
	CALL bordure_ligne
	LD HL,base_video+2+1680 ; 1760 = ligne 21 soit 21*80
	CALL bordure_ligne
	
bordure_colonne
	LD B,20
	LD HL,base_video+2+80 ; ligne 1 colonne 1

bordure_colonne1
	PUSH BC
	LD (HL),51+&80
	INC HL
	LD (HL),A
	
	LD BC,73  
	ADD HL,BC ; ligne 38 ?
	
	LD (HL),51+&80
	INC HL
	LD (HL),A
	LD BC,5
	ADD HL,BC
	POP BC
	DJNZ bordure_colonne1
	RET
	
bordure_ligne
	LD B,38

bordure_high
	LD (HL),51+&80 ; caractere mur
	INC L          ; optimisation a deux balles, la premiere valeur pokee en ram
	LD (HL),A      ; etant toujours sur une "case" paire.
	INC HL
	DJNZ bordure_high
	RET

; routine principale 
; Trois grandes etapes
; - calcul des codes couleurs a poker en memoire video en fonction des datas des tableaux
; - affichage de la bordure autour du tableau
; - affichage du tableau	
; parametre a transmettre, numero de tableau dans A

; Variables utilisees pour l'affichage du tableau dans la boucle main

pos_x db &00
pos_y db &00

	
main
	
	DI ; desactivation des interruptions, sinon plantage au retour Basic
	   ; Ca semble etrange, peut-etre lie a l'utilisation de EX AF,AF', mais
	   ; bon...
	   
	PUSH HL ; utile sur VG5000 pour un retour correct au BASIC
	PUSH IX	; Dans "Clefs pour VG5000", c'est indique que le registre n'a pas a etre preserve
		    ; lors d'un CALL BASIC
	        ; Etrangement, ca fait des choses bizarres au retour (la bordure change de couleur,
			; et plantages aleatoires) donc, on preserve aussi.
		
	LD HL,level_A      ; on pointe sur la table du niveau a afficher
	LD BC,taille_level
main0	
	DEC A
	JR Z,main1
	ADD HL,BC
	JR main0

main1	

	PUSH HL
	CALL convert_colors

	CALL aff_bordures

	POP HL ; on recupere le pointeur sur le debut de la table du niveau a afficher

	LD BC,7
	ADD HL,BC
	PUSH HL

	CALL fill_tab_basic ; hop, on profite du calcul ci-dessus pour optimise la mise a jour
                            ; par l'assembleur du tableua Basic A(18,11)

	POP IX  ; on pointe sur la table des sprites du niveau

	LD A,&1
	LD (pos_y),A

	LD B,10

main3
	PUSH BC

	LD A,&2
	LD (pos_x),A
	
	LD B,18
main2
	PUSH BC

	LD A,(pos_y)

	LD BC,&50

	LD HL,base_video
	AND A
	JR Z,calc_video2
		
calc_video1		
	ADD HL,BC
	DEC A
	JR NZ,calc_video1
		
calc_video2		
	LD A,(pos_x)
	ADD A,A
	LD C,A
	LD B,&0
	ADD HL,BC ; dans HL, position video ou afficher le sprite
	EX DE,HL
		
	LD A,(IX+&0) ; test affichage d'un sprite en 0 x 0
	CALL aff_sprite
	INC IX

	LD A,(pos_x)
	INC A
	INC A
	LD (pos_x),A
	POP BC
	DJNZ main2
	
	LD A,(pos_y)
	INC A
	INC A
	LD (pos_y),A
	POP BC

	DJNZ main3
	
	POP IX ; on recupere les valeurs des registres sauvegardes
	POP HL ; pour un retour correct au Basic.
	EI     ; on retablit les interruptions
	
	RET