| 1 | //============================================================================ | 
|---|
| 2 | // | 
|---|
| 3 | //   SSSS    tt          lll  lll | 
|---|
| 4 | //  SS  SS   tt           ll   ll | 
|---|
| 5 | //  SS     tttttt  eeee   ll   ll   aaaa | 
|---|
| 6 | //   SSSS    tt   ee  ee  ll   ll      aa | 
|---|
| 7 | //      SS   tt   eeeeee  ll   ll   aaaaa  --  "An Atari 2600 VCS Emulator" | 
|---|
| 8 | //  SS  SS   tt   ee      ll   ll  aa  aa | 
|---|
| 9 | //   SSSS     ttt  eeeee llll llll  aaaaa | 
|---|
| 10 | // | 
|---|
| 11 | // Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony | 
|---|
| 12 | // and the Stella Team | 
|---|
| 13 | // | 
|---|
| 14 | // See the file "License.txt" for information on usage and redistribution of | 
|---|
| 15 | // this file, and for a DISCLAIMER OF ALL WARRANTIES. | 
|---|
| 16 | //============================================================================ | 
|---|
| 17 |  | 
|---|
| 18 | #include "CartE0.hxx" | 
|---|
| 19 | #include "PopUpWidget.hxx" | 
|---|
| 20 | #include "CartE0Widget.hxx" | 
|---|
| 21 |  | 
|---|
| 22 | static const char* const seg0[] = { | 
|---|
| 23 | "0 ($FFE0)", "1 ($FFE1)", "2 ($FFE2)", "3 ($FFE3)", | 
|---|
| 24 | "4 ($FFE4)", "5 ($FFE5)", "6 ($FFE6)", "7 ($FFE7)" | 
|---|
| 25 | }; | 
|---|
| 26 | static const char* const seg1[] = { | 
|---|
| 27 | "0 ($FFE8)", "1 ($FFE9)", "2 ($FFEA)", "3 ($FFEB)", | 
|---|
| 28 | "4 ($FFEC)", "5 ($FFED)", "6 ($FFEE)", "7 ($FFEF)" | 
|---|
| 29 | }; | 
|---|
| 30 | static const char* const seg2[] = { | 
|---|
| 31 | "0 ($FFF0)", "1 ($FFF1)", "2 ($FFF2)", "3 ($FFF3)", | 
|---|
| 32 | "4 ($FFF4)", "5 ($FFF5)", "6 ($FFF6)", "7 ($FFF7)" | 
|---|
| 33 | }; | 
|---|
| 34 |  | 
|---|
| 35 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
| 36 | CartridgeE0Widget::CartridgeE0Widget( | 
|---|
| 37 | GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, | 
|---|
| 38 | int x, int y, int w, int h, CartridgeE0& cart) | 
|---|
| 39 | : CartDebugWidget(boss, lfont, nfont, x, y, w, h), | 
|---|
| 40 | myCart(cart) | 
|---|
| 41 | { | 
|---|
| 42 | uInt32 size = 8 * 1024; | 
|---|
| 43 |  | 
|---|
| 44 | string info = | 
|---|
| 45 | "E0 cartridge, eight 1K slices\n" | 
|---|
| 46 | "Segment 0 accessible @ $F000 - $F3FF\n" | 
|---|
| 47 | "  Hotspots $FE0 to $FE7\n" | 
|---|
| 48 | "Segment 1 accessible @ $F400 - $F7FF\n" | 
|---|
| 49 | "  Hotspots $FE8 to $FEF\n" | 
|---|
| 50 | "Segment 2 accessible @ $F800 - $FBFF\n" | 
|---|
| 51 | "  Hotspots $FF0 to $FF7\n" | 
|---|
| 52 | "Segment 3 accessible @ $FC00 - $FFFF\n" | 
|---|
| 53 | "  Always points to last 1K of ROM\n" | 
|---|
| 54 | "Startup slices = 4 / 5 / 6 or undetermined\n"; | 
|---|
| 55 |  | 
|---|
| 56 | #if 0 | 
|---|
| 57 | // Eventually, we should query this from the debugger/disassembler | 
|---|
| 58 | uInt16 start = (cart.myImage[size-3] << 8) | cart.myImage[size-4]; | 
|---|
| 59 | start -= start % 0x1000; | 
|---|
| 60 | info << "Bank RORG"<< " = $"<< HEX4 << start << "\n"; | 
|---|
| 61 | #endif | 
|---|
| 62 | int xpos = 2, | 
|---|
| 63 | ypos = addBaseInformation(size, "Parker Brothers", info) + myLineHeight; | 
|---|
| 64 |  | 
|---|
| 65 | VariantList items0, items1, items2; | 
|---|
| 66 | for(int i = 0; i < 8; ++i) | 
|---|
| 67 | { | 
|---|
| 68 | VarList::push_back(items0, seg0[i]); | 
|---|
| 69 | VarList::push_back(items1, seg1[i]); | 
|---|
| 70 | VarList::push_back(items2, seg2[i]); | 
|---|
| 71 | } | 
|---|
| 72 |  | 
|---|
| 73 | const int lwidth = _font.getStringWidth( "Set slice for segment X "); | 
|---|
| 74 | mySlice0 = | 
|---|
| 75 | new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth( "7 ($FFF7)"), | 
|---|
| 76 | myLineHeight, items0, "Set slice for segment 0 ", | 
|---|
| 77 | lwidth, kSlice0Changed); | 
|---|
| 78 | mySlice0->setTarget(this); | 
|---|
| 79 | addFocusWidget(mySlice0); | 
|---|
| 80 | ypos += mySlice0->getHeight() + 4; | 
|---|
| 81 |  | 
|---|
| 82 | mySlice1 = | 
|---|
| 83 | new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth( "7 ($FFF7)"), | 
|---|
| 84 | myLineHeight, items1, "Set slice for segment 1 ", | 
|---|
| 85 | lwidth, kSlice1Changed); | 
|---|
| 86 | mySlice1->setTarget(this); | 
|---|
| 87 | addFocusWidget(mySlice1); | 
|---|
| 88 | ypos += mySlice1->getHeight() + 4; | 
|---|
| 89 |  | 
|---|
| 90 | mySlice2 = | 
|---|
| 91 | new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth( "7 ($FFF7)"), | 
|---|
| 92 | myLineHeight, items2, "Set slice for segment 2 ", | 
|---|
| 93 | lwidth, kSlice2Changed); | 
|---|
| 94 | mySlice2->setTarget(this); | 
|---|
| 95 | addFocusWidget(mySlice2); | 
|---|
| 96 | } | 
|---|
| 97 |  | 
|---|
| 98 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
| 99 | void CartridgeE0Widget::loadConfig() | 
|---|
| 100 | { | 
|---|
| 101 | mySlice0->setSelectedIndex(myCart.myCurrentSlice[0]); | 
|---|
| 102 | mySlice1->setSelectedIndex(myCart.myCurrentSlice[1]); | 
|---|
| 103 | mySlice2->setSelectedIndex(myCart.myCurrentSlice[2]); | 
|---|
| 104 |  | 
|---|
| 105 | CartDebugWidget::loadConfig(); | 
|---|
| 106 | } | 
|---|
| 107 |  | 
|---|
| 108 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
| 109 | void CartridgeE0Widget::handleCommand(CommandSender* sender, | 
|---|
| 110 | int cmd, int data, int id) | 
|---|
| 111 | { | 
|---|
| 112 | myCart.unlockBank(); | 
|---|
| 113 |  | 
|---|
| 114 | switch(cmd) | 
|---|
| 115 | { | 
|---|
| 116 | case kSlice0Changed: | 
|---|
| 117 | myCart.segmentZero(mySlice0->getSelected()); | 
|---|
| 118 | break; | 
|---|
| 119 | case kSlice1Changed: | 
|---|
| 120 | myCart.segmentOne(mySlice1->getSelected()); | 
|---|
| 121 | break; | 
|---|
| 122 | case kSlice2Changed: | 
|---|
| 123 | myCart.segmentTwo(mySlice2->getSelected()); | 
|---|
| 124 | break; | 
|---|
| 125 | } | 
|---|
| 126 |  | 
|---|
| 127 | myCart.lockBank(); | 
|---|
| 128 | invalidate(); | 
|---|
| 129 | } | 
|---|
| 130 |  | 
|---|
| 131 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
| 132 | string CartridgeE0Widget::bankState() | 
|---|
| 133 | { | 
|---|
| 134 | ostringstream& buf = buffer(); | 
|---|
| 135 |  | 
|---|
| 136 | buf << "Slices: "<< std::dec | 
|---|
| 137 | << seg0[myCart.myCurrentSlice[0]] << " / " | 
|---|
| 138 | << seg1[myCart.myCurrentSlice[1]] << " / " | 
|---|
| 139 | << seg2[myCart.myCurrentSlice[2]]; | 
|---|
| 140 |  | 
|---|
| 141 | return buf.str(); | 
|---|
| 142 | } | 
|---|
| 143 |  | 
|---|