⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 makev16b.asm

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 ASM
📖 第 1 页 / 共 5 页
字号:
    test al,0Fh
    jz .skipb2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-14],dx
.skipb2
    mov al,[esi+5]
    test al,0Fh
    jz .skipc2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-12],dx
.skipc2
    mov al,[esi+4]
    test al,0Fh
    jz .skipd2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-10],dx
.skipd2
    mov al,[esi+3]
    test al,0Fh
    jz .skipe2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-8],dx
.skipe2
    mov al,[esi+2]
    test al,0Fh
    jz .skipf2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-6],dx
.skipf2
    mov al,[esi+1]
    test al,0Fh
    jz .skipg2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-4],dx
.skipg2
    mov al,[esi]
    test al,0Fh
    jz .skiph2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-2],dx
.skiph2
    pop esi
    add esi,8
    dec cl
    jnz near .loopobj
    mov [currentobjptr],esi
    ret

NEWSYM drawsprites16bwinon
    mov esi,[currentobjptr]
    mov edi,[curvidoffset]
    xor ebx,ebx
    xor eax,eax
.loopobj
    test byte[esi+7],20h
    jnz near .drawspriteflipx
    push esi
    mov bx,[esi]
    mov ch,[esi+6]
    mov esi,[esi+2]
    mov al,[esi]
    test al,0Fh
    jz .skipa
    cmp byte[winspdata+ebx-8+16],0
    jne .skipa
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-16],dx
.skipa
    mov al,[esi+1]
    test al,0Fh
    jz .skipb
    cmp byte[winspdata+ebx-7+16],0
    jne .skipb
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-14],dx
.skipb
    mov al,[esi+2]
    test al,0Fh
    jz .skipc
    cmp byte[winspdata+ebx-6+16],0
    jne .skipc
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-12],dx
.skipc
    mov al,[esi+3]
    test al,0Fh
    jz .skipd
    cmp byte[winspdata+ebx-5+16],0
    jne .skipd
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-10],dx
.skipd
    mov al,[esi+4]
    test al,0Fh
    jz .skipe
    cmp byte[winspdata+ebx-4+16],0
    jne .skipe
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-8],dx
.skipe
    mov al,[esi+5]
    test al,0Fh
    jz .skipf
    cmp byte[winspdata+ebx-3+16],0
    jne .skipf
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-6],dx
.skipf
    mov al,[esi+6]
    test al,0Fh
    jz .skipg
    cmp byte[winspdata+ebx-2+16],0
    jne .skipg
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-4],dx
.skipg
    mov al,[esi+7]
    test al,0Fh
    jz .skiph
    cmp byte[winspdata+ebx-1+16],0
    jne .skiph
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-2],dx
.skiph
    pop esi
    add esi,8
    dec cl
    jnz near .loopobj
    mov [currentobjptr],esi
    ret

.drawspriteflipx
    push esi
    mov bx,[esi]
    mov ch,[esi+6]
    mov esi,[esi+2]
    mov al,[esi+7]
    test al,0Fh
    jz .skipa2
    cmp byte[winspdata+ebx-8+16],0
    jne .skipa2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-16],dx
.skipa2
    mov al,[esi+6]
    test al,0Fh
    jz .skipb2
    cmp byte[winspdata+ebx-7+16],0
    jne .skipb2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-14],dx
.skipb2
    mov al,[esi+5]
    test al,0Fh
    jz .skipc2
    cmp byte[winspdata+ebx-6+16],0
    jne .skipc2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-12],dx
.skipc2
    mov al,[esi+4]
    test al,0Fh
    jz .skipd2
    cmp byte[winspdata+ebx-5+16],0
    jne .skipd2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-10],dx
.skipd2
    mov al,[esi+3]
    test al,0Fh
    jz .skipe2
    cmp byte[winspdata+ebx-4+16],0
    jne .skipe2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-8],dx
.skipe2
    mov al,[esi+2]
    test al,0Fh
    jz .skipf2
    cmp byte[winspdata+ebx-3+16],0
    jne .skipf2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-6],dx
.skipf2
    mov al,[esi+1]
    test al,0Fh
    jz .skipg2
    cmp byte[winspdata+ebx-2+16],0
    jne .skipg2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-4],dx
.skipg2
    mov al,[esi]
    test al,0Fh
    jz .skiph2
    cmp byte[winspdata+ebx-1+16],0
    jne .skiph2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx*2-2],dx
.skiph2
    pop esi
    add esi,8
    dec cl
    jnz near .loopobj
    mov [currentobjptr],esi
    ret

NEWSYM drawsprites16bprio
    cmp byte[sprclprio+ebp],0
    je near .endobj
    test byte[cwinenabm],10h
    jz .drawnowin
    cmp byte[winonsp],0
    jne near drawspritesprio16bwinon
