asMsx...

Page 1/3
| 2 | 3

By RibbSayan

Resident (59)

RibbSayan's picture

03-06-2010, 16:33

Bonjour à tous,

je l'ai déjà dans un autre post, je suis en train de développer un jeu MSX en assembleur. Pour cela, j'utilise asMsx (magnifique outil) mais je bloque un peu avec la documentation espagnole.

J'aurais aimer savoir comment on utilise les "subpages" dans une megarom.

D'après ce que j'ai vu, je crois comprendre qu'on utilise 2 instructions :

.SUBPAGE n AT X
avec "n" un numéro (consécutif et unique ?) et "X" est une adresse d'une souspage
Tout le code en dessous appartiendra à cette partie de la rom.

.SELECT n AT X / .SELECT r AT X
avec "n" un numéro, "X" l'adresse d'une souspage et "r" un registre
qui permet de rendre visible au z80 une des sous-pages

A votre avis, est-ce bon ?

Login or register to post comments

By Leo

Paragon (1236)

Leo's picture

03-06-2010, 20:13

je faisdes megaroms en assembleurs et je change de page en metant une valeur dans le registre du mappeur konami scc 8kb.

je connait pas asmsx , mais je comprends bien l'espagnol, tu n'a qu'a recopier ici le passage en question.

Mais bon si j'essaye d'intuiter ca doit etre une syntaxe du type :

.SELECT 2 AT 7000h pour mettre la page de 8ko numero 2 entre 6000h et 8000h
.SELECT 5 AT 5000h pour mettre la page de 8ko numero 3 entre 4000h et 6000h
.SELECT A AT 7000h pour mettre la page de 8ko aui est ds le registre A entre 6000h et 7000h

il faut que tu sache quel mappeur tu va utiliser konami ou konami scc ou ascii8, car pour chaque version l'adresse ou on change de page n'est pas la meme .
typiquement on utilise le mapper konami scc si on va utiliser un megaflash scc , c'est ce que je fait.
et on utilise les pages entre 4000h et 6000h pour le prog principal
les pages entre 6000h et 8000h pour les sous routines , genre pour bouger les sprite sur les interrupt
et puis apres entre 8000h et 9fffh pour pointer vers des graphs a transferer en vram .

mais bon chacun fait comme il veut.

typiquement ds une megarom de 128ko ,tu vas avoir des pages entre 0 et 15 et a l'init du as deja
les pages 0 1 2 3 qui sont aux adresses de depart : 4000h 6000h 8000h a000h

ce link en anglais explique un peu :
http://bifi.msxnet.org/msxnet/tech/megaroms.html#konamiscc

By RibbSayan

Resident (59)

RibbSayan's picture

03-06-2010, 21:20

Merci Leo, je commence à mieux comprendre.

Pour l'instant, je n'ai pas utiliser un mapper particulier (sauf que le msx dev donne quelques spécifications de mapper :-)
Mon programme (code et data) se trouve entre 4000h et 8000h et la ram à partir de C000h. mais bon, avec un peu de musique, un peu de bruitage et une map (car jeu de plateforme) va me falloir un peu de place. Actuellement, j'ai déja développé les déplacements, les passages inter-écrans. Il me reste encore pas mal de boulot : musique et bruitage complètement inconnu pour moi, les ennemies, les combats contre les boss, intro et ending... Pour l'instant, la structure du programme est prévu mais contient un tas de procédure "vide".

j'ai mis en dessous le texte en espagnol.

.SEARCH Para ROMs y megaROMs que arrancan en la página 1 (4000h), se
encarga de buscar automáticamente el slot y subslot de la página 2
correspondiente (8000h). Equivale al siguiente bloque de código:
call 0138h ;RSLREG
rrca
rrca
and 03h
; Secondary Slot
ld c,a
ld hl,0FCC1h
add a,l
ld l,a
ld a,[hl]
and 80h
or c
ld c,a
inc l
inc l
inc l
inc l
ld a,[hl]
; Define slot ID
and 0ch
or c
ld h,80h
; Enable
call 0024h ;ENASLT

