📄 vidcopy.s
字号:
# ! This file contains two specialized assembly code routines to update the ! video memory. The routines can copy from user to video memory, or from! video to video memory. ! sections.sect .text; .sect .rom; .sect .data; .sect .bss! exported functions.define _mem_vid_copy ! copy data to video ram.define _vid_vid_copy ! move data in video ram! The routines only guarantee to preserve the registers the C compiler! expects to be preserved (ebx, esi, edi, ebp, esp, segment registers, and! direction bit in the flags)..sect .text!*===========================================================================*!* mem_vid_copy *!*===========================================================================*! PUBLIC void mem_vid_copy(u16 *src, unsigned dst, unsigned count);!! Copy count characters from kernel memory to video memory. Src is an ordinary! pointer to a word, but dst and count are character (word) based video offset! and count. If src is null then screen memory is blanked by filling it with! blank_color._mem_vid_copy: push ebp mov ebp, esp push esi push edi push es mov esi, 8(ebp) ! source mov edi, 12(ebp) ! destination mov edx, 16(ebp) ! count mov es, (_vid_seg) ! segment containing video memory cld ! make sure direction is upmvc_loop: and edi, (_vid_mask) ! wrap address mov ecx, edx ! one chunk to copy mov eax, (_vid_size) sub eax, edi cmp ecx, eax jbe 0f mov ecx, eax ! ecx = min(ecx, vid_size - edi)0: sub edx, ecx ! count -= ecx shl edi, 1 ! byte address add edi, (_vid_off) ! in video memory test esi, esi ! source == 0 means blank the screen jz mvc_blankmvc_copy: rep ! copy words to video memory o16 movs jmp mvc_testmvc_blank: mov eax, (_blank_color) ! ax = blanking character rep o16 stos ! copy blanks to video memory !jmp mvc_testmvc_test: sub edi, (_vid_off) shr edi, 1 ! back to a word address test edx, edx jnz mvc_loopmvc_done: pop es pop edi pop esi pop ebp ret!*===========================================================================*!* vid_vid_copy *!*===========================================================================*! PUBLIC void vid_vid_copy(unsigned src, unsigned dst, unsigned count);!! Copy count characters from video memory to video memory. Handle overlap.! Used for scrolling, line or character insertion and deletion. Src, dst! and count are character (word) based video offsets and count._vid_vid_copy: push ebp mov ebp, esp push esi push edi push es mov esi, 8(ebp) ! source mov edi, 12(ebp) ! destination mov edx, 16(ebp) ! count mov es, (_vid_seg) ! segment containing video memory cmp esi, edi ! copy up or down? jb vvc_downvvc_up: cld ! direction is upvvc_uploop: and esi, (_vid_mask) ! wrap addresses and edi, (_vid_mask) mov ecx, edx ! one chunk to copy mov eax, (_vid_size) sub eax, esi cmp ecx, eax jbe 0f mov ecx, eax ! ecx = min(ecx, vid_size - esi)0: mov eax, (_vid_size) sub eax, edi cmp ecx, eax jbe 0f mov ecx, eax ! ecx = min(ecx, vid_size - edi)0: sub edx, ecx ! count -= ecx call vvc_copy ! copy video words test edx, edx jnz vvc_uploop ! again? jmp vvc_donevvc_down: std ! direction is down lea esi, -1(esi)(edx*1) ! start copying at the top lea edi, -1(edi)(edx*1)vvc_downloop: and esi, (_vid_mask) ! wrap addresses and edi, (_vid_mask) mov ecx, edx ! one chunk to copy lea eax, 1(esi) cmp ecx, eax jbe 0f mov ecx, eax ! ecx = min(ecx, esi + 1)0: lea eax, 1(edi) cmp ecx, eax jbe 0f mov ecx, eax ! ecx = min(ecx, edi + 1)0: sub edx, ecx ! count -= ecx call vvc_copy test edx, edx jnz vvc_downloop ! again? cld ! C compiler expects up !jmp vvc_donevvc_done: pop es pop edi pop esi pop ebp ret! Copy video words. (Inner code of both the up and downcopying loop.)vvc_copy: shl esi, 1 shl edi, 1 ! byte addresses add esi, (_vid_off) add edi, (_vid_off) ! in video memory repeseg o16 movs ! copy video words sub esi, (_vid_off) sub edi, (_vid_off) shr esi, 1 shr edi, 1 ! back to word addresses ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -