llvm-mos-sdk
bios.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2023 Adrian "asie" Siekierka
3  *
4  * Licensed under the Apache License, Version 2.0 with LLVM Exceptions,
5  * See https://github.com/llvm-mos/llvm-mos-sdk/blob/main/LICENSE for license
6  * information.
7  */
8 
9 #ifndef _PCE_CD_BIOS_H_
10 #define _PCE_CD_BIOS_H_
11 
12 #include "types.h"
13 #include <pce.h>
14 #include <stdbool.h>
15 #include <stdint.h>
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
25 typedef enum {
42 
43 typedef enum {
79  PCE_CDB_VRAM = 0xFF
81 
82 typedef enum {
91 
92 typedef enum {
102 
107 
111 __attribute__((noreturn)) void pce_cdb_start(void);
112 
119 
120 typedef enum {
127 
128 typedef enum {
134 
146 
160 
167 
178 __attribute__((noreturn)) void pce_cdb_cd_exec(pce_sector_t sector,
182 
183 typedef enum {
190 
203  uint8_t end_type, pce_sector_t end, uint8_t mode);
204 
205 typedef enum {
211 
222 
229 
236 
243 
244 #define PCE_CDB_SUBQ_TYPE_2CH 0x0
245 #define PCE_CDB_SUBQ_TYPE_4CH 0x4
246 #define PCE_CDB_SUBQ_TYPE_DATA 0x8
247 #define PCE_CDB_SUBQ_TYPE_MASK 0xC
248 #define PCE_CDB_SUBQ_SCMS 0x2
249 #define PCE_CDB_SUBQ_PRE_EMPHASIS 0x1
250 
251 typedef struct pce_cdb_subq_data {
252  uint8_t status; // playback status
253  uint8_t control; // control/mode bits
259 
268 
269 typedef struct pce_cdb_toc_data {
270  union {
271  struct {
272  uint8_t track, track_end, __unused1;
273  };
274  struct {
276  };
277  struct {
279  };
280  };
283 
287  uint8_t track_id);
289  uint8_t track_id);
290 
297 
298 typedef enum {
306  PCE_CDB_SUBCODE_P = 0x80
308 
316 
324 
325 typedef enum {
332 
339 
344 
355  uint16_t address);
356 
368 
380  uint16_t dest, uint16_t length);
381 
393  uint16_t dest, uint16_t length);
394 
395 typedef enum {
403  PCE_CDB_ADPCM_REPEAT = 0x80
405 
417  uint8_t mode);
418 
427 
438  uint8_t divider);
439 
444 
445 typedef enum {
449  ADPCM_BUSY = 0x00FF,
453  ADPCM_STOPPED = 0x0100,
457  ADPCM_BUFFER_UNDER_HALF = 0x0400
459 
466 
474 
481 void pce_cdb_irq_set(uint8_t type, void (*irq_handler)(void));
482 
489 
496 
497 #define PCE_CDB_VDC_BG_WIDTH_32 (0)
498 #define PCE_CDB_VDC_BG_WIDTH_64 (1)
499 #define PCE_CDB_VDC_BG_WIDTH_128 (2)
500 #define PCE_CDB_VDC_BG_HEIGHT_32 (0 << 2)
501 #define PCE_CDB_VDC_BG_HEIGHT_64 (1 << 2)
502 #define PCE_CDB_VDC_BG_SIZE_32_32 \
503  (PCE_CDB_VDC_BG_WIDTH_32 | PCE_CDB_VDC_BG_HEIGHT_32)
504 #define PCE_CDB_VDC_BG_SIZE_64_32 \
505  (PCE_CDB_VDC_BG_WIDTH_64 | PCE_CDB_VDC_BG_HEIGHT_32)
506 #define PCE_CDB_VDC_BG_SIZE_128_32 \
507  (PCE_CDB_VDC_BG_WIDTH_128 | PCE_CDB_VDC_BG_HEIGHT_32)
508 #define PCE_CDB_VDC_BG_SIZE_32_64 \
509  (PCE_CDB_VDC_BG_WIDTH_32 | PCE_CDB_VDC_BG_HEIGHT_64)
510 #define PCE_CDB_VDC_BG_SIZE_64_64 \
511  (PCE_CDB_VDC_BG_WIDTH_64 | PCE_CDB_VDC_BG_HEIGHT_64)
512 #define PCE_CDB_VDC_BG_SIZE_128_64 \
513  (PCE_CDB_VDC_BG_WIDTH_128 | PCE_CDB_VDC_BG_HEIGHT_64)
514 
521 
522 #define PCE_CDB_VDC_CLOCK_5MHZ 0
523 #define PCE_CDB_VDC_CLOCK_7MHZ 1
524 
535  uint8_t height_tiles);
536 
537 #define PCE_CDB_VDC_COPY_1 0
538 #define PCE_CDB_VDC_COPY_32 1
539 #define PCE_CDB_VDC_COPY_64 2
540 #define PCE_CDB_VDC_COPY_128 3
541 
548 
554 
560 
565 
570 
575 
580 
585 
590 
595 
600 
605 
610 
615 
616 #define PCE_CDB_SPR_INDEX ((volatile uint8_t *)0x2216)
617 #define PCE_CDB_SPRITE ((volatile vdc_sprite_t *)0x2217)
618 #define PCE_CDB_SPR_Y ((volatile uint16_t *)0x2217)
619 #define PCE_CDB_SPR_Y_LO ((volatile uint8_t *)0x2217)
620 #define PCE_CDB_SPR_Y_HI ((volatile uint8_t *)0x2218)
621 #define PCE_CDB_SPR_X ((volatile uint16_t *)0x2219)
622 #define PCE_CDB_SPR_X_LO ((volatile uint8_t *)0x2219)
623 #define PCE_CDB_SPR_X_HI ((volatile uint8_t *)0x221A)
624 #define PCE_CDB_SPR_PATTERN ((volatile uint16_t *)0x221B)
625 #define PCE_CDB_SPR_PATTERN_LO ((volatile uint8_t *)0x221B)
626 #define PCE_CDB_SPR_PATTERN_HI ((volatile uint8_t *)0x221C)
627 #define PCE_CDB_SPR_ATTR ((volatile uint16_t *)0x221D)
628 #define PCE_CDB_SPR_ATTR_LO ((volatile uint8_t *)0x221D)
629 #define PCE_CDB_SPR_ATTR_HI ((volatile uint8_t *)0x221E)
630 
631 typedef enum {
640 
647 
654 
659 
664 
671 
678 
685 
693 
701 
706 
711 
716 
721 
726 
731 
736 
741 
752 bool pce_cdb_ram_query(uint8_t *bank_start, uint8_t *bank_size);
753 
758 
766 
771 
779 
791 
803 
804 #ifdef __cplusplus
805 }
806 #endif
807 
808 #endif /* _PCE_CD_BIOS_H_ */
void pce_cdb_vdc_configure_dma(uint8_t value)
Configure VRAM DMA.
struct pce_cdb_toc_data pce_cdb_toc_data_t
uint8_t pce_cdb_cd_scan(void)
Initialize information about the currently inserted CD.
pce_cdb_vdc_vram_dma_flags
Definition: bios.h:631
@ PCE_CDB_VRAM_DMA_DEST_INC
Definition: bios.h:636
@ PCE_CDB_VRAM_DMA_SRC_INC
Definition: bios.h:634
@ PCE_CDB_VRAM_DMA_SRC_DEC
Definition: bios.h:635
@ PCE_CDB_VRAM_DMA_IRQ_SATB_DONE
Definition: bios.h:632
@ PCE_CDB_VRAM_DMA_IRQ_DONE
Definition: bios.h:633
@ PCE_CDB_VRAM_DMA_DEST_DEC
Definition: bios.h:637
@ PCE_CDB_VRAM_DMA_REPEAT_SATB
Definition: bios.h:638
uint8_t pce_cdb_cdda_search(pce_sector_t sector, uint8_t mode)
Search for a CD audio track.
uint8_t pce_cdb_cd_read_toc_lead_out_time(pce_cdb_toc_data_t *buffer)
uint8_t pce_cdb_cd_busy(void)
Check if the CD drive is busy.
pce_cdb_divmod_u16_result_t pce_cdb_divmod_u16(uint16_t a, uint16_t b)
Perform a 16/16 unsigned division/modulo.
uint8_t pce_cdb_bin_to_bcd(uint8_t value)
Convert a binary number to a BCD number.
struct pce_cdb_divmod_u16_result pce_cdb_divmod_u16_result_t
uint8_t pce_cdb_cdda_play(uint8_t start_type, pce_sector_t start, uint8_t end_type, pce_sector_t end, uint8_t mode)
Play CD audio.
bool pce_cdb_cd_read_subcode_bits(uint8_t *buffer)
Read the current CD subcode bits.
void pce_cdb_cd_base(pce_sector_t base, uint8_t mode)
Set the starting sector, used as an offset for future BIOS calls.
pce_cdb_error_code
Definition: bios.h:25
@ PCE_CDB_NOT_DATA_TRACK
Definition: bios.h:34
@ PCE_CDB_INVALID_PARAMETER
Definition: bios.h:37
@ PCE_CDB_SEEK_ERROR
Definition: bios.h:31
@ PCE_CDB_NOT_AUDIO_TRACK
Definition: bios.h:33
@ PCE_CDB_NO_DISC
Definition: bios.h:28
@ PCE_CDB_READ_ERROR
Definition: bios.h:30
@ PCE_CDB_INVALID_COMMAND
Definition: bios.h:35
@ PCE_CDB_HEADER_READ_ERROR
Definition: bios.h:32
@ PCE_CDB_SUCCESS
Definition: bios.h:26
@ PCE_CDB_INVALID_PARAMETER_LIST
Definition: bios.h:39
@ PCE_CDB_INVALID_ADDRESS
Definition: bios.h:36
@ PCE_CDB_NOT_READY
Definition: bios.h:27
@ PCD_CDB_DRIVE_OPEN
Definition: bios.h:29
@ PCE_CDB_END_OF_DISK
Definition: bios.h:38
@ PCE_CDB_NOT_PLAYING_AUDIO
Definition: bios.h:40
pce_cdb_cdda_search_mode
Definition: bios.h:205
@ PCE_CDB_CDDA_SEARCH_PAUSE_BLOCK
Definition: bios.h:206
@ PCE_CDB_CDDA_SEARCH_PLAY_NONBLOCK
Definition: bios.h:209
@ PCE_CDB_CDDA_SEARCH_PLAY_BLOCK
Definition: bios.h:208
@ PCE_CDB_CDDA_SEARCH_PAUSE_NONBLOCK
Definition: bios.h:207
void pce_cdb_fader(uint8_t mode)
Configure the CD unit's audio fader.
void pce_cdb_vdc_irq_scanline_enable(void)
Enable the scanline IRQ.
void pce_cdb_vdc_set_copy(uint8_t mode)
Set the automatic increment for VRAM addresses to a given mode.
void pce_cdb_adpcm_stop(void)
Stop ADPCM playback.
void pce_cdb_vdc_sprite_enable(void)
Enable the sprite layer.
uint8_t pce_cdb_adpcm_read_next_cd(pce_sector_t sector, uint8_t length)
Read ADPCM data from CD to the ADPCM buffer, continuing where the previous pce_cdb_adpcm_read_cd_buff...
uint32_t pce_cdb_mul_u16(uint16_t a, uint16_t b)
Perform a 16x16->32 unsigned multiplication.
uint8_t pce_cdb_cd_read_toc_track_count(pce_cdb_toc_data_t *buffer)
uint8_t pce_cdb_cd_read_toc_track_time(pce_cdb_toc_data_t *buffer, uint8_t track_id)
uint8_t pce_cdb_cdda_pause(void)
Pause CD audio playback.
void pce_cdb_vdc_set_bg_row_copy(void)
Set the automatic increment for VRAM addresses to write one word per background row.
void pce_cdb_vdc_bg_sprite_disable(void)
Disable the background and sprite layer.
uint16_t pce_cdb_cdda_read_sample(uint8_t channel)
Read the currently played CD audio sample.
uint8_t uint16_t uint16_t length
Definition: bios.h:181
uint8_t pce_cdb_adpcm_read_from_cd(pce_sector_t sector, uint8_t length, uint16_t address)
Read ADPCM data from CD to the ADPCM buffer.
uint8_t pce_cdb_sqrt(uint16_t a)
Calculate the square root of a given value.
uint8_t pce_cdb_cd_read(pce_sector_t sector, uint8_t address_type, uint16_t address, uint16_t length)
Read sectors from the CD drive.
void pce_cdb_colors_bg_none(void)
Clear the background palette RAM buffer.
bool pce_cdb_vdc_set_resolution(uint8_t clock, uint8_t width_tiles, uint8_t height_tiles)
Set the video resolution.
int16_t pce_cdb_mul_s8(int8_t a, int8_t b)
Perform an 8x8->16 signed multiplication.
void pce_cdb_vdc_sprite_table_clear(void)
Clear the VRAM sprite table.
void pce_cdb_vdc_sprite_disable(void)
Disable the sprite layer.
void pce_cdb_vdc_sprite_table_put(void)
Put a sprite to the VRAM sprite table.
void pce_cdb_irq_enable(uint8_t mask)
Enable the specified IRQs.
uint8_t pce_cdb_adpcm_stream(pce_sector_t sector, pce_sector_t length, uint8_t divider)
Begin ADPCM sample playback streamed from CD.
void pce_cdb_cd_seek(pce_sector_t sector)
Seek the CD drive to the specified sector.
pce_cdb_divmod_s16_result_t pce_cdb_divmod_s16(int16_t a, int16_t b)
Perform a 16/16 signed division/modulo.
void pce_cdb_vdc_bg_sprite_enable(void)
Enable the background and sprite layer.
pce_cdb_adpcm_status_flags
Definition: bios.h:445
@ ADPCM_STOPPED
The ADPCM controller is not playing audio.
Definition: bios.h:453
@ ADPCM_BUFFER_UNDER_HALF
The ADPCM controller has under 50% of the buffer.
Definition: bios.h:457
@ ADPCM_BUSY
If any of these bits are set, the ADPCM controller is busy.
Definition: bios.h:449
void pce_cdb_vdc_bg_set_size(uint8_t size)
Set the BG size to the specified value.
void pce_cdb_vdc_sprite_table_set_vram_addr(uint16_t address)
Set the VRAM sprite table location.
pce_cdb_subcode
Definition: bios.h:298
@ PCE_CDB_SUBCODE_T
Definition: bios.h:302
@ PCE_CDB_SUBCODE_S
Definition: bios.h:303
@ PCE_CDB_SUBCODE_V
Definition: bios.h:300
@ PCE_CDB_SUBCODE_U
Definition: bios.h:301
@ PCE_CDB_SUBCODE_W
Definition: bios.h:299
@ PCE_CDB_SUBCODE_P
Definition: bios.h:306
@ PCE_CDB_SUBCODE_Q
Definition: bios.h:305
@ PCE_CDB_SUBCODE_R
Definition: bios.h:304
struct pce_cdb_divmod_s16_result pce_cdb_divmod_s16_result_t
uint8_t uint16_t address
Definition: bios.h:180
void pce_cdb_colors_bg_at(void *address, uint8_t count)
Set the location of the background palette RAM buffer.
uint8_t pce_cdb_cd_not_ready(void)
Check if the CD drive is ready.
pce_cdb_address_type
Definition: bios.h:43
@ PCE_CDB_BANK_MPR4
Bank number (uses MPR4).
Definition: bios.h:63
@ PCE_CDB_BANK_MPR2
Bank number (uses MPR2).
Definition: bios.h:55
@ PCE_CDB_BANK_MPR3
Bank number (uses MPR3).
Definition: bios.h:59
@ PCE_CDB_BANK_MPR5
Bank number (uses MPR5).
Definition: bios.h:67
@ PCE_CDB_ADDRESS
An address in the local address space.
Definition: bios.h:51
@ PCE_CDB_ADDRESS_BYTES
An address in the local address space (length specified in bytes).
Definition: bios.h:47
@ PCE_CDB_BANK_MPR6
Bank number (uses MPR6).
Definition: bios.h:71
@ PCE_CDB_VRAM_BYTES
VRAM address (length specified in bytes).
Definition: bios.h:75
@ PCE_CDB_VRAM
VRAM address.
Definition: bios.h:79
uint8_t pce_cdb_adpcm_write_to_ram(uint16_t source, uint8_t dest_type, uint16_t dest, uint16_t length)
Copy ADPCM data from the ADPCM buffer to RAM.
uint8_t pce_cdb_cd_reset(void)
Reset the CD drive.
pce_cdb_fader_mode
Definition: bios.h:325
@ PCE_CDB_FADER_PCM_2_5_SEC
Definition: bios.h:329
@ PCE_CDB_FADER_ADPCM_6_SEC
Definition: bios.h:328
@ PCE_CDB_FADER_NONE
Definition: bios.h:326
@ PCE_CDB_FADER_ADPCM_2_5_SEC
Definition: bios.h:330
@ PCE_CDB_FADER_PCM_6_SEC
Definition: bios.h:327
bool pce_cdb_vram_in_use(void)
Check if VRAM is currently in use by a CD BIOS command.
pce_cdb_base_set_mode
Definition: bios.h:128
@ PCE_CDB_BASE_SET_SECOND
Definition: bios.h:131
@ PCE_CDB_BASE_SET_FIRST
Definition: bios.h:130
@ PCE_CDB_BASE_SET_NONE
Definition: bios.h:132
@ PCE_CDB_BASE_SET_BOTH
Definition: bios.h:129
void pce_cdb_colors_sprite_none(void)
Clear the sprite palette RAM buffer.
uint8_t pce_cdb_adpcm_read_from_ram(uint8_t source_type, uint16_t source, uint16_t dest, uint16_t length)
Copy ADPCM data from RAM to the ADPCM buffer.
void pce_cdb_adpcm_reset(void)
Reset the ADPCM controller.
void pce_cdb_vdc_bg_disable(void)
Disable the background layer.
void pce_cdb_colors_sprite_at(void *address, uint8_t count)
Set the location of the sprite palette RAM buffer.
pcd_cdb_irq_vector
Definition: bios.h:82
@ PCE_CDB_ID_IRQ_VDC
Definition: bios.h:84
@ PCE_CDB_ID_IRQ_TIMER
Definition: bios.h:85
@ PCE_CDB_ID_NMI
Definition: bios.h:86
@ PCE_CDB_ID_HBLANK
Definition: bios.h:87
@ PCE_CDB_ID_SOFT_RESET
Definition: bios.h:89
@ PCE_CDB_ID_VBLANK
Definition: bios.h:88
@ PCE_CDB_ID_IRQ_EXTERNAL
Definition: bios.h:83
void pce_cdb_vdc_irq_scanline_disable(void)
Disable the scanline IRQ.
void pce_cdb_vdc_irq_vblank_enable(void)
Enable the veritcal blank IRQ.
uint8_t pce_cdb_adpcm_play(uint16_t address, uint16_t length, uint8_t divider, uint8_t mode)
Begin ADPCM sample playback from the ADPCM buffer.
uint8_t pce_cdb_adpcm_continue(uint8_t mode)
Continue existing ADPCM sample playback.
void pce_cdb_irq_disable(uint8_t mask)
Disable the specified IRQs.
pcd_cdb_irq_vector_mask
Definition: bios.h:92
@ PCE_CDB_MASK_IRQ_EXTERNAL
Definition: bios.h:93
@ PCE_CDB_MASK_VBLANK
Definition: bios.h:99
@ PCE_CDB_MASK_NMI
Definition: bios.h:96
@ PCE_CDB_MASK_HBLANK_NO_BIOS
Definition: bios.h:98
@ PCE_CDB_MASK_HBLANK
Definition: bios.h:97
@ PCE_CDB_MASK_IRQ_VDC
Definition: bios.h:94
@ PCE_CDB_MASK_VBLANK_NO_BIOS
Definition: bios.h:100
@ PCE_CDB_MASK_IRQ_TIMER
Definition: bios.h:95
uint8_t address_type
Definition: bios.h:179
uint8_t pce_cdb_cd_read_toc_track_sector(pce_cdb_toc_data_t *buffer, uint8_t track_id)
uint8_t pce_cdb_cdda_read_subcode_q(pce_cdb_subq_data_t *buffer)
Read CD audio Subcode Q (timing) data.
bool pce_cdb_ram_query(uint8_t *bank_start, uint8_t *bank_size)
Query for the presence of additional RAM.
void pce_cdb_irq_set(uint8_t type, void(*irq_handler)(void))
Set the IRQ handler for a given interrupt.
uint16_t pce_cdb_version(void)
Get the CD BIOS version.
void pce_cdb_vdc_set_bg_column_copy(void)
Set the automatic increment for VRAM addresses to write one word per background column.
void pce_cdb_vdc_irq_vblank_disable(void)
Disable the veritcal blank IRQ.
void pce_cdb_vdc_vram_write_at(uint16_t addr)
Set the VRAM write address.
uint16_t pce_cdb_mul_u8(uint8_t a, uint8_t b)
Perform an 8x8->16 unsigned multiplication.
uint16_t pce_cdb_adpcm_status(void)
Query the ADPCM status.
pce_cdb_cdda_play_mode
Definition: bios.h:183
@ PCE_CDB_CDDA_PLAY_PREVIOUS
Definition: bios.h:188
@ PCE_CDB_CDDA_PLAY_ONE_SHOT
Definition: bios.h:186
@ PCE_CDB_CDDA_PLAY_NOT_BUSY
Definition: bios.h:187
@ PCE_CDB_CDDA_PLAY_MUTE
Definition: bios.h:184
@ PCE_CDB_CDDA_PLAY_REPEAT
Definition: bios.h:185
void pce_cdb_vdc_irq_scanline_set(uint16_t line)
Set the scanline #, on which the scanline IRQ should be emitted.
bool pce_cdb_colors_read(void)
Queue a color transfer from the VCE to the RAM buffers.
pce_cdb_adpcm_mode
Definition: bios.h:395
@ PCE_CDB_ADPCM_ONE_SHOT
Play ADPCM sample once.
Definition: bios.h:399
@ PCE_CDB_ADPCM_REPEAT
Loop ADPCM sample.
Definition: bios.h:403
void pce_cdb_wait_vblank(void)
Wait for VBlank.
void pce_cdb_vdc_vram_read_at(uint16_t addr)
Set the VRAM read address.
pce_cdb_location_type
Definition: bios.h:120
@ PCE_CDB_LOCATION_TYPE_TRACK
Definition: bios.h:123
@ PCE_CDB_LOCATION_TYPE_TIME
Definition: bios.h:122
@ PCE_CDB_LOCATION_TYPE_SECTOR
Definition: bios.h:121
@ PCE_CDB_LOCATION_TYPE_CURRENT
Definition: bios.h:124
@ PCE_CDB_LOCATION_TYPE_UNTIL_END
Definition: bios.h:125
void pce_cdb_vdc_bg_enable(void)
Enable the background layer.
struct pce_cdb_subq_data pce_cdb_subq_data_t
bool pce_cdb_colors_set(void)
Queue a color transfer from the RAM buffers to the VCE.
uint8_t pce_cdb_bcd_to_bin(uint8_t value)
Convert a BCD number to a binary number.
uint8_t end
Definition: cpm.h:194
char channel
Definition: famitone2.h:31
const void uint16_t uint8_t mode
Definition: memory.h:58
const void uint16_t count
Definition: memory.h:58
::uint32_t uint32_t
Definition: cstdint:23
::uint16_t uint16_t
Definition: cstdint:22
::int8_t int8_t
Definition: cstdint:7
::uint8_t uint8_t
Definition: cstdint:21
::int16_t int16_t
Definition: cstdint:8
unsigned size
Definition: neslib.h:185
Definition: bios.h:707
int16_t quot
Definition: bios.h:708
int16_t rem
Definition: bios.h:709
Definition: bios.h:702
uint16_t quot
Definition: bios.h:703
uint16_t rem
Definition: bios.h:704
Definition: bios.h:251
pce_sector_t total_time
Definition: bios.h:257
uint8_t control
Definition: bios.h:253
pce_sector_t track_time
Definition: bios.h:256
uint8_t status
Definition: bios.h:252
uint8_t index
Definition: bios.h:255
uint8_t track
Definition: bios.h:254
Definition: bios.h:269
uint8_t track
Definition: bios.h:272
uint8_t minute
Definition: bios.h:275
uint8_t md
Definition: bios.h:278
uint8_t hi
Definition: bios.h:278
uint8_t second
Definition: bios.h:275
uint8_t control
Definition: bios.h:281
uint8_t lo
Definition: bios.h:278
uint8_t frame
Definition: bios.h:275
uint8_t track_end
Definition: bios.h:272
Definition: types.h:23
long clock(void)