int main(int argc, char **argv) { int ret, n; unsigned char drive = 8; CBM_FILE f; char buffer[80]; char *devicetype_str; const char *drivername; enum cbm_device_type_e devicetype; int checklines = 0; int checkiohook = 0; if (argc>1) { int i; for (i=0; i < argc; i++) { switch (argv[i][0]) { case '-': checklines = 1; break; case '+': checkiohook = 1; break; default: drive = atoi(argv[i]); } } } printf("VDDTEST " __DATE__ " " __TIME__ ", using drive %u\n", drive); if (vdd_init()) { printf("Could not initialize the VDD, aborting!\n"); exit(1); } drivername = cbm_get_driver_name(0); printf("cbm_get_driver_name() returned %s.\n", drivername); ret = cbm_driver_open(&f, 0); if (ret) { printf("cbm_driver_open FAILED!\n"); exit(1); } printf("cbm_driver_open success!\n\n"); n = cbm_reset(f); printf("cbm_reset %s\n", n==0 ? "success" : "FAILED"); if (checklines) { changelines(f); } n = cbm_device_status(f, drive, buffer, sizeof(buffer)); printf("cbm_device_status returned: %u\n%s\n\n", n, buffer); n = cbm_open(f, drive, 15, "I0", 0); printf("cbm_open %u,15,\"I0\" %s!\n", drive, n == 0 ? "success" : "FAILED"); n = cbm_close(f, drive, 15); printf("cbm_close %s!\n", n == 0 ? "success" : "FAILED"); n = own_device_status(f, drive, buffer, sizeof(buffer)); printf("own_device_status returned: %u\n%s\n\n", n, buffer); n = cbm_identify(f, drive, &devicetype, &devicetype_str); printf("cbm_identify %s!\n", n==0 ? "success" : "FAILED"); printf("cbm_identify returned: %u - '%s'.\n\n", (unsigned int) devicetype, devicetype_str); n = cbm_exec_command(f, drive, "S0:OPENCBM.VDD", 0); printf("cbm_exec_command(scratch) %s!\n", n==0 ? "success" : "FAILED"); writefile(f, drive, "OPENCBM.VDD,S,W"); readfile(f, drive, "OPENCBM.VDD,S,R"); morse(f, drive); if (checkiohook) { unsigned int base = 0x0fc0; printf("trying to install iohook at 0x%08x ", base); if (vdd_install_iohook(f, base, 1)) { int i; printf("success\n"); for (i=0; i<15; i++) { outportb(base + 2, i); sleep(1); } printf("trying to uninstall iohook "); if (vdd_uninstall_iohook(f)) { printf("success\n"); } else { printf("FAILED\n"); } } else { printf("FAILED\n"); } } cbm_driver_close(f); printf("cbm_driver_close success!\n"); return 0; }
VOID VDDDispatch(VOID) { FUNCTIONCODE functioncode; CBM_FILE cbmfile; BOOLEAN error; FUNC_ENTER(); functioncode = getDL(); error = FALSE; // convert to BX value into a CBM_FILE switch (functioncode) { case FC_VDD_USLEEP: case FC_DRIVER_OPEN: case FC_GET_DRIVER_NAME: // FC_VDD_USLEEP, FC_DRIVER_OPEN and FC_GET_DRIVER_NAME are special, // they do not have a BX input. break; default: cbmfile = vdd_cbmfile_get(getBX()); if (cbmfile == INVALID_HANDLE_VALUE) { DBG_ERROR((DBG_PREFIX "invalid BX given: %04x", getBX())); error = TRUE; } break; } if (!error) { switch (functioncode) { case FC_DRIVER_OPEN: error = vdd_driver_open(); break; case FC_DRIVER_CLOSE: error = vdd_driver_close(cbmfile); break; case FC_LISTEN: error = vdd_listen(cbmfile); break; case FC_TALK: error = vdd_talk(cbmfile); break; case FC_OPEN: error = vdd_open(cbmfile); break; case FC_CLOSE: error = vdd_close(cbmfile); break; case FC_RAW_READ: error = vdd_raw_read(cbmfile); break; case FC_RAW_WRITE: error = vdd_raw_write(cbmfile); break; case FC_UNLISTEN: error = vdd_unlisten(cbmfile); break; case FC_UNTALK: error = vdd_untalk(cbmfile); break; case FC_GET_EOI: error = vdd_get_eoi(cbmfile); break; case FC_CLEAR_EOI: error = vdd_clear_eoi(cbmfile); break; case FC_RESET: error = vdd_reset(cbmfile); break; case FC_PP_READ: error = vdd_pp_read(cbmfile); break; case FC_PP_WRITE: error = vdd_pp_write(cbmfile); break; case FC_IEC_POLL: error = vdd_iec_poll(cbmfile); break; case FC_IEC_GET: error = vdd_iec_get(cbmfile); break; case FC_IEC_SET: error = vdd_iec_set(cbmfile); break; case FC_IEC_RELEASE: error = vdd_iec_release(cbmfile); break; case FC_IEC_SETRELEASE: error = vdd_iec_setrelease(cbmfile); break; case FC_IEC_WAIT: error = vdd_iec_wait(cbmfile); break; case FC_UPLOAD: error = vdd_upload(cbmfile); break; case FC_DEVICE_STATUS: error = vdd_device_status(cbmfile); break; case FC_EXEC_COMMAND: error = vdd_exec_command(cbmfile); break; case FC_IDENTIFY: error = vdd_identify(cbmfile); break; case FC_IDENTIFY_XP1541: error = vdd_identify_xp1541(cbmfile); break; case FC_GET_DRIVER_NAME: error = vdd_get_driver_name(); break; case FC_VDD_USLEEP: error = vdd_usleep(); break; case FC_VDD_INSTALL_IOHOOK: error = vdd_install_iohook(cbmfile); break; case FC_VDD_UNINSTALL_IOHOOK: error = vdd_uninstall_iohook(cbmfile); break; default: // this function is not implemented: DBG_ERROR((DBG_PREFIX "unknown function code in DL: %02x", functioncode)); error = TRUE; break; } } setCF(error ? 1 : 0); FUNC_LEAVE(); }