--- /dev/null
+; vi:filetype=z80:
+ section data,"d"
+
+logo:
+ db $3f,$fe,$fc,$fc,$00,$00,$00
+ db $3f,$fe,$fc,$fc,$00,$00,$00
+ db $3f,$fe,$38,$70,$00,$00,$00
+ db $3c,$1c,$38,$70,$00,$00,$00
+ db $30,$30,$1c,$e0,$00,$00,$00
+ db $00,$74,$1c,$e2,$00,$00,$04
+ db $00,$e4,$8f,$c2,$00,$00,$04
+ db $00,$e9,$00,$44,$00,$24,$08
+ db $01,$ca,$39,$14,$30,$e9,$78
+ db $03,$ce,$45,$27,$49,$4e,$88
+ db $06,$11,$48,$cc,$8a,$48,$98
+ db $0e,$91,$33,$b9,$92,$d8,$b0
+ db $1e,$61,$fc,$de,$6f,$e8,$d0
+ db $3f,$0c,$03,$10,$00,$00,$00
+ db $3f,$fe,$f5,$44,$00,$00,$00
+ db $3f,$fe,$f6,$7c,$00,$00,$00
--- /dev/null
+; vi:filetype=z80:
+ section code,"c"
+
+ include defs.inc
+
+main:
+ call init
+
+ ld hl, FB_ADDR + 25
+ call draw_logo
+ call drawbg
+
+.mainloop:
+ jr .mainloop
+
+init:
+ ; setup attributes
+ ld hl, ATTR_ADDR
+ ld a, $47
+ ld b, 24
+.attry: ld c, 32
+.attrx: ld (hl), a
+ inc hl
+ dec c
+ jr nz, .attrx
+ dec b
+ jr nz, .attry
+
+ ; clear screen
+ ld hl, FB_ADDR
+ xor a
+ ld b, 192
+.clry: ld c, 32
+.clrx: ld (hl), a
+ inc hl
+ dec c
+ jr nz, .clrx
+ dec b
+ jr nz, .clry
+
+ ; set border
+ out (ULA_PORT), a
+
+ ret
+
+; expects X -> c, Y -> b, returns in de
+calc_cell_addr:
+ push af
+ sla b
+ sla b ; change from blocks to pixels
+ sla b
+ ; construct low address byte -> e
+ ld a, b ; start with Y
+ sla a
+ sla a
+ and $e0 ; keep top 3 bits
+ ld e, a ; move into e
+ ld a, c ; a <- X
+ and $1f ; keep low 5 bits
+ or e ; combine with Y bits
+ ld e, a ; move the result back to e
+ ; construct high address byte -> d
+ ld a, b ; start with Y again
+ sra a
+ sra a
+ sra a
+ and $18 ; keep bits 3 and 4
+ ld d, a ; keep it in d
+ ld a, b ; grap Y one more time
+ and $7 ; keep low 3 bits of Y in a
+ or d ; combine with Y6-Y7
+ ld bc, FB_ADDR
+ or b ; combine with high byte of fb address
+ ld d, a ; move result back to d
+ pop af
+ ret
+
+ ; hl: dest
+draw_logo:
+ push hl
+ ld de, logo
+ ld b, 16
+.logoy: ld c, 7
+ push bc
+.logox: ld a, (de)
+ ld (hl), a
+ inc de
+ inc l
+ dec c
+ jr nz, .logox
+ ld bc, 7
+ sbc hl, bc
+ inc h
+
+ ld a, h
+ and $e7
+ ld h, a
+ and $7
+ jr nz, .skipinc
+ ld a, l
+ add $20
+ ld l, a
+.skipinc:
+ pop bc
+ dec b
+ jr nz, .logoy
+ pop hl
+
+ ; attr
+ ld a, h
+ srl a
+ srl a
+ srl a
+ or $58
+ ld h, a
+ ld a, $42
+
+ push hl
+ pop ix
+ ld b, 7
+.sattr: ld (ix), a
+ ld (ix + 32), a
+ inc ix
+ dec b
+ jr nz, .sattr
+ ret
+
+ ; de: dest
+ ; a: char
+putchar:
+ ; is it a digit?
+ sub '0'
+ ret c
+ cp 11
+ jr nc, .notdigit
+ push bc
+ ld bc, glyph_0
+ jr .common
+.notdigit:
+ ; is it A-Z ?
+ sub 'A'-'0'
+ ret c
+ cp 30
+ ret nc
+ push bc
+ ld bc, glyph_a
+.common:
+ push de
+ push hl
+ sla a
+ sla a
+ sla a
+ ld h, 0
+ ld l, a
+ add hl, bc
+ ld c, 8
+.chartop:
+ ld a, (hl)
+ ld (de), a
+ inc d
+ inc hl
+ dec c
+ jr nz, .chartop
+ pop hl
+ pop de
+ pop bc
+ ret
+
+ ; de: dest
+ ; hl: str
+putstr:
+ push de
+ push bc
+.loop: xor a
+ ld b, (hl)
+ cp b
+ jr z, .done
+ ld a, b
+ call putchar
+ inc hl
+ inc e
+ jr .loop
+.done: pop bc
+ pop de
+ ret
+
+ ; de: dest
+ ; a: number
+putbin8:
+ push de
+ push bc
+ ld b, 8
+.loop: rlca
+ push af
+ and 1
+ add '0'
+ call putchar
+ pop af
+ inc e
+ dec b
+ jr nz, .loop
+ pop bc
+ pop de
+ ret
+
+putbin5:
+ push de
+ push bc
+ ld b, 5
+ rlca
+ rlca
+ rlca
+ jr putbin8.loop
+
+ ; hl: string
+ ; return -> a
+strlen:
+ push hl
+ xor a
+ ld b, a
+.loop: cp (hl)
+ jr z, .done
+ inc hl
+ inc b
+ jr .loop
+.done: ld a, b
+ pop hl
+ ret
+
+ include glyphs.inc
+ include logo.inc
+ include tiles.inc