Programowanie: Użycie OS-a przy wyłączonym ROM-ie
From Atariki
Wersja z dnia 13:33, 3 gru 2019 Mono (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 13:46, 3 gru 2019 Mono (Dyskusja | wkład) (procedury) Next diff → |
||
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 dnia 13:46, 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 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.