cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

comm.c (2805B)


      1#include <gb/gb.h>
      2#include <stdint.h>
      3#include <stdio.h>
      4
      5unsigned char str[] = "Hello World!";
      6unsigned char buffer[32];
      7
      8void main(void)
      9{
     10    uint8_t i, n = 0;
     11    unsigned char *s;
     12
     13    puts("Byte");
     14    puts("  A      : Send");
     15    puts("  B      : Receive");
     16    puts("String");
     17    puts("  START  : Send");
     18    puts("  SELECT : Receive");
     19
     20    CRITICAL {
     21        add_SIO(nowait_int_handler);    // disable waiting VRAM state before return
     22    }
     23    set_interrupts(SIO_IFLAG);          // disable other interrupts. note: this disables sprite movement
     24
     25    while(1) {
     26        i = waitpad(J_A | J_B | J_START | J_SELECT);
     27        waitpadup();
     28
     29        if (i == J_A) {
     30            /* Send 1 byte */
     31            printf("Sending b... ");
     32            _io_out = n++;
     33            send_byte();
     34            /* Wait for IO completion... */
     35            while((_io_status == IO_SENDING) && (joypad() == 0));
     36            if(_io_status == IO_IDLE)
     37                printf("OK\n");
     38            else
     39                printf("#%d\n", _io_status);
     40        } else if (i == J_B) {
     41            /* Receive 1 byte */
     42            printf("Receiving b... ");
     43            receive_byte();
     44            /* Wait for IO completion... */
     45            while((_io_status == IO_RECEIVING) && (joypad() == 0));
     46            if(_io_status == IO_IDLE)
     47                printf("OK\n%d\n", _io_in);
     48            else
     49                printf("#%d\n", _io_status);
     50        } else if (i == J_START) {
     51            /* Send a string */
     52            printf("Sending s... ");
     53            s = str;
     54            while(1) {
     55                _io_out = *s;
     56                do {
     57                    send_byte();
     58                    /* Wait for IO completion... */
     59                    while((_io_status == IO_SENDING) && (joypad() == 0));
     60                } while((_io_status != IO_IDLE) && (joypad() == 0));
     61                if(_io_status != IO_IDLE) {
     62                    printf("#%d\n", _io_status);
     63                    break;
     64                }
     65                if(*s == 0) break;
     66                s++;
     67            }
     68            if(_io_status == IO_IDLE) printf("OK\n");
     69        } else if (i == J_SELECT) {
     70            /* Receive a string */
     71            printf("Receiving s... ");
     72            s = buffer;
     73            while(1) {
     74                receive_byte();
     75                /* Wait for IO completion... */
     76                while((_io_status == IO_RECEIVING) && (joypad() == 0));
     77                if(_io_status != IO_IDLE) {
     78                    printf("#%d\n", _io_status); 
     79                    break;
     80                }
     81                *s = _io_in;
     82                if(*s == 0) break;
     83                s++;
     84            }
     85            if(_io_status == IO_IDLE) printf("OK\n%s\n", buffer);
     86        }
     87        /* In case of user cancellation */
     88        waitpadup();
     89    }
     90}