MalwareSourceCode/MSDOS/S-Index/Virus.MSDOS.Unknown.scroller.asm
vxunderground 4b9382ddbc re-organize
push
2022-08-21 04:07:57 -05:00

99 lines
3.0 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; Resident program to provide flicker-free write_tty scroll for Color
; Graphics Adapter clones with dual-ported memory. M. Abrash 5/3/86.
; Make runnable with MASM-LINK-EXE2BIN.
cseg segment
assume cs:cseg
org 100h ;necessary for COM file
start proc near
jmp makeres
old_int10 dd ?
; front end routine for BIOS video handler to scroll without flicker
scroll_front_end:
cmp ax,0e0ah ;only intercept write_tty function
jnz pass_to_bios ; called with linefeed
push ax
push bx
mov ah,0fh
int 10h ;get current page & mode
cmp al,2
jz check_row ;BIOS only blanks in modes 2 & 3, so
cmp al,3 ; only intercept linefeed scroll in
jnz pass_to_bios2 ; modes 2 & 3
check_row: ;see if cursor is on bottom row, in
push cx ; which case linefeed causes scroll
push dx
mov ah,3
int 10h ;get cursor location in current page
cmp dh,24
jnz pass_to_bios3 ;cursor not on bottom row, no scroll
push ds ;meets all the criteria, so perform
push es ; scroll in current page with special
push si ; routine that doesn't disable video
push di
mov ah,0fh
int 10h ;get # columns & page
mov al,ah
sub ah,ah ;convert to word
push ax ;set aside # columns
mov si,ax
shl si,1 ;move from second row (each character=2 bytes)
mov ah,24
mul ah ;# words to move (24 rows)
mov cx,ax
sub ax,ax ;now adjust offsets for current page
mov ds,ax ;buffer length is stored in BIOS segment
mov al,bh ;get current page
mul word ptr ds:[44ch] ;offset of start of current page
add si,ax ;move data from second row of current page
mov di,ax ; to top of current page
mov ax,0b800h
mov ds,ax
mov es,ax ;will move data in display segment
cld
rep movsw ;scroll screen up
mov ah,8 ;BH already has current page
int 10h ;get attribute of character at cursor
mov al,' ' ;fill with blanks & attribute just obtained
pop cx ;# of words per row
rep stosw ;blank bottom row-DI points to bottom row
pop di ;done
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
iret
pass_to_bios3:
pop dx
pop cx
pass_to_bios2:
pop bx
pop ax
pass_to_bios: ;pass interrupt to normal BIOS handler
jmp cs:[old_int10]
endres:
; make scroll front end handler resident & revector interrupt 10 to it
makeres:
push cs
pop ds
assume ds:cseg
mov ax,3510h ;DOS get vector function, vector 10h
int 21h ;get vector 10h
mov word ptr [old_int10],bx ;set aside old vector to
mov word ptr [old_int10+2],es ; allow pass to BIOS
mov ax,2510h ;DOS set vector function, vector 10h
mov dx,offset scroll_front_end ;revector interrupt
int 21h ; 10h to front end routine
mov dx,offset endres ;# of paragraphs to make
mov cl,4 ; resident-can't do with an
shr dx,cl ; expression because assembler can't
inc dx ; calculate w/relocatable label
mov ax,3100h ;DOS make resident fn, exit code=0
int 21h ;terminate & stay resident
start endp
cseg ends
end start