[back to main site]
Snowdrop OS - a homebrew operating system from scratch, in assembly language

System calls section


The Snowdrop OS kernel offers services to be used by applications via the following interrupt handlers. If you decide to write your own app, you can call these from the app. Most of them are not re-entrant.

NOTE: Interrupts 0F0h to 0FFh are reserved for user programs.


int 80h - Print string to screen

WRITES DIRECTLY TO VIDEO MEMORY. Not suitable for tasks which need to write to
their own isolated virtual display.

INPUT:
DS:SI - pointer to first character of zero-terminated string
OUTPUT:
NONE

    

int 81h - Load file from FAT12 disk

The disk from which the OS booted is used.

INPUT:
DS:SI - pointer to 11-byte buffer containing file name in FAT12 format
example: for "BEAR.APP", the buffer would contain "BEAR APP"
ES:DI - pointer to where file data will be loaded, rounded up to
nearest 512 bytes
OUTPUT:
AL - result (0=success, 1=not found)
CX - file size in bytes


int 82h - Convert string to upper case

INPUT:
DS:SI - pointer to first character of zero-terminated string
OUTPUT:
NONE


int 83h - Clear keyboard buffer

INPUT:
NONE
OUTPUT:
NONE


int 84h - Get system timer ticks count

The system timer begins ticking as soon as the kernel initializes.
By default, the system timer ticks approximately 18.2 times a second.

INPUT:
NONE
OUTPUT:
AX - current system timer ticks count


int 85h - Cause delay (busy wait)

By default, the system timer ticks approximately 18.2 times a second.

INPUT:
CX - number of system timer ticks to delay
OUTPUT:
NONE


int 86h - Get next random number

INPUT:
NONE
OUTPUT:
AX - next random number


int 87h - Load FAT12 root directory

The disk from which the OS booted is used.
Each 32-byte FAT12 directory entry has the following format:

Bytes Content
0-10 File name (8 bytes) with extension (3 bytes)
11 Attribute - a bitvector. Bit 0: read only. Bit 1: hidden.
Bit 2: system file. Bit 3: volume label. Bit 4: subdirectory.
Bit 5: archive. Bits 6-7: unused.
12-21 Reserved (see below)
22-23 Time (5/6/5 bits, for hour/minutes/doubleseconds)
24-25 Date (7/4/5 bits, for year-since-1980/month/day)
26-27 Starting cluster (0 for an empty file)
28-31 File size in bytes

INPUT:
ES:DI - pointer to where the root directory will be loaded
OUTPUT:
AX - number of 32-byte FAT12 root directory entries loaded


int 88h - Dump memory to screen

WRITES DIRECTLY TO VIDEO MEMORY. Not suitable for tasks which need to write to
their own isolated virtual display.

INPUT:
DS:SI - pointer to first byte to dump
OUTPUT:
CX - number of bytes to dump


int 89h - Play sound on internal speaker

The sound is sustained until the speaker is muted via int 8Ah
Frequency number can be obtained from the following table:

Note Frequency Frequency #
C 130.81 9121
C# 138.59 8609
D 146.83 8126
D# 155.56 7670
E 164.81 7239
F 174.61 6833
F# 185.00 6449
G 196.00 6087
G# 207.65 5746
A 220.00 5423
A# 233.08 5119
B 246.94 4831
Middle C 261.63 4560
C# 277.18 4304
D 293.66 4063
D# 311.13 3834
E 329.63 3619
F 349.23 3416
F# 369.99 3224
G 391.00 3043
G# 415.30 2873
A 440.00 2711
A# 466.16 2559
B 493.88 2415
C 523.25 2280
C# 554.37 2152
D 587.33 2031
D# 622.25 1917
E 659.26 1809
F 698.46 1715
F# 739.99 1612
G 783.99 1521
G# 830.61 1436
A 880.00 1355
A# 923.33 1292
B 987.77 1207
C 1046.50 1140

INPUT:
AX - frequency number of sound to play
OUTPUT:
NONE


int 8Ah - Stop internal speaker output

This interrupt is used to turn off the speaker after a sound has played
for a desired period of time.

INPUT:
NONE
OUTPUT:
NONE


int 8Bh - Mouse event callback

Receives 3 bytes of raw mouse data upon a mouse event taking place.
This handler can be overridden by a custom handler for access to raw mouse data.
Once overridden, "managed" mode via interrupt 8Fh (see below) becomes unavailable.

