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 >
Text File  |  1998-02-03  |  4KB  |  101 lines

  1.              Ein paar kleine Assembler-Routinchen fuer Anfaenger
  2.             -----------------------------------------------------
  3.  
  4. VORWORT:
  5.  Dies hier ist gedacht fuer Einsteiger in Assembler. Man sollte ein  biss-
  6. chen Ahnung von Basic haben, ein Buch, in  dem die  grundsaetzlichen Dinge
  7. ueber die Register usw. stehen, und einen  Assembler (vorzugsweise MAXAM),
  8. in den man  die Progs  eingeben kann. - Im  folgenden  (evtl. auch  in den
  9. naechsten CCs) werden einige einzelne Assemblerbefehle  (und das Drumherum
  10. dazu) naeher erlaeutert, mit denen sich auf einfache Weise einiges anstel-
  11. len laesst. -----
  12.  
  13.  
  14. Problemstellung:
  15. Wenn man ein Programm hat,  das immer mal wieder  einen bestimmten  Screen
  16. anzeigt, legt man den am besten im  RAM ab und holt ihn  immer wieder her-
  17. vor, wenn man ihn braucht. Sehr praktisch auch, wenn man einen Screen hat,
  18. an dem sich nur immer ein Teil aendert. Statt ihn immer wieder neu aufzu -
  19. bauen (via Basic oder nachladen), holt man  ihn in  0,nix aus dem  RAM und
  20. aendert nur die Details ab.
  21.  
  22. Praxis:  Ein normaler Screen ist  16 KB lang und liegt im RAM  von Adresse
  23. von &C000 bis &FFFF. Ablegen koennte man ihn  z.B. im  16K-Block von &4000
  24. bis &7FFF.  Also erst  mal mit  MEMORY &3FFF sicherstellen, dass er  nicht
  25. versehentlich ueberschrieben werden kann (BasicSpeichergrenze  runtersetz-
  26. en). Die Routine, um den Screen ins Memory zu holen, sieht nun so aus:
  27. (eingeben in einen Assembler, also z.B. Maxam laden, 'T'exteditor waehlen,
  28. dann 'E'dit Text)
  29.  
  30. org &8000     ; Assemblerroutine steht gleich hinter dem Screen ab &8000
  31. ld bc,&4000   ; in Reg. BC steht Laenge des Blocks (16 KB=&4000 Bytes)
  32. ld de,&4000   ; in DE steht Adresse, ab der der Block stehen soll (Ziel)
  33. ld hl,&c000   ; in HL steht die Anfangsadresse, wo der Block herkommt
  34. ldir          ; der Block ab HL mit Laenge BC wird nach ab DE geschrieben
  35. ret           ; Ruecksprung (z.B. ins Basic)
  36.  
  37. Damit kennt Ihr schon mal die Funktion und Anwendung des
  38.  
  39.                         Blocktransferbefehls LDIR !
  40.  
  41. Der Rest ist wohl klar. BC, LD und HL  koennte man mit  Variablen verglei-
  42. chen, die mit den jeweiligen Werten geLaDen werden.
  43.  
  44. Um den Screen aus dem RAM wieder  auf den Bildschirm zu kriegen,  wechseln
  45. wir nur Ziel- und Endadresse des Blocks aus, also die Inhalte der Register
  46. DE und HL.
  47. Nach dem 'ret' (s.o.) schreiben wir also gleich die Umkehrroutine hin:
  48.  
  49. ld bc,&4000
  50. ld de,&c000
  51. ld hl,&4000
  52. ldir
  53. ret
  54.  
  55. (nun bei Maxam mit ESC aus dem Editor raus und 'A'ssemble waehlen)
  56.  
  57. Alles in allem ist das Doppelroutinchen 24 Bytes lang...
  58. Mit CALL &8000 ruft man die erste Routine auf (Screen ---> Memory),
  59. mit CALL &800C ruft man die zweite Routi  auf (Memory ---> Screen).
  60.  
  61. In ein Basicprogramm eingebunden sieht das dann so aus:
  62.  
  63. 10 MEMORY &7FFF:FOR A=&8000 TO &8017:READ B:POKE A,B:NEXT
  64. 20 DATA &01,&00,&40,&11,&00,&40,&21,&00,&C0,&ED,&B0,&C9
  65. 30 DATA &01,&00,&40,&11,&00,&C0,&21,&00,&40,&ED,&B0,&C9
  66.  
  67. Die ganzen Hex-Zeichen "&" kann man sich auch sparen, wenn man sie automa-
  68. tisch  dranfuegen laesst. Statt  READ B:POKE A,B  muss man dann schreiben:
  69. READ B$:POKE A,VAL("&"+B$) .
  70.  
  71. (hat man die Routi mit Maxam eingegeben, kann  man sie  als ASCII-File ab-
  72. speichern ('S') oder gleich als echte MC-Routi: mit 'Q' aus dem Texteditor
  73. raus,   dann   mit 'B'   aus  dem   Hauptmenue  ins  Basic, dort eingeben:
  74. SAVE"ROUTI",B,&8000,&18  (B heisst Binaerfile,  &8000 ist die Anfangsaddy,
  75. &18 ist die Laenge in Bytes) )  (geladen  wird das MC-Prog mittels  MEMORY
  76. &7FFF:LOAD"ROUTI",&8000)
  77.  
  78. Um die tolle Wirkung  der Routi auszuprobieren, laden wir  gleich mal  (im
  79. richtigen Modus natuerlich (0/1/2) irgend einen 17-K-Screen und legen  ihn
  80. mittels unserer Routi nach &8000:
  81.  
  82. MODE <0/1/2>:LOAD"SCREEN.SCR",&C000:CALL &8000
  83.  
  84. Dann 'leeren' wir den Screen: CLS
  85.  
  86. und geben CALL &800C ein...
  87.  
  88. Schwupp, da isser wieder.
  89.  
  90. Vorsicht: Scrollt man den Screen (mit den  Cursortasten z.B.),  verschiebt
  91. sich die  Anfangsadresse selbigens, so dass bei  CALL &800C das Bild etwas
  92. "durcheinander" angezeigt wird. Daher vorher  immer wieder den  Screen mit
  93. dem MODE-Befehl 'initialisieren'!
  94.  
  95. All right ?
  96.  
  97. N{chstes Mal kommt das gleiche nochmal, diesmal aber auf eine ganz  andere
  98. Weise ! La~t Euch }berraschen (oder auch nicht...)!
  99.  
  100.                                                                  HYPNOMEGA
  101.