fxemu2.asm
来自「十七种模拟器源代码 非常有用的作课程设计不可缺少的」· 汇编 代码 · 共 2,298 行 · 第 1/5 页
ASM
2,298 行
.nodraw3_16
test byte[eax+17],bl
jz .nodraw4_16
or bh,08h
.nodraw4_16
.nodraw
mov bl,bh
and ebx,0FFh
inc ebp
; UpdateR14
CLRFLAGS
mov [edi],ebx ; Write Destination
mov [flagnz],ebx
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
xor bh,bh
test byte[eax],bl
jz .nodraw_4
or bh,01h
.nodraw_4
test byte[eax+1],bl
jz .nodraw2_4
or bh,02h
.nodraw2_4
mov bl,bh
and ebx,0FFh
inc ebp
; UpdateR14
CLRFLAGS
mov [edi],ebx ; Write Destination
mov [flagnz],ebx
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
xor bh,bh
test byte[eax],bl
jz .nodraw_256
or bh,01h
.nodraw_256
test byte[eax+1],bl
jz .nodraw2_256
or bh,02h
.nodraw2_256
test byte[eax+16],bl
jz .nodraw3_256
or bh,04h
.nodraw3_256
test byte[eax+17],bl
jz .nodraw4_256
or bh,08h
.nodraw4_256
test byte[eax+32],bl
jz .nodraw5_256
or bh,10h
.nodraw5_256
test byte[eax+33],bl
jz .nodraw6_256
or bh,20h
.nodraw6_256
test byte[eax+48],bl
jz .nodraw7_256
or bh,40h
.nodraw7_256
test byte[eax+49],bl
jz .nodraw8_256
or bh,80h
.nodraw8_256
mov bl,bh
and ebx,0FFh
inc ebp
; UpdateR14
CLRFLAGS
mov [edi],ebx ; Write Destination
mov [flagnz],ebx
ret
NEWSYM FxOp4D ; SWAP swap upper and lower byte of a register ; V
mov eax,[esi] ; Read Source
FETCHPIPE
ror ax,8
inc ebp ; Increase program counter
mov [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
ret
NEWSYM FxOp4E ; COLOR copy source register to color register ; V
FETCHPIPE
mov eax,[esi] ; Read Source
; if bit 3 of SfxPOR is set, then don't modify the upper 4 bits
test byte[SfxPOR],04h
jz .nohighnibble
mov bl,al
shr bl,4
and al,0F0h
or al,bl
.nohighnibble
test byte[SfxPOR],08h
jnz .preserveupper
cmp [SfxCOLR],al
je .nocolchange
mov [SfxCOLR],al
and eax,0FFh
mov ebx,[fxbit01+eax*4]
mov [fxbit01pcal],ebx
mov ebx,[fxbit23+eax*4]
mov [fxbit23pcal],ebx
mov ebx,[fxbit45+eax*4]
mov [fxbit45pcal],ebx
mov ebx,[fxbit67+eax*4]
mov [fxbit67pcal],ebx
.nocolchange
CLRFLAGS
inc ebp ; Increase program counter
ret
.preserveupper
mov bl,[SfxCOLR]
and al,0Fh
and bl,0F0h
or al,bl
cmp [SfxCOLR],al
je .nocolchange
mov [SfxCOLR],al
and eax,0FFh
mov ebx,[fxbit01+eax*4]
mov [fxbit01pcal],ebx
mov ebx,[fxbit23+eax*4]
mov [fxbit23pcal],ebx
mov ebx,[fxbit45+eax*4]
mov [fxbit45pcal],ebx
mov ebx,[fxbit67+eax*4]
mov [fxbit67pcal],ebx
CLRFLAGS
inc ebp ; Increase program counter
ret
NEWSYM FxOp4EA1 ; CMODE set plot option register ; V
FETCHPIPE
mov eax,[esi] ; Read Source
inc ebp ; Increase program counter
mov dword [SfxPOR],eax
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 [sfxclineloc],eax
push ebx
mov al,[SfxSCMR]
and eax,00000011b
mov bl,[SfxPOR]
and bl,0Fh
shl bl,2
or al,bl
mov ebx,[PLOTJmpb+eax*4]
mov eax,[PLOTJmpa+eax*4]
mov dword [FxTable+4Ch*4],eax
mov dword [FxTableb+4Ch*4],eax
mov dword [FxTablec+4Ch*4],eax
mov dword [FxTabled+4Ch*4],ebx
pop ebx
CLRFLAGS
ret
NEWSYM FxOp4F ; NOT perform exclusive exor with 1 on all bits ; V
mov eax,[esi] ; Read Source
FETCHPIPE
xor eax,0FFFFh
inc ebp ; Increase program counter
mov [SfxSignZero],eax
mov [edi],eax ; Write Destination
CLRFLAGS
ret
NEWSYM FxOp50 ; ADD RN add, register + register
ADDRN 0
NEWSYM FxOp51 ; ADD RN add, register + register
ADDRN 1
NEWSYM FxOp52 ; ADD RN add, register + register
ADDRN 2
NEWSYM FxOp53 ; ADD RN add, register + register
ADDRN 3
NEWSYM FxOp54 ; ADD RN add, register + register
ADDRN 4
NEWSYM FxOp55 ; ADD RN add, register + register
ADDRN 5
NEWSYM FxOp56 ; ADD RN add, register + register
ADDRN 6
NEWSYM FxOp57 ; ADD RN add, register + register
ADDRN 7
NEWSYM FxOp58 ; ADD RN add, register + register
ADDRN 8
NEWSYM FxOp59 ; ADD RN add, register + register
ADDRN 9
NEWSYM FxOp5A ; ADD RN add, register + register
ADDRN 10
NEWSYM FxOp5B ; ADD RN add, register + register
ADDRN 11
NEWSYM FxOp5C ; ADD RN add, register + register
ADDRN 12
NEWSYM FxOp5D ; ADD RN add, register + register
ADDRN 13
NEWSYM FxOp5E ; ADD RN add, register + register
ADDRN 14
NEWSYM FxOp5F ; ADD RN add, register + register
FETCHPIPE
mov eax, [esi] ; Read Source
mov ebx,ebp
sub ebx,[SfxCPB]
add ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
mov [SfxSignZero],eax
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
CLRFLAGS
ret
NEWSYM FxOp50A1 ; ADC RN add with carry, register + register
ADCRN 0
NEWSYM FxOp51A1 ; ADC RN add with carry, register + register
ADCRN 1
NEWSYM FxOp52A1 ; ADC RN add with carry, register + register
ADCRN 2
NEWSYM FxOp53A1 ; ADC RN add with carry, register + register
ADCRN 3
NEWSYM FxOp54A1 ; ADC RN add with carry, register + register
ADCRN 4
NEWSYM FxOp55A1 ; ADC RN add with carry, register + register
ADCRN 5
NEWSYM FxOp56A1 ; ADC RN add with carry, register + register
ADCRN 6
NEWSYM FxOp57A1 ; ADC RN add with carry, register + register
ADCRN 7
NEWSYM FxOp58A1 ; ADC RN add with carry, register + register
ADCRN 8
NEWSYM FxOp59A1 ; ADC RN add with carry, register + register
ADCRN 9
NEWSYM FxOp5AA1 ; ADC RN add with carry, register + register
ADCRN 10
NEWSYM FxOp5BA1 ; ADC RN add with carry, register + register
ADCRN 11
NEWSYM FxOp5CA1 ; ADC RN add with carry, register + register
ADCRN 12
NEWSYM FxOp5DA1 ; ADC RN add with carry, register + register
ADCRN 13
NEWSYM FxOp5EA1 ; ADC RN add with carry, register + register
ADCRN 14
NEWSYM FxOp5FA1 ; ADC RN add with carry, register + register
FETCHPIPE
mov eax, [esi] ; Read Source
mov ebx,ebp
sub ebx,[SfxCPB]
shr byte[SfxCarry],1
adc ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
mov [SfxSignZero],eax
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
CLRFLAGS
ret
; Weird opcode (FxOp50A2, add 0, wow!)
NEWSYM FxOp50A2 ; ADI RN add, register + immediate
ADIRN 0
NEWSYM FxOp51A2 ; ADI RN add, register + immediate
ADIRN 1
NEWSYM FxOp52A2 ; ADI RN add, register + immediate
ADIRN 2
NEWSYM FxOp53A2 ; ADI RN add, register + immediate
ADIRN 3
NEWSYM FxOp54A2 ; ADI RN add, register + immediate
ADIRN 4
NEWSYM FxOp55A2 ; ADI RN add, register + immediate
ADIRN 5
NEWSYM FxOp56A2 ; ADI RN add, register + immediate
ADIRN 6
NEWSYM FxOp57A2 ; ADI RN add, register + immediate
ADIRN 7
NEWSYM FxOp58A2 ; ADI RN add, register + immediate
ADIRN 8
NEWSYM FxOp59A2 ; ADI RN add, register + immediate
ADIRN 9
NEWSYM FxOp5AA2 ; ADI RN add, register + immediate
ADIRN 10
NEWSYM FxOp5BA2 ; ADI RN add, register + immediate
ADIRN 11
NEWSYM FxOp5CA2 ; ADI RN add, register + immediate
ADIRN 12
NEWSYM FxOp5DA2 ; ADI RN add, register + immediate
ADIRN 13
NEWSYM FxOp5EA2 ; ADI RN add, register + immediate
ADIRN 14
NEWSYM FxOp5FA2 ; ADI RN add, register + immediate
ADIRN 15
; Another very useful opcode
NEWSYM FxOp50A3 ; ADCIRN add with carry, register + immediate
ADCIRN 0
NEWSYM FxOp51A3 ; ADCIRN add with carry, register + immediate
ADCIRN 1
NEWSYM FxOp52A3 ; ADCIRN add with carry, register + immediate
ADCIRN 2
NEWSYM FxOp53A3 ; ADCIRN add with carry, register + immediate
ADCIRN 3
NEWSYM FxOp54A3 ; ADCIRN add with carry, register + immediate
ADCIRN 4
NEWSYM FxOp55A3 ; ADCIRN add with carry, register + immediate
ADCIRN 5
NEWSYM FxOp56A3 ; ADCIRN add with carry, register + immediate
ADCIRN 6
NEWSYM FxOp57A3 ; ADCIRN add with carry, register + immediate
ADCIRN 7
NEWSYM FxOp58A3 ; ADCIRN add with carry, register + immediate
ADCIRN 8
NEWSYM FxOp59A3 ; ADCIRN add with carry, register + immediate
ADCIRN 9
NEWSYM FxOp5AA3 ; ADCIRN add with carry, register + immediate
ADCIRN 10
NEWSYM FxOp5BA3 ; ADCIRN add with carry, register + immediate
ADCIRN 11
NEWSYM FxOp5CA3 ; ADCIRN add with carry, register + immediate
ADCIRN 12
NEWSYM FxOp5DA3 ; ADCIRN add with carry, register + immediate
ADCIRN 13
NEWSYM FxOp5EA3 ; ADCIRN add with carry, register + immediate
ADCIRN 14
NEWSYM FxOp5FA3 ; ADCIRN add with carry, register + immediate
ADCIRN 15
NEWSYM FxOp60 ; SUBRN subtract, register - register
SUBRN 0
NEWSYM FxOp61 ; SUBRN subtract, register - register
SUBRN 1
NEWSYM FxOp62 ; SUBRN subtract, register - register
SUBRN 2
NEWSYM FxOp63 ; SUBRN subtract, register - register
SUBRN 3
NEWSYM FxOp64 ; SUBRN subtract, register - register
SUBRN 4
NEWSYM FxOp65 ; SUBRN subtract, register - register
SUBRN 5
NEWSYM FxOp66 ; SUBRN subtract, register - register
SUBRN 6
NEWSYM FxOp67 ; SUBRN subtract, register - register
SUBRN 7
NEWSYM FxOp68 ; SUBRN subtract, register - register
SUBRN 8
NEWSYM FxOp69 ; SUBRN subtract, register - register
SUBRN 9
NEWSYM FxOp6A ; SUBRN subtract, register - register
SUBRN 10
NEWSYM FxOp6B ; SUBRN subtract, register - register
SUBRN 11
NEWSYM FxOp6C ; SUBRN subtract, register - register
SUBRN 12
NEWSYM FxOp6D ; SUBRN subtract, register - register
SUBRN 13
NEWSYM FxOp6E ; SUBRN subtract, register - register
SUBRN 14
NEWSYM FxOp6F ; SUBRN subtract, register - register
FETCHPIPE
mov eax,[esi] ; Read Source
mov ebx,ebp
sub ebx,[SfxCPB]
sub ax,bx
seto byte[SfxOverflow]
setc byte[SfxCarry]
xor byte[SfxCarry],1
inc ebp ; Increase program counter
mov [edi],eax ; Write Destination
mov [SfxSignZero],eax
CLRFLAGS
ret
NEWSYM FxOp60A1 ; SBCRN subtract with carry, register - register
SBCRN 0
NEWSYM FxOp61A1 ; SBCRN subtract with carry, register - register
SBCRN 1
NEWSYM FxOp62A1 ; SBCRN subtract with carry, register - register
SBCRN 2
NEWSYM FxOp63A1 ; SBCRN subtract with carry, register - register
SBCRN 3
NEWSYM FxOp64A1 ; SBCRN subtract with carry, register - register
SBCRN 4
NEWSYM FxOp65A1 ; SBCRN subtract with carry, register - register
SBCRN 5
NEWSYM FxOp66A1 ; SBCRN subtract with carry, register - register
SBCRN 6
NEWSYM FxOp67A1 ; SBCRN subtract with carry, register - register
SBCRN 7
NEWSYM FxOp68A1 ; SBCRN subtract with carry, register - register
SBCRN 8
NEWSYM FxOp69A1 ; SBCRN subtract with carry, register - register
SBCRN 9
NEWSYM FxOp6AA1 ; SBCRN subtract with carry, register - register
SBCRN 10
NEWSYM FxOp6BA1 ; SBCRN subtract with carry, register - register
SBCRN 11
NEWSYM FxOp6CA1 ; SBCRN subtract with carry, register - register
SBCRN 12
NEWSYM FxOp6DA1 ; SBCRN subtract with carry, register - register
SBCRN 13
NEWSYM FxOp6EA1 ; SBCRN subtract with carry, register - register
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?