Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; ----------------------------------------------------------
- ; Funcion para detectar la RAM un mapper a partir
- ; de la informacion en la pagina 2
- ; ----------------------------------------------------------
- FUNCION_MEMORY_GET_RAM_IN_MAPPER:
- ; Reinicia el contador de RAM del slot actual
- ld hl, (NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION) ; Variable
- ld b, 3 ; 3 bytes
- xor a ; a cero
- @@RESET_COUNTER:
- ld [hl], a
- inc hl
- djnz @@RESET_COUNTER
- ; Deshabilita las interrupciones
- di
- ; Paso 1 - Copia de seguridad de los bytes a analizar de cada segmento
- ld de, (NGN_RAM_BUFFER + MEMORY_MAPPER_PAGES_BACKUP)
- ld b, $FF
- @@DO_BACKUP:
- push bc ; Preserva el registro
- push de
- ld a, b ; Carga el nº de segmento actual
- out [$FE], a ; Seleccion del segmento del mapper
- ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot
- ld hl, $8000 ; Direccion de la pagina
- call $000C ; Lee un byte del slot con la ID en A de la direccion HL (RDSLT)
- pop de ; Restaura los registros
- pop bc
- ld [de], a ; Guarda el dato leido
- inc de ; Siguiente posicion en el buffer de backup
- djnz @@DO_BACKUP
- ; Paso 2 - Marca el primer byte de todos los segmentos como $FF
- ld bc, $FF00
- @@DO_SETUP:
- push bc ; Preserva el registro
- ld a, c ; Carga el nº de segmento actual
- out [$FE], a ; Seleccion del segmento del mapper
- ld e, $FF ; Byte a escribir
- ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot
- ld hl, $8000 ; Direccion de la pagina
- call $0014 ; Escribe un byte (E) en el slot con la ID en A en la direccion HL (WRSLT)
- pop bc
- inc c ; Siguiente pagina
- djnz @@DO_SETUP
- ; Paso 3 - Si es un mapper, leyendo el byte, escribiendo un nuevo valor y buscando una repeticion
- ld bc, $FF00
- @@DO_CHECK:
- push bc ; Preserva el registro
- ld a, c ; Carga el nº de segmento actual
- out [$FE], a ; Seleccion del segmento del mapper
- ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot
- ld hl, $8000 ; Direccion de la pagina
- call $000C ; Lee un byte del slot con la ID en A de la direccion HL (RDSLT)
- pop bc ; Recupera el registro
- sub a, c ; Si el valor leido es inferior al actual, fin del mapper (o no es un mapper)
- jr c, @@END_OF_CHECK ; Sal si es inferior
- push bc
- ld e, c ; Byte a escribir (nº de segmento)
- ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot
- ld hl, $8000 ; Direccion de la pagina
- call $0014 ; Escribe un byte (E) en el slot con la ID en A en la direccion HL (WRSLT)
- pop bc ; Restaura el registro
- ld a, [(NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION)] ; Actualiza el contador de segmentos
- inc a
- ld [(NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION)], a
- inc c ; Siguiente pagina
- djnz @@DO_CHECK
- @@END_OF_CHECK:
- ; Paso 4 - Restaura la copia de seguridad
- ld de, (NGN_RAM_BUFFER + MEMORY_MAPPER_PAGES_BACKUP)
- ld b, $FF
- @@DO_RESTORE:
- push bc ; Preserva el registro
- push de
- ld a, b ; Carga el nº de segmento actual
- out [$FE], a ; Seleccion del segmento del mapper
- ld a, [de] ; Lee el byte a restaurar
- ld e, a ; Guardalo en E
- ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot
- ld hl, $8000 ; Direccion de la pagina
- call $0014 ; Escribe un byte (E) en el slot con la ID en A en la direccion HL (WRSLT)
- pop de ; Restaura los registros
- pop bc
- inc de ; Siguiente posicion en el buffer de backup
- djnz @@DO_RESTORE
- ; Habilita las interrupciones
- @@END_OF_MAP_TEST:
- ei
- ; Recuento de RAM
- ld a, [(NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION)]
- sub a, 4 ; Si hay 4 segmentos de 16kb, no es un mapper
- ret c ; Vuelve YA si no lo es
- call FUNCION_MEMORY_GET_CURRENT_SLOT_VARIABLE ; Carga en HL la variable con la informacion del slot actual
- set 7, [hl]
- ; Resta 64kb al contador de memoria
- ; Define el numero de KB a añadir
- ld hl, NGN_RAM_BUFFER
- ld [hl], $64
- inc hl
- ld [hl], $00
- inc hl
- ld [hl], $00
- ; Define el origen y el destino para el contador general
- ld de, RAM_DETECTED
- ld hl, NGN_RAM_BUFFER
- ; Realiza la resta
- call NGN_BCD_SUB
- ; Suma 16kb al contador de memoria por cada segmento encontrado
- ld a, [(NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION)]
- ld b, a
- @@ADD_MAPPED_MEMORY:
- ; Preserva los registros
- push bc
- ; Define el numero de KB a añadir
- ld hl, NGN_RAM_BUFFER
- ld [hl], $16
- inc hl
- ld [hl], $00
- inc hl
- ld [hl], $00
- ; Define el origen y el destino para el contador general
- ld de, RAM_DETECTED
- ld hl, NGN_RAM_BUFFER
- ; Realiza la suma
- call NGN_BCD_ADD
- ; Recupera los registros y repite
- pop bc
- djnz @@ADD_MAPPED_MEMORY
- ; Fin de la rutina
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement