Jump to content

azure

Members
  • Content Count

    173
  • Joined

  • Last visited

Blog Entries posted by azure

  1. azure
    I'm posting a text listing of TIA timings I've put together. I haven't seen a listing for reflected playfields, so I'm including that.

    Cycles right of the | are on the |.
    Cycles left of the | are one space left of the |.
     
    Repeated
    |0            15|16           31|32           47|48           63|   |68         | TIA |0             5|5.3        10.3|10.6       15.6|16           21|   |22.6       | CPU |---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---| |68           83|84           99|100         115|116         131|132         147| TIA |22.6       27.6|28           33|33.3       38.3|38.6       43.6|44           49| CPU |---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---+---+---+---+---| |      PF0      |              PF1              |              PF2              | |---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---+---+---+---+---| |   4   8   12  |   20  24  28  |   36  40  44  |   52  56  60   |  68  72  76  | |0            15|16           31|32           47|48           63|64           79| PIXEL |148         163|164         179|180         195|196         211|212         227| TIA |49.3       54.3|54.6       59.6|60           65|65.3       70.3|70.6       75.6| CPU |---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---+---+---+---+---| |      PF0      |              PF1              |              PF2              | |---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---+---+---+---+---| |   84  88  92  |  100 104 108  |  116 120 124  |  132 136 140  |  148 152 156  | |80           95|96          111|112         127|128         143|144         159| PIXEL  
    Reflected
    |0            15|16           31|32           47|48           63|   |68         | TIA |0             5|5.3        10.3|10.6       15.6|16           21|   |22.6       | CPU |---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---| |68           83|84           99|100         115|116         131|132         147| TIA |22.6       27.6|28           33|33.3       38.3|38.6       43.6|44           49| CPU |---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---+---+---+---+---| |      PF0      |              PF1              |              PF2              | |---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---+---+---+---+---| |   4   8   12  |   20  24  28  |   36  40  44  |   52  56  60   |  68  72  76  | |0            15|16           31|32           47|48           63|64           79| PIXEL |148         163|164         179|180         195|196         211|212         227| TIA |49.3       54.3|54.6       59.6|60           65|65.3       70.3|70.6       75.6| CPU |---+---+---+---+---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---| |              PF2              |              PF1              |      PF0      | |---+---+---+---+---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---| |   84  88  92  |  100 104 108  |  116 120 124  |  132 136 140  |  148 152 156  | |80           95|96          111|112         127|128         143|144         159| PIXEL  
    Repeated
    Off Screen | 0           3 | 4           7 | 8          11 |12          15 |16          19 |20          23 |24          27 |28          31 | TIA | 0           1 |1.3         2.3|2.6         3.6|4             5|5.3         6.3|6.6         7.6|8            9 |9.3        10.3| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| | 0   1   2   3 | 4   5   6   7 | 8   9  10  11 |12  13  14  15 |16  17  18  19 |20  21  22  23 |24  25  26  27 |28  29  30  31 | PIXEL |32          35 |36          39 |40          43 |44           47|48          51 |52          55 |56          59 |60           63| TIA |10.6       11.6|12          13 |13.3       14.3|14.6       15.6|16          17 |17.3       18.3|18.6       19.6|20          21 | CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| |32  33  34  35 |36  37  38  39 |40  41  42  43 |44  45  46  47 |48  49  50  51 |52  53  54  55 |56  57  58  59 |60  61  62  63 | PIXEL |64          68 | TIA |21.3       22.3| CPU |---+---+---+---| |64  65  67  68 | PIXEL On screen PF0 | 68         71 | 72         75 | 76         79 | 80         83 | TIA |22.6       23.6|24           25|25.3       26.3|26.6       27.6| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       4       |       5       |       6       |       7       | BIT |---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| | 0   1   2   3 | 4   5   6   7 | 8   9  10  11 |12  13  14  15 | PIXEL PF1 | 84         87 | 88         91 | 92         95 | 96         99 |100         103|104         107|108         111|112         115| TIA | 28         29 |29.3       30.3|30.6       31.6| 32         33 |33.3       34.3|34.6       35.6| 36         37 |37.3       38.3| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       7       |       6       |       5       |       4       |       3       |       2       |       1       |       0       | BIT |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| |16  17  18  19 |20  21  22  23 |24  25  26  27 |28  29  30  31 |32  33  34  35 |36  37  38  39 |40  41  42  43 |44  45  46  47 | PIXEL PF2 |116         119|120         123|124         127|128         131|132         135|136         139|140         143|144         147| TIA |38.6       39.6| 40         41 |41.3       42.3|42.6       43.6| 44         45 |45.3       46.3|46.6       47.6| 48         49 | CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       0       |       1       |       2       |       3       |       4       |       5       |       6       |       7       | BIT |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| |48  49  50  51 |52  53  54  55 |56  57  58  59 |60  61  62  63 |64  65  66  67 |68  69  70  71 |72  73  74  75 |76  77  78  79 | PIXEL PF0 |148         151|152         155|156         159|160         163| TIA |49.3       50.3|50.6       51.6| 52         53 |53.3       54.3| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       4       |       5       |       6       |       7       | BIT |---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| |80  81  82  83 |84  85  86  87 |88  89  90  91 |92  93  94  95 | PIXEL PF1 |164         167|168         171|172         175|176         179|180         183|184         187|188         191|192         195| TIA |54.6       55.6| 56         57 |57.3       58.3|58.6       59.6| 60         61 |61.3       62.3|62.6       63.6| 64         65 | CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       7       |       6       |       5       |       4       |       3       |       2       |       1       |       0       | BIT |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| |96  97  98  99 |100 101 102 103|104 105 106 107|108 109 110 111|112 113 114 115|116 117 118 119|120 121 122 123|124 125 126 127| PIXEL PF2 |196         199|200         203|204         207|208         211|212         215|216         219|220         223|224         227| TIA |65.3       66.3|66.6       67.6| 68         69 |69.3       70.3|70.6       71.6| 72         73 |73.3       74.3|74.6       75.6| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       0       |       1       |       2       |       3       |       4       |       5       |       6       |       7       | BIT |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| |128 129 130 131|132 133 134 135|136 137 138 139|140 141 142 143|144 145 146 147|148 149 150 151|152 153 154 155|156 157 158 159| PIXEL
    Reflected
    Off Screen | 0           3 | 4           7 | 8          11 |12          15 |16          19 |20          23 |24          27 |28          31 | TIA | 0           1 |1.3         2.3|2.6         3.6|4             5|5.3         6.3|6.6         7.6|8            9 |9.3        10.3| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| | 0   1   2   3 | 4   5   6   7 | 8   9  10  11 |12  13  14  15 |16  17  18  19 |20  21  22  23 |24  25  26  27 |28  29  30  31 | PIXEL |32          35 |36          39 |40          43 |44           47|48          51 |52          55 |56          59 |60           63| TIA |10.6       11.6|12          13 |13.3       14.3|14.6       15.6|16          17 |17.3       18.3|18.6       19.6|20          21 | CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| |32  33  34  35 |36  37  38  39 |40  41  42  43 |44  45  46  47 |48  49  50  51 |52  53  54  55 |56  57  58  59 |60  61  62  63 | PIXEL |64          68 | TIA |21.3       22.3| CPU |---+---+---+---| |64  65  67  68 | PIXEL On screen PF0 | 68         71 | 72         75 | 76         79 | 80         83 | TIA |22.6       23.6|24           25|25.3       26.3|26.6       27.6| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       4       |       5       |       6       |       7       | BIT |---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| | 0   1   2   3 | 4   5   6   7 | 8   9  10  11 |12  13  14  15 | PIXEL PF1 | 84         87 | 88         91 | 92         95 | 96         99 |100         103|104         107|108         111|112         115| TIA | 28         29 |29.3       30.3|30.6       31.6| 32         33 |33.3       34.3|34.6       35.6| 36         37 |37.3       38.3| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       7       |       6       |       5       |       4       |       3       |       2       |       1       |       0       | BIT |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| |16  17  18  19 |20  21  22  23 |24  25  26  27 |28  29  30  31 |32  33  34  35 |36  37  38  39 |40  41  42  43 |44  45  46  47 | PIXEL PF2 |116         119|120         123|124         127|128         131|132         135|136         139|140         143|144         147| TIA |38.6       39.6| 40         41 |41.3       42.3|42.6       43.6| 44         45 |45.3       46.3|46.6       47.6| 48         49 | CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       0       |       1       |       2       |       3       |       4       |       5       |       6       |       7       | BIT |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| |48  49  50  51 |52  53  54  55 |56  57  58  59 |60  61  62  63 |64  65  66  67 |68  69  70  71 |72  73  74  75 |76  77  78  79 | PIXEL PF2 |148         151|152         155|156         159|160         163|164         167|168         171|172         175|176         179| TIA |49.3       50.3|50.6       51.6| 52         53 |53.3       54.3|54.6       55.6| 56         57 |57.3       58.3|58.6       59.6| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       7       |       6       |       5       |       4       |       3       |       2       |       1       |       0       | BIT |---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |80  81  82  83 |84  85  86  87 |88  89  90  91 |92  93  94  95 |96  97  98  99 |100 101 102 103|104 105 106 107|108 109 110 111| PIXEL PF1 |180         183|184         187|188         191|192         195|196         199|200         203|204         207|208         211| TIA | 60         61 |61.3       62.3|62.6       63.6| 64         65 |65.3       66.3|66.6       67.6| 68         69 |69.3       70.3| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       0       |       1       |       2       |       3       |       4       |       5       |       6       |       7       | BIT |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---| |112 113 114 115|116 117 118 119|120 121 122 123|124 125 126 127|128 129 130 131|132 133 134 135|136 137 138 139|140 141 142 143| PIXEL PF0 |212         215|216         219|220         223|224         227| TIA |70.6       71.6| 72         73 |73.3       74.3|74.6       75.6| CPU |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |       7       |       6       |       5       |       4       | BIT |---+---+---+---|---+---+---+---|---+---+---+---+---+---+---+---| |144 145 146 147|148 149 150 151|152 153 154 155|156 157 158 159| PIXEL
     
  2. azure
    This is very early version of my first Atari 2600 game. It is is intended be more feature filled than the Blackjack game released by Atari. My goals are accurate casino play, higher quality graphics, and supporting a true multi-deck shoe without dealing duplicate cards.

    Why am I making this game? I like Blackjack, and I don't like the official Atari version. The Atari 2600 is the reason I became a programmer, so I'm somewhat fond of the 2600 and 6502 programming. I made an attempt in 2008 with a different game concept, but I didn't have the time to work on it. I had accepted a new job that kept me extremely busy.

    The joystick controls are simple:
    Press down to HIT. Press up to STAY. Press fire to begin a new game.
    Why Theta VIII? You're an unfortunate guest of the Hotel Royale on the planet Theta VIII.


    Roadmap

    This is a work in progress, so the features are very limited. The controls will evolve as features are added. The core game play appears to be working, but it's not well tested. The status bar at the bottom displays the player's score, dealer's score, and the current game state. Those will be removed in future revisions, but the status bar will show message prompts, chip totals, and win/loss status.

    I'm posting on my blog to stay off the forums for now. This version is way too early for game reviews. It's bare bones. I have to return to my other work for a while, so my rate of progress will slow down for a while. I hope I can have it complete after about a year.

    I have plans to add many more features and user interface touches. Here's a short list in order of descending priority (although they're all important):
    accurate casino game play with betting, double down, splitting (only 1 split planned), surrender, insurance, etc no duplication of cards (cards are unique by deck, rank, and suit) betting mechanics and player's chip management sound effects a 2nd player: paging left and right will switch between players. I gave up my original plan to show 3 hands on a single screen. It won't be practical. support for 1 deck with 75% penetration and up to 4 decks with less penetration improving UI feedback: getting rid of the ugly Hit/Stay/Win/Lose graphics; using the bottom status bar instead lots of game options and variations (such as dealer hits on soft 17, early or late surrender, color scheme, number of decks, etc) sprite animations more graphic touches
    Accurate game play is my number one priority. My goal is for card counting to actually work with a single player, 1 or 2 deck game, which requires that no duplicate cards can be dealt, random numbers must be unbiased, and the deck is dealt to a realistic depth of penetration (between 50% to 75%).


    Technical Details

    I've attached the binary and some screenshots, but not the source. I'll attach the source after I've rewritten a few messy subroutines. I'm somewhat inexperienced with 6502 assembly, so there's lots of room for optimizing the code (and data). Let me know if you find any bugs or inconsistent scan line counts. I'm rendering at 262 lines. When I release the source, I hope to get some tips on better assembly programming. Until then I just really like solving problems on my own.

    The only problem I've been unable to solve so far is I couldn't get the joystick latches to work. I had to write my own latch logic, but I'd prefer to use the hardware latches to free up some space.

    You're probably wondering how I'm storing 4 decks in 128 bytes. Well, I'm not. I'm storing the cards in play (meaning they're dealt to an active hand) in a packed format. I'm currently using this format:


    ; Card: Single packed; deck suit rank; Bits: 7 6 5 4 3 2 1 0;; Rank: 0-13 = ranks Ace through King; 14-15 = unused

    The discard pile is a different situation from the active cards in play. I'm currently not storing discards. Cards shifted off screen are summed into a total, which doesn't work for preventing duplicates. A combination of strategies is what's going to work.

    The discard pile doesn't require knowing who has which card. It only needs to know which card is available to deal, so I could use a bitmap. Four decks contains 208 cards. If one card is one bit, then the entire 4-deck shoe can be stored in an array of 26 bytes.


    ; Cards 0 to 8 : 7 6 5 4 3 2 1 0; Cards 9 to 16 : 7 6 5 4 3 2 1 0; Cards 17 to 24 : 7 6 5 4 3 2 1 0; Cards 25 to 32 : 7 6 5 4 3 2 1 0; Cards 33 to 40 : 7 6 5 4 3 2 1 0; ...

    The average hand consumes about 4 to 6 cards, so the RAM usage is low for the average case. The trouble is dealing with worst case scenarios, which could deal 20 or more cards to a single player given multiple decks and splitting hands. The worst case contains all the lowest valued cards for both the player's and dealer's hands.

    I have to balance the worst case scenario of active cards in play with the format for the discard pile. If I don't go with the bitmap, then I'll have to settle for implementing a circular buffer for storing the discards. It will truncate the card history, but would only affect a very small percentage of hands.

    I currently have about 45 bytes of RAM free. I'm wasteful with RAM, so I have some easy optimizations to make for freeing up space.

    This version represents the culmination of about 1 month's work so far. I spent a week rewriting code that wasn't going to work, and then spent another 2 weeks goofing around with writing my own horizontal and vertical positioning algorithms. In the end I just ended up just using the divide by 15 method. Heh. Heh. SkipDraw is not used, because the vertical positioning in this game is trivial. Nothing moves and everything is divided into fixed size rows.


    Hardware Testing

    The game is completely untested on hardware, because I don't have a Harmony cart. I'll get one sooner or later.
  3. azure
    I've completed another small milestone with my project. Most of the updates aren't visible to the user, but I added a new message bar which I think looks a lot better than what was there before. The most significant update is the addition of the discard pile and reshuffling logic. The discard pile prevents duplicate cards from being dealt. A duplicate card in my game is two cards with the same deck, suit, and rank values.

    The game is still minimal, but the basic play is working much better compared to the last update. The features so far include;
    basic play for 1 player 4 decks of cards 6 on screen cards cards pushed off screen are stored as a sum tracking of discarded cards deck penetration to 75% reshuffle upon reaching 75% message bar for prompts and win/loss results status bar that displays player and dealer scores event driven loop: it makes it easy to split computations across frames and greatly simplifies game logic
    Joystick Controls:
    Down for hit Up for stand or start new game Fire for start new game
    Current Problems:

    I'm running out of ROM space, so I've had to make significant changes in order to reduce ROM usage. I pushed many of my MACROs into subroutines to reduce repetitive code. The game is very light on the CPU, so I have plenty of CPU to work with. Subroutine overhead is not really an issue even within the kernel, because the gap spaces are available for computation. The player will be idle for 1 to 2 seconds before they make a move, so that gives me more than enough frames for computations.

    I may have to switch to an 8K ROM if I want to keep most of the features I originally planned for. I will be adding sound and possibly some animations, so realistically that's not going work with my current 4K implementation. I really wanted to remain at 4K, so I'm going to dig deep into refactoring. The sprites can be compressed a little by overlapping whitespace., but more savings can be made by compressing the title screen's graphic. The title screen uses very little RAM and CPU, so decompressing it on the fly to RAM might work if I horizontally split the graphic into three smaller pieces with gaps in between. The gaps provide time for loading the next block.

    Despite all that, I still think I will eventually end up going to 8K. Maybe I'll have a 4K version and an 8K enhanced version. I'm unsure.

    As for RAM space, I've still got 25 bytes of RAM free. I'm thinking about cutting out the 2nd player option and reducing the on-screen cards to only 5. Those changes would free up 11 bytes. I'm using 8 bytes for the stack, so I could probably save 2 bytes there. I might be able to save another 3 to 6 bytes by merging a few variables and recalculating scores on the fly. The discard pile uses 26 bytes of RAM, which is at its minimum possible size.

    I use 2 sets of sprite pointers for displaying the upper and lower halves of the cards. The 2nd set consumes an extra 12 bytes, so this has bothered me from the start, so I'll be thinking about how to free those bytes up. VDEL might work for me here, but I need to understand it better.

    I had been thinking about supporting 6 and 8 decks of cards, but I can't currently do it, because it needs another 26 bytes of RAM and significant changes to the bit packing. I could support it by cutting out the 2nd player and the ability to split hands, but I'm prioritizing accurate game play, so I will be going ahead with split hands and only 4 decks.

    There is some infrequent screen bounce that happens when the discard pile is close to 75% capacity. The problem is caused by my card dealing logic, which has to enter retry logic whenever the random number generator selects an already discarded card. I have a plan for fixing it, but it will require rewriting my card dealing routine.

    I'm still not completely sure how I'm going to display the player's chips and how the betting mechanics are going to work. I have some ideas, but they're rudimentary. I'll be working on that part next along with refactoring the code to reclaim more ROM space.

    Programming:

    Here's a quick description of my discard pile's layout and how they're indexed by the cards.
     
    The cards are represented as a byte.
     
     
     

    ; card: single packed; deck suit rank; bits: 7 6 5 4 3 2 1 0;; rank: 0 = empty card slot; 1-13 = ranks ace through king; 14-15 = unused
     

    The discard pile is an array of 26 bytes. Each byte represents 8 cards and each nibble is a composite of deck and suit values. A card is flagged as discarded if its bit is set to 1.
     
    The card's rank (low nibble) selects the row in the discard pile. The deck and suit (high nibble) select the bit within a row. Furthermore, bit 7 determines which row of decks the card belongs in.

    Shuffling the decks simply erases the discard pile and re-inserts cards from the player and dealer's currently active hands.

    Bit assignments:
    Diamonds: bit 0 or 4 Clubs: bit 1 or 5 Hearts: bit 2 or 6 Spades: bit 3 or 7

    ; suits suits; | S | H | C | D | S | H | C | D |; ---------|----|---|---|----|----|---|---|----|------; byte|rank| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | index; ----|----|----|---|---|----|----|---|---|----|------; 1 A |.................|.................| 0; 2 2 |.................|.................| 1; 3 3 |.................|.................| 2; 4 4 |.................|.................| 3; 5 5 |.................|.................| 4; 6 6 |.. ..|.. ..| 5; 7 7 |.. Deck 1 (01) ..|.. Deck 0 (00) ..| 6; 8 8 |.. ..|.. ..| 7; 9 9 |.................|.................| 8; 10 10 |.................|.................| 9; 11 J |.................|.................| 10; 12 Q |.................|.................| 11; 13 K |.................|.................| 12; ----|----|-----------------|-----------------|------; 14 A |.................|.................| 13; 15 2 |.................|.................| 14; 16 3 |.................|.................| 15; 17 4 |.................|.................| 16; 18 5 |.................|.................| 17; 19 6 |.. ..|.. ..| 18; 20 7 |.. Deck 3 (11) ..|.. Deck 2 (10) ..| 19; 21 8 |.. ..|.. ..| 20; 22 9 |.................|.................| 21; 23 10 |.................|.................| 22; 24 J |.................|.................| 23; 25 Q |.................|.................| 24; 26 K |.................|.................| 25; ----|----|----|---|---|----|----|---|---|----|------; byte|rank| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | index; ---------|----|---|---|----|----|---|---|----|------
×
×
  • Create New...