	cpu	68000		;asmsyntax=asm68k

nvec	equ	10		;Nº de vector de la emulación de línea 1010.

xbtst	macro	dirbit		;Definición de la macro XBTST:
	dc.w	$a000		;emulación de línea 1010
	dc.l	dirbit		;dirección de bit (operando)
	endm


	org	$1000

	move.l	#xbtstrut,4*nvec

	xbtst	$81e2		;Prueba del XBTST (103C bit 5)

	trap	#15
	dc.w	0

;------------------------------------------------------------------------------
; Rutina XBTST, de servicio de la excepción de emulación de línea 1010
; Funcion: Chequea un bit, cuya dirección es la especificada como operando
;          de la macro XBTST, interpretándola como una dirección de bit.
; Entradas: Información en la pila del supervisor
; Salidas:  Bit Z modificado en el SR de retorno, y PC de retorno
;           también modificado para que apunte a la siguiente instrucción.
; Modifica: Nada más.

XBTSTRUT
	movem.l	d0/a0,-(a7)	;Salva los registros que se modifican.

	movea.l	10(a7),a0	;Copia el PC guardado en la pila en A0.
	move.l	2(a0),a0	;Copia la dirección del bit en A0.

	move.l	a0,d0		;Usando D0 para el desplazamiento, se queda
	asr.l	#3,d0		;sólo con la dirección del byte.
	exg	d0,a0		;A0:=dirección del byte; D0:=dirección del bit. 
	not.b	d0		;Invierte la numeración de los bits para BTST.

	btst	d0,(a0)		;Ahora ya puede hacer el BTST (ver nota).

	beq.s	z1		;Z=1?
	bclr	#2,9(a7)	;...no: Z:=0 en el SR guardado en la pila.
	bra.s	fin		;Y se acabó.
z1	bset	#2,9(a7)	;...sí: Z:=1 en el SR guardado en la pila.

fin	addq.l	#6,10(a7)	;Avanza la dirección de retorno.
	movem.l	(a7)+,d0/a0	;Recupera los registros y fuera de aquí.
	rte

; NOTA: Obsérvese que el BTST dinámico de memoria toma como número de bit el
;       contenido del registro de datos que constituye su operando origen,
;	pero en módulo 8, lo que en binario equivale a quedarse sólo con los
;       tres bits más bajos. Por esta razón no es necesario poner a cero el
;       resto de los bits del registro de datos.
