home *** CD-ROM | disk | FTP | other *** search
- ;--------------------------------------------------------------------
- ; Author : Kevin Dahl :
- ; Last Revised : June 7, 1986 :
- ; :
- ; FILENAME - V8.ENH :
- ; :
- ; FRAMEWIN :
- ; This routine frames the window that is currently defined :
- ; by turbo with the characters passed. :
- ; ENTRY :
- ; [bp+6] = Vertical character to use for window. :
- ; [bp+8] = Horizontal character to use for window. :
- ; [bp+10] = Lower right corner character of window. :
- ; [bp+12] = Lower left corner character of window. :
- ; [bp+14] = Upper right corner character of window. :
- ; [bp+16] = Upper left corner character of window. :
- ; :
- ; EXIT :
- ; Nothing is returned :
- ;--------------------------------------------------------------------
- framewin proc near
- push ds
- push bp ; save stack
- mov bp,sp
- mov ah,0fh ; get current video mode
- int 10h ; using BIOS services
- xor dx,dx ; zero out reg dx
- mov dl,ah ; save number columns per line
- cmp al,7 ; check for monochrome monitor
- je v35
- cmp al,3 ; check if text modes
- jbe v33 ; graphics mode - no write
- jmp v37
- v33: mov cx,7 ; set for 40 col text modes
- cmp dl,80 ; check for num of cols
- jb v34 ; 40 cols if jmp
- inc cx ; if get here then 80 cols
- v34:
- xor ax,ax ; zero out ax
- mov al,bh ; active display page for CGA
- shl ax,cl ; calc address for display page
- mov cx,0B800h ; address for CGA
- add ax,cx ; calc starting address
- jmp v36
- v35:
- mov ax,0B000h ; monochrome monitor address
- v36:
- mov es,ax ; video address into es
- mov bx,[0004] ; left col & top row
- mov cx,cs:[016Ah] ; right col & bottom row
-
- xor ax,ax
- mov al,cl ; right col into al
- sub al,bl ; right col - left col
- sub ax,2 ; # loops for hor char
- push ax ; save # loops for hor char
-
- xor ax,ax
- mov al,ch ; bottom row into al
- sub al,bh ; bottom row - top row
- sub ax,2
- push ax ; save # loops for vert char
-
- xor ax,ax
- mov al,bh ; top row into al
- xor bh,bh ; left col into into bl
- push dx ; save # cols/line
- mul dx ; row * #cols
- add ax,bx ; row * #cols + col offset
- shl ax,1 ; (row*#cols+col offset)*2
- mov di,ax ; 1st char offset into di
- pop bx ; # cols/line
- shl bx,1 ; # cols/line * 2
- push ax ; save offset for upper left corner
-
- push bp ; set base pointer for accessing
- mov bp,sp ; created parameters
-
- mov ah,[bp+24] ; upper left corner character
- mov cx,1 ; one character to display
- call dsphor ; display it
-
- mov ah,[bp+16] ; horizontal character
- mov cx,[bp+6] ; number of times to display
- call dsphor ; display it
-
- mov ah,[bp+22] ; upper right corner character
- mov cx,1 ; display it once
- call dsphor ; display it
-
- add di,bx ; move offset one row down
- sub di,2 ; adjust to correct col
- mov ah,[bp+14] ; vertical character
- mov cx,[bp+4] ; number of times to display
- call dspver ; display it
-
- mov di,[bp+2] ; upper left corner address
- add di,bx ; next row down
- mov cx,[bp+4] ; number of times to display
- call dspver ; display it
-
- mov ah,[bp+20] ; lower left corner character
- mov cx,1 ; display it once
- call dsphor ; display it
-
- mov ah,[bp+16] ; horizontal character
- mov cx,[bp+6] ; number of times to display
- call dsphor ; display it
-
- mov ah,[bp+18] ; lower right corner character
- mov cx,1 ; display it once
- call dsphor ; display it
-
- mov sp,bp ; reset the base and stack
- pop bp ; pointer registers
-
- mov ax,[0004] ; top row & left col of window
- mov bx,cs:[016Ah] ; bottom row & right col of window
- inc ah ; inc top row
- inc al ; inc left col
- dec bh ; dec bottom row
- dec bl ; dec right col
- mov [0004],ax ; save new top row & left col of window
- mov cs:[016Ah],bx ; save new bottom row & right col of window
- v37:
- mov sp,bp ; restore stack
- pop bp ; restore base pointer
- pop ds ; restore data segment
- ret 12 ; remove parameters and return
- framewin endp
-
- ;----- Display horizontal characters
-
- dsphor proc near
- mov dx,03DAh ; status port
- cld ; clear direction flag
- cli ; clear interrupts
- v38:
- in al,dx ; get status
- test al,1 ; is it low?
- jnz v38 ; wait until it is
- v39:
- in al,dx ; get status
- test al,1 ; is it high?
- jz v39 ; wait until it is
- mov es:byte ptr[di],ah ; display character byte
- add di,2 ; skip to next char position
- loop v38
- sti ; turn interrupts back on
- ret
- dsphor endp
-
- ;----- Display vertical characters
-
- dspver proc near
- mov dx,03DAh ; status port
- cld ; clear direction flag
- cli ; clear interrupts
- v40:
- in al,dx ; get status
- test al,1 ; is it low?
- jnz v40 ; wait until it is
- v41:
- in al,dx ; get status
- test al,1 ; is it high?
- jz v41 ; wait until it is
- mov es:byte ptr[di],ah ; display character byte
- add di,bx ; move to next row
- loop v40
- sti ; turn interrupts back on
- ret
- dspver endp