Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.07 KB | None | 0 0
  1. /* 26 oct 2010 */
  2.  
  3. #include <stdio.h>
  4. #include <stdint.h>
  5. #include <stdlib.h>
  6.  
  7. FILE *fin, *fout;
  8.  
  9. typedef uint8_t byte;
  10. typedef uint16_t word;
  11. typedef uint32_t ulong;
  12.  
  13. byte readbyte(void) { byte b; fread(&b, 1, 1, fin); return b; }
  14. void writebyte(byte b) { fwrite(&b, 1, 1, fout); }
  15. #define SEEK(k) fseek(fin, k, SEEK_SET)
  16. #define TELL()  ftell(fin)
  17.  
  18. void getsamp(ulong start)
  19. {
  20.     word off, n;
  21.     ulong saveaddr;
  22.     ulong newaddr = 0;
  23.     ulong bankbase = start & 0xFF8000;
  24.    
  25.     saveaddr = start;
  26.     for (;;) {
  27.         SEEK(saveaddr);
  28.         off = readbyte();
  29.         if (off == 0)
  30.             break;
  31.         off |= (readbyte() << 8);
  32.         if (off != 0xFF)
  33.             newaddr = bankbase + (off & 0x7FFF);
  34.         n = readbyte();
  35.         n |= (readbyte() << 8);
  36.         readbyte(); readbyte(); /* skip speed and padding byte */
  37.         saveaddr = TELL();
  38.         SEEK(NEWADDR);
  39.         for (; n; n--)
  40.             writebyte(readbyte);
  41.     }
  42. }
  43.  
  44. int main(int argc, char *argv[])
  45. {
  46.     ulong addr;
  47.  
  48.     fin = fopen(argv[1], "rb");
  49.     fout = fopen(argv[2], "wb");
  50.     addr = strtoul(argv[3], NULL, 16);
  51.     getsamp(addr);
  52.     fclose(fin);
  53.     fclose(fout);
  54.     return 0;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement