Annotation of uae/cia.cc, revision 1.1.1.1

1.1       root        1:  /* 
                      2:   * UAE - The Unusable Amiga Emulator
                      3:   * 
                      4:   * CIA chip support v0.1
                      5:   * v0.0: 950301 
                      6:   *       stubs
                      7:   * v0.1: 950304
                      8:   *       hopefully all the timer functionality is implemented correctly
                      9:   *
                     10:   * (c) 1995 Bernd Schmidt
                     11:   */
                     12: 
                     13: #include <iostream.h>
                     14: #include <iomanip.h>
                     15: 
                     16: #include "amiga.h"
                     17: #include "memory.h"
                     18: #include "disk.h"
                     19: 
                     20: static UBYTE ciaaicr,ciaaimask,ciabicr,ciabimask;
                     21: static UBYTE ciaacra,ciaacrb,ciabcra,ciabcrb;
                     22: static UWORD ciaata,ciaatb,ciabta,ciabtb;
                     23: static UWORD ciaala,ciaalb,ciabla,ciablb;
                     24: static ULONG ciaatod,ciabtod,ciaatol,ciabtol,ciaaalarm,ciabalarm;
                     25: static bool ciaatlatch,ciabtlatch;
                     26: static UBYTE ciaapra,ciaaprb,ciaadra,ciaadrb,ciaasdr;
                     27: static UBYTE ciabpra,ciabprb,ciabdra,ciabdrb,ciabsdr; 
                     28: static int div10,hsync,vsync;
                     29: 
                     30: static void setclr(UBYTE &p, UBYTE val)
                     31: {
                     32:   cout << "setclr\n";
                     33:   if (val & 0x80) {
                     34:     p |= val & 0x7F;
                     35:   } else {
                     36:     p &= ~val;
                     37:   }
                     38: }
                     39: 
                     40: static void RethinkICRA()
                     41: {
                     42:   if (ciaaimask & ciaaicr) {
                     43:     ciaaicr |= 0x80;
                     44:     mem.put_word(0xDFF09C,0x8008);
                     45:     cout << "CIA A int\n";
                     46:   } else {
                     47:     ciaaicr &= 0x7F;
                     48:     mem.put_word(0xDFF09C,0x0008);
                     49:   }
                     50: }
                     51: 
                     52: static void RethinkICRB()
                     53: {
                     54:   if (ciabimask & ciabicr) {
                     55:     ciabicr |= 0x80;
                     56:     mem.put_word(0xDFF09C,0xA000);
                     57:     cout << "CIA B int\n";
                     58:   } else {
                     59:     ciabicr &= 0x7F;
                     60:     mem.put_word(0xDFF09C,0x2000);
                     61:   }
                     62: }
                     63: 
                     64: UBYTE ReadCIAA(UWORD addr)
                     65: {
                     66:   UBYTE tmp;
                     67: 
                     68:   switch(addr & 0xf){
                     69:   case 0: 
                     70:     return (DISK_status() & 0x3C) | 0xc0; // no mouse
                     71:   case 1:
                     72:     return ciaaprb;
                     73:   case 2:
                     74:     return ciaadra;
                     75:   case 3:
                     76:     return ciaadrb;
                     77:   case 4:
                     78:     return ciaata & 0xff;
                     79:   case 5:
                     80:     return ciaata >> 8;
                     81:   case 6:
                     82:     return ciaatb & 0xff;
                     83:   case 7:
                     84:     return ciaatb >> 8;
                     85:   case 8:
                     86:     if (ciaatlatch) {
                     87:       ciaatlatch = 0;
                     88:       return ciaatol & 0xff;
                     89:     } else return ciaatod & 0xff;
                     90:   case 9:
                     91:     if (ciaatlatch) return (ciaatol >> 8) & 0xff;
                     92:     else return (ciaatod >> 8) & 0xff;
                     93:   case 10:
                     94:     ciaatlatch = 1; ciaatol = ciaatod; // ??? only if not already latched?
                     95:     return (ciaatol >> 16) & 0xff;
                     96:   case 12:
                     97:     return ciaasdr;
                     98:   case 13:
                     99:     tmp = ciaaicr; ciaaicr = 0; RethinkICRA(); return tmp;
                    100:   case 14:
                    101:     return ciaacra;
                    102:   case 15:
                    103:     return ciaacrb;
                    104:   }
                    105:   return 0;
                    106: }
                    107: 
                    108: UBYTE ReadCIAB(UWORD addr)
                    109: {
                    110:   UBYTE tmp;
                    111: 
                    112:   switch(addr & 0xf){
                    113:   case 0: 
                    114:     return ciabpra;
                    115:   case 1:
                    116:     return ciabprb;
                    117:   case 2:
                    118:     return ciabdra;
                    119:   case 3:
                    120:     return ciabdrb;
                    121:   case 4:
                    122:     return ciabta & 0xff;
                    123:   case 5:
                    124:     return ciabta >> 8;
                    125:   case 6:
                    126:     return ciabtb & 0xff;
                    127:   case 7:
                    128:     return ciabtb >> 8;
                    129:   case 8:
                    130:     if (ciabtlatch) {
                    131:       ciabtlatch = 0;
                    132:       return ciabtol & 0xff;
                    133:     } else return ciabtod & 0xff;
                    134:   case 9:
                    135:     if (ciabtlatch) return (ciabtol >> 8) & 0xff;
                    136:     else return (ciabtod >> 8) & 0xff;
                    137:   case 10:
                    138:     ciabtlatch = 1; ciabtol = ciabtod;
                    139:     return (ciabtol >> 16) & 0xff;
                    140:   case 12:
                    141:     return ciabsdr;
                    142:   case 13:
                    143:     tmp = ciabicr; ciabicr = 0; RethinkICRB(); return tmp;
                    144:   case 14:
                    145:     return ciabcra;
                    146:   case 15:
                    147:     return ciabcrb;
                    148:   }
                    149:   return 0;
                    150: }
                    151: 
                    152: void WriteCIAA(UWORD addr,UBYTE val)
                    153: {
                    154:   switch(addr & 0xf){
                    155:   case 0: 
                    156:     ciaapra = (ciaapra & ~0x3) | (val & 0x3); break;
                    157:   case 1:
                    158:     ciaaprb = val; break;
                    159:   case 2:
                    160:     ciaadra = val; break;
                    161:   case 3:
                    162:     ciaadrb = val; break;
                    163:   case 4:
                    164:     ciaala = (ciaala & 0xff00) | val;
                    165:     break;
                    166:   case 5:
                    167:     ciaala = (ciaala & 0xff) | (val << 8);
                    168:     if ((ciaacra & 1) == 0) ciaata = ciaala;
                    169:     if (ciaacra & 8) { ciaata = ciaala; ciaacra |= 1; }//??? load latch always?
                    170:     break;
                    171:   case 6:
                    172:     ciaalb = (ciaalb & 0xff00) | val;
                    173:     break;
                    174:   case 7:
                    175:     ciaalb = (ciaalb & 0xff) | (val << 8);
                    176:     if ((ciaacrb & 1) == 0) ciaatb = ciaalb;
                    177:     if (ciaacrb & 8) { ciaatb = ciaalb; ciaacrb |= 1; }
                    178:     break;
                    179:   case 8:
                    180:     if (ciaacrb & 0x80){
                    181:       ciaaalarm = (ciaaalarm & ~0xff) | val;
                    182:     } else {
                    183:       ciaatod = (ciaatod & ~0xff) | val;
                    184:     }
                    185:     break;
                    186:   case 9:
                    187:     if (ciaacrb & 0x80){
                    188:       ciaaalarm = (ciaaalarm & ~0xff00) | (val << 8);
                    189:     } else {
                    190:       ciaatod = (ciaatod & ~0xff00) | (val << 8);
                    191:     }
                    192:     break;
                    193:   case 10:
                    194:     if (ciaacrb & 0x80){
                    195:       ciaaalarm = (ciaaalarm & ~0xff0000) | (val << 16);
                    196:     } else {
                    197:       ciaatod = (ciaatod & ~0xff0000) | (val << 16);
                    198:     }
                    199:     break;
                    200:   case 12:
                    201:     ciaasdr = val; break;
                    202:   case 13:
                    203:     setclr(ciaaimask,val); break; // ??? call RethinkICR() ?
                    204:   case 14:
                    205:     ciaacra = val;
                    206:     if (ciaacra & 0x10){
                    207:       ciaacra &= ~0x10;
                    208:       ciaata = ciaala;
                    209:     }
                    210:     cout << "CIAACRA write" << val << "\n";
                    211:     break;
                    212:   case 15:
                    213:     ciaacrb = val; 
                    214:     if (ciaacrb & 0x10){
                    215:       ciaacrb &= ~0x10;
                    216:       ciaatb = ciaalb;
                    217:     }
                    218:     cout << "CIAACRB write" << val << "\n";
                    219:     break;
                    220:   }
                    221: }
                    222: 
                    223: void WriteCIAB(UWORD addr,UBYTE val)
                    224: {
                    225:   switch(addr & 0xf){
                    226:   case 0:
                    227:     ciabpra = (ciabpra & ~0x3) | (val & 0x3); break;
                    228:   case 1:
                    229:     ciabprb = val; DISK_select(val); break;
                    230:   case 2:
                    231:     ciabdra = val; break;
                    232:   case 3:
                    233:     ciabdrb = val; break;
                    234:   case 4:
                    235:     ciabla = (ciabla & 0xff00) | val;
                    236:     break;
                    237:   case 5:
                    238:     ciabla = (ciabla & 0xff) | (val << 8);
                    239:     if ((ciabcra & 1) == 0) ciabta = ciabla;
                    240:     if (ciabcra & 8) { ciabta = ciabla; ciabcra |= 1; } 
                    241:     break;
                    242:   case 6:
                    243:     ciablb = (ciablb & 0xff00) | val;
                    244:     break;
                    245:   case 7:
                    246:     ciablb = (ciablb & 0xff) | (val << 8);
                    247:     if ((ciabcrb & 1) == 0) ciabtb = ciablb;
                    248:     if (ciabcrb & 8) { ciabtb = ciablb; ciabcrb |= 1; }
                    249:     break;
                    250:   case 8:
                    251:     if (ciabcrb & 0x80){
                    252:       ciabalarm = (ciabalarm & ~0xff) | val;
                    253:     } else {
                    254:       ciabtod = (ciabtod & ~0xff) | val;
                    255:     }
                    256:     break;
                    257:   case 9:
                    258:     if (ciabcrb & 0x80){
                    259:       ciabalarm = (ciabalarm & ~0xff00) | (val << 8);
                    260:     } else {
                    261:       ciabtod = (ciabtod & ~0xff00) | (val << 8);
                    262:     }
                    263:     break;
                    264:   case 10:
                    265:     if (ciabcrb & 0x80){
                    266:       ciabalarm = (ciabalarm & ~0xff0000) | (val << 16);
                    267:     } else {
                    268:       ciabtod = (ciabtod & ~0xff0000) | (val << 16);
                    269:     }
                    270:     break;
                    271:   case 12:
                    272:     ciabsdr = val; break;
                    273:   case 13:
                    274:     setclr(ciabimask,val); break;
                    275:   case 14:
                    276:     ciabcra = val;
                    277:     if (ciabcra & 0x10){
                    278:       ciabcra &= ~0x10;
                    279:       ciabta = ciabla;
                    280:     }
                    281:     break;
                    282:     cout << "CIABCRA write" << val << "\n";
                    283:   case 15:
                    284:     ciabcrb = val; 
                    285:     if (ciabcrb & 0x10){
                    286:       ciabcrb &= ~0x10;
                    287:       ciabtb = ciablb;
                    288:     }
                    289:     break;
                    290:     cout << "CIBACRB write" << val << "\n";
                    291:   }
                    292: }
                    293: 
                    294: void CIA_reset()
                    295: {
                    296:   ciaatlatch = ciabtlatch = 0;
                    297:   ciaatod = ciabtod = 0;
                    298:   ciaaicr = ciabicr = ciaaimask = ciabimask = 0;
                    299:   ciaacra = ciaacrb = ciabcra = ciabcrb = 0x4; // outmode = toggle;
                    300:   div10 = 0; hsync = vsync = 0;
                    301: }
                    302: 
                    303: void CIA_hsync() { hsync = 1; }
                    304: void CIA_vsync() { vsync = 1; }
                    305: 
                    306: void CIA_cycle()
                    307: {
                    308:   int aovfla = 0, aovflb = 0, bovfla = 0, bovflb = 0;
                    309:   //int foo = ciaacra | ciaacrb | ciabcra | ciabcrb;
                    310: 
                    311:   if (++div10 > 9) {
                    312:  //   if (foo & 1) cout << "CIA is ON: ICRs "<< hex << (int)ciaaimask << " " << (int)ciabimask << "!\n";
                    313:     div10 = 0;
                    314:     // CIA A timers
                    315:     if ((ciaacra & 0x21) == 0x01) {
                    316:       if (ciaata-- == 0) {
                    317:        aovfla = 1;
                    318:        if ((ciaacrb & 0x61) == 0x41) {
                    319:          if (ciaatb-- == 0) aovflb = 1;
                    320:        }
                    321:       } 
                    322:     }
                    323:     if ((ciaacrb & 0x61) == 0x01) {
                    324:       if (ciaatb-- == 0) {
                    325:        aovflb = 1;
                    326:       }
                    327:     }
                    328:     // CIA B timers
                    329:     if ((ciabcra & 0x21) == 0x01) {
                    330:       if (ciabta-- == 0) {
                    331:        bovfla = 1;
                    332:        if ((ciabcrb & 0x61) == 0x41) {
                    333:          if (ciabtb-- == 0) bovflb = 1;
                    334:        }
                    335:       } 
                    336:     }
                    337:     if ((ciabcrb & 0x61) == 0x01) {
                    338:       if (ciabtb-- == 0) {
                    339:        bovflb = 1;
                    340:       }
                    341:     }
                    342:     if (aovfla) {
                    343:       ciaaicr |= 1; RethinkICRA();
                    344:       ciaata = ciaala;
                    345:       if (ciaacra & 0x8) ciaacra &= ~1;
                    346:     }
                    347:     if (aovflb) {
                    348:       ciaaicr |= 2; RethinkICRA();
                    349:       ciaatb = ciaalb;
                    350:       if (ciaacrb & 0x8) ciaacrb &= ~1;
                    351:     }
                    352:     if (bovfla) {
                    353:       ciabicr |= 1; RethinkICRB();
                    354:       ciabta = ciabla;
                    355:       if (ciabcra & 0x8) ciabcra &= ~1;
                    356:     }
                    357:     if (bovflb) {
                    358:       ciabicr |= 2; RethinkICRA();
                    359:       ciabtb = ciablb;
                    360:       if (ciabcrb & 0x8) ciabcrb &= ~1;
                    361:     }
                    362:   }
                    363:   if (hsync){
                    364:     hsync = 0;
                    365:     ciabtod++;
                    366:     ciabtod &= 0xFFFFFF;
                    367:     if (ciabtod == ciabalarm) {
                    368:       ciabicr |= 4; RethinkICRB();
                    369:     }
                    370:   }
                    371:   if (vsync){
                    372:     vsync = 0;
                    373:     ciaatod++;
                    374:     ciaatod &= 0xFFFFFF;
                    375:     if (ciaatod == ciaaalarm) {
                    376:       ciaaicr |= 4; RethinkICRA();
                    377:     }
                    378:   }
                    379:   
                    380: }
                    381: 
                    382: void dumpcia()
                    383: {
                    384:   cout << hex << setw(2);
                    385:   cout << "A: CRA: " << (int)ciaacra << " CRB: " <<(int)ciaacrb << "IMASK: " <<
                    386:     (int)ciaaimask << " TOD: " << ciaatod << (ciaatlatch ? " latched" : "") << 
                    387:       " TA: " << ciaata << " TB:" << ciaatb << "\n"; 
                    388:   cout << "B: CRA: " << (int)ciabcra << " CRB: " <<(int)ciabcrb << "IMASK: " <<
                    389:     (int)ciabimask << " TOD: " << ciabtod << (ciabtlatch ? " latched" : "") << 
                    390:       " TA:" << ciabta << " TB:" << ciabtb << "\n"; 
                    391: }
                    392: 
                    393: UWORD cia64k::wget(UWORD addr)
                    394: {
                    395:   return bget(addr+1);
                    396: }
                    397: 
                    398: UBYTE cia64k::bget(UWORD addr)
                    399: {
                    400:  // cout << "CIA read at " << addr << "\n";
                    401:   if ((addr & 0xF0FF) == 0xE001)
                    402:     return ReadCIAA((addr & 0xF00) >> 8);
                    403:   if ((addr & 0xF0FF) == 0xD000)
                    404:     return ReadCIAB((addr & 0xF00) >> 8);
                    405:   return 0;
                    406: }
                    407: 
                    408: void cia64k::wput(UWORD addr,UWORD value)
                    409: {
                    410:   bput(addr+1,value);
                    411: }
                    412: 
                    413: void cia64k::bput(UWORD addr,UBYTE value)
                    414: {
                    415: //  cout << "CIA write " << (int)value << " at " << addr << "\n";
                    416:   if ((addr & 0xF0FF) == 0xE001)
                    417:     WriteCIAA((addr & 0xF00) >> 8,value);
                    418:   if ((addr & 0xF0FF) == 0xD000)
                    419:     WriteCIAB((addr & 0xF00) >> 8,value);
                    420: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.