📄 menu.asm
字号:
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 esi,45+105*288
add esi,[vidbuffer]
add esi,[MenuDisplace]
mov edi,.stringi
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
.stringi db 'IMAGE FORMAT: ---',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,95
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,95
call drawvline16b
mov esi,40*2+114*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,95
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 esi,45*2+105*288*2
add esi,[vidbuffer]
add esi,[MenuDisplace16]
mov edi,menudrawbox8b.stringi
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
cmp byte[ScreenShotFormat],1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -