home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / Asm-Course2.lha / Teil21.TXT < prev    next >
Encoding:
Text File  |  1992-09-02  |  17.0 KB  |  417 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 21.Teil...
  4.  
  5. So, das mit der Laufschrift ist ja ziemlich einfach, oder ?
  6. Naja, mit einer Plane ist das ja auch kein Problem. Was ist aber wenn wir
  7. Zeichensaetze machen die mehr als 2 Farben haben, weil sie halt schoener
  8. sind. Ganz einfach, dann muessten wir den ganzen Aufwand den wir fuer eine
  9. Plane gemacht haben, auf fuer die anderen machen. Ich spreche von dem
  10. Sicherheits bereich und so. Auch das Aussehen der Buchstaben muessten wir
  11. dann mehrmals kopieren, weil so ein z.B 8 Farbiger Buchstabe auch aus 3
  12. Planes besteht. Das ist zwar kein grosses hinderniss, aber es haelt doch
  13. eben auf.
  14. Deshalb werde ich ein Technik erklaeren, die man Normalerweise bei
  15. mehrfarbigen Laufschriften und bei Bobs, zwar nicht immer, aber oft anwendet.
  16.  
  17. 19.Verschachtelte Planes
  18.  
  19. Hmmm, was heisst das denn ?
  20.  
  21. Es ist im Prinzip logisch. Normalerweise liegt die Definition fuer einen 3
  22. Plane Buchstaben so im Speicher.
  23.  
  24. Plane 1, Zeile 1
  25. Plane 1, Zeile 2
  26. ...
  27. ...
  28. Plane 2, Zeile 1
  29. Plane 2, Zeile 2
  30. ...
  31. ...
  32. Plane 3, Zeile 1
  33. Plane 3, Zeile 2
  34.  
  35. Das heisst auch gleichzeitig `Um den Kompletten Buchstaben auf den Screen
  36. zu bringen, muessen wir fuer jede Plane einen Blitteraufruf machen, der
  37. dann die Plane an die Richtige Adresse setzt.
  38. Um die Anzahl der Aufrufe aber wieder auf eins zu setzen, verschachtelt man
  39. die Planes des leeren Playfields wo die Bobs (oder die Laufschrift) rein
  40. soll, und man verschachtelt die Bobs selber. Verschachtelt sieht eine
  41. Bobdefinition dann so aus.
  42.  
  43. Plane 1, Zeile 1
  44. Plane 2, Zeile 1
  45. Plane 3, Zeile 1
  46. Plane 1, Zeile 2
  47. Plane 2, Zeile 2
  48. Plane 3, Zeile 2
  49. Plane 1, Zeile 3
  50. Plane 2, Zeile 3
  51. ...
  52. ...
  53.  
  54. Jetzt kann ich die komplette Definition mit einem Schlag kopieren.
  55. Allerdings muessen dann die Bitplanepointer und die Modulo werte stimmen.
  56.  
  57. Die Bitplanepointer muessen auf die ersten drei Zeilen der Bitplane zeigen.
  58. Bei dem Playfield wie wir es immer benutzen (normal PAL) saehen sie Pointer
  59. so aus.
  60.  
  61. BPL1PT = $40000
  62. BPL2PT = $40028
  63. BPL3PT = $40050
  64.  
  65. Natuerlich in der Copperliste getrennt geschrieben.
  66. Und die Modulowerte muessten bei 3 Planes 80 ($50) betragen, damit die
  67. Naechsten zwei Zeilen im Speicher uebersprungen werden, weil dort ja die
  68. Daten fuer die anderen beiden Planes stehen. Die zweite Zeile der Ersten
  69. Plane steht dann erst bei $40078. Das hoert sich vielleicht kompliziert an,
  70. ist es aber nicht.
  71.  
  72. Das leere Playfield so zu initialisieren ist ja Null Problemo, aber wie
  73. machen wir das mit den Buchstaben fuer eine Laufschrift.
  74. Um das auszuprobieren muesst ihr einfach euer Bild mit dem Zeichensatz fuer
  75. die Laufschrift auf 4 Farben erweitern, und damit ihr es sehen koennt malt
  76. ihr noch, sofern es geht einen Bunten rand um die Buchstaben, ihr koennt
  77. natuerlich auch einen neuen Zeichensatz malen, ich lasse euch da freie
  78. Hand.
  79. Wichtig ist nur das es mehr als eine Plane ist, denn sonst laesst es sich
  80. schlecht verschachteln.
  81.  
  82. Frueher war es ein Grosses Problem mit dem Verschachteln, es war fast
  83. unmoeglich, oder man musste grossartige Routinen fuerden blitter schreiben,
  84. um seine Bobs oder Laufschrift Buchstaben zu verschachteln. Bis der
  85. Kefrens-IFF-Converter kam. Er konnte das auf Knopfdruck.
  86.  
  87. Ihr muesst einfach vor dem Abspeicher der RAW-Datei, wenn ihr aus dem
  88. IFF-ILBM ein RAW-NORM macht, nochmal drauf druecken, dann erscheint
  89. naemlich RAW-BLIT, das ist dieses Verschachtelte Format, das man benutzt
  90. wenn man mit dem Blitter arbeiten.
  91. So einfach ist das....
  92.  
  93. Wenn man dann noch die Richtigen werte einstellt laeuft die Laufschrift wie
  94. gehabt mit einem Aufruf, obwohl sie aus 2 Planes besteht. Natuerlich muesst
  95. ihr bei den Blitteraufrufen die zu kopierende Zeilenzahl verdoppeln, denn
  96. die veraendert sich ja.
  97.  
  98. So nebenbei habe ich mal eine Liste mit den Wichtigsten Registern und
  99. Adressen getippt, sie ist fertig, und ich setze sie dann natuerlich
  100. hierein.
  101.  
  102. Einfach ausschneiden und in den Source kleben...
  103.  
  104. Register.....
  105.  
  106. Bpl1Mod=        $Dff108         ;Bitplane modulo ungerade Planes (1,3,5)
  107. Bpl2Mod=        $Dff10a         ;Bitplane modulo gerade Planes (2,4,6)
  108. BplCon0=        $Dff100         ;Bitplane Kontroll Register 0
  109. BplCon1=        $Dff102         ;Bitplane Kontroll Register 1
  110. BplCon2=        $Dff104         ;Bitplane Kontroll Register 2
  111. Bpl1Pth=        $Dff0e0         ;Bitplane Kointer 1-6 (Msb)
  112. Bpl2Pth=        $Dff0e4         ;Werden jeden VBI neu eingesetzt
  113. Bpl3Pth=        $Dff0e8
  114. Bpl4Pth=        $Dff0ec
  115. Bpl5Pth=        $Dff0f0
  116. Bpl6Pth=        $Dff0f4
  117. Bpl1Ptl=        $Dff0e2         ;Bitplane Pointer 1-6 (Lsb)
  118. Bpl2Ptl=        $Dff0e6         ;Werden jeden VBI neu eingesetzt
  119. Bpl3Ptl=        $Dff0ea
  120. Bpl4Ptl=        $Dff0ee
  121. Bpl5Ptl=        $Dff0f2
  122. Bpl6Ptl=        $Dff0f6
  123. BltCon0=        $Dff040         ;Blitter controll register 0
  124. BltCon1=        $Dff042
  125. BltSize=        $Dff058         ;Blitter size (Start) Register
  126. BltAFWM=        $Dff044         ;Blitter erstes wort maske A
  127. BltALWM=        $Dff046         ;Blitter letztes wort maske A
  128. BltAMod=        $Dff064         ;Blitter A Modulo
  129. BltAPth=        $Dff050         ;Blitter A Pointer (19bits)
  130. BltADat=        $Dff074
  131. BltBPth=        $Dff04c
  132. BltCPth=        $Dff048
  133. BltBMod=        $Dff062
  134. BltCMod=        $Dff060
  135. BltDMod=        $Dff066         ;Blitter D Modulo
  136. BltDPth=        $Dff054         ;Blitter D Pointer (19bits)
  137. Color0=         $Dff180         ;Start der Hardwarefarbentabelle 0-31
  138. Color1=         $Dff182
  139. Color2=         $Dff184
  140. Color7=         $Dff18e
  141. Color8=         $Dff190
  142. Color9=         $Dff192
  143. Color10=        $Dff194
  144. Color11=        $Dff196
  145. Color12=        $Dff198
  146. Color13=        $Dff19a
  147. Color14=        $Dff19c
  148. Color15=        $Dff19e
  149. Color16=        $Dff1a0         ;Hier liegen die Spritefarben {16-31)
  150. Color17=        $Dff1a2
  151. Color18=        $Dff1a4
  152. Color19=        $Dff1a6
  153. Color20=        $Dff1a8
  154. Color21=        $Dff1aa
  155. Color22=        $Dff1ac
  156. Color23=        $Dff1ae
  157. Color24=        $Dff1b0
  158. Color25=        $Dff1b2
  159. Color26=        $Dff1b4
  160. Color27=        $Dff1b6
  161. Color28=        $Dff1b8
  162. Color29=        $Dff1ba
  163. Color30=        $Dff1bc
  164. Color31=        $Dff1be
  165. Cop1Lc=         $Dff080         ;Copper Startadresse 1
  166. Cop2Lc=         $Dff084         ;Copper Startadresse 2
  167. CopJmp1=        $Dff088         ;Copper ausloeser (Strobe) 1
  168. CopJmp2=        $Dff08a         ;Cooper ausloeser (Strobe) 2
  169. DDFStop=        $Dff094         ;Display Data Fetch Stop
  170. DDFStrt=        $Dff092         ;Display Data Ftech Start
  171. DiwStrt=        $Dff08e         ;Display Window Start x,y
  172. DiwStop=        $Dff090         ;Display WIndow Stop x,y
  173. DmaCon=         $Dff096         ;Direct Memory Access Controll Register
  174. DmaConR=        $Dff002         ;DMA controll and blitter status read
  175. Intena=         $Dff09a         ;Interrupt Enable Register
  176. Intreqr=        $Dff01e         ;Interrupt Request Register
  177. PotGoR=         $Dff016         ;Pot Data (rechte Maus taste)
  178. Vposr=          $Dff006         ;Position of the Video beam on screen
  179. VPos=           $Dff004         ;Holds highbits of Video beam positon
  180. Spr0pt=         $Dff120         ;SpriteDma Pointer
  181. Spr1pt=         $Dff124
  182. Spr2pt=         $Dff128
  183. Spr3pt=         $Dff12c
  184. Spr4pt=         $Dff130
  185. Spr5pt=         $Dff134
  186. Spr6pt=         $Dff138
  187. Spr7pt=         $Dff13c
  188. CIAapra=        $Bfe001
  189.  
  190. Adressen...
  191.  
  192. Execbase=       4
  193. Openlibrary=    -552
  194. Forbid=         -132
  195. Permit=         -138
  196.  
  197. Ihr koennt es auch ausdrucken und an die Wand haengen. Das werde ich glaube
  198. ich auch jetzt mal tun...ist doch hilfreich so eine Liste neben sich zu
  199. haben.
  200.  
  201. So, dann mal weiter...Aber eigentlich brauche ich ja garnichts mehr zu
  202. erklaeren zu den Bobs, denn die Technik kennt ihr ja schon von der Routine
  203. die die Buchstaben in den Puffer kopiert.
  204.  
  205. So bevor es mit dem Blitter weitergeht, habe ich hier noch ein nette kleine
  206. Routine. Eigentlich 2...Die erste kann Punkte auf den Bildschirm setzen,
  207. und die zweite kann punkte auf dem Bildschirm loeschen.
  208.  
  209. Wofuer ihr sie gebrauchen koennt weiss ich nicht. Ich jedenfalls habe ein
  210. Feuerwerk, und ein Pixelweise verschwindendes Bild daraus gemacht.
  211.  
  212. Set:
  213.         Divu    #8,d0
  214.         Mulu    #40,d1                  ; Hier den Wert der Plane breite
  215.                                         ; einsetzen, da die Routine sonst
  216.                                         ; nicht richtig arbeitet
  217.                                         ; Normal 40, Overscan 44.
  218.         Add.w   d0,d1
  219.         Swap    d0
  220.         Move.b  #,d2
  221.         Sub.b   d0,d2
  222.         Bset    d2,(a5,d1)
  223.         Rts
  224. Clear:
  225.         Divu    #8,d0
  226.         Mulu    #40,d1                  ; Ebenso
  227.         Add.w   d0,d1
  228.         Swap    d0
  229.         Move.b  #,d2
  230.         Sub.b   d0,d2
  231.         Bclr    d2,(a5,d1)
  232.         Rts
  233.  
  234. Man muss die Routinen mit der Basisadresse der Plane in A5, der
  235. X-Koordinate des Punktes in D0, und der Y-Koordinate in D1 anspringen.
  236. Achtet bitte auf den Kommentar, er ist fuer das Funktionieren der Routine
  237. wichtig.
  238.  
  239. Ha, ich koennte mich Totschlagen...Habe ich mir die Scheissarbeit gemacht,
  240. und die Befehlsliste getippt. Und als ich eben in einer alten Diskette nach
  241. einem Noch aelteren SourceCode gesucht habe, ist mir ein Viel bessere
  242. Befehlsliste unter die Finger gekommen. Sie enthaelt gleichzeitig auch die
  243. Adressierungsarten die es gibt, und wie man den Befehl aufruft.
  244. Ich will die euch nicht vorenthalten, verzeit mir bitte, Schade um das
  245. Druckerpapier was fuer die Erste Liste draufgegangen ist. Naja, Nobody is
  246. Perfekt, ich hatte die Wirklich vergessen.
  247.  
  248.  
  249. ABCD     Quelle,Ziel      Addition zweier BCD Zahlen
  250. ADD      Quelle,Ziel      Binaere Addition
  251. ADDA     Quelle,An        Binaere Addition zu einem Adressregister
  252. ADDI     #n,<ea>          Addition mit einer Konstanten
  253. ADDQ     #n,<ea>          Schnelle Addition mit 3-Bit Konstanten
  254. ADDX     Quelle,Ziel      Addition mit Uebertrag im X-Flag
  255. AND      Quelle,Ziel      Logisches Und
  256. ANDI     #n,<ea>          Addition mit einer Konstanten
  257. ASL      n,<ea>           Arithmetische Verschiebung nach links
  258. ASR      n,<ea>           Arithmetische Verschiebung nach rechts
  259. B<bed>   Label            Verzweigt bedingt, ja nach Bedingung
  260. BCHG     #n,<ea>          Veraendert Bit n (0 -> 1 / 1 -> 0)
  261. BCLR     #n,<ea>          Setzt Bit n auf 0
  262. BSET     #n,<ea>          Setzt Bit n auf 1
  263. BRA      Label            Verzweigt (JMP-aehnlich)
  264. BSR      Label            Verzweigt in ein Unterprogramm (wie JSR)
  265. BTST     #n,<ea>          Testet Bit n (Ergebnis -> Z-Flag)
  266. CHK      <ea>,Dx          Prueft ein Datenregister auf Grenzen,
  267.                           loest ggf. CHK-Instruction-Exception aus
  268. CLR      <ea>             Loeschen eines Operanden
  269. CMP      Quelle,Ziel      Vergleich zweier Operanden
  270. CMPA     <ea>,An          Vergleich mit Adressregister
  271. CMPI     #n,<ea>          Vergleich mit einer Konstanten
  272. CMPM     Quelle,Ziel      Vergleich zweier Speicheroperanden
  273. DB(bed)  Reg,Label        Prueft die Bedingung, dekrementiert Reg
  274.                           und verzweigt ggf.
  275. DIVS     Quelle,Ziel      vorzeichenrichtige Division des 32-Bit Ziel- durch
  276.                           16-Bit Quelloperanden.Das Ergebnis liegt im Lo-Wort
  277.                           von Ziel, der Rest der Division im Hi-Wort.
  278. DIVU     Quelle,Ziel      wie DIVS, nur ohne Vorzeichen
  279. EOR      Quelle,Ziel      Exclusiv ODER
  280. EORI     #n,<ea>          Exclusiv Oder mit einer Konstanten
  281. EXG      Rn,Rn            Austausch zweier Registerinhalte
  282. EXT      Dn               Vorzeichenrichtige Erweiterung auf
  283.                           doppelte Breite
  284. JMP      Label            Springe zur Adresse
  285. JSR      Label            Rufe Unterprogramm auf;Die Ruecksprungadresse wird
  286.                           auf den Stack gelegt;
  287.                           Beendigung des Unterprogramms mit RTS
  288. LEA      <ea>,An          Lade effektive Adresse in Adressregister
  289. LINK     An,#n            Baue Stackbereich auf
  290. LSL      n,<ea>           Logische Verschiebung links
  291. LSR      n,<ea>           Logische Verschiebung rechts
  292. MOVE     Quelle,Ziel      Uebertrage einen Wert von Quelle nach Ziel
  293. MOVE     SR,<ea>          Uebertrage den Statusregister-Inhalt
  294. MOVE     <ea>,SR          Uebertrage den Statusregister-Inhalt
  295. MOVE     <ea>,CCR         Flags laden
  296. MOVE     USP,<ea>         Uebertrage den User-Stackpointer
  297. MOVE     <ea>,USP         Uebertrage den User-Stackpointer
  298. MOVEA    <ea>,An          Uebertrage einen Wert in ein Adressregister
  299. MOVEM    Regs,<ea>        Uebertrage mehrere Register auf einmal
  300. MOVEP    Quelle,Ziel      Uebertrage Daten zur Peripherie
  301. MOVEQ    #n,Dn            Uebertrage schnell eine 8-Bit Konstante in ein
  302.                           Datenregister
  303. MULS     Quelle,Ziel      vorzeichenrichtige Multiplikation zweier Worte zu
  304.                           einem Langwort
  305. MULU     Quelle,Ziel      wie MULS nur ohne Vorzeichen
  306. NBCD     Quelle,Ziel      Negation einer BCD-Zahl (9er Komplement)
  307. NEG      <ea>             Negation eines Operanden (2er Komplement)
  308. NEGX     <ea>             Negation eines Operanden mit Uebertrag
  309. NOP                       Keine Funktion (no Operation)
  310. NOT      <ea>             Inversion eines Operanden
  311. OR       Quelle,Ziel      Logisches ODER
  312. ORI      #n,<ea>          Logisches oder mit einer Konstanten
  313. PEA      <ea>             Lege eine Adresse auf den Stapel
  314. RESET                     Peripherie zuruecksetzen
  315. ROL      n,<ea>           Rotation nach links
  316. ROR      n,<ea>           Rotation nach rechts
  317. ROXL     n,<ea>           Rotation nach links (Uebertrag -> X-Flag)
  318. ROXR     n,<ea>           Rotation nach rechts (Uebertrag -> X-Flag)
  319. RTE                       Rueckkehr aus Exeption
  320. RTR                       Rueckkehr mit laden der Flags
  321. RTS                       Rueckkehr aus Unterprogramm (nach BSR/JSR)
  322. SBCD     Quelle,Ziel      Subtraktion zweiter BCD-Zahlen
  323. S<bed>   <ea>             Setze Byte auf -1, wenn Bedingung erfuellt
  324. STOP                      Verarbeitung anhalten,evtl. TRAP Exception
  325. SUB      Quelle,Ziel      Binaere Subtraktion
  326. SUBA     <ea>,An          Binare Subtraktion von einem Adressregister
  327. SUBI     #n,<ea>          Subtraktion einer Konstanten
  328. SUBQ     #n,<ea>          Schnelle Subtraktion einer 3Bit Konstanten
  329. SUBX     Quelle,Ziel      Subtraktion mit Uebertrag -> X-Flag
  330. SWAP     Dn               Vertauscht beide Registerworte
  331. TAS      <ea>             Pruefe ein Byte und setze Bit 7
  332. TRAP     #n               springe in eine Exception
  333. TRAPV                     Ist Ueberlauf Flag (V-Flag) gesetzt, dann Exception
  334. TST      <ea>             Testen eines Operanden und ggf. Setzen von N/Z-Flag
  335. UNLK     An               Baue Stackbereich ab
  336.  
  337. ------------------------------------------------------------------------------
  338. An       Adressregister (A0-A7)
  339. Dn       Datenregister (D0-D7)
  340. Label    Adresse / Label
  341. Reg      Register (A0-A7 / D0-D7)
  342. Quelle   Quelloperand
  343. Ziel     Zieloperand
  344. #n       Direktwert
  345. <ea>     Adresse oder Register
  346. ------------------------------------------------------------------------------
  347.  
  348. Bedingungen ( <bed> )
  349.  
  350. <bed>    Bedingung         Bedeutung              Bits
  351. T        True              Immer
  352. F        False             Nie
  353. HI       higher            hoeher als             C' ^ Z'
  354. LS       lower or same     kleiner gleich         C v Z
  355. HS       higher or same    groesser gleich        C'
  356. CC       Carry clear       Carry-Flag geloescht   C'
  357. NE       not equal         ungleich               Z'
  358. EQ       equal             gleich                 Z
  359. VC       Overflow clear    kein Ueberlauf         V'
  360. VS       Overflow set      Ueberlauf              V
  361. PL       plus              positiv                N'
  362. MI       minus             negativ                N
  363. GE       greater or equal  groesser gleich        N ^ V v N' ^ V'
  364. LT       less than         weniger als            N ^ V' v N' ^ V'
  365. GT       greater than      groesser als           N^V^Z' v N'^V'^Z'
  366. LE       less or equal     weniger oder gleich    Z v N^V' v N'^V
  367.  
  368. ^= AND / v=OR / '= NOT
  369. ------------------------------------------------------------------------------
  370.  
  371. Die ist auch viel besser zum an die Wand haengen...
  372.  
  373. Und hier noch die Adressierungsarten..
  374.  
  375.  
  376.  Adressierungsarten:
  377.  
  378.  Datenregister direkt        Dn
  379.  Adressregister direkt       An
  380.    " indirekt                (An)
  381.    " ind. mit Postinkrement  (An)+
  382.    " ind. mit Predekrement   -(An)
  383.    " ind. mit 16 Bit Offset  O16(An)
  384.    " ind. mit 8 Bit Offset   O8(An,Rn)
  385.  Absolut kurz                xxxx.W
  386.  ABsolut lang                xxxxxxxx.L
  387.  Unmittelbar                 #`Daten`
  388.  Programmzaehler ind. mit     O16(PC)
  389.            16 Bit Offset
  390.  " ind. mit 8 Bit Offset     O8(PC,Rn)
  391.  
  392. Legende:
  393.  
  394.  An        Adressregister (A0-A7)
  395.  Dn        Datenregister (D0-D7)
  396.  O16       16 Bit Wert
  397.  O8        8 Bit Wert
  398.  Rn        Register (A0-A7 / D0-D7)
  399.  `Daten`   bel. Wert (bis 16 Bit)
  400.  
  401. Anhand der Legende kann man sich die noetigen Parameter zusammendenken.
  402.  
  403. Naja, da habe ich diesen teil leider wieder voll gestopft. Das reicht fuer
  404. Heute erstmal..
  405. Ich fang jetzt mit dem Intro an was wir dann zusammen machen wollen. Ein
  406. paar Routinen werde ich wohl aus dem Kurs nehmen. Aber nicht alle..sie sind
  407. zum teil sehr schlecht geeignet fuer den Einsatz in einem Intro.
  408. Wie ihr merkt halte ich aber mein Versprechen vom 1.Teil das ich am Ende so
  409. ein Paar Listen rueberruecke.
  410.  
  411. Viel Spass damit...Ich werde nu Duschen gehen, und mir das Intro ausdenken.
  412. Unter der Dusche habe ich naemlich immer die Besten Ideen
  413.  
  414. Hasta Luego
  415.  
  416.                 Jeff Kandle
  417.