Example #1
0
char *clipboard_read_screen_output(const char *line_ending)
{
    char * outputbuffer = NULL;

    do {
        uint16_t base;
        uint8_t allrows, allcols;
        unsigned int row, col;
        unsigned int size;
        unsigned int line_ending_length = (unsigned int)strlen(line_ending);
        unsigned int i;
        int bank;
        char * p;

        mem_get_screen_parameter(&base, &allrows, &allcols, &bank);

        size = allrows * (allcols + line_ending_length) + 1;

        outputbuffer = lib_malloc(size);
        if (outputbuffer == NULL) {
            break;
        }

        p = outputbuffer;

        for (row = 0; row < allrows; row++) {
            char * last_non_whitespace = p - 1;

            for (col = 0; col < allcols; col++) {
                uint8_t data;

                data = mem_bank_peek(bank, base++, NULL);
                data = charset_p_toascii(charset_screencode_to_petcii(data), 1);

                if (data != ' ') {
                    last_non_whitespace = p;
                }
                *p++ = data;
            }

            /* trim the line if there are only whitespace at the end */

            if (last_non_whitespace < p) {
                p = last_non_whitespace + 1;
            }

            /* add a line-ending */

            for (i = 0; i < line_ending_length; i++) {
                *p++ = line_ending[i];
            }
        }

        *p = 0;

        assert(p < outputbuffer + size);
    } while (0);

    return outputbuffer;
}
Example #2
0
BYTE *charset_petconvstring(BYTE *c, int dir)
{
    BYTE *s = c, *d = c;
    int ch;

    switch (dir) {
      case 0: /* To petscii.  */
        while (*s) {
            if ((ch = test_lineend(s))) {
                *d++ = 0x0d; /* petscii CR */
                s += ch;
            } else {
                *d++ = charset_p_topetcii(*s);
                s++;
            }
        }
        break;

      case 1: /* To ascii. */
        while (*s) {
            *d++ = charset_p_toascii(*s, 0);
            s++;
        }
        break;

      case 2: /* To ascii, convert also screencodes. */
        while (*s) {
            *d++ = charset_p_toascii(*s, 1);
            s++;
        }
        break;
      default:
        log_error(LOG_DEFAULT, "Unkown conversion rule.");
    }

    *d = 0;

    return c;
}
Example #3
0
static void memory_to_string(char *buf, MEMSPACE mem, WORD addr,
                             unsigned int len, bool petscii)
{
    unsigned int i;
    BYTE val;

    for (i = 0; i < len; i++) {
        val = mon_get_mem_val(mem, addr);

        if (petscii) {
            buf[i] = charset_p_toascii(val, 0);
        }

        buf[i] = isprint(val) ? val : '.';

        addr++;
    }
}
Example #4
0
static int print_char(ascii_t *ascii, unsigned int prnr, BYTE c)
{
    BYTE asc;

    switch (c) {
    case 8: /* bitmap mode */
        return 0;
    case 10: /* linefeed */
        break;
    case 13: /* return */
        /* ascii->mode = 0; */ /* ? */
        break;
    case 14:  /* EN on*/
    case 15:  /* EN off*/
    case 16:  /* POS*/
        return 0;
    case 17: /* lowercase */
        ascii->mode = 1;
        return 0;
    case 18: /* revers on */
        return 0;
    case 145: /* uppercase */
        ascii->mode = 0;
        return 0;
    case 146: /* revers off */
        return 0;
    }

    /* fix duplicated chrout codes */
    if ((c >= 0x60) && (c <= 0x7f)) {
        /* uppercase */
        c = ((c - 0x60) + 0xc0);
    }

    if (ascii->mode == 0) {
        /* uppercase / graphics mode */
        if ((c >= 0x41) && (c <= 0x5a)) {
            /* lowercase (petscii 0x41 -) */
            c += 0x80; /* convert to uppercase */
        } else if ((c >= 0xc1) && (c <= 0xda)) {
            /* uppercase (petscii 0xc1 -) */
            c = '.'; /* can't convert gfx characters */
        }
    }

    asc = charset_p_toascii(c, 0);

    if (output_select_putc(prnr, asc) < 0) {
        return -1;
    }
    ascii->pos++;

    if (asc == '\n') {
        ascii->pos = 0;
#if defined(__MSDOS__) || defined(WIN32) || defined(__OS2__) || defined(__BEOS__)
        if (output_select_putc(prnr, '\r') < 0) {
            return -1;
        }
#endif
    }

    if (ascii->pos == CHARSPERLINE) {
        ascii->pos = 0;
        if (output_select_putc(prnr, '\n') < 0) {
            return -1;
        }
#if defined(__MSDOS__) || defined(WIN32) || defined(__OS2__) || defined(__BEOS__)
        if (output_select_putc(prnr, '\r') < 0) {
            return -1;
        }
#endif
    }

    return 0;
}
Example #5
0
void mon_memory_display(int radix_type, MON_ADDR start_addr, MON_ADDR end_addr, mon_display_format_t format)
{
    unsigned int i, cnt = 0, len, max_width, real_width;
    WORD addr = 0;
    char printables[50];
    char prefix;
    MEMSPACE mem;
    WORD display_number;
    BYTE v;

    prefix = (format == DF_PETSCII) ? '>' : '*';

    if (radix_type) {
        if (radix_type != e_hexadecimal && radix_type != e_decimal && radix_type != e_octal) {
            max_width = (console_log->console_xres - 12)
                        / (radix_chars_per_byte[radix_type] + 2);
        } else {
            max_width = (4 * (console_log->console_xres - 12))
                        / (4 * (radix_chars_per_byte[radix_type] + 2) + 1);
        }

        max_width &= ~3;

        display_number = max_width * ((console_log->console_yres - 6) / 2);
    } else {
        max_width = 40;
        display_number = 128;
    }

    len = mon_evaluate_address_range(&start_addr, &end_addr, FALSE,
                                     display_number);
    mem = addr_memspace(start_addr);
    addr = addr_location(start_addr);

    while (cnt < len) {
        mon_out("%c%s:%04x ", prefix, mon_memspace_string[mem], addr);
        for (i = 0, real_width = 0; i < max_width; i++) {
            v = mon_get_mem_val(mem, (WORD)ADDR_LIMIT(addr + i));

            switch (radix_type) {
                case 0: /* special case == petscii text */
                    if (format == DF_PETSCII) {
                        mon_out("%c", charset_p_toascii(v, 1));
                    } else {
                        mon_out("%c", charset_p_toascii(
                                    charset_screencode_to_petcii(v), 1));
                    }
                    real_width++;
                    cnt++;
                    break;
                case e_decimal:
                    memset(printables, 0, 50);
                    if (!(cnt % 4)) {
                        mon_out(" ");
                    }
                    if (cnt < len) {
                        mon_out("%03d ", v);
                        real_width++;
                        cnt++;
                    } else {
                        mon_out("    ");
                    }
                    break;
                case e_hexadecimal:
                    memset(printables, 0, 50);
                    if (!(cnt % 4)) {
                        mon_out(" ");
                    }
                    if (cnt < len) {
                        mon_out("%02x ", v);
                        real_width++;
                    } else {
                        mon_out("   ");
                    }
                    cnt++;
                    break;
                case e_octal:
                    memset(printables, 0, 50);
                    if (!(cnt % 4)) {
                        mon_out(" ");
                    }
                    if (cnt < len) {
                        mon_out("%03o ", v);
                        real_width++;
                        cnt++;
                    } else {
                        mon_out("    ");
                    }
                    break;
                case e_binary:
                    memset(printables, 0, 50);
                    if (cnt < len) {
                        mon_print_bin(v, '1', '0');
                        mon_out(" ");
                        real_width++;
                        cnt++;
                    } else {
                        mon_out("         ");
                    }
                    break;
                default:
                    return;
            }
        }

        if (radix_type != 0) {
            memory_to_string(printables, mem, addr, real_width, FALSE);
            mon_out("  %s", printables);
        }
        mon_out("\n");
        addr = ADDR_LIMIT(addr + real_width);
        if (mon_stop_output != 0) {
            break;
        }
    }

    set_addr_location(&(dot_addr[mem]), addr);
}