; vi:filetype=z80:
-fb_addr equ $4000
-attr_addr equ $5800
-ula_port equ $fe
+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
+ ld hl, FB_ADDR + 25
call draw_logo
- ld c, 4
- ld b, 12
- call calc_cell_addr
- ld hl, str_foobar
- call putstr
+ 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
-.looptop:
- jr .looptop
+.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 hl, ATTR_ADDR
ld a, $47
ld b, 24
.attry: ld c, 32
jr nz, .attry
; clear screen
- ld hl, fb_addr
+ ld hl, FB_ADDR
xor a
ld b, 192
.clry: ld c, 32
jr nz, .clry
; set border
- out (ula_port), a
+ out (ULA_PORT), a
ret
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
+ ld bc, FB_ADDR
or b ; combine with high byte of fb address
ld d, a ; move result back to d
pop af
; hl: dest
draw_logo:
+ push hl
ld de, logo
ld b, 16
.logoy: ld c, 7
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?
- ld bc, glyph_0
sub '0'
ret c
- cp 10
- jr c, .common
+ cp 11
+ jr nc, .notdigit
+ push bc
+ ld bc, glyph_0
+ jr .common
+.notdigit:
; is it A-Z ?
sub 'A'-'0'
ret c
- cp 27
+ cp 30
ret nc
+ push bc
ld bc, glyph_a
.common:
push de
jr nz, .chartop
pop hl
pop de
+ pop bc
ret
; de: dest
; hl: str
putstr:
- xor a
+ push de
+ push bc
+.loop: xor a
ld b, (hl)
cp b
jr z, .done
ld a, b
call putchar
inc hl
- inc de
- jr putstr
-.done: ret
+ 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_foobar asciiz 'FOOBAR 1234567890'
+
+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