Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MZT出力の追加とCMT不具合の修正 #384

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions AILZ80ASM/Assembler/AsmCommandLine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ public static RootCommand SettingRootCommand()
new Parameter { Name = "hex", ShortCut = "-hex", Description = "出力ファイルをHEX形式で出力します。" },
new Parameter { Name = "t88", ShortCut = "-t88", Description = "出力ファイルをT88形式で出力します。" },
new Parameter { Name = "cmt", ShortCut = "-cmt", Description = "出力ファイルをCMT形式で出力します。" },
new Parameter { Name = "mzt", ShortCut = "-mzt", Description = "出力ファイルをMZT形式で出力します。" },
new Parameter { Name = "sym", ShortCut = "-sym", Description = "シンボルファイルを出力します。" },
new Parameter { Name = "equ", ShortCut = "-equ", Description = "イコールラベルファイルを出力します。" },
new Parameter { Name = "lst", ShortCut = "-lst", Description = "リストファイルを出力します。" },
Expand Down Expand Up @@ -143,6 +144,17 @@ public static RootCommand SettingRootCommand()
Required = false,
IsShortCut = true,
DefaultFunc = (options) => { return GetDefaulFilename(options, ".cmt"); }
});


rootCommand.AddOption(new Option<FileInfo>() {
Name = "outputMZT",
ArgumentName = "file",
Aliases = new[] { "-mzt" },
Description = "MZT形式で出力します。(file名は省略可能)",
Required = false,
IsShortCut = true,
DefaultFunc = (options) => { return GetDefaulFilename(options, ".mzt"); }
});

rootCommand.AddOption(new Option<FileInfo>()
Expand Down Expand Up @@ -443,6 +455,7 @@ public static RootCommand SettingRootCommand()
"hex" => AsmEnum.FileTypeEnum.HEX,
"t88" => AsmEnum.FileTypeEnum.T88,
"cmt" => AsmEnum.FileTypeEnum.CMT,
"mzt" => AsmEnum.FileTypeEnum.MZT,
"lst" => AsmEnum.FileTypeEnum.LST,
"sym" => AsmEnum.FileTypeEnum.SYM,
"equ" => AsmEnum.FileTypeEnum.EQU,
Expand Down
1 change: 1 addition & 0 deletions AILZ80ASM/Assembler/AsmEnum.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public enum FileTypeEnum
HEX,
T88,
CMT,
MZT,
LST,
SYM,
EQU,
Expand Down
74 changes: 74 additions & 0 deletions AILZ80ASM/IO/MZTBinaryWriter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AILZ80ASM.IO
{
public class MZTBinaryWriter
{
private UInt32 Elapse { get; set; } = 0;
private string Filename { get; set; }
private UInt16 StartAddress { get; set; }
private UInt16 EntryAddress { get; set; }
private Stream Stream { get; set; }
private byte[] Buffer { get; set; }

public MZTBinaryWriter(string filename, UInt16 startAddress, UInt16 entryAddress, byte[] buffer, Stream stream)
{
Filename = filename;
StartAddress = startAddress;
EntryAddress = entryAddress;

Buffer = buffer;
Stream = stream;
}

public void Write()
{
WriteHeader();
WriteStream(Buffer);
}

private void WriteStream(byte target)
{
Stream.Write(new byte[] { (byte)target });
}

private void WriteStream(byte[] buffer)
{
WriteStream(buffer, 0, buffer.Length);
}

private void WriteStream(byte[] buffer, int offset, int count)
{
Stream.Write(buffer, offset, count);
}

private void WriteStream(UInt16 target)
{
Stream.Write(new byte[] { (byte)target, (byte)(target >> 8) });
}


private void WriteHeader()
{
// (0x01)File Mode
WriteStream((byte)0x01);

// (0x11)Filename + CR
var filenameString = (Filename.ToUpper() + new string('\x0d', 17)).Substring(0, 17);
WriteStream(Encoding.ASCII.GetBytes(filenameString));

// (0x06)size, offset, start
WriteStream((ushort)(Buffer.Length));
WriteStream((ushort)(StartAddress));
WriteStream((ushort)(EntryAddress));

// (0x68)rest
WriteStream(new byte[0x68]);
}
}
}
3 changes: 3 additions & 0 deletions AILZ80ASM/Package.cs
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,9 @@ public void SaveOutput(Stream stream, KeyValuePair<AsmEnum.FileTypeEnum, FileInf
case AsmEnum.FileTypeEnum.CMT:
SaveCMT(stream);
break;
case AsmEnum.FileTypeEnum.MZT:
SaveMZT(stream, outputFile.Value.Name);
break;
case AsmEnum.FileTypeEnum.LST:
SaveLST(stream);
break;
Expand Down
9 changes: 6 additions & 3 deletions AILZ80ASM/Package/Outputs/Package_CMT.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,12 @@ public partial class Package
public void SaveCMT(Stream stream)
{
using var memoryStream = new MemoryStream();
SaveBin(memoryStream);

var address = AssembleLoad.Share.EntryPoint ?? default(UInt16);
SaveBin(memoryStream);

var address = default(UInt16);
if (AssembleLoad.Share.AsmORGs.Count >= 2) {
address = AssembleLoad.Share.AsmORGs.Where(o => o.OutputAddress != null).OrderBy(o => o.OutputAddress).First().ProgramAddress;
}
var binaryWriter = new IO.CMTBinaryWriter(address, memoryStream.ToArray(), stream);
binaryWriter.Write();
}
Expand Down
30 changes: 30 additions & 0 deletions AILZ80ASM/Package/Outputs/Package_MZT.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace AILZ80ASM
{
public partial class Package
{
public void SaveMZT(Stream stream, string outputFilename)
{
using var memoryStream = new MemoryStream();
SaveBin(memoryStream);

var startAddress = default(UInt16);
if (AssembleLoad.Share.AsmORGs.Count >= 2) {
startAddress = AssembleLoad.Share.AsmORGs.Where(o => o.OutputAddress != null).OrderBy(o => o.OutputAddress).First().ProgramAddress;
}

var entryAddress = AssembleLoad.Share.EntryPoint ?? startAddress;


var binaryWriter = new IO.MZTBinaryWriter(outputFilename, startAddress, entryAddress, memoryStream.ToArray(), stream);
binaryWriter.Write();
}
}
}
3 changes: 2 additions & 1 deletion AILZ80ASM/Properties/launchSettings.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"profiles": {
"AILZ80ASM": {
"commandName": "Project"
"commandName": "Project",
"commandLineArgs": "-mzt -f -i ..\\test.asm"
}
}
}
Loading