Alle heiligen Zeiten, wenn ich mein Programm frisch starte, funktioniert die IRQ-Routine nicht. Im Step-Debugger sehe ich, dass sie dann gar nicht aufgerufen wird. Nachdem sich im Falle des "Abstürzens" die Rahmenfarbe gar nicht ändert, gehe ich davon aus, dass die ISR kein einziges Mal aufgerufen wurde. Meistens lauft das Programm aber, wie ich es erwarten würde.
$ acme test.a
$ x64sc -autostart test.prg
Die Fehlstarts passieren auch, wenn ich mit LOAD"TEST.PRG",8 lade und per RUN starte.
Während des Arbeitens hat sich die Frequenz der "Fehlstarts" immer wieder verändert, wenn ich Code hinzugefügt oder entfernt habe. Das sollte auf Verwendung von nicht-initialisiertem Speicher deuten, also habe ich das Programm reduziert, aber die Fehlstarts passieren nach wie vor, ca. alle 3 bis 50 mal.
Das Programm soll die komplette Kontrolle über den C64 übernehmen und die ROMs deaktivieren, weshalb ich alle Interruptquellen deaktiviere und einen einzelnen Raster-IRQ einrichte.
Es scheint mit dem Ausschalten des VIC-Outputs während des "Hochfahrens" zusammenzuhängen, weil ich bisher keine hängende ISR gesehen habe, sobald ich den Output eingeschaltet gelassen habe. Nachdem der Fehler nur selten auftritt, kann ich aber nicht mit Sicherheit sagen, ob das vielleicht nur ein Zufall war.
Habe ich etwas übersehen oder vergessen, oder ist das ein Problem mit Vice?
- !to "test.prg", cbm
- !sl "test.sym"
- ;==========================================================================79:=
- !zone BASIC_PROGRAM
- ;==========================================================================79:=
- * = $0801 ; Load to BASIC program memory
- __BASIC !word .next_line ; $0801 Pointer to next line
- !word $0000 ; $0803 Line number (0)
- !byte $9e ; $0805 SYS
- ; Decimal address of program entry point
- !byte 48 + (__ENTRY_POINT / 10000) % 10
- !byte 48 + (__ENTRY_POINT / 1000) % 10
- !byte 48 + (__ENTRY_POINT / 100) % 10
- !byte 48 + (__ENTRY_POINT / 10) % 10
- !byte 48 + (__ENTRY_POINT / 1) % 10
- !byte $00 ; $080a End of BASIC line
- .next_line !word $0000 ; $080b End of BASIC program
- __NMI inc $d021
- rti
- __IRQ lsr $d019
- inc $d020
- rti
- __RESET inc $d020
- dec $d020
- jmp __RESET
- ;==========================================================================79:=
- !zone ENTRY_POINT
- ;==========================================================================79:=
- NMI_VECTOR = $fffa
- RESET_VECTOR = $fffc
- IRQ_VECTOR = $fffe
- __ENTRY_POINT
- ;--------------------------------------------------------------------------79:-
- sei
- ;;
- ; Configure memory bank visibility
- lda #$2f ; Some defaults ;!;
- sta $00 ; DATA DIRECTION REGISTER
- lda #$30|5 ; _ROM_MASK_RAM_IO_RAM
- sta $01 ; PROCESSOR PORT
- ;;
- ; Disable interrupt sources
- lda #%01111111 ; Clear mask bits
- sta $dc0d ; CIA-1 Interrupt Control and Status
- sta $dd0d ; CIA-2 Interrupt Control and Status
- lda $dc0d ; Clear INT DATA flags
- lda $dd0d ; Clear INT DATA flags
- lda #$00 ; Disable all interrupts
- sta $d01a ; VIC Interrupt enable register
- lda #$ff
- sta $d019 ; Clear VIC interrupt flag
- ;;
- ; Set interrupt vectors
- ldx #<__NMI
- lda #>__NMI
- stx NMI_VECTOR
- sta NMI_VECTOR+1
- ldx #<__RESET
- lda #>__RESET
- stx RESET_VECTOR
- sta RESET_VECTOR+1
- ldx #<__IRQ
- lda #>__IRQ
- stx IRQ_VECTOR
- sta IRQ_VECTOR+1
- ;;
- ; VIC memory, raster IRQ, charset
- lda $dd00 ; CIA2_PORT_A
- and #%11111100 ; Bank 3 c000 VIC bank
- sta $dd00 ; Warning: I/O, COLOR at d000-dfff
- lda $d018 ; VIC_MEMORY_CONTROL
- and #%00001111 ; 0000 SCREEN offset
- ora #%10010000 ; 2400
- and #%11110001 ; 0000 CHARSET base address
- ora #%00000110 ; 1800 ; 1800/9800 Lower/upper
- sta $d018
- lda $d011 ; VIC_CONTROL_1
- and #%10001111 ; Extended background colors off
- ; Bitmap mode off
- ; Enable output off
- sta $d011
- lda $d016 ; VIC_CONTROL_2
- and #%11101111 ; Multicolor off
- sta $d016
- lda #%00000001 ; Select "ERST"
- sta $d01a ; VIC Interrupt enable register
- lda $d011 ; VIC raster line, bit 8
- and #%01111111 ; .raster_y < 256, clear bit 8
- sta $d011 ; VIC raster line, bit 8
- lda #<200 ; First raster line
- sta $d012 ; VIC raster line, bits 7 to 0
- ;;
- ; Start main loop
- lda $d011 ; VIC_CONTROL_1
- ora #%00010000 ; Enable output on
- sta $d011
- cli
- - jmp -