Programowanie: Użycie OS-a przy wyłączonym ROM-ie: Różnice pomiędzy wersjami

Z Atariki
Przejdź do nawigacji Przejdź do wyszukiwania
Mono (dyskusja | edycje)
mNie podano opisu zmian
Mono (dyskusja | edycje)
procedury
Linia 1: Linia 1:
Ż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ń:
Ż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):
<pre>
<pre>
nmiint  bit NMIST      ;$D40F
nmiint  bit NMIST      ;$D40F
Linia 30: Linia 32:
         rti
         rti
</pre>
</pre>
Adres nmiint trzeba ustawić w NMIVEC a irqint w IRQVEC pod ROM-em.
Wszystko co jest potrzebne do uruchomienia mechanizmu to inicjalizacja wektorów NMIVEC i IRQVEC pod ROM-em:
<pre>
<pre>
         sei
         sei
Linia 52: Linia 54:
         cli
         cli
</pre>
</pre>
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ć:
Trzeba pamiętać, że podczas wywoływania procedury z ROM trzeba go sobie włączyć:
<pre>
<pre>
Linia 59: Linia 63:
         jsr JSIOINT    ;$E459
         jsr JSIOINT    ;$E459
</pre>
</pre>
Najlepiej dla procedur systemowych, które wywoływane są w programie zdefiniować sobie w obszarze nie pokrywającym się z ROM tzw. "przelotki" np:
<pre>
JSIOINTjump:
        lda PORTB      ;$D301
        pha
        ora #%00000001
        sta PORTB      ;$D301
        jsr JSIOINT    ;$E459
        pla
        sta PORTB      ;$D301
        rts
</pre>
Rejestry $00..$7F oraz $2xx i $3xx są to rejestry zarezerwowane dla potrzeb systemu operacyjnego.
Rejestry $00..$7F oraz $2xx i $3xx są to rejestry zarezerwowane dla potrzeb systemu operacyjnego.


[[Kategoria:Niezbędnik kodera]]
[[Kategoria:Niezbędnik kodera]]

Wersja z 3 gru 2019, 14:46

Ż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  bit NMIST       ;$D40F
        spl
        jmp (VDSLST)    ;$0200

        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.