Título: searchstream.asm Publicado por: SapphiRe en 15 de Febrero de 2006, 06:20:53 pm 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 :D (have you used this feature? ;D ;D ) Código: ; ------------------------------------------------ ; --- 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: Código: 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: Código: 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 Título: Re: searchstream.asm Publicado por: Darth_Fistro en 15 de Febrero de 2006, 06:32:46 pm Great, Sapphire! :D I wonder which game will make a surprise to appear in conjunction with Namake... ;D
This is a very nice trick, it will be used for sure! :D By the way, how did you detect Penguin Adv. in your example? You're only comparing 4 bytes... ??? Título: Re: searchstream.asm Publicado por: jltursan en 15 de Febrero de 2006, 06:57:44 pm Citar I wonder which game will make a surprise to appear in conjunction with Namake... Which else...? ;D Citar how did you detect Penguin Adv. in your example? You're only comparing 4 bytes... Prolly changing $07,$01 with $07,$43. I'm not sure if the Konami codes goes in hex or decimal; but I guess he's using the famous RC codes. Título: Re: searchstream.asm Publicado por: SapphiRe en 15 de Febrero de 2006, 07:24:29 pm Citar how did you detect Penguin Adv. in your example? You're only comparing 4 bytes... Prolly changing $07,$01 with $07,$43. I'm not sure if the Konami codes goes in hex or decimal; but I guess he's using the famous RC codes. Yes. All the konami games have their RC code in the $4010 address. First two bytes are allways $43 and $44, the following ones are the RC code in BCD. In the case of Antartic Adventure is RC-701, for Penguin Adventure RC-743... Is the same technique used by konami to identify the cartrigdes. Final note: the routine I've really used in Namake's also uses a very simple encryption, to difficult to the people guess the cartrigde (or cartridges in the case of Namake's) searched... Regards -- SapphiRe Título: Re: searchstream.asm Publicado por: KNM en 17 de Febrero de 2006, 07:42:55 pm C´mon !! It´s very easy to find wich games sapphire´s talkig ´bout ;D ;D ;D...
Y yo hablando en english... Por cierto Sapphire...¿recuerdas que instalé el blueMSX con el namake en el pub Texas?...Pues anteayer me acerqué a tomarme un refresco y vi a Paco y a Salva viciandose de lo lindo.Paco llego hasta la 19 en su segunda partida... ¡Hasta se apuntaron los passwords para seguir jugando! :D :D :D.A ver en que otro pub puedes ir a tomarte unas copas con los colegas y echar mano del bluemsx para picarte con tus compis ;) ;) ;) KNM mola mola mola... Título: Re: searchstream.asm Publicado por: SapphiRe en 18 de Febrero de 2006, 07:22:14 pm Vamos a tener que hacer la versión recreativa del Namake's... jajajaja
Título: Re: searchstream.asm Publicado por: BiFiMSX en 20 de Junio de 2006, 02:41:11 pm 8K and 16K games don't use the "CD",7,rc-in-bcd format.
32K and megaroms do. so Antarctic Adventure will never be detected... Penguin Adventure will. Título: Re: searchstream.asm Publicado por: MsxKun en 04 de Octubre de 2006, 09:21:29 pm I thing this part isn't correct at all:
Código: @@NOT: pop bc ; Restauramos la pila... -2 pop bc ; ...dos valores -1 ret ; Volvemos con un valor de a <> 0 beacuse if here: Código: 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 at IX is a 0 value, a will be zero, so you will return with a zero value until you didn't find the chain!! I tried and i found that. Now if you put a: LD A,1 before the RET, sure always will be a<>0. Now it works fine! Título: Re: searchstream.asm Publicado por: SapphiRe en 05 de Octubre de 2006, 04:22:20 pm I thing this part isn't correct at all: Código: @@NOT: pop bc ; Restauramos la pila... -2 pop bc ; ...dos valores -1 ret ; Volvemos con un valor de a <> 0 beacuse if here: Código: 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 at IX is a 0 value, a will be zero, so you will return with a zero value until you didn't find the chain!! I tried and i found that. Now if you put a: LD A,1 before the RET, sure always will be a<>0. Now it works fine! You're right... Too few people using this routine, hmmm?? |