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 + -
显示快捷键?