Programowanie: Użycie OS-a przy wyłączonym ROM-ie
From Atariki
| Wersja z dnia 13:46, 3 gru 2019 Mono (Dyskusja | wkład) (procedury) ← Previous diff | Wersja z dnia 13:50, 3 gru 2019 Mono (Dyskusja | wkład) (usuniecie dli) Next diff → | ||
| Linia 3: | Linia 3: | ||
| Kod handlera przerwań powinien być umieszczony poza obszarem ROM-u ($5000..$57FF, $A000..$BFFF, $C000..$FFFF): | Kod handlera przerwań powinien być umieszczony poza obszarem ROM-u ($5000..$57FF, $A000..$BFFF, $C000..$FFFF): | ||
| <pre> | <pre> | ||
| - | nmiint bit NMIST ;$D40F | + | nmiint sec | 
| - | spl | + | |
| - | jmp (VDSLST) ;$0200 | + | |
| - | + | ||
| - | sec | + | |
| .byte $24 ;bit Z | .byte $24 ;bit Z | ||
| irqint clc | irqint clc | ||
Wersja z dnia 13:50, 3 gru 2019
Żeby swobodnie używać mechanizmów OS-a a przy tym mieć dostęp do całego RAM-u trzeba zadbać tylko o poprawne wykonanie przerwań będących w ROM-ie w sytuacji kiedy ten jest wyłączony.
Kod handlera przerwań powinien być umieszczony poza obszarem ROM-u ($5000..$57FF, $A000..$BFFF, $C000..$FFFF):
nmiint  sec
        .byte $24       ;bit Z
irqint  clc
        pha
        txa
        pha
        tsx
        inc PORTB       ;$D301
        lda #>iret
        pha
        lda #<iret
        pha
        lda $103,x
        pha
        scc
        jmp (NMIVEC)    ;$FFFA
        jmp (IRQVEC)    ;$FFFE
iret    dec PORTB       ;$D301
        pla
        tax
        pla
        rti
Wszystko co jest potrzebne do uruchomienia mechanizmu to inicjalizacja wektorów NMIVEC i IRQVEC pod ROM-em:
        sei
        lda #%00000000
        sta NMIEN       ;$D40E
        lda #%11111110
        sta PORTB       ;$D301
        ldx #<nmiint
        ldy #>nmiint
        stx NMIVEC      ;$FFFA
        sty NMIVEC+1
        ldx #<irqint
        ldy #>irqint
        stx IRQVEC      ;$FFFE
        sty IRQVEC+1
        lda #%01000000
        sta NMIEN       ;$D40E
        cli
Od tej pory można swobodnie wyłączać i włączać dowolny obszar ROM bez obawy o to, że komputer się zawiesi.
Trzeba pamiętać, że podczas wywoływania procedury z ROM trzeba go sobie włączyć:
        lda #%11111111
        sta PORTB       ;$D301
        jsr JSIOINT     ;$E459
Najlepiej dla procedur systemowych, które wywoływane są w programie zdefiniować sobie w obszarze nie pokrywającym się z ROM tzw. "przelotki" np:
JSIOINTjump:
        lda PORTB       ;$D301
        pha
        ora #%00000001
        sta PORTB       ;$D301
        jsr JSIOINT     ;$E459
        pla
        sta PORTB       ;$D301
        rts
Rejestry $00..$7F oraz $2xx i $3xx są to rejestry zarezerwowane dla potrzeb systemu operacyjnego.
