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

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

unix.superglobalmegacorp.com

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