256snake by Brainstorm [web]
; hello crazy people!!!!
;
; I decided to release my asm source too
; it went through thousands of changes until
; I managed to get it into this state
;
; I'm quite sure this can be even more optimised
; since I'm not that experienced with writing x86
; code.
;
; compile it with nasm...
;
; originally I had a vga tweak that increases row
; height, that saved me several bytes and hundreds
; of cycles. But dosbox didn't like my tweak and I
; decided that it's better if it's more compatible.
;
; have fun!
;
; muuuuuuuuuuuuuuuuuuuuuusk/brs
;
code equ 100h
data equ code+180h
vseg equ 0a000h+320*20/16
;variables
foodseed equ data + 0h
level equ data + 10h
;constants
delay_count equ 5
pixel_width equ 10
pixel_height equ 10
level_width_ln equ 5
level_height_ln equ 4
level_width equ 32 ;2^level_width_ln
level_height equ 16 ;2^level_height_ln
col_b equ 200;200
col_f equ 35+24;35+24
col_s equ 32+24+8;32+24+8
CRTC_INDEX equ 3d4h
SEQUENCER equ 3c4h
MAX_SCAN_LINE equ 9
food_strength equ 1;
org 100h
start:
;assuming ax == 0
mov ch,10h
mov di,end_of_code
rep stosb
push vseg
pop es
mov al,13h
int 10h
push 010000000010b
;mov si,010000000010b
mov bp,010000100000b
mov dx,8
main:
;ch == 0
mov cl,level_height
;mov cx,level_height
;ch == 0
xor ax,ax
push ax
push ax
pop si
pop di
mov bx,level
lvlly:
push cx
;ch == 0
mov cl,level_width
lvllx:
push cx
xor cx,cx
mov ax,[bx+si] ;load cell
mov cl,al;
and cl,7
cmp cl,3
jna scf1
mov ch,7
sub ch,cl
xchg ch,cl
scf1:
add cl,col_s;32+24+8
;cmp ax,0
dec ax
jns notnull
;xor ax,ax ;opt
mov cl,col_b;;200
jmp null
notnull:
;dec ax
mov [bx+si],ax
null:
;mov ax,bp;
;add ax,level;
;cmp bx,ax
cmp bp,si
jne nevermind
;mov cl,35
mov cl,col_f;35+24;
nevermind:
;inc bx
;inc bx
lodsw ;si+=2
mov al,cl
mov cx,pixel_height
pxheightl: ;draw rectanlge basically
push cx
mov cx,pixel_width
rep stosb
add di,320-pixel_width
pop cx
loop pxheightl ;end draw rectangle
sub di,320*pixel_height -pixel_width ;adjust adress to next rectangle
pop cx
loop lvllx ;process next cx columns
add di,320*pixel_height - level_width*pixel_width ;adjust adress to next line of rectangles
add si,100000b*2 ;adjust data source
pop cx
loop lvlly ;process next cx rows
mov cx,delay_count
dloop:
push dx
mov dx,03DAh
pmw1:
;add word [foodseed],31337 ;random
add word [foodseed],si
in al,dx;
and al,8
jnz pmw1
;call snds_end ;stop the sound
pmw2:
in al,dx
and al,8
jz pmw2
pop dx
; loop delayl
in al,60h
;cmp al,vk_escape
dec al
jz exit
mov bh,al
;mov bx,snakedir;
push cx
mov cx,4
mov si,in_data
in_loop:
lodsb
mov bl,al
lodsw
cmp bl,bh
jne next
mov [snakedir],ax
next:
loop in_loop
pop cx
pmgo:
;call snd_off
loop dloop
pop si ;snake position
;step the snaek
add si,[snakedir]
and si,011110111110b
push si ;save snake pos to stack
;mov [snakepos],ax
;call vaxtoaddr
call snds_fx0 ;play sound
mov bx,level
mov ax,[bx+si]
cmp ax,0
jne exit
;jne exit
;jne exit
;mov ax,[snakesize]
mov [bx+si],dx
cmp si,bp
jne noeat
;add ax,food_strength
;add word [ssize],byte food_strength ;make snake longer
;add word[snakesize],food_strength
inc dx
mov bp,[foodseed]
and bp,011110111110b
;mov word [food pos],ax;
call snds_fx1 ;play sound
noeat:
jmp main
exit:
;call snd_off
;call 0
pop si
call snd_off
ret
; mov ax,[bx+1]
; mov ax,[1]
snds_fx0:
mov ax,si
add ah,al
xor ah,01101001b
jmp snds_end
snds_fx1:
mov ax,bp
mov ah,06h
snds_end:
out 42h,al
xchg al,ah
out 42h,al
snd_on:
mov al,33h
jmp snd_off_2
snd_off:
mov al,30h
snd_off_2:
out 61h,al
ret
vk_left equ 75 ;
vk_right equ 77 ;
vk_up equ 72 ;
vk_down equ 80 ;
vk_escape equ 1
in_data:
db vk_left-1
dw 0111110b
db vk_right-1
dw 010b
db vk_up-1
dw 011110000000b
db vk_down-1
dw 010000000b
snakedir: db 2
end_of_code:
;snakesize: dw 8
;foodpos: dw 0000010000100000b;level+ (level_width*level_height+level_width/2)&0xfffe
;snakepos: dw 0000010000000010b;level + level_width*level_height
;mov byte [snakedir],2
;mov byte [snakesize],8
;mov word [foodpos],level+ 2 + level_width*2;
;mov word [snakepos],level + level_width*level_height
[ back to the prod ]
