2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
15 void PRNFILE::initialize()
20 value = busy_id = ack_id = wait_frames = -1;
21 _PRINTER_STROBE_RISING_EDGE = osd->check_feature(_T("PRINTER_STROBE_RISING_EDGE"));
22 //#ifdef PRINTER_STROBE_RISING_EDGE
23 if(_PRINTER_STROBE_RISING_EDGE) {
34 register_frame_event(this);
37 void PRNFILE::release()
47 busy_id = ack_id = wait_frames = -1;
52 void PRNFILE::event_frame()
54 if(wait_frames > 0 && --wait_frames == 0) {
59 void PRNFILE::write_signal(int id, uint32_t data, uint32_t mask)
61 if(id == SIG_PRINTER_DATA) {
66 value |= (data & mask);
67 } else if(id == SIG_PRINTER_STROBE) {
68 bool new_strobe = ((data & mask) != 0);
69 //#ifdef PRINTER_STROBE_RISING_EDGE
71 if(_PRINTER_STROBE_RISING_EDGE) {
72 edge = (!strobe && new_strobe);
75 edge = (strobe && !new_strobe);
80 if(edge && value != -1) {
81 if(!fio->IsOpened()) {
88 cancel_event(this, busy_id);
90 register_event(this, EVENT_BUSY, 10000.0, false, &busy_id);
93 // wait 1sec and finish printing
94 //#ifdef SUPPORT_VARIABLE_TIMING
95 // wait_frames = (int)(vm->get_frame_rate() * 1.0 + 0.5);
97 // wait_frames = (int)(FRAMES_PER_SEC * 1.0 + 0.5);
99 wait_frames = (int)(osd->vm_frame_rate() * 1.0 + 0.5);
101 } else if(id == SIG_PRINTER_RESET) {
102 bool new_res = ((data & mask) != 0);
103 if(res && !new_res) {
110 uint32_t PRNFILE::read_signal(int ch)
112 if(ch == SIG_PRINTER_BUSY) {
115 cancel_event(this, busy_id);
121 } else if(ch == SIG_PRINTER_ACK) {
129 void PRNFILE::event_callback(int event_id, int err)
131 if(event_id == EVENT_BUSY) {
134 } else if(event_id == EVENT_ACK) {
140 void PRNFILE::set_busy(bool value)
145 cancel_event(this, ack_id);
147 register_event(this, EVENT_ACK, 10.0, false, &ack_id);
151 write_signals(&outputs_busy, busy ? 0xffffffff : 0);
154 void PRNFILE::set_ack(bool value)
157 write_signals(&outputs_ack, ack ? 0xffffffff : 0);
160 void PRNFILE::open_file()
162 create_date_file_path(file_path, _MAX_PATH, _T("txt"));
163 fio->Fopen(file_path, FILEIO_WRITE_BINARY);
166 void PRNFILE::close_file()
168 if(fio->IsOpened()) {
169 // remove if the file size is less than 2 bytes
170 bool remove = (fio->Ftell() < 2);
173 FILEIO::RemoveFile(file_path);
178 #define STATE_VERSION 2
180 bool PRNFILE::process_state(FILEIO* state_fio, bool loading)
186 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
189 if(!state_fio->StateCheckInt32(this_device_id)) {
192 state_fio->StateInt32(value);
193 state_fio->StateInt32(busy_id);
194 state_fio->StateInt32(ack_id);
195 state_fio->StateBool(strobe);
196 state_fio->StateBool(res);
197 state_fio->StateBool(busy);
198 state_fio->StateBool(ack);