Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #include <stdint.h>
  2. #include <stdbool.h>
  3.  
  4. #define REG8(addr) *((volatile uint8_t *) addr)
  5. #define REG16(addr) *((volatile uint16_t *) addr)
  6. #define REG32(addr) *((volatile uint32_t *) addr)
  7.  
  8. #define JOY_DATA REG8(0x1F801040)
  9. #define JOY_STAT REG16(0x1F801044)
  10. #define JOY_MODE REG16(0x1F801048)
  11. #define JOY_CTRL REG16(0x1F80104A)
  12. #define JOY_BAUD REG16(0x1F80104E)
  13.  
  14. // Stores 0x2000 for second slot and 0x0000 for first slot
  15. static uint16_t slotMask;
  16.  
  17. void card_delay(int time) {
  18.     // To be demangled
  19. }
  20.  
  21. void card_init() {
  22.     JOY_CTRL = 0x0040; // Reset I/O unit
  23.     JOY_BAUD = 0x0043; // Clock speed: 505504.48KHz
  24.     JOY_MODE = 0x000D;
  25.     JOY_CTRL = slotMask | 0x0002;
  26.     card_delay(10);
  27.  
  28.     JOY_CTRL = 0x0000;
  29.     card_delay(10000);
  30. }
  31.  
  32. int card_transceive(uint8_t txData) {
  33.     JOY_DATA = txData; // Store output byte on TX buffer
  34.     JOY_CTRL = slotMask | 0x0003; // Begin transference
  35.    
  36.     int retry = 100000;
  37.     while (JOY_STAT & 0x0002 == 0) { // Wait until a byte is received
  38.         if (retry-- == 0) { // If no data has been received when retry is zero, return -1
  39.             return -1;
  40.         }
  41.     }
  42.  
  43.     JOY_CTRL = slotMask | 0x0002; // Clear RX mask
  44.     int rxData = JOY_DATA; // Read data
  45.     card_delay(5);
  46.     return rxData;
  47. }
  48.  
  49. bool card_acknowledge() {
  50.     int retry = 100000;
  51.     while (JOY_STAT & 0x0080 != 0) { // Wait until /ACK goes low
  52.         if (retry-- == 0) { // If no acknowledgement has been issued when retry is zero, return false
  53.             return false;
  54.         }
  55.     }
  56.  
  57.     JOY_CTRL |= 0x0010; // Clear ACK flag
  58.     return true;
  59. }
  60.  
  61. bool card_check(bool secondSlot) {
  62.     if (secondSlot) {
  63.         slotMask = 0x2000;
  64.     } else {
  65.         slotMask = 0x0000;
  66.     }
  67.  
  68.     card_init();
  69.  
  70.     JOY_CTRL = slotMask | 0x0002;
  71.     card_delay(100);
  72.  
  73.     card_transceive(0x21);
  74.     if (!card_acknowledge()) {
  75.         return false;
  76.     }
  77.     bool ok = card_transceive(0x53) & 0xF0 == 0;
  78.  
  79.     JOY_CTRL = 0x0000;
  80.     card_init();
  81.  
  82.     return ok;
  83. }