1486 lines
30 KiB
NASM
1486 lines
30 KiB
NASM
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
|
|
;
|
|
;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 DSPMem,FPSOn,Makemode7Table,MessageOn,vesa2red10,scanlines,smallscreenon
|
|
EXTSYM MsgCount,Msgptr,OutputGraphicString,OutputGraphicString16b
|
|
EXTSYM PrepareSaveState,ResetState,breakatsignb,breakatsignc,cvidmode
|
|
EXTSYM cbitmode,copyvid,curblank,drawhline,drawhline16b,drawvline
|
|
EXTSYM drawvline16b,fnames,frameskip,mode7tab,pressed,spcA
|
|
EXTSYM spcBuffera,spcNZ,spcP,spcPCRam,spcRam,spcRamDP,spcS,spcX,spcY
|
|
EXTSYM spcon,vesa2_bpos,vesa2_clbit,vesa2_gpos,vesa2_rpos,vesa2selec
|
|
EXTSYM vidbuffer,spritetablea,sprlefttot,newengen,spcextraram,resolutn
|
|
EXTSYM Open_File,Close_File,Read_File,Write_File,Create_File,Get_Key,Get_Date
|
|
EXTSYM continueprog,ForceNonTransp,GUIOn,Check_Key,JoyRead
|
|
EXTSYM GetScreen, SSKeyPressed, StopSound, StartSound
|
|
EXTSYM ExecExitOkay,t1cc
|
|
EXTSYM Clear2xSaIBuffer
|
|
EXTSYM romdata,romtype
|
|
EXTSYM Voice0Disable,Voice1Disable,Voice2Disable,Voice3Disable
|
|
EXTSYM Voice4Disable,Voice5Disable,Voice6Disable,Voice7Disable
|
|
|
|
|
|
NEWSYM MenuAsmStart
|
|
|
|
|
|
|
|
|
|
GUIBufferData:
|
|
mov ecx,16384
|
|
cmp byte[cbitmode],1
|
|
jne near .16b
|
|
add ecx,16384
|
|
.16b
|
|
; copy to spritetable
|
|
mov esi,[vidbuffer]
|
|
mov edi,[spritetablea]
|
|
.loop
|
|
mov eax,[esi]
|
|
mov [edi],eax
|
|
add esi,4
|
|
add edi,4
|
|
dec ecx
|
|
jnz .loop
|
|
mov edi,sprlefttot
|
|
mov ecx,64*5
|
|
.a
|
|
mov dword[edi],0
|
|
add edi,4
|
|
dec ecx
|
|
jnz .a
|
|
ret
|
|
|
|
GUIUnBuffer:
|
|
mov ecx,16384
|
|
cmp byte[cbitmode],1
|
|
jne near .16b
|
|
add ecx,16384
|
|
.16b
|
|
; copy from spritetable
|
|
mov esi,[vidbuffer]
|
|
mov edi,[spritetablea]
|
|
.loop
|
|
mov eax,[edi]
|
|
mov [esi],eax
|
|
add esi,4
|
|
add edi,4
|
|
dec ecx
|
|
jnz .loop
|
|
ret
|
|
|
|
|
|
NEWSYM nextmenupopup, db 0
|
|
NEWSYM NoInputRead, db 0
|
|
NEWSYM PrevMenuPos, db 0
|
|
NEWSYM MenuDisplace, dd 0
|
|
NEWSYM MenuDisplace16, dd 0
|
|
|
|
NEWSYM showmenu
|
|
mov byte[ForceNonTransp],1
|
|
cmp byte[cbitmode],1
|
|
je near .nopalread
|
|
mov edi,[vidbuffer]
|
|
add edi,100000
|
|
mov dx,03C7h
|
|
mov al,0
|
|
out dx,al
|
|
mov dx,03C9h
|
|
mov ecx,768
|
|
mov byte[edi],12
|
|
inc edi
|
|
.b
|
|
in al,dx
|
|
shl al,2
|
|
mov [edi],al
|
|
inc edi
|
|
dec ecx
|
|
jnz .b
|
|
.nopalread
|
|
|
|
mov byte[NoInputRead],0
|
|
cmp byte[newengen],0
|
|
je .nong16b
|
|
cmp byte[cbitmode],0
|
|
je .nong16b
|
|
call GetScreen
|
|
.nong16b
|
|
cmp byte[SSKeyPressed],1
|
|
jne .nosskey
|
|
mov byte[SSKeyPressed],0
|
|
call savepcx
|
|
jmp .nopalwrite
|
|
.nosskey
|
|
test byte[pressed+14],1
|
|
jz .nof12
|
|
call savepcx
|
|
jmp .nopalwrite
|
|
.nof12
|
|
mov dword[menucloc],0
|
|
cmp byte[nextmenupopup],0
|
|
je .nomenuinc2
|
|
mov byte[pressed+1Ch],0
|
|
mov dword[menucloc],40*288
|
|
cmp byte[PrevMenuPos],1
|
|
jne .nomenuinc
|
|
mov dword[menucloc],50*288
|
|
.nomenuinc
|
|
cmp byte[PrevMenuPos],2
|
|
jne .nomenuinc2
|
|
mov dword[menucloc],60*288
|
|
.nomenuinc2
|
|
|
|
mov byte[nextmenupopup],0
|
|
mov byte[menu16btrans],0
|
|
mov byte[pressed+1],0
|
|
mov byte[pressed+59],0
|
|
mov byte[curblank],00h
|
|
call GUIBufferData
|
|
; Draw box
|
|
call menudrawbox8b
|
|
call menudrawbox8b
|
|
|
|
cmp byte[newengen],0
|
|
je .notng
|
|
mov byte[GUIOn],1
|
|
.notng
|
|
pushad
|
|
call copyvid
|
|
popad
|
|
|
|
call StopSound
|
|
.nextkey
|
|
call JoyRead
|
|
call Check_Key
|
|
or al,al
|
|
jz .nextkey
|
|
call Get_Key
|
|
cmp al,0
|
|
jne near .processextend
|
|
call Get_Key
|
|
cmp al,72
|
|
jne .noup
|
|
cmp dword[menucloc],0
|
|
jne .nogoup
|
|
add dword[menucloc],70*288
|
|
.nogoup
|
|
sub dword[menucloc],10*288
|
|
call menudrawbox8b
|
|
mov al,[newengen]
|
|
mov byte[newengen],0
|
|
push eax
|
|
call copyvid
|
|
pop eax
|
|
mov [newengen],al
|
|
jmp .nextkey
|
|
.noup
|
|
cmp al,80
|
|
jne .nodown
|
|
cmp dword[menucloc],60*288
|
|
jne .nogodown
|
|
sub dword[menucloc],70*288
|
|
.nogodown
|
|
add dword[menucloc],10*288
|
|
call menudrawbox8b
|
|
mov al,[newengen]
|
|
mov byte[newengen],0
|
|
push eax
|
|
call copyvid
|
|
pop eax
|
|
mov [newengen],al
|
|
jmp .nextkey
|
|
.nodown
|
|
jmp .nextkey
|
|
.processextend
|
|
|
|
cmp al,27
|
|
je near .exitloop
|
|
cmp al,13
|
|
je .done
|
|
jmp .nextkey
|
|
.done
|
|
call GUIUnBuffer
|
|
mov al,[newengen]
|
|
mov byte[newengen],0
|
|
push eax
|
|
call copyvid
|
|
pop eax
|
|
mov [newengen],al
|
|
cmp dword[menucloc],0
|
|
jne .nosavepcx
|
|
call savepcx
|
|
.nosavepcx
|
|
cmp dword[menucloc],40*288
|
|
jne .nosavepcx2
|
|
call savepcx
|
|
mov byte[ExecExitOkay],0
|
|
mov byte[nextmenupopup],3
|
|
mov byte[NoInputRead],1
|
|
mov byte[t1cc],0
|
|
mov byte[PrevMenuPos],0
|
|
.nosavepcx2
|
|
cmp dword[menucloc],50*288
|
|
jne .noskipframe
|
|
mov byte[ExecExitOkay],0
|
|
mov byte[nextmenupopup],3
|
|
mov byte[NoInputRead],1
|
|
mov byte[t1cc],0
|
|
mov byte[PrevMenuPos],1
|
|
.noskipframe
|
|
cmp dword[menucloc],60*288
|
|
jne .nomovewin
|
|
mov byte[ExecExitOkay],0
|
|
mov byte[nextmenupopup],1
|
|
mov byte[NoInputRead],1
|
|
mov byte[t1cc],0
|
|
mov byte[PrevMenuPos],2
|
|
cmp dword[MenuDisplace],0
|
|
je .movewin
|
|
mov dword[MenuDisplace],0
|
|
mov dword[MenuDisplace16],0
|
|
jmp .nomovewin
|
|
.movewin
|
|
mov dword[MenuDisplace],90*288
|
|
mov dword[MenuDisplace16],90*288*2
|
|
.nomovewin
|
|
cmp dword[menucloc],10*288
|
|
jne .nofps
|
|
cmp byte[frameskip],0
|
|
je .yesfs
|
|
mov dword[Msgptr],.unablefps
|
|
mov eax,[MsgCount]
|
|
mov [MessageOn],eax
|
|
jmp .nofps
|
|
.yesfs
|
|
xor byte[FPSOn],1
|
|
.nofps
|
|
cmp dword[menucloc],20*288
|
|
jne near .nospcsave
|
|
cmp byte[spcon],0
|
|
je .nospc
|
|
cmp byte[newengen],1
|
|
; je .unablespc
|
|
mov dword[Msgptr],.search
|
|
mov eax,[MsgCount]
|
|
mov [MessageOn],eax
|
|
mov al,[newengen]
|
|
mov byte[newengen],0
|
|
push eax
|
|
call copyvid
|
|
pop eax
|
|
mov [newengen],al
|
|
; call breakatsignc
|
|
; cmp byte[prbreak],1
|
|
; je .yesesc
|
|
call breakatsignb
|
|
; cmp byte[prbreak],1
|
|
; je .yesesc
|
|
call savespcdata
|
|
mov byte[curblank],40h
|
|
mov dword[Msgptr],.saved
|
|
mov eax,[MsgCount]
|
|
mov [MessageOn],eax
|
|
jmp .nospcsave
|
|
.nospc
|
|
mov dword[Msgptr],.nosound
|
|
mov eax,[MsgCount]
|
|
mov [MessageOn],eax
|
|
jmp .nospcsave
|
|
.unablespc
|
|
mov dword[Msgptr],.unable
|
|
mov eax,[MsgCount]
|
|
mov [MessageOn],eax
|
|
jmp .nospcsave
|
|
.yesesc
|
|
mov dword[Msgptr],.escpress
|
|
mov eax,[MsgCount]
|
|
mov [MessageOn],eax
|
|
.nospcsave
|
|
cmp dword[menucloc],30*288
|
|
jne .nosnddmp
|
|
call dumpsound
|
|
mov dword[Msgptr],.sndbufsav
|
|
mov eax,[MsgCount]
|
|
mov [MessageOn],eax
|
|
.nosnddmp
|
|
.exitloop
|
|
call GUIUnBuffer
|
|
mov al,[newengen]
|
|
mov byte[newengen],0
|
|
push eax
|
|
call copyvid
|
|
pop eax
|
|
mov [newengen],al
|
|
cmp byte[cbitmode],1
|
|
je near .nopalwrite
|
|
mov edi,[vidbuffer]
|
|
add edi,100000
|
|
mov dx,03C8h
|
|
mov al,0
|
|
out dx,al
|
|
mov dx,03C9h
|
|
mov ecx,768
|
|
inc edi
|
|
.c
|
|
mov al,[edi]
|
|
shr al,2
|
|
out dx,al
|
|
inc edi
|
|
dec ecx
|
|
jnz .c
|
|
.nopalwrite
|
|
mov byte[pressed+1],2
|
|
mov byte[pressed+59],2
|
|
call StartSound
|
|
mov byte[ForceNonTransp],0
|
|
mov byte[GUIOn],0
|
|
call Clear2xSaIBuffer
|
|
jmp continueprog
|
|
|
|
.unablefps db 'NEED AUTO FRAMERATE ON',0
|
|
.sndbufsav db 'BUFFER SAVED AS SOUNDDMP.RAW',0
|
|
.search db 'SEARCHING FOR SONG START.',0
|
|
.nosound db 'SOUND MUST BE ENABLED.',0
|
|
.unable db 'CANNOT USE IN NEW GFX ENGINE.',0
|
|
.escpress db 'ESC TERMINATED SEARCH.',0
|
|
.saved db '.SPC FILE SAVED.',0
|
|
|
|
NEWSYM menudrawbox8b
|
|
cmp byte[cbitmode],1
|
|
je near menudrawbox16b
|
|
; set palette of colors 128,144, and 160 to white, blue, and red
|
|
mov al,128
|
|
mov dx,03C8h
|
|
out dx,al
|
|
inc dx
|
|
mov al,63
|
|
out dx,al
|
|
out dx,al
|
|
out dx,al
|
|
mov al,144
|
|
mov dx,03C8h
|
|
out dx,al
|
|
inc dx
|
|
xor al,al
|
|
out dx,al
|
|
out dx,al
|
|
mov al,50
|
|
out dx,al
|
|
mov al,160
|
|
mov dx,03C8h
|
|
out dx,al
|
|
inc dx
|
|
mov al,45
|
|
out dx,al
|
|
xor al,al
|
|
out dx,al
|
|
out dx,al
|
|
; draw a small blue box with a white border
|
|
mov esi,40+20*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov ecx,150
|
|
mov al,85
|
|
.loop
|
|
mov byte[esi],144
|
|
inc esi
|
|
loop .loop
|
|
add esi,288-150
|
|
dec al
|
|
mov ecx,150
|
|
jnz .loop
|
|
mov al,128
|
|
; Draw lines
|
|
mov esi,40+20*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov ecx,150
|
|
call drawhline
|
|
mov esi,40+20*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov ecx,85
|
|
call drawvline
|
|
mov esi,40+104*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov ecx,150
|
|
call drawhline
|
|
mov esi,40+32*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov ecx,150
|
|
call drawhline
|
|
mov esi,189+20*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov ecx,85
|
|
call drawvline
|
|
call menudrawcursor8b
|
|
|
|
mov esi,45+23*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov edi,.string
|
|
call OutputGraphicString
|
|
mov esi,45+35*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov edi,.stringa
|
|
call OutputGraphicString
|
|
mov esi,45+45*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov edi,.stringb
|
|
test byte[FPSOn],1
|
|
jz .nofps
|
|
mov edi,.stringc
|
|
.nofps
|
|
call OutputGraphicString
|
|
mov esi,45+55*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov edi,.stringd
|
|
call OutputGraphicString
|
|
mov esi,45+65*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov edi,.stringe
|
|
call OutputGraphicString
|
|
mov esi,45+75*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov edi,.stringf
|
|
call OutputGraphicString
|
|
mov esi,45+85*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov edi,.stringg
|
|
call OutputGraphicString
|
|
mov esi,45+95*288
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov edi,.stringh
|
|
call OutputGraphicString
|
|
mov al,[newengen]
|
|
mov byte[newengen],0
|
|
push eax
|
|
call copyvid
|
|
pop eax
|
|
mov [newengen],al
|
|
ret
|
|
|
|
.string db 'MISC OPTIONS',0
|
|
.stringa db 'SAVE SNAPSHOT',0
|
|
.stringb db 'SHOW FPS',0
|
|
.stringc db 'HIDE FPS',0
|
|
.stringd db 'SAVE SPC DATA',0
|
|
.stringe db 'SOUND BUFFER DUMP',0
|
|
.stringf db 'SNAPSHOT/INCR FRM',0
|
|
.stringg db 'INCR FRAME ONLY',0
|
|
.stringh db 'MOVE THIS WINDOW',0
|
|
|
|
NEWSYM menudrawcursor8b
|
|
cmp byte[cbitmode],1
|
|
je near menudrawcursor16b
|
|
; draw a small red box
|
|
mov esi,41+34*288
|
|
add esi,[menucloc]
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace]
|
|
mov ecx,148
|
|
mov al,9
|
|
.loop
|
|
mov byte[esi],160
|
|
inc esi
|
|
loop .loop
|
|
add esi,288-148
|
|
dec al
|
|
mov ecx,148
|
|
jnz .loop
|
|
mov al,128
|
|
ret
|
|
|
|
NEWSYM menucloc, dd 0
|
|
|
|
NEWSYM menudrawbox16b
|
|
; draw shadow behind box
|
|
cmp byte[menu16btrans],0
|
|
jne .noshadow
|
|
mov byte[menu16btrans],1
|
|
mov esi,50*2+30*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov ecx,150
|
|
mov al,85
|
|
mov ah,5
|
|
.loop16b2
|
|
mov dx,[esi]
|
|
and dx,[vesa2_clbit]
|
|
shr dx,1
|
|
mov [esi],dx
|
|
add esi,2
|
|
loop .loop16b2
|
|
add esi,288*2-150*2
|
|
dec al
|
|
mov ecx,150
|
|
jnz .loop16b2
|
|
.noshadow
|
|
|
|
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,40*2+20*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov ecx,150
|
|
mov al,85
|
|
mov ah,5
|
|
.loop16b
|
|
mov [esi],dx
|
|
add esi,2
|
|
loop .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 lines
|
|
mov ax,0FFFFh
|
|
mov esi,40*2+20*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov ecx,150
|
|
call drawhline16b
|
|
mov esi,40*2+20*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov ecx,85
|
|
call drawvline16b
|
|
mov esi,40*2+104*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov ecx,150
|
|
call drawhline16b
|
|
mov esi,40*2+32*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov ecx,150
|
|
call drawhline16b
|
|
mov esi,189*2+20*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov ecx,85
|
|
call drawvline16b
|
|
call menudrawcursor16b
|
|
|
|
mov esi,45*2+23*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov edi,menudrawbox8b.string
|
|
call OutputGraphicString16b
|
|
mov esi,45*2+35*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov edi,menudrawbox8b.stringa
|
|
call OutputGraphicString16b
|
|
mov esi,45*2+45*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov edi,menudrawbox8b.stringb
|
|
test byte[FPSOn],1
|
|
jz .nofps
|
|
mov edi,menudrawbox8b.stringc
|
|
.nofps
|
|
call OutputGraphicString16b
|
|
mov esi,45*2+55*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov edi,menudrawbox8b.stringd
|
|
call OutputGraphicString16b
|
|
mov esi,45*2+65*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov edi,menudrawbox8b.stringe
|
|
call OutputGraphicString16b
|
|
mov esi,45*2+75*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov edi,menudrawbox8b.stringf
|
|
call OutputGraphicString16b
|
|
mov esi,45*2+85*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov edi,menudrawbox8b.stringg
|
|
call OutputGraphicString16b
|
|
mov esi,45*2+95*288*2
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov edi,menudrawbox8b.stringh
|
|
call OutputGraphicString16b
|
|
mov al,[newengen]
|
|
mov byte[newengen],0
|
|
push eax
|
|
call copyvid
|
|
pop eax
|
|
mov [newengen],al
|
|
ret
|
|
|
|
.allred dw 0
|
|
.blue dw 0
|
|
.stepb dw 0
|
|
|
|
NEWSYM menu16btrans, db 0
|
|
|
|
NEWSYM menudrawcursor16b
|
|
; draw a small red box
|
|
mov esi,41*2+34*288*2
|
|
add esi,[menucloc]
|
|
add esi,[menucloc]
|
|
add esi,[vidbuffer]
|
|
add esi,[MenuDisplace16]
|
|
mov ecx,148
|
|
mov al,9
|
|
mov bx,[menudrawbox16b.allred]
|
|
.loop
|
|
mov [esi],bx
|
|
add esi,2
|
|
loop .loop
|
|
add esi,288*2-148*2
|
|
dec al
|
|
mov ecx,148
|
|
jnz .loop
|
|
mov al,128
|
|
ret
|
|
|
|
NEWSYM savespcdata
|
|
sub dword[spcPCRam],spcRam
|
|
; Assemble N/Z flags into P
|
|
and byte[spcP],0FDh
|
|
test byte[spcNZ],0FFh
|
|
jnz .nozero
|
|
or byte[spcP],02h
|
|
.nozero
|
|
and byte[spcP],07Fh
|
|
test byte[spcNZ],80h
|
|
jz .noneg
|
|
or byte[spcP],80h
|
|
.noneg
|
|
mov ax,[spcPCRam]
|
|
mov [ssdatst+37],ax
|
|
mov al,[spcA]
|
|
mov [ssdatst+39],al
|
|
mov al,[spcX]
|
|
mov [ssdatst+40],al
|
|
mov al,[spcY]
|
|
mov [ssdatst+41],al
|
|
mov al,[spcP]
|
|
mov [ssdatst+42],al
|
|
mov al,[spcS]
|
|
mov [ssdatst+43],al
|
|
add dword[spcPCRam],spcRam
|
|
.savestuff
|
|
sub dword[spcPCRam],spcRam
|
|
sub dword[spcRamDP],spcRam
|
|
call PrepareSaveState
|
|
; Copy from fnames to .spcfname, replacing .srm with .spc
|
|
mov esi,fnames+1
|
|
mov edi,.spcfname
|
|
.next
|
|
mov al,[esi]
|
|
mov [edi],al
|
|
inc esi
|
|
inc edi
|
|
cmp al,'.'
|
|
jne .next
|
|
; Save stuff
|
|
mov byte[edi],'S'
|
|
mov byte[edi+1],'P'
|
|
mov byte[edi+2],'C'
|
|
mov byte[edi+3],0
|
|
; Find an unoccupied file
|
|
.tryagainspc
|
|
mov edx,.spcfname
|
|
call Open_File
|
|
jc .nofileopen
|
|
mov bx,ax
|
|
call Close_File
|
|
cmp byte[edi+2],'C'
|
|
jne .noC
|
|
mov byte[edi+2],'1'
|
|
jmp .tryagainspc
|
|
.noC
|
|
cmp byte[edi+2],'9'
|
|
je .nofileopen
|
|
inc byte[edi+2]
|
|
jmp .tryagainspc
|
|
.nofileopen
|
|
mov al,[edi+2]
|
|
mov [showmenu.saved+3],al
|
|
; copy spcextra ram to dspmem+192
|
|
mov esi,spcextraram
|
|
mov edi,DSPMem+192
|
|
mov ecx,64
|
|
.loop
|
|
mov al,[esi]
|
|
mov [edi],al
|
|
inc esi
|
|
inc edi
|
|
dec ecx
|
|
jnz .loop
|
|
|
|
; Copy Game Title
|
|
|
|
mov esi,[romdata]
|
|
add esi,7FC0h
|
|
cmp byte[romtype],2
|
|
jne .nohirom2
|
|
add esi,8000h
|
|
.nohirom2
|
|
mov ecx,20
|
|
mov edi,ssdatst+46+32
|
|
.romloop
|
|
mov al,[esi]
|
|
mov [edi],al
|
|
inc esi
|
|
inc edi
|
|
loop .romloop
|
|
; Copy Date of spc dumped
|
|
call Get_Date
|
|
mov [ssdatst+09Eh],dl
|
|
mov [ssdatst+09Fh],dh
|
|
mov [ssdatst+0A0h],cx
|
|
|
|
; Set Channel Disables
|
|
mov byte[ssdatst+0D0h],0
|
|
cmp byte[Voice0Disable],1
|
|
je .enable0
|
|
or byte[ssdatst+0D0h],1
|
|
.enable0
|
|
cmp byte[Voice1Disable],1
|
|
je .enable1
|
|
or byte[ssdatst+0D0h],2
|
|
.enable1
|
|
cmp byte[Voice2Disable],1
|
|
je .enable2
|
|
or byte[ssdatst+0D0h],4
|
|
.enable2
|
|
cmp byte[Voice3Disable],1
|
|
je .enable3
|
|
or byte[ssdatst+0D0h],8
|
|
.enable3
|
|
cmp byte[Voice4Disable],1
|
|
je .enable4
|
|
or byte[ssdatst+0D0h],16
|
|
.enable4
|
|
cmp byte[Voice5Disable],1
|
|
je .enable5
|
|
or byte[ssdatst+0D0h],32
|
|
.enable5
|
|
cmp byte[Voice6Disable],1
|
|
je .enable6
|
|
or byte[ssdatst+0D0h],64
|
|
.enable6
|
|
cmp byte[Voice7Disable],1
|
|
je .enable7
|
|
or byte[ssdatst+0D0h],128
|
|
.enable7
|
|
|
|
; times 32 db 0 ; Title of game (Offset 48)
|
|
; times 32 db 0 ; Song Name
|
|
; times 32 db 0 ; Author of Song
|
|
; times 32 db 0 ; Name of dumper
|
|
; times 32 db 0 ; Comments
|
|
; times 4 db 0 ; date of spc dumped
|
|
; times 4 db 0 ; time in milliseconds before fading out
|
|
; times 2 db 0 ; fade-out length in milliseconds
|
|
; db 0 ; default channel enables
|
|
|
|
mov edx,.spcfname
|
|
call Create_File
|
|
mov bx,ax
|
|
mov ecx,256
|
|
mov edx,ssdatst
|
|
call Write_File
|
|
|
|
; Save SPC stuff
|
|
mov ecx,65536
|
|
mov edx,spcRam
|
|
call Write_File
|
|
mov ecx,256
|
|
mov edx,DSPMem
|
|
call Write_File
|
|
call Close_File
|
|
add dword[spcPCRam],spcRam
|
|
add dword[spcRamDP],spcRam
|
|
call ResetState
|
|
ret
|
|
|
|
.spcfname times 128 db 0
|
|
;.SPC File Format
|
|
|
|
;Offset 00000h - File Header : SNES-SPC700 Sound File Data v0.10
|
|
;Offset 00021h - 0x26,0x26,0x26
|
|
;Offset 00024h - Version #(/100)
|
|
;Offset 00025h - PC Register value (1 Word)
|
|
;Offset 00027h - A Register Value (1 byte)
|
|
;Offset 00028h - X Register Value (1 byte)
|
|
;Offset 00029h - Y Register Value (1 byte)
|
|
;Offset 0002Ah - Status Flags Value (1 byte)
|
|
;Offset 0002Bh - Stack Register Value (1 byte)
|
|
;Offset 0002Ch-000FFh - Reserved For Future Use
|
|
;Offset 00100h-100FFh - SPCRam
|
|
;Offset 10100h-101FFh - DSPRam
|
|
|
|
;Offset 0002Eh-0004Dh - SubTitle/Song Name
|
|
;Offset 0004Eh-0006Dh - Title of Game
|
|
;Offset 0006Eh-0007Dh - Name of Dumper
|
|
;Offset 0007Eh-0009Dh - Comments
|
|
;Offset 0009Eh-000A4h - Date of SPC Dumped in decimal (DD/MM/YYYY)
|
|
;Offset 000A9h-000ABh - Time in seconds for the spc to play before fading
|
|
;Offset 000ACh-000AFh - Fade out time in milliseconds
|
|
;Offset 000B0h-000CFh - Author of Song
|
|
;Offset 000D0h - Default Channel Disables (0 = enable, 1 = disable)
|
|
;Offset 000D1h - Emulator used to dump .spc file
|
|
; (0 = UNKNOWN, 1 = ZSNES, 2 = SNES9X)
|
|
; (Note : Contact the authors if you're an snes emu
|
|
; author with an .spc capture in order to assign
|
|
; you a number)
|
|
|
|
;Offset 0002Eh-0004Dh - Name of SPC (32 bytes)
|
|
;Offset 0004Eh-0005Dh - Name of Game (16 bytes)
|
|
;Offset 0006Eh-0007Dh - Name of SPC dumper (16 bytes)
|
|
;Offset 0007Eh-0009Dh - Comments (32 bytes)
|
|
;Offset 0009Eh-000A8h - Date the SPC was Dumped (10 bytes)
|
|
;Offset 000A9h-000ABh - Internal SPC timer (3 bytes)
|
|
|
|
NEWSYM ssdatst
|
|
db 'SNES-SPC700 Sound File Data v0.30',26,26,26 ; offset 0
|
|
db 10 ; Version #(/100), offset 36
|
|
; SPC Registers
|
|
dw 0 ; PC, offset 37
|
|
db 0 ; A, offset 39
|
|
db 0 ; X, offset 40
|
|
db 0 ; Y, offset 41
|
|
db 0 ; P, offset 42
|
|
db 0 ; S, offset 43
|
|
db 0,0 ; offset 44 (reserved)
|
|
|
|
times 32 db 0 ; Title of game (Offset 46)
|
|
times 32 db 0 ; Song Name
|
|
times 16 db 0 ; Name of dumper
|
|
times 32 db 0 ; Comments
|
|
times 10 db 0 ; date of spc dumped
|
|
times 4 db 0 ; time in seconds before fading out
|
|
times 4 db 0 ; fade-out length in milliseconds
|
|
times 32 db 0 ; Author of Song
|
|
db 0 ; default channel enables
|
|
db 1 ; emulator used to dump .spc files
|
|
; 32*5+20 = 180
|
|
|
|
times 48 db 0 ;(reserved), offset 224
|
|
; SPCRAM (offset 256), 64k
|
|
; DSPRAM (offset 256+65536), 256 bytes
|
|
|
|
NEWSYM dumpsound
|
|
mov cx,0
|
|
mov edx,.filename
|
|
call Create_File
|
|
; Process sound data
|
|
mov bx,ax
|
|
xor ecx,ecx
|
|
xor esi,esi
|
|
.loop
|
|
push eax
|
|
mov eax,[spcBuffera]
|
|
mov edx,dword[eax+ecx*4]
|
|
pop eax
|
|
cmp edx,0
|
|
je .nowrite
|
|
mov [mode7tab+esi],edx
|
|
add esi,4
|
|
cmp esi,65536
|
|
je .savenow
|
|
.return
|
|
.nowrite
|
|
inc cx
|
|
jnz .loop
|
|
cmp esi,0
|
|
je .nosave
|
|
mov ecx,esi
|
|
mov edx,mode7tab
|
|
call Write_File
|
|
.nosave
|
|
call Close_File
|
|
call Makemode7Table
|
|
ret
|
|
|
|
.savenow
|
|
push ecx
|
|
mov ecx,65536
|
|
mov edx,mode7tab
|
|
call Write_File
|
|
pop ecx
|
|
xor esi,esi
|
|
jmp .return
|
|
|
|
.filename db 'SOUNDDMP.RAW',0
|
|
|
|
NEWSYM pcxheader
|
|
db 10,5,1,8
|
|
dw 0,0,255,223
|
|
dw 256,224
|
|
times 48 db 0
|
|
db 0,1
|
|
.bpline dw 256
|
|
times 128-68 db 0
|
|
|
|
NEWSYM picnum, dw 0
|
|
|
|
NEWSYM savepcx
|
|
mov byte[pressed+1],0
|
|
mov byte[pressed+59],2
|
|
cmp byte[cbitmode],1
|
|
je near .save16b
|
|
mov edi,pcxheader
|
|
mov ecx,128
|
|
.clearhead
|
|
mov byte[edi],0
|
|
inc edi
|
|
dec ecx
|
|
jnz .clearhead
|
|
mov byte[pcxheader+0],10
|
|
mov byte[pcxheader+1],5
|
|
mov byte[pcxheader+2],1
|
|
mov byte[pcxheader+3],8
|
|
mov word[pcxheader+8],255
|
|
mov word[pcxheader+10],222
|
|
mov byte[pcxheader.bpline-1],1
|
|
mov word[pcxheader.bpline],256
|
|
cmp byte[resolutn],224
|
|
je .res224ph
|
|
mov word[pcxheader+10],237
|
|
.res224ph
|
|
|
|
; get unused filename
|
|
mov byte[.filename+5],'.'
|
|
%ifdef __LINUX__
|
|
mov byte[.filename+6],'p'
|
|
mov byte[.filename+7],'c'
|
|
mov byte[.filename+8],'x'
|
|
%else
|
|
mov byte[.filename+6],'P'
|
|
mov byte[.filename+7],'C'
|
|
mov byte[.filename+8],'X'
|
|
%endif
|
|
mov byte[.filename+9],0
|
|
mov word[picnum],1
|
|
.findagain
|
|
mov edx,.filename
|
|
call Open_File
|
|
jc near .nofile
|
|
mov bx,ax
|
|
call Close_File
|
|
|
|
inc word[picnum]
|
|
cmp word[picnum],1000
|
|
je .nofile
|
|
|
|
mov ax,[picnum]
|
|
xor edx,edx
|
|
mov bx,100
|
|
div bx
|
|
mov cl,al
|
|
mov ax,dx
|
|
xor edx,edx
|
|
mov bx,10
|
|
div bx
|
|
mov esi,.filename+5
|
|
add cl,48
|
|
add al,48
|
|
add dl,48
|
|
cmp cl,48
|
|
je .nohund
|
|
mov byte[esi],cl
|
|
mov byte[esi+1],al
|
|
mov byte[esi+2],dl
|
|
add esi,3
|
|
jmp .finproc
|
|
.nohund
|
|
cmp al,48
|
|
je .noten
|
|
mov byte[esi],al
|
|
mov byte[esi+1],dl
|
|
add esi,2
|
|
jmp .finproc
|
|
.noten
|
|
mov byte[esi],dl
|
|
inc esi
|
|
.finproc
|
|
mov byte[esi],'.'
|
|
%ifdef __LINUX__
|
|
mov byte[esi+1],'p'
|
|
mov byte[esi+2],'c'
|
|
mov byte[esi+3],'x'
|
|
%else
|
|
mov byte[esi+1],'P'
|
|
mov byte[esi+2],'C'
|
|
mov byte[esi+3],'X'
|
|
%endif
|
|
mov byte[esi+4],0
|
|
jmp .findagain
|
|
.nofile
|
|
|
|
mov edx,.filename
|
|
call Create_File
|
|
; Save header
|
|
mov bx,ax
|
|
mov ecx,128
|
|
mov edx,pcxheader
|
|
call Write_File
|
|
; Save picture Data
|
|
mov byte[.rowsleft],223
|
|
cmp byte[resolutn],224
|
|
je .res224p
|
|
mov byte[.rowsleft],238
|
|
.res224p
|
|
mov ecx,256
|
|
mov edx,[vidbuffer]
|
|
add edx,16+288
|
|
.a
|
|
xor ecx,ecx
|
|
mov esi,edx
|
|
mov edi,mode7tab
|
|
push ebx
|
|
mov ebx,256
|
|
.loopp
|
|
mov al,[esi]
|
|
mov [edi],al
|
|
mov ah,al
|
|
and ah,0C0h
|
|
cmp ah,0C0h
|
|
jne .norep
|
|
mov byte[edi],0C1h
|
|
inc edi
|
|
inc ecx
|
|
mov byte[edi],al
|
|
.norep
|
|
inc ecx
|
|
inc esi
|
|
inc edi
|
|
dec ebx
|
|
jnz .loopp
|
|
pop ebx
|
|
xor al,al
|
|
push edx
|
|
mov edx,mode7tab
|
|
call Write_File
|
|
pop edx
|
|
add edx,288
|
|
dec byte[.rowsleft]
|
|
jnz .a
|
|
; Save Palette
|
|
mov ecx,769
|
|
mov edx,[vidbuffer]
|
|
add edx,100000
|
|
call Write_File
|
|
call Makemode7Table
|
|
call Close_File
|
|
; mov dword[Msgptr],.pcxsaved
|
|
; mov eax,[MsgCount]
|
|
; mov [MessageOn],eax
|
|
ret
|
|
|
|
.save16b
|
|
test byte[pressed+14],1
|
|
jnz near save16b2
|
|
call prepare16b
|
|
mov edi,pcxheader
|
|
mov ecx,128
|
|
.clearhead2
|
|
mov byte[edi],0
|
|
inc edi
|
|
dec ecx
|
|
jnz .clearhead2
|
|
; Initial header = 14 bytes
|
|
mov byte[pcxheader],'B'
|
|
mov byte[pcxheader+1],'M'
|
|
mov dword[pcxheader+2],02A01Ah-768
|
|
mov dword[pcxheader+10],26
|
|
|
|
mov dword[pcxheader+14],12
|
|
mov word[pcxheader+18],256
|
|
mov word[pcxheader+20],223
|
|
mov word[pcxheader+22],1
|
|
mov word[pcxheader+24],24
|
|
|
|
cmp byte[resolutn],224
|
|
je .res224b
|
|
add dword[pcxheader+2],768*15
|
|
mov word[pcxheader+20],238
|
|
.res224b
|
|
|
|
; get unused filename
|
|
mov byte[.filename2+5],'.'
|
|
%ifdef __LINUX__
|
|
mov byte[.filename2+6],'b'
|
|
mov byte[.filename2+7],'m'
|
|
mov byte[.filename2+8],'p'
|
|
%else
|
|
mov byte[.filename2+6],'B'
|
|
mov byte[.filename2+7],'M'
|
|
mov byte[.filename2+8],'P'
|
|
%endif
|
|
mov byte[.filename2+9],0
|
|
mov word[picnum],1
|
|
.findagain2
|
|
mov edx,.filename2
|
|
call Open_File
|
|
jc near .nofile2
|
|
mov bx,ax
|
|
call Close_File
|
|
|
|
inc word[picnum]
|
|
cmp word[picnum],1000
|
|
je near .nofile2
|
|
|
|
mov ax,[picnum]
|
|
xor edx,edx
|
|
mov bx,100
|
|
div bx
|
|
mov cl,al
|
|
mov ax,dx
|
|
xor edx,edx
|
|
mov bx,10
|
|
div bx
|
|
mov esi,.filename2+5
|
|
add cl,48
|
|
add al,48
|
|
add dl,48
|
|
cmp cl,48
|
|
je .nohund2
|
|
mov byte[esi],cl
|
|
mov byte[esi+1],al
|
|
mov byte[esi+2],dl
|
|
add esi,3
|
|
jmp .finproc2
|
|
.nohund2
|
|
cmp al,48
|
|
je .noten2
|
|
mov byte[esi],al
|
|
mov byte[esi+1],dl
|
|
add esi,2
|
|
jmp .finproc2
|
|
.noten2
|
|
mov byte[esi],dl
|
|
inc esi
|
|
.finproc2
|
|
mov byte[esi],'.'
|
|
%ifdef __LINUX__
|
|
mov byte[esi+1],'b'
|
|
mov byte[esi+2],'m'
|
|
mov byte[esi+3],'p'
|
|
%else
|
|
mov byte[esi+1],'B'
|
|
mov byte[esi+2],'M'
|
|
mov byte[esi+3],'P'
|
|
%endif
|
|
mov byte[esi+4],0
|
|
jmp .findagain2
|
|
.nofile2
|
|
|
|
mov edx,.filename2
|
|
call Create_File
|
|
; Save header
|
|
mov bx,ax
|
|
mov ecx,26
|
|
mov edx,pcxheader
|
|
call Write_File
|
|
; Save picture Data
|
|
mov byte[.rowsleft],223
|
|
mov esi,[vidbuffer]
|
|
add esi,32+288*2*223
|
|
cmp byte[resolutn],224
|
|
je .res224b2
|
|
mov byte[.rowsleft],238
|
|
add esi,288*2*15
|
|
.res224b2
|
|
mov [.curdptr],esi
|
|
.a2
|
|
mov ecx,256
|
|
mov edi,mode7tab
|
|
mov esi,[.curdptr]
|
|
sub dword[.curdptr],288*2
|
|
.b2
|
|
push ecx
|
|
mov ax,[esi]
|
|
mov cl,[vesa2_bpos]
|
|
shr ax,cl
|
|
and ax,1Fh
|
|
shl al,3
|
|
mov byte[edi],al
|
|
mov ax,[esi]
|
|
mov cl,[vesa2_gpos]
|
|
shr ax,cl
|
|
and ax,1Fh
|
|
shl al,3
|
|
mov byte[edi+1],al
|
|
mov ax,[esi]
|
|
mov cl,[vesa2_rpos]
|
|
shr ax,cl
|
|
and ax,1Fh
|
|
shl al,3
|
|
mov byte[edi+2],al
|
|
pop ecx
|
|
add edi,3
|
|
add esi,2
|
|
dec ecx
|
|
jnz .b2
|
|
push edx
|
|
mov ecx,768
|
|
mov edx,mode7tab
|
|
call Write_File
|
|
pop edx
|
|
add edx,288*2
|
|
dec byte[.rowsleft]
|
|
jnz near .a2
|
|
call Makemode7Table
|
|
call Close_File
|
|
; mov dword[Msgptr],.rawsaved
|
|
; mov eax,[MsgCount]
|
|
; mov [MessageOn],eax
|
|
call restore16b
|
|
ret
|
|
|
|
.pcxsaved db 'SNAPSHOT SAVED TO '
|
|
%ifdef __LINUX__
|
|
.filename db 'image.pcx',0,0,0,0
|
|
%else
|
|
.filename db 'IMAGE.PCX',0,0,0,0
|
|
%endif
|
|
.rawsaved db 'SNAPSHOT SAVED TO '
|
|
%ifdef __LINUX__
|
|
.filename2 db 'image.bmp',0,0,0,0
|
|
%else
|
|
.filename2 db 'IMAGE.BMP',0,0,0,0
|
|
%endif
|
|
.rowsleft db 0
|
|
.curdptr dd 0
|
|
|
|
NEWSYM save16b2
|
|
call prepare16b
|
|
mov byte[pressed+14],2
|
|
push es
|
|
mov edi,pcxheader
|
|
mov ecx,128
|
|
.clearhead2
|
|
mov byte[edi],0
|
|
inc edi
|
|
dec ecx
|
|
jnz .clearhead2
|
|
; Initial header = 14 bytes
|
|
mov byte[pcxheader],'B'
|
|
mov byte[pcxheader+1],'M'
|
|
mov dword[pcxheader+2],02A01Ah-256*224*3+512*448*3
|
|
mov dword[pcxheader+10],26
|
|
mov dword[pcxheader+14],12
|
|
mov word[pcxheader+18],512
|
|
mov word[pcxheader+20],448
|
|
mov word[pcxheader+22],1
|
|
mov word[pcxheader+24],24
|
|
|
|
; get unused filename
|
|
mov byte[.filename2+5],'.'
|
|
%ifdef __LINUX__
|
|
mov byte[.filename2+6],'b'
|
|
mov byte[.filename2+7],'m'
|
|
mov byte[.filename2+8],'p'
|
|
%else
|
|
mov byte[.filename2+6],'B'
|
|
mov byte[.filename2+7],'M'
|
|
mov byte[.filename2+8],'P'
|
|
%endif
|
|
mov byte[.filename2+9],0
|
|
mov word[picnum],1
|
|
.findagain2
|
|
mov edx,.filename2
|
|
call Open_File
|
|
jc near .nofile2
|
|
mov bx,ax
|
|
call Close_File
|
|
|
|
inc word[picnum]
|
|
cmp word[picnum],1000
|
|
je near .nofile2
|
|
|
|
mov ax,[picnum]
|
|
xor edx,edx
|
|
mov bx,100
|
|
div bx
|
|
mov cl,al
|
|
mov ax,dx
|
|
xor edx,edx
|
|
mov bx,10
|
|
div bx
|
|
mov esi,.filename2+5
|
|
add cl,48
|
|
add al,48
|
|
add dl,48
|
|
cmp cl,48
|
|
je .nohund2
|
|
mov byte[esi],cl
|
|
mov byte[esi+1],al
|
|
mov byte[esi+2],dl
|
|
add esi,3
|
|
jmp .finproc2
|
|
.nohund2
|
|
cmp al,48
|
|
je .noten2
|
|
mov byte[esi],al
|
|
mov byte[esi+1],dl
|
|
add esi,2
|
|
jmp .finproc2
|
|
.noten2
|
|
mov byte[esi],dl
|
|
inc esi
|
|
.finproc2
|
|
mov byte[esi],'.'
|
|
%ifdef __LINUX__
|
|
mov byte[esi+1],'b'
|
|
mov byte[esi+2],'m'
|
|
mov byte[esi+3],'p'
|
|
%else
|
|
mov byte[esi+1],'B'
|
|
mov byte[esi+2],'M'
|
|
mov byte[esi+3],'P'
|
|
%endif
|
|
mov byte[esi+4],0
|
|
jmp .findagain2
|
|
.nofile2
|
|
|
|
mov cx,0
|
|
mov edx,.filename2
|
|
call Create_File
|
|
; Save header
|
|
mov bx,ax
|
|
mov ecx,26
|
|
mov edx,pcxheader
|
|
call Write_File
|
|
; Save picture Data
|
|
mov dword[.rowsleft],448
|
|
mov ax,[vesa2selec]
|
|
mov es,ax
|
|
mov esi,32*2+640*2*223*2+640*2
|
|
mov [.curdptr],esi
|
|
.a2
|
|
mov ecx,512
|
|
mov edi,mode7tab
|
|
mov esi,[.curdptr]
|
|
sub dword[.curdptr],640*2
|
|
.b2
|
|
push ecx
|
|
mov ax,[es:esi]
|
|
mov cl,[vesa2_bpos]
|
|
shr ax,cl
|
|
and ax,1Fh
|
|
shl al,3
|
|
mov byte[edi],al
|
|
mov ax,[es:esi]
|
|
mov cl,[vesa2_gpos]
|
|
shr ax,cl
|
|
and ax,1Fh
|
|
shl al,3
|
|
mov byte[edi+1],al
|
|
mov ax,[es:esi]
|
|
mov cl,[vesa2_rpos]
|
|
shr ax,cl
|
|
and ax,1Fh
|
|
shl al,3
|
|
mov byte[edi+2],al
|
|
pop ecx
|
|
add edi,3
|
|
add esi,2
|
|
dec ecx
|
|
jnz .b2
|
|
push edx
|
|
mov ecx,768*2
|
|
mov edx,mode7tab
|
|
call Write_File
|
|
pop edx
|
|
add edx,288*2
|
|
dec dword[.rowsleft]
|
|
jnz near .a2
|
|
call Makemode7Table
|
|
call Close_File
|
|
; mov dword[Msgptr],.rawsaved
|
|
; mov eax,[MsgCount]
|
|
; mov [MessageOn],eax
|
|
pop es
|
|
call restore16b
|
|
ret
|
|
|
|
.rawsaved db 'SNAPSHOT SAVED TO '
|
|
%ifdef __LINUX__
|
|
.filename2 db 'image.bmp',0,0,0,0
|
|
%else
|
|
.filename2 db 'IMAGE.BMP',0,0,0,0
|
|
%endif
|
|
.rowsleft dd 0
|
|
.curdptr dd 0
|
|
|
|
prepare16b:
|
|
cmp byte[vesa2red10],1
|
|
jne .nored
|
|
cmp byte[cvidmode],5
|
|
jne .nored
|
|
cmp byte[scanlines],1
|
|
je .nored
|
|
cmp byte[smallscreenon],1
|
|
je .nored
|
|
mov byte[vesa2_rpos],10
|
|
mov byte[vesa2_gpos],5
|
|
.nored
|
|
ret
|
|
restore16b:
|
|
cmp byte[vesa2red10],1
|
|
jne .nored
|
|
mov byte[vesa2_rpos],11
|
|
mov byte[vesa2_gpos],6
|
|
.nored
|
|
ret
|
|
NEWSYM MenuAsmEnd
|