dsforth: moved 8x8 printer to separate include (and made it configurable); added...
[urasm.git] / samples / readkeys.zas
blobefb44f84ef5aeb3ec3d4775bf36a837450c9eae9
1 ; returns result in C
2 ;   bit 0: fire
3 ;   bit 1: down
4 ;   bit 2: up
5 ;   bit 3: right
6 ;   bit 4: left
7 ; B is 0
8 ; dead: A, HL, DE
9 ReadKeys:
10   ld   hl,keytab
11   ld   bc,#0500
12 .loop:
13   ; 2*rownum
14   ld   a,(hl)
15   rra
16   rra
17   and  #1E
18   ld   e,a
19   ld   d,0
20   ld   a,(hl)
21   ; save place in keytab
22   inc  hl
23   push hl
24   ; index port address
25   ld   hl,.keyadd
26   add  hl,de
27   ld   d,a
28   push bc
29   ; read port and flip bits if not kempston
30   ld   c,(hl)
31   inc  hl
32   ld   b,(hl)
33   in   a,(c)
34   inc  b
35   dec  b
36   jr   z,$+3  ; skip next instruction
37   cpl
38   ld   e,a
39   ; restore regs
40   pop  bc
41   pop  hl
42   ; rotate E, moving required bit to bit 0
43   ld   a,d
44   and  #07
45   jr   z,.norot
46 .rotloop:
47   rr   e
48   dec  a
49   jr   nz,.rotloop
50   ; put bit into C
51 .norot:
52   rr   e
53   rl   c
54   djnz .loop
55   ret
56 ; port addresses
57 .keyadd:
58   defw #F7FE,#FBFE,#FDFE,#FEFE
59   defw #EFFE,#DFFE,#BFFE,#7FFE
60   defw #001F  ; kempston
62 ; keys: 1/2 of row number + keypos from edge
63 keytab:
64   defb 5*8+1  ; O
65   defb 5*8+1  ; P
66   defb 2*8+1  ; S
67   defb 3*8+2  ; X
68   defb 7*8+0  ; space
70 keykempston:
71   defb 8*8+1
72   defb 8*8+0
73   defb 8*8+3
74   defb 8*8+2
75   defb 8*8+4
77   ;defb 5*8+0  ; P
78   ;defb 5*8+1  ; O
79   ;defb 1*8+0  ; Q
80   ;defb 0*8+3  ; 4