Tämä assembly-ohjelma näyttää halutun 256-värisen BMP-kuvan, jonka koko on 320x200 pikseliä. Mikä tahansa BMP-kuva ei siis käy, mutta esim. pelin alkukuvan näyttämiseen ohjelma on ideaalinen.
Koodia ei ole kovin paljon kommentoitu, lähinnä koodin osien alussa on pieni kuvaus. Koodin pitäisi kuitenkin olla melko yksinkertaista suurimmalta osin. Kuvalle varataan tosi iso taulukko (64000 tavua), joka kannattaisi varmaan korvata jollain osoitin-systeemillä, mutta sen tekeminen ei tällä hetkellä kuulu taitoihini.
No, joka tapauksessa suurin tekemäni assembly-ohjelma, ja toimii. Käännetty TASMilla, kääntyy varmasti pienien muutoksien jälkeen MASMillakin. Ja kuinka ollakaan, optimointivaraa on todennäköisesti tälläkin kertaa runsaasti.
DOSSEG .MODEL SMALL .STACK 100h .DATA ;BMP-kuvan näyttäjä ; ;Tämä ohjelma näyttää 320x200 kokoisen 256-värisen BMP-kuvan näytöllä ;ja odottaa näppäimen painallusta ; ;(c) Antti Laaksonen, www.ohjelmointiputka.net Tied db "c:\antti\320200.bmp$" ;tähän näytettävän kuvan nimi hakemistopolkuineen Bmp db "Tiedosto ei ole BMP-muotoinen!$" Kasi db "Kuvan tulee olla 256-värinen!$" Koko db "Kuvan koon tulee olla 320x200 pikseliä!$" Sign db 2 dup (0) Leveys db 4 dup (0) Korkeus db 4 dup (0) Bitit db 2 dup (0) Lyhyt db 2 dup (0) Pitka db 4 dup (0) Paletti db 4 dup(0) Pikseli db 64000 dup(0) Pkohta dw 320 Pkerta dw 0 .CODE ;avataan tiedosto mov ax,@data mov ds,ax mov dx,offset Tied mov ah,3dh mov al,0 int 21h ;luetaan signeeraus mov bx,ax mov ah,3fh mov cx,2 mov dx,offset Sign int 21h ;luetaan neljä muuttujaa, joille ei ole käyttöä :) call OtaPitka call OtaPitka call OtaPitka call OtaPitka ;luetaan kuvan leveys muuttujaan Leveys mov ah,3fh mov cx,4 mov dx,offset Leveys int 21h ;luetaan kuvan korkeus muuttujaan Korkeus mov ah,3fh mov cx,4 mov dx,offset Korkeus int 21h ;luetaan välistä yksi tarpeeton muuttuja call OtaLyhyt ;luetaan kuvan bittimäärä muuttujaan Bitit mov ah,3fh mov cx,2 mov dx,offset Bitit int 21h ;vielä kuusi "turhaa" muuttujaa call OtaPitka call OtaPitka call OtaPitka call OtaPitka call OtaPitka call OtaPitka ;tarkastetaan signeeraus cmp [Sign],'B' jne EiBmp cmp [Sign+1],'M' jne EiBmp ;tarkastetaan, että kuva on 8-bittinen eli 256-värinen cmp [Bitit],8 jne EiKasi ;tarkastetaan, että kuvan leveys ja korkeus on kohdallaan cmp [Leveys],64 jne EiKoko cmp [Leveys+1],1 jne EiKoko cmp [Korkeus],200 jne EiKoko jmp kaikkihyvin ;virheilmoitukset EiBmp: mov dx,offset Bmp mov ah,9 int 21h mov ah,4ch int 21h EiKasi: mov dx,offset Kasi mov ah,9 int 21h mov ah,4ch int 21h EiKoko: mov dx,offset Koko mov ah,9 int 21h mov ah,4ch int 21h kaikkihyvin: ;siirrytään 320x200-grafiikkatilaan mov ah,0 mov al,19 int 10h ;luetaan ja määritetään paletti mov cl,0 palalku: push cx mov ah,3fh mov cx,4 mov dx,offset Paletti int 21h pop cx mov dx,3c8h mov al,cl out dx,al inc dx mov al,[Paletti+2] shr al,1 shr al,1 out dx,al mov al,[Paletti+1] shr al,1 shr al,1 out dx,al mov al,[Paletti] shr al,1 shr al,1 out dx,al cmp cl,255 je paltehty inc cl jmp palalku paltehty: ;luetaan pikselit taulukkoon mov ah,3fh mov cx,63998 mov dx,offset Pikseli int 21h ;luetaan ja piirretään pikselit mov bx,63998 pialku: mov ax,@data mov ds,ax dec [Pkohta] cmp [Pkohta],0 je uusik jmp eiuk uusik: add [Pkerta],320 mov [Pkohta],320 eiuk: push bx mov bx,Pkerta add bx,Pkohta mov cl,[Pikseli+bx] pop bx mov ax,0a000h mov ds,ax mov [bx],cl dec bx cmp bx,-1 jne pialku ;odotetaan näppäimenpainallusta mov ah,1 int 21h ;palataan takaisin tekstitilaan mov ah,0 mov al,3 int 10h ;suljetaan tiedosto mov ah,3eh int 21h ;poistutaan ohjelmasta mov ah,4ch int 21h OtaLyhyt proc mov ah,3fh mov cx,2 mov dx,offset Lyhyt int 21h ret OtaLyhyt endp OtaPitka proc mov ah,3fh mov cx,4 mov dx,offset Pitka int 21h ret OtaPitka endp END
Ihan asiallinen. Ei mitään turhaa söhryä ja tuossa äkkiä silmäillessä vaikutti, että toimii.
Aihe on jo aika vanha, joten et voi enää vastata siihen.