Nuovo gioco MEGA CHASE per CPC+. Problemi con il compilatore ABASC

Ciao! Come ho già menzionato in un post precedente, sto sviluppando il mio primo gioco per computer Amstrad (nello specifico per la serie CPC Plus, dato che usa la palette a 4096 colori e gli sprite hardware).

Ho finito la versione in Basic (che può essere scaricata qui), e funziona bene (anche se lentamente), ma sto riscontrando un sacco di problemi nel tentativo di compilare il file «game.bas» con ABASC. Tra le altre cose, il file compilato non mostra i caratteri personalizzati e sembra ignorare completamente l’ASIC (niente sprite, niente immagini migliorate, niente dissolvenze); l’algoritmo della musica si corrompe parzialmente e il computer si blocca alla fine di una partita. Non so se sto sbagliando qualcosa io o se sia dovuto alle limitazioni intrinseche di ABASC. Qualsiasi aiuto sarà molto apprezzato.

4 Mi Piace

Sembra interessante! Ora non posso controllare, quindi — qualche screenshot o video?

Potrebbe trattarsi di limitazioni di ABASC. Di sicuro, se stai accedendo ai registri ASIC, la mappa di memoria del codice compilato inizia a diventare molto importante: incontrerai ogni genere di problema se accedi alle pagine ASIC senza eseguire il codice, ecc.

Non sapevo se si potessero allegare immagini a un post, finché non mi sono reso conto che basta trascinarle!


È un gioco molto semplice, realizzato fondamentalmente per imparare il Locomotive BASIC e capire come usare alcune delle funzioni avanzate dell’ASIC.

5 Mi Piace

Grazie, proverò a contattare Fragarco, il creatore di ABASC, per chiedergli se può fare un po’ di chiarezza su questo punto.

È davvero delizioso nella sua semplicità🙂

(Puoi anche copiare/incollare le immagini)

3 Mi Piace

Grazie per il video, anche se il loader dovrebbe mostrare i caratteri personalizzati (almeno così fa su WinApe). Sto incontrando un sacco di problemi nel tentativo di compilarlo con ABASC. La versione interpretata è semplicemente troppo lenta…

1 Mi Piace

Sembra davvero fantastico :smiling_face_with_sunglasses:

Sarei curioso di sapere quali sono i principali colli di bottiglia nella versione interpretata?

Beh, è solo che in generale il gioco dovrebbe girare più velocemente e in modo più fluido. Sfumature di colore (sia la schermata del titolo che gli sprite quando si fa un “warp”) sembrano essere particolarmente lente. In tutte le altre versioni (VIC-20, Plus/4, MSX2+, C64…) ho raggiunto 50 FPS dopo la compilazione, e in Amiga e Atari ST la compilazione non è nemmeno necessaria.

Ho fatto qualche altro esperimento su come accedere al Plus ASIC da BASIC. Ho creato tre piccole routine per fermare il lampeggio dei colori, scrivere un valore nell’ASIC e rileggerlo. Queste routine possono risiedere in qualsiasi punto della memoria, tranne che nella pagina dell’ASIC tra &4000 e &7FFF. Utilizzando queste routine, non ci saranno problemi di sovrapposizione tra interrupt o codice BASIC e la pagina ASIC.

Ecco un piccolo programma per dimostrarlo. Magari questa soluzione ridurrà le incompatibilità con il compilatore BASIC. Non ho fornito comandi RSX per ridurre le dimensioni del blocco DATA.

MODE 2

100 MODE 0 : DEFINT a-z : memBase=&A600 : MEMORY memBase-1
110 ' === Sblocca ASIC.
120 DATA &FF,&00,&FF,&77,&B3,&51,&A8,&D4,&62,&39,&9C,&46,&2B,&15,&8A,&CD,&EE
130 FOR i=1 TO 17 : READ a : OUT &BC00,a : NEXT
140 ' === Installa routine assembler.
150 DATA &CF,&55,&8D,&F3,&DD,&66,&03,&DD,&6E,&02,&01,&B8,&7F,&ED,&49,&73
160 DATA &0E,&A0,&ED,&49,&FB,&C9,&F3,&DD,&66,&03,&DD,&6E,&02,&01,&B8,&7F
170 DATA &ED,&49,&7E,&0E,&A0,&ED,&49,&12,&FB,&C9
180 FOR i=0 TO 41 : READ a : POKE memBase+i,a : NEXT
190 stopFlashing = memBase+0 : asicPoke = memBase+3 : asicPeek = memBase+22
200 ' === Ridefinisci colori.
210 CALL stopFlashing
220 FOR i=0 TO 15
230   r=i : g=i : b=i
240   CALL asicPoke,&6400+i*2,b+16*r : CALL asicPoke,&6401+i*2,g
250 NEXT
260 ' === Disegna gradiente di colore e stampa i valori dei colori.
270 FOR x = 0 TO 639 STEP 2 : MOVE x,0 : DRAW x,399,x\40 : NEXT
280 FOR i=0 TO 15
290   a%=0 : CALL asicPeek,&6400+i*2,@a% : CALL asicPeek,&6400+i*2+1,@a%+1
300   LOCATE 1,i+1 : PEN 15 : PRINT HEX$(a%)
310 NEXT
320 ' ==== Fine (MODE ripristina i colori e riattiva il lampeggio).
330 CALL &BB18 : MODE 2

