mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-21 10:56:10 +00:00
100 lines
4.8 KiB
NASM
100 lines
4.8 KiB
NASM
;DROPSY TEXT effect for Nowhere Man's VCL - TASM will assemble as is using
|
|
;VCL recommended switches. When screen is thoroughly dropsie'd, that is all
|
|
;letters have fallen to a single line across the bottom of the monitor,
|
|
;the routine will exit to DOS and restore the command prompt. I excerpted
|
|
;quite a bit of this from some public domain video routines optimized for
|
|
;the accursed a86 assembler and reworked the whole magilla until TASM
|
|
;wouldn't choke when swallowing the source. It attempts to meet
|
|
;minimum requirements for VCL formatting. Heck, this is a nice routine
|
|
;to have at your fingertips; you gotta admit a CASCADE-virus-like effect
|
|
;is always something people wanna see. And it's commented up the
|
|
;kazoo, one of the features I like best about VCL code. Hope you find
|
|
;it useful. -URNST KOUCH
|
|
|
|
code segment byte public
|
|
assume cs:code,ds:code,es:code,ss:code
|
|
org 0100h
|
|
|
|
jmp Start
|
|
|
|
main proc near
|
|
|
|
Row dw 24 ;Rows to do initially
|
|
|
|
;First, get current video mode and page.
|
|
Start: mov cx,0B800h ;color display, color video mem for page 1
|
|
mov ah,15 ;Get current video mode
|
|
int 10h
|
|
cmp al,2 ;Color?
|
|
je A2 ;Yes
|
|
cmp al,3 ;Color?
|
|
je A2 ;Yes
|
|
cmp al,7 ;Mono?
|
|
je A1 ;Yes
|
|
int 20h ;No,quit
|
|
|
|
;here if 80 col text mode; put video segment in ds.
|
|
A1: mov cx,0A300h ;Set for mono; mono videomem for page 1
|
|
A2: mov bl,0 ;bx=page offset
|
|
add cx,bx ;Video segment
|
|
mov ds,cx ;in ds
|
|
|
|
;start dropsy effect
|
|
xor bx,bx ;Start at top left corner
|
|
A3: push bx ;Save row start on stack
|
|
mov bp,80 ;Reset column counter
|
|
;Do next column in a row.
|
|
A4: mov si,bx ;Set row top in si
|
|
mov ax,[si] ;Get char & attr from screen
|
|
cmp al,20h ;Is it a blank?
|
|
je A7 ;Yes, skip it
|
|
mov dx,ax ;No, save it in dx
|
|
mov al,20h ;Make it a space
|
|
mov [si],ax ;and put on screen
|
|
add si,160 ;Set for next row
|
|
mov di,cs:Row ;Get rows remaining
|
|
A5: mov ax,[si] ;Get the char & attr from screen
|
|
mov [si],dx ;Put top row char & attr there
|
|
A6: call Vert ;Wait for 2 vert retraces
|
|
mov [si],ax ;Put original char & attr back
|
|
;Do next row, this column.
|
|
add si,160 ;Next row
|
|
dec di ;Done all rows remaining?
|
|
jne A5 ;No, do next one
|
|
mov [si-160],dx ;Put char & attr on line 25 as junk
|
|
;Do next column on this row.
|
|
A7: add bx,2 ;Next column, same row
|
|
dec bp ;Dec column counter; done?
|
|
jne A4 ;No, do this column
|
|
;Do next row.
|
|
A8: pop bx ;Get current row start
|
|
add bx,160 ;Next row
|
|
dec cs:Row ;All rows done?
|
|
jne A3 ;No
|
|
A9: mov ax,4C00h
|
|
int 21h ;Yes, quit to DOS with error code
|
|
|
|
;routine to deal with snow on CGA screen.
|
|
Vert: push ax
|
|
push dx
|
|
push cx ;Save all registers used
|
|
mov cl,2 ;Wait for 2 vert retraces
|
|
mov dx,3DAh ;CRT status port
|
|
F1: in al,dx ;Read status
|
|
test al,8 ;Vert retrace went hi?
|
|
je F1 ;No, wait for it
|
|
dec cl ;2nd one?
|
|
je F3 ;Yes, write during blanking time
|
|
F2: in al,dx ;No, get status
|
|
test al,8 ;Vert retrace went low?
|
|
jne F2 ;No, wait for it
|
|
jmp F1 ;Yes, wait for next hi
|
|
F3: pop cx
|
|
pop dx
|
|
pop ax ;Restore registers
|
|
ret ;and return
|
|
|
|
main endp
|
|
code ends
|
|
end main
|