INPUT:
BH - bit 7 - Y overflow
bit 6 - X overflow
bit 5 - Y sign bit
bit 4 - X sign bit
bit 3 - unused and indeterminate
bit 2 - middle button
bit 1 - right button
bit 0 - left button
DH - X movement (delta X)
DL - Y movement (delta Y)
OUTPUT:
NONE


int 8Ch - Poll raw mouse data

Returns the last-received raw mouse event data.

INPUT:
NONE
OUTPUT:
BH - bit 7 - Y overflow
bit 6 - X overflow
bit 5 - Y sign bit
bit 4 - X sign bit
bit 3 - unused and indeterminate
bit 2 - middle button
bit 1 - right button
bit 0 - left button
DH - X movement (delta X)
DL - Y movement (delta Y)


int 8Dh - Get mouse driver status

Returns the status of the mouse driver.

INPUT:
NONE
OUTPUT:
AL - 1 when driver is loaded, 0 otherwise


int 8Eh - Print byte

Prints the value a byte to the screen (hexadecimal).
WRITES DIRECTLY TO VIDEO MEMORY. Not suitable for tasks which need to write to
their own isolated virtual display.

INPUT:
AL - byte to print
OUTPUT:
NONE


int 8Fh - Poll mouse manager

Polls the mouse manager, receiving button status and mouse location in
user-specified coordinates. See interrupt 90h below for how those
coordinates are specified.

INPUT:
NONE
OUTPUT:
AL - bits 3 to 7 - unused and indeterminate
bit 2 - middle button current state
bit 1 - right button current state
bit 0 - left button current state
BX - X position in user coordinates
DX - Y position in user coordinates


int 90h - Initialize mouse manager

After calling this, a consumer program will be able to poll the mouse
manager (via interrupt 8Fh above), to get the mouse location and button status.

INPUT:
BX - width of the bounding box within which the mouse cursor will move
DX - height of the bounding box within which the mouse cursor will move
OUTPUT:
NONE


int 91h - Allocate memory

Allocates a memory segment.

INPUT:
NONE
OUTPUT:
AX - 0 when the allocation succeeded
BX - segment number of newly allocated segment, when successful


int 92h - Free memory

Frees a memory segment, making it available for allocation.
As of version 25, Snowdrop OS kernel automatically frees memory segments
allocated by applications.

INPUT:
BX - segment to free
OUTPUT:
NONE


int 93h - Scheduler task add

Adds a task to the scheduler, preparing it for execution.

INPUT:
BX - segment containing the app to be added as a task
DS:SI - pointer to string containing serialized parameter data for the
task being created (maximum 256 bytes)
OUTPUT:
AX - task ID of newly added task


int 94h - Scheduler task yield

Causes the currently running task to yield to another. Used when a running app
reaches a point in its execution when it's sensible to yield to another app.

INPUT:
NONE
OUTPUT:
NONE


int 95h - Scheduler task exit

Causes the currently running task to exit. Must be called by all apps whose
execution has ended.

INPUT:
NONE
OUTPUT:
NONE


int 96h - Activate virtual display of task

Makes the virtual display of the specified task active.

INPUT:
AX - ID of task whose virtual display is to be made active
OUTPUT:
NONE


int 97h - Write string to current task's virtual display

Suitable for writing to a task's own isolated virtual display, without
interfering with the displays of other tasks.

INPUT:
DS:SI - pointer to first character of zero-terminated string
OUTPUT:
NONE


int 98h - Write character to current task's virtual display

Suitable for writing to a task's own isolated virtual display, without
interfering with the displays of other tasks.

INPUT:
DL - ASCII character to write
OUTPUT:
NONE


int 99h - Scheduler task get status

Returns the status of the specified task.

INPUT:
AX - task ID
OUTPUT:
AX - task status as follows: 0FFFFh = "not present"


int 9Ah - Scheduler get current task ID

Returns the ID of the currently running task.

INPUT:
NONE
OUTPUT:
AX - task ID of currently running task


int 9Bh - Power services

Allows access to power-related functions.

INPUT:
AX - 0=attempts to put the computer in a power off state via APM
1=attempts to restart the computer
OUTPUT:
AX - when input AX=0, error code as follows:
0 = installation check failed
1 = real mode connection failed
2 = APM driver version 1.2 unsupported
3 = state change to "off" failed
when input AX=1, undefined


int 9Ch - Delete file from disk

Deletes the file with the specified name from the disk.
Performs no operation if file does not exist.

INPUT:
DS:SI - pointer to zero-terminated file name string in FAT12 format
OUTPUT:
NONE