.drawnowin
    cmp dword[sprsingle],1
    je near .drawsingle
    mov [csprprlft],cl
    mov esi,[currentobjptr]
    mov edi,[curvidoffset]
    mov edx,esi
    xor ebx,ebx
.loopobj
    test byte[esi+7],20h
    jnz near .drawspriteflipx
    mov bx,[esi]
    push esi
    mov ch,[esi+6]
    mov dl,[esi+7]
    xor eax,eax
    and edx,03h
    cmp edx,ebp
    jne near .notprio
    mov esi,[esi+2]
    mov cl,[csprbit]
    sprdrawa16b sprdrawpra16b
    pop esi
    add esi,8
    dec byte[csprprlft]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
    ret
.notprio
    mov esi,[esi+2]
    mov dl,[csprbit]
    sprdrawa sprdrawpra2
    pop esi
    add esi,8
    dec byte[csprprlft]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
    ret
.drawspriteflipx
    mov bx,[esi]
    push esi
    mov ch,[esi+6]
    mov dl,[esi+7]
    xor eax,eax
    and edx,03h
    cmp edx,ebp
    jne near .notpriof
    mov esi,[esi+2]
    mov cl,[csprbit]
    sprdrawaf16b sprdrawpra16b
    pop esi
    add esi,8
    dec byte[csprprlft]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
.endobj
    ret
.notpriof
    mov esi,[esi+2]
    mov dl,[csprbit]
    sprdrawaf sprdrawpra2
    pop esi
    add esi,8
    dec byte[csprprlft]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
    ret
.clearcsprmem
    xor eax,eax
    mov ecx,64
    mov edi,sprpriodata+16
    rep stosd
    ret
.drawsingle
    mov esi,[currentobjptr]
    mov edi,[curvidoffset]
    mov edx,ecx
    and edx,0FFh
    xor eax,eax
    shl edx,3
    sub edx,8
    add edx,esi
    mov esi,edx
    xor ebx,ebx
.loopobj2
    test byte[esi+7],20h
    jnz near .drawspriteflipx2
    mov bx,[esi]
    push esi
    mov ch,[esi+6]
    mov esi,[esi+2]
    sprdrawa16b sprdrawprb16b
    pop esi
    sub esi,8
    dec cl
    jnz near .loopobj2
    ret
.drawspriteflipx2
    mov bx,[esi]
    push esi
    mov ch,[esi+6]
    mov esi,[esi+2]
    sprdrawaf16b sprdrawprb16b
    pop esi
    sub esi,8
    dec cl
    jnz near .loopobj2
    ret

NEWSYM drawspritesprio16bwinon
    cmp dword[sprsingle],1
    je near .drawsingle
    mov [csprprlft],cl
    mov esi,[currentobjptr]
    mov edi,[curvidoffset]
    mov edx,esi
    xor ebx,ebx
.loopobj
    test byte[esi+7],20h
    jnz near .drawspriteflipx
    mov bx,[esi]
    push esi
    mov ch,[esi+6]
    mov dl,[esi+7]
    xor eax,eax
    and edx,03h
    cmp edx,ebp
    jne near .notprio
    mov esi,[esi+2]
    mov cl,[csprbit]
    sprdrawa16b sprdrawpraw16b
    pop esi
    add esi,8
    dec byte[csprprlft]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
    ret
.notprio
    mov esi,[esi+2]
    mov dl,[csprbit]
    sprdrawa sprdrawpra2
    pop esi
    add esi,8
    dec byte[csprprlft]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
    ret
.drawspriteflipx
    mov bx,[esi]
    push esi
    mov ch,[esi+6]
    mov dl,[esi+7]
    xor eax,eax
    and edx,03h
    cmp edx,ebp
    jne near .notpriof
    mov esi,[esi+2]
    mov cl,[csprbit]
    sprdrawaf16b sprdrawpraw16b
    pop esi
    add esi,8
    dec byte[csprprlft]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
.endobj
    ret
.notpriof
    mov esi,[esi+2]
    mov dl,[csprbit]
    sprdrawaf sprdrawpra2
    pop esi
    add esi,8
    dec byte[csprprlft]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
    ret
.clearcsprmem
    xor eax,eax
    mov ecx,64
    mov edi,sprpriodata+16
    rep stosd
    ret
.drawsingle
    mov esi,[currentobjptr]
    mov edi,[curvidoffset]
    mov edx,ecx
    and edx,0FFh
    xor eax,eax
    shl edx,3
    sub edx,8
    add edx,esi
    mov esi,edx
    xor ebx,ebx
