home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / f88 / video.bak < prev    next >
Text File  |  1988-06-07  |  6KB  |  183 lines

  1. \ VIDEO.SEQ     Direct VIDEO Screen output              by Tom Zimmer
  2.  
  3. FILES DEFINITIONS
  4.  
  5. VARIABLE VIDEO.SEQ
  6.  
  7. FORTH DEFINITIONS
  8.  
  9. 0 CONSTANT SVSEG                \ screen save segment
  10.  
  11. VARIABLE ATTRIB   7 ATTRIB !-T          \ display attribute value
  12. VARIABLE VIDEO-SEG                      \ Segment of display
  13. VARIABLE TYPESEG          \ video type segment, the segment we are typing from.
  14. VARIABLE ENABLE_VAL     \ to turn on color screen
  15. VARIABLE PAGE#          \ 0 - 3 in color mode (if videoseg <> b000)
  16.  
  17. HEX
  18.  
  19. CODE ?VMODE     ( --- N1 )
  20.     MOV AH, # 0F     \ get video status
  21.     INT 10
  22.     MOV AH, # 0      \ enable byte = 0 for mode 7
  23.     PUSH AX
  24.     CMP AL, # 7      \ is mode 7 ?
  25.     0<>               \ skip this if yes
  26.     IF  
  27. \        MOV AH, # 2D \ enable byte for mode 2
  28. \        CMP AL, # 2  \ is the mode 2 ?
  29. \        0<> IF        \ if so, skip to then
  30.         MOV AH, # 29   \ enable byte for mode 3
  31. \        THEN
  32.     THEN
  33.     SUB AL, AL
  34.     XCHG AH, AL
  35.     MOV #) ENABLE_VAL AX \ store val to re-enable screen
  36.     NEXT
  37. C;
  38.  
  39. CODE VMODE.OK    ( --- N1 )
  40.     MOV AH, # 0F     \ get video status
  41.     INT 10
  42.     CMP AL, # 7      \ is mode 7 ?
  43.  0= IF NEXT THEN     \ skip this if yes
  44.     CMP AL, # 3  \ is the mode < 3 ?
  45. 0<> IF        \ if so, skip to then
  46.     MOV AH, # 0   \ enable mode 3
  47.     MOV AL, # 3
  48.     INT 10
  49.     THEN
  50.     NEXT
  51. C;
  52.  
  53. DEFER INITMONO  ' NOOP IS INITMONO      \ INITIALIZATION VECTOR AVAILABLE
  54. DEFER INITCOLOR ' NOOP IS INITCOLOR     \ FOR MONOCHROME AND COLOR
  55.  
  56. : VMODE.SET     ( --- )
  57.     0 PAGE# !    \ start with page 0
  58.     VMODE.OK
  59.     ?VMODE 7 =
  60.     IF    0B000   INITMONO
  61.     ELSE  0B800   INITCOLOR
  62.     THEN  VIDEO-SEG ! ;
  63.  
  64. DECIMAL
  65.  
  66. CODE VTYPE      ( string length x y -- )
  67.     POP AX          \ Y
  68.     POP DX          \ X
  69.     POP BX          \ LENGTH
  70.     PUSH BX  PUSH DX  PUSH AX        \ Save them back again
  71.     ADD DX, BX      \ Set length + X position to DL
  72.     MOV DH, AL      \ Move Y to DH
  73.     MOV BX, PAGE#   \ mps
  74.     MOV AH, # 2
  75.     INT 16          \ Move cursor to end of typed string
  76.     MOV AX, # 160
  77.     POP BX          \ y
  78.     MUL BX
  79.     MOV DI, AX      \ line on page 0
  80.     MOV AX, # 4096    \ offset per page
  81.     MOV BX, #) PAGE#
  82.     MUL BX
  83.     ADD DI, AX      \ offset to the active page
  84.     POP AX          \ x
  85.     SHL AX, # 1     \ make it words
  86.     ADD DI, AX      \ location on page
  87.     POP CX          \ length
  88.     POP BX          \ $addr
  89.     XCHG SI, BX     \ SI is the source
  90.     PUSH BX         \ Save SI == IP
  91.     PUSH ES         \ save ES == list segment
  92.     MOV BX, # 1     \ mask - bit 1
  93.     MOV ES, #) VIDEO-SEG  \ destination segment
  94.     MOV DS, #) typeseg      \ source segment
  95.     MOV AX, CS: #) ENABLE_VAL   \ fetch enable val
  96.     CMP AL, # 0     \ monochrome? (test)
  97.     0<>
  98.     IF              \ if so, do nothing
  99.     MOV DX, # 986   \ address cga status port
  100.     BEGIN
  101.         IN AL, DX   \ fetch status
  102.         TEST AL, BX \ mask vertical retrace bit (test)
  103.     0<> UNTIL       \ until retrace seen
  104.     MOV DL, # 216   \ address control reg
  105.     MOV AL, # 37    \ this val disables the crt
  106.     OUT DX, AL      \ display is disabled
  107.     THEN
  108.     MOV AX, CS: #) ATTRIB     \ display attributes
  109.     XCHG AH, AL
  110. LABEL VTYPE1
  111.     LODSB
  112.     STOSW           \ write the attribute byte
  113.     LOOP VTYPE1
  114.     MOV AX, CS: #) ENABLE_VAL   \ fetch enable val
  115.     CMP AL, # 0          \ monochrome? (test)
  116.     0<> IF                \ we didn't disable scr \ jz ret
  117.     MOV DX, # 984        \ adress cga mode control reg
  118.     OUT DX, AL           \ send the enable value
  119.     THEN
  120.     POP ES                          \ restore ES
  121.     POP SI                          \ Restore IP
  122.     MOV BX, CS      MOV DS, BX      \ restore DS
  123.     NEXT
  124. END-CODE
  125.  
  126. DECIMAL PREFIX
  127.  
  128. LABEL VMOVE2
  129.     WORD LODS
  130.     WORD STOS       \ write the attribute and char
  131.     LOOP VMOVE2       \ loop till cx is zero
  132.     MOV AX, # 41    \ enable val 29H for mode 3
  133.     MOV DX, # 984   \ adress cga mode control reg
  134.     OUT DX, AL      \ send the enable value
  135.     POP ES          \ restore ES
  136.     POP SI          \ Restore IP
  137.     MOV BX, CS      MOV DS, BX      \ restore DS
  138.     NEXT
  139. LABEL VMOVE1
  140.     CLD
  141.     MOV BX, # 1     \ mask - bit 3
  142.     MOV DX, # 986   \ address cga status port
  143.     BEGIN
  144.         IN AL, DX   \ fetch status
  145.         TEST AL, BX \ mask vertical retrace bit (test)
  146.     0<> UNTIL       \ until retrace seen
  147.     MOV DL, # 216   \ address control reg
  148.     MOV AL, # 37    \ this val disables the crt
  149.     OUT DX, AL      \ display is disabled
  150.     JMP VMOVE2
  151. CODE VMOVEL>      ( -- ) \ from video-seg to savseg
  152.     PUSH SI         \ save SI == IP
  153.     PUSH ES         \ save ES == list segment
  154.     MOV CX, # 2000   \ length
  155.     MOV SI, # 0
  156.     MOV DI, # 0
  157.     MOV AX, # 4096    \ offset per page
  158.     MOV BX, #) PAGE#
  159.     MUL BX
  160.     ADD SI, AX      \ offset to the active page
  161.     MOV BX, # ' SVSEG
  162.     MOV ES, 3 [BX]      \ destination segment
  163.     MOV DS, #) VIDEO-SEG   \ source segment
  164.     JMP VMOVE1
  165. END-CODE
  166.  
  167. CODE >VMOVEL      ( -- ) \ from savseg to video-seg
  168.     PUSH SI         \ save SI == IP
  169.     PUSH ES         \ save ES == list segment
  170.     MOV CX, # 2000   \ length
  171.     MOV SI, # 0
  172.     MOV DI, # 0
  173.     MOV AX, # 4096    \ offset per page
  174.     MOV BX, #) PAGE#
  175.     MUL BX
  176.     ADD DI, AX      \ offset to the active page
  177.     MOV ES, #) VIDEO-SEG   \ destination segment
  178.     MOV BX, # ' SVSEG
  179.     MOV DS, 3 [BX]      \ destination segment
  180.     JMP VMOVE1
  181. END-CODE
  182.  
  183.