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