Título: Rutinas de ratón, de Ramones, en SDCC Publicado por: aorante en 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 :) )
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 Título: Re: Rutinas de ratón, de Ramones, en SDCC Publicado por: andrear1979 en 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 Título: Re: Rutinas de ratón, de Ramones, en SDCC Publicado por: aorante en 12 de Mayo de 2010, 07:56:08 pm Muchas gracias Andrear!!! :)
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! Título: Re: Rutinas de ratón, de Ramones, en SDCC Publicado por: aorante en 28 de Mayo de 2010, 08:21:58 pm Conseguido! :D
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 (http://psged.blogspot.com/2010/05/acceso-funciones-asm-desde-c.html) Gracias de nuevo Andrear! Título: Re: Rutinas de ratón, de Ramones, en SDCC Publicado por: andrear1979 en 28 de Mayo de 2010, 10:04:45 pm De nada ;D De hecho gracias Alberto por el blog, porque recoge y centraliza un poco de información acerca SDCC por MSX.
Título: Re: Rutinas de ratón, de Ramones, en SDCC Publicado por: Jos'b en 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? Título: Re: Rutinas de ratón, de Ramones, en SDCC Publicado por: aorante en 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! |