|
|
1.1 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: #include <windows.h>
12: #include <winioctl.h>
13: #include <tchar.h>
14: #include <stdlib.h>
15: #include <stdio.h>
1.1.1.2 root 16: #include <assert.h>
1.1 root 17: #include <conio.h>
1.1.1.2 root 18: #include <math.h>
1.1 root 19: #include <dos.h>
20: #include <fcntl.h>
21: #include <sys/types.h>
22: #include <sys/stat.h>
23: #include <io.h>
24: #include <sys/locking.h>
25: #include <mbctype.h>
26: #include <direct.h>
27: #include <errno.h>
1.1.1.9 root 28: #include <tlhelp32.h>
29: #include <psapi.h>
1.1 root 30:
1.1.1.9 root 31: // variable scope of 'for' loop for Microsoft Visual C++ 6.0
32: #if defined(_MSC_VER) && (_MSC_VER == 1200)
1.1 root 33: #define for if(0);else for
34: #endif
1.1.1.9 root 35:
36: // disable warnings for Microsoft Visual C++ 2005 or later
1.1 root 37: #if defined(_MSC_VER) && (_MSC_VER >= 1400)
38: #pragma warning( disable : 4819 )
39: #pragma warning( disable : 4995 )
40: #pragma warning( disable : 4996 )
1.1.1.9 root 41: // for MAME i86/i386
42: #pragma warning( disable : 4018 )
43: #pragma warning( disable : 4065 )
44: #pragma warning( disable : 4146 )
45: #pragma warning( disable : 4244 )
46: #pragma warning( disable : 4267 )
47: #endif
48:
49: // endian
50: #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
51: #if defined(__BYTE_ORDER) && (defined(__LITTLE_ENDIAN) || defined(__BIG_ENDIAN))
52: #if __BYTE_ORDER == __LITTLE_ENDIAN
53: #define __LITTLE_ENDIAN__
54: #elif __BYTE_ORDER == __BIG_ENDIAN
55: #define __BIG_ENDIAN__
56: #endif
57: #elif defined(WORDS_LITTLEENDIAN)
58: #define __LITTLE_ENDIAN__
59: #elif defined(WORDS_BIGENDIAN)
60: #define __BIG_ENDIAN__
61: #endif
62: #endif
63: #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
64: // Microsoft Visual C++
65: #define __LITTLE_ENDIAN__
1.1 root 66: #endif
1.1.1.9 root 67:
1.1 root 68: // compat for mingw32 headers
69: #ifndef COMMON_LVB_UNDERSCORE
70: #define COMMON_LVB_UNDERSCORE 0x8000
71: #endif
72:
73: // type definition
74: #ifndef UINT8
75: typedef unsigned char UINT8;
76: #endif
77: #ifndef UINT16
78: typedef unsigned short UINT16;
79: #endif
80: #ifndef UINT32
81: typedef unsigned int UINT32;
82: #endif
83: #ifndef INT8
84: typedef signed char INT8;
85: #endif
86: #ifndef INT16
87: typedef signed short INT16;
88: #endif
89: #ifndef INT32
90: typedef signed int INT32;
91: #endif
92:
93: #pragma pack(1)
94: typedef union {
95: UINT32 dw;
96: struct {
1.1.1.9 root 97: #ifdef __BIG_ENDIAN__
98: UINT16 h, l;
99: #else
1.1 root 100: UINT16 l, h;
1.1.1.9 root 101: #endif
1.1 root 102: } w;
103: } PAIR32;
104: #pragma pack()
105:
106: /* ----------------------------------------------------------------------------
107: FIFO buffer
108: ---------------------------------------------------------------------------- */
109:
110: #define MAX_FIFO 256
111:
112: class FIFO
113: {
114: private:
115: int buf[MAX_FIFO];
116: int cnt, rpt, wpt, stored[3];
117: public:
118: FIFO() {
119: cnt = rpt = wpt = 0;
120: }
121: void write(int val) {
122: if(cnt < MAX_FIFO) {
123: buf[wpt++] = val;
124: if(wpt >= MAX_FIFO) {
125: wpt = 0;
126: }
127: cnt++;
128: }
129: }
130: int read() {
131: int val = 0;
132: if(cnt) {
133: val = buf[rpt++];
134: if(rpt >= MAX_FIFO) {
135: rpt = 0;
136: }
137: cnt--;
138: }
139: return val;
140: }
141: int count() {
142: return cnt;
143: }
144: void store_buffer() {
145: stored[0] = cnt;
146: stored[1] = rpt;
147: stored[2] = wpt;
148: }
149: void restore_buffer() {
150: cnt = stored[0];
151: rpt = stored[1];
152: wpt = stored[2];
153: }
154: };
155:
156: /* ----------------------------------------------------------------------------
157: MS-DOS virtual machine
158: ---------------------------------------------------------------------------- */
159:
160: #define VECTOR_TOP 0
161: #define VECTOR_SIZE 0x400
162: #define BIOS_TOP (VECTOR_TOP + VECTOR_SIZE)
163: #define BIOS_SIZE 0x100
164: #define WORK_TOP (BIOS_TOP + BIOS_SIZE)
165: #define WORK_SIZE 0x300
166: #define IRET_TOP (WORK_TOP + WORK_SIZE)
167: #define IRET_SIZE 0x100
168: #define DOS_INFO_TOP (IRET_TOP + IRET_SIZE)
1.1.1.3 root 169: #define DOS_INFO_BASE (DOS_INFO_TOP + 24)
1.1 root 170: #define DOS_INFO_SIZE 0x100
171: #define DPB_TOP (DOS_INFO_TOP + DOS_INFO_SIZE)
172: #define DPB_SIZE 0x400
173: #define FILE_TABLE_TOP (DPB_TOP + DPB_SIZE)
174: #define FILE_TABLE_SIZE 0x10
175: #define CDS_TOP (FILE_TABLE_TOP + FILE_TABLE_SIZE)
176: #define CDS_SIZE 0x80
177: #define FCB_TABLE_TOP (CDS_TOP + CDS_SIZE)
178: #define FCB_TABLE_SIZE 0x10
179: #define DBCS_TOP (FCB_TABLE_TOP + FCB_TABLE_SIZE)
180: #define DBCS_TABLE (DBCS_TOP + 2)
181: #define DBCS_SIZE 0x10
182: #define MEMORY_TOP (DBCS_TOP + DBCS_SIZE)
1.1.1.7 root 183: #define MEMORY_END 0xb8000
184: #define TEXT_VRAM_TOP 0xb8000
185: #define UMB_TOP 0xc0000
186: #define UMB_END 0xf8000
187: #define SHADOW_BUF_TOP 0xf8000
1.1 root 188:
189: //#define ENV_SIZE 0x800
190: #define ENV_SIZE 0x2000
191: #define PSP_SIZE 0x100
192:
193: #define MAX_FILES 128
194: #define MAX_PROCESS 16
1.1.1.11! root 195: #define MAX_DTAINFO 32
! 196: #define LFN_DTA_LADDR 0x10FFF0
1.1 root 197:
198: #define DUP_STDIN 29
199: #define DUP_STDOUT 30
200: #define DUP_STDERR 31
201:
202: //#define SUPPORT_AUX_PRN
203:
204: #pragma pack(1)
205: typedef struct {
206: UINT8 mz;
207: UINT16 psp;
208: UINT16 paragraphs;
1.1.1.3 root 209: UINT8 reserved[3];
210: char prog_name[8];
1.1 root 211: } mcb_t;
212: #pragma pack()
213:
214: #pragma pack(1)
215: typedef struct {
216: UINT16 env_seg;
217: PAIR32 cmd_line;
218: PAIR32 fcb1;
219: PAIR32 fcb2;
220: UINT16 sp;
221: UINT16 ss;
222: UINT16 ip;
223: UINT16 cs;
224: } param_block_t;
225: #pragma pack()
226:
227: #pragma pack(1)
228: typedef struct {
229: UINT8 len;
230: char cmd[127];
231: } cmd_line_t;
232: #pragma pack()
233:
234: #pragma pack(1)
235: typedef struct {
236: UINT8 exit[2];
237: UINT16 first_mcb;
238: UINT8 reserved_1;
239: UINT8 far_call;
240: PAIR32 cpm_entry;
241: PAIR32 int_22h;
242: PAIR32 int_23h;
243: PAIR32 int_24h;
244: UINT16 parent_psp;
245: UINT8 file_table[20];
246: UINT16 env_seg;
247: PAIR32 stack;
248: UINT8 reserved_2[30];
249: UINT8 service[3];
250: UINT8 reserved_3[2];
251: UINT8 ex_fcb[7];
252: UINT8 fcb1[16];
253: UINT8 fcb2[20];
254: UINT8 buffer[128];
255: } psp_t;
256: #pragma pack()
257:
258: #pragma pack(1)
259: typedef struct {
260: UINT16 mz;
261: UINT16 extra_bytes;
262: UINT16 pages;
263: UINT16 relocations;
264: UINT16 header_size;
265: UINT16 min_alloc;
266: UINT16 max_alloc;
267: UINT16 init_ss;
268: UINT16 init_sp;
269: UINT16 check_sum;
270: UINT16 init_ip;
271: UINT16 init_cs;
272: UINT16 relocation_table;
273: UINT16 overlay;
274: } exe_header_t;
275: #pragma pack()
276:
277: #pragma pack(1)
278: typedef struct {
279: UINT8 flag;
280: UINT8 reserved[5];
281: UINT8 attribute;
282: } ext_fcb_t;
283: #pragma pack()
284:
285: #pragma pack(1)
286: typedef struct {
287: UINT8 drive;
288: UINT8 file_name[8 + 3];
289: UINT16 current_block;
290: UINT16 record_size;
291: UINT32 file_size;
292: UINT16 date;
293: UINT16 time;
294: UINT8 reserved[8];
295: UINT8 cur_record;
296: UINT32 rand_record;
297: } fcb_t;
298: #pragma pack()
299:
300: #pragma pack(1)
301: typedef struct {
302: UINT8 drive;
303: UINT8 file_name[8 + 3];
304: UINT8 attribute;
305: UINT8 nt_res;
306: UINT8 create_time_ms;
307: UINT16 creation_time;
308: UINT16 creation_date;
309: UINT16 last_access_date;
310: UINT16 cluster_hi;
311: UINT16 last_write_time;
312: UINT16 last_write_date;
313: UINT16 cluster_lo;
314: UINT32 file_size;
315: } find_fcb_t;
316: #pragma pack()
317:
318: #pragma pack(1)
319: typedef struct {
320: UINT8 reserved[21];
321: UINT8 attrib;
322: UINT16 time;
323: UINT16 date;
324: UINT32 size;
325: char name[13];
326: } find_t;
327: #pragma pack()
328:
329: #pragma pack(1)
330: typedef struct {
331: UINT32 attrib;
332: PAIR32 ctime_lo;
333: PAIR32 ctime_hi;
334: PAIR32 atime_lo;
335: PAIR32 atime_hi;
336: PAIR32 mtime_lo;
337: PAIR32 mtime_hi;
338: UINT32 size_hi;
339: UINT32 size_lo;
340: UINT8 reserved[8];
341: char full_name[260];
342: char short_name[14];
343: } find_lfn_t;
344: #pragma pack()
345:
346: #pragma pack(1)
347: typedef struct {
348: UINT16 info_level;
349: UINT32 serial_number;
350: char volume_label[11];
351: char file_system[8];
352: } drive_info_t;
353: #pragma pack()
354:
355: #pragma pack(1)
356: typedef struct {
357: UINT16 size_of_structure;
358: UINT16 structure_version;
359: UINT32 sectors_per_cluster;
360: UINT32 bytes_per_sector;
361: UINT32 available_clusters_on_drive;
362: UINT32 total_clusters_on_drive;
363: UINT32 available_sectors_on_drive;
364: UINT32 total_sectors_on_drive;
365: UINT32 available_allocation_units;
366: UINT32 total_allocation_units;
367: UINT8 reserved[8];
368: } ext_space_info_t;
369: #pragma pack()
370:
371: #pragma pack(1)
372: typedef struct {
373: UINT8 drive_num;
374: UINT8 unit_num;
375: UINT16 bytes_per_sector;
376: UINT8 highest_sector_num;
377: UINT8 shift_count;
378: UINT16 reserved_sectors;
379: UINT8 fat_num;
380: UINT16 root_entries;
381: UINT16 first_data_sector;
382: UINT16 highest_cluster_num;
383: UINT16 sectors_per_fat;
384: UINT16 first_dir_sector;
385: UINT32 device_driver_header;
386: UINT8 media_type;
387: UINT8 drive_accessed;
388: UINT16 next_dpb_ofs;
389: UINT16 next_dpb_seg;
390: UINT16 first_free_cluster;
391: UINT16 free_clusters;
392: } dpb_t;
393: #pragma pack()
394:
395: #pragma pack(1)
396: typedef struct {
397: char path_name[67];
398: UINT16 drive_attrib;
399: UINT8 physical_drive_number;
400: } cds_t;
401: #pragma pack()
402:
403: #pragma pack(1)
404: typedef struct {
1.1.1.3 root 405: UINT8 reserved_1[22]; // -24
1.1 root 406: UINT16 first_mcb; // -2
407: PAIR32 first_dpb; // +0
408: PAIR32 first_sft; // +0
409: UINT8 reserved_2[14];
410: PAIR32 cds; // +22
411: PAIR32 fcb_table; // +26
412: UINT8 reserved_3[3];
413: UINT8 last_drive; // +33
414: UINT8 reserved_4[29];
415: UINT16 buffers_x; // +63
416: UINT16 buffers_y; // +65
417: UINT8 boot_drive; // +67
418: UINT8 i386_or_later; // +68
419: UINT16 ext_mem_size; // +69
1.1.1.5 root 420: UINT8 reserved_5[25];
421: UINT8 dos_flag; // +96
1.1 root 422: } dos_info_t;
423: #pragma pack()
424:
425: typedef struct {
426: char path[MAX_PATH];
427: int valid;
428: int id;
429: int atty;
430: int mode;
431: UINT16 info;
432: UINT16 psp;
433: } file_handler_t;
434:
435: static const struct {
436: int mode;
437: int in;
438: int out;
439: } file_mode[] = {
1.1.1.11! root 440: { _O_RDONLY | _O_BINARY, 1, 0 },
1.1 root 441: { _O_WRONLY | _O_BINARY, 0, 1 },
442: { _O_RDWR | _O_BINARY, 1, 1 },
443: };
444:
445: typedef struct {
446: UINT16 psp;
447: char module_dir[MAX_PATH];
448: PAIR32 dta;
449: UINT8 switchar;
450: UINT8 verify;
451: int max_files;
452: UINT8 allowable_mask;
453: UINT8 required_mask;
454: char volume_label[MAX_PATH];
455: bool parent_int_10h_feh_called;
456: bool parent_int_10h_ffh_called;
457: } process_t;
458:
1.1.1.11! root 459: typedef struct {
! 460: UINT16 psp;
! 461: UINT32 dta;
! 462: HANDLE find_handle;
! 463: } dtainfo_t;
! 464:
1.1.1.8 root 465: UINT8 major_version = 7;
466: UINT8 minor_version = 10;
467:
1.1.1.7 root 468: UINT16 first_mcb;
1.1 root 469: UINT16 current_psp;
470:
471: int retval = 0;
472: UINT16 error_code = 0;
473:
474: file_handler_t file_handler[MAX_FILES];
475: UINT8 file_buffer[0x100000];
476:
477: process_t process[MAX_PROCESS];
1.1.1.11! root 478: dtainfo_t dtalist[MAX_DTAINFO];
1.1 root 479:
1.1.1.6 root 480: UINT16 malloc_strategy = 0;
481: UINT8 umb_linked = 0;
482:
1.1 root 483: void msdos_syscall(unsigned num);
484: int msdos_init(int argc, char *argv[], char *envp[], int standard_env);
485: void msdos_finish();
486:
487: // console
488:
489: #define SCR_BUF_SIZE 1200
490:
491: #define SET_RECT(rect, l, t, r, b) { \
492: rect.Left = l; \
493: rect.Top = t; \
494: rect.Right = r; \
495: rect.Bottom = b; \
496: }
497:
498: HANDLE hStdin;
499: HANDLE hStdout;
500: CHAR_INFO scr_buf[SCR_BUF_SIZE][80];
501: char scr_char[80 * 25];
502: WORD scr_attr[80 * 25];
503: COORD scr_buf_size;
504: COORD scr_buf_pos;
505: int scr_width, scr_height;
1.1.1.10 root 506: bool restore_console_on_exit = false;
1.1 root 507: bool cursor_moved;
508:
509: FIFO *key_buf_char;
510: FIFO *key_buf_scan;
1.1.1.7 root 511: int key_input = 0;
1.1.1.4 root 512: UINT32 key_code = 0;
1.1 root 513:
514: int active_code_page;
515: int system_code_page;
516:
1.1.1.7 root 517: UINT32 text_vram_top_address = TEXT_VRAM_TOP;
518: UINT32 text_vram_end_address = TEXT_VRAM_TOP + 4000;
519: UINT32 shadow_buffer_top_address = SHADOW_BUF_TOP;
520: UINT32 shadow_buffer_end_address = SHADOW_BUF_TOP + 4000;
1.1 root 521: bool int_10h_feh_called = false;
522: bool int_10h_ffh_called = false;
523:
524: /* ----------------------------------------------------------------------------
525: PC/AT hardware emulation
526: ---------------------------------------------------------------------------- */
527:
528: void hardware_init();
1.1.1.9 root 529: void hardware_finish();
1.1 root 530: void hardware_run();
531: void hardware_update();
532:
533: // memory
534:
535: #define MAX_MEM 0x1000000
1.1.1.3 root 536: UINT8 mem[MAX_MEM + 3];
1.1 root 537:
538: // pic
539:
540: typedef struct {
541: UINT8 imr, isr, irr, prio;
542: UINT8 icw1, icw2, icw3, icw4;
543: UINT8 ocw3;
544: UINT8 icw2_r, icw3_r, icw4_r;
545: } pic_t;
546:
547: pic_t pic[2];
548: int pic_req_chip, pic_req_level;
549: UINT8 pic_req_bit;
550:
551: void pic_init();
552: void pic_write(int c, UINT32 addr, UINT8 data);
553: UINT8 pic_read(int c, UINT32 addr);
554: void pic_req(int c, int level, int signal);
555: int pic_ack();
556: void pic_update();
557:
558: // pit
559:
1.1.1.7 root 560: #define PIT_ALWAYS_RUNNING
561:
1.1 root 562: typedef struct {
563: INT32 count;
564: UINT16 latch;
565: UINT16 count_reg;
566: UINT8 ctrl_reg;
567: int count_latched;
568: int low_read, high_read;
569: int low_write, high_write;
570: int mode;
571: int status_latched;
572: UINT8 status;
573: // constant clock
574: UINT32 expired_time;
575: UINT32 prev_time;
576: } pit_t;
577:
578: pit_t pit[3];
1.1.1.7 root 579: #ifndef PIT_ALWAYS_RUNNING
1.1 root 580: int pit_active;
1.1.1.7 root 581: #endif
1.1 root 582:
583: void pit_init();
584: void pit_write(int ch, UINT8 val);
585: UINT8 pit_read(int ch);
1.1.1.7 root 586: int pit_run(int ch, UINT32 cur_time);
1.1 root 587: void pit_latch_count(int ch);
1.1.1.7 root 588: int pit_get_expired_time(int ch);
589:
1.1.1.8 root 590: UINT8 system_port = 0;
591:
1.1.1.7 root 592: // cmos
593:
594: UINT8 cmos[128];
595: UINT8 cmos_addr;
596:
597: void cmos_init();
598: void cmos_write(int addr, UINT8 val);
599: UINT8 cmos_read(int addr);
1.1 root 600:
1.1.1.6 root 601: // kbd (a20)
602:
603: UINT8 kbd_data;
604: UINT8 kbd_status;
605: UINT8 kbd_command;
606:
607: void kbd_init();
608: UINT8 kbd_read_data();
609: void kbd_write_data(UINT8 val);
610: UINT8 kbd_read_status();
611: void kbd_write_command(UINT8 val);
612:
1.1 root 613: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.