.SUBPAGE n AT X
Esta macro se usa para definer las distintas
subpáginas de una megaROM. En el modelo de generación de megaROMs de
asMSX, todo el código y los datos deben incluirse en subpáginas, que equivalen
a los bloques lógicos de operación del mapeador. Se debe indicar el número de
subpágina que se desea crear, y en qué dirección lógica ensamblarla, es decir,
en que posición se dará su ejecución.

.SELECT n AT x / .SELECT registro AT x
Como replica a la
anterior, esta macro selecciona la subpágina n en la dirección x. El código
concreto utilizado para esta operación dependerá del tipo de mapeador que se
haya seleccionado. No altera el valor de ningún registro ni afecta al modo de
interrupción ni a las banderas de estado.

.PHASE X / .DEPHASE
Estas dos rutinas permiten utilizan direcciones
virtuales de memoria. Es decir, ensamblar en una posición de memoria
instrucciones que luego se ubicarán en otra. Puede ser útil para introducir código
en una ROM que luego se tenga que copiar y ejecutar desde la RAM. Su efecto
es que las etiquetas se ensamblarán de acuerdo con la dirección dada.

.DEPHASE revierte al estado normal, si bien cualquier instrucción ORG, PAGE,SUBPAGE tendrán el mismo efecto.

By Leo

Paragon (1236)

Leo's picture

07-06-2010, 23:18

ce que je comprends :

.SUBPAGE .... : s'utilise comme une en tete sur tes portions de codes , ca permet de definir dans quelle page
ils vont etre. ca pourrait ressemble a la directive assembleur "org" si tu vois le genre.

.SELECT .... : est la commande qui fait la selection effectivement d'une de ces portions de codes. mais il semble qu'il faille declarer le type de mappeur utilise' ( konami4 / 5 , ascii , ... ) ailleurs , ils disent pas ou.

