Список форумов МРК

МРК "МУССОН"

Вечная память
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Вспоминая юность. Радио РК-86

 
Начать новую тему   Ответить на тему    Список форумов МРК "МУССОН" -> Математическое и компьютерное моделирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Valeriy
Site Admin
цитировать



Репутация: 0    

Зарегистрирован: 11.01.2009
Сообщения: 839
Откуда: Москва (Кострома)

СообщениеДобавлено: 07 Авг 2010 15:34    Заголовок сообщения: Вспоминая юность. Радио РК-86 Ответить с цитатой

В далекие, далекие времена, когда еще слово компьютер никто не слышал, нам по телевидению, радио и печати очень красиво рассказывали про ЭВМ - верх творчества человеческого сознания! Сколько было прочитано разных книг о Кибернетике, ЭВМ. Тогда очень легко и не дорого можно было их купить. И не мечтали тогда мальчишки о карьере бухгалтера и непонятного менеджера. Вот закончена школа (1976), впереди поступление в институт. Я уже выбрал куда – филиал МЭИ в г. Смоленске, на специальность конструирования ЭВМ. Но…, как всегда бывает но. Родители уговорили попробовать сперва силы, для тренировки, в военный ВУЗ. А отец тогда служил в СГВ (Польша), и родителям явно не хотелось оставить меня одного свободным, потому пошли на хитрость. Короче так попробовал, что пробовать закончил в 2001 году, отдав Родине 25 календарей и 34 льготных. Но никогда не забывал свою “первую любовь”, с детства увлекался радиоэлектроникой, изучал ее в военном училище, и конечно же, изучал военные ЭВМ. Но хотелось не только военных, поэтому когда появились первые программируемые калькуляторы, пришлось раскошелиться. Помню, как 83 читал в журнале “Радио” про первую любительскую ЭВМ – "Микро-80". Читал и понимал, не иметь мне Микро, ну негде мне было взять деталей. Время идет, в обиходе уже появилось слово компьютер, персональный, но никто его из моих друзей близко не видел, отдаленный гарнизон всеж. В 1986 году, в 4 номере журнала “Радио” печатают про новую любительскую персональную ЭВМ – “Радио РК-86”, которую уже реально было собрать. И вот, наконец, промы (так жаргонно звали у нас представителей заводов изготовителей нашей военной техники) предложили комплект деталей и плату с клавиатурой для самостоятельной сборки, и всего-то за 250 рублей. После обсуждения с женой, деньги были выделены, но опять но, пошла задержка и купил я его только в очередном отпуске, в г Смоленске, в магазине радиоэлектроники, но уже значительно дороже.
Сколько бессонных ночей было проведено за ним. Даже ДОС свою написал для него.
Прошло время, он давно вышел из моды, но и сейчас в строю. На нем сделан программатор ППЗУ типа РФ, собственной конструкции, и бывает иногда востребован. Последний раз в прошлом году.
В 2006 году, в период моей очередной безработицы был написан эмулятор РКашки на Дельфи, просто так, чтоб мозги не черствели. Было много планов, была уже проработка отладчика, серьезного, преобразование в компоненты и т.д., но появилась статья Ульянича, посвященная гибели МРК “Муссон”, я с головой ушел в эту тему, сам был участником – более 20 минут в ледяной воде. Стали другие вопросы. Так и лежит с тех пор, иногда заглядываю, мимоходом, может, что и подправляю, но тема стоит. В то время уже был хороший эмулятор В. Пыхонина, но он был написан под ДОС и плохо работал под ХР, загружая ресурсы ПК почти на 100%. Сейчас зайдя на сайт http://emu80.org/#sitenews вижу, что он вроде бы выполнил свое обещание и написал новую версию. Мой эмулятор не пытается сделать ему конкуренцию, поэтому я выкладываю коды. Может кому будет интересна возможность реализации эмулятора на Дельфи.


Последний раз редактировалось: Valeriy (18 Янв 2011 02:25), всего редактировалось 3 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Valeriy
Site Admin
цитировать



Репутация: 0    

Зарегистрирован: 11.01.2009
Сообщения: 839
Откуда: Москва (Кострома)

СообщениеДобавлено: 07 Авг 2010 16:29    Заголовок сообщения: Ответить с цитатой

http://lto.narod.ru/res/PK.rar


VPC_PK86.dpr

Код:

program VPC_PK86;



uses
  Forms,
  UIm in 'UIm.pas' {Form1},
  UDebag in 'UDebag.pas' {DebagForm},
  UMem in 'UMem.pas',
  UKeyb in 'UKeyb.pas',
  U8080 in 'U8080.pas',
  UStrHex in 'UStrHex.pas',
  UDMemo in 'UDMemo.pas' {FormDM},
  UGlbPK in 'UGlbPK.pas',
  UIm2 in 'UIm2.pas' {Form2};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TDebagForm, DebagForm);
  Application.CreateForm(TFormDM, FormDM);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end..

---------------------------------------------------------------------------------------------------------



UIm.dfm

Код:

object Form1: TForm1
  Left = 132
  Top = 0
  Caption = 'Virtual personal computer '#1056#1040#1044#1048#1054'-86PK'
  ClientHeight = 532
  ClientWidth = 762
  Color = clBtnFace
  Font.Charset = RUSSIAN_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  KeyPreview = True
  OldCreateOrder = False
  Position = poScreenCenter
  OnClose = FormClose
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  OnKeyDown = FormKeyDown
  OnKeyUp = FormKeyUp
  PixelsPerInch = 96
  TextHeight = 13
  object Image1: TImage
    Left = 16
    Top = 12
    Width = 640
    Height = 480
    OnDblClick = Image1DblClick
  end
  object Label1: TLabel
    Left = 672
    Top = 166
    Width = 10
    Height = 24
    Caption = '0'
    Font.Charset = RUSSIAN_CHARSET
    Font.Color = clWindowText
    Font.Height = -19
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    ParentFont = False
  end
  object Label2: TLabel
    Left = 668
    Top = 220
    Width = 10
    Height = 29
    Caption = '*'
    Font.Charset = RUSSIAN_CHARSET
    Font.Color = clRed
    Font.Height = -24
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    ParentFont = False
    Visible = False
  end
  object Label3: TLabel
    Left = 672
    Top = 304
    Width = 10
    Height = 24
    Caption = '0'
    Font.Charset = RUSSIAN_CHARSET
    Font.Color = clWindowText
    Font.Height = -19
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    ParentFont = False
  end
  object Label4: TLabel
    Left = 678
    Top = 374
    Width = 5
    Height = 24
    Font.Charset = RUSSIAN_CHARSET
    Font.Color = clWindowText
    Font.Height = -19
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    ParentFont = False
  end
  object sbDebug: TSpeedButton
    Left = 676
    Top = 24
    Width = 27
    Height = 22
    Hint = 'Debugger'
    AllowAllUp = True
    GroupIndex = 1
    Glyph.Data = {
      F6000000424DF600000000000000760000002800000010000000100000000100
      0400000000008000000000000000000000001000000000000000000000000000
      8000008000000080800080000000800080008080000080808000C0C0C0000000
      FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00BBBBBBBB4BBB
      BBBBBBBBBBB7C4BBBBBBBB9B0B4A444B0B9BBBB9B466C444B9BBBBBB97A4C445
      9BBBBBBB195C44593BBBBBB04095459540BBBBBB4A0959544BBBBBBB4A009544
      4BBBBBBB4A0959544BBBBBB04795C59540BBBBBB39A4C4593BBBBBBB93676443
      9BBBBBB9BBB7247BB9BBBB9BBBB6447BBB9BBBBBBB037730BBBB}
    ParentShowHint = False
    ShowHint = True
    OnClick = sbDebagClick
  end
  object Label5: TLabel
    Left = 678
    Top = 222
    Width = 5
    Height = 16
    Font.Charset = RUSSIAN_CHARSET
    Font.Color = clWindowText
    Font.Height = -13
    Font.Name = 'MS Sans Serif'
    Font.Style = [fsBold]
    ParentFont = False
  end
  object Button1: TButton
    Left = 106
    Top = 506
    Width = 75
    Height = 25
    Caption = 'Start'
    Enabled = False
    TabOrder = 0
    TabStop = False
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 530
    Top = 506
    Width = 75
    Height = 25
    Caption = 'Close'
    TabOrder = 2
    TabStop = False
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 318
    Top = 506
    Width = 75
    Height = 25
    Caption = 'Reset'
    TabOrder = 1
    TabStop = False
    OnClick = Button3Click
  end
  object TimerLab: TTimer
    OnTimer = TimerLabTimer
    Left = 30
    Top = 22
  end
  object TimerSpeed: TTimer
    Interval = 150
    OnTimer = TimerSpeedTimer
    Left = 72
    Top = 22
  end
  object TmThMem: TTimer
    Interval = 100
    OnTimer = TmThMemTimer
    Left = 114
    Top = 22
  end
  object TimerCurs: TTimer
    Interval = 503
    OnTimer = TimerCursTimer
    Left = 152
    Top = 22
  end
  object OpenDialog1: TOpenDialog
    Left = 224
    Top = 22
  end
  object SaveDialog1: TSaveDialog
    Left = 258
    Top = 22
  end
  object Timer1: TTimer
    Enabled = False
    Interval = 2000
    OnTimer = Timer1Timer
    Left = 190
    Top = 22
  end
end



---------------------------------------------------------------------------------------------------------

UIm.pas

Код:

{ *********************************************************************** }
{                                                                         }
{ Major integral Form Unit UIm.pas                                        }
{ V. 3.2.67                                                               }
{ Copyright (c) 2006  Mihaylov Valeriy                                    }
{                                                                         }
{ *********************************************************************** }

unit UIm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, AppEvnts, Buttons, UGlbPK, U8080, UKeyb, UMem, UDMemo;

