mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-20 18:36:10 +00:00
4b9382ddbc
push
230 lines
7.5 KiB
NASM
230 lines
7.5 KiB
NASM
TITLE scrn2.asm
|
||
|
||
; AUTHOR Tim Spencer - Compuserve [73657,1400]
|
||
; DATE March 15, 1987
|
||
|
||
_TEXT SEGMENT BYTE PUBLIC 'CODE'
|
||
_TEXT ENDS
|
||
|
||
_DATA SEGMENT WORD PUBLIC 'DATA'
|
||
|
||
SCRN STRUC ; screen data structure - defined in video.h
|
||
off dw 0 ; offset (cursor position)
|
||
seg dw 0 ; screen buffer address
|
||
port dw 0 ; status port address
|
||
attrib dw 0 ; attribute to use
|
||
cgacrd dw 0 ; retrace checking enabled if not zero
|
||
SCRN ENDS
|
||
|
||
_DATA ENDS
|
||
|
||
DGROUP GROUP _DATA
|
||
ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP, ES:NOTHING
|
||
|
||
|
||
_TEXT SEGMENT BYTE PUBLIC 'CODE'
|
||
|
||
;-----------------------------------------------------------------------;
|
||
; scrn_puts - MSC callable routine for printing a string directly to ;
|
||
; the screen buffer. ;
|
||
; ;
|
||
; Usage: scrn_puts(string, attribute, &structure_name); ;
|
||
;-----------------------------------------------------------------------;
|
||
_DATA SEGMENT
|
||
scrn_puts_args STRUC ; args as pushed by calling program
|
||
dw 0 ; saved bp value
|
||
dw 0 ; return address
|
||
str_ptr dw 0 ; address of string
|
||
sstruc dw 0 ; pointer to SCRN structure
|
||
scrn_puts_args ENDS
|
||
_DATA ENDS
|
||
|
||
PUBLIC _scrn_puts
|
||
|
||
_scrn_puts PROC NEAR
|
||
push bp ;set up frame pointer
|
||
mov bp,sp
|
||
push di
|
||
push si
|
||
mov si,[bp].str_ptr ; get the string pointer
|
||
mov bx,[bp].sstruc ; get pointer to SCRN structure
|
||
les di,dword ptr[bx].off ; put offset in di, buffer addr in es
|
||
mov ch,byte ptr[bx].attrib ; put attribute in cx
|
||
mov dx,[bx].port ; get status port address
|
||
|
||
load_one:
|
||
lodsb ; load a char and advance str ptr
|
||
or al,al ; is it null ?
|
||
jz puts_exit ; yes, lovely chatting. Chow babe.
|
||
mov cl,al ; no, save in cl for a few millisecs
|
||
cmp [bx].cgacrd, 0 ; cga card present?
|
||
jnz swait1 ; yes...go wait
|
||
mov ax,cx ; no.
|
||
stosw ; write it
|
||
jmp short load_one ; as fast as you can!
|
||
swait1:
|
||
in al, dx ; wait for end of retrace
|
||
shr al, 1 ; test horizontal trace bit
|
||
jc swait1 ; loop if still tracing
|
||
cli ; disable writus interuptus
|
||
swait2:
|
||
in al, dx ; now wait until the very moment
|
||
shr al, 1 ; when the next retrace begins
|
||
jnc swait2 ; still waiting...
|
||
mov al,cl ; load the char into al for stosb
|
||
stosb ; write it and update pointer
|
||
sti ; enable interrupts again
|
||
swait3:
|
||
in al, dx ; repeat these steps for the attribute
|
||
shr al, 1
|
||
jc swait3
|
||
cli
|
||
swait4:
|
||
in al, dx
|
||
shr al, 1
|
||
jnc swait4
|
||
mov al,ch ; load the attribute
|
||
stosb
|
||
sti
|
||
jmp short load_one ; and get another
|
||
|
||
puts_exit:
|
||
mov [bx].off,di ; save new offset ( cur pos )
|
||
pop si
|
||
pop di
|
||
pop bp
|
||
ret
|
||
_scrn_puts ENDP
|
||
|
||
|
||
|
||
;-----------------------------------------------------------------------;
|
||
; scrn_putca - MSC callable function to print a char and attribute ;
|
||
; directly to the screen buffer. The logical cursor ;
|
||
; position IS UPDATED on return. ;
|
||
; ;
|
||
; Usage: scrn_putca(char, attribute, &structure_name ;
|
||
;-----------------------------------------------------------------------;
|
||
_DATA SEGMENT
|
||
scrn_putca_args STRUC ; args as pushed by calling program
|
||
dw 0 ; saved bp value
|
||
dw 0 ; return address
|
||
pchar dw 0 ; char to write
|
||
pstruc dw 0 ; pointer to SCRN structure
|
||
scrn_putca_args ENDS
|
||
_DATA ENDS
|
||
|
||
PUBLIC _scrn_putca
|
||
|
||
_scrn_putca PROC NEAR
|
||
push bp ; set up frame pointer
|
||
mov bp,sp
|
||
push di
|
||
mov bx,[bp].pstruc ; get pointer to SCRN structure
|
||
les di,dword ptr[bx].off ; get offset in di, buffer addr in es
|
||
mov dx,[bx].port ; status port address
|
||
mov ch,byte ptr[bx].attrib ; get attribute into ch
|
||
mov cl,byte ptr[bp].pchar ; and char into cl
|
||
cmp [bx].cgacrd, 0 ; cga card present?
|
||
jnz cwait1 ; yes...go wait
|
||
mov ax,cx ; no.
|
||
stosw ; write it
|
||
jmp short cexit ; exit.
|
||
|
||
cwait1:
|
||
in al, dx ; wait for end of retrace
|
||
shr al, 1 ; test horizontal trace bit
|
||
jc cwait1 ; loop if still tracing
|
||
cli ; disable writus interuptus
|
||
cwait2:
|
||
in al, dx ; now wait until the very moment
|
||
shr al, 1 ; when the next retrace begins
|
||
jnc cwait2 ; still waiting...
|
||
mov al,cl ; load the char into al for stosb
|
||
stosb ; write it and update pointer
|
||
sti ; enable interrupts again
|
||
cwait3:
|
||
in al, dx ; repeat these steps for the attribute
|
||
shr al, 1
|
||
jc cwait3
|
||
cli
|
||
cwait4:
|
||
in al, dx
|
||
shr al, 1
|
||
jnc cwait4
|
||
mov al,ch ; load the attribute
|
||
stosb
|
||
sti ; whew...all done...enable interrupts
|
||
cexit:
|
||
mov [bx].off, di ; update logical cursor position
|
||
pop di ; (offset) before leaving
|
||
pop bp
|
||
ret
|
||
_scrn_putca ENDP
|
||
|
||
|
||
;-----------------------------------------------------------------------;
|
||
; _scrn_getca - get char and attrib from screen ;
|
||
; ;
|
||
; usage: char = scrn_getca(&attrib,p_scn_data) ;
|
||
; ;
|
||
;-----------------------------------------------------------------------;
|
||
_DATA SEGMENT
|
||
getca_args STRUC ; input arguments
|
||
dw 0 ; saved BP value
|
||
dw 0 ; return address
|
||
gattrib dw 0 ; store attribute here
|
||
gstruct dw 0 ; pointer to SCRN
|
||
getca_args ENDS
|
||
_DATA ENDS
|
||
|
||
PUBLIC _scrn_getca
|
||
|
||
_scrn_getca PROC NEAR
|
||
push bp ; set up frame pointer
|
||
mov bp,sp
|
||
push si
|
||
|
||
mov bx,[bp].gstruct ; get pointer to SCRN structure
|
||
mov dx,[bx].port ; get status port address
|
||
push ds ; lds uses ds - must save
|
||
lds si,dword ptr[bx].off ; get offset and segment address
|
||
gwait1:
|
||
in al, dx ; wait for end of retrace
|
||
shr al, 1 ; test horizontal trace bit
|
||
jc gwait1 ; loop if still tracing
|
||
cli ; disable writus interuptus
|
||
gwait2:
|
||
in al, dx ; now wait until the very moment
|
||
shr al, 1 ; when the next retrace begins
|
||
jnc gwait2 ; still waiting...
|
||
lodsb ; get the char into al
|
||
sti ; enable interrupts again
|
||
mov cl,al ; save the char in cl
|
||
gwait3:
|
||
in al, dx ; repeat these steps for the attribute
|
||
shr al, 1
|
||
jc gwait3
|
||
cli
|
||
gwait4:
|
||
in al, dx
|
||
shr al, 1
|
||
jnc gwait4
|
||
lodsb ; get the attribute in al
|
||
sti
|
||
pop ds ; restore data segment to norm
|
||
mov word ptr [bx],si ; update offset (logical cursor)
|
||
mov si,word ptr[bp].gattrib ; get address to store attrib
|
||
mov byte ptr [si],al ; store the attribute at "&attrib"
|
||
mov al,cl ; move the char to al and
|
||
xor ah,ah ; zero out ah so that ax = char,
|
||
; the return value
|
||
pop si
|
||
pop bp
|
||
ret
|
||
_scrn_getca ENDP
|
||
|
||
_TEXT ENDS
|
||
|
||
END
|
||
|