Jan 192012
 

Bryce, well known for his great hardware projects (MegaFlash ROM box, RGB to SVideo converter, MegaROM board, etc…), released a description on how to move the ACID protection chip into the CPC Plus. If you do this modification, you won’t need the ACID protection chip in the cartridge anymore and you can just connect cartridges without an ACID protection chip to the CPC Plus.
You can find the howto in the [[AcidInside|CPC Wiki]].

A replacement possibility for the ACID protection chip was also released last year, too.

ACID Verilog code

 

Nilquader and I decided to release our Verilog code (based on Nocash’s decryption of the algorithm) to “emulate” the ACID protection chip of the Amstrad Plus. So, you can now find it here (for more information have a look at the [[Amstrad Cartridge Identification Device|ACID article]] of the CPCWiki):

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: Octoate, Nilquader
// ACID Reverse engineering by nocash
//
// Create Date   : 00:45:53 09/03/2010
// Design Name   : amsacid
// Module Name   : amsacid
// Project Name  :
// Target Devices: Xilinx XC9572
// Tool versions :
// Description   : Reverse engineered Amstrad 40908 "ACID" Chip
//
// Revision:
// Revision 0.05
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module amsacid(PinCLK, PinA, PinOE, PinCCLR, PinSIN);

input PinCLK;
input [7:0]PinA;
input PinOE;
input PinCCLR;

output [7:0]PinSIN;

wire PinCLK;

reg [16:0]ShiftReg = 17'h1FFFF;
wire [16:0]CmpVal;
wire [16:0]XorVal;

