fixed bug in printing routine
[urasm.git] / libs / winstick.src / winstick.zas
blob0c6aec99669af614efe953ea456edbc35b1ef0ff
1   MODULE WinStick
3 joystate: DEFB 0
4 ; win_joycount is the "stick repeat counter"
5 ; (used to acceleration)
6 joycount: DEFB 0
8 ; bit 0: kempston joystick is present
9 kempston_here: DEFB 0
11 chan_port_table:
12   DEFW #F7FE
13   DEFW #FBFE
14   DEFW #FDFE
15   DEFW #FEFE
16   DEFW #EFFE
17   DEFW #DFFE
18   DEFW #BFFE
19   DEFW #7FFE
20   DEFW #001F
22 keystick_table:
23   ; left,right,up,down,fire
24   DEFB #29,#28,#08,#10,#38   ; "o","p","q","a","spc"
25   DEFB #04,#22,#23,#24,#20   ; "5","8","7","6","0" -- cursor joystick
26   DEFB #FF,#FF,#FF,#FF,#FF
27   DEFB #24,#23,#21,#22,#20   ; "6","7","9","8","0" -- sinclair joystick
28   DEFB #41,#40,#43,#42,#44   ; kempston joystick
29   DEFB #FF,#FF,#FF,#FF,#FF
31 ; keyboard layout:
32 ; #00-#04: 12345
33 ; #08-#0C: qwert
34 ; #10-#14: asdfg
35 ; #18-#1C: Czxcv
36 ; #20-#24: 09876
37 ; #28-#2C: poiuy
38 ; #30-#34: Elkjh
39 ; #38-#3C: BSmnb
40 ; #40-#44: kempston: right,left,down,up,fire
42 ; in:
43 ;   HL: ptr to channel info (keystick_table)
44 ; out:
45 ;   AF,DE,B: destroyed
46 ;   HL: ptr to next channel info
47 ;   A, C: state (LRUDF; F is #01)
48 ;   Z is set if nothing's pressed
49 readStick:
50   LD    BC,#0500   ; 5 "keys" per channel
51 .stick_loop:
52   LD    A,(HL)
53   RRA
54   RRA
55   AND   #1E
56   LD    E,A
57   LD    D,#00
58   LD    A,(HL)
59   INC   HL
60   PUSH  HL
61   LD    HL,chan_port_table
62   ADD   HL,DE
63   LD    D,A
64   PUSH  BC
65   LD    C,(HL)
66   INC   HL
67   LD    B,(HL)
68   IN    A,(C)
69   INC   B
70   DEC   B
71   JR    Z,.kempston
72   CPL         ; keyboard: inverse bits
73 .kempston:
74   LD    E,A
75   POP   BC
76   POP   HL
77   LD    A,D
78   AND   #07
79   JR    Z,.stick_2
80 .stick_1:
81   RR    E
82   DEC   A
83   JR    NZ,.stick_1
84 .stick_2:
85   RR    E
86   RL    C
87   DJNZ  .stick_loop
88   LD    A,C
89   OR    A
90   RET
93 ; in:
94 ; out:
95 ;   HL,AF,DE,B: destroyed
96 ;   C,A: state (LRUDF; F is #01)
97 ;   Z is set if nothing's pressed
98 readMoves:
99   LD    HL,keystick_table
100 .readloop:
101   LD    A,(HL)
102   INC   A
103   RET   Z  ; exit on #FF
104   CALL  readStick
105   JR    Z,.readloop
106   RET
109   ENDMODULE