unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls; type TForm1 = class(TForm) Label9: TLabel; Label10: TLabel; Label11: TLabel; FlagLabel: TLabel; chnl0PaintBox: TPaintBox; Label18: TLabel; chnl0Max: TLabel; chnl0Rpm: TLabel; chnl1PaintBox: TPaintBox; chnl2PaintBox: TPaintBox; chnl3PaintBox: TPaintBox; chnl4PaintBox: TPaintBox; chnl5PaintBox: TPaintBox; chnl6PaintBox: TPaintBox; chnl7PaintBox: TPaintBox; Label4: TLabel; chnl1Max: TLabel; chnl1Rpm: TLabel; Label8: TLabel; chnl2Max: TLabel; chnl2Rpm: TLabel; Label44: TLabel; chnl3Max: TLabel; chnl3Rpm: TLabel; Label47: TLabel; chnl4Max: TLabel; chnl4Rpm: TLabel; Label50: TLabel; chnl5Max: TLabel; chnl5Rpm: TLabel; Label53: TLabel; chnl6Max: TLabel; chnl6Rpm: TLabel; Label56: TLabel; chnl7Max: TLabel; chnl7Rpm: TLabel; Label6: TLabel; Label7: TLabel; Label12: TLabel; Label41: TLabel; Label43: TLabel; Label45: TLabel; Label46: TLabel; Label48: TLabel; WriteButton: TButton; BaseEdit: TEdit; GoButton: TButton; WriteChEdit: TEdit; WriteDataEdit: TEdit; InitButton: TButton; FlagButton: TButton; chnl0RpmBar: TProgressBar; GroupBox0: TGroupBox; Label14: TLabel; Label15: TLabel; chnl0MaxRpmLbl: TLabel; Label13: TLabel; Label19: TLabel; chnl0Track: TTrackBar; chn0ResEdit: TEdit; chnl0MultBox: TComboBox; ChEdit0: TEdit; setBtn0: TButton; RestBtn0: TButton; GroupBox1: TGroupBox; Label16: TLabel; Label17: TLabel; Label20: TLabel; chnl1MaxRpmLbl: TLabel; Label21: TLabel; chnl1Track: TTrackBar; chn1ResEdit: TEdit; chnl1MultBox: TComboBox; ChEdit1: TEdit; RestBtn1: TButton; setBtn1: TButton; GroupBox2: TGroupBox; Label22: TLabel; Label23: TLabel; Label24: TLabel; chnl2MaxRpmLbl: TLabel; Label26: TLabel; chnl2Track: TTrackBar; chn2ResEdit: TEdit; chnl2MultBox: TComboBox; ChEdit2: TEdit; setBtn2: TButton; RestBtn2: TButton; GroupBox3: TGroupBox; Label27: TLabel; Label28: TLabel; Label29: TLabel; chnl3MaxRpmLbl: TLabel; Label31: TLabel; chnl3Track: TTrackBar; chn3ResEdit: TEdit; chnl3MultBox: TComboBox; ChEdit3: TEdit; setBtn3: TButton; RestBtn3: TButton; GroupBox4: TGroupBox; Label25: TLabel; Label30: TLabel; Label32: TLabel; chnl4MaxRpmLbl: TLabel; Label34: TLabel; chnl4Track: TTrackBar; chn4ResEdit: TEdit; chnl4MultBox: TComboBox; ChEdit4: TEdit; setBtn4: TButton; RestBtn4: TButton; GroupBox5: TGroupBox; Label35: TLabel; Label36: TLabel; Label37: TLabel; chnl5MaxRpmLbl: TLabel; Label39: TLabel; chnl5Track: TTrackBar; chn5ResEdit: TEdit; chnl5MultBox: TComboBox; ChEdit5: TEdit; setBtn5: TButton; RestBtn5: TButton; GroupBox6: TGroupBox; Label33: TLabel; Label38: TLabel; Label40: TLabel; chnl6MaxRpmLbl: TLabel; Label42: TLabel; chnl6Track: TTrackBar; chn6ResEdit: TEdit; chnl6MultBox: TComboBox; ChEdit6: TEdit; setBtn6: TButton; RestBtn6: TButton; GroupBox7: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; chnl7MaxRpmLbl: TLabel; Label5: TLabel; chnl7Track: TTrackBar; chn7ResEdit: TEdit; chnl7MultBox: TComboBox; ChEdit7: TEdit; setBtn7: TButton; RestBtn7: TButton; chnl1RpmBar: TProgressBar; chnl2RpmBar: TProgressBar; chnl3RpmBar: TProgressBar; chnl4RpmBar: TProgressBar; chnl5RpmBar: TProgressBar; chnl6RpmBar: TProgressBar; chnl7RpmBar: TProgressBar; TheTime: TTimer; resetTimer: TTimer; procedure FormCreate(Sender: TObject); procedure WriteButtonClick(Sender : TObject); procedure BaseEditChange(Sender : TObject); procedure GoButtonClick(Sender : TObject ); procedure StopButtonClick(Sender : TObject); procedure TheTimeTimer(Sender : TObject); procedure InitButtonClick(Sender : TObject); procedure FlagButtonClick(Sender : TObject); procedure chnlTrackChange(Sender : TObject); procedure PaintBoxPaint(Sender : TObject); procedure chnlMultBoxChange(Sender : TObject); function setChannelMult(channel, mult : Integer) : Integer; procedure RestBtnClick(Sender : TObject); procedure resetTimerTimer(Sender : TObject); procedure setBtnClick(Sender : TObject); procedure ChEditKeyDown(Sender : TObject; var Key : Word; Shift: TShiftState); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Addr : Word; ChEdit : array [0..7] of TEdit; LoadEdit : array [0..7] of TEdit; resolution : array [0..7] of TEdit; rpmLabel : array[0..7] of TLabel; maxRpmGroupLabel : array [0..7] of TLabel; maxRpmBarLabel : array [0..7] of TLabel; rpmBar : array [0..7] of TProgressBar; paintBox : array [0..7] of TPaintBox; trackBar : array [0..7] of TTrackBar; multBox : array[0..7] of TComboBox; gBoxes : array [0..7] of TGroupBox; setBtn : array [0..7] of TButton; channelControlBytes : array [0..7] of Integer; channelResolutions : array [0..7] of Integer; channelMults : array[0..7] of Integer; channelReads : array[0..7] of Integer; channelReadsPrev : array[0..7] of Integer; const RLD = $80; const XRLD = $00; const YRLD = XRLD; const Rst_BP = $01; const Rst_CTR = $02; const Rst_FLAGS = $04; const Rst_E = $06; const Trf_PR_CTR = $08; const Trf_CTR_OL = $10; const Trf_PS0_PSC = $18; const CMR = $A0; const XCMR = $20; const YCMR = XCMR; const BINCnt = $00; const BCDCnt = $01; const NrmCnt = $00; const RngLmt = $02; const NRcyc = $04; const ModN = $06; const NQDX = $00; const QDX1 = $08; const QDX2 = $10; const QDX4 = $18; const IOR = $C0; const XIOR = $40; const YIOR = $00; const DisAB = $00; const EnAB = $01; const LCTR = $00; const LOL = $02; const RCTR = $00; const ABGate = $04; const CYBW = $00; const CPBW = $08; const CB_UPDN = $10; const IDX_ERR = $18; const IDR = $E0; const XIDR = $60; const YIDR = XIDR; const DisIDX = $00; const EnIDX = $01; const NIDX = $00; const PIDX = $02; const LIDX = $00; const RIDX = $04; const PI = 3.141593; implementation uses ACCES32; {$R *.DFM} //--------------------------------------------------------------------------- procedure Init_7266(Addr : LongWord); var XCt : LongWord; YCt : LongWord; count : Integer; begin for count := 0 to 3 do begin XCt := $FFFFFFFF; YCt := $FFFFFFFF; //Setup IOR reg OutPortB(Addr + 1, IOR + DisAB + LOL + ABGate + CYBW); //Setup RLD reg OutPortB(Addr + 1, RLD + Rst_BP + Rst_FLAGS); OutPortB(Addr + 0, $00); OutPortB(Addr + 2, $00); OutPortB(Addr + 1, RLD + Rst_E + Trf_PS0_PSC); OutPortB(Addr + 1, RLD + Rst_BP + Rst_CTR); //Setup IDR reg OutPortB(Addr + 1, IDR + EnIDX + NIDX + LIDX); //Setup CMR reg OutPortB(Addr + 1, CMR + BINCnt + ModN + QDX1); //Setup PR reg for modulo N counter to XCt OutPortB(Addr + 0, XCt); XCt := XCt shr 8; OutPortB(Addr + 0, XCt); XCt := XCt shr 8; OutPortB(Addr + 0, XCt); //Setup PR reg for modulo N counter to YCt OutPortB(Addr + 2, YCt); YCt := YCt shr 8; OutPortB(Addr + 2, YCt); YCt := YCt shr 8; OutPortB(Addr + 2, YCt); //Enable counters OutPortB(Addr + 1, IOR + EnAB); inc(Addr, 4); end; end; procedure Write_7266_PR(Addr : LongWord; Data : LongWord); begin OutPortB(Addr + 1, RLD + Rst_BP); OutPortB(Addr + 0, Data); Data := Data shr 8; OutPortB(Addr + 0, Data); Data := Data shr 8; OutPortB(Addr + 0, Data); end; function Read_7266_OL(Addr : LongWord) : integer; var reading : array[0..2] of BYTE; begin OutPortB(ADDR + 1, RLD + Rst_BP + Trf_CTR_OL); reading[0] := InPortB(Addr); reading[1] := InPortB(Addr); reading[2] := InPortB(Addr); if (reading[2] and $80) <> 0 then begin reading[2] := not reading[2]; reading[1] := not reading[1]; reading[0] := not reading[0]; result := (reading[2] shl 16) or (reading[1] shl 8) or reading[0]; result := (result * -1) - 1; end else result := (reading[2] shl 16) or (reading[1] shl 8) or reading[0] ; end; function Get_7266_Flags(Addr : LongWord) : BYTE; begin Get_7266_Flags := InPortB(Addr + 1); end; //--------------------------------------------------------------------------- procedure TForm1.FormCreate(Sender: TObject); var count : Integer; begin ChEdit[0] := ChEdit0; ChEdit[1] := ChEdit1; ChEdit[2] := ChEdit2; ChEdit[3] := ChEdit3; ChEdit[4] := ChEdit4; ChEdit[5] := ChEdit5; ChEdit[6] := ChEdit6; ChEdit[7] := ChEdit7; rpmLabel[0] := chnl0Rpm; rpmLabel[1] := chnl1Rpm; rpmLabel[2] := chnl2Rpm; rpmLabel[3] := chnl3Rpm; rpmLabel[4] := chnl4Rpm; rpmLabel[5] := chnl5Rpm; rpmLabel[6] := chnl6Rpm; rpmLabel[7] := chnl7Rpm; rpmBar[0] := chnl0RpmBar; rpmBar[1] := chnl1RpmBar; rpmBar[2] := chnl2RpmBar; rpmBar[3] := chnl3RpmBar; rpmBar[4] := chnl4RpmBar; rpmBar[5] := chnl5RpmBar; rpmBar[6] := chnl6RpmBar; rpmBar[7] := chnl7RpmBar; channelControlBytes[0] := 1; channelControlBytes[1] := 3; channelControlBytes[2] := 5; channelControlBytes[3] := 7; channelControlBytes[4] := 9; channelControlBytes[5] := 11; channelControlBytes[6] := 13; channelControlBytes[7] := 15; paintBox[0] := chnl0PaintBox; paintBox[1] := chnl1PaintBox; paintBox[2] := chnl2PaintBox; paintBox[3] := chnl3PaintBox; paintBox[4] := chnl4PaintBox; paintBox[5] := chnl5PaintBox; paintBox[6] := chnl6PaintBox; paintBox[7] := chnl7PaintBox; resolution[0] := chn0ResEdit; resolution[1] := chn1ResEdit; resolution[2] := chn2ResEdit; resolution[3] := chn3ResEdit; resolution[4] := chn4ResEdit; resolution[5] := chn5ResEdit; resolution[6] := chn6ResEdit; resolution[7] := chn7ResEdit; trackBar[0] := chnl0Track; trackBar[1] := chnl1Track; trackBar[2] := chnl2Track; trackBar[3] := chnl3Track; trackBar[4] := chnl4Track; trackBar[5] := chnl5Track; trackBar[6] := chnl6Track; trackBar[7] := chnl7Track; maxRpmGroupLabel[0] := chnl0MaxRpmLbl; maxRpmGroupLabel[1] := chnl1MaxRpmLbl; maxRpmGroupLabel[2] := chnl2MaxRpmLbl; maxRpmGroupLabel[3] := chnl3MaxRpmLbl; maxRpmGroupLabel[4] := chnl4MaxRpmLbl; maxRpmGroupLabel[5] := chnl5MaxRpmLbl; maxRpmGroupLabel[6] := chnl6MaxRpmLbl; maxRpmGroupLabel[7] := chnl7MaxRpmLbl; maxRpmBarLabel[0] := chnl0Max; maxRpmBarLabel[1] := chnl1Max; maxRpmBarLabel[2] := chnl2Max; maxRpmBarLabel[3] := chnl3Max; maxRpmBarLabel[4] := chnl4Max; maxRpmBarLabel[5] := chnl5Max; maxRpmBarLabel[6] := chnl6Max; maxRpmBarLabel[7] := chnl7Max; multBox[0] := chnl0MultBox; multBox[1] := chnl1MultBox; multBox[2] := chnl2MultBox; multBox[3] := chnl3MultBox; multBox[4] := chnl4MultBox; multBox[5] := chnl5MultBox; multBox[6] := chnl6MultBox; multBox[7] := chnl7MultBox; gBoxes[0] := GroupBox0; gBoxes[1] := GroupBox1; gBoxes[2] := GroupBox2; gBoxes[3] := GroupBox3; gBoxes[4] := GroupBox4; gBoxes[5] := GroupBox5; gBoxes[6] := GroupBox6; gBoxes[7] := GroupBox7; setBtn[0] := setBtn0; setBtn[1] := setBtn1; setBtn[2] := setBtn2; setBtn[3] := setBtn3; setBtn[4] := setBtn4; setBtn[5] := setBtn5; setBtn[6] := setBtn6; setBtn[7] := setBtn7; channelControlBytes[0] := 1; channelControlBytes[1] := 3; channelControlBytes[2] := 5; channelControlBytes[3] := 7; channelControlBytes[4] := 9; channelControlBytes[5] := 11; channelControlBytes[6] := 13; channelControlBytes[7] := 15; GoButton.Enabled := false; WriteButton.Enabled := false; FlagButton.Enabled := false; for count:= 0 to 7 do begin channelResolutions[count] := 1000; channelMults[count] := 4; maxRpmGroupLabel[count].Caption := IntToStr(trackBar[count].Position); maxRpmBarLabel[count].Caption := maxRpmGroupLabel[count].Caption; gBoxes[count].Enabled := false; end; end; //--------------------------------------------------------------------------- procedure TForm1.WriteButtonClick(Sender : TObject); var Chan : Word; Data : Word; begin Chan := StrToInt('$' + WriteChEdit.Text); Data := StrToInt('$' + WriteDataEdit.Text); Write_7266_PR(Addr + Chan * 2, Data); end; //--------------------------------------------------------------------------- procedure TForm1.BaseEditChange(Sender : TObject); begin Addr := StrToInt('$' + BaseEdit.Text); BaseEdit.ParentColor := true; end; //--------------------------------------------------------------------------- procedure TForm1.GoButtonClick(Sender : TObject ); begin TheTime.Enabled := true; GoButton.OnClick := StopButtonClick; GoButton.Caption := 'Stop'; end; //--------------------------------------------------------------------------- procedure TForm1.StopButtonClick(Sender : TObject); begin TheTime.Enabled := false; GoButton.OnClick := GoButtonClick; GoButton.Caption := 'Go'; end; //--------------------------------------------------------------------------- procedure TForm1.TheTimeTimer(Sender : TObject); var rpm : double; I : LongWord; begin for I := 0 to 7 do begin channelReads[I] := Read_7266_OL(Addr + I * 2); rpm := (channelReadsPrev[I] - channelReads[I]); rpm := rpm / (channelResolutions[I] * channelMults[I]); rpm := rpm * 60 /(TheTime.Interval * 0.001); rpm := abs(rpm); rpmLabel[I].Caption := FloatToStr(rpm); ChEdit[I].Text := IntToStr(channelReads[I]); if channelReadsPrev[I] <> channelReads[I] then paintBox[I].Invalidate() ; channelReadsPrev[I] := channelReads[I]; if (rpm > rpmBar[I].Max) then rpmBar[I].Position := rpmBar[I].Max else rpmBar[I].Position := round(rpm); ; end; end; //--------------------------------------------------------------------------- procedure TForm1.InitButtonClick(Sender : TObject); var count : Integer; begin //initialize all the counters to a resolution of 1000 //with a mulitplier of 4 Addr := StrToInt('$' + BaseEdit.Text); Init_7266(Addr); for count := 0 to 7 do begin channelReads[count] := 0; channelReadsPrev[count] := 0; gBoxes[count].Enabled := true; end; OutPortB(Addr + $14, 1); InitButton.Enabled := false; GoButton.Enabled := true; WriteButton.Enabled := true; FlagButton.Enabled := true; end; //--------------------------------------------------------------------------- procedure TForm1.FlagButtonClick(Sender : TObject); var Chan : LongWord; begin Chan := StrToInt('$' + WriteChEdit.Text); FlagLabel.Caption := IntToHex(Get_7266_Flags(Addr + Chan * 2), 2); end; //--------------------------------------------------------------------------- procedure TForm1.PaintBoxPaint(Sender : TObject); var angle : double; pBox : TPaintBox; currentChannel : Integer; begin pBox := Sender as TPaintBox; currentChannel := pBox.Tag; if (rpmBar[currentChannel].Position = rpmBar[currentChannel].Max) then pBox.Canvas.Brush.Color := clRed else pBox.Canvas.Brush.Color := clWhite ; pBox.Canvas.Pen.Color := clBlack; pBox.Canvas.Ellipse(10, 10, 100, 100); pBox.Canvas.MoveTo(55, 55); pBox.Canvas.LineTo(55, 100); pBox.Canvas.MoveTo(55, 55); angle := channelReads[currentChannel]; angle := angle * 2 * PI; angle := angle / (channelResolutions[currentChannel] * channelMults[currentChannel]) - 0.5 * PI ; pBox.Canvas.Pen.Color := clBlue; pBox.Canvas.LineTo(round(55.0 - 45.0 * cos(angle)), round(55.0 - 45.0 * sin(angle))); end; //--------------------------------------------------------------------------- procedure TForm1.chnlTrackChange(Sender : TObject); var pBar : TTrackBar; begin pBar := Sender as TTrackBar; maxRpmBarLabel[pBar.Tag].Caption := IntToStr(trackBar[pBar.Tag].Position); maxRpmGroupLabel[pBar.Tag].Caption := maxRpmBarLabel[pBar.Tag].Caption; rpmBar[pBar.Tag].Max := trackBar[pBar.Tag].Position; end; //--------------------------------------------------------------------------- procedure TForm1.chnlMultBoxChange(Sender : TObject); var pBox : TComboBox; begin pBox := Sender as TComboBox; pBox.Text := IntToStr(setChannelMult(pBox.Tag, StrToInt(pBox.Text))); paintBox[pBox.Tag].Invalidate; end; //--------------------------------------------------------------------------- function TForm1.setChannelMult(channel, mult : Integer) : Integer; begin case mult of 1: begin channelMults[channel] := 1; OutPortB(Addr + channelControlBytes[channel], CMR + BINCnt + ModN + QDX1); setChannelMult := 1; end; 2: begin channelMults[channel] := 2; OutPortB(Addr + channelControlBytes[channel], CMR + BINCnt + ModN + QDX2); setChannelMult := 2; end; 4: begin channelMults[channel] := 4; OutPortB(Addr + channelControlBytes[channel], CMR + BINCnt + ModN + QDX4); setChannelMult := 4; end; else setChannelMult := channelMults[channel]; end; end; procedure TForm1.RestBtnClick(Sender : TObject); var pBtn : TButton; begin pBtn := Sender as TButton; OutPortB(Addr + channelControlBytes[pBtn.Tag], Rst_CTR); resetTimer.Tag := pBtn.Tag; resetTimer.Enabled := true; end; //--------------------------------------------------------------------------- procedure TForm1.resetTimerTimer(Sender : TObject); begin resetTimer.Enabled := false; rpmBar[resetTimer.Tag].Position := rpmBar[resetTimer.Tag].Min; paintBox[resetTimer.Tag].Invalidate(); end; //--------------------------------------------------------------------------- procedure TForm1.setBtnClick(Sender : TObject); var pBtn : TButton; begin pBtn := Sender as TButton; channelResolutions[pBtn.Tag] := StrToIntDef(resolution[pBtn.Tag].Text, 1000); paintBox[pBtn.Tag].Invalidate(); end; //--------------------------------------------------------------------------- procedure TForm1.ChEditKeyDown(Sender : TObject; var Key : Word; Shift: TShiftState); var result : Integer; pEdit : TEdit; begin result := GetAsyncKeyState(VK_RETURN); if (result and $8000) <> 0 then begin pEdit := Sender as TEdit; setBtn[pEdit.Tag].Click(); end; end; end.