home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / VLA_FONT.ZIP / HSCR4X.ASM < prev    next >
Assembly Source File  |  1993-09-28  |  6KB  |  261 lines

  1.     IDEAL
  2.     DOSSEG
  3.     MODEL SMALL
  4.     STACK 200h
  5.     CODESEG
  6.     p386
  7.     
  8.     ASSUME CS:@CODE, DS:@CODE
  9. ────────────────────────────────────────────────────────────────────────────
  10. STRUC VCHHDR
  11.     Ident   db  "VLACH"
  12.     From    db  ?
  13.     X       db  ?
  14.     Y       db  ?
  15.     NumChar db  ?
  16. ENDS
  17.  
  18. STRUC Pal
  19.     R       db  ?
  20.     G       db  ?
  21.     B       db  ?
  22. ENDS
  23. ────────────────────────────────────────────────────────────────────────────
  24. INCLUDE "MODEX.INC"
  25.  
  26. FileName_VCH    db      "Font5.VCH",0
  27. FileName_PAL    db      "Font5.PAL",0
  28.  
  29. Seg_VCH         dw      0
  30.  
  31. Palette         Pal     256 dup (<>)
  32. VCHHEADER       VCHHDR  <>
  33. CharWidths      db      256 dup (0)
  34.  
  35. TheMessage      db      " THIS SCROLLER IS NOT HUGE LIKE THE 8X ONE, "
  36.                 db      "BUT IT IS BY NO MEANS TINY.  EACH PIXEL IS "
  37.                 db      "CONVIENIENTLY RESIZED TO 4X4 PIXELS THROUGH THE "
  38.                 db      "UTILIZATION OF A FEW KEY ASPECTS OF A STANDARD "
  39.                 db      "VGA CARD...  CELL HEIGHT IS SET TO 7.. (THAT'S "
  40.                 db      "8 SCAN LINES PER PIXEL)          "
  41.                 db      0
  42.  
  43. MsgOff          dw      offset TheMessage
  44. CharOff         dw      0       ;offset to current column to draw of chr
  45. XYsize          dw      ?       ;number of bytes in a char
  46. CurColumn       db      1
  47. DestOff         dw      0
  48. SCReenWidth     =       130
  49. ────────────────────────────────────────────────────────────────────────────
  50.     ────────────────────────────────────────────────────────────────────
  51.     ; Load in the font named in FileName_VCH and loads in the Palette
  52.     ; named in FileName_PAL. 
  53.     ;
  54.     ; Returns CF = 1 if there was an error
  55.     ────────────────────────────────────────────────────────────────────
  56. PROC LoadFont NEAR
  57.     pusha
  58.     push    ds
  59.  
  60.     mov     ax,cs
  61.     mov     ds,ax
  62.     mov     dx,offset FileName_PAL      ;open the palette file
  63.     mov     ax,3d00h
  64.     int     21h
  65.     jc      @@Error
  66.     mov     bx,ax
  67.  
  68.     mov     dx,offset Palette           ;read in the palette
  69.     mov     cx,768
  70.     mov     ah,3fh
  71.     int     21h
  72.  
  73.     mov     ah,3eh                      ;close PAL file
  74.     int     21h
  75.  
  76.     mov     dx,offset FileName_VCH      ;open VCH file
  77.     mov     ax,3d00h
  78.     int     21h
  79.     jc      @@Error
  80.     mov     bx,ax
  81.  
  82.     mov     dx,offset VCHHeader         ;load in the header
  83.     mov     cx,size VCHHDR
  84.     mov     ah,3fh
  85.     int     21h
  86.  
  87.     mov     al,[VCHHEADER.X]            ;calc data size
  88.     mul     [VCHHEADER.Y]
  89.     mov     [XYsize],ax
  90.     movzx   cx,[VCHHEADER.NumChar]
  91.     mul     cx
  92.     mov     cx,ax
  93.  
  94.     mov     ax,[cs:SEG_VCH]             ;move SEG_VCH into DS, but be sure
  95.     or      ax,ax                       ;the segment isn't 0
  96.     stc
  97.     je      @@Error
  98.     mov     ds,ax
  99.     xor     dx,dx                       ;load in the data
  100.     mov     ah,3fh
  101.     int     21h
  102.  
  103.     mov     ax,cs
  104.     mov     ds,ax
  105.     mov     dx,offset CharWidths
  106.     movzx   cx,[VCHheader.NumChar]
  107.     mov     ah,3fh
  108.     int     21h                         ;read in widths of chars
  109.  
  110.     mov     ah,3eh                      ;close VCH file
  111.     int     21h
  112.     clc
  113.  
  114. @@Error:
  115.  
  116.     pop     ds
  117.     popa
  118.     ret
  119. ENDP
  120.     ────────────────────────────────────────────────────────────────────
  121.     ;Starts the next letter in the message
  122.     ────────────────────────────────────────────────────────────────────
  123. PROC NewChar NEAR
  124.     pusha
  125.     push    ds
  126.     mov     ax,cs
  127.     mov     ds,ax
  128.  
  129.     mov     si,[MsgOff]     ;get the offset to the next char
  130. @@MsgLoop:
  131.     lodsb
  132.     or      al,al
  133.     jne     @@IsaChar
  134.     mov     si,offset TheMessage
  135.     jmp short @@MsgLoop
  136.  
  137. @@IsaChar:
  138.     mov     ah,[VCHHEADer.From]
  139.     add     ah,[VCHHEADer.NumChar]
  140.     cmp     al,[VCHHEADer.FROM]
  141.     jb      @@MsgLoop
  142.     cmp     al,ah
  143.     ja      @@MsgLoop
  144.  
  145.     mov     [MsgOff],si
  146.     sub     al,[VCHheader.From]
  147.     movzx   ax,al
  148.     mov     bx,ax
  149.     mul     [XYsize]
  150.     mov     [CharOff],ax
  151.     
  152.     mov     al,[CharWidths + bx]
  153.     mov     [CurColumn],al
  154.     
  155.     pop     ds
  156.     popa
  157.     ret
  158. ENDP
  159.     ────────────────────────────────────────────────────────────────────
  160.     ; Draws the Next column onto the screen, calls NewChar if done with
  161.     ; current character
  162.     ────────────────────────────────────────────────────────────────────
  163. PROC DrawColumn NEAR
  164.     pusha
  165.     push    ds es fs
  166.     mov     ax,cs
  167.     mov     ds,ax
  168.  
  169.     mov     bx,[DestOff]
  170.     add     bx,2
  171.     @Set_Start_Offset
  172.  
  173.     dec     [CurColumn]
  174.     jne     @@NoNew
  175.  
  176.     call    NewChar
  177.  
  178. @@NoNew:
  179.     mov     fs,[SEG_VCH]
  180.     mov     es,[VGASEG]
  181.     mov     si,[CharOff]    ;fs:si points to the data
  182.     mov     di,[DestOff]
  183.  
  184.     movzx   dx,[VCHheader.X]
  185.     movzx   cx,[VCHheader.Y]
  186.     mov     bp,SCReenWidth         ;screen width
  187.  
  188. @@Zloop:
  189.     mov     al,[fs:si]
  190.     mov     [es:di],al
  191.     mov     [es:di+SCReenWidth/2],al
  192.     add     di,bp
  193.    ; mov     [es:di],al
  194.    ; mov     [es:di+SCReenWidth/2],al
  195.    ; add     di,bp
  196.    ; mov     [es:di],al
  197.    ; mov     [es:di+SCReenWidth/2],al
  198.    ; add     di,bp
  199.    ; mov     [es:di],al
  200.    ; mov     [es:di+SCReenWidth/2],al
  201.    ; add     di,bp
  202.  
  203.     add     si,dx
  204.  
  205.     loop    @@ZLoop
  206.  
  207.     inc     [DestOff]
  208.     cmp     [DestOff],ScreenWidth/2
  209.     jb      @@okok
  210.  
  211.     mov     [DestOff],0
  212.  
  213. @@okok:
  214.     inc     [CharOff]
  215.  
  216.     pop     fs es ds
  217.     popa
  218.     ret
  219. ENDP
  220. ────────────────────────────────────────────────────────────────────────────
  221. START:
  222.     mov     ax,cs
  223.     mov     ds,ax
  224.  
  225.     mov     ax,ss
  226.     mov     bx,sp
  227.     add     bx,15
  228.     shr     bx,4
  229.     add     ax,bx
  230.     mov     [SEG_VCH],ax
  231.  
  232.     @SetModeX m256x200x256, 520
  233.  
  234.     call    LoadFont
  235.     mov     si,offset Palette
  236.     mov     cx,256
  237.     mov     al,0
  238.     @WritePalette
  239.     
  240.     mov     dx,CRTC_Index
  241.     mov     al,9
  242.     mov     ah,7    ;each dot is 8 high
  243.     out     dx,ax
  244.  
  245. @@MainLoop:
  246.     @FullVertWait
  247.     call    DrawColumn
  248.  
  249.     mov     ah,1
  250.     int     16h
  251.     jz      @@MainLoop
  252.  
  253.     mov     ah,0
  254.     int     16h
  255.  
  256.     mov     ax,3
  257.     int     10h
  258.     mov     ax,4c00h
  259.     int     21h
  260. END START
  261.