[zxspectrum] shock demo

  • From: "Alessandro" <apoppi@xxxxxxxx>
  • To: <zxspectrum@xxxxxxxxxxxxx>
  • Date: Sun, 16 Jul 2006 11:24:10 +0200

Al VR, tanto per fare, io e Mario abbiamo provato a caricare la demo SHOCK (via tape) sul badaloc per valutare gli effetti della mancanza di memoria contesa, etc.

Purtroppo non siamo riusciti a vedere nulla:

Blocco 1: programma basic - caricamento OK
Blocco 2: bytes - caricamento OK
Blocco 3: bytes (il primo demo): crash con "Invalid Color" e border rosso.

Ieri ho provato a tracciare il programma. La parte in basic si occupa semplicemente di caricare, uno dopo l'altro, i blocchi in assembler che costituiscono i vari demo veri e propri. Ogni demo, dopo il proprio caricamento, va in esecuzione mediante un RANDOMIZE USR VAL "25150".

Questo e` il disassemblato a quell'indirizzo:

623e cd9c63       call 639ch
6241 cda962       call 62a9h
6244 dd2abb62   ld ix,(62bbh)
6248 dd6e00       ld l,(ix+00h)
624b dd6601       ld h,(ix+01h)
624e dd23           inc ix
6250 dd23           inc ix
6252 dd22bb62   ld (62bbh),ix
6256 226e62       ld (626eh),hl
6259 7d               ld a,l
625a fe1c            cp 1ch
625c c26d62       jp nz,626dh
625f 3abd62        ld a,(62bdh)
6262 fe30           cp 30h
6264 cc9dfa        call z,0fa9dh
6267 cd1cf6        call 0f61ch
626a c37062       jp 6270h
626d cd00fa       call 0fa00h    MODIFICATA RUN-TIME

Notare che l'ultima istruzione, se non si esegue il blocco che la precede, sembra un "call $0". La stessa routine $FA00 non esiste se non si eseguono le prime due call (in testa al listato).

Sostituendo l'opcode CD con C9 (all'indirizzo $626D), ovvero non eseguendo la routine $FA00, il sistema torna al basic senza errori. Ho rinunciato a seguire il punto che provoca il problema perche` diventava troppo complicato, dato anche che la routine da tracciare veniva creata in memoria e quindi era un po` difficile piazzare dei C9 qua` e la`. Ho anche provato a deviare l'esecuzione ad un pezzetto di codice che caricasse il C9 per poi saltare nella vera routine, ma non sono riuscito a trovare un posto dove metterla che non venisse sovrascritto.

In ogni caso, un risultato l'ho ottenuto. Il demo successivo non causava alcun crash, mentre il terzo (quello con la scritta ESI che oscilla) eseguiva qualcosa di buono prima di bloccarsi (quasi subito).

Allora ho provato a controllare e mi sono accorto che il mio opcode modificato era ancora la`, segno che la routine caricata per la prima demo era comune a tutti. Rimettendo allora il C5 originale (tranne che per la demo 1, che sarebbe crashata) sono riuscito ad eseguire tutte le altre.

Il risultato (a livello di compatibilita`) e` quindi come segue:

#1 "Intro":
Va in crash con "K Invalid colour, 70:1" e border rosso.

#2 "May a little challenge..."
Righette sul border praticamente identiche a realspec, mentre i colori dello schermo vero e proprio sono sbagliati


#3 "We are the champions...": perfetto

#4 "If you stay better seat down": quando la scritta orizzontale raggiunge la parte inferiore dello schermo, puo` avere qualche imperfezione

#5 "Loading some greets": la parte inferiore della scritta ondeggiante (diciamo quando scende nei secondi 2K di ram video) ha un pesante flicker, che tuttavia non si nota nello screenshot

#6 "Do you play chess?": perfetto

#7 "Mat guest screen": perfetto

#8 "End is near": perfetto

(...bestest demo?!)

ecco tutti gli screenshot: http://www.zxbada.bbk.org/SHOCK_demo.zip

In definitiva: secondo voi, come mai il primo demo va in crash? :-)

Ciao!


Other related posts: