Asembler 6502 (cz.11)

KERNAL


1. Retrospekcje

   Czy pamitacie jak w odcinku VII naszego kursu, w styczniu tego
roku bawilimy si w drukowanie na ekranie literki "A" za pomoc rozkazu
JSR? I to JSR w jakie dziwaczne miejsce, w ktrym nic nie wstawialimy,
do komrki $ffd2, gdzie, w odlege peryferia pamici. Mimo wszystko, literka
"A" pojawia si na ekranie. Pisaem wtedy, e tam wanie mieci si
procedurka ROM, ktra powoduje przeniesienie wartoci akumulatora do
urzdzenia odbierajcego. A by nim akurat ekran, wic wszystko poszo po
naszej myli. Trzeba nam wiedzie, e $ffd2 to jedna z pozycji tabeli
skokw zwanej KERNAL.


2. KERNAL - wiek dziecinny.

   Nasz dzisiejszy bohater to tablica skokw. Kilkadziesit komrek pamici
zajtych jest sekwencjami w rodzaju: JMP ($0326), JMP $f49e, JMP $ff5d,
JMP $f6e4 i podobnymi. S to odwoania do rnych procedur zainstalowanych
w ROM: LOAD, SAVE, otwarcie pliku itd.
   Kiedy powsta KERNAL, trudno mi dokadnie powiedzie. Jego podstawowym
zaoeniem bya mrzonka o kompatybilnoci wszystkich komputerw firmy
Commodore. Kady z nich mia bowiem mie taki sam KERNAL. Niezalenie od
tego, jak prezentowayby si inne czci ROM, zawsze JSR $ffd2 powodowa
miao wydrukowanie znaku. Dziki temu miaa zosta osignita pena zgodno.
I rzeczywicie, dziaao to w dawnych biurowych maszynach (takich staromodnych,
w ktrych monitor, stacja i klawiatura byy w jednej obudowie). Zdawao
egzamin, gdy chodzio wycznie o nudne programy biurowe, obsugujce w
zasadzie wycznie wejcia, wyjcia i pami.
   Ju kiedy pojawi si VIC-20, a potem C-64 ze swoimi niesamowitymi
moliwociami, przestano w zasadzie marzy o moliwoci wczytywania
programw z jednego komputera na drugim. Zwaszcza, kiedy rni zapalecy
zaczli zabawia si z rastrem, samplingiem i innymi dziwacznymi efektami,
ktre na starych Commodorach byy do osignicia. KERNAL jednak pozosta,
bo okazao si po prostu, e jest skutecznym i wygodnym narzdziem do
pisania programw. Bowiem daje to wygod, e - jeli chcemy np. wczyta
z dysku program - nie musimy wertowa caej mapy pamici w nadziei
odnalezienia czego ciekawego, a wystarczy nam jej ostatnia cz - KERNAL.

3. Pena rozpiska.

   A teraz czas na pen rozpisk tabeli skokw dla tych wszystkich,
ktrzy mapy pamici nie maj oraz dla tych, ktrzy wprawdzie j maj,
ale "gdzie j pooyli", a chcieli by mie KERNAL oprawiony w ramki
i powieszony nad kiem. Podaj tutaj po kolei: adres pozycji w systemie
szesnastkowym, dziesitnym, skrt nazwy procedury oraz krtki jej opis.

ADRES           NAZWA       OPIS

$ff81/65409     CINT        Inicjalizacja ekranu i ukadu VIC-II.
$ff84/65412     IOINIT      Inicjalizacja urzdze we/wy, SID, CIA.
$ff87/65415     RAMTAS      Inicjalizacja RAM, pamici ekranu
                            i bufora magnetofonu.
$ff8a/65418     RESTOR      Inicjalizacja wektorw systemu ($0314-$0333).
$ff8d/65421     VECTOR      Gdy flaga C=1: wpisanie do tablicy wektorw
                            ($0314-$0333) tablicy, ktrej pocztek okrelaj
                            rejestry X i Y. Gdy flaga C=0: przepisanie
                            tablicy wektorw do pamici, od adresu
                            okrelonego przez X i Y.
$ff90/65424     SETMSG      Jeli w akumulatorze zapalimy bit 6, pojawia
                            si bd komunikaty KERNAL'a, jeli go zgasimy
                            nie bd si pojawia; analogicznie, bit 7
                            odpowiada za kernalowskie komunikaty bdw.
$ff93/65427     SECOND      Posya warto z akumulatora jako adres
                            pomocniczy do urzdzenia na szynie szeregowej
                            po procedurze LISTEN.
$ff96/65430     TKSA        Posya warto z akumulatora jako adres 
                            pomocniczy do urzdzenia na szynie szeregowej,
                            po procedurze TALK.
