|
|
1.1.1.50! root 1: /* ! 2: MS-DOS Player for Win32 console ! 3: ! 4: Author : Takeda.Toshiya ! 5: Date : 2009.11.09- ! 6: */ ! 7: ! 8: #ifndef _MSDOS_H_ ! 9: #define _MSDOS_H_ ! 10: ! 11: #ifndef _WIN32_WINNT ! 12: //#define _WIN32_WINNT 0x400 // Windows NT 4.0 ! 13: #define _WIN32_WINNT 0x500 // Windows 2000 ! 14: //#define _WIN32_WINNT 0x501 // Windows XP ! 15: #endif ! 16: #include <windows.h> ! 17: #include <winioctl.h> ! 18: #ifdef _MBCS ! 19: #include <mbstring.h> ! 20: #endif ! 21: #include <stddef.h> ! 22: #include <stdlib.h> ! 23: #include <stdio.h> ! 24: #include <assert.h> ! 25: #include <conio.h> ! 26: #include <locale.h> ! 27: #include <math.h> ! 28: #include <dos.h> ! 29: #include <fcntl.h> ! 30: #include <sys/types.h> ! 31: #include <sys/stat.h> ! 32: #include <io.h> ! 33: #include <sys/locking.h> ! 34: #include <mbctype.h> ! 35: #include <direct.h> ! 36: #include <errno.h> ! 37: #include <tlhelp32.h> ! 38: #include <psapi.h> ! 39: #include <setupapi.h> ! 40: #include <winsock.h> ! 41: #include <intrin.h> ! 42: ! 43: #ifdef _DEBUG ! 44: // _malloca is defined in both intrin.h and crtdbg.h ! 45: #ifdef _malloca ! 46: #undef _malloca ! 47: #endif ! 48: #define _CRTDBG_MAP_ALLOC ! 49: #include <crtdbg.h> ! 50: #define calloc(c, s) _calloc_dbg(c, s, _NORMAL_BLOCK, __FILE__, __LINE__) ! 51: #define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__) ! 52: #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) ! 53: #endif ! 54: ! 55: // variable scope of 'for' loop for Microsoft Visual C++ 6.0 ! 56: #if defined(_MSC_VER) && (_MSC_VER == 1200) ! 57: #define for if(0);else for ! 58: #endif ! 59: ! 60: // disable warnings for Microsoft Visual C++ 2005 or later ! 61: #if defined(_MSC_VER) && (_MSC_VER >= 1400) ! 62: #pragma warning( disable : 4819 ) ! 63: #pragma warning( disable : 4995 ) ! 64: #pragma warning( disable : 4996 ) ! 65: // for MAME i86/i386 ! 66: #pragma warning( disable : 4018 ) ! 67: #pragma warning( disable : 4065 ) ! 68: #pragma warning( disable : 4146 ) ! 69: #pragma warning( disable : 4244 ) ! 70: #pragma warning( disable : 4267 ) ! 71: #endif ! 72: ! 73: // endian ! 74: #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) ! 75: #if defined(__BYTE_ORDER) && (defined(__LITTLE_ENDIAN) || defined(__BIG_ENDIAN)) ! 76: #if __BYTE_ORDER == __LITTLE_ENDIAN ! 77: #define __LITTLE_ENDIAN__ ! 78: #elif __BYTE_ORDER == __BIG_ENDIAN ! 79: #define __BIG_ENDIAN__ ! 80: #endif ! 81: #elif defined(WORDS_LITTLEENDIAN) ! 82: #define __LITTLE_ENDIAN__ ! 83: #elif defined(WORDS_BIGENDIAN) ! 84: #define __BIG_ENDIAN__ ! 85: #endif ! 86: #endif ! 87: #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) ! 88: // Microsoft Visual C++ ! 89: #define __LITTLE_ENDIAN__ ! 90: #endif ! 91: ! 92: // compat for mingw32 headers ! 93: #ifndef COMMON_LVB_UNDERSCORE ! 94: #define COMMON_LVB_UNDERSCORE 0x8000 ! 95: #endif ! 96: ! 97: // type definition ! 98: #ifndef UINT8 ! 99: typedef unsigned char UINT8; ! 100: #endif ! 101: #ifndef UINT16 ! 102: typedef unsigned short UINT16; ! 103: #endif ! 104: #ifndef UINT32 ! 105: typedef unsigned int UINT32; ! 106: #endif ! 107: #ifndef UINT64 ! 108: typedef unsigned long long UINT64; ! 109: #endif ! 110: #ifndef INT8 ! 111: typedef signed char INT8; ! 112: #endif ! 113: #ifndef INT16 ! 114: typedef signed short INT16; ! 115: #endif ! 116: #ifndef INT32 ! 117: typedef signed int INT32; ! 118: #endif ! 119: #ifndef INT64 ! 120: typedef signed long long INT64; ! 121: #endif ! 122: ! 123: #pragma pack(1) ! 124: typedef union { ! 125: UINT32 dw; ! 126: struct { ! 127: #ifdef __BIG_ENDIAN__ ! 128: UINT16 h, l; ! 129: #else ! 130: UINT16 l, h; ! 131: #endif ! 132: } w; ! 133: } PAIR32; ! 134: #pragma pack() ! 135: ! 136: // MAME i86/i386 ! 137: ! 138: // src/emu/devcpu.h ! 139: // offsets and addresses are 32-bit (for now...) ! 140: typedef UINT32 offs_t; ! 141: ! 142: /* ---------------------------------------------------------------------------- ! 143: FIFO buffer ! 144: ---------------------------------------------------------------------------- */ ! 145: ! 146: class FIFO ! 147: { ! 148: private: ! 149: int size; ! 150: int *buf; ! 151: int cnt, rpt, wpt; ! 152: public: ! 153: FIFO(int s) { ! 154: size = s; ! 155: buf = (int *)malloc(size * sizeof(int)); ! 156: cnt = rpt = wpt = 0; ! 157: } ! 158: void release() ! 159: { ! 160: if(buf != NULL) { ! 161: free(buf); ! 162: buf = NULL; ! 163: } ! 164: } ! 165: void clear() ! 166: { ! 167: cnt = rpt = wpt = 0; ! 168: } ! 169: void write(int val) { ! 170: if(cnt < size) { ! 171: buf[wpt++] = val; ! 172: if(wpt >= size) { ! 173: wpt = 0; ! 174: } ! 175: cnt++; ! 176: } ! 177: } ! 178: int read() { ! 179: int val = 0; ! 180: if(cnt) { ! 181: val = buf[rpt++]; ! 182: if(rpt >= size) { ! 183: rpt = 0; ! 184: } ! 185: cnt--; ! 186: } ! 187: return(val); ! 188: } ! 189: int count() { ! 190: return(cnt); ! 191: } ! 192: int remain() { ! 193: return(size - cnt); ! 194: } ! 195: bool full() ! 196: { ! 197: return(cnt == size); ! 198: } ! 199: bool empty() ! 200: { ! 201: return(cnt == 0); ! 202: } ! 203: }; ! 204: ! 205: /* ---------------------------------------------------------------------------- ! 206: MAME i86/i386 ! 207: ---------------------------------------------------------------------------- */ ! 208: ! 209: #if defined(HAS_I86) ! 210: #define CPU_MODEL i8086 ! 211: #elif defined(HAS_I186) ! 212: #define CPU_MODEL i80186 ! 213: #elif defined(HAS_V30) ! 214: #define CPU_MODEL v30 ! 215: #elif defined(HAS_I286) ! 216: #define CPU_MODEL i80286 ! 217: #elif defined(HAS_I386) ! 218: #define CPU_MODEL i386 ! 219: #else ! 220: // #if defined(HAS_I386SX) ! 221: // #define CPU_MODEL i386SX ! 222: // #else ! 223: #if defined(HAS_I486) ! 224: #define CPU_MODEL i486 ! 225: #else ! 226: #if defined(HAS_PENTIUM) ! 227: #define CPU_MODEL pentium ! 228: #elif defined(HAS_MEDIAGX) ! 229: #define CPU_MODEL mediagx ! 230: #elif defined(HAS_PENTIUM_PRO) ! 231: #define CPU_MODEL pentium_pro ! 232: #elif defined(HAS_PENTIUM_MMX) ! 233: #define CPU_MODEL pentium_mmx ! 234: #elif defined(HAS_PENTIUM2) ! 235: #define CPU_MODEL pentium2 ! 236: #elif defined(HAS_PENTIUM3) ! 237: #define CPU_MODEL pentium3 ! 238: #elif defined(HAS_PENTIUM4) ! 239: #define CPU_MODEL pentium4 ! 240: #endif ! 241: #define SUPPORT_RDTSC ! 242: #endif ! 243: #define SUPPORT_FPU ! 244: // #endif ! 245: #define HAS_I386 ! 246: #endif ! 247: ! 248: /* ---------------------------------------------------------------------------- ! 249: debugger ! 250: ---------------------------------------------------------------------------- */ ! 251: ! 252: //#define USE_DEBUGGER ! 253: ! 254: #ifdef USE_DEBUGGER ! 255: #define MAX_BREAK_POINTS 8 ! 256: ! 257: bool now_debugging = false; ! 258: bool now_going = false; ! 259: bool now_suspended = false; ! 260: bool force_suspend = false; ! 261: ! 262: typedef struct { ! 263: struct { ! 264: UINT32 addr; ! 265: UINT32 seg; ! 266: UINT32 ofs; ! 267: int status; // 0 = none, 1 = enabled, other = disabled ! 268: } table[MAX_BREAK_POINTS]; ! 269: int hit; ! 270: } break_point_t; ! 271: ! 272: break_point_t break_point = {0}; ! 273: break_point_t rd_break_point = {0}; ! 274: break_point_t wr_break_point = {0}; ! 275: break_point_t in_break_point = {0}; ! 276: break_point_t out_break_point = {0}; ! 277: ! 278: typedef struct { ! 279: struct { ! 280: int int_num; ! 281: UINT8 ah, ah_registered; ! 282: UINT8 al, al_registered; ! 283: int status; // 0 = none, 1 = enabled, other = disabled ! 284: } table[MAX_BREAK_POINTS]; ! 285: int hit; ! 286: } int_break_point_t; ! 287: ! 288: int_break_point_t int_break_point = {0}; ! 289: ! 290: FILE *fp_debugger = NULL; ! 291: FILE *fi_debugger = NULL; ! 292: ! 293: // these read/write interfaces do not check break points, ! 294: // debugger should use them not to hit any break point mistakely ! 295: UINT8 debugger_read_byte(offs_t byteaddress); ! 296: UINT16 debugger_read_word(offs_t byteaddress); ! 297: UINT32 debugger_read_dword(offs_t byteaddress); ! 298: void debugger_write_byte(offs_t byteaddress, UINT8 data); ! 299: void debugger_write_word(offs_t byteaddress, UINT16 data); ! 300: void debugger_write_dword(offs_t byteaddress, UINT32 data); ! 301: UINT8 debugger_read_io_byte(offs_t addr); ! 302: UINT16 debugger_read_io_word(offs_t addr); ! 303: UINT32 debugger_read_io_dword(offs_t addr); ! 304: void debugger_write_io_byte(offs_t addr, UINT8 val); ! 305: void debugger_write_io_word(offs_t addr, UINT16 val); ! 306: void debugger_write_io_dword(offs_t addr, UINT32 val); ! 307: #endif ! 308: ! 309: /* ---------------------------------------------------------------------------- ! 310: service thread ! 311: ---------------------------------------------------------------------------- */ ! 312: ! 313: #define USE_SERVICE_THREAD ! 314: ! 315: #ifdef USE_SERVICE_THREAD ! 316: CRITICAL_SECTION input_crit_sect; ! 317: CRITICAL_SECTION key_buf_crit_sect; ! 318: CRITICAL_SECTION putch_crit_sect; ! 319: bool in_service = false; ! 320: bool service_exit = false; ! 321: DWORD main_thread_id; ! 322: ! 323: void start_service_loop(LPTHREAD_START_ROUTINE lpStartAddress); ! 324: void finish_service_loop(); ! 325: #endif ! 326: ! 327: bool in_service_29h = false; ! 328: ! 329: /* ---------------------------------------------------------------------------- ! 330: PC/AT hardware emulation ! 331: ---------------------------------------------------------------------------- */ ! 332: ! 333: //#define SUPPORT_GRAPHIC_SCREEN ! 334: ! 335: void hardware_init(); ! 336: void hardware_finish(); ! 337: void hardware_release(); ! 338: void hardware_run(); ! 339: void hardware_run_cpu(); ! 340: void hardware_update(); ! 341: ! 342: // drive ! 343: ! 344: typedef struct { ! 345: int initialized; ! 346: int valid; ! 347: DISK_GEOMETRY geometry; ! 348: ! 349: int is_fdd() ! 350: { ! 351: if(initialized && valid) { ! 352: switch(geometry.MediaType) { ! 353: case F5_1Pt2_512: ! 354: case F3_1Pt44_512: ! 355: case F3_2Pt88_512: ! 356: case F3_20Pt8_512: ! 357: case F3_720_512: ! 358: case F5_360_512: ! 359: case F5_320_512: ! 360: case F5_320_1024: ! 361: case F5_180_512: ! 362: case F5_160_512: ! 363: case F3_120M_512: ! 364: case F3_640_512: ! 365: case F5_640_512: ! 366: case F5_720_512: ! 367: case F3_1Pt2_512: ! 368: case F3_1Pt23_1024: ! 369: case F5_1Pt23_1024: ! 370: case F3_128Mb_512: ! 371: case F3_230Mb_512: ! 372: case F8_256_128: ! 373: case F3_200Mb_512: ! 374: case F3_240M_512: ! 375: case F3_32M_512: ! 376: return(1); ! 377: } ! 378: } ! 379: return(0); ! 380: } ! 381: int head_num() ! 382: { ! 383: if(initialized && valid) { ! 384: switch(geometry.MediaType) { ! 385: case F5_1Pt2_512: ! 386: case F3_1Pt44_512: ! 387: case F3_2Pt88_512: ! 388: case F3_20Pt8_512: ! 389: case F3_720_512: ! 390: case F5_360_512: ! 391: case F5_320_512: ! 392: case F5_320_1024: ! 393: // case F5_180_512: ! 394: // case F5_160_512: ! 395: case F3_120M_512: ! 396: case F3_640_512: ! 397: case F5_640_512: ! 398: case F5_720_512: ! 399: case F3_1Pt2_512: ! 400: case F3_1Pt23_1024: ! 401: case F5_1Pt23_1024: ! 402: case F3_128Mb_512: ! 403: case F3_230Mb_512: ! 404: // case F8_256_128: ! 405: case F3_200Mb_512: ! 406: case F3_240M_512: ! 407: case F3_32M_512: ! 408: return(2); ! 409: default: ! 410: return(1); ! 411: } ! 412: } ! 413: return(0); ! 414: } ! 415: } drive_param_t; ! 416: ! 417: drive_param_t drive_params[26] = {0}; ! 418: ! 419: // memory ! 420: ! 421: #if defined(HAS_I386) ! 422: #define ADDR_MASK 0xffffffff ! 423: #define MAX_MEM 0x2000000 /* 32MB */ ! 424: #elif defined(HAS_I286) ! 425: #define ADDR_MASK 0xffffff ! 426: #define MAX_MEM 0x1000000 /* 16MB */ ! 427: #else ! 428: #define ADDR_MASK 0xfffff ! 429: #define MAX_MEM 0x100000 /* 1MB */ ! 430: #endif ! 431: UINT8 mem[MAX_MEM + 15]; ! 432: ! 433: // ems ! 434: ! 435: #define MAX_EMS_HANDLES 16 ! 436: #define MAX_EMS_PAGES 2048 /* 32MB */ ! 437: ! 438: typedef struct { ! 439: char name[8]; ! 440: UINT8* buffer; ! 441: int pages; ! 442: bool allocated; ! 443: } ems_handle_t; ! 444: ! 445: typedef struct { ! 446: UINT16 handle; ! 447: UINT16 page; ! 448: bool mapped; ! 449: } ems_page_t; ! 450: ! 451: ems_handle_t ems_handles[MAX_EMS_HANDLES + 1] = {0}; ! 452: ems_page_t ems_pages[4]; ! 453: int free_ems_pages; ! 454: ! 455: void ems_init(); ! 456: void ems_finish(); ! 457: void ems_release(); ! 458: void ems_allocate_pages(int handle, int pages); ! 459: void ems_reallocate_pages(int handle, int pages); ! 460: void ems_release_pages(int handle); ! 461: void ems_map_page(int physical, int handle, int logical); ! 462: void ems_unmap_page(int physical); ! 463: ! 464: // dma ! 465: ! 466: typedef struct { ! 467: struct { ! 468: union { ! 469: UINT16 w; ! 470: struct { ! 471: #ifdef __BIG_ENDIAN__ ! 472: UINT8 h, l; ! 473: #else ! 474: UINT8 l, h; ! 475: #endif ! 476: } b; ! 477: } areg, creg, bareg, bcreg; ! 478: UINT8 mode; ! 479: UINT8 pagereg; ! 480: UINT32 port; ! 481: } ch[4]; ! 482: ! 483: bool low_high; ! 484: UINT8 cmd; ! 485: UINT8 req; ! 486: UINT8 mask; ! 487: UINT8 tc; ! 488: UINT16 tmp; ! 489: } dma_t; ! 490: ! 491: dma_t dma[2]; ! 492: ! 493: void dma_init(); ! 494: void dma_reset(int c); ! 495: void dma_write(int c, UINT32 addr, UINT8 data); ! 496: UINT8 dma_read(int c, UINT32 addr); ! 497: void dma_page_write(int c, int ch, UINT8 data); ! 498: UINT8 dma_page_read(int c, int ch); ! 499: void dma_run(int c, int ch); ! 500: ! 501: // pic ! 502: ! 503: typedef struct { ! 504: UINT8 imr, isr, irr, prio; ! 505: UINT8 icw1, icw2, icw3, icw4; ! 506: UINT8 ocw3; ! 507: UINT8 icw2_r, icw3_r, icw4_r; ! 508: } pic_t; ! 509: ! 510: pic_t pic[2]; ! 511: int pic_req_chip, pic_req_level; ! 512: UINT8 pic_req_bit; ! 513: ! 514: void pic_init(); ! 515: void pic_write(int c, UINT32 addr, UINT8 data); ! 516: UINT8 pic_read(int c, UINT32 addr); ! 517: void pic_req(int c, int level, int signal); ! 518: int pic_ack(); ! 519: void pic_update(); ! 520: ! 521: // pio ! 522: ! 523: typedef struct { ! 524: UINT8 data, stat, ctrl; ! 525: // code conversion ! 526: bool conv_mode; ! 527: bool jis_mode; ! 528: UINT8 sjis_hi; ! 529: UINT8 esc_buf[8]; ! 530: UINT32 esc_len; ! 531: // printer to file ! 532: char path[MAX_PATH]; ! 533: FILE *fp; ! 534: SYSTEMTIME time; ! 535: } pio_t; ! 536: ! 537: pio_t pio[2]; ! 538: ! 539: void pio_init(); ! 540: void pio_finish(); ! 541: void pio_release(); ! 542: void pio_write(int c, UINT32 addr, UINT8 data); ! 543: UINT8 pio_read(int c, UINT32 addr); ! 544: void printer_out(int c, UINT8 data); ! 545: void pcbios_printer_out(int c, UINT8 data); ! 546: ! 547: // pit ! 548: ! 549: #define PIT_ALWAYS_RUNNING ! 550: ! 551: typedef struct { ! 552: INT32 count; ! 553: UINT16 latch; ! 554: UINT16 prev_latch, next_latch; ! 555: UINT16 count_reg; ! 556: UINT8 ctrl_reg; ! 557: int count_latched; ! 558: int low_read, high_read; ! 559: int low_write, high_write; ! 560: int mode; ! 561: int status_latched; ! 562: UINT8 status; ! 563: // constant clock ! 564: UINT32 expired_time; ! 565: UINT32 prev_time; ! 566: UINT64 accum; ! 567: } pit_t; ! 568: ! 569: pit_t pit[3]; ! 570: #ifndef PIT_ALWAYS_RUNNING ! 571: int pit_active; ! 572: #endif ! 573: ! 574: void pit_init(); ! 575: void pit_write(int ch, UINT8 val); ! 576: UINT8 pit_read(int ch); ! 577: int pit_run(int ch, UINT32 cur_time); ! 578: void pit_latch_count(int ch); ! 579: int pit_get_expired_time(int ch); ! 580: ! 581: UINT8 system_port = 0; ! 582: ! 583: // sio ! 584: ! 585: #define SIO_BUFFER_SIZE 1024 ! 586: ! 587: typedef struct { ! 588: int channel; ! 589: ! 590: FIFO *send_buffer; ! 591: FIFO *recv_buffer; ! 592: ! 593: union { ! 594: UINT16 w; ! 595: struct { ! 596: #ifdef __BIG_ENDIAN__ ! 597: UINT8 h, l; ! 598: #else ! 599: UINT8 l, h; ! 600: #endif ! 601: } b; ! 602: } divisor; ! 603: UINT16 prev_divisor; ! 604: UINT8 line_ctrl, prev_line_ctrl; ! 605: UINT8 selector; ! 606: ! 607: UINT8 modem_ctrl; ! 608: bool set_brk, set_rts, set_dtr; ! 609: bool prev_set_brk; ! 610: // bool prev_set_rts, prev_set_dtr; ! 611: ! 612: UINT8 line_stat_buf, line_stat_err; ! 613: UINT8 modem_stat, prev_modem_stat; ! 614: ! 615: UINT8 irq_enable; ! 616: UINT8 irq_identify; ! 617: ! 618: UINT8 scratch; ! 619: } sio_t; ! 620: ! 621: typedef struct { ! 622: HANDLE hThread; ! 623: CRITICAL_SECTION csSendData; ! 624: CRITICAL_SECTION csRecvData; ! 625: CRITICAL_SECTION csLineCtrl; ! 626: CRITICAL_SECTION csLineStat; ! 627: CRITICAL_SECTION csModemCtrl; ! 628: CRITICAL_SECTION csModemStat; ! 629: } sio_mt_t; ! 630: ! 631: sio_t sio[4] = {0}; ! 632: sio_mt_t sio_mt[4]; ! 633: ! 634: void sio_init(); ! 635: void sio_finish(); ! 636: void sio_release(); ! 637: void sio_write(int c, UINT32 addr, UINT8 data); ! 638: UINT8 sio_read(int c, UINT32 addr); ! 639: void sio_update(int c); ! 640: void sio_update_irq(int c); ! 641: DWORD WINAPI sio_thread(void *lpx); ! 642: ! 643: // cmos ! 644: ! 645: UINT8 cmos[128]; ! 646: UINT8 cmos_addr; ! 647: ! 648: void cmos_init(); ! 649: void cmos_write(int addr, UINT8 val); ! 650: UINT8 cmos_read(int addr); ! 651: ! 652: // kbd (a20) ! 653: ! 654: UINT8 kbd_data; ! 655: UINT8 kbd_status; ! 656: UINT8 kbd_command; ! 657: ! 658: void kbd_init(); ! 659: UINT8 kbd_read_data(); ! 660: void kbd_write_data(UINT8 val); ! 661: UINT8 kbd_read_status(); ! 662: void kbd_write_command(UINT8 val); ! 663: ! 664: // crtc ! 665: ! 666: UINT8 crtc_addr = 0; ! 667: UINT8 crtc_regs[16] = {0}; ! 668: UINT8 crtc_changed[16] = {0}; ! 669: ! 670: /* ---------------------------------------------------------------------------- ! 671: MS-DOS virtual machine ! 672: ---------------------------------------------------------------------------- */ ! 673: ! 674: #if defined(HAS_I386) ! 675: #define SUPPORT_VCPI ! 676: #endif ! 677: #if defined(HAS_I286) || defined(HAS_I386) ! 678: #define SUPPORT_XMS ! 679: //#define SUPPORT_HMA ! 680: #endif ! 681: //#define SUPPORT_MSCDEX ! 682: ! 683: #define VECTOR_TOP 0 ! 684: #define VECTOR_SIZE 0x400 ! 685: #define BIOS_TOP (VECTOR_TOP + VECTOR_SIZE) ! 686: #define BIOS_SIZE 0x100 ! 687: #define WORK_TOP (BIOS_TOP + BIOS_SIZE) ! 688: #define WORK_SIZE 0x200 ! 689: // IO.SYS 0070:0000 ! 690: #define DEVICE_TOP (WORK_TOP + WORK_SIZE) ! 691: #define DEVICE_SIZE 0x100 /* 22 + 18 * 12 + 7 */ ! 692: #define DOS_INFO_TOP (DEVICE_TOP + DEVICE_SIZE) ! 693: #define DOS_INFO_SIZE 0x100 ! 694: //#define EXT_BIOS_TOP (DOS_INFO_TOP + DOS_INFO_SIZE) ! 695: //#define EXT_BIOS_SIZE 0x400 ! 696: #ifdef EXT_BIOS_TOP ! 697: #define DPB_TOP (EXT_BIOS_TOP + EXT_BIOS_SIZE) ! 698: #else ! 699: #define DPB_TOP (DOS_INFO_TOP + DOS_INFO_SIZE) ! 700: #endif ! 701: #define DPB_SIZE 0x600 ! 702: #define SFT_TOP (DPB_TOP + DPB_SIZE) ! 703: #define SFT_SIZE 0x4b0 /* 6 + 0x3b * 20 */ ! 704: #define DISK_BUF_TOP (SFT_TOP + SFT_SIZE) ! 705: #define DISK_BUF_SIZE 0x20 ! 706: #define CDS_TOP (DISK_BUF_TOP + DISK_BUF_SIZE) ! 707: #define CDS_SIZE 0x8F0 /* 88 * 26 */ ! 708: #define FCB_TABLE_TOP (CDS_TOP + CDS_SIZE) ! 709: #define FCB_TABLE_SIZE 0x10 ! 710: #define SDA_TOP (FCB_TABLE_TOP + FCB_TABLE_SIZE) ! 711: #define SDA_SIZE 0xb0 ! 712: // nls tables ! 713: #define UPPERTABLE_TOP (SDA_TOP + SDA_SIZE) ! 714: #define UPPERTABLE_SIZE 0x82 ! 715: #define LOWERTABLE_TOP (UPPERTABLE_TOP + UPPERTABLE_SIZE) ! 716: #define LOWERTABLE_SIZE 0x82 ! 717: #define FILENAME_UPPERTABLE_TOP (LOWERTABLE_TOP + LOWERTABLE_SIZE) ! 718: #define FILENAME_UPPERTABLE_SIZE 0x82 ! 719: #define FILENAME_TERMINATOR_TOP (FILENAME_UPPERTABLE_TOP + FILENAME_UPPERTABLE_SIZE) ! 720: #define FILENAME_TERMINATOR_SIZE 0x20 /* requirement: 10 + 14(terminate chars) */ ! 721: #define COLLATING_TABLE_TOP (FILENAME_TERMINATOR_TOP + FILENAME_TERMINATOR_SIZE) ! 722: #define COLLATING_TABLE_SIZE 0x102 ! 723: #define DBCS_TOP (COLLATING_TABLE_TOP + COLLATING_TABLE_SIZE) ! 724: #define DBCS_TABLE (DBCS_TOP + 2) ! 725: #define DBCS_SIZE 0x10 ! 726: #define MSDOS_SYSTEM_DATA_END (DBCS_TOP + DBCS_SIZE) ! 727: #define MEMORY_TOP ((MSDOS_SYSTEM_DATA_END + 15) & ~15U) ! 728: #ifdef SUPPORT_GRAPHIC_SCREEN ! 729: #define MEMORY_END 0xa0000 ! 730: #define VGA_VRAM_TOP 0xa0000 ! 731: #else ! 732: #define MEMORY_END 0xb8000 ! 733: #endif ! 734: #define TEXT_VRAM_TOP 0xb8000 ! 735: #define EMS_TOP 0xc0000 ! 736: #define EMS_SIZE 0x10000 ! 737: UINT32 UMB_TOP = EMS_TOP; // EMS is disabled ! 738: #define UMB_END 0xf8000 ! 739: #define SHADOW_BUF_TOP 0xf8000 ! 740: // text vram size: 80x25x2 = 4000 = 0fa0h ! 741: // fffa0h-fffefh can be used for dummy routines ! 742: #define DUMMY_TOP 0xfffc0 ! 743: //#define EMB_TOP 0x10fff0 ! 744: #define EMB_TOP 0x110000 // align to 4KB ! 745: #define EMB_END MAX_MEM ! 746: ! 747: UINT32 IRET_TOP = 0; ! 748: #define IRET_SIZE 0x100 ! 749: UINT32 XMS_TOP = 0; ! 750: // XMS_TOP + 0x000 EMMXXXX0 driver ! 751: // XMS_TOP + 0x012 EMS dummy routine ! 752: // XMS_TOP + 0x015 XMS dummy routine ! 753: // XMS_TOP + 0x018 EMMXXXX0 ioctrl recv buffer ! 754: // XMS_TOP + 0x1b9 EMMXXXX0 driver dummy routine (at XMS_TOP + XMS_SIZE - 7) ! 755: #define XMS_SIZE 0x1c0 /* 18 + 6 + 413 + 7 */ ! 756: ! 757: //#define ENV_SIZE 0x800 ! 758: #define ENV_SIZE 0x2000 ! 759: #define PSP_SIZE 0x100 ! 760: #define PSP_SYSTEM 0x0008 ! 761: ! 762: #define MAX_FILES 128 ! 763: #define MAX_PROCESS 16 ! 764: #define MAX_DTAINFO 128 ! 765: #define LFN_DTA_LADDR 0x10FFF0 ! 766: #define FIND_MAGIC 0x46696e64 ! 767: ! 768: #define DUP_STDIN 27 ! 769: #define DUP_STDOUT 28 ! 770: #define DUP_STDERR 29 ! 771: #define DUP_STDAUX 30 ! 772: #define DUP_STDPRN 31 ! 773: ! 774: //#define MAP_AUX_DEVICE_TO_FILE ! 775: ! 776: #pragma pack(1) ! 777: typedef struct { ! 778: UINT8 mz; ! 779: UINT16 psp; ! 780: UINT16 paragraphs; ! 781: UINT8 reserved[3]; ! 782: char prog_name[8]; ! 783: } mcb_t; ! 784: #pragma pack() ! 785: ! 786: #ifdef SUPPORT_HMA ! 787: #pragma pack(1) ! 788: typedef struct { ! 789: UINT8 ms[2]; ! 790: UINT16 owner; ! 791: UINT16 size; ! 792: UINT16 next; ! 793: } hma_mcb_t; ! 794: #pragma pack() ! 795: #endif ! 796: ! 797: #pragma pack(1) ! 798: typedef struct { ! 799: UINT16 env_seg; ! 800: PAIR32 cmd_line; ! 801: PAIR32 fcb1; ! 802: PAIR32 fcb2; ! 803: UINT16 sp; ! 804: UINT16 ss; ! 805: UINT16 ip; ! 806: UINT16 cs; ! 807: } param_block_t; ! 808: #pragma pack() ! 809: ! 810: #pragma pack(1) ! 811: typedef struct { ! 812: UINT8 len; ! 813: char cmd[127]; ! 814: } cmd_line_t; ! 815: #pragma pack() ! 816: ! 817: #pragma pack(1) ! 818: typedef struct { ! 819: UINT8 exit[2]; ! 820: UINT16 first_mcb; ! 821: UINT8 reserved_1; ! 822: // UINT8 far_call; ! 823: // PAIR32 cpm_entry; ! 824: UINT8 call5[5]; ! 825: PAIR32 int_22h; ! 826: PAIR32 int_23h; ! 827: PAIR32 int_24h; ! 828: UINT16 parent_psp; ! 829: UINT8 file_table[20]; ! 830: UINT16 env_seg; ! 831: PAIR32 stack; ! 832: UINT16 file_table_size; ! 833: PAIR32 file_table_ptr; ! 834: UINT8 reserved_2[24]; ! 835: UINT8 service[3]; ! 836: UINT8 reserved_3[2]; ! 837: UINT8 ex_fcb[7]; ! 838: UINT8 fcb1[16]; ! 839: UINT8 fcb2[20]; ! 840: UINT8 buffer[128]; ! 841: } psp_t; ! 842: #pragma pack() ! 843: ! 844: #pragma pack(1) ! 845: typedef struct { ! 846: UINT16 mz; ! 847: UINT16 extra_bytes; ! 848: UINT16 pages; ! 849: UINT16 relocations; ! 850: UINT16 header_size; ! 851: UINT16 min_alloc; ! 852: UINT16 max_alloc; ! 853: UINT16 init_ss; ! 854: UINT16 init_sp; ! 855: UINT16 check_sum; ! 856: UINT16 init_ip; ! 857: UINT16 init_cs; ! 858: UINT16 relocation_table; ! 859: UINT16 overlay; ! 860: } exe_header_t; ! 861: #pragma pack() ! 862: ! 863: #pragma pack(1) ! 864: typedef struct { ! 865: UINT8 flag; ! 866: UINT8 reserved[5]; ! 867: UINT8 attribute; ! 868: } ext_fcb_t; ! 869: #pragma pack() ! 870: ! 871: #pragma pack(1) ! 872: typedef struct { ! 873: UINT8 drive; ! 874: UINT8 file_name[8 + 3]; ! 875: UINT16 current_block; ! 876: UINT16 record_size; ! 877: UINT32 file_size; ! 878: UINT16 date; ! 879: UINT16 time; ! 880: union { ! 881: UINT8 reserved[8]; ! 882: HANDLE handle; ! 883: }; ! 884: UINT8 cur_record; ! 885: UINT32 rand_record; ! 886: } fcb_t; ! 887: #pragma pack() ! 888: ! 889: #pragma pack(1) ! 890: typedef struct { ! 891: UINT8 drive; ! 892: UINT8 file_name[8 + 3]; ! 893: UINT8 attribute; ! 894: UINT8 nt_res; ! 895: UINT8 create_time_ms; ! 896: UINT16 creation_time; ! 897: UINT16 creation_date; ! 898: UINT16 last_access_date; ! 899: UINT16 cluster_hi; ! 900: UINT16 last_write_time; ! 901: UINT16 last_write_date; ! 902: UINT16 cluster_lo; ! 903: UINT32 file_size; ! 904: } find_fcb_t; ! 905: #pragma pack() ! 906: ! 907: #pragma pack(1) ! 908: typedef struct { ! 909: union { ! 910: UINT8 reserved[21]; ! 911: struct { ! 912: UINT32 find_magic; ! 913: UINT32 dta_index; ! 914: }; ! 915: }; ! 916: UINT8 attrib; ! 917: UINT16 time; ! 918: UINT16 date; ! 919: UINT32 size; ! 920: char name[13]; ! 921: } find_t; ! 922: #pragma pack() ! 923: ! 924: #pragma pack(1) ! 925: typedef struct { ! 926: UINT32 attrib; ! 927: PAIR32 ctime_lo; ! 928: PAIR32 ctime_hi; ! 929: PAIR32 atime_lo; ! 930: PAIR32 atime_hi; ! 931: PAIR32 mtime_lo; ! 932: PAIR32 mtime_hi; ! 933: UINT32 size_hi; ! 934: UINT32 size_lo; ! 935: UINT8 reserved[8]; ! 936: char full_name[260]; ! 937: char short_name[14]; ! 938: } find_lfn_t; ! 939: #pragma pack() ! 940: ! 941: #pragma pack(1) ! 942: typedef struct { ! 943: UINT16 info_level; ! 944: UINT32 serial_number; ! 945: char volume_label[11]; ! 946: char file_system[8]; ! 947: } drive_info_t; ! 948: #pragma pack() ! 949: ! 950: #pragma pack(1) ! 951: typedef struct { ! 952: UINT16 size_of_structure; ! 953: UINT16 structure_version; ! 954: UINT32 sectors_per_cluster; ! 955: UINT32 bytes_per_sector; ! 956: UINT32 available_clusters_on_drive; ! 957: UINT32 total_clusters_on_drive; ! 958: UINT32 available_sectors_on_drive; ! 959: UINT32 total_sectors_on_drive; ! 960: UINT32 available_allocation_units; ! 961: UINT32 total_allocation_units; ! 962: UINT8 reserved[8]; ! 963: } ext_space_info_t; ! 964: #pragma pack() ! 965: ! 966: #pragma pack(1) ! 967: typedef struct { ! 968: UINT8 drive_num; ! 969: UINT8 unit_num; ! 970: UINT16 bytes_per_sector; ! 971: UINT8 highest_sector_num; ! 972: UINT8 shift_count; ! 973: UINT16 reserved_sectors; ! 974: UINT8 fat_num; ! 975: UINT16 root_entries; ! 976: UINT16 first_data_sector; ! 977: UINT16 highest_cluster_num; ! 978: UINT16 sectors_per_fat; ! 979: UINT16 first_dir_sector; ! 980: UINT32 device_driver_header; ! 981: UINT8 media_type; ! 982: UINT8 drive_accessed; ! 983: UINT16 next_dpb_ofs; ! 984: UINT16 next_dpb_seg; ! 985: UINT16 first_free_cluster; ! 986: UINT16 free_clusters; ! 987: // extended ! 988: UINT16 fat_mirroring; ! 989: UINT16 info_sector; ! 990: UINT16 backup_boot_sector; ! 991: UINT32 first_cluster_sector; ! 992: UINT32 maximum_cluster_num; ! 993: UINT32 fat_sectors; ! 994: UINT32 root_cluster; ! 995: UINT32 free_search_cluster; ! 996: } dpb_t; ! 997: #pragma pack() ! 998: ! 999: #pragma pack(1) ! 1000: typedef struct { ! 1001: UINT16 bytes_per_sector; ! 1002: UINT8 sectors_per_cluster; ! 1003: UINT16 reserved_sectors; ! 1004: UINT8 fat_num; ! 1005: UINT16 root_entries; ! 1006: UINT16 total_sectors; ! 1007: UINT8 media_type; ! 1008: UINT16 sectors_per_fat; ! 1009: UINT16 sectors_per_track; ! 1010: UINT16 heads_num; ! 1011: UINT32 hidden_sectors; ! 1012: // extended ! 1013: UINT32 ext_total_sectors; ! 1014: UINT32 ext_sectors_per_fat; ! 1015: } bpb_t; ! 1016: #pragma pack() ! 1017: ! 1018: #pragma pack(1) ! 1019: typedef struct { ! 1020: char path_name[67]; ! 1021: UINT16 drive_attrib; ! 1022: PAIR32 dpb_ptr; ! 1023: UINT16 word_1; ! 1024: UINT16 word_2; ! 1025: UINT16 word_3; ! 1026: UINT16 bs_offset; ! 1027: } cds_t; ! 1028: #pragma pack() ! 1029: ! 1030: #pragma pack(1) ! 1031: typedef struct { ! 1032: // UINT16 int21h_5d0ah_si; // -38 ! 1033: // UINT16 int21h_5d0ah_ds; // -36 ! 1034: // swappable data area ! 1035: UINT8 printer_cho_flag; // -34 ! 1036: UINT16 int21h_5d0ah_dx; // -33 ! 1037: UINT8 switchar; // -31 current switch character ! 1038: UINT8 malloc_strategy; // -30 current memory allocation strategy ! 1039: UINT8 int21h_5d0ah_cl; // -29 ! 1040: UINT8 int21h_5e01h_counter; // -28 ! 1041: UINT8 int21h_5e01h_name[16]; // -27 ! 1042: UINT16 offset_lists[5]; // -11 ! 1043: UINT8 int21h_5d0ah_called; // -1 ! 1044: // ----- from DOSBox ----- ! 1045: UINT8 crit_error_flag; // 0x00 Critical Error Flag ! 1046: UINT8 indos_flag; // 0x01 InDOS flag (count of active INT 21 calls) ! 1047: UINT8 drive_crit_error; // 0x02 Drive on which current critical error occurred or FFh ! 1048: UINT8 locus_of_last_error; // 0x03 locus of last error ! 1049: UINT16 extended_error_code; // 0x04 extended error code of last error ! 1050: UINT8 suggested_action; // 0x06 suggested action for last error ! 1051: UINT8 error_class; // 0x07 class of last error ! 1052: PAIR32 last_error_pointer; // 0x08 ES:DI pointer for last error ! 1053: PAIR32 current_dta; // 0x0C current DTA (Disk Transfer Address) ! 1054: UINT16 current_psp; // 0x10 current PSP ! 1055: UINT16 sp_int_23; // 0x12 stores SP across an INT 23 ! 1056: UINT16 return_code; // 0x14 return code from last process termination (zerod after reading with AH=4Dh) ! 1057: UINT8 current_drive; // 0x16 current drive ! 1058: UINT8 extended_break_flag; // 0x17 extended break flag ! 1059: UINT8 fill[2]; // 0x18 flag: code page switching || flag: copy of previous byte in case of INT 24 Abort ! 1060: } sda_t; ! 1061: #pragma pack() ! 1062: ! 1063: #pragma pack(1) ! 1064: typedef struct { ! 1065: UINT8 reserved_0[4]; // -38 ! 1066: UINT16 magic_word; // -34 from DOSBox ! 1067: UINT8 reserved_1[30]; // -32 ! 1068: UINT16 first_mcb; // -2 ! 1069: PAIR32 first_dpb; // +0 ! 1070: PAIR32 first_sft; // +4 ! 1071: PAIR32 clock_device; // +8 ! 1072: PAIR32 con_device; // +12 ! 1073: UINT16 max_sector_len; // +16 ! 1074: PAIR32 disk_buf_info; // +18 from DOSBox ! 1075: PAIR32 cds; // +22 ! 1076: PAIR32 fcb_table; // +26 ! 1077: UINT8 reserved_2[3]; // +30 ! 1078: UINT8 last_drive; // +33 ! 1079: struct { ! 1080: PAIR32 next_driver; // +34 ! 1081: UINT16 attributes; // +38 ! 1082: UINT16 strategy; // +40 ! 1083: UINT16 interrupt; // +42 ! 1084: char dev_name[8]; // +44 ! 1085: } nul_device; ! 1086: UINT8 reserved_3[11]; // +52 ! 1087: UINT16 buffers_x; // +63 ! 1088: UINT16 buffers_y; // +65 ! 1089: UINT8 boot_drive; // +67 ! 1090: UINT8 i386_or_later; // +68 ! 1091: UINT16 ext_mem_size; // +69 ! 1092: PAIR32 disk_buf_heads; // +71 from DOSBox ! 1093: UINT8 reserved_4[21]; // +75 ! 1094: UINT8 dos_flag; // +96 ! 1095: UINT8 reserved_5[2]; // +97 ! 1096: UINT8 umb_linked; // +99 from DOSBox ! 1097: UINT8 reserved_6[2]; // +100 ! 1098: UINT16 first_umb_fcb; // +102 from DOSBox ! 1099: UINT16 first_mcb_2; // +104 from DOSBox ! 1100: UINT8 nul_device_routine[7]; ! 1101: } dos_info_t; ! 1102: #pragma pack() ! 1103: ! 1104: #pragma pack(1) ! 1105: typedef struct { ! 1106: PAIR32 next_driver; ! 1107: UINT16 attributes; ! 1108: UINT16 strategy; ! 1109: UINT16 interrupt; ! 1110: char dev_name[8]; ! 1111: } device_t; ! 1112: #pragma pack() ! 1113: ! 1114: #pragma pack(1) ! 1115: typedef struct { ! 1116: UINT16 date_format; ! 1117: char currency_symbol[5]; ! 1118: char thou_sep[2]; ! 1119: char dec_sep[2]; ! 1120: char date_sep[2]; ! 1121: char time_sep[2]; ! 1122: char currency_format; ! 1123: char currency_dec_digits; ! 1124: char time_format; ! 1125: PAIR32 case_map; ! 1126: char list_sep[2]; ! 1127: char reserved[10]; ! 1128: } country_info_t; ! 1129: #pragma pack() ! 1130: ! 1131: typedef struct { ! 1132: char path[MAX_PATH]; ! 1133: int valid; ! 1134: int id; ! 1135: int atty; ! 1136: int mode; ! 1137: UINT16 info; ! 1138: UINT16 psp; ! 1139: int sio_port; // 1-4 ! 1140: int lpt_port; // 1-3 ! 1141: } file_handler_t; ! 1142: ! 1143: static const struct { ! 1144: int mode; ! 1145: int in; ! 1146: int out; ! 1147: } file_mode[] = { ! 1148: { _O_RDONLY | _O_BINARY, 1, 0 }, ! 1149: { _O_WRONLY | _O_BINARY, 0, 1 }, ! 1150: { _O_RDWR | _O_BINARY, 1, 1 }, ! 1151: }; ! 1152: ! 1153: typedef struct { ! 1154: UINT16 psp; ! 1155: char module_dir[MAX_PATH]; ! 1156: #ifdef USE_DEBUGGER ! 1157: char module_path[MAX_PATH]; ! 1158: #endif ! 1159: PAIR32 dta; ! 1160: UINT8 switchar; ! 1161: UINT8 verify; ! 1162: int max_files; ! 1163: char volume_label[MAX_PATH]; ! 1164: bool parent_int_10h_feh_called; ! 1165: bool parent_int_10h_ffh_called; ! 1166: UINT16 parent_ds; ! 1167: UINT16 parent_es; ! 1168: struct { ! 1169: UINT16 handle; ! 1170: UINT16 page; ! 1171: bool mapped; ! 1172: } ems_pages[4]; ! 1173: bool ems_pages_stored; ! 1174: bool called_by_int2eh; ! 1175: } process_t; ! 1176: ! 1177: typedef struct { ! 1178: UINT16 psp; ! 1179: UINT32 dta; ! 1180: UINT8 allowable_mask; ! 1181: UINT8 required_mask; ! 1182: HANDLE find_handle; ! 1183: } dtainfo_t; ! 1184: ! 1185: UINT8 dos_major_version = 7; // Windows 98 Second Edition ! 1186: UINT8 dos_minor_version = 10; ! 1187: UINT8 win_major_version = 4; ! 1188: UINT8 win_minor_version = 10; ! 1189: ! 1190: UINT16 first_mcb; ! 1191: UINT16 current_psp; ! 1192: ! 1193: int retval = 0; ! 1194: UINT16 error_code = 0; ! 1195: ! 1196: file_handler_t file_handler[MAX_FILES]; ! 1197: UINT8 file_buffer[0x100000]; ! 1198: ! 1199: process_t process[MAX_PROCESS]; ! 1200: dtainfo_t dtalist[MAX_DTAINFO]; ! 1201: ! 1202: UINT16 malloc_strategy = 0; ! 1203: ! 1204: char comspec_path[MAX_PATH] = "C:\\COMMAND.COM"; ! 1205: ! 1206: void msdos_syscall(unsigned num); ! 1207: int msdos_init(int argc, char *argv[], char *envp[], int standard_env); ! 1208: void msdos_finish(); ! 1209: ! 1210: // console ! 1211: ! 1212: #define SCR_BUF_WIDTH 256 ! 1213: #define SCR_BUF_HEIGHT 128 ! 1214: ! 1215: #define SET_RECT(rect, l, t, r, b) { \ ! 1216: rect.Left = l; \ ! 1217: rect.Top = t; \ ! 1218: rect.Right = r; \ ! 1219: rect.Bottom = b; \ ! 1220: } ! 1221: ! 1222: DWORD dwConsoleMode = 0; ! 1223: ! 1224: CONSOLE_CURSOR_INFO ci_old; ! 1225: CONSOLE_CURSOR_INFO ci_new; ! 1226: int font_width = 10; ! 1227: int font_height = 18; ! 1228: ! 1229: CHAR_INFO scr_buf[SCR_BUF_WIDTH * SCR_BUF_HEIGHT]; ! 1230: char scr_char[SCR_BUF_WIDTH * SCR_BUF_HEIGHT]; ! 1231: WORD scr_attr[SCR_BUF_WIDTH * SCR_BUF_HEIGHT]; ! 1232: COORD scr_buf_size; ! 1233: COORD scr_buf_pos; ! 1234: int scr_width, scr_height; ! 1235: int scr_top; ! 1236: bool restore_console_on_exit = false; ! 1237: bool cursor_moved; ! 1238: bool cursor_moved_by_crtc; ! 1239: ! 1240: FIFO *key_buf_char = NULL; ! 1241: FIFO *key_buf_scan = NULL; ! 1242: FIFO *key_buf_data = NULL; ! 1243: bool key_changed = false; ! 1244: UINT32 key_code = 0; ! 1245: UINT32 key_recv = 0; ! 1246: ! 1247: bool pcbios_is_key_buffer_empty(); ! 1248: void pcbios_clear_key_buffer(); ! 1249: void pcbios_set_key_buffer(int key_char, int key_scan); ! 1250: bool pcbios_get_key_buffer(int *key_char, int *key_scan); ! 1251: ! 1252: UINT8 ctrl_break_checking = 0x00; // ??? ! 1253: bool ctrl_break_detected = false; ! 1254: bool ctrl_break_pressed = false; ! 1255: bool ctrl_c_pressed = false; ! 1256: bool raise_int_1bh = false; ! 1257: ! 1258: int active_code_page; ! 1259: int system_code_page; ! 1260: int console_code_page; ! 1261: ! 1262: UINT32 text_vram_top_address; ! 1263: UINT32 text_vram_end_address; ! 1264: UINT32 shadow_buffer_top_address; ! 1265: UINT32 shadow_buffer_end_address; ! 1266: UINT32 cursor_position_address; ! 1267: int vram_pages; ! 1268: bool int_10h_feh_called = false; ! 1269: bool int_10h_ffh_called = false; ! 1270: ! 1271: #define MAX_MOUSE_BUTTONS 2 ! 1272: ! 1273: typedef struct { ! 1274: bool enabled; // from DOSBox ! 1275: bool enabled_ps2; ! 1276: int hidden; ! 1277: int old_hidden; // from DOSBox ! 1278: struct { ! 1279: int x, y; ! 1280: } position, prev_position, max_position, min_position, mickey; ! 1281: struct { ! 1282: bool status; ! 1283: int pressed_times; ! 1284: int released_times; ! 1285: struct { ! 1286: int x, y; ! 1287: } pressed_position; ! 1288: struct { ! 1289: int x, y; ! 1290: } released_position; ! 1291: } buttons[MAX_MOUSE_BUTTONS]; ! 1292: int get_buttons() ! 1293: { ! 1294: int val = 0; ! 1295: for(int i = 0; i < MAX_MOUSE_BUTTONS; i++) { ! 1296: if(buttons[i].status) { ! 1297: val |= 1 << i; ! 1298: } ! 1299: } ! 1300: return(val); ! 1301: } ! 1302: UINT16 status, status_alt; ! 1303: UINT16 status_irq, status_irq_alt, status_irq_ps2; ! 1304: UINT16 call_mask; ! 1305: PAIR32 call_addr, call_addr_alt[8], call_addr_ps2; ! 1306: // dummy ! 1307: UINT16 sensitivity[3]; ! 1308: UINT16 display_page; ! 1309: UINT16 language; ! 1310: UINT16 hot_spot[2]; ! 1311: UINT16 screen_mask; ! 1312: UINT16 cursor_mask; ! 1313: } mouse_t; ! 1314: ! 1315: mouse_t mouse; ! 1316: ! 1317: UINT16 mouse_push_ax; ! 1318: UINT16 mouse_push_bx; ! 1319: UINT16 mouse_push_cx; ! 1320: UINT16 mouse_push_dx; ! 1321: UINT16 mouse_push_si; ! 1322: UINT16 mouse_push_di; ! 1323: ! 1324: // hma ! 1325: ! 1326: #ifdef SUPPORT_HMA ! 1327: bool is_hma_used_by_xms = false; ! 1328: bool is_hma_used_by_int_2fh = false; ! 1329: #endif ! 1330: ! 1331: // xms ! 1332: ! 1333: #ifdef SUPPORT_XMS ! 1334: typedef struct emb_handle_s { ! 1335: UINT32 handle; // 0=allocated ! 1336: offs_t address; ! 1337: int size_kb; ! 1338: int lock; ! 1339: struct emb_handle_s *prev; ! 1340: struct emb_handle_s *next; ! 1341: } emb_handle_t; ! 1342: ! 1343: emb_handle_t *emb_handle_top = NULL; ! 1344: int xms_a20_local_enb_count; ! 1345: UINT16 xms_dx_after_call_08h = 0; ! 1346: ! 1347: void msdos_xms_init(); ! 1348: void msdos_xms_finish(); ! 1349: void msdos_xms_release(); ! 1350: emb_handle_t *msdos_xms_get_emb_handle(int handle); ! 1351: int msdos_xms_get_unused_emb_handle_id(); ! 1352: int msdos_xms_get_unused_emb_handle_count(); ! 1353: void msdos_xms_split_emb_handle(emb_handle_t *emb_handle, int size_kb); ! 1354: void msdos_xms_combine_emb_handles(emb_handle_t *emb_handle); ! 1355: emb_handle_t *msdos_xms_alloc_emb_handle(int size_kb); ! 1356: void msdos_xms_free_emb_handle(emb_handle_t *emb_handle); ! 1357: #endif ! 1358: ! 1359: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.