X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=zxkeybtest;a=blobdiff_plain;f=zxkeybtest.asm;fp=zxkeybtest.asm;h=55d1bfe3eae262b91b02913fd0e635d88d9b2d38;hp=0000000000000000000000000000000000000000;hb=0021a95a3d4a7e5ed04da043d8503fe39f142067;hpb=4ecc5df01ba5c77c1aa89429ae93fc4facb4c98f diff --git a/zxkeybtest.asm b/zxkeybtest.asm new file mode 100644 index 0000000..55d1bfe --- /dev/null +++ b/zxkeybtest.asm @@ -0,0 +1,303 @@ +; 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