Changeset 5 for trunk/SharpMz800.pas


Ignore:
Timestamp:
Apr 18, 2026, 7:24:02 PM (9 days ago)
Author:
chronos
Message:
  • Added: Some I/O ports handling.
  • Added: Messages form for capturing error messages.
  • Added: Go to address action.
  • Added: Allow to view all used memory areas in Memory window.
  • Added: Allow to reset CPU execution.
  • Modified: Improved memory mapping for MZ-700 and MZ-800 modes.
  • Fixed: Focusing currently executed instruction position.
  • Fixed: Wrong order or 8-bit registers in 16-bit pair.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SharpMz800.pas

    r4 r5  
    44
    55uses
    6   Classes, SysUtils, CpuZ80, Memory;
     6  Classes, SysUtils, CpuZ80, Memory, Base;
    77
    88type
     9  TMode = (md800, md700);
     10  TResolution = (rs320x200, rs640x200);
     11
    912  { TSharpMz800 }
    1013
    1114  TSharpMz800 = class
    1215  private
     16    WriteFormatRegister: Byte; // WF
     17    ReadFormatRegister: Byte; // RF
     18    DisplayModeRegister: Byte; // DMD
     19    MemoryBankControl: array[0..6] of Byte;
     20    FOnMessage: TMessageEvent;
     21    Mode: TMode;
     22    Resolution: TResolution;
     23    procedure CpuWrite(Address: Word; Data: Byte);
     24    function CpuRead(Address: Word): Byte;
     25    function CpuInput(Address: Word): Byte;
     26    procedure CpuOutput(Address: Word; Data: Byte);
     27    procedure MesssageExecute(Text: string);
     28    procedure UpdateMemoryMapping;
    1329  public
    1430    Cpu: TCpuZ80;
     
    1935    CharacterRom: TMemoryData;
    2036    MappedMemory: TMemoryMapped;
    21     procedure CpuWrite(Address: Word; Data: Byte);
    22     function CpuRead(Address: Word): Byte;
     37    MappedIO: TMemoryIO;
    2338    procedure PowerOn;
    2439    procedure PowerOff;
    2540    constructor Create;
    2641    destructor Destroy; override;
     42    property OnMessage: TMessageEvent read FOnMessage write FOnMessage;
    2743  end;
    2844
     
    4258end;
    4359
     60function TSharpMz800.CpuInput(Address: Word): Byte;
     61begin
     62  Result := 0;
     63end;
     64
     65procedure TSharpMz800.CpuOutput(Address: Word; Data: Byte);
     66begin
     67  case Address of
     68    $cc: WriteFormatRegister := Data;
     69    $cd: ReadFormatRegister := Data;
     70    $ce: begin
     71      DisplayModeRegister := Data;
     72      if (DisplayModeRegister and 8) <> 0 then Mode := md700 else Mode := md800;
     73      if (DisplayModeRegister and 4) <> 0 then Resolution := rs320x200 else Resolution := rs640x200;
     74      UpdateMemoryMapping;
     75    end;
     76    $e0..$e6: MemoryBankControl[Address - $e0] := Data;
     77  end;
     78end;
     79
     80procedure TSharpMz800.MesssageExecute(Text: string);
     81begin
     82  if Assigned(FOnMessage) then FOnMessage(Text);
     83end;
     84
     85procedure TSharpMz800.UpdateMemoryMapping;
     86begin
     87  MappedMemory.Areas.Clear;
     88  MappedMemory.Areas.AddNew($0, BaseRom);
     89  case Mode of
     90    md700: begin
     91      MappedMemory.Areas.AddNew($d000, VideoRam);
     92      VideoRam.Size := $1000;
     93      MappedMemory.Areas.AddNew($e000, MappedIO);
     94      MappedMemory.Areas.AddNew($e010, ExtendedRom);
     95    end;
     96    md800: begin
     97      MappedMemory.Areas.AddNew($1000, CharacterRom);
     98      MappedMemory.Areas.AddNew($8000, VideoRam);
     99      VideoRam.Size := $1000;
     100      MappedMemory.Areas.AddNew($e000, ExtendedRom);
     101    end;
     102  end;
     103  MappedMemory.Areas.AddNew($0, Memory);
     104end;
     105
    44106procedure TSharpMz800.PowerOn;
    45107begin
     
    56118  RomSubDir = 'ROM';
    57119begin
     120  Mode := md800;
     121  Resolution := rs320x200;
    58122  Memory := TMemoryData.Create;
     123  Memory.Title := 'Main memory';
    59124  Memory.Size := 65536; // $10000
    60125  BaseRom := TMemoryData.Create;
     126  BaseRom.Title := 'Base ROM';
    61127  BaseRom.LoadFromFile(RomSubDir + DirectorySeparator + 'MZ700A.ROM');
    62128  ExtendedRom := TMemoryData.Create;
     129  ExtendedRom.Title := 'Extended ROM';
    63130  ExtendedRom.LoadFromFile(RomSubDir + DirectorySeparator + '9Z_504M.ROM');
    64131  CharacterRom := TMemoryData.Create;
     132  CharacterRom.Title := 'Character ROM (CGROM)';
    65133  CharacterRom.LoadFromFile(RomSubDir + DirectorySeparator + 'CGROM.ROM');
    66134  VideoRam := TMemoryData.Create;
     135  VideoRam.Title := 'Video memory (VRAM)';
    67136  VideoRam.Size := 4096; // $1000
    68137  MappedMemory := TMemoryMapped.Create;
    69138  MappedMemory.Size := $10000;
    70   MappedMemory.Areas.AddNew($0, BaseRom);
    71   MappedMemory.Areas.AddNew($1000, CharacterRom);
    72   MappedMemory.Areas.AddNew($e000, ExtendedRom);
    73   MappedMemory.Areas.AddNew($0, Memory);
     139  MappedIO := TMemoryIO.Create;
     140  MappedIO.Title := 'Mapped I/O';
     141  MappedIO.Size := 8;
     142  MappedIO.BasePort := $d0;
     143  UpdateMemoryMapping;
    74144  Cpu := TCpuZ80.Create;
    75145  Cpu.Memory := MappedMemory;
    76146  Cpu.OnRead := CpuRead;
    77147  Cpu.OnWrite := CpuWrite;
     148  Cpu.OnInput := CpuInput;
     149  Cpu.OnOutput := CpuOutput;
     150  Cpu.OnMessage := MesssageExecute;
    78151end;
    79152
     
    87160  FreeAndNil(ExtendedRom);
    88161  FreeAndNil(Memory);
     162  FreeAndNil(MappedIO);
    89163  inherited;
    90164end;
Note: See TracChangeset for help on using the changeset viewer.