diff --git a/card10-l0dable/src/display.rs b/card10-l0dable/src/display.rs
index d869ad56592614921cab82e8984451ed69c116e4..4faca355e04b3af37c672a90c83fc35f3df9db53 100644
--- a/card10-l0dable/src/display.rs
+++ b/card10-l0dable/src/display.rs
@@ -75,6 +75,15 @@ pub enum FillStyle {
 
 pub struct Display;
 
+#[repr(u8)]
+pub enum Font {
+    Font8 = disp_font_name_DISP_FONT8 as u8,
+    Font12 = disp_font_name_DISP_FONT12 as u8,
+    Font16 = disp_font_name_DISP_FONT16 as u8,
+    Font20 = disp_font_name_DISP_FONT20 as u8,
+    Font24 = disp_font_name_DISP_FONT24 as u8,
+}
+
 impl Display {
     pub const W: u16 = 160;
     pub const H: u16 = 80;
@@ -107,6 +116,13 @@ impl Display {
         }
     }
 
+    /// s must be 0-terminated
+    pub fn print_adv(&self, font: Font, x: u16, y: u16, s: &[u8], fg: Color, bg: Color) {
+        unsafe {
+            epic_disp_print_adv(font as u8, x, y, s.as_ptr(), fg.0, bg.0);
+        }
+    }
+
     pub fn pixel(&self, x: u16, y: u16, color: Color) {
         unsafe {
             epic_disp_pixel(x, y, color.0);
@@ -186,3 +202,21 @@ macro_rules! display {
          $disp.print($x, $y, s.as_bytes(), $fg, $bg);
     });
 }
+
+/// Requires `card10_alloc::init()` and `extern crate alloc;`
+#[macro_export]
+macro_rules! display_adv {
+    ($disp: expr, $font: tt, $x: expr, $y: expr, $fg: expr, $bg: expr,
+     $fmt: expr) => ({
+         use alloc::format;
+         use card10_l0dable::Font;
+         let s = format!(concat!($fmt, "\0"));
+         $disp.print_adv(Font::$font, $x, $y, s.as_bytes(), $fg, $bg);
+    });
+    ($disp: expr, $font: tt, $x: expr, $y: expr, $fg: expr, $bg: expr,
+     $fmt: expr, $($arg: tt)*) => ({
+         use alloc::format;
+         let s = format!(concat!($fmt, "\0"), $($arg)*);
+         $disp.print_adv(Font::$font, $x, $y, s.as_bytes(), $fg, $bg);
+    });
+}
diff --git a/card10-l0dable/src/lib.rs b/card10-l0dable/src/lib.rs
index bf0bf40148f54a7db98b9395d38fd313b3dbba79..5cdac461a7714fb49ead1ef5516192701fd0b665 100644
--- a/card10-l0dable/src/lib.rs
+++ b/card10-l0dable/src/lib.rs
@@ -3,7 +3,7 @@
 mod os;
 pub use os::*;
 mod display;
-pub use display::{Color, Display, FillStyle, LineStyle};
+pub use display::{Color, Display, Font, FillStyle, LineStyle};
 mod buttons;
 pub mod framebuffer;
 pub use buttons::Buttons;
diff --git a/rkanoid/src/main.rs b/rkanoid/src/main.rs
index 770e9d4ed87c7ae1028c0980990a82d8fd53903e..5139900e5e6c2cf1c3df4ad670078191818f6403 100644
--- a/rkanoid/src/main.rs
+++ b/rkanoid/src/main.rs
@@ -292,10 +292,10 @@ fn game(level: u16, mut score: u32) -> GameResult {
 fn title_screen() {
     let display = Display::open();
     display.clear(Color::red());
-    display!(display, 30, 15, Color::white(), Color::red(), "Rkanoid");
-    display!(display, 30, 30, Color::white(), Color::red(), "in Rust");
-    display!(display, 20, 45, Color::white(), Color::red(), "by Astro");
-    display!(display, Display::W - 2 * Display::FONT_W, Display::H - Display::FONT_H, Color::yellow(), Color::blue(), "Go");
+    display_adv!(display, Font24, Display::W / 2 - 60, 14, Color::white(), Color::red(), "Rkanoid");
+    display_adv!(display, Font20, Display::W / 2 - 49, 40, Color::white(), Color::red(), "in Rust");
+    display_adv!(display, Font16, Display::W / 2 - 44, 64, Color::white(), Color::red(), "by Astro");
+    display!(display, Display::W - 2 * Display::FONT_W, Display::H - Display::FONT_H + 3, Color::yellow(), Color::blue(), "Go");
     display.update();
     while !Buttons::read().right_bottom() {}
 }