Subject: [zxspectrum] Re: ManicMiner su ZX81 Enrico Maria Giordano ha scritto: > Buono a sapersi. A suo tempo (1982) feci qualche giochino in LM per lo > ZX81 (ormai perduto senza speranza :-( ) ma non mi resi conto di questa > velocità. Va beh, ero un novellino. :-) > Dunque, anche se ha lo stesso clock dello Spectrum lo zx81 resta lento anche in L/M se lavori in modalità SLOW, cerco di chiarire.. Lo ZX81 è uno ZX80 potenziato: la nuova ROM contiene le funzioni principali dell'interprete BASIC sopravvissute anche nello Spectrum (Floating Point, stringhe, logica dell'editor, ecc..) e il driver per la modalità video "SLOW". La stessa ROM funziona perfettamente anche sullo ZX80, senza lo SLOW: il codice associato alla NMI annusa l'hardware per capire se lo SLOW è supportato: ; Now test if this really is a ZX81 or a ZX80 running the upgraded ROM. ; The standard ZX80 did not have an NMI generator. LD A,$7F ; Load accumulator with %011111111 EX AF,AF' ; save in AF' LD B,$11 ; A counter within which an NMI should occur ; if this is a ZX81. OUT ($FE),A ; start the NMI generator. In ogni caso (anche nello ZX80) il quadro video è gestito da una combinazione di hardwre e software: alla fine viene settato un bit rapidamente a 1 o 0 e sparato direttamente al modulatore per uscire sullo schermo in bianco e nero (qui non entrano in gioco i problemi della differenza tra PAL, SECAM o NTSC perchè non abbiamo il colore). A causa di un bug molti ZX81 hanno una ULA così primitiva da poter essere utilizzati solo su pochi televisori, di solito in B/N; anche la differente frame rate dei televisori americani viene gestita in software controllando la presenza di un diodo nella motherboard: ; This is a good time to test if this is an American or British machine. ; The US machine has an extra diode that causes bit 6 of a byte read from ; a port to be reset. RLA ; (4) compensate for the shift test. RLA ; (4) rotate bit 7 out. RLA ; (4) test bit 6. Nello ZX80 il video era visibile soltanto durante l'attesa della pressione di un tasto, perchè il loop di lettura della tastiera era remporizzato perfettamente e comprendeva anche l'output a video (ragione storica del fatto che anche sullo Spectrum premendo un tasto si esce da PAUSE). Nello ZX81 questa tecnica sopravvive solo se siamo in modalità FAST. La modalità SLOW collega la NMI ai timer che segnalano l'inizio dello riga del beam sul video e attiva una serie di routine alternative cambiando il valore di IX (usato con una JP). A questo punto la tastiera viene scansionata in modo differente e la ROM rimane per l'80% del tempo ad aspettare le interrupt per agganciare il corretto puntamento al set di caratteri. Il programma BASIC (o L/M) gira soltanto nel momento in cui non ci sono immagini da visualizzare, ovvero durante la visualizzazione delle parti alta e bassa dello schermo e durante il riposizionamento in alto a sinistra del beam sullo schermo (chi sa come funziona TELEVIDEO probabilmente sta sorridendo). Non mi dilungo perchè è molto complicato entrare nei dettagli, vi basti sapere che l'alta risoluzione non può essere ottenuta con sole modifiche hardware e che con il software è possibile fare tantissime cose, anche cambiare la risoluzione video a scapito o a vantaggio della CPU. Per ragioni architetturali il puntamento al set di caratteri può avvenire solo nella ROM che oltre al font contiene il codice del BASIC che graficamente non serve a molto.. però cambiando il ciclo di visualizzazione software possiamo prepararci una finta pagina di testo 8 volte più grande e istruire lo ZX81 per visualizzare una sola riga di pixel per ogni carattere. Se scegliamo bene il puntatore possiamo trovare nella ROM una combinazione di "sporcizia" tra cui pescare i pattern di bit che useremo per disegnare "Miner Willy". La modalità ottenuta dovrebbe rallentare lo ZX81 più o meno quanto lo SLOW, ma forse hanno recuperato un pò di velocità riscrivendo il codice di scansione della tastiera, rallentando leggermente il frame rate o riducendo il numero di linee visibili sullo schermo. ManicMiner non è un gioco che richiede tanta potenza elaborativa, lo Spectrum mangia la maggioranza del tempo in musica, cicli di ritardo e codice inefficiente (con il vecchio emulatore di Gerton Lunter si può ottenere un ManicMiner ragionevolmente veloce anche sui 286 disattivando l'emulazione accurata di LDIR). L'emulatore dello ZX81 per lo ZX128 è un'altra follia, ma qui andiamo fuori tema: fidatevi, gira perfettamente sullo ZX81, probabilmente più velocemente che sullo Spectrum 128 !