====== BIOS Functions ====== The Loopy's built-in ROM provides code for common operations such as drawing graphics, playing music, and operating the printer. This page is intended to list and categorize these functions with brief descriptions. Workflows like adding music and graphics to your homebrew game will be their own separate pages. [[https://docs.google.com/spreadsheets/d/1Y0LgEqUD9ecm6lZwzL1_wo04XM952WdqCpiu2WO141Q/edit?gid=172085780#gid=172085780 | This google sheet]] was adapted as the starting point. ===== Uncategorized ===== TODO categorize these ==== BiosDefaultInterrupt ==== Offset: 0x0604 void BiosDefaultInterrupt(void) Default interrupt handler, turns off printer? and halts ==== BiosVdpMode ==== Offset: 0x0668 void BiosVdpMode(uchar controllerScanMode, uchar videoHeight240) Sets VDP controller scanning mode and video height controllerScanMode: bitfield, 1=mouse, 2=gamepad ==== BiosGetSealType ==== Offset: 0x115C uint BiosGetSealType(void) Detect inserted seal cartridge type from sense switches ==== BiosDecompress4bit ==== Offset: 0x437C ??? BiosDecompress4bit(void* decompressInfo, void* output) Decompresses 4-bit graphical data, algo unknown ==== BiosInitSoundTransmission ==== Offset: 0x613C void BiosInitSoundTransmission(void) Initializes sound timer and serial port ==== BiosPlayBgm ==== Offset: 0x61A0 void BiosPlayBgm(void* soundState, uchar unk, ushort trackIndex, void** trackList) Play a music track from a list ==== BiosPlaySfx ==== Offset: 0x61B8 void BiosPlaySfx(void* soundState, uchar unk, ushort sfxIndex, void** sfxList) Play a sound effect from a list ==== BiosUpdateBgm ==== Offset: 0x6238 void BiosUpdateBgm(void* soundState, uint unk) Update music playback (call on timer0 interrupt) Unk param might be maximum data transfer size ==== BiosDma ==== Offset: 0x66D0 void BiosDma(void* dmaList, int hwChannel) Trigger a chain of DMA transfers ==== BiosVsyncIfDma ==== Offset: 0x6A0E void BiosVsyncIfDma(void* dmaList) Only vsyncs if the DMA list is valid ==== BiosVsyncDma ==== Offset: 0x6A48 void BiosVsyncDma(void* dmaList) Calls BiosVsync and BiosDma(param, 3) ==== BiosVsync ==== Offset: 0x6A5A void BiosVsync(void) Wait for vsync, read controller register to memory ==== BiosSoundChannels ==== Offset: 0x6AC0 void BiosSoundChannels(uint channelMode) Sets sound channel configuration mode 0: 4ch, 1: 3ch + rhythm, 2: 3ch, others: 1ch ==== BiosSoundVolume ==== Offset: 0x6B50 void BiosSoundVolume(uint vol23, uint vol4) Sets sound channel volume control volume for ch2/3 and ch4; 0: -4dB, 1: -2dB, 2: 0dB. ch1 always 0dB. ==== BiosSoundDemo ==== Offset: 0x6B86 void BiosSoundDemo(void) Toggles built-in demo music ==== BiosUnknownDecomp? ==== Offset: 0x7D96 ??? BiosUnknownDecomp?(???) Some kind of decompression function ===== Interrupt Handlers ===== ==== BiosAutoUpdateBgm ==== Offset: 0x648C void BiosAutoUpdateBgm(void) Auto call BiosUpdateBgm with pointer at biosAutoSoundState Use as alternative to creating your own interrupt handler. ===== Math Functions ===== ==== BiosColorInverseGray ==== Offset: 0x2D68 ushort BiosColorInverseGray(ushort color) Compute 5bit grayscale from inverse of 15bit RGB Unknown why it's the inverse. Preserves MSB. ==== BiosValueBlendQuarter ==== Offset: 0x2DC6 uchar BiosValueBlendQuarter(uchar valueA, uchar valueB) Blend 3/4 of value A with 1/4 of value B (bytes) ==== BiosColorBlendQuarter ==== Offset: 0x2DE0 ushort BiosColorBlendQuarter(ushort colorA, ushort colorB) Blend 3/4 of color A with 1/4 of color B ==== BiosMulS16 ==== Offset: 0x2E68 int BiosMulS16(short a, short b) Signed 16bit multiply, 32bit result ==== BiosMulU16 ==== Offset: 0x2E72 uint BiosMulU16(ushort a, ushort b) Unsigned 16bit multiply, 32bit result ==== BiosDivU16 ==== Offset: 0x2E7C ushort BiosDivU16(ushort a, ushort b) Unsigned 16bit divide, 16bit result ==== BiosDivS16 ==== Offset: 0x2EA6 short BiosDivS16(short a, short b) Signed 16bit divide, 16bit result ==== BiosDivS32 ==== Offset: 0x2EDE int BiosDivS32(int a, int b) Signed 32bit divide, 32bit result ===== Graphics ===== ==== BiosPlotLines ==== Offset: 0x37A0 void BiosPlotLines(short data[], uchar colors[], uchar buf[], short bufW, short bufH, bool bufFmt) Plots a set of colored vertices joined by lines ==== BiosPlotPolygons? ==== Offset: 0x39AC ??? BiosPlotPolygons?(???) Plots polygons? ===== Internal Use ===== ==== _B_PrintOp1 ==== Offset: 0x06D4 ??? _B_PrintOp1(???) Print operation ==== _B_PlotPointInBuffer ==== Offset: 0x394E ??? _B_PlotPointInBuffer(???) Plots a point following some rules ==== _B_PlotPointSpecial ==== Offset: 0x3C76 ??? _B_PlotPointSpecial(???) Plots a 4bpp point with some special modes? ==== _B_PlayBgmPointer ==== Offset: 0x61D8 void _B_PlayBgmPointer(void* soundState, uchar unk, void* track, void** trackList) Play a music track by pointer ==== _B_PlaySfxPointer ==== Offset: 0x6374 void _B_PlaySfxPointer(void* soundState, uchar unk, void* sfx) Play a sound effect by pointer ===== Not yet analyzed ===== * 0x069C - ? Does something with sensor and printer registers * 0x0FD6 - ? Printing function 1 * 0x101C - ? Printing function 2 * 0x1064 - ? Printing function 3 * 0x10AC - ? Moves some data during print * 0x10F4 - ? Moves some data during print * 0x1140 - ? Moves some data during print * 0x1174 - ? Returns 2 if no seal cartridge inserted * 0x1198 - ? * 0x1248 - ? DMA print data strip to printer driver (internal) * 0x128E - ? * 0x134C - ? Something to do with SFX, init? * 0x13B0 - ? Triggers some unknown IO read * 0x1408 - ? * 0x1464 - ? Does a bit of math * 0x157E - ? Does a bit of math * 0x15D4 - ? Small * 0x15F2 - ? Small * 0x15FE - ? Small * 0x162C - ? * 0x1652 - ? Small * 0x1662 - ? Small * 0x1690 - ? * 0x17F4 - ? * 0x19BC - ? * 0x1A0C - ? * 0x1B76 - ? * 0x1B9C - ? * 0x1C04 - ? Small * 0x1C2C - ? Runs printer motor to reset position? * 0x1CA0 - ? * 0x1CF4 - ? * 0x1DDE - ? Small * 0x1E1C - ? * 0x1F5E - ? * 0x2038 - ? * 0x20EC - ? * 0x212E - ? * 0x2148 - ? * 0x2382 - ? * 0x2598 - ? * 0x2798 - ? * 0x2A24 - ? * 0x2AD0 - ? * 0x2B0E - ? * 0x2B48 - * 0x2F74 - * 0x3088 - * 0x3560 - * 0x35E6 - * 0x36BA - * 0x3736 - * 0x3E64 - * 0x3E9C - * 0x3EF0 - * 0x3F48 - * 0x3FD8 - * 0x40DC - * 0x4186 - * 0x429C - * 0x436A - * 0x445C - * 0x452C - * 0x4640 - * 0x47A4 - * 0x49A4 - * 0x4B20 - * 0x4BA8 - * 0x4C38 - * 0x4CDE - * 0x4D22 - * 0x4E34 - * 0x4FE4 - * 0x5060 - * 0x5098 - * 0x5138 - * 0x51C8 - * 0x542E - * 0x544C - * 0x5474 - * 0x54B8 - * 0x5574 - * 0x55B8 - * 0x55FC -