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

  1. ;void  wrapln(strg,col,row,left,right,color);
  2. ;  unsigned char  *strg,*col,*row,left,right,color;
  3.  
  4.     EXTRN  _memory_model:byte
  5.     EXTRN  _video_buffer:word
  6.     EXTRN  _snow_protect:byte
  7.  
  8. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  9.     ASSUME CS:_TEXT
  10.     PUBLIC _wrapln
  11. _wrapln  proc near
  12.     cld            ;direction flag forward
  13.     push bp            ;
  14.     mov  bp,sp        ;set stack frame
  15.     push di            ;
  16.     push si            ;
  17.     cmp  _memory_model,0    ;near or far?
  18.     jle  begin        ;jump if near
  19.     inc  bp            ;else add 2 to BP
  20.     inc  bp            ;
  21. begin:    jmp  short start    ;jump over local data
  22. strg    dd   ?            ;
  23. row    dd   ?            ;
  24. col    dd   ?            ;
  25. start:    mov  ax,_video_buffer    ;get video address
  26.     mov  es,ax        ;move to ES
  27.     push ds            ;DS changed for LODSB
  28.     cmp  _memory_model,2    ;data near or far?
  29.     jb   A1            ;jump if near
  30.     lds  si,dword ptr[bp+4]    ;point DS:SI to Strg
  31.     mov  word ptr cs:strg,si
  32.     mov  word ptr cs:strg+2,ds
  33.     lds  si,dword ptr[bp+8]    ;point DS:SI to Col
  34.     mov  word ptr cs:col,si
  35.     mov  word ptr cs:col+2,ds
  36.     lds  si,dword ptr[bp+12];point DS:SI to Row
  37.     mov  word ptr cs:row,si
  38.     mov  word ptr cs:row+2,ds
  39.     add  bp,6        ;additional offset since dword ptrs    
  40.     jmp  short B1        ;
  41. A1:    mov  si,[bp+4]        ;Strg
  42.     mov  word ptr cs:strg,si
  43.     mov  word ptr cs:strg+2,ds
  44.     mov  si,[bp+6]        ;Col
  45.     mov  word ptr cs:col,si
  46.     mov  word ptr cs:col+2,ds
  47.     mov  si,[bp+8]        ;Row
  48.     mov  word ptr cs:row,si
  49.     mov  word ptr cs:row+2,ds
  50. B1:    sub  ax,ax        ;
  51.     mov  al,[si]        ;place row in AX
  52.     dec  ax            ;count from 0
  53.     cmp  ax,24        ;in range?
  54.     jna  D1            ;jump ahead if not
  55. C1:    jmp  Q1            ;quit routine
  56. D1:    mov  dl,160        ;bytes in a row
  57.     mul  dl            ;times rows
  58.     mov  cx,ax        ;transfer offset to CX
  59.     lds  si,cs:dword ptr col ;point DS:SI to Col
  60.     sub  bx,bx        ;
  61.     mov  bl,[si]        ;place in DI
  62.     mov  di,bx        ;
  63.     dec  di            ;count from 0
  64.     cmp  di,79        ;in range?
  65.     ja   C1            ;quit if not
  66.     shl  di,1        ;double for attributes
  67.     add  di,cx        ;ES:DI pts to row,col
  68.     sub  dx,dx        ;
  69.     mov  dl,[bp+10]        ;Left border col to DX
  70.     sub  bx,bx        ;
  71.     mov  bl,[bp+12]        ;Right border col to BX
  72.     cmp  bx,dx        ;margins OK?
  73.     jbe  C1            ;quit routine if not
  74.     dec  dx            ;count cols from 0
  75.     cmp  dx,79        ;in range?
  76.     ja   C1            ;quit if not
  77.     dec  bx            ;dec text
  78.     cmp  bx,79        ;in range?
  79.     ja   C1            ;quit if not
  80.     inc  bx            ;readjust
  81.     shl  dx,1        ;double for attributes
  82.     shl  bx,1        ;ditto
  83.     add  dx,cx        ;add row offset
  84.     add  bx,cx        ;ditto
  85.     cmp  dx,di        ;wrapcol rt of wrapleft?
  86.     ja   C1            ;quit if not
  87.     cmp  bx,di        ;wrapcol left of wraprow?
  88.     jbe  C1            ;quit if not
  89.     lds  si,cs:dword ptr strg ;point DS:SI to Strg
  90.     sub  cx,cx        ;get string length
  91.     push si            ;
  92. E1:    cmp  byte ptr[si],0    ;end of string?
  93.     je   F1            ;
  94.     inc  cx            ;inc counter
  95.     inc  si            ;inc strg ptr
  96.     jmp  short E1        ;
  97. F1:    pop  si            ;
  98.     jcxz C1            ;quit if null
  99.     add  cx,si        ;CX=SI at last char
  100.     push si            ;save string ptr
  101.     push di            ;save screen ptr
  102.     mov  ah,[bp+14]        ;get color
  103. G1:    lodsb            ;get a char
  104.     cmp  al,32        ;a space?
  105.     jne  J1            ;skip ahead if not
  106.     add  sp,4        ;balance stack
  107.     push si            ;save new string ptr
  108.     push di            ;save new screen ptr
  109.     cmp  di,dx        ;start of row?
  110.     jne  J1            ;jmp ahead if not
  111.     inc  si            ;inc SI for test
  112.     cmp  si,cx        ;cmp to EOL value
  113.     jg   H1            ;skip if end of string
  114.     dec  si            ;readjust SI
  115.     cmp  [si],al        ;next char a space?
  116.     jne  I1            ;jump ahead if not
  117.     cmp  [si+1],al        ;next char a space?
  118.     jne  I1            ;jump ahead if not
  119.     jmp  short J1        ;else write initial spcs
  120. H1:    dec  si            ;readjust SI
  121. I1:    cmp  si,cx        ;end of string?
  122.     jae  N1            ;jump out of loop if so
  123.     jmp  short G1        ;else delete initial spc
  124. J1:    call Writeit        ;write a character
  125.     cmp  si,cx        ;end of string yet?
  126.     je   N1            ;jump ahead if so
  127.     cmp  di,bx        ;right margin?
  128.     jne  G1            ;if not, go do next char
  129.     mov  al,32        ;clear EOL with spc char
  130.     cmp  [si-1],al        ;current char a space?
  131.     je   M1            ;suitable end of line
  132.     cmp  [si],al        ;is next char a space?
  133.     je   M1            ;suitable end of line
  134.     pop  di            ;scrn pos of prior space
  135.     cmp  di,dx        ;right col yet?
  136.     jne  K1            ;jump is not
  137.     push di            ;else save screen ptr
  138.     jmp  short M1        ;go adjust for next line
  139. K1:    pop  si            ;string pos of prior space
  140.     push si            ;save string ptr
  141.     push di            ;save screen ptr
  142. L1:    mov  al,32        ;write spc to end of line
  143.     call Writeit        ;write a character
  144.     cmp  di,bx        ;end of line?
  145.     jne  L1            ;write another spc if not
  146. M1:    add  dx,160        ;left margin to next row
  147.     add  bx,160        ;right margin to next row
  148.     cmp  bx,4000        ;off screen?
  149.     ja   N1            ;quit if so
  150.     pop  di            ;restore prior screen ptr
  151.     mov  di,dx        ;scrn ptr to left margin
  152.     push di            ;save the position
  153.     jmp  short G1        ;go do next char
  154. N1:    add  sp,4        ;balance stack
  155.     sti            ;reenable interrupts
  156.     cmp  di,bx        ;ending on right margin?
  157.     jne  O1            ;jump ahead if not
  158.     mov  ax,dx        ;left margin value to AX
  159.     add  ax,160        ;point 1 row below
  160.     jmp  short P1        ;use value to set row-col
  161. O1:    mov  ax,di        ;screen pointer to AX
  162. P1:    shr  ax,1        ;minus attri byte count
  163.     mov  dl,80        ;columns in a row
  164.     div  dl            ;divide
  165.     sub  bx,bx        ;clear BX
  166.     mov  bl,ah        ;remainder in BX
  167.     sub  ah,ah        ;quotient in AX
  168.     inc  ax            ;count rows from 1
  169.     inc  bx            ;count cols from 1
  170.     mov  dx,ax        ;free AX
  171.     lds  si,cs:dword ptr row ;point DS:SI to Row
  172.     mov  [si],dl        ;save new row position
  173.     lds  si,cs:dword ptr col ;point DS:SI to Col
  174.     mov  [si],bl        ;save new col position
  175. Q1:    pop  ds            ;
  176.     pop  si            ;
  177.     pop  di            ;
  178.     pop  bp            ;
  179.     cmp  _memory_model,0    ;quit
  180.     jle  quit        ;
  181.     db   0CBh        ;RET far
  182. quit:    ret            ;RET near
  183. _wrapln  endp
  184. Writeit    PROC
  185.     push dx            ;--------PROCEDURE BEGINS
  186.     push bx            ;save DX and BX
  187.     mov  dx,es        ;get video buffer address
  188.     cmp  dx,0b800h        ;test for graphics card
  189.     jb   T1            ;jump if not graphics
  190.     mov  dx,3dah        ;status byte address
  191.     mov  bx,ax        ;save char-attri in BX
  192. R1:    in   al,dx        ;get status byte
  193.     test al,1        ;test bit
  194.     jnz  R1            ;loop till 0
  195.     cli            ;disable interrupts
  196. S1:    in   al,dx        ;get status byte
  197.     test al,1        ;test bit
  198.     jz   S1            ;loop till 1
  199.     mov  ax,bx        ;return char-attri to AX
  200. T1:    stosw            ;write the character
  201.     pop  bx            ;restore BX
  202.     pop  dx            ;restore DX and return
  203.     ret            ;
  204. Writeit    endp
  205. _TEXT    ENDS
  206.     END
  207.