type
  TForm1 = class(TForm)
    Image1: TImage;             
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    sbDebug: TSpeedButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Timer1: TTimer;
    TimerCurs: TTimer;
    TimerLab: TTimer;
    TimerSpeed: TTimer;
    tmThMem: TTimer;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Keyb(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
    procedure TimerCursTimer(Sender: TObject);
    procedure TimerLabTimer(Sender: TObject);
    procedure TimerSpeedTimer(Sender: TObject);
    procedure tmThMemTimer(Sender: TObject);
    procedure sbDebagClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Image1DblClick(Sender: TObject);
  private
     procedure FileLoad;
     procedure FileSave;
     procedure SetAddrCpu(Sender: TObject);
     procedure SetByteCpu(Sender: TObject);
     procedure GetByteCpu(Sender: TObject);
     procedure SetPortKey(Sender: TObject);
     procedure GetPortKey(Sender: TObject);
     procedure LoadFont;
     procedure CMDialogKey( Var msg: TCMDialogKey ); // !!!  VK_TAB
     message CM_DIALOGKEY;
  public
    { Public declarations }
  end;

{ TMyThread }

  TMyThread = class(TThread)
  protected
    procedure Execute; override; // Main thread execution
  end;

{ TMemThread }

  TMemThread = class(TThread)
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  Cpu: Tcpu;
  MemCPU: TMemCPU;



implementation

{$R *.DFM}

uses
  UStrHex, UDebag, UIm2;

var
  KeybCPU: TKeybCPU;
  NewThread: TMyThread;
  MemThread: TMemThread;
  FontBitMap : TBitMap;
  FClCrs: byte; //цвет курсора
  kb: boolean;
  TikOld: int64;
  TokOld1: int64;
  tok: int64;
  tokold: int64;
  Ks: integer;
  Kss: integer;
  oldc: integer =0;
  Tik: int64;
  Ffile: TFileStream;
  KOpfl: boolean = true;  //разрешить отрытие OpenDialog и SaveDialog
  KSvfl: boolean = false; //запрешена запись байта до первого синхробайта
  LnFlB: Word;            //длина файла
  LtFl: Word;             //текущая длина файла

const
  ExitErrAdd: Word = $FAAE;
  C_SynX: byte = 8; //размер знакоместа
  C_SynY: byte = 16;



procedure TForm1.Button1Click(Sender: TObject);
begin
  //Button1.Enabled := false;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  kb:=true;
  close;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Button3.Enabled:= false;
  Button3.Enabled:= true;

  if Cpu.dbg then exit;
  kb:= true;
  sleep(200);
  Cpu.RESET;
  Cpu.dbg := false;
  ks:=kss;
  TimerSpeed.Enabled:= false;
  TimerSpeed.Enabled:= true;
  NewThread := TMyThread.Create(false);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  KeybCPU.KeyDownCPU(Key,Shift);
end;

procedure TForm1.CMDialogKey(var msg: TCMDialogKey);
begin
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  sleep(20);
  KeybCPU.KeyUPCPU(Sender);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  MemThread.Terminate;
  Application.Terminate;
  sleep(100);
end;

procedure TForm1.TimerLabTimer(Sender: TObject);
begin
  Label1.Caption:=IntToStr(Tik-TikOld);
  TikOld:= Tik;
  Label2.Enabled:= not Label2.Enabled;
  Label3.Caption:=IntToStr(Tok-TokOld);
  TokOld:= Tok;
end;

procedure TForm1.TimerSpeedTimer(Sender: TObject);
var
  f,c: integer;
const
  b: integer=2800;
begin
  c:= Tok-TokOld1; //автоматическая стабилизация скорости
  f:= oldc-c;
  ks:= byte((c + kss*100 + f div 5)div b);
  TokOld1:= Tok;
  oldc:= c;
  Label4.Caption:= IntToStr(ks)+'  '+ IntToStr(kss);
end;

procedure TForm1.sbDebagClick(Sender: TObject);
begin
  if sbDebug.Down then begin
    kb:= true;
    sleep(100);
    Cpu.dbg:= true;
    FormDM.Memo.Lines.Add(#13#10+'  BEGIN TRACE'+#13#10#13#10);
    DebagForm.Show;
  end
  else begin
    FormDM.Memo.Lines.Add(#13#10+'  STOP TRACE'+#13#10#13#10);
    DebagForm.Hide;
    Cpu.dbg:= false;
    ks:= kss;
    NewThread := TMyThread.Create(false);
  end;
end;

procedure TForm1.GetPortKey(Sender: TObject);
begin
  MemCpu.vPortA:= KeybCPU.vPortKeyA;
  MemCpu.vPortB:= KeybCPU.vPortKeyB;
  MemCpu.vPortC:= KeybCPU.vPortKeyC;
end;

procedure TForm1.Image1DblClick(Sender: TObject);
begin
  if not Form2.Visible then begin
     Form1.Hide;
     Form2.Show;
  end;
end;

procedure TForm1.SetPortKey(Sender: TObject);
begin
  KeybCPU.vPortKeyC:= MemCpu.vPortC;
end;

procedure TForm1.SetAddrCpu(Sender: TObject);
begin
  MemCpu.vAddr:= CPU.vAddr;
end;

procedure TForm1.GetByteCpu(Sender: TObject);
begin
   CPU.vMemB:= MemCpu.vMemB;
end;

procedure TForm1.SetByteCpu(Sender: TObject);
begin
   MemCpu.vMemB:= CPU.vMemB;
end;

{формирует мигающий курсор с кордионатами Х и У}
procedure TForm1.TimerCursTimer(Sender: TObject);
begin
  if(FCrsX<64) and (FCrsY<25) then// курсор в пределах экрана
  FClCrs := not FClCrs else FClCrs:= clBlack;
{показывает раскладку клавы}
  if KeybCPU.vPortLang then begin
    Label5.Font.Color:=clBlack;
    Label5.Caption:= 'LAT';
  end
  else begin
    Label5.Font.Color:=clRed;
    Label5.Caption:= 'RUS';
  end;
end;

procedure TForm1.Keyb(Sender: TObject);
begin
//  Form1.Repaint;
  KeybCPU.KeyUPCPU(Sender);
end;

procedure TForm1.tmThMemTimer(Sender: TObject);
begin
  tmThMem.Enabled :=false;
  MemThread.Resume
end;

procedure TForm1.LoadFont;
var
  i: Integer;
  FonFl: file of byte;
  P : PBtArray;
begin
  FontBitMap := TBitMap.create;
  FontBitMap.Height := 16*$80;
  FontBitMap.Width := 8;
  FontBitMap.PixelFormat := pf1bit;
  try
    AssignFile(FonFl, 'FONTS.BIN');
    Reset(FonFl);
    for i := 0 to FontBitMap.Height -1 do
    begin
      P := FontBitMap.ScanLine[i];
      read(FonFl,P[0]);
    end;
  finally
    CloseFile(FonFl);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CPU:= TCPU.Create(self);
  MemCPU:= TMemCPU.Create(self);
  KeybCPU:= TKeybCPU.Create;
  LoadFont;
  MemCPU.OnPortR:= GetPortKey;
  MemCPU.OnPortW:= SetPortKey;
  CPU.OnReset:= Keyb;
  Cpu.OnAddr:= SetAddrCpu;
  Cpu.OnReadB:= GetByteCpu;
  Cpu.OnWriteB:= SetByteCpu;
  FFile:= nil;
  KOpfl:= true;
  ks:=14;
  Kb:= false;
  Cpu.dbg := false;
  rTakt.regs[6]:= $F800;
  CPU.RESET;
  MemThread := TMemThread.Create(True);
  MemThread.FreeOnTerminate := True;
  MemThread.Priority := tpHighest;
  NewThread := TMyThread.Create(true);
  NewThread.Resume;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  sleep(100);
  Ffile.Free;
  KeybCPU.Free;
  MemCPU.Free;
  FontBitMap.Free;
  CPU.Free;
  inherited;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:= false;
  FFile.Free;
  FFile:=nil;
  KOpfl:= true;
  KSvfl:= false;
end;

procedure TForm1.FileLoad;   // Чтение файла
begin
Try
if OpenDialog1.Execute then
  begin
    FFile:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyNone);
    FFile.Position:=0;
    if FFile.Size > $760F then
    begin
      FFile.Free;
      FFile:=nil;
      rTakt.regs[6]:= ExitErrAdd;
      Cpu.SetCpu(rTakt);
      KOpfl:= true;
      //ShowMessage('Большой размер файла');
    end
    else begin LnFlB:= FFile.Size; KOpfl:= false; LtFl:= 0; end;
  end else KOpfl:= true;
except
      FFile.Free;
      FFile:=nil;
      rTakt.regs[6]:= ExitErrAdd;
      Cpu.SetCpu(rTakt);
      KOpfl:= true;
      //ShowMessage('Ошибка ввода');
end;
  if Form1.Visible then
    SendMessage(Form1.Handle, WM_Activate, WA_Active, 0) else
    SendMessage(Form2.Handle, WM_Activate, WA_Active, 0);
  Keyb(self);
end;

procedure TForm1.FileSave;  //Запись файла
begin
  if SaveDialog1.Execute then
  begin
    try
    FFile:= TFileStream.Create(SaveDialog1.FileName, fmCreate or fmShareExclusive);
    FFile.Position:=0;
    except
      FFile.Free;
      FFile:=nil;
    end;
  end;
  KOpfl:= false;
  KSvfl:= false;
  if Form1.Visible then
    SendMessage(Form1.Handle, WM_Activate, WA_Active, 0) else
    SendMessage(Form2.Handle, WM_Activate, WA_Active, 0);
  Keyb(self);
end;

//******************************************************************************

{ TMyThread }

procedure TMyThread.Execute;
var
  a,f,e,
  b,c: byte;

procedure POP(var Reg: word);
begin
  Reg := RD_WORD(rTakt.regs[5]);
  rTakt.regs[5] := rTakt.regs[5] + 2;
//  Cpu.SetCpu(rTakt);
end;

function LoadBt: byte;
var
  j,buf: byte;
begin
  FFile.Read(buf,1); //читаем байт
  LtFl:= LtFl+1;
  Result:= buf;
  j:=0;

  //обработка команды по чтению байта с поиском синхробайта
  if WrdRec(rTakt.regs[4]).Hi=$FF then
  begin
    //читаем заголовок, делаем анализ
    if (buf=$E6) and (LtFl = 1)  then
    begin
      while buf = $E6 do
      begin
        FFile.Read(buf,1);
        j:=j+1;
      end;
      FFile.Position:=0;
      FFile.Read(buf,1);
    end;
    if j > 0 then
      if j < 4 then
        while buf = $E6 do
        begin
          FFile.Read(buf,1);
          LtFl:= LtFl+1;
        end
      else exit;
      //конец обработки заголовка
    if LtFl > 5 then //поиск синробайта, либо после заголовка, либо в конце файла, пропуск нулей
    begin
      while buf <> $E6 do
      begin
        FFile.Read(buf,1);
        LtFl:= LtFl+1;
        if LtFl>$75FF then begin
          Result:= buf;
          rTakt.regs[6]:= ExitErrAdd;
          Cpu.SetCpu(rTakt);
          Form1.Timer1.Enabled:= true; exit;
        end;
      end;
      FFile.Read(buf,1);
      LtFl:= LtFl+1;
    end;
  end;
  Result:= buf;
end;

begin
  b:=ks;
  a:=ks;f:=ks;e:=ks;
  c:=ks;
  FreeOnTerminate := True;
  Kb := false;
repeat
  {перехват процедур монитора чтения и записи байта
   программы, использующие собственные процедуры записи и чтения байта -
   не перехватываются}
  case rTakt.regs[6] of
    $FB98: begin
             Form1.Timer1.Enabled:= false;
             Form1.Timer1.Enabled:= true;
             POP(rTakt.regs[6]); //ret
             Cpu.SetCpu(rTakt);
             if KOpfl and (WrdRec(rTakt.regs[4]).Hi=$FF) then begin
               Form1.FileLoad;                  //открываем файл для чтения
               if assigned(FFile) then WrdRec(rTakt.regs[4]).Hi:= LoadBt   //читаем первый байт
               else rTakt.regs[6]:= ExitErrAdd;
               Cpu.SetCpu(rTakt);
             end
             else if assigned(FFile) then        //чтение байта
             begin
               WrdRec(rTakt.regs[4]).Hi:=LoadBt;
               if (LtFl+1) > LnFlB then          //выход за пределы файла, конец чтения
               begin
                 LnFlB:= 0;
                 KOpfl:= true;
                 FFile.Free;
                 FFile:=nil;
               end;
             end
             else rTakt.regs[6]:= ExitErrAdd;
             Cpu.SetCpu(rTakt);
           end;

    $FC46: begin
             Form1.Timer1.Enabled:= false;
             Form1.Timer1.Enabled:= true;
             POP(rTakt.regs[6]);
             Cpu.SetCpu(rTakt);
             if KOpfl then Form1.FileSave;
             if assigned(FFile) then begin
               if KSvfl then FFile.Write((WrdRec(rTakt.regs[1]).Lo),1)
               else
               if WrdRec(rTakt.regs[1]).Lo = $E6 then KSvfl:= true;//запуск по первому синхробайту, синхробайт пропускается
             end
             else begin
               FFile.Free;
               FFile:= nil;
               KOpfl:= true;
               KSvfl:= false;
               rTakt.regs[6]:= ExitErrAdd;
             end;
             Cpu.SetCpu(rTakt);
           end;
  end;
  rTakt := cpu.Takt(rtkt,Cpu.dbg);
  Kb := rTakt.auto;
  if (rtkt mod 4000) = 0 then  //часть системы автомтической стабилизации скорости
  begin
    kss:=((ks+c+b+a+f+e) div 6);
    sleep(kss);
    Application.ProcessMessages;
    e:= f;
    f:= a;
    a:= b;
    b:= c;
    c:= ks;
    //Application.ProcessMessages;
  end;
  tok:= rtkt;
until (Kb = True) or Terminated or Application.Terminated;
end;

{ TMemThread }

procedure TMemThread.Execute;
var
  X,Y,i: Integer;
  ScrSrfHD: HDC;
  FontHD: HDC;
  myRect: TRect;
  ScrBitMap: TBitMap;
  Tyk: int64;
  Bm:byte;
begin
{экран}
  Tyk:= 0;
  ScrBitMap := TBitMap.create;
  with ScrBitMap do
  begin
    Height := Form1.Image1.Height;
    Width := Form1.Image1.Width;
    PixelFormat := pf1bit;
    myRect:= Canvas.ClipRect;
  end;
  FontBitMap.Canvas.Lock;
  FontHD:= FontBitMap.Canvas.Handle;
  ScrBitMap.Canvas.Lock;
  ScrSrfHD:= ScrBitMap.Canvas.Handle;
  FreeOnTerminate := True;
repeat
  //Закрашивание фона
  PatBlt (ScrSrfHD,0,0,ScrBitMap.Width,ScrBitMap.Height,BLACKNESS);
  //Заполнение буфера
if (MemCpu.FMemC[$C001] and $04) <> 0 then begin
  for i :=0 to 2178 do
  begin
    Y := (i div 78)-1;  //расчет знакоместа
    X := (i mod 78)-1;
    // границы экрана и  проверка на знакогенератор
    if (X>=-1) and (Y>=-1) and (X<66) and (Y<25) then begin
      Bm :=MemCpu.FMemC[$7773+ i] and $7f;
      if (Bm>0) and (Bm<>$20) then
        BitBlt(ScrSrfHD,X*(C_SynX+1) + 34,Y*(C_SynY+2) + 27,C_SynX,C_SynY,FontHD,0,Bm*C_SynY,SrcCopy);
    end;
    if ((X mod 76)=0) and ((Y mod 26)=0) then
      MemCpu.FMemC[$C001]:= (MemCpu.FMemC[$C001] or $20); // конец отображения кадра
    if (i mod 65*3) = 0 then sleep(0);
    Application.ProcessMessages;
  end;
 {курсор}
  for i:= 0 to 8 do    //размер курсора
    if FClCrs <> 0 then
      ScrBitMap.Canvas.Pixels[FCrsX*(C_SynX+1)+33+i,FCrsY * (C_SynY+2)+41]:= clWhite;   //вывод курсора
end;
  //Копирование буфера на форму
  If Form1.Visible then begin
    Form1.Image1.Canvas.Lock;
    Form1.Image1.Canvas.CopyRect(myRect,ScrBitMap.Canvas,myRect);
    Form1.Image1.Canvas.unLock;
  end else
  If Form2.Visible then begin
    Form2.Canvas.Lock;
    Form2.Canvas.CopyRect(Form2.Canvas.ClipRect,ScrBitMap.Canvas,myRect);
    Form2.Canvas.unLock;
  end;


  Tik:= Tik+1;
  Tyk:= Tyk+1;
  if (tyk mod 3) = 0 then begin
    if form1.Active then sleep(30) else sleep(20);
    Application.ProcessMessages;
  end;
    Application.ProcessMessages;
until Terminated or Application.Terminated;
  ScrBitMap.Canvas.unLock;
  FontBitMap.Canvas.unLock;
  ScrBitMap.Free;
end;

end.


---------------------------------------------------------------------------------------------------------


Последний раз редактировалось: Valeriy (26 Ноя 2011 16:37), всего редактировалось 3 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Valeriy
Site Admin
цитировать



Репутация: 0    

Зарегистрирован: 11.01.2009
Сообщения: 839
Откуда: Москва (Кострома)

СообщениеДобавлено: 07 Авг 2010 16:41    Заголовок сообщения: Ответить с цитатой

---------------------------------------------------------------------------------------------------------

U8080.pas

Код:

{ *********************************************************************** }
{                                                                         }
{ Virtual computer processor Unit U8080.pas                               }
{ V. 2.6.70                                                               }
{ Copyright (c) 2006  Mihaylov Valeriy                                    }
{                                                                         }
{ *********************************************************************** }

unit U8080;

interface

uses
  SysUtils, Classes, Dialogs, UGlbPK;

type
  TCpu = class(TComponent)
    function Takt(var t: int64; StepOver: boolean = false): TTakt;
    procedure RESET;
    procedure SetCpu(var t: TTakt);
  private
    BC,DE,HL,AF,SP,PC: word;
    FOnReset: TNotifyEvent;
    FOnRead: TNotifyEvent;
    FOnWrite: TNotifyEvent;
    FOnAddr: TNotifyEvent;
    FvAddr: Word;
    FvMemB: byte;
    FDebag: boolean;
    FSP,FPC:word;
    function R_Reg_PSW: byte;
    function R_Reg_C: byte;
    function R_Reg_E: byte;
    function R_Reg_L: byte;
    function R_Reg_A: byte;
    function R_Reg_B: byte;
    function R_Reg_D: byte;
    function R_Reg_H: byte;
    procedure W_Reg_PSW(Reg: byte);
    procedure W_Reg_C(Reg: byte);
    procedure W_Reg_E(Reg: byte);
    procedure W_Reg_L(Reg: byte);
    procedure W_Reg_A(Reg: byte);
    procedure W_Reg_B(Reg: byte);
    procedure W_Reg_D(Reg: byte);
    procedure W_Reg_H(Reg: byte);
    property PSW: byte read R_Reg_PSW write W_Reg_PSW;
    property C: byte read R_Reg_C write W_Reg_C;
    property E: byte read R_Reg_E write W_Reg_E;
    property L: byte read R_Reg_L write W_Reg_L;
    property A: byte read R_Reg_A write W_Reg_A;
    property B: byte read R_Reg_B write W_Reg_B;
    property D: byte read R_Reg_D write W_Reg_D;
    property H: byte read R_Reg_H write W_Reg_H;
  public
    constructor Create(AOnwer:TComponent); override;
    destructor Destroy; override;
  published
    property vAddr: TAddrM read FvAddr write FvAddr;
    property vMemB: byte read FvMemB write FvMemB;
    property OnAddr: TNotifyEvent read FOnAddr write FOnAddr;
    property OnReadB: TNotifyEvent read FOnRead write FOnRead;
    property OnWriteB: TNotifyEvent read FOnWrite write FOnWrite;
    property OnReset: TNotifyEvent read FOnReset write FOnReset;
    property Dbg: boolean read FDebag write FDebag default false;
    property ContPC:word read FPC write FPC;
    property ContSP:word read FSP write FSP;
  end;


{ PSW,A,B,C,D,E,H,L} {S,Z,0,AC,0,P,1,C}

procedure Register;

implementation

{ Tcpu }

Const
  Paritc: array [0..255] of byte =
     (4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4,
      0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0,
      0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0,
      4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4,
      0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0,
      4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4,
      4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4,
      0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0,
      0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0,
      4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4,
      4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4,
      0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0,
      4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4,
      0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0,
      0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0,
      4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4);


function Tcpu.R_Reg_PSW: byte;
begin
  Result := WrdRec(AF).Lo;
end;

function Tcpu.R_Reg_A: byte;
begin
  Result := WrdRec(AF).Hi;
end;

function Tcpu.R_Reg_B: byte;
begin
  Result := WrdRec(BC).Hi;
end;

function Tcpu.R_Reg_C: byte;
begin
  Result := WrdRec(BC).Lo;
end;

function Tcpu.R_Reg_D: byte;
begin
  Result := WrdRec(DE).Hi;
end;

function Tcpu.R_Reg_E: byte;
begin
  Result := WrdRec(DE).Lo;
end;

function Tcpu.R_Reg_H: byte;
begin
  Result := WrdRec(HL).Hi;
end;

function Tcpu.R_Reg_L: byte;
begin
  Result := WrdRec(HL).Lo;
end;

procedure Tcpu.W_Reg_PSW(Reg: byte);
begin
  WrdRec(AF).Lo := Reg;
end;

procedure Tcpu.W_Reg_A(Reg: byte);
begin
  WrdRec(AF).Hi := Reg;
end;

procedure Tcpu.W_Reg_B(Reg: byte);
begin
  WrdRec(BC).Hi := Reg;
end;

procedure Tcpu.W_Reg_C(Reg: byte);
begin
  WrdRec(BC).Lo := Reg;
end;

procedure Tcpu.W_Reg_D(Reg: byte);
begin
  WrdRec(DE).Hi := Reg;
end;

procedure Tcpu.W_Reg_E(Reg: byte);
begin
  WrdRec(DE).Lo := Reg;
end;

procedure Tcpu.W_Reg_H(Reg: byte);
begin
  WrdRec(HL).Hi := Reg;
end;

procedure Tcpu.W_Reg_L(Reg: byte);
begin
  WrdRec(HL).Lo := Reg;
end;

function Tcpu.Takt(var t: int64; StepOver: boolean):TTakt;
var
Reg,FL: byte;
WR: word;
Rslt: TTakt;

function RD_WORD(W:TAddrM): word; //чтение слова
begin
  FvAddr := W;
  OnAddr(self);
  OnReadB(self);
  WrdRec(Result).Lo := FvMemB;
  FvAddr := W +1;
  OnAddr(self);
  OnReadB(self);
  WrdRec(Result).Hi := FvMemB;
end;

procedure WR_WORD(W:TAddrM; Reg: word); //запись слова
begin
  FvAddr := W;
  OnAddr(self);
  FvMemB := WrdRec(Reg).Lo;
  OnWriteB(self);
  FvAddr := W +1;
  OnAddr(self);
  FvMemB := WrdRec(Reg).Hi;
  OnWriteB(self);
end;

function RD_BYTE(W:TAddrM): byte; //чтение байта
begin
  FvAddr := W;
  OnAddr(self);
  OnReadB(self);
  Result := FvMemB;
end;

procedure WR_BYTE(W:TAddrM; Reg: byte); //запись байта
begin
  FvAddr := W;
  OnAddr(self);
  FvMemB := Reg;
  OnWriteB(self);
end;

procedure SetFlg(Reg:byte);   //установка флагов
var
F: byte;
begin
  F := (PSW and $11) or (Reg and $80) or Paritc[Reg];
  if Reg = 0 then F := F or (not Reg and $40);
  PSW:= (F or 2) and $D7;
end;

procedure FlgInr(Reg:byte);
begin
  PSW:= (PSW and 1) or ((((Reg - 1) and $0F) + 1) and $10);
  SetFlg(Reg);
end;

procedure FlgDcr(Reg:byte);
begin
  PSW:= (PSW and 1) or ((((Reg + 1) and $0F) - 1) and $10);
  SetFlg(Reg);
end;

procedure DAD(W:word);
begin
  PSW:= ((PSW and $FE) or (((HL + W) and $10000) shr 16)or 2) and $D7;
  HL := HL + W;
end;

procedure ADD(Reg: byte);
var
R: byte;
begin
  R:= A;
  PSW:= ((R + Reg) and $100) shr 8  or (((R and $0F) + (Reg and $0F)) and $10);
  R:= R + Reg;
  A:= R;
  SetFlg(R);
end;

procedure ADC(Reg: byte);
var
F,R,R1: byte;
begin
  R:= A;
  F:= PSW;
  R1:= R + Reg + (F and $01);
  PSW:= ((R + Reg + (F and $01)) and $100) shr 8  or (((R and $0F) + (Reg and $0F) + (F and $01)) and $10);
  A:= R1;
  SetFlg(R1);
end;

procedure SUB(Reg: byte);
var
R: byte;
begin
  R:= A;
  PSW:= ((R-Reg) and $100) shr 8 or ((R and $0F) - (Reg and $0F)) and $10;
  R:= R - Reg;
  A:= R;
  SetFlg(R);
end;

procedure SBB(Reg: byte);
var
F,R,R1: byte;
begin
  R:= A;
  F:= PSW;
  R1:= R - Reg - (F and $01);
  PSW:= (R1 and $100) shr 8 or ((R and $0F) - (Reg and $0F) - (F and $01)) and $10;
  A:= R1;
  SetFlg(R1);
end;

procedure ANA(Reg: byte);
begin
  A := A and Reg;
  PSW := PSW and $10;
  SetFlg(A);
end;

procedure XRA(Reg: byte);
begin
  A := A xor Reg;
  PSW := 0;
  SetFlg(A);
end;

procedure ORA(Reg: byte);
begin
  A := A or Reg;
  PSW := 0;
  SetFlg(A);
end;

procedure CMP(Reg: byte);
var
R: byte;
begin
  R := A;
  PSW:= ((R-Reg) and $100) shr 8 or (((R and $0F) - (Reg and $0F)) and $10);
  SetFlg(R-reg);
end;

procedure POP(var Reg: word);
begin
  Reg := RD_WORD(SP);
  SP := SP + 2;
end;

procedure PUSH(Reg: word);
begin
  SP := SP - 2;
  WR_WORD(SP, Reg);
end;

procedure CALL;
begin
  PUSH(PC + 2);
  PC := RD_WORD(PC);
end;

procedure RST(Reg: word);
begin
  PUSH(PC);
  PC := Reg;
end;

begin
  t:= t+1;
  FvAddr := PC; // адрес очередной операции
  OnAddr(self);
  OnReadB(self);
  Rslt.cop:= FvMemB;  //чтение кода операции
  Rslt.auto := false;
  if dbg then begin
    if StepOver then
      if ((ContPC = PC) and (ContSP = SP)) then
        Rslt.auto:= true;
   end;
{debug обработка кода}
  {тело отладчика
     DbgPrmOut(R: TTakt); выполнение пошагово и авто, ловушки
     .......
     else}

  inc(PC);  //inr счетчика, если необходимо ветвление, то происходит в дальнейшем в теле case
  Rslt.dly:= 0;
  case(Rslt.cop)of
    $00:  Rslt.dly:= 4;      // nop

    $01: begin              // lxi bc, data16
           BC:= RD_WORD(PC);
           PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $02: begin              // stax b
           WR_BYTE(BC,A);
           Rslt.dly:= 7;
         end;

    $03: begin              // inx b
           BC:= BC + 1;
           Rslt.dly:= 5;
         end;

    $04: begin              // inr b
           B := B + 1;
           FlgInr(B);
           Rslt.dly:= 5;
         end;

    $05: begin              // dcr b
           B := B - 1;
           FlgDcr(B);
           Rslt.dly:= 5;
         end;

    $06: begin              // mvi b, data8
           B:= RD_BYTE(PC);
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $07: begin              // rlc
           Reg:= A;
           PSW := (PSW and $D6) or ((Reg and $80) shr 7) or 2;
           A:= (Reg shl 1) or ((Reg and $80) shr 7);
           Rslt.dly:= 4;
         end;

    $08: ;//invalid_opcode();

    $09: begin              // dad b
           DAD(BC);
           Rslt.dly:= 10;
         end;

    $0A: begin              // ldax b
           A:= RD_BYTE(BC);
           Rslt.dly:= 7;
         end;

    $0B: begin              // dcx b
           BC:=BC - 1;
           Rslt.dly:= 5;
         end;

    $0C: begin              // inr c
           C:= C + 1;
           FlgInr(C);
           Rslt.dly:= 5;
         end;

    $0D: begin              // dcr c
           C:= C - 1;
           FlgDcr(C);
           Rslt.dly:= 5;
         end;

    $0E: begin              // mvi c, data8
           C:= RD_BYTE(PC);
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $0F: begin              // rrc
           Reg:= A;
           PSW := (PSW and $D6) or (Reg and $01) or 2;
           A:= (Reg shr 1) or (Reg and $01) shl 7;
           Rslt.dly:= 4;
         end;

    $10: ;//invalid_opcode();

    $11: begin              // lxi de, data16
           DE := RD_WORD(PC);
           PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $12: begin              // stax d
           WR_BYTE(DE, A);
           Rslt.dly:= 7;
         end;

    $13: begin              // inx d
           DE:=DE + 1;
           Rslt.dly:= 5;
         end;

    $14: begin              // inr d
           D:= D + 1;
           FlgInr(D);
           Rslt.dly:= 5;
         end;

    $15: begin              // dcr d
           D:= D - 1;
           FlgDcr(D);
           Rslt.dly:= 5;
         end;

     $16: begin            // mvi d, data8
           D := RD_BYTE(PC);
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $17: begin              // ral
           Reg:= A;
           FL:= PSW and $01;
           PSW := (PSW and $D6) or (Reg and $80) shr 7 or 2;
           A := (Reg shl 1) or FL;
           Rslt.dly:= 4;
         end;

    $18: ;//invalid_opcode();

    $19: begin              // dad d
           DAD(DE);
           Rslt.dly:= 10;
         end;

    $1A: begin              // ldax d
           A := RD_BYTE(DE);
           Rslt.dly:= 7;
         end;

    $1B: begin              // dcx d
           DE:= DE - 1;
           Rslt.dly:= 5;
         end;

    $1C: begin              // inr e
           E:= E + 1;
           FlgInr(E);
           Rslt.dly:= 5;
         end;

    $1D: begin              // dcr e
           E:= E - 1;
           FlgDcr(E);
           Rslt.dly:= 5;
         end;

    $1E: begin              // mvi e, data8
           E := RD_BYTE(PC);
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $1F: begin              // rar
           Reg:= A;
           FL := PSW and $01;
           PSW := (PSW and $D6) or (Reg and $01) or 2;
           A := (Reg shr 1) or (FL shl 7);
           Rslt.dly:= 4;
         end;

    $20: ;//invalid_opcode();

    $21: begin              // lxi hl, data16
           HL := RD_WORD(PC);
           PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $22: begin              // shld addr
           WR_WORD(RD_WORD(PC), HL);
           PC:= PC + 2;
           Rslt.dly:= 16;
         end;

    $23: begin              // inx h
           HL:= HL + 1;
           Rslt.dly:= 5;
         end;

    $24: begin              // inr h
           H:= H + 1;
           FlgInr(H);
           Rslt.dly:= 5;
         end;

    $25: begin              // dcr h
           H:= H - 1;
           FlgDcr(H);
           Rslt.dly:= 5;
         end;

    $26: begin              // mvi h, data8
           H := RD_BYTE(PC);
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $27: begin              // daa
           if (A and $0F)> 9 then PSW := PSW or $10;
           if (PSW and $10)<0> $90 then PSW := PSW or $01;
           if (PSW and $01)<> 0 then A:= A + $60;
           SetFlg(A);
           Rslt.dly:= 4;
         end;

    $28: ;//invalid_opcode

    $29: begin              // dad hl
           DAD(HL);
           Rslt.dly:= 10;
         end;

    $2A: begin              // ldhl addr
           HL := RD_WORD(RD_WORD(PC));
           PC:= PC + 2;
           Rslt.dly:= 16;
         end;

    $2B: begin              // dcx h
           HL:= HL - 1;
           Rslt.dly:= 5;
         end;

    $2C: begin              // inr l
           L:= L + 1;
           FlgInr(L);
           Rslt.dly:= 5;
         end;

    $2D: begin              // dcr l
           L:= L - 1;
           FlgDcr(L);
           Rslt.dly:= 5;
         end;

    $2E: begin              // mvi l, data8
           L := RD_BYTE(PC);
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $2F: begin              // cma
           A := A xor $ff;
           Rslt.dly:= 4;
         end;

    $30: ;//invalid_opcode

    $31: begin              // lxi sp, data16
           SP:= RD_WORD(PC);
           PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $32: begin              // sta addr
           WR_BYTE(RD_WORD(PC),A);
           PC:= PC + 2;
           Rslt.dly:= 13;
         end;

    $33: begin              // inx sp
           SP:= SP + 1;
           Rslt.dly:= 5;
         end;

    $34: begin              // inr m
           Fl:= (RD_BYTE(HL)+ 1);
           WR_BYTE(HL,FL);
           FlgInr(FL);
           Rslt.dly:= 10;
         end;

    $35: begin              // dcr m
           FL:= (RD_BYTE(HL)-1);
           WR_BYTE(HL,FL);
           FlgDcr(FL);
           Rslt.dly:= 10;
         end;

    $36: begin              // mvi m, data8
           WR_BYTE(HL,RD_BYTE(PC));
           PC:= PC + 1;
           Rslt.dly:= 10;
         end;

    $37: begin              // stc
           PSW := PSW or $01;
           Rslt.dly:= 4;
         end;

    $38:   ;//invalid_opcode

    $39: begin              // dad sp
           DAD(SP);
           Rslt.dly:= 10;
         end;

    $3A: begin              // lda addr
           A := RD_BYTE(RD_WORD(PC));
           PC:= PC + 2;
           Rslt.dly:= 13;
         end;

    $3B: begin              // dcx sp
           SP:= SP - 1;
           Rslt.dly:= 5;
         end;

    $3C: begin              // inr a
           A:= A + 1;
           FlgInr(A);
           Rslt.dly:= 5;
         end;

    $3D: begin              // dcr a
           A:= A - 1;
           FlgDcr(A);
           Rslt.dly:= 5;
         end;

    $3E: begin              // mvi a, data8
           A := RD_BYTE(PC);
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $3F: begin              // cmc
           PSW := PSW xor $01;
           Rslt.dly:= 4;
         end;

    $40: Rslt.dly:= 4;      // mov b, b

    $41: begin              // mov b,c
           B := C;
           Rslt.dly:= 5;
         end;

    $42: begin              // mov b,d
           B := D;
           Rslt.dly:= 5;
         end;

    $43: begin              // mov b,e
           B := E;
           Rslt.dly:= 5;
         end;

    $44: begin              // mov b,h
           B := H;
           Rslt.dly:= 5;
         end;

    $45: begin              // mov b,l
           B := L;
           Rslt.dly:= 5;
         end;

    $46: begin              //mov b,m
           B := RD_BYTE(HL);
           Rslt.dly:= 7;
         end;

    $47: begin              // mov b,a
           B := A;
           Rslt.dly:= 5;
         end;

    $48: begin              //mov c
           C := B;
           Rslt.dly:= 5;
         end;

    $49: begin              //mov c,c
           Rslt.dly:= 5;
         end;

    $4A: begin              //mov c,d
           C := D;
           Rslt.dly:= 5;
         end;

    $4B: begin              //mov c,e
           C := E;
           Rslt.dly:= 5;
         end;

    $4C: begin              //mov c,h
           C := H;
           Rslt.dly:= 5;
         end;

    $4D: begin              //mov c,l
           C := L;
           Rslt.dly:= 5;
         end;

    $4E: begin              //mov c,m
           C := RD_BYTE(HL);
           Rslt.dly:= 7;
         end;

    $4F: begin              //mov c,a
           C := A;
           Rslt.dly:= 5;
         end;

    $50: begin              //mov d,
           D := B;
           Rslt.dly:= 5;
         end;

    $51: begin              //mov d,c
           D := C;
           Rslt.dly:= 5;
         end;

    $52: Rslt.dly:= 5;      //mov d,d


Последний раз редактировалось: Valeriy (26 Ноя 2011 16:39), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Valeriy
Site Admin
цитировать



Репутация: 0    

Зарегистрирован: 11.01.2009
Сообщения: 839
Откуда: Москва (Кострома)

СообщениеДобавлено: 07 Авг 2010 16:41    Заголовок сообщения: Ответить с цитатой

Код:

    $53: begin              //mov d,e
           D := E;
           Rslt.dly:= 5;
         end;

    $54: begin              //mov d,h
           D := H;
           Rslt.dly:= 5;
         end;

    $55: begin              //mov d,l
           D := L;
           Rslt.dly:= 5;
         end;

    $56: begin              //mov d,m
           D := RD_BYTE(HL);
           Rslt.dly:= 7;
         end;

    $57: begin              //mov d,a
           D := A;
           Rslt.dly:= 5;
         end;

    $58: begin              //mov e,b
           E := B;
           Rslt.dly:= 5;
         end;

    $59: begin              //mov e,c
           E := C;
           Rslt.dly:= 5;
         end;

    $5A: begin              //mov e,d
           E := D;
           Rslt.dly:= 5;
         end;

    $5B: Rslt.dly:= 5;      //mov e,e

    $5C: begin              //mov e,h
           E := H;
           Rslt.dly:= 5;
         end;

    $5D: begin              //mov e,l
           E := L;
           Rslt.dly:= 5;
         end;

    $5E: begin              //mov e,m
           E := RD_BYTE(HL);
           Rslt.dly:= 7;
         end;

    $5F: begin              //mov e,a
           E := A;
           Rslt.dly:= 5;
         end;

    $60: begin              //mov h,b
           H := B;
           Rslt.dly:= 5;
         end;

    $61: begin              //mov h,c
           H := C;
           Rslt.dly:= 5;
         end;

    $62: begin              //mov h,d
           H := D;
           Rslt.dly:= 5;
         end;

    $63: begin              //mov h,e
           H := E;
           Rslt.dly:= 5;
         end;

    $64: Rslt.dly:= 5;      //mov h,h

    $65: begin              //mov h,l
           H := L;
           Rslt.dly:= 5;
         end;

    $66: begin              //mov h,m
           H := RD_BYTE(HL);
           Rslt.dly:= 7;
         end;

    $67: begin              //mov h,a
           H := A;
           Rslt.dly:= 5;
         end;

    $68: begin              //mov l,b
           L := B;
           Rslt.dly:= 5;
         end;

    $69: begin              //mov l,c
           Rslt.dly:= 5;
           L := C;
         end;

    $6A: begin              //mov l,d
           L := D;
           Rslt.dly:= 5;
         end;

    $6B: begin              //mov l,e
           L := E;
           Rslt.dly:= 5;
         end;

    $6C: begin              //mov l,h
           L := H;
           Rslt.dly:= 5;
         end;

    $6D: Rslt.dly:= 5;      //mov l,l

    $6E: begin              //mov l,m
           L := RD_BYTE(HL);
           Rslt.dly:= 7;
         end;

    $6F: begin              //mov l,a
           L := A;
           Rslt.dly:= 5;
         end;

    $70: begin              //mov m,b
           WR_BYTE(HL, B);
           Rslt.dly:= 7;
         end;

    $71: begin              //mov m,c
           WR_BYTE(HL, C);
           Rslt.dly:= 7;
         end;

    $72: begin              //mov m,d
           WR_BYTE(HL, D);
           Rslt.dly:= 7;
         end;

    $73: begin              //mov m,e
           WR_BYTE(HL, E);
           Rslt.dly:= 7;
         end;

    $74: begin              //mov m,h
           WR_BYTE(HL, H);
           Rslt.dly:= 7;
         end;

    $75: begin              //mov m,l
           WR_BYTE(HL, L);
           Rslt.dly:= 7;
         end;

    $76: begin              //hlt
           Rslt.auto:= false;
           Rslt.dly:= 4;
         end;

    $77: begin              //mov m,a
           WR_BYTE(HL, A);
           Rslt.dly:= 7;
         end;

    $78: begin              //mov a,a
           A := B;
           Rslt.dly:= 5;
         end;

    $79: begin              //mov a,c
           A := C;
           Rslt.dly:= 5;
         end;

    $7A: begin              //mov a,d
           A := D;
           Rslt.dly:= 5;
         end;

    $7B: begin              //mov a,e
           A := E;
           Rslt.dly:= 5;
         end;

    $7C: begin              //mov a,h
           A := H;
           Rslt.dly:= 5;
         end;

    $7D: begin              //mov a,l
           A := L;
           Rslt.dly:= 5;
         end;

    $7E: begin              //mov a,m
           A := RD_BYTE(HL);
           Rslt.dly:= 7;
         end;

    $7F: Rslt.dly:= 5;      //mov a,a

    $80: begin              // add b
           ADD(B);
           Rslt.dly:= 4;
         end;

    $81: begin              // add c
           ADD(C);
           Rslt.dly:= 4;
         end;

    $82: begin              // add d
           ADD(D);
           Rslt.dly:= 4;
         end;

    $83: begin              // add e
           ADD(E);
           Rslt.dly:= 4;
         end;

    $84: begin              // add h
           ADD(H);
           Rslt.dly:= 4;
         end;

    $85: begin              // add l
           ADD(L);
           Rslt.dly:= 4;
         end;

    $86: begin              // add m
           ADD(RD_BYTE(HL));
           Rslt.dly:= 7;
         end;

    $87: begin              // add a
           ADD(A);
           Rslt.dly:= 4;
         end;

    $88: begin              //adc b
           ADC(B);
           Rslt.dly:= 4;
         end;

    $89: begin              //adc c
           ADC(C);
           Rslt.dly:= 4;
         end;

    $8A: begin              //adc d
           ADC(D);
           Rslt.dly:= 4;
         end;

    $8B: begin              //adc e
           ADC(E);
           Rslt.dly:= 4;
         end;

    $8C: begin              //adc h
           ADC(H);
           Rslt.dly:= 4;
         end;

    $8D: begin              //adc l
           ADC(L);
           Rslt.dly:= 4;
         end;

    $8E: begin              //adc m
           ADC(RD_BYTE(HL));
           Rslt.dly:= 7;
         end;

    $8F: begin              //adc a
           ADC(A);
           Rslt.dly:= 4;
         end;

    $90: begin              //sub b
           SUB(B);
           Rslt.dly:= 4;
         end;

    $91: begin              //sub c
           SUB(C);
           Rslt.dly:= 4;
         end;

    $92: begin              //sub d
           SUB(D);
           Rslt.dly:= 4;
         end;

    $93: begin              //sub e
           SUB(E);
           Rslt.dly:= 4;
         end;

    $94: begin              //sub h
           SUB(H);
           Rslt.dly:= 4;
         end;

    $95: begin              //sub l
           SUB(L);
           Rslt.dly:= 4;
         end;

    $96: begin              //sub m
           SUB(RD_BYTE(HL));
           Rslt.dly:= 7;
         end;

    $97: begin              //sub a
           SUB(A);
           Rslt.dly:= 7;
         end;

    $98: begin              //ssb b
           SBB(B);
           Rslt.dly:= 4;
         end;

    $99: begin              //ssb c
           SBB(C);
           Rslt.dly:= 4;
         end;

    $9A: begin              //ssb d
           SBB(D);
           Rslt.dly:= 4;
         end;

    $9B: begin              //ssb e
           SBB(E);
           Rslt.dly:= 4;
         end;

    $9C: begin              //ssb h
           SBB(H);
           Rslt.dly:= 4;
         end;

    $9D: begin               //ssb l
           SBB(L);
           Rslt.dly:= 4;
         end;

    $9E: begin              //sbb m
           SBB(RD_BYTE(HL));
           Rslt.dly:= 7;
         end;

    $9F: begin              //ssb a
           SBB(A);
           Rslt.dly:= 4;
         end;

    $A0: begin              //ana b
           ANA(B);
           Rslt.dly:= 4;
         end;

    $A1: begin              //ana c
           ANA(C);
           Rslt.dly:= 4;
         end;

    $A2: begin              //ana d
           ANA(D);
           Rslt.dly:= 4;
         end;

    $A3: begin              //ana e
           ANA(E);
           Rslt.dly:= 4;
         end;

    $A4: begin              //ana h
           ANA(H);
           Rslt.dly:= 4;
         end;

    $A5: begin              //ana l
           ANA(L);
           Rslt.dly:= 4;
         end;

    $A6: begin              //ana m
           ANA(RD_BYTE(HL));
           Rslt.dly:= 7;
         end;

    $A7: begin              //ana a
           ANA(A);
           Rslt.dly:= 4;
         end;

    $A8: begin              //xra b
           XRA(B);
           Rslt.dly:= 4;
         end;

    $A9: begin              //xra c
           XRA(C);
           Rslt.dly:= 4;
         end;

    $AA: begin              //xra d
           XRA(D);
           Rslt.dly:= 4;
         end;

    $AB: begin              //xra e
           XRA(E);
           Rslt.dly:= 4;
         end;

    $AC: begin              //xra h
           XRA(H);
           Rslt.dly:= 4;
         end;

    $AD: begin              //xra l
           XRA(L);
           Rslt.dly:= 4;
         end;

    $AE: begin              //xra m
           XRA(RD_BYTE(HL));
           Rslt.dly:= 7;
         end;

    $AF: begin              //xra a
           XRA(A);
           Rslt.dly:= 4;
         end;

    $B0: begin              //ora b
           ORA(B);
           Rslt.dly:= 4;
         end;

    $B1: begin              //ora c
           ORA(C);
           Rslt.dly:= 4;
         end;

    $B2: begin              //ora d
           ORA(D);
           Rslt.dly:= 4;
         end;

    $B3: begin              //ora e
           ORA(E);
           Rslt.dly:= 4;
         end;

    $B4: begin              //ora h
           ORA(H);
           Rslt.dly:= 4;
         end;

    $B5: begin              //ora l
           ORA(L);
           Rslt.dly:= 4;
         end;

    $B6: begin              //ora m
           ORA(RD_BYTE(HL));
           Rslt.dly:= 7;
         end;

    $B7: begin              //ora a
           ORA(A);
           Rslt.dly:= 4;
         end;

    $B8: begin              //cmp b
           CMP(B);
           Rslt.dly:= 4;
         end;

    $B9: begin              //cmp c
           CMP(C);
           Rslt.dly:= 4;
         end;

    $BA: begin              //cmp d
           CMP(D);
           Rslt.dly:= 4;
         end;

    $BB: begin              //cmp e
           CMP(E);
           Rslt.dly:= 4;
         end;

    $BC: begin              //cmp h
           CMP(H);
           Rslt.dly:= 4;
         end;

    $BD: begin              //cmp l
           CMP(L);
           Rslt.dly:= 4;
         end;

    $BE: begin              //cmp m
           CMP(RD_BYTE(HL));
           Rslt.dly:= 7;
         end;

    $BF: begin              //cmp a
           CMP(A);
           Rslt.dly:= 4;
         end;

    $C0: begin              // rnz
           Rslt.dly:= 5;
           if (PSW and $40) = 0 then begin
             POP(PC); Rslt.dly:= 11; end;
         end;

    $C1: begin              // pop b
           POP(BC);
           Rslt.dly:= 11;
         end;

    $C2: begin              // jnz addr
           if (PSW and $40) = 0 then PC := RD_WORD(PC)
           else  PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $C3: begin              // jmp addr
           PC:= RD_WORD(PC);
           Rslt.dly:= 10;
         end;

    $C4: begin              // cnz addr
           if (PSW and $40) = 0 then begin
             CALL; Rslt.dly:= 17; end
           else begin
             PC:= PC + 2; Rslt.dly:= 11; end;
         end;

    $C5: begin              // push b
           PUSH(BC);
           Rslt.dly:= 11;
         end;

    $C6: begin              // adi data8
           ADD(RD_BYTE(PC));
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $C7: begin              // rst 0
           RST($0000);
           Rslt.dly:= 11;
         end;

    $C8: begin              // rz
           Rslt.dly:= 5;
           if (PSW and $40) <> 0 then begin
             POP(PC); Rslt.dly:= 11; end;
         end;

    $C9: begin              // ret
           POP(PC);
           Rslt.dly:= 10;
         end;

    $CA: begin              // jz addr
           if (PSW and $40) <> 0 then PC := RD_WORD(PC)
           else PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $CB:  ;//invalid_opcode

    $CC: begin              // cz addr
           if (PSW and $40) <> 0 then begin
             CALL; Rslt.dly:= 17; end
           else begin
             PC:= PC + 2; Rslt.dly:= 11; end;
         end;

    $CD: begin              // call addr
           CALL;
           Rslt.dly:= 17;
         end;

    $CE: begin              // aci data8
           ADC(RD_BYTE(PC));
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $CF: begin              // rst 1
           RST($0008);
           Rslt.dly:= 11;
         end;

    $D0: begin              // rnc
           Rslt.dly:= 5;
           if (PSW and $01) = 0 then begin
             POP(PC); Rslt.dly:= 11; end;
         end;

    $D1: begin              // pop d
           POP(DE);
           Rslt.dly:= 11;
         end;

    $D2: begin              // jnc addr
           if (PSW and $01) = 0 then PC := RD_WORD(PC)
           else PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $D3: begin              // out port8
           //out_byte(RD_BYTE(PC));
           PC:= PC + 1;
           Rslt.dly:= 10;
         end;

    $D4: begin              // cnc addr
           if (PSW and $01) = 0 then begin
             CALL; Rslt.dly:= 17; end
           else begin
             PC:= PC + 2; Rslt.dly:= 11; end;
         end;

    $D5: begin              // push d
           PUSH(DE);
           Rslt.dly:= 11;
         end;

    $D6: begin              // sui data8
           SUB(RD_BYTE(PC));
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $D7: begin              // rst 2
           RST($0010);
           Rslt.dly:= 11;
         end;

    $D8: begin              // rc
           Rslt.dly:= 5;
           if (PSW and $01) <> 0 then begin
             POP(PC); Rslt.dly:= 11; end;
         end;

    $D9:  ;//invalid_opcode

    $DA: begin              // jc addr
           if (PSW and $01) <> 0 then PC := RD_WORD(PC)
           else PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $DB: begin              // in port8
           Rslt.dly:= 10;
         end;

    $DC: begin              // cc addr
           if (PSW and $01) <> 0 then begin
             CALL; Rslt.dly:= 17; end
           else begin
             PC:= PC + 2; Rslt.dly:= 11; end;
         end;

    $DD:  ;//invalid_opcode

    $DE: begin              // sbi data8
           SBB(RD_BYTE(PC));
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $DF: begin              // rst 3
           RST($0018);
           Rslt.dly:= 11;
         end;

    $E0: begin              // rpo
           Rslt.dly:= 5;
           if (PSW and $04) = 0 then begin
           POP(PC); Rslt.dly:= 11; end;
         end;

    $E1: begin              // pop h
           POP(HL);
           Rslt.dly:= 11;
         end;

    $E2: begin              // jpo addr
           if (PSW and $04) = 0 then PC := RD_WORD(PC)
           else PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $E3: begin              // xthl
           WR := RD_WORD(SP);
           WR_WORD(SP, HL);
           HL := WR;
           Rslt.dly:= 18;
         end;

    $E4: begin              // cpo addr
           if (PSW and $04) = 0 then begin
             CALL; Rslt.dly:= 17; end
           else begin
             PC:= PC + 2; Rslt.dly:= 11; end;
         end;

    $E5: begin              // push h
           PUSH(HL);
           Rslt.dly:= 11;
         end;

    $E6: begin              // ani data8
           ANA(RD_BYTE(PC));
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $E7: begin              // rst 4
           RST($0020);
           Rslt.dly:= 11;
         end;

    $E8: begin              // rpe
           Rslt.dly:= 5;
           if (PSW and $04) <> 0 then begin
             POP(PC); Rslt.dly:= 11; end;
         end;

    $E9: begin              // pchl
           PC := HL;
           Rslt.dly:= 5;   
         end;

    $EA: begin              // jpe addr
           if (PSW and $04) <> 0 then PC := RD_WORD(PC)
           else PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $EB: begin              // xchg
           WR := DE; DE := HL; HL := WR;
           Rslt.dly:= 4;
         end;

    $EC: begin              // cpe addr
           if (PSW and $04) <> 0 then begin
             CALL; Rslt.dly:= 17; end
           else begin
             PC:= PC + 2; Rslt.dly:= 11; end;
         end;

    $ED:  ;//invalid_opcode()

    $EE: begin              // xri data8
           XRA(RD_BYTE(PC));
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $EF: begin              // rst 5
           RST($0028);
           Rslt.dly:= 11;
         end;

    $F0: begin              // rp
           Rslt.dly:= 5;
           if (PSW and $80) = 0 then begin
             POP(PC); Rslt.dly:= 11; end;
         end;

    $F1: begin              // pop psw
           POP(AF);
           AF:= AF and $FFDF or 2;
           Rslt.dly:= 10;
         end;

    $F2: begin              // jp addr
           Rslt.dly:= 10;
           if (PSW and $80) = 0 then PC := RD_WORD(PC)
           else PC:= PC + 2;
         end;

    $F3: begin              // di
           //sound_off();
           Rslt.dly:= 4;
          end;

    $F4: begin              // cp addr
           if (PSW and $80) = 0 then begin
             CALL; Rslt.dly:= 17; end
           else begin
             PC:= PC + 2; Rslt.dly:= 11; end;
         end;

    $F5: begin              // push psw
           PUSH(AF);
           Rslt.dly:= 11;
         end;

    $F6: begin              // ori data8
           ORA(RD_BYTE(PC));
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $F7: begin              // rst 6
           RST($0030);
           Rslt.dly:= 11;
         end;

    $F8: begin              // rm
           Rslt.dly:= 5;
           if (PSW and $80) <> 0 then begin
             POP(PC); Rslt.dly:= 11; end;
         end;

    $F9: begin              // sphl
           SP := HL;
           Rslt.dly:= 5;
         end;

    $FA: begin              // jm addr
           if (PSW and $80) <> 0 then PC := RD_WORD(PC)
           else PC:= PC + 2;
           Rslt.dly:= 10;
         end;

    $FB: begin              // ei
           //sound_on();
           Rslt.dly:= 4;
         end;

    $FC: begin              // cm addr
           if (PSW and $80) <> 0 then begin
             CALL; Rslt.dly:= 17; end
           else begin
             PC:= PC + 2; Rslt.dly:= 11; end;
         end;

    $FD:  ;//invalid_opcode

    $FE: begin              // cpi data8
           CMP(RD_BYTE(PC));
           PC:= PC + 1;
           Rslt.dly:= 7;
         end;

    $FF: begin              // rst 7
           RST($0038);
           Rslt.dly:= 11;
         end;
    end;

  with Result do begin
    regs[1]:= BC; regs[2]:= DE; regs[3]:= HL;
    regs[4]:= AF; regs[5]:= SP; regs[6]:= PC;
    FvAddr := PC; // адрес очередной операции
    OnAddr(self);
    OnReadB(self);
    cop:= FvMemB;  //чтение кода операции
  end;
  //Result := Rslt;
end;

procedure Tcpu.RESET;
begin
  AF := 2; BC:=0; DE:= 0; HL:= 0; SP:= 0; PC:= 0;
  PC := $F800;
  OnReset(self)
end;

procedure TCpu.SetCpu(var t: TTakt);
begin
  //if not Dbg then exit
  //else
  with t do begin
    BC:= regs[1]; DE:= regs[2]; HL:= regs[3];
    AF:= regs[4]; SP:= regs[5]; PC:= regs[6];
    FvAddr := PC; // адрес очередной операции
    OnAddr(self);
    OnReadB(self);
    cop:= FvMemB;  //чтение кода операции
  end;
end;

constructor Tcpu.Create(AOnwer:TComponent);
begin
  inherited Create(AOnwer);
  AF := 2; BC:=0; DE:= 0; HL:= 0; SP:= 0; PC:= 0;
end;

destructor TCpu.Destroy;
begin
  inherited;
end;

procedure Register;
begin
  RegisterComponents('Samples', [TCPU]);
end;

end.


Последний раз редактировалось: Valeriy (26 Ноя 2011 16:41), всего редактировалось 7 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Valeriy
Site Admin
цитировать



Репутация: 0    

Зарегистрирован: 11.01.2009
Сообщения: 839
Откуда: Москва (Кострома)

СообщениеДобавлено: 07 Авг 2010 16:43    Заголовок сообщения: Ответить с цитатой

---------------------------------------------------------------------------------------------------------
UGlbPK.pas

Код:

{ *********************************************************************** }
{                                                                         }
{ Unit UGlbPK.pas                                                         }
{ V. 1.1.11                                                               }
{ Copyright (c) 2006  Mihaylov Valeriy                                    }
{                                                                         }
{ *********************************************************************** }

unit UGlbPK;

interface

uses
  SysUtils;

type
  TTakt= packed record
    regs: array [1..6] of word;
    cop: byte;
    dly: byte;
    auto: boolean;
  end;

  WrdRec = packed record
    Lo, Hi: Byte;
  end;

  PBtArray = PByteArray;
  TAddrM = Word;

  TCpuMemReadBEvent = procedure(Sender: TObject; Addr: TAddrM; var B: byte)of object;
  TCpuMemWriteBEvent = procedure(Sender: TObject; Addr: TAddrM; B: byte)of object;
  TMemPortKeyReadEvent = procedure(Sender: TObject; var PortA, PortB, PortC: byte)of object;
  TMemPortKeyWriteEvent = procedure(Sender: TObject; Addr: TAddrM; B: byte)of object;

var
  rTakt: TTakt;
  rtkt: int64;
  FCrsX: byte;//регистры коордионат
  FCrsY: byte;// курсора  'знакоместо'

implementation
end.



---------------------------------------------------------------------------------------------------------
UKeyb.pas

Код:

{ *********************************************************************** }
{                                                                         }
{ Virtual keyboard Unit UKeyb.pas                                         }
{ V. 1.2.31                                                               }
{ Copyright (c) 2006  Mihaylov Valeriy                                    }
{                                                                         }
{ *********************************************************************** }

unit UKeyb;

interface

uses
  Classes, UGlbPK;

type
  TLang = set of (sRus, sLat);
  TVKeybSet = array[0..255] of Word;

  TKeybCPU = class
    procedure KeyDownCPU(var Key: Word; Shift: TShiftState);
    procedure KeyUPCPU(Sender: TObject);
  private
    FPKeyA: Byte;   //порты A,B,C
    FPKeyB: Byte;
    FPKeyC: Byte;
    KeyScan: Word;
    FPLand: boolean;
    VKeybSet: TVKeybSet;
    KLng: TLang;
    function GetPKeyC: byte;
    procedure SetPKeyC(Key: byte);
  public
    constructor Create; virtual;
  published
    property vPortLang: boolean read FPLand default true;
    property vPortKeyA: byte read FPKeyA;                //чтение из порта $8000
    property vPortKeyB: byte read FPKeyB;                //чтение из порта $8001
    property vPortKeyC: byte read GetPKeyC write SetPKeyC default $F8;
  end;


implementation

{ TKeybCPU }

const

  KeybSetU : TVKeybSet =  (

//   00     01     02     03     04     05     06     07     08     09     0A     0B     0C     0D     0E     0F
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $F7FD, $FEFD, $FFFF, $FFFF, $FFFF, $FBFD, $FFFF, $FFFF, //00
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FBFE, $FFFF, $FFFF, $FFFF, $FFFF, //01
   $7F7F, $FDFE, $FFFF, $FFFF, $FEFE, $EFFD, $DFFD, $BFFD, $7FFD, $FFFF, $FFFF, $FFFF, $FFFF, $FDFD, $EFFE, $FFFF, //02
   $FEFB, $FDFB, $FBFB, $F7FB, $EFFB, $DFFB, $BFFB, $7FFB, $FEF7, $FDF7, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, //03
   $FFFF, $FDEF, $FBEF, $F7EF, $EFEF, $DFEF, $BFEF, $7FEF, $FEDF, $FDDF, $FBDF, $F7DF, $EFDF, $DFDF, $BFDF, $7FDF, //04
   $FEBF, $FDBF, $FBBF, $F7BF, $EFBF, $DFBF, $BFBF, $7FBF, $FE7F, $FD7F, $FB7F, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, //05
   $FEFB, $FDFB, $FBFB, $F7FB, $EFFB, $DFFB, $BFFB, $7FFB, $FEF7, $FDF7, $FBF7, $F7F7, $FFFF, $DFF7, $BFF7, $7FF7, //06
   $F7FE, $EFFE, $DFFE, $BFFE, $7FFE, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, //07
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, //08
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, //09
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, //0A
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $F7F7, $DFF7, $EFF7, $DFF7, $BFF7, $7FF7, //0B
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, //0C
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $F77F, $EF7F, $DF7F, $7FFB, $FFFF, //0D
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, //0E
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF);//0F
//   00     01     02     03     04     05     06     07     08     09     0A     0B     0C     0D     0E     0F

  KeybSetR : TVKeybSet =
 ( $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $F7FD, $FEFD, $FFFF, $FFFF, $FFFF, $FBFD, $FFFF, $FFFF,
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FBFE, $FFFF, $FFFF, $FFFF, $FFFF,
   $7F7F, $FDFE, $FFFF, $FFFF, $FEFE, $EFFD, $DFFD, $BFFD, $7FFD, $FFFF, $FFFF, $FFFF, $FFFF, $FDFD, $EFFE, $FFFF,
   $FEFB, $FDFB, $FBFB, $F7FB, $EFFB, $DFFB, $BFFB, $7FFB, $FEF7, $FDF7, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF,
   $FFFF, $BFEF, $FDDF, $F7BF, $7FBF, $DFBF, $FDEF, $FEBF, $FBBF, $F77F, $7FDF, $EFDF, $EFEF, $FE7F, $EFBF, $DF7F,
   $FB7F, $FBDF, $F7DF, $FD7F, $DFEF, $7FEF, $DFDF, $F7EF, $BF7F, $BFDF, $FDBF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF,
   $FEFB, $FDFB, $FBFB, $F7FB, $EFFB, $DFFB, $BFFB, $7FFB, $FEF7, $FDF7, $FBF7, $F7F7, $FFFF, $DFF7, $BFF7, $7FF7,
   $F7FE, $EFFE, $DFFE, $BFFE, $7FFE, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF,
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF,
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF,
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF,
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $BFBF, $DFF7, $FBEF, $DFF7, $FEEF, $BFF7,
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF,
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FEDF, $7FF7, $FBFB, $EF7F, $FFFF,
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF,
   $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF, $FFFF);
//   00     01     02     03     04     05     06     07     08     09     0A     0B     0C     0D     0E     0F

constructor TKeybCPU.Create;
begin
  inherited Create;
  KLng := [sLat];   //лат
  FPLand:= true;
  VKeybSet := KeybSetU;
  FPKeyA:=$FF;
  FPKeyB:=$FF;
  FPKeyC:=$F0;
end;

procedure TKeybCPU.KeyDownCPU(var Key: Word; Shift: TShiftState);
var
  KLng1: TLang;
begin
  if (ssShift in Shift) and (ssCtrl in Shift) then      //ctrl+shift - перекл. РУС - ЛАТ
    begin FPKeyC := $70; exit; end;
  if FPLand then KLng1 := [sLat]
   else KLng1 := [sRus];
  if (KLng1 <> KLng) then                  //если смены небыло, то перегружать расладку не надо
  begin
    KLng := KLng1;
    if sLat in KLng then
       VKeybSet:= KeybSetU        //латинская раскладка
    else
       VKeybSet := KeybSetR; end; //русская раскладка

  if Key = $10 then begin FPKeyC := FPKeyC or $E0;exit; end; //выход, если нажат только шифт
  if (ssCtrl in Shift) then FPKeyC := FPKeyC and $bf;  // УС
  KeyScan := VKeybSet[WrdRec(Key).lo];
  if ssShift in Shift then begin
    case Key of
        $30: begin KeyScan := $FDF7; FPKeyC := FPKeyC and $df; end;
        $31,$33,$35: FPKeyC := FPKeyC and $df;
        $38: begin KeyScan := $FBF7; FPKeyC := FPKeyC and $df; end;
        $39: begin KeyScan := $FEF7; FPKeyC := FPKeyC and $df; end;
        $BB: begin KeyScan := $F7F7; FPKeyC := FPKeyC and $df; end;
    end;
    if sLat in  KLng then
      case Key of
        $32: KeyScan := $FEeF;   //снять шифт
        $34: begin KeyScan := $EFFB; FPKeyC := FPKeyC and $df; end;
        $36: KeyScan := $BF7F;   //снять шифт
        $37: begin KeyScan := $BFFB; FPKeyC := FPKeyC and $df; end;
        $BA: KeyScan := $FBF7;   //снять шифт
        $BC: begin KeyScan := $EFF7; FPKeyC := FPKeyC and $df; end;
        $BE: FPKeyC := FPKeyC and $df;
        $BF: FPKeyC := FPKeyC and $df;
        $DE: begin KeyScan := $FBFB; FPKeyC := FPKeyC and $df; end;
      end
    else
      case Key of
        $32: begin KeyScan := $FBFB; FPKeyC := FPKeyC and $df; end;
        $34: KeyScan := $F7F7;   //снять шифт
        $36: KeyScan := $FBF7;   //снять шифт
        $37: begin KeyScan := $7FF7; FPKeyC := FPKeyC and $df; end;
        $BF: KeyScan := $EFF7;   //снять шифт
        $DD: FPKeyC := FPKeyC and $df;
      end;
  end else begin
    case Key of
      $6A,$6B,$BB: FPKeyC := FPKeyC and $df;
    end;
    if ((Key = $DE) and (sLat in KLng)) or ((Key = $DD) and (sRus in KLng)) then FPKeyC := FPKeyC and $df;
  end;

  FPKeyA := WrdRec(KeyScan).lo;
  FPKeyB := WrdRec(KeyScan).hi;
end;

function TKeybCPU.GetPKeyC: byte;
begin
  GetPKeyC := FPKeyC and $F0;
end;

procedure TKeybCPU.KeyUPCPU(Sender: TObject);
begin
  FPKeyA := $FF;          //сброс имитации нажатия клавиши
  FPKeyB := $FF;
  FPKeyC := FPKeyC or $F0;
end;

procedure TKeybCPU.SetPKeyC(Key: byte);
begin
  FPKeyC:= (FPKeyC and $F0) or (Key and $0F);
  if (Key and $8)= 0 then FPLand:= true else FPLand:= false;
end;

end.



---------------------------------------------------------------------------------------------------------

UMem.pas


Код:

{ *********************************************************************** }
{                                                                         }
{ Virtual image & memory  Unit UMem.pas                                   }
{ V. 3.1.129                                                              }
{ Copyright (c) 2006  Mihaylov Valeriy                                    }
{                                                                         }
{ *********************************************************************** }

unit UMem;

interface

uses
  SysUtils, Classes, Controls, UGlbPK;

type
  TMemCPU = class(TComponent)
  private
    FOnCreate: TNotifyEvent;
    FOnPortR: TNotifyEvent;
    FOnPortW: TNotifyEvent;
    FvPortA: byte;
    FvPortB: byte;
    FvPortC: byte;
    FNambPar: Byte;//номер входящего параметра ЭЛТ
    FNambParCtr: Byte;// предельное количество параметров для текущей команды ЭЛТ
    FWmM: byte;//хранит код управляющей команды ЭЛТ при обработке параметров
    FWmM_M: byte;
    FAddrM: TAddrM;
    function  ContrlMem(var AddrM:TAddrM; KeyM: Char='R'; WM:byte=0):Boolean;
    procedure MemCPUActivate(Sender: TObject);
    procedure SetMemWrite(AValie:byte);
    function  GetMemRead: byte;
    procedure SetAddrM(const AValie:TAddrM);
    procedure SetCrtA(Wm:byte;KeyM: Char);
    procedure SetCrtB(Wm:byte;KeyM: Char);
    procedure LoadMon;
    property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  public
    FMemC: array [0..$FFFF] of Byte;
    constructor Create(AOnwer:TComponent); override;
  published
    property vAddr: TAddrM write SetAddrM default $0000;
    property vMemB: byte read GetMemRead write SetMemWrite;
    property vPortA: byte read FvPortA write FvPortA;
    property vPortB: byte read FvPortB write FvPortB;
    property vPortC: byte read FvPortC write FvPortC;
    property OnPortR: TNotifyEvent read FOnPortR write FOnPortR;
    property OnPortW: TNotifyEvent read FOnPortW write FOnPortW;
  end;

procedure Register;

implementation

{ TMemCPU }

//******************************************************************************
//******************************************************************************
function TMemCPU.ContrlMem(var AddrM:TAddrM; KeyM:Char='R'; WM: byte=0):Boolean;

 // контроль зоны озу, обработка портов

{Осуществляет контроль за записью и чтением в адресном пространстве.
Если обращение производится по рабочим адресам ОЗУ, функция выдает разрешение
устанавливая Result в True, в противном случае в False. Если требуется особая
обработка адресов, как в случае работы с портами, чтение и запись производиться
в теле функции в поле FWmM_M, а Result устанавливается в False.
AddrM - адрес ячейки в зоне памяти, WM- в режиме чтения=0, в режиме записи
значение записываемое в память.
KeyM = W - установлен режим записи, R - установлен режим чтения памяти.
По умолчанию - KeyM = R, WM = 0}

var
Db: byte;

begin
{КАРТА распределения адресного пространства памяти}
{*************************************************}

  case AddrM of
{зона ОЗУ}//********************************************************************

    0..$7fff  :  Result:= True;
 //*****************************************************************************

 {зона клавиатуры, и магнитафона КР580ВВ55}//************************************
    $8000..$9fff  : begin AddrM:= AddrM and $8003;
                    Result:= false;
    case AddrM of
       $8000  : begin if KeyM = 'W' then  FMemC[$8000]:= WM;  Result:= false; end;  // порт A запись

       $8001  : begin if KeyM = 'R' then  begin// порт B  чтение
                  OnPortR(self);
                  if (FMemC[$8000] = 0)    //проверка нажатия клавиши
                    or (FvPortA = FMemC[$8000])  then begin //проверка сканкода клавиши
                      FMemC[$8001] := FvPortB end
                  else FMemC[$8001] := $FF;
                  FWmM_M := FMemC[$8001]; end;
                  Result:= false;
                end;

       $8002  : begin // порт C  //магнитафон, индикатор клавиатуры, перекл.языка, УС, СС - запись в разряды 0-3, чтение из разрядов 4-7
                  OnPortR(self);
                  if KeyM = 'W' then begin
                    //FvPortC:= (FvPortC and $F0) or (WM and $0F); OnPortW(self)
                    end
                  else FWmM_M := FvPortC and $F0;
                  FMemC[$8002]:= FvPortC;
                  Result:= false;
                end;

       $8003  :  begin          // порт управляющего слова, только запись!
                  if KeyM = 'W' then begin OnPortR(self); FMemC[$8002] := (FvPortC or FMemC[$8002]);
                     //WM and $80;    //проверка режима управляющего слова - "1" в 7 разряде.
                     if (WM and $80)= 0 then begin  //режим установки разрядов порта С
                       if (WM and $01) <> 0 then  begin      //установка разряда С в 0 или 1
                         Db := 1 shl((WM and $0E)shr 1); //выбор разряда
                         FMemC[$8002]:= (FMemC[$8002] and $F7 or Db);
                       end;
                     end;
                     FvPortC:= FMemC[$8002];
                     OnPortW(self);
                   end;
                   Result:= false;   
                 end;
       end;
     end;

 //******************************************************************************

{зона внешнего интерфейса КР580ВВ55}//******************************************
    $A000..$Bfff  : begin AddrM:= AddrM and $A003;
                    Result:= false;
      case AddrM of
       $A000  :  Result:= True; // порт A
       $A001  :  Result:= True; // порт B
       $A002  :  Result:= True; // порт C
       $A003  :  begin
                    if KeyM = 'W' then Result:= True // только запись, порт управляющего слова
                     else Result:= true;
                  end;
      end;
    end;
//******************************************************************************

{управление контролером ЭЛТ}//**************************************************
{порт $C000 - порт параметров,
 порт $C001 - порт команд, команда однобайтовая, если до поступления следующей
              команды не было получено необходимое для предыдущей команды число
              байтов параметров, то в регистре состояния выставится
              флаг - неверная команда.}

{коды команд 00000000 ($00) - сброс (формат) экрана, имеет 4 параметра, сброс D6,D2;
             001SSSBB ($20) - ражрешение отображения, параметров нет, D6, D2;
             01000000 ($40) - конец отображения, параметров нет, сброс D2;
             01100000 ($60) - считывание положения светового пера,
                              2 параметра, чтение параметров из порта $C000;

             10000000 ($80) - загружка положения курсора, 2 параметра;
             10100000 ($A0) - разрешения прерывания, параметров нет, D6;
             11000000 ($C0) - запрещение прерывания, параметров нет, сброс D6;
             11100000 ($E0) - предустановка счетчиков, параметров нет.

             в скобках значение после операции И с $E0
             SSS - интервал между пакетами
             BB  - число запросов в пакете.}

{Регистр слова состояния, чтение из порта $C001:
             D7  ($80)- 0;
             D6 ($40) - разрешение прерывания, устанавливается при включении питания,
                  а также при выполнении команд Разрешение прерывания,
                  Разрешения отображения, сбрасывается командами Запрещение
                  прерывания и Формат экрана;
             D5 ($20) - запрос на прерывание; устанавливается в начале отображения
                  последнего ряда знакоместа кадра, если было разрешено
                  прерывание;
             D4 ($10) - сигнал от светового пера, устанавливается, когда вход от
                  светового пера активен и загружены регистры светового пера;
             D3 ($08) - неверная команда, устанавливается при неправильной записи
                  команды в контроллер ЭЛТ,т.е. последовательность параметров
                  слишком длинная или короткая;
             D2 ($04) - разрешение отображения; устанавливается по команде Ражрешение
                  отображения и сбрасывается по командам Запрет отображения и
                  Фортат экрана;
             D1 ($02)- недогружка ПДП, устанавливается при недргружке данных в
                  буфере в ходе отображения информации на экране, при появлении
                  бита режим ПДП прекращается и экран затемняется до начала
                  отображения нового кадра изображения;
             D0 ($01) - переполнение стека символов, устанавливается если число
                  признаков в строке символов превысило 16.

                  D5, D4, D3, D1, D0 - сбрасываются после чтения регистра
                  состояния.}

{управление курсором осуществляется по команде 10000000 ($80),
параметр 1- номер знакоместа в ряду,
параметр 2 - номер ряда знакоместа}
    $C000..$Dfff  : begin AddrM:= AddrM and $C001;
                    Result:= false;
       case AddrM of

       $C000  : begin SetCrtA(Wm,KeyM); Result := false; end;
       $C001  : begin SetCrtB(Wm,KeyM); Result:= false; end;
       end;
    end;
//******************************************************************************

{контролер Прямого доступа к памяти}//******************************************
{зона монитора}//***************************************************************

    $E000..$FFFF  : begin AddrM:= AddrM and $E7FF;
                      if KeyM = 'R' then Result:= True // только чтение
                    else Result:= false;
    end;

//       $E000  :  Result:= false;
//       $E001  :  Result:= false;
//       $E002  :  Result:= false;
//       $E003  :  Result:= false;
//       $E004  :  Result:= false; //регистр адреса канала 2
//       $E005  :  Result:= false; //регистр управления канала 2
//       $E006  :  Result:= false;
//       $E007  :  Result:= false;
//       $E008  :  Result:= false; //регистр режима

//******************************************************************************

    else    Result:= false;
  end;
end;
//******************************************************************************
//******************************************************************************
{ Процедура обработки параметров по адресу $C000}
procedure TMemCPU.SetCrtA(Wm: byte;KeyM: Char );
begin
if KeyM = 'W' then    //проверка на запись - чтение
begin
  FNambPar:= FNambPar + 1;
  if  ((FNambPar<>0) and (FNambPar<= FNambParCtr))and (FWmM in [0,$80]) then
  begin
    case FWmM of   //в WmM команда формата экрана или установки курсора
                 //запись параметров
      $00 : begin
              if FNambPar = 4 then
            end;
      $80 : begin //установка курсора
              case FNambPar of
              1 :  begin FCrsX:= WM-8; end;//запись коордионат курсора в регистры
              2 :  FCrsY := WM-3;
              end;
            end;
    end;
  end
  else FMemC[$C001]:= FMemC[$C001] or $08; {записать в регистр состояния - неправильная команда}
end;
end;
//******************************************************************************
 {обработка команд контролера ЭЛТ (C001)}
procedure TMemCPU.SetCrtB(Wm: byte; KeyM: Char);
begin
if KeyM = 'W' then  //  запись в регистр управления, чтение регистра состояния
 begin              {обработка при записи, т.е. производится запись команды }
   if ((FNambPar<>FNambParCtr) or (FNambPar > 4)) then
       FMemC[$C001]:= FMemC[$C001] or $08; //установка бита - неврная команда
   FNambPar:=0;          //обнулить счетчики параметров
   FNambParCtr:=0;       //....
   FWmM := WM and $E0;   // маска для выделения разрядов команды

   {далее определяем команду, устанавливаем NambParCtr}
   case FWmM of
   $00 : begin //сброс (формат) экрана, имеет 4 параметра, сброс D6,D2 00111011 $3B
          FNambParCtr:= 4;
          FMemC[$C001]:= FMemC[$C001] and $3B;
         end;
   $20 : begin//ражрешение отображения, параметров нет, D6, D2;
          FMemC[$C001]:= FMemC[$C001] or $44;
         end;
   $40 : begin //конец отображения, параметров нет, сброс D2;
          FMemC[$C001]:= FMemC[$C001] and $7B;
         end;
   $60 : FWmM := 0; //считывание положения светового пера,

   $80 : FNambParCtr:= 2;//WmM=$80 загружка положения курсора, 2 параметра;

   $A0 : begin//разрешения прерывания, параметров нет, D6;
          FMemC[$C001]:= FMemC[$C001] or $40;
         end;
   $C0 : begin//запрещение прерывания, параметров нет, сброс D6;
          FWmM := 0;
          FMemC[$C001]:= FMemC[$C001] and $3F;
         end;
   $E0 : begin//предустановка счетчиков, параметров нет
          //WmM := 0;
          FCrsX :=0;
          FCrsY :=0;
         end;
     else  FWmM := 0
   end;
 end
 else begin
   {чтение регистра состояния C001}
   FNambPar:=0;                    //обнулить счетчики параметров
   FNambParCtr:=0;
   FWmM_M := FMemC[$C001];          //чтение слова состояния
   FMemC[$C001]:= FMemC[$C001] and $44; //  D5, D4, D3, D1, D0   0100 0100 $44 -  сбрасываются после чтения регистра состояния
 end;
end;
//******************************************************************************

function TMemCPU.GetMemRead: byte; //  чтение байта
begin
  FWmM_M := 0;
  if ContrlMem(FAddrM) then Result:= FMemC[FAddrM] else Result:= FWmM_M;
end;
//******************************************************************************

procedure TMemCPU.SetMemWrite(AValie: byte); // запись байта
begin
  if ContrlMem(FAddrM,'W',AValie) then FMemC[FAddrM]:= AValie;
end;
//******************************************************************************

procedure TMemCPU.SetAddrM(const AValie: TAddrM);
begin
  if FAddrM <> AValie then FAddrM:= AValie;    //установка адреса
end;
//******************************************************************************

procedure TMemCPU.MemCPUActivate(Sender: TObject);
begin
  FMemC[$8000]:= $FF; FMemC[$8001]:= $FF; FMemC[$8002]:= $FF; FMemC[$8003]:= $FF;
  FMemC[$A000]:= $FF; FMemC[$A001]:= $FF; FMemC[$A002]:= $FF; FMemC[$A003]:= $FF;
  FMemC[$C001]:= FMemC[$C001] or $40; //разрешенить прерывания
end;
//******************************************************************************

procedure TMemCPU.LoadMon;
var
  i:integer;
  MonFl: file of byte;
  AV: byte;
begin
  for i:=0 to $7fff do FMemC[i]:=  random($100);
  AssignFile(MonFl, 'mon32.bin');
  Reset(MonFl);
  for i:=0 to $7ff do
  begin
    read(MonFl,AV);
    FMemC[$E000+i]:= AV;
  end;
  CloseFile(MonFl);
  AssignFile(MonFl, 'Asm.rkr');
  Reset(MonFl);
  for i:=0 to $fff do
  begin
    read(MonFl,AV);
    FMemC[i]:= AV;
  end;
  CloseFile(MonFl);
end;
//******************************************************************************

constructor TMemCPU.Create(AOnwer: TComponent);
begin
  FNambPar:=0;
  FNambParCtr:=0;
  FOnCreate := MemCPUActivate;
  LoadMon;  //грузим монитор
  OnCreate(Self);
end;

procedure Register;
begin
  RegisterComponents('Samples', [TMemCPU]);
end;

end.




---------------------------------------------------------------------------------------------------------
UStrHex.pas


Код:

{ *********************************************************************** }
{                                                                         }
{ Unit UStrHex.pas                                                        }
{ V. 1.2.22                                                               }
{ Copyright (c) 2006  Mihaylov Valeriy                                    }
{                                                                         }
{ *********************************************************************** }

unit UStrHex;

interface

function FlToBin (B :Byte) :string;
function BtToHexAddr (W :Word) :string;
function WrdToHexAddr (W :Word) :string;
function BtToChrAddr(W: Word) :string;
function StrHexToInt(S:string): integer;
function StrDel(S:string):string;
function RD_WORD(W:word): word;

implementation

uses UIm;

type
  WrdRec = packed record
    Lo, Hi: Byte;
  end;

const
  HexNumbers :array [0..15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
  ChrSet: array [0..255] of byte =
               // 00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F
               ( $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,  //00
                 $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,  //01
                 $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E,$2F,  //02
                 $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F,  //03
                 $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E,$4F,  //04
                 $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5A,$5B,$5C,$5D,$5E,$2D,  //05
                 $DE,$C0,$C1,$D6,$C4,$C5,$D4,$C3,$D5,$C8,$C9,$CA,$CB,$CC,$CD,$CE,  //06
                 $CF,$DF,$D0,$D1,$D2,$D3,$C6,$C2,$DC,$DB,$C7,$D8,$DD,$D9,$D7,$7F,  //07
                 $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,  //08
                 $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,  //09
                 $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,  //0A
                 $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,  //0B
                 $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,  //0C
                 $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,  //0D
                 $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,  //0E
                 $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20); //0F
                 
function ByteToHex (B :Byte) :string;
begin
  ByteToHex := HexNumbers[b div 16] + HexNumbers[b mod 16]
end;

function WordToHex(W:word):string;
begin
  WordToHex:= ByteToHex(WrdRec(W).Hi)+ ByteToHex(WrdRec(W).Lo);
end;

function FlToBin (B :Byte) :string;
begin
  if B <> 0 then FlToBin:= '1' else FlToBin:= '0';
end;

function RD_BYTE(W:word): byte;
begin
  MemCPU.vAddr := W;
  Result := MemCPU.vMemB;
end;

function RD_WORD(W:word): word;
var
Reg:word;
begin
  MemCPU.vAddr := W;
  WrdRec(Reg).Lo :=  MemCPU.vMemB;
  MemCPU.vAddr := W +1;
  WrdRec(Reg).Hi := MemCPU.vMemB;
  Result := Reg;
end;

function BtToHexAddr (W :Word) :string;  //байт в Н виде по адресу
//const
//  HexNumbers :array [0..15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
begin
  BtToHexAddr:= ByteToHex(RD_BYTE(W));
end;

function WrdToHexAddr (W :Word) :string; //слово в Н виде по адресу
begin
  WrdToHexAddr:= WordToHex(RD_WORD(W));
end;

function BtToChrAddr(W: Word) :string;  //байт в символ по адресу
begin
  BtToChrAddr:= Chr(ChrSet[($7f and RD_BYTE(W))]);
end;

function StrHexToInt(S:string): integer; //строку в Н виде в целое
var
  w: word;
  b,i,k: byte;
begin
  w:=0;
  b:= Length(S);
  for i:= 1 to b do
  begin
    k:=0;
    while S[i]<> HexNumbers[k] do k:=k+1;
    w:= w+k;
    if i<b then w:= w*16;
  end;
  StrHexToInt:=w;
end;

function StrDel(S:string):string;  //удаление пробелов
var
 i: integer;
begin
  Result:= S;
  for i:=1 to Length(Result) do   
   if Result[i]=' ' then delete(Result,i,1);
end;

end.



UIm2.pas

Код:

{ *********************************************************************** }
{                                                                         }
{ Full screen Form Unit UIm2.pas                                          }
{ V. 1.0.03                                                               }
{ Copyright (c) 2006  Mihaylov Valeriy                                    }
{                                                                         }
{ *********************************************************************** }

unit UIm2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  UKeyb;

type
  TForm2 = class(TForm)
    procedure Keyb(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormDblClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
     procedure CMDialogKey( Var msg: TCMDialogKey ); // !!!  VK_TAB
     message CM_DIALOGKEY;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses UIm;

{$R *.dfm}

procedure TForm2.FormActivate(Sender: TObject);
begin
  Form2.Top:=0;
  Form2.Left:=0;
  Form2.BorderStyle:= bsNone;
  Form2.Width := Screen.Width;
  Form2.Height := Screen.Height;
  Form2.Color:=0;
end;

procedure TForm2.FormDblClick(Sender: TObject);
begin
  if not Form1.Visible then begin
     Form2.Hide;
     Form1.Show;
  end;
end;

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 Form1.FormKeyDown(Sender,Key, Shift);
end;

procedure TForm2.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Form1.FormKeyUp(Sender,Key, Shift);
end;

procedure TForm2.CMDialogKey(var msg: TCMDialogKey);
begin
end;

procedure TForm2.Keyb(Sender: TObject);
begin
  Form1.Keyb(Sender);
end;

end.


UIm2.dfm

Код:

object Form2: TForm2
  Left = 251
  Top = 116
  BorderStyle = bsNone
  Caption = 'Form2'
  ClientHeight = 33
  ClientWidth = 115
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnActivate = FormActivate
  OnDblClick = FormDblClick
  OnKeyDown = FormKeyDown
  OnKeyUp = FormKeyUp
  PixelsPerInch = 96
  TextHeight = 13
end


Последний раз редактировалось: Valeriy (24 Ноя 2011 23:40), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Valeriy
Site Admin
цитировать



Репутация: 0    

Зарегистрирован: 11.01.2009
Сообщения: 839
Откуда: Москва (Кострома)

СообщениеДобавлено: 07 Авг 2010 16:50    Заголовок сообщения: Ответить с цитатой

---------------------------------------------------------------------------------------------------------
UDebag.dfm

Код:

object DebagForm: TDebagForm
  Left = 4
  Top = 5
  Width = 321
  Height = 344
  BorderIcons = [biSystemMenu]
  Caption = #1054#1090#1083#1072#1076#1095#1080#1082' 86PK'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  KeyPreview = True
  OldCreateOrder = False
  Position = poDefaultPosOnly
  OnClose = FormClose
  OnHide = FormHide
  OnKeyDown = FormKeyDown
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object ButtonAutoStepInto: TSpeedButton
    Left = 216
    Top = 36
    Width = 25
    Height = 25
    Hint = 'auto Step into'
    GroupIndex = 1
    Caption = 'aF7'
    ParentShowHint = False
    ShowHint = True
    OnClick = ButtonAutoStepIntoClick
  end
  object ButtonAutoStepOver: TSpeedButton
    Left = 248
    Top = 36
    Width = 25
    Height = 25
    Hint = 'auto Step over'
    GroupIndex = 1
    Caption = 'aF8'
    ParentShowHint = False
    ShowHint = True
    OnClick = ButtonAutoStepOverClick
  end
  object Panel1: TPanel
    Left = 2
    Top = 4
    Width = 207
    Height = 57
    TabOrder = 0
    object GroupBox1: TGroupBox
      Left = 4
      Top = 4
      Width = 59
      Height = 49
      TabOrder = 0
      object Label9: TLabel
        Left = 10
        Top = 20
        Width = 9
        Height = 13
        Caption = 'A'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object EditA: TEdit
        Left = 27
        Top = 14
        Width = 29
        Height = 24
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -13
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        MaxLength = 2
        ParentFont = False
        ReadOnly = True
        TabOrder = 0
        Text = 'DD'
        OnDblClick = EditADblClick
        OnExit = EditSPExit
        OnKeyPress = EditAKeyPress
      end
    end
    object GroupBox2: TGroupBox
      Left = 66
      Top = 4
      Width = 137
      Height = 49
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = [fsBold]
      ParentFont = False
      TabOrder = 1
      object LabelFS: TLabel
        Left = 9
        Top = 32
        Width = 9
        Height = 13
        Caption = 'S'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object LabelFZ: TLabel
        Left = 25
        Top = 32
        Width = 9
        Height = 13
        Caption = 'Z'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object LabelF0: TLabel
        Left = 41
        Top = 32
        Width = 3
        Height = 13
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = []
        ParentFont = False
      end
      object LabelFAC: TLabel
        Left = 52
        Top = 32
        Width = 17
        Height = 13
        Caption = 'AC'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object LabelFO: TLabel
        Left = 73
        Top = 32
        Width = 10
        Height = 13
        Caption = 'O'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object LabelFP: TLabel
        Left = 89
        Top = 32
        Width = 9
        Height = 13
        Caption = 'P'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object LabelF1: TLabel
        Left = 105
        Top = 32
        Width = 3
        Height = 13
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = []
        ParentFont = False
      end
      object LabelFC: TLabel
        Left = 121
        Top = 32
        Width = 9
        Height = 13
        Caption = 'C'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object EditFS: TEdit
        Left = 4
        Top = 8
        Width = 16
        Height = 21
        MaxLength = 1
        ReadOnly = True
        TabOrder = 0
        OnDblClick = EditFSDblClick
      end
      object EditF0: TEdit
        Left = 36
        Top = 8
        Width = 16
        Height = 21
        Color = clInactiveBorder
        Enabled = False
        MaxLength = 1
        ReadOnly = True
        TabOrder = 2
        Text = '0'
        OnDblClick = EditFSDblClick
      end
      object EditFAC: TEdit
        Left = 52
        Top = 8
        Width = 16
        Height = 21
        MaxLength = 1
        ReadOnly = True
        TabOrder = 3
        OnDblClick = EditFSDblClick
      end
      object EditFO: TEdit
        Left = 68
        Top = 8
        Width = 16
        Height = 21
        MaxLength = 1
        ReadOnly = True
        TabOrder = 4
        OnDblClick = EditFSDblClick
      end
      object EditFP: TEdit
        Left = 84
        Top = 8
        Width = 16
        Height = 21
        MaxLength = 1
        ReadOnly = True
        TabOrder = 5
        OnDblClick = EditFSDblClick
      end
      object EditF1: TEdit
        Left = 100
        Top = 8
        Width = 16
        Height = 21
        Color = clInactiveBorder
        Enabled = False
        MaxLength = 1
        ReadOnly = True
        TabOrder = 6
        Text = '1'
        OnDblClick = EditFSDblClick
      end
      object EditFC: TEdit
        Left = 118
        Top = 8
        Width = 16
        Height = 21
        MaxLength = 1
        ReadOnly = True
        TabOrder = 1
        OnDblClick = EditFSDblClick
      end
      object EditFZ: TEdit
        Left = 20
        Top = 8
        Width = 16
        Height = 21
        MaxLength = 1
        ReadOnly = True
        TabOrder = 7
        OnDblClick = EditFSDblClick
      end
    end
  end
  object Panel2: TPanel
    Left = 2
    Top = 68
    Width = 157
    Height = 157
    TabOrder = 1
    object GroupBox3: TGroupBox
      Left = 4
      Top = 0
      Width = 149
      Height = 53
      TabOrder = 0
      object LabelBC: TLabel
        Left = 92
        Top = 20
        Width = 17
        Height = 13
        Caption = 'DF'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clBlue
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object Label10: TLabel
        Left = 8
        Top = 20
        Width = 17
        Height = 13
        Caption = 'BC'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object LabelChrBC: TLabel
        Left = 118
        Top = 20
        Width = 9
        Height = 13
        Caption = 'A'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clBlue
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object EditB: TEdit
        Left = 32
        Top = 16
        Width = 29
        Height = 24
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -13
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        MaxLength = 2
        ParentFont = False
        ReadOnly = True
        TabOrder = 0
        Text = 'DF'
        OnDblClick = EditADblClick
        OnExit = EditSPExit
        OnKeyPress = EditAKeyPress
      end
      object EditC: TEdit
        Left = 61
        Top = 16
        Width = 29
        Height = 24
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -13
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        MaxLength = 2
        ParentFont = False
        ReadOnly = True
        TabOrder = 1
        OnDblClick = EditADblClick
        OnExit = EditSPExit
        OnKeyPress = EditAKeyPress
      end
    end
    object GroupBox4: TGroupBox
      Left = 4
      Top = 52
      Width = 149
      Height = 53
      TabOrder = 1
      object LabelDE: TLabel
        Left = 92
        Top = 20
        Width = 15
        Height = 13
        Caption = '98'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clBlue
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object Label11: TLabel
        Left = 8
        Top = 20
        Width = 18
        Height = 13
        Caption = 'DE'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object LabelChrDE: TLabel
        Left = 118
        Top = 20
        Width = 9
        Height = 13
        Caption = 'A'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clBlue
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object EditD: TEdit
        Left = 32
        Top = 16
        Width = 29
        Height = 24
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -13
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        MaxLength = 2
        ParentFont = False
        ReadOnly = True
        TabOrder = 0
        OnDblClick = EditADblClick
        OnExit = EditSPExit
        OnKeyPress = EditAKeyPress
      end
      object EditE: TEdit
        Left = 61
        Top = 16
        Width = 29
        Height = 24
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -13
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        MaxLength = 2
        ParentFont = False
        ReadOnly = True
        TabOrder = 1
        OnDblClick = EditADblClick
        OnExit = EditSPExit
        OnKeyPress = EditAKeyPress
      end
    end
    object GroupBox5: TGroupBox
      Left = 4
      Top = 104
      Width = 149
      Height = 49
      TabOrder = 2
      object LabelHL: TLabel
        Left = 92
        Top = 20
        Width = 15
        Height = 13
        Caption = '03'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clBlue
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object Label12: TLabel
        Left = 8
        Top = 20
        Width = 17
        Height = 13
        Caption = 'HL'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object LabelChrHL: TLabel
        Left = 118
        Top = 20
        Width = 9
        Height = 13
        Caption = 'A'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clBlue
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object EditH: TEdit
        Left = 32
        Top = 16
        Width = 29
        Height = 24
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -13
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        MaxLength = 2
        ParentFont = False
        ReadOnly = True
        TabOrder = 0
        OnDblClick = EditADblClick
        OnExit = EditSPExit
        OnKeyPress = EditAKeyPress
      end
      object EditL: TEdit
        Left = 61
        Top = 16
        Width = 29
        Height = 24
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -13
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        MaxLength = 2
        ParentFont = False
        ReadOnly = True
        TabOrder = 1
        OnDblClick = EditADblClick
        OnExit = EditSPExit
        OnKeyPress = EditAKeyPress
      end
    end
  end
  object Panel3: TPanel
    Left = 2
    Top = 228
    Width = 157
    Height = 40
    TabOrder = 2
    object Bevel1: TBevel
      Left = 4
      Top = 4
      Width = 149
      Height = 32
      Shape = bsFrame
    end
    object Label1: TLabel
      Left = 12
      Top = 12
      Width = 17
      Height = 13
      Caption = 'SP'
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = [fsBold]
      ParentFont = False
    end
    object LabelSP: TLabel
      Left = 90
      Top = 12
      Width = 29
      Height = 13
      Caption = '032F'
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clBlue
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = [fsBold]
      ParentFont = False
    end
    object EditSP: TEdit
      Left = 36
      Top = 8
      Width = 51
      Height = 24
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -13
      Font.Name = 'MS Sans Serif'
      Font.Style = [fsBold]
      MaxLength = 4
      ParentFont = False
      ReadOnly = True
      TabOrder = 0
      OnDblClick = EditADblClick
      OnExit = EditSPExit
      OnKeyPress = EditAKeyPress
    end
  end
  object Panel4: TPanel
    Left = 2
    Top = 269
    Width = 157
    Height = 40
    TabOrder = 3
    object Bevel2: TBevel
      Left = 4
      Top = 4
      Width = 149
      Height = 32
      Shape = bsFrame
    end
    object Label2: TLabel
      Left = 12
      Top = 12
      Width = 17
      Height = 13
      Caption = 'PC'
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = [fsBold]
      ParentFont = False
    end
    object LabelPC: TLabel
      Left = 88
      Top = 12
      Width = 25
      Height = 13
      Caption = 'JMP'
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clBlue
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = [fsBold]
      ParentFont = False
    end
    object LabelPC2: TLabel
      Left = 120
      Top = 12
      Width = 5
      Height = 13
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clBlue
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = [fsBold]
      ParentFont = False
      ParentShowHint = False
      ShowHint = False
      Layout = tlCenter
    end
    object EditPC: TEdit
      Left = 36
      Top = 8
      Width = 51
      Height = 24
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -13
      Font.Name = 'MS Sans Serif'
      Font.Style = [fsBold]
      MaxLength = 4
      ParentFont = False
      ReadOnly = True
      TabOrder = 0
      OnDblClick = EditADblClick
      OnExit = EditSPExit
      OnKeyPress = EditAKeyPress
    end
  end
  object Panel5: TPanel
    Left = 162
    Top = 68
    Width = 145
    Height = 241
    TabOrder = 4
    object GroupBox6: TGroupBox
      Left = 4
      Top = 4
      Width = 45
      Height = 233
      TabOrder = 0
      object Button1: TButton
        Left = 4
        Top = 90
        Width = 37
        Height = 17
        TabOrder = 0
      end
      object Button2: TButton
        Left = 4
        Top = 110
        Width = 37
        Height = 17
        TabOrder = 1
      end
      object Button3: TButton
        Left = 4
        Top = 50
        Width = 37
        Height = 17
        TabOrder = 2
      end
      object Button4: TButton
        Left = 4
        Top = 70
        Width = 37
        Height = 17
        TabOrder = 3
      end
      object Button5: TButton
        Left = 4
        Top = 30
        Width = 37
        Height = 17
        Caption = 'Clear'
        TabOrder = 4
        OnClick = Button5Click
      end
      object Button6: TButton
        Left = 4
        Top = 10
        Width = 37
        Height = 17
        Caption = 'Report'
        TabOrder = 5
        OnClick = Button6Click
      end
      object Button7: TButton
        Left = 4
        Top = 156
        Width = 37
        Height = 17
        Caption = 'Reset'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = []
        ParentFont = False
        TabOrder = 6
        OnClick = Button7Click
      end
      object ButtonReset: TButton
        Left = 4
        Top = 176
        Width = 37
        Height = 17
        Caption = 'Null'
        TabOrder = 7
        OnClick = ButtonResetClick
      end
      object SpinEdit1: TSpinEdit
        Left = 2
        Top = 202
        Width = 40
        Height = 22
        MaxValue = 200
        MinValue = 1
        TabOrder = 8
        Value = 30
        OnChange = SpinEdit1Change
      end
    end
    object ListBox1: TListBox
      Left = 54
      Top = 8
      Width = 85
      Height = 225
      ItemHeight = 13
      TabOrder = 1
    end
  end
  object ButtonStepInto: TButton
    Left = 216
    Top = 4
    Width = 25
    Height = 25
    Hint = 'Step into'
    Caption = 'F7'
    ParentShowHint = False
    ShowHint = True
    TabOrder = 5
    OnClick = ButtonStepIntoClick
  end
  object ButtonStepOver: TButton
    Left = 248
    Top = 4
    Width = 25
    Height = 25
    Hint = 'Step over'
    Caption = 'F8'
    ParentShowHint = False
    ShowHint = True
    TabOrder = 6
    OnClick = ButtonStepOverClick
  end
  object ButtonRun: TButton
    Left = 280
    Top = 4
    Width = 25
    Height = 25
    Hint = 'Run'
    Caption = 'F9'
    ParentShowHint = False
    ShowHint = True
    TabOrder = 7
    OnClick = ButtonRunClick
  end
  object ButtonStop: TButton
    Left = 280
    Top = 36
    Width = 25
    Height = 25
    Hint = 'Stop'
    Caption = 'Stop'
    ParentShowHint = False
    ShowHint = True
    TabOrder = 8
    OnClick = ButtonStopClick
  end
  object Timer1: TTimer
    Enabled = False
    Interval = 300
    OnTimer = Timer1Timer
    Left = 238
    Top = 120
  end
end



---------------------------------------------------------------------------------------------------------
UDebag.pas


Код:

{ *********************************************************************** }
{                                                                         }
{ Debugger Unit UDebag.pas                                                }
{ V. 1.2.50                                                               }
{ Copyright (c) 2006  Mihaylov Valeriy                                    }
{                                                                         }
{ *********************************************************************** }

unit UDebag;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, UIm, U8080, UStrHex, Buttons, Spin, UDMemo, UGlbPK;

type
  TStop  = (trpInterval,trpValue,trpHLT,trpMonitor,trpKeyboard,trpScreen,trpWorkingAreaMonitort,trpStack);
  PTrap =^TTrap;
  TTrap = class //структура точки останова
    Engage: boolean;
    TrapString: string;
    TrapType: TStop;
    AddrBegin: word;
    AddrEnd: word;
  end;

  TDebagForm = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    EditFS: TEdit;
    EditFZ: TEdit;
    EditF0: TEdit;
    EditFAC: TEdit;
    EditFO: TEdit;
    EditFP: TEdit;
    EditF1: TEdit;
    EditFC: TEdit;
    LabelFS: TLabel;
    LabelFZ: TLabel;
    LabelF0: TLabel;
    LabelFAC: TLabel;
    LabelFO: TLabel;
    LabelFP: TLabel;
    LabelF1: TLabel;
    LabelFC: TLabel;
    Panel2: TPanel;
    GroupBox3: TGroupBox;
    GroupBox4: TGroupBox;
    GroupBox5: TGroupBox;
    Panel3: TPanel;
    Bevel1: TBevel;
    EditSP: TEdit;
    Label1: TLabel;
    Panel4: TPanel;
    Bevel2: TBevel;
    Label2: TLabel;
    EditPC: TEdit;
    LabelPC: TLabel;
    LabelHL: TLabel;
    LabelBC: TLabel;
    LabelDE: TLabel;
    LabelSP: TLabel;
    Label9: TLabel;
    EditA: TEdit;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    LabelPC2: TLabel;
    Panel5: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    ButtonReset: TButton;
    GroupBox6: TGroupBox;
    ListBox1: TListBox;
    ButtonStepInto: TButton;
    ButtonStepOver: TButton;
    ButtonRun: TButton;
    EditB: TEdit;
    EditC: TEdit;
    EditD: TEdit;
    EditE: TEdit;
    EditH: TEdit;
    EditL: TEdit;
    LabelChrBC: TLabel;
    LabelChrDE: TLabel;
    LabelChrHL: TLabel;
    Timer1: TTimer;
    ButtonAutoStepInto: TSpeedButton;
    ButtonAutoStepOver: TSpeedButton;
    ButtonStop: TButton;
    SpinEdit1: TSpinEdit;
    procedure FormShow(Sender: TObject);
    procedure ButtonStepIntoClick(Sender: TObject);
    procedure ButtonStepOverClick(Sender: TObject);
    procedure ButtonRunClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure EditFSDblClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure EditADblClick(Sender: TObject);
    procedure EditAKeyPress(Sender: TObject; var Key: Char);
    procedure ButtonResetClick(Sender: TObject);
    procedure EditSPExit(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure ButtonAutoStepOverClick(Sender: TObject);
    procedure ButtonAutoStepIntoClick(Sender: TObject);
    procedure ButtonStopClick(Sender: TObject);
    procedure FormHide(Sender: TObject);
    procedure SpinEdit1Change(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure SetTrap(var Tr: PTrap);
    procedure DelTrap(var Tr: PTrap);

  private
    FTrap: TList;
    FDbAgent: byte; //количество точек останова
    { Private declarations }
    procedure DebagFormChange(const r: TTakt);
    procedure EditRegs(Sender: TEdit);
//    FStOver: boolean;
  public
    { Public declarations }
//    property StepOver: boolean read FStOver write FStOver;
  end;

var
  DebagForm: TDebagForm;
  BoolMemo: boolean=true;

implementation

uses Math;

{$R *.DFM}

var
  FTrap: TList;

procedure TDebagForm.DebagFormChange(const r: TTakt); //прорисовка текущих значений на форме
type
  stringw = string[4];
  stringb = string[2];
var
sBC,sDE,ssHL,sPC,sSP: stringw;
srBC,srDE,srHL,srPC,srSP,srSP2,srSP4,srSP6: stringw;
sA,sB,sC,sD,sE,sH,sL: stringb;
schrBC,schrDE,schrHL: stringw;
sFS,sFZ,sFAC,sFO,sFP,sFC: stringw;

procedure ReportMemo; //печать в Memo
var
  S: string;
begin
  S:= IntToStr(rtkt) + #13#10 +
      '  A='+sA+ ';  FLAGS: '+'S='+sFS+';  Z='+sFZ+
      ';  AC='+sFAC+';  O='+sFO+';  P='+sFP+';  C='+sFC+';'{+#13#10};

  FormDM.Memo.Lines.Add(S);

  S:= '  BC='+sBC+ '('+srBC+')'+ ';  DE='+sDE+ '('+srDE+')'+
      ';  HL='+ ssHL+ '('+srHL+');'{+#13#10};
  FormDM.Memo.Lines.Add(S);

  S:= '  PC='+sPC+ '('+srPC+');'{+#13#10};
  FormDM.Memo.Lines.Add(S);

  S:= '  SP='+ sSP+'  '+srSP;
  FormDM.Memo.Lines.Add(S);

  S:= '           ';
  FormDM.Memo.Lines.Add(S+srSP2);
  FormDM.Memo.Lines.Add(S+srSP4);
  FormDM.Memo.Lines.Add(S+srSP6+#13#10);
end;

begin
  sBC:= intToHex((r.regs[1]),4); //значения регистров BC,DE,HL
  sDE:= intToHex((r.regs[2]),4);
  ssHL:= intToHex((r.regs[3]),4);
  sSP:= intToHex((r.regs[5]),4);
  sPC:= intToHex((r.regs[6]),4);

  sA:= intToHex((WrdRec(r.regs[4]).Hi),2);// значения регистров A,B,C,D,E,H,L
  sB:= intToHex((WrdRec(r.regs[1]).Hi),2);
  sC:= intToHex((WrdRec(r.regs[1]).Lo),2);
  sD:= intToHex((WrdRec(r.regs[2]).Hi),2);
  sE:= intToHex((WrdRec(r.regs[2]).Lo),2);
  sH:= intToHex((WrdRec(r.regs[3]).Hi),2);
  sL:= intToHex((WrdRec(r.regs[3]).Lo),2);

  sFS:= FlToBin((WrdRec(r.regs[4]).Lo) and $80); //двоичные значения флагов
  sFZ:= FlToBin((WrdRec(r.regs[4]).Lo) and $40);
  sFAC:= FlToBin((WrdRec(r.regs[4]).Lo) and $10);
  sFO:= FlToBin((WrdRec(r.regs[4]).Lo) and $08);
  sFP:= FlToBin((WrdRec(r.regs[4]).Lo) and $04);
  sFC:= FlToBin((WrdRec(r.regs[4]).Lo) and $01);

  srBC:= BtToHexAddr(r.regs[1]);  //значение байта по адресу
  srDE:= BtToHexAddr(r.regs[2]);  // в регистрах BC,DE,HL
  srHL:= BtToHexAddr(r.regs[3]);
  srPC:= BtToHexAddr(r.regs[6]);  //код операции

  srSP:= WrdToHexAddr(r.regs[5]);   // значение слова в стеке
  srSP2:= WrdToHexAddr(r.regs[5]-2);
  srSP4:= WrdToHexAddr(r.regs[5]-4);
  srSP6:= WrdToHexAddr(r.regs[5]-6);

  schrBC:= BtToChrAddr(r.regs[1]); //преобразование байта
  schrDE:= BtToChrAddr(r.regs[2]); //находящегося по адресу
  schrHL:= BtToChrAddr(r.regs[3]); //в символ

  //with DebagForm do begin
    EditA.Text:= sA;  //вывод
    EditB.Text:= sB;
    EditC.Text:= sC;
    EditD.Text:= sD;
    EditE.Text:= sE;
    EditH.Text:= sH;
    EditL.Text:= sL;
    EditSP.Text:= sSP;
    EditPC.Text:= sPC;
    EditFS.Text:= sFS;
    EditFZ.Text:= sFZ;
    EditFAC.Text:= sFAC;
    EditFO.Text:= sFO;
    EditFP.Text:= sFP;
    EditFC.Text:= sFC;
    EditF0.Text:= FlToBin((WrdRec(r.regs[4]).Lo) and $20);
    EditF1.Text:= FlToBin((WrdRec(r.regs[4]).Lo) and $02);
    LabelBC.Caption:= srBC;
    LabelDE.Caption:= srDE;
    LabelHL.Caption:= srHL;
    LabelPC.Caption:= srPC;
    LabelSP.Caption:= srSP;
    LabelChrBC.Caption:= schrBC;
    LabelChrDE.Caption:= schrDE;
    LabelChrHL.Caption:= schrHL;
    //LabelPC2.Font.Color:= $F040F0;
  //end;
  //with DebagForm do begin
  case r.cop of //подсветка флага, контролируемого операцией условного перехода
    $C2,$C0,$C4,$C8,$CA,$CC: begin EditFZ.Color:= clRed; LabelPC.Font.Color:= clRed; end;
    $D2,$D0,$D4,$D8,$DA,$DC: begin EditFC.Color:= clRed; LabelPC.Font.Color:= clRed; end;
    $E2,$E0,$E4,$E8,$EA,$EC: begin EditFP.Color:= clRed; LabelPC.Font.Color:= clRed; end;
    $F2,$F0,$F4,$F8,$FA,$FC: begin EditFS.Color:= clRed; LabelPC.Font.Color:= clRed; end;
  else
    EditFZ.Color:= clWindow; //обнуление цвета
    EditFC.Color:= clWindow;
    EditFP.Color:= clWindow;
    EditFS.Color:= clWindow;
  end;
  case r.cop of //подсветка кода операций перехода
    $C3,$CD,$CF,$D7,$DF,
    $E7,$EF,$F7,$FF,$C9    : LabelPC.Font.Color:= clRed;
    $C1,$C5,$D1,$D5,
    $E1,$E5,$F1,$F5        : LabelPC.Font.Color:= $F040F0; //PUSH, POP
  else
    LabelPC.Font.Color:= clBlue;
  end;
  //end;
  //if r.regs[6] < $F000 then //монитор не выводить
  ReportMemo;
end;

procedure TDebagForm.FormShow(Sender: TObject);
begin
  BoolMemo:= true;
  Timer1.Enabled:= false;
  DebagFormChange(rTakt);
  DebagForm.ButtonStepInto.SetFocus;
end;

procedure TDebagForm.ButtonStepIntoClick(Sender: TObject); //Step into
begin
  if Sender<Timer1> $F836) and (rTakt.regs[6]< $FFFF)) then
  DebagFormChange(rTakt);
end;

procedure TDebagForm.ButtonStepOverClick(Sender: TObject); //Step over
begin
  if Sender<> Timer1 then ButtonStop.Click;
  if rTakt.cop in [$C4,$CC,$CD,$D4,$DC,$E4,$EC,$F4,$FC] then
    begin
      Cpu.ContPC:= rTakt.regs[6]+3;
      Cpu.ContSP:= rTakt.regs[5];
      repeat
        rTakt:= cpu.Takt(rtkt,true);
        Application.ProcessMessages;
      until rTakt.auto;
  end else rTakt:= cpu.Takt(rtkt);
  DebagFormChange(rTakt);
end;

procedure TDebagForm.ButtonRunClick(Sender: TObject); //работа эмулятора в автоматическом режиме
begin                                                 // под контролем отладчика
//                                                    // происходит контроль точек останова
end;

procedure TDebagForm.FormClose(Sender: TObject; var Action: TCloseAction); //закрытие формы
begin
  Form1.sbDebug.Down:= false;
  Form1.sbDebagClick(Sender);
end;

procedure TDebagForm.EditFSDblClick(Sender: TObject); //ручная инверсия флагов
var
  S:string;
begin
  if not(ButtonAutoStepOver.Down or ButtonAutoStepInto.Down) then
  if Sender = EditFS then begin
    WrdRec(rTakt.regs[4]).Lo:= (not WrdRec(rTakt.regs[4]).Lo and $80)
     or (WrdRec(rTakt.regs[4]).Lo and $7F); S:= 'S'; end
  else if Sender = EditFZ then begin
    WrdRec(rTakt.regs[4]).Lo:= (not WrdRec(rTakt.regs[4]).Lo and $40)
     or (WrdRec(rTakt.regs[4]).Lo and $BF); S:= 'Z'; end
  else if Sender = EditFAC then begin
    WrdRec(rTakt.regs[4]).Lo:= (not WrdRec(rTakt.regs[4]).Lo and $10)
     or (WrdRec(rTakt.regs[4]).Lo and $EF); S:= 'AC'; end
  else if Sender = EditFO then begin
    WrdRec(rTakt.regs[4]).Lo:= (not WrdRec(rTakt.regs[4]).Lo and $08)
     or (WrdRec(rTakt.regs[4]).Lo and $F7); S:= 'O'; end
  else if Sender = EditFP then begin
    WrdRec(rTakt.regs[4]).Lo:= (not WrdRec(rTakt.regs[4]).Lo and $04)
     or (WrdRec(rTakt.regs[4]).Lo and $FB); S:= 'P'; end
  else if Sender = EditFC then begin
    WrdRec(rTakt.regs[4]).Lo:= (not WrdRec(rTakt.regs[4]).Lo and $01)
     or (WrdRec(rTakt.regs[4]).Lo and $FE); S:= 'C'; end;
  FormDM.Memo.Lines.Add('  ИНВЕРСИЯ ФЛАГА  '+S+#13#10);
  Cpu.SetCpu(rTakt);
  DebagFormChange(rTakt);
end;

procedure TDebagForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);     //обработка клавиш F7,F8,F9
begin
  DebagForm.SetFocus;
  case Key of
    VK_F7: ButtonStepIntoClick(Sender);
    VK_F8: ButtonStepOverClick(Sender);
    VK_F9: ButtonRunClick(Sender);
  end;
end;

procedure TDebagForm.EditADblClick(Sender: TObject); //разрешить редактирование регистров и флагов
begin
  (Sender as TEdit).ReadOnly:= false;
end;

procedure TDebagForm.EditRegs(Sender: TEdit);//редактирование регистров
var
S:string;
begin
  If Sender = EditB then begin      //case не катит, не порядковый тип
    WrdRec(rTakt.regs[1]).Hi:= byte(StrHexToInt(Sender.Text));
    S:= 'B'; end
  else If Sender = EditC then begin
    WrdRec(rTakt.regs[1]).Lo:= byte(StrHexToInt(Sender.Text));
    S:= 'C'; end
  else If Sender = EditD then begin
    WrdRec(rTakt.regs[2]).Hi:= byte(StrHexToInt(Sender.Text));
    S:= 'D'; end
  else If Sender = EditE then begin
    WrdRec(rTakt.regs[2]).Lo:= byte(StrHexToInt(Sender.Text));
    S:= 'E'; end
  else If Sender = EditH then begin
   WrdRec(rTakt.regs[3]).Hi:= byte(StrHexToInt(Sender.Text));
    S:= 'H'; end
  else If Sender = EditL then begin
    WrdRec(rTakt.regs[3]).Lo:= byte(StrHexToInt(Sender.Text));
    S:= 'L'; end
  else If Sender = EditA then begin
    WrdRec(rTakt.regs[4]).Hi:= byte(StrHexToInt(Sender.Text));
    S:= 'A'; end
  else If Sender = EditSP then begin
    rTakt.regs[5]:= StrHexToInt(Sender.Text);
    S:= 'SP'; end
  else If Sender = EditPC then begin
    rTakt.regs[6]:= StrHexToInt(Sender.Text);
    S:= 'PC';
  end;
  FormDM.Memo.Lines.Add('  ИЗМЕНЕНИЕ РЕГИСТРА  '+S+#13#10);
  Cpu.SetCpu(rTakt);
  DebagFormChange(rTakt); 
end;

procedure TDebagForm.EditAKeyPress(Sender: TObject; var Key: Char); //ввод значений в регистры
begin
  LoadKeyboardLayout('00000409', KLF_ACTIVATE);
  Key := UpCase(Key);
  if not (Key in ['0'..'9','A'..'F',#8,#13,#27,#46]) then Key := #0;
  if Key = #13 then
  begin
    if (Sender as TEdit).Modified then EditRegs(Sender as TEdit);
    (Sender as TEdit).Modified:= false;
    (Sender as TEdit).ReadOnly:= true;
  end;
  if (Key =#27) then begin
    if (Sender as TEdit).Modified then
     if (Sender as TEdit).CanUndo then (Sender as TEdit).Undo;
    (Sender as TEdit).Modified:= false;
    (Sender as TEdit).ReadOnly:= true;           
  end;
end;

procedure TDebagForm.ButtonResetClick(Sender: TObject); //установка всех регистров в ноль
begin
  ButtonStop.Click;
  rtkt:= 0;
  rTakt.regs[1]:= 0;  rTakt.regs[2]:= 0;  rTakt.regs[3]:= 0;
  rTakt.regs[4]:= 2;  rTakt.regs[5]:= 0;  rTakt.regs[6]:= 0;
  FormDM.Memo.Lines.Add('   СБРОС в ноль');
  Cpu.SetCpu(rTakt);
  DebagFormChange(rTakt);
end;

procedure TDebagForm.EditSPExit(Sender: TObject); //потеря фокуса регистра
begin
  if (Sender as TEdit).Modified then EditRegs(Sender as TEdit);
    (Sender as TEdit).ReadOnly:= true;
end;

procedure TDebagForm.Timer1Timer(Sender: TObject);// таймер автотрассировки
begin
  if ButtonAutoStepInto.Down then ButtonStepIntoClick(Sender)
  else
  if ButtonAutoStepOver.Down then ButtonStepOverClick(Sender)
  else
  Timer1.Enabled:= false;
end;

procedure TDebagForm.ButtonAutoStepOverClick(Sender: TObject);//auto Step over
begin
  if ButtonAutoStepOver.Down then
  Timer1.Enabled:= true;
end;

procedure TDebagForm.ButtonAutoStepIntoClick(Sender: TObject);//auto Step into
begin
  if ButtonAutoStepInto.Down then
  Timer1.Enabled:= true;
end;

procedure TDebagForm.ButtonStopClick(Sender: TObject); //остановка трассировки
begin
  Timer1.Enabled:= false;
  ButtonAutoStepOver.AllowAllUp:= true;
  ButtonAutoStepInto.AllowAllUp:= true;
  ButtonAutoStepOver.Down:= false;
  ButtonAutoStepInto.Down:= false;
end;

procedure TDebagForm.FormHide(Sender: TObject);
begin
  ButtonStop.Click;
end;

procedure TDebagForm.SpinEdit1Change(Sender: TObject);//скорость автотрассировки
begin
  Timer1.Interval:= 10*SpinEdit1.Value;
end;

procedure TDebagForm.Button7Click(Sender: TObject); //сброс
begin
  ButtonStop.Click;
  rtkt:= 0;
  rTakt.regs[1]:= 0;  rTakt.regs[2]:= 0;  rTakt.regs[3]:= 0;
  rTakt.regs[4]:= 2;  rTakt.regs[5]:= 0;  rTakt.regs[6]:= $F800;
  FormDM.Memo.Lines.Add('   СБРОС в Монитор'+#13#10);
  Cpu.SetCpu(rTakt);
  DebagFormChange(rTakt);
end;

procedure TDebagForm.Button6Click(Sender: TObject);// включение экрана трассировки
begin
  if BoolMemo then FormDM.Show
  else FormDM.Hide;
  BoolMemo:= not BoolMemo;
end;

procedure TDebagForm.Button5Click(Sender: TObject);// очистка экрана трассировки
begin
  FormDM.Memo.Clear;
  FormDM.Memo.Lines.Add(#13#10+'  BEGIN'+#13#10#13#10#13#10#13#10);
end;

procedure TDebagForm.SetTrap(var Tr: PTrap);
begin
 if FTrap = nil then TList.Create;
 New(Tr);
 FTrap.Add(Tr)
end;

procedure TDebagForm.DelTrap(var Tr: PTrap);
begin
  if FTrap = nil then exit;
  //........
  Dispose(Tr);
end;

end.



---------------------------------------------------------------------------------------------------------
UDMemo.dfm

Код:

object FormDM: TFormDM
  Left = 250
  Top = 109
  Width = 484
  Height = 652
  Caption = 'FormDM'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  Menu = MainMenu1
  OldCreateOrder = False
  Position = poDefaultPosOnly
  OnClose = FormClose
  PixelsPerInch = 96
  TextHeight = 13
  object Memo: TMemo
    Left = 0
    Top = 0
    Width = 476
    Height = 598
    Align = alClient
    Font.Charset = RUSSIAN_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'Courier New'
    Font.Style = []
    ParentFont = False
    ScrollBars = ssVertical
    TabOrder = 0
  end
  object MainMenu1: TMainMenu
    Left = 124
    Top = 22
    object Save: TMenuItem
      Caption = #1057#1086#1093#1088#1072#1085#1080#1090#1100
      OnClick = SaveClick
    end
  end
end



---------------------------------------------------------------------------------------------------------

UDMemo.pas


unit UDMemo;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type
  TFormDM = class(TForm)
    MainMenu1: TMainMenu;
    Save: TMenuItem;
    Memo: TMemo;
    procedure SaveClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormDM: TFormDM;

implementation

uses UDebag;

{$R *.dfm}

procedure TFormDM.SaveClick(Sender: TObject);
begin
  Memo.Lines.SaveToFile('Trace.txt');
end;

procedure TFormDM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  BoolMemo:= not BoolMemo;
end;

end.



---------------------------------------------------------------------------------------------------------


Последний раз редактировалось: Valeriy (26 Ноя 2011 16:47), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Valeriy
Site Admin
цитировать



Репутация: 0    

Зарегистрирован: 11.01.2009
Сообщения: 839
Откуда: Москва (Кострома)

СообщениеДобавлено: 21 Авг 2010 08:17    Заголовок сообщения: Ответить с цитатой


Язык племени Майя разгадан.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Valeriy
Site Admin
цитировать



Репутация: 0    

Зарегистрирован: 11.01.2009
Сообщения: 839
Откуда: Москва (Кострома)

СообщениеДобавлено: 26 Ноя 2011 12:29    Заголовок сообщения: Ответить с цитатой








.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Имя
Сообщение

Смайлики
Very Happy Смеется Улыбка Smile
Грустный Sad Surprised Shocked
Confused Cool В очках LOL
Mad Razz Embarassed Crying or Very sad
Evil or Very Mad Twisted Evil Rolling Eyes Wink
Дополнительные смайлики

 • Добавить изображение
 
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов МРК "МУССОН" -> Математическое и компьютерное моделирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах

В. Михайлов "Фарс и Трагедия МУССОНА"

Г. Пасько "А город подумал – ученья идут..."

Rambler's Top100



Powered by phpBB © 2001, 2005 phpBB Group
Вы можете бесплатно создать форум на MyBB2.ru, RSS