Annotation of msdos-player/source/msdos.h, revision 1.1.1.5

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.