int 9Dh - Write file to disk

Writes the file with the specified name and contents to the disk.

INPUT:
DS:SI - pointer to 11-byte buffer containing file name in FAT12 format
ES:DI - pointer to file contents buffer (cannot cross 64kb boundaries)
CX - size of file content in bytes
OUTPUT:
AX - status as follows:
0 = success
1 = failure: maximum number of files reached
2 = failure: disk full


int 9Eh - Set cursor position

Sets the position of the cursor in the current task's virtual display.

INPUT:
BH - row
BL - column
OUTPUT:
NONE


int 9Fh - Write attribute to display

Writes the specified number of attribute bytes to the current task's
virtual display.

INPUT:
DL - attribute value
CX - number of attribute bytes to write
OUTPUT:
NONE


int 0A0h - Clear screen

Clears current task's virtual display, moves cursor to top left, and sets
attributes to gray text on black background.

INPUT:
NONE
OUTPUT:
NONE


int 0A1h - Get free file slots count

Returns the number of free file slots on the disk.

INPUT:
NONE
OUTPUT:
CX - number of free file slots


int 0A2h - Convert 32bit unsigned integer to string

Adds ASCII 0 terminator at the end of the string.

INPUT:
DX:AX - number to convert, no larger than 655,359,999 (270FFFFFh)
DS:SI - pointer to buffer where the result will be stored
(must be a minimum of 16 bytes long)
BL - formatting option, as follows (for input 834104):
0 - no formatting, eg: "000834104"
1 - leading spaces, eg: " 834104"
2 - leading spaces and commas, eg: " 834,104"
3 - no leading spaces, eg: "834104"
4 - no leading spaces with commas, eg: "834,104"
OUTPUT:
NONE


int 0A3h - Get free disk space amount

Returns the amount of available disk space, in bytes.

INPUT:
NONE
OUTPUT:
DX:AX - amount of available disk space, in bytes
(least significant bytes in AX, most significant bytes in DX)


int 0A4h - Read keyboard input from user

Reads characters from the keyboard into the specified buffer.
It reads no more than the specified limit, and adds a terminator character
of ASCII 0 at the end, once the user presses Enter to finish inputting.
The specified buffer must have enough room for one more character than the
specified count.
Echoes typed characters to the current task's virtual display.

INPUT:
CX - maximum number of characters to read
ES:DI - pointer to buffer (must fit CX+1 characters)
OUTPUT:
NONE


int 0A5h - Get string length

Returns the length of a ASCII 0-terminated string.

INPUT:
DS:SI - pointer to string
OUTPUT:
BX - string length, not including terminator


int 0A6h - Convert 8.3-format file name to FAT12 format

Converts a 8.3 dot file name to a fixed-size, padded, upper-case
FAT12-compliant file name.
Must contain a dot.
Must have between 1 and 8 characters before the dot.
Must have between 1 and 3 characters after the dot.
Example: "abcd.000" is converted to "ABCD 000"
"abcdefgh.aaa" is converted to "ABCDEFGHAAA"

INPUT:
DS:SI - pointer to 8.3 dot file name
ES:DI - pointer to buffer to hold the resulting FAT12 file name
OUTPUT:
NONE


int 0A7h - Dump virtual display data

Dumps the virtual display of the current task.
Dumps the vram if the specified virtual display is the
active virtual display.
The buffer must be able to store 4000 bytes (80 columns x 25 rows x 2 bytes).

INPUT:
ES:DI - pointer to where the virtual display will be dumped
(must be able to store 4000 bytes)
OUTPUT:
NONE


int 0A8h - Dump characters to current task's virtual display

Prints a specified number of characters from a string to the
current task's virtual display.

INPUT:
DS:SI - pointer to beginning of dump source
CX - number of characters to print
OUTPUT:
NONE


int 0A9h - Validate 8.3-format file name

Checks whether the specified 8.3 dot file name is valid:
Must contain one dot.
Must have between 1 and 8 characters before the dot.
Must have between 1 and 3 characters after the dot.
Example: "abcd.000"
"abcdefgh.aaa"
"abc.a"

INPUT:
DS:SI - pointer to 8.3 dot file name
OUTPUT:
AX - 0 when the file name is a valid 8.3 file name


int 0AAh - Get cursor position

Gets the cursor position in the current task's virtual display.

INPUT:
NONE
OUTPUT:
BH - row
BL - column


int 0ABh - Format disk

