curses banners

2004-03-05 VI A bitmapped font (from a BIOS listing) 8x8 and a minimalist curses based font displayer. You need a relatively big window - say 124x55 to see this well.

2004-10-12 VI Changed to support changes in minimalist curses No more getch or timeout

set fontmap {
    0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7E 0x81 0xA5 0x81 0xBD 0x99
    0x81 0x7E 0x7E 0xFF 0xDB 0xFF 0xC3 0xE7 0xFF 0x7E 0x6C 0xFE 0xFE 0xFE
    0x7C 0x38 0x10 0x00 0x10 0x38 0x7C 0xFE 0x7C 0x38 0x10 0x00 0x38 0x7C
    0x38 0xFE 0xFE 0x92 0x10 0x7C 0x00 0x10 0x38 0x7C 0xFE 0x7C 0x38 0x7C
    0x00 0x00 0x18 0x3C 0x3C 0x18 0x00 0x00 0xFF 0xFF 0xE7 0xC3 0xC3 0xE7
    0xFF 0xFF 0x00 0x3C 0x66 0x42 0x42 0x66 0x3C 0x00 0xFF 0xC3 0x99 0xBD
    0xBD 0x99 0xC3 0xFF 0x0F 0x07 0x0F 0x7D 0xCC 0xCC 0xCC 0x78 0x3C 0x66
    0x66 0x66 0x3C 0x18 0x7E 0x18 0x3F 0x33 0x3F 0x30 0x30 0x70 0xF0 0xE0
    0x7F 0x63 0x7F 0x63 0x63 0x67 0xE6 0xC0 0x99 0x5A 0x3C 0xE7 0xE7 0x3C
    0x5A 0x99 0x80 0xE0 0xF8 0xFE 0xF8 0xE0 0x80 0x00 0x02 0x0E 0x3E 0xFE
    0x3E 0x0E 0x02 0x00 0x18 0x3C 0x7E 0x18 0x18 0x7E 0x3C 0x18 0x66 0x66
    0x66 0x66 0x66 0x00 0x66 0x00 0x7F 0xDB 0xDB 0x7B 0x1B 0x1B 0x1B 0x00
    0x3E 0x63 0x38 0x6C 0x6C 0x38 0x86 0xFC 0x00 0x00 0x00 0x00 0x7E 0x7E
    0x7E 0x00 0x18 0x3C 0x7E 0x18 0x7E 0x3C 0x18 0xFF 0x18 0x3C 0x7E 0x18
    0x18 0x18 0x18 0x00 0x18 0x18 0x18 0x18 0x7E 0x3C 0x18 0x00 0x00 0x18
    0x0C 0xFE 0x0C 0x18 0x00 0x00 0x00 0x30 0x60 0xFE 0x60 0x30 0x00 0x00
    0x00 0x00 0xC0 0xC0 0xC0 0xFE 0x00 0x00 0x00 0x24 0x66 0xFF 0x66 0x24
    0x00 0x00 0x00 0x18 0x3C 0x7E 0xFF 0xFF 0x00 0x00 0x00 0xFF 0xFF 0x7E
    0x3C 0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x18 0x3C
    0x3C 0x18 0x18 0x00 0x18 0x00 0x6C 0x6C 0x6C 0x00 0x00 0x00 0x00 0x00
    0x6C 0x6C 0xFE 0x6C 0xFE 0x6C 0x6C 0x00 0x18 0x7E 0xC0 0x7C 0x06 0xFC
    0x18 0x00 0x00 0xC6 0xCC 0x18 0x30 0x66 0xC6 0x00 0x38 0x6C 0x38 0x76
    0xDC 0xCC 0x76 0x00 0x30 0x30 0x60 0x00 0x00 0x00 0x00 0x00 0x18 0x30
    0x60 0x60 0x60 0x30 0x18 0x00 0x60 0x30 0x18 0x18 0x18 0x30 0x60 0x00
    0x00 0x66 0x3C 0xFF 0x3C 0x66 0x00 0x00 0x00 0x18 0x18 0x7E 0x18 0x18
    0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x18 0x18 0x30 0x00 0x00 0x00 0x7E
    0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x18 0x18 0x00 0x06 0x0C
    0x18 0x30 0x60 0xC0 0x80 0x00 0x7C 0xCE 0xDE 0xF6 0xE6 0xC6 0x7C 0x00
    0x30 0x70 0x30 0x30 0x30 0x30 0xFC 0x00 0x78 0xCC 0x0C 0x38 0x60 0xCC
    0xFC 0x00 0x78 0xCC 0x0C 0x38 0x0C 0xCC 0x78 0x00 0x1C 0x3C 0x6C 0xCC
    0xFE 0x0C 0x1E 0x00 0xFC 0xC0 0xF8 0x0C 0x0C 0xCC 0x78 0x00 0x38 0x60
    0xC0 0xF8 0xCC 0xCC 0x78 0x00 0xFC 0xCC 0x0C 0x18 0x30 0x30 0x30 0x00
    0x78 0xCC 0xCC 0x78 0xCC 0xCC 0x78 0x00 0x78 0xCC 0xCC 0x7C 0x0C 0x18
    0x70 0x00 0x00 0x18 0x18 0x00 0x00 0x18 0x18 0x00 0x00 0x18 0x18 0x00
    0x00 0x18 0x18 0x30 0x18 0x30 0x60 0xC0 0x60 0x30 0x18 0x00 0x00 0x00
    0x7E 0x00 0x7E 0x00 0x00 0x00 0x60 0x30 0x18 0x0C 0x18 0x30 0x60 0x00
    0x3C 0x66 0x0C 0x18 0x18 0x00 0x18 0x00 0x7C 0xC6 0xDE 0xDE 0xDC 0xC0
    0x7C 0x00 0x30 0x78 0xCC 0xCC 0xFC 0xCC 0xCC 0x00 0xFC 0x66 0x66 0x7C
    0x66 0x66 0xFC 0x00 0x3C 0x66 0xC0 0xC0 0xC0 0x66 0x3C 0x00 0xF8 0x6C
    0x66 0x66 0x66 0x6C 0xF8 0x00 0xFE 0x62 0x68 0x78 0x68 0x62 0xFE 0x00
    0xFE 0x62 0x68 0x78 0x68 0x60 0xF0 0x00 0x3C 0x66 0xC0 0xC0 0xCE 0x66
    0x3A 0x00 0xCC 0xCC 0xCC 0xFC 0xCC 0xCC 0xCC 0x00 0x78 0x30 0x30 0x30
    0x30 0x30 0x78 0x00 0x1E 0x0C 0x0C 0x0C 0xCC 0xCC 0x78 0x00 0xE6 0x66
    0x6C 0x78 0x6C 0x66 0xE6 0x00 0xF0 0x60 0x60 0x60 0x62 0x66 0xFE 0x00
    0xC6 0xEE 0xFE 0xFE 0xD6 0xC6 0xC6 0x00 0xC6 0xE6 0xF6 0xDE 0xCE 0xC6
    0xC6 0x00 0x38 0x6C 0xC6 0xC6 0xC6 0x6C 0x38 0x00 0xFC 0x66 0x66 0x7C
    0x60 0x60 0xF0 0x00 0x7C 0xC6 0xC6 0xC6 0xD6 0x7C 0x0E 0x00 0xFC 0x66
    0x66 0x7C 0x6C 0x66 0xE6 0x00 0x7C 0xC6 0xE0 0x78 0x0E 0xC6 0x7C 0x00
    0xFC 0xB4 0x30 0x30 0x30 0x30 0x78 0x00 0xCC 0xCC 0xCC 0xCC 0xCC 0xCC
    0xFC 0x00 0xCC 0xCC 0xCC 0xCC 0xCC 0x78 0x30 0x00 0xC6 0xC6 0xC6 0xC6
    0xD6 0xFE 0x6C 0x00 0xC6 0xC6 0x6C 0x38 0x6C 0xC6 0xC6 0x00 0xCC 0xCC
    0xCC 0x78 0x30 0x30 0x78 0x00 0xFE 0xC6 0x8C 0x18 0x32 0x66 0xFE 0x00
    0x78 0x60 0x60 0x60 0x60 0x60 0x78 0x00 0xC0 0x60 0x30 0x18 0x0C 0x06
    0x02 0x00 0x78 0x18 0x18 0x18 0x18 0x18 0x78 0x00 0x10 0x38 0x6C 0xC6
    0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0x30 0x30
    0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x78 0x0C 0x7C 0xCC 0x76 0x00
    0xE0 0x60 0x60 0x7C 0x66 0x66 0xDC 0x00 0x00 0x00 0x78 0xCC 0xC0 0xCC
    0x78 0x00 0x1C 0x0C 0x0C 0x7C 0xCC 0xCC 0x76 0x00 0x00 0x00 0x78 0xCC
    0xFC 0xC0 0x78 0x00 0x38 0x6C 0x64 0xF0 0x60 0x60 0xF0 0x00 0x00 0x00
    0x76 0xCC 0xCC 0x7C 0x0C 0xF8 0xE0 0x60 0x6C 0x76 0x66 0x66 0xE6 0x00
    0x30 0x00 0x70 0x30 0x30 0x30 0x78 0x00 0x0C 0x00 0x1C 0x0C 0x0C 0xCC
    0xCC 0x78 0xE0 0x60 0x66 0x6C 0x78 0x6C 0xE6 0x00 0x70 0x30 0x30 0x30
    0x30 0x30 0x78 0x00 0x00 0x00 0xCC 0xFE 0xFE 0xD6 0xD6 0x00 0x00 0x00
    0xB8 0xCC 0xCC 0xCC 0xCC 0x00 0x00 0x00 0x78 0xCC 0xCC 0xCC 0x78 0x00
    0x00 0x00 0xDC 0x66 0x66 0x7C 0x60 0xF0 0x00 0x00 0x76 0xCC 0xCC 0x7C
    0x0C 0x1E 0x00 0x00 0xDC 0x76 0x62 0x60 0xF0 0x00 0x00 0x00 0x7C 0xC0
    0x70 0x1C 0xF8 0x00 0x10 0x30 0xFC 0x30 0x30 0x34 0x18 0x00 0x00 0x00
    0xCC 0xCC 0xCC 0xCC 0x76 0x00 0x00 0x00 0xCC 0xCC 0xCC 0x78 0x30 0x00
    0x00 0x00 0xC6 0xC6 0xD6 0xFE 0x6C 0x00 0x00 0x00 0xC6 0x6C 0x38 0x6C
    0xC6 0x00 0x00 0x00 0xCC 0xCC 0xCC 0x7C 0x0C 0xF8 0x00 0x00 0xFC 0x98
    0x30 0x64 0xFC 0x00 0x1C 0x30 0x30 0xE0 0x30 0x30 0x1C 0x00 0x18 0x18
    0x18 0x00 0x18 0x18 0x18 0x00 0xE0 0x30 0x30 0x1C 0x30 0x30 0xE0 0x00
    0x76 0xDC 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x10 0x38 0x6C 0xC6 0xC6
    0xFE 0x00
}

