WonderWitch/FreyaBIOS/System: Difference between revisions

From WSdev Wiki
Jump to navigationJump to search
No edit summary
Line 122: Line 122:


=== INT $17/AH=$0F - sys_alloc_iram ===
=== INT $17/AH=$0F - sys_alloc_iram ===
* BX = ?
* CX = bytes to allocate
Return:
* AX = near pointer to allocated IRAM block
Pointers to IRAM blocks are always segment (16 byte)-aligned.


=== INT $17/AH=$10 - sys_free_iram ===
=== INT $17/AH=$10 - sys_free_iram ===

Revision as of 16:34, 17 December 2024

The System interrupt provides assorted system-related functionality.

Interrupts

INT $17/AH=$00 - sys_interrupt_set_hook

  • AH = $00
  • AL = Interrupt index
  • DS:BX = Pointer to new vector (read from)
  • DS:DX = Pointer to old vector (written to)

Hook the given interrupt handler and enable the interrupt.

INT $17/AH=$01 - sys_interrupt_reset_hook

  • AH = $01
  • AL = Interrupt index
  • DS:BX = Pointer to old vector (read from)

Unhook the given interrupt handler and disable the interrupt.

INT $17/AH=$02 - sys_wait

  • AH = $02
  • CX = Frames to wait

INT $17/AH=$03 - sys_get_tick_count

  • AH = $03

Return:

  • DX:AX = Number of frames since system start

INT $17/AH=$04 - sys_sleep

INT $17/AH=$05 - sys_set_sleep_time

INT $17/AH=$06 - sys_get_sleep_time

INT $17/AH=$07 - sys_set_awake_key

INT $17/AH=$08 - sys_get_awake_key

INT $17/AH=$09 - sys_set_keepalive_int

INT $17/AH=$0A - sys_get_ownerinfo

  • AH = $0A
  • DS:DX = Output buffer
  • CX = Output buffer size, in bytes

Errata:

  • The FreyaBIOS implementation only works correctly in the "mono" mode. An alternate implementation that supports "color" mode is provided as part of libwwc.

INT $17/AH=$0B - sys_suspend

  • AH = $0B
  • AL = Suspend slot (see below)
  • DS:BX = Pointer to I/O resume table (see below)

Return:

  • AX = 0 if suspend successful, 1 if returning from suspend (via sys_resume).

Makes a copy of the execution state (IRAM, I/O ports, stack) to be restored via sys_resume (see below).

Suspend/resume structure

This structure is stored in SRAM block 3, offset $7E00 (slot 1) and $BF00 (slot 0).

Offset Size Contents
$0000 16384 Copy of RAM area $0000 - $3FFF
$4000 4 Far pointer to I/O resume table (DS:BX), plus 1
$4004 224 Copy of IO ports $00 - $DF
$40E4 2 Value of CX?
$40E6 2 Value of SP?
$40E8 2 Value of SS?

In addition, these SRAM block 3 locations are used:

Offset Contents
$FFEE Resumable status for slot 0 (bit 7 = resumable?, bit ?..0 = ID)
$FFEF Resumable status for slot 1 (bit 7 = resumable?, bit ?..0 = ID)

I/O resume table

Offset Size Contents
$00 2 'IO'
$02 224 Resume configuration for each I/O port

INT $17/AH=$0C - sys_resume

  • AH = $0C
  • AL = Suspend slot?

Resumes execution from an existing suspend slot. Returns to where sys_suspend was last called, but with a different return value.

INT $17/AH=$0D - sys_set_remote

INT $17/AH=$0E - sys_get_remote

INT $17/AH=$0F - sys_alloc_iram

  • BX = ?
  • CX = bytes to allocate

Return:

  • AX = near pointer to allocated IRAM block

Pointers to IRAM blocks are always segment (16 byte)-aligned.

INT $17/AH=$10 - sys_free_iram

INT $17/AH=$11 - sys_get_my_iram

INT $17/AH=$12 - sys_get_version

  • AH = $12

Return:

  • AX = BIOS version
15      bit       0
---- ---- ---- ----
MMMM mmmm pppp pppp
|||| |||| |||| ||||
|||| |||| ++++-++++- Patch version (0-127)
|||| ++++----------- Minor version (0-15)
++++---------------- Major version (0-15)

INT $17/AH=$13 - sys_swap

INT $17/AH=$14 - sys_set_resume

  • AH = $14
  • BL = Resumable flag for slot ?
  • BH = Resumable flag for slot ?

INT $17/AH=$15 - sys_get_resume

  • AH = $15

Return:

  • AL = Resumable flag for slot ?
  • AH = Resumable flag for slot ?