home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TUR6_101.ZIP / V8.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-06-07  |  9.4 KB  |  173 lines

  1. ;--------------------------------------------------------------------
  2. ; Author       : Kevin Dahl                                         :
  3. ; Last Revised : June 7, 1986                                       :
  4. ;                                                                   :
  5. ; FILENAME - V8.ENH                                                 :
  6. ;                                                                   :
  7. ; FRAMEWIN                                                          :
  8. ;        This routine frames the window that is currently defined   :
  9. ;        by turbo with the characters passed.                       :
  10. ; ENTRY                                                             :
  11. ;        [bp+6]  = Vertical character to use for window.            :
  12. ;        [bp+8]  = Horizontal character to use for window.          :
  13. ;        [bp+10] = Lower right corner character of window.          :
  14. ;        [bp+12] = Lower left corner character of window.           :
  15. ;        [bp+14] = Upper right corner character of window.          :
  16. ;        [bp+16] = Upper left corner character of window.           :
  17. ;                                                                   :
  18. ; EXIT                                                              :
  19. ;        Nothing is returned                                        :
  20. ;--------------------------------------------------------------------
  21. framewin      proc      near
  22.               push      ds
  23.               push      bp                       ; save stack
  24.               mov       bp,sp
  25.               mov       ah,0fh                   ; get current video mode
  26.               int       10h                      ; using BIOS services
  27.               xor       dx,dx                    ; zero out reg dx
  28.               mov       dl,ah                    ; save number columns per line
  29.               cmp       al,7                     ; check for monochrome monitor
  30.               je        v35
  31.               cmp       al,3                     ; check if text modes
  32.               jbe       v33                      ; graphics mode - no write
  33.               jmp       v37
  34. v33:          mov       cx,7                     ; set for 40 col text modes
  35.               cmp       dl,80                    ; check for num of cols
  36.               jb        v34                      ; 40 cols if jmp
  37.               inc       cx                       ; if get here then 80 cols
  38. v34:
  39.               xor       ax,ax                    ; zero out ax
  40.               mov       al,bh                    ; active display page for CGA
  41.               shl       ax,cl                    ; calc address for display page
  42.               mov       cx,0B800h                ; address for CGA
  43.               add       ax,cx                    ; calc starting address
  44.               jmp       v36
  45. v35:
  46.               mov       ax,0B000h                ; monochrome monitor address
  47. v36:
  48.               mov       es,ax                    ; video address into es
  49.               mov       bx,[0004]                ; left col & top row
  50.               mov       cx,cs:[016Ah]            ; right col & bottom row
  51.  
  52.               xor       ax,ax
  53.               mov       al,cl                    ; right col into al
  54.               sub       al,bl                    ; right col - left col
  55.               sub       ax,2                     ; # loops for hor char
  56.               push      ax                       ; save # loops for hor char
  57.  
  58.               xor       ax,ax
  59.               mov       al,ch                    ; bottom row into al
  60.               sub       al,bh                    ; bottom row - top row
  61.               sub       ax,2
  62.               push      ax                       ; save # loops for vert char
  63.  
  64.               xor       ax,ax
  65.               mov       al,bh                    ; top row into al
  66.               xor       bh,bh                    ; left col into into bl
  67.               push      dx                       ; save # cols/line
  68.               mul       dx                       ; row * #cols
  69.               add       ax,bx                    ; row * #cols + col offset
  70.               shl       ax,1                     ; (row*#cols+col offset)*2
  71.               mov       di,ax                    ; 1st char offset into di
  72.               pop       bx                       ; # cols/line
  73.               shl       bx,1                     ; # cols/line * 2
  74.               push      ax                       ; save offset for upper left corner
  75.  
  76.               push      bp                       ; set base pointer for accessing
  77.               mov       bp,sp                    ; created parameters
  78.  
  79.               mov       ah,[bp+24]               ; upper left corner character
  80.               mov       cx,1                     ; one character to display
  81.               call      dsphor                   ; display it
  82.  
  83.               mov       ah,[bp+16]               ; horizontal character
  84.               mov       cx,[bp+6]                ; number of times to display
  85.               call      dsphor                   ; display it
  86.  
  87.               mov       ah,[bp+22]               ; upper right corner character
  88.               mov       cx,1                     ; display it once
  89.               call      dsphor                   ; display it
  90.  
  91.               add       di,bx                    ; move offset one row down
  92.               sub       di,2                     ; adjust to correct col
  93.               mov       ah,[bp+14]               ; vertical character
  94.               mov       cx,[bp+4]                ; number of times to display
  95.               call      dspver                   ; display it
  96.  
  97.               mov       di,[bp+2]                ; upper left corner address
  98.               add       di,bx                    ; next row down
  99.               mov       cx,[bp+4]                ; number of times to display
  100.               call      dspver                   ; display it
  101.  
  102.               mov       ah,[bp+20]               ; lower left corner character
  103.               mov       cx,1                     ; display it once
  104.               call      dsphor                   ; display it
  105.  
  106.               mov       ah,[bp+16]               ; horizontal character
  107.               mov       cx,[bp+6]                ; number of times to display
  108.               call      dsphor                   ; display it
  109.  
  110.               mov       ah,[bp+18]               ; lower right corner character
  111.               mov       cx,1                     ; display it once
  112.               call      dsphor                   ; display it
  113.  
  114.               mov       sp,bp                    ; reset the base and stack
  115.               pop       bp                       ; pointer registers
  116.  
  117.               mov       ax,[0004]                ; top row & left col of window
  118.               mov       bx,cs:[016Ah]            ; bottom row & right col of window
  119.               inc       ah                       ; inc top row
  120.               inc       al                       ; inc left col
  121.               dec       bh                       ; dec bottom row
  122.               dec       bl                       ; dec right col
  123.               mov       [0004],ax                ; save new top row & left col of window
  124.               mov       cs:[016Ah],bx            ; save new bottom row & right col of window
  125. v37:
  126.               mov       sp,bp                    ; restore stack
  127.               pop       bp                       ; restore base pointer
  128.               pop       ds                       ; restore data segment
  129.               ret       12                       ; remove parameters and return
  130. framewin      endp
  131.  
  132. ;----- Display horizontal characters
  133.  
  134. dsphor        proc      near
  135.               mov       dx,03DAh                 ; status port
  136.               cld                                ; clear direction flag
  137.               cli                                ; clear interrupts
  138. v38:
  139.               in        al,dx                    ; get status
  140.               test      al,1                     ; is it low?
  141.               jnz       v38                      ; wait until it is
  142. v39:
  143.               in        al,dx                    ; get status
  144.               test      al,1                     ; is it high?
  145.               jz        v39                      ; wait until it is
  146.               mov       es:byte ptr[di],ah       ; display character byte
  147.               add       di,2                     ; skip to next char position
  148.               loop      v38
  149.               sti                                ; turn interrupts back on
  150.               ret
  151. dsphor        endp
  152.  
  153. ;----- Display vertical characters
  154.  
  155. dspver        proc      near
  156.               mov       dx,03DAh                 ; status port
  157.               cld                                ; clear direction flag
  158.               cli                                ; clear interrupts
  159. v40:
  160.               in        al,dx                    ; get status
  161.               test      al,1                     ; is it low?
  162.               jnz       v40                      ; wait until it is
  163. v41:
  164.               in        al,dx                    ; get status
  165.               test      al,1                     ; is it high?
  166.               jz        v41                      ; wait until it is
  167.               mov       es:byte ptr[di],ah       ; display character byte
  168.               add       di,bx                    ; move to next row
  169.               loop      v40
  170.               sti                                ; turn interrupts back on
  171.               ret
  172. dspver        endp
  173.