; vi:filetype=z80: FB_ADDR equ $4000 ATTR_ADDR equ $5800 ULA_PORT equ $fe START_ROW equ 3 macro PRINTSTR, row, col, str push bc push de ld b, \row ld c, \col call calc_cell_addr ld hl, \str call putstr pop de pop bc endm macro PRINTVAL, row, col, str push bc push de push hl push af ld b, \row ld c, \col call calc_cell_addr ld hl, \str call putstr ld hl, \str call strlen add e ld e, a pop af call putbin8 pop hl pop de pop bc endm main: call init ld hl, FB_ADDR + 25 call draw_logo PRINTSTR START_ROW, 0, str_row0 PRINTSTR START_ROW + 1, 0, str_row1 PRINTSTR START_ROW + 2, 0, str_row2 PRINTSTR START_ROW + 3, 0, str_row3 PRINTSTR START_ROW + 4, 0, str_row4 PRINTSTR START_ROW + 5, 0, str_row5 PRINTSTR START_ROW + 6, 0, str_row6 PRINTSTR START_ROW + 7, 0, str_row7 .mainloop: ld bc, $fefe ; c: port $fe, b: row select $fe xor a .rowloop: push af push bc add START_ROW ld b, a ld c, 17 call calc_cell_addr pop bc in a, (c) call putbin5 rlc b pop af inc a cp $8 jr nz, .rowloop 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 str_row0 asciiz 'ROW0: V C X Z [: ' str_row1 asciiz 'ROW1: G F D S A: ' str_row2 asciiz 'ROW2: T R E W Q: ' str_row3 asciiz 'ROW3: 5 4 3 2 1: ' str_row4 asciiz 'ROW4: 6 7 8 9 0: ' str_row5 asciiz 'ROW5: Y U I O P: ' str_row6 asciiz 'ROW6: H J K L ^: ' str_row7 asciiz 'ROW7: B N M ] \\: ' include glyphs.inc include logo.inc