6 #include "hw_keyboard.h"
10 static dcpu16_hw_signal_t keyboard_reset_
;
11 static dcpu16_hw_signal_t keyboard_cycle_
;
12 static dcpu16_hw_signal_t keyboard_hwi_
;
13 static struct dcpu16_hw hw_
= {
14 .name_
= "Generic Keyboard (compatible)",
21 .cycle
= keyboard_cycle_
,
22 .reset
= keyboard_reset_
,
23 .data
= (struct keyboard_
*)NULL
29 DCPU16_WORD interrupt_message
;
33 void keyboard_reset_(struct dcpu16
*vm
, void *data
) {
34 struct keyboard_
*keyboard
= (struct keyboard_
*)data
;
38 keyboard
->interrupt_message
= 0;
39 memset(keyboard
->buf
, 0, keyboard
->buf_sz
);
43 void keyboard_cycle_(struct dcpu16
*vm
, void *data
) {
44 struct keyboard_
*keyboard
= (struct keyboard_
*)data
;
46 (void)vm
, (void)keyboard
;
50 void keyboard_hwi_(struct dcpu16
*vm
, void *data
) {
51 struct keyboard_
*keyboard
= (struct keyboard_
*)data
;
52 DCPU16_WORD reg_a
= vm
->reg
[DCPU16_REG_A
];
53 DCPU16_WORD reg_b
= vm
->reg
[DCPU16_REG_B
];
57 case 0: /* clear keyboard buffer */
58 memset(keyboard
->buf
, 0, keyboard
->buf_sz
);
61 case 1: /* get next key from buffer as C */
62 vm
->reg
[DCPU16_REG_C
] = keyboard
->buf
[0];
63 for (i
= 1; i
< keyboard
->buf_sz
; i
++) {
64 keyboard
->buf
[i
-1] = keyboard
->buf
[i
];
66 keyboard
->buf
[i
] = '\0';
69 case 2: /* get currently-pressed-state of key in B as C */
70 vm
->warn_cb_("IMPLEMENT");
72 vm
->reg
[DCPU16_REG_C
] = 0;
75 case 3: /* set interrupt state */
76 keyboard
->interrupt_message
= reg_b
;
82 struct dcpu16_hw
*keyboard_new(struct dcpu16
*vm
) {
86 hw
= calloc(1, sizeof *hw
);
88 vm
->warn_cb_("%s():%s", "calloc", strerror(errno
));
91 memcpy(hw
, &hw_
, sizeof *hw
);
92 hw
->data
= calloc(1, sizeof hw
->data
);
93 if (hw
->data
== NULL
) {
94 vm
->warn_cb_("%s():%s", "calloc", strerror(errno
));
99 b
= calloc(BUF_SZ
, sizeof *b
);
101 vm
->warn_cb_("%s():%s", "calloc", strerror(errno
));
106 ((struct keyboard_
*)(hw
->data
))->buf
= b
;
107 ((struct keyboard_
*)(hw
->data
))->buf_sz
= BUF_SZ
;
112 void keyboard_del(struct dcpu16_hw
**hw
) {
114 free(((struct keyboard_
*)((*hw
)->data
))->buf
);
115 ((struct keyboard_
*)((*hw
)->data
))->buf
= NULL
;