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