Contributor: NIKOLAJ PAGH { Someone asked for a percentagebar routine. Well, here's a little one I put together. (Put it in SWAG if you like...) There's a testprogram at the end... } UNIT PERC_BAR; INTERFACE PROCEDURE InitBar(Xpos,Ypos,Size,ForCol,BackCol:BYTE); PROCEDURE UpdateBar(Curr:BYTE); IMPLEMENTATION CONST SCSEG = $B800; (* Segment for screen *) SCWIDTH = 80*2; (* Width of screen *) VAR (* Local variables *) BarOffs : WORD; BarSize : BYTE; BarCol : BYTE; (************************************************************************* (* Name : InitBar(Xpos,Ypos,Size,ForCol,BackCol:BYTE) (* Purpose : Initializes the percentage bar. Xpos,Ypos is absolute posi- (* tion on screen, Size is how wide the bar is and ForCol and (* BackCol are the colors to use (* Returns : None (*************************************************************************) PROCEDURE InitBar(Xpos,Ypos,Size,ForCol,BackCol:BYTE); VAR ix : BYTE; wValue : WORD; BEGIN BarOffs:=(Xpos-1)*2+(Ypos-1)*SCWIDTH; BarSize:=Size; BarCol:=BackCol*16+ForCol; wValue:=ORD('²')+BarCol*256; FOR ix:=0 TO BarSize-1 DO MEMW[SCSEG:BarOffs+ix*2]:=wValue; END; (* InitBar(Xpos,Ypos,Size,ForCol,BackCol:BYTE) *) (*************************************************************************** (* Name : UpdateBar(Curr:BYTE) (* Purpose : Updates the bar with the current percentage. Curr is a percen- (* tage value between 0 and 100. (* Returns : None (***************************************************************************) PROCEDURE UpdateBar(Curr:BYTE); VAR ix : INTEGER; pSize : INTEGER; wValue : WORD; BEGIN pSize:=TRUNC((Curr/100)*BarSize); wValue:=ORD('Û')+BarCol*256; FOR ix:=0 TO pSize-1 DO MEMW[SCSEG:BarOffs+ix*2]:=wValue; END; (* UpdateBar(Curr:BYTE) *) END. (* Here is a little test program *) PROGRAM PercTest; USES Perc_Bar; VAR count : WORD; BEGIN InitBar(30,10,20,14,1); FOR count:=1 TO 10000 DO UpdateBar(TRUNC((count/10000)*100)); END.