home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / VLA_FONT.ZIP / HSCR1X.ASM < prev    next >
Assembly Source File  |  1993-09-28  |  7KB  |  311 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      " NO NEED TO GET EXCITED.. THIS IS JUST A NORMAL "
  36.                 db      "SCROLLER WITH ABSOLUTELY NOTHING SPECIAL ABOUT IT, "
  37.                 db      "EXCEPT YOU HAVE THE CODE FOR IT..       "
  38.                 db      0
  39.  
  40. MsgOff          dw      offset TheMessage
  41. CharOff         dw      0       ;offset to current column to draw of chr
  42. XYsize          dw      ?       ;number of bytes in a char
  43. CurColumn       db      1
  44. DestOff         dw      0
  45. SCReenWidth     =       130
  46. ────────────────────────────────────────────────────────────────────────────
  47.     ────────────────────────────────────────────────────────────────────
  48.     ; Load in the font named in FileName_VCH and loads in the Palette
  49.     ; named in FileName_PAL. 
  50.     ;
  51.     ; Returns CF = 1 if there was an error
  52.     ────────────────────────────────────────────────────────────────────
  53. PROC LoadFont NEAR
  54.     pusha
  55.     push    ds
  56.  
  57.     mov     ax,cs
  58.     mov     ds,ax
  59.     mov     dx,offset FileName_PAL      ;open the palette file
  60.     mov     ax,3d00h
  61.     int     21h
  62.     jc      @@Error
  63.     mov     bx,ax
  64.  
  65.     mov     dx,offset Palette           ;read in the palette
  66.     mov     cx,768
  67.     mov     ah,3fh
  68.     int     21h
  69.  
  70.     mov     ah,3eh                      ;close PAL file
  71.     int     21h
  72.  
  73.     mov     dx,offset FileName_VCH      ;open VCH file
  74.     mov     ax,3d00h
  75.     int     21h
  76.     jc      @@Error
  77.     mov     bx,ax
  78.  
  79.     mov     dx,offset VCHHeader         ;load in the header
  80.     mov     cx,size VCHHDR
  81.     mov     ah,3fh
  82.     int     21h
  83.  
  84.     mov     al,[VCHHEADER.X]            ;calc data size
  85.     mul     [VCHHEADER.Y]
  86.     mov     [XYsize],ax
  87.     movzx   cx,[VCHHEADER.NumChar]
  88.     mul     cx
  89.     mov     cx,ax
  90.  
  91.     mov     ax,[cs:SEG_VCH]             ;move SEG_VCH into DS, but be sure
  92.     or      ax,ax                       ;the segment isn't 0
  93.     stc
  94.     je      @@Error
  95.     mov     ds,ax
  96.     xor     dx,dx                       ;load in the data
  97.     mov     ah,3fh
  98.     int     21h
  99.  
  100.     mov     ax,cs
  101.     mov     ds,ax
  102.     mov     dx,offset CharWidths
  103.     movzx   cx,[VCHheader.NumChar]
  104.     mov     ah,3fh
  105.     int     21h                         ;read in widths of chars
  106.  
  107.     mov     ah,3eh                      ;close VCH file
  108.     int     21h
  109.     clc
  110.  
  111. @@Error:
  112.  
  113.     pop     ds
  114.     popa
  115.     ret
  116. ENDP
  117.     ────────────────────────────────────────────────────────────────────
  118.     ;Starts the next letter in the message
  119.     ────────────────────────────────────────────────────────────────────
  120. PROC NewChar NEAR
  121.     pusha
  122.     push    ds
  123.     mov     ax,cs
  124.     mov     ds,ax
  125.  
  126.     mov     si,[MsgOff]     ;get the offset to the next char
  127. @@MsgLoop:
  128.     lodsb
  129.     or      al,al
  130.     jne     @@IsaChar
  131.     mov     si,offset TheMessage
  132.     jmp short @@MsgLoop
  133.  
  134. @@IsaChar:
  135.     mov     ah,[VCHHEADer.From]
  136.     add     ah,[VCHHEADer.NumChar]
  137.     cmp     al,[VCHHEADer.FROM]
  138.     jb      @@MsgLoop
  139.     cmp     al,ah
  140.     ja      @@MsgLoop
  141.  
  142.     mov     [MsgOff],si
  143.     sub     al,[VCHheader.From]
  144.     movzx   ax,al
  145.     mov     bx,ax
  146.     mul     [XYsize]
  147.     mov     [CharOff],ax
  148.     
  149.     mov     al,[CharWidths + bx]
  150.     mov     [CurColumn],al
  151.     
  152.     pop     ds
  153.     popa
  154.     ret
  155. ENDP
  156.     ────────────────────────────────────────────────────────────────────
  157.     ; Draws the Next column onto the screen, calls NewChar if done with
  158.     ; current character
  159.     ────────────────────────────────────────────────────────────────────
  160. PROC DrawColumn NEAR
  161.     pusha
  162.     push    ds es fs
  163.     mov     ax,cs
  164.     mov     ds,ax
  165.  
  166.     mov     bx,[DestOff]
  167.     add     bx,2
  168.     @Set_Start_Offset
  169.  
  170.     ;dec     [CurColumn]
  171.     sub     [CurColumn],4
  172.     jg      @@NoNew
  173.  
  174.     call    NewChar
  175.  
  176. @@NoNew:
  177.     mov     fs,[SEG_VCH]
  178.     mov     es,[VGASEG]
  179.  
  180.     mov     bp,SCReenWidth         ;screen width
  181.  
  182.     mov     dx,SC_Index
  183.     mov     ax,0102h
  184.     out     dx,ax
  185.  
  186.     movzx   dx,[VCHheader.X]
  187.     movzx   cx,[VCHheader.Y]
  188.     mov     si,[CharOff]    ;fs:si points to the data
  189.     mov     di,[DestOff]
  190. @@Zloop:
  191.     mov     al,[fs:si]
  192.     mov     [es:di],al
  193.     mov     [es:di+SCReenWidth/2],al
  194.     add     di,bp
  195.  
  196.     add     si,dx
  197.  
  198.     loop    @@ZLoop
  199.     
  200.     mov     dx,SC_Index
  201.     mov     ax,0202h
  202.     out     dx,ax
  203.  
  204.     movzx   dx,[VCHheader.X]
  205.     movzx   cx,[VCHheader.Y]
  206.     mov     si,[CharOff]    ;fs:si points to the data
  207.     inc     si
  208.     mov     di,[DestOff]
  209. @@Zloop2:
  210.     mov     al,[fs:si]
  211.     mov     [es:di],al
  212.     mov     [es:di+SCReenWidth/2],al
  213.     add     di,bp
  214.  
  215.     add     si,dx
  216.  
  217.     loop    @@ZLoop2
  218.     
  219.     mov     dx,SC_Index
  220.     mov     ax,0402h
  221.     out     dx,ax
  222.  
  223.     movzx   dx,[VCHheader.X]
  224.     movzx   cx,[VCHheader.Y]
  225.     mov     si,[CharOff]    ;fs:si points to the data
  226.     add     si,2
  227.     mov     di,[DestOff]
  228. @@Zloop3:
  229.     mov     al,[fs:si]
  230.     mov     [es:di],al
  231.     mov     [es:di+SCReenWidth/2],al
  232.     add     di,bp
  233.  
  234.     add     si,dx
  235.  
  236.     loop    @@ZLoop3
  237.  
  238.     mov     dx,SC_Index
  239.     mov     ax,0802h
  240.     out     dx,ax
  241.  
  242.     movzx   dx,[VCHheader.X]
  243.     movzx   cx,[VCHheader.Y]
  244.     mov     si,[CharOff]    ;fs:si points to the data
  245.     add     si,3
  246.     mov     di,[DestOff]
  247. @@Zloop4:
  248.     mov     al,[fs:si]
  249.     mov     [es:di],al
  250.     mov     [es:di+SCReenWidth/2],al
  251.     add     di,bp
  252.  
  253.     add     si,dx
  254.  
  255.     loop    @@ZLoop4
  256.  
  257.     inc     [DestOff]
  258.     cmp     [DestOff],ScreenWidth/2
  259.     jb      @@okok
  260.  
  261.     mov     [DestOff],0
  262.  
  263. @@okok:
  264.     add     [CharOff],4
  265.  
  266.     pop     fs es ds
  267.     popa
  268.     ret
  269. ENDP
  270. ────────────────────────────────────────────────────────────────────────────
  271. START:
  272.     mov     ax,cs
  273.     mov     ds,ax
  274.  
  275.     mov     ax,ss
  276.     mov     bx,sp
  277.     add     bx,15
  278.     shr     bx,4
  279.     add     ax,bx
  280.     mov     [SEG_VCH],ax
  281.  
  282.     @SetModeX m256x200x256, 520
  283.  
  284.     call    LoadFont
  285.     mov     si,offset Palette
  286.     mov     cx,256
  287.     mov     al,0
  288.     @WritePalette
  289.     
  290.     mov     dx,CRTC_Index
  291.     mov     al,9
  292.     mov     ah,1    ;each dot is 2 high (use HEIGHT-1)
  293.     out     dx,ax
  294.  
  295. @@MainLoop:
  296.     @FullVertWait
  297.     call    DrawColumn
  298.  
  299.     mov     ah,1
  300.     int     16h
  301.     jz      @@MainLoop
  302.  
  303.     mov     ah,0
  304.     int     16h
  305.  
  306.     mov     ax,3
  307.     int     10h
  308.     mov     ax,4c00h
  309.     int     21h
  310. END START
  311.