Changeset 1b74fa2 in thomson for code/C/HxCHost/pff/diskio.c


Ignore:
Timestamp:
Mar 10, 2012, 2:46:13 PM (12 years ago)
Author:
Adrien Destugues <pulkomandy@…>
Branches:
main
Children:
ee447bf
Parents:
53c4be3
Message:

work in progress write support.

  • With latest beta firmware there is no spinup problem anymore in direct access mode,
  • Read the CFG file and display settings menu
  • Save settings (not perfectly working yet)
  • Some tweaks all around.
  • Move code downwards in memory, because we run out of space !

git-svn-id: svn://localhost/thomson@18 85ae3b6b-dc8f-4344-a89d-598714f2e4e5

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/C/HxCHost/pff/diskio.c

    r53c4be3 r1b74fa2  
    1212extern unsigned char* secbuf;
    1313extern unsigned char mark[];
     14
     15static DWORD prevsec = -1;
    1416/*******/
    1517
     
    3537
    3638
     39void map_sector(DWORD sector, BYTE write)
     40{
     41        // Set LBA address
     42        int j = 8;
     43        mark[j++] = 1;
     44        mark[j++] = sector;
     45        mark[j++] = (sector>>8);
     46        mark[j++] = (sector>>16);
     47        mark[j++] = (sector>>24);
     48        mark[j++] = write;
     49        mark[j++] = 1; // Sector count
     50                // BEWARE of changing this to something else than 1 !
     51                // In write burst mode it could erase all the sectors you don't rewrite
     52
     53        // TODO extract a send_hxc_command function from this
     54        for(; j <512; j++) mark[j] = 0;
     55        write(255,0,mark);
     56}
     57
    3758
    3859/*-----------------------------------------------------------------------*/
     
    4768)
    4869{
    49         static DWORD prevsec = -1;
    5070        // TODO implement caching system
    5171        //  * If sector is reachable with current LBA, don't change it
    5272
    53         printhex(sector>>24);
    54         printhex(sector>>16);
    55         printhex(sector>>8);
    56         printhex(sector);
    57         mon_putc(' ');
    58 
    5973        if (prevsec != sector)
    6074        {
    61 
    62                 // Set LBA address
    63                 int j = 8;
    64                 mark[j++] = 1;
    65                 mark[j++] = sector;
    66                 mark[j++] = (sector>>8);
    67                 mark[j++] = (sector>>16);
    68                 mark[j++] = (sector>>24);
    69                 mark[j++] = 0; // Write disabled
    70                 mark[j++] = 6; // Sector count
    71                 for(; j <512; j++) mark[j] = 0;
    72                 write(255,0,mark);
    73 
     75                map_sector(sector, 0);
    7476                prevsec = sector;
    7577                // Read sector
     
    98100)
    99101{
    100         // TODO write it
    101         // Beware of using the sector buffer, read is doing caching there...
    102         DRESULT res = RES_ERROR;
    103 
     102        static WORD ptr;
     103        static char* wrbuf[256];
     104                // Separate buffer because we need to use map_sector, and it kills secbuf
    104105
    105106        if (!buff) {
    106107                if (sc) {
     108                        mon_putc('A');
     109                        // Initiate write process
     110                        prevsec = sc;
     111                        ptr = 0;
     112                } else {
     113                        mon_putc('C');
     114                        mon_putc(' ');
     115                        printhex(ptr);
     116                        // Called with both param = 0 - flush buffer to disk
     117                        // First make sure it's zero-filled
     118                        for(;ptr < 512; ++ptr)
     119                        {
     120                                *(wrbuf + ptr) = 0;
     121                        }
    107122
    108                         // Initiate write process
     123                        // map in the sector (no need to read from SD)
     124                        map_sector(prevsec, 0xA5);
    109125
    110                 } else {
     126                        for(int j = 0; j < 40; j++)
     127                                printhex(*(char*)(wrbuf + j));
    111128
    112                         // Finalize write process
    113 
     129                        write(255,1,wrbuf);
    114130                }
    115131        } else {
    116 
    117                 // Send data to the disk
    118 
     132                mon_putc('B');
     133                // Here SC is a bytecount. copy that much bytes to the buffer
     134                for(int j = 0; j <sc;++j)
     135                {
     136                *(char*)(wrbuf+ptr) = *(char*)(ptr++ + buff);
     137                }
    119138        }
    120139
    121         return res;
     140        return RES_OK;
    122141}
    123142
Note: See TracChangeset for help on using the changeset viewer.