' ORG #A600
'
' stop_flashing:
'     RST #0008 : DEFW #8D55        ;; LO_JUMP #0D55
'
' asic_poke: PRINT $-#A600
'    DI                             ;; Disabilita gli interrupt.
'        LD H,(IX+3) : LD L,(IX+2)  ;; Ottieni il primo parametro con l'indirizzo.
'        LD BC,#7FB8 : OUT (C),C    ;; Attiva la pagina ASIC.
'            LD (HL),E              ;; Memorizza il valore del secondo parametro all'indirizzo.
'        LD C,#A0 : OUT (C),C       ;; Disattiva la pagina ASIC.
'    EI : RET                       ;; Abilita gli interrupt e torna al BASIC.
'
' asic_peek: PRINT $-#A600
'     DI                            ;; Disabilita gli interrupt.
'         LD H,(IX+3) : LD L,(IX+2) ;; Ottieni il primo parametro con l'indirizzo.
'         LD BC,#7FB8 : OUT (C),C   ;; Attiva la pagina ASIC.
'             LD A,(HL)             ;; Carica il valore dall'indirizzo.
'         LD C,#A0 : OUT (C),C      ;; Disattiva la pagina ASIC.
'         LD (DE),A                 ;; Memorizza il valore nel secondo parametro.
'     EI : RET                      ;; Abilita gli interrupt e torna al BASIC.
3 Mi Piace

@lightforce6128 Ho provato il tuo codice in ABASC ed è stato compilato ed eseguito correttamente!

Tuttavia, ho dovuto modificare leggermente le routine in assembly perché sembra che tu ti aspetti che l’ultimo parametro passato alla CALL sia non solo sullo stack (disponibile in IX+0 e IX+1), ma anche caricato nel registro DE. Il compilatore, però, non segue questa convenzione e i parametri sono disponibili solo sullo stack tramite IX.

Dopodiché, ho iniziato a guardare più da vicino il codice di @shad0wfax e ho scoperto che anche il motore musicale che sta usando (un binario caricato in memoria) sfrutta lo stesso trucco e dà per scontato che DE contenga il valore dell’ultimo parametro. Immagino che questo fosse uno dei motivi principali per cui il codice non funzionava come previsto una volta compilato.

Ora che ho riscontrato questo comportamento in due punti diversi, mi chiedo se si tratti di un hack o di qualcosa che era documentato ufficialmente. Non trovo alcun riferimento a riguardo nei libri in mio possesso, quindi magari potresti far luce sull’argomento (gioco di parole non voluto).

Ad ogni modo, penso che proverò a usare tutto questo per creare una libreria per ABASC, così da rendere più semplice il lavoro con l’ASIC.

1 Mi Piace

Ho dato un’occhiata a un listato ROM («ROM-Listing CPC 464/664/6128» dell’editore tedesco «Markt & Technik Verlag», 1985). Usare un comando RSX è bene o male la stessa cosa che usare una CALL. Il primo deve solo cercare quale indirizzo sia memorizzato per il nome del comando RSX. Non appena l’indirizzo è noto, entrambi usano lo stesso codice per leggere i parametri aggiuntivi ed eseguire la routine. Se c’è un parametro aggiuntivo, viene chiamata una routine ausiliaria per estrarlo e restituirlo nel registro DE. Poiché potrebbe esserci più di un parametro, i parametri trovati vengono salvati sullo stack usando il registro IX come base pointer. Tuttavia, anche l’ultimo parametro letto rimane nel registro DE. Tra l’estrazione dell’ultimo parametro e l’esecuzione della routine, il registro DE non viene modificato. Ecco perché viene memorizzato sia in DE che in (IX).

464 664 6128/Plus descrizione
F1A0 F24A F245 comando RSX
F1BA F261 F25C comando CALL
CE91 CEF8 CEF5 ottieni un intero

Rispondere alla domanda se questo comportamento sia solo un effetto collaterale o debba essere considerato parte dell’interfaccia ufficiale è difficile / un po’ filosofico. Ma sembra esserci una differenza tra la routine del firmware originale e il codice compilato da ABASC.

1 Mi Piace

Dopo averci lavorato per un po’ di tempo, ho aggiunto una libreria ad ABASC per accedere alle funzionalità del CPC+. Come esempio, ho riscritto il gioco originale MCHASE. Un grande ringraziamento a @shad0wfax, che mi ha inviato il codice originale e mi ha permesso di lavorarci sopra.

In allegato trovate il risultato finale e il codice sorgente attuale. Ho utilizzato la sintassi di Locomotive BASIC 2 Plus, poiché rende più facile lavorare con progetti complessi.

main.bas (30,2 KB)

mchase.dsk (190,3 KB)

Edit: Ho dimenticato di menzionare che il giocatore 1 ora usa i tasti (Q, A, O, P), mentre il giocatore 2 usa il joystick 1.

1 Mi Piace

Mi piace davvero molto come arcade game semplice e veloce!

Posso fare il rompiscatole e chiederti se potresti aggiornarlo per leggere i 2 joypad del GX4000, così potrei giocarci in due con mia moglie? È facile da convertire in cartuccia, a patto che utilizzi solo i comandi del joypad.

@slider271 eccolo qui (spero). Ora è possibile usare il secondo joystick al posto dei tasti.

@Gryzor la funzionalità per eseguire l’emulatore del CPC 6128 all’interno del forum è davvero fantastica! C’è un modo per selezionare un CPC+ come macchina da emulare?

mchase.dsk (190,3 KB)

1 Mi Piace

No, purtroppo RVM Player non lo supporta (ancora)…

1 Mi Piace