2014-07-16

Pats mažiausias žaidimas pasaulyje (58 baitai)

Pristatysime turbūt vieną iš mažiausiai užimančių (galbūt net ir mažiausiai) žaidimų. Jo dydis tik 58 baitai. Na pagal tokį dydį tikėtis grafikos nereikia, bet vis tiek manau daug kam įdomu kas gi tai per žaidimas. Pradžioje apie siužetą ir valdymą. Na o vėliau pateiksime ir assembler'io programos kodą.

Siužetas ir valdymas

Jūs važinėjate po trasą su sunkvežimiu ir dvejomis priekabomis. Kairėje pusėje skiriamoji linija, o dešinėje žolė. Kelyje sutinkami žmonės ir medžiai (gali būti). Jūsų užduotis: nepartrenkti žmonių ir nesitrenkti į medžius. Na žaidimas skamba labai paprastai ir tikėtis iš tokio dydžio gilios siužeto linijos nelabai ir galima.
Valdymas: mygtukai į kairę ir į dešinę - pasukti; Esc - pauzė.



Programos kodas

cseg segment para 'code'   
     assume cs: cseg,ds: cseg
     org 100H   
begin:
     db 68H, 00H, 0b8H    ; push 0b800H
     db 1FH         ; pop ds
     int 10H
     mov bh, 7H    
main_loop:
     xchg   cx,ax
     int 1AH        
     mov [bx], dl
delay:
     int 1AH
     cmp [bx], dl
     je delay
    
     xchg ax, si      
     add al, dl       
     xchg ax, si     

     xchg ax, cx      

     in al, 60H
     cmp al, 77
     jnz keytest1
     inc bx
     inc bx
keytest1:
     ja keytest2
     dec bx
     dec bx
keytest2:

     mov ah,0CH
     int 21H  

     mov ax, 0701H   
     mov dx, 1827H
     int 10H
    
     mov [si], ax          
     db 89H, 55H, 51H        ; mov [di+51], dx  
     cmp [bx], dh        
     ja main_loop
     ret
cseg ends
     end begin

Kodo archyvas (kompiliavimui naudotas Tasm)


Keletas komentarų

DosBox'e žaidimas veikia be jokių problemų.
Kode dvi instrukcijos (push 0b800H и mov [di+51], dx) yra parašytos mašininiam kode (db 68H, 00H, 0b8H и db 89H, 55H, 51H), tai yra dėl to, kad Tasm jų nesuprato kompiliavimo metu pagal nutylėjimą.


Ar galima žaidimą padaryti dar mažesnį?

Greičiausiai - taip. Daug vietos užima ekranas (8 baitai) ir vėlinimas (10 baitų). Jeigu pakeisti valdymą (tarkime iš viršaus į apačią valdymas), slinktis gali būti pakeista pakeitus simbolius šia eilute (mov al, 0Ch; int 29h). Vėlinimą galima pakeisti būsenos tikrinimu dvigubu žodžiu pagal adresą 0040:006Сh. Tam turėtų būti skaitiklis, kuris skaičiuoja nuo vidurnakčio (Timer ticks since midnight).

Pasiremta: habrahabr.ru

Komentarų nėra:

Rašyti komentarą