Karoshi MSX Community
05 de Julio de 2021, 12:59:48 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Rutinas de ratón, de Ramones, en SDCC  (Leído 4593 veces)
0 Usuarios y 1 Visitante están viendo este tema.
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« : 05 de Mayo de 2010, 08:08:59 am »

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  Smiley )

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!
Código:
; -------------------------------
; *** 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

En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
andrear1979
Karoshi Newbie
*
Mensajes: 13



WWW Email
« Respuesta #1 : 12 de Mayo de 2010, 07:20:07 pm »

Aorante, pido disculpas si envio algo incompleto y ***no he comprobado nada!!!***, pero no he podido trabajarlo lo suficiente... por favor considere esto como una sugerencia para empezar, y nada más.

Adapté la sintaxis al ensemblador de SDCC (sdasz80); creo que si los símbolos son globales ("etiqueta::" o ".globl etiqueta") puede llamar los en los bloques __asm del tu codigo C.

He compilado el codigo fuente mouse.asm con el siguiente comando:
Código:
sdasz80 -o mouse.asm
y el file de output mouse.rel debe ser linkado con el main.

File mouse.asm:

Código:

GTPAD   = #0x00DB
GTTRIG  = #0x00D8
initmem = #0xE000
mouse   = initmem
mousex  = mouse+1
mousey  = mousex+1
mousebutton1 = mousey+1
mousebutton2 = mousebutton1+1
msxmodel     = mousebutton2+1

.area _CODE

; -------------------------------
; CHECKMOUSE
; comprueba si hay un mouse
; conectado en alguno de los
; puertos
; Llamar en varias interrupciones
; -------------------------------
checkmouse::

ld a, #0x01
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,#0xFF
ret c
ld a,b

ld e,#0x0f
ld bc,#0x00bf
ld     hl,#0x10ef

cp     #0x0c
jr     z,gtpadmsx1_348C
ld     bc,#0x40ff
ld     hl,#0x20df
cp     #10
jr     z,gtpadmsx1_348C
and    #03
sub    #02
ld     a,(#0xfafe)
ret    m
ld     a,(#0xfb00)
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     #0x0d
jr     c,gtpadmsx1_34E0
pop    af
call   gtpadmsx1_34FA
ld     (#0xfb00),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     (#0xfb00),a
pop    af
pop    de
add    a,a
add    a,a
add    a,a
add    a,a
or     b
neg
gtpadmsx1_34F4:
ld     (#0xfafe),a
ld     a,#0xff
ret
gtpadmsx1_34FA:
xor    #08
bit    3,a
ret    z
or     #0xf0
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    (#0xa0),a
pop    af
out    (#0xa1),a
ret

gtpadmsx1_3514:
call   gtpadmsx1_352D
call   gtpadmsx1_352D
gtpadmsx1_351A:
call   gtpadmsx1_352D
gtpadmsx1_351D:
ld     a,#0x0e
call   gtpadmsx1_3526
and    #0x0f
ret
gtpadmsx1_3525:
ld     a,e
gtpadmsx1_3526:
out    (#0xa0),a
in     a,(#0xa2)
and    c
or     b
ret
gtpadmsx1_352D:
ex     (sp),hl
ex     (sp),hl
ex     (sp),hl
ex     (sp),hl
ret

« Última modificación: 12 de Mayo de 2010, 07:21:44 pm por andrear1979 » En línea

"... all toghether, good bad and mean, shall last forever in the Software Bin"
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #2 : 12 de Mayo de 2010, 07:56:08 pm »

Muchas gracias Andrear!!!  Smiley
Mañana mismo lo pruebo y te cuento que tal ha funcionado.
Esto me ira muy bien para cuando me ponga con el acceso a disco.

Saludos!
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #3 : 28 de Mayo de 2010, 08:21:58 pm »

Conseguido!  Cheesy

para acceder a las funciones en assembler hay que añadir a la etiqueta un caracter de subrayado además de los dobles dos puntos:
Código:
_name::

y para poderlas usar en C hay que definir las funciones de la siguiente manera:
Código:
extern void name(void);

Para el que le interese, he colgado un post en el blog del proyecto PSGed, detallando la experiencia:
Acceso a funciones Asm desde C

Gracias de nuevo Andrear!
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
andrear1979
Karoshi Newbie
*
Mensajes: 13



WWW Email
« Respuesta #4 : 28 de Mayo de 2010, 10:04:45 pm »

De nada Grin De hecho gracias Alberto por el blog, porque recoge y centraliza un poco de información acerca SDCC por MSX.
En línea

"... all toghether, good bad and mean, shall last forever in the Software Bin"
Jos'b
Karoshi Maniac
****
Mensajes: 262


« Respuesta #5 : 29 de Mayo de 2010, 04:48:52 pm »

Me parece genial que compartas como acceder a funciones ASM y solo una pregunta

has probado a pasar argumentos a estas funciones utilizando el registro ix?
En línea
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #6 : 20 de Junio de 2010, 07:07:10 pm »

para este caso no, pero para código asm dentro de funciones en C si.
lo probaré.
Gracias por la idea!
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!