home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / utils / miscutil.zip / TBWINDOW.ZIP / QPRINTC.ASM < prev    next >
Assembly Source File  |  1987-06-05  |  6KB  |  111 lines

  1.                 title   QPRINTC
  2.                 page    60,132
  3.  
  4. Attr            equ     [bp + 06h]      ; ATTR%
  5. SnoChk          equ     [bp + 0Ah]      ; SNOCHK%
  6. StrDat          equ     [bp + 0Eh]      ; STRDAT$
  7. ColL            equ     [bp + 12h]      ; COLL%
  8. ColR            equ     [bp + 16h]      ; COLR%
  9. Row             equ     [bp + 1Ah]      ; ROW%
  10.  
  11. program         segment                 ; begin program segment
  12.                 assume  cs:program      ; parameters on stack
  13.                 push    bp              ; save registers for return
  14.                 mov     bp,sp           ; establish addressibility of stack
  15.                 push    ds              ; save cause we will manipulate
  16.                 push    es              ; ditto
  17.                 les     di, StrDat      ; load length address
  18.                 mov     cx, es:[di]     ; load length into cx
  19.                 and     cx, 7FFFh       ; and off high byte
  20.                 jcxz    GetOut          ; quit if empty string
  21.                 push    cx
  22.                 mov     dx, ds:[0]      ; get the beginning of the string segment from ds:[0]
  23.                 push    dx              ; push data segment onto stack
  24.                 pop     ds              ; make ds point to string segment
  25.                 mov     si, es:[di + 2] ; get offset into string segment from es:[di + 2]
  26.                 push    ds              ; save address of string to write to screen
  27.                 push    si              ;
  28. Scr_Check:      mov     ah, 15          ; function to get current video state
  29.                 int     10h             ; video bios call
  30.                 mov     dx, 0B000h      ; assume mono
  31.                 push    dx
  32.                 pop     es
  33.                 mov     dx, 03BAh       ; address of 6845 chip for mono
  34.                 cmp     al, 7           ; is it mono?
  35.                 jz      Store_Screen    ; it sure is!
  36.                 mov     dx, 0B800h      ; no - it must be color
  37.                 push    dx
  38.                 pop     es
  39.                 mov     dx, 03DAh       ; address of 6845 chip for CGA
  40. Store_Screen:   push    es              ; push es onto stack - screen segment
  41.                 lds     di, ColL        ; get the address of the left column
  42.                 mov     bx, ds:[di]     ; BX has the left column
  43.                 lds     di, ColR        ; get the address of the right column
  44.                 mov     cx, ds:[di]     ; CX has the left column
  45.                 add     bx,cx           ; total them
  46.                 lds     di, StrDat      ; point to string data
  47.                 mov     cx, ds:[di]     ; get length again
  48.                 and     cx, 7FFFh       ; and off high bit
  49.                 shr     bx, 1           ; divide by 2
  50.                 shr     cx, 1           ;    "   "  "
  51.                 sub     bx,cx           ; subtract length of string
  52.                 dec     bx              ; convert into 0-79
  53.                 shl     bx, 1           ; multiply by 2 to accomodate attributes
  54.                 lds     si, Row         ; get the address of the line
  55.                 mov     ax, ds:[si]     ; get line (1-25)
  56.                 dec     ax              ; convert to 0-24
  57. CalcScrnOff:    mov     cl, 05          ; Times 160 bytes per line
  58.                 shl     ax, cl          ; First x 32
  59.                 mov     cx, ax          ; Temp Hold
  60.                 shl     ax, 1
  61.                 shl     ax, 1           ; x 128
  62.                 add     cx, ax          ; X128 + X32 = X160
  63.                 add     bx, cx          ; Add column
  64.                 lds     si, Attr        ; get the address of the attribute
  65.                 mov     ax, ds:[si]     ; load attribute into ax
  66.                 pop     es              ; ditto
  67.                 lds     si, SnoChk      ; Snow Check if not 0
  68.                 mov     cx, ds:[si]     ; to CX
  69.                 jcxz    Snow
  70.                 pop     si              ; ditto
  71.                 pop     ds              ; ditto
  72.                 pop     cx              ; get length back
  73.                 mov     di, bx          ; move over to line/column
  74.                 cld                     ; Clear direction flags
  75. NoSnow1:        movsb                   ; AX has attribute to spread
  76.                 mov     es:[di], al     ; Put attribute
  77.                 inc     di
  78.                 loop    NoSnow1
  79. GetOut:         jmp     endit
  80. Snow:           pop     si              ; get length back
  81.                 pop     ds              ; ditto
  82.                 pop     cx              ; ditto
  83.                 mov     di, bx          ; move over to line/column
  84.                 cld                     ; Clear direction flags
  85.                 cli
  86. Snow1:          push    ax
  87. WaitLo1:        in      al, dx          ; get status
  88.                 shr     al, 1           ; is it low?
  89.                 jc      WaitLo1         ; wait until it is
  90. WaitHi1:        in      al, dx          ; get status
  91.                 shr     al, 1           ; is it high?
  92.                 jnc     WaitHi1         ; wait until it is
  93.                 movsb
  94. WaitLo2:        in      al, dx          ; get status
  95.                 shr     al, 1           ; is it low?
  96.                 jc      WaitLo2         ; wait until it is
  97. WaitHi2:        in      al, dx          ; get status
  98.                 shr     al, 1           ; is it high?
  99.                 jnc     WaitHi2         ; wait until it is
  100.                 pop     ax
  101.                 mov     es:[di], al     ; move attribute byte
  102.                 inc     di
  103.                 loop    Snow1           ; go until all bytes moved
  104.                 sti
  105. Endit:          pop     es              ; pop and restore all the registers
  106.                 pop     ds
  107.                 pop     bp
  108. program         ends                    ; end program segment
  109.                 end
  110.  
  111.