SNAKE.COM v1.00 by Rick Companje 17/12/1996
Copyright (C) 1996 TMR Software Productions
The last update was on 06/01/97 at 22:37:07
code Segment para public 'code' assume cs:code,ds:code,es:code locals ; remove if you want to assemble jumps ; with Masm .386 org 100h YES equ 1 NO equ 0 UPDATEINFO equ NO GRAFISCH equ YES RECLAME equ YES TESTING equ NO REALTIMING equ YES ; 1=same delay on all computers ; 0=simple delay loop (varies with MHz) ; 1 = 14 bytes longer program KaderKleur equ 9 bptr equ Byte Ptr wptr equ Word Ptr dptr equ Dword Ptr UP equ 72 DOWN equ 80 LEFT equ 75 RIGHT equ 77 INITSNAKELEN equ 10 ; length of snake at initialization FOODINCREMENT equ 50 ; how many pixels to increment body MAXLENGTH equ 1600 start: ; entry point jmp RealStart ; -- DATA -- if reclame einde db 'SNAKE.COM v1.00 by Rick Companje 17/12/1996',13,10 db 'Copyright (C) 1996 TMR Software Productions',13,10,10,36 endif if UPDATEINFO update db 'The last update was on ',??date,' at ',??time,13,10,10,36 endif IF TESTING TestingMode db 'You were testing SNAKE... last food position was #####',13,10,10 ELSE crashedstr db 'Dead! Your score is ###',10,13,10 ENDIF if TESTING menustr db 'T:Test',10,13 else menustr db 'P:Play',10,13 endif db 'Q:End$' toonduur db 10 toon dw ? foodpos dw 0 gepakt dw 0 dir db RIGHT ; direction, init to RIGHT if TESTING TestingWr db 'TESTING MODE' prpos dw 0 endif if Grafisch delaypop dw 0 eerstekeer db 0 HappyPop db NO endif RealStart: push 0a000h ; this is 1 byte shorter than pop gs ; mov ax, 0a000h - mov gs, ax ; mov eax, 0a000h ; i have to clear 16 MSB in EAX ; mov gs, ax ; i just use this instead of [1,2,3] ; push 40h ; points to bios data area ; pop fs ; for random number at 40:6ch mov ax, ds mov fs, ax ; de posities van snake in data segment xor eax, eax ; IF REALTIMING mov al, 36h out 43h, al mov ax, 30000 ; try lower values for faster moving out 40h, al mov al, ah out 40h, al ENDIF ;ððððððððððððððððððððð TOON MENU EN VRAAG VOOR INVOER ððððððððððððððððððððððð ;-- menu -- mov dx, offset menustr menuloop: if Grafisch cmp [eerstekeer], 0 jnz GeenSchermModeInstellen mov ax, 13h int 10h mov [eerstekeer], 1 GeenSchermModeInstellen: call FillScreen call PlaatsKader call ShowMenu else mov ax, 3 int 10h ; 80x25 textmode mov ah, 9 int 21h ; show menu Endif ask: mov ah, 0 int 16h ; wait for keypress and al, 1011111b ; convert to uppercase (5Fh) cmp al, 'Q' ; was key q or Q ? je @exit ; if so jump to exit if TESTING cmp al, 'T' else cmp al, 'P' ; was key p or P ? endif jne ask ; if not jump back to ask mov [Gepakt], 0 ;ððððððððððððððððððððððððððððððððð GO VGA ððð 320x200x256 ððððððððððððððððððð if grafisch else mov ax, 13h int 10h Endif Call FillScreen Call PlaatsKader IF TESTING push ax push bx push cx push dx push es mov bx, offset TestingWr mov ah, 0eh mov cx, 12 ;lengte zin TestWrLoop: mov al, [bx] push bx mov bl, 12 int 10h pop bx inc bx loop TestWrLoop pop ax pop bx pop cx pop dx pop es else ;ðððððððððððððððððððððð PLAATSEN INITIALISEREN ðððððððððððððððððððððððððððððð call PrintScore endif mov bx, 1 ; snake current length mov cx, INITSNAKELEN mov bp, 60000 ; points to head of snake (was 60000) ; welke droom??? ikku snappu het!! ; het WORD die op [bp] staat wordt genomen als begin positie mov ax, 20000 ;midden op het scherm mov fs:[bp], ax mov dptr gs:[80*320+150], 010e0e01h mov dptr gs:[81*320+150], 0e0e0e0eh ; put first sprite mov dptr gs:[82*320+150], 0e0e0e0eh mov dptr gs:[83*320+150], 010e0e01h mov [foodpos], 80*320+150 playloop: ; -- draw snake -- mov dx, bx ; dx = snake length mov si, bp ; si points to head of snake mov di, fs:[si] ; load snake head position cmp bptr gs:[di], kaderkleur; vergelijk met zijkanten veld jz @snakecrashed cmp bptr gs:[di], 14 ; compare with food byte ja @snakecrashed jnz drawbody ; if not food, don't increment length cmp cx, MAXLENGTH jnl SlangTeLang add cx, FOODINCREMENT ; increment snake length SlangTeLang: mov di, [foodpos] mov dptr gs:[di+000], 01010101h ; ------------ mov dptr gs:[di+320], 01010101h ; clear sprite mov dptr gs:[di+640], 01010101h ; ____________ mov dptr gs:[di+960], 01010101h ; ; mov [Gepakt],1 inc [Gepakt] mov [toonduur], 2 mov [toon], 5 call play if Grafisch call PutHappy mov [happypop],YES endif IF TESTING ELSE call PrintScore ENDIF PosKiezen: push fs push ax mov ax, 40h mov fs, ax pop ax mov di, wptr fs:[6ch] ; get random number shl di, 8 ; di = (byte at 40:6ch) * 256 pop fs cmp di, 60000 jb KleinerDan60000 ; if di < 60000 then Goto KleinerDan60000 sub di, 6000 ; else di = di - 6000 KleinerDan60000: ; KleinerDan60000: cmp di, 4800 ja GroterDan4800 ; if di > 4800 then goto GroterDan4800 add di, 5000 ; else di = di + 6400 GroterDan4800: ; GroterDan4800: inc di ; 1 optellen, zo raakt ie geen zijkant IF TESTING mov [prpos], 34 Call PrintPOS ENDIF mov [foodpos], di ; save positie mov dptr gs:[di+000], 010e0e01h ; mov dptr gs:[di+320], 0e0e0e0eh ; ------------ mov dptr gs:[di+640], 0e0e0e0eh ; draw sprite mov dptr gs:[di+960], 010e0e01h ; ____________ drawbody: lodsw ; load body pixel offset cmp bptr gs:[eax], 14 jz GeenPuntZetten mov bptr gs:[eax], 15 ; show snake body point (eax msw=0!) GeenPuntZetten: dec dx ; decrement snake length jnz drawbody ;delay pop if Grafisch cmp [Happypop], NO jz GeenNormPopPlaatsen inc [delaypop] cmp [delaypop], 120 jng GeenNormPopPlaatsen Call PutNormal mov [delaypop],0 endif GeenNormPopPlaatsen: cmp bptr gs:[eax], 14 jz NietWissen mov bptr gs:[eax], 1 ; clear snake tale NietWissen: ; -- check for keypress -- mov ah, 1 int 16h jz movesnake mov ah, 0 int 16h ; get key and al, 1011111b cmp al, 'Q' je endsnake ; 'Q' pressed -> exit to menu cmp al, 27 je endsnake cmp al, 'P' jnz GeenPauze if Grafisch call Pauze else mov ah,0 int 16h endif jmp NietWissen GeenPauze: mov [dir], ah ; store new direction ; -- move snake -- movesnake: mov dl, [dir] ; dh is always 0 at this point! mov ax, fs:[bp] ; load snake head offset dec bp ; move body - dec bp ; 1 byte shorter than 'sub bp, 2' ;--------------------------------- cmp dl, UP ; shorter than 'cmp [dir], UP' jne @checkdown2 sub ax, 320 ; move head 1 line up 321 jmp @moveheadend @checkdown2: cmp dl, DOWN jne @checkleft2 add ax, 320 ; move head 1 line down 319 jmp @moveheadend @checkleft2: ; we have either LEFT or RIGHT dir cmp dl, LEFT jne @checkright dec ax jmp @moveheadend ; dec ax @checkright: ; cmp dl, RIGHT ; jnz III inc ax ; jmp @MoveHeadEnd ;III: ; jmp NietWissen ; inc bp ; inc bp ; add ax, dx ; if dir = LEFT = 75 it is 75-76 = -1 ; sub ax, 76 ; if dir =RIGHT = 77 it is 77-76 = +1 @MoveHeadEnd: ; mov ah, [dir] ;tmr mov fs:[bp], ax ; store new head offset cmp bx, cx ; cmp current length with full length adc bx, 0 ; bx<cx -> increment bx ; ; cmp bx, cx ; cmp current length with full length ; jz @lenequal ; inc bx ; continue increment snake length @lenequal: ; -- move end -- ; -- a little delay -- IF REALTIMING hlt ; correct delay ELSE mov edx, 140000 ; simple delay @@nops: dec edx jnz @@nops ENDIF jmp playloop @snakecrashed: mov cx, 260 toonomlaag: mov [toonduur], 1 mov [toon], cx call play inc cx cmp cx, 300 jnz toonomlaag IF Grafisch ELSE IF TESTING mov dx, offset [TestingMode] - offset [menustr] ELSE mov bx, offset menustr-4 mov ax,[gepakt] mov cx,3 call ConvertNumberToString mov dx, offset [crashedstr] - offset [menustr] ENDIF ENDIF endsnake: add dx, offset [menustr] ; because dx is always 0 here jmp menuloop ;-------------------------------------------------------------------------- ;========================================================================== FillScreen PROC mov cx, 32000-(4*320) ; 4 and not 8 because fill with words mov ax, 0101h mov di, 9*320 push 0a000h pop es rep stosw ; fill screen blue ret FillScreen ENDP PlaatsKader PROC mov ah, kaderkleur mov al, kaderkleur mov di, 320*10-1 mov cx, 190 HerhaalLijnen: stosw add di, 318 ;zijkanten cmp di, 32000 loop HerhaalLijnen ;-------------------------------- bovenkant --------------------------------- mov cx, 320/2 mov di, 9*320 rep stosw ;---------------------------------------------------------------------------- mov di, 320*199 mov cx, 320/2 ;onderkant rep stosw ret PlaatsKader ENDP Play PROC ; [toon] --> toon ; [toonduur] --> lengte push dx Call SpeakerOn mov dx, 42h push ax mov ax, [toon] xchg ah, al out dx, al xchg ah, al out dx, al pop ax delay: hlt dec [toonduur] jnz Delay Call SpeakerOff pop dx ret ENDP Play SpeakerOn PROC push ax push cx push dx mov dx, 61h in al, dx or al, 3 out dx, al pop ax pop cx pop dx ret ENDP SpeakerOn SpeakerOff PROC push ax push cx push dx mov dx, 61h in al, dx and al, 0fch out dx, al pop ax pop cx pop dx ret ENDP SpeakerOff ConvertNumberToString PROC push si mov si,10 Convertloop: sub dx,dx div si add dl,'0' mov [bx],dl dec bx loop ConvertLoop pop si ret ENDP ConvertNumberToString IF TESTING PrintPOS PROC ; push ax ; push bx ; push cx ; push dx ; push es pusha mov bx, offset menustr-4 mov ax,di mov cx, 5 call ConvertNumberToString mov dx, [prpos] mov ah, 2 mov bh, 0 int 10h mov ah, 0eh mov cx, 5 mov bx, offset menustr-8 Poswriteloop2: mov al, [bx] push bx mov bl, 15 int 10h pop bx inc bx loop PosWriteloop2 ; pop ax ; pop bx ; pop cx ; pop dx ; pop es popa ret PrintPOS ENDP else PrintScore PROC push ax push bx push cx push dx push es mov bx, offset menustr-4 mov ax,[gepakt] mov cx, 3 call ConvertNumberToString mov ah, 2 mov dx, 004ch mov bh, 0 int 10h mov ah, 0eh mov cx, 3 mov bx, offset menustr-6 Scorewriteloop: mov al, [bx] push bx mov bl, 15 int 10h pop bx inc bx loop ScoreWriteloop pop ax pop bx pop cx pop dx pop es ret PrintScore ENDP ENDIF if Grafisch PutNormal PROC push di push si push cx push bx push 0a000h pop es mov di, 640+((320/2)-(27/2)) mov si, offset normal mov cx, 27*7 xor bx,bx PlaatsPicNormal: movsb inc bh cmp bh, 27 jnz PlaatsPicNormal inc bl cmp bl, 7 jz PicNormalKlaar xor bh,bh add di,320-27 jmp PlaatsPicNormal PicNormalKlaar: pop bx pop cx pop si pop di ret PutNormal ENDP PutHappy PROC push di push si push cx push bx push 0a000h pop es mov di, 640+((320/2)-(26/2)) mov si, offset happy mov cx, 26*7 xor bx,bx PlaatsPicHappy: movsb inc bh cmp bh, 26 jnz PlaatsPicHappy inc bl cmp bl, 7 jz PicHappyKlaar xor bh,bh add di,320-26 jmp PlaatsPicHappy PicHappyKlaar: pop bx pop cx pop si pop di ret PutHappy ENDP endif if grafisch Pauze PROC pusha ;------------ zet in buffer push 0a000h ;Video geheugen pop es mov si, 320*(200/2-47/2)+320/2-134/2 mov di, offset Buffer xor bx,bx PlaatsInBuffer: mov al,es:[si] mov ds:[di], al inc di inc si inc bh cmp bh, 134 jnz PlaatsInBuffer inc bl cmp bl, 47 jz BufferVolGemaakt xor bh,bh add si,320-134 jmp PlaatsInBuffer BufferVolGemaakt: mov si, offset picture mov di, 320*(200/2-47/2)+320/2-134/2 mov cx, 134*47 xor bx,bx PutPic: lodsb cmp al, 1 jz GeenPixel stosb dec di GeenPixel: inc di inc bh cmp bh, 134 jnz PutPic inc bl cmp bl, 47 jz KlaarMetTekenen xor bh,bh add di,320-134 jmp PutPic KlaarMetTekenen: mov bptr es:[320*84+158], 12 hlt hlt hlt hlt hlt hlt mov bptr es:[320*84+158], 1 hlt hlt hlt hlt hlt hlt mov ah, 1 ;Keypressed int 16h jz KlaarMetTekenen mov ah, 0 ;Readkey (ClrKbdBuf) int 16h mov si, offset buffer mov di, 320*(200/2-47/2)+320/2-134/2 mov cx, 134*47 xor bx,bx PutBufferToScreen: movsb inc bh cmp bh, 134 jnz PutBufferToScreen inc bl cmp bl, 47 jz KlaarMetBufferTerugPlaatsen xor bh,bh add di,320-134 jmp PutBufferToScreen KlaarMetBufferTerugPlaatsen: popa ret Pauze ENDP ShowMenu PROC call SetPalette mov si, offset menupic push 0a000h ;Video geheugen pop es mov di, 320*(200/2-114/2)+320/2-174/2+320*10 mov cx, 174*114 ;134-20 because enter p or q is ugly xor bx,bx MenuPutPic: movsb inc bh cmp bh, 174 jnz MenuPutPic inc bl cmp bl, 114 jz MenuReady xor bh,bh add di,320-174 jmp MenuPutPic MenuReady: ret ShowMenu ENDP SetPalette PROC lea si, [palette] mov dx, 3c8h xor al, al ;Beginnen met kleur 0 out dx, al inc dx mov cx, 768 rep outsb ;set palette ret SetPalette ENDP endif @exit: IF REALTIMING ; reset PIT mov al, 36h out 43h, al mov al, 0 out 40h, al out 40h, al ENDIF mov ax, 3 ;text mode int 10h IF RECLAME mov ah,9 mov dx, offset einde ; print reclame int 21h ENDIF IF UPDATEINFO mov ah, 9 mov dx, offset Update int 21h ENDIF mov ah, 4ch int 21h if Grafisch ; (*----- File created with BIN2DB from file NORMPICT.PIX. -----*) label normal byte DB 0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6 DB 6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,6,6,50,50,50,50,50,6,6,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,6,50,50,50,50,50,50,50,6,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,50,50 DB 9,50,9,50,50,50,0,0,0,0,0,0,0,0,0,0,0,0,50,0 DB 50,0,0,0,50,50,50,50,50,50,50,50,50,0,0,0,50,0,50,0 DB 0,0,0,0,50,50,50,50,50,0,0,50,50,50,12,12,12,50,50,50 DB 0,0,50,50,50,50,50,0,0 ;------------------------------------------------------------------------- ; (*----- File created with BIN2DB from file HAPPYPIC.PIX. -----*) label happy byte DB 0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,0,0,0 DB 50,0,50,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6 DB 6,6,6,6,0,0,0,50,50,0,0,0,0,0,0,0,0,0,0,0 DB 0,6,6,50,50,50,50,50,6,6,0,0,0,50,50,0,0,0,0,0 DB 0,0,0,0,0,0,0,6,50,50,9,50,9,50,50,6,0,0,0,50 DB 50,0,0,0,0,0,0,0,0,0,0,0,0,50,50,50,1,50,1,50 DB 50,50,0,0,0,50,50,0,0,0,0,0,0,50,0,50,0,0,0,50 DB 50,12,50,50,50,12,50,50,0,0,0,50,50,0,0,0,0,0,50,50 DB 50,50,50,0,0,50,50,50,12,12,12,50,50,50,0,0,50,50,50,0 DB 0,0 ;------------------------------------------------------------------------- label palette byte ; (*----- File created with BIN2DB from file pauze.pal. -----*) DB 0,0,0,0,0,42,0,42,0,0,42,42,42,0,0,42,0,42,42,21 DB 0,42,42,42,21,21,21,21,21,63,21,63,21,21,63,63,63,21,21,63 DB 21,63,63,63,21,63,63,63,59,59,59,55,55,55,52,52,52,48,48,48 DB 45,45,45,42,42,42,38,38,38,35,35,35,31,31,31,28,28,28,25,25 DB 25,21,21,21,18,18,18,14,14,14,11,11,11,8,8,8,63,0,0,59 DB 0,0,56,0,0,53,0,0,50,0,0,47,0,0,44,0,0,41,0,0 DB 38,0,0,34,0,0,31,0,0,28,0,0,25,0,0,22,0,0,19,0 DB 0,16,0,0,63,54,54,63,46,46,63,39,39,63,31,31,63,23,23,63 DB 16,16,63,8,8,63,0,0,63,42,23,63,38,16,63,34,8,63,30,0 DB 57,27,0,51,24,0,45,21,0,39,19,0,63,63,54,63,63,46,63,63 DB 39,63,63,31,63,62,23,63,61,16,63,61,8,63,61,0,57,54,0,51 DB 49,0,45,43,0,39,39,0,33,33,0,28,27,0,22,21,0,16,16,0 DB 52,63,23,49,63,16,45,63,8,40,63,0,36,57,0,32,51,0,29,45 DB 0,24,39,0,54,63,54,47,63,46,39,63,39,32,63,31,24,63,23,16 DB 63,16,8,63,8,0,63,0,0,63,0,0,59,0,0,56,0,0,53,0 DB 1,50,0,1,47,0,1,44,0,1,41,0,1,38,0,1,34,0,1,31 DB 0,1,28,0,1,25,0,1,22,0,1,19,0,1,16,0,54,63,63,46 DB 63,63,39,63,63,31,63,62,23,63,63,16,63,63,8,63,63,0,63,63 DB 0,57,57,0,51,51,0,45,45,0,39,39,0,33,33,0,28,28,0,22 DB 22,0,16,16,23,47,63,16,44,63,8,42,63,0,39,63,0,35,57,0 DB 31,51,0,27,45,0,23,39,54,54,63,46,47,63,39,39,63,31,32,63 DB 23,24,63,16,16,63,8,9,63,0,1,63,0,0,63,0,0,59,0,0 DB 56,0,0,53,0,0,50,0,0,47,0,0,44,0,0,41,0,0,38,0 DB 0,34,0,0,31,0,0,28,0,0,25,0,0,22,0,0,19,0,0,16 DB 60,54,63,57,46,63,54,39,63,52,31,63,50,23,63,47,16,63,45,8 DB 63,42,0,63,38,0,57,32,0,51,29,0,45,24,0,39,20,0,33,17 DB 0,28,13,0,22,10,0,16,63,54,63,63,46,63,63,39,63,63,31,63 DB 63,23,63,63,16,63,63,8,63,63,0,63,56,0,57,50,0,51,45,0 DB 45,39,0,39,33,0,33,27,0,28,22,0,22,16,0,16,63,58,55,63 DB 56,52,63,54,49,63,53,47,63,51,44,63,49,41,63,47,39,63,46,36 DB 63,44,32,63,41,28,63,39,24,60,37,23,58,35,22,55,34,21,52,32 DB 20,50,31,19,47,30,18,45,28,17,42,26,16,40,25,15,39,24,14,36 DB 23,13,34,22,12,32,20,11,29,19,10,27,18,9,23,16,8,21,15,7 DB 18,14,6,16,12,6,14,11,5,10,8,3,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,10,10,49 DB 19,10,49,29,10,49,39,10,49,49,10,39,49,10,29,49,10,19,49,10 DB 10,49,12,10,49,23,10,49,34,10,49,45,10,42,49,10,31,49,10,20 DB 49,11,10,49,22,10,49,33,10,49,44,10,49,49,10,43,49,10,32,49 DB 10,21,49,10,10,63,63,63 ;---------------------------------------------------------------------- label picture byte ; (*----- File created with BIN2DB from file pauze.pix. -----*) DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,6,6,6 DB 6,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,6,6,6,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,6,6,50,50,50,50,50,6,6,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,50,50 DB 50,50,50,