En mi proyecto PSGed, estoy con la parte del control del ratón, y he utilizado las rutinas de Ramones de un tutorial publicado en Konamito (si estas por estos foros: Muchas Gracias!!!, me han sido muy útiles
)
Mirando el código he extraído las funciones checkmouse y mouseread, junto a otras rutinas y constantes utilizadas por estas. Mi intención es adaptarlas para que se puedan compilar desde SDCC, y llamarlas desde C, pero no se como hacerlo. Se como añadir pequeñas rutinas (Inline Assembler), pero estas son un poco complejas, ya que checkmouse llama a rutinas de mouseread, ambas usan constantes, etc...
Ahora mismo lo que he hecho, es compilarlo en la dirección hBE00, y lo añado en el fichero ROM que consigo al compilar el programa en C (es de 32k). En C, hago las llamadas a las funciones de Ramones. Me funciona perfectamente, pero pierdo mucho tiempo, cada vez que quiero probar, el tener que incluir el fichero. Otra razón, es para poder crear un source (o lib) reutilizable, para el que lo necesite en sus aplicaciones.
y después de exponer el caso, mi pregunta es:
Como puedo hacerlo directamente con SDCC?
Nota: He mirado en la manual y creo que se habla del tema en el punto 3.14.3, pero no acabo de entender el funcionamiento.
Alguien tiene alguna experiencia en esto?
Gracias!
; -------------------------------
; *** MOUSE SUBROUTINES ***
; * (c) Ramones 2007 *
; -------------------------------
GTPAD equ 00DBh
GTTRIG equ 00D8h
initmem equ 0E000h
mouse equ initmem
mousex equ mouse+1
mousey equ mousex+1
mousebutton1 equ mousey+1
mousebutton2 equ mousebutton1+1
msxmodel equ mousebutton2+1
; -------------------------------
; CHECKMOUSE
; comprueba si hay un mouse
; conectado en alguno de los
; puertos
; Llamar en varias interrupciones
; -------------------------------
checkmouse:
ld a,1
ld [mouse],a
ld b,12
call mousereaddir
ld a,[mousex]
cp 1
ret nz
ld a,[mousey]
cp 1
ret nz
ld a,2
ld [mouse],a
ld b,16
call mousereaddir
ld a,[mousex]
cp 1
ret nz
ld a,[mousey]
cp 1
ret nz
xor a
ld [mouse],a
ret
; -----------------
; MOUSEREAD
; Lectura del raton
; -----------------
mouseread:
xor a
ld [mousex],a
ld [mousey],a
ld [mousebutton1],a
ld [mousebutton2],a
ld a,[mouse]
or a
ret z
ld b,12
cp 1
jr z,mouseread0
ld b,16
mouseread0:
call mousereaddir
ld a,[mouse]
jp mousereadbutton
mousereaddir:
ld a,b
push bc
call gtpadown ; Primera (Request)
pop bc
inc b
ld a,b
push bc
call gtpadown ; X
ld [mousex],a
pop bc
inc b
ld a,b
call gtpadown ; Y
ld [mousey],a
ret
mousereadbutton:
push af
call GTTRIG
ld [mousebutton1],a
pop af
inc a
inc a
call GTTRIG
ld [mousebutton2],a
ret
; ------------------------
; GTPADOWN
; Llama a gtpad bios
; o gtpadown segun sistema
; -------------------------
gtpadown:
ld b,a
ld a,[msxmodel]
or a
ld a,b
jr z,gtpadmsx1
jp GTPAD
; ------------------------
; GTPADMSX1
; Rutina GTPAD con SOLO
; Raton para MSX1
; (que no contiene en BIOS)
; A: 12,13 14 para port 1
; A: 16,17,18 para port 2
; -------------------------
gtpadmsx1:
ld b,a
cp 12
ld a,0FFh
ret c
ld a,b
ld e,#0f
ld bc,#00bf
ld hl,#10ef
cp #0c
jr z,gtpadmsx1_348C
ld bc,#40ff
ld hl,#20df
cp #10
jr z,gtpadmsx1_348C
and #03
sub #02
ld a,[#fafe]
ret m
ld a,[#fb00]
ret z
xor a
ret
gtpadmsx1_348C:
di
call gtpadmsx1_3502
call gtpadmsx1_351D
push af
call gtpadmsx1_3508
call gtpadmsx1_3514
push af
call gtpadmsx1_3502
call gtpadmsx1_351A
push af
call gtpadmsx1_3508
call gtpadmsx1_351A
push af
call gtpadmsx1_3502
call gtpadmsx1_351A
push af
call gtpadmsx1_3508
call gtpadmsx1_3514
push af
call gtpadmsx1_3502
call gtpadmsx1_352D
call gtpadmsx1_3508
call gtpadmsx1_352D
call gtpadmsx1_3502
ei
pop af
pop hl
pop de
pop bc
xor #08
sub #02
cp #0d
jr c,gtpadmsx1_34E0
pop af
call gtpadmsx1_34FA
ld [#fb00],a
pop af
call gtpadmsx1_34FA
jr gtpadmsx1_34F4
gtpadmsx1_34E0:
ld a,d
add a,a
add a,a
add a,a
add a,a
or h
neg
ld [#fb00],a
pop af
pop de
add a,a
add a,a
add a,a
add a,a
or b
neg
gtpadmsx1_34F4:
ld [#fafe],a
ld a,#ff
ret
gtpadmsx1_34FA:
xor #08
bit 3,a
ret z
or #f0
ret
gtpadmsx1_3502:
call gtpadmsx1_3525
and l
jr gtpadmsx1_350C
gtpadmsx1_3508:
call gtpadmsx1_3525
or h
gtpadmsx1_350C:
push af
ld a,e
out [#a0],a
pop af
out [#a1],a
ret
gtpadmsx1_3514:
call gtpadmsx1_352D
call gtpadmsx1_352D
gtpadmsx1_351A:
call gtpadmsx1_352D
gtpadmsx1_351D:
ld a,#0e
call gtpadmsx1_3526
and #0f
ret
gtpadmsx1_3525:
ld a,e
gtpadmsx1_3526:
out [#a0],a
in a,[#a2]
and c
or b
ret
gtpadmsx1_352D:
ex [sp],hl
ex [sp],hl
ex [sp],hl
ex [sp],hl
ret