La Place des Développeurs Question sur Zone des Sprites
Reprise du message précédent
igal :
Ok ok...On peut donc pas indiquer une Valeur Négative qui aurait permis d'atteindre la "Page non Active" juste avec la valeur -1
Non, car les valeurs négatives ne sont qu'une illusion.
Ce ne sont pas des valeurs "en plus", c'est simplement une façon différente d'interpréter un même chiffre.
Un nombre sur 2 octets peut coder une valeur entre 0 et 65535. Mais si on considère que le dernier bit représente le signe, alors on peut dire aussi que ces 2 octets peuvent coder une valeur entre -32767 et +32768. Et c'est en fait strictement la même chose.
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
Eric,
Voilà déjà la routine de déplacement de la zone et d'affectation de la nouvelle :
Et le code correspondant :
Je précise que je n'ai pas vérifié son exécution et que j'ai généré le code à la main ...
Il se peut donc qu'il y ait des erreurs.
EDIT : je ne sais pas comment Nestor gère les zones de langage machine. Il se peut qu'il faille ajouter un "RET" (&hC9) à la fin du code, si la routine est appelée par un "CALL". Edité par Metalion Le 13/01/2016 à 10h37
Voilà déjà la routine de déplacement de la zone et d'affectation de la nouvelle :
Code :
; Déplacement de la zone d'origine vers la nouvelle zone
; Table couleur sprites : de $0F800 vers $10000, longueur 512 octets
; equivalent COPY (0,248)-(255,249) TO (0,256)
ld hl,0
ld (SX),hl ; SX = $F562
ld hl,248
ld (SY),hl ; SY = $F564
ld hl,0
ld (DX),hl ; DX = $F566
ld hl,256
ld (DY),hl ; DY = $F568
ld hl,256
ld (NX),hl ; NX = $F56A
ld hl,2
ld (NY),hl ; NY = $F56C
ld hl,0
ld (ARG),hl ; ARG = $F56F
ld a,3
ld (LOGOP),a ; LOGOP = $F571
ld hl,SX
ld ix, BLTVV ; BLTVV = $0191
call EXTROM ; EXTROM = $0015
; Table attributs sprites : de $0FA00 vers $10200, longueur 128 octets
; equivalent COPY (0,250)-(127,250) TO (0,258)
ld hl,0
ld (SX),hl ; SX = $F562
ld hl,250
ld (SY),hl ; SY = $F564
ld hl,0
ld (DX),hl ; DX = $F566
ld hl,258
ld (DY),hl ; DY = $F568
ld hl,128
ld (NX),hl ; NX = $F56A
ld hl,1
ld (NY),hl ; NY = $F56C
ld hl,0
ld (ARG),hl ; ARG = $F56F
ld a,3
ld (LOGOP),a ; LOGOP = $F571
ld hl,SX
ld ix, BLTVV ; BLTVV = $0191
call EXTROM ; EXTROM = $0015
; Table génération sprites : de $0F000 vers $10800, longueur 2048 octets
; equivalent COPY (0,240)-(255,247) TO (0,264)
ld hl,0
ld (SX),hl ; SX = $F562
ld hl,240
ld (SY),hl ; SY = $F564
ld hl,0
ld (DX),hl ; DX = $F566
ld hl,264
ld (DY),hl ; DY = $F568
ld hl,256
ld (NX),hl ; NX = $F56A
ld hl,8
ld (NY),hl ; NY = $F56C
ld hl,0
ld (ARG),hl ; ARG = $F56F
ld a,3
ld (LOGOP),a ; LOGOP = $F571
ld hl,SX
ld ix, BLTVV ; BLTVV = $0191
call EXTROM ; EXTROM = $0015
; Adresse table attributs sprites = $10200 (66048)
; => registre 5 = 0
; => registre 11 = 2
ld c,5
ld b,0
call WRTVDP (0047h)
ld c,11
ld b,2
call WRTVDP (0047h)
; Adresse table génération sprites = $10800 (67584)
; => registre 6 = 33
ld c,6
ld b,33
call WRTVDP (0047h)
Et le code correspondant :
Code :
&h21,&h00,&h00,&h22,&h62,&hF5,&h21,&hF8,&h00,&h22,&h64,&hF5,&h21,&h00,&h00,&h22,&h66,&hF5,&h21,&h00,&h01,&h22,&h68,&hF5,&h21,&h00,&h01,&h22,&h6A,&hF5,&h21,&h02,&h00,&h22,&h6C,&hF5,&h21,&h00,&h00,&h22,&h6F,&hF5,&h3E,&h03,&h32,&h71,&hF5,&h21,&h62,&hF5,&hDD,&h21,&h91,&h01,&hCD,&h15,&h00
&h21,&h00,&h00,&h22,&h62,&hF5,&h21,&hFA,&h00,&h22,&h64,&hF5,&h21,&h00,&h00,&h22,&h66,&hF5,&h21,&h02,&h01,&h22,&h68,&hF5,&h21,&h80,&h00,&h22,&h6A,&hF5,&h21,&h01,&h00,&h22,&h6C,&hF5,&h21,&h00,&h00,&h22,&h6F,&hF5,&h3E,&h03,&h32,&h71,&hF5,&h21,&h62,&hF5,&hDD,&h21,&h91,&h01,&hCD,&h15,&h00
&h21,&h00,&h00,&h22,&h62,&hF5,&h21,&hF0,&h00,&h22,&h64,&hF5,&h21,&h00,&h00,&h22,&h66,&hF5,&h21,&h08,&h01,&h22,&h68,&hF5,&h21,&h00,&h01,&h22,&h6A,&hF5,&h21,&h08,&h00,&h22,&h6C,&hF5,&h21,&h00,&h00,&h22,&h6F,&hF5,&h3E,&h03,&h32,&h71,&hF5,&h21,&h62,&hF5,&hDD,&h21,&h91,&h01,&hCD,&h15,&h00
&h0E,&h05,&h06,&h00,&hCD,&h47,&h00,&h0E,&h0B,&h06,&h02,&hCD,&h47,&h00,&h0E,&h06,&h06,&h21,&hCD,&h47,&h00
Je précise que je n'ai pas vérifié son exécution et que j'ai généré le code à la main ...
Il se peut donc qu'il y ait des erreurs.
EDIT : je ne sais pas comment Nestor gère les zones de langage machine. Il se peut qu'il faille ajouter un "RET" (&hC9) à la fin du code, si la routine est appelée par un "CALL". Edité par Metalion Le 13/01/2016 à 10h37
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
Pour la routine PUTSPRITE, il faudrait que j'en sache plus sur le fonctionnement du Nestor Basic. Car je ne sais pas où il implante les routines assembleurs intégrées, ni quelles sont les zones réservées en RAM. Je me renseigne.
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
ericb59 :
@ Metalion
as tu pu voir pour faire la routine pour nestor basic ?
as tu pu voir pour faire la routine pour nestor basic ?
Non, pas encore, Eric.
J'ai été un peu optimiste sur le temps que j'avais pour faire ça
Je regarde ça d'ici à la fin de cette semaine.
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
igal
Membre non connecté
Conseiller Municipal
Bon ben j'ai pas dit mon dernier mot.....lol
Le mode entrelacé:
Est il possible le que ce mode ne permette qu'une seule zone réservée.
Est il possible que cette unique zone soit celle située sur la "seconde" page?
Si c'est le cas, alors on doit pouvoir écrire et lire cette zone "lointaine" en asculant en mode entrelacé un peu comme l'a fait Gdx avec la méthode "un chargement et deux destinations".
Non? Lol
Le mode entrelacé:
Est il possible le que ce mode ne permette qu'une seule zone réservée.
Est il possible que cette unique zone soit celle située sur la "seconde" page?
Si c'est le cas, alors on doit pouvoir écrire et lire cette zone "lointaine" en asculant en mode entrelacé un peu comme l'a fait Gdx avec la méthode "un chargement et deux destinations".
Non? Lol
igal :
Bon ben j'ai pas dit mon dernier mot.....lol
Le mode entrelacé:
Est il possible le que ce mode ne permette qu'une seule zone réservée.
Est il possible que cette unique zone soit celle située sur la "seconde" page?
Le mode entrelacé:
Est il possible le que ce mode ne permette qu'une seule zone réservée.
Est il possible que cette unique zone soit celle située sur la "seconde" page?
Le mode entrelacé ne fait qu'utiliser 2 pages qui sont 2 pages d'affichage tout ce qu'il y a de plus normal (par exemple la page 0 et la page 1). Mais il ne les utilise que les lignes 0 à 211. Les lignes 212 à 255 ne sont pas affichées, et et à ma connaissance, doivent très certainement contenir les zones de sprites, comme pour un affichage normal. Donc cela ne change rien.
Igal, si tu veux faire du scrolling multi-direction ET déplacer la zone de sprite, le tout en BASIC, il suffirait que tu abandonnes le SCREEN8 pour passer au SCREEN5. Là, tu pourras tout faire, et en BASIC !
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
igal
Membre non connecté
Conseiller Municipal
Voilà.
Ca m'a permis de découvrir NestorBasic, que je ne connaissais que vaguement, et franchement, je trouve que c'est un outil extraordinaire pour celui qui ne veut pas se lancer dans l'assembleur mais qui est gèné aux entournures par les limitations du BASIC. Il donne la souplesse et la vitesse de l'assembleur avec peu de difficultés.
Igal, toi qui cherche constamment à faire des choses que le BASIC ne peut pas faire, tu devrais te lancer dans le NestorBasic. Je te le conseille vivement.
J'ai fait deux programmes. Le premier déplace les 3 zones constituantes des sprites (il remplace mon précédent listing en assembleur pur - car c'est carrément plus simple avec le NestorBasic) et le deuxième joue le rôle d'un PUT SPRITE, avec les nouveaux paramètres.
Deux remarques importantes : les programmes n'ont pas été testés complètement, donc il y aura peut-être des problèmes. Et ensuite, j'ai travaillé avec un MSX2 virtuel (sur BlueMSX) pour lequel le premier segment de mémoire (dans le sens donné par le NestorBasic) est le numéro 32 (c'est la variable S que l'on voit au début des programmes). Logiquement, ce numéro de segment peut être donné par la routine numéro 1 du NestorBasic, mais je n'ai pas obtenu de résultats stables, parfois j'obtenai n'importe quoi comme réponse par le retour de la variable P(0). C'est pourquoi j'ai mis 32 en fixe, mais il faut adapter au MSX qui fait tourner le programme.
Déplacement des zones constituantes des sprites
Equivalent de PUT SPRITE
Ca m'a permis de découvrir NestorBasic, que je ne connaissais que vaguement, et franchement, je trouve que c'est un outil extraordinaire pour celui qui ne veut pas se lancer dans l'assembleur mais qui est gèné aux entournures par les limitations du BASIC. Il donne la souplesse et la vitesse de l'assembleur avec peu de difficultés.
Igal, toi qui cherche constamment à faire des choses que le BASIC ne peut pas faire, tu devrais te lancer dans le NestorBasic. Je te le conseille vivement.
J'ai fait deux programmes. Le premier déplace les 3 zones constituantes des sprites (il remplace mon précédent listing en assembleur pur - car c'est carrément plus simple avec le NestorBasic) et le deuxième joue le rôle d'un PUT SPRITE, avec les nouveaux paramètres.
Deux remarques importantes : les programmes n'ont pas été testés complètement, donc il y aura peut-être des problèmes. Et ensuite, j'ai travaillé avec un MSX2 virtuel (sur BlueMSX) pour lequel le premier segment de mémoire (dans le sens donné par le NestorBasic) est le numéro 32 (c'est la variable S que l'on voit au début des programmes). Logiquement, ce numéro de segment peut être donné par la routine numéro 1 du NestorBasic, mais je n'ai pas obtenu de résultats stables, parfois j'obtenai n'importe quoi comme réponse par le retour de la variable P(0). C'est pourquoi j'ai mis 32 en fixe, mais il faut adapter au MSX qui fait tourner le programme.
Déplacement des zones constituantes des sprites
Code :
10 S=32
20 '
30 'Transfert de la table de couleur des sprites
40 'de $0F800 vers $10000, longueur 512 octets
50 '
60 P(0)=S+6
70 P(1)=&HF800-&H4000
80 P(2)=S+3
90 P(3)=0
100 P(4)=512
110 J=USR(23)
120 '
130 'Transfert de la table des attributs des sprites
140 'de $0FA00 vers $10200, longueur 128 octets
150 '
160 P(0)=S+6
170 P(1)=&HFA00-&H4000
180 P(2)=S+3
190 P(3)=&H200
200 P(4)=128
210 J=USR(23)
220 '
230 'Transfert de la table de génération des sprites
240 'de $0F000 vers $10800, longueur 2048 octets
250 '
260 P(0)=S+6
270 P(1)=&HF000-&H4000
280 P(2)=S+3
290 P(3)=&H800
300 P(4)=2048
310 J=USR(23)
320 '
330 'Adresse table attributs sprites = $10200 (66048)
340 '=> registre 5 = 0
350 '=> registre 11 = 2
360 '
362 P(0)=0
364 P(1)=&h47
366 P(3)=5
368 J=USR(58)
370 P(0)=0
380 P(1)=&H47
390 P(3)=2*256+11
400 J=USR(58)
410 '
420 'Adresse table génération sprites = $10800 (67584)
430 '=> registre 6 = 33
440 '
450 P(0)=0
460 P(1)=&H47
470 P(3)=33*256+6
480 J=USR(58)
Equivalent de PUT SPRITE
Code :
Edité par
Metalion
Le 22/01/2016 à 14h48
10 '
20 ' PUT SPRITE P,(X,Y),C,SP
30 '
40 S=32
50 P(0)=S+3
60 P(1)=&H200+P*4
70 P(2)=Y
80 J=USR(18)
90 P(2)=X
100 J=USR(18)
110 P(2)=SP
120 J=USR(18)
130 P(2)=C
140 J=USR(18)
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
ericb59
Membre non connecté
Conseiller Municipal
Mazette je suis scotché par la petitesse de la routine Put Sprite...
Comme quoi quand on connais bien la bécane on peut faire des truc de ouf !
Je vais essayer ça ce week-end...
Merci Metalion
Comme quoi quand on connais bien la bécane on peut faire des truc de ouf !
Je vais essayer ça ce week-end...
Merci Metalion
Ce n'est qu'une routine qui écrit 4 octets en VRAM, ce n'est pas très compliqué ...
Une précision : le S=32 est valable pour un MSX2 avec 512Kb de RAM (32 x 16 = 512). Il faut donc changer la variable S en fonction de la RAM totale disponible. Le plus simple serait que NestorBasic donne lui même cette valeur : il suffit logiquement de faire J=USR(1):PRINT P(0) mais les résultats sont ... variables.
Une précision : le S=32 est valable pour un MSX2 avec 512Kb de RAM (32 x 16 = 512). Il faut donc changer la variable S en fonction de la RAM totale disponible. Le plus simple serait que NestorBasic donne lui même cette valeur : il suffit logiquement de faire J=USR(1):PRINT P(0) mais les résultats sont ... variables.
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
Je viens de vérifier le premier listing, il manque les lignes suivantes :
EDIT : c'est corrigé Edité par Metalion Le 22/01/2016 à 14h49
Code :
362 P(0)=0
364 P(1)=&h47
366 P(3)=5
368 J=USR(58)
EDIT : c'est corrigé Edité par Metalion Le 22/01/2016 à 14h49
MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
ericb59
Membre non connecté
Conseiller Municipal
Metalion :
Ce n'est qu'une routine qui écrit 4 octets en VRAM, ce n'est pas très compliqué ...
Oui bien sur... Mais disons que : parce-que tu programmes en ASM, tu as un autre point de vue sur les choses... Pour toi un sprite c'est 4 octets en VRAM. Pour moi c'est PUT SPRITE, je ne cherche pas à savoir ce qu'il y a derrière... Edité par ericb59 Le 22/01/2016 à 18h20
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie