|
|
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
383: } dos_info_t;
384: #pragma pack()
385:
386: typedef struct {
387: char path[MAX_PATH];
388: int valid;
389: int id;
390: int atty;
391: int mode;
392: UINT16 info;
393: UINT16 psp;
394: } file_handler_t;
395:
396: static const struct {
397: int mode;
398: int in;
399: int out;
400: } file_mode[] = {
401: { _O_RDONLY | _O_BINARY, 1, 0 },
402: { _O_WRONLY | _O_BINARY, 0, 1 },
403: { _O_RDWR | _O_BINARY, 1, 1 },
404: };
405:
406: typedef struct {
407: UINT16 psp;
408: char module_dir[MAX_PATH];
409: PAIR32 dta;
410: UINT8 switchar;
411: UINT8 verify;
412: int max_files;
413: HANDLE find_handle;
414: UINT8 allowable_mask;
415: UINT8 required_mask;
416: char volume_label[MAX_PATH];
417: bool parent_int_10h_feh_called;
418: bool parent_int_10h_ffh_called;
419: } process_t;
420:
421: UINT16 current_psp;
422:
423: int retval = 0;
424: UINT16 error_code = 0;
425:
426: file_handler_t file_handler[MAX_FILES];
427: UINT8 file_buffer[0x100000];
428:
429: process_t process[MAX_PROCESS];
430:
431: void msdos_syscall(unsigned num);
432: int msdos_init(int argc, char *argv[], char *envp[], int standard_env);
433: void msdos_finish();
434:
435: // console
436:
437: #define SCR_BUF_SIZE 1200
438:
439: #define SET_RECT(rect, l, t, r, b) { \
440: rect.Left = l; \
441: rect.Top = t; \
442: rect.Right = r; \
443: rect.Bottom = b; \
444: }
445:
446: HANDLE hStdin;
447: HANDLE hStdout;
448: CHAR_INFO scr_buf[SCR_BUF_SIZE][80];
449: char scr_char[80 * 25];
450: WORD scr_attr[80 * 25];
451: COORD scr_buf_size;
452: COORD scr_buf_pos;
453: int scr_width, scr_height;
454: bool cursor_moved;
455:
456: FIFO *key_buf_char;
457: FIFO *key_buf_scan;
458:
459: int active_code_page;
460: int system_code_page;
461:
1.1.1.2 root 462: UINT32 tvram_top_address = TVRAM_TOP;
463: UINT32 tvram_end_address = TVRAM_TOP + 4000;
1.1 root 464: bool int_10h_feh_called = false;
465: bool int_10h_ffh_called = false;
466:
467: /* ----------------------------------------------------------------------------
468: PC/AT hardware emulation
469: ---------------------------------------------------------------------------- */
470:
471: #define SUPPORT_HARDWARE
472:
473: void hardware_init();
474: void hardware_run();
475: #ifdef SUPPORT_HARDWARE
476: void hardware_update();
477: #endif
478:
479: // memory
480:
481: #define MAX_MEM 0x1000000
1.1.1.3 ! root 482: UINT8 mem[MAX_MEM + 3];
1.1 root 483:
484: // cmos
485:
486: UINT8 cmos[128];
487: UINT8 cmos_addr;
488:
489: // pic
490:
491: typedef struct {
492: UINT8 imr, isr, irr, prio;
493: UINT8 icw1, icw2, icw3, icw4;
494: UINT8 ocw3;
495: UINT8 icw2_r, icw3_r, icw4_r;
496: } pic_t;
497:
498: pic_t pic[2];
499: int pic_req_chip, pic_req_level;
500: UINT8 pic_req_bit;
501:
502: void pic_init();
503: void pic_write(int c, UINT32 addr, UINT8 data);
504: UINT8 pic_read(int c, UINT32 addr);
505: void pic_req(int c, int level, int signal);
506: int pic_ack();
507: void pic_update();
508:
509: // pit
510:
511: typedef struct {
512: int prev_out;
513: //int gate;
514: INT32 count;
515: UINT16 latch;
516: UINT16 count_reg;
517: UINT8 ctrl_reg;
518: int count_latched;
519: int low_read, high_read;
520: int low_write, high_write;
521: int mode;
522: int delay;
523: int start;
524: int null_count;
525: int status_latched;
526: UINT8 status;
527: // constant clock
528: UINT32 input_clk;
529: UINT32 expired_time;
530: UINT32 prev_time;
531: } pit_t;
532:
533: pit_t pit[3];
534: int pit_active;
535:
536: void pit_init();
537: void pit_write(int ch, UINT8 val);
538: UINT8 pit_read(int ch);
539: void pit_run();
540: void pit_input_clock(int ch, int clock);
541: void pit_start_count(int ch);
542: void pit_stop_count(int ch);
543: void pit_latch_count(int ch);
544: void pit_set_signal(int ch, int signal);
545: int pit_get_next_count(int ch);
546: int pit_get_expired_time(int clock);
547:
548: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.