Hi all!
Here is a routine I've used in Namake's Bridgedrome to detect if a secondary cartrigde is present, or not, in order to activate a special feature in the game
(have you used this feature?
)
; ------------------------------------------------
; --- BUSQUEDA DE STREAMS POR SLOTS Y SUBSLOTS ---
; ------------------------------------------------
; --- UTILIZACION ---
; --- CALL SEARCHSTREAM ---
; --- .DW DIRECCION,LONGITUD ---
; --- .DB STREAM DE DATOS A BUSCAR ---
; --- (los datos deben estar encriptados) ---
; ------------------------------------------------
; --- Devuelve a=0 si no lo encuentra ---
; --- a=1 si lo encuentra ---
; ------------------------------------------------
SEARCHSTREAM: pop IX ; Recuperamos la direccion con los datos
ld l,[IX] ; Direccion de busqueda (baja)
inc IX ; Incrementamos
ld h,[IX] ; Direccion de busqueda (alta)
inc IX ; Incrementamos
ld c,[IX] ; Longitud de busqueda (baja)
inc IX ; Incrementamos
ld b,[IX] ; Longitud de busqueda (alta)
inc IX ; Incrementamos
; Iniciamos la busqueda por todos los Slots y Subslots
ld d,$80 ; Slot/Subslot inicial (0/0 todos ampliados)
@@BUCLE: push de ; Guardamos Slot/Subslot +1
push hl ; Guardamos la direccion de busqueda +2
push IX ; Guardamos la direccion de comparacion +3
push bc ; Guardamos la longitud +4
call @@SEARCH ; Buscamos la cadena
pop bc ; Recuperamos la longitud -4
pop IX ; Recuperamos la direccion de comparacion -3
pop hl ; Recuperamos la direccion de busqueda -2
pop de ; Recuperamos Slot/Subslot -1
or a ; Si a es igual a cero...
jr z,@@ENCONTRADO ; ...saltamos a @@ENCONTRADO
inc d ; Incrementamos Slot/Subslot
ld a,$10 ; Bit que se activa si hemos terminado
and d ; Miramos a ver si hemos terminado
jr z,@@BUCLE ; Si no, volvemos al bucle
; --- Si llegamos aqui NO hemos encontrado la cadena que buscabamos ---
xor a ; a = 0 (no lo hemos encontrado)
@@VUELVE: add IX,bc ; Direccion de retorno...
push IX ; ...en la cima de la pila
ret ; Volvemos
; --- Si llegamos aqui SI hemos encontrado la cadena que buscabamos ---
@@ENCONTRADO: inc a ; a = 1 (lo hemos encontrado)
jr @@VUELVE ; Volvemos
@@SEARCH: ; --- Subrutina que comprueba si la cadena en el Slot/Subslot D, direccion HL coincide con lo buscado ---
ld a,d ; Recuperamos Slot/Subslot
push af ; Guardamos Slot/Subslot +1
push bc ; Guardamos longitud +2
call RDSLT ; Leemos la direccion del Slot/Subslot
cp [IX] ; Comparamos con el valor que buscamos...
jr nz,@@NOT ; ...y si no es cero saltamos a @@NOT
pop bc ; Recuperamos longitud -2
pop af ; Recuperamos Slot/Subslot -1
ld d,a ; Guardamos Slot/Subslot
inc IX ; Incrementamos el origen
inc hl ; Incrementamos direccion de busqueda
dec bc ; Decrementamos longitud
ld a,b ; a = b
or c ; a = b OR c
jr nz,@@SEARCH ; Si no es cero, cerramos el bucle
ret ; Volvemos con un valor de a = 0
@@NOT: pop bc ; Restauramos la pila... -2
pop bc ; ...dos valores -1
ret ; Volvemos con un valor de a <> 0
; --- Subrutina que comprueba si la cadena en el Slot/Subslot D, direccion HL coincide con lo buscado ---
Commentaries are in Spanish, sorry. I'll try to explain the use of the routine. You need the following data:
2 bytes: address where the stream is supossed to be (ADD)
2 bytes: length of the stream (N)
N bytes: stream of bytes
Calling the routine:
call SEARCHSTREAM ; Buscamos el siguiente STREAM por todos los SLOTS
.dw ADD,N ; Direccion y longitud
.db stream of N bytes ; Buscamos esta cadena
next instruction...
Example, we want to know if Antartic Adventure is present or not:
call SEARCHSTREAM ; Buscamos el siguiente STREAM por todos los SLOTS
.dw $4010,4 ; Direccion y longitud
.db $43,$44,$07,$01 ; Buscamos esta cadena (Antartic Adventure)
And we will obtain a=0 if Antartic Adventure is not present or a=1 if it's plugged in the computer.
I hope you'll find this routine useful
--
SapphiRe