Files
quickdev16/tools/zsnes/src/video/procvid.asm
2009-04-22 20:04:28 +02:00

3181 lines
60 KiB
NASM

;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
;
;http://www.zsnes.com
;http://sourceforge.net/projects/zsnes
;https://zsnes.bountysource.com
;
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;version 2 as published by the Free Software Foundation.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
%include "macros.mac"
EXTSYM BGMA,V8Mode,antienab,cacheud,cbitmode,ccud,cfield,cgram,coladdb,coladdg
EXTSYM coladdr,curblank,curfps,cvidmode,delay,extlatch,En2xSaI
EXTSYM gammalevel,hirestiledat,ignor512,latchx,latchy,maxbr,ForceNewGfxOff
EXTSYM newengen,nextframe,objptr,pressed,prevpal,res512switch,resolutn
EXTSYM romispal,scaddtype,scanlines,selcA000,t1cc,vcache4b,vesa2_bpos
EXTSYM spritetablea,vesa2_clbit,vesa2_gpos,vesa2_rpos,vesa2red10
EXTSYM vidbuffer,vram,KeyStateSelct,soundon
EXTSYM bg1objptr,DecompAPtr,HalfTransB,HalfTransC
EXTSYM DrawScreen,MMXSupport
EXTSYM Get_MouseData,Get_MousePositionDisplacement,GUIEnableTransp,GUIFontData
EXTSYM StopSound,StartSound,PrevPicture,nggposng,current_zst,newest_zst
EXTSYM GetTimeInSeconds,bg3ptr,bg3scroly,bg3scrolx,C4Ram
EXTSYM genfulladdtab,genfulladdtabng,TimerEnable,ShowTimer,debugdisble,GUIOn
EXTSYM FilteredGUI,HalfTrans,SmallMsgText,Mode7HiRes,mosenng,mosszng
EXTSYM intrlng,mode7hr,newgfx16b,vesa2_clbitng,vesa2_clbitng2,CSStatus
EXTSYM CSStatus2,CSStatus3,CSStatus4,SpecialLine,Clear2xSaIBuffer,vidbufferofsb,bg1scroly
EXTSYM MovieProcessing,MovieFrameStr,GetMovieFrameStr,mouse1lh,mouse2lh
EXTSYM MovieDisplayFrame,SloMo,MouseCount,device2,LoadPicture
EXTSYM zst_determine_newest,newestfiledate,zst_exists,ClockBox,SSAutoFire
%ifndef __MSDOS__
EXTSYM MouseMoveX,MouseMoveY,MouseButtons,MultiMouseProcess,mouse
%else
EXTSYM SB_blank,vsyncon,Triplebufen,granadd,Palette0,smallscreenon,ScreenScale,vesa2selec
EXTSYM displayfpspal,superscopepal,saveselectpal
%endif
%ifdef __UNIXSDL__
EXTSYM numlockptr
%endif
%ifdef __MSDOS__
%include "video/2xsaimmx.inc"
%endif
%include "video/copyvid.inc"
SECTION .text
;*******************************************************
; ShowVideo Processes & displays video
;*******************************************************
NEWSYM showvideo
push esi
push edi
push edx
push ebx
push ebp
inc byte[ccud]
mov bl,[ccud]
cmp byte[cacheud],bl
je .noinc
mov byte[ccud],0
.noinc
call copyvid
mov eax,[KeyStateSelct]
test byte[pressed+eax],1
jz .nosavesel
call saveselect
.nosavesel
xor ecx,ecx
pop ebp
pop ebx
pop edx
pop edi
pop esi
ret
NEWSYM SwapMouseButtons
test bl,3
jpe .noswap
xor bl,3
.noswap
ret
NEWSYM processmouse1
push esi
push edi
push edx
push ebx
%ifndef __MSDOS__
cmp byte[MouseCount],1
jle .nomultimouse
pushad
mov byte[mouse],0
call MultiMouseProcess
popad
mov bx,[MouseButtons]
cmp byte[mouse1lh],1
jne .notlefthanded1
call SwapMouseButtons
.notlefthanded1
mov [mousebuttons],bx
mov cx,[MouseMoveX]
mov dx,[MouseMoveY]
jmp .mousestuff
.nomultimouse
%endif
call Get_MouseData
cmp byte[mouse1lh],1
jne .notlefthanded2
call SwapMouseButtons
.notlefthanded2
mov [mousebuttons],bx
call Get_MousePositionDisplacement
.mousestuff
mov word[mousexpos],0
cmp cx,0
je .noxchange
mov byte[mousexdir],0
cmp cx,0
jge .noneg
mov byte[mousexdir],1
neg cx
.noneg
mov [mousexpos],cx
.noxchange
mov word[mouseypos],0
cmp dx,0
je .noychange
mov byte[mouseydir],0
cmp dx,0
jge .noneg2
mov byte[mouseydir],1
neg dx
.noneg2
mov [mouseypos],dx
.noychange
xor ecx,ecx
pop ebx
pop edx
pop edi
pop esi
ret
NEWSYM processmouse2
push esi
push edi
push edx
push ebx
%ifndef __MSDOS__
cmp byte[MouseCount],1
jle .nomultimouse
pushad
mov byte[mouse],1
call MultiMouseProcess
popad
mov bx,[MouseButtons+2]
jmp .mousestuff
.nomultimouse
%endif
call Get_MouseData
.mousestuff
cmp byte[mouse2lh],1
jne .notlefthanded
call SwapMouseButtons
.notlefthanded
mov [mousebuttons],bx
cmp byte[device2],2
jne .ss
push eax
mov eax,[SSAutoFire]
cmp byte[pressed+eax],0
pop eax
je .noautosw
cmp byte[ssautoswb],1
je .ss
xor byte[ssautosw],20h
mov byte[ssautoswb],1
mov dword[Msgptr],.ssautoen
cmp byte[ssautosw],0
jne .nononauto
mov dword[Msgptr],.ssautodi
.nononauto
mov eax,[MsgCount]
mov [MessageOn],eax
jmp .ss
.noautosw
mov byte[ssautoswb],0
.ss
%ifndef __MSDOS__
cmp byte[MouseCount],1
jle .nomultimouse2
mov cx,[MouseMoveX+2]
mov dx,[MouseMoveY+2]
jmp .mousestuff2
.nomultimouse2
%endif
call Get_MousePositionDisplacement
.mousestuff2
cmp byte[device2],3
je .le
cmp byte[device2],4
je .le
cmp byte[device2],2
jne .ss2
.le
add word[mousexloc],cx
test word[mousexloc],8000h
jz .nowrapleft
mov word[mousexloc],0
.nowrapleft
cmp word[mousexloc],255
jbe .nowrapright
mov word[mousexloc],255
.nowrapright
mov ax,[mousexloc]
add ax,40
mov [latchx],ax
mov byte[extlatch],40h
.ss2
mov word[mousexpos],0
cmp cx,0
je .noxchange
mov byte[mousexdir],0
cmp cx,0
jge .noneg
mov byte[mousexdir],1
neg cx
.noneg
mov [mousexpos],cx
.noxchange
cmp byte[device2],3
je .le2
cmp byte[device2],4
je .le2
cmp byte[device2],2
jne .ss3
.le2
add word[mouseyloc],dx
test word[mouseyloc],8000h
jz .nowrapup
mov word[mouseyloc],0
.nowrapup
cmp word[mouseyloc],223
jbe .nowrapdown
mov word[mouseyloc],223
.nowrapdown
mov ax,[mouseyloc]
mov [latchy],ax
.ss3
mov word[mouseypos],0
cmp dx,0
je .noychange
mov byte[mouseydir],0
cmp dx,0
jge .noneg2
mov byte[mouseydir],1
neg dx
.noneg2
mov [mouseypos],dx
.noychange
xor ecx,ecx
pop ebx
pop edx
pop edi
pop esi
ret
SECTION .data
.ssautoen db 'AUTOFIRE ENABLED.',0
.ssautodi db 'AUTOFIRE DISABLED.',0
NEWSYM ssautosw, db 20h
NEWSYM mousexloc, dw 128
NEWSYM mouseyloc, dw 112
SECTION .bss
NEWSYM ssautoswb, resb 1
NEWSYM mousebuttons, resw 1
NEWSYM mousexpos, resw 1
NEWSYM mousexdir, resb 1
NEWSYM mouseypos, resw 1
NEWSYM mouseydir, resb 1
NEWSYM mousechan, resb 1
SECTION .text
;*******************************************************
; Output Hex Outputs the hex in al @ esi
;*******************************************************
NEWSYM outputhex
push edi
push esi
push eax
push ebx
push ecx
push esi
mov edi,FontData
xor ebx,ebx
mov bl,al
shr bl,4
shl ebx,3
add edi,ebx
add edi,8
mov cl,8
.loopa
mov ah,[edi]
mov ch,8
.loopb
test ah,80h
jz .nowrite
mov byte[esi],128
mov byte[esi+289],192
.nowrite
shl ah,1
inc esi
dec ch
jnz .loopb
add esi,280
inc edi
dec cl
jnz .loopa
pop esi
add esi,8
mov edi,FontData
xor ebx,ebx
mov bl,al
and bl,0Fh
shl ebx,3
add edi,ebx
add edi,8
mov cl,8
.loopa2
mov ah,[edi]
mov ch,8
.loopb2
test ah,80h
jz .nowrite2
mov byte[esi],128
mov byte[esi+289],192
.nowrite2
shl ah,1
inc esi
dec ch
jnz .loopb2
add esi,280
inc edi
dec cl
jnz .loopa2
pop ecx
pop ebx
pop eax
pop esi
pop edi
ret
OutputText16b:
cmp byte[ForceNonTransp],1
je near OutText16bnt
cmp byte[GUIEnableTransp],0
je near OutText16bnt
; output text in edi to esi
push ebx
push eax
mov cl,9
.loopa
mov ch,9
xor eax,eax
cmp cl,1
je .not1
mov al,[edi]
shl eax,1
.not1
xor ebx,ebx
cmp cl,9
je .loopb
mov bl,[edi-1]
.loopb
test ax,100h
jz .nowrite
push eax
and word[esi],dx
shr word[esi],1
and word[esi+75036*4],dx
shr word[esi+75036*4],1
ror edx,16
add word[esi],dx
add word[esi+75036*4],dx
ror edx,16
pop eax
jmp .nowrite2
.nowrite
test bx,100h
jz .nowrite2
and word[esi],dx
shr word[esi],1
and word[esi+75036*4],dx
shr word[esi+75036*4],1
.nowrite2
shl ax,1
shl bx,1
add esi,2
dec ch
jnz .loopb
add esi,279*2
inc edi
dec cl
jnz .loopa
pop eax
pop ebx
ret
OutText16bnt:
; output text in edi to esi
push ebx
push eax
mov cl,9
.loopa
mov ch,9
xor eax,eax
cmp cl,1
je .not1
mov al,[edi]
shl eax,1
.not1
xor ebx,ebx
cmp cl,9
je .loopb
mov bl,[edi-1]
.loopb
test ax,100h
jz .nowrite
mov word[esi],0FFFFh
mov word[esi+75036*4],0FFFFh
jmp .nowrite2
.nowrite
test bx,100h
jz .nowrite2
and word[esi],dx
and word[esi+75036*4],dx
shr word[esi],1
shr word[esi+75036*4],1
.nowrite2
shl ax,1
shl bx,1
add esi,2
dec ch
jnz .loopb
add esi,279*2
inc edi
dec cl
jnz .loopa
pop eax
pop ebx
ret
NEWSYM outputhex16
push edi
push esi
push eax
push ebx
push ecx
push edx
push esi
mov dx,[vesa2_clbitng]
ror edx,16
mov dx,[vesa2_clbitng]
shr dx,1
ror edx,16
mov edi,FontData
xor ebx,ebx
mov bl,al
shr bl,4
shl ebx,3
add edi,ebx
add edi,8
call OutputText16b
pop esi
add esi,16
mov edi,FontData
xor ebx,ebx
mov bl,al
and bl,0Fh
shl ebx,3
add edi,ebx
add edi,8
call OutputText16b
pop edx
pop ecx
pop ebx
pop eax
pop esi
pop edi
ret
SECTION .data
NEWSYM ASCII2Font
db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h,00h,30h,00h,00h,00h,00h,00h,00h
db 00h,3Eh,33h,31h,3Fh,37h,2Fh,3Dh,3Ah,3Bh,35h,38h,39h,25h,28h,29h
db 01h,02h,03h,04h,05h,06h,07h,08h,09h,0Ah,2Eh,40h,2Ah,32h,2Bh,36h
db 3Ch,0Bh,0Ch,0Dh,0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h,18h,19h
db 1Ah,1Bh,1Ch,1Dh,1Eh,1Fh,20h,21h,22h,23h,24h,2Ch,34h,2Dh,42h,26h
db 41h,0Bh,0Ch,0Dh,0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h,18h,19h
db 1Ah,1Bh,1Ch,1Dh,1Eh,1Fh,20h,21h,22h,23h,24h,43h,00h,44h,27h,00h
db 0Dh,1Fh,0Fh,0Bh,0Bh,0Bh,0Bh,0Dh,0Fh,0Fh,0Fh,13h,13h,13h,0Bh,0Bh
db 0Fh,0Bh,0Bh,19h,19h,19h,1Fh,1Fh,23h,19h,1Fh,0Dh,10h,23h,1Ah,10h
db 0Bh,4Eh,4Fh,50h,51h,52h,53h,54h,55h,56h,57h,58h,59h,5Ah,5Bh,5Ch
db 5Dh,5Eh,5Fh,60h,61h,62h,63h,64h,65h,66h,67h,68h,69h,6Ah,6Bh,6Ch
db 6Dh,6Eh,6Fh,70h,71h,72h,73h,74h,75h,76h,77h,78h,79h,7Ah,7Bh,7Ch
db 7Dh,7Eh,7Fh,80h,81h,82h,83h,84h,85h,86h,87h,88h,89h,8Ah,8Bh,8Ch
db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,4Dh,4Ch,4Bh,4Ah,45h,46h,47h,48h,49h
NEWSYM FontData
; bitmap 8x8 font ; char, offset for ASCII2Font
db 0,0,0,0,0,0,0,0 ; ' ', 00
db 01111100b,11000110b,11001110b,11010110b ; 0, 01
db 11100110b,11000110b,01111100b,00000000b
db 00011000b,00111000b,01111000b,00011000b ; 1, 02
db 00011000b,00011000b,01111110b,00000000b
db 01111100b,11000110b,00001100b,00011000b ; 2, 03
db 00110000b,01100110b,11111110b,00000000b
db 01111100b,11000110b,00000110b,00111100b ; 3, 04
db 00000110b,11000110b,01111100b,00000000b
db 00111100b,01101100b,11001100b,11111110b ; 4, 05
db 00001100b,00001100b,00001100b,00000000b
db 11111110b,11000000b,11000000b,11111100b ; 5, 06
db 00000110b,11000110b,01111100b,00000000b
db 00111100b,01100000b,11000000b,11111100b ; 6, 07
db 11000110b,11000110b,01111100b,00000000b
db 11111110b,11000110b,00000110b,00001100b ; 7, 08
db 00011000b,00011000b,00011000b,00000000b
db 01111100b,11000110b,11000110b,01111100b ; 8, 09
db 11000110b,11000110b,01111100b,00000000b
db 01111100b,11000110b,11000110b,01111110b ; 9, 0A
db 00000110b,11000110b,01111100b,00000000b
db 00111000b,01101100b,11000110b,11111110b ; A, 0B
db 11000110b,11000110b,11000110b,00000000b
db 11111100b,11000110b,11000110b,11111100b ; B, 0C
db 11000110b,11000110b,11111100b,00000000b
db 01111100b,11000110b,11000000b,11000000b ; C, 0D
db 11000000b,11000110b,01111100b,00000000b
db 11111100b,11000110b,11000110b,11000110b ; D, 0E
db 11000110b,11000110b,11111100b,00000000b
db 11111110b,11000000b,11000000b,11111000b ; E, 0F
db 11000000b,11000000b,11111110b,00000000b
db 11111110b,11000000b,11000000b,11111000b ; F, 10
db 11000000b,11000000b,11000000b,00000000b
db 01111100b,11000110b,11000000b,11000000b ; G, 11
db 11001110b,11000110b,01111100b,00000000b
db 11000110b,11000110b,11000110b,11111110b ; H, 12
db 11000110b,11000110b,11000110b,00000000b
db 00111100b,00011000b,00011000b,00011000b ; I, 13
db 00011000b,00011000b,00111100b,00000000b
db 00011110b,00001100b,00001100b,00001100b ; J, 14
db 00001100b,11001100b,00111100b,00000000b
db 11001100b,11011000b,11110000b,11100000b ; K, 15
db 11110000b,11011000b,11001100b,00000000b
db 11000000b,11000000b,11000000b,11000000b ; L, 16
db 11000000b,11000000b,11111110b,00000000b
db 11000110b,11101110b,11111110b,11010110b ; M, 17
db 11000110b,11000110b,11000110b,00000000b
db 11000110b,11100110b,11110110b,11011110b ; N, 18
db 11001110b,11000110b,11000110b,00000000b
db 01111100b,11000110b,11000110b,11000110b ; O, 19
db 11000110b,11000110b,01111100b,00000000b
db 11111100b,11000110b,11000110b,11111100b ; P, 1A
db 11000000b,11000000b,11000000b,00000000b
db 01111100b,11000110b,11000110b,11000110b ; Q, 1B
db 11010110b,11001110b,01111110b,00000000b
db 11111100b,11000110b,11000110b,11111100b ; R, 1C
db 11001100b,11000110b,11000110b,00000000b
db 01111100b,11000110b,11000000b,01111100b ; S, 1D
db 00000110b,11000110b,01111100b,00000000b
db 01111110b,00011000b,00011000b,00011000b ; T, 1E
db 00011000b,00011000b,00011000b,00000000b
db 11000110b,11000110b,11000110b,11000110b ; U, 1F
db 11000110b,11000110b,01111100b,00000000b
db 11000110b,11000110b,11000110b,11000110b ; V, 20
db 01101100b,00111000b,00010000b,00000000b
db 11000110b,11000110b,11000110b,11010110b ; W, 21
db 11010110b,11111110b,01101100b,00000000b
db 11000110b,01101100b,00111000b,00010000b ; X, 22
db 00111000b,01101100b,11000110b,00000000b
db 11001100b,11001100b,01111000b,00110000b ; Y, 23
db 00110000b,00110000b,00110000b,00000000b
db 11111100b,10001100b,00011000b,00110000b ; Z, 24
db 01100000b,11000100b,11111100b,00000000b
db 00000000b,00000000b,00000000b,11111110b ; -, 25
db 00000000b,00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b,00000000b ; _, 26
db 00000000b,00000000b,11111110b,00000000b
db 01110000b,11011100b,00000110b,00000000b ; ~, 27
db 00000000b,00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b,00000000b ; ., 28
db 00000000b,00110000b,00110000b,00000000b
db 00000010b,00000100b,00001000b,00010000b ; /, 29
db 00100000b,01000000b,10000000b,00000000b
db 00001100b,00011000b,00110000b,01100000b ; <, 2A
db 00110000b,00011000b,00001100b,00000000b
db 01100000b,00110000b,00011000b,00001100b ; >, 2B
db 00011000b,00110000b,01100000b,00000000b
db 00111000b,00100000b,00100000b,00100000b ; [, 2C
db 00100000b,00100000b,00111000b,00000000b
db 00111000b,00001000b,00001000b,00001000b ; ], 2D
db 00001000b,00001000b,00111000b,00000000b
db 00000000b,00011000b,00011000b,00000000b ; :, 2E
db 00011000b,00011000b,00000000b,00000000b
db 00011000b,00100100b,00011000b,00111010b ; &, 2F
db 01000100b,01000110b,00111010b,00000000b
; Arrow, 30
; #, 31 (, 3A {, 43
; =, 32 ), 3B }, 44
; ", 33 @, 3C Up,45
; \, 34 ', 3D Dn,46
; *, 35 !, 3E Lt,47
; ?, 36 $, 3F Rt,48
; %, 37 ;, 40 Bk,49
; +, 38 `, 41 .5,4A
; ,, 39 ^, 42
SECTION .text
;*******************************************************
; Output Char Outputs char in al @ esi
;*******************************************************
NEWSYM outputchar
push edi
push esi
push eax
mov edi,FontData
xor ebx,ebx
mov bl,al
shl ebx,3
add edi,ebx
mov cl,8
.loopa
mov ah,[edi]
mov ch,8
.loopb
test ah,80h
jz .nowrite
mov al,[textcolor]
mov [esi],al
mov byte[esi+289],192
.nowrite
shl ah,1
inc esi
dec ch
jnz .loopb
add esi,280
inc edi
dec cl
jnz .loopa
pop eax
pop esi
pop edi
ret
NEWSYM outputchar16b
push edi
push esi
push eax
push edx
push ecx
mov dx,[vesa2_clbitng]
ror edx,16
mov dx,[vesa2_clbitng]
shr dx,1
ror edx,16
mov edi,FontData
xor ebx,ebx
mov bl,al
shl ebx,3
add edi,ebx
call OutputText16b
pop ecx
pop edx
pop eax
pop esi
pop edi
ret
SECTION .data
NEWSYM textcolor, db 128
NEWSYM textcolor16b, dw 0FFFFh
SECTION .text
NEWSYM outputchar5x5
push edi
push esi
push eax
mov edi,GUIFontData
xor ebx,ebx
mov bl,al
shl ebx,2
add edi,ebx
xor ebx,ebx
mov bl,al
add edi,ebx
mov cl,5
.loopa
mov ah,[edi]
mov ch,5
.loopb
test ah,80h
jz .nowrite
mov al,[textcolor]
mov [esi],al
.nowrite
shl ah,1
inc esi
dec ch
jnz .loopb
add esi,283
inc edi
dec cl
jnz .loopa
pop eax
pop esi
pop edi
ret
NEWSYM outputchar16b5x5
push edi
push esi
push eax
mov edi,GUIFontData
xor ebx,ebx
mov bl,al
shl ebx,2
add edi,ebx
xor ebx,ebx
mov bl,al
add edi,ebx
mov cl,5
.loopa
mov ah,[edi]
mov ch,5
.loopb
test ah,80h
jz .nowrite
push eax
mov ax,[textcolor16b]
mov [esi],ax
mov [esi+75036*4],ax
pop eax
.nowrite
shl ah,1
add esi,2
dec ch
jnz .loopb
add esi,283*2
inc edi
dec cl
jnz .loopa
pop eax
pop esi
pop edi
ret
;*******************************************************
; Output Graphic String Outputs String from edi to esi
;*******************************************************
NEWSYM OutputGraphicString
cmp byte[cbitmode],1
je .do16b
.no16bit
xor eax,eax
.nextstr
mov al,[edi]
cmp al,0
je .nomore
mov al,[ASCII2Font+eax]
call outputchar
add esi,8
inc edi
jmp .nextstr
.nomore
ret
.do16b
sub esi,[vidbuffer]
shl esi,1
add esi,[vidbuffer]
cmp byte[textcolor],128
jne .no128
mov word[textcolor16b],0FFFFh
.no128
cmp byte[textcolor],129
jne .no129
mov word[textcolor16b],0
.no129
cmp byte[textcolor],130
jne .no130
xor ax,ax
xor bx,bx
mov cl,[vesa2_rpos]
mov bx,20
shl bx,cl
add ax,bx
mov cl,[vesa2_gpos]
mov bx,20
shl bx,cl
add ax,bx
mov cl,[vesa2_bpos]
mov bx,20
shl bx,cl
add ax,bx
mov [textcolor16b],ax
.no130
; Color #131, Red
cmp byte[textcolor],131
jne .no131
xor ax,ax
xor bx,bx
mov cl,[vesa2_rpos]
mov bx,22
shl bx,cl
add ax,bx
mov cl,[vesa2_gpos]
mov bx,5
shl bx,cl
add ax,bx
mov cl,[vesa2_bpos]
mov bx,5
shl bx,cl
add ax,bx
mov [textcolor16b],ax
.no131
jmp OutputGraphicString16b
NEWSYM OutputGraphicString16b
xor eax,eax
.nextstr
mov al,[edi]
cmp al,0
je .nomore
mov al,[ASCII2Font+eax]
call outputchar16b
add esi,16
inc edi
jmp .nextstr
.nomore
ret
NEWSYM OutputGraphicString5x5
cmp byte[cbitmode],1
je .do16b
.no16bit
xor eax,eax
.nextstr
mov al,[edi]
cmp al,0
je .nomore
mov al,[ASCII2Font+eax]
call outputchar5x5
add esi,6
inc edi
jmp .nextstr
.nomore
ret
.do16b
sub esi,[vidbuffer]
shl esi,1
add esi,[vidbuffer]
cmp byte[textcolor],128
jne .no128
mov word[textcolor16b],0FFFFh
.no128
cmp byte[textcolor],129
jne .no129
mov word[textcolor16b],0
.no129
cmp byte[textcolor],130
jne .no130
xor ax,ax
xor bx,bx
mov cl,[vesa2_rpos]
mov bx,20
shl bx,cl
add ax,bx
mov cl,[vesa2_gpos]
mov bx,20
shl bx,cl
add ax,bx
mov cl,[vesa2_bpos]
mov bx,20
shl bx,cl
add ax,bx
mov [textcolor16b],ax
.no130
; Color #131, Red
cmp byte[textcolor],131
jne .no131
xor ax,ax
xor bx,bx
mov cl,[vesa2_rpos]
mov bx,22
shl bx,cl
add ax,bx
mov cl,[vesa2_gpos]
mov bx,5
shl bx,cl
add ax,bx
mov cl,[vesa2_bpos]
mov bx,5
shl bx,cl
add ax,bx
mov [textcolor16b],ax
.no131
jmp OutputGraphicString16b5x5
NEWSYM OutputGraphicString16b5x5
xor eax,eax
.nextstr
mov al,[edi]
cmp al,0
je .nomore
mov al,[ASCII2Font+eax]
call outputchar16b5x5
add esi,12
inc edi
jmp .nextstr
.nomore
ret
;*******************************************************
; Save Select Allows user to select save state slot
;*******************************************************
; For Save State
SECTION .bss
NEWSYM csounddisable, resb 1
f3menuen resb 1
PrevPictureVal resb 1
CurPictureVal resb 1
SECTION .text
NEWSYM drawhline
.loop
mov [esi],al
inc esi
dec ecx
jnz .loop
ret
NEWSYM drawhline16b
.loop
mov [esi],ax
add esi,2
dec ecx
jnz .loop
ret
NEWSYM drawvline
.loop
mov [esi],al
add esi,288
dec ecx
jnz .loop
ret
NEWSYM drawvline16b
.loop
mov [esi],ax
add esi,288*2
dec ecx
jnz .loop
ret
DetermineNewest:
pushad
mov dword[newestfiledate],0
mov eax,[current_zst]
push eax
mov bl,10
div bl
mul bl
movzx ecx,al
add al,bl
.again
mov [current_zst],ecx
pushad
call zst_determine_newest
popad
inc cl
cmp cl,al
jne .again
pop eax
mov [current_zst],eax
popad
ret
GetPicture:
mov cl,[CurPictureVal]
cmp [PrevPictureVal],cl
jne .notskip
ret
.notskip
mov [PrevPictureVal],cl
pushad
call LoadPicture
popad
; convert to 1:5:5:5
cmp byte[newengen],0
je .noneweng
cmp byte[nggposng],5
jne .noneweng
mov edx,PrevPicture
mov ecx,64*56
.loop2
mov ax,[edx]
mov bx,ax
and ax,1111111111000000b
and bx,0000000000011111b
shr ax,1
or bx,ax
mov [edx],bx
add edx,2
dec ecx
jnz .loop2
.noneweng
; draw border
mov esi,75*2+9*288*2
add esi,[vidbuffer]
mov edx,58
.ploopa
mov ecx,66
push esi
.ploopb
mov word[esi],0FFFFh
add esi,2
dec ecx
jnz .ploopb
pop esi
add esi,288*2
dec edx
jnz .ploopa
; draw picture
mov esi,76*2+10*288*2
add esi,[vidbuffer]
mov edx,56
mov edi,PrevPicture
.ploopa2
mov ecx,64
push esi
.ploopb2
mov ax,[edi]
mov [esi],ax
add esi,2
add edi,2
dec ecx
jnz .ploopb2
pop esi
add esi,288*2
dec edx
jnz .ploopa2
ret
NEWSYM drawfillboxsc
pushad
call zst_exists
cmp eax,1
popad
jne .nodraw
push eax
; draws a 10x10 filled box according to position bl and color dl
xor eax,eax
mov al,11
mul bl
mov esi,76+104*288
add esi,[vidbuffer]
add esi,eax
mov ecx,10
mov al,176
push eax
mov eax,[current_zst]
cmp eax,[newest_zst]
pop eax
jne .next
mov al,208
.next
push esi
push ecx
mov ecx,10
call drawhline
pop ecx
pop esi
add esi,288
dec ecx
jnz .next
pop eax
.nodraw
ret
NEWSYM drawfillboxsc16b
pushad
call zst_exists
cmp eax,1
popad
jne .nodraw
push eax
; draws a 10x10 filled box according to position bl and color dl
xor eax,eax
mov al,11
mul bl
mov esi,76*2+104*288*2
add esi,[vidbuffer]
add esi,eax
add esi,eax
mov ecx,10
mov ax,[saveselect.allgrn]
push eax
mov eax,[current_zst]
cmp eax,[newest_zst]
pop eax
jne .next
mov ax,[saveselect.allgrnb]
.next
push esi
push ecx
mov ecx,10
call drawhline16b
pop ecx
pop esi
add esi,288*2
dec ecx
jnz .next
pop eax
.nodraw
ret
NEWSYM drawbox
; draws a box according to position bl and color dl
xor eax,eax
mov al,11
mul bl
mov esi,75+103*288
add esi,[vidbuffer]
add esi,eax
mov al,dl
push esi
mov ecx,12
call drawhline
pop esi
push esi
mov ecx,12
call drawvline
pop esi
push esi
add esi,11
mov ecx,12
call drawvline
pop esi
add esi,11*288
mov ecx,12
call drawhline
ret
NEWSYM drawbox16b
; draws a box according to position bl and color dx
xor eax,eax
mov al,11
mul bl
mov esi,75*2+103*288*2
add esi,[vidbuffer]
add esi,eax
add esi,eax
mov ax,dx
push esi
mov ecx,12
call drawhline16b
pop esi
push esi
mov ecx,12
call drawvline16b
pop esi
push esi
add esi,11*2
mov ecx,12
call drawvline16b
pop esi
add esi,11*288*2
mov ecx,12
call drawhline16b
ret
%macro drawfillboxbase 2
push eax
mov eax,[current_zst]
mov bl,10
div bl
mul bl
mov bl,%1
add al,bl
mov [current_zst],eax
pop eax
call %2
%endmacro
%macro drawfillboxhelp 1
drawfillboxbase %1,drawfillboxsc
%endmacro
%macro drawfillboxhelp16b 1
drawfillboxbase %1,drawfillboxsc16b
%endmacro
%macro testpressed 1
push eax
mov eax,[current_zst]
mov bl,10
div bl
mov bl,ah
mov ah,10
mul ah
%ifdef __UNIXSDL__
cmp dword[numlockptr],0 ; if numlock on, let's try this first
je %%try1
test byte[pressed+04Fh],1
jz %%try1
jmp %%yes1
%%try1
%endif
test byte[pressed+2],1
jz %%no1
%%yes1
mov bl,1
%%no1
%ifdef __UNIXSDL__
cmp dword[numlockptr],0 ; if numlock on, let's try this first
je %%try2
test byte[pressed+050h],1
jz %%try2
jmp %%yes2
%%try2
%endif
test byte[pressed+3],1
jz %%no2
%%yes2
mov bl,2
%%no2
%ifdef __UNIXSDL__
cmp dword[numlockptr],0 ; if numlock on, let's try this first
je %%try3
test byte[pressed+051h],1
jz %%try3
jmp %%yes3
%%try3
%endif
test byte[pressed+4],1
jz %%no3
%%yes3
mov bl,3
%%no3
%ifdef __UNIXSDL__
cmp dword[numlockptr],0 ; if numlock on, let's try this first
je %%try4
test byte[pressed+04Bh],1
jz %%try4
jmp %%yes4
%%try4
%endif
test byte[pressed+5],1
jz %%no4
%%yes4
mov bl,4
%%no4
%ifdef __UNIXSDL__
cmp dword[numlockptr],0 ; if numlock on, let's try this first
je %%try5
test byte[pressed+04Ch],1
jz %%try5
jmp %%yes5
%%try5
%endif
test byte[pressed+6],1
jz %%no5
%%yes5
mov bl,5
%%no5
%ifdef __UNIXSDL__
cmp dword[numlockptr],0 ; if numlock on, let's try this first
je %%try6
test byte[pressed+04Dh],1
jz %%try6
jmp %%yes6
%%try6
%endif
test byte[pressed+7],1
jz %%no6
%%yes6
mov bl,6
%%no6
%ifdef __UNIXSDL__
cmp dword[numlockptr],0 ; if numlock on, let's try this first
je %%try7
test byte[pressed+047h],1
jz %%try7
jmp %%yes7
%%try7
%endif
test byte[pressed+8],1
jz %%no7
%%yes7
mov bl,7
%%no7
%ifdef __UNIXSDL__
cmp dword[numlockptr],0 ; if numlock on, let's try this first
je %%try8
test byte[pressed+048h],1
jz %%try8
jmp %%yes8
%%try8
%endif
test byte[pressed+9],1
jz %%no8
%%yes8
mov bl,8
%%no8
%ifdef __UNIXSDL__
cmp dword[numlockptr],0 ; if numlock on, let's try this first
je %%try9
test byte[pressed+049h],1
jz %%try9
jmp %%yes9
%%try9
%endif
test byte[pressed+10],1
jz %%no9
%%yes9
mov bl,9
%%no9
%ifdef __UNIXSDL__
cmp dword[numlockptr],0 ; if numlock on, let's try this first
je %%try0
test byte[pressed+052h],1
jz %%try0
jmp %%yes0
%%try0
%endif
test byte[pressed+11],1
jz %%no0
%%yes0
mov bl,0
%%no0
%ifdef __UNIXSDL__
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
je %%noleft
%endif
test byte[pressed+75],1
jz %%noleft
cmp bl,0
jne %%plzsub
add bl,9
jmp %%donesub
%%plzsub
dec bl
%%donesub
mov byte[pressed+75],2
%%noleft
%ifdef __UNIXSDL__
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
je %%noright
%endif
test byte[pressed+77],1
jz %%noright
cmp bl,9
jne %%plzadd
sub bl,9
jmp %%doneadd
%%plzadd
inc bl
%%doneadd
mov byte[pressed+77],2
%%noright
%ifdef __UNIXSDL__
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
je %%noup
%endif
test byte[pressed+72],1
jz %%noup
cmp al,0
jne %%plzsubten
add al,90
jmp %%goneup
%%plzsubten
sub al,10
%%goneup
mov byte[pressed+72],2
add al,bl
mov [current_zst],eax
pop eax
jmp .updatescreen%1
%%noup
%ifdef __UNIXSDL__
cmp dword[numlockptr],1 ; if numlock on, disregard numpad
je %%nodown
%endif
test byte[pressed+80],1
jz %%nodown
cmp al,90
jne %%plzaddten
sub al,90
jmp %%gonedown
%%plzaddten
add al,10
%%gonedown
mov byte[pressed+80],2
add al,bl
mov [current_zst],eax
pop eax
jmp .updatescreen%1
%%nodown
%ifndef __MSDOS__
%ifdef __UNIXSDL__
test byte[pressed+92],1
%else
test byte[pressed+0CBh],1
%endif
jz %%noleft2
cmp bl,0
jne %%plzsub2
add bl,9
jmp %%donesub2
%%plzsub2
dec bl
%%donesub2
%ifdef __UNIXSDL__
mov byte[pressed+92],2
%else
mov byte[pressed+0CBh],2
%endif
%%noleft2
%ifdef __UNIXSDL__
test byte[pressed+94],1
%else
test byte[pressed+0CDh],1
%endif
jz %%noright2
cmp bl,9
jne %%plzadd2
sub bl,9
jmp %%doneadd2
%%plzadd2
inc bl
%%doneadd2
%ifdef __UNIXSDL__
mov byte[pressed+94],2
%else
mov byte[pressed+0CDh],2
%endif
%%noright2
%ifdef __UNIXSDL__
test byte[pressed+90],1
%else
test byte[pressed+0C8h],1
%endif
jz %%noup2
cmp al,0
jne %%plzsubten2
add al,90
jmp %%goneup2
%%plzsubten2
sub al,10
%%goneup2
%ifdef __UNIXSDL__
mov byte[pressed+90],2
%else
mov byte[pressed+0C8h],2
%endif
add al,bl
mov [current_zst],eax
pop eax
jmp .updatescreen%1
%%noup2
%ifdef __UNIXSDL__
test byte[pressed+96],1
%else
test byte[pressed+0D0h],1
%endif
jz %%nodown2
cmp al,90
jne %%plzaddten2
sub al,90
jmp %%gonedown2
%%plzaddten2
add al,10
%%gonedown2
%ifdef __UNIXSDL__
mov byte[pressed+96],2
%else
mov byte[pressed+0D0h],2
%endif
add al,bl
mov [current_zst],eax
pop eax
jmp .updatescreen%1
%%nodown2
%endif
add al,bl
mov [current_zst],eax
pop eax
%endmacro
NEWSYM saveselect
mov byte[f3menuen],1
mov byte[ForceNonTransp],1
cmp byte[ForceNewGfxOff],0
jne .nong16b
cmp byte[cbitmode],0
je .nong16b
%ifdef __MSDOS__
call GetScreen
%endif
.nong16b
cmp dword[MessageOn],0
je .nochangem
mov dword[MessageOn],1
.nochangem
mov al,[newengen]
mov byte[newengen],0
push eax
call copyvid
pop eax
mov [newengen],al
call StopSound
cmp byte[soundon],0
je .nosound
mov byte[csounddisable],1
%ifdef __MSDOS__
call SB_blank
%endif
.nosound
cmp byte[cbitmode],1
je near .16b
.updatescreen8b
%ifdef __MSDOS__
call saveselectpal
%endif
; draw a small blue box with a white border
mov esi,70+70*288
add esi,[vidbuffer]
mov ecx,150
mov al,80
.loop
mov byte[esi],144
inc esi
dec ecx
jnz .loop
add esi,288-150
dec al
mov ecx,150
jnz .loop
; draw filled boxes for existing files
call DetermineNewest
push ebx
mov eax,[current_zst]
push eax
mov bl,10
div bl
add al,'0'
mov [slotlevelnum],al
drawfillboxhelp 0
drawfillboxhelp 1
drawfillboxhelp 2
drawfillboxhelp 3
drawfillboxhelp 4
drawfillboxhelp 5
drawfillboxhelp 6
drawfillboxhelp 7
drawfillboxhelp 8
drawfillboxhelp 9
pop eax
mov [current_zst],eax
pop ebx
mov esi,75+73*288
add esi,[vidbuffer]
mov edi,.stringa
call OutputGraphicString
mov esi,75+83*288
add esi,[vidbuffer]
mov edi,.stringb
call OutputGraphicString
mov esi,75+93*288
add esi,[vidbuffer]
mov edi,.stringb2
call OutputGraphicString
mov esi,171+93*288
add esi,[vidbuffer]
mov edi,slotlevelnum
call OutputGraphicString
mov esi,75+118*288
add esi,[vidbuffer]
mov edi,.stringc
call OutputGraphicString
mov esi,75+128*288
add esi,[vidbuffer]
mov edi,.stringd
call OutputGraphicString
mov esi,75+138*288
add esi,[vidbuffer]
mov edi,.stringe
call OutputGraphicString
mov al,128
mov esi,70+70*288
add esi,[vidbuffer]
mov ecx,150
call drawhline
mov esi,70+70*288
add esi,[vidbuffer]
mov ecx,80
call drawvline
mov esi,70+149*288
add esi,[vidbuffer]
mov ecx,150
call drawhline
mov esi,219+70*288
add esi,[vidbuffer]
mov ecx,80
call drawvline
mov esi,75+103*288
add esi,[vidbuffer]
mov ecx,111
call drawhline
mov esi,75+114*288
add esi,[vidbuffer]
mov ecx,111
call drawhline
mov esi,75+104*288
add esi,[vidbuffer]
mov bl,11
.nextvline
mov ecx,10
push esi
push ebx
call drawvline
pop ebx
pop esi
add esi,11
dec bl
jnz .nextvline
mov esi,78+106*288
add esi,[vidbuffer]
mov al,1
call outputchar
mov bl,9
.nextnumchar
add esi,11
inc al
push ebx
call outputchar
pop ebx
dec bl
jnz .nextnumchar
mov byte[curblank],0h
mov dl,160
call drawbox
push ebx
call copyvid
pop ebx
; wait until esc/enter is pressed
.noesc
mov dl,128
call drawbox
mov ecx,2500
call delay
testpressed 8b
test byte[pressed+1],1
jnz near .esc
test byte[pressed+28],1
jnz near .enter
mov ecx,2500
call delay
testpressed 8b
test byte[pressed+1],1
jnz near .esc
test byte[pressed+28],1
jnz near .enter
push ebx
call copyvid
pop ebx
mov ecx,2500
call delay
testpressed 8b
test byte[pressed+1],1
jnz near .esc
test byte[pressed+28],1
jnz near .enter
mov ecx,2500
call delay
testpressed 8b
test byte[pressed+1],1
jnz near .esc
test byte[pressed+28],1
jnz near .enter
mov dl,160
call drawbox
push ebx
call copyvid
pop ebx
jmp .noesc
.enter
mov byte[pressed+28],2
.esc
mov eax,pressed
mov ecx,256
.looppr
cmp byte[eax],1
jne .notpr
mov byte[eax],2
.notpr
inc eax
dec ecx
jnz .looppr
%ifdef __MSDOS__
mov byte[pressed+1],0
%endif
mov word[t1cc],0
mov byte[csounddisable],0
call StartSound
%ifdef __MSDOS__
call dosmakepal
%endif
mov byte[f3menuen],0
mov byte[ForceNonTransp],0
ret
SECTION .bss
.allred resw 1
.allgrn resw 1
.allgrnb resw 1
.blue resw 1
.stepb resw 1
SECTION .text
; Start 16-bit stuff here
.16b
cmp byte[newengen],0
je .notng
mov byte[GUIOn],1
.notng
; draw shadow behind box
mov esi,80*2+90*288*2
add esi,[vidbuffer]
mov ecx,150
mov al,70
mov ah,5
.loop16b2
mov dx,[esi]
and dx,[vesa2_clbit]
shr dx,1
mov [esi],dx
add esi,2
dec ecx
jnz .loop16b2
add esi,288*2-150*2
dec al
mov ecx,150
jnz .loop16b2
.updatescreen16b
mov ax,018h
mov cl,[vesa2_rpos]
shl ax,cl
mov [.allgrn],ax
mov ax,25
mov cl,[vesa2_rpos]
shl ax,cl
mov [.allgrnb],ax
mov ax,12
mov cl,[vesa2_gpos]
shl ax,cl
or [.allgrnb],ax
mov ax,01Fh
mov cl,[vesa2_rpos]
shl ax,cl
mov [.allred],ax
mov ax,012h
mov cl,[vesa2_bpos]
shl ax,cl
mov dx,ax
mov ax,01h
mov cl,[vesa2_gpos]
shl ax,cl
mov bx,ax
mov ax,01h
mov cl,[vesa2_rpos]
shl ax,cl
or bx,ax
; draw a small blue box with a white border
mov esi,70*2+70*288*2
add esi,[vidbuffer]
mov ecx,150
mov al,80
mov ah,5
.loop16b
mov [esi],dx
add esi,2
dec ecx
jnz .loop16b
add esi,288*2-150*2
dec ah
jnz .nocolinc16b
add dx,bx
mov ah,5
.nocolinc16b
dec al
mov ecx,150
jnz .loop16b
; draw filled boxes for existing files
call DetermineNewest
push ebx
mov eax,[current_zst]
push eax
mov bl,10
div bl
add al,'0'
mov [slotlevelnum],al
drawfillboxhelp16b 0
drawfillboxhelp16b 1
drawfillboxhelp16b 2
drawfillboxhelp16b 3
drawfillboxhelp16b 4
drawfillboxhelp16b 5
drawfillboxhelp16b 6
drawfillboxhelp16b 7
drawfillboxhelp16b 8
drawfillboxhelp16b 9
pop eax
mov [current_zst],eax
pop ebx
mov esi,75*2+73*288*2
add esi,[vidbuffer]
mov edi,.stringa
call OutputGraphicString16b
mov esi,75*2+83*288*2
add esi,[vidbuffer]
mov edi,.stringb
call OutputGraphicString16b
mov esi,75*2+93*288*2
add esi,[vidbuffer]
mov edi,.stringb2
call OutputGraphicString16b
mov esi,171*2+93*288*2
add esi,[vidbuffer]
mov edi,slotlevelnum
call OutputGraphicString16b
mov esi,75*2+118*288*2
add esi,[vidbuffer]
mov edi,.stringc
call OutputGraphicString16b
mov esi,75*2+128*288*2
add esi,[vidbuffer]
mov edi,.stringd
call OutputGraphicString16b
mov esi,75*2+138*288*2
add esi,[vidbuffer]
mov edi,.stringe
call OutputGraphicString16b
mov ax,0FFFFh
mov esi,70*2+70*288*2
add esi,[vidbuffer]
mov ecx,150
call drawhline16b
mov esi,70*2+70*288*2
add esi,[vidbuffer]
mov ecx,80
call drawvline16b
mov esi,70*2+149*288*2
add esi,[vidbuffer]
mov ecx,150
call drawhline16b
mov esi,219*2+70*288*2
add esi,[vidbuffer]
mov ecx,80
call drawvline16b
mov esi,75*2+103*288*2
add esi,[vidbuffer]
mov ecx,111
call drawhline16b
mov esi,75*2+114*288*2
add esi,[vidbuffer]
mov ecx,111
call drawhline16b
mov esi,75*2+104*288*2
add esi,[vidbuffer]
mov bl,11
.nextvline16b
mov ecx,10
push esi
push ebx
call drawvline16b
pop ebx
pop esi
add esi,22
dec bl
jnz .nextvline16b
mov esi,78*2+106*288*2
add esi,[vidbuffer]
mov al,1
call outputchar16b
mov bl,9
.nextnumchar16b
add esi,22
inc al
push ebx
call outputchar16b
pop ebx
dec bl
jnz .nextnumchar16b
mov byte[curblank],0h
; mov dx,[.allred]
; call drawbox16b
push ebx
mov al,[newengen]
mov byte[newengen],0
push eax
call copyvid
pop eax
mov [newengen],al
pop ebx
; wait until esc/enter is pressed
mov byte[PrevPictureVal],0FFh
.noesc16b
push eax
mov eax,[current_zst]
mov [CurPictureVal],al
pop eax
pushad
call GetPicture
popad
mov dx,0FFFFh
call drawbox16b
mov ecx,2500
call delay
testpressed 16b
test byte[pressed+1],1
jnz near .esc16b
test byte[pressed+28],1
jnz near .enter16b
mov ecx,2500
call delay
testpressed 16b
test byte[pressed+1],1
jnz near .esc16b
test byte[pressed+28],1
jnz near .enter16b
push ebx
mov al,[newengen]
mov byte[newengen],0
push eax
call copyvid
pop eax
mov [newengen],al
pop ebx
mov ecx,2500
call delay
testpressed 16b
test byte[pressed+1],1
jnz near .esc16b
test byte[pressed+28],1
jnz near .enter16b
mov ecx,2500
call delay
testpressed 16b
test byte[pressed+1],1
jnz near .esc16b
test byte[pressed+28],1
jnz near .enter16b
mov dx,[.allred]
call drawbox16b
push ebx
mov al,[newengen]
mov byte[newengen],0
push eax
call copyvid
pop eax
mov [newengen],al
pop ebx
jmp .noesc16b
.enter16b
mov byte[pressed+28],2
.esc16b
mov eax,pressed
mov ecx,256
.looppr2
cmp byte[eax],1
jne .notpr2
mov byte[eax],2
.notpr2
inc eax
dec ecx
jnz .looppr2
.prwin
%ifdef __MSDOS__
mov byte[pressed+1],0
%endif
mov word[t1cc],0
mov byte[csounddisable],0
call StartSound
mov byte[f3menuen],0
mov byte[ForceNonTransp],0
mov byte[GUIOn],0
pushad
call Clear2xSaIBuffer
popad
ret
SECTION .data
.stringa db 'PLEASE SELECT',0
.stringb db 'SAVE STATE SLOT',0
.stringb2 db 'SLOT LEVEL:',0
.stringc db 'USE CURSOR KEYS',0
.stringd db 'TO MOVE AND',0
.stringe db 'ENTER TO SELECT',0
slotlevelnum db '-',0
SECTION .bss
NEWSYM ForceNonTransp, resb 1
;*******************************************************
; MakePal Changes the entire palette
;*******************************************************
; set the brightness with [maxbr]
SECTION .bss
NEWSYM cgramback, resw 256
SECTION .text
NEWSYM doveg
pushad
; backup cgram
mov ecx,128
xor ebx,ebx
.loop
mov eax,[cgram+ebx]
mov [cgramback+ebx],eax
add ebx,4
dec ecx
jnz .loop
xor eax,eax
mov al,[coladdr]
add al,[coladdg]
add al,[coladdb]
xor dx,dx
mov bx,3
div bx
and ax,011111b
mov [coladdr],al
mov [coladdg],al
mov [coladdb],al
xor eax,eax
.next
push eax
mov ax,[cgram+eax]
mov bx,ax
mov cx,ax
and bx,011111b
and cx,1111100000b
shr cx,5
add bx,cx
mov cx,ax
and cx,111110000000000b
shr cx,10
add bx,cx
mov ax,bx
xor dx,dx
mov bx,3
div bx
and ax,011111b
mov cx,ax
mov bx,ax
shl bx,5
or ax,bx
shl cx,10
or ax,cx
mov bx,ax
pop eax
mov [cgram+eax],bx
add eax,2
cmp eax,200h
jne .next
popad
ret
NEWSYM dovegrest
pushad
; backup cgram
mov ecx,128
xor ebx,ebx
.loop
mov eax,[cgramback+ebx]
mov [cgram+ebx],eax
add ebx,4
dec ecx
jnz .loop
popad
ret
SECTION .bss
NEWSYM tempco0, resw 1
NEWSYM prevbright, resb 1 ; previous brightness
SECTION .text
%ifdef __MSDOS__
NEWSYM dosmakepal
cmp byte[V8Mode],1
jne .noveg
call doveg
.noveg
mov ax,[cgram]
mov [tempco0],ax
test byte[scaddtype],00100000b
jz near .noaddition
test byte[scaddtype],10000000b
jnz near .noaddition
mov cx,[cgram]
mov ax,cx
and ax,001Fh
add al,[coladdr]
cmp al,01Fh
jb .noadd
mov al,01Fh
.noadd
mov bx,ax
mov ax,cx
shr ax,5
and ax,001Fh
add al,[coladdg]
cmp al,01Fh
jb .noaddb
mov al,01Fh
.noaddb
shl ax,5
add bx,ax
mov ax,cx
shr ax,10
and ax,001Fh
add al,[coladdb]
cmp al,01Fh
jb .noaddc
mov al,01Fh
.noaddc
shl ax,10
add bx,ax
mov [cgram],bx
.noaddition
cmp byte[Palette0],0
je .nocol0mod
mov word[cgram],0
.nocol0mod
NEWSYM makepalb
mov edi,cgram
mov ebx,prevpal
xor ah,ah
.loopa
mov cx,[edi]
push eax
push ebx
mov [ebx],cx
mov al,ah
mov dx,03C8h
out dx,al
mov ax,cx
and al,01Fh
mov bh,[maxbr]
mov bl,bh
mul bl
mov bl,15
div bl
shl al,1
mov dx,03C9h
add al,[gammalevel]
cmp al,63
jbe .nor
mov al,63
.nor
out dx,al
mov ax,cx
shr ax,5
and al,01Fh
mov bl,bh
mul bl
mov bl,15
div bl
shl al,1
add al,[gammalevel]
cmp al,63
jbe .nog
mov al,63
.nog
out dx,al
mov ax,cx
shr ax,10
and al,01Fh
mov bl,bh
mul bl
mov bl,15
div bl
shl al,1
add al,[gammalevel]
cmp al,63
jbe .nob
mov al,63
.nob
out dx,al
pop ebx
pop eax
add edi,2
add ebx,2
inc ah
jnz near .loopa
mov al,[maxbr]
mov [prevbright],al
mov ax,[tempco0]
mov [cgram],ax
cmp byte[MessageOn],0
je .nochange128
mov dx,03C8h
mov al,128
out dx,al
mov al,63
inc dx
out dx,al
out dx,al
out dx,al
mov dx,03C8h
mov al,128+64
out dx,al
mov al,0
inc dx
out dx,al
out dx,al
out dx,al
.nochange128
cmp byte[V8Mode],1
jne .noveg2
call dovegrest
.noveg2
ret
;*******************************************************
; ChangePal Sets up the palette
;*******************************************************
NEWSYM doschangepal
cmp byte[V8Mode],1
jne .noveg
call doveg
.noveg
mov ax,[cgram]
mov [tempco0],ax
test byte[scaddtype],00100000b
jz near .noaddition
test byte[scaddtype],10000000b
jnz near .noaddition
mov cx,[cgram]
mov ax,cx
and ax,001Fh
add al,[coladdr]
cmp al,01Fh
jb .noadd
mov al,01Fh
.noadd
mov bx,ax
mov ax,cx
shr ax,5
and ax,001Fh
add al,[coladdg]
cmp al,01Fh
jb .noaddb
mov al,01Fh
.noaddb
shl ax,5
add bx,ax
mov ax,cx
shr ax,10
and ax,001Fh
add al,[coladdb]
cmp al,01Fh
jb .noaddc
mov al,01Fh
.noaddc
shl ax,10
add bx,ax
mov [cgram],bx
.noaddition
cmp byte[Palette0],0
je .nocol0mod
mov word[cgram],0
.nocol0mod
; check if brightness differs
mov al,[maxbr]
cmp al,[prevbright]
jne near makepalb
; check for duplicate palette (Compare prevpal with cgram)
mov ebx,prevpal
mov edi,cgram
xor ah,ah
.loopa
mov cx,[edi]
cmp cx,[ebx]
je .nochange
push eax
push ebx
push eax
pop eax
mov [ebx],cx
mov al,ah
mov dx,03C8h
out dx,al
mov ax,cx
and al,01Fh
mov bh,[maxbr]
mov bl,bh
mul bl
mov bl,15
div bl
shl al,1
add al,[gammalevel]
cmp al,63
jbe .nor
mov al,63
.nor
inc dx
out dx,al
mov ax,cx
shr ax,5
and al,01Fh
mov bl,bh
mul bl
mov bl,15
div bl
shl al,1
add al,[gammalevel]
cmp al,63
jbe .nog
mov al,63
.nog
out dx,al
mov ax,cx
shr ax,10
and al,01Fh
mov bl,bh
mul bl
mov bl,15
div bl
shl al,1
add al,[gammalevel]
cmp al,63
jbe .nob
mov al,63
.nob
out dx,al
pop ebx
pop eax
.nochange
add edi,2
add ebx,2
inc ah
jnz near .loopa
mov ax,[tempco0]
mov [cgram],ax
cmp byte[MessageOn],0
je .nochange128
mov dx,03C8h
mov al,128
out dx,al
mov al,63
inc dx
out dx,al
out dx,al
out dx,al
.nochange128
cmp byte[V8Mode],1
jne .noveg2
call dovegrest
.noveg2
ret
%endif
;*******************************************************
; CopyVid Copies buffer into video
;*******************************************************
NEWSYM showfps
mov ax,60
cmp byte[romispal],0
je .ntsc
mov ax,50
.ntsc
inc byte[curfps]
cmp byte[nextframe],al
jb .nofrc
mov cl,[curfps]
mov [lastfps],cl
mov cl,[curfps2]
mov [lastfps2],cl
mov byte[curfps],0
mov byte[curfps2],0
sub byte[nextframe],al
.nofrc
mov cl,[SloMo]
or cl,cl
jz .noslw
inc cl
div cl
.noslw
mov cl,al
cmp byte[cbitmode],1
je near .do16b
%ifdef __MSDOS__
call displayfpspal
%endif
movzx ax,byte[lastfps]
mov bl,10
div bl
shl al,4
add ah,al
mov al,ah
mov esi,208*288+32
add esi,[vidbuffer]
push ecx
call outputhex
mov esi,208*288+48
add esi,[vidbuffer]
mov al,29h
call outputchar
pop ecx
mov al,cl
mov bl,10
xor ah,ah
div bl
shl al,4
add ah,al
mov al,ah
mov esi,208*288+56
add esi,[vidbuffer]
call outputhex
ret
.do16b
mov esi,208*288*2+48*2
add esi,[vidbuffer]
mov al,[lastfps]
push ecx
xor ecx,ecx
.strloop
xor ah,ah
add al,48
sub esi,8*2
.asciiloop16b
cmp al,58
jb .h2adone16b
inc ah
sub al,10
jmp .asciiloop16b
.h2adone16b
mov cl,al
mov al,[ASCII2Font+ecx]
call outputchar16b
mov al,ah
or al,al
jnz .strloop
mov esi,208*288*2+48*2
add esi,[vidbuffer]
mov al,41 ; '/'
call outputchar16b
pop ecx
mov al,cl
mov bl,10
xor ah,ah
div bl
shl al,4
add ah,al
mov al,ah
mov esi,208*288*2+56*2
add esi,[vidbuffer]
call outputhex16
ret
SECTION .bss
NEWSYM tempoffset, resw 1
NEWSYM Testval, resd 1
SECTION .text
EXTSYM TwelveHourClock
NEWSYM ClockOutput
cmp byte[cbitmode],1
je near .do16b3
.no16b3
%ifdef __MSDOS__
call displayfpspal
%endif
mov esi,215*288+32+192
add esi,[vidbuffer]
cmp byte[ForceNonTransp],1
je .menuon8
cmp byte[ClockBox],1
jne near .do8b
.menuon8
mov ebx,7
.loop2
mov ecx,12
mov byte[esi-1],0C0h
.loop
mov dword[esi],0C0C0C0C0h
add esi,4
.nobox8
dec ecx
jnz .loop
add esi,288-48
dec ebx
jnz .loop2
jmp .do8b
.do16b3
mov esi,215*288*2+32*2+192*2
add esi,[vidbuffer]
cmp byte[ForceNonTransp],1
je .menuon16
cmp byte[ClockBox],1
jne .do8b
.menuon16
mov ebx,7
.loop2b
mov ecx,24
mov word[esi-2],0
mov word[esi-2+75036*4],0
.loopb
mov dword[esi],0
mov dword[esi+75036*4],0
add esi,4
.nobox16
dec ecx
jnz .loopb
add esi,288*2-48*2
dec ebx
jnz .loop2b
.do8b
call GetTimeInSeconds
xor edx,edx
mov ebx,60
div ebx
push eax
; edx = seconds
mov eax,edx
xor edx,edx
mov ebx,10
div ebx
mov esi,216*288+32+228
call .output
pop eax
mov ebx,60
xor edx,edx
div ebx
push eax
; edx = minutes
mov eax,edx
xor edx,edx
mov ebx,10
div ebx
mov esi,216*288+32+210
call .output
pop eax
; eax = hours
cmp byte[TwelveHourClock],1
jne .no12hour
; check to see if it's 12 PM
cmp eax,12
jbe .not12pm
sub eax,12
.not12pm
cmp eax,0
jne .no12hour
add eax,12
.no12hour
xor edx,edx
mov ebx,10
div ebx
mov esi,216*288+32+192
call .output
cmp byte[cbitmode],1
je .do16b2
.no16b4
mov esi,216*288+32+222
add esi,[vidbuffer]
xor eax,eax
add al,':'
mov al,[ASCII2Font+eax]
pushad
call outputchar5x5
popad
mov esi,216*288+32+204
add esi,[vidbuffer]
xor eax,eax
add al,':'
mov al,[ASCII2Font+eax]
pushad
call outputchar5x5
popad
ret
.do16b2
mov esi,216*288*2+32*2+222*2
add esi,[vidbuffer]
xor eax,eax
add al,':'
mov al,[ASCII2Font+eax]
pushad
call outputchar16b5x5
popad
mov esi,216*288*2+32*2+204*2
add esi,[vidbuffer]
xor eax,eax
add al,':'
mov al,[ASCII2Font+eax]
pushad
call outputchar16b5x5
popad
ret
.output
; output char value at al and dl
cmp byte[cbitmode],1
je .do16b
.no16b5
add esi,[vidbuffer]
and eax,0FFh
add al,48
mov al,[ASCII2Font+eax]
pushad
call outputchar5x5
popad
xor eax,eax
mov al,dl
add al,48
mov al,[ASCII2Font+eax]
add esi,6
pushad
call outputchar5x5
popad
ret
.do16b
add esi,esi
add esi,[vidbuffer]
and eax,0FFh
add al,48
mov al,[ASCII2Font+eax]
pushad
call outputchar16b5x5
popad
xor eax,eax
mov al,dl
add al,48
mov al,[ASCII2Font+eax]
add esi,12
pushad
call outputchar16b5x5
popad
ret
SECTION .bss
NEWSYM SoundTest, resb 1
blahrnr resw 1
SECTION .text
NEWSYM hextestoutput
mov dx,[bg3scroly]
; and dx,0F8h
shr edx,3
shl edx,6
xor eax,eax
mov ax,[bg3ptr]
add ax,dx
xor edx,edx
mov dx,[bg3scrolx]
and dx,0F8h
shr edx,3
shl edx,1
add ax,dx
mov dx,[bg3scrolx]
test dx,8000h
jz .nooma
and dx,0F000h
shr dx,5
add ax,dx
.nooma
add eax,40h
mov edx,eax
mov [Testval],edx
%ifdef __MSDOS__
call displayfpspal
%endif
mov esi,[vram]
mov ax,0
mov ecx,400h
.loop
; mov word[esi],ax
add esi,2
dec ecx
jnz .loop
inc word[blahrnr]
mov esi,216*288+32
add esi,[vidbuffer]
xor eax,eax
; 4F00h
mov ebx,[C4Ram]
mov ebx,[vram]
mov al,[DecompAPtr+1h]
call outputhex
mov esi,216*288+32+16
add esi,[vidbuffer]
xor eax,eax
mov ebx,[C4Ram]
mov ebx,[vram]
mov al,[DecompAPtr]
call outputhex
mov esi,216*288+70
add esi,[vidbuffer]
xor eax,eax
mov ebx,[C4Ram]
mov al,[bg1objptr+1]
call outputhex
mov esi,216*288+70+16
add esi,[vidbuffer]
xor eax,eax
mov ebx,[C4Ram]
mov al,[bg1objptr]
call outputhex
mov esi,216*288+108
add esi,[vidbuffer]
xor eax,eax
mov ebx,[C4Ram]
mov al,[ebx+4]
call outputhex
mov esi,216*288+108+16
add esi,[vidbuffer]
xor eax,eax
mov ebx,[C4Ram]
mov al,[ebx+9]
call outputhex
mov esi,216*288+146
add esi,[vidbuffer]
xor eax,eax
mov ebx,[C4Ram]
mov al,[ebx+10]
call outputhex
xor eax,eax
mov esi,216*288+146+16
add esi,[vidbuffer]
or al,[bg1scroly]
mov ebx,[C4Ram]
mov al,[ebx+11]
call outputhex
ret
SECTION .bss
NEWSYM SoundPlayed0, resb 1
NEWSYM SoundPlayed1, resb 1
NEWSYM SoundPlayed2, resb 1
NEWSYM SoundPlayed3, resb 1
NEWSYM SoundPlayed4, resb 1
NEWSYM SoundPlayed5, resb 1
NEWSYM SoundPlayed6, resb 1
NEWSYM SoundPlayed7, resb 1
SECTION .text
NEWSYM ShowSound
add esi,[vidbuffer]
.next
mov [esi],ebx
mov [esi+4],ebx
mov [esi+8],bx
sub esi,288
dec al
jnz .next
ret
NEWSYM sounddisplay
%ifdef __MSDOS__
call displayfpspal
%endif
push esi
push ebx
push eax
mov ebx,80808080h
cmp byte[SoundPlayed0],0
je .nosnd0
mov al,[SoundPlayed0]
mov esi,223*288+16
call ShowSound
sub byte[SoundPlayed0],2
.nosnd0
cmp byte[SoundPlayed1],0
je .nosnd1
mov al,[SoundPlayed1]
mov esi,223*288+28
call ShowSound
sub byte[SoundPlayed1],2
.nosnd1
cmp byte[SoundPlayed2],0
je .nosnd2
mov al,[SoundPlayed2]
mov esi,223*288+40
call ShowSound
sub byte[SoundPlayed2],2
.nosnd2
cmp byte[SoundPlayed3],0
je .nosnd3
mov al,[SoundPlayed3]
mov esi,223*288+52
call ShowSound
sub byte[SoundPlayed3],2
.nosnd3
cmp byte[SoundPlayed4],0
je .nosnd4
mov al,[SoundPlayed4]
mov esi,223*288+64
call ShowSound
sub byte[SoundPlayed4],2
.nosnd4
cmp byte[SoundPlayed5],0
je .nosnd5
mov al,[SoundPlayed5]
mov esi,223*288+76
call ShowSound
sub byte[SoundPlayed5],2
.nosnd5
cmp byte[SoundPlayed6],0
je .nosnd6
mov al,[SoundPlayed6]
mov esi,223*288+88
call ShowSound
sub byte[SoundPlayed6],2
.nosnd6
cmp byte[SoundPlayed7],0
je .nosnd7
mov al,[SoundPlayed7]
mov esi,223*288+100
call ShowSound
sub byte[SoundPlayed7],2
.nosnd7
pop eax
pop esi
pop ebx
ret
NEWSYM waitvsync
mov dx,3DAh ;VGA status port
;.loop
; in al,dx
; test al,8 ;check VR bit
; jnz .loop ;in middle of VR, better wait for next one
.loop2
in al,dx
test al,8
jz .loop2 ;updating the screen
ret
SECTION .data
NEWSYM prevengval, db 10
SECTION .text
NEWSYM copyvid
mov dword[.sdrawptr],0
; Test if add table needs updating
cmp byte[cbitmode],0
je .notatud
cmp byte[vesa2red10],0
je .notatud
mov al,[newengen]
cmp [prevengval],al
je .notatud
mov [prevengval],al
call genfulladdtab
jmp .notatud
.redadd
call genfulladdtabng
.notatud
cmp dword[MessageOn],0
je near .nomsg
cmp byte[cbitmode],1
je near .do16b
.no16b
mov edi,[Msgptr]
mov esi,192*288+32
add esi,[vidbuffer]
cmp edi,CSStatus
je .fivex5b
cmp byte[SmallMsgText],1
je .smallmsgtext
call OutputGraphicString.no16bit
jmp .nfivex5b
.fivex5b
call OutputGraphicString5x5
mov edi,CSStatus2
mov esi,200*288+32
add esi,[vidbuffer]
call OutputGraphicString5x5
mov edi,CSStatus3
mov esi,208*288+32
add esi,[vidbuffer]
call OutputGraphicString5x5
mov edi,CSStatus4
mov esi,216*288+32
add esi,[vidbuffer]
call OutputGraphicString5x5
jmp .nfivex5b
.smallmsgtext
call OutputGraphicString5x5
.nfivex5b
dec dword[MessageOn]
jnz near .nomsg
%ifdef __MSDOS__
cmp byte[cbitmode],1
je near .nomsg
call dosmakepal
%endif
jmp .nomsg
.do16b
mov edi,[Msgptr]
mov esi,192*288*2+32*2
add esi,[vidbuffer]
cmp edi,CSStatus
je .fivex5
cmp byte[SmallMsgText],1
je .smallmsgtext2
call OutputGraphicString16b
jmp .nfivex5
.fivex5
call OutputGraphicString16b5x5
mov edi,CSStatus2
mov esi,200*288*2+32*2
add esi,[vidbuffer]
call OutputGraphicString16b5x5
mov edi,CSStatus3
mov esi,208*288*2+32*2
add esi,[vidbuffer]
call OutputGraphicString16b5x5
mov edi,CSStatus4
mov esi,216*288*2+32*2
add esi,[vidbuffer]
call OutputGraphicString16b5x5
jmp .nfivex5
.smallmsgtext2
call OutputGraphicString16b5x5
.nfivex5
dec dword[MessageOn]
.nomsg
cmp byte[MovieProcessing],0
jz .nomovie4
cmp byte[MovieDisplayFrame],0
jz .nomovie4
pushad
call GetMovieFrameStr
popad
mov edi,MovieFrameStr
cmp byte[cbitmode],1
jne .not16bframe
mov esi,216*288*2+32*2
add esi,[vidbuffer]
call OutputGraphicString16b5x5
jmp .nomovie4
.not16bframe
mov esi,216*288+32
add esi,[vidbuffer]
call OutputGraphicString5x5
.nomovie4
jmp vidpaste
SECTION .bss
.sdrawptr resd 1
SECTION .text
NEWSYM vidpaste
%ifdef __MSDOS__
cmp byte[vsyncon],0
je .novsync
cmp byte[Triplebufen],0
jne .novsync
cmp byte[curblank],0h
jne .novsync
call waitvsync
.novsync
cmp byte[cbitmode],1
je .nopal
cmp byte[curblank],0
jne .nopal
call doschangepal
.nopal
%endif
cmp byte[FPSOn],0
je .nofps
cmp byte[curblank],0
jne .nofps
call showfps
.nofps
cmp byte[TimerEnable],0
je .noclock
cmp byte[ShowTimer],0
je .noclock
call ClockOutput
.noclock
cmp byte[device2],2
je near .drawss
.returnfromdraw
mov ax,[resolutn]
cmp [prevresolutn],ax
je .noclear
mov [prevresolutn],ax
%ifdef __MSDOS__
call DOSClearScreen
%endif
.noclear
jmp DrawScreen
.drawss
%ifdef __MSDOS__
cmp byte[cbitmode],1
je .noss8b
call superscopepal
.noss8b
%endif
xor eax,eax
mov al,[mouseyloc]
mov ebx,288
mul ebx
mov esi,[vidbuffer]
mov edi,SScopeCursor
xor ebx,ebx
mov bl,[mousexloc]
add ebx,6
cmp byte[cbitmode],1
je near .ss16b
mov cl,20
.ssloop
mov ch,20
.ssloop2
cmp byte[edi],0
je .nodraw
mov edx,eax
add edx,ebx
sub edx,288*10
jb .nodraw
mov byte[esi+edx],128+16
.nodraw
inc ebx
inc edi
dec ch
jnz .ssloop2
sub ebx,20
add eax,288
dec cl
jnz .ssloop
jmp .returnfromdraw
.ss16b
push ebx
mov cl,[vesa2_rpos]
mov bx,31
shl bx,cl
mov [.SSRedCo],bx
pop ebx
shl eax,1
shl ebx,1
mov cl,20
.ssloopb
mov ch,20
.ssloopb2
cmp byte[edi],0
je .nodrawb
mov edx,eax
add edx,ebx
sub edx,288*10*2
jb .nodrawb
push eax
mov ax,[.SSRedCo]
mov [esi+edx],ax
pop eax
.nodrawb
add ebx,2
inc edi
dec ch
jnz .ssloopb2
sub ebx,40
add eax,288*2
dec cl
jnz .ssloopb
jmp .returnfromdraw
SECTION .bss
.SSRedCo resw 1
SECTION .data
NEWSYM MsgCount, dd 120 ; How long message will stay (PAL = 100)
SECTION .bss
NEWSYM lastfps, resb 1 ; stores the last fps encountered
NEWSYM lastfps2, resb 1 ; stores the last fps encountered
NEWSYM curfps2, resb 1 ; current video refresh fps
NEWSYM Msgptr, resd 1 ; Pointer to message
NEWSYM MessageOn, resd 1 ; Message On Countdown
NEWSYM FPSOn, resb 1
SECTION .data
prevresolutn dd 224
NEWSYM SScopeCursor
db 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0
db 0,0,0,0,0,1,1,0,0,1,0,0,1,1,0,0,0,0,0,0
db 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0
db 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0
db 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0
db 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0
db 0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0
db 0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
db 0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0
db 0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0
db 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0
db 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0
db 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0
db 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0
db 0,0,0,0,0,1,1,0,0,1,0,0,1,1,0,0,0,0,0,0
db 0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,1,0,0,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,0,0,0,0