public static string Code(ColorHDMA red, ColorHDMA green, ColorHDMA blue, PickSingleChannel single, PickMultiChannel multi, PickMultiChannel tripple) { bool redEmpty = red.IsEmpty(); bool greenEmpty = green.IsEmpty(); bool blueEmpty = blue.IsEmpty(); if (redEmpty && blueEmpty && greenEmpty) { //fixme Exception throw new ArgumentException("Cannot generate code from the provided arguments"); } if (redEmpty && blueEmpty) { return(green.Code(single())); } if (greenEmpty && blueEmpty) { return(red.Code(single())); } if (redEmpty && greenEmpty) { return(blue.Code(single())); } int[] newChannels = new int[] { 3, 4, 5 }; Dictionary <string, HDMATable> dicTable = new Dictionary <string, HDMATable>(); HDMATable merged = null; if (greenEmpty) { if (HDMATable.Merge(red.Table, blue.Table, out merged)) { return(ColorHDMA.Code(single(), merged, ".RedBlueTable")); } else { newChannels = multi(); dicTable.Add(".RedTable", red.Table); dicTable.Add(".BlueTable", blue.Table); } } else if (redEmpty) { if (HDMATable.Merge(green.Table, blue.Table, out merged)) { return(ColorHDMA.Code(single(), merged, ".GreenBlueTable")); } else { newChannels = multi(); dicTable.Add(".GreenTable", green.Table); dicTable.Add(".BlueTable", blue.Table); } } else if (blueEmpty) { if (HDMATable.Merge(green.Table, red.Table, out merged)) { return(ColorHDMA.Code(single(), merged, ".RedGreenTable")); } else { newChannels = multi(); dicTable.Add(".GreenTable", green.Table); dicTable.Add(".RedTable", red.Table); } } else { if (HDMATable.Merge(green.Table, red.Table, out merged)) { newChannels = multi(); dicTable.Add(".RedGreenTable", merged); dicTable.Add(".BlueTable", blue.Table); } else if (HDMATable.Merge(green.Table, blue.Table, out merged)) { newChannels = multi(); dicTable.Add(".GreenBlueTable", merged); dicTable.Add(".RedTable", red.Table); } else if (HDMATable.Merge(red.Table, blue.Table, out merged)) { newChannels = multi(); dicTable.Add(".RedBlueTable", merged); dicTable.Add(".GreenTable", red.Table); } else { newChannels = tripple(); dicTable.Add(".RedTable", red.Table); dicTable.Add(".GreenTable", green.Table); dicTable.Add(".BlueTable", blue.Table); } } if (dicTable.Count != newChannels.Length) { throw new ArgumentException("Number of channels doesn't match number of tables."); } Func <KeyValuePair <string, HDMATable>, string> getTablename = old => "." + old.Key.TrimStart('.'); int channelTrigger = 0; StringBuilder sbCode = new StringBuilder(); //sbCode.AppendLine("init:"); sbCode.AppendLine("\tREP #$20"); for (int i = 0; i < dicTable.Count; i++) { KeyValuePair <string, HDMATable> tablePair = dicTable.ElementAt(i); DMAMode mode = (tablePair.Value[0].Values.Length == 1 ? DMAMode.P : DMAMode.PP); int channelAdd = 16 * newChannels[i]; string tableName = getTablename(tablePair); sbCode.AppendLine("\tLDA #$" + (((Registers.FixedColor & 0xFF) << 8) + (int)mode).ToString("X4")); sbCode.AppendLine("\tSTA $" + (Registers.DMAMode + channelAdd).ToString("X4")); sbCode.AppendLine("\tLDA #" + tableName); sbCode.AppendLine("\tSTA $" + (Registers.DMALowByte + channelAdd).ToString("X4")); sbCode.AppendLine("\tLDY.b #" + tableName + ">>16"); sbCode.AppendLine("\tSTY $" + (Registers.DMABankByte + channelAdd).ToString("X4")); channelTrigger += (1 << newChannels[i]); } sbCode.AppendLine("\tSEP #$20"); sbCode.AppendLine("\tLDA #$" + channelTrigger.ToString("X2")); sbCode.AppendLine("\tTSB $" + RAM.HDMAEnable[RAM.SA1].ToString("X4") + "|!addr"); sbCode.AppendLine("\tRTL"); for (int i = 0; i < dicTable.Count; i++) { KeyValuePair <string, HDMATable> tablePair = dicTable.ElementAt(i); string tableName = getTablename(tablePair); sbCode.AppendLine(); sbCode.Append(tablePair.Value.ToString(tableName)); } return(sbCode.ToString()); }
public string Code(PickSingleChannel single, PickMultiChannel multi, PickMultiChannel tripple) { return(Code(this._red, this._green, this._blue, single, multi, tripple)); }