assign CmpVal = 17'h13596	^ (PinA[0] ? 17'h0000c : 0)
				^ (PinA[1] ? 17'h06000 : 0)
				^ (PinA[2] ? 17'h000c0 : 0)
				^ (PinA[3] ? 17'h00030 : 0)
				^ (PinA[4] ? 17'h18000 : 0)
				^ (PinA[5] ? 17'h00003 : 0)
				^ (PinA[6] ? 17'h00600 : 0)
				^ (PinA[7] ? 17'h01800 : 0);
assign XorVal = 17'h0C820	^ (PinA[0] ? 17'h00004 : 0)
				^ (PinA[1] ? 17'h06000 : 0)
				^ (PinA[2] ? 17'h00080 : 0)
				^ (PinA[3] ? 17'h00020 : 0)
				^ (PinA[4] ? 17'h08000 : 0)
				^ (PinA[5] ? 17'h00000 : 0)
				^ (PinA[6] ? 17'h00000 : 0)
				^ (PinA[7] ? 17'h00800 : 0);

always@(negedge PinCLK)
	begin

	if (PinCCLR) // not in reset state
		begin
		if (!PinOE && ((ShiftReg | 17'h00100) == CmpVal))
			begin
			ShiftReg <= (ShiftReg ^ XorVal) >> 1;
			ShiftReg[16] <= ShiftReg[0] ^ ShiftReg[9] ^ ShiftReg[12] ^ ShiftReg[16] ^ XorVal[0];  // hier xorval mit berüchsichtigen
			end
		else
			begin
			ShiftReg <= ShiftReg >> 1;
			ShiftReg[16] <= ShiftReg[0] ^ ShiftReg[9] ^ ShiftReg[12] ^ ShiftReg[16];
			end
		end
	else
		begin
			ShiftReg <= 17'h1FFFF;
		end
	end

//assign PinSIN = ShiftReg[7:0] ^ 8'hff;
assign PinSIN = ShiftReg[7:0];
//assign PinSIN[0] = PinCLK;

endmodule

But this isn’t everything about the ACID. We also found a timing problem during the investigation with a logic analyzer, which you can see here:

ACID initialisation by Grim

ACID initialisation (by Grim)

You will find glitches on the /CCLR line which show that the SIN contact should be changed… All in all it is possible to use a fast flip-flop to change the SIN signal when such a glitch occurs (see picture below).

Flip flop for ACID replacement

Flip flop for ACID replacement

You see, this is a very simple schematic, but it isn’t much cheaper than a CPLD, which emulates the full ACID and it comes with a disadvantage: it won’t work with a reset, so you always have to switch the CPC off and on again.

So, have fun with it :-).

 

Apr 152011
 

Nilquader and I decided to release our Verilog code (based on Nocash’s decryption of the algorithm) to “emulate” the ACID protection chip of the Amstrad Plus. So, you can now find it in the [[Amstrad Cartridge Identification Device|ACID article]] of the CPCWiki and right here in this posting:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: Octoate, Nilquader
// ACID Reverse engineering by nocash
//
// Create Date   : 00:45:53 09/03/2010
// Design Name   : amsacid
// Module Name   : amsacid
// Project Name  :
// Target Devices: Xilinx XC9572
// Tool versions :
// Description   : Reverse engineered Amstrad 40908 "ACID" Chip
//
// Revision:
// Revision 0.05
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module amsacid(PinCLK, PinA, PinOE, PinCCLR, PinSIN);

input PinCLK;
input [7:0]PinA;
input PinOE;
input PinCCLR;

output [7:0]PinSIN;

wire PinCLK;

reg [16:0]ShiftReg = 17'h1FFFF;
wire [16:0]CmpVal;
wire [16:0]XorVal;

assign CmpVal = 17'h13596	^ (PinA[0] ? 17'h0000c : 0)
				^ (PinA[1] ? 17'h06000 : 0)
				^ (PinA[2] ? 17'h000c0 : 0)
				^ (PinA[3] ? 17'h00030 : 0)
				^ (PinA[4] ? 17'h18000 : 0)
				^ (PinA[5] ? 17'h00003 : 0)
				^ (PinA[6] ? 17'h00600 : 0)
				^ (PinA[7] ? 17'h01800 : 0);
assign XorVal = 17'h0C820	^ (PinA[0] ? 17'h00004 : 0)
				^ (PinA[1] ? 17'h06000 : 0)
				^ (PinA[2] ? 17'h00080 : 0)
				^ (PinA[3] ? 17'h00020 : 0)
				^ (PinA[4] ? 17'h08000 : 0)
				^ (PinA[5] ? 17'h00000 : 0)
				^ (PinA[6] ? 17'h00000 : 0)
				^ (PinA[7] ? 17'h00800 : 0);

always@(negedge PinCLK)
	begin

	if (PinCCLR) // not in reset state
		begin
		if (!PinOE && ((ShiftReg | 17'h00100) == CmpVal))
			begin
			ShiftReg <= (ShiftReg ^ XorVal) >> 1;
			ShiftReg[16] <= ShiftReg[0] ^ ShiftReg[9] ^ ShiftReg[12] ^ ShiftReg[16] ^ XorVal[0];  // hier xorval mit berüchsichtigen
			end
		else
			begin
			ShiftReg <= ShiftReg >> 1;
			ShiftReg[16] <= ShiftReg[0] ^ ShiftReg[9] ^ ShiftReg[12] ^ ShiftReg[16];
			end
		end
	else
		begin
			ShiftReg <= 17'h1FFFF;
		end
	end

//assign PinSIN = ShiftReg[7:0] ^ 8'hff;
assign PinSIN = ShiftReg[7:0];
//assign PinSIN[0] = PinCLK;

endmodule

But this isn’t everything about the ACID. We also found a timing problem during the investigation with a logic analyzer, which you can see here:

ACID initialisation by Grim

ACID initialisation (by Grim)

You will find glitches on the /CCLR line which show that the SIN contact should be changed… All in all it is possible to use a fast flip-flop to change the SIN signal when such a glitch occurs (see picture below).

Flip flop for ACID replacement

Flip flop for ACID replacement

You see, this is a very simple schematic, but it isn’t much cheaper than a CPLD, which emulates the full ACID and it comes with a disadvantage: it won’t work with a reset, so you always have to switch the CPC off and on again.

So, have fun with it – maybe Bryce will change his cartridge design and support this solution in the future :-).

Apr 152011
 

Thanks to an tweet by Dadman I saw that he updated his blog about an ACID replacement. If I understand it correctly (I had to use a translator, because my spanish isn’t good enough), mcleod_ideafix has also finished the ACID emulation for the Amstrad Plus. So we will surely see new hardware for the Plus coming Smiley mit geöffnetem Mund. You will find more information about it on http://www.zxprojects.com.

Nilquader and I wrote a ACID emulation about half a year ago on the XzentriX 2010 meeting, but we decided not to release the code until a new hardware is ready, because we wouldn’t like to see high-priced bootlegs on e*ay…

[UPDATE:] Because the release of the ACID emulation code, Nilquader and I decided to release our ACID emulation code, too. You can find the source of it here.

Feb 022011
 

Bryce announced the MITM (man-in-the-middle) cartridge adapter, which sits between a Plus cartridge and the Plus. With this adapter, you just need an original cartridge with an ACID protection chip which is directly connected to the CPC, but it will read the contents of the EPROM on the adapter. Maybe you know the same principle from playing Super Nintendo games from foreign countries – they used such an adapter to bypass the protection chip, too.

You can find an [[MITM|article about the adapter]] in the CPC Wiki. The schematics and layout will follow soon.

MITM3