## Assembler tricks

Na samym początku tego artykułu pragnę powiedzieć, że nie będzie w tym cyklu nauki assemblera od podstaw. Jeśli ktoś chce się go nauczyć niech sięgnie np. po "Tajemnice ATARI", lub inną literaturę tego typu. Nie będzie także skomplikowanych procedur wykonujących zniewalające efekty. Będą natomiast proste procedurki (=krótkie), które można zwięźle nazwać trickami. Wszystkie procedury drukowane w tym cyklu będą oczywiście w QUICKU, ale na pewno każdy programujący w innym assemblerze będzie mógł bez problemu przełożyć je na posiadany przez siebie assembler.

Na początek pokażę jak uzyskać efekt odwróconego "do góry nogami" obrazu. W zasadzie odwracane są tylko znaki poprzez odpowiednią zmianę zmwartości komórki `CHACT` ($02F3). Wbrew pozorom jest to zadanie bardzo proste, trzeba tylko wiedzieć co, gdzie, jak umieścić w pamięci. A więc zaczynamy. Efekt odwracania liter uzyskuje przez ustawienie drugiego bitu `CHACT`. Nasza procedurka najpierw odwróci obraz "do góry nogami", następnie poczeka na naciśnięcie dowolnego klawisza i powróci do DOS'u. Na początek zadeklarujmy etykiety używane przez procedurę:

    	chact	equ	$02F3
    	start	equ	$0700
    	klawisz	equ	764
    	nic	equ	#255
    	bit2	equ	%00000100

Teraz trochę wyjaśnień. Znaczenia etykiety `CHACT` nie trzeba chyba wyjaśniać. Etykieta `START` to rejestr zawierający początkowy adres DOS'u w pamięci. Etykieta KLAWISZ to oczywiście rejestr zawierający kod ostatnio naciśniętego klawisza. Etykieta `NIC` to zwyczjna liczba dziesiętna. Etykieta `BIT2` po załadowaniu do komórki `CHACT` ustawi nam drugi bit tego bajtu, a tym sposobem spowoduje odwrócenie wszystkich znaków. A więc zacznijmy nasz program.

    		opt	%100101

Rozkaz ten ustala parametr assemblacji w postaci: "kieruj kod na dysk bez listowania błędów na ekran".

    		org	$0600

Kolejna ważna sprawa, a mianowicie umieszczenie programu w pamięci. W tym przypadku na szóstej stronie pamięci. Teraz obróćmy znaki:

    	main	lda	bit2
    		sta	chact

Dzieje się tak po ustawieniu bitu drugiego komórki `CHACT`. Teraz trzeba poczekać na naciśnięcie dowolnego klawisza.

    	czekaj	lda	klawisz
    		cmp	nic
    		beq	czekaj

Pozostaje tylko powrócić do DOS'u wykonując skok na adres $0700:

    		jmp	start

Po powrocie do DOS'u ekran pozostanie odwrócony (i o to nam chodzilo). Można temu zaradzić ładując liczbę 0 do komórki 755 ($02F3), ale trzeba pamiętać, że musi to być przed skokiem do $700. Na koniec trzeba podać DOS'owi adres i miejsce, od którego ma uruchomić naszą procedurę. A robi się to tak:

    		org	$02E0
    		dta	a(main)

Oczywiście każda procedura musi kończyć się rozkazem `END`, aby assembler wiedział kiedy zakończyć assemblację.

    		end	of nasz programik

i to już koniec procedury. Mam nadzieję, że każdy mniej lub bardziej doświadczony użytkownik assemblera nie będzie miał kłopotów z jej uruchomieniem. Aby to zrobić należy w opcji File assemblera ustawić w opcji Obj nazwę programu np. OBROT.COM, a następnie wykonać funkcję Assembly. Nasz programik zostanie zapisany na dysku pod nazwą podaną w opcji Obj. Po jego uruchomieniu obraz powinien się odwrócić, a po naciśnięciu klawisza powinien powrócić do DOS'u.

MURZYN