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

  1. ;void  wrapln_b(strg,col,row,left,right,color);
  2. ;  unsigned char  *strg,*col,*row,left,right,color;
  3.  
  4.     EXTRN  _memory_model:byte
  5.     EXTRN  _video_page:byte
  6.  
  7. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  8.     ASSUME CS:_TEXT
  9.     PUBLIC _wrapln_b
  10. _wrapln_b proc near
  11.     cld            ;direction flag forward
  12.     push bp            ;
  13.     mov  bp,sp        ;set stack frame
  14.     push di            ;
  15.     push si            ;
  16.     cmp  _memory_model,0    ;near or far?
  17.     jle  begin        ;jump if near
  18.     inc  bp            ;else add 2 to BP
  19.     inc  bp            ;
  20. begin:    push ds            ;save Turbo's DS
  21.     jmp  short start    ;jump over local data
  22. strg    dd   ?            ;
  23. row    dd   ?            ;
  24. col    dd   ?            ;
  25. start:    mov  bh,_video_page    ;set the video page
  26.     cmp  _memory_model,2    ;data near or far?
  27.     jb   A0            ;jump if near
  28.     lds  si,dword ptr[bp+4]    ;point DS:SI to Strg
  29.     mov  word ptr cs:strg,si
  30.     mov  word ptr cs:strg+2,ds
  31.     lds  si,dword ptr[bp+8]    ;point DS:SI to Col
  32.     mov  word ptr cs:col,si
  33.     mov  word ptr cs:col+2,ds
  34.     lds  si,dword ptr[bp+12];point DS:SI to Row
  35.     mov  word ptr cs:row,si
  36.     mov  word ptr cs:row+2,ds
  37.     add  bp,6        ;additional offset since dword ptrs    
  38.     jmp  short A00        ;
  39. A0:    mov  si,[bp+4]        ;Strg
  40.     mov  word ptr cs:strg,si
  41.     mov  word ptr cs:strg+2,ds
  42.     mov  si,[bp+6]        ;Col
  43.     mov  word ptr cs:col,si
  44.     mov  word ptr cs:col+2,ds
  45.     mov  si,[bp+8]        ;Row
  46.     mov  word ptr cs:row,si
  47.     mov  word ptr cs:row+2,ds
  48. A00:    mov  bl,[bp+14]        ;set the attribute
  49.     mov  dh,[si]        ;row in DH
  50.     dec  dh            ;count from 0
  51.     cmp  dh,24        ;in range?
  52.     jna  B1            ;jump ahead if not
  53. A1:    jmp  P1            ;quit routine
  54. B1:    lds  si,cs:dword ptr col ;point DS:SI to Col
  55.     mov  dl,[si]        ;col in DL
  56.     dec  dl            ;count from 0
  57.     cmp  dl,79        ;in range?
  58.     ja   A1            ;quit if not
  59.     mov  ch,[bp+10]        ;Left border col to CH
  60.     dec  ch            ;count from 0
  61.     cmp  ch,79        ;in range?
  62.     ja   A1            ;quit if not
  63.     mov  cl,[bp+12]        ;Right border col to CL
  64.     dec  cl            ;count from 0
  65.     cmp  cl,79        ;in range?
  66.     ja   A1            ;quit if not
  67.     cmp  cl,ch        ;margins OK?
  68.     jbe  A1            ;quit routine if not
  69.     cmp  dl,cl        ;wrapcol left of margin?
  70.     ja   A1            ;quit if not
  71.     cmp  dl,ch        ;wrapcol right of margin?
  72.     jb   A1            ;quit if not
  73.     lds  si,cs:dword ptr strg ;point DS:SI to strg
  74.     sub  ax,ax        ;clear AX
  75.     push si            ;figure string length
  76. B2:    cmp  byte ptr[si],0    ;end of string?
  77.     je   B3            ;
  78.     inc  ax            ;inc counter
  79.     inc  si            ;inc strg ptr
  80.     jmp  short B2        ;
  81. B3:    pop  si            ;
  82.     or   ax,ax        ;test for null
  83.     jz   A1            ;quit if null
  84.     add  ax,si        ;AX=SI at last char
  85.     mov  di,ax        ;keep stop point in DI
  86.     push si            ;save string ptr
  87.     push dx            ;save cursor position
  88. C1:    lodsb            ;get a char
  89.     cmp  al,32        ;a space?
  90.     jne  F1            ;skip ahead if not
  91.     add  sp,4        ;balance stack
  92.     push si            ;save new string ptr
  93.     push dx            ;save cursor position
  94.     cmp  dl,ch        ;start of row?
  95.     jne  F1            ;jmp ahead if not
  96.     inc  si            ;inc SI for test
  97.     cmp  si,di        ;cmp to EOL value
  98.     jg   D1            ;skip if end of string
  99.     dec  si            ;readjust SI
  100.     cmp  [si],al        ;next char a space?
  101.     jne  E1            ;jump ahead if not
  102.     cmp  [si+1],al        ;next char a space?
  103.     jne  E1            ;jump ahead if not
  104.     jmp  short F1        ;else write initial spcs
  105. D1:    dec  si            ;readjust SI
  106. E1:    cmp  si,di        ;end of string?
  107.     jnae C1            ;continue if not
  108.     dec  dl            ;adjust column position
  109.     jmp  L1            ;go to exit code
  110. F1:    push ax            ;save char in AL
  111.     mov  ah,2        ;func to set cursor
  112.     int  10h        ;set the cursor
  113.     pop  ax            ;restore character
  114.     push cx            ;save margin positions
  115.     mov  ah,9        ;func to write char
  116.     mov  cx,1        ;number chars to write
  117.     int  10h        ;write it
  118.     pop  cx            ;restore margin positions
  119.     cmp  si,di        ;end of string yet?
  120.     je   L1            ;jump ahead if so
  121.     cmp  dl,cl        ;right margin?
  122.     je   G1            ;jump ahead if so
  123.     inc  dl            ;forward Col
  124.     jmp  C1            ;go do next char
  125. G1:    mov  al,32        ;clear EOL with spc char
  126.     cmp  [si-1],al        ;current char a space?
  127.     je   K1            ;suitable end of line
  128.     cmp  [si],al        ;is next char a space?
  129.     je   K1            ;suitable end of line
  130.     pop  ax            ;get prior cursor pos
  131.     cmp  al,ch        ;no spc in line?
  132.     jne  H1            ;jump if not the case
  133.     add  sp,2        ;balance stack
  134.     jmp  short J1        ;jump, don't backtrack
  135. H1:    pop  si            ;prior string position
  136.     mov  dl,al        ;prior cursor col
  137.     push ax            ;function changes AL
  138.     mov  ah,2        ;func to set cursor
  139.     int  10h        ;reset the cursor
  140.     pop  ax            ;restore AL
  141.     mov  ah,cl        ;right margin pos
  142.     sub  ah,al        ;minus current pos
  143.     push cx            ;save margin positions
  144.     sub  cx,cx        ;clear cx
  145.     mov  cl,ah        ;number chars to write
  146.     inc  cx            ;plus one
  147.     jcxz I1            ;jump if none
  148.     mov  ah,9        ;func to write chars
  149.     mov  al,32        ;write space chars
  150.     int  10h        ;clear to eol
  151. I1:    pop  cx            ;restore margin pos
  152. J1:    inc  dh            ;forward to next row
  153.     cmp  dh,25        ;off screen?
  154.     je   M1            ;jump if so
  155.     mov  dl,ch        ;leftmost column
  156.     push si            ;save string ptr
  157.     push dx            ;save cursor position
  158.     jmp  C1            ;continue
  159. K1:    inc  dh            ;point to next row
  160.     mov  dl,ch        ;back to left margin
  161.     cmp  dh,24        ;off screen?
  162.     ja   L1            ;quit if so
  163.     add  sp,4        ;take values off stack
  164.     push si            ;save string position
  165.     push dx            ;save cursor position
  166.     jmp  C1            ;go do next char
  167. L1:    add  sp,4        ;balance stack
  168. M1:    cmp  dl,cl        ;ending on right margin?
  169.     jne  N1            ;jump ahead if not
  170.     inc  dh            ;forward to next row
  171.     mov  dl,ch        ;new Col at left margin
  172.     jmp  short O1        ;jump ahead
  173. N1:    inc  dl            ;adjust column position
  174. O1:    inc  dh            ;count rows from 1
  175.     inc  dl            ;count cols from 1
  176.     lds  si,cs:dword ptr row ;point DS:SI to row
  177.     mov  [si],dh        ;save new row position
  178.     lds  si,cs:dword ptr col ;point DS:SI to col
  179.     mov  [si],dl        ;save new col position
  180. P1:    pop  ds            ;
  181.     pop  si            ;
  182.     pop  di            ;
  183.     pop  bp            ;
  184.     cmp  _memory_model,0    ;quit
  185.     jle  quit        ;
  186.     db   0CBh        ;RET far
  187. quit:    ret            ;RET near
  188. _wrapln_b endp
  189. _TEXT    ENDS
  190.     END
  191.