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

📄 makev16b.asm

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 ASM
📖 第 1 页 / 共 5 页
字号:
    jz near .noback1
    mov byte[winon],0
    test word[winenabm],0001h
    jz near .nobackwin1
    test word[winenabm],0100h
    jnz near .nobackwin1
    mov al,[winbg1en]
    call makewindow
    cmp byte[winon],0FFh
    je near .noback1
.nobackwin1
    procmode716b [bg1scroly],[bg1scrolx],1
.noback1

    ; do objects
    test byte[scrndis],10h
    jnz near .nosprites2
    test word[scrnon],1010h
    jz near .nosprites2
    cmp byte[winonsp],0FFh
    je .nosprites2
    xor ebx,ebx
    mov bl,[curypos]
    mov cl,[sprleftpr1+ebx]
    cmp byte[sprprifix],0
    je .nosprprio3
    mov cl,[sprlefttot+ebx]
.nosprprio3
    cmp cl,0
    je .nosprites2
    mov ebp,1
    call drawsprites16b
.nosprites2

    test byte[interlval],40h
    jz near .noback0b
    test byte[scrndis],01h
    jnz near .noback0b
    cmp byte[extbgdone],0
    jne near .noback0b
    ; do background 1
    test word[scrnon],0101h
    jz near .noback0b
    mov byte[winon],0
    test word[winenabm],0002h
    jz near .nobackwin0b
    test word[winenabm],0200h
    jnz near .nobackwin0b
    mov al,[winbg1en]
    call makewindow
    cmp byte[winon],0FFh
    je near .noback0b
.nobackwin0b
    mov byte[extbgdone],1
    procmode716bextbg [bg1scroly],[bg1scrolx],1
.noback0b

    ; mode 7 extbg
    test byte[interlval],40h
    jz near .noback2
    cmp byte[extbgdone],0
    je near .noback2
    test byte[scrndis],01h
    jnz near .noback2
    ; do background 1
    mov byte[winon],0
    test word[winenabm],0001h
    jz near .nobackwin2
    test word[winenabm],0100h
    jnz near .nobackwin2
    mov al,[winbg1en]
    call makewindow
    cmp byte[winon],0FFh
    je near .noback2
.nobackwin2
    procmode716bextbg2 [bg1scroly],[bg1scrolx],1
.noback2

    ; do objects
    test byte[scrndis],10h
    jnz near .nosprites3
    test word[scrnon],1010h
    jz near .nosprites3
    cmp byte[winonsp],0FFh
    je .nosprites3
    xor ebx,ebx
    mov bl,[curypos]
    mov cl,[sprleftpr2+ebx]
    cmp byte[sprprifix],0
    je .nosprprio4
    mov cl,[sprlefttot+ebx]
.nosprprio4
    cmp cl,0
    je .nosprites3
    mov ebp,2
    call drawsprites16b
.nosprites3
    ; do objects
    test byte[scrndis],10h
    jnz near .nosprites4
    test word[scrnon],1010h
    jz near .nosprites4
    cmp byte[winonsp],0FFh
    je .nosprites4
    xor ebx,ebx
    mov bl,[curypos]
    mov cl,[sprleftpr3+ebx]
    cmp byte[sprprifix],0
    je .nosprprio5
    mov cl,[sprlefttot+ebx]
.nosprprio5
    cmp cl,0
    je .nosprites4
    mov ebp,3
    call drawsprites16b
.nosprites4
    pop ebp
    pop edx
    pop ebx
    pop edi
    pop esi
    xor eax,eax
    xor ecx,ecx
    ret

;*******************************************************
; Clear Backarea, 16-bit mode
;*******************************************************
NEWSYM clearback16b
    test byte[scaddtype],00100000b
    jz near .noaddition
    test byte[scaddtype],10000000b
    jnz near .noaddition
    mov dx,[cgram]
    mov ax,dx
    and ax,001Fh
    add al,[coladdr]
    cmp al,01Fh
    jb .noadd
    mov al,01Fh