.PHASE : c'est plus evolue' ca permet de creer du code qui va etre reocpie plus tard dans la ram a un autre offset (typiquement pour une gestion d'interrupt )

...

Moi je ferait la selection a la mano , c'est pas trop complique'.

By RibbSayan

Resident (59)

RibbSayan's picture

08-06-2010, 10:31

Merci pour les informations.
Je ne sais pas du tout à quoi sert la directive 'org' (Quoi ! Comment peut-il vouloir développer en assembleur sans connaître cela ! LOL!) car je n'en ai pas encore eu
besoin. Mais je suis toujours prêt à apprendre.

Dans asMSX, on déclare le le type de mapper au début du fichier. Voici actuellement la structure de ma rom via asMSX :

; Assembler directives
.bios ; Defines MSX BIOS routines
.page 1 ; Assembly starts at 4000h
.megarom KONAMI ; Selected format (equivalent à KONAMI without SCC ou konami4)
.start MAIN_BEGIN
; Rom Identifier
db "[RS01] Mon jeu à moi !",1ah

; Equivalence
CHRTB1 equ 0000h ; Pattern Generator Table (partie haute)
CHRTB2 equ 0800h ; Pattern Generator Table (partie milieu)
CHRTB3 equ 1000h ; Pattern Generator Table (partie basse)
NAMTBL equ 1800h ; Pattern Name Table (l'écran)
SPRATR equ 1B00h ; Sprite Attribut (l'écran)
CLRTB1 equ 2000h ; Pattern Color Table (partie haute)
CLRTB2 equ 2800h ; Pattern Color Table (partie milieu)
CLRTB3 equ 3000h ; Pattern Color Table (partie basse)
SPRTBL equ 3800h ; Table Sprite

MAIN_BEGIN:
<Moteur du jeu>

.subpage 1 at 6000h
<Graphisme, Carte du jeu, Paramètres (saut), Dialogue>

.page 3
<buffer ecran sprite et toutes les variables>

Pour l'instant, les premiers 8Ko, c'est le moteur où j'ai géré les déplacements des 2 persos (il reste encore beaucoup de chose à gérer) Je vais octroyé 32ko pour la gestion de la carte et des items et il me reste 88ko pour les bruitages, la musique et les graphismes... J'espère n'avoir rien oublié.

Pour l'instant, j'ai un résultat assez satisfaisant mais ça ne fait pas un jeu encore LOL!

By Leo

Paragon (1236)

Leo's picture

08-06-2010, 13:42

interessant ...
Donc tu ne fait pas encore de .select
typiquement tu fera un

.select 1 at 6000h , pour mettre en 6000h tes graphismes a transferer ds la vram

tu dis .page3 c'est le buffer ecran , mais comment tu peux mettre un buffer ds une rom ? Smile

lorsque tu aura les graphisme du niveau 2 , par exemple dans la page 12 , tu pourra faire un .select 12 at 6000h pour mettre en 6000h ces nouveau graphiques.

Au fait tu fait un jeu msx1 ou msx2 ?Question

By RibbSayan

Resident (59)

RibbSayan's picture

08-06-2010, 14:27

Effectivement, je n'ai pas encore sélectionner la moindre sous-page... Mais ca va venir !

Les 64Ko visible par le Z80 est divisé en 4 pages (0 à 3)

la directive .page 3 indique l'adresse C000h qui n'appartient pas à la rom mais à la ram de la machine. Dans asMsx, dans cette zone, tu ne peux que étiquetter des zones mémoires et reserver de l'espace... Impossible de coder ou d'initialiser des valeurs (d'ailleurs asMsx génère un message d'erreur s'il voit du code)

de: 0000h - 3FFFh (bios et surement d'autres choses que j'ignore encore)
de: 4000h - 5FFFh (rom fixed bank car mapper konami4)
de: 6000h - 7FFFh (rom avec sous-page sélectionnable)
de: 8000h - 9FFFh (rom avec sous-page sélectionnable pas testé encore)
de: A000h - BFFFh (rom avec sous-page sélectionnable pas testé encore)
de: C000h - FFFFh (ram)

Comme je suis plutot dans le moteur du jeu, j'ai fait une mini map avec 5 ecrans permettant de tester les capacités des 2 persos.

Je suis en train de faire un jeu de plateforme MSX1 en coopération (jouable seul ou à deux) j'aimerai participer au MSXDev10. Je pense qu'à un moment, je demanderai de l'aide car je vais avoir du mal à faire une map complète d'environ 200 écrans. Même si c'est plus que présentable, je dois finaliser au moins le moteur des personnages, la gestion des items et les décors destructibles.

By Leo

Paragon (1236)

Leo's picture

08-06-2010, 14:49

ah ok pour la page 3 ,
Bonne chance , tu es sur emulateur ?

By RibbSayan

Resident (59)

RibbSayan's picture

08-06-2010, 15:28

Une savante combinaison entre notepad++, un fichier bat pour compiler et blueMsx avec son debugger.
Pour l'assembleur, j'ai trouvé un site sur amstrad cpc (arghl le croco) avec un très bon tuto sur le Z80.
De la documentation MSX glaner ici et là (pour l'instant, tout sur le screen 2 et pas autres chose)
Pour les graphismes, j'ai développer un editeur de pattern et un editeur de niveau qui me génère les codes hexa (Le tout sauvegardé en XML)

Mon but inavoué étant de faire un grand jeu de plateforme MSX2 en Screen 4 avec scrolling et tout et tout ! Mais d'abord mon jeu MSX1.

By Leo

Paragon (1236)

Leo's picture

08-06-2010, 16:44

Je crois avoir lu qque part que les graphique etaient souvent compressés avec un algo rapide disponible pour msx , me souviens plus du nom.
De nos jours on plus trop se prendre la tete pour economiser la place mais bon , ca doit permettre de mettre des megas dans une rom 512k ...
faut avoir le temps de faire tous ces graphs!!!!

By RibbSayan

Resident (59)

RibbSayan's picture

08-06-2010, 18:47

c'est la compression RLE (comptage des octets identiques AAAAAAZZZEEERR=15octets -> 6A3Z3E2R=8octets)
sauf que AZERTY=6octets -> 1A1Z1E1R1T1Y=12octets)

Pour ma part, je suis en train de mettre des limites drastiques pour la conception (je me base visuellement sur the maze of galious)
En gros, un ecran + item + sprite ennemie devrait me couter dans les 100 - 110 octets => 297 ecran environ sur 32Ko

Faut les faire les ecrans apres c'est sur !

Page 1/3
| 2 | 3