Formats the current disk with the specified FAT12 image.
Snowdrop OS's default FAT12 image is expected to be first read via 0B1h.
WARNING: DESTROYS BOOT SECTOR AND ALL FILES PRESENT ON THE DISK.

INPUT:
DS:SI - pointer to FAT12 image
OUTPUT:
NONE


int 0ACh - Write boot loader to disk

Writes the Snowdrop OS boot loader to the current disk.

INPUT:
AX - 0=unpartitioned, 1=MBR, other value NOOP
OUTPUT:
NONE


int 0ADh - Get serial port driver status

Returns the status of the serial port driver.
(Default settings: COM1, 9600 bits per second, 8 data bits, no parity,
1 stop bit, no flow control)

INPUT:
NONE
OUTPUT:
AL - 1 when driver is loaded, 0 otherwise


int 0AEh - Serial port "read data" user interrupt

Receives a byte whenever one is available to read from the serial port.
User applications are meant to define their own handlers for this interrupt,
to handle bytes available for reading from the serial port.
(Default settings: COM1, 9600 bits per second, 8 data bits, no parity,
1 stop bit, no flow control)

INPUT:
AL - byte read from serial port
OUTPUT:
NONE


int 0AFh - Serial port send data (blocking)

Blocks until the serial port is ready to send.
Once that happens, it sends the specified byte.
(Default settings: COM1, 9600 bits per second, 8 data bits, no parity,
1 stop bit, no flow control)

INPUT:
AL - byte to send
OUTPUT:
NONE


int 0B0h - Install interrupt handler

Installs the specified interrupt handler, returning a pointer to the old
(previous) interrupt handler.

INPUT:
AL - interrupt number
ES:DI - pointer to interrupt handler to install
OUTPUT:
DX:BX - pointer to old interrupt handler


int 0B1h - Read FAT12 image

Reads a complete floppy FAT12 image in preparation for a disk format
operation via int 0ABh.

INPUT:
ES:DI - pointer to where file data will be loaded
(must be able to hold at least 32kb)
(must not cross any 64kb boundaries)
OUTPUT:
AL - status (0=success, 1=not found)


int 0B2h - Read screen character and attribute at position

Reads a character and attribute from the current
task's virtual display, from the specified location.

INPUT:
BH - location row
BL - location column
OUTPUT:
AH - attribute byte
AL - ASCII character byte


int 0B3h - Convert FAT12 format file name to 8.3-format file name

Converts a file name in FAT12 format to a 8.3 dot file name.
Example: "ABCD 000" is converted to "ABCD.000"
"ABCDEFGHAAA" is converted to "ABCDEFGH.AAA"
"ABC A" is converted to "ABC.A"

INPUT:
DS:SI - pointer to FAT12-compliant file name
ES:DI - pointer to buffer to hold the resulting 8.3 dot file name
(must be able to hold at least 13 characters)
OUTPUT:
NONE


int 0B4h - Dump stack top and register values

Dump stack top and register values to video ram, as they were right
before the "int XX" call which reaches this function.

INPUT:
NONE
OUTPUT:
NONE


int 0B5h - Set current task lifetime parameters

Sets parameters which configures the scheduler's behaviour with respect to
the current task.

INPUT:
BL - lifetime parameters, as follows:
bit 0 - when set, keep memory after task exit; useful for tasks which
install interrupt handlers that must persist after task exit
bit 1-7 - unused
OUTPUT:
NONE


int 0B6h - Parallel port send data (blocking)

Blocks until the parallel port is ready to send.
Once that happens, it sends the specified byte.
(Default settings: LPT1)

INPUT:
AL - byte to send
OUTPUT:
NONE


int 0B7h - Get parallel port driver status

Returns the status of the parallel port driver.
(Default settings: LPT1)

INPUT:
NONE
OUTPUT:
AL - 1 when driver is loaded, 0 otherwise
DX - port base address (only if driver is loaded)


int 0B8h - Higher-level timer interrupt (KERNEL RESERVED)

This interrupt is invoked by the system timer whenever it ticks.
It is reserved for kernel-level constructs that wish to be periodically
called. As such, it is strongly advised to not be overridden from user apps.

INPUT:
NONE
OUTPUT:
NONE


int 0B9h - Play sound with specified properties

Enqueue a sound to be played by Snowdrop OS's sound driver.

INPUT:
AX - frequency (see int 89h documentation for example frequencies)
CL - length of sound in timer ticks (one tick is 10ms)
DX - per-tick frequency delta (used to change frequency every tick)
CH - sound mode, as follows:
0 - normal (queued sound)
1 - immediate (automatically becomes next to play)
2 - exclusive (all other sounds are removed, queue is locked
while this sound plays)
OUTPUT:
NONE


