+static int handle_cpm_drv_to;
+
+#define f_dirty(fp) ((fp)->fs->wflag != 0)
+
+
+int cpm_drv_to(int state)
+{
+ static uint32_t ts;
+
+ switch(state) {
+ case 0:
+ break;
+
+ case 1:
+ ts = get_timer(0);
+ state = 2;
+ break;
+
+ case 2:
+ if (get_timer(ts) > 1000) {
+ for (uint_fast8_t i=0; i < MAX_DRIVE; i++) {
+// if (&drv_table[i].fd && f_dirty(&drv_table[i].fd)) {
+ if (drv_table[i].dirty) {
+ f_sync(&drv_table[i].fd);
+ drv_table[i].dirty = false;
+ debug_cpmsd("## %7lu f_sync: %c:\n", get_timer(0), i+'A');
+ }
+ }
+ state = 0;
+ }
+ }
+ return state;
+}
+
+
+void msg_cpm_result(uint8_t subf, uint8_t rc, int res)
+{
+ uint8_t result_msg[3];
+
+ if (res)
+ rc |= 0x80;
+
+ result_msg[0] = rc;
+ result_msg[1] = res;
+ result_msg[2] = res >> 8;
+
+ if (rc) {
+ debug_cpmsd("###%7lu error rc: %.02x, res: %d\n", get_timer(0), rc, res);
+ }
+
+ msg_xmit(2, subf, sizeof(result_msg), result_msg);
+}