From 8a241ddf50aa730e9e6b30bb85e453ab10498fa5 Mon Sep 17 00:00:00 2001 From: edmccard Date: Wed, 14 Mar 2012 08:24:35 -0400 Subject: [PATCH] Compile with latest dmd/gtkd/Derelict2 --- src/Makefile | 8 +- src/d6502/base.d | 2 +- src/d6502/cmos.d | 8 +- src/d6502/cpu.d | 44 +-- src/d6502/nmosbase.d | 2 + src/d6502/nmosundoc.d | 12 +- src/device/base.d | 6 +- src/device/keyboard.d | 2 +- src/host.d | 4 +- src/iomem.d | 8 +- src/memory.d | 11 +- src/peripheral/diskii.d | 38 +-- src/peripheral/langcard.d | 6 +- src/sndfile.d | 653 -------------------------------------- src/system/base.d | 2 +- src/timer.d | 6 +- src/twoapple.d | 6 +- src/ui/inputevents.d | 20 +- src/ui/mainwindow.d | 22 +- src/ui/monitor.d | 3 + src/ui/sound.d | 5 +- src/ui/textinput.d | 2 +- src/video/laz_engine.d | 12 +- src/video/offsets.d | 7 +- src/video/patterns.d | 18 +- src/video/scanner.d | 6 +- src/video/signal.d | 4 +- 27 files changed, 146 insertions(+), 771 deletions(-) delete mode 100644 src/sndfile.d diff --git a/src/Makefile b/src/Makefile index d4a195c..73b596d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,10 +1,10 @@ DMD_OPTS = -c -version=CycleAccuracy -op -Jdata -I$(GTKD)/src -I$(GTKD)/srcgl \ - -I$(DERELICT)/DerelictSDL -I$(DERELICT)/DerelictUtil + -I$(DERELICT)/import -GCC_OPTS = -m32 -lpthread -lm -lGL -ldl \ - -L$(DMDROOT)/dmd/lib -lphobos \ +GCC_OPTS = -m32 -lpthread -lm -lGL -ldl -lrt \ -L$(GTKD) -lgtkd -lgtkdgl \ - -L$(DERELICT)/lib -lDerelictSDL -lDerelictUtil + -L$(DERELICT)/lib -lDerelictSDL -lDerelictUtil \ + -lphobos2 -ldruntime ALL_SRC = $(shell find -name "*.d") ALL_OBJS = $(ALL_SRC:%.d=%.o) diff --git a/src/d6502/base.d b/src/d6502/base.d index 9adf295..c85eb9e 100644 --- a/src/d6502/base.d +++ b/src/d6502/base.d @@ -74,7 +74,7 @@ class CpuBase ushort programCounter; ubyte accumulator, xIndex, yIndex, stackPointer; - final StatusRegister flag; + StatusRegister flag; bool signalActive, irqActive, resetActive, nmiActive, nmiArmed; diff --git a/src/d6502/cmos.d b/src/d6502/cmos.d index 4aaad7f..abd4279 100644 --- a/src/d6502/cmos.d +++ b/src/d6502/cmos.d @@ -20,6 +20,8 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ +module d6502.cmos; + import d6502.base; import d6502.cpu; @@ -214,7 +216,7 @@ class Cmos : Cpu { ushort vector = readWordOperand(); peek(programCounter); - programCounter = readWord(vector, vector + 1); + programCounter = readWord(vector, cast(ushort)(vector + 1)); version(CumulativeCycles) ticks(totalCycles); } @@ -223,8 +225,8 @@ class Cmos : Cpu { baseAddress = readWordOperand(); peek(programCounter); - ushort vector = baseAddress + xIndex; - programCounter = readWord(vector, vector + 1); + ushort vector = cast(ushort)(baseAddress + xIndex); + programCounter = readWord(vector, cast(ushort)(vector + 1)); version(CumulativeCycles) ticks(totalCycles); } diff --git a/src/d6502/cpu.d b/src/d6502/cpu.d index 56ca39f..06a772f 100644 --- a/src/d6502/cpu.d +++ b/src/d6502/cpu.d @@ -20,6 +20,8 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ +module d6502.cpu; + import d6502.base; class Cpu : CpuBase @@ -145,7 +147,7 @@ class Cpu : CpuBase pushWord(programCounter); push(statusByte); flag.interrupt = true; - programCounter = readWord(vector, vector + 1); + programCounter = readWord(vector, cast(ushort)(vector + 1)); version(CumulativeCycles) ticks(totalCycles); } @@ -290,7 +292,8 @@ class Cpu : CpuBase { peek(programCounter); baseAddress = programCounter; - programCounter = tryShortcut(false, programCounter + offset); + programCounter = tryShortcut(false, + cast(ushort)(programCounter + offset)); } final void addrZeropage() @@ -328,20 +331,23 @@ class Cpu : CpuBase final void addrAbsoluteX(bool write) { baseAddress = readWordOperand(); - primaryAddress = tryShortcut(write, baseAddress + xIndex); + primaryAddress = tryShortcut(write, + cast(ushort)(baseAddress + xIndex)); } final void addrAbsoluteY(bool write) { baseAddress = readWordOperand(); - primaryAddress = tryShortcut(write, baseAddress + yIndex); + primaryAddress = tryShortcut(write, + cast(ushort)(baseAddress + yIndex)); } final void addrIndirectY(bool write) { ubyte vector = readByteOperand(); baseAddress = readWord(vector, cast(ubyte)(vector + 1)); - primaryAddress = tryShortcut(write, baseAddress + yIndex); + primaryAddress = tryShortcut(write, + cast(ushort)(baseAddress + yIndex)); } void dec_addWithCarry(ubyte val) @@ -352,17 +358,17 @@ class Cpu : CpuBase bcdSum = (bcdSum - 10) | 0x10; bcdSum += (accumulator & 0xF0) + (val & 0xF0); - flag.negative_ = bcdSum; + flag.negative_ = cast(ubyte)bcdSum; flag.overflow = (!((accumulator ^ val) & 0x80)) && ((val ^ bcdSum) & 0x80); if (bcdSum > 0x9f) bcdSum += 0x60; - flag.zero_ = accumulator + val + (flag.carry ? 1 : 0); + flag.zero_ = cast(ubyte)(accumulator + val + (flag.carry ? 1 : 0)); flag.carry = (bcdSum > 0xFF); - accumulator = bcdSum; + accumulator = cast(ubyte)bcdSum; } void dec_subWithCarry(ubyte val) @@ -385,9 +391,9 @@ class Cpu : CpuBase ah -= 6; flag.carry = (diff < 0x100); - flag.zero_ = flag.negative_ = diff; + flag.zero_ = flag.negative_ = cast(ubyte)diff; - accumulator = (ah << 4) + (al & 0x0F); + accumulator = cast(ubyte)((ah << 4) + (al & 0x0F)); } final void hex_addWithCarry(ubyte val) @@ -398,7 +404,7 @@ class Cpu : CpuBase (!((accumulator ^ val) & 0x80)) && ((val ^ sum) & 0x80); flag.carry = (sum > 0xFF); - flag.zero_ = flag.negative_ = (accumulator = sum); + flag.zero_ = flag.negative_ = (accumulator = cast(ubyte)sum); } final void hex_subWithCarry(ubyte val) @@ -410,13 +416,13 @@ class Cpu : CpuBase ((accumulator ^ val) & 0x80); flag.carry = (diff < 0x100); - flag.zero_ = flag.negative_ = (accumulator = diff); + flag.zero_ = flag.negative_ = (accumulator = cast(ubyte)diff); } final ubyte compare(ubyte reg, ubyte val) { flag.carry = (reg >= val); - return reg - val; + return cast(ubyte)(reg - val); } final void bitTest(ubyte val) @@ -429,14 +435,14 @@ class Cpu : CpuBase final ubyte shiftLeft(ubyte val) { flag.carry = (val > 0x7F); - return val << 1; + return cast(ubyte)(val << 1); } final ubyte rotateLeft(ubyte val) { bool oldCarry = flag.carry; flag.carry = (val > 0x7F); - val = (val << 1 | (oldCarry ? 1 : 0)); + val = cast(ubyte)(val << 1 | (oldCarry ? 1 : 0)); return val; } @@ -456,12 +462,12 @@ class Cpu : CpuBase final ubyte increment(ubyte val) { - return val + 1; + return cast(ubyte)(val + 1); } final ubyte decrement(ubyte val) { - return val - 1; + return cast(ubyte)(val - 1); } static string SimpleOpcode(string name, string opcode, string action) @@ -501,7 +507,7 @@ class Cpu : CpuBase { int opcode = opcodes[op]; modes ~= "[\"" ~ hexByte(opcode) ~ "\", \""; - switch ((opcode & 0b00011100) >> 2) + final switch ((opcode & 0b00011100) >> 2) { case 0: modes ~= "IndirectX()"; @@ -544,7 +550,7 @@ class Cpu : CpuBase { int opcode = opcodes[op]; modes ~= "[\"" ~ hexByte(opcode) ~ "\", \""; - switch ((opcode & 0b00011100) >> 2) + final switch ((opcode & 0b00011100) >> 2) { case 0: modes ~= "Immediate"; diff --git a/src/d6502/nmosbase.d b/src/d6502/nmosbase.d index df1749f..e1fef0e 100644 --- a/src/d6502/nmosbase.d +++ b/src/d6502/nmosbase.d @@ -20,6 +20,8 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ +module d6502.nmosbase; + import d6502.cpu; class NmosBase : Cpu diff --git a/src/d6502/nmosundoc.d b/src/d6502/nmosundoc.d index 631e4d8..b2cab69 100644 --- a/src/d6502/nmosundoc.d +++ b/src/d6502/nmosundoc.d @@ -20,6 +20,8 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ +module d6502.nmosundoc; + import d6502.base; import d6502.nmosbase; @@ -41,7 +43,7 @@ class NmosUndoc : NmosBase { version(Commodore64) { - ubyte hiAddr = ((primaryAddress >> 8) + 1); + ubyte hiAddr = cast(ubyte)((primaryAddress >> 8) + 1); val = val & hiAddr; ushort addr = (badAddress == primaryAddress) ? primaryAddress : ((val << 8) | (primaryAddress & 0xFF)); @@ -49,7 +51,7 @@ class NmosUndoc : NmosBase } else { - ubyte hiAddr = ((baseAddress >> 8) + 1); + ubyte hiAddr = cast(ubyte)((baseAddress >> 8) + 1); writeFinal(primaryAddress, val & hiAddr); } } @@ -62,7 +64,7 @@ class NmosUndoc : NmosBase { int opcode = opcodes[op]; modes ~= "[\"" ~ hexByte(opcode) ~ "\", \""; - switch ((opcode & 0b00011100) >> 2) + final switch ((opcode & 0b00011100) >> 2) { case 0: modes ~= "IndirectX()"; @@ -221,7 +223,7 @@ class NmosUndoc : NmosBase readVal = operand1 = readFinal(programCounter); ubyte val = readVal & accumulator; if (flag.decimal) { - ubyte temp = (val >> 1) + (flag.carry ? 0x80 : 0); + ubyte temp = cast(ubyte)((val >> 1) + (flag.carry ? 0x80 : 0)); flag.zero_ = flag.negative_ = temp; flag.overflow = (((temp ^ val) & 0x40) != 0); if ((readVal & 0x0F) + (val & 0x01) > 5) @@ -236,7 +238,7 @@ class NmosUndoc : NmosBase accumulator = temp; } else { - accumulator = (val >> 1) + (flag.carry ? 0x80 : 0); + accumulator = cast(ubyte)((val >> 1) + (flag.carry ? 0x80 : 0)); flag.zero_ = flag.negative_ = accumulator; val >>= 7; flag.carry = (val != 0); diff --git a/src/device/base.d b/src/device/base.d index acb8c04..efa79cf 100644 --- a/src/device/base.d +++ b/src/device/base.d @@ -51,7 +51,7 @@ string InitSwitches(string superCall, string[][] switches) } initFunc ~= - "ubyte offset = (slot == -1) ? 0 : slot * 16;\n"; + "ubyte offset = cast(ubyte)((slot == -1) ? 0 : slot * 16);\n"; string switchFuncs; @@ -120,13 +120,13 @@ string MakeSwitch(int[] addrs, string type, string wrapped) string rSwitch, wSwitch, args; realWrapped = wrapped; - if (wrapped[length - 1] == ')') + if (wrapped[$ - 1] == ')') { for (int pos = 0; pos < wrapped.length; ++pos) { if (wrapped[pos] == '(') { - args = wrapped[(pos + 1) .. (length - 1)]; + args = wrapped[(pos + 1) .. ($ - 1)]; realWrapped = wrapped[0 .. pos]; break; } diff --git a/src/device/keyboard.d b/src/device/keyboard.d index 9b58a23..e856fae 100644 --- a/src/device/keyboard.d +++ b/src/device/keyboard.d @@ -161,7 +161,7 @@ class Keyboard keyStrobe = true; // assert latch < 0x80; XXX - latch = presses.read(); + latch = cast(ubyte)presses.read(); keysDown[presses.read()] = true; } diff --git a/src/host.d b/src/host.d index 4653889..b249aa1 100644 --- a/src/host.d +++ b/src/host.d @@ -25,6 +25,7 @@ module host; import std.c.time; import std.c.linux.linux; import std.stdio; +import std.conv; import derelict.sdl.sdl; import derelict.util.exception; @@ -36,7 +37,6 @@ static this() try { DerelictSDL.load(); - writefln("Loaded lib = %s", DerelictSDL.libName); } catch (DerelictException e) { @@ -45,7 +45,7 @@ static this() } if (SDL_Init(0) == -1) { - writefln("%s", std.string.toString(SDL_GetError())); + writefln("%s", to!string(SDL_GetError())); return; } SDL = true; diff --git a/src/iomem.d b/src/iomem.d index 818443a..954c2aa 100644 --- a/src/iomem.d +++ b/src/iomem.d @@ -27,7 +27,7 @@ import system.peripheral; import peripheral.base; import device.base; -import std.string; +import std.conv; class IOMem { @@ -39,7 +39,9 @@ class IOMem this(int slotNum_, ubyte[] rom) { - super(0xC000 + (slotNum_ * 0x100), 0x0100, rom); + super( + cast(ushort)(0xC000 + (slotNum_ * 0x100)), + cast(uint)0x0100, rom); slotNum = slotNum_; } @@ -106,7 +108,7 @@ class IOMem { selectMem[slot] = new IOSelectMem(slot, card.ioSelectROM); selectMem[slot].debugName = - "Slot " ~ std.string.toString(slot) ~ " ROM"; + "Slot " ~ to!string(slot) ~ " ROM"; decoder.install(selectMem[slot]); if (card.ioStrobeROM !is null) { diff --git a/src/memory.d b/src/memory.d index cc88515..c4ea8f5 100644 --- a/src/memory.d +++ b/src/memory.d @@ -20,12 +20,12 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ -import std.string; +import std.conv; class Memory { - final ushort baseAddress; - final uint blockSize; + ushort baseAddress; + uint blockSize; string debugName; this(ushort baseAddr, uint size) @@ -143,7 +143,7 @@ class BankMem : DataMem { for (int n = 0; n < debugNames.length; ++n) { - debugNames[n] = name ~ " bank " ~ std.string.toString(n); + debugNames[n] = name ~ " bank " ~ to!string(n); } } else @@ -195,8 +195,7 @@ class SubBankMem : DataMem { for (int n = 0; n < numSubBanks; ++n) { - debugNames[b][n] = names[b] ~ " bank " ~ - std.string.toString(n); + debugNames[b][n] = names[b] ~ " bank " ~ to!string(n); } } } diff --git a/src/peripheral/diskii.d b/src/peripheral/diskii.d index 15a9165..2c34acf 100644 --- a/src/peripheral/diskii.d +++ b/src/peripheral/diskii.d @@ -269,7 +269,7 @@ class DriveStatus import gtk.Label; import gtkc.pangotypes; - import std.string; + import std.conv; Drive drive; HBox display; @@ -285,7 +285,7 @@ class DriveStatus { drive = drive_; - statusClean = "Drive " ~ std.string.toString(driveNum); + statusClean = "Drive " ~ to!string(driveNum); statusDirty = "( " ~ statusClean ~ " )"; activity = new ProgressBar(); activity.setText(statusClean); @@ -520,19 +520,19 @@ class Drive actions.length = buttons.length = 2 + (indirect ? 1 : 0) + ((firstAction !is null) ? 1 : 0); - actions[length - 1] = cancel; - buttons[length - 1] = "Cancel"; + actions[$ - 1] = cancel; + buttons[$ - 1] = "Cancel"; if (indirect) { - actions[length - 2] = noSave; - buttons[length - 2] = "Don't save"; - actions[length - 3] = saveAsNib; - buttons[length - 3] = "Save as NIB"; + actions[$ - 2] = noSave; + buttons[$ - 2] = "Don't save"; + actions[$ - 3] = saveAsNib; + buttons[$ - 3] = "Save as NIB"; } else { - actions[length - 2] = saveAsNib; - buttons[length - 2] = "Save as NIB"; + actions[$ - 2] = saveAsNib; + buttons[$ - 2] = "Save as NIB"; } if (firstAction !is null) { @@ -782,8 +782,8 @@ class DSKImage : ExternalImage check1 = (checkHi << 8) | checkLo; stream.read(checkLo); stream.read(checkHi); check2 = (checkHi << 8) | checkLo; - match1 = ((s == 2) ? 0 : (s - 1)); - match2 = ((s == 5) ? 0 : (s + 1)); + match1 = cast(ushort)(((s == 2) ? 0 : (s - 1))); + match2 = cast(ushort)(((s == 5) ? 0 : (s + 1))); if ((check1 != match1) || (check2 != match2)) return false; } return true; @@ -830,9 +830,9 @@ class DSKImage : ExternalImage loadBytes(ADDR_PROLOGUE[0..3]); encode44(0xFE); // volume - encode44(track); + encode44(cast(ubyte)track); encode44(sector); - encode44(0xFE ^ track ^ sector); // check byte + encode44(cast(ubyte)(0xFE ^ track ^ sector)); // check byte loadBytes(EPILOGUE[0..2]); } @@ -885,13 +885,13 @@ class DSKImage : ExternalImage // index 0 from data 0, 86, 172 trackData[x] = - (trackData[x] << 2) | - (((val & 0x01) << 1) | ((val & 0x02) >> 1)); + cast(ubyte)((trackData[x] << 2) | + (((val & 0x01) << 1) | ((val & 0x02) >> 1))); // index values 86 through 341 are composed of the six // most significant bits of data values 0 through 255 - trackData[y + 0x56] = (val >> 2); + trackData[y + 0x56] = cast(ubyte)(val >> 2); --x; if (x >= 0x00) continue; @@ -1061,9 +1061,9 @@ class DSKImage : ExternalImage for (int i = 0; i < 0x156; ++i) { if (sectorData[i] < 0x96) return false; - nibByte = memByte[sectorData[i] - 0x96]; + nibByte = cast(ubyte)(memByte[sectorData[i] - 0x96]); if (nibByte == -1) return false; - indexData[i] = lastByte ^ nibByte; + indexData[i] = cast(ubyte)(lastByte ^ nibByte); lastByte = indexData[i]; } diff --git a/src/peripheral/langcard.d b/src/peripheral/langcard.d index adebcab..d7d7b56 100644 --- a/src/peripheral/langcard.d +++ b/src/peripheral/langcard.d @@ -26,6 +26,8 @@ import peripheral.base; import device.base; import memory; +import std.conv; + private: string MakeRAMSwitches(bool isIIe) @@ -80,7 +82,7 @@ string CallRAMFunction(bool isIIe, string func) } } -static const string[][] langcardSwitches = [ +enum langcardSwitches = [ mixin(MakeSwitch([0xC080], "R0", "readC080")), mixin(MakeSwitch([0xC081], "R0", "readC081")), mixin(MakeSwitch([0xC082], "R0", "readC082")), @@ -314,7 +316,7 @@ class HighRam_IIe : HighRam if (numBanks > 1) { for (int b = 0; b < numBanks; ++b) - names[b] = name ~ " " ~ std.string.toString(b); + names[b] = name ~ " " ~ to!string(b); } else { diff --git a/src/sndfile.d b/src/sndfile.d deleted file mode 100644 index 9e2b0fc..0000000 --- a/src/sndfile.d +++ /dev/null @@ -1,653 +0,0 @@ -module sndfile; - -import derelict.util.loader; - -/+ - + The following file types can be read and written. - + A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise - + ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and - + SF_FORMAT_SUBMASK can be used to separate the major and minor file - + types. - +/ - -enum -{ - // Major formats. - SF_FORMAT_WAV = 0x010000, /+ Microsoft WAV format - (little endian default). +/ - SF_FORMAT_AIFF = 0x020000, // Apple/SGI AIFF format (big endian). - SF_FORMAT_AU = 0x030000, // Sun/NeXT AU format (big endian). - SF_FORMAT_RAW = 0x040000, // RAW PCM data. - SF_FORMAT_PAF = 0x050000, // Ensoniq PARIS file format. - SF_FORMAT_SVX = 0x060000, // Amiga IFF / SVX8 / SV16 format. - SF_FORMAT_NIST = 0x070000, // Sphere NIST format. - SF_FORMAT_VOC = 0x080000, // VOC files. - SF_FORMAT_IRCAM = 0x0A0000, // Berkeley/IRCAM/CARL - SF_FORMAT_W64 = 0x0B0000, // Sonic Foundry's 64 bit RIFF/WAV - SF_FORMAT_MAT4 = 0x0C0000, // Matlab (tm) V4.2 / GNU Octave 2.0 - SF_FORMAT_MAT5 = 0x0D0000, // Matlab (tm) V5.0 / GNU Octave 2.1 - SF_FORMAT_PVF = 0x0E0000, // Portable Voice Format - SF_FORMAT_XI = 0x0F0000, // Fasttracker 2 Extended Instrument - SF_FORMAT_HTK = 0x100000, // HMM Tool Kit format - SF_FORMAT_SDS = 0x110000, // Midi Sample Dump Standard - SF_FORMAT_AVR = 0x120000, // Audio Visual Research - SF_FORMAT_WAVEX = 0x130000, // MS WAVE with WAVEFORMATEX - SF_FORMAT_SD2 = 0x160000, // Sound Designer 2 - SF_FORMAT_FLAC = 0x170000, // FLAC lossless file format - SF_FORMAT_CAF = 0x180000, // Core Audio File format - - // Subtypes from here on. - - SF_FORMAT_PCM_S8 = 0x0001, // Signed 8 bit data - SF_FORMAT_PCM_16 = 0x0002, // Signed 16 bit data - SF_FORMAT_PCM_24 = 0x0003, // Signed 24 bit data - SF_FORMAT_PCM_32 = 0x0004, // Signed 32 bit data - - SF_FORMAT_PCM_U8 = 0x0005, /+ Unsigned 8 bit data - (WAV and RAW only) +/ - - SF_FORMAT_FLOAT = 0x0006, // 32 bit float data - SF_FORMAT_DOUBLE = 0x0007, // 64 bit float data - - SF_FORMAT_ULAW = 0x0010, // U-Law encoded. - SF_FORMAT_ALAW = 0x0011, // A-Law encoded. - SF_FORMAT_IMA_ADPCM = 0x0012, // IMA ADPCM. - SF_FORMAT_MS_ADPCM = 0x0013, // Microsoft ADPCM. - - SF_FORMAT_GSM610 = 0x0020, // GSM 6.10 encoding. - SF_FORMAT_VOX_ADPCM = 0x0021, // OKI / Dialogix ADPCM - - SF_FORMAT_G721_32 = 0x0030, // 32kbs G721 ADPCM encoding. - SF_FORMAT_G723_24 = 0x0031, // 24kbs G723 ADPCM encoding. - SF_FORMAT_G723_40 = 0x0032, // 40kbs G723 ADPCM encoding. - - SF_FORMAT_DWVW_12 = 0x0040, /+ 12 bit Delta Width Variable Word - encoding. +/ - SF_FORMAT_DWVW_16 = 0x0041, /+ 16 bit Delta Width Variable Word - encoding. +/ - SF_FORMAT_DWVW_24 = 0x0042, /+ 24 bit Delta Width Variable Word - encoding. +/ - SF_FORMAT_DWVW_N = 0x0043, /+ N bit Delta Width Variable Word - encoding. +/ - - SF_FORMAT_DPCM_8 = 0x0050, // 8 bit differential PCM (XI only) - SF_FORMAT_DPCM_16 = 0x0051, // 16 bit differential PCM (XI only) - - // Endian-ness options. - - SF_ENDIAN_FILE = 0x00000000, // Default file endian-ness. - SF_ENDIAN_LITTLE = 0x10000000, // Force little endian-ness. - SF_ENDIAN_BIG = 0x20000000, // Force big endian-ness. - SF_ENDIAN_CPU = 0x30000000, // Force CPU endian-ness. - - SF_FORMAT_SUBMASK = 0x0000FFFF, - SF_FORMAT_TYPEMASK = 0x0FFF0000, - SF_FORMAT_ENDMASK = 0x30000000 -} - -/+ - + The following are the valid command numbers for the sf_command() - + interface. The use of these commands is documented in the file - + command.html in the doc directory of the source code distribution. - +/ - -enum -{ - SFC_GET_LIB_VERSION = 0x1000, - SFC_GET_LOG_INFO = 0x1001, - - SFC_GET_NORM_DOUBLE = 0x1010, - SFC_GET_NORM_FLOAT = 0x1011, - SFC_SET_NORM_DOUBLE = 0x1012, - SFC_SET_NORM_FLOAT = 0x1013, - SFC_SET_SCALE_FLOAT_INT_READ = 0x1014, - - SFC_GET_SIMPLE_FORMAT_COUNT = 0x1020, - SFC_GET_SIMPLE_FORMAT = 0x1021, - - SFC_GET_FORMAT_INFO = 0x1028, - - SFC_GET_FORMAT_MAJOR_COUNT = 0x1030, - SFC_GET_FORMAT_MAJOR = 0x1031, - SFC_GET_FORMAT_SUBTYPE_COUNT = 0x1032, - SFC_GET_FORMAT_SUBTYPE = 0x1033, - - SFC_CALC_SIGNAL_MAX = 0x1040, - SFC_CALC_NORM_SIGNAL_MAX = 0x1041, - SFC_CALC_MAX_ALL_CHANNELS = 0x1042, - SFC_CALC_NORM_MAX_ALL_CHANNELS = 0x1043, - SFC_GET_SIGNAL_MAX = 0x1044, - SFC_GET_MAX_ALL_CHANNELS = 0x1045, - - SFC_SET_ADD_PEAK_CHUNK = 0x1050, - - SFC_UPDATE_HEADER_NOW = 0x1060, - SFC_SET_UPDATE_HEADER_AUTO = 0x1061, - - SFC_FILE_TRUNCATE = 0x1080, - - SFC_SET_RAW_START_OFFSET = 0x1090, - - SFC_SET_DITHER_ON_WRITE = 0x10A0, - SFC_SET_DITHER_ON_READ = 0x10A1, - - SFC_GET_DITHER_INFO_COUNT = 0x10A2, - SFC_GET_DITHER_INFO = 0x10A3, - - SFC_GET_EMBED_FILE_INFO = 0x10B0, - - SFC_SET_CLIPPING = 0x10C0, - SFC_GET_CLIPPING = 0x10C1, - - SFC_GET_INSTRUMENT = 0x10D0, - SFC_SET_INSTRUMENT = 0x10D1, - - SFC_GET_LOOP_INFO = 0x10E0, - - SFC_GET_BROADCAST_INFO = 0x10F0, - SFC_SET_BROADCAST_INFO = 0x10F1, - - // Following commands for testing only. - SFC_TEST_IEEE_FLOAT_REPLACE = 0x6001, - - /+ - + SFC_SET_ADD_* values are deprecated and will disappear at some - + time in the future. They are guaranteed to be here up to and - + including version 1.0.8 to avoid breakage of existng software. - + They currently do nothing and will continue to do nothing. - +/ - SFC_SET_ADD_DITHER_ON_WRITE = 0x1070, - SFC_SET_ADD_DITHER_ON_READ = 0x1071 -} - - -/+ - + String types that can be set and read from files. Not all file types - + support this and even the file types which support one, may not support - + all string types. - +/ - -enum -{ - SF_STR_TITLE = 0x01, - SF_STR_COPYRIGHT = 0x02, - SF_STR_SOFTWARE = 0x03, - SF_STR_ARTIST = 0x04, - SF_STR_COMMENT = 0x05, - SF_STR_DATE = 0x06 -} - -/+ - + Use the following as the start and end index when doing metadata - + transcoding. - +/ - -alias SF_STR_TITLE SF_STR_FIRST; -alias SF_STR_DATE SF_STR_LAST; - -enum -{ - // True and false - SF_FALSE = 0, - SF_TRUE = 1, - - // Modes for opening files. - SFM_READ = 0x10, - SFM_WRITE = 0x20, - SFM_RDWR = 0x30 -} - -/+ - + Public error values. These are guaranteed to remain unchanged for the - + duration of the library major version number. There are also a large number - + of private error numbers which are internal to the library which can change - + at any time. - +/ - -enum -{ - SF_ERR_NO_ERROR = 0, - SF_ERR_UNRECOGNISED_FORMAT = 1, - SF_ERR_SYSTEM = 2, - SF_ERR_MALFORMED_FILE = 3, - SF_ERR_UNSUPPORTED_ENCODING = 4 -} - - -// A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. -struct SNDFILE_tag {} -alias SNDFILE_tag SNDFILE; - -alias long sf_count_t; - -enum : long -{ - SF_COUNT_MAX = 0x7FFFFFFFFFFFFFFFL -} - -/+ - + A pointer to a SF_INFO structure is passed to sf_open_read() and filled in. - + On write, the SF_INFO structure is filled in by the user and passed into - + sf_open_write(). - +/ - -struct SF_INFO -{ - sf_count_t frames; /+ Used to be called samples. - Changed to avoid confusion. +/ - int samplerate; - int channels; - int format; - int sections; - int seekable; -} - -/+ - + The SF_FORMAT_INFO struct is used to retrieve information about the sound - + file formats libsndfile supports using the sf_command() interface. - + - + Using this interface will allow applications to support new file formats - + and encoding types when libsndfile is upgraded, without requiring - + re-compilation of the application. - + - + Please consult the libsndfile documentation (particularly the information - + on the sf_command() interface) for examples of its use. - +/ - -struct SF_FORMAT_INFO -{ - int format; - char* name; - char* extension; -} - -/+ - + Enums and typedefs for adding dither on read and write. - + See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE - + and SFC_SET_DITHER_ON_READ. - +/ - -enum -{ - SFD_DEFAULT_LEVEL = 0, - SFD_CUSTOM_LEVEL = 0x40000000, - - SFD_NO_DITHER = 500, - SFD_WHITE = 501, - SFD_TRIANGULAR_PDF = 502 -} - -struct SF_DITHER_INFO -{ - int type; - double level; - char* name; -} - -/+ - + Struct used to retrieve information about a file embedded within a - + larger file. See SFC_GET_EMBED_FILE_INFO. - +/ - -struct SF_EMBED_FILE_INFO -{ - sf_count_t offset; - sf_count_t length; -} - - -// Structs used to retrieve music sample information from a file. - -enum -{ - // The loop mode field in SF_INSTRUMENT will be one of the following. - SF_LOOP_NONE = 800, - SF_LOOP_FORWARD, - SF_LOOP_BACKWARD, - SF_LOOP_ALTERNATING -} - -struct SF_INSTRUMENT -{ - int gain; - byte basenote, detune; - byte velocity_lo, velocity_hi; - byte key_lo, key_hi; - int loop_count; - - struct __loops - { int mode; - uint start; - uint end; - uint count; - } - - __loops[16] loops; -} - - -// Struct used to retrieve loop information from a file. -struct SF_LOOP_INFO -{ - short time_sig_num; // any positive integer > 0 - short time_sig_den; // any positive power of 2 > 0 - int loop_mode; // see SF_LOOP enum - - int num_beats; /+ this is NOT the amount of quarter notes !!! - a full bar of 4/4 is 4 beats - a full bar of 7/8 is 7 beats +/ - - float bpm; /+ suggestion, as it can be calculated using other - fields (file's length, file's sampleRate and - our time_sig_den). bpms are always the amount - of _quarter notes_ per minute +/ - - int root_key; // MIDI note, or -1 for None - int[6] future; -} - - -/+ - + Struct used to retrieve broadcast (EBU) information from a file. - + Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE. - +/ -struct SF_BROADCAST_INFO -{ - byte[256] description; - byte[32] originator; - byte[32] originator_reference; - byte[10] origination_date; - byte[8] origination_time; - int time_reference_low; - int time_reference_high; - short version_; // XXX changed from version - byte[64] umid; - byte[190] reserved; - uint coding_history_size ; - byte[256] coding_history; -} - - -extern(C) alias sf_count_t function(void*) sf_vio_get_filelen; -extern(C) alias sf_count_t function(sf_count_t, int, void*) sf_vio_seek; -extern(C) alias sf_count_t function(void*, sf_count_t, void*) sf_vio_read; -extern(C) alias sf_count_t function(void*, sf_count_t, void*) sf_vio_write; -extern(C) alias sf_count_t function(void*) sf_vio_tell; - -struct SF_VIRTUAL_IO -{ - sf_vio_get_filelen get_filelen; - sf_vio_seek seek; - sf_vio_read read; - sf_vio_write write; - sf_vio_tell tell; -} - -private void loadsndfile(SharedLib lib) -{ - bindFunc(sf_open)("sf_open", lib); - bindFunc(sf_open_fd)("sf_open_fd", lib); - bindFunc(sf_open_virtual)("sf_open_virtual", lib); - bindFunc(sf_error)("sf_error", lib); - bindFunc(sf_strerror)("sf_strerror", lib); - bindFunc(sf_error_number)("sf_error_number", lib); - bindFunc(sf_perror)("sf_perror", lib); - bindFunc(sf_error_str)("sf_error_str", lib); - bindFunc(sf_command)("sf_command", lib); - bindFunc(sf_format_check)("sf_format_check", lib); - bindFunc(sf_seek)("sf_seek", lib); - bindFunc(sf_set_string)("sf_set_string", lib); - bindFunc(sf_get_string)("sf_get_string", lib); - bindFunc(sf_read_raw)("sf_read_raw", lib); - bindFunc(sf_write_raw)("sf_write_raw", lib); - bindFunc(sf_readf_short)("sf_readf_short", lib); - bindFunc(sf_writef_short)("sf_writef_short", lib); - bindFunc(sf_readf_int)("sf_readf_int", lib); - bindFunc(sf_writef_int)("sf_writef_int", lib); - bindFunc(sf_readf_float)("sf_readf_float", lib); - bindFunc(sf_writef_float)("sf_writef_float", lib); - bindFunc(sf_readf_double)("sf_readf_double", lib); - bindFunc(sf_writef_double)("sf_writef_double", lib); - bindFunc(sf_read_short)("sf_read_short", lib); - bindFunc(sf_write_short)("sf_write_short", lib); - bindFunc(sf_read_int)("sf_read_int", lib); - bindFunc(sf_write_int)("sf_write_int", lib); - bindFunc(sf_read_float)("sf_read_float", lib); - bindFunc(sf_write_float)("sf_write_float", lib); - bindFunc(sf_read_double)("sf_read_double", lib); - bindFunc(sf_write_double)("sf_write_double", lib); - bindFunc(sf_close)("sf_close", lib); - bindFunc(sf_write_sync)("sf_write_sync", lib); -} - -GenericLoader libsndfile; -static this() -{ - libsndfile.setup( - "libsndfile.dll", - "libsndfile.so, libsndfile.so.1", - "", - &loadsndfile); -} - -extern(C): - -/+ - + Open the specified file for read, write or both. On error, this will - + return a NULL pointer. To find the error number, pass a NULL SNDFILE - + to sf_perror() or sf_error_str(). - + All calls to sf_open() should be matched with a call to sf_close(). - +/ - -typedef SNDFILE* function(char* path, int mode, SF_INFO* sfinfo) pfsf_open; -pfsf_open sf_open; - -/+ - + Use the existing file descriptor to create a SNDFILE object. If close_desc - + is TRUE, the file descriptor will be closed when sf_close() is called. If - + it is FALSE, the descritor will not be closed. - + When passed a descriptor like this, the library will assume that the start - + of file header is at the current file offset. This allows sound files within - + larger container files to be read and/or written. - + On error, this will return a NULL pointer. To find the error number, pass a - + NULL SNDFILE to sf_perror() or sf_error_str(). - + All calls to sf_open_fd() should be matched with a call to sf_close(). - +/ - -typedef SNDFILE* function(int fd, int mode, SF_INFO* sfinfo, int close_desc) - pfsf_open_fd; -typedef SNDFILE* function(SF_VIRTUAL_IO* sfvirtual, int mode, SF_INFO* sfinfo, - void* user_data) pfsf_open_virtual; - -pfsf_open_fd sf_open_fd; -pfsf_open_virtual sf_open_virtual; - -/+ - + sf_error() returns a error number which can be translated to a text - + string using sf_error_number(). - +/ - -typedef int function(SNDFILE* sndfile) pfsf_error; -pfsf_error sf_error; - -/+ - + sf_strerror() returns to the caller a pointer to the current error message - + for the given SNDFILE. - +/ - -typedef char* function(SNDFILE* sndfile) pfsf_strerror; -pfsf_strerror sf_strerror; - -/+ - + sf_error_number() allows the retrieval of the error string for each - + internal error number. - +/ - -typedef char* function(int errnum) pfsf_error_number; -pfsf_error_number sf_error_number; - -/+ - + The following three error functions are deprecated but they will remain in - + the library for the forseeable future. The function sf_strerror() should be - + used in their place. - +/ - -typedef int function(SNDFILE* sndfile) pfsf_perror; -typedef int function(SNDFILE* sndfile, char* str, size_t len) pfsf_error_str; - -pfsf_perror sf_perror; -pfsf_error_str sf_error_str; - -/+ - + Return TRUE if fields of the SF_INFO struct are a valid combination of - + values. - +/ - -typedef int function(SNDFILE* sndfile, int command, void* data, int datasize) - pfsf_command; -pfsf_command sf_command; - -/+ - + Return TRUE if fields of the SF_INFO struct are a valid combination of - + values. - +/ - -typedef int function(SF_INFO* info) pfsf_format_check; -pfsf_format_check sf_format_check; - -/+ - + Seek within the waveform data chunk of the SNDFILE. sf_seek() uses - + the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as - + stdio.h function fseek(). - + An offset of zero with whence set to SEEK_SET will position the - + read / write pointer to the first data sample. - + On success sf_seek returns the current position in (multi-channel) - + samples from the start of the file. - + Please see the libsndfile documentation for moving the read pointer - + separately from the write pointer on files open in mode SFM_RDWR. - + On error all of these functions return -1. - +/ - -typedef sf_count_t function(SNDFILE* sndfile, sf_count_t frames, int whence) - pfsf_seek; -pfsf_seek sf_seek; - -/+ - + Functions for retrieving and setting string data within sound files. - + Not all file types support this features; AIFF and WAV do. For both - + functions, the str_type parameter must be one of the SF_STR_* values - + defined above. - + On error, sf_set_string() returns non-zero while sf_get_string() - + returns NULL. - +/ - -typedef int function(SNDFILE* sndfile, int str_type, char* str) - pfsf_set_string; -typedef char* function(SNDFILE* sndfile, int str_type) pfsf_get_string; - -pfsf_set_string sf_set_string; -pfsf_get_string sf_get_string; - -// Functions for reading/writing the waveform data of a sound file. - -typedef sf_count_t function(SNDFILE* sndfile, void* ptr, sf_count_t bytes) - pfsf_read_raw; -typedef sf_count_t function(SNDFILE* sndfile, void* ptr, sf_count_t bytes) - pfsf_write_raw; - -pfsf_read_raw sf_read_raw; -pfsf_write_raw sf_write_raw; - -/+ - + Functions for reading and writing the data chunk in terms of frames. - + The number of items actually read/written = frames * number of channels. - + sf_xxxx_raw read/writes the raw data bytes from/to the file - + sf_xxxx_short passes data in the native short format - + sf_xxxx_int passes data in the native int format - + sf_xxxx_float passes data in the native float format - + sf_xxxx_double passes data in the native double format - + All of these read/write function return number of frames read/written. - +/ - -typedef sf_count_t function(SNDFILE* sndfile, short* ptr, sf_count_t frames) - pfsf_readf_short; -typedef sf_count_t function(SNDFILE* sndfile, short* ptr, sf_count_t frames) - pfsf_writef_short; - -typedef sf_count_t function(SNDFILE* sndfile, int* ptr, sf_count_t frames) - pfsf_readf_int; -typedef sf_count_t function(SNDFILE* sndfile, int* ptr, sf_count_t frames) - pfsf_writef_int; - -typedef sf_count_t function(SNDFILE* sndfile, float* ptr, sf_count_t frames) - pfsf_readf_float; -typedef sf_count_t function(SNDFILE* sndfile, float* ptr, sf_count_t frames) - pfsf_writef_float; - -typedef sf_count_t function(SNDFILE* sndfile, double* ptr, sf_count_t frames) - pfsf_readf_double; -typedef sf_count_t function(SNDFILE* sndfile, double* ptr, sf_count_t frames) - pfsf_writef_double; - -pfsf_readf_short sf_readf_short; -pfsf_writef_short sf_writef_short; -pfsf_readf_int sf_readf_int; -pfsf_writef_int sf_writef_int; -pfsf_readf_float sf_readf_float; -pfsf_writef_float sf_writef_float; -pfsf_readf_double sf_readf_double; -pfsf_writef_double sf_writef_double; - -/+ - + Functions for reading and writing the data chunk in terms of items. - + Otherwise similar to above. - + All of these read/write function return number of items read/written. - +/ - -typedef sf_count_t function(SNDFILE* sndfile, short* ptr, sf_count_t items) - pfsf_read_short; -typedef sf_count_t function(SNDFILE* sndfile, short* ptr, sf_count_t items) - pfsf_write_short; - -typedef sf_count_t function(SNDFILE* sndfile, int* ptr, sf_count_t items) - pfsf_read_int; -typedef sf_count_t function(SNDFILE* sndfile, int* ptr, sf_count_t items) - pfsf_write_int; - -typedef sf_count_t function(SNDFILE* sndfile, float* ptr, sf_count_t items) - pfsf_read_float; -typedef sf_count_t function(SNDFILE* sndfile, float* ptr, sf_count_t items) - pfsf_write_float; - -typedef sf_count_t function(SNDFILE* sndfile, double* ptr, sf_count_t items) - pfsf_read_double; -typedef sf_count_t function(SNDFILE* sndfile, double* ptr, sf_count_t items) - pfsf_write_double; - -pfsf_read_short sf_read_short; -pfsf_write_short sf_write_short; -pfsf_read_int sf_read_int; -pfsf_write_int sf_write_int; -pfsf_read_float sf_read_float; -pfsf_write_float sf_write_float; -pfsf_read_double sf_read_double; -pfsf_write_double sf_write_double; - -/+ - + Close the SNDFILE and clean up all memory allocations associated with this - + file. - + Returns 0 on success, or an error number. - +/ - -typedef int function(SNDFILE* sndfile) pfsf_close; -pfsf_close sf_close; - -/+ - + If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file - + to force the writing of data to disk. If the file is opened SFM_READ - + no action is taken. - +/ - -typedef void function(SNDFILE* sndfile) pfsf_write_sync; -pfsf_write_sync sf_write_sync; - diff --git a/src/system/base.d b/src/system/base.d index bdc3b7c..79dd58b 100644 --- a/src/system/base.d +++ b/src/system/base.d @@ -56,7 +56,7 @@ class System mainRam = new PrimaryMem(0x0000, 0xC000); mainRam.debugName = "RAM"; mainRom = new Rom(0xD000, 0x3000, - romDump[(length-12288)..length]); + romDump[($-12288)..$]); mainRom.debugName = "ROM"; vidPages.lores1 = new SliceMem(0x0400, 0x0400, mainRam); vidPages.lores2 = new SliceMem(0x0800, 0x0400, mainRam); diff --git a/src/timer.d b/src/timer.d index 8d072db..8f78453 100644 --- a/src/timer.d +++ b/src/timer.d @@ -157,8 +157,8 @@ class Timer Cycle startCycle(uint maxVal) { cycles.length = cycles.length + 1; - cycles[length-1] = new Cycle(maxVal); - return cycles[length-1]; + cycles[$-1] = new Cycle(maxVal); + return cycles[$-1]; } void tick() @@ -189,7 +189,7 @@ main: for (int counter = 0; counter < counters.length; ++counter) private void addCounter(Counter newCounter) { counters.length = counters.length + 1; - counters[length-1] = newCounter; + counters[$-1] = newCounter; } private void initCounter(Counter newCounter) diff --git a/src/twoapple.d b/src/twoapple.d index f0332dc..4e5438b 100644 --- a/src/twoapple.d +++ b/src/twoapple.d @@ -29,7 +29,7 @@ import ui.sound; import ui.inputevents; import gthread.Thread; -import gtk.GtkD; +import gtk.Main; import glgdk.GLdInit; import gtkc.gdktypes; import gtkc.gtktypes; @@ -67,8 +67,8 @@ void main(string[] args) { // Init GTK Thread.init(null); - GtkD.init(args); - GLdInit.init(null, null); + Main.init(args); + GLdInit.init(args); // open config diff --git a/src/ui/inputevents.d b/src/ui/inputevents.d index be8f6a9..6dc88d2 100644 --- a/src/ui/inputevents.d +++ b/src/ui/inputevents.d @@ -23,13 +23,14 @@ module ui.inputevents; import std.stdio; +import std.conv; import gtkglc.glgdktypes; import gtk.Widget; import gtkc.gtktypes; import gtk.Image; import gtk.ToggleToolButton; -import gtk.GtkD; +import gtk.Main; import gtk.Timeout; import derelict.sdl.sdl; @@ -48,7 +49,7 @@ static this() { if (SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) == -1) { - writefln("%s", std.string.toString(SDL_GetError())); + writefln("%s", to!string(SDL_GetError())); return; } @@ -64,11 +65,10 @@ static this() device = SDL_JoystickOpen(i); if (device is null) { - writefln("%s", std.string.toString(SDL_GetError())); + writefln("%s", to!string(SDL_GetError())); continue; } - writefln("Joystick %s: %s", i, - std.string.toString(SDL_JoystickName(i))); + writefln("Joystick %s: %s", i, to!string(SDL_JoystickName(i))); joysticks[i] = new Joystick(device, SDL_JoystickNumAxes(device), @@ -135,7 +135,7 @@ class Input // XXX hackish way of setting "pause" button if (joysticks[i].pbForButton.length > 2) - joysticks[i].pbForButton[length - 1] = -2; + joysticks[i].pbForButton[$ - 1] = -2; } } @@ -154,7 +154,7 @@ class Input paddles = pdl; } - gboolean onKeyPress(GdkEventKey* evt, Widget w) + bool onKeyPress(GdkEventKey* evt, Widget w) { static const int KEY_PAUSE = 65299; // Pause/Break static const int KEY_ESCAPE = 65307; @@ -185,7 +185,7 @@ class Input return kbd.handlePress(evt.keyval, ctrl, evt.hardwareKeycode); } - gboolean onKeyRelease(GdkEventKey* evt, Widget w) + bool onKeyRelease(GdkEventKey* evt, Widget w) { static const int KEY_RESET = 65481; // F12 @@ -262,9 +262,9 @@ class Input kbd.processPresses(); kbd.processReleases(); - while(GtkD.eventsPending()) + while(Main.eventsPending()) { - GtkD.mainIteration(); + Main.iteration(); } processJoystickEvents(); } diff --git a/src/ui/mainwindow.d b/src/ui/mainwindow.d index 036749e..d3270eb 100644 --- a/src/ui/mainwindow.d +++ b/src/ui/mainwindow.d @@ -136,7 +136,7 @@ class TwoappleMainWindow : MainWindow input.startTextInput(checkFile.fileName); } - int windowDelete(Event event, Widget widget) + bool windowDelete(Event event, Widget widget) { stayOpen = false; soundCard.pause(); @@ -202,7 +202,7 @@ class TwoappleMainWindow : MainWindow { speedString = std.string.sformat(speedString, "% 5d%%", cast(int)(speedPercent * 100)); - speedLabel.setText(speedString); + speedLabel.setText(speedString.idup); } } runOnce = false; @@ -217,7 +217,7 @@ class TwoappleMainWindow : MainWindow host.delay.nap(); } } - while (stayOpen) + while (stayOpen); } } @@ -228,7 +228,7 @@ class TwoappleFile import std.path; string fileName; - char* fileNameZ; + immutable(char)* fileNameZ; this(string fname) { @@ -271,7 +271,7 @@ class TwoappleFile uint fileSize() { - return getSize(fileName); + return cast(uint)getSize(fileName); } } @@ -313,15 +313,14 @@ class TwoappleFilePicker scope fcd = new FileChooserDialog("Save " ~ type, appWindow, FileChooserAction.SAVE); - scope chooser = fcd.getFileChooser(); - chooser.setCurrentFolder(folder); - chooser.setCurrentName(name); + fcd.setCurrentFolder(folder); + fcd.setCurrentName(name); TwoappleFile file; while (true) { if (fcd.run() != ResponseType.GTK_RESPONSE_OK) break; - file = new TwoappleFile(chooser.getFilename()); + file = new TwoappleFile(fcd.getFilename()); if (file.exists()) { if (!file.canWrite()) @@ -356,16 +355,15 @@ class TwoappleFilePicker scope fcd = new FileChooserDialog("Open " ~ type, appWindow, FileChooserAction.OPEN); - scope chooser = fcd.getFileChooser(); if (type in lastFolder) - chooser.setCurrentFolder(lastFolder[type]); + fcd.setCurrentFolder(lastFolder[type]); TwoappleFile file; while(true) { if (fcd.run() != ResponseType.GTK_RESPONSE_OK) break; - file = new TwoappleFile(chooser.getFilename()); + file = new TwoappleFile(fcd.getFilename()); if (!file.canRead()) { TwoappleError.show(fcd, "File cannot be read"); diff --git a/src/ui/monitor.d b/src/ui/monitor.d index abe8188..0623817 100644 --- a/src/ui/monitor.d +++ b/src/ui/monitor.d @@ -20,6 +20,8 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ +module ui.monitor; + private import gtk.DrawingArea; private import glgtk.GLCapability; private import glgdk.GLDrawable; @@ -28,6 +30,7 @@ private import glgdk.GLContext; private import gtkglc.glgdktypes; private import gtk.Widget; private import gtk.ToggleToolButton; +private import gtkglc.gl; // TODO: should this be in glgtk.GLCapability? import video.base; diff --git a/src/ui/sound.d b/src/ui/sound.d index 419f4d9..d104740 100644 --- a/src/ui/sound.d +++ b/src/ui/sound.d @@ -24,6 +24,7 @@ module ui.sound; import std.stdio; import std.c.string; +import std.conv; import derelict.sdl.sdl; import derelict.util.exception; @@ -41,7 +42,7 @@ static this() { if (SDL_InitSubSystem(SDL_INIT_AUDIO) == -1) { - writefln("%s", std.string.toString(SDL_GetError())); + writefln("%s", to!string(SDL_GetError())); return; } auto checkCard = new SoundCardYes(); @@ -114,7 +115,7 @@ class SoundCardYes : SoundCard if (SDL_OpenAudio(&audioRequest, null) == -1) { - writefln("%s", std.string.toString(SDL_GetError())); + writefln("%s", to!string(SDL_GetError())); return; } diff --git a/src/ui/textinput.d b/src/ui/textinput.d index 2270e25..c8bd282 100644 --- a/src/ui/textinput.d +++ b/src/ui/textinput.d @@ -53,7 +53,7 @@ class TextInput onFinish(); return false; } - line = file.readLine() ~ x"0D"; + line = file.readLine().idup ~ x"0D"; pos = 0; return true; } diff --git a/src/video/laz_engine.d b/src/video/laz_engine.d index 922d7d7..9e27be7 100644 --- a/src/video/laz_engine.d +++ b/src/video/laz_engine.d @@ -20,6 +20,8 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ +module video.laz_engine; + import video.base; private: @@ -59,15 +61,15 @@ class LazEngine : Screen ]; ushort* monoPalette; - mixin("static final ushort[32][8] colorPalettes = " + mixin("static ushort[32][8] colorPalettes = " ~ import("palette_5_6_5")); ushort* colorPalette; - mixin("static final uint[32][4][3] schemes = " + mixin("static uint[32][4][3] schemes = " ~ import("laz_scheme")); uint[32]* scheme; - mixin("static final uint[32][2][2] sharp_table = " + mixin("static uint[32][2][2] sharp_table = " ~ import("laz_sharp")); this() @@ -173,7 +175,7 @@ class LazEngine : Screen paletteIndex = scheme[col & 0b11][colorIndex]; if (paletteIndex > 0x80) { - switch (sharp_table[prevBit][nextBit][colorIndex]) + final switch (sharp_table[prevBit][nextBit][colorIndex]) { case 0: paletteIndex = Color.Black; @@ -196,7 +198,7 @@ class LazEngine : Screen paletteIndex = scheme[col & 0b11][colorIndex]; if (paletteIndex > 0x80) { - switch (sharp_table[prevBit][nextBit][colorIndex]) + final switch (sharp_table[prevBit][nextBit][colorIndex]) { case 0: paletteIndex = Color.Black; diff --git a/src/video/offsets.d b/src/video/offsets.d index 1c9d7c8..48d4483 100644 --- a/src/video/offsets.d +++ b/src/video/offsets.d @@ -20,7 +20,9 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ -import video.base : Mode; +module video.offsets; + +import video.base; static this() { @@ -159,7 +161,8 @@ ushort screenOffset(vState* vSt, hState* hSt, Mode mode) { ushort sum_a6_a5_a4_a3 = (vSt.a6_a5_a4_a3 + hSt.a6_a5_a4_a3 + 0b1101000) & 0b1111000; - ushort offset = vSt.a9_a8_a7 | sum_a6_a5_a4_a3 | hSt.a2_a1_a0; + ushort offset = + cast(ushort)(vSt.a9_a8_a7 | sum_a6_a5_a4_a3 | hSt.a2_a1_a0); if (mode == Mode.HIRES) { diff --git a/src/video/patterns.d b/src/video/patterns.d index 7b42454..4453374 100644 --- a/src/video/patterns.d +++ b/src/video/patterns.d @@ -20,6 +20,8 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ +module video.patterns; + import video.base; import device.base; import memory; @@ -63,7 +65,7 @@ void initReverseBits() } } -final ubyte INVERSE = 0b01111111; +ubyte INVERSE = 0b01111111; public: @@ -168,9 +170,9 @@ class TextPatternGenerator : PatternGenerator class TextPatternGenerator_II : TextPatternGenerator { - mixin("static final ubyte[256] charsetUpper_II = " + mixin("static ubyte[256] charsetUpper_II = " ~ import("charset_upper_ii")); - mixin("static final ubyte[256] charsetSymbol_II = " + mixin("static ubyte[256] charsetSymbol_II = " ~ import("charset_symbol_ii")); void initPatterns() @@ -225,13 +227,13 @@ class TextPatternGenerator_II : TextPatternGenerator class TextPatternGenerator_IIe : TextPatternGenerator { - mixin("static final ubyte[256] charsetUpper_IIe = " + mixin("static ubyte[256] charsetUpper_IIe = " ~ import("charset_upper_iie")); - mixin("static final ubyte[256] charsetSymbol_IIe = " + mixin("static ubyte[256] charsetSymbol_IIe = " ~ import("charset_symbol_iie")); - mixin("static final ubyte[256] charsetLower = " + mixin("static ubyte[256] charsetLower = " ~ import("charset_lower")); - mixin("static final ubyte[256] charsetMouse = " + mixin("static ubyte[256] charsetMouse = " ~ import("charset_mouse")); void initPatterns() @@ -340,7 +342,7 @@ class LoresPatternGenerator : PatternGenerator 0x1, 0x9, 0xA, 0xD, 0x3, 0xB, 0x7, 0xF]; for (int bits4 = 0; bits4 < 16; ++bits4) { - ubyte bits8 = (dhrBits4[bits4] << 4) | dhrBits4[bits4]; + ubyte bits8 = cast(ubyte)((dhrBits4[bits4] << 4) | dhrBits4[bits4]); ushort bits16 = (bits8 << 8) | bits8; uint bits32 = (bits16 << 16) | bits16; patterns[bits4][0][0] = bits32 >> 25; diff --git a/src/video/scanner.d b/src/video/scanner.d index 1e5abd4..75abacd 100644 --- a/src/video/scanner.d +++ b/src/video/scanner.d @@ -20,6 +20,8 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ +module video.scanner; + import video.base; import video.offsets; import memory; @@ -243,8 +245,8 @@ class Scanner_II : Scanner { uint clock = vidCycle.currentVal(); if (((clock % 65) < 25) && (mode != Mode.HIRES)) - return decoder.read(0x1400 + (page * 0x400) + - scanOffset(clock, mode)); + return decoder.read( + cast(ushort)(0x1400 + (page * 0x400) + scanOffset(clock, mode))); else return displayMem[mode][page].data[scanOffset(clock, mode)]; } diff --git a/src/video/signal.d b/src/video/signal.d index 4e060c6..7f66d67 100644 --- a/src/video/signal.d +++ b/src/video/signal.d @@ -20,6 +20,8 @@ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/ +module video.signal; + import video.base; import video.patterns; import device.base; @@ -92,7 +94,7 @@ class Signal : SignalBase int startCol, int stopLine, int stopCol) { PatternGenerator pattern; - switch (mode) + final switch (mode) { case Mode.TEXT: pattern = textPattern;