Programming:Keyboard redefinition

From CPCWiki - THE Amstrad CPC encyclopedia!
Revision as of 04:14, 15 January 2014 by Fano (Talk | contribs) (Created page with "<pre> ;simple keyboard module ;no extra functions , just scan and locate a key ;no char buffer , no antibounce, ect... ;SJASM syntax MODULE key ;do a complete key scan and...")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
;simple keyboard module
;no extra functions , just scan and locate a key
;no char buffer , no antibounce, ect...
;SJASM syntax

MODULE key
		
;do a complete key scan and store it at (HL)
;altered : AF - BC - DE

Scan
 push HL
 ld BC,#F782
 out (C),C
 ld BC,#F40e
 ld E,B
 out (C),C
 ld BC,#F6c0
 ld D,B
 out (C),C
 ld C,0 
 out (C),C
 ld BC,#F792
 out (C),C
 ld A,#40
 ld C,#4A
.loop
 ld B,D
 out (C),A
 ld B,E
 ini
 inc A
 cp C
 jr c,.loop
 ld BC,#F782
 out (C),C 
 pop HL
 ret

;check if there is a key is down at (HL);only the first key found is returned
;return carry is a key is down
;return key code in A : key code = (line*8)+bit
;returned code is the same than system
;altered : AF - BC

GetPressed		
 push HL		
 ld C,10.loop_col		
 ld B,8		
 ld A,(HL++).loop_bit		
 rla		jr nc,.pressed		
 djnz .loop_bit				
 dec C		
 jr nz,.loop_col		
 or A ;no key found !		
 pop HL		
 ret
.pressed		
 dec C		
 ld A,9		
 sub C		
 add A	;*2		
 add A	;*4		
 add A	;*8		
 dec B		
 or B	;add bit		
 scf	;key found !		
 pop HL		
 ret	

;check if a key is pressed
;A = key code		
;HL = 10 byte array scanned with Scan function
;return key state in carry
;altered AF - DE - B

IsPressed	
 push HL	
 push AF ; keep bit	
 and %01111000	
 rrca	
 rrca	
 rrca	
 ld E,A	ld D,0
 add HL,DE
;so we get the address
pop AF
;now get the
 and 7
 inc A
 ld B,A
 ld A,(HL)
;get line
.loop
 rra ;get bit in carry
djnz .loop
 ccf	;reverse bit
 pop HL
 ret	

;compute offset and mask for a key
;A = key code
;return offset in C and mask in B
;altered AF - BC

GetMask	
 ld B,A
;get offset	
 and %01111000	
 rrca	
 rrca	
 rrca	
 ld C,A 
;get mask	
 ld A,B	
 and %00000111	
 ld B,A
 ld A,1	
 jr z,.done
.loop	
 add A	
 djnz .loop
.done	
 ld B,A	
 ret	


;erase SHIFT and CONTROL status
;used when that can be a problem , like with IsPressed
;HL = 10 byte array scanned with Scan function
;altered : AF

IgnoreSHITFCTRL		
 push HL	
 inc HL	
 inc HL	
 ld A,(HL)	
 or %10100000	
 ld (HL),A	
 pop HL	
 ret				


 ENDMODULE