fxemu2.asm
来自「十七种模拟器源代码 非常有用的作课程设计不可缺少的」· 汇编 代码 · 共 2,298 行 · 第 1/5 页
ASM
2,298 行
mov ebp,[SfxCPB]
add ebp,[SfxR15]
.skip
mov dword [SfxB],0 ; Clear B Flag
mov esi,SfxR0
mov edi,SfxR0
ret
NEWSYM FxOp30 ; STW RN store word
STWRN 0
NEWSYM FxOp31 ; STW RN store word
STWRN 1
NEWSYM FxOp32 ; STW RN store word
STWRN 2
NEWSYM FxOp33 ; STW RN store word
STWRN 3
NEWSYM FxOp34 ; STW RN store word
STWRN 4
NEWSYM FxOp35 ; STW RN store word
STWRN 5
NEWSYM FxOp36 ; STW RN store word
STWRN 6
NEWSYM FxOp37 ; STW RN store word
STWRN 7
NEWSYM FxOp38 ; STW RN store word
STWRN 8
NEWSYM FxOp39 ; STW RN store word
STWRN 9
NEWSYM FxOp3A ; STW RN store word
STWRN 10
NEWSYM FxOp3B ; STW RN store word
STWRN 11
NEWSYM FxOp30A1 ; STB RN store byte
STBRN 0
NEWSYM FxOp31A1 ; STB RN store byte
STBRN 1
NEWSYM FxOp32A1 ; STB RN store byte
STBRN 2
NEWSYM FxOp33A1 ; STB RN store byte
STBRN 3
NEWSYM FxOp34A1 ; STB RN store byte
STBRN 4
NEWSYM FxOp35A1 ; STB RN store byte
STBRN 5
NEWSYM FxOp36A1 ; STB RN store byte
STBRN 6
NEWSYM FxOp37A1 ; STB RN store byte
STBRN 7
NEWSYM FxOp38A1 ; STB RN store byte
STBRN 8
NEWSYM FxOp39A1 ; STB RN store byte
STBRN 9
NEWSYM FxOp3AA1 ; STB RN store byte
STBRN 10
NEWSYM FxOp3BA1 ; STB RN store byte
STBRN 11
NEWSYM FxOp3C ; LOOP decrement loop counter, and branch on not zero ; V
dec word [SfxR12] ; decrement loop counter
FETCHPIPE
mov eax,[SfxR12]
mov [SfxSignZero],eax
or eax,eax
jz .NoBranch
mov eax,dword [SfxR13]
mov ebp,[SfxCPB]
add ebp,eax
CLRFLAGS
ret
.NoBranch
inc ebp
CLRFLAGS
ret
NEWSYM FxOp3D ; ALT1 set alt1 mode ; Verified.
FETCHPIPE
mov dword [SfxB],0
or ch,01h
inc ebp
call [FxTable+ecx*4]
xor ch,ch
ret
NEWSYM FxOp3E ; ALT2 set alt1 mode ; Verified.
FETCHPIPE
mov dword [SfxB],0
or ch,02h
inc ebp
call [FxTable+ecx*4]
xor ch,ch
ret
NEWSYM FxOp3F ; ALT3 set alt3 mode ; Verified.
FETCHPIPE
mov dword [SfxB],0
or ch,03h
inc ebp
call [FxTable+ecx*4]
xor ch,ch
ret
NEWSYM FxOp40 ; LDW RN load word from RAM
LDWRN 0
NEWSYM FxOp41 ; LDW RN load word from RAM
LDWRN 1
NEWSYM FxOp42 ; LDW RN load word from RAM
LDWRN 2
NEWSYM FxOp43 ; LDW RN load word from RAM
LDWRN 3
NEWSYM FxOp44 ; LDW RN load word from RAM
LDWRN 4
NEWSYM FxOp45 ; LDW RN load word from RAM
LDWRN 5
NEWSYM FxOp46 ; LDW RN load word from RAM
LDWRN 6
NEWSYM FxOp47 ; LDW RN load word from RAM
LDWRN 7
NEWSYM FxOp48 ; LDW RN load word from RAM
LDWRN 8
NEWSYM FxOp49 ; LDW RN load word from RAM
LDWRN 9
NEWSYM FxOp4A ; LDW RN load word from RAM
LDWRN 10
NEWSYM FxOp4B ; LDW RN load word from RAM
LDWRN 11
NEWSYM FxOp40A1 ; LDB RN load byte from RAM
LDBRN 0
NEWSYM FxOp41A1 ; LDB RN load byte from RAM
LDBRN 1
NEWSYM FxOp42A1 ; LDB RN load byte from RAM
LDBRN 2
NEWSYM FxOp43A1 ; LDB RN load byte from RAM
LDBRN 3
NEWSYM FxOp44A1 ; LDB RN load byte from RAM
LDBRN 4
NEWSYM FxOp45A1 ; LDB RN load byte from RAM
LDBRN 5
NEWSYM FxOp46A1 ; LDB RN load byte from RAM
LDBRN 6
NEWSYM FxOp47A1 ; LDB RN load byte from RAM
LDBRN 7
NEWSYM FxOp48A1 ; LDB RN load byte from RAM
LDBRN 8
NEWSYM FxOp49A1 ; LDB RN load byte from RAM
LDBRN 9
NEWSYM FxOp4AA1 ; LDB RN load byte from RAM
LDBRN 10
NEWSYM FxOp4BA1 ; LDB RN load byte from RAM
LDBRN 11
NEWSYM FxOp4C1284b ; PLOT 4bit
plotlines4b plotb
NEWSYM FxOp4C1284bz ; PLOT 4bit, zero check
plotlines4b plotbz
NEWSYM FxOp4C1284bd ; PLOT 4bit, dither
plotlines4b plotbd
NEWSYM FxOp4C1284bzd ; PLOT 4bit, zero check + dither
plotlines4b plotbzd
NEWSYM FxOp4C1282b ; PLOT 2bit
plotlines2b plotb
NEWSYM FxOp4C1282bz ; PLOT 2bit, zero check
plotlines2b plotbz
NEWSYM FxOp4C1282bd ; PLOT 2bit, dither
plotlines2b plotbd
NEWSYM FxOp4C1282bzd ; PLOT 2bit, zero check + dither
plotlines2b plotbzd
NEWSYM FxOp4C1288b ; PLOT 8bit
plotlines8b plotb
NEWSYM FxOp4C1288bz ; PLOT 8bit, zero check
plotlines8b plotbz
NEWSYM FxOp4C1288bd ; PLOT 8bit, dither
plotlines8b plotbd
NEWSYM FxOp4C1288bzd ; PLOT 8bit, zero check + dither
plotlines8b plotbzd
NEWSYM FxOp4C1288bl ; PLOT 8bit
plotlines8bl plotb
NEWSYM FxOp4C1288bzl ; PLOT 8bit, zero check
plotlines8bl plotbz
NEWSYM FxOp4C1288bdl ; PLOT 8bit, dither
plotlines8bl plotbd
NEWSYM FxOp4C1288bzdl ; PLOT 8bit, zero check + dither
plotlines8bl plotbzd
NEWSYM FxOp4C ; PLOT plot pixel with R1,R2 as x,y and the color register as the color
jmp FxOp4C1284b
FETCHPIPE
inc ebp
CLRFLAGS
mov ebx,[SfxR2]
mov bh,[SfxR1]
mov eax,[sfxclineloc]
mov ebx,[eax+ebx*4]
cmp ebx,0FFFFFFFFh
je near .nodraw
xor eax,eax
; bits 5/2 : 00 = 128 pixels, 01 = 160 pixels, 10 = 192 pixels, 11 = obj
; bits 1/0 : 00 = 4 color, 01 = 16-color, 10 = not used, 11 = 256 color
; 192 pixels = 24 tiles, 160 pixels = 20 tiles, 128 pixels = 16 tiles
; 16+8(4/3) 16+4(4/2) 16(4/0)
push ecx
mov al,[SfxSCMR]
and al,00000011b ; 4 + 32
cmp al,0
je near .colors4
cmp al,3
je near .colors256
shl ebx,5 ; x32 (16 colors)
mov al,[SfxSCBR]
shl eax,10 ; Get SFX address
add eax,ebx
add eax,[sfxramdata]
mov ebx,[SfxR2]
and ebx,07h
shl ebx,1
add eax,ebx
mov cl,[SfxR1]
and cl,07h
xor cl,07h
mov bl,1
shl bl,cl
mov bh,bl
xor bh,0FFh
pop ecx
test byte[SfxPOR],01h
jnz .nozerocheck_16
test byte[SfxCOLR],0Fh
jz .nodraw
.nozerocheck_16
mov dl,[SfxCOLR]
test byte[SfxPOR],02h
jz .nodither4b
mov dh,[SfxR1]
xor dh,[SfxR2]
test dh,01h
jz .nodither4b
shr dh,4
.nodither4b
and byte[eax],bh
and byte[eax+1],bh
and byte[eax+16],bh
and byte[eax+17],bh
test dl,01h
jz .nodraw_16
or byte[eax], bl
.nodraw_16
test dl,02h
jz .nodraw2_16
or byte[eax+1], bl
.nodraw2_16
test dl,04h
jz .nodraw3_16
or byte[eax+16],bl
.nodraw3_16
test dl,08h
jz .nodraw4_16
or byte[eax+17],bl
.nodraw4_16
.nodraw
inc word [SfxR1]
ret
.colors4
shl ebx,4 ; x16 (4 colors)
mov al,[SfxSCBR]
shl eax,10 ; Get SFX address
add eax,ebx
add eax,[sfxramdata]
mov ebx,[SfxR2]
and ebx,07h
shl ebx,1
add eax,ebx
mov cl,[SfxR1]
and cl,07h
xor cl,07h
mov bl,1
shl bl,cl
mov bh,bl
xor bh,0FFh
pop ecx
test byte[SfxPOR],01h
jnz .nozerocheck_4
test byte[SfxCOLR],03h
jz .noplot_4
.nozerocheck_4
mov dl,[SfxCOLR]
test byte[SfxPOR],02h
jz .nodither2b
mov dh,[SfxR1]
xor dh,[SfxR2]
test dh,01h
jz .nodither2b
shr dh,4
.nodither2b
and byte[eax],bh
and byte[eax+1],bh
test dl,01h
jz .nodraw_4
or byte[eax], bl
.nodraw_4
test dl,02h
jz .nodraw2_4
or byte[eax+1], bl
.nodraw2_4
.noplot_4
inc word [SfxR1]
ret
.colors256
shl ebx,6 ; x64 (256 colors)
mov al,[SfxSCBR]
shl eax,10 ; Get SFX address
add eax,ebx
add eax,[sfxramdata]
mov ebx,[SfxR2]
and ebx,07h
shl ebx,1
add eax,ebx
mov cl,[SfxR1]
and cl,07h
xor cl,07h
mov bl,1
shl bl,cl
mov bh,bl
xor bh,0FFh
pop ecx
test byte[SfxPOR],01h
jnz .nozerocheck_256
mov dl,0FFh
test byte[SfxPOR],08h
jz .nozerocheckb_256
mov dl,0Fh
.nozerocheckb_256
test byte[SfxCOLR],dl
jz .noplot_256
.nozerocheck_256
mov dl,[SfxCOLR]
and byte[eax],bh
and byte[eax+1],bh
and byte[eax+16],bh
and byte[eax+17],bh
and byte[eax+32],bh
and byte[eax+33],bh
and byte[eax+48],bh
and byte[eax+49],bh
test dl,01h
jz .nodraw_256
or byte[eax], bl
.nodraw_256
test dl,02h
jz .nodraw2_256
or byte[eax+1], bl
.nodraw2_256
test dl,04h
jz .nodraw3_256
or byte[eax+16],bl
.nodraw3_256
test dl,08h
jz .nodraw4_256
or byte[eax+17],bl
.nodraw4_256
test dl,10h
jz .nodraw5_256
or byte[eax+32], bl
.nodraw5_256
test dl,20h
jz .nodraw6_256
or byte[eax+33], bl
.nodraw6_256
test dl,40h
jz .nodraw7_256
or byte[eax+48],bl
.nodraw7_256
test dl,80h
jz .nodraw8_256
or byte[eax+49],bl
.nodraw8_256
.noplot_256
inc word [SfxR1]
ret
.prevx dw 0
.prevy dw 0
sfxwarning db 0
NEWSYM FxOp4CA1 ; RPIX read color of the pixel with R1,R2 as x,y
FETCHPIPE
mov ebx,[SfxR2]
mov bh,[SfxR1]
test byte[SfxPOR],10h
jnz .objmode
mov al,[SfxSCMR]
and al,00100100b ; 4 + 32
cmp al,4
je .lines160
cmp al,32
je .lines192
cmp al,36
je .objmode
mov eax,[sfx128lineloc]
jmp .donelines
.lines160
mov eax,[sfx160lineloc]
jmp .donelines
.lines192
mov eax,[sfx192lineloc]
jmp .donelines
.objmode
mov eax,[sfxobjlineloc]
.donelines
mov ebx,[eax+ebx*4]
cmp ebx,0FFFFFFFFh
je near .nodraw
xor eax,eax
; bits 5/2 : 00 = 128 pixels, 01 = 160 pixels, 10 = 192 pixels, 11 = obj
; bits 1/0 : 00 = 4 color, 01 = 16-color, 10 = not used, 11 = 256 color
; 192 pixels = 24 tiles, 160 pixels = 20 tiles, 128 pixels = 16 tiles
; 16+8(4/3) 16+4(4/2) 16(4/0)
push ecx
mov al,[SfxSCMR]
and al,00000011b ; 4 + 32
cmp al,0
je near .colors4
cmp al,3
je near .colors256
shl ebx,5 ; x32 (16 colors)
mov al,[SfxSCBR]
shl eax,10 ; Get SFX address
add eax,ebx
add eax,[sfxramdata]
mov ebx,[SfxR2]
and ebx,07h
shl ebx,1
add eax,ebx
mov cl,[SfxR1]
and cl,07h
xor cl,07h
mov bl,1
shl bl,cl
pop ecx
xor bh,bh
test byte[eax],bl
jz .nodraw_16
or bh,01h
.nodraw_16
test byte[eax+1],bl
jz .nodraw2_16
or bh,02h
.nodraw2_16
test byte[eax+16],bl
jz .nodraw3_16
or bh,04h
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?