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

  1. ;void wrteln(strg);
  2. ;  unsigned char  *strg;
  3.  
  4.     EXTRN  _memory_model:byte
  5.     EXTRN  _video_buffer:word
  6.     EXTRN  _video_page:byte
  7.     EXTRN  _snow_protect:byte
  8.     EXTRN  _color:byte
  9.  
  10. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  11.     ASSUME CS:_TEXT
  12.     PUBLIC _wrteln
  13. _wrteln    proc near
  14.     jmp  short start    ;
  15. clr    db  ?            ;
  16. pg    db  ?            ;
  17. snow    db  ?            ;
  18. start:    push bp            ;
  19.     mov  bp,sp        ;set stack frame
  20.     push di            ;
  21.     push si            ;
  22.     cmp  _memory_model,0    ;near or far?
  23.     jle  begin        ;jump if near
  24.     inc  bp            ;else add 2 to BP
  25.     inc  bp            ;
  26. begin:    push ds            ;
  27.     cld            ;direction flag forward
  28.     mov  ax,_video_buffer    ;get video buffer address
  29.     mov  es,ax        ;place in ES
  30.     mov  al,_color        ;get Color value
  31.     mov  ah,_snow_protect    ;get _snow_protect
  32.     mov  bh,_video_page    ;set the cursor page
  33.     cmp  _memory_model,2    ;data near or far?
  34.     jb   L0            ;jump if near
  35.     lds  si,dword ptr[bp+4] ;DS:SI pts to Strg
  36.     inc  bp            ;add 2 to BP since dword ptr    
  37.     inc  bp            ;
  38.     jmp  short L00        ;
  39. L0:    mov  si,[bp+4]        ;near case
  40. L00:    mov  cs:clr,al        ;save _color
  41.     mov  cs:snow,ah        ;save _snow_protect
  42.     mov  cs:pg,bh        ;save _video_page
  43.     mov  ah,3        ;BIOS func for cursor pos
  44.     int  10h        ;now DH-DL holds row-col
  45.     sub  cx,cx        ;clear CX
  46.     push si            ;keep initial pointer position
  47. L000:    cmp  byte ptr[si],0    ;end of string?
  48.     je   L0000        ;jump if so
  49.     inc  si            ;inc ptr 
  50.     inc  cx            ;inc counter
  51.     jmp  short L000        ;loop till end
  52. L0000:    pop  si            ;restore ptr
  53.     mov  ax,160        ;cursor pos: bytes in row
  54.     mul  dh            ;multiply by num rows
  55.     sub  dh,dh        ;now DX holds num cols
  56.     shl  dx,1        ;double for attri bytes
  57.     add  ax,dx        ;cursor offset in buffer
  58.     mov  di,ax        ;now ES:DI pts to pos
  59.     mov  bx,3840        ;scrl if won't fit row 24
  60.     sub  bx,di        ;space left
  61.     mov  ax,cx        ;chars to be printed
  62.     shl  ax,1        ;double for attributes
  63.     or   cx,cx        ;test for null string
  64.     jnz  L1            ;jump if not null
  65.     cmp  di,3840        ;last row?
  66.     jnge L1            ;jump if not
  67.     mov  al,1        ;scroll if null on Row 25
  68.     jmp  short L2        ;jump ahead
  69. L1:    cmp  bx,ax        ;enough room?
  70.     jge  L4            ;jump ahead if so
  71.     sub  ax,bx        ;amount space required
  72.     mov  bl,160        ;bytes in a row
  73.     div  bl            ;divide
  74.     cmp  ah,0        ;any remainder?
  75.     je   L2            ;if not, jump ahead
  76.     inc  al            ;else, scroll 1 more line
  77. L2:    push cx            ;save string length
  78.     push bp            ;scrolling changes BP
  79.     push ax            ;save num lines scrolled
  80.     mov  bh,7        ;attribute of new lines
  81.     mov  cx,0000h        ;top left row-col
  82.     mov  dx,184Fh        ;bottom right row-col
  83.     mov  ah,6        ;upwards scroll function
  84.     int  10h        ;make the scroll
  85.     pop  cx            ;num lines scrolled in CL
  86.     sub  ch,ch        ;clear CH, use CX counter
  87. L3:    sub  di,160        ;screen ptr back 1 line
  88.     loop L3            ;repeat for ea ln of scrl
  89.     pop  bp            ;restore BP
  90.     pop  cx            ;restore string length
  91. L4:    or   cx,cx        ;test for null string
  92.     jnz  L5            ;jump if not null
  93.     add  di,160        ;increase screen ptr
  94.     jmp  L9            ;jump and set cursor
  95. L5:    mov  ah,cs:clr        ;get attribute
  96.     lodsb            ;get a character
  97.     cmp  cs:snow,0        ;protect against snow?
  98.     je   L8            ;jump ahead if not
  99.     mov  dx,3dah        ;status byte address
  100.     mov  bx,ax        ;save char-attri in BX
  101. L6:    in   al,dx        ;get status byte
  102.     test al,1        ;test bit
  103.     jnz  L6            ;loop till 0
  104.     cli            ;disable interrupts
  105. L7:    in   al,dx        ;get status byte
  106.     test al,1        ;test bit
  107.     jz   L7            ;loop till 1
  108.     mov  ax,bx        ;char-attri back to AX
  109. L8:    stosw            ;write it with attribute
  110.     loop L5            ;go do next
  111.     sti            ;reenable interrupts
  112. L9:    mov  ax,di        ;now set new cursor pos
  113.     mov  dl,160        ;chars in a row
  114.     div  dl            ;divide scrn ptr
  115.     shr  ah,1        ;div remainder by 2
  116.     mov  dh,al        ;BIOS: row in DH
  117.     mov  dl,ah        ;col in DL
  118.     cmp  dl,0        ;already at new line?
  119.     je   L10        ;if so, jump ahead
  120.     inc  dh            ;else add 1 more line
  121.     mov  dl,0        ;set cursor to col 0
  122. L10:    mov  bh,cs:pg        ;video page number
  123.     mov  ah,2        ;function number
  124.     int  10h        ;set the cursor
  125.     pop  ds            ;
  126.     pop  si            ;
  127.     pop  di            ;
  128.     pop  bp            ;
  129.     cmp  _memory_model,0    ;quit
  130.     jle  quit        ;
  131.     db   0CBh        ;RET far
  132. quit:    ret            ;RET near
  133. _wrteln    endp
  134. _TEXT    ENDS
  135.     END
  136.