The list of all interrupts that are currently supported by the emulator
The list of all interrupts that are currently supported by the emulator
the emulator.
Quick reference:
INT 21h
INT 10h/00h INT 21h/35h
INT 21h/01h
INT 10h/01h INT 10h/1003h INT 21h/39h
INT 21h/02h
INT 10h/02h INT 11h INT 21h/3Ah
INT 21h/05h
INT 10h/03h INT 12h INT 21h/3Bh
INT 21h/06h
INT 10h/05h INT 13h/00h INT 21h/3Ch
INT 21h/07h
INT 10h/06h INT 13h/02h INT 21h/3Dh INT 33h/0000h
INT 21h/09h
INT 10h/07h INT 13h/03h INT 21h/3Eh INT 33h/0001h
INT 21h/0Ah
INT 10h/08h INT 15h/86h INT 21h/3Fh INT 33h/0002h
INT 21h/0Bh
INT 10h/09h INT 16h/00h INT 21h/40h INT 33h/0003h
INT 21h/0Ch
INT 10h/0Ah INT 16h/01h INT 21h/41h
INT 21h/0Eh
INT 10h/0Ch INT 19h INT 21h/42h
INT 21h/19h
INT 10h/0Dh INT 1Ah/00h INT 21h/47h
INT 21h/25h
INT 10h/0Eh INT 20h INT 21h/4Ch
INT 21h/2Ah
INT 10h/13h INT 21h/56h
INT 21h/2Ch
input:
AL = desired video mode.
input:
CH = cursor start line (bits 0-4) and options (bits 5-7).
CL = bottom cursor line (bits 0-4).
input:
DH = row.
DL = column.
BH = page number (0..7).
example:
mov dh, 10
mov dl, 20
mov bh, 0
mov ah, 2
int 10h
input:
BH = page number.
return:
DH = row.
DL = column.
CH = cursor start line.
CL = cursor bottom line.
input:
AL = new page number (0..7).
the activated page is displayed.
input:
AL = number of lines by which to scroll (00h = clear entire
window).
BH = attribute used to write blank lines at bottom of window.
CH, CL = row, column of window's upper left corner.
DH, DL = row, column of window's lower right corner.
input:
BH = page number.
return:
AH = attribute.
AL = character.
INT 10h / AH = 09h - write character and attribute at cursor
position.
input:
AL = character to display.
BH = page number.
BL = attribute.
CX = number of times to write character.
input:
AL = character to display.
BH = page number.
CX = number of times to write character.
input:
AL = pixel color
CX = column.
DX = row.
example:
input:
CX = column.
DX = row.
output:
AL = pixel color
input:
AL = character to write.
this functions displays a character on the screen, advancing the
cursor and scrolling the screen as necessary. the printing is
always done to current active page.
example:
input:
AL = write mode:
bit 0: update cursor after writing;
bit 1: string contains attributes.
BH = page number.
BL = attribute if string contains only characters (bit 1 of AL is
zero).
CX = number of characters in string (attributes are not counted).
DL,DH = column, row at which to start writing.
ES:BP points to string to be printed.
example:
mov al, 1
mov bh, 0
mov bl, 0011_1011b
mov cx, msg1end - offset msg1 ; calculate message size.
mov dl, 10
mov dh, 7
push cs
pop es
mov bp, offset msg1
mov ah, 13h
int 10h
jmp msg1end
msg1 db " hello, world! "
msg1end:
input:
BL = write mode:
0: enable intensive colors.
1: enable blinking (not supported by the emulator and windows
command prompt).
BH = 0 (to avoid problems on some adapters).
example:
0 0000 black
1 0001 blue
2 0010 green
3 0011 cyan
4 0100 red
5 0101 magenta
6 0110 brown
7 0111 light gray
8 1000 dark gray
9 1001 light blue
A 1010 light green
B 1011 light cyan
C 1100 light red
D 1101 light magenta
E 1110 yellow
F 1111 white
note:
return:
AX = BIOS equipment list word, actually this call returns the
contents of the word at 0040h:0010h.
input:
AL = number of sectors to read/write (must be nonzero)
CH = cylinder number (0..79).
CL = sector number (1..18).
DH = head number (0..1).
DL = drive number (0..3 , for the emulator it depends on quantity
of FLOPPY_ files).
ES:BX points to data buffer.
return:
CF set on error.
CF clear if successful.
AH = status (0 - if successful).
AL = number of sectors transferred.
Note: each sector has 512 bytes.
return:
AH = BIOS scan code.
AL = ASCII character.
(if a keystroke is present, it is removed from the keyboard buffer).
return:
ZF = 1 if keystroke is not available.
ZF = 0 if keystroke available.
AH = BIOS scan code.
AL = ASCII character.
(if a keystroke is present, it is not removed from the keyboard
buffer).
Usually, the BIOS will try to read sector 1, head 0, track 0 from
drive A: to 0000h:7C00h. The emulator just stops the execution,
to boot from floppy drive select from the menu: 'virtual drive' ->
'boot from floppy'
return:
CX:DX = number of clock ticks since midnight.
AL = midnight counter, advanced each time midnight passes.
notes:
there are approximately 18.20648 clock ticks per second,
and 1800B0h per 24 hours.
AL is not set by the emulator.
INT 21h / AH=1 - read character from standard input, with echo,
result is stored in AL.
if there is no character in the keyboard buffer, the function waits
until any key is pressed.
example:
mov ah, 1
int 21h
example:
mov ah, 2
mov dl, 'a'
int 21h
example:
mov ah, 5
mov dl, 'a'
int 21h
mov ah, 6
mov dl, 'a'
int 21h ; output character.
mov ah, 6
mov dl, 255
int 21h ; get character from keyboard buffer (if
any) or set ZF=1.
example:
mov ah, 7
int 21h
example:
org 100h
mov dx, offset msg
mov ah, 9
int 21h
ret
msg db "hello world $"
INT 21h / AH=0Ah - input of a string to DS:DX, fist byte is buffer
size, second byte is number of chars actually read. this function
does not add '$' in the end of string. to print using INT
21h / AH=9 you must set dollar character at the end of it and
start printing from address DS:DX + 2.
example:
org 100h
mov dx, offset buffer
mov ah, 0ah
int 21h
jmp print
buffer db 10,?, 10 dup(' ')
print:
xor bx, bx
mov bl, buffer[1]
mov buffer[bx+2], '$'
mov dx, offset buffer + 2
mov ah, 9
int 21h
ret
the function does not allow to enter more characters than the
specified buffer size.
see also int21.asm in c:\emu8086\examples
org 100h
mov dx, offset filepath
mov ah, 39h
int 21h
ret
Return:
entry:
CX = file attributes:
example:
org 100h
mov ah, 3ch
mov cx, 0
mov dx, offset filename
mov ah, 3ch
int 21h
jc err
mov handle, ax
jmp k
filename db "myfile.txt", 0
handle dw ?
err:
; ....
k:
ret
Entry:
Return:
example:
org 100h
mov al, 2
mov dx, offset filename
mov ah, 3dh
int 21h
jc err
mov handle, ax
jmp k
filename db "myfile.txt", 0
handle dw ?
err:
; ....
k:
ret
Return:
Entry:
BX = file handle.
CX = number of bytes to read.
DS:DX -> buffer for data.
Return:
Note: data is read beginning at current file position, and the file
position is updated after a successful read the returned AX may
be smaller than the request inCX if a partial read occurred.
entry:
BX = file handle.
CX = number of bytes to write.
DS:DX -> data to write.
return:
Entry:
DS:DX -> ASCIZ filename (no wildcards, but see notes).
return:
Note: DOS does not erase the file's data; it merely becomes
inaccessible because the FAT chain for the file is cleared deleting
a file which is currently open may lead to filesystem corruption.
Entry:
Return:
Notes:
for origins 1 and 2, the pointer may be positioned before the start
of the file; no error is returned in that case, but subsequent
attempts to read or write the file will produce errors. If the new
position is beyond the current end of file, the file will be extended
by the next write (see AH=40h).
example:
org 100h
mov ah, 3ch
mov cx, 0
mov dx, offset filename
mov ah, 3ch
int 21h ; create file...
mov handle, ax
mov al, 0
mov bx, handle
mov cx, 0
mov dx, 7
mov ah, 42h
int 21h ; seek...
filename db "myfile.txt", 0
handle dw ?
data db " hello files! "
data_size=$-offset data
buffer db 4 dup(' ')
Entry:
Return:
Carry is clear if successful
Carry is set on error, AX = error code (0Fh)
Notes:
the returned path does not include a drive and the initial
backslash.
Entry:
Return:
CF clear if successful.
CF set on error, AX = error code.
returns:
if successful: AX=0FFFFh and BX=number of mouse buttons.
if failed: AX=0
example:
mov ax, 0
int 33h
see also: mouse.asm in examples.
example:
mov ax, 1
int 33h
example:
mov ax, 2
int 33h
mov ax, 3
int 33h