Assembly - cursor probléma

Assembly - cursor probléma
2010-09-24T15:32:35+02:00
2010-09-24T19:54:13+02:00
2022-11-19T07:00:40+01:00
Latkóczy Dávid
Sziasztok!
Ismét egy számomra érthetetlen problémába ütköztem:
Ki szeretném rajzolni 320*200-as módban a windows arany színű egérmutatóját, de a kép felénél elakad a dolog. A kód (valószínűleg) nem hibás, mert ha a cursor tetejét nem rajzoltatom ki, tovább jut az alján. Ahány sort lehagyok az elejéről, annyival tovább tart az alja, mielőtt abbahagyja a rajzolást. Ez mit jelenthet? Túl hosszú a progi, elfogy a memória vagy mi?
A kód:

nyil.asm
; GRAFIKUS mov AX,13h int 10h ; 320 * 200 grafikus mód be mov AX,0a000h ; Képernyő beállítása mov ES,AX ; HATTER PUSHA mov DI,0 ; DI kezdeti értéke mov CX,63360 ciklus0: mov byte[ES:2*320+DI],7 ; világoszürke inc DI dec CX jnz ciklus0 POPA mov DI,32171 ; DI kezdeti értéke ; CURSOR ; első sor mov byte[ES:2*320+DI],0 ; rajzolás ; függőleges1 PUSH DI mov CX,13 fuggolegesciklus1: add DI,320 mov byte[ES:2*320+DI],116 dec CX jnz fuggolegesciklus1 POP DI inc DI ; második sor add DI,320 mov byte[ES:2*320+DI],0 ; harmadik sor add DI,320 mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; negyedik sor add DI,319 mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; ötödik sor add DI,318 mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; hatodik sor add DI,317 mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; hetedik sor add DI,316 mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; nyolcadik sor add DI,315 mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; kilencedik sor add DI,314 mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; tizedik sor add DI,313 mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; tizenegyedik sor add DI,312 mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 mov CX,5 ciklus: inc DI mov byte[ES:2*320+DI],0 dec CX jnz ciklus ; tizenkettedik sor add DI,312 mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; tizenharmadik sor add DI,315 mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 inc DI ; luk inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; tizennegyedik sor add DI,314 mov byte[ES:2*320+DI],0 inc DI inc DI inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; tizenötödik sor add DI,312 mov byte[ES:2*320+DI],0 inc DI inc DI inc DI inc DI inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; tizenhatodik sor add DI,317 mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; tizenhetedik sor add DI,318 mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],116 inc DI mov byte[ES:2*320+DI],0 ; tizennyolcadik sor add DI,317 mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],44 inc DI mov byte[ES:2*320+DI],0 ; tizenkilencedik sor add DI,318 mov byte[ES:2*320+DI],0 inc DI mov byte[ES:2*320+DI],0 inc DI mov byte[ES:2*320+DI],0

F BF BBF BBBF BSBBF BSBBBF BSSBBBF BSSBBBBF BSSSBBBBF BSSSBBBBBF BSSBFFFFFF BSBFSBF BBF BSBF BF BSBF F BSBF BSBF BSBF BBBF FFF

