Asembler 6502 (cz.13)

Drukarko - Drukuj! Stacjo - Stacjonuj!


1. Rewolucyjna  czujno

W odpowiedzi na moje zapytanie z 11 odcinka kursu asemblera, wielu
z Was wykazao rewolucyjn czujno i poprzysyao zamwienia na doka-
dniejsze wytumaczenie paru procedur kernalowskich. Wikszo listw
obracao si wok tematyki pocze z urzdzeniami zewntrznymi, takimi
jak stacja dyskw i drukarka (bo tak Bogiem a prawd, tylko z nich moe
wycisn co sensownego zwyczajny uytkownik zomodorka). Jak mawia-
j demokraci, vox populi - vox Dei, wic najpierw zajmiemy si zagadnie-
niem poruszanym zdecydowanie czciej.
A oglniej - jak kaza stacji dyskw wykona jakiekolwiek, choby najpro-
stsze polecenie DOS-u? Wielu, co prawda, ma z tym problemy nawet z po-
ziomu BASIC-a, ale to pocztkujcy. My jestemy zaawansowani i BASIC
mamy w maym paluszku. Dlatego te wiemy, e trzeba wpisa komputero-
wi takie instrukcje:
10 OPEN 15,8,15
20 PRINT# 15,"N:NAZWA DYSKU,ID"
30 CLOSE 15
Mamy tylko pewne wtpliwoci, jak zrobi to w asemblerze. Na pocztek
powiem Wam, e trzeba wysta stacji dokadnie takie same komendy nie-
zalenie od tego, czy pracujemy w asemblerze, czy w BASIC-u. Stacji jest
po prostu wszystko jedno, ona tego nie widzi. Dostaje tylko po drucie bajty,
ktre potem ukada sobie w rzdku i patrzy, czy wynika z nich co sensow-
nego. Jeli nie, to zamiast formatowa dysk zacznie wesoo mruga diodk.
Musimy wic po prostu stara si jak najdokadniej odwzorowa instrukcje
BASIC-a w rozkazach asemblera.
Pierwszym, najbardziej oczywistym jest OPEN ($ffc0), o ktrym wiemy
jednak, e nie moe istnie bez uprzedniego SETLFS ($ffba). Potem usta-
wiamy odpowiedni kana jako aktualny kana wyjciowy, procedur CHKO-
UT ($ffc9). Kolejne bajty posyamy na szyn znanym dobrze CHROUT
($ffd2). Kiedy ju polemy wszystko, trzeba dla porzdku ustawi monitor
i klawiatur jako aktualne urzdzenia wejcia/wyjcia (CLRCHN, $ffcc).
W zasadzie naleaoby jeszcze zamkn kana - CLOSE ($ffc3), ale
przeduyoby to czas pracy programu, ktry musiaby oczekiwa, a stacja
ogosi gotowo do dalszej pracy. Teraz musimy jeszcze powpisywa r-
ne cyferki do rejestrw A, X i Y i program gotowy. A oto (oczywicie tylko
dla porwnania z Waszymi osigniciami!) moje rozwizanie palcego pro-
blemu formatowania dyskietki.

	*=$2710
	lda #15		;nr kanau
	ldx #8		;nr urzdzenia
	tay		;adr. pomocniczy
	jsr $ffba	;SETLFS
	lda #15		;nr kanau
	jsr $ffc0	;OPEN
	ldx #15		;nr kanau
	jsr $ffc9	;CHKOUT
	ldx #0		
petla	lda wyslac,x	;petla wysyajca
	beq koniec	;kolejne bajty
	jsr $ffd2	;do stacji dyskow
	inx
	bne petla
koniec	jsr $ffcc	;CLRCHN
	rts

wyslac	.text "n:nazwa dysku,id"
	.byte 0

I w ten oto prosty sposb robimy w 19 linijkach kodu to, co w BASIC-u
zajmuje trzy linie. Oczywicie fanatycy BASIC-a mog to wykorzysta jako
argument w ew. dyskusji, ale my skwitujemy to pogardliwym umieszkiem.
A tak powanie - to procedura taka moe si okaza bardzo uyteczna,
jeeli projektujemy napisanie jakiego programu wsppracujcego ze
stacj dyskw. Np. moemy wstawi do opcj "Operacja DOS", pobra
dane z klawiatury i po prostu wysa je potem do stacji. Kady program
duo na tym zyska. Trzeba by tylko zmieni ptl wysyajc znaki do
stacji. Ptla ta znajduje si w komrkach $27220-$272e.


3. Jak by tu co wydrukowa?

Kopot bardzo podobny do wyej poruszonego maj waciciele drukarek.
Nie bardzo bowiem wiedz, jak zmusi je do drukowania czegokolwiek
poza tekstem z edytorw tekstu. A w istocie problem sprowadza si do
tego samego, co poprzedni - do wysania odpowiednich bajtw po
odpowiednim drucie. No i waciwego ich zaadresowania. Przy okazji
udowodni, e dla nas, asemblerowcw nie s staszne nawet znaki sterujce
(bd one waciwe dla MPS803 i innych, potraficych t emulowa).
Podczas drukowania naley pamita o zakoczeniu ostatniej linijki
kodem 13, odpowiadajcym naciniciu RETURN. Inaczej drukarka bdzie
czeka a do zapenienia bufora, czyli zazwyczaj do witego Nigdy.


	*=$2710
urz     =4	
	lda #urz	;nr kanau
	tax		;nr urzdzenia
	ldy #0		;adres pomocniczy
	jsr $ffba	;SETLFS
	lda #urz	;nr kanau
	jsr $ffc0	;OPEN
	ldx #urz	;nr kanau
	jsr $ffc9	;CHKOUT
	ldx #0	
petla	lda wyslac,x	;ptla wysyajca
	jsr $ffd2	;kolejne bajty
	inx		;do stacji dyskow (ed. drukarki?)
	bne petla
	jsr $ffcc	;CLRCHN	
	rts
wyslac	.byte 14	;znak dla drukarki
			;rozszerzone litery
	.text "c&a"
	.byte 15	;znak dla drukarki
			;litery zwyke
	.text "jest bombowe!"
	.byte 13,0	;return

Warto jeszcze nadmieni, e w wersji asemblerowej dla wygody
wprowadziem etykiet "urz". Oznacza ona numer urzdzenia, ktry
przypisany jest drukarce. Bywa 5, bywa 4. U mnie akurat byo 4.

4. Pa Pa!

Do tego na ten miesic. Bawcie si wesoo. Ju niedugo zaserwuj
Wam pen rozpisk komend procesora 6502, wraz z cyklami i trybami
adresowania! A jak dobrze pjdzie, to opublikujemy te nieopublikowane!

Samozwaczy Rektor Asemblera
Bartomiej I. Kachniarz
