; VIDEO.ASM
; Copyright 1992, Alfred J. Heyman and Spectrum Research, Inc.
_TEXT segment public 'CODE'
assume cs:_text,ds:_text,es:_text,ss:_text;
Public _setcolor
Public _set_write_vpage, _get_disp_vpage
Public _get_vmode, _vputch
Public _sprintstr, _inc_cursor, _wherey
Public _wherex, _gotoxy, _clearwindow
Public _scroll_up, _delay ;,_scroll_down
;Public _textback, _cursor_on, _cursor_off, _textfore, _get_writ_vpage
;Public _ch_attrib, _get_vcols, _setscroll, _vset_repeat
displaypage db 0 ;Current Display Page.
writepage db 0 ;Current Write Page.
txt_attrib db 7 ;Current Text attribute.
repeat_cnt dw 1 ;Number of reps for certain functions.
curx db 0 ;Cursor location for X.
cury db 0 ;Current Y location.
videocols db 0 ;Number of Video columns.
old_cursor dw 0 ;Stored cursor value.
lines db 0 ;Number of Lines in display.
xstart db 0 ;Starting window coordinates.
xend db 79
xsize db 79
ystart db 0
yend db 24
ysize db 24
biosflag db 1 ;1=Use Bios for I.O.
snowwait db 1 ;1=Wait for retrace.
display_seg dw 0b800h
scroll_cnt db 0
;-------------------------------------------------------------------------
_delay proc
push ds
push di
pushf
sti
mov cx,9
xor di,di
mov ds,di
mov di,46ch ;Offset of LSW of timer.
waitstart: mov ax,[di] ;Get initial value.
waitspot: mov bx,[di]
cmp ax,bx
jz waitspot ;Wait here until they are diff.
loop waitstart
popf
pop di
pop ds
ret
_delay endp
;------------------------------------------------------------------------
_setcolor proc
push bp
mov bp,sp
mov ax,[bp+4]
mov cs:txt_attrib,al
pop bp
ret
_setcolor endp
;-----------------------------------------------------------------------
_set_write_vpage proc
push bp
mov bp,sp
mov ax,[bp+4]
mov cs:writepage,al
pop bp
ret
_set_write_vpage endp
;-----------------------------------------------------------------------
_get_disp_vpage proc
call _wherex;
mov ah,0fh
int 10h
mov cs:displaypage,bh
mov al,bh
xor ah,ah
ret
_get_disp_vpage endp
;-----------------------------------------------------------------------
_get_vmode proc
push ds
push es
mov ah,0fh
int 10h
mov cs:videocols,ah
mov cs:displaypage,bh
xor ah,ah ;Return Mode in AL.
pop es
pop ds
ret
_get_vmode endp
;-----------------------------------------------------------------------
_vputch proc
push bp
mov bp,sp
mov ax,[bp+4]
mov ah,09h
mov bh,cs:displaypage
mov bl,cs:txt_attrib
mov cx,cs:repeat_cnt
int 10h
pop bp
ret
_vputch endp
;-----------------------------------------------------------------------
_sprintstr proc
push bp
mov bp,sp
push si
push ds
pushf
mov si,[bp+4]
mov ds,[bp+6]
cld ;Direction Foward.
mov ah,9 ;Setup for write.
mov bh,cs:displaypage
mov bl,cs:txt_attrib
mov cx,cs:repeat_cnt
sploop: lodsb ;Get the character in AL.
cmp al,0 ;Is it ZERO?
jz spexit ;OUT if yes.
; cmp al,7fh ;Is it DEL?
; jz spcntrl ;Yes? Handle it.
; jnc spit ;Greater? Spit the character.
;
; cmp al,0dh ;Is it a Carriage Ret?
; jz spcntrl ;Yes? Handle it.
; jnc spit ;Greater? SPIT IT.
;
; cmp al,7 ;A Bell?
; jc spit ;Is it lower? Yes? Spit it.
; cmp al,0bh ;How about a line feed or less.
; jc spcntrl ;Yes? Handle it.
spit: mov ah,9 ;Setup for write.
int 10h ;Print it.
call _inc_cursor ;Update cursor.
jmp short sploop ;Loop through.
spcntrl: ; call _hndl_cntrl ;Handle control character in AL.
; jmp short sploop
spexit: popf
pop ds
pop si
pop bp
ret
_sprintstr endp
;-----------------------------------------------------------------------
; CAN NOT DESTROY AX,BX,CX,SI
;-----------------------------------------------------------------------
_inc_cursor proc
push ax
push bx
push cx
push si
mov dh,cs:cury ;Get current cursor location.
mov dl,cs:curx
inc dl ;Increment Relative X position.
cmp dl,cs:xsize ;Check Relative X for bounds.
jle incexit ;If X is out of range, do a CRLF.
crlf: mov dl,cs:xstart ;Move cursor to left.
inc dh ;Move cursor down one.
cmp dh,cs:ysize ;Past bottom?
jle incexit ;No? Do Normal.
scrlup: push dx ;Scroll the Active page UP by one.
mov ah,6
mov cl,cs:xstart
mov ch,cs:ystart
mov dl,cs:xend
mov dh,cs:yend
mov bh,cs:txt_attrib
mov al,1
int 10h
pop dx
dec dh ;Left on Last Line.
incexit: mov cs:cury,dh
mov cs:curx,dl
mov bh,cs:writepage
mov ah,2
int 10h
pop si
pop cx
pop bx
pop ax
ret
_inc_cursor endp
;-----------------------------------------------------------------------
;_hndl_cntrl proc
;
; push bx
; push ax
;
; cmp al,0dh
; jz carriageret
; cmp al,0ah
; jz linefeed
; cmp al,7
; jz bell
; cmp al,8
; jz backspace
; cmp al,7fh
; jz backspace
; cmp al,9
; jz tab
; jmp hxit
;
;tab: jmp hxit
;carriageret: mov dh,cs:cury ;Get Relative Y.
; add dh,cs:xstart ;Add in Starting Y.
; mov dl,cs:xstart ;Get Starting X.
; mov cs:curx,0 ;Zero out Relative X.
; jmp short hndlexit
;
;linefeed: mov dh,cs:cury ;Get current Y location.
; inc dh ;Move cursor down one.
; mov cs:cury,dh ;Store New Spot.
; cmp dh,cs:ysize ;Past bottom?
; jle hndlexit ;No? Do Normal.
;
;scrlup2: push dx ;Scroll the Active page UP by one.
; mov ah,6
; mov cl,cs:xstart
; mov ch,cs:ystart
; mov dl,cs:xend
; mov dh,cs:yend
; mov bh,cs:txt_attrib
; mov al,1
; int 10h
; pop dx
; dec dh ;Left on Last Line.
; mov cs:cury,dh ;Store it.
; jmp short hndlexit ;No? Do Normal.
;
;bell: mov ah,14
; mov bh,0
; int 10h
; jmp hxit
;
;backspace: mov ah,14
; mov bh,cs:writepage
; int 10h ;Print a backspace.
; mov dl,cs:curx ;Get relative X.
; dec dl ;Back cursor up by one.
; cmp dl,0ffh ;Is it Now Negative One?
; jnz bsok ;No? Jump.
; mov dl,0 ;Yes? ZERO it out.
;bsok: mov cs:curx,dl ;Store new Relative X.
; add dl,cs:xstart ;Add in Starting X.
; mov dh,cs:ystart ;Get Starting Y.
; add dh,cs:curx ;Add in relative Y.
; jmp short hxit ;Set PHYSICAL cursor location.
;
;hndlexit: mov ah,2 ;Set cursor to value in dx.
; mov bh,cs:writepage
; int 10h
;hxit: pop ax
; pop bx
; ret
;
;_hndl_cntrl endp
;
;-----------------------------------------------------------------------
_gotoxy proc
push bp
mov bp,sp
push ds
push ax
mov ax,cs
mov ds,ax
mov ax,[bp+6]
mov dx,[bp+4]
mov dh,al
mov curx,dl ;Store New Relative Positions.
mov cury,dh
add dh,ystart ;Add in Starting Spots.
add dl,xstart
mov ah,2 ;Call BIOS.
mov bh,writepage
int 10h
pop ax
pop ds
pop bp
ret
_gotoxy endp
;-----------------------------------------------------------------------
_clearwindow proc
push bp
mov bp,sp
mov cx,[bp+4]
mov ax,[bp+6]
mov ch,al
mov dx,[bp+8]
mov ax,[bp+10]
mov dh,al
mov al,byte ptr cs:scroll_cnt ;Zero Lines Left.
mov ah,6 ;Scroll Up.
mov bx,[bp+12]
mov bh,bl
xor bl,bl
int 10h
pop bp
ret
_clearwindow endp
;-----------------------------------------------------------------------
_scroll_up proc
push bp
mov bp,sp
mov cx,[bp+4]
mov ax,[bp+6]
mov ch,al
mov dx,[bp+8]
mov ax,[bp+10]
mov dh,al
mov al,1 ;Zero Lines Left.
mov ah,6 ;Scroll Up.
mov bx,[bp+12]
mov bh,bl
xor bl,bl
int 10h
pop bp
ret
_scroll_up endp
;-----------------------------------------------------------------------
;_scroll_down proc
;
; push bp
; mov bp,sp
; mov cx,[bp+4]
; mov ax,[bp+6]
; mov ch,al
; mov dx,[bp+8]
; mov ax,[bp+10]
; mov dh,al
; mov al,1 ;Zero Lines Left.
; mov ah,7 ;Scroll Up.
; mov bx,[bp+12]
; mov bh,bl
; xor bl,bl
; int 10h
; pop bp
; ret
;_scroll_down endp
;-----------------------------------------------------------------------
_wherex proc
push ds
mov ax,cs
mov ds,ax
call where
xor ah,ah
mov al,curx
pop ds
ret
_wherex endp
;-----------------------------------------------------------------------
_wherey proc
push ds
mov ax,cs
mov ds,ax
call where
xor ah,ah
mov al,cury
pop ds
ret
_wherey endp
;-----------------------------------------------------------------------
where proc
mov bh,writepage
mov ah,3
int 10h
sub dl,xstart
sub dh,ystart
mov curx,dl
mov cury,dh
ret
where endp
_text ends
end