Asembler 6502 (cz.12)

Stacja dyskw i bity na drutach.


1. Witajcie!

   Do tej pory nasze kontakty ze stacj dyskw byy nieco, rzekbym, mono-
tonne. Ograniczalimy si do adowania i nagrywania programw. No i - ma
si rozumie - gier. Nadszed jednak czas, by szczerze sobie powiedzie,
e to nie wystarczy. Jestemy ju duzi, asemblera uczymy si ju do du-
go, pora wic na wzicie stacji - jak to mawiali przedwojenni majstrowie -
na warsztat.


2. Zaczynamy.

   Na pocztek sprobujmy wtadowa katalog dyskietki. Zgodnie z tym, czego
do tej pory si nauczylicie, powinnicie ju wiedzie, jak to zrobi. Proste
BASIC-owe LOAD "$",8 musimy zamieni na co najmniej trzy odwoania do
procedurek KERNALa. Uwaga! Signij teraz po sierpniowy numer "C&A"
i otwrz go na stronie 26. Najpierw musimy ustawi wskaniki pliku logiczne-
go, czyli jego numer wstawi do akumulatora (niech bdzie to 1), numer
urzdzenia - do X (stacja dyskw - to 8), a adres pomocniczy - do Y (nie ko-
rzystamy z niego - wstawiamy $ff). Po takim ustawieniu rejestrw urucha-
miamy procedur SETLFS ($ffba). Gdy adujemy katalog, musimy poda je-
go nazw, czyli "$". Warto odpowiadajc dolarowi, czyli 68/$24 wstawia-
my gdzie do pamici, pod etykiet TYT (TYT od TYTu, ale w skrcie, eby
oszczdzi Wam pisania). Adres rozbijamy na modszy i starszy bajt. Bajt
modszy wdruje do rejestru X, starszy za - do Y. Do akumulatora wpisuje-
my 1, bo tytu skada si tylko z jednego znaku - $ zreszt. Po czym wskaku-
jemy do procedurki SETNAM ($ffbd). W tym wanie momencie


3. Zaczynaj si schody

bo gdybymy kazali katalog ordynarnie zaadowa to nie do, e nie byo-
by to adne odkrycie, ale na domiar zego zostaby zlikwidowany istniejcy
w pamici program w BASIC-u. A sama asemblerowa procedura adujca
tylko nieznacznie rniaby si od programu 2 z odcinka sierpniowego. Ale
przecie to nie my jestemy niewolnikami swoich komputerw, ale one ma-
j taczy tak, jak my im zagramy. Na czym bowiem polega adowanie ja-
kiegokolwiek zbioru do pamici? Komputer musi otworzy zbir, a nastp-
nie pobiera z niego kolejne bajty i wstawia je do pamici, do kolejnych
komrek. Oczywiste? Te czynnoci wykonuje KERNALowa procedura LO-
AD($ffd5).
   My za musimy zbir otworzy, a kolejne bajty nie - zapamitywa jako
program BASIC, a jedynie wyrzuca na ekran jako dane tymczasowe. Jak
jednak dokona tego w praktyce? Po przejrzeniu tabeli KERNALa widzimy,
e do przygotowania pliku do wzicia udziau w operacjach we/wy suy
procedura OPEN ($ffc0). Wymaga ona tylko, by numer tego pliku logiczne-
go znalaz si w akumulatorze. I znajdzie si. Musimy tylko uwaa, by by
identyczny z numerem, ktry podalimy w rejestrze A przed wywoaniem
procedury SETLFS.
   Ale to jeszcze nie wszystko. Po otwarciu pliku musimy ustawi go jako ak-
tualny kana wejciowy. Suy do tego CHKIN. Dla odmiany, numer pliku
musi si znale w rejestrze X.
Teraz rzecz jest ju w zasadzie prosta. Po drucie ze stacji musimy prze-
cign bajty procedur CHRIN ($ffcf). Kolejny znak znajdzie si w akumu-
latorze po kadym wywoaniu CHRIN. Aby wartoci z akumulatora nie szy
nam w komin, to po kadym CHRIN wykona musimy CHROUT ($ffd2). Co
jest znanym ju od dawna sposobem na wydrukowanie znaku na 
ekranie.
A oto przecie chodzi


4. Schody si pitrz

   Jeli jednak nakaemy komputerowi powtarzanie prostej ptli
CHRIN/CHROUT, to nie dziwmy si, jeli otrzymamy sieczk zamiast
uczciwego katalogu dyskietki. Aby przeledzi, jak wyglda struktura kata-
logu popeniem prosty programik, ktry po wydrukowaniu kadej litery po-
kazywa na ekranie jej warto liczbow (czyli kod ASCII, a waciwie PE-
TASCII), nastpnie czeka na nacinicie jakiegokolwiek klawisza, a potem
przechodzi z powrotem do CHRIN. Program taki jest prociutki i kady
z Was powinien ju umie napisa go samemu, wic nie bd traci na nie-
go bd co bd cennego miejsca. Woyem do stacji pierwsz z brzegu
dyskietk i otrzymaem co nastpuje:


5. Rozpiska bajtw w katalogu dysku

Bajt	Warto	Znaczenie
1	1	
2	4	
3	1	
4	1	
5	0	m. bajt zera
6	0	st. bajt zera
7	18	wczenie negatywu (RVS ON)
8	34	cudzysw
9-24		nazwa dysku
25	34	cudzysw
26	32	odstp
27-28		ID dysku
29	32	odstp
30	50	" 2"
31	65	"a"
32	0	koniec linii
33	1	
34	1	
35		m. bajt dugoci zbioru
36		st. bajt dugoci zbioru
37-39	32	3 odstpy
40	34	cudzysw
41-5		nazwa pierwszego programu +cudzysw
58	32	odstp
59	80	p (tu: prg, ale moe by np. SEQ)
60	82	r
61	71	g
62	32	odstp
63	32	odstp
64	0	koniec linii
65	1	
66	1	
67		m. bajt liczby wolnych blokw
68		st. bajt liczby wolnych blokw
69-80		napis "blocks free."
81-93	32	13 odstpw
94-96	0	trzy zera, koniec katalogu.

   Oczywicie, ta rozpiska jest tylko przykadowa, ale ma wszystkie 