int 0BAh - Get keyboard driver key press status

Returns the current status (pressed or not pressed) of the specified key.

INPUT:
BL - scan code
OUTPUT:
AL - 0 when key is not pressed, and non-zero when it is


int 0BBh - Get keyboard driver mode

Returns the current keyboard driver mode.

INPUT:
NONE
OUTPUT:
AX - driver mode, as follows:
0 - off; delegate everything to previous handler (BIOS usually)
1 - on; ignore previous handler


int 0BCh - Set keyboard driver mode

Changes the way the keyboard driver functions.

INPUT:
AX - driver mode, as follows:
0 - off; delegate everything to previous handler (BIOS usually)
1 - on; ignore previous handler
OUTPUT:
NONE


int 0BDh - Compare strings

Compares the provided strings for length and ASCII order.

INPUT:
DS:SI - pointer to first string
ES:DI - pointer to second string
OUTPUT:
AX - 0 when the strings are equal
1 when the first string is lower (ASCII-wise)
2 when the second string is lower (ASCII-wise)


int 0BEh - Convert string representation of integer to integer

Convert 16bit unsigned integer string (decimal) to an unsigned integer.

INPUT:
DS:SI - pointer to string representation of integer (zero-terminated)
OUTPUT:
AX - resulting integer


int 0BFh - Get task parameter (program argument) value

Gets the value of the specified parameter, of the currently running task.

INPUT:
DS:SI - pointer to the name of the parameter (zero-terminated)
(must be no longer than 65 bytes, including terminator)
ES:DI - pointer to buffer into which parameter value will be read
(must be at least 257 bytes long)
OUTPUT:
AX - 0 when parameter was not found, another value otherwise


int 0C0h - Mouse manager event callback

Invoked by the mouse manager upon receiving a mouse event (including newly
calculated position, button status, etc).
This is meant to be overridden by consumers who wish to be called back
when any mouse events are raised.
coordinates are specified.

INPUT:
AL - bits 3 to 7 - unused and indeterminate
bit 2 - middle button current state
bit 1 - right button current state
bit 0 - left button current state
BX - X position in user coordinates
DX - Y position in user coordinates
OUTPUT:
NONE


int 0C1h - Clear currently-playing sounds

Clears any playing, or about to play, sounds

INPUT:
NONE
OUTPUT:
NONE


int 0C2h - Get available disk information

Returns count, active disk ID, and available disk IDs

INPUT:
NONE
OUTPUT:
AL - ID of current disk
AH - number of disks
BL - ID of first disk
BH - ID of second disk, if one exists
CL - ID of third disk, if one exists
CH - ID of fourth disk, if one exists
DL - ID of fifth disk, if one exists
DH - ID of sixth disk, if one exists


int 0C3h - Set current disk

Makes the specified disk current

INPUT:
AL - ID of disk to be made current
OUTPUT:
AX - 0 when operation succeeded
1 when operation failed because the specified disk does not exist


int 0C4h - Messaging functions

Function 0: subscribe to be notified of messages of the specified type.
INPUT:
AH - 0
DS:SI - pointer to message type string, no longer than 32 characters
DX:BX - pointer to consumer function; consumer contract:
input:
DS:SI - pointer to message bytes
ES:DI - pointer to message type
CX - message bytes length
AX - (reserved for future functionality)
BX - (reserved for future functionality)
DX - (reserved for future functionality)
output:
none
Consumer may not add or remove consumers.
Consumer must use retf to return.
OUTPUT:
AX - not preserved (reserved for future functionality)

Function 1: unsubscribe all consumers subscribed by the current task.
INPUT:
AH - 1
OUTPUT:
AX - not preserved (reserved for future functionality)

Function 2: publish a message of the specified type
INPUT:
AH - 2
DS:SI - pointer to message contents
ES:DI - message type
CX - length of message contents
OUTPUT:
AX - not preserved (reserved for future functionality)


int 0C5h - Extra mouse manager functions

Function 0: move mouse to specified location.
INPUT:
AH - 0
DX - Y coordinate
BX - X coordinate
OUTPUT:
AX - not preserved (reserved for future functionality)


int 0C6h - Extra scheduler functions

Function 0: set task target on next yield.
INPUT:
AH - 0
BX - task ID of task which will become active after on next yield
OUTPUT:
AX - not preserved (reserved for future functionality)