Section 1 | Index | Section 3 |
This section describes the Amstrad PC1640 Resident Operating System (ROS) and the Internal Graphics Adapter (IGA) ROM BIOS. It defines the interfaces to all the interrupt service routines provided by the Amstrad PC1640 ROS firmware (ROM) and all RAM locations used by the ROS.
The following copyright message is stored at the beginning of the ROS starting at location 0003 (relative to its origin at FC000):
(C) Copyright 1987 AMSTRAD plc
The ROS physically occupies the highest 16K bytes (in the address range FC000 to FFFFF) in the 1 Mega Byte addressing range of the 8086-2 CPU (See Figure 1.1). The total 64K byte address range from hexadecimal F0000 to FFFFF is reserved for system ROM and this contains the reset and initialization address FFFF0. The PC1640 address decoding for the system ROM area is such that the ROS ROM which actually resides at FC000 is repeated four times in the address space starting at F0000.
Note that all address constants in this document are in hexadecimal form unless otherwise noted.
All calls to the ROS and IGA BIOS firmware should be made through the software interrupts disclosed in this manual. Application programs must not attempt to access the locations within the ROM area directly. Amstrad reserves the right to modify the coding within the Resident Operating System ROM and the IGA BIOS ROM as it sees fit.
The firmware provides a set of resident software routines which perform various services and I/O functions:
To ensure hardware independence of application programs all I/O processes should be done using the ROM firmware software interrupts. This avoids possible problems due to any hardware modifications and/or enhancements.
The Power-Up initialization and Self Test function is entered at location FFFF0, the CPU reset entry point. This is a collection of routines which perform all necessary hardware initialization and self tests, setting up of the BIOS RAM variable area, initialization all the interrupt locations used by the ROS, initialization of expansion slot peripheral ROMs and the running of floppy diskette or hard disk bootstrap.
The ROS does not use the System RAM (User RAM Area) for stack or program variables until it has been successfully tested. If a RAM error is found an error message should be displayed correctly, assuming there is no other fault that may result in incorrect operation of the CPU or Video Circuitry.
The Power-Up initialization and Self Test process proceeds as follows:
After a system reset all the self tests except the RAM tests are rerun. If the three option links in the least significant part of the system printer status register are set to all ones then diagnostic mode is selected and if the diagnostic test ROM pack is found, it is entered, otherwise only the keyboard and disk tests are run before external ROM initialization and system startup is attempted.
Refer to section 2.2 for the individual power-up self test details.
If the checksum of the NVR is incorrect then it is loaded with its default values (See page 169).
Set up counter 0 to interrupt every 54.9337 milliseconds. Set up counter 1 to generate an output signal with a period of 15.13 microseconds. Disable counter 2.
Set up DMA channel 0 for memory refresh. Disable channel 1, 2 and 6.
Disable (mask) all interrupt levels. Note that levels 0, 1 and 3 are enabled (unmasked) later.
Write Status-1 is initialised from a byte in the NVR defining the number of drives fitted and the default Video Mode. The ROS also sets or resets bit 1 in the status register depending on whether or not an 8087 NDP is installed. See section 1.8 for further System Status-1 information.
Write Status-2 is initialised according to the amount of memory installed. The ROS assumes a minimum of 512K bytes and that additional RAM may be added in contiguous 32k byte increments up to the maximum of 640K bytes. The additional memory is sized according to the following procedure. The segment address of each of the four 32K byte RAM blocks is written to the first two bytes of each respective block. The segments are then verified from low to high until a non matching segment address or the last block is encountered. The setting of the Write Status-2 register is according to the RAM0-RAM4 table in section 1.8.3.
The ROS uses variables in the address range of 00300 to 00500. Refer to section 2.4 (RAM Variables) for a complete description of these variables and their respective initialised values.
The first 32 interrupt vectors are set up to reference the ROS routines as listed below. Software interrupt routines which do not perform any function reference a dummy routine that simply does a return from interrupt (IRET) instruction. Hardware service interrupts which do not perform any function reference a dummy (HWIRET) routine which issues a nonspecific end-of-interrupt to the 8259 interrupt controller and then executes an IRET instruction.
Interrupt | Purpose | Type |
---|---|---|
0 | Divide by Zero | Hardware (HWIRET) |
1 | Single Step | Hardware (HWIRET) |
2 | Parity error routine (NMI) | Hardware |
3 | Break | Hardware (HWIRET) |
4 | Overflow | Hardware (HWIRET) |
5 | Print Screen | Software |
6 | Reserved | Software |
7 | Reserved | Software |
8 | System Clock interrupt | Hardware |
9 | Keyboard interrupt | Hardware |
10 | RTC interrupt | Hardware (HWIRET) |
11 | COMMS | Hardware (HWIRET) |
12 | COMMS | Hardware (HWIRET) |
13 | Hard Disk | Hardware (HWIRET) |
14 | Floppy Disk interrupt routine | Hardware |
15 | Printer interrupt | Hardware (HWIRET) |
16 | Video I/O | Software |
17 | System Configuration | Software |
18 | Memory Size | Software |
19 | Disk I/O | Software |
20 | Serial I/O | Software |
21 | Enhanced function(s) | Software |
22 | Keyboard I/O | Software |
23 | Printer I/O | Software |
24 | System Restart | Software |
25 | Disk Bootstrap | Software |
26 | System Clock and RTC I/O | Software |
27 | Keyboard Break | Software (IRET) |
28 | External Ticker interrupt | Software (IRET) |
29 | Video parameter table | Software Vector |
30 | Disk Parameter table | Software Vector |
31 | External 8x8 Char Matrix table | Software Vector |
The interfaces to the above routines are detailed in section 2.3.
The 8259 PIC is programmed such that its IRQ0 - IRQ7 interrupt levels use CPU interrupt vectors 8 - 15 as indicated in the above table.
The initialise function of interrupt 19 in invoked followed by the disk test (see 2.2.12).
The Keyboard microcontroller returns 0AAh upon successful completion of its power-up self test (See 2.2.15).
The initial video testing is done by IGA BIOS ROM if it is enabled else the ROS performs testing as described in section 1.8.2
Enable 8259 interrupt controller on levels 0 (8253 counter 0), 1 (keyboard scan code receiver) and 6 (765 floppy disk controller). All other 8259 interrupt levels are masked.
During power-up the ROS checksums the NVR. After the sign-on message has been displayed, the ROS outputs a warning message if the NVR sum was incorrect. In the case that the NVR is OK (and last startup data are valid) the time and date of last switch-on are displayed.
If a NMI occurs the default ROS interrupt handler displays a RAM parity error message and hangs the system. This condition can only be rectified by switching the machine off.
The ROS checks for external ROMs between addresses C0000 and F4000 in 800h (2k) byte increments. An external ROM which conforms to the following specification will be initialised by the ROS:
When a ROM conforming to this specification is located then the initialization entry is called.
If the checksum test fails then an error message is displayed and initialization is not called.
The IGA BIOS ROM conforms to above standard and if it is enabled, it is entered (at C0000) and its Power-On Self Test (POST) initialisation will perform testing and initialise:
The ROS attempts to load the bootstrap sector (from drive A, side 0, track 0, sector 1) into memory at 07C00h. If the bootstrap sector loads successfully it is given control (far jump to segment 0000 offset 7C00). If after 10 retrys the bootstrap sector cannot be loaded then the ROS displays a message prompting the user to insert a system disk into drive A and press a key. The ROS then waits for the key press and repeats the bootstrap procedure.
On Power-Up or following a system reset, the ROS performs a series of self tests on the hardware to verify proper operation. When a test failure occurs, the ROS displays an error message on the primary display device and the system is locked up. The keyboard interface is treated differently in that the ROS repeats keyboard self test until it is successful.
The ROS executes all self tests except when the option links (LK1 - LK3) are all set (See section 1.10.3), the ROS will only run the keyboard interface test and the disk test. If either of these two tests fail an error message is displayed but the error is ignored. This allows the system to be brought up for diagnostic testing.
When a soft reset (Control, Alt and Del) is issued the ROS performs all the self tests except the system RAM (User Area RAM) test and the video RAM test. The program calling the ROS initialization after a soft reset must store the value 1234h in system location 0:478h and this value notifies the ROS firmware that a soft reset was requested. When the 1234h value is recognized a full hardware reset is performed and this will reset all external peripheral cards in the expansion bus. A special entry flag value, 1235h performs the ROS Power-Up testing as described above but inhibits the full hardware reset from occurring. The ROS sets the contents of the word location at 0:488 to 1234h when it completes its testing.
Upon entry the ROS performs the necessary functions to start video output from the IGA or any other primary display adapter, and then stores the message ("Please wait") on the first line of the screen to indicate that self testing is in progress and as each successive self test is started a dot is displayed on the screen.
The tests are run in the following order:
The ROS uses the stack during the Disk test, the Keyboard interface test and the Programmable Interrupt Controller test. All other self tests are executed without using either the stack or any RAM variables.
Most of the device diagnostic tests consist of a Data Path test and a Waveform test as described below:
The data path test checks the read/write path between the CPU and a particular device. A pattern is written to a device and then read back to verify the integrity of the data path. The patterns are as follows:
All zeros.
All ones.
Sliding single bit and complement across 8 bits.
The waveform test detects address decoding errors in a hardware device. The waveform test consists of selecting a specific address in a device, writing a test pattern (usually 0FFFFh) and verifying that the same pattern can be read back. The waveform test is done in both ascending sequential order (upwards) and descending sequential order (downwards) in order to check that the address decoding logic works correctly.
All bytes in the Resident Operating System ROM are summed and then checked that the least significant byte of the sum is zero. If the check fails then an error message indicating faulty ROM checksum is displayed.
The upwards/downwards waveform test is used to confirm that the registers in the DMA controller chip can be addressed. Any failure will cause the faulty DMA error message to be displayed.
The fiest 8253 test is a read/write data path test to counter 2 followed by a check that counter 1 counts at the correct rate. If either test fails an interval timer error message is displayed.
The 8255 PPI tests consists of a data path test on each of the two system status channels (Status-1 and Status-2). The 8253 PIT OUT2 (Status-2) bit is also checked for proper operation. If either test fails the faulty real time clock error message is displayed.
The RTC seconds counter is tested to be counting at the correct rate. Next a data path test on the checksum byte of the NVR is run (and the checksum byte is restored). If either test fails the faulty real time clock error message is displayed.
This test confirms that the transmitter and receiver of the 8250 (i. e. the system serial port) are functioning correctly (at least in diagnostic mode).
The 8250 is configured in loop mode, 9600 baud, 8 data bits, 1 stop bit and no parity. Two test patterns are transmitted and the received patterns are checked. The status register is monitored for no parity, framing or overrun errors. If either received pattern does not equal the sent pattern or an error is set in the status register the faulty system serial port error message is displayed.
A data path test is performed on the printer data latch. If any incorrect test pattern is returned, the faulty printer port error message is displayed.
The X and Y registers are cleared and then read to verify that they both contain zero. If the test fails the faulty mouse coordinate register error message is displayed.
The amount of System (User Area) RAM is determined using the procedure described in section 2.1 (This should always produce 640K as the answer). The data path test is run on all available RAM followed by an upwards/downwards waveform test. If either test fails the faulty RAM error message is displayed.
The 8259 tests consist of a data path test on the interrupt mask register and an interrupt acknowledge test to confirm that interrupts can occur and be serviced. If the test fails the faulty interrupt controller message is displayed.
The disk test attempts to establish whether the drives fitted to the system seek correctly. The test moves the read/write heads to track 10 on each drive. The ROS does not verify that the correct track was attained. If any errors are reported then a floppy disk controller error message is displayed.
Upon power-up or reset, the keyboard self test is performed by the keyboard controller firmware. The keyboard returns keycode 0AAh to signify the successful completion of its testing. If any key code other than 0AAh is returned the keyboard error message is displayed amd keyboard reset is issued (which reruns the keyboard self test). The Keyboard test is repeated until the keyboard test passes. When test pass is received, the error message is removed from the screen and the test is exited as normal. During the keyboard test a short beep is sounded every five seconds to indicate that the test is in progress.
The first 32 interrupt vectors are initialised by Power-Up initialization. The software IRET and hardware HWIRET entries are dummy routines which require no entry or exit conditions and are not detailed here.
Any application program which replaces a default interrupt vector with its own entry point must not invoke any ROS interrupts from within its own interrupt service routine.
The Interrupt 2 routine deals with system RAM parity error. The screen is switched to the default display mode, cleared and a RAM parity error message is displayed. The machine cannot be used until the power switch is cycled off and on again.
This routine does not use RAM for stack or program variables.
An application program which makes use of the 8087 NDP must supply an interrupt 2 service routine for the 8087 NDP.
CPU registers are used as follows:
The Interrupt 5 routine dumps the screen in character mode to the primary printer port. Since the screen dump is character based, attempting to dump graphic pictures to the printer may produce incorrect results. Characters that cannot be read back from the screen in graphics mode (using the video interrupt 16 read character function) are printed as spaces.
If a screen print is already in progress the interrupt takes no action.
The Print Screen Status variable (at address 00500) is set to 1 while the screen dump is in progress. When complete the variable is set to zero. If the screen dump is abandoned due to printer port timeout, the variable is set to 255.
CPU registers are used as follows:
The ROS interrupt 6 routine provides default mouse button services. The keyboard firmware generates a set of make/break keycodes when either of the two mouse buttons is pressed and released. When the keyboard interrupt routine recognizes a mosue button keycode it invokes interrupt 6. The default ROS routine will either obtain the appropriate keycode from the NVR and return with the carry flag set in the case of a make code or return with the carry flag clear in response to a mouse button break code.
CPU registers are used as follows:
Note: A key token value of FFFFh is ignored and is not put in the keyboard buffer.
The interrupt 8 routine is invoked by the system clock (counter 0 of the 8253). The default ROS routine does the following:
CPU registers are used as follows:
The ROS Keyboard hardware interrupt reads a key code from the keyboard interface, translates the key code into a 16-bit key token using an internal translation table and the key token is put into the key token buffer. If the buffer is full the key token is discarded and a bleep is output on the speaker. The key tokenization for the most part consists of the high byte being the key number and the lower byte being the ASCII for the keycap. Those keys for which there is no ASCII equivalent the token consists of a unique high byte value with the low byte cleared.
The ROS Keycode translation table is as follows (all values are hexadecimal) and the key names are the USA versions:
Key Code | Key Cap (US) | Normal | Num Lock | ALT | CTRL | SHIFT |
---|---|---|---|---|---|---|
01 | ESC | 011B | 01F0 | 011B | 011B | N/A |
02 | 1 and ! | 0231 | 7800 | Ignored | 0221 | N/A |
03 | 2 and @ | 0332 | 7900 | 0300 | 0340 | N/A |
04 | 3 and # | 0433 | 7A00 | Ignored | 0423 | N/A |
05 | 4 and $ | 0534 | 7B00 | Ignored | 0524 | N/A |
06 | 5 and % | 0635 | 7C00 | Ignored | 0625 | N/A |
07 | 6 and ^ | 0736 | 7D00 | 071E | 075E | N/A |
08 | 7 and & | 0837 | 7E00 | Ignored | 0826 | N/A |
09 | 8 and * | 0938 | 7F00 | Ignored | 092A | N/A |
OA | 9 and ( | 0A39 | 8000 | Ignored | 0A28 | N/A |
0B | 0 and ) | 0B30 | 8100 | Ignored | 0B29 | N/A |
0C | - and _ | 0C2D | 8200 | 0C1F | 0C5F | N/A |
0D | = and + | 0D3D | 8300 | Ignored | 0D2B | N/A |
0E | <-Del | 0E08 | 0EF0 | 0E7F | 0E08 | N/A |
0F | Tab | 0F09 | A500 | 9400 | 0F00 | N/A |
10 | Q | 1071 | 1000 | 1011 | 1051 | N/A |
11 | W | 1177 | 1100 | 1117 | 1157 | N/A |
12 | E | 1265 | 1200 | 1205 | 1245 | N/A |
13 | R | 1372 | 1300 | 1312 | 1352 | N/A |
14 | T | 1474 | 1400 | 1414 | 1454 | N/A |
15 | Y | 1579 | 1500 | 1519 | 1559 | N/A |
16 | U | 1675 | 1600 | 1615 | 1655 | N/A |
17 | I | 1769 | 17000 | 1709 | 1749 | N/A |
18 | O | 186F | 1800 | 180F | 184F | N/A |
19 | P | 1970 | 1900 | 1910 | 1950 | N/A |
1A | [ and { | 1A5B | 1AF0 | 1A1B | 1A7B | N/A |
1B | ] and } | 1B5D | 1BF0 | 1B1D | 1B7D | N/A |
1C | Return Key | 1C0D | 1CF0 | 1C0A | 1C0D | N/A |
1D | Ctrl | Ignored | Ignored | ---- | Ignored | N/A |
1E | A | 1E61 | 1E00 | 1E01 | 1E41 | N/A |
1F | S | 1F73 | 1F00 | 1F13 | 1F53 | N/A |
20 | D | 2064 | 2000 | 2004 | 2044 | N/A |
21 | F | 2166 | 2100 | 2106 | 2146 | N/A |
22 | G | 2267 | 2200 | 2207 | 2247 | N/A |
23 | H | 2368 | 2300 | 2308 | 2348 | N/A |
24 | J | 246A | 2400 | 240A | 244A | N/A |
25 | K | 256B | 2500 | 250B | 254B | N/A |
26 | L | 266C | 2600 | 260C | 264C | N/A |
27 | ; and : | 273B | 27F0 | Ignored | 273A | N/A |
28 | ' and " | 2827 | 28F0 | Ignored | 2822 | N/A |
29 | # and ~ | 2960 | 29F0 | Ignored | 297E | N/A |
2A | Left Shift | Ignored | Ignored | Ignored | Ignored | N/A |
2B | \ and | | 2B5C | 2BF0 | 2B1C | 2B7C | N/A |
2C | Z | 2C7A | 2C00 | 2C1A | 2C5A | N/A |
2D | X | 2D78 | 2D00 | 2D18 | 2D58 | N/A |
2E | C | 2E63 | 2E00 | 2E03 | 2E43 | N/A |
2F | V | 2F76 | 2F00 | 2F16 | 2F56 | N/A |
30 | B | 3062 | 3000 | 3002 | 3042 | N/A |
31 | N | 316E | 3100 | 310E | 314E | N/A |
32 | M | 326D | 3200 | 320D | 324D | N/A |
33 | , and < | 332C | 33F0 | Ignored | 333C | N/A |
34 | . and > | 342E | 34F0 | Ignored | 343E | N/A |
35 | / and ? | 352F | 35F0 | Ignored | 353F | N/A |
36 | Right Shift | Ignored | Ignored | Ignored | ---- | N/A |
* 37 | * | 372A | 37F0 | 9600 | 372A | N/A |
38 | Alt | Ignored | ---- | Ignored | Ignored | N/A |
39 | Space Bar | 3920 | 3920 | 3920 | 3920 | N/A |
* 3A | Caps Lock | Ignored | Ignored | Ignored | Ignored | N/A |
3B | F1 | 3B00 | 6800 | 5E00 | 5400 | N/A |
3C | F2 | 3C00 | 6900 | 5F00 | 5500 | N/A |
3D | F3 | 3D00 | 6A00 | 6000 | 5600 | N/A |
3E | F4 | 3E00 | 6B00 | 6100 | 5700 | N/A |
3F | F5 | 3F00 | 6C00 | 6200 | 5800 | N/A |
40 | F6 | 4000 | 6D00 | 6300 | 5900 | N/A |
41 | F7 | 4100 | 6E00 | 6400 | 5A00 | N/A |
42 | F8 | 4200 | 6F00 | 6500 | 5B00 | N/A |
43 | F9 | 4300 | 7000 | 6600 | 5C00 | N/A |
44 | F10 | 4400 | 7100 | 6700 | 5D00 | N/A |
* 45 | Num Lock | Ignored | Ignored | PAUSE | Ignored | N/A |
* 46 | Scroll Lock | Ignored | Ignored | Ignored | Ignored | N/A |
47 | Key Pad 7 | 4700 | Ignored | 7700 | N/A | 4737 |
48 | Key Pad 8 | 4800 | Ignored | Ignored | N/A | 4838 |
49 | Key Pad 9 | 4900 | Ignored | 8400 | N/A | 4939 |
4A | Key Pad - | 4A2D | Ignored | Ignored | N/A | 4A2D |
4B | Key Pad 4 | 4B00 | Ignored | 7300 | N/A | 4B34 |
4C | Key Pad 5 | Ignored | Ignored | Ignored | N/A | 4C35 |
4D | Key Pad 6 | 4D00 | Ignored | 7400 | N/A | 4D36 |
4E | Key Pad + | 4E2B | Ignored | Ignored | N/A | 4E2B |
4F | Key Pad 1 | 4F00 | Ignored | 7500 | N/A | 4F31 |
50 | Key Pad 2 | 5000 | Ignored | Ignored | N/A | 5032 |
51 | Key Pad 3 | 5100 | Ignored | 7600 | N/A | 5133 |
* 52 | Key Pad 0 | 5200 | Ignored | Ignored | N/A | 5230 |
53 | Key Pad . | 5300 | Ignored | Ignored | N/A | 532E |
54 - 6F | Undefined | Ignored | Ignored | Ignored | Ignored | Ignored |
* 70 | Del -> | N/A | N/A | N/A | N/A | N/A |
71 - 73 | Undefined | Ignored | Ignored | Ignored | Ignored | Ignored |
* 74 | Enter | N/A | N/A | N/A | N/A | N/A |
75 - 76 | Undefined | Ignored | Ignored | Ignored | Ignored | Ignored |
* 77 | Joy Fire2 | N/A | N/A | N/A | N/A | N/A |
* 78 | Joy Fire1 | N/A | N/A | N/A | N/A | N/A |
* 79 | Joy Right | 4D00 | 4D00 | 4D00 | 4D00 | 4D00 |
* 7A | Joy Left | 4B00 | 4B00 | 4B00 | 4B00 | 4B00 |
* 7B | Joy Down | 5000 | 5000 | 5000 | 5000 | 5000 |
* 7C | Joy Up | 4800 | 4800 | 4800 | 4800 | 4800 |
* 7D | Mouse M2 | N/A | N/A | N/A | N/A | N/A |
* 7E | Mouse M1 | N/A | N/A | N/A | N/A | N/A |
7F | Undefined | Ignored | Ignored | Ignored | Ignored | Ignored |
Joystick keys produce their respective cursor keys.
Key codes marked with '*' cause special actions as explained below.
The table positions marked 'Ignored' are physically marked in the table by a value with the MS bit set and this causes the keyboard processor to ignore these keystroke combinations.
Some keys or set of keys invoke a special action as detailed below. Unless otherwise stated they do not result in any key tokens being inserted into the buffer.
The translation of various key codes into their respective tokens is affected by the current states of these keys (which is stored in location 00417). The Shift key, while pressed, reverses the current state of the CAPS LOCK and Num Lock. If more than one of Alt, Ctrl, Shift, Num Lock or CAPS LOCK is active at one time then the order of precedence for key code translation is Alt, then Ctrl, then Shift, then Caps Lock or Num Lock.
Caps Lock, when active, converts the key tokens for the lower case alphabetic keys (a - z) to their upper case counterparts.
Note that some operating systems (such as DOS Plus) install their own entry points into the interrupt vectors and these interrupt routines may exhibit different characteristics than those of the ROS routines described here.
The ROS service routine for interrupt 14 sets bit 7 of the RAM DRIVE RESTORE FLAG, to indicate that the Floppy Disk Controller interrupt has occurred.
CPU registers are used as follows:
The ROS interrupt 16 service routine provides a set of routines for reading and writing characters in alpha and graphics mode. In graphics mode the characters are constructed using a character matrix table (see section 2.3.21). It also provides facilities for scrolling the screen up or down, reading and writing pixels (CGA graphics only) and reading the light pen.
It is important to note that this interrupt entry point is only active in '6845 Compatible' modes or when an external CGA or MDA or Hercules display adapter is active and the IGA ROM BIOS is not involved. The EGA emulation mode compatible calls are covered in section 2.3.8. It should be noted that the Int 16 call registers are much the same for the video mode calls and video character and string display. This is because the EGA compatible mode which was implemented later is designed to be software compatible with the earlier (this entry point's) call register setups. When the '6845 compatible' display modes are entered either as a result of the sw5 setting (ON) or by the DISPLAY utility program, the video int 16 vector (at 0:40h) is set to point to the ROS's video interrupt's fixed entry point (at F000:F065) and this set of service routines becomes active. Additional hardware setups must also be performed within the IGA to support the 6845 compatibility.
CPU registers for '6845 Compatible' Video Int 16 are used as follows:
All other registers as required by the function.
If selector is greater than 15 then carry is set, else carry is clear.
All other flags and registers as specified by the function.
Alpha modes 0 and 1 require 2000 bytes of video RAM while alpha modes 2 and 3 require 4000 bytes of the video RAM. The ROS takes advantage of all the video RAM available in alpha modes by supporting multiple display pages. This means that application programs can set up a number of display pages and switch them as required.
In general parameters passed to ROS routines are not checked and care should be taken when choosing unusual parameters as unexpected results may occur. In particular be careful of boundary conditions such as setting the top of the display window equal to the bottom of the display window (for functions 6 and 7) effectively creating a one line display. In this instance the screen scrolling may not perform as expected.
CPU registers are used as follows:
In mode 4 palette 0 may be selected by writing the color select register using Video Int 16 Function 11. The definition of the palettes is contained in Section 1.11.2.2, Low Resolution (320x200) Graphics.
When mode 5 is selected it must be followed by a selection of palette zero (Color select register - See 1.11.5.2) in order to enable palette 2.
If the default display mode indicates an external monochrome adapter, then mode 7 is selected regardless of the mode in AL.
To select the Video mode the ROS does the following:
If color display then set up the Color Select register (3D9h):
Set the border color to the default background color.
In graphics modes set intensified foreground colors.
In mode 6 (Graphics 640 Mode) set white foreground color.
This function is only relevant in alpha modes as the cursor is not supported in graphics modes. It sets the start and end scan numbers of the cursor.
CPU registers are used as follows:
The ROS interprets a start value of 31 with the special meaning "turn the cursor off". In addition the 6845 hardware cursor disable function is enabled when cursor start bit register 5 is set.
This function sets the current row and column addresses of the cursor in the specified page.
CPU registers are used as follows:
Refer to table 1.11.2.5 for valid page numbers and page starting address details.
This function returns the current row and column address of the cursor in the specified page.
CPU registers are used as follows:
Refer to table 1.11.2.5 for valid page numbers and page starting address details.
This function returns the address of the light pen.
CPU registers are used as follows:
This function sets the active display page.
CPU registers are used as follows:
Refer to table 1.11.2.5 for valid page numbers and page starting address details.
This function scrolls the active display page, or part of the active display page up a specified number of lines.
CPU registers are used as follows:
Scrolling always takes effect on the current active display page.
Hardware scrolling is not supported. Scrolling is achieved by copying areas of Video Display RAM.
In graphics modes blank lines are filled with zeros to display the current background color.
Note this function will fail to operate properly if on entry CH equals DH and AL is not zero. This is also true for all other compatible ROM environments.
This function scrolls the active display page, or part of the active display page down a specified number of lines.
CPU registers are used as follows:
Scrolling always takes effect on the current active display page.
Hardware scrolling is not supported. Scrolling is achieved by copying areas of Video Display RAM.
Note this function will fail to operate properly if on entry CH equals DH and AL is not zero.
This function reads the character and its associated attribute byte at the current cursor address in a specified display page.
In graphics modes, the character pixel data is generated either from an internal character matrix table for characters 0 to 127 or from an external character matrix table for characters 128 to 255, the address of which is held in interrupt vector 31. See 2.3.23 for additional details.
CPU registers are used as follows:
Refer to 1.11.1 and 1.11.2 for the definition of the character attributes bytes.
This function writes a character (or a block of the same character) and its associated attribute byte to the current cursor position in a specified display page.
In graphics modes, the character pixel data is generated either from an internal character matrix table for characters 0 to 127 or from an external character matrix table for characters 128 to 255, the address of which is held in interrupt vector 31. See 2.3.23 for additional details.
CPU registers are used as follows:
The repeat count specifies the number of consecutive locations to which the character and attributes are written. In graphics modes all characters must fit on the current line.
In graphics mode if bit 7 of BL is set then the data for the specified character is exclusive ORed with the data already in the display RAM at the cursor address.
This function writes a character (or a block of the same character) to the current cursor position in a specified display page. In alpha modes the attribute bytes for all characters written remains unchanged.
In graphics modes, the character pixel data is generated either from an internal character matrix table for characters 0 to 127 or from an external character matrix table for characters 128 to 255, the address of which is held in interrupt vector 31. See 2.3.23 for additional details.
CPU registers are used as follows:
The repeat count specifies the number of consecutive locations to which the character is written.
In graphics mode if bit 7 of BL is set then the data for the specified character is exclusive ORed with the data already in the display RAM at the cursor address.
This function writes the CGA compatible Color Select Register IRGB bits or the Palette select bits.
CPU registers are used as follows:
Changing the palette number (BH non-zero) only has effect in modes 4 and 5 (320 pixel graphics mode). Refer to section 1.11.3 for further details.
This function writes an individual pixel (only valid in graphics modes).
CPU registers are used as follows:
The pixel color specified in AL should be in the range 0 to 3 in modes 4 and 5 (graphics 320 pixel mode) and in the range 0 to 1 for mode 6 (graphics 640 pixel mode).
This function is used for reading an individual pixel (only in graphics modes).
CPU registers are used as follows:
This function writes the specified character in Teletype emulation mode at the current cursor address in the active display page.
CPU registers are used as follows:
Upon completion of the write the cursor column is incremented by one. If the column address is greater than the line length then the column address is set to zero and the cursor row address is incremented by one.
If the incremented row address is greater than the last visible line then it is decremented to its original value and the entire page is scrolled up one line. In alpha modes the line added to the bottom of the page is cleared to spaces with the attributes the same as the first character in previous line. In graphic modes the bottom line is cleared to zeroes.
The following display characters are executed rather than displayed symbolically:
All other control characters are displayed.
This function returns the current Video Mode, the current display page and number of visible columns.
CPU registers are used as follows:
The IGA BIOS interrupt 16 service routine provides an extended set of service routines similar in many respects to those in the ROS ROM but with extra function selections to support the enhancements in the graphics hardware environment.
It is important to note that this interrupt entry point is active for 'EGA Compatible' display modes and that there are some differences in the standard call parameters. It is therefore important to use the correct section when reference is made to video interrupt 16. The CGA and MDA or Hercules Monochrome emulation mode compatible calls are covered in section 2.3.7. It should be noted that the Int 16 call registers are much the same for the video mode calls and video character display. When the 'EGA compatible' display modes are entered either as a result of the sw5 setting (OFF) or by the DISPLAY utility program, the video int 16 vector (at 0:40h) is set to point to the IGA BIOS's video interrupt's entry point and this set of service routines becomes active. Additional hardware setups must also be performed in the IGA to support the EGA compatibility.
CPU registers for 'EGA Compatible' Video Int 16 are used as follows:
All other registers as required by the function.
If selector is greater than 19 then the call is rejected and has no effect.
All flags preserved and registers as specified by the selected function.
In general parameters passed to these routines are not checked and care should be taken when choosing unusual parameters as unexpected results may occur.
CPU registers are used as follows:
The major difference between the 'B W' and 'Color' designations in the mode 0 - 3 selections is not the displayable colors but that there is a 'flicker wait' incorporated into the color modes to eliminate a 'snowing' effect in certain devices. In actual fact the IGA BIOS Int 16 can drive a CGA card device when it is the secondary display (refer to 1.22 - Switch Settings).
If the default display mode indicates monochrome a display , then mode 7 is selected regardless of the mode in AL unless AL = 15d in which case monochrome 640x350 graphics is selected.
Modes 0 - 7 are the 'Compatible' modes and modes 13 - 16 are for extended mode support. The gap between 8 and 12 are not user selectable display modes some of which are internal modes used for RAM font loading.
This function is only relevant in alpha modes as the cursor is not supported in graphics modes. It sets the CRTC cursor start and cursor end values.
CPU registers are used as follows:
Values greater between 32 and 64 turn the cursor off. Setting cursor start greater than cursor end usually turns the cursor off and other combinations give strange cursors.
This function sets the current row and column addresses of the cursor in the specified page.
CPU registers are used as follows:
Refer to table 1.11.2.5 for valid page numbers and page starting address details.
This function returns the current row and column address of the cursor in the specified page.
CPU registers are used as follows:
Refer to table 1.11.2.5 for valid page numbers and page starting address details.
This function returns the address of the light pen.
CPU registers are used as follows:
This function sets the active display page.
CPU registers are used as follows:
Pages are numbered from 0 to n-1, where 'n' is the number of pages available. Refer to table 1.11.2.5 for valid page numbers and page addressing details.
This function scrolls the active display page, or part of the active display page up a specified number of lines.
CPU registers are used as follows:
Scrolling always takes effect on the current active display page.
Hardware scrolling is not supported. Scrolling is achieved by copying areas of Video RAM.
In graphics modes blank lines are filled with zeros to display the current background colour.
This function scrolls the active display page, or part of the active display page down a specified number of lines.
CPU registers are used as follows:
Scrolling always takes effect on the current active display page.
Hardware scrolling is not supported. Scrolling is achieved by copying areas of Video Display RAM.
This function reads the character and its associated attribute byte at the current cursor address in a specified display page.
In graphics modes, the character pixel data is generated either from an internal character matrix table for characters 0 to 127 or from an external character matrix table for characters 128 to 255, the address of which is held in interrupt vector 31. See 2.3.23 for additional details.
CPU registers are used as follows:
Refer to 1.11.1 and 1.11.2 for the definition of the character attributes bytes.
Refer to table 1.11.2.5 for valid page numbers and page starting address details.
This function writes a character (or a block of the same character) and its associated attribute byte to the current cursor position in a specified display page.
In 'CGA compatible' graphics modes (3 - 5), the character pixel data is generated either from an internal character matrix table for characters 0 to 127 or from an external character matrix table for characters 128 to 255, the address of which is held in interrupt vector 31. See 2.3.23 for additional details.
For the extended 'EGA compatible' modes (13 - 16) the full 256 character matrix is pointed to by interrupt vector 67 (at address 10Ch). This vector is initialised by the IGA ROM BIOS during Power-On Self Testing and points to a set of ROM character sets in the C2000-C7FFF address range.
CPU registers are used as follows:
The repeat count specifies the number of consecutive locations to which the character and attributes are written. In graphics modes all characters must fit on the current line.
In graphics mode if bit 7 of BL is set then the data for the specified character is exclusive ORed with the data already in the display RAM at the cursor address.
The character color specified in BL should be in the range 0 to 3 in 320 x 200 graphics modes, in the range 0 to 1 for mode 640 wide B/W graphics modes, and in the range 0 to 15 for 640 wide 16 color graphics modes.
This function writes a character (or a block of the same character) to the current cursor position in a specified display page. In alpha modes the attribute bytes for all characters written remains unchanged.
See graphics character vector details in function 9 (Write Char/Attribute) above.
CPU registers are used as follows:
The repeat count specifies the number of consecutive locations to which the character is written.
In graphics mode if bit 7 of BL is set then the data for the specified character is exclusive ORed with the data already in the display RAM at the cursor address.
The character color specified in BL should be in the range 0 to 3 in 320 x 200 graphics modes, in the range 0 to 1 for mode 640 wide B/W graphics modes, and in the range 0 to 15 for 640 wide 16 color graphics modes.
This function writes the CGA compatible Color Palette.
CPU registers are used as follows:
The palette number setting (BH non-zero) only applies to 320 x 200 graphics mode. Refer to section 1.11.2 for hardware details.
This function writes an individual pixel (only valid in graphics modes).
CPU registers are used as follows:
The pixel data specified in AL should be in the range 0 to 3 in 320 x 200 graphics modes, in the range 0 to 1 for mode 640 wide B/W graphics modes, and in the range 0 to 15 for 640 wide 16 color graphics modes.
This function is used for reading an individual pixel (only in graphics modes).
CPU registers are used as follows:
The specified pixel's color will be the same as the pixel data written by function 12 above.
This function writes the specified character in Teletype emulation mode at the current cursor address in the active display page.
CPU registers are used as follows:
The character color bits are the same as for the write character (function 10) above.
Upon completion of the write the cursor column is incremented by one. If the column address is greater than the line length then the column address is set to zero and the cursor row address is incremented by one.
If the incremented row address is greater than the last visible line then it is decremented to its original value and the entire page is scrolled up one line. In alpha modes the line added to the bottom of the page is cleared to spaces with the attributes the same as the first character in previous line. In graphic modes the bottom line is cleared to zeroes.
The following display characters are executed rather than displayed symbolically:
All other control characters are displayed.
This function returns the current Video Mode, the current display page and number of visible columns.
CPU registers are used as follows:
This function enables setting individual Palette registers, the Hi-Res Border (overscan) register, all Palette registers at once or setting the Intensity/Blink mode bit.
CPU registers are used as follows:
This function enables setting of extended character sets.
CPU registers are used as follows:
Sub functions 0 to 2 perfomr the same function as sub-functions 16 to 18 except that 0 to 2 initiate a full mode change setup (without clearing the video RAM) and 16 - 18 reprogram the CRTC cursor parameters based on character (points) size. These selections load a selected font table into the font areas on planes 2 & 3. Refer to Character Set Select Register description in section 1 for the alternate character block layouts and how they are selected using attribute bit 3.
Refer to the Character Set Select Register description in section 1 for the details concerning character selects A & B.
Refer to function 0 for register requirements for the user font table. As stated earlier, this sub-function differs from its counterpart only in that the current mode setup is maintained with exception that the CRTC cursor is set up based on the current character height (points) selection. This sub-function and the following two sub-functions should be executed immediately following a mode change and the resultant CRTC reprogramming should be fairly close to the original settings else unexpected results may occur.
Refer to section 1.11.3 for the Character Set Select Register layout.
This font table is used to form the characters written to the screen if the current Video Mode is one of the Extended Hi-Res graphics Modes.
The current value of Rows (-1) is stored in system storage location 0:484 and the bytes per character value (Points) is system storage location 0:485. The int 67 vector pointer is system vector location 0:10C.
The 9x14 table is in the form of a 'fixup' table whereby the first byte is the character number requiring the 9x14 fixup followed by 14 bytes of character redefinition. The table is zero terminated.
This function either returns the current EGC status or selects the IGA BIOS's alternate print screen routine address to be stored in the PrtSc vector (5) location.
CPU registers are used as follows:
This function writes a string to video RAM at a specified cursor position in a specified display page. The supplied string can either consist of characters by themselves (in which case the attribute byte is supplied in BL) or character and attribute byte pairs. Control characters are executed as described in IGA Video Int 16 Function 14 and where they occur they are not associated with an attribute byte within the supplied string. Line wraps occur at the display width specified in the system variable ROWS (at 0:488).
CPU registers are used as follows:
This software interrupt returns the current system configuration status as defined in RAM locations 00410 and 00411 hex (see section 2.4).
CPU registers are used as follows:
Bit(s) | Function |
---|---|
14 & 15 | Number of printers (1-3). |
13 | Not used. |
12 | Set if an optional games adapter is fitted. |
11 | Always zero. |
9 & 10 | Number of serial interfaces (1 or 2). |
8 | Not used. |
7 | Always zero. |
6 | Set if second floppy disk drive is fitted. |
4 & 5 | Default display mode (DDM). |
2 & 3 | Always set. |
1 | Set if 8087 NDP is installed. |
0 | Always set. |
All flags and other registers preserved.
Section 1.8.2 (Port A - Status-1 Input) contains the default mode states as defined in the DDM1 and DDM0 bits.
This software interrupt returns the system RAM size as held in system locations 00413 and 00414 hex.
CPU registers are used as follows:
This software interrupt provides disk read, write, verify, and format functions for the drives fitted to the standard floppy disk controller.
In actual practice by the time the MS-DOS operating system has been loaded and an applications program is activated, the DOS startup process will have saved the ROS's interrupt vector (from location 0:4Ch) and installed its own entry vector. DOS does this so that it can correct for such conditions as DMA over a 64K segment boundary and it will break this sort of I/O requrest into a number of smaller I/O requests. In addition any installed hard disk will have 'chained' itself into the interrupt 19 vector so that requests with the MSB of the drive number set can be serviced by its ROM based hard disk I/O routines (usually in the C8000h address range). In general the call parameters for the hard disks are the same as those described here for read and write, however there are a number of additional services provided by the hard disk BIOS ROM's. The hard disk error return codes are also somewhat extended to the floppy disk group documented here. The typical 'compatible' hard disk function selector list and errors are documentedd following the ROS's functions.
CPU registers are used as follows:
All other registers as specified by the selected function.
For all disk functions the Carry Flag (CY) will be clear if no error else it is set if an error (and AH = error number). All other flags are corrupt.
This function performs a total initialisation of the disk interface as follows:
CPU registers are used as follows:
When an error is returned by any other Diskette I/O function, the Initialise Disk function should be called prior to the next disk I/O operation.
This function returns the status byte and Carry Bit of the last disk I/O operation.
CPU registers are used as follows:
This function reads a number of consecutive sectors. All sectors to be read must be on the same track.
CPU registers are used as follows:
This function writes a number of consecutive sectors. All sectors to be written must be on the same track.
CPU registers are used as follows:
This function verifies a number of consecutive sectors. All sectors to be verified must be on the same track.
CPU registers are used as follows:
Since the verification process is halted upon the first occurrence of an error, AL represents the number of sectors successfully verified prior to the occurrence of an error or total sectors verified if no error.
This function formats an entire track.
CPU registers are used as follows:
The format buffer contains four bytes of information for each sector on the track:
The gap length, filler byte and sectors per track required by the FDC Format command are obtained from the DPT (See Disk Parameter Table - Section 2.3.22).
As explained in the beginning of the ROS's floppy disk Int 19 calls, the 'compatible' hard disk expansion slot ROM supports a register interface similar to the floppy disk I/O but with extended functions required for the hard disk environment. This section gives the setup registers for this 'compatible' hard disk I/O call.
CPU registers are used as follows:
The register call parameters for the function selections are very similar to the equivalent floppy disk I/O calls and are typically as follows:
When Drive parameters are requested (Function 8) the return registers are as follows:
Cylinders and heads are numbered starting from zero, therefore the max numbers are 'n-1'. Sectors are numbered starting at 1 and go to n which is typically 17 for the current 'MFM' technology. Newer 'RLL' technology drives are beginning to appear with 26 sectors per track. The maximum track number is actually one higher than the number reported but the highest track (termed the maintenance cylinder) is reserved for diagnostic software maintenance tests so that applications cannot use this track for storage.
Setting bad track markers is the method used to force DOS to set its 'Bad Sector Markers' during the logical formatting process.
Hard disk formatting is a confusing subject because there are two formatting passes necessary before the disk is ready for usage. The first formatting required is the low level (hard) formatting process which writes the actual sector ID fields on the media. When a hard disk is being prepared for usage by MS-DOS it must then be partitioned (using the FDISK utility) and finally 'Logically Formatted' the using the MS-DOS FORMAT utility. MS-DOS formatting is merely a quick once over verify process to find any areas which are not readable and for which it will mark the unreadable blocks in the DOS File Allocation Table (FAT). MS-DOS then installs its file directory and FATs on the disk and reports disk size and bad sector counts. The initial hard formatting process is a factory process which must take place in a controlled environment (temperature and etc.) and the manufacturer's media defect list is entered and bad tracks marked. User attempts to format hard disks are fraught with difficulties usually because of the media defect problem whereby areas which may appear readable to MS-DOS's formatter but which fail to retain certain data patterns contained in actual data written later and these will cause 'Unrecoverable Read Error' reports to appear and frustrate all concerned. It is generally a good idea to leave the debugger 'g=C800:5' ROM formatter entry point to the experts.
This software interrupt provides functions for character I/O to one of the two serial channels and functions for configuring the serial parameters.
Two channels are supported, logical serial device 0 (COM1:) which is always configured and logical serial device 1 (COM2:) which is optional. Power-up initialisation determines whether serial device 1 is installed.
CPU registers are used as follows:
If logical channel number is out of range (greater than 1) or is not fitted then the function is abandoned and the timeout error status (bit 7 of AH) is returned and all other bits in AX are undefined.
The Logical Serial Device Timeout Count RAM variables (locations 0047C & 0047D) specify the time out delay (in half seconds) used for channel timeout. See section 2.4.
This function performs a complete reinitialisation of a serial channel. Setting the Baud Rate, Data Bits, Stop Bits and Parity.
CPU registers are used as follows:
Bit(s) | Function |
---|---|
5 - 7 | Baud Rate Code (0 - 7). |
4 | Set for Even Parity / Clear for Odd Parity. |
3 | Set Parity Enable. |
2 | Set for 2 Stop Bits / Clear for 1 Stop Bit. |
1 | Always set. |
0 | Set for 8 Data Bits/Clear for 7 Data Bits. |
The Baud Rate code (bits 5 thru 7) is one of the following:
If the hardware flow control bit in the NVR default display mode byte is set then RTS is raised true and DTR is set false. Otherwise the current state of the control lines is preserved.
This function performs a character out sequence to the selected port. The character is output when CTS and the 8250 Tx Holding Register Empty status is also true. If the character cannot be sent within the time specified in the logical serial device timeout count RAM variable then the command is abandoned and AH is returned with bit 7 set.
CPU registers are used as follows:
All flags and other registers preserved.
When this function is called, RTS is raised true.
Upon exit both the RTS and DTR control lines are left in their current state.
The Logical Serial Device Timeout Count RAM variables (locations 0:47C and 0:47D) specify the time out delay (in half seconds) used for channel timeout.
This function attempts to read a character from the specified serial port. The character is not read until both Data Ready (DR) and Data Set Ready (DSR) status bits are both true. If a character is not received within the time specified by the logical device timeout count then the command is abandoned and timeout status is flagged.
CPU registers are used as follows:
Bit(s) | Meaning |
---|---|
7 - 5 | Always '0'. |
4 | Break status. |
3 | Set if framing error. |
2 | Set if parity error. |
1 | Set if overrun error. |
0 | Always '0'. |
If the character is received with no errors then AH = 0 on exit.
Upon entry, if no character is available at the serial port DTR is set in the Modem Control Register.
If logical channel number is out of range or is not fitted then the function is abandoned and the timeout error status (bit 7 of AH) is returned and all other bits in AX are undefined.
The Logical Serial Device Timeout Count RAM variables (locations 0:47C and 0:47D) specify the time out delay (in half seconds) used for channel timeout.
This function returns the status of the specified logical channel.
CPU registers are used as follows:
All flags and other registers preserved.
If logical channel number is out of range or is not fitted then the function is abandoned and the timeout error status (bit 7 of AH) is returned and all other bits in AX are undefined.
This software interrupt provides access to the enhanced hardware features of the AMSTRAD PC1640.
CPU registers are used as follows:
Functions 3 - 5 are for PC1512 video hardware and should not be used on the PC1640.
Read and reset the mouse X and Y count registers. Each register is read twice. If the data from two consecutive reads differs then the process is repeated until two consecutive reads produce the same data. Upon completion of the read procedure the registers are cleared to zero.
CPU registers are used as follows:
This sub-function writes a specified location in the Real Time Clock Non-Volatile RAM (NVR), re-computes and stores the new checksum value. The location written is then read back and compared with the new value and if different an error code is returned.
CPU registers are used as follows:
Although locations 0-13 may be accessed using this function, they are used by the RTC hardware and should not be modified with this function.
Section 2.5 (Non Volatile RAM) contains the NVR information layout.
This sub-function reads a specified location in the Real Time Clock Non-Volatile RAM (NVR). The checksum is computed and compared with the actual value and if the NVR checksum is incorrect an error code is returned.
CPU registers are used as follows:
Section 2.5 (Non Volatile RAM) contains the NVR information layout.
This sub-function returns the two part ROS version number.
CPU registers are used as follows:
The Release Number is incremented only when the interface to the ROS is changed. The Issue Number is incremented for each version of a particular release. A new release always starts with issue number zero.
Note that this function call can be used to detect whether a program is running on an Amstrad PC. Prior to entry clear the carry flag and set BX to zero. Upon return if carry is set or BX is zero then the program is not running in an Amstrad PC. An additional hardware check (in the printer control port - Section Section 1.10.2) can be used to sort out whether the Amstrad PC is a PC1512 or a PC1640.
This software interrupt provides access to the keyboard buffer and the current toggle status.
CPU registers are used as follows:
Return the next token from the key token buffer. If no key token is available then wait until a key token is available.
CPU registers are used as follows:
Test whether the key token buffer is empty. If it is not empty return the next key token to be taken out of the buffer without removing it from the buffer.
CPU registers are used as follows:
Return the current value of the shift states (from 00417h).
CPU registers are used as follows:
Bit(s) | Function (Set if key active) |
---|---|
7 | INS |
6 | CAPS LOCK |
5 | NUM LOCK |
4 | SCROLL LOCK |
3 | ALT |
2 | CTRL |
1 | LEFT SHIFT |
0 | RIGHT SHIFT |
All flags and other registers preserved.
This software interrupt provides access to the three printer channels.
CPU registers are used as follows:
Bit(s) | Function (Bit Set True) |
---|---|
7 | Printer Idle. |
6 | Printer Acknowledge |
5 | Paper Out. |
4 | Printer Selected. |
3 | I/O Error. |
1 & 2 | Always Zero. |
0 | Zero if I/O successful or set if Timeout. (see Printer functions). |
All flags and other registers preserved.
Three logical channels are supported. Logical printer device 0 is the system port and is standard to all machines. The power-up initialisation sequence determines if additional external printer ports are present. When both additional printer interfaces are present, device 1 is the external printer port and device 2 is the printer port on the external monochrome VDU controller. If only one additional printer interface is present it is always logical device 1.
Locations 0478h - 047Ah contain the Logical Printer Device timeout counts (see section 2.4).
This function attempts to output a character to the specified printer port. If the character cannot be sent within the time specified by the logical printer timout count RAM variable then the command is abandoned and AH is returned with bit 0 set.
CPU registers are used as follows:
This function performs a complete reinitialisation of a specified printer channel (if present). The printer INIT signal is held low for approximately 4 milliseconds. Printer interrupts and auto linefeed are disabled.
CPU registers are used as follows:
This function returns the status register of the specified logical printer channel (if present).
CPU registers are used as follows:
If a Hard Disk ROM BIOS was initialized during Power-Up Initialization then it will have installed its entry point into this vector and saved the ROS's vector in its private storage area. Its bootstrap process resembles the process described below (under Int 25) and if successful the system from the active partition of the hard disk will be loaded if not then it executes the ROS's Int 24 whose vector it has saved.
This software interrupt is intended to provide an orderly system restart capability. A message is displayed on the active VDU requesting that the user 1Insert a SYSTEM disk into Drive A1 and 1Then press any key.1 When the keypress is received, the Disk Bootstrap process (Interrupt 25) is invoked.
CPU registers are used as follows:
This software interrupt to provide access to the disk bootstrap process which is normally executed after power-up initialisation tests.
The ROS attempts to load the bootstrap sector (from drive A, side 0, track 0, sector 1) into memory at 07C00h. If the bootstrap sector is loaded successfully it is given control (far jump to segment 0000 offset 7C00). If the bootstrap sector cannot be loaded after 10 retries, the ROS will display a message prompting the user to "Insert a SYSTEM disk into drive A" and "Then press any key." The ROS then waits for the keypress and repeats the system restart procedure (Int 24).
Useage of this interrupt under MS-DOS 3.2 may fail if there has been any process installed in memory which has connected itself to any active interrupt chains such as the System Clock (ticker) interrupt. The ROS performs the bootstrap without initialising the interrupt vectors and if a process has become resident under MS-DOS it will be removed during the bootstrap process, however the next occurrence of an interrupt will give control to the address of the formerly resident process and as a result the system hangs because the processor is executing random code. Programs such as MOUSE.COM are of this category of resident timer-chained process.
CPU registers are used as follows:
This software interrupt routine provides access to both the system (software maintained) clock location as well the Real Time Clock (RTC) hardware.
CPU registers are used as follows:
This function returns the current value of the 32 bit system clock value.
CPU registers are used as follows:
The 32 but system clock is incremented every 54.9 milliseconds by the ticker hardware interrupt routine. When the count reaches the 24 hour value (0001800B0h) the 24 Hour flag is set and the system clock count is reset to zero. This 24 hour count is based on the system clock 1.19318 MHz divided by the maximum divisor, 65536. This gives an interrupt rate of 54.92549323 Ms which when divided into the number of seconds in 24 hours gives this 24 Hour time value above.
Note that the 24 hour flag is reset to zero after it has been read.
This function sets the current value of the 32 bit system clock value.
CPU registers are used as follows:
This function gets the current time from the Real Time Clock.
CPU registers are used as follows:
This function sets the Real Time Clock time.
CPU registers are used as follows:
When the daylight savings option is set it enables two special updates of the current time. On the last Sunday in April, the time increments from 1:59:59 AM to 3:00:00 AM. Also on the last Sunday in October the time increments from 1:59:59 AM to 1:00:00 AM.
Note that this option also disables the alarm function.
This function gets the current date from the Real Time Clock.
CPU registers are used as follows:
The century byte is set to 19 (BCD) if the year is 80 (BCD) or above otherwise it is set to 20 (BCD).
This function sets the Real Time Clock time.
CPU registers are used as follows:
Century is ignored and is computed as described in Clock Function 4.
This function sets the alarm time and arms the Real Time Clock alarm interrupt. The alarm interrupt will occur then the current time matches the alarm time. An application program which uses this function must first write the address of its alarm interrupt routine into interrupt vector 10.
CPU registers are used as follows:
This function disarms the Real Time Clock alarm function.
CPU registers are used as follows:
This software interrupt is invoked by the keyboard hardware interrupt routine when a keyboard break ([CTRL] + [NUM LOCK]) is detected.
The power-up initialisation process loads the address of a dummy break handler routine which does an interrupt return (IRET) instruction.
Application programs which supply a keyboard break interrupt must conform to the following register conventions:
The supplied interrupt routine must not invoke any other ROS interrupts from within itself but may modify any of the system RAM locations used by the ROS.
This software interrupt is called from within the System Clock hardware interrupt routine. It is initialised by power-up with a dummy handler which returns from interrupt by doing an IRET instruction. It can be used by application programs which require a process to be run at a regular interval.
Application programs which supply an external ticker interrupt must conform to the following register conventions:
The supplied interrupt routine must not invoke any other ROS interrupts from within itself but may modify any of the system RAM locations used by the ROS.
This interrupt vector location contains the 20-bit address of the Video Parameter table used in setting up the 6845 CRTC when changing video mode. Upon power-up or after a reset, the system ROS initialisation process loads the ROM table address into this vector location (0074-0077 hex).
The Video Parameter table consists of four consecutive 16 byte entries. Each entry contains an initialisation quantity for each of the MC6845 CRTC registers (See section 1.11.5). When a new video mode is selected the table entry used for initialisation as follows:
Table Entry | VDU Mode |
---|---|
0 | 0 - Alpha 25 by 40 Chars. |
1 - Alpha 25 by 40 Chars. | |
1 | 2 - Alpha 25 by 80 Chars. |
3 - Alpha 25 by 80 Chars. | |
2 | 4 - Graphics 320 by 200 Pixels, palettes 0 or 1. |
5 - Graphics 320 by 200 Pixels, palette 2. | |
6 - Graphics 640 by 200 Pixels. | |
3 | 7 - Alpha 25 by 80 chars using monochrome adapter. |
The table contains the following initialisation data:
Register Number | Function | Entry 0 | Entry 1 | Entry 2 | Entry 3 |
---|---|---|---|---|---|
R0 | Horizontal Total | 56 | 113 | 56 | 97 |
R1 | Horizontal Displayed | 40 | 80 | 40 | 80 |
R2 | Horiz. Sync Position | 45 | 90 | 45 | 82 |
R3 | Horiz. Sync Width | 10 | 10 | 10 | 15 |
R4 | Vertical Total | 31 | 31 | 127 | 25 |
R5 | Vertical Total Adjust | 06 | 06 | 06 | 06 |
R6 | Vertical Displayed | 25 | 25 | 100 | 25 |
R7 | Vertical Sync Position | 28 | 28 | 112 | 25 |
R8 | Interlace | 02 | 02 | 02 | 02 |
R9 | Max. Raster Address | 07 | 07 | 01 | 13 |
R10 | Cursor Start Raster | 06 | 06 | 06 | 11 |
R11 | Cursor End Raster | 07 | 07 | 07 | 12 |
R12 | Start Address High | 00 | 00 | 00 | 00 |
R13 | Start Address Low | 00 | 00 | 00 | 00 |
R14 | Cursor Location High | 00 | 00 | 00 | 00 |
R15 | Cursor Location Low | 00 | 00 | 00 | 00 |
This interrupt vector location contains the 32-bit address of the parameter table of configuration parameters for the disk interface. Upon power-up or after a reset, the initialisation process loads the ROM table address into this vector location (0078 - 007B hex).
The Disk Parameter Table consists of 11 bytes as follows:
Byte | Function | Value |
---|---|---|
0 | 2nd byte of the disk controller specify command. (6 Ms Step Rate, Head Unload delay = 15) | DFh |
1 | 3rd byte of the disk controller specify command. (Head Load delay = 1 & FDC DMA Mode = 0) | 02h |
2 | Motor off timeout (approx 5.4 seconds). | 64h |
3 | Sector size selector (512 bytes) | 02h |
4 | End of Track (sector 9) | 09h |
5 | Gap length for Read/Write commands. | 2Ah |
6 | DTL - Data Length | FFh |
7 | Gap Length for format command. | 50h |
8 | Filler byte for format command. | F6h |
9 | Head Settling Delay (15 Ms) | 0Fh |
10 | Motor on Delay (500 Ms) | 04h |
This interrupt vector location contains the 32-bit address of the VDU matrix table used in compatible graphics modes for generating pixel data for characters 128 to 255.
Upon power-up or after a reset, the initialisation process loads this vector (007C-007F) with all zeros to indicate that no external VDU matrix table is loaded. Programs such as GRAFTABL.EXE load a resident upper 128 character matrix which can be used in the 640x200 resolution graphics modes. In addition the IGA ROM BIOS uses another vector, 67 (vector location 0:10Ch) which it initialises to point to its full 256 character ROM table. IGA Video Int 16, function 17, sub-function 48, BH=4, can be used to obtain the upper 128 origin of its 8x8 ROM font address and this resultant value can be used to initialise interrupt vector 31.
When the IGA extended font ROM is enabled for foreign character sets (sw9 ON) then a vector table is available at C7FE8 (C000:7FE8) which contains 12 word size entries. The first four words are for Danish fonts, the next four words are for Portugese and the final four words are for the Greek Fonts. The first pointer in each of these groups is for the 8x8 high 128 character set for the national variant. By using the offset value plus a segment value of C000h, national variant upper 128 character sets can easily be obtained without using any disk based tables.
Each of the 128 character table entries consists of eight bytes, one for each character scan. The first byte is the top scan value and the last byte is the button scan value. The MSB, bit 7, is the left most pixel and the LSB, bit 0, is the right most pixel of the scan. A set bit displays the foreground colour and a reset bit displays the background colour.
The System RAM address space from 00300 to 00500 is used by the ROS for variable storage. The following table lists the variables and their usage. They are either classified as Byte (8-bit), Word (16-bit), Long Word (32-bit) or Buffer (greater than 32-bit) storage locations. Depending on the CPU's segment register setting, the variables at 004xx can be said to be referenced at 40:XXX or 0:4XX.
Location(s) | Usage | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00300-003FF | Initialisation Stack (Buffer). Used as stack area only during initialisation. | ||||||||||||||||||||||||||
00400 | Logical Serial Device 0 Base I/O Address (Word). Contains the base address of logical serial device 0. Initally the System Asynchronous Serial port address. | ||||||||||||||||||||||||||
00402 | Logical Serial Device 1 Base I/O Address (Word). Contains the base address of logical serial device 1. Initally the external asynchronous serial port or zero if it is not present at initialisation. | ||||||||||||||||||||||||||
0404 - 0407 | Reserved. | ||||||||||||||||||||||||||
00408 | Logical Printer Device 0 Base I/O Address (Word). The base address of logical printer device 0. Initally the System Parallel Printer port. | ||||||||||||||||||||||||||
0040A | Logical Printer Device 1 Base I/O Address (Word). The base address of logical printer device 0. Initially the external parallel printer port if it is present else it points to the external monochrome VDU controller if it is present. If neither is present it is initialised to zero. | ||||||||||||||||||||||||||
0040C | Logical Printer Device 2 Base I/O Address (Word). Initially points to the external monochrome VDU controller if both the external parallel printer port and the external monochrome VDU controller are present. If either is not installed initialised to zero. | ||||||||||||||||||||||||||
0040E | Reserved (Word). | ||||||||||||||||||||||||||
00410 | System Configuration Status (Word). Contains the System Configuration as follows:
| ||||||||||||||||||||||||||
00412 | Reserved (Byte). | ||||||||||||||||||||||||||
00413 | Total RAM Size (Word). Initially set to the number of 1K User (System) RAM Blocks installed. (640 for PC1640). | ||||||||||||||||||||||||||
00415 | Extra RAM Size (Word). Initially set to the number of 1K User (System) RAM Blocks installed minus 64. (576 for PC1640). | ||||||||||||||||||||||||||
00417 | Key Toggles and Key States (Byte). This byte is used to record the state of the Key Toggles (bits 4-7) and Key States (bits 0-3) as follows:
| ||||||||||||||||||||||||||
00418 | Keys down (Byte). This byte is used to record the state of the toggle keys so that they do not repeat when the key is held down.
| ||||||||||||||||||||||||||
00419 | Absolute Key Token Number (Byte). When an absolute key token numbered is entered via ALT and the numeric key pad, this variable holds the current state of the token. | ||||||||||||||||||||||||||
0041A | Key Token Buffer Out Pointer (Word). This variable holds the absolute offset to the next key token to be removed from the key token buffer. Note that the ROS assumes that the buffer has a segment paragraph address of 0040h. | ||||||||||||||||||||||||||
0041C | Key Token Buffer In Pointer (Word). This variable holds the absolute offset to the next empty position in the key token buffer. The buffer is empty when this location is the same as the Out Pointer. | ||||||||||||||||||||||||||
0041E | Key Token Buffer (Buffer). The Key Token Buffer is a 16 word circular buffer used to store up to 16 key tokens. | ||||||||||||||||||||||||||
0043E | Drive Restore Flag (Byte). Each floppy disk drive has a restore flag associated with it (bit 0 for drive 0 and bit 1 for drive 1). If the restore flag for the specified drive is reset prior to any disk access (read/write/verify/format), then the restore command is issued to the FDC for that drive. If successful then the associated flag bit is set. When the initialise sub-function of the disk interrupt is called the restore flag is cleared. Bit 7 is used for handling FDC hardware interrupts. | ||||||||||||||||||||||||||
0043F | Drive Motor Flag (Byte). When a disk drive motor is running then either bit 0 or bit 1 will be set to which drive (0 or 1 respectively) is selected. | ||||||||||||||||||||||||||
00440 | Drive Motor Timeout Counter (Byte). After each disk operation the the motor off timeout count is copied from the Disk Parameter table (See interrupt 30) into this variable. Each time the system clock interrupt is executed, the count is decremented. When it reaches zero the Drive Motor Flag is reset. | ||||||||||||||||||||||||||
00441 | Disk Status (Byte). This byte holds the status returned by the last disk operation. (See section 2.3.11 Disk I/O Interrupt - Function 1.) | ||||||||||||||||||||||||||
00442 | FDC Results/HD Parameter Buffer (Buffer). This seven byte buffer is used for storage of the FDC status information returned upon the completion of a disk I/O operation. It is also used by the Hard Disk BIOS ROM for call parameter storage. | ||||||||||||||||||||||||||
00449 | Current Video Mode (Byte). The current Video mode from the last Int 16 setmode call is stored here. | ||||||||||||||||||||||||||
0044A | Visible Display Columns (Word). The number of visible character columns currently being displayed is stored here. | ||||||||||||||||||||||||||
0044C | Video Display Page Size (Word). This word holds the amount of Video RAM used by the ROM BIOS to display one page as defined below:
| ||||||||||||||||||||||||||
0044E | Display Page Start Offset (Word). Contains the origin of the currently active VDU display page. | ||||||||||||||||||||||||||
00450 | Cursor Address Buffer (Buffer) This 16 byte buffer contains the row and column addresses for up to eight display pages. This is the limiting factor is the number of pages which can be supported by the video ROM BIOS routines. | ||||||||||||||||||||||||||
00460 | Cursor End Scan (Byte). This byte contains the current end scan number that was programmed into the CRT controller. | ||||||||||||||||||||||||||
00461 | Cursor Start Scan (Byte). This byte contains the current start scan number that was programmed into the CRT controller. | ||||||||||||||||||||||||||
00462 | Active Display Page (Byte). This byte contains the selected display page number. | ||||||||||||||||||||||||||
00463 | CRTC I/O Address (Word). This word contains the I/O address of the CRTC interface currently in use. (3B4 - Mono / 3D4 - Colour) | ||||||||||||||||||||||||||
00465 | Current Video Mode Control Register (Byte). This byte contains the current contents of the Video Mode Control Register. | ||||||||||||||||||||||||||
00466 | Current CGA Colour Select Register (Byte). This byte contains a copy of the data loaded into CGA colour select register. | ||||||||||||||||||||||||||
0467-046B | Reserved | ||||||||||||||||||||||||||
0046C | System Clock (Long Word). The 32 bit system clock count | ||||||||||||||||||||||||||
00470 | 24 Hour Flag (Byte). When the system clock reaches 0001800B0h then it is cleared and this flag byte is set to 0FFh. Note that reading the clock via interrupt 26 clears this flag. | ||||||||||||||||||||||||||
00471 | Break (Byte). This byte is initially set to zero. Each time Break ([CTRL]+[NUM LOCK]) is detected, bit 7 is set. An application program using this bit to detect break must reset bit 7 when it detects the break event. | ||||||||||||||||||||||||||
00472 | System Reset Flag (Word). When soft reset, [CTRL]+[ALT]+[DEL], is detected this location is set to 01234h prior to issuing a system reset. The power-up self test routine then recognizes this pattern and does not repeat the RAM tests. Setting 1235h prevents full hardware reset. | ||||||||||||||||||||||||||
0474 | Last Hard Disk I/O Completion Code. This location is used by the Hard Disk BIOS ROM to store the last I/O operation's completion code. |
||||||||||||||||||||||||||
0475 | Hard Disk Drive Count. This location is used by the Hard Disk BIOS ROM to store the number of drives on line. |
||||||||||||||||||||||||||
0476-0477 | Reserved for Hard Disk BIOS ROM. | ||||||||||||||||||||||||||
0478 - 47A | Logical Printer Device 0 - 2 Timeout Count (Buffer). These timeout counts specify how long the ROS should wait in half second multiples, while trying to output a character to a logical printer channel. The are initially set to 20 (10 Second timeout). | ||||||||||||||||||||||||||
0047B | Reserved. | ||||||||||||||||||||||||||
047C - 047D | Logical Serial Device 0 - 1 Timeout Count (Buffer). These timeout counts specify the length of the wait time half second intervals for character I/O to a particular logical serial channel. All counts are set to 1 (for a ) second timeout). | ||||||||||||||||||||||||||
0047E | Reserved. | ||||||||||||||||||||||||||
00480 | Key Token Buffer Start Address (Word). Offset pointer to the start of the key token buffer. Note that the assumed buffer segment paragraph address is 0040h. | ||||||||||||||||||||||||||
00482 | Key Token Buffer End Address (Word). Offset pointer to the start of the key token buffer. | ||||||||||||||||||||||||||
00484 | Display Rows (Byte). This location contains the number of character rows (less one) on the display screen. | ||||||||||||||||||||||||||
00485 | Character Points (Byte). This location contains the current character matrix length in bytes. | ||||||||||||||||||||||||||
00487 | EGC Status (Byte). This location is used by the IGA ROM BIOS to hold its current status information (Colour/Mono, Primary/Sec). | ||||||||||||||||||||||||||
00488 | Switches (Byte). This location contains the current switch settings for the EGC control switches 1-4 in bits 0-3 (inverted). The upper four bits are ones. | ||||||||||||||||||||||||||
00500 | Print Screen Status (Byte).
|
The first 40 bytes of the battery backed RAM within the RTC hardware are for system parameter storage as follows:
Byte(s) | Usage | Default |
---|---|---|
0-9 | Time and Date parameters. | -- |
1 | RTC Control Register A. | 070 |
11 | RTC Control Register B. | 002 |
12 | RTC Control Register C. | -- |
13 | RTC Control Register D. | -- |
14 - 19 | Time and Date when machine last used. | -- |
20 | User RAM Checksum. | |
21 - 22 | Enter Key translation token. | 1C0D |
23 - 24 | Forward Delete Key translation token. | 2207 |
25 - 26 | Joystick Fire Button 1 translation token. | FFFF |
27 - 28 | Joystick Fire Button 2 translation token. | FFFF |
29 - 30 | Mouse Button 1 translation token. | FFFF |
31 - 32 | Mouse Button 2 translation token. | FFFF |
33 | Mouse X direction scaling factor. | 00A |
34 | Mouse Y direction scaling factor. | 00A |
35 | Initial VDU mode and drive count | 020 |
36 | Initial VDU Character attributes. | 007 |
37 | Size of RAM disk in 2K blocks. | 000 |
38 | Initial system UART hardware setup byte. | 0E3 |
39 | Initial external UART hardware setup byte. | 0E3 |
40-63 | Unused | -- |
Locations 0 to 13 are RTC hardware registers. Refer to 3.8 for an explanation of their usage and setup values.
After power-up or upon system reset the NVR is checksummed as part of initialisation. If the lower byte of the sum is not 0AAh or if the battery voltage low bit is set in the RTC status register, then the values in the default column are loaded into their respective locations and a warning message is displayed on the VDU. Those locations without defaults (marked with '--') are not changed.
The default key token value in bytes 25 to 32 is a special value (FFFF) which signals the keyboard hardware interrupt to ignore the key press rather than to insert the key token into the buffer.
The initial VDU mode (byte 35) is used to set up by the ROS on Power-Up Initialisation based on switch settings. It is then used to setup the system status-1 channel. (DDM - bits 4 & 5. See 1.8.2 for the valid combinations.) Bits 4 and 5 of byte 35 are set up correspondingly. Bit 6 is set if two drives are fitted else it is cleared. The default version of byte 35 has bit 6 set (two drives) and bits 4 & 5 set to 1 & 0 (Colour, alpha, 80 x 25 chars).
Bit 7 of byte 35 is used to enable or disable the serial I/O flow control option. Refer to section 2.3.12 for serial I/O and flow control details.
The initial VDU character attribute (byte 36) is written to all the attribute bytes of the VDU buffer when one of the alpha modes is selected. The default value selects a white foreground on a black background.
The RAM disk size (byte 37) is used by the MS-DOS operating system to specify RAM disk setup size.
The initial UART parameters (bytes 38 and 39) specifies 9600 baud, 8 data bits, 1 stop bit and no parity. These values are loaded to their respective serial channel by the Serial I/O Initialise sub-function (See Section 2.3.12: Interrupt 20).
The ROS outputs a number of messages during Power-Up Self Test initialisation as detailed below. The language in which these messages are displayed is dependent of the three option links connected to the three least significant bits of the system printer port status. (See Table 3.1 for the interpretation of the three link bits.)
The following messages are displayed on the primary display screen (in the default display mode as specified by the NVR ) in the situations as described. The initialisation process is allowed to complete even though some of them may represent self test failures.
nnn | = the RAM size in kilobytes. |
v.i | = the ROS Version (v) and Issue (i) number. |
hh:mm | = the hours (hh) and the minutes (mm) of last on time. |
dd mn yy | = the day (dd), the calendar month (mn) and the year (yy) of the last date used. |
The following messages indicate that a self test segment has failed and that initialisation cannot continue. In this situation the machine must be switched off and on again in order to reinitiate operations. The display is switched to 80 column alpha mode and cleared prior to displaying any of these messages.
When one of these failures occurs, no other testing is run since further testing may require use of the failing component. For this reason the system is placed in a non-interruptible loop. Failures of this sort are not expected to occur even intermittently. When any self test failure does occur it should be referred to a qualified AMSTRAD service facility for further diagnostic testing.
Section 1 | Index | Section 3 |