package require curses

proc boxscreen {} {
    set cols [curses info cols]
    set lines [curses info lines]
    curses attr off underline
    curses attr on  reverse

    for {set i 0} {$i < $cols } {incr i} {
        curses move 0 $i
        curses puts " "
        curses move [expr $lines - 1] $i
        curses puts " "
    }
    for {set i 0} {$i < $lines} {incr i} {
        curses move $i 0
        curses puts " "
        curses move $i [expr $cols - 1]
        curses puts " "
    }
}

proc bigstr {str row col} {
    curses attr off reverse
    set reverse 0
    
    set charno 0
    set fo [open debug a]
    foreach char [split $str {}] {
        puts $fo "Char: $char"
        binary scan $char c f
        set index [expr $f * 8]
        puts $fo "Index: $index"
        for {set line 0} {$line < 8} {incr line} {
            set bitline [lindex $::fontmap [expr $index + $line]]
            puts $fo "Bitline: $bitline"
            binary scan [binary format c $bitline] B8 charline
            set cix 0
            foreach c [split $charline {}] {
                if {$c} {
                    curses attr on reverse
                    curses move [expr $row + $line] [expr $col + $charno * 8 + $cix]
                    curses puts " "
                }
                incr cix
            }
        }
        incr charno
    }
    close $fo
}


proc dolow off {
    curses erase
    boxscreen
    for {set i 0} {$i < 6} {incr i} {
        for {set j 0} {$j < 14} {incr j} {
            bigstr [binary format c [expr $off + $i * 14 + $j]] [expr 2 + $i * 8] [expr 2 + $j * 8]
        }
    }
    curses refresh
    read stdin 1
}

fconfigure stdin -buffering none
dolow 0
dolow 44