MalwareSourceCode/MSDOS/R-Index/Virus.MSDOS.Unknown.regdisp.asm

272 lines
7.4 KiB
NASM
Raw Normal View History

2021-01-12 23:55:26 +00:00
title Display Registers
page 65,131
include struct.mac
;
; regdisp.asm
;
; Displays all the 8086 registers on the right side of the screen.
; The registers are sampled and displayed roughly 18 times per second.
; Toggle on and off by holding down both shift keys.
; To use with the monochromatic monitor, DISP_BUFFER should be equated
; to 0B000H. In addition, the code in 'outchar' that is involved in
; waiting for horizontal retrace to write a character can be removed.
; This program is loaded into memory and stays resident. It is activated by
; each clock tick (about 18/sec) and is a cpu hog (at least with the
; graphics monitor; about 40% of the cpu is consumed when using the
; graphics monitor due mainly to the busy waits used in writing to the
; screen).
;
; Installation:
; masm regdisp;
; link regdisp; (should get 'No STACK segment' message)
; exe2bin regdisp
; copy regdisp.bin regdisp.com
;
DISP_BUFFER equ 0B000H
LINE_SIZE equ 19
ON equ 049 ; 254 is alternate
OFF equ 032 ; 250
RED equ 4
GREEN equ 2
BLUE equ 1
xx STRUC
s_di dw ?
s_si dw ?
s_es dw ?
s_ds dw ?
s_dx dw ?
s_cx dw ?
s_bx dw ?
s_ax dw ?
s_sp dw ?
s_bp dw ?
s_pc dw ?
s_cs dw ?
s_fl dw ?
xx ends
REGOUT MACRO LINE, REG_NAME, REG_VAL, ATT
.xlist
mov si,offset REG_NAME
mov di,160*LINE - LINE_SIZE*2
mov bh,ATT
call w_label
mov si,offset rptr
mov dx,REG_VAL
call w_bits
.list
endm
ERASE MACRO LINE
.xlist
mov cx,LINE_SIZE
mov di,160*LINE - LINE_SIZE*2
rep stosw
.list
endm
abs segment at 0
zero proc far
zero endp
abs ends
cseg segment
org 100H
assume cs:cseg
assume ds:cseg
start proc near
jmp initial
;
; data block for display
d_fl db 'FL:'
d_si db 'SI:'
d_di db 'DI:'
d_ss db 'SS:'
d_es db 'ES:'
d_ds db 'DS:'
d_sp db 'SP:'
d_bp db 'BP:'
d_dx db 'DX:'
d_cx db 'CX:'
d_bx db 'BX:'
d_ax db 'AX:'
display_cs equ $
db 'CS:'
display_pc equ $
db 'PC:'
rptr db RED,RED,RED,RED
db RED+GREEN,RED+GREEN,RED+GREEN,RED+GREEN
db RED,RED,RED,RED
db RED+GREEN,RED+GREEN,RED+GREEN,RED+GREEN
fts db 0
display_flag db 0
intr equ $
sti
push bp
mov bp,sp
add bp,8
push bp ; contents of sp before interrupt
push ax
push bx
push cx
push dx
push ds
push es
push si
push di
mov bp,sp
push cs
pop ds ; address the data
; mov al,020H
; out 020H,al
cld
mov ax,40H ; BIOS data area
mov es,ax
mov cx,es:[17H] ; KB_FLAG
and cl,11B
xor cl,11B
.if z ; left and right shift keys pressed
cmp fts,0
jnz once_already
xor display_flag,1 ; toggle the display flag
.if nz
call set_up
.endif
mov fts,1 ; set the flag
jmp once_already
.endif
mov fts,0 ; reset the flag
once_already:
.ifs display_flag,1
jmp exit
.endif
testloc equ $
mov ax,DISP_BUFFER ; display buffer address
mov es,ax ; setup for STOSW
REGOUT 1,display_pc,[bp].s_pc,BLUE
REGOUT 2,display_cs,[bp].s_cs,BLUE+GREEN
REGOUT 3,d_ss,ss,BLUE+GREEN
REGOUT 4,d_es,[bp].s_es,BLUE+GREEN
REGOUT 5,d_ds,[bp].s_ds,BLUE+GREEN
REGOUT 6,d_sp,[bp].s_sp,RED
REGOUT 7,d_bp,[bp].s_bp,RED
REGOUT 8,d_si,[bp].s_si,GREEN
REGOUT 9,d_di,[bp].s_di,GREEN
REGOUT 10,d_ax,[bp].s_ax,BLUE+RED
REGOUT 11,d_bx,[bp].s_bx,BLUE+RED
REGOUT 12,d_cx,[bp].s_cx,BLUE+RED
REGOUT 13,d_dx,[bp].s_dx,BLUE+RED
REGOUT 14,d_fl,[bp].s_fl,BLUE
exit: pop di
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
pop bp ;dummy
pop bp
jmploc: jmp zero
;
;
; output character and attribute in bx to word at es:[di]. dx, ax are destroyed.
; di is incremented by 2
outchar:
push dx
mov dx,03DAH
if disp_buffer-0b000H ; test for graphics buffer
in al,dx
.ifc al,8 ; if in the midst of vertical retrace, do the write
.repeat
in al,dx ; wait for partial horiz retrace to finish
test al,1
.until z
.repeat
in al,dx ; wait for start of horiz or vert retrace
test al,9
.until nz
.endif
endif
mov ax,bx
stosw
pop dx
ret
w_label:
mov cx,3
.repeat
mov bl,[si]
call outchar
inc si
.until loop
ret
w_bits:
mov cx,16
.repeat
shl dx,1
.if c
mov bl,ON
.else
mov bl,OFF
.endif
mov bh,[si]
call outchar
inc si
.until loop
ret
set_up:
mov ax,DISP_BUFFER ; display buffer address
mov es,ax
mov ax,700H+' ' ; blank out display buffer
ERASE 1
ERASE 2
ERASE 3
ERASE 4
ERASE 5
ERASE 6
ERASE 7
ERASE 8
ERASE 9
ERASE 10
ERASE 11
ERASE 12
ERASE 13
ERASE 14
ret
initial:
push ds
xor ax,ax
mov ds,ax ; address interrupt vectors
mov si,ds:[20H] ; pickup TIMER interrupt values
mov cx,ds:[22H]
mov ds,cx ; entry to interrupt code
mov bx,cs:testloc
.if <word ptr [si+testloc-intr]> e bx
pop ds
int 20H ; exit
.endif
pop ds
mov word ptr jmploc+1,si
mov word ptr jmploc+3,cx
mov dx,offset intr
mov ax,2508H ; setup new timer call
int 21H
mov dx,offset initial
int 27H ; terminal and stay resident
start endp
cseg ends
end start