Página 1 de 1

Operaciones bitwise en Spectrum BASIC

Publicado: 01 Jul 2016, 00:04
por Uto
¿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

Re: Operaciones bitwise en Spectrum BASIC

Publicado: 01 Jul 2016, 00:40
por Namek
No necesitas peekear la memoria, LET A=USR XXXXX Devuelve el valor de BC en la variable BASIC.

Re: Operaciones bitwise en Spectrum BASIC

Publicado: 01 Jul 2016, 00:54
por Uto
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

Re: Operaciones bitwise en Spectrum BASIC

Publicado: 01 Jul 2016, 01:38
por Uto
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.