home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / CEXPRESS.ZIP / SCREEN.ASM / WRTCNTR.ASM < prev    next >
Assembly Source File  |  1989-05-03  |  4KB  |  115 lines

  1. ;void  write_center(strg,col,row,length,ln_color,strg_color);
  2. ;  unsigned char  *strg,col,row,length,ln_color,strg_color;
  3.  
  4.     EXTRN  _memory_model:byte
  5.     EXTRN  _video_buffer:word
  6.     EXTRN  _snow_protect:byte
  7.     EXTRN  _error_code:byte
  8.  
  9. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  10.     ASSUME CS:_TEXT
  11.     PUBLIC _write_center
  12. _write_center proc near
  13.     cld            ;direction flag forward
  14.     push bp            ;
  15.     mov  bp,sp        ;set stack frame
  16.     push di            ;
  17.     push si            ;
  18.     cmp  _memory_model,0    ;near or far?
  19.     jle  begin        ;jump if near
  20.     inc  bp            ;else add 2 to BP
  21.     inc  bp            ;
  22. begin:    push ds            ;DS changed for LODSB
  23.     mov  bl,_snow_protect    ;get _snow_protect before change DS
  24.     mov  ax,_video_buffer    ;fetch _video_buffer
  25.     mov  es,ax        ;ES pts to buffer
  26.     cmp  _memory_model,2    ;data near or far?
  27.     jb   L0            ;jump if near
  28.     lds  si,dword ptr[bp+4] ;DS:SI pts to Strg
  29.     inc  bp            ;add 2 to BP since dword ptr    
  30.     inc  bp            ;
  31.     jmp  short L00        ;
  32. L0:    mov  si,[bp+4]        ;near case
  33. L00:    sub  dx,dx        ;DX counts string length
  34.     push si            ;keep initial pointer position
  35. L000:    cmp  byte ptr[si],0    ;end of string?
  36.     je   L0000        ;jump if so
  37.     inc  si            ;inc ptr 
  38.     inc  dx            ;inc counter
  39.     jmp  short L000        ;loop till end
  40. L0000:    pop  si            ;restore ptr
  41.     sub  cx,cx        ;
  42.     mov  cl,[bp+10]        ;line length in CX
  43.     mov  [bp+10],bl        ;save _snow_protect
  44.     mov  byte ptr[bp+11],0    ;_error_code 0 = no error
  45.     sub  cx,dx        ;line len minus strg len
  46.     cmp  cx,0        ;Length greater than len(Strg)?
  47.     jge  L1            ;jump if so
  48.     sub  cx,cx        ;otherwise zero fill chars to write
  49.     mov  byte ptr[bp+11],1    ;_error_code 1 = Len(Strg) > Length
  50. L1:    mov  bx,cx        ;copy in BX
  51.     shr  cx,1        ;now one half in CX
  52.     sub  bx,cx        ;remainder in BX
  53.     push bx            ;push remainder for later
  54.     push dx            ;push strg len for later
  55.     sub  ax,ax        ;
  56.     mov  al,[bp+6]        ;Col in DI
  57.     mov  di,ax        ;
  58.     mov  al,[bp+8]        ;Row in AX
  59.     dec  ax            ;count from 0
  60.     mov  dl,160        ;bytes in a row
  61.     mul  dl            ;multiply times rows
  62.     dec  di            ;count from 0
  63.     shl  di,1        ;doubled for attri bytes
  64.     add  di,ax        ;now DI pts to cursor pos
  65.     mov  ah,[bp+12]        ;line attribute in AH
  66.     mov  al,32        ;space character
  67.     jcxz L3            ;jump if no chars to write
  68. L2:    call WriteIt        ;write space on right
  69.     loop L2            ;go do next
  70. L3:    pop  cx            ;string length
  71.     jcxz L5            ;jump ahead if null strg
  72.     mov  ah,[bp+14]        ;string attribute in AH
  73. L4:    lodsb            ;get a char from string
  74.     call WriteIt        ;write char and attribute
  75.     loop L4            ;go do next character
  76. L5:    pop  cx            ;number spaces on right
  77.     mov  ah,[bp+12]        ;line attribute in AH
  78.     mov  al,32        ;space character
  79.     jcxz L7            ;jump if no chars to write
  80. L6:    call WriteIt        ;go draw space on right
  81.     loop L6            ;go do next
  82. L7:    pop  ds            ;restore DS and quit
  83.     mov  al,[bp+11]        ;fetch _error_code
  84.     mov  _error_code,al    ;set it
  85.     pop  si            ;
  86.     pop  di            ;
  87.     pop  bp            ;
  88.     sti            ;reenable interrupts
  89.     cmp  _memory_model,0    ;quit
  90.     jle  quit        ;
  91.     db   0CBh        ;RET far
  92. quit:    ret            ;RET near
  93. _write_center endp
  94. Writeit    PROC            ;snowprotection procedure
  95.     push dx            ;save DX
  96.     mov  dx,es        ;get video buffer address
  97.     cmp  byte ptr[bp+10],0    ;protect against snow?
  98.     je   A3            ;jump ahead if not
  99.     mov  dx,3dah        ;status byte address
  100.     mov  bx,ax        ;save char-attri in BX
  101. A1:    in   al,dx        ;get status byte
  102.     test al,1        ;test bit
  103.     jnz  A1            ;loop till 0
  104.     cli            ;disable interrupts
  105. A2:    in   al,dx        ;get status byte
  106.     test al,1        ;test bit
  107.     jz   A2            ;loop till 1
  108.     mov  ax,bx        ;return char-attri to AX
  109. A3:    stosw            ;write the char and attri
  110.     pop  dx            ;restore DX and return
  111.     ret
  112. Writeit    endp
  113. _TEXT    ENDS
  114.     END
  115.