mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-21 02:46:10 +00:00
272 lines
7.4 KiB
NASM
272 lines
7.4 KiB
NASM
|
||
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
|
||
|
||
|
||
|