elementy: nagwek, nazw jakiego programu i zakoczenie w postaci liczby wol-
nych blokw. Jak wida, s podane w takiej samej formie jak program w
BASIC-u z t rnic, e nie ma adresw pocztkw nastpnych linii na
pocztku poprzednich. Projektanci maszyny zdawali sobie spraw, e nie
bd one nikomu do niczego potrzebne, wic poszli na atwizn i powpisy-
wali tam po prostu jedynki. A skutek tego taki, e te nieszczsne jedynki
musimy tylko w katalogu pobra i puci w powietrze.
   Po jedynkach idzie liczba podana w postaci modszego i starszego bajtu.
Do wydrukowania na ekranie liczby w zwykej, dziesitnej postaci, gdy
mamy j jako dwa bajty, suy umieszczona w pamici ROM procedura
LINPRT. Normalnie przydaje si w BASIC-u podczas drukowania listingw
programw, ale my, cwaniaczki, wykorzystamy j do wasnych celw.
   eby wykorzysta LINPRT ($bdcd) trzeba jej poda modszy bajt liczby w
rejestrze X, a starszy - w akumulatorze. Nastpnie idzie nazwa. Trzeba j
bajt po bajcie drukowa tak dugo, a natkniemy si na zero. Gdy dogrze-
biemy si do zera, to wyrzucamy na ekran 13/$Od i przechodzimy do
nastpnej linii.
   Wszystko adnie, ale tak napisany program, niestety, nie bdzie dziaa
poprawnie. To znaczy - na pierwszy rzut oka tak, ale nie rozpozna, e kata-
log si skoczy i to, co zostao wydrukowane z prdkoci wiata ucieknie
nam z pola widzenia. Drugim powanym mankamentem jest fakt, e pro-
gramu tak napisanego nie mona zatrzyma klawiszem RUN/STOP. Nie
sprawia to kopotu, gdy programw jest na dysku kilka, ale gdy zajmuj one
trzy ekrany, zaczyna si robi kopotliwe.
Oba te problemy s, oczywicie, pozorne i rozwiza je mona w minut
dziesi. Wskanikiem koca pliku jest szsty bit w komrce STATUS
($90). Jeeli zostanie on zapalony, czyli jeeli wykonanie AND
#%01000000 z wartoci z rejestru STATUS da wynik 1, to znaczy 
to, e
dalszy odczyt z kanau nie ma sensu, bo wpucimy si tylko w jaki pode-
jrzany kana organizacyjny i mog z tego wynikn jakie nieprzyjemnoci.
Do obsugi klawisza STOP suy za rejestr STKEY ($91). Nacinicie
tego guzika spowoduje zapalenie ostatniego, sidmego bitu tej komrki.
Dodatkow zalet tego rozwizania jest fakt, e testowanie stopu robimy za
pomoc jednego tylko rozkazu: BPL. Jeeli STOP bdzie wcinity, skok
zostanie wykonany. Jasne? Jasne?
Warto jeszcze nadmieni, e po skoczeniu (lub przerwaniu, co na jedno
wychodzi) odczytywania katalogu dyskietki naley zamkn plik wejciowy,
ten ktry przed odczytem otwieralimy oraz - dla porzdku - ustawi monitor
i klawiatur jako aktualne we/wy. Suy do tego CLOSE ($ffc3) i CLRCHN ($ffcc).
I w ten sposb dobrnlimy do szczliwego finau. Teraz, za cierpliwe
zczytanie caego odcinka naley si Wam


6. Listing

	*=10000
	lda #1		;nr pliku logicznego
	ldx #8		;8 - stacja dyskw
	ldy #0
	jsr $ffba	;SETLFS
	lda #$01
	ldx #<tyt	;parametry tytuu
	ldy #>tyt
	jsr $ffbd	;SETNAM
	lda #1		;nr pliku logicznego
	jsr $ffc0	;OPEN
	ldx #1
	lda #1
	jsr $ffc6	;CHKIN
	jsr $ffcf
	jsr $ffcf	;zbdne bajty
liczba	jsr $ffcf
	jsr $ffcf
	lda $90		;test koca pliku
	and #%01000000
	bne knc
	jsr $ffcf
	tax		;m. bajt
	lda $91		;test klawisza stop
	bpl knc
	jsr $ffcf	;st. bajt
	jsr $bdcd	;LINPRT	
	lda #32
	jsr $ffd2	;wstawienie spacji
czytaj	jsr $ffcf	;czytanie litery
	bne bom		;jeli nie 0 to bom
	lda #13		;napisz return
	jsr $ffd2
	jmp liczba
bom	jsr $ffd2	;napisz liter
	jmp czytaj	;dalej czytaj dir
knc	lda #1
	jsr $ffc3	;CLOSE
	jsr $ffcc	;CLRCHN
	rts		;do domu
tyt	.text "$"	;znak dolara

7. NA ZRAZIE

   Listing nagrajcie sobie na dysk, ewentualnie na tam. Magnetofoniakw
przepraszam, e ten odcinek nie byt dla nich. Takie jest ycie, a cukier
droeje. Uruchamia si jak zwykle - SYS 10000. Nie uschnijcie z tsknoty.

(cdn.)
Parszywa dwunastka
Barttomiej I. Kachniarz
