-name = testrom
+name = zxkeybtest
src = $(wildcard *.asm)
obj = $(src:.asm=.o)
bin = $(name).bin
%.o: %.asm
$(AS) -o $@ $(ASFLAGS) -L $*.lst $< >/dev/null
-testrom.o: testrom.asm glyphs.inc logo.inc
+zxkeybtest.o: zxkeybtest.asm glyphs.inc logo.inc
.PHONY: clean
clean:
+++ /dev/null
-; 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
--- /dev/null
+; 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