diff --git a/examples/mode0.rs b/examples/mode0.rs new file mode 100644 index 0000000..5d5dc76 --- /dev/null +++ b/examples/mode0.rs @@ -0,0 +1,28 @@ +#![no_std] +#![no_main] + +use gba::{ + bios::VBlankIntrWait, + mmio::{BG_PALRAM, DISPCNT, DISPSTAT, IE, IME}, + sample_art::decompress_sample_font_to_vram_4bpp, + video::{Color, DisplayControl, DisplayStatus}, + IrqBits, +}; + +gba::panic_handler!(empty_loop); + +#[no_mangle] +pub extern "C" fn main() -> ! { + decompress_sample_font_to_vram_4bpp(); + BG_PALRAM.index(1).write(Color::WHITE); + // TODO: set up the tilemap to look like something interesting + + IME.write(true); + IE.write(IrqBits::new().with_vblank(true)); + DISPSTAT.write(DisplayStatus::new().with_vblank_irq(true)); + + DISPCNT.write(DisplayControl::new().with_bg_mode(0).with_bg0(true)); + loop { + VBlankIntrWait(); + } +} diff --git a/images/CGA8x8thick.s b/images/CGA8x8thick.s new file mode 100644 index 0000000..5525647 --- /dev/null +++ b/images/CGA8x8thick.s @@ -0,0 +1,81 @@ + +@{{BLOCK(CGA8x8thick) + +@======================================================================= +@ +@ CGA8x8thick, 128x128@4, +@ + 256 tiles lz77 compressed +@ Total size: 1684 = 1684 +@ +@ Time-stamp: 2024-05-23, 08:42:27 +@ Exported by Cearn's GBA Image Transmogrifier, v0.8.6 +@ ( http://www.coranac.com/projects/#grit ) +@ +@======================================================================= + + .section .rodata + .align 2 + .global CGA8x8thickTiles @ 1684 bytes +CGA8x8thickTiles: + .word 0x00200010,0xF0000030,0x10059001,0x42011111,0x01060001,0x20101001,0x111E1107,0x01100110 + .word 0x1B101A00,0x73111F10,0x10010011,0x00081019,0x10153000,0x1F109F12,0x10001101,0x03202320 + .word 0x21004F00,0x505110FF,0x00730060,0xF017100F,0x101B701F,0x4760FF33,0x37408A10,0x43F04720 + .word 0xC8701360,0x30FFC500,0x500B309D,0x60B5305E,0x30BF9079,0xCF2420CE,0xF6000001,0x03300000 + .word 0x1A60FE10,0x21FFF330,0x21053113,0x4107211F,0x1145110E,0xDF4B0116,0x01701700,0x50071110 + .word 0x5003405B,0xFE77119F,0x3240B340,0x5D010720,0x46414D50,0xFF007A21,0x07306B11,0x79510320 + .word 0x9B11F730,0xAD31FB10,0x018210FF,0x01981193,0x302111D1,0x015F5186,0xF001FF67,0x38113981 + .word 0xC3217C11,0x58312820,0x41FF5C31,0x50AF6057,0x80C750BB,0x21E360DB,0xFF07408E,0x59023B52 + + .word 0x68110F01,0xA0310370,0x23226D21,0x121650FF,0xF23F510B,0x41E540AF,0x909FC0FC,0xAE22FF9B + .word 0x0370BFF0,0x17803752,0x5BA2DB90,0x12FFA231,0x221BB064,0x207E52C3,0xD0C321CB,0xEFDA4101 + .word 0xBB50E231,0x22108161,0x1166337F,0xFF3C53B4,0x8B63DBB2,0xE3C2B752,0x01F0BBF0,0x031498F0 + .word 0x309F13FF,0x40BB60DA,0xE1AED1C3,0x30D2418F,0x0770FFFB,0x1D232F60,0xCF31DA32,0x6B402F14 + .word 0x24FD3E61,0x32C34345,0x43B8313B,0x101342F7,0x43FF4432,0x6067525B,0x6401F036,0x20F6C117 + .word 0xFF3E728C,0x4C800F60,0x0F34FEB1,0x2B44FE24,0xCA33DCF1,0xF043A1FF,0xE20CA201,0xF0D6B146 + .word 0xD04CD201,0x4271FFE0,0x7B31DF63,0x8033A525,0xC024C815,0xD2FF9F91,0x148B70A0,0x549864C3 + .word 0xF0AE44B2,0xFF27431F,0xCC44BB93,0x4393E131,0xF664BC35,0x3FE01B42,0x447360FF,0x555FC0C3 + + .word 0x82FCA03E,0x55BF50C7,0x3FD0FF8F,0x98711FB0,0x6FF11321,0x0FF00FF0,0xC1FFDFB1,0xF17FD297 + .word 0xB207B2FB,0xE1E7B1AF,0xFF08937F,0xFF41FF60,0x03507C15,0xFF738B63,0x8E56B766,0x35C442FF + .word 0x86C14642,0x478264CB,0xB7DF943B,0xD755FF3F,0x03440597,0xF1240B45,0x87248508,0x06FF0710 + .word 0xF02355B6,0x6736571F,0x377FC0E0,0xFF6050AA,0xDB908F97,0xF7A4DF50,0xBF82A485,0x7FE254A2 + .word 0x30D380FF,0x470F41BF,0x868E5807,0x403F517A,0x8F13FF9F,0xFB183F79,0x1F702457,0x44774097 + .word 0x97FF1F95,0xF1435758,0x910E37BF,0x18FBA13F,0xFFD908BB,0x0043B728,0xDFB03FF0,0x57951F54 + .word 0xD0099FD3,0x535FF1FF,0xA401F0BF,0x5919F05F,0x483B9657,0x3B11FF54,0x5111AF1A,0x13913F91 + .word 0x1FD22F81,0x84FF0397,0x1848295F,0xA19F46A2,0xE8B332BF,0xFFDF8046,0xA04AC3F3,0x3CF03F61 + + .word 0x3F9B8F47,0x01F0B380,0x5A01F0FF,0xF09483FB,0x3807AC20,0x77AB37E3,0x9EA0FF5F,0x20A5FF93 + .word 0x1F366795,0xD84AFFA5,0x97FF5B50,0xA83FE0BF,0x5BFF772B,0x7CBFD2DE,0xFF6166C7,0xEB5AC765 + .word 0x3F28D84C,0xC357BF64,0x9FF20763,0xF408A9FF,0x6A1B3703,0x7303B452,0xB05BF41F,0x425AFF5F + .word 0x0344478D,0xA7C3E3B9,0xC7D364C8,0x13FF5FE0,0x9A07C4D7,0xB03FF145,0x7B1734A4,0xFF7FF1E1 + .word 0xFF7DE3F9,0x047B1F30,0x42E91C0E,0xFFC0E3D3,0xCBA7F3FF,0x7DFF8382,0x6A63AA1D,0xC04BF347 + .word 0x3F72FF5F,0xF8309397,0xAB79DB2C,0xFEA8092E,0x6BFF5F4A,0x806FFC40,0x9933E00F,0xC397514A + .word 0xFFBCF36B,0x9F9407F6,0xCF4C97E3,0x03F18395,0x9FF32069,0x2C3F88FF,0x4E1C3D93,0x2F7F678C + .word 0xA467A75B,0xFF49FF5F,0x1FF06697,0x1FF02FC3,0x7A51FFB2,0x2CFF844D,0x489F7033,0x70A34DC3 + + .word 0x86DFF0F3,0xFF67C99F,0x47681FE0,0x7F99DFF3,0xC07848B5,0x1FD726F5,0x673B30FF,0x7D8F46E3 + .word 0x7BEBFA1F,0x5F877213,0xAF56FF0A,0xA71F6BDC,0x313CFF45,0xD74D8067,0x73FF9F54,0xFBFFA787 + .word 0xF03B834B,0xD11FB01F,0xFF9FFB63,0x438F9FF2,0x1FF0CA7A,0x1FC6DFF2,0x1F626241,0x66BB5AFF + .word 0xBC7BF01E,0x3BAF57DF,0x88E73E57,0x137AFE14,0xCF39BF66,0x324393D0,0xF7A547CE,0x7F017F11 + .word 0xF7D1466D,0x173F3820,0x837B26BE,0x3FF3FFBF,0x7FF28073,0xBFF1009F,0x7FF11FF0,0xF6FFBB96 + .word 0x6B5F7AC3,0x5FD940A7,0x3ADF7BE3,0xFF345CDD,0x736BFBA3,0xDB6EF37A,0x1E7EBEC7,0x8BAE1FF7 + .word 0x8F61F5FF,0xAE21B09F,0x4C2C4FDD,0x80D15FE1,0xBA11FF1F,0xE510D125,0x1BF61449,0xC44C13A0 + .word 0x35FF5350,0x90A2B05B,0x407B7017,0x0D4B0DC0,0x9107F04E,0x10100F40,0x01013407,0xFF07F001 + + .word 0x763C0F30,0x5A17D102,0x0FC0A91C,0x03F0BBFA,0x2FF396FF,0x6017F0E7,0x1A1FE017,0x1D038087 + .word 0x13A0FF07,0x1FF0A3F1,0x5FF08352,0x57205F60,0xC0FF3727,0xF003F05F,0xF077505F,0x87B7B03F + .word 0xFF988997,0xB8C927C0,0x99F21FF1,0x5FF127CA,0x5FF0C4CB,0xD99F81FF,0xF053FCD9,0xF224EC53 + .word 0xF0939CC3,0x7FB0FF7F,0x578057F0,0x6BF11FC0,0x03F08123,0xF6FF5424,0xF0FCE3F8,0x3877423F + .word 0xA03FF0CF,0xFF2720D7,0x7F803FF0,0x3FE01FC0,0x7FE098C7,0xB7C15FC0,0xE23FF0FF,0xD0BFF05F + .word 0xCEBFF17F,0x70DFF053,0xDFF1FF67,0x7FF0BFE1,0x7FF0DFF1,0x77F0A485,0xF1FFDFA0,0xF2D7601F + .word 0xF087F45F,0x93A7F09C,0xFF01F02F,0xBEF00770,0x03F021F0,0x11F00770,0x4DF003B0,0x9C01F0FF + .word 0x6DC50C47,0x907BFFCB,0x6FF98E07,0xC6BEFFB7,0xA3577395,0x3B900790,0x8347724C,0xCEFF473B + + .word 0x716B163F,0x6F9B9EB6,0xC0BFCEB5,0xFF3FF7DB,0xBBE84B79,0x5BFB6769,0x57DD4B98,0xFB268B58 + .word 0x3AFF9DFF,0xB01FF903,0xBC4727DF,0xD0543EBB,0xDF60FF1F,0x3F69AF5B,0x1FBBBE5D,0xA38801F0 + .word 0xB9FFCA6B,0x9A5F9D73,0x51979973,0x5F3C59B7,0xFFFF7E35,0x9C601780,0xA0896695,0x03F06FF3 + .word 0x93F003D2,0x9F80E2FF,0xFA2FEF23,0xD601F01F,0xB701F08B,0x11C5FF8F,0x9D5D1593,0x6F3F433C + .word 0x3ACB17F3,0xFAF84381,0xA4669097,0xF001F018,0x18180001 + .size CGA8x8thickTiles, .-CGA8x8thickTiles + +@}}BLOCK(CGA8x8thick) diff --git a/src/bios.rs b/src/bios.rs index e514f74..d735231 100644 --- a/src/bios.rs +++ b/src/bios.rs @@ -63,3 +63,20 @@ pub fn VBlankIntrWait() { }; ); } + +/// `0x12` TODO: document this more +#[inline] +#[cfg_attr(feature = "on_gba", instruction_set(arm::t32))] +pub unsafe fn LZ77UnCompReadNormalWrite16bit(src: *const u32, dst: *mut u16) { + on_gba_or_unimplemented!( + unsafe { + core::arch::asm! { + "swi #0x12", + inout("r0") src => _, + inout("r1") dst => _, + out("r3") _, + options(preserves_flags), + } + }; + ); +} diff --git a/src/lib.rs b/src/lib.rs index ff05c79..8b077f2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -58,6 +58,7 @@ pub mod mmio; pub mod panic_handlers; pub mod per_project_setup; pub mod per_system_setup; +pub mod sample_art; pub mod video; #[cfg(feature = "critical-section")] diff --git a/src/sample_art.rs b/src/sample_art.rs new file mode 100644 index 0000000..aaaf8a2 --- /dev/null +++ b/src/sample_art.rs @@ -0,0 +1,87 @@ +use crate::{bios::LZ77UnCompReadNormalWrite16bit, mmio::MODE3_VRAM}; + +/// Decompresses the sample font (256 tiles) into VRAM. +pub fn decompress_sample_font_to_vram_4bpp() { + // TODO: we should allow inputting *where* in VRAM the tiles go, instead of + // always using the VRAM base address. + unsafe { + LZ77UnCompReadNormalWrite16bit( + CGA_8X8_THICK_LZ77.as_ptr(), + MODE3_VRAM.as_usize() as *mut u16, + ) + } +} + +static CGA_8X8_THICK_LZ77: [u32; 421] = [ + 0x00200010, 0xF0000030, 0x10059001, 0x42011111, 0x01060001, 0x20101001, + 0x111E1107, 0x01100110, 0x1B101A00, 0x73111F10, 0x10010011, 0x00081019, + 0x10153000, 0x1F109F12, 0x10001101, 0x03202320, 0x21004F00, 0x505110FF, + 0x00730060, 0xF017100F, 0x101B701F, 0x4760FF33, 0x37408A10, 0x43F04720, + 0xC8701360, 0x30FFC500, 0x500B309D, 0x60B5305E, 0x30BF9079, 0xCF2420CE, + 0xF6000001, 0x03300000, 0x1A60FE10, 0x21FFF330, 0x21053113, 0x4107211F, + 0x1145110E, 0xDF4B0116, 0x01701700, 0x50071110, 0x5003405B, 0xFE77119F, + 0x3240B340, 0x5D010720, 0x46414D50, 0xFF007A21, 0x07306B11, 0x79510320, + 0x9B11F730, 0xAD31FB10, 0x018210FF, 0x01981193, 0x302111D1, 0x015F5186, + 0xF001FF67, 0x38113981, 0xC3217C11, 0x58312820, 0x41FF5C31, 0x50AF6057, + 0x80C750BB, 0x21E360DB, 0xFF07408E, 0x59023B52, 0x68110F01, 0xA0310370, + 0x23226D21, 0x121650FF, 0xF23F510B, 0x41E540AF, 0x909FC0FC, 0xAE22FF9B, + 0x0370BFF0, 0x17803752, 0x5BA2DB90, 0x12FFA231, 0x221BB064, 0x207E52C3, + 0xD0C321CB, 0xEFDA4101, 0xBB50E231, 0x22108161, 0x1166337F, 0xFF3C53B4, + 0x8B63DBB2, 0xE3C2B752, 0x01F0BBF0, 0x031498F0, 0x309F13FF, 0x40BB60DA, + 0xE1AED1C3, 0x30D2418F, 0x0770FFFB, 0x1D232F60, 0xCF31DA32, 0x6B402F14, + 0x24FD3E61, 0x32C34345, 0x43B8313B, 0x101342F7, 0x43FF4432, 0x6067525B, + 0x6401F036, 0x20F6C117, 0xFF3E728C, 0x4C800F60, 0x0F34FEB1, 0x2B44FE24, + 0xCA33DCF1, 0xF043A1FF, 0xE20CA201, 0xF0D6B146, 0xD04CD201, 0x4271FFE0, + 0x7B31DF63, 0x8033A525, 0xC024C815, 0xD2FF9F91, 0x148B70A0, 0x549864C3, + 0xF0AE44B2, 0xFF27431F, 0xCC44BB93, 0x4393E131, 0xF664BC35, 0x3FE01B42, + 0x447360FF, 0x555FC0C3, 0x82FCA03E, 0x55BF50C7, 0x3FD0FF8F, 0x98711FB0, + 0x6FF11321, 0x0FF00FF0, 0xC1FFDFB1, 0xF17FD297, 0xB207B2FB, 0xE1E7B1AF, + 0xFF08937F, 0xFF41FF60, 0x03507C15, 0xFF738B63, 0x8E56B766, 0x35C442FF, + 0x86C14642, 0x478264CB, 0xB7DF943B, 0xD755FF3F, 0x03440597, 0xF1240B45, + 0x87248508, 0x06FF0710, 0xF02355B6, 0x6736571F, 0x377FC0E0, 0xFF6050AA, + 0xDB908F97, 0xF7A4DF50, 0xBF82A485, 0x7FE254A2, 0x30D380FF, 0x470F41BF, + 0x868E5807, 0x403F517A, 0x8F13FF9F, 0xFB183F79, 0x1F702457, 0x44774097, + 0x97FF1F95, 0xF1435758, 0x910E37BF, 0x18FBA13F, 0xFFD908BB, 0x0043B728, + 0xDFB03FF0, 0x57951F54, 0xD0099FD3, 0x535FF1FF, 0xA401F0BF, 0x5919F05F, + 0x483B9657, 0x3B11FF54, 0x5111AF1A, 0x13913F91, 0x1FD22F81, 0x84FF0397, + 0x1848295F, 0xA19F46A2, 0xE8B332BF, 0xFFDF8046, 0xA04AC3F3, 0x3CF03F61, + 0x3F9B8F47, 0x01F0B380, 0x5A01F0FF, 0xF09483FB, 0x3807AC20, 0x77AB37E3, + 0x9EA0FF5F, 0x20A5FF93, 0x1F366795, 0xD84AFFA5, 0x97FF5B50, 0xA83FE0BF, + 0x5BFF772B, 0x7CBFD2DE, 0xFF6166C7, 0xEB5AC765, 0x3F28D84C, 0xC357BF64, + 0x9FF20763, 0xF408A9FF, 0x6A1B3703, 0x7303B452, 0xB05BF41F, 0x425AFF5F, + 0x0344478D, 0xA7C3E3B9, 0xC7D364C8, 0x13FF5FE0, 0x9A07C4D7, 0xB03FF145, + 0x7B1734A4, 0xFF7FF1E1, 0xFF7DE3F9, 0x047B1F30, 0x42E91C0E, 0xFFC0E3D3, + 0xCBA7F3FF, 0x7DFF8382, 0x6A63AA1D, 0xC04BF347, 0x3F72FF5F, 0xF8309397, + 0xAB79DB2C, 0xFEA8092E, 0x6BFF5F4A, 0x806FFC40, 0x9933E00F, 0xC397514A, + 0xFFBCF36B, 0x9F9407F6, 0xCF4C97E3, 0x03F18395, 0x9FF32069, 0x2C3F88FF, + 0x4E1C3D93, 0x2F7F678C, 0xA467A75B, 0xFF49FF5F, 0x1FF06697, 0x1FF02FC3, + 0x7A51FFB2, 0x2CFF844D, 0x489F7033, 0x70A34DC3, 0x86DFF0F3, 0xFF67C99F, + 0x47681FE0, 0x7F99DFF3, 0xC07848B5, 0x1FD726F5, 0x673B30FF, 0x7D8F46E3, + 0x7BEBFA1F, 0x5F877213, 0xAF56FF0A, 0xA71F6BDC, 0x313CFF45, 0xD74D8067, + 0x73FF9F54, 0xFBFFA787, 0xF03B834B, 0xD11FB01F, 0xFF9FFB63, 0x438F9FF2, + 0x1FF0CA7A, 0x1FC6DFF2, 0x1F626241, 0x66BB5AFF, 0xBC7BF01E, 0x3BAF57DF, + 0x88E73E57, 0x137AFE14, 0xCF39BF66, 0x324393D0, 0xF7A547CE, 0x7F017F11, + 0xF7D1466D, 0x173F3820, 0x837B26BE, 0x3FF3FFBF, 0x7FF28073, 0xBFF1009F, + 0x7FF11FF0, 0xF6FFBB96, 0x6B5F7AC3, 0x5FD940A7, 0x3ADF7BE3, 0xFF345CDD, + 0x736BFBA3, 0xDB6EF37A, 0x1E7EBEC7, 0x8BAE1FF7, 0x8F61F5FF, 0xAE21B09F, + 0x4C2C4FDD, 0x80D15FE1, 0xBA11FF1F, 0xE510D125, 0x1BF61449, 0xC44C13A0, + 0x35FF5350, 0x90A2B05B, 0x407B7017, 0x0D4B0DC0, 0x9107F04E, 0x10100F40, + 0x01013407, 0xFF07F001, 0x763C0F30, 0x5A17D102, 0x0FC0A91C, 0x03F0BBFA, + 0x2FF396FF, 0x6017F0E7, 0x1A1FE017, 0x1D038087, 0x13A0FF07, 0x1FF0A3F1, + 0x5FF08352, 0x57205F60, 0xC0FF3727, 0xF003F05F, 0xF077505F, 0x87B7B03F, + 0xFF988997, 0xB8C927C0, 0x99F21FF1, 0x5FF127CA, 0x5FF0C4CB, 0xD99F81FF, + 0xF053FCD9, 0xF224EC53, 0xF0939CC3, 0x7FB0FF7F, 0x578057F0, 0x6BF11FC0, + 0x03F08123, 0xF6FF5424, 0xF0FCE3F8, 0x3877423F, 0xA03FF0CF, 0xFF2720D7, + 0x7F803FF0, 0x3FE01FC0, 0x7FE098C7, 0xB7C15FC0, 0xE23FF0FF, 0xD0BFF05F, + 0xCEBFF17F, 0x70DFF053, 0xDFF1FF67, 0x7FF0BFE1, 0x7FF0DFF1, 0x77F0A485, + 0xF1FFDFA0, 0xF2D7601F, 0xF087F45F, 0x93A7F09C, 0xFF01F02F, 0xBEF00770, + 0x03F021F0, 0x11F00770, 0x4DF003B0, 0x9C01F0FF, 0x6DC50C47, 0x907BFFCB, + 0x6FF98E07, 0xC6BEFFB7, 0xA3577395, 0x3B900790, 0x8347724C, 0xCEFF473B, + 0x716B163F, 0x6F9B9EB6, 0xC0BFCEB5, 0xFF3FF7DB, 0xBBE84B79, 0x5BFB6769, + 0x57DD4B98, 0xFB268B58, 0x3AFF9DFF, 0xB01FF903, 0xBC4727DF, 0xD0543EBB, + 0xDF60FF1F, 0x3F69AF5B, 0x1FBBBE5D, 0xA38801F0, 0xB9FFCA6B, 0x9A5F9D73, + 0x51979973, 0x5F3C59B7, 0xFFFF7E35, 0x9C601780, 0xA0896695, 0x03F06FF3, + 0x93F003D2, 0x9F80E2FF, 0xFA2FEF23, 0xD601F01F, 0xB701F08B, 0x11C5FF8F, + 0x9D5D1593, 0x6F3F433C, 0x3ACB17F3, 0xFAF84381, 0xA4669097, 0xF001F018, + 0x18180001, +];