Mi erre a megoldás?
Mutasd a teljes hozzászólást!
Nem is kell fájlkezelés.
Ha a pixeleket egy adattömbből olvasod, akkor elég az 512 byte:
org 256 mov ax,13h int 10h mov ax,0a000h mov es,ax mov si,adatok mov di,0 ;kezdocim mov cx,6 ;6 sor ciklus push cx mov cx,6 ;1 sor 6 pixel rep movsb add di,320-60 ;kepernyo szelessege-kurzor szelessege pop cx loop ciklus jmp $ adatok 15,15,15,15,15,15 15,15,0,0,0,0 15,0,15,0,0,0 15,0,0,15,0,0 15,0,0,0,15,0 0,0,0,0,0,15
Így még a te 10*20 pixeles kurzorod is belefér az 512 byte-ba
Mutasd a teljes hozzászólást!

  • Erre az, hogy írsz egy általános kurzorkirajzoló eljárást... ez így rémes...
    Mutasd a teljes hozzászólást!
  • Jó, az egy dolog, hogy a kirajzolást belerakom egy eljárásba/szubrutinba, de másképp nem tudom kirajzolni. Annyit tudok rajta javítani, hogy az ugyanolyan színű pontokat ciklusokkal rajzolom ki, ahol ez lehetséges.
    Vagy van jobb ötleted?
    Maga a hiba mitől van, mért nem rajzolódik tovább?
    Mutasd a teljes hozzászólást!
  • Először is egy adatszerkezetet kellene kitalálni, hogy hogyan akarod tárolni a kurzor képét (haladó esetben egy már létező formátumot megismerni), és annak a kirajzolására írni programot... Ami biztosan nem jó, az az hogy a programkód tartalmazza hardkódolva a képet... (hadd ne magyarázzam el, hogy mért nem jó, egyszerűen hidd el nekem, oké?)
    Mutasd a teljes hozzászólást!
  • Ha ezt a progit a boot-szektorból indítod, nem csoda, hogy csak a felét rajzolja ki.
    Hány bájtos a gépi kódod? 700 fölött van.
    A bootszektor csak 512 bájtos
    Mutasd a teljes hozzászólást!
  • Igen, a boot szektorból indítom. Valószínűleg ez lesz a hiba oka...
    Hát a "gond" az, hogy kezdő vagyok.
    Szóval fájlkezelést még nem tudok írni.
    Kellene még egy kis segítség, vagy valami konkrétabb dolog...

    Ha egy fájlba notepaddal beleírom a kurzor képpontjainak színkódjait az használható, vagy a kódolás miatt más adatok is lesznek benne?

    Ha a cursor színkódjait elmentem egy fájlban amit a floppyra írok, azt hogyan tudom betölteni a memóriába?
    (Gondolom itt megkönnyíti a dolgot, hogy a cursor fájl állandó, fejlesztés során nem lesz nagyobb a fájl mérete, a floppyn mindig ugyanazon a helyen van, ugyanott kezdődik, és végződik.)
    Mutasd a teljes hozzászólást!
  • Nem is kell fájlkezelés.
    Ha a pixeleket egy adattömbből olvasod, akkor elég az 512 byte:
    org 256 mov ax,13h int 10h mov ax,0a000h mov es,ax mov si,adatok mov di,0 ;kezdocim mov cx,6 ;6 sor ciklus push cx mov cx,6 ;1 sor 6 pixel rep movsb add di,320-60 ;kepernyo szelessege-kurzor szelessege pop cx loop ciklus jmp $ adatok 15,15,15,15,15,15 15,15,0,0,0,0 15,0,15,0,0,0 15,0,0,15,0,0 15,0,0,0,15,0 0,0,0,0,0,15
    Így még a te 10*20 pixeles kurzorod is belefér az 512 byte-ba
    Mutasd a teljes hozzászólást!
  • Az a baj fiatalember, hogy fordítva ülsz a lovon.Onnan akarod kezdeni a tanulást, ahová megérkezni szokás, egy-két évnyi tanulás után.
    Az lenne a legegyszerűbb, ha felinstallálnál magadnak egy floppyra egy DOS minimumot, mellé elfér egy dosos Norton Commander, és még marad hely egy Turbo Assemblernek is. Van hozzá egy rakat példaprogram, makróáradat, melyekben megnézheted hogy csinálták ezt egykoron a nagyok.
    Esetleg szerezhetsz egy lerípolt öregy 386-ost, vagy 486-ost, bárki szívesen hozzádvágja igyen is, felinstallálod arra a DOS-t, ha nem lenne rajta, és a programjaid hasítani fognak ezeken is.
    Mutasd a teljes hozzászólást!
  • pardon:
    nem org 256 hanem
    org 7C00h
    Mutasd a teljes hozzászólást!
  • Mondjuk én megértem őt is... (vajon honnan ismerős? )
    Egyébként fizikai gépnél egyszerűbb manapság a virtuális gépek használata e célra, azt még tönkretenni sem tudja néhány rossz portra kiküldött byte-tal.
    Mutasd a teljes hozzászólást!
  • köszi a megértést

    Nekem tetszik ez a tömbös megoldás, de a nasmwnak nem annyira :(
    Utasítást vár a sor elején...
    31: error: parser: instruction expected
    32: error: label or instruction expected at start of line
    33: -""-
    34: -""-
    35: -""-
    36: -""-
    Az org bootolós proginál is kell az elejére?

    ; GRAFIKUS mov AX,13h int 10h ; 320 * 200 grafikus mód be mov AX,0a000h ; Képernyő beállítása mov ES,AX ; HATTER PUSHA mov DI,0 ; DI kezdeti értéke mov CX,63360 ciklus0: mov byte[ES:2*320+DI],7 ; világoszürke inc DI dec CX jnz ciklus0 POPA mov DI,32171 ; DI kezdeti értéke ; CURSOR org 7C00h mov si,adatok mov cx,6 ;6 sor ciklus push cx mov cx,6 ;1 sor 6 pixel rep movsb add di,320-60 ;kepernyo szelessege-kurzor szelessege pop cx loop ciklus jmp $ adatok 15,15,15,15,15,15 15,15,0,0,0,0 15,0,15,0,0,0 15,0,0,15,0,0 15,0,0,0,15,0 0,0,0,0,0,15
    Mutasd a teljes hozzászólást!
  • Javítsd ki:
    adatok db 15,15,15,15,15,15 db 15,15,0,0,0,0 db 15,0,15,0,0,0 db 15,0,0,15,0,0 db 15,0,0,0,15,0 db 0,0,0,0,0,15
    Boot-olós proginál kell az org 7C00h
    Enélkül az "adatok" címke értékét a fordítóprogi rosszul számítja ki. Mert a fordítóprogramnak tudnia kell, hogy melyik offsetcímre töltődik be a program.
    Mutasd a teljes hozzászólást!
  • Köszi, így már működik a dolog, csak a kirajzolással nem stimmel valami, mert kicsit el vannak csúszva a sorok.
    Gondolom csak annyi, hogy a 320-60 helyett 320-6.
    Mindjárt letesztelem.
    Mutasd a teljes hozzászólást!
  • Ahha. Így már mindjárt más!
    Köszönöm szépen! Tiéd a pont.

    Következő lépésként kirajzolom a windows kurzort, és utánaolvasok ennek az adattömbnek, mert ilyennel még nem találkoztam. Bár egyszer már láttam ilyen db-s képet, de az egy külső fájlban volt.
    Egy adattömbbe elmenthetem a kurzor által eltakart hátteret is, hogy mozgatáskor visszaállíthassam nem?
    http://prog.hu/tudastar/123390-1/Kurzor+kep+mozgatasa+hatter+visszar..
    Mutasd a teljes hozzászólást!
  • Hát, igen, egyszerűen elírtam.
    Mutasd a teljes hozzászólást!
  • Perszehogy, meglehet csinálni.
    Mutasd a teljes hozzászólást!
  • Szép windows-os cursor:

    org 7C00h ; GRAFIKUS mov AX,13h int 10h ; 320 * 200 grafikus mód be mov AX,0a000h ; Képernyő beállítása mov ES,AX ; HATTER PUSHA mov DI,0 ; DI kezdeti értéke mov CX,63360 ciklus0: mov byte[ES:2*320+DI],7 ; szürke inc DI dec CX jnz ciklus0 POPA ; CURSOR mov DI,32171 ; DI kezdeti értéke mov si,adatok mov cx,19 ;19 sor ciklus push cx mov cx,10 ;1 sor 10 pixel rep movsb add di,320-10 ;kepernyo szelessege-kurzor szelessege pop cx loop ciklus jmp $ adatok db 0,7,7,7,7,7,7,7,7,7 db 116,0,7,7,7,7,7,7,7,7 db 116,116,0,7,7,7,7,7,7,7 db 116,116,116,0,7,7,7,7,7,7 db 116,44,116,116,0,7,7,7,7,7 db 116,44,116,116,116,0,7,7,7,7 db 116,44,44,116,116,116,0,7,7,7 db 116,44,44,116,116,116,116,0,7,7 db 116,44,44,44,116,116,116,116,0,7 db 116,44,44,44,116,116,116,116,116,0 db 116,44,44,116,0,0,0,0,0,0 db 116,44,116,0,44,116,0,7,7,7 db 116,116,0,7,116,44,116,0,7,7 db 116,0,7,7,116,44,116,0,7,7 db 0,7,7,7,7,116,44,116,0,7 db 7,7,7,7,7,116,44,116,0,7 db 7,7,7,7,7,7,116,44,116,0 db 7,7,7,7,7,7,116,116,116,0 db 7,7,7,7,7,7,7,0,0,0

    Már csak össze kell kombinálnom a mozgatós kódommal.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd