home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #7 / amigamamagazinepolishissue1998.iso / magazyn_amiga / 1196 / 039_asembler < prev    next >
Text File  |  1998-03-26  |  6KB  |  335 lines

  1. -------------Proszë zîoûyê dwuszpaltowo----------------------
  2.  
  3.  
  4.  
  5.  
  6. GRAFIKA NA EKRANIE
  7.  
  8. <a>Bartek Pampuch
  9.  
  10. <txt>Zanim przejdziemy do naszej lekcji, kilka wyjaônieï:
  11.  
  12. *1* program z odcinka "Intuition cz. 1. Ekrany" nie zamykaî
  13. otwartego przez siebie ekranu. Aby to robiî, naleûy dopisaê:
  14.  
  15. <l>
  16.     move.l OSA,a0
  17.  
  18.     jsr _LVOCloseScreen(a6)
  19.  
  20. <txt>przed:
  21.  
  22. <l>
  23.     jsr _LVOWBenchToBack(a6)
  24.  
  25. NieMaEkranu:
  26.  
  27. <txt>
  28. *2* Zapis:
  29.  
  30. <l>
  31. MojImage:   dc.w  0,0,640,256,3,0,0,2,0
  32.  
  33. <txt>jest bîëdny, poniewaû nie wszystkie pola struktury typu
  34. Image sâ sîowami. Poprawny zapis wyglâda:
  35.  
  36. <l>
  37. MojImage:  dc.w 0,0,640,256,3
  38.  
  39.            dc.l 0
  40.  
  41.            dc.b 0,2
  42.  
  43.            dc.l 0
  44.  
  45. <txt>
  46. *3* UWAGA! BARDZO WAÛNE! Przypadkiem wkradî sië bîâd dotyczâcy
  47. pobierania RastPortu ekranu. W zwracanej (przez _LVOOpenScreen)
  48. strukturze typu Screen znajduje sië kopia RastPortu. Zatem pod
  49. adresem OSA+$54 nie ma adresu RastPortu, ale sam RastPort.
  50.  
  51. Dlatego zamiast:
  52.  
  53. <l>
  54.     move.l OSA,a0
  55.  
  56.     move.l $54(a0),RastPort
  57.  
  58. <txt>naleûy wpisywaê:
  59.  
  60. <l>
  61.     move.l OSA,a0
  62.  
  63.     add.l #$54,a0
  64.  
  65.     move.l a0,RastPort
  66.  
  67. <txt>Jeôli natomiast chodzi o RastPort okienka, poprawny jest
  68. sposób podany na poprzedniej lekcji.
  69.  
  70. Skoro juû poprawione zostaîy bîëdy z poprzedniej lekcji, moûemy
  71. powróciê do dzisiejszego tematu.
  72.  
  73. Na poczâtku -- kod úródîowy z wykorzystaniem DrawImage:
  74.  
  75. <l>
  76.     INCDIR DF0:
  77.  
  78.     INCLUDE moj_dos.i
  79.  
  80.     INCLUDE moj_intui_1.i
  81.  
  82. _LVOOpenLibrary = -552
  83.  
  84. _LVOCloseLibrary = -414
  85.  
  86.     ; kod otwierajâcy bibliotekë DOS
  87.  
  88.     ; i zapisujâcy jej adres pod DosBase
  89.  
  90.     ; otworzenie biblioteki INTUITION
  91.  
  92.     ; i zapisanie jej adresu pod IntBase
  93.  
  94.     ...
  95.  
  96.     move.l IntBase,a6
  97.  
  98.     lea MyScreen,a0
  99.  
  100.     jsr _LVOOpenScreen(a6)
  101.  
  102.     tst.l d0
  103.  
  104.     beq.w NoScreen
  105.  
  106.     move.l d0,OSA
  107.  
  108.     jsr ClearScreen ; wywoîanie naszej procedury
  109.  
  110.     move.l DosBase,a6 ; odczekanie
  111.  
  112.     moveq #50,d1 ; jednej
  113.  
  114.     jsr _LVODelay(a6) ; sekundy
  115.  
  116.     move.l IntBase,a6
  117.  
  118.     move.l OSA,a0 ; zamkniëcie
  119.  
  120.     jsr _LVOCloseScreen ; ekranu
  121.  
  122. NoScreen:
  123.  
  124.     ; kod zamykajâcy bibliotekë intuition
  125.  
  126.     ...
  127.  
  128.     rts
  129.  
  130. ClearScreen:       ; nasza procedura
  131.  
  132.     move.l OSA,a0
  133.  
  134.     add.l #$54,a0   ; w A0 - RastPort ekranu
  135.  
  136.     moveq #0,d0
  137.  
  138.     moveq #0,d1
  139.  
  140.     lea MyImage,a1
  141.  
  142.     jsr _LVODrawImage(a6)
  143.  
  144.     rts
  145.  
  146. Image:
  147.  
  148.     dc.w    0,0,640,256,3
  149.  
  150.     dc.l    0
  151.  
  152.     dc.b    0,1
  153.  
  154.     dc.l    0
  155.  
  156. DosName: dc.b    'dos.library',0
  157.  
  158. DosBase: ds.l    1
  159.  
  160. IntName: dc.b    'intuition.library',0
  161.  
  162. IntBase: ds.l    1
  163.  
  164. OSA:    ds.l    1
  165.  
  166. MyScreen:
  167.  
  168.     dc.w    0,0,640,256,4
  169.  
  170.     dc.b    0,2
  171.  
  172.     dc.w    HIRES     ; HIRES=$8000
  173.  
  174.     dc.w    CUSTOMSCREEN    ; CUSTOMSCREEN = $F
  175.  
  176.     dc.l    0
  177.  
  178.     dc.l    0
  179.  
  180.     dc.l    0
  181.  
  182.     dc.l    0
  183.  
  184. <txt>W naszym programie uûyliômy nowego rozkazu: "moveq". Rozkaz
  185. ten dziaîa podobnie do rozkazu "move.b #dana,REJESTR", tylko
  186. wykonywany jest duûo szybciej (juû jego nazwa to sugeruje:
  187. movequick).
  188.  
  189. MOVEQ ma jednak pewne ograniczenie. Przesyîaê tylko jeden bajt,
  190. dlatego #danâ moûe byê liczba z przedziaîu od -128 do 127.
  191.  
  192. MOVEQ zmienia jednak zawartoôê caîego rejestru (najmîodszy bajt
  193. jest ustawiany na wartoôê #danej, a pozostaîe sâ zerowane).
  194.  
  195. Jeûeli D0=$12345678, to po wykonaniu rozkazu:
  196.  
  197. <l>
  198.     moveq #$11,d0
  199.  
  200. <txt>
  201. D0=$00000011.
  202.  
  203. Nasz program otwiera najpierw szesnastokolorowy ekran (2^4),
  204. nastëpnie czyôci go pierwszym (a liczâc zerowy -- drugim) kolorem
  205. palety, odczekuje jednâ sekundë i zamyka otwarty ekran.
  206.  
  207. Skoro znacie juû zasadë dziaîania rozkazu _LVODrawImage, moûemy
  208. napisaê coô ciekawszego.
  209.  
  210. Oprócz procedury czyszczâcej ekran napiszemy procedurë wrysowujâcâ
  211. jakiô drobny rysunek.
  212.  
  213. Na koïcu naszego kodu dopiszcie:
  214.  
  215. <l>
  216. ; procedurë wrysowujâcâ obrazek
  217.  
  218. DrawPic:
  219.  
  220.     move.l OSA,a0
  221.  
  222.     add.l #$54,a0
  223.  
  224.     moveq #0,d0
  225.  
  226.     moveq #0,d1
  227.  
  228.     lea Image2,a1
  229.  
  230.     jsr _LVODrawImage(a6)
  231.  
  232.     rts
  233.  
  234. ; strukturë Image
  235.  
  236. Image2:
  237.  
  238.     dc.w 0,0,10,10,1
  239.  
  240.     dc.l Image2Data
  241.  
  242.     dc.b %0100,%0000
  243.  
  244.     dc.l 0
  245.  
  246. ; oraz dane do obrazka
  247.  
  248.     SECTION DANE,DATA_C
  249.  
  250. Image2Data:
  251.  
  252.     dc.w %1111111111000000
  253.  
  254.     dc.w %1000000001000000
  255.  
  256.     dc.w %1011001101000000
  257.  
  258.     dc.w %1011001101000000
  259.     
  260.     dc.w %1000000001000000
  261.  
  262.     dc.w %1011001101000000
  263.  
  264.     dc.w %1011001101000000
  265.  
  266.     dc.w %1001111001000000
  267.  
  268.     dc.w %1000000001000000
  269.  
  270.     dc.w %1111111111000000
  271.  
  272. <txt>A bezpoôrednio za linijkâ:
  273.  
  274. <l>
  275.     jsr ClearScreen
  276.  
  277. <txt>dopisz:
  278.  
  279. <l>
  280.     jsr DrawPic
  281.  
  282. <txt>Teraz nasz program dodatkowo po wyczyszczeniu ekranu w
  283. prawym górnym rogu ekranu narysujë uômiechniëtâ twarz w
  284. kwadraciku.
  285.  
  286. Nie muszë chyba tîumaczyê samej procedury DrawPic, ale niektóre
  287. rzeczy mogâ byê niezrozumiaîe:
  288.  
  289. * Nasz rysunek ma pozycjë 0,0 i wymiary 10 x 10 pikseli
  290.  
  291. * jest to rysunek jednobitplanowy
  292.  
  293. * rysunek wkopiowywany bëdzie w czwarty bitplane ekranu.
  294.  
  295. Ôwiadczy o tym pole PlanePick=%0100, czyli PlanePick=4.
  296. (Przypominam, ûe znaczek procentu przed liczbâ oznacza, ûe jest
  297. ona zapisana w systemie dwójkowym). Pozostaîe bitplane'y sâ
  298. zerowane (oczywiôcie tylko w miejscu naszego rysunku).
  299.  
  300. * Dane naszego rysunku okreôlone sâ etykietâ Image2Data. Ale po
  301. co przed nimi:
  302.  
  303. <l>
  304.     SECTION DANE,DATA_C
  305.  
  306. <txt>A po to, aby dane graficzne znajdowaîy sië w pamiëci typu
  307. Chip (a to wîaônie powoduje powyûsza dyrektywa). Gdybyômy jâ
  308. pominëli, nasz program dziaîaîby bez zarzutu na komputerach
  309. wyposaûonych TYLKO w pamiëê Chip. Natomiast na wszystkich innych
  310. byîoby raz dobrze, a raz úle:
  311.  
  312. -- jeûeli program wczytaîby sië do pamiëci Chip, dziaîaîby poprawnie
  313.  
  314. -- w innym wypadku -- bîëdnie.
  315.  
  316. Bîëdne dziaîanie programu nie oznacza zawieszenia komputera,
  317. tylko zamiast naszego rysunku w docelowym miejscu pojawiîyby sië
  318. punkciki przedstawiajâce jakieô inne miejsce pamiëci (tîum.:
  319. pojawiîyby sië ômieci).
  320.  
  321. Dlatego omówiona dyrektywa jest niezbëdna.
  322.  
  323. * Jak zdâûyliôcie zauwaûyê, dane naszego rysunku skîadajâ sië
  324. ze sîów(WORD), TAK MUSI BYÊ! Dlatego, mimo ûe nasz rysunek ma
  325. szerokoôê 10 pikseli, musimy dopeîniê dane zerami do 16 (16 bitów
  326. to jedno sîowo). Gdyby nasz rysunek miaî szerokoôê 20 pikseli,
  327. to pierwsze dwa sîowa dotyczyîyby jednej linijki. Wyglâdaîoby to
  328. mniej wiëcej tak:
  329.  
  330. <l>
  331.     dc.w %1111111111111111,%1111000000000000
  332.  
  333. <txt>No, fajnie! Nasz program wyôwietla juû prosty rysunek. Moûe
  334. wiëc jakaô animacja? Ale to juû w nastëpnym odcinku.
  335.