Operaciones bitwise en Spectrum BASIC

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
Uto
MSX Turbo R
MSX Turbo R
Mensajes: 442
Registrado: 28 Abr 2014, 15:50
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: TV Games/Pong Clone
Gracias dadas: 5 veces
Gracias recibidas: 26 veces

Operaciones bitwise en Spectrum BASIC

Mensajepor Uto » 01 Jul 2016, 00:04

¿Hay alguna manera de hacer operaciones bitwise en Spectrum BASIC?

Los operadores AND, OR no funcionan bitwise, y me pregunto si hay una manera de hacerlo que no caigo.

Si no la hubiera, supongo que se puede hacer con un DEF FN tocho, aunque tampoco lo veo tan claro porque para eso tendría que aislar los bits para hacer un y me haría falta un SHR por lo menos (operador >> de C).

Es para valores de 8 bits.

Con DEF FN creo que la funcion or se puede hacer como indico, pero no acabo de ver una manera de aislar esos bits:

Código: Seleccionar todo

REM FUNCION BIT (devuelve el valor del bit N del valor X)
DEF FN b(X,N) = ??????
REM FUNCION OR (devuelve or bitwise)
DEF FN o(a,b) = (b(X,7) OR b(Y,7)) *128 + (b(X,6) OR b(Y,6)) *64 + ... + (b(X,0) OR b(Y,0)) *1


Otra forma sería usar C/M claro, que es lo más fácil sin duda, pero aun así me gustaría usarlo desde basic, así que tendría que ver una manera de meterlo en un REM en la primera linea, y automodificar código con POKES. Es decir, que en la primera linea hubiera esto:

result: defb 0
start: LD A, X
LD B, Y
OR B
LD (result), A
RET

Y luego para hacer un OR pokearia en las posiciones de X e Y, RANDOMIZE USR,y después "peekearia" desde :result

Un tinglao fino para una chorrada vamos #-o

Otras ideas?

Edito: ahora que lo pienso puede que ni ese DEF FN o() funcione, porque b(X,7) OR b(Y,7) en realidad es if b(Y,7) then b(X,7), así que no es lo mismo ... uf
http://www.ngpaws.com
Twitter: @uto_dev

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Operaciones bitwise en Spectrum BASIC

Mensajepor Namek » 01 Jul 2016, 00:40

No necesitas peekear la memoria, LET A=USR XXXXX Devuelve el valor de BC en la variable BASIC.

Avatar de Usuario
Uto
MSX Turbo R
MSX Turbo R
Mensajes: 442
Registrado: 28 Abr 2014, 15:50
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: TV Games/Pong Clone
Gracias dadas: 5 veces
Gracias recibidas: 26 veces

Re: Operaciones bitwise en Spectrum BASIC

Mensajepor Uto » 01 Jul 2016, 00:54

Namek escribió:No necesitas peekear la memoria, LET A=USR XXXXX Devuelve el valor de BC en la variable BASIC.


Nada más leerlo me he acordado de que yo una vez supe esto, pero lo había olvidado completamente. Gracias por recordarmelo :D

Hmmm, quiza se pueda hacer alguna ñapa con DEF FN en plan

DEF FN o(x,y) = USR xxxxx

y ver la manera de que ese código busque los parámetros de FN cuando se le llame, que digo yo que en algun sitio andarán.

Edito: correcto, la variable del sistema DEFADD dice donde están :D
http://www.ngpaws.com
Twitter: @uto_dev

Avatar de Usuario
Uto
MSX Turbo R
MSX Turbo R
Mensajes: 442
Registrado: 28 Abr 2014, 15:50
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: TV Games/Pong Clone
Gracias dadas: 5 veces
Gracias recibidas: 26 veces

Re: Operaciones bitwise en Spectrum BASIC

Mensajepor Uto » 01 Jul 2016, 01:38

Ya contestándome yo solo, unos manuales , un complete Spectrum Rom Disassembled, y una microhobby más tarde, creo que esto deber funcionar pero ya lo pruebo mañana. Es de 16 bits eso sí, es como parece que llegan los datos a FN... en lo que he podido ver en este rato.

Código: Seleccionar todo

  LD IX,(23563)  ;DEFADD
  LD E,(IX+4)
  LD D,(IX+5)
  LD L,(IX+12)
  LD H,(IX+13)
  LD A,H
  OR D
  LD B,A
  LD A,L
  OR E
  LD C,A
  RET


Y luego definir

Código: Seleccionar todo

DEF FN o(X,Y)=USR xxxxx


Mañana lo pruebo.
http://www.ngpaws.com
Twitter: @uto_dev


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados