home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / PASCAL / PACKOBJ / JOLTCOLA.PAS < prev    next >
Pascal/Delphi Source File  |  1992-05-07  |  2KB  |  103 lines

  1. { What keeps you going on a late night hack? - 'Twice the Caffeine' }
  2.  
  3. Program JoltCola;
  4. uses TpUnpack, VGABios;
  5.  
  6. {$M 30000, 0, 65536 }
  7.  
  8. {$R- }
  9.  
  10. Type
  11.   BufType      = Array[1..65520] of Byte;
  12.  
  13. Var
  14.   LastMode     : Byte;
  15.   JoltColaBuf  : ^BufType;
  16.   VGAScreen    : BufType absolute $A000:$0000;
  17.  
  18. { Colour table of picture: 256 registers, 3 bytes (R, G, B) each }
  19.  
  20. Procedure JoltColaDAC; External;
  21. {$L JCOLADAC.OBJ }
  22.  
  23. Function JoltColaSize : Word; Far; External;
  24. Procedure UnpackJoltCola(Var buffer); Far; External;
  25. {$L JOLTCOLA.OBJ }
  26.  
  27. Procedure InitScreenColours; Assembler;
  28.  
  29. ASM
  30.         MOV    AX, 13h         { Set VGA Mode 13h: 320x200x256 }
  31.         INT    10h
  32.         MOV    AX, 1012h       { Set block of DAC registers }
  33.         MOV    CX, 256
  34.         XOR    BX, BX
  35.         PUSH   CS
  36.         POP    ES
  37.         MOV    DX, Offset JoltColaDac
  38.         INT    10h
  39. end;  { InitScreenColours }
  40.  
  41. Procedure WaitForKeypress; Assembler;
  42.  
  43. ASM
  44.         MOV    AX, 0C07h
  45.         INT    21h
  46. end;  { WaitForKeypress }
  47.  
  48. Procedure DimDisplay; Assembler;
  49.  
  50. ASM
  51.         PUSH   DS
  52.         MOV    AX, CS
  53.         MOV    DS, AX
  54.         MOV    ES, AX
  55.         MOV    BX, MaxIntensity
  56.  
  57.   { VGA port 3C8h: PEL address register, (colour index, with auto increment)
  58.     VGA port 3C9h: PEL write register (R, G, B) }
  59.  
  60.         CLD
  61. @1:     LEA    SI, JoltColaDAC
  62.         MOV    DI, SI
  63.         MOV    CX, 3*256
  64.         XOR    AX, AX
  65.         MOV    DX, 3C8h
  66.         OUT    DX, AL
  67.         INC    DX
  68.  
  69.   { Get colour value, decrement it and update the table }
  70.  
  71. @2:     LODSB
  72.         OR     AX, AX
  73.         JZ     @3
  74.         DEC    AX
  75. @3:     STOSB
  76.         OUT    DX, AL
  77.         LOOP   @2
  78.  
  79.   { Delay before next decrement of R, G, B values }
  80.  
  81.         MOV    CX, 30000
  82. @4:     LOOP   @4
  83.         DEC    BX
  84.         OR     BX, BX
  85.         JNZ    @1
  86.         POP    DS
  87. end;  { DimDisplay }
  88.  
  89. Begin
  90.   If VGAStatus = NotVGA Then
  91.     Begin
  92.       WriteLn('This program requires a VGA adapter.');
  93.       Exit;
  94.     end;
  95.   LastMode := GetVideoMode;
  96.   InitScreenColours;
  97.   New(JoltColaBuf);
  98.   UnpackJoltCola(JoltColaBuf^);
  99.   VGAScreen := JoltColaBuf^;
  100.   WaitForKeypress;
  101.   DimDisplay;
  102.   SetVideoMode(LastMode);
  103. end.  { JoltCola }