Annotation of uae/disk.cc, revision 1.1

1.1     ! root        1:  /* 
        !             2:   * UAE - The Unusable Amiga Emulator
        !             3:   * 
        !             4:   * disk support v0.0
        !             5:   * v0.0: 950312
        !             6:   *
        !             7:   * (c) 1995 Bernd Schmidt
        !             8:   */
        !             9: 
        !            10: #include <iostream.h>
        !            11: #include <iomanip.h>
        !            12: #include <unistd.h>
        !            13: #include <stdio.h>
        !            14: 
        !            15: #include "amiga.h"
        !            16: #include "disk.h"
        !            17: 
        !            18: static int side, direction, step;
        !            19: static UBYTE selected = 15;
        !            20: static bool dskready;
        !            21: 
        !            22: class drive {
        !            23:   FILE *diskfile;
        !            24:   unsigned int track;
        !            25:   unsigned int motoroff;
        !            26:   unsigned int trackoffs,insecpos;
        !            27:   bool secok;
        !            28:   UBYTE secbuf[544];
        !            29:   UWORD mfmbuf[544];
        !            30:   ULONG getseculong(unsigned int offset);
        !            31:   ULONG getmfmulong(unsigned int offset);
        !            32:   void readsec();
        !            33: public:
        !            34:   drive(char *fname=0);
        !            35:   void eject();
        !            36:   void insert(char *fname);
        !            37:   void step();
        !            38:   bool track0() { return track == 0; }
        !            39:   bool empty() { return diskfile == 0; }
        !            40:   void motor(int off);
        !            41:   void GetData(UWORD &,UWORD &);
        !            42: };
        !            43: 
        !            44: drive::drive(char *fname)
        !            45: {
        !            46:   diskfile = 0;
        !            47:   if (fname != 0) insert(fname);
        !            48:   track = 0;
        !            49:   motoroff = 1;
        !            50: }
        !            51: 
        !            52: void drive::eject()
        !            53: {
        !            54:   if (diskfile != 0) fclose(diskfile);
        !            55:   diskfile = 0;
        !            56: }
        !            57: 
        !            58: void drive::insert(char *fname)
        !            59: {
        !            60:   diskfile = fopen(fname,"r+");
        !            61: }
        !            62: 
        !            63: void drive::step()
        !            64: {
        !            65:   if (direction) {
        !            66:     if (track) track--;
        !            67:   } else {
        !            68:     if(track<85) track++;
        !            69:   }
        !            70: }
        !            71: 
        !            72: void drive::motor(int off) 
        !            73: {
        !            74:   if (motoroff && !off) { trackoffs = 0; insecpos = 0; secok = false; }
        !            75:   motoroff = off;
        !            76: }
        !            77: 
        !            78: ULONG drive::getmfmulong(unsigned int offs)
        !            79: {
        !            80:   return (mfmbuf[offs] << 16) | mfmbuf[offs+1];
        !            81: }
        !            82: 
        !            83: ULONG drive::getseculong(unsigned int offs)
        !            84: {
        !            85:   return (secbuf[offs] << 24) | (secbuf[offs+1] << 16) | (secbuf[offs+2] << 8)
        !            86:     | (secbuf[offs+3]);
        !            87: }
        !            88: 
        !            89: void drive::readsec()
        !            90: {
        !            91:   int i;
        !            92:   secbuf[0] = secbuf[1] = 0x00;
        !            93:   secbuf[2] = secbuf[3] = 0xa1;
        !            94:   secbuf[4] = 0xff;
        !            95:   secbuf[5] = track*2+side;
        !            96:   secbuf[6] = trackoffs;
        !            97:   secbuf[7] = 10-trackoffs;
        !            98:   for(i=8;i<24;i++) secbuf[i] = 0;
        !            99:   fseek(diskfile,((track*2+side)*11+trackoffs)*512,SEEK_SET);
        !           100:   fread(&secbuf[32],sizeof(UBYTE),512,diskfile);
        !           101: 
        !           102:   mfmbuf[0] = mfmbuf[1] = 0xaaaa;
        !           103:   mfmbuf[2] = mfmbuf[3] = 0x4489;
        !           104:   ULONG deven,dodd;
        !           105:   deven = getseculong(4); dodd = deven >> 1;
        !           106:   deven &= 0x55555555; dodd &= 0x55555555;
        !           107:   mfmbuf[4] = dodd >> 16; mfmbuf[5] = dodd;
        !           108:   mfmbuf[6] = deven>> 16; mfmbuf[7] = deven;
        !           109:   for (i=8;i<48;i++) mfmbuf[i] = 0;
        !           110:   for (i=0;i<512;i+=4){
        !           111:     deven = getseculong(i+32);
        !           112:     dodd = deven >> 1;
        !           113:     deven &= 0x55555555; dodd &= 0x55555555;
        !           114:     mfmbuf[(i>>1)+32] = dodd >> 16; mfmbuf[(i>>1)+33] = dodd;
        !           115:     mfmbuf[(i>>1)+256+32] = deven>> 16; mfmbuf[(i>>1)+256+33] = deven;
        !           116:   }
        !           117:   
        !           118:   ULONG hck=0,dck=0;
        !           119:   for(i=4;i<24;i+=2) hck += getmfmulong(i);
        !           120:   deven = dodd = hck; dodd >>= 1;
        !           121:   mfmbuf[24] = dodd >> 16; mfmbuf[25] = dodd;
        !           122:   mfmbuf[26] = deven>> 16; mfmbuf[27] = deven;
        !           123:   for(i=32;i<544;i+=2) dck += getmfmulong(i);
        !           124:   deven = dodd = dck; dodd >>= 1;
        !           125:   mfmbuf[28] = dodd >> 16; mfmbuf[29] = dodd;
        !           126:   mfmbuf[30] = deven>> 16; mfmbuf[31] = deven;  
        !           127:   secok = true;
        !           128: }
        !           129: 
        !           130: void drive::GetData(UWORD &mfm,UWORD &byt)
        !           131: {
        !           132:   if (!secok) readsec();
        !           133:   mfm = mfmbuf[insecpos]; byt = secbuf[insecpos++];
        !           134:   if (insecpos == 544){
        !           135:     secok = false; 
        !           136:     if (++trackoffs == 11) trackoffs = 0;
        !           137:   }
        !           138: }
        !           139: 
        !           140: static drive floppy[4];
        !           141: 
        !           142: void DISK_init()
        !           143: {
        !           144:   floppy[0].insert("wb13.adf");
        !           145: }
        !           146: 
        !           147: void DISK_select(UBYTE data)
        !           148: {
        !           149:   int step_pulse;
        !           150:   if (selected != ((data >> 3) & 15)) dskready = false;
        !           151:   selected = (data >> 3) & 15;
        !           152:   side = (data >> 2) & 1;
        !           153:   direction = (data >> 1) & 1;
        !           154:   step_pulse = data & 1;
        !           155:   if (step != step_pulse) {
        !           156:     step = step_pulse;
        !           157:     if (step == 0){
        !           158:       for (int dr=0;dr<4;dr++){
        !           159:        if (!(selected & (1<<dr))) {
        !           160:          floppy[dr].step();
        !           161:        }
        !           162:       }
        !           163:     }
        !           164:   }
        !           165:   for (int dr=0;dr<4;dr++){
        !           166:     if (!(selected & (1<<dr))) {
        !           167:       floppy[dr].motor(data >> 7);
        !           168:     }
        !           169:   }
        !           170: }
        !           171: 
        !           172: UBYTE DISK_status()
        !           173: {
        !           174:   UBYTE st = 0x3c;
        !           175:   if (dskready) st &= ~0x20;
        !           176:   dskready = true;
        !           177:   for (int dr=0;dr<4;dr++){
        !           178:     if (!(selected & (1 << dr))) {
        !           179:       if (floppy[dr].track0()) { st &= ~0x10; }
        !           180:       if (floppy[dr].empty()) { st &= ~0x4; }
        !           181:     }
        !           182:   }
        !           183:   return st;
        !           184: }
        !           185: 
        !           186: void DISK_GetData(UWORD &mfm,UWORD &byt)
        !           187: {
        !           188:   for (int dr=0;dr<4;dr++){
        !           189:     if (!(selected & (1<<dr))) {
        !           190:       floppy[dr].GetData(mfm,byt);
        !           191:     }
        !           192:   }
        !           193: }

unix.superglobalmegacorp.com

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