.noadd
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_rpos]
    shl ax,cl
    mov bx,ax
    mov ax,dx
    shr ax,5
    and ax,001Fh
    add al,[coladdg]
    cmp al,01Fh
    jb .noaddb
    mov al,01Fh
.noaddb
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_gpos]
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,10
    and ax,001Fh
    add al,[coladdb]
    cmp al,01Fh
    jb .noaddc
    mov al,01Fh
.noaddc
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_bpos]
    shl ax,cl
    add bx,ax
    mov ax,bx
    shl eax,16
    mov ax,bx
    mov edi,[curvidoffset]
;    cmp byte[FPUCopy],1
;    je .dofpuclear
    mov ecx,128
    rep stosd
    xor eax,eax
    ret
.noaddition
    mov edi,[curvidoffset]
    mov ax,[pal16b]
    shl eax,16
    mov ax,[pal16b]
;    cmp byte[FPUCopy],1
;    je .dofpuclear
    mov ecx,128
    rep stosd
    xor eax,eax
    ret
.dofpuclear
    mov ecx,32
    call FPUZero
    xor eax,eax
    ret

;*******************************************************
; Set palette 16bit
;*******************************************************
NEWSYM setpalall
    cmp byte[V8Mode],1
    jne .noveg
    call doveg
.noveg
    xor esi,esi
    mov byte[colleft16b],0
.loopa
    mov dx,[cgram+esi]
    mov [prevpal+esi],dx
    mov ax,dx
    and al,01Fh
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_rpos]
    xor bx,bx
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,5
    and al,01Fh
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_gpos]
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,10
    and al,01Fh
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_bpos]
    shl ax,cl
    add bx,ax
    cmp bx,0
    jne .col0
    cmp byte[vidbright],0
    je .col0
    or bx,0000000000100000b
.col0
    mov ax,bx
    mov [pal16b+esi*2],bx
    and bx,[vesa2_clbit]
    mov [pal16bcl+esi*2],bx
    xor ax,0FFFFh
    and ax,[vesa2_clbit]
    mov [pal16bxcl+esi*2],ax
    add esi,2
    inc byte[colleft16b]
    jnz near .loopa
    mov al,[vidbright]
    mov [prevbright],al
    cmp byte[V8Mode],1
    jne .noveg2
    call dovegrest
.noveg2
    ret

NEWSYM colleft16b, db 0

NEWSYM setpalette16b
    cmp byte[gammalevel16b],0
    jne near setpalette16bgamma
    cmp byte[V8Mode],1
    jne .noveg
    call doveg
.noveg
    mov al,[vidbright]
    cmp al,[prevbright]
    jne near setpalall
    cmp byte[cgmod],0
    je near .skipall
    mov byte[cgmod],0
    xor esi,esi
    mov byte[colleft16b],0
.loopa
    mov dx,[cgram+esi]
    cmp [prevpal+esi],dx
    je near .skipa
    mov [prevpal+esi],dx
    mov ax,dx
    and al,01Fh
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_rpos]
    xor bx,bx
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,5
    and al,01Fh
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_gpos]
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,10
    and al,01Fh
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_bpos]
    shl ax,cl
    add bx,ax
    cmp bx,0
    jne .col0
    cmp byte[vidbright],0
    je .col0
    or bx,0000000000100000b
.col0
    mov [pal16b+esi*2],bx
    mov ax,bx
    and bx,[vesa2_clbit]
    mov [pal16bcl+esi*2],bx
    xor ax,0FFFFh
    and ax,[vesa2_clbit]
    mov [pal16bxcl+esi*2],ax
.skipa
    add esi,2
    inc byte[colleft16b]
    jnz near .loopa
.skipall
    cmp byte[V8Mode],1
    jne .noveg2
    call dovegrest
.noveg2
    ret

;pal16b   times 256 dw 0
;pal16bcl times 256 dw 0         ; w/ cl bit
;pal16bclha times 256 dw 0         ; w/ cl bit
;pal16bxcl times 256 dw 0FFFFh         ; xored w/ cl bit

NEWSYM setpalallgamma
    xor esi,esi
    mov byte[colleft16b],0
.loopa
    mov dx,[cgram+esi]
    mov [prevpal+esi],dx
    mov ax,dx
    and al,01Fh
    add al,[gammalevel16b]
    cmp al,31
    jbe .norr
    mov al,31
.norr
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_rpos]
    xor bx,bx
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,5
    and al,01Fh
    add al,[gammalevel16b]
    cmp al,31
    jbe .nogr
    mov al,31
.nogr
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_gpos]
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,10
    and al,01Fh
    add al,[gammalevel16b]
    cmp al,31
    jbe .nobr
    mov al,31
.nobr
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_bpos]
    shl ax,cl
    add bx,ax
    cmp bx,0
    jne .col0
    cmp byte[vidbright],0
    je .col0
    or bx,0000000000100000b
.col0
    mov ax,bx
    mov [pal16b+esi*2],bx
    and bx,[vesa2_clbit]
    mov [pal16bcl+esi*2],bx
    xor ax,0FFFFh
    and ax,[vesa2_clbit]
    mov [pal16bxcl+esi*2],ax
    add esi,2
    inc byte[colleft16b]
    jnz near .loopa
    mov al,[vidbright]
    mov [prevbright],al
    ret

NEWSYM setpalette16bgamma
    mov al,[vidbright]
    cmp al,[prevbright]
    jne near setpalallgamma
    cmp byte[cgmod],0
    je near .skipall
    mov byte[cgmod],0
    xor esi,esi
    mov byte[colleft16b],0
.loopa
    mov dx,[cgram+esi]
    cmp [prevpal+esi],dx
    je near .skipa
    mov [prevpal+esi],dx
    mov ax,dx
    and al,01Fh
    add al,[gammalevel16b]
    cmp al,31
    jbe .norb
    mov al,31
.norb
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_rpos]
    xor bx,bx
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,5
    and al,01Fh
    add al,[gammalevel16b]
    cmp al,31
    jbe .norr
    mov al,31
.norr
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_gpos]
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,10
    and al,01Fh
    add al,[gammalevel16b]
    cmp al,31
    jbe .norg
    mov al,31
.norg
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_bpos]
    shl ax,cl
    add bx,ax
    cmp bx,0
    jne .col0
    cmp byte[vidbright],0
    je .col0
    or bx,0000000000100000b
.col0
    mov [pal16b+esi*2],bx
    mov ax,bx
    and bx,[vesa2_clbit]
    mov [pal16bcl+esi*2],bx
    xor ax,0FFFFh
    and ax,[vesa2_clbit]
    mov [pal16bxcl+esi*2],ax
.skipa
    add esi,2
    inc byte[colleft16b]
    jnz near .loopa
.skipall
    ret

;*******************************************************
; Processes & Draws 4-bit sprites
;*******************************************************

NEWSYM drawsprites16b
    cmp byte[sprprifix],1
    je near drawsprites16bprio
    test byte[cwinenabm],10h
    jz .drawnowin
    cmp byte[winonsp],0
    jne near drawsprites16bwinon
.drawnowin
    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]
    shl bx,1
    mov al,[esi]
    test al,0Fh
    jz .skipa
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-16],dx
.skipa
    mov al,[esi+1]
    test al,0Fh
    jz .skipb
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-14],dx
.skipb
    mov al,[esi+2]
    test al,0Fh
    jz .skipc
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-12],dx 
.skipc
    mov al,[esi+3]
    test al,0Fh
    jz .skipd
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-10],dx
.skipd
    mov al,[esi+4]
    test al,0Fh
    jz .skipe
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-8],dx
.skipe
    mov al,[esi+5]
    test al,0Fh
    jz .skipf
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-6],dx
.skipf
    mov al,[esi+6]
    test al,0Fh
    jz .skipg
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-4],dx
.skipg
    mov al,[esi+7]
    test al,0Fh
    jz .skiph
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-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]
    shl bx,1
    mov al,[esi+7]
    test al,0Fh
    jz .skipa2
    add al,ch
    mov edx,[pal16b+eax*4]
    mov [edi+ebx-16],dx
.skipa2
    mov al,[esi+6]

⌨️ 快捷键说明

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