3441 lines
65 KiB
NASM
3441 lines
65 KiB
NASM
;Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
|
|
;
|
|
;http://www.zsnes.com
|
|
;http://sourceforge.net/projects/zsnes
|
|
;
|
|
;This program is free software; you can redistribute it and/or
|
|
;modify it under the terms of the GNU General Public License
|
|
;as published by the Free Software Foundation; either
|
|
;version 2 of the License, or (at your option) any later
|
|
;version.
|
|
;
|
|
;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,fnamest,En2xSaI
|
|
EXTSYM gammalevel,hirestiledat,ignor512,latchx,latchy,maxbr,ForceNewGfxOff
|
|
EXTSYM newengen,nextframe,objptr,pressed,prevpal,res512switch,res640,resolutn
|
|
EXTSYM romispal,scaddtype,scanlines,selcA000,snesmouse,t1cc,vcache4b,vesa2_bpos
|
|
EXTSYM spritetablea,vesa2_clbit,vesa2_gpos,vesa2_rpos,vesa2red10,vesa2selec
|
|
EXTSYM vidbuffer,vram,vsyncon,KeyStateSelct,soundon,Open_File,Read_File
|
|
EXTSYM Close_File,Create_File,Write_File,Get_File_Date,Triplebufen,makepal
|
|
EXTSYM changepal,saveselectpal,displayfpspal,superscopepal,DrawScreen,MMXSupport
|
|
EXTSYM Get_MouseData,Get_MousePositionDisplacement,GUIEnableTransp,GUIFontData
|
|
EXTSYM StopSound,StartSound,PrevPicture,File_Seek,File_Seek_End,nggposng
|
|
EXTSYM Palette0,GetTimeInSeconds,bg3ptr,bg3scroly,bg3scrolx,C4Ram,dsp1array
|
|
EXTSYM genfulladdtab,genfulladdtabng,TimerEnable,ShowTimer,debugdisble,GUIOn
|
|
EXTSYM FilteredGUI,HalfTrans,SmallMsgText,ClearScreen,Mode7HiRes,mosenng,mosszng
|
|
EXTSYM intrlng,mode7hr,newgfx16b,vesa2_clbitng,vesa2_clbitng2,granadd,CSStatus
|
|
EXTSYM CSStatus2,CSStatus3,SpecialLine,Clear2xSaIBuffer,vidbufferofsb,bg1scroly
|
|
EXTSYM bg1objptr,DecompAPtr,HalfTransB,HalfTransC,cur_zst_size,old_zst_size
|
|
EXTSYM MovieProcessing,mzt_chdir,UpChdir,MovieFrameStr,GetMovieFrameStr
|
|
EXTSYM MovieDisplayFrame
|
|
|
|
%ifdef __MSDOS__
|
|
EXTSYM SB_blank
|
|
%endif
|
|
|
|
SECTION .bss
|
|
NEWSYM ScreenScale, resb 1 ; If horizontal is scaled or not
|
|
NEWSYM TempDebugV, resw 1 ; Temporary Debugging variable
|
|
SECTION .text
|
|
|
|
|
|
%macro MMXStuff 0
|
|
%%1
|
|
movq mm0,[esi]
|
|
movq [es:edi],mm0
|
|
movq mm1,[esi+8]
|
|
movq [es:edi+8],mm1
|
|
add esi,16
|
|
add edi,16
|
|
dec ecx
|
|
jnz %%1
|
|
%endmacro
|
|
|
|
%macro FPUStuff 1
|
|
FILD QWORD [ESI+%1*16]
|
|
FILD QWORD [ESI+8+%1*16]
|
|
FISTP QWORD [ES:EDI+8+%1*16]
|
|
FISTP QWORD [ES:EDI+%1*16]
|
|
%endmacro
|
|
|
|
%MACRO CopyFPU 0
|
|
%ENDMACRO
|
|
|
|
%include "video/2xsaimmx.inc"
|
|
%include "video/copyvid.inc"
|
|
|
|
SECTION .text
|
|
NEWSYM FPUZero
|
|
%if 0
|
|
|
|
; omg this is lame ;P
|
|
mov [.Zero],eax
|
|
mov [.Zero+4],eax
|
|
mov [.Zero2],eax
|
|
mov [.Zero2+4],eax
|
|
.TopOfLoop
|
|
FILD QWORD [.Zero]
|
|
FILD QWORD [.Zero2]
|
|
FXCH
|
|
FISTP QWORD [EDI]
|
|
FISTP QWORD [EDI+8]
|
|
ADD EDI,16
|
|
DEC ECX
|
|
JNZ .TopOfLoop
|
|
%else
|
|
fld1
|
|
fsub st0,st0
|
|
.TopOfLoop
|
|
fst qword [edi]
|
|
fst qword [edi+8]
|
|
add edi,16
|
|
dec ecx
|
|
jnz .TopOfLoop
|
|
fstp st0
|
|
%endif
|
|
ret
|
|
|
|
%if 0
|
|
SECTION .bss
|
|
.Zero resd 2
|
|
.Zero2 resd 2
|
|
SECTION .text
|
|
%endif
|
|
|
|
;*******************************************************
|
|
; ShowVideo Processes & displays video
|
|
;*******************************************************
|
|
|
|
NEWSYM showvideo
|
|
push esi
|
|
push edi
|
|
push edx
|
|
push ebx
|
|
push ebp
|
|
inc byte[ccud]
|
|
mov bl,byte[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 processmouse
|
|
push esi
|
|
push edi
|
|
push edx
|
|
push ebx
|
|
call Get_MouseData
|
|
mov [mousebuttons],bx
|
|
cmp byte[snesmouse],3
|
|
jne .ss
|
|
cmp byte[pressed+13],0
|
|
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
|
|
call Get_MousePositionDisplacement
|
|
cmp byte[snesmouse],4
|
|
je .le
|
|
cmp byte[snesmouse],3
|
|
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[snesmouse],4
|
|
je .le2
|
|
cmp byte[snesmouse],3
|
|
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,13h,19h,1Fh,18h,18h,0Bh,19h,00h,00h,00h,00h,00h,00h,00h,00h
|
|
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,00h,00h,00h,00h,00h,00h,00h
|
|
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,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
|
|
db 0,0,0,0,0,0,0,0
|
|
db 01111100b,11000110b,11001110b,11010110b ; 0, 1
|
|
db 11100110b,11000110b,01111100b,00000000b
|
|
db 00011000b,00111000b,01111000b,00011000b ; 1, 2
|
|
db 00011000b,00011000b,01111110b,00000000b
|
|
db 01111100b,11000110b,00001100b,00011000b ; 2, 3
|
|
db 00110000b,01100110b,11111110b,00000000b
|
|
db 01111100b,11000110b,00000110b,00111100b ; 3, 4
|
|
db 00000110b,11000110b,01111100b,00000000b
|
|
db 00111100b,01101100b,11001100b,11111110b ; 4, 5
|
|
db 00001100b,00001100b,00001100b,00000000b
|
|
db 11111110b,11000000b,11000000b,11111100b ; 5, 6
|
|
db 00000110b,11000110b,01111100b,00000000b
|
|
db 00111100b,01100000b,11000000b,11111100b ; 6, 7
|
|
db 11000110b,11000110b,01111100b,00000000b
|
|
db 11111110b,11000110b,00000110b,00001100b ; 7, 8
|
|
db 00011000b,00011000b,00011000b,00000000b
|
|
db 01111100b,11000110b,11000110b,01111100b ; 8, 9
|
|
db 11000110b,11000110b,01111100b,00000000b
|
|
db 01111100b,11000110b,11000110b,01111110b ; 9, A
|
|
db 00000110b,11000110b,01111100b,00000000b
|
|
db 00111000b,01101100b,11000110b,11111110b ; A, B
|
|
db 11000110b,11000110b,11000110b,00000000b
|
|
db 11111100b,11000110b,11000110b,11111100b ; B, C
|
|
db 11000110b,11000110b,11111100b,00000000b
|
|
db 01111100b,11000110b,11000000b,11000000b ; C, D
|
|
db 11000000b,11000110b,01111100b,00000000b
|
|
db 11111100b,11000110b,11000110b,11000110b ; D, E
|
|
db 11000110b,11000110b,11111100b,00000000b
|
|
db 11111110b,11000000b,11000000b,11111000b ; E, F
|
|
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
|
|
db 00100100b
|
|
db 00011000b
|
|
db 00111010b ; &, 2F
|
|
db 01000100b
|
|
db 01000110b
|
|
db 00111010b
|
|
db 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 byte[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 byte[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 word[esi],ax
|
|
mov word[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
|
|
|
|
NEWSYM outputchar16b5x52
|
|
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 word[esi-288*2],0
|
|
mov word[esi+2-288*2],0
|
|
mov word[esi+4-288*2],0
|
|
mov word[esi+6-288*2],0
|
|
mov word[esi+8-288*2],0
|
|
mov word[esi+10-288*2],0
|
|
mov word[esi-288*2+75036*4],0
|
|
mov word[esi+2-288*2+75036*4],0
|
|
mov word[esi+4-288*2+75036*4],0
|
|
mov word[esi+6-288*2+75036*4],0
|
|
mov word[esi+8-288*2+75036*4],0
|
|
mov word[esi+10-288*2+75036*4],0
|
|
mov cl,5
|
|
.loopa
|
|
mov ah,[edi]
|
|
mov ch,5
|
|
.loopb
|
|
mov word[esi],0
|
|
mov word[esi+2],0
|
|
mov word[esi+75036*4],0
|
|
mov word[esi+2+75036*4],0
|
|
test ah,80h
|
|
jz .nowrite
|
|
push eax
|
|
mov ax,[textcolor16b]
|
|
mov word[esi],ax
|
|
mov word[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
|
|
mov word[esi],0
|
|
mov word[esi+2],0
|
|
mov word[esi+4],0
|
|
mov word[esi+6],0
|
|
mov word[esi+8],0
|
|
mov word[esi+10],0
|
|
mov word[esi+75036*4],0
|
|
mov word[esi+2+75036*4],0
|
|
mov word[esi+4+75036*4],0
|
|
mov word[esi+6+75036*4],0
|
|
mov word[esi+8+75036*4],0
|
|
mov word[esi+10+75036*4],0
|
|
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 word[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 word[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 word[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 word[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
|
|
|
|
NEWSYM OutputGraphicString16b5x52
|
|
xor eax,eax
|
|
.nextstr
|
|
mov al,[edi]
|
|
cmp al,0
|
|
je .nomore
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar16b5x52
|
|
add esi,12
|
|
inc edi
|
|
jmp .nextstr
|
|
.nomore
|
|
ret
|
|
|
|
NEWSYM OutputGraphicStringb
|
|
cmp byte[cbitmode],1
|
|
je near .do16b
|
|
xor eax,eax
|
|
cmp byte[edi-1],1
|
|
je .dir
|
|
cmp byte[edi-1],2
|
|
je near .drive
|
|
sub esi,8
|
|
.nextstr
|
|
mov al,[edi]
|
|
cmp al,0
|
|
je .nomore
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar
|
|
add esi,8
|
|
inc edi
|
|
jmp .nextstr
|
|
.nomore
|
|
ret
|
|
.dir
|
|
sub esi,8
|
|
mov al,'<'
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar
|
|
add esi,8
|
|
.nextstr2
|
|
mov al,[edi]
|
|
cmp al,0
|
|
je .nomore2
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar
|
|
add esi,8
|
|
inc edi
|
|
jmp .nextstr2
|
|
.nomore2
|
|
mov al,'>'
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar
|
|
ret
|
|
.drive
|
|
sub esi,8
|
|
mov al,'['
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar
|
|
add esi,8
|
|
.nextstr3
|
|
mov al,[edi]
|
|
cmp al,0
|
|
je .nomore3
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar
|
|
add esi,8
|
|
inc edi
|
|
jmp .nextstr3
|
|
.nomore3
|
|
mov al,']'
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar
|
|
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 word[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 word[textcolor16b],ax
|
|
.no131
|
|
NEWSYM OutputGraphicString16bb
|
|
xor eax,eax
|
|
cmp byte[edi-1],1
|
|
je .dir
|
|
cmp byte[edi-1],2
|
|
je near .drive
|
|
xor eax,eax
|
|
sub esi,16
|
|
.nextstr
|
|
mov al,[edi]
|
|
cmp al,0
|
|
je .nomore
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar16b
|
|
add esi,16
|
|
inc edi
|
|
jmp .nextstr
|
|
.nomore
|
|
ret
|
|
.dir
|
|
sub esi,16
|
|
mov al,'<'
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar16b
|
|
add esi,16
|
|
.nextstr2
|
|
mov al,[edi]
|
|
cmp al,0
|
|
je .nomore2
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar16b
|
|
add esi,16
|
|
inc edi
|
|
jmp .nextstr2
|
|
.nomore2
|
|
mov al,'>'
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar16b
|
|
ret
|
|
.drive
|
|
sub esi,16
|
|
mov al,'['
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar16b
|
|
add esi,16
|
|
.nextstr3
|
|
mov al,[edi]
|
|
cmp al,0
|
|
je .nomore3
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar16b
|
|
add esi,16
|
|
inc edi
|
|
jmp .nextstr3
|
|
.nomore3
|
|
mov al,']'
|
|
mov al,[ASCII2Font+eax]
|
|
call outputchar16b
|
|
ret
|
|
|
|
;*******************************************************
|
|
; Save Select Allows user to select save state slot
|
|
;*******************************************************
|
|
; For Save State
|
|
|
|
SECTION .bss
|
|
NEWSYM csounddisable, resb 1
|
|
NEWSYM statefileloc, resd 1
|
|
newestfileloc resb 1
|
|
newestfiledate resd 1
|
|
f3menuen resb 1
|
|
PrevPictureVal resb 1
|
|
CurPictureVal resb 1
|
|
SECTION .text
|
|
|
|
NEWSYM drawhline
|
|
.loop
|
|
mov byte[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 byte[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
|
|
|
|
%macro determinenewhelp 2
|
|
mov bl,%1
|
|
mov byte[fnamest+eax],%2
|
|
call DetermineNew
|
|
%endmacro
|
|
|
|
DetermineNew:
|
|
push eax
|
|
push ebx
|
|
mov edx,fnamest+1
|
|
call Open_File
|
|
jc near .nodraw
|
|
mov bx,ax
|
|
mov edx,fnamest+1
|
|
call Get_File_Date
|
|
%ifdef __MSDOS__
|
|
shl edx,16
|
|
mov dx,cx
|
|
%endif
|
|
push edx
|
|
call Close_File
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
; date = edx, position = bl
|
|
cmp edx,[newestfiledate]
|
|
jbe .notlatest
|
|
mov [newestfiledate],edx
|
|
mov [newestfileloc],bl
|
|
.notlatest
|
|
ret
|
|
.nodraw
|
|
pop ebx
|
|
pop eax
|
|
ret
|
|
|
|
DetermineNewest:
|
|
mov dword[newestfiledate],0
|
|
mov byte[newestfileloc],0
|
|
|
|
determinenewhelp 0,'t'
|
|
determinenewhelp 1,'1'
|
|
determinenewhelp 2,'2'
|
|
determinenewhelp 3,'3'
|
|
determinenewhelp 4,'4'
|
|
determinenewhelp 5,'5'
|
|
determinenewhelp 6,'6'
|
|
determinenewhelp 7,'7'
|
|
determinenewhelp 8,'8'
|
|
determinenewhelp 9,'9'
|
|
ret
|
|
|
|
GetPicture:
|
|
mov cl,[CurPictureVal]
|
|
cmp [PrevPictureVal],cl
|
|
jne .notskip
|
|
ret
|
|
.notskip
|
|
mov [PrevPictureVal],cl
|
|
mov edx,PrevPicture
|
|
mov ecx,64*56*2
|
|
.loop
|
|
mov byte[edx],0
|
|
inc edx
|
|
dec ecx
|
|
jnz .loop
|
|
mov edx,fnamest+1
|
|
call Open_File
|
|
jc near .nodraw2
|
|
mov bx,ax
|
|
xor cx,cx
|
|
xor dx,dx
|
|
call File_Seek_End
|
|
shl edx,16
|
|
mov dx,ax
|
|
push eax
|
|
sub edx,64*56*2 ;Size of thumbnail
|
|
mov eax,[cur_zst_size]
|
|
cmp edx,eax
|
|
je .draw
|
|
mov eax,[old_zst_size]
|
|
cmp edx,eax
|
|
je .draw
|
|
pop eax
|
|
jmp .nodraw
|
|
.draw
|
|
pop eax
|
|
mov ax,dx
|
|
shr edx,16
|
|
mov cx,dx
|
|
mov dx,ax
|
|
call File_Seek
|
|
mov ecx,64*56*2
|
|
mov edx,PrevPicture
|
|
call Read_File
|
|
.nodraw
|
|
call Close_File
|
|
.nodraw2
|
|
; 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 word[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
|
|
push eax
|
|
push ebx
|
|
mov edx,fnamest+1
|
|
call Open_File
|
|
jc near .nodraw
|
|
mov bx,ax
|
|
call Close_File
|
|
pop ebx
|
|
; draws a 10x10 filled box according to position bl and color dl
|
|
xor eax,eax
|
|
mov al,11
|
|
mul bl
|
|
mov esi,76+94*288
|
|
add esi,[vidbuffer]
|
|
add esi,eax
|
|
mov ecx,10
|
|
mov al,176
|
|
cmp [newestfileloc],bl
|
|
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
|
|
ret
|
|
.nodraw
|
|
pop ebx
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM drawfillboxsc16b
|
|
push eax
|
|
push ebx
|
|
mov edx,fnamest+1
|
|
call Open_File
|
|
jc near .nodraw
|
|
mov bx,ax
|
|
call Close_File
|
|
pop ebx
|
|
; draws a 10x10 filled box according to position bl and color dl
|
|
xor eax,eax
|
|
mov al,11
|
|
mul bl
|
|
mov esi,76*2+94*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,eax
|
|
add esi,eax
|
|
mov ecx,10
|
|
mov ax,[saveselect.allgrn]
|
|
cmp [newestfileloc],bl
|
|
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
|
|
ret
|
|
.nodraw
|
|
pop ebx
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM drawbox
|
|
; draws a box according to position bl and color dl
|
|
xor eax,eax
|
|
mov al,11
|
|
mul bl
|
|
mov esi,75+93*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+93*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 drawfillboxhelp 2
|
|
mov bl,%1
|
|
mov byte[fnamest+eax],%2
|
|
call drawfillboxsc
|
|
%endmacro
|
|
|
|
%macro drawfillboxhelp16b 2
|
|
mov bl,%1
|
|
mov byte[fnamest+eax],%2
|
|
call drawfillboxsc16b
|
|
%endmacro
|
|
|
|
|
|
NEWSYM saveselect
|
|
cmp byte[MovieProcessing],0
|
|
jz .nomovie
|
|
pushad
|
|
call mzt_chdir
|
|
popad
|
|
.nomovie
|
|
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
|
|
call saveselectpal
|
|
; draw a small blue box with a white border
|
|
mov esi,70+70*288
|
|
add esi,[vidbuffer]
|
|
mov ecx,150
|
|
mov al,70
|
|
.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
|
|
mov eax,[statefileloc]
|
|
mov bl,byte[fnamest+eax]
|
|
push ebx
|
|
call DetermineNewest
|
|
drawfillboxhelp 0,'t'
|
|
drawfillboxhelp 1,'1'
|
|
drawfillboxhelp 2,'2'
|
|
drawfillboxhelp 3,'3'
|
|
drawfillboxhelp 4,'4'
|
|
drawfillboxhelp 5,'5'
|
|
drawfillboxhelp 6,'6'
|
|
drawfillboxhelp 7,'7'
|
|
drawfillboxhelp 8,'8'
|
|
drawfillboxhelp 9,'9'
|
|
pop ebx
|
|
mov eax,[statefileloc]
|
|
mov byte[fnamest+eax],bl
|
|
|
|
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+108*288
|
|
add esi,[vidbuffer]
|
|
mov edi,.stringc
|
|
call OutputGraphicString
|
|
mov esi,75+118*288
|
|
add esi,[vidbuffer]
|
|
mov edi,.stringd
|
|
call OutputGraphicString
|
|
mov esi,75+128*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,70
|
|
call drawvline
|
|
mov esi,70+139*288
|
|
add esi,[vidbuffer]
|
|
mov ecx,150
|
|
call drawhline
|
|
mov esi,219+70*288
|
|
add esi,[vidbuffer]
|
|
mov ecx,70
|
|
call drawvline
|
|
mov esi,75+93*288
|
|
add esi,[vidbuffer]
|
|
mov ecx,111
|
|
call drawhline
|
|
mov esi,75+104*288
|
|
add esi,[vidbuffer]
|
|
mov ecx,111
|
|
call drawhline
|
|
mov esi,75+94*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+96*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 bl,0
|
|
mov ebx,[statefileloc]
|
|
mov al,byte[fnamest+ebx]
|
|
cmp al,'t'
|
|
jne .noT
|
|
mov bl,0
|
|
jmp .nexter
|
|
.noT
|
|
mov bl,al
|
|
sub bl,48
|
|
.nexter
|
|
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
|
|
call testpressed8b
|
|
test byte[pressed+1],1
|
|
jnz near .esc
|
|
test byte[pressed+28],1
|
|
jnz near .enter
|
|
mov ecx,2500
|
|
call delay
|
|
call testpressed8b
|
|
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
|
|
call testpressed8b
|
|
test byte[pressed+1],1
|
|
jnz near .esc
|
|
test byte[pressed+28],1
|
|
jnz near .enter
|
|
mov ecx,2500
|
|
call delay
|
|
call testpressed8b
|
|
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
|
|
cmp bl,0
|
|
jne .nozero
|
|
mov al,'t'
|
|
jmp .save
|
|
.nozero
|
|
add bl,48
|
|
mov al,bl
|
|
.save
|
|
mov ebx,[statefileloc]
|
|
mov byte[fnamest+ebx],al
|
|
.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
|
|
|
|
call makepal
|
|
mov byte[f3menuen],0
|
|
mov byte[ForceNonTransp],0
|
|
cmp byte[MovieProcessing],0
|
|
jz .nomovie2
|
|
pushad
|
|
call UpChdir
|
|
popad
|
|
.nomovie2
|
|
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+80*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
|
|
|
|
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,70
|
|
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
|
|
mov eax,[statefileloc]
|
|
mov bl,byte[fnamest+eax]
|
|
push ebx
|
|
call DetermineNewest
|
|
drawfillboxhelp16b 0,'t'
|
|
drawfillboxhelp16b 1,'1'
|
|
drawfillboxhelp16b 2,'2'
|
|
drawfillboxhelp16b 3,'3'
|
|
drawfillboxhelp16b 4,'4'
|
|
drawfillboxhelp16b 5,'5'
|
|
drawfillboxhelp16b 6,'6'
|
|
drawfillboxhelp16b 7,'7'
|
|
drawfillboxhelp16b 8,'8'
|
|
drawfillboxhelp16b 9,'9'
|
|
pop ebx
|
|
mov eax,[statefileloc]
|
|
mov byte[fnamest+eax],bl
|
|
|
|
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+108*288*2
|
|
add esi,[vidbuffer]
|
|
mov edi,.stringc
|
|
call OutputGraphicString16b
|
|
mov esi,75*2+118*288*2
|
|
add esi,[vidbuffer]
|
|
mov edi,.stringd
|
|
call OutputGraphicString16b
|
|
mov esi,75*2+128*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,70
|
|
call drawvline16b
|
|
mov esi,70*2+139*288*2
|
|
add esi,[vidbuffer]
|
|
mov ecx,150
|
|
call drawhline16b
|
|
mov esi,219*2+70*288*2
|
|
add esi,[vidbuffer]
|
|
mov ecx,70
|
|
call drawvline16b
|
|
mov esi,75*2+93*288*2
|
|
add esi,[vidbuffer]
|
|
mov ecx,111
|
|
call drawhline16b
|
|
mov esi,75*2+104*288*2
|
|
add esi,[vidbuffer]
|
|
mov ecx,111
|
|
call drawhline16b
|
|
mov esi,75*2+94*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+96*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 bl,0
|
|
mov ebx,[statefileloc]
|
|
mov al,byte[fnamest+ebx]
|
|
cmp al,'t'
|
|
jne .noT16b
|
|
mov bl,0
|
|
jmp .nexter16b
|
|
.noT16b
|
|
mov bl,al
|
|
sub bl,48
|
|
.nexter16b
|
|
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
|
|
mov [CurPictureVal],bl
|
|
pushad
|
|
mov eax,[statefileloc]
|
|
mov cl,byte[fnamest+eax]
|
|
push ecx
|
|
cmp bl,0
|
|
jne .nozero16b2
|
|
mov cl,'t'
|
|
jmp .save16b2
|
|
.nozero16b2
|
|
mov cl,bl
|
|
add cl,48
|
|
.save16b2
|
|
mov byte[fnamest+eax],cl
|
|
call GetPicture
|
|
pop ecx
|
|
mov eax,[statefileloc]
|
|
mov byte[fnamest+eax],cl
|
|
popad
|
|
|
|
mov dx,0FFFFh
|
|
call drawbox16b
|
|
mov ecx,2500
|
|
call delay
|
|
call testpressed8b
|
|
test byte[pressed+1],1
|
|
jnz near .esc16b
|
|
test byte[pressed+28],1
|
|
jnz near .enter16b
|
|
mov ecx,2500
|
|
call delay
|
|
call testpressed8b
|
|
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
|
|
call testpressed8b
|
|
test byte[pressed+1],1
|
|
jnz near .esc16b
|
|
test byte[pressed+28],1
|
|
jnz near .enter16b
|
|
mov ecx,2500
|
|
call delay
|
|
call testpressed8b
|
|
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
|
|
cmp bl,0
|
|
jne .nozero16b
|
|
mov al,'t'
|
|
jmp .save16b
|
|
.nozero16b
|
|
add bl,48
|
|
mov al,bl
|
|
.save16b
|
|
mov ebx,[statefileloc]
|
|
mov byte[fnamest+ebx],al
|
|
.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
|
|
cmp byte[MovieProcessing],0
|
|
jz .nomovie3
|
|
pushad
|
|
call UpChdir
|
|
popad
|
|
.nomovie3
|
|
ret
|
|
|
|
SECTION .data
|
|
.stringa db 'PLEASE SELECT',0
|
|
.stringb db 'SAVE STATE SLOT',0
|
|
.stringc db 'USE CURSOR KEYS',0
|
|
.stringd db 'TO MOVE AND',0
|
|
.stringe db 'ENTER TO SELECT',0
|
|
|
|
SECTION .bss
|
|
NEWSYM ForceNonTransp, resb 1
|
|
|
|
SECTION .text
|
|
|
|
NEWSYM testpressed8b
|
|
test byte[pressed+2],1
|
|
jz .no1
|
|
mov bl,1
|
|
.no1
|
|
test byte[pressed+3],1
|
|
jz .no2
|
|
mov bl,2
|
|
.no2
|
|
test byte[pressed+4],1
|
|
jz .no3
|
|
mov bl,3
|
|
.no3
|
|
test byte[pressed+5],1
|
|
jz .no4
|
|
mov bl,4
|
|
.no4
|
|
test byte[pressed+6],1
|
|
jz .no5
|
|
mov bl,5
|
|
.no5
|
|
test byte[pressed+7],1
|
|
jz .no6
|
|
mov bl,6
|
|
.no6
|
|
test byte[pressed+8],1
|
|
jz .no7
|
|
mov bl,7
|
|
.no7
|
|
test byte[pressed+9],1
|
|
jz .no8
|
|
mov bl,8
|
|
.no8
|
|
test byte[pressed+10],1
|
|
jz .no9
|
|
mov bl,9
|
|
.no9
|
|
test byte[pressed+11],1
|
|
jz .no0
|
|
mov bl,0
|
|
.no0
|
|
test byte[pressed+75],1
|
|
jz .noleft
|
|
cmp bl,0
|
|
je .noleft
|
|
dec bl
|
|
mov byte[pressed+75],2
|
|
.noleft
|
|
test byte[pressed+77],1
|
|
jz .noright
|
|
cmp bl,9
|
|
je .noright
|
|
inc bl
|
|
mov byte[pressed+77],2
|
|
.noright
|
|
%ifndef __MSDOS__
|
|
%ifdef __UNIXSDL__
|
|
test byte[pressed+92],1
|
|
%else
|
|
test byte[pressed+0CBh],1
|
|
%endif
|
|
jz .noleft2
|
|
cmp bl,0
|
|
je .noleft2
|
|
dec bl
|
|
%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
|
|
je .noright2
|
|
inc bl
|
|
%ifdef __UNIXSDL__
|
|
mov byte[pressed+94],2
|
|
%else
|
|
mov byte[pressed+0CDh],2
|
|
%endif
|
|
.noright2
|
|
;.nowin32
|
|
%endif
|
|
ret
|
|
|
|
;*******************************************************
|
|
; 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 word[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
|
|
blahblahblah resw 1
|
|
SECTION .text
|
|
|
|
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
|
|
|
|
SECTION .bss
|
|
NEWSYM tempco0, resw 1
|
|
SECTION .text
|
|
|
|
;*******************************************************
|
|
; 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
|
|
|
|
SECTION .bss
|
|
NEWSYM prevbright, resb 1 ; previous brightness
|
|
SECTION .text
|
|
|
|
;*******************************************************
|
|
; CopyVid Copies buffer into video
|
|
;*******************************************************
|
|
|
|
NEWSYM showfps
|
|
mov cl,50
|
|
cmp byte[romispal],0
|
|
jne .nontsc
|
|
mov cl,60
|
|
.nontsc
|
|
inc byte[curfps]
|
|
cmp byte[nextframe],cl
|
|
jb .nofrc
|
|
mov al,[curfps]
|
|
mov [lastfps],al
|
|
mov al,[curfps2]
|
|
mov [lastfps2],al
|
|
mov byte[curfps],0
|
|
mov byte[curfps2],0
|
|
sub byte[nextframe],cl
|
|
.nofrc
|
|
|
|
cmp byte[cbitmode],1
|
|
je near .do16b
|
|
|
|
call displayfpspal
|
|
|
|
mov al,[lastfps]
|
|
mov bl,10
|
|
xor ah,ah
|
|
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 al,[lastfps]
|
|
mov bl,10
|
|
xor ah,ah
|
|
div bl
|
|
shl al,4
|
|
add ah,al
|
|
mov al,ah
|
|
mov esi,208*288*2+32*2
|
|
add esi,[vidbuffer]
|
|
push ecx
|
|
call outputhex16
|
|
|
|
mov esi,208*288*2+48*2
|
|
add esi,[vidbuffer]
|
|
mov al,29h
|
|
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
|
|
|
|
.ng16b
|
|
mov byte[ngfont],1
|
|
|
|
mov al,[lastfps]
|
|
mov bl,10
|
|
xor ah,ah
|
|
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
|
|
|
|
SECTION .bss
|
|
NEWSYM spcdebugaddr, resd 1
|
|
NEWSYM tempoffset, resw 1
|
|
|
|
NEWSYM Testval, resd 1
|
|
SECTION .text
|
|
|
|
|
|
NEWSYM ClockOutput
|
|
cmp byte[cbitmode],1
|
|
je near .do16b3
|
|
.no16b3
|
|
mov byte[ngfont],1
|
|
call displayfpspal
|
|
mov esi,215*288+32+192
|
|
add esi,[vidbuffer]
|
|
mov ebx,7
|
|
.loop2
|
|
mov ecx,12
|
|
mov byte[esi-1],0C0h
|
|
.loop
|
|
mov dword[esi],0C0C0C0C0h
|
|
add esi,4
|
|
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]
|
|
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
|
|
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
|
|
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
|
|
|
|
NEWSYM ClockOutputB
|
|
cmp byte[cbitmode],1
|
|
je near .do16b3
|
|
.no16b3
|
|
mov byte[ngfont],1
|
|
call displayfpspal
|
|
mov esi,208*288+32+192
|
|
add esi,[vidbuffer]
|
|
mov ebx,7
|
|
.loop2
|
|
mov ecx,12
|
|
mov byte[esi-1],0C0h
|
|
.loop
|
|
mov dword[esi],0C0C0C0C0h
|
|
add esi,4
|
|
dec ecx
|
|
jnz .loop
|
|
add esi,288-48
|
|
dec ebx
|
|
jnz .loop2
|
|
jmp .do8b
|
|
.do16b3
|
|
mov esi,208*288*2+32*2+192*2
|
|
add esi,[vidbuffer]
|
|
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
|
|
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,209*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,209*288+32+210
|
|
call .output
|
|
pop eax
|
|
; eax = hours
|
|
xor edx,edx
|
|
mov ebx,10
|
|
div ebx
|
|
mov esi,209*288+32+192
|
|
call .output
|
|
cmp byte[cbitmode],1
|
|
je .do16b2
|
|
.no16b4
|
|
mov esi,209*288+32+222
|
|
add esi,[vidbuffer]
|
|
xor eax,eax
|
|
add al,':'
|
|
mov al,[ASCII2Font+eax]
|
|
pushad
|
|
call outputchar5x5
|
|
popad
|
|
mov esi,209*288+32+204
|
|
add esi,[vidbuffer]
|
|
xor eax,eax
|
|
add al,':'
|
|
mov al,[ASCII2Font+eax]
|
|
pushad
|
|
call outputchar5x5
|
|
popad
|
|
ret
|
|
.do16b2
|
|
mov esi,209*288*2+32*2+222*2
|
|
add esi,[vidbuffer]
|
|
xor eax,eax
|
|
add al,':'
|
|
mov al,[ASCII2Font+eax]
|
|
pushad
|
|
call outputchar16b5x5
|
|
popad
|
|
mov esi,209*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 .data
|
|
hextestfilen db 'DSP1DUMP.DAT',0
|
|
|
|
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
|
|
cmp byte[pressed+25],1
|
|
jne .nopress25
|
|
jmp .nopress25
|
|
pushad
|
|
mov edx,hextestfilen
|
|
call Create_File
|
|
jc .failed
|
|
mov bx,ax
|
|
mov edx,dsp1array
|
|
mov ecx,4096
|
|
call Write_File
|
|
call Close_File
|
|
.failed
|
|
popad
|
|
mov byte[pressed+25],2
|
|
.nopress25
|
|
call displayfpspal
|
|
|
|
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
|
|
NEWSYM ngfont, 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
|
|
call displayfpspal
|
|
|
|
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 byte[ngfont],0
|
|
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 byte[ngfont],1
|
|
mov edi,[Msgptr]
|
|
mov esi,200*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,208*288+32
|
|
add esi,[vidbuffer]
|
|
call OutputGraphicString5x5
|
|
mov edi,CSStatus3
|
|
mov esi,216*288+32
|
|
add esi,[vidbuffer]
|
|
call OutputGraphicString5x5
|
|
jmp .nfivex5b
|
|
.smallmsgtext
|
|
call OutputGraphicString5x5
|
|
.nfivex5b
|
|
dec dword[MessageOn]
|
|
jnz .nomsg
|
|
cmp byte[cbitmode],1
|
|
je .nomsg
|
|
call makepal
|
|
jmp .nomsg
|
|
.do16b
|
|
mov edi,[Msgptr]
|
|
mov esi,200*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,208*288*2+32*2
|
|
add esi,[vidbuffer]
|
|
call OutputGraphicString16b5x5
|
|
mov edi,CSStatus3
|
|
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
|
|
cmp byte[vsyncon],0
|
|
je .novsync
|
|
cmp byte[Triplebufen],0
|
|
jne .novsync
|
|
cmp byte[curblank],0h
|
|
jne .novsync
|
|
%ifdef __MSDOS__
|
|
call waitvsync
|
|
%endif
|
|
.novsync
|
|
cmp byte[cbitmode],1
|
|
je .nopal
|
|
cmp byte[curblank],0
|
|
jne .nopal
|
|
call changepal
|
|
.nopal
|
|
cmp byte[FPSOn],0
|
|
je .nofps
|
|
cmp byte[curblank],0
|
|
jne .nofps
|
|
call showfps
|
|
.nofps
|
|
; call ClockOutputB
|
|
|
|
cmp byte[TimerEnable],0
|
|
je .noclock
|
|
cmp byte[ShowTimer],0
|
|
je .noclock
|
|
call ClockOutput
|
|
.noclock
|
|
cmp byte[snesmouse],3
|
|
je near .drawss
|
|
; cmp byte[snesmouse],4
|
|
; je near .drawss
|
|
.returnfromdraw
|
|
mov ax,[resolutn]
|
|
cmp [prevresolutn],ax
|
|
je .noclear
|
|
mov [prevresolutn],ax
|
|
call ClearScreen
|
|
.noclear
|
|
jmp DrawScreen
|
|
|
|
.drawss
|
|
cmp byte[cbitmode],1
|
|
je .noss8b
|
|
call superscopepal
|
|
.noss8b
|
|
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
|