| 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 | |