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 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