Sto costruendo un PET Commodore su un FPGA. Ho implementato il mio core 6502 in Kansas Lava (il codice è disponibile allo https://github.com/gergoerdi/mos6502-kansas-lava) e inserendo abbastanza IO attorno ad esso (https://github.com/gergoerdi/eightbit-kansas-lava) sono stato in grado di avviare il COMM originale PET ROM, ottenere un cursore lampeggiante e iniziare a digitare.Comportamento di interruzione di un 6502 in test standalone vs in un Commodore PET
Tuttavia, dopo aver digitato il classico programma BASIC
10 PRINT "HELLO WORLD"
20 GOTO 10
si blocca dopo un po '(dopo alcuni secondi) con
?ILLEGAL QUANTITY ERROR IN 10
Perché il mio codice ha abbastanza ragionevole copertura di test per-codice operativo, e passa AllSuiteA, ho pensato di esaminare i test per un comportamento più complicato, che è il modo in cui sono arrivato allo Klaus Dormann's interrupt testsuite. L'esecuzione nel simulatore Kansas Lava ha fatto notare un sacco di bug nella mia implementazione interrupt originale:
- La bandiera
I
non è stato impostato quando si entra nel gestore di interrupt - Il
B
bandiera era dappertutto - interrupt IRQ sono state completamente ignorate a meno che
I
era impostata quando sono arrivati (il comportamento corretto sembra essere a coda interrupt quandoI
è impostato e quando si arriva impostata, si dovrebbe comunque essere gestito)
Dopo aver risolto questi problemi, ora posso eseguire con successo il test di Klaus Dormann, quindi speravo di ricaricare la mia macchina sul vero FPGA, con un po 'di fortuna che il crash del BASIC potesse andare via.
Tuttavia, la nuova versione, con tutti questi bug di interrupt risolti e passando il test di interrupt in un simulatore, non riesce a rispondere all'ingresso della tastiera o anche solo a lampeggiare il cursore sul vero FPGA. Si noti che sia input della tastiera e del cursore lampeggiante è fatto in risposta ad un IRQ esterno (collegato dal segnale schermo VBlank), quindi questo significa versione fissa qualche modo rotto tutti gli allarmi movimentazione ...
cerco qualsiasi tipo di suggerimenti vaghi cosa potrebbe andare storto o come potrei iniziare a eseguire il debug di questo.
Il codice completo è disponibile al https://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewrite, il commit incriminato (quello che corregge il test e interrompe il PET) è 7a09b794af. Mi rendo conto che questo è l'esatto opposto di una riproduzione vitale minima, ma il cambiamento in sé è minuscolo e perché non ho idea di dove vada storto, e poiché riprodurre il problema richiede una macchina abbastanza potente da avviare il Commodore PET ROM, 'so come avrei potuto ridurla ...
Aggiunto:
sono riuscito a riprodurre lo stesso problema sullo stesso hardware con un semplicissimo (oserei dire il minimo) ROM al posto del magazzino PET ROM:
.org $C000
reset:
;; Initialize PIA
LDY #$07
STY $E813
LDA #30
STA $42
STA $8000
CLI
JMP *
irq:
CMP $E812 ; ACK irq
DEC $42
BNE endirq
LDX $8000
INX
STX $8000
LDA #30
STA $42
endirq: RTI
.res $FFFC-*
.org $FFFC
resetv: .addr reset
irqv: .addr irq
Sì! Molto utile, grazie! Dovrò riesaminare il mio codice per capire perché il test ha avuto esito negativo, a meno che non interrompe l'interruzione (ho appena pensato che fosse spec sa essere in quel modo). Ma sono anche su un telefono ATM – Cactus
Ho finito per accettare questa risposta perché la radice della mia confusione era in realtà che pensavo che l'input IRQ fosse in coda. Sfortunatamente, si è risolto fissando gli interrupt in modo che funzionassero nel test e in un PET ancora non si fa andare via il crash del ciclo infinito; quello, a quanto pare, ha una causa diversa ... – Cactus
Hai provato uno qualsiasi degli altri programmi di test? Oltre a AllSuiteA e al lavoro di Klaus Doormann, quello di Wolfgang Lorenz è buono. Anche in modo nativo riporta in PETSCII. – Tommy