home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
robot-pd
/
19304.ZIP
/
19304A.DSK
/
cc.n68
< prev
next >
Wrap
Text File
|
1998-02-03
|
4KB
|
101 lines
Ein paar kleine Assembler-Routinchen fuer Anfaenger
-----------------------------------------------------
VORWORT:
Dies hier ist gedacht fuer Einsteiger in Assembler. Man sollte ein biss-
chen Ahnung von Basic haben, ein Buch, in dem die grundsaetzlichen Dinge
ueber die Register usw. stehen, und einen Assembler (vorzugsweise MAXAM),
in den man die Progs eingeben kann. - Im folgenden (evtl. auch in den
naechsten CCs) werden einige einzelne Assemblerbefehle (und das Drumherum
dazu) naeher erlaeutert, mit denen sich auf einfache Weise einiges anstel-
len laesst. -----
Problemstellung:
Wenn man ein Programm hat, das immer mal wieder einen bestimmten Screen
anzeigt, legt man den am besten im RAM ab und holt ihn immer wieder her-
vor, wenn man ihn braucht. Sehr praktisch auch, wenn man einen Screen hat,
an dem sich nur immer ein Teil aendert. Statt ihn immer wieder neu aufzu -
bauen (via Basic oder nachladen), holt man ihn in 0,nix aus dem RAM und
aendert nur die Details ab.
Praxis: Ein normaler Screen ist 16 KB lang und liegt im RAM von Adresse
von &C000 bis &FFFF. Ablegen koennte man ihn z.B. im 16K-Block von &4000
bis &7FFF. Also erst mal mit MEMORY &3FFF sicherstellen, dass er nicht
versehentlich ueberschrieben werden kann (BasicSpeichergrenze runtersetz-
en). Die Routine, um den Screen ins Memory zu holen, sieht nun so aus:
(eingeben in einen Assembler, also z.B. Maxam laden, 'T'exteditor waehlen,
dann 'E'dit Text)
org &8000 ; Assemblerroutine steht gleich hinter dem Screen ab &8000
ld bc,&4000 ; in Reg. BC steht Laenge des Blocks (16 KB=&4000 Bytes)
ld de,&4000 ; in DE steht Adresse, ab der der Block stehen soll (Ziel)
ld hl,&c000 ; in HL steht die Anfangsadresse, wo der Block herkommt
ldir ; der Block ab HL mit Laenge BC wird nach ab DE geschrieben
ret ; Ruecksprung (z.B. ins Basic)
Damit kennt Ihr schon mal die Funktion und Anwendung des
Blocktransferbefehls LDIR !
Der Rest ist wohl klar. BC, LD und HL koennte man mit Variablen verglei-
chen, die mit den jeweiligen Werten geLaDen werden.
Um den Screen aus dem RAM wieder auf den Bildschirm zu kriegen, wechseln
wir nur Ziel- und Endadresse des Blocks aus, also die Inhalte der Register
DE und HL.
Nach dem 'ret' (s.o.) schreiben wir also gleich die Umkehrroutine hin:
ld bc,&4000
ld de,&c000
ld hl,&4000
ldir
ret
(nun bei Maxam mit ESC aus dem Editor raus und 'A'ssemble waehlen)
Alles in allem ist das Doppelroutinchen 24 Bytes lang...
Mit CALL &8000 ruft man die erste Routine auf (Screen ---> Memory),
mit CALL &800C ruft man die zweite Routi auf (Memory ---> Screen).
In ein Basicprogramm eingebunden sieht das dann so aus:
10 MEMORY &7FFF:FOR A=&8000 TO &8017:READ B:POKE A,B:NEXT
20 DATA &01,&00,&40,&11,&00,&40,&21,&00,&C0,&ED,&B0,&C9
30 DATA &01,&00,&40,&11,&00,&C0,&21,&00,&40,&ED,&B0,&C9
Die ganzen Hex-Zeichen "&" kann man sich auch sparen, wenn man sie automa-
tisch dranfuegen laesst. Statt READ B:POKE A,B muss man dann schreiben:
READ B$:POKE A,VAL("&"+B$) .
(hat man die Routi mit Maxam eingegeben, kann man sie als ASCII-File ab-
speichern ('S') oder gleich als echte MC-Routi: mit 'Q' aus dem Texteditor
raus, dann mit 'B' aus dem Hauptmenue ins Basic, dort eingeben:
SAVE"ROUTI",B,&8000,&18 (B heisst Binaerfile, &8000 ist die Anfangsaddy,
&18 ist die Laenge in Bytes) ) (geladen wird das MC-Prog mittels MEMORY
&7FFF:LOAD"ROUTI",&8000)
Um die tolle Wirkung der Routi auszuprobieren, laden wir gleich mal (im
richtigen Modus natuerlich (0/1/2) irgend einen 17-K-Screen und legen ihn
mittels unserer Routi nach &8000:
MODE <0/1/2>:LOAD"SCREEN.SCR",&C000:CALL &8000
Dann 'leeren' wir den Screen: CLS
und geben CALL &800C ein...
Schwupp, da isser wieder.
Vorsicht: Scrollt man den Screen (mit den Cursortasten z.B.), verschiebt
sich die Anfangsadresse selbigens, so dass bei CALL &800C das Bild etwas
"durcheinander" angezeigt wird. Daher vorher immer wieder den Screen mit
dem MODE-Befehl 'initialisieren'!
All right ?
N{chstes Mal kommt das gleiche nochmal, diesmal aber auf eine ganz andere
Weise ! La~t Euch }berraschen (oder auch nicht...)!
HYPNOMEGA