.loopobj2
    test byte[esi+7],20h
    jnz near .drawspriteflipx2
    mov bx,[esi]
    push esi
    mov ch,[esi+6]
    mov esi,[esi+2]
    sprdrawa16b sprdrawprbw16b
    pop esi
    sub esi,8
    dec cl
    jnz near .loopobj2
    ret
.drawspriteflipx2
    mov bx,[esi]
    push esi
    mov ch,[esi+6]
    mov esi,[esi+2]
    sprdrawaf16b sprdrawprbw16b
    pop esi
    sub esi,8
    dec cl
    jnz near .loopobj2
    ret


NEWSYM draw8x816b
    cmp byte[osm2dis],1
    je .osm2dis
    cmp byte[bgmode],2
    je near draw8x816boffset
.osm2dis
    cmp byte[bgmode],5
    je near draw16x816
    mov [temp],al
    mov [bshifter],ah
    mov eax,esi
    mov [yadder],ecx
    mov [tempcach],ebx
    mov ebx,56
    sub ebx,ecx
    mov [yrevadder],ebx
    ; esi = pointer to video buffer
    mov esi,[cwinptr]
    sub esi,eax
    mov [winptrref],esi
    mov esi,[curvidoffset]
    sub esi,eax           ; esi = [vidbuffer] + curypos * 288 + 16 - HOfs
    sub esi,eax
    cmp byte[curmosaicsz],1
    je .nomosaic
    mov esi,xtravbuf+32
    mov ecx,128
.clearnext
    mov dword[esi],0
    add esi,4
    dec ecx
    jnz .clearnext
    mov esi,xtravbuf+32
    sub esi,eax
    sub esi,eax
.nomosaic
    mov [temptile],edx
    mov dword[bgofwptr],vcache2ba+262144
    mov dword[bgsubby],262144
    cmp dword[tempcach],vcache2ba+262144
    jb .nobit
    mov dword[bgofwptr],vcache4ba+131072
    mov dword[bgsubby],131072
    cmp dword[tempcach],vcache4ba+131072
    jb .nobit
    mov dword[bgofwptr],vcache8ba+65536
    mov dword[bgsubby],65536
.nobit
; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value
;              bit 10-12 = palette, 0-9=tile#
    cmp byte[curmosaicsz],1
    jne .domosaic
    cmp byte[winon],0
    jne near draw8x816bwinon
.domosaic
    mov byte[tileleft16b],33
    mov byte[drawn],0
    mov dl,[temp]
.loopa
    mov ax,[edi]
    mov dh,ah
    add edi,2
    xor dh,[curbgpr]
    test dh,20h
    jnz near .hprior
    inc byte[drawn]
    and eax,03FFh                ; filter out tile #
    mov ebx,[tempcach]
    shl eax,6
    add ebx,eax
    cmp ebx,[bgofwptr]
    jb .noclip
    sub ebx,[bgsubby]
.noclip
    test dh,80h
    jz .normadd
    add ebx,[yrevadder]
    jmp .skipadd
.normadd
    add ebx,[yadder]
.skipadd
    test dh,40h
    jnz near .rloop

    ; Begin Normal Loop
    mov cl,[bshifter]
    and dh,1Ch
    shl dh,cl                    ; process palette # (bits 10-12)
    add dh,[bgcoloradder]
    xor eax,eax
    ; Start loop
    cmp dword[ebx],0
    je .loopd4
    Draw8x816bmacro 0
    Draw8x816bmacro 1
    Draw8x816bmacro 2
    Draw8x816bmacro 3
.loopd4
    cmp dword[ebx+4],0
    je .loopd8
    Draw8x816bmacro 4
    Draw8x816bmacro 5
    Draw8x816bmacro 6
    Draw8x816bmacro 7
.loopd8
.hprior
    add esi,16
    inc dl
    cmp dl,20h
    jne .loopc2
    mov edi,[temptile]
.loopc2
    dec byte[tileleft16b]
    jnz near .loopa
    cmp byte[drawn],0
    je .nodraw
    mov dh,byte[curmosaicsz]
    cmp dh,1
    jne near domosaic16b
.nodraw
    ret

    ; reversed loop
.rloop
    mov cl,[bshifter]
    and dh,1Ch
    shl dh,cl                    ; process palette # (bits 10-12)
    add dh,[bgcoloradder]
    xor eax,eax
    cmp dword[ebx+4],0
    je .loopd4b
    Draw8x816bflipmacro 0
    Draw8x816bflipmacro 1
    Draw8x816bflipmacro 2
    Draw8x816bflipmacro 3
.loopd4b
    cmp dword[ebx],0
    je .loopd8b
    Draw8x816bflipmacro 4
    Draw8x816bflipmacro 5
    Draw8x816bflipmacro 6
    Draw8x816bflipmacro 7
.loopd8b
    add esi,16
    inc dl
    cmp dl,20h
    jne .loopc

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -