home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / LASER / FPC35_5.ZIP / FPCSRC.ZIP / VIDEO2.SEQ < prev    next >
Encoding:
Text File  |  1989-07-05  |  6.7 KB  |  142 lines

  1. \ VIDEO2.SEQ    Actual video output routine             By Tom Zimmer
  2. \ Modified by Robert Berkey to perform LONG operations. 07/03/89 RB
  3.  
  4.  
  5. FILES DEFINITIONS
  6.  
  7. VARIABLE VIDEO2.SEQ
  8.  
  9. FORTH DEFINITIONS
  10.  
  11. VARIABLE NOSETCUR
  12.  
  13. DECIMAL
  14.  
  15. CODE VIDEO-TYPEL   ( seg string length -- )
  16.                 MOV AX, #LINE
  17.                 MOV DX, #OUT
  18.                 POP BX
  19.                 cmp bx, # 0             \ if length = 0 then exit
  20.              <= if
  21.                         add sp, # 4
  22.                         next
  23.                 then
  24.                 PUSH BX                 \ Put length and #OUT on stack
  25.                 PUSH DX
  26.                 cmp ax, ' rows >body    \ Clip #LINE to ROWS
  27.             u>= if
  28.                         mov ax, ' rows >body
  29.                         dec ax
  30.                 then
  31.                 mov #line ax
  32.                 PUSH AX
  33.                 ADD DX, BX              \ Set length + X position to DL
  34.                 cmp dx, ' cols >body    \ Clip #OUT to 80 characters
  35.             u>= if
  36.                         mov dx, ' cols >body
  37.                         dec dx
  38.                 then
  39.                 mov #out dx
  40.                 cmp nosetcur # 0        \ Do we want to spend time setting
  41.              0= if                      \ the cursor position?
  42.                         MOV DH, AL      \ Move Y to DH
  43.                         XOR BX, BX      \ Clear BX
  44.                         MOV AH, # 2
  45.                         PUSH SI         PUSH BP
  46.                         INT $10         \ Move cursor to end of typed string
  47.                         POP BP          POP SI
  48.                 then
  49.                 MOV AX, ' cols >body    \ calculate actual cursor position
  50.                 ADD AX, AX              \ 2 bytes per character
  51.                 POP BX          MUL BX          MOV DI, AX
  52.                 POP AX          SHL AX, # 1     ADD DI, AX
  53.                 POP CX          POP BX
  54.                 POP DX  ( ds seg )
  55.                 XCHG SI, BX                     \ SI is the source
  56.                 PUSH BX                         \ Save SI for later restoral
  57.                 PUSH ES                         \ save ES
  58.                 PUSH DX ( ds seg )
  59.                 MOV BX, # 1                     \ Bit mask for retrace
  60.                 MOV AX, VMODE-VAR
  61.                 CMP AX, # 7                     \ If video mode <> 7 (mono)
  62.         0<> IF          MOV AX, BLANKING
  63.                         OR AX, AX
  64.             0<> IF      MOV DX, # 986           \ CGA status port
  65.                         BEGIN   IN AL, DX       \ Wait for retrace
  66.                                 TEST AL, BX
  67.                     0<> UNTIL
  68.                         MOV DL, # 216           \ Address control reg
  69.                         MOV AL, # 37            \ Disable the CRT
  70.                         OUT DX, AL
  71.                 THEN
  72.             THEN
  73.                 MOV AH, ATTRIB                  \ display attributes
  74.                 MOV ES, VIDEO-SEG               \ destination segment
  75.                 cmp cx, ' cols >body
  76.             u>= if                              \ Clip line to COL chars
  77.                         mov cx, ' cols >body
  78.                 then
  79.                 mov dx, # 132                   \ ABSOLUTE limit of output
  80.                 sub dx, cx
  81.                 xchg dx, cx
  82.                 shl cx, # 1
  83.                 POP DS
  84.                 add cx, # here $06 +             \ Add base addr of array
  85.                 \ add cx, # here $0A +             \ Add base addr of array
  86.                 \ MOV DS, TYPESEG                 \ source segment
  87.                 jmp cx                          \ JUMP to the right instruction
  88.  
  89. \ we are blowing out the loop here for speed, it only cost 264 bytes.
  90.  
  91.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  92.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  93.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  94.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  95.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  96.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  97.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  98.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  99.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  100.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  101.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  102.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  103.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  104.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  105.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  106.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  107.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  108.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  109.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  110.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  111.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  112.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  113.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  114.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  115.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  116.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  117.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  118.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  119.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  120.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  121.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  122.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  123.         LODSB   STOSW   LODSB   STOSW   LODSB   STOSW   LODSB   STOSW
  124.                 POP ES                          \ restore ES
  125.                 POP SI                          \ Restore IP
  126.                 MOV BX, CS      MOV DS, BX      \ restore DS
  127.                 MOV AX, VMODE-VAR
  128.                 CMP AX, # 7
  129.         0<> IF          MOV AX, BLANKING
  130.                         OR AX, AX
  131.             0<> IF      MOV DX, # 984           \ CGA mode control reg
  132.                         MOV AL, # $2D           \ Enable byte for mode 3
  133.                         OUT DX, AL
  134.                 THEN
  135.             THEN
  136.                 NEXT            END-CODE
  137.  
  138. CODE VIDEO-TYPE ( string length -- )
  139.    POP AX   POP BX   PUSH CS   PUSH BX   PUSH AX   JMP ' VIDEO-TYPEL
  140.    END-CODE
  141.  
  142.