86#define CR_CMD_TIMEOUT_CYCLES 12500
87#define CR_FININ_TIMEOUT_CYCLES 250
170 int limit = ncards < 5 ? ncards : 5;
172 for (
int i = 0; i < limit; i++) {
174 const uint16_t *cols;
184 if (cols[2] != 0x0100)
187 for (
int j = 0; j < 12; j++) {
190 b[j >> 1] = (uint8_t)(nib << 4);
198 if (!(b[0] == 0x9e && b[1] == 0x80 &&
199 b[2] == 0x00 && b[4] == 0x9e && b[5] == 0x80))
201 "cardreader: card %d carries the row-8 loader marker but "
202 "decodes to %02x %02x %02x .. %02x %02x, not the usual "
203 "9E 80 00 .. 9E 80\n",
204 i, b[0], b[1], b[2], b[4], b[5]);
236 if (
ctx->card_idx ==
ctx->loader_card)
238 if (
ctx->post_loader_pack)
250 return ctx->pack || (
ctx->post_loader_pack &&
251 ctx->card_idx !=
ctx->loader_card);
450 "cardreader: no TU03N within %d cycles; presenting anyway "
501 if (ncols <= 0 || !cols || ctx->col_idx >= ncols) {
509 is_last_col = (ctx->
col_idx == ncols - 1);
519 present = (ctx->
half == 0) ? (uint8_t)((
byte >> 4) & 0x0f)
520 : (uint8_t)(
byte & 0x0f);
521 is_last = (ctx->
half == 1) && is_last_col;
524 is_last = is_last_col;
528 "cardreader: presenting card %d col %d half %d byte=0x%02x "
529 "val=0x%02x end=%d\n",
535 r->
bi20 = (pack_now && ctx->
half == 1);
544 if (pack_now && ctx->
half == 0) {
608 if (!ctx || !ctx->
deck)
618 if (!ctx || !ctx->
deck)
658 int auto_loader = -1;
660 fprintf(stderr,
"cardreader: failed to load deck '%s'\n", cap_path);
690 if (auto_loader < 0) {
691 int ncards = 0, only = -1;
702 "cardreader: one-card deck; card %d is its own loader\n",
707 if (auto_loader >= 0)
712 ctx->
card_idx = auto_loader >= 0 ? auto_loader : (first_card < 0 ? 0 : first_card);
741 "cardreader: loaded '%s', %d cards, last non-empty card=%d col=%d\n",
const uint16_t * cap_card_columns(const struct cap_deck *d, int i)
int cap_card_ncols(const struct cap_deck *d, int i)
int cap_num_cards(const struct cap_deck *d)
void cap_free(struct cap_deck *d)
struct cap_deck * cap_load(const char *path)
#define CR_CMD_TIMEOUT_CYCLES
static enum transcode_mode cr_effective_mode(struct ge *ge, struct cardreader_ctx *ctx)
int cardreader_register_packed(struct ge *ge, const char *cap_path, enum transcode_mode mode)
static struct cardreader_ctx * cr_find(struct ge *ge)
static int cardreader_deinit(struct ge *ge, void *opaque)
static void cr_next_card(struct cardreader_ctx *ctx)
int cardreader_cards_left(struct ge *ge)
static int cardreader_on_clock(struct ge *ge, void *opaque)
static void cr_trigger_present(struct ge *ge, struct cardreader_ctx *ctx)
int cardreader_register(struct ge *ge, const char *cap_path, enum transcode_mode mode)
static int cr_find_hollerith_loader_card(struct cap_deck *deck)
int cardreader_register_from(struct ge *ge, const char *cap_path, enum transcode_mode mode, int first_card)
static int cr_register(struct ge *ge, const char *cap_path, enum transcode_mode mode, int first_card, int pack)
static void cr_lupob_update(struct ge *ge, struct cardreader_ctx *ctx)
int cardreader_deck_cards(struct ge *ge)
#define CR_FININ_TIMEOUT_CYCLES
static int cr_pack_now(struct cardreader_ctx *ctx, enum transcode_mode m)
static void cr_finin_release(struct ge *ge, struct cardreader_ctx *ctx)
int ge_register_peri(struct ge *ge, struct ge_peri *p)
void ge_log(ge_log_type type, const char *format,...)
Log message.
@ LOG_READER
Integrated Reader.
void reader_setup_to_send(struct ge *ge, uint8_t data, uint8_t end)
void reader_clear_sending(struct ge *ge)
int end_of_card_presented
enum transcode_mode active_mode
int(* on_pulse)(struct ge *, void *)
int(* init)(struct ge *, void *)
int(* deinit)(struct ge *, void *)
int(* on_clock)(struct ge *, void *)
The entire state of the emulated system, including registers, memory, peripherals and timings.
struct ge_integrated_reader integrated_reader
The I/O interface for the integrated reader (RI)
uint8_t RASI
Channel 1 in transfer.
uint8_t transcode_column(uint16_t column, enum transcode_mode mode)