|
|
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)
136: #define DOS_INFO_BASE (DOS_INFO_TOP + 12)
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;
172: } mcb_t;
173: #pragma pack()
174:
175: #pragma pack(1)
176: typedef struct {
177: UINT16 env_seg;
178: PAIR32 cmd_line;
179: PAIR32 fcb1;
180: PAIR32 fcb2;
181: UINT16 sp;
182: UINT16 ss;
183: UINT16 ip;
184: UINT16 cs;
185: } param_block_t;
186: #pragma pack()
187:
188: #pragma pack(1)
189: typedef struct {
190: UINT8 len;
191: char cmd[127];
192: } cmd_line_t;
193: #pragma pack()
194:
195: #pragma pack(1)
196: typedef struct {
197: UINT8 exit[2];
198: UINT16 first_mcb;
199: UINT8 reserved_1;
200: UINT8 far_call;
201: PAIR32 cpm_entry;
202: PAIR32 int_22h;
203: PAIR32 int_23h;
204: PAIR32 int_24h;
205: UINT16 parent_psp;
206: UINT8 file_table[20];
207: UINT16 env_seg;
208: PAIR32 stack;
209: UINT8 reserved_2[30];
210: UINT8 service[3];
211: UINT8 reserved_3[2];
212: UINT8 ex_fcb[7];
213: UINT8 fcb1[16];
214: UINT8 fcb2[20];
215: UINT8 buffer[128];
216: } psp_t;
217: #pragma pack()
218:
219: #pragma pack(1)
220: typedef struct {
221: UINT16 mz;
222: UINT16 extra_bytes;
223: UINT16 pages;
224: UINT16 relocations;
225: UINT16 header_size;
226: UINT16 min_alloc;
227: UINT16 max_alloc;
228: UINT16 init_ss;
229: UINT16 init_sp;
230: UINT16 check_sum;
231: UINT16 init_ip;
232: UINT16 init_cs;
233: UINT16 relocation_table;
234: UINT16 overlay;
235: } exe_header_t;
236: #pragma pack()
237:
238: #pragma pack(1)
239: typedef struct {
240: UINT8 flag;
241: UINT8 reserved[5];
242: UINT8 attribute;
243: } ext_fcb_t;
244: #pragma pack()
245:
246: #pragma pack(1)
247: typedef struct {
248: UINT8 drive;
249: UINT8 file_name[8 + 3];
250: UINT16 current_block;
251: UINT16 record_size;
252: UINT32 file_size;
253: UINT16 date;
254: UINT16 time;
255: UINT8 reserved[8];
256: UINT8 cur_record;
257: UINT32 rand_record;
258: } fcb_t;
259: #pragma pack()
260:
261: #pragma pack(1)
262: typedef struct {
263: UINT8 drive;
264: UINT8 file_name[8 + 3];
265: UINT8 attribute;
266: UINT8 nt_res;
267: UINT8 create_time_ms;
268: UINT16 creation_time;
269: UINT16 creation_date;
270: UINT16 last_access_date;
271: UINT16 cluster_hi;
272: UINT16 last_write_time;
273: UINT16 last_write_date;
274: UINT16 cluster_lo;
275: UINT32 file_size;
276: } find_fcb_t;
277: #pragma pack()
278:
279: #pragma pack(1)
280: typedef struct {
281: UINT8 reserved[21];
282: UINT8 attrib;
283: UINT16 time;
284: UINT16 date;
285: UINT32 size;
286: char name[13];
287: } find_t;
288: #pragma pack()
289:
290: #pragma pack(1)
291: typedef struct {
292: UINT32 attrib;
293: PAIR32 ctime_lo;
294: PAIR32 ctime_hi;
295: PAIR32 atime_lo;
296: PAIR32 atime_hi;
297: PAIR32 mtime_lo;
298: PAIR32 mtime_hi;
299: UINT32 size_hi;
300: UINT32 size_lo;
301: UINT8 reserved[8];
302: char full_name[260];
303: char short_name[14];
304: } find_lfn_t;
305: #pragma pack()
306:
307: #pragma pack(1)
308: typedef struct {
309: UINT16 info_level;
310: UINT32 serial_number;
311: char volume_label[11];
312: char file_system[8];
313: } drive_info_t;
314: #pragma pack()
315:
316: #pragma pack(1)
317: typedef struct {
318: UINT16 size_of_structure;
319: UINT16 structure_version;
320: UINT32 sectors_per_cluster;
321: UINT32 bytes_per_sector;
322: UINT32 available_clusters_on_drive;
323: UINT32 total_clusters_on_drive;
324: UINT32 available_sectors_on_drive;
325: UINT32 total_sectors_on_drive;
326: UINT32 available_allocation_units;
327: UINT32 total_allocation_units;
328: UINT8 reserved[8];
329: } ext_space_info_t;
330: #pragma pack()
331:
332: #pragma pack(1)
333: typedef struct {
334: UINT8 drive_num;
335: UINT8 unit_num;
336: UINT16 bytes_per_sector;
337: UINT8 highest_sector_num;
338: UINT8 shift_count;
339: UINT16 reserved_sectors;
340: UINT8 fat_num;
341: UINT16 root_entries;
342: UINT16 first_data_sector;
343: UINT16 highest_cluster_num;
344: UINT16 sectors_per_fat;
345: UINT16 first_dir_sector;
346: UINT32 device_driver_header;
347: UINT8 media_type;
348: UINT8 drive_accessed;
349: UINT16 next_dpb_ofs;
350: UINT16 next_dpb_seg;
351: UINT16 first_free_cluster;
352: UINT16 free_clusters;
353: } dpb_t;
354: #pragma pack()
355:
356: #pragma pack(1)
357: typedef struct {
358: char path_name[67];
359: UINT16 drive_attrib;
360: UINT8 physical_drive_number;
361: } cds_t;
362: #pragma pack()
363:
364: #pragma pack(1)
365: typedef struct {
366: UINT8 reserved_1[10];
367: UINT16 first_mcb; // -2
368: PAIR32 first_dpb; // +0
369: PAIR32 first_sft; // +0
370: UINT8 reserved_2[14];
371: PAIR32 cds; // +22
372: PAIR32 fcb_table; // +26
373: UINT8 reserved_3[3];
374: UINT8 last_drive; // +33
375: UINT8 reserved_4[29];
376: UINT16 buffers_x; // +63
377: UINT16 buffers_y; // +65
378: UINT8 boot_drive; // +67
379: UINT8 i386_or_later; // +68
380: UINT16 ext_mem_size; // +69
381: } dos_info_t;
382: #pragma pack()
383:
384: typedef struct {
385: char path[MAX_PATH];
386: int valid;
387: int id;
388: int atty;
389: int mode;
390: UINT16 info;
391: UINT16 psp;
392: } file_handler_t;
393:
394: static const struct {
395: int mode;
396: int in;
397: int out;
398: } file_mode[] = {
399: { _O_RDONLY | _O_BINARY, 1, 0 },
400: { _O_WRONLY | _O_BINARY, 0, 1 },
401: { _O_RDWR | _O_BINARY, 1, 1 },
402: };
403:
404: typedef struct {
405: UINT16 psp;
406: char module_dir[MAX_PATH];
407: PAIR32 dta;
408: UINT8 switchar;
409: UINT8 verify;
410: int max_files;
411: HANDLE find_handle;
412: UINT8 allowable_mask;
413: UINT8 required_mask;
414: char volume_label[MAX_PATH];
415: bool parent_int_10h_feh_called;
416: bool parent_int_10h_ffh_called;
417: } process_t;
418:
419: UINT16 current_psp;
420:
421: int retval = 0;
422: UINT16 error_code = 0;
423:
424: file_handler_t file_handler[MAX_FILES];
425: UINT8 file_buffer[0x100000];
426:
427: process_t process[MAX_PROCESS];
428:
429: void msdos_syscall(unsigned num);
430: int msdos_init(int argc, char *argv[], char *envp[], int standard_env);
431: void msdos_finish();
432:
433: // console
434:
435: #define SCR_BUF_SIZE 1200
436:
437: #define SET_RECT(rect, l, t, r, b) { \
438: rect.Left = l; \
439: rect.Top = t; \
440: rect.Right = r; \
441: rect.Bottom = b; \
442: }
443:
444: HANDLE hStdin;
445: HANDLE hStdout;
446: CHAR_INFO scr_buf[SCR_BUF_SIZE][80];
447: char scr_char[80 * 25];
448: WORD scr_attr[80 * 25];
449: COORD scr_buf_size;
450: COORD scr_buf_pos;
451: int scr_width, scr_height;
452: bool cursor_moved;
453:
454: FIFO *key_buf_char;
455: FIFO *key_buf_scan;
456:
457: int active_code_page;
458: int system_code_page;
459:
1.1.1.2 ! root 460: UINT32 tvram_top_address = TVRAM_TOP;
! 461: UINT32 tvram_end_address = TVRAM_TOP + 4000;
1.1 root 462: bool int_10h_feh_called = false;
463: bool int_10h_ffh_called = false;
464:
465: /* ----------------------------------------------------------------------------
466: PC/AT hardware emulation
467: ---------------------------------------------------------------------------- */
468:
469: #define SUPPORT_HARDWARE
470:
471: void hardware_init();
472: void hardware_run();
473: #ifdef SUPPORT_HARDWARE
474: void hardware_update();
475: #endif
476:
477: // memory
478:
479: #define MAX_MEM 0x1000000
480: UINT8 mem[MAX_MEM];
481:
482: // cmos
483:
484: UINT8 cmos[128];
485: UINT8 cmos_addr;
486:
487: // pic
488:
489: typedef struct {
490: UINT8 imr, isr, irr, prio;
491: UINT8 icw1, icw2, icw3, icw4;
492: UINT8 ocw3;
493: UINT8 icw2_r, icw3_r, icw4_r;
494: } pic_t;
495:
496: pic_t pic[2];
497: int pic_req_chip, pic_req_level;
498: UINT8 pic_req_bit;
499:
500: void pic_init();
501: void pic_write(int c, UINT32 addr, UINT8 data);
502: UINT8 pic_read(int c, UINT32 addr);
503: void pic_req(int c, int level, int signal);
504: int pic_ack();
505: void pic_update();
506:
507: // pit
508:
509: typedef struct {
510: int prev_out;
511: //int gate;
512: INT32 count;
513: UINT16 latch;
514: UINT16 count_reg;
515: UINT8 ctrl_reg;
516: int count_latched;
517: int low_read, high_read;
518: int low_write, high_write;
519: int mode;
520: int delay;
521: int start;
522: int null_count;
523: int status_latched;
524: UINT8 status;
525: // constant clock
526: UINT32 input_clk;
527: UINT32 expired_time;
528: UINT32 prev_time;
529: } pit_t;
530:
531: pit_t pit[3];
532: int pit_active;
533:
534: void pit_init();
535: void pit_write(int ch, UINT8 val);
536: UINT8 pit_read(int ch);
537: void pit_run();
538: void pit_input_clock(int ch, int clock);
539: void pit_start_count(int ch);
540: void pit_stop_count(int ch);
541: void pit_latch_count(int ch);
542: void pit_set_signal(int ch, int signal);
543: int pit_get_next_count(int ch);
544: int pit_get_expired_time(int clock);
545:
546: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.