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ė.
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
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ą