Programowanie: Użycie OS-a przy wyłączonym ROM-ie: Różnice pomiędzy wersjami
mNie podano opisu zmian |
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> | ||
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.