Advertisement
NightFox

Untitled

Apr 30th, 2020
1,548
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ----------------------------------------------------------
  2. ; Funcion para detectar la RAM un mapper a partir
  3. ; de la informacion en la pagina 2
  4. ; ----------------------------------------------------------
  5.  
  6. FUNCION_MEMORY_GET_RAM_IN_MAPPER:
  7.  
  8.     ; Reinicia el contador de RAM del slot actual
  9.     ld hl, (NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION)       ; Variable
  10.     ld b, 3         ; 3 bytes
  11.     xor a           ; a cero
  12.     @@RESET_COUNTER:
  13.         ld [hl], a
  14.         inc hl
  15.         djnz @@RESET_COUNTER
  16.  
  17.     ; Deshabilita las interrupciones
  18.     di
  19.  
  20.     ; Paso 1 - Copia de seguridad de los bytes a analizar de cada segmento
  21.     ld de, (NGN_RAM_BUFFER + MEMORY_MAPPER_PAGES_BACKUP)
  22.     ld b, $FF
  23.     @@DO_BACKUP:
  24.         push bc         ; Preserva el registro
  25.         push de
  26.         ld a, b         ; Carga el nº de segmento actual
  27.         out [$FE], a    ; Seleccion del segmento del mapper
  28.         ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)]       ; ID de slot
  29.         ld hl, $8000    ; Direccion de la pagina
  30.         call $000C      ; Lee un byte del slot con la ID en A de la direccion HL (RDSLT)
  31.         pop de          ; Restaura los registros
  32.         pop bc
  33.         ld [de], a      ; Guarda el dato leido
  34.         inc de          ; Siguiente posicion en el buffer de backup
  35.         djnz @@DO_BACKUP
  36.  
  37.     ; Paso 2 - Marca el primer byte de todos los segmentos como $FF
  38.     ld bc, $FF00
  39.     @@DO_SETUP:
  40.         push bc         ; Preserva el registro
  41.         ld a, c         ; Carga el nº de segmento actual
  42.         out [$FE], a    ; Seleccion del segmento del mapper
  43.         ld e, $FF       ; Byte a escribir
  44.         ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)]       ; ID de slot
  45.         ld hl, $8000    ; Direccion de la pagina
  46.         call $0014      ; Escribe un byte (E) en el slot con la ID en A en la direccion HL (WRSLT)
  47.         pop bc
  48.         inc c           ; Siguiente pagina
  49.         djnz @@DO_SETUP
  50.  
  51.     ; Paso 3 - Si es un mapper, leyendo el byte, escribiendo un nuevo valor y buscando una repeticion
  52.     ld bc, $FF00
  53.     @@DO_CHECK:
  54.         push bc                 ; Preserva el registro
  55.         ld a, c                 ; Carga el nº de segmento actual
  56.         out [$FE], a            ; Seleccion del segmento del mapper
  57.         ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)]       ; ID de slot
  58.         ld hl, $8000            ; Direccion de la pagina
  59.         call $000C              ; Lee un byte del slot con la ID en A de la direccion HL (RDSLT)
  60.         pop bc                  ; Recupera el registro
  61.         sub a, c                ; Si el valor leido es inferior al actual, fin del mapper (o no es un mapper)
  62.         jr c, @@END_OF_CHECK    ; Sal si es inferior
  63.         push bc
  64.         ld e, c                 ; Byte a escribir (nº de segmento)
  65.         ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)]       ; ID de slot
  66.         ld hl, $8000            ; Direccion de la pagina
  67.         call $0014              ; Escribe un byte (E) en el slot con la ID en A en la direccion HL (WRSLT)
  68.         pop bc                  ; Restaura el registro
  69.         ld a, [(NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION)]      ; Actualiza el contador de segmentos
  70.         inc a
  71.         ld [(NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION)], a
  72.         inc c                   ; Siguiente pagina
  73.         djnz @@DO_CHECK
  74.     @@END_OF_CHECK:
  75.  
  76.     ; Paso 4 - Restaura la copia de seguridad
  77.     ld de, (NGN_RAM_BUFFER + MEMORY_MAPPER_PAGES_BACKUP)
  78.     ld b, $FF
  79.     @@DO_RESTORE:
  80.         push bc         ; Preserva el registro
  81.         push de
  82.         ld a, b         ; Carga el nº de segmento actual
  83.         out [$FE], a    ; Seleccion del segmento del mapper
  84.         ld a, [de]      ; Lee el byte a restaurar
  85.         ld e, a         ; Guardalo en E
  86.         ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)]       ; ID de slot
  87.         ld hl, $8000    ; Direccion de la pagina
  88.         call $0014      ; Escribe un byte (E) en el slot con la ID en A en la direccion HL (WRSLT)
  89.         pop de          ; Restaura los registros
  90.         pop bc
  91.         inc de          ; Siguiente posicion en el buffer de backup
  92.         djnz @@DO_RESTORE
  93.  
  94.     ; Habilita las interrupciones
  95.     @@END_OF_MAP_TEST:
  96.     ei
  97.  
  98.     ; Recuento de RAM
  99.     ld a, [(NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION)]
  100.     sub a, 4        ; Si hay 4 segmentos de 16kb, no es un mapper
  101.     ret c           ; Vuelve YA si no lo es
  102.  
  103.     call FUNCION_MEMORY_GET_CURRENT_SLOT_VARIABLE       ; Carga en HL la variable con la informacion del slot actual
  104.     set 7, [hl]
  105.  
  106.     ; Resta 64kb al contador de memoria
  107.     ; Define el numero de KB a añadir
  108.     ld hl, NGN_RAM_BUFFER
  109.     ld [hl], $64
  110.     inc hl
  111.     ld [hl], $00
  112.     inc hl
  113.     ld [hl], $00
  114.     ; Define el origen y el destino para el contador general
  115.     ld de, RAM_DETECTED
  116.     ld hl, NGN_RAM_BUFFER
  117.     ; Realiza la resta
  118.     call NGN_BCD_SUB
  119.  
  120.     ; Suma 16kb al contador de memoria por cada segmento encontrado
  121.     ld a, [(NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION)]
  122.     ld b, a
  123.     @@ADD_MAPPED_MEMORY:
  124.         ; Preserva los registros
  125.         push bc
  126.         ; Define el numero de KB a añadir
  127.         ld hl, NGN_RAM_BUFFER
  128.         ld [hl], $16
  129.         inc hl
  130.         ld [hl], $00
  131.         inc hl
  132.         ld [hl], $00
  133.         ; Define el origen y el destino para el contador general
  134.         ld de, RAM_DETECTED
  135.         ld hl, NGN_RAM_BUFFER
  136.         ; Realiza la suma
  137.         call NGN_BCD_ADD
  138.         ; Recupera los registros y repite
  139.         pop bc
  140.         djnz @@ADD_MAPPED_MEMORY
  141.  
  142.     ; Fin de la rutina
  143.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement