home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / MLFASTWR.ZIP / MLFW.ASM next >
Encoding:
Assembly Source File  |  1989-08-26  |  3.5 KB  |  107 lines

  1. ;                            Fast Write   By: Miles Levy 8/89
  2. ;                       called:  MLFW (X, Y, String)
  3. ;                                      X=Row, Y=Column 
  4. ;                                      1..80, 1..25
  5. ;
  6. ;       Procedure MLFW (x,y : integer; strng : string);
  7. ;
  8. code    segment byte public
  9.         assume  cs:code,ds:code
  10.         public  mlfw
  11. ;
  12. strng   equ     dword ptr [bp+6]
  13. y       equ     word ptr [bp+10]
  14. x       equ     word ptr [bp+12]
  15.  
  16. vid     equ     0B800H
  17. ;
  18. mlfw    proc   far
  19. ;
  20. start:
  21.         push    bp
  22.         mov     bp,sp
  23.         push    ds
  24.  
  25.         mov     ax,vid
  26.     mov    es,ax
  27.         cld
  28.         lds     si,strng                ; DS:SI points to string[0]
  29.         lodsb                           ; length to Al
  30.         xor     ah,ah
  31.         mov     cx,ax
  32.         jcxz    fini                    ; if empty string, exit
  33.         mov     bx,y                    ; row (line number / 1 relative )
  34.         dec     bx                      ; 0 relative
  35.         shl     bx,1
  36.         mov     di,word ptr cs:rowvect[bx]      ; line pointer
  37.         mov     bx,x
  38.         dec     bx                      ; column ( 0 relative )
  39.         shl     bx,1
  40.         add     di,bx                   ; di is tgt ptr
  41. ;                                         optimize for 2-byte moves
  42.         mov     ax,cx                   ; count
  43.         cmp     ax,3                    ; 1 or 2 bytes to move:
  44.         jb      lt3                     ; yes
  45.         shr     ax,1                    ; odd check
  46.         jc      oddno                   ; yes, odd no of bytes
  47.         lodsb                           ; char ---> al
  48.         stosb                           ; char ---> video memory
  49.         inc     di                      ; bypass attribute byte
  50.         shr     cx,1                    ; set for 2-byte moves
  51.         dec     cx
  52. movelpe:
  53.         lodsw                           ; 2 chars ---> ah / al
  54.         stosb                           ; char ---> video memory
  55.         inc     di                      ; bypass attribute byte
  56.         mov     al,ah                   ; process 2nd char
  57.         stosb
  58.         inc     di
  59.         loop    movelpe
  60. ;
  61.         lodsb                           ; last char ---> al
  62.         stosb                           ; last char ---> video memory
  63.         jmp short fini
  64. ;
  65. lt3:
  66.         lodsb                           ; char ---> al
  67.         stosb                           ; char ---> video memory
  68.         inc     di                      ; bypass attribute byte
  69.         loop    lt3
  70.         jmp short fini
  71. ;
  72. oddno:
  73.         lodsb                           ; char ---> al
  74.         stosb                           ; char ---> video memory
  75.         inc     di                      ; bypass attribute byte
  76.         shr     cx,1                    ; set for 2-byte moves
  77. movelpo:
  78.         lodsw                           ; 2 chars ---> ah / al
  79.         stosb                           ; char ---> video memory
  80.         inc     di                      ; bypass attribute byte
  81.         mov     al,ah                   ; process 2nd char
  82.         stosb
  83.         inc     di
  84.         loop    movelpo
  85. ;
  86. fini:   
  87.         pop     ds
  88.         pop     bp
  89.         ret     8
  90.  
  91. ; ---------------------------------------------------
  92.  
  93. rowvect equ     $
  94. ;                                        Generate the row vectors
  95. adr     =       0
  96.         rept    25
  97.         dw      adr
  98. adr     =       adr+160
  99.     endm
  100.  
  101. copywrt db     'Copyright 1989 Miles Levy'
  102.  
  103. mlfw    endp
  104. code    ends
  105.         end
  106.  
  107.