$ff99/65433     MEMTOP      Gdy flaga C=1: wpisanie do rejestrw X i Y
                            wskanika szczytu pamici RAM.
                            Gdy flaga C=0: ustawienie wskanika wierzchoka
                            pamici na adres wskazywany przez X i Y.
$ff9c/65436     MEMBOT      Gdy flaga C=1: wpisanie do rejestrw X i Y
                            wskanika dou pamici RAM.
                            Gdy flaga C=0: ustawienie wskanika dou
                            pamici na adres wskazywany przez X i Y.
$ff9f/65439     SCNKEY      Odczyt klawiatury, wynik w komrce $cb. i
                            buforze klawiatury.
$ffa2/65442     SETTMO      Ustawienie wskanika TIMEOUT dla szyny IEEE.
$ffa5/65445     ACPTR       Pobranie bajtu z aktualnego urzdzenia na
                            szynie szeregowej i wstawienie go do
                            akumulatora (po TALK).
$ffa8/65448     CIOUT       Posya bajt z akumulatora do urzdzenia
                            na szynie szeregowej (po LISTEN).
$ffab/65451     UNTLK       Wysanie komendy UNTALK do urzdzenia na
                            szynie szeregowej (zaprzestanie odbierania
                            stamtd danych).
$ffae/65454     UNLSN       Wysanie komendy UNLISTEN do urzdzenia na
                            szynie szeregowej (zaprzestanie nadawania
                            tam danych).
$ffb1/65457     LISTEN      Wysanie komendy LISTEN do urzdzenia na
                            szynie szeregowej (rozpoczcie wysyania
                            tam danych), dot. urzdzenia o adresie
                            podanym w akumulatorze.
$ffb4/65460     TALK        Wysanie komendy TALK do urzdzenia na
                            szynie szeregowej (rozpoczcie odbioru
                            stamtd danych), dot. urzdzenia o adresie
                            podanym w akumulatorze.
$ffb7/65463     READST      Odczyt stanu we/wy (wynik pojawia si w
                            akumulatorze).
$ffba/65466     SETLFS      Ustawia parametry pliku logicznego: A - numer
                            pliku, X - numer urzdzenia, Y - adres
                            pomocniczy ($ff, jeli nieuywany).
$ffbd/65469     SETNAM      Ustawienie nazwy pliku: A - liczba znakw w
                            nazwie, X i Y - wektor pocztku nazwy w
                            pamici.
$ffc0/65472     OPEN        Po SETLFS i SETNAM ustawienie pliku tak, by
                            mg by wykorzystany do operacji we/wy,
                            numer pliku musi by w akumulatorze.
$ffc3/65475     CLOSE       Zamknicie dla operacji we/wy pliku o numerze
                            zawartym w A.
$ffc6/65478     CHKIN       Ustawienie pliku logicznego o adresie w X jako
                            aktualnego kanau wejciowego.
$ffc9/65481     CHKOUT      Ustawienie pliku logicznego o adresie w X jako
                            aktualnego kanau wyjciowego.
$ffcc/65484     CLRCHN      Ustawienie klawiatury i monitora jako aktualnych
                            urzdze we/wy.
$ffcf/65487     CHRIN       Pobranie znaku z aktualnego urzdzenia, ze
                            wstawieniem do akumulatora (jeli jest nim
                            klawiatura to dziaanie analogiczne do INPUT
                            w BASIC).
$ffd2/65490     CHROUT      Wyprowadzenie znaku z akumulatora do
                            aktualnego urzdzenia.
$ffd5/65493     LOAD        adowanie danych z urzdzenia do pamici,
                            jeli adres pomocniczy w SETLFS by $00 to
                            adowanie odbdzie si od adresu okrelonego
                            przez X i Y. Jeli w A jest 0 - aduje dane,
                            jeli 1 - tylko je weryfikuje.
$ffd8/65496     SAVE        Nagranie danych do urzdzenia zewntrznego.
                            W dowolnym miejscu na stronie zerowej musi
                            by wektor pocztku nagrywanego programu
                            za w akumulatorze adres tego wektora.
                            W X i Y - adres koca programu.
$ffdb/65499     SETTIM      Ustawienie zegara software'owego na 
                            wartoci z A, X i Y.
$ffde/65502     RDTIM       Wczytanie do A, X i Y zawartoci zegara
                            software'owego.
$ffe1/65505     STOP        Jeli nacinity zosta klawisz STOP to:
                            flaga Z ustawiana na 1, wykonane zostaje
                            CLRCHN, a bufor klawiatury - oprniony.
$ffe4/65508     GETIN       Identyczna jak CHRIN, z wyjtkiem klawiatury
                            (pobiera jeden znak z bufora i wstawia do A).
$ffe7/65511     CLALL       Zamknicie wszystkich plikw.
$ffea/65514     UDTIM       Uaktualnienie zegara software'owego (co 1/60s).
$ffed/65517     SCREEN      Podanie w X liczby wierszy (40) i w Y liczby
                            linii (25) ekranu.
$fff0/65520     PLOT        Gdy flaga C=0: ustawienie kursora w nowej 
                            kolumnie i nowym wierszu.
                            Gdy flaga C=1: wczytanie do X wiersza, a do
                            Y linii, w ktrej jest kursor.
$fff3/65523     IOBASE      Zapisanie adresw bazowych urzdze we/wy
                            do X i Y. W X/Y pojawia si adres $dc00.


4. Par sw.

   Fakt, e umieciem pen rozpisk tablicy KERNAL w kursie programowania
nie oznacza wcale - bro Boe! - e trzeba si jej uczy na pami. Wrcz
przeciwnie - ma suy jako cigawka z KERNALa, ktra moe si przyda 
nawet dowiadczonym programistom. Pewne procedury i tak wejd w nawyk (np.
LOAD, SETLFS) a pewnych i tak nikt nigdy nie uywa (np. SCREEN, IOBASE).
   A teraz poka Wam, jak korzysta z tej tablicy. Oto kilka przykadowych
procedur, ktre nie raz i nie dwa razy mog si przyda, czego dowodem s
liczne listy do redakcji.


5. Save.

   Oto przykadowa procedura, ktra nagra nam na dysk zawarto ekranu, pod
tytuem "c&a".

	*=$2710
	LDA #$01	;numer pliku
	LDX #$08	;8 - stacja dyskw
	LDY #$00	;adres pomocniczy
	JSR $ffba	;SETLFS
	LDA #$03	;tytu 3-literowy
	LDX #<tytul	;adres tytuu
	LDY #>tytul	;
	JSR $ffbd	;SETNAM	
	LDA #$00	;pocztek zbioru
	STA $fc	
	LDA #$04
	STA $fd
	LDA #$00
	LDX #$e8	;koniec zbioru
	LDY #$07
	JSR $ffd8	;SAVE
	RTS
tytul	.text "c&a"

   Jeli w drugiej linijce programu LDX #$08 zmienimy na LDX #$01, to
nagramy wszystko na tam a nie na dyskietk.


6. Load.

   Jeli przyjdzie wam chtka wadowa cokolwiek do pamici, moemy si
posuy tym oto programem (tu akurat adujemy nagrany wanie plik
"c&a", w lokacje od $1000 wzwy).

	*=$2710
	LDA #$01	;numer pliku
	LDX #$08	;8 - stacja dyskw	
	LDY #$00	;adres pomocniczy
	JSR $ffba	;SETLFS
	LDA #$03	;tytu 3 literowy
	LDX #<tytul	;adres tytuu
	LDY #>tytul	;
	JSR $ffbd	;SETNAM
	LDA #$00	;flaga LOAD/VERIFY
	LDX #$00	;ustawienie adresu, od ktrego
	LDY #$10	;program bdzie czytany
	JSR $ffd8	;LOAD
	RTS
tytul	.text "c&a"

   Ciekawscy i niedowiarkowie powinni sprawdzi monitorem pami od
$1000 do $13e8. Bdzie tam ekran dokadnie taki, jak podczas
wywoania procedury SAVE.


7. Input.

   Prociutki jest te programik, ktry posuy nam jako asemblerowy
odpowiednik BASIC-owego polecenia INPUT:

	*=$2710
	LDX #$00	;licznik znakw wyzerowany
petla	JSR $ffcf	;CHRIN
	CMP #$0d	;czy byo RETURN?
	BEQ end		;kocz, jeli byo
	STA $tekst,X	;jeli nie, to wstaw liter	
	INX		;zwiksz licznik znakw
	JMP petla
end	STX $2724	;wstaw licznik do pamici
	RTS
dlugosc .byte 0
tekst			;bardzo wane!

   Dziki niemu, oprcz niewtpliwej radoci jak sprawi nam zobaczenie
wstukanemu wasnorcznie tekstu w pamici, ucieszy nas te pewnie, e
wiemy, ile waciwie ma on liter.


8. Pa Pa!

   Na ten miesic chyba wystarczy ju natoku informacji, wic bd koczy,
eby Was wicej nie przemcza. Sprbujcie moe zrobi co sensownego z tym,
co Wam tu podaem. Jeli interesuje Was, jak wykorzysta inne procedury
KERNAL to napiszcie, a przygotuj kolejny artyku na ten arcyciekawy temat. Pa pa!

			Ujedacz bitw
		BARTOMIEJ I. KACHNIARZ	
