Reorged interrupt info, added MS-DOS 3.21 images, and increased memory size of OS/2 1.0 machine to 2Mb
This commit is contained in:
parent
0e9ce2d653
commit
95f7db7c94
11 changed files with 2100 additions and 189 deletions
|
|
@ -1,10 +1,61 @@
|
|||
MS-DOS 3.20
|
||||
---
|
||||
|
||||
The MS-DOS 3.20 floppies in the PCjs collection had a printed date of `March 21, 1986` (see the photo below).
|
||||
However, all the files on Disks 1 and 2 are timestamped `7-07-86 12:00p`.
|
||||
|
||||
Surprisingly Bad Bug in MS-DOS 3.20
|
||||
---
|
||||
If you attempt to boot MS-DOS 3.20 on an [IBM PC Model 5150](/devices/pc/machine/5150/cga/384kb/softkbd/) (with either
|
||||
an MDA or CGA video card), the machine will appear to crash after printing the first character.
|
||||
|
||||
When MS-DOS 3.20 prints characters to the screen, it uses this code:
|
||||
|
||||
0287:1FA8 CD29 INT 29 ;history=7
|
||||
0070:017A 50 PUSH AX ;history=6
|
||||
0070:017B 56 PUSH SI ;history=5
|
||||
0070:017C 57 PUSH DI ;history=4
|
||||
0070:017D 55 PUSH BP ;history=3
|
||||
0070:017E B40E MOV AH,0E ;history=2
|
||||
0070:0180 B307 MOV BL,07 ;history=1
|
||||
0070:0182 CD10 INT 10
|
||||
AX=0E43 BX=0B07 CX=0010 DX=0000 SP=0862 BP=36FE SI=00D3 DI=000B
|
||||
SS=0287 DS=0287 ES=0287 PS=F012 V0 D0 I0 T0 S0 Z0 A1 P0 C0
|
||||
|
||||
whereas MS-DOS 3.30 uses this code:
|
||||
|
||||
022F:222E CD29 INT 29 ;history=10
|
||||
0070:069E 50 PUSH AX ;history=9
|
||||
0070:069F 56 PUSH SI ;history=8
|
||||
0070:06A0 57 PUSH DI ;history=7
|
||||
0070:06A1 55 PUSH BP ;history=6
|
||||
0070:06A2 53 PUSH BX ;history=5
|
||||
0070:06A3 B40E MOV AH,0E ;history=4
|
||||
0070:06A5 B700 MOV BH,00 ;history=3
|
||||
0070:06A7 B307 MOV BL,07 ;history=2
|
||||
0070:06A9 CD10 INT 10 ;history=1
|
||||
|
||||
MS-DOS 3.20 doesn't clear the BH register before calling INT 0x10 Video BIOS function 0x0E, and the Model 5150 Video
|
||||
BIOS uses the BH register to select the video page, so when BH contains garbage (0x0B in the above example), it prints
|
||||
characters off-screen, where they can’t be seen.
|
||||
|
||||
As a result, the machine hasn't technically "crashed", but it's printing characters where they can't be seen, making
|
||||
the machine more or less unusable.
|
||||
|
||||
Starting with the IBM PC Model 5160, Video BIOS function 0x0E ignores BH and always use the current page.
|
||||
|
||||
Microsoft must not have tested MS-DOS 3.20 on any 5150 machines, or if they did, those machines must have contained
|
||||
upgraded video cards, such as the EGA, which provided their own Video BIOS. This bug was fixed in MS-DOS 3.21,
|
||||
but that release apparently wasn't made available until almost a year later (MS-DOS 3.21 files are timestamped
|
||||
`5-01-87 12:00a`).
|
||||
|
||||
MS-DOS 3.20 Photos
|
||||
---
|
||||
|
||||
Here's what one of the MS-DOS 3.20 diskettes looked like.
|
||||
|
||||
> 
|
||||
|
||||
And the box, courtesy of [www.oldcomputermuseum.com](http://www.oldcomputermuseum.com/os/msdos_3.2.html).
|
||||
|
||||
> 
|
||||
> 
|
||||
|
|
|
|||
1
disks/pc/dos/microsoft/3.21/MSDOS321-DISK1.json
Normal file
1
disks/pc/dos/microsoft/3.21/MSDOS321-DISK1.json
Normal file
File diff suppressed because one or more lines are too long
1
disks/pc/dos/microsoft/3.21/MSDOS321-DISK2.json
Normal file
1
disks/pc/dos/microsoft/3.21/MSDOS321-DISK2.json
Normal file
File diff suppressed because one or more lines are too long
16
disks/pc/dos/microsoft/3.21/manifest.xml
Normal file
16
disks/pc/dos/microsoft/3.21/manifest.xml
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.19.2/manifest.xsl"?>
|
||||
<manifest type="software">
|
||||
<title>MS-DOS</title>
|
||||
<version>3.21</version>
|
||||
<type>DOS</type>
|
||||
<category>Operating System</category>
|
||||
<author>Microsoft</author>
|
||||
<releaseDate>May 1, 1987</releaseDate>
|
||||
<disk id="disk01" size="368640" chs="40:2:9" img="static/MSDOS321-DISK1.img" href="/disks/pc/dos/microsoft/3.21/MSDOS321-DISK1.json" md5="251b00fc091a252d655a3bc447eb330b" md5json="92c4a838698bef22ab51528d69636bbd">
|
||||
<name>MS-DOS 3.21 (Disk 1)</name>
|
||||
</disk>
|
||||
<disk id="disk02" size="368640" chs="40:2:9" img="static/MSDOS321-DISK2.img" href="/disks/pc/dos/microsoft/3.21/MSDOS321-DISK2.json" md5="c55adcc046038c7909e3f27965ff9b8f" md5json="b891c15e24538935a9aeca47f69659ca">
|
||||
<name>MS-DOS 3.21 (Disk 2)</name>
|
||||
</disk>
|
||||
</manifest>
|
||||
|
|
@ -3,9 +3,10 @@ Multitasking MS-DOS 4.00
|
|||
|
||||
These disk images contain the first unearthed copy of Microsoft's "multitasking" version of MS-DOS.
|
||||
They were were discovered by the [PCjs Project](/docs/about/) in March 2013.
|
||||
This version of MS-DOS was never officially released in North America. More information is available at
|
||||
[Wikipedia](http://en.wikipedia.org/wiki/Multi-tasking_MS-DOS_4.0) and
|
||||
[OS/2 Museum](http://www.os2museum.com/wp/?p=1769).
|
||||
More information is available at
|
||||
[Wikipedia](http://en.wikipedia.org/wiki/Multi-tasking_MS-DOS_4.0),
|
||||
[OS/2 Museum](http://www.os2museum.com/wp/?p=1769), and
|
||||
[MSDN Blogs](http://blogs.msdn.com/b/larryosterman/archive/2004/03/22/94209.aspx).
|
||||
|
||||
Note: The designation "4.0M" is not an official version number; it's an internal version number used only to
|
||||
differentiate these disk images from those of the official MS-DOS 4.00 release in July 1988.
|
||||
|
|
@ -14,3 +15,108 @@ The [IBM Model 5160](/devices/pc/machine/) machine configuration below boots MS-
|
|||
"Session Manager" after it's booted, tap the **Alt** key.
|
||||
|
||||
[IBM Model 5160](/devices/pc/machine/5160/cga/640kb/dos400m/ "PCjs:ibm5160:::debugger")
|
||||
|
||||
Additional Information From [PC DOS Retro](https://sites.google.com/site/pcdosretro/multitaskingdos4) by Vernon Brooks
|
||||
---
|
||||
|
||||
Multitasking MS-DOS 4.0 was a little known and separate development of DOS done in parallel with the development
|
||||
of DOS 3.0 and 3.1 and was released in late 1985. It should not be confused with the later retail DOS 4.0 that was
|
||||
released in 1988. DOS 4.0 supported preemptive multitasking, shared memory, semaphores, advanced memory management,
|
||||
a session manager, imports, exports and a new executable format. Many of the ideas and features introduced here found
|
||||
their way into OS/2. Unfortunately DOS 4.0 was limited by the real-mode 8086 environment and the 640KB address space.
|
||||
Also programs which were not well-behaved or relied upon undocumented DOS functions would not run properly under
|
||||
DOS 4.0, particularly TSR programs. Despite these limitations Microsoft wanted to make DOS 4.0 a retail product but
|
||||
IBM at the time was not interested in such a version of DOS, instead they formed a joint development agreement with
|
||||
Microsoft which resulted in the development of OS/2 1.0. Microsoft licensed DOS 4.0 to several European OEMs including
|
||||
Goupil but it was never shipped in North America. Microsoft released an updated version, DOS 4.1 in late 1987 for
|
||||
the British company International Computers Limited (ICL). DOS 4.1 incorporated features from DOS 3.2. Like its
|
||||
predecessor, DOS 4.1 was never shipped in North America.
|
||||
|
||||
List of features and differences between standard DOS and Multitasking MS-DOS 4.0:
|
||||
|
||||
* based upon DOS 3.1
|
||||
* INT 21h functions 00h-62h, 83h-91h, 95h-99h
|
||||
* INT 21h functions 3300h-3302h
|
||||
* INT 21h functions 4400h-440Ch
|
||||
* INT 21h functions 4B00h, 4B01h, 4B03h, 4B04h-4B06h, 4B08h, 4B0Ch-4B0Eh
|
||||
* INT 21h functions 5D00h-5D0Ah
|
||||
* INT 21h functions 58h and 5D06h not supported
|
||||
* new INT 21h functions:
|
||||
* 61h: unknown function
|
||||
* 8301h: get/set memory partition size
|
||||
* 8400h-8402h: shared memory functions
|
||||
* 8500h-8504h: semaphore functions
|
||||
* 86h: set handle count
|
||||
* 87h: get process id
|
||||
* 8801h-8802h: unknown get/set function (handle related)
|
||||
* 89h: sleep
|
||||
* 8Ah: child wait
|
||||
* 8Bh: JOIN/SUBST
|
||||
* 8Ch: set signal handler
|
||||
* 8Dh: send signal
|
||||
* 8Eh: get/set process priority
|
||||
* 8Fh: unknown function (vector related)
|
||||
* 90h: unknown function (vector related)
|
||||
* 91h: unknown function
|
||||
* 95h: set hard error flag
|
||||
* 96h: unknown function
|
||||
* 97h: unknown function
|
||||
* 98h: unknown function
|
||||
* 99h: unknown function
|
||||
* INT 21h functions 1Fh and 32h copy the DPB to DS:BX instead of returning a pointer in DS:BX
|
||||
* INT 21h function 25h does not directly set interrupt vectors
|
||||
* device driver command codes 00h-10h (same as DOS 3.x) and 11h-16h (new)
|
||||
* new device driver command codes:
|
||||
* 11h: stop console output
|
||||
* 12h: restart console output
|
||||
* 13h: generic ioctl (same as DOS 3.2+)
|
||||
* 14h: unknown
|
||||
* 15h: unknown
|
||||
* 16h: unknown
|
||||
* SYSVARS table:
|
||||
* 00h DPB pointer (DPB length = 18h)
|
||||
* 04h SFT pointer (SFT length = 37h)
|
||||
* 08h CLOCK$ device pointer
|
||||
* 0Ch KEYBD$ device pointer
|
||||
* 10h SCREEN$ device pointer
|
||||
* 14h disk buffer size
|
||||
* 16h disk buffer chain pointer
|
||||
* 1Ah ? (always 0, CDS pointer should be here)
|
||||
* 1Eh FCB SFT pointer
|
||||
* 22h FCB keep count
|
||||
* 24h drive count
|
||||
* 25h switch character
|
||||
* 26h ? (code pointer)
|
||||
* 2Ah NUL device header
|
||||
* no MCB anchor at SYSVARS-2
|
||||
* MCBs have previous MCB at 06h and next MCB at 08h (same seg as MCB = start/end of chain)
|
||||
* InDOS flag is always FFh and the critical error flag does not precede it
|
||||
* KEYBD$ and SCREEN$ in addition to CON
|
||||
* no INT 28h or INT 2Ah function 84h idle callout
|
||||
* no INT 2Ah critical section support
|
||||
* no INT 2Fh redirector support
|
||||
* no job file table in PSP
|
||||
* INT 12h (40h:13h) value is altered to limit session memory
|
||||
* CONFIG.SYS commands: BREAK, BUFFERS, COUNTRY, DEVICE, FCBS, FILES, LASTDRIVE, SHELL (same as DOS 3.1)
|
||||
* additional internal commands: CALL, DETACH (DET), ENDLOCAL, EXTPROC, MEMSET, SETLOCAL
|
||||
* NE format executables supported
|
||||
* no PSP created for NE executables
|
||||
* DOSCALLS exported function names:
|
||||
* 01 ALLOCSEG
|
||||
* 02 REALLOCSEG
|
||||
* 03 FREESEG
|
||||
* 04 LOCKSEG
|
||||
* 05 UNLOCKSEG
|
||||
* 06 GETSEGSIZE
|
||||
* 07 GETDSHANDLE
|
||||
* 08 CRITENTER
|
||||
* 09 CRITLEAVE
|
||||
* 0A FCRITENTER
|
||||
* 0B FCRITLEAVE
|
||||
* 0C PBLOCK
|
||||
* 0D PRUN
|
||||
* 0E SUBSCREEN
|
||||
* 0F GETPIDS
|
||||
* 10 DOSDISCARDCODE
|
||||
* 11 DOSGETHANDLE
|
||||
* 12 DOSHANDLEJUMP
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
<manifest ref="/disks/pc/dos/ibm/6.10/manifest.xml" disk="*"/>
|
||||
<manifest ref="/disks/pc/dos/ibm/7.00/manifest.xml" disk="*"/>
|
||||
<manifest ref="/disks/pc/dos/microsoft/3.20/manifest.xml" disk="*"/>
|
||||
<manifest ref="/disks/pc/dos/microsoft/3.21/manifest.xml" disk="*"/>
|
||||
<manifest ref="/disks/pc/dos/microsoft/3.30/manifest.xml" disk="*"/>
|
||||
<manifest ref="/disks/pc/dos/microsoft/3.31/manifest.xml" disk="*"/>
|
||||
<manifest ref="/disks/pc/dos/microsoft/4.0M/manifest.xml" disk="*"/>
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/versions/pcjs/1.19.2/machine.xsl"?>
|
||||
<machine id="ibm5170" class="pc" border="1" pos="center" background="#FAEBD7">
|
||||
<name>IBM PC AT (8Mhz), 128Kb EGA, 1152Kb RAM, 20Mb Hard Disk</name>
|
||||
<name>IBM PC AT (8Mhz), 128Kb EGA, 2Mb RAM, 20Mb Hard Disk</name>
|
||||
<computer id="at-ega-1152k" name="IBM PC AT" buswidth="24"/>
|
||||
<cpu id="cpu286" model="80286" cycles="8000000"/>
|
||||
<ram id="ramLow" addr="0x00000" test="false" size="0xa0000" comment="ROM BIOS memory test has been disabled"/>
|
||||
<ram id="ramExt" addr="0x100000" size="0x80000" comment=""/>
|
||||
<ram id="ramLow" addr="0x00000" test="true" size="0xa0000" comment="ROM BIOS memory test has NOT been disabled"/>
|
||||
<ram id="ramExt" addr="0x100000" size="0x160000" comment=""/>
|
||||
<rom id="romEGA" addr="0xc0000" size="0x4000" file="/devices/pc/video/ibm/ega/ibm-ega.json" notify="videoEGA"/>
|
||||
<rom id="romBIOS" addr="0xf0000" size="0x10000" alias="0xff0000" file="/devices/pc/bios/5170/1985-11-15.json"/>
|
||||
<video ref="/devices/pc/video/ibm/ega/ibm-ega-128kb-autolockfs.xml"/>
|
||||
<keyboard ref="/devices/pc/keyboard/keyboard-minimal-functions.xml"/>
|
||||
<debugger id="debugger" messages="fault" commands=""/>
|
||||
<panel ref="/devices/pc/panel/wide.xml"/>
|
||||
<fdc ref="/disks/pc/library.xml" automount='{A:{name:"OS/2 1.0 (1.44M Install)",path:"/disks/pc/os2/ibm/1.0/OS210-INSTALL.json"}}'/>
|
||||
<fdc ref="/disks/pc/library.xml" automount=''/>
|
||||
<hdc id="hdcAT" type="at" drives='[{name:"20Mb Hard Disk",type:2,path:"/disks/pc/os2/ibm/1.0/OS210-HDISK.json"}]'/>
|
||||
<chipset id="chipset" model="5170" floppies="[1440,1200]"/>
|
||||
<serial id="com1" adapter="1"/>
|
||||
|
|
|
|||
|
|
@ -1067,7 +1067,7 @@ ChipSet.prototype.initBus = function(cmp, bus, cpu, dbg)
|
|||
chipset.dumpCMOS();
|
||||
});
|
||||
}
|
||||
cpu.addIntNotify(Interrupts.RTC.VECTOR, this, this.intBIOSRTC);
|
||||
cpu.addIntNotify(Interrupts.RTC, this, this.intBIOSRTC);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -4961,7 +4961,7 @@ ChipSet.prototype.outCoprocReset = function(port, bOut, addrFrom)
|
|||
ChipSet.prototype.intBIOSRTC = function(addr)
|
||||
{
|
||||
if (DEBUGGER) {
|
||||
if (this.messageEnabled(Messages.RTC) && this.dbg.messageInt(Interrupts.RTC.VECTOR, addr)) {
|
||||
if (this.messageEnabled(Messages.RTC) && this.dbg.messageInt(Interrupts.RTC, addr)) {
|
||||
/*
|
||||
* By computing AH now, we get the incoming AH value; if we computed it below, along with
|
||||
* the rest of the register values, we'd get the outgoing AH value, which is not what we want.
|
||||
|
|
@ -4980,7 +4980,7 @@ ChipSet.prototype.intBIOSRTC = function(addr)
|
|||
} else if (AH == 0x04 || AH == 0x05) {
|
||||
sResult = " CX(year)=" + str.toHexWord(chipset.cpu.regECX) + " DH(month)=" + str.toHexByte(DH) + " DL(day)=" + str.toHexByte(DL);
|
||||
}
|
||||
chipset.dbg.messageIntReturn(Interrupts.RTC.VECTOR, nLevel, nCycles, sResult);
|
||||
chipset.dbg.messageIntReturn(Interrupts.RTC, nLevel, nCycles, sResult);
|
||||
};
|
||||
}(this, this.cpu.getCycles()));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1201,140 +1201,6 @@ if (DEBUGGER) {
|
|||
]
|
||||
];
|
||||
|
||||
/*
|
||||
* See replaceRegs() for the rules governing how register contents are replaced in the strings below. Replacements
|
||||
* occur in the following order:
|
||||
*
|
||||
* Replace every %XX (or %XXX), where XX (or XXX) is a register, with the register's value.
|
||||
* Replace every #XX, where XX is a hex byte value, with the corresponding ASCII character (if printable).
|
||||
* Replace every $XXXX:XXXX, where XXXX:XXXX is a segmented address, with the zero-terminated string at that address.
|
||||
* Replace every ^XXXX:XXXX, where XXXX:XXXX is a segmented address, with the FCB filename stored at that address.
|
||||
*/
|
||||
Debugger.INT_FUNCS = {
|
||||
0x13: {
|
||||
0x00: "disk reset",
|
||||
0x01: "get status",
|
||||
0x02: "read drive %DL (%CH:%DH:%CL,%AL) into %ES:%BX",
|
||||
0x03: "write drive %DL (%CH:%DH:%CL,%AL) from %ES:%BX",
|
||||
0x04: "verify drive %DL (%CH:%DH:%CL,%AL)",
|
||||
0x05: "format drive %DL using %ES:%BX",
|
||||
0x08: "read drive %DL parameters into %ES:%DI",
|
||||
0x15: "get drive %DL DASD type",
|
||||
0x16: "get drive %DL change line status",
|
||||
0x17: "set drive %DL DASD type",
|
||||
0x18: "set drive %DL media type"
|
||||
},
|
||||
0x15: {
|
||||
0x80: "open device",
|
||||
0x81: "close device",
|
||||
0x82: "program termination",
|
||||
0x83: "wait %CX:%DXus for event",
|
||||
0x84: "joystick support",
|
||||
0x85: "SYSREQ pressed",
|
||||
0x86: "wait %CX:%DXus",
|
||||
0x87: "move block (%CX words)",
|
||||
0x88: "get extended memory size",
|
||||
0x89: "processor to virtual mode",
|
||||
0x90: "device busy loop",
|
||||
0x91: "interrupt complete flag set"
|
||||
},
|
||||
0x21: {
|
||||
0x00: "terminate program",
|
||||
0x01: "read character (AL) from stdin with echo",
|
||||
0x02: "write character #%DL to stdout",
|
||||
0x03: "read character (AL) from stdaux", // eg, COM1
|
||||
0x04: "write character #%DL to stdaux", // eg, COM1
|
||||
0x05: "write character #%DL to stdprn", // eg, LPT1
|
||||
0x06: "direct console output (input if %DL=FF)",
|
||||
0x07: "direct console input without echo",
|
||||
0x08: "read character (AL) from stdin without echo",
|
||||
0x09: "write string $%DS:%DX to stdout",
|
||||
0x0A: "buffered input (DS:DX)", // byte 0 is maximum chars, byte 1 is number of previous characters, byte 2 is number of characters read
|
||||
0x0B: "get stdin status",
|
||||
0x0C: "flush buffer and read stdin", // AL is a function # (0x01, 0x06, 0x07, 0x08, or 0x0A)
|
||||
0x0D: "disk reset",
|
||||
0x0E: "select default drive %DL", // returns # of available drives in AL
|
||||
0x0F: "open file using FCB ^%DS:%DX", // DS:DX -> unopened File Control Block
|
||||
0x10: "close file using FCB ^%DS:%DX",
|
||||
0x11: "find first matching file using FCB ^%DS:%DX",
|
||||
0x12: "find next matching file using FCB ^%DS:%DX",
|
||||
0x13: "delete file using FCB ^%DS:%DX",
|
||||
0x14: "sequential read from file using FCB ^%DS:%DX",
|
||||
0x15: "sequential write to file using FCB ^%DS:%DX",
|
||||
0x16: "create or truncate file using FCB ^%DS:%DX",
|
||||
0x17: "rename file using FCB ^%DS:%DX",
|
||||
0x19: "get current default drive (AL)",
|
||||
0x1A: "set disk transfer area (DTA=%DS:%DX)",
|
||||
0x1B: "get allocation information for default drive",
|
||||
0x1C: "get allocation information for specific drive %DL",
|
||||
0x1F: "get drive parameter block for default drive",
|
||||
0x21: "read random record from file using FCB ^%DS:%DX",
|
||||
0x22: "write random record to file using FCB ^%DS:%DX",
|
||||
0x23: "get file size using FCB ^%DS:%DX",
|
||||
0x24: "set random record number for FCB ^%DS:%DX",
|
||||
0x25: "set address %DS:%DX of interrupt vector %AL",
|
||||
0x26: "create new PSP at segment %DX",
|
||||
0x27: "random block read from file using FCB ^%DS:%DX",
|
||||
0x28: "random block write to file using FCB ^%DS:%DX",
|
||||
0x29: "parse filename $%DS:%SI into FCB %ES:%DI using %AL",
|
||||
0x2A: "get system date (year=CX, mon=DH, day=DL)",
|
||||
0x2B: "set system date (year=%CX, mon=%DH, day=%DL)",
|
||||
0x2C: "get system time (hour=CH, min=CL, sec=DH, 100ths=DL)",
|
||||
0x2D: "set system time (hour=%CH, min=%CL, sec=%DH, 100ths=%DL)",
|
||||
0x2E: "set verify flag %AL",
|
||||
0x2F: "get disk transfer area (DTA=ES:BX)", // DOS 2.00+
|
||||
0x30: "get DOS version (AL=major, AH=minor)",
|
||||
0x31: "terminate and stay resident",
|
||||
0x32: "get drive parameter block (DPB=DS:BX) for drive %DL",
|
||||
0x33: "extended break check",
|
||||
0x34: "get address (ES:BX) of InDOS flag",
|
||||
0x35: "get address (ES:BX) of interrupt vector %AL",
|
||||
0x36: "get free disk space of drive %DL",
|
||||
0x37: "get(0)/set(1) switch character %DL (%AL)",
|
||||
0x38: "get country-specific information",
|
||||
0x39: "create subdirectory $%DS:%DX",
|
||||
0x3A: "remove subdirectory $%DS:%DX",
|
||||
0x3B: "set current directory $%DS:%DX",
|
||||
0x3C: "create or truncate file $%DS:%DX with attributes %CX",
|
||||
0x3D: "open file $%DS:%DX with mode %AL",
|
||||
0x3E: "close file %BX",
|
||||
0x3F: "read %CX bytes from file %BX into buffer %DS:%DX",
|
||||
0x40: "write %CX bytes to file %BX from buffer %DS:%DX",
|
||||
0x41: "delete file $%DS:%DX",
|
||||
0x42: "set position %CX:%DX of file %BX relative to %AL",
|
||||
0x43: "get(0)/set(1) attributes %CX of file $%DS:%DX (%AL)",
|
||||
0x44: "get device information (IOCTL)",
|
||||
0x45: "duplicate file handle %BX",
|
||||
0x46: "force file handle %CX to duplicate file handle %BX",
|
||||
0x47: "get current directory (DS:SI) for drive %DL",
|
||||
0x48: "allocate memory segment with %BX paragraphs",
|
||||
0x49: "free memory segment %ES",
|
||||
0x4A: "resize memory segment %ES to %BX paragraphs",
|
||||
0x4B: "load program $%DS:%DX using parameter block %ES:%BX",
|
||||
0x4C: "terminate with return code %AL",
|
||||
0x4D: "get return code (AL)",
|
||||
0x4E: "find first matching file $%DS:%DX with attributes %CX",
|
||||
0x4F: "find next matching file",
|
||||
0x50: "set current PSP %BX",
|
||||
0x51: "get current PSP (bx)",
|
||||
0x52: "get system variables (ES:BX)",
|
||||
0x53: "translate BPB %DS:%SI to DPB (ES:BP)",
|
||||
0x54: "get verify flag (AL)",
|
||||
0x55: "create child PSP at segment %DX",
|
||||
0x56: "rename file $%DS:%DX to $%ES:%DI",
|
||||
0x57: "get(0)/set(1) file %BX date %DX and time %CX (%AL)",
|
||||
0x58: "get(0)/set(1) memory allocation strategy (%AL)", // DOS 2.11+
|
||||
0x59: "get extended error information", // DOS 3.00+
|
||||
0x5A: "create temporary file $%DS:%DX with attributes %CX", // DOS 3.00+
|
||||
0x5B: "create file $%DS:%DX with attributes %CX", // DOS 3.00+ (doesn't truncate existing files like 0x3C)
|
||||
0x5C: "lock(0)/unlock(1) file %BX region %CX:%DX length %SI:%DI (%AL)", // DOS 3.00+
|
||||
0x5D: "critical error information (%AL)", // DOS 3.00+ (undocumented)
|
||||
0x60: "get fully-qualified filename from $%DS:%SI", // DOS 3.00+ (undocumented)
|
||||
0x63: "get lead byte table (%AL)", // DOS 2.25 and 3.20+
|
||||
0x6C: "extended open file $%DS:%SI" // DOS 4.00+
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* initBus(bus, cpu, dbg)
|
||||
*
|
||||
|
|
@ -2655,7 +2521,7 @@ if (DEBUGGER) {
|
|||
if (fForce) {
|
||||
fMessage = true;
|
||||
} else {
|
||||
fMessage = this.messageEnabled(Messages.CPU) && nInt != Interrupts.DOS_IDLE.VECTOR /* 0x28 */ && nInt != Interrupts.DOS_NETBIOS.VECTOR /* 0x2A */;
|
||||
fMessage = this.messageEnabled(Messages.CPU) && nInt != Interrupts.DOS_IDLE /* 0x28 */ && nInt != Interrupts.DOS_NETBIOS /* 0x2A */;
|
||||
var nCategory = Debugger.INT_MESSAGES[nInt];
|
||||
if (nCategory) {
|
||||
if (this.messageEnabled(nCategory)) {
|
||||
|
|
@ -2666,15 +2532,15 @@ if (DEBUGGER) {
|
|||
}
|
||||
}
|
||||
if (fMessage) {
|
||||
AH = this.cpu.regEAX >> 8;
|
||||
AH = (this.cpu.regEAX >> 8) & 0xff;
|
||||
DL = this.cpu.regEDX & 0xff;
|
||||
if (nInt == Interrupts.DOS.VECTOR /* 0x21 */ && AH == 0x0b ||
|
||||
if (nInt == Interrupts.DOS /* 0x21 */ && AH == 0x0b ||
|
||||
nCategory == Messages.FDC && DL >= 0x80 || nCategory == Messages.HDC && DL < 0x80) {
|
||||
fMessage = false;
|
||||
}
|
||||
}
|
||||
if (fMessage) {
|
||||
var aFuncs = Debugger.INT_FUNCS[nInt];
|
||||
var aFuncs = Interrupts.FUNCS[nInt];
|
||||
var sFunc = (aFuncs && aFuncs[AH]) || "";
|
||||
if (sFunc) sFunc = ' ' + this.replaceRegs(sFunc);
|
||||
/*
|
||||
|
|
@ -5231,7 +5097,7 @@ if (DEBUGGER) {
|
|||
* NOTE: This is different from the "d dos" command, which invokes dumpDos() to dump DOS memory blocks,
|
||||
* and is handled by one of the registered dumper functions below.
|
||||
*/
|
||||
this.messageInt(Interrupts.DOS.VECTOR, this.cpu.regLIP, true);
|
||||
this.messageInt(Interrupts.DOS, this.cpu.regLIP, true);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -363,8 +363,6 @@ X86.fnBTS = function BTS(dst, src)
|
|||
*/
|
||||
X86.fnCALLw = function CALLw(dst, src)
|
||||
{
|
||||
// if (DEBUG) this.printMessage("calling " + str.toHex(dst, this.dataSize << 1), this.bitsMessage, true);
|
||||
|
||||
this.pushWord(this.getIP());
|
||||
this.setIP(dst);
|
||||
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesCallWR : this.cycleCounts.nOpCyclesCallWM);
|
||||
|
|
@ -384,8 +382,6 @@ X86.fnCALLw = function CALLw(dst, src)
|
|||
*/
|
||||
X86.fnCALLF = function CALLF(off, sel)
|
||||
{
|
||||
// if (DEBUG) this.printMessage("calling " + str.toHex(sel, 4) + ':' + str.toHex(off, this.dataSize << 1), this.bitsMessage, true);
|
||||
|
||||
var oldCS = this.getCS();
|
||||
var oldIP = this.getIP();
|
||||
if (this.setCSIP(off, sel, true) != null) {
|
||||
|
|
@ -1327,8 +1323,6 @@ X86.fnIRET = function IRET()
|
|||
}
|
||||
}
|
||||
|
||||
// if (DEBUG) this.printMessage(" returning to " + str.toHex(newCS, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
|
||||
|
||||
if (this.setCSIP(newIP, newCS, false) != null) {
|
||||
this.setPS(newPS, cpl);
|
||||
if (MAXDEBUG && this.cIntReturn) this.checkIntReturn(this.regLIP);
|
||||
|
|
@ -2259,8 +2253,6 @@ X86.fnRETF = function RETF(n)
|
|||
var newIP = this.popWord();
|
||||
var newCS = this.popWord();
|
||||
|
||||
// if (DEBUG) this.printMessage(" returning to " + str.toHex(newCS, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
|
||||
|
||||
if (n) this.setSP(this.getSP() + n); // TODO: optimize
|
||||
|
||||
if (this.setCSIP(newIP, newCS, false)) { // returns true if a stack switch occurred
|
||||
|
|
|
|||
Loading…
Reference in a new issue