{$X+} Program Copper; Uses Crt; Type ColType = Record R, G, B : Byte; End; PalType = Array[0..255] of ColType; BarType = Record Col : Array[1..20] of ColType; Pos : Array[1..20] of Byte; UP : Array[1..20] of Boolean; End; Var Pal1 : PalType; Bars : Array[1..40] Of BarType; NumBars, NumLines : Byte; Procedure Pal(Col, R, G, B : Byte); Begin Asm mov dx, 3c8h mov al, [Col] out dx, al inc dx mov al, [R] out dx, al mov al, [G] out dx, al mov al, [B] out dx, al End; End; Procedure GetPal(Col : Byte; Var R, G, B : Byte); Var Rt,Gt,Bt : Byte; Begin Asm mov dx, 3c7h mov al, [Col] out dx, al inc dx inc dx in al, dx mov [Rt],al in al, dx mov [Gt],al in al, dx mov [Bt],al End; R := Rt; G := Gt; B := Bt; End; Procedure WaitRetrace; Assembler; Asm mov dx,3DAh @@1: in al,dx and al,08h jnz @@1 @@2: in al,dx and al,08h jz @@2 End; Procedure SetPal(Var Palet : PalType); Assembler; Asm call WaitRetrace push ds lds si, Palet mov dx, 3c8h mov al, 0 out dx, al inc dx mov cx, 768 rep outsb pop ds End; Procedure FadeOut(NoBars, BarSize : Byte); Var F, L : Integer; PalFade : PalType; Begin For F := 1 to NoBars do For L := 1 to BarSize do Begin If Bars[F].Col[L].R > 0 Then Dec(Bars[F].Col[L].R); If Bars[F].Col[L].G > 0 Then Dec(Bars[F].Col[L].G); If Bars[F].Col[L].B > 0 Then Dec(Bars[F].Col[L].B); End; End; Procedure SetMcga; Begin Asm mov ax, 0013h int 10h End; End; Procedure SetText; Begin Asm mov ax, 0003h int 10h End; End; Procedure DrawCopper(NoLines, StartCol, YStart : Byte); Var Loop : Word; Begin For Loop := YStart to YStart + NoLines do Begin FillChar(Mem[$a000:Loop*320],320,StartCol+Loop-YStart); End; End; Procedure SetCopperPal(NoBars, BarSize, YStart, ColStart, Space : Byte); Var Loop : Byte; Loop2 : Word; IncR : Byte; RGB : Byte; HalfBar : Byte; Begin FillChar(Bars, SizeOf (Bars),0); HalfBar := BarSize Div 2; IncR := 63 Div HalfBar; RGB := 0; For Loop := 1 to NoBars do Begin For Loop2 := 1 to HalfBar do Begin If RGB = 0 Then Bars[Loop].Col[Loop2].R := Loop2 * IncR; If RGB = 1 Then Bars[Loop].Col[Loop2].G := Loop2 * IncR; If RGB = 2 Then Bars[Loop].Col[Loop2].B := Loop2 * IncR; Bars[Loop].Pos[Loop2] := YStart + (Loop-1) * (BarSize+Space) + Loop2 -1 + ColStart; Bars[Loop].UP[Loop2] := True End; For Loop2 := HalfBar + 1 to BarSize do Begin If RGB = 0 Then Bars[Loop].Col[Loop2].R := (BarSize - Loop2) * IncR; If RGB = 1 Then Bars[Loop].Col[Loop2].G := (BarSize - Loop2) * IncR; If RGB = 2 Then Bars[Loop].Col[Loop2].B := (BarSize - Loop2) * IncR; Bars[Loop].Pos[Loop2] := YStart + (Loop-1) * (BarSize+Space) + Loop2 -1 + ColStart; Bars[Loop].UP[Loop2] := True End; RGB := (RGB + 1) Mod 3; End; End; Procedure RotatePal(NoBars, BarSize, YStart, StartCol, NumLines : Byte; Up : Boolean); Var TPal : PalType; TCol : ColType; Loop, Loop2 : Byte; Begin FillChar(TPal, 768, 0); For Loop := 1 to NoBars do Begin For Loop2 := 1 to BarSize do Begin TPal[Bars[Loop].Pos[Loop2]] := Bars[Loop].Col[Loop2]; If Up Then Begin If Bars[Loop].Pos[Loop2] = StartCol Then Bars[Loop].UP[Loop2] := False; If Bars[Loop].Pos[Loop2] = NumLines Then Bars[Loop].UP[Loop2] := True; If Bars[Loop].UP[Loop2] Then Dec(Bars[Loop].Pos[Loop2]) Else Inc(Bars[Loop].Pos[Loop2]); End; End; End; SetPal(TPal); End; Procedure SetUP(NumLines, NumBars, BarSize, YStart, ColStart, Space : Byte); Begin SetMcga; DrawCopper(NumLines,ColStart,YStart); SetCopperPal(NumBars, BarSize, YStart, ColStart, Space); End; Procedure DoItAll; Var NumLines, NumBars, BarSize, YStart, ColStart, Space : Byte; Loop : Byte; Begin NumLines := 200; NumBars := 10; BarSize := 10; YStart := 0; ColStart := 1; Space := 5; SetUP(NumLines, NumBars, BarSize, YStart, ColStart, Space); Repeat RotatePal(NumBars, BarSize,YStart, ColStart, NumLines, True); If KeyPressed Then Begin For Loop := 0 to 63 do Begin RotatePal(NumBars, BarSize,YStart, ColStart, NumLines, True); FadeOut(NumBars, BarSize); End; Exit; End; Until False; End; Procedure Creds; Var R, G, B : Byte; R1, G1, B1 : Byte; Loop : Byte; Begin SetText; While KeyPressed do ReadKey; Asm mov ah, 1 mov ch, 1 mov cl, 0 int 10h End; GetPal(7,R,G,B); Pal(7,0,0,0); WriteLn('Copper Bars Trainer...'); WriteLn; WriteLn('By EzE of Asphyxia.'); WriteLn; WriteLn('Contact Us on ...'); WriteLn; WriteLn; WriteLn('the Asphyxia BBS (031) - 7655312'); WriteLn; WriteLn('Email : eze@'); WriteLn(' asphyxia@'); WriteLn(' edwards@'); WriteLn(' bailey@'); WriteLn(' mcphail@'); WriteLn(' beastie.cs.und.ac.za'); WriteLn; WriteLn('or peter.edwards@datavert.co.za'); WriteLn; WriteLn('Write me snail-mail at...'); WriteLn('P.O. Box 2313'); WriteLn('Hillcrest'); WriteLn('Natal'); WriteLn('3650'); R1 := 0; G1 := 0; B1 := 0; For Loop := 0 to 63 do Begin WaitRetrace; WaitRetrace; Pal(7, R1, G1, B1); If R1 < R Then Inc(R1); If G1 < G Then Inc(G1); If B1 < B Then Inc(B1); End; Asm mov ah, 1 mov ch, 1 mov cl, 0 int 10h End; End; Procedure Fadecurs; Var Loop : Byte; R, G, B : Byte; Begin GetPal(7, R, G, B); For Loop := 0 to 63 do Begin WaitRetrace; WaitRetrace; Pal(7, R, G, B); If R > 0 Then Dec(R); If G > 0 Then Dec(G); If B > 0 Then Dec(B); End; End; Begin TextAttr := $07; While KeyPressed do ReadKey; FadeCurs; DoItAll; Creds; End.