; GETCD.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, _textback, _textfore, _cursor_off
Public _cursor_on, _set_write_vpage, _set_disp_vpage, _get_disp_vpage
Public _get_writ_vpage, _get_vmode, _get_vcols, _vset_repeat, _vputch
Public _sprintstr, _inc_cursor, _wherey, _blink, _intensity
Public _wherex, _gotoxy, _clearwindow, _ega_43_line, _ega_25_line
Public _ch_attrib, _scroll_up, _scroll_down, _setscroll, _bang, _delay
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
mov cx,9
mov di,0
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
pop di
pop ds
ret
_delay endp
;-------------------------------------------------------------------------
_bang proc
mov cx,12
bangagain: push cx
mov ah,6
mov al,2
mov bh,7
mov cx,0c00h
mov dx,194fh
int 10h
mov ah,7
mov al,2
mov bh,7
mov cx,0
mov dx,0c4fh
int 10h
pop cx
loop bangagain
ret
_bang endp
;-----------------------------------------------------------------------
_ch_attrib proc
push bp
mov bp,sp
mov ax,[bp+4]
mov cl,al
push cx
mov bh,cs:displaypage ;Get character at cursor location to AL.
mov ah,8
int 10h
pop cx ;Put character down with new attribute.
mov bl,cl
mov bh,cs:displaypage
mov ah,9
mov cx,1
int 10h
pop bp
ret
_ch_attrib endp
;------------------------------------------------------------------------
_setcolor proc
push bp
mov bp,sp
mov ax,[bp+4]
mov cs:txt_attrib,al
pop bp
ret
_setcolor endp
;-----------------------------------------------------------------------
_setscroll proc
push bp
mov bp,sp
mov ax,[bp+4]
mov cs:scroll_cnt,al
pop bp
ret
_setscroll endp
;-----------------------------------------------------------------------
_textback proc
push bp
mov bp,sp
mov ax,[bp+4]
and ax,7 ;Mask Out Unwanted data.
mov cl,4
shl al,cl ;Move color to background spot.
and cs:txt_attrib,8fh ;Mask out old background color.
or cs:txt_attrib,al ;Put in new background color.
pop bp
ret
_textback endp
;-----------------------------------------------------------------------
_textfore proc
push bp
mov bp,sp
mov ax,[bp+4]
and ax,7 ;Mask Out Unwanted data.
and cs:txt_attrib,0f8h ;Mask out old foreground color.
or cs:txt_attrib,al ;Put in new foreground color.
pop bp
ret
_textfore endp
;-----------------------------------------------------------------------
_cursor_off proc
mov ah,3
int 10h ;Get cursor type.
mov cs:old_cursor,cx ;Save type.
mov cx,0e00h ;Value for hidden cursor.
mov ah,1
int 10h ;Set cursor type.
ret
_cursor_off endp
;-----------------------------------------------------------------------
_cursor_on proc
mov ah,1
mov cx,cs:old_cursor
int 10h
ret
_cursor_on 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
;-----------------------------------------------------------------------
_set_disp_vpage proc
push bp
mov bp,sp
mov ax,[bp+4]
mov cs:displaypage,al
mov ah,5
int 10h
pop bp
ret
_set_disp_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_writ_vpage proc
mov al,cs:writepage
xor ah,ah
ret
_get_writ_vpage endp
;-----------------------------------------------------------------------
_get_vmode proc
mov ah,0fh
int 10h
mov cs:videocols,ah
mov cs:displaypage,bh
xor ah,ah ;Return Mode in AL.
ret
_get_vmode endp
;-----------------------------------------------------------------------
_get_vcols proc
call _wherex
mov ah,0fh
int 10h
mov al,ah
xor ah,ah
mov cs:videocols,al
ret
_get_vcols endp
;-----------------------------------------------------------------------
_vset_repeat proc
push bp
mov bp,sp
mov ax,[bp+4]
mov cs:repeat_cnt,ax
pop bp
ret
_vset_repeat 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
;-----------------------------------------------------------------------
_ega_43_line proc
mov ax,3 ;Color 80 X 25
mov bx,0
int 10h
mov ax,1112h ;43 Line mode.
int 10h
mov ax,0 ;GotoXY 0,0
push ax
push ax
call _gotoxy
push ds
xor ax,ax
mov ds,ax
or byte ptr ds:[487h],1
pop ds
mov ah,1 ;Change cursor type.
mov cx,600h
int 10h
mov ax,1200h ;Alternate printscreen routine.
mov bx,20h
int 10h
ret
_ega_43_line endp
;-----------------------------------------------------------------------
_ega_25_line proc
mov ax,3 ;Color 80 X 25
mov bx,0
int 10h
mov ax,0 ;GotoXY 0,0
push ax
push ax
call _gotoxy
push ds
xor ax,ax
mov ds,ax
and byte ptr ds:[487h],254
pop ds
mov ah,1 ;Change cursor type.
mov cx,607h
int 10h
ret
_ega_25_line endp
;-----------------------------------------------------------------------
_blink proc
push bp
mov bp,sp
mov ax,[bp+4]
and cs:txt_attrib,7fh
mov cl,7
shl al,cl
or cs:txt_attrib,al
pop bp
ret
_blink endp
;-----------------------------------------------------------------------
_intensity proc
push bp
mov bp,sp
mov ax,[bp+4]
and cs:txt_attrib,0f7h
mov cl,3
shl al,cl
or cs:txt_attrib,al
pop bp
ret
_intensity endp
;------------------------------------------------form-------------------
_text ends
end