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

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 20.Teil...
  4.  
  5. Naja, das laeuft ja ganz nett vor sich hin...Haben wir fast schon eine
  6. Laufschrift gebaut. Was noch fehlt, ist schnell erzaehlt (Huch das Reimt
  7. sich) naemlich nur noch eine Routine die anstatt immer den Smile in den
  8. Puffer zu setzen, ein Tabelle mit Buchstaben ausliest und immer den
  9. Naechsten Buchstaben aus der Tabelle zieht, und in den Puffer Kopiert.
  10.  
  11. Eine Endmarkierung fuer den Text muessen wir auch noch einbauen, aber das
  12. sollte nicht die Schwierigkeit sein.
  13.  
  14. Eine Sache will ich aber noch erklaeren..Man kann den Blitter auch ueber
  15. den Copper steuern, da der Copper die Register des Blitters auch setzen
  16. kann. Allerdings muessen wir dem Copper das erlauben. Das tun wir indem wir
  17. das Register COPCON $DFF02E auf 1 setzen.
  18. Man ist dann aber bei weitem nicht so Variabel als wenn wir es vom
  19. Prozessor machen lassen. Ohne groesseren Aufwand koennen wir nur immer
  20. wiederkehrende Vorgaenge steuern. So ein Vorgang waere das Scrollen des
  21. Bildschirms, da es ja jeden Bildschirmaufbau geschieht. Wenn wir allerdings
  22. ein bisschen weiterdenken dann ist das nicht das wahre. Denn wenn die
  23. Laufschrift Komplexer wird, ich denke an verschiedene Geschwindigkeiten,
  24. oder einen Stop, dann muessten wir jedesmal die Copperliste wieder
  25. umschreiben. Und dieser Aufwand wuerde dann das Gesparte wieder aufheben.
  26.  
  27. Also wer interresse daran hat, kann es ja mal ausprobieren aber es lohnt
  28. sich erst ab Komplexeren Aufgaben. Man kann sich zum Beispiel vorstellen
  29. das sich Copper und Blitter gegenseitg steuern. Das koennte Praktisch so
  30. aussehen das in der Copperliste die ganzen Blitteraufrufe eingegeben sind,
  31. und allerhand auf dem Bildschirm passiert. Der letzte Blitteraufruf der
  32. Copperliste muesste dann sein das der Blitter einfach eine neue Copperliste
  33. ueber die Alte schreibt...u.s.w...
  34.  
  35. Viel ist denkbar..aber zurueck zu unseren Problemen..
  36.  
  37. Jetzt kommt eine Sache die Klappen muss, da ihr sonst mit euren
  38. Laufschriften nicht viel Spass haben werdet..
  39.  
  40. Jedem muesste klar sein das wir jetzt kurz vor der Laufschrift stehen, und
  41. desweiteren muesste auch klar sein das wir mindestens 26 Buchstaben
  42. brauchen um damit etwas zu schreiben. Wenn wir die aber wie beim ersten
  43. Blitterlisting im Source unterbringen, Gute Nacht !
  44.  
  45. Das muss auch anders gehen, aber wie ?
  46. Ganz einfach, wir malen mit Dpaint den Kompletten Zeichensatz auf ein NTSC
  47. Bild, und holen uns die Daten dann da raus. Mit den Modulowerten koennen
  48. wir uns ja Rechteckige bereiche rausschneiden. Und in einer Tabelle
  49. verewigen wir die Adressen der Buchstaben, die wir dann bei bedarf als
  50. Quelle angeben und in den puffer setzen lassen.
  51.  
  52. Ihr muesst nur halt ein 2 Farben NTSC Bild anschalten (Bei Dpaint) und dort
  53. macht ihr 26 rechtecke mit den maáen 16*16. Die setzt ihr dann bis zum rand
  54. nebeneinander, und dann fangt ihr eine Zeile tiefer an. Wichtig ist nur das
  55. ihr euch an die Maáe haltet, denn sonst koennte es ein wenig Bloed
  56. aussehen.
  57. Diese Plane koennen wir dann nach der Umwandlung (Konvertierung) einfach
  58. mit >Extern nach z.B $50000 laden, und uns die Buchstaben dort rausholen.
  59.  
  60. Das Festlegen der Adressen ist auch sehr einfach. Der Erste liegt
  61. natuerlich bei $50000, der zweite dann bei $50002. Etwas schwierig wird es
  62. dann wenn wir in die naechste zeile gehen. Dort muesste der Buchstaben dann
  63. bei $50000 + 16*40 liegen, das ist $50280, und dann geht es wie gehabt
  64. weiter.
  65.  
  66. Jetzt kommt noch wie wir erfahren an welcher stelle der Tabelle wir den
  67. Wert fuer den Buchstaben den wir darstellen wollen den nun finden ?
  68.  
  69. Auch das ist kein Problem, wir nehmen einfach den ASCII wert des
  70. Buchstabens als Zeiger.
  71.  
  72. Im Klartext. Gehen wir davon aus das die Laufschrift nur die 26 Buchstaben
  73. des Alphabets kennt. Davon hat das `A` den niedrigsten naemlich $41. Also
  74. muessten wir alle ankommenden ASCII-werte -$41 nehmen, dann haetten wir den
  75. Zeiger auf das Element der Tabelle das auf das Aussehen des Buchstabens
  76. zeigt. Mit der Methode koennten wir einfach alle Adressen der Definitionen
  77. in eine Tabelle setzen und das gewuenschte rausziehen, das ist doch schoen.
  78.  
  79. Bei unserer Laufschrift machen wir es dann auch so. Nur das ihr vor dem
  80. Ersten Buchstaben noch ein ganz leeres Feld setzen muesst, da wir zumindest
  81. ein `Space` brauchen.
  82.  
  83. Nachdem ihr jetzt wisst ist eurer Kreativitaet nichts mehr im Weg. Also
  84. malt was das Zeug haelt.
  85.  
  86. Jetzt mal etwas zusammenfassend zum Kurs bis jetzt.
  87.  
  88. So ein Kurs ist anfuersich ja eine Tolle sache. Wenn er gut geschrieben ist
  89. dann lernt man in kurzer Zeit sehr viel. Man beherscht dann eine Menge
  90. Sachen. Das einzige was man aber nicht hat, das ist erfahrung mit fehlern.
  91. So komisch sich das anhoert sind fehler eine Ganz wichtige sache. Denn man
  92. merkt sich Fehler relativ gut. Und wenn ich zum beispiel Heute eine
  93. komplette Laufschrift programmiere, und dort gibt es etwas was nicht tut
  94. wie es tun sollte, dann kann ich mich in 90% der Faelle an ein Aehnliches
  95. Ereigniss erinnern, und anhand dieser Erfahrung faellt es mir leichter den
  96. Fehler zu lokalisieren. Also das beste was man einem der mit Asembler
  97. anfaengt, wuenschen kann ist : Allzeit viele Fehler...
  98. Naja das ist Vielleicht ein bisschen uebertrieben, aber man kann es so sehen.
  99. Der Zweite nachteil ist, das man nicht denken lernt. Denn ich nehme euch ja
  100. alle denkarbeit ab. Es waere besser fuer euch wenn ich sagen wuerde, `Dann
  101. versucht mal eine Routine zu schreiben die das und das kann`. Aber wofuer
  102. mache ich dann einen Kurs, dann haette ich auch im Ersten teil schreiben
  103. koennen, `So Leute, dies ist ein introKurs ---- Schreibt ein intro`.
  104.  
  105. Wiegesagt das nachdenken ueber die Sachen die man machen will, und wie man
  106. das Programmtechnisch realisieren koennte, ist es was ihr noch ueben
  107. muesst. Die Grundlagen fuer einen Intro Programmierer habt ihr schon, was
  108. ihr letztendlich daraus macht ist euch ueberlassen.
  109.  
  110. Diese Worte gehoeren eigentlich an den Schluss des Kurses, aber ich denke
  111. das musste mal gesagt werden....!!!!
  112.  
  113. So, zurueck zur Laufschrift...Hmmm, was gibt es denn da noch zu sagen.
  114. Nichts glaube ich..Vielleicht faellt mir beim malen oder beim programmieren
  115. der Laufschrift noch was ein...
  116.  
  117. Execbase=       4
  118. Openlibrary=    -408
  119. Vhposr=         $dff006
  120. Forbid=         -30-102
  121. Permit=         -30-108
  122. Bltafwm=        $dff044
  123. Bltalwm=        $dff046
  124. Bltcon0=        $dff040
  125. Bltcon1=        $dff042
  126. Bltamod=        $dff064
  127. Bltdmod=        $dff066
  128. Bltapt=         $dff050
  129. Bltdpt=         $dff054
  130. Dmacon=         $dff096
  131. Intena=         $dff09a
  132. Dmaconr=        $dff002
  133. Bltsize=        $dff058
  134.  
  135.  
  136.         Move.w  #$0020,dmacon
  137.         Move.w  #$4000,intena
  138.         Move.l  execbase,a6
  139.         Jsr     forbid(a6)
  140.  
  141.         Move.l  #$40000,a0
  142.         Move.l  #$2800/4,d0
  143. clearloop:
  144.         Move.l  #0,(a0)+
  145.         Dbf     d0,clearloop
  146.  
  147.         Bsr.l   Makecl
  148.  
  149. Wait:
  150.         Cmpi.b  #$80,vhposr
  151.         Bne.s   Wait
  152.         Bsr.l   Scroll
  153.         Sub.w   #1,Lettercount
  154.         Bne.s   Weiter
  155.         Bsr.l   New_Char
  156. Weiter: Btst    #6,$bfe001
  157.         Bne     Wait
  158.  
  159.         Move.l  Execbase,a6
  160.         Jsr     Permit(a6)
  161.         Lea     Gfxname(pc),a1
  162.         Jsr     Openlibrary(a6)
  163.         Move.l  d0,a6
  164.         Move.w  #$83e0,dmacon
  165.         Move.w  #$c000,intena
  166.         Move.l  38(a6),$dff080
  167.         Moveq   #0,d0
  168.         Rts
  169. Makecl:
  170.         Lea     $03f000,a0
  171.         Move.l  a0,$dff080
  172.  
  173.         Move.l  #$00e00004,(a0)+
  174.         Move.l  #$00e20000,(a0)+
  175.         Move.l  #$008e3081,(a0)+
  176.         Move.l  #$009030c1,(a0)+
  177.         Move.l  #$00920038,(a0)+
  178.         Move.l  #$009400d0,(a0)+
  179.         Move.l  #$01001200,(a0)+
  180.         Move.l  #$01080002,(a0)+
  181.         Move.l  #$01800000,(a0)+
  182.         Move.l  #$018200ff,(a0)+
  183.         Move.l  #$fffffffe,(a0)+
  184.         Rts
  185.  
  186. Waitblit:
  187.         Btst    #6,dmaconr
  188.         Bne.s   Waitblit
  189.         Rts
  190.  
  191. Set_lettEr:
  192.         Bsr.s   Waitblit
  193.         Move.w  #$ffff,bltafwm
  194.         Move.w  #$ffff,bltalwm
  195.         Move.w  #%0000100111110000,bltcon0
  196.         Move.w  #38,bltamod
  197.         Move.w  #40,bltdmod
  198.         Move.l  d0,bltapt
  199.         Move.l  #$40028,bltdpt
  200.         Move.w  #16*64+1,bltsize
  201.         Move.w  #$10,lettercount
  202.         Rts
  203. Scroll:
  204.         Bsr.s   Waitblit
  205.         Move.w  #$ffff,bltafwm
  206.         Move.w  #$ffff,bltalwm
  207.         Move.w  #%1111100111110000,bltcon0
  208.         Move.w  #0,bltamod
  209.         Move.w  #0,bltdmod
  210.         Move.l  #$40000,bltapt
  211.         Move.l  #$3fffe,bltdpt
  212.         Move.w  #16*64+21,bltsize
  213.         Rts
  214.  
  215. New_char:
  216.         Clr.l   d0
  217.         Move.l  Textcounter,a0
  218.         Move.b  (a0)+,d0
  219.         Move.l  a0,Textcounter
  220.         Lea     Letterpostable,a0
  221.         Sub.w   #$20,d0
  222.         Muls    #4,d0
  223.         Add.l   d0,a0
  224.         Move.l  (a0),d0
  225.         Bsr.l   Set_Letter
  226.         Move.l  Textcounter,a0
  227.         Cmpi.b  #$-1,(a0)
  228.         Beq.s   Meu
  229.         Rts
  230. Neu:
  231.         Move.l  #Text,Textcounter
  232.         Rts
  233.  
  234. Lettercount: dc.w 1
  235. Textcounter: dc.l text
  236.  
  237. text: dc.b "JEFF KANDLE IS SPEAKING      ",$ff
  238.  
  239. Letterpostable:
  240. dc.l $50000                             ; Space
  241. blk.l $20,0                             ; Platzhalter fuer die Differenz
  242.                                         ; Zwischen Ascii Space und A
  243.  
  244.  
  245. dc.l $50002,$50004,$50006,$50008,$5000a,$5000c,$5000e,$50010,$50012
  246. dc.l $50014,$50016,$50018,$5001a,$5001c,$5001e,$50020,$50022,$50024
  247. dc.l $50026,$50280,$50282,$50284,$50286,$50288,$5028a,$5028c
  248.  
  249. Gfxname:        dc.b "graphics.library",0
  250.  
  251. >Extern "Name des Fonts",$50000
  252.  
  253. Wenn ihr den Zeichensatz woanders hinlegen wollt muesst ihr natuerlich auch
  254. die `Letterpostable` aendern.
  255.  
  256. Wollen wir uns mal die Routine New_Char mal genauer Schritt fuer Schritt
  257. reinziehen.
  258.  
  259. New_char:
  260.  
  261.         Clr.l   d0
  262.  
  263. D0, wird komplett geloescht, weil wir, wenn wir weiter an der laufschrift
  264. arbeiten, D0 bestimmt noch oefter brauchen werden, ind deshalb noch reste
  265. drinstehen koennten.
  266.  
  267.         Move.l  Textcounter,a0
  268.  
  269. Der Zeiger auf das Aktuelle Element im text wir nach A0 geholt.
  270.  
  271.         Move.b  (a0)+,d0
  272.  
  273. Das Aktuelle Zeichen wird nach D0 geMoved. Gleichzeitg wird durch die
  274. Postinkrementale Adressierung der Zeiger auf das naechste Element gesetzt.
  275.  
  276.         Move.l  a0,Textcounter
  277.  
  278. Der erhoehte Zeiger wird wieder zurueckgeschrieben..
  279.  
  280.         Lea     Letterpostable,a0
  281.  
  282. Zeiger auf die Letterpostable wird nach A0 geholt.
  283.  
  284.         Sub.w   #$20,d0
  285.  
  286. Von dem ASCII wert des Zeichens in D0 wird das kleinste moegliche zeichen
  287. abgezogen, damit wir in der tabelle beim Kleinsten Zeichen anfangen
  288. koennen.
  289.  
  290.         Muls    #4,d0
  291.  
  292. Da die Adressen der tabelle Langworte sind, wird der wert Mal 4 genommen.
  293.  
  294.         Add.l   d0,a0
  295.  
  296. Jetzt wird die Adresse des zeichens in der tabelle, zu der Grundadresse der
  297. tabelle dazuaddiert. in a0 steht jetzt der Zeiger auf den Zeiger der fuer
  298. den Buchstaben noetig ist.
  299.  
  300.         Move.l  (a0),d0
  301.  
  302. Jetzt wird die Adresse nach d0 geholt,
  303.  
  304.         Bsr.l   Set_Letter
  305.  
  306. und die Buchstabensetzroutine aufgerufen
  307.  
  308.         Move.l  Textcounter,a0
  309.  
  310. Erneut wird der Zeiger auf das Element im Text geholt..
  311.  
  312.         Cmpi.b  #$-1,(a0)
  313.  
  314. Und auf die Endmarkierung ueberprueft.
  315.  
  316.         Beq.s   Neu
  317.  
  318. Falls sie es ist, neuinitialisierung des Textcounters
  319.  
  320.         Rts
  321.  
  322. Falls nicht -> Rueckkehr in die Endlos schleife
  323.  
  324. Neu:
  325.         Move.l  #Text,Textcounter
  326.  
  327. In den Textcounter wird die Adresse des Textes geschrieben, beim Naechsten
  328. durchlauf faengt der text dann von Vorne an.
  329.  
  330.         Rts
  331.  
  332. Und zurueck !
  333.  
  334.  
  335. So, das war doch nicht so schwer oder. Es gibt natuerlich auch andere
  336. methoden eine Laufschrift zu machen, ich spach es schon an, aber wir haben
  337. den Blitter und benutzen ihn auch..
  338.  
  339. Seht euch die Erklaerung zur New_Char Routine gut an. Ihr koennt lernen wie
  340. man eine Bestimmte sache programmmaessig auf die Beine stellt.
  341. Man muss bei solchen Sachen das gehirn ein bisschen unterfordern, und
  342. Schritt fuer Schritt denken, Halt wie ein Prozessor "Denkt", dann ist es
  343. relativ einfach sowas zu basteln.
  344.  
  345. Wie waere es denn wenn ihr mal die Effekte die ihr jetzt koennt mit der
  346. Laufschrift kombiniert. Zum Beispiel den Wasser Effekt..Das saehe doch
  347. bestimmt stark aus.
  348.  
  349. Achja, wer das mit dem Malen des Zeichensatzes nicht hinkriegt der
  350. schreibe mir einen kurzen Brief, und ich werde ihm meinen zukommen lassen.
  351.  
  352. Ari Viderci
  353.  
  354.                 Jeff Kandle
  355.