From e9f050d64d049e64e5442bf9be76b42a5794b6ec Mon Sep 17 00:00:00 2001 From: Cesar Rincon Nadal Date: Sun, 10 May 2020 12:08:46 +0200 Subject: [PATCH] Ver. 1.1.9 (W.I.P 2020-05-10) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reestructuración de la página 2 del menú. - Añadida la opción para mostrar la configuración de la memoria RAM. --- source/data/bin/misc.asm | 2 +- source/data/txt/key_names.asm | 2 +- source/data/txt/text.asm | 57 +- source/formats/f_binary.asm | 2 +- source/formats/f_cas.asm | 2 +- source/formats/f_com.asm | 2 +- source/formats/f_rom.asm | 4 +- source/msxdiag.asm | 4 +- source/ngn/ngn_text.asm | 160 ++++++ source/ngn/ngn_vars.asm | 3 +- source/prog/consts.asm | 71 ++- source/prog/joystick_test.asm | 2 +- source/prog/keyboard_test.asm | 2 +- source/prog/main.asm | 2 +- source/prog/main_menu_common.asm | 2 +- source/prog/main_menu_p1.asm | 2 +- source/prog/main_menu_p2.asm | 48 +- source/prog/memory_routines.asm | 337 ++++++++--- source/prog/mixed_mode_test.asm | 2 +- source/prog/monitor_color_test.asm | 4 +- source/prog/psg_test.asm | 2 +- source/prog/ram_test.asm | 872 +++++++++++++++++++++++++++++ source/prog/screen0_test.asm | 2 +- source/prog/screen1_test.asm | 2 +- source/prog/screen2_test.asm | 2 +- source/prog/screen3_test.asm | 2 +- source/prog/sfx.asm | 2 +- source/prog/sprites_test.asm | 2 +- source/prog/system.asm | 2 +- source/prog/system_info.asm | 8 +- source/prog/vars.asm | 30 +- source/prog/vdp_routines.asm | 2 +- source/prog/welcome.asm | 2 +- 33 files changed, 1495 insertions(+), 145 deletions(-) create mode 100644 source/prog/ram_test.asm diff --git a/source/data/bin/misc.asm b/source/data/bin/misc.asm index 535444b..2214812 100644 --- a/source/data/bin/misc.asm +++ b/source/data/bin/misc.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Datos miscelaneos ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/data/txt/key_names.asm b/source/data/txt/key_names.asm index 6a548c6..ead8a69 100644 --- a/source/data/txt/key_names.asm +++ b/source/data/txt/key_names.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Nombres de las teclas ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/data/txt/text.asm b/source/data/txt/text.asm index c33bd82..fe251e4 100644 --- a/source/data/txt/text.asm +++ b/source/data/txt/text.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Textos del programa ; (cc) 2018-2020 Cesar Rincon "NightFox" @@ -30,7 +30,7 @@ TEXT_DASHED_LINE: ; Texto de cabecera de los menus TEXT_MENU_HEADER: - db " MSX DIAGNOSTICS v1.1.8", $0D, $0A, $00 + db " MSX DIAGNOSTICS v1.1.9", $0D, $0A, $00 @@ -87,10 +87,10 @@ TEXT_MAIN_MENU_P2_TITLE: TEXT_MAIN_MENU_P2_ITEMS: db $0D, $0A - db " 1. MONITOR COLOR", $0D, $0A - db " 2. MIXED MODE", $0D, $0A - db " 3. ", $C3, $0D, $0A - db " 4. ", $C3, $0D, $0A + db " 1. RAM LAYOUT", $0D, $0A + db " 2. RAM TEST [WIP]", $0D, $0A + db " 3. MONITOR COLOR", $0D, $0A + db " 4. MIXED MODE", $0D, $0A db " 5. ", $C3, $0D, $0A db " 6. ", $C3, $0D, $0A db " 7. ", $C3, $0D, $0A @@ -538,6 +538,51 @@ TEXT_MIXED_MODE_MESSAGE: +; Textos del test de memoria RAM +TEXT_RAM_INFO_HEADER: + db " RAM LAYOUT", $0D, $0A, $00 + +TEXT_RAM_TEST_HEADER: + db " SLOT PAGE 0 PAGE 1 PAGE 2 PAGE 3", $0D, $0A, $00 + +TEXT_RAM_TEST_SLOT_ID: + db " 0-0 ", $00 ; 7 bytes + ; " 0-0 1111KB 1111KB 1111KB 1111KB" + +TEXT_RAM_TEST_MAPPED: + db "MAPPED", $00 + +TEXT_RAM_TEST_PAGES: + db "PAGES", $00 + +TEXT_RAM_TEST_IN: + db " IN ", $00 + +TEXT_RAM_TEST_HELP: + db " SELECT A SLOT TO TEST AND PRESS", $0D, $0A + db " ACCEPT OR PRESS CANCEL TO EXIT." + db $00 + +TEXT_RAM_TEST_TESTING_SLOT: + db "TESTING SLOT ", $00 + +TEXT_RAM_TEST_PAGE: + db "PAGE ", $00 + +TEXT_RAM_TEST_ERRORS: + db " ERRORS FOUND", $00 + + + +; ---------------------------------------------------------- +; Textos genericos +; ---------------------------------------------------------- + +; Nueva linea +TEXT_NEW_LINE: + db $0D, $0A, $00 + + ; ---------------------------------------------------------- ; Tabla de caracteres personalizados diff --git a/source/formats/f_binary.asm b/source/formats/f_binary.asm index 615844e..f4fe659 100644 --- a/source/formats/f_binary.asm +++ b/source/formats/f_binary.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Directivas de compilacion para BINARIO de 32kb ; diff --git a/source/formats/f_cas.asm b/source/formats/f_cas.asm index 96600ad..6fb5cec 100644 --- a/source/formats/f_cas.asm +++ b/source/formats/f_cas.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Directivas de compilacion para BINARIO de 32kb ; Genera un archivo .CAS y .WAV diff --git a/source/formats/f_com.asm b/source/formats/f_com.asm index abefde1..615015e 100644 --- a/source/formats/f_com.asm +++ b/source/formats/f_com.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Directivas de compilacion para .COM de MSX-DOS ; diff --git a/source/formats/f_rom.asm b/source/formats/f_rom.asm index b6a8cc9..5a75784 100644 --- a/source/formats/f_rom.asm +++ b/source/formats/f_rom.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Directivas de compilacion para ROM de 32kb ; @@ -40,7 +40,7 @@ OUTPUT_FORMAT = 2 ; Define el formato de salida .PAGE 1 ; Selecciona la pagina 1 [$4000] (Codigo del programa) .ROM ; Se creara el binario en formato ROM de hasta 32kb -.SIZE 32 +.SIZE 32 ; Tamaño de salida forzado a 32kb .db 77, 83, 88, 95, 68, 73, 65, 71, 0, 0, 0, 0 ; 12 digitos para completar la cabecera de la ROM ; Indicale al compilador donde empieza el programa diff --git a/source/msxdiag.asm b/source/msxdiag.asm index 459ca43..db13d07 100644 --- a/source/msxdiag.asm +++ b/source/msxdiag.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; ; (cc) 2018-2020 Cesar Rincon "NightFox" @@ -114,6 +114,8 @@ PROGRAM_START_ADDRESS: .INCLUDE "prog/psg_test.asm" ; Informacion del sistema .INCLUDE "prog/system_info.asm" + ; Test de la memoria RAM + .INCLUDE "prog/ram_test.asm" ; Test de color del monitor .INCLUDE "prog/monitor_color_test.asm" ; Test del modo mixto diff --git a/source/ngn/ngn_text.asm b/source/ngn/ngn_text.asm index 570a680..a37f7ee 100644 --- a/source/ngn/ngn_text.asm +++ b/source/ngn/ngn_text.asm @@ -147,6 +147,166 @@ NGN_TEXT_PRINT_BCD: +; ---------------------------------------------------------- +; NGN_TEXT_PRINT_INTEGER +; Imprime un numero entero decimal sin signo +; BC = Numero a imprimir en formado hexadecimal +; entre $0000 y $FFFF +; Modifica A, BC, DE, HL +; Esta funcion usa la conversion por fuerza bruta +; Usar con moderacion +; ---------------------------------------------------------- + +NGN_TEXT_PRINT_INTEGER: + + ; Preserva el numero a imprimir + ld a, b + ld [(NGN_TEMP_VAR + 6)], a + ld a, c + ld [(NGN_TEMP_VAR + 7)], a + + ; Variables temporales para el calculo a 0 + ld hl, NGN_TEMP_VAR + ld b, 6 + @@RESET_LOOP: + ld [hl], $00 + inc hl + djnz @@RESET_LOOP + + + ; Bucle para la conversion + + @@CONVERSION_LOOP: + + ld a, [(NGN_TEMP_VAR + 6)] ; Recupera el numero a imprimir + ld b, a + ld a, [(NGN_TEMP_VAR + 7)] + ld c, a + + ld a, b ; Si el numero a convertir es 0 + or c ; o ya se ha terminado de convertir, + jp z, @@CONVERSION_FINISHED ; sal del bucle + + ld de, NGN_TEMP_VAR ; Variable con el resultado + ld hl, (NGN_TEMP_VAR + 3) ; Valor a sumar + + ld a, b ; Calcula si son Fxxx + and $F0 + jr z, @@TRY_XFXX ; Si no lo son, siguiente prueba + ; Fxxx + ld [hl], $96 ; D ; Numero a sumar + inc hl + ld [hl], $40 ; C ; para el digito + inc hl + ld [hl], $00 ; B ; Fxxx + ld a, b ; Carga el HI-BYTE del numero + srl a ; Bitshift >> 4 + srl a + srl a + srl a + and $0F ; Bitmask del LOW-BYTE + push af ; Preserva este numero (repeticiones) + ld a, b ; Vuelve a cargarlo + and $0F ; Y elimina esta parte para marcarla como hecha + ld [(NGN_TEMP_VAR + 6)], a ; Actualiza el valor del numero a convertir + pop af ; Recupera el numero de repeticiones + ld b, a ; Indicaselas al bucle + jr @@START_ADD ; Salta al bucle + + @@TRY_XFXX: + ld a, b ; Calcula si son xFxx + and $0F + jr z, @@TRY_XXFX ; Si no lo son, siguiente prueba + ; xFxx + ld [hl], $56 ; D ; Numero a sumar + inc hl + ld [hl], $02 ; C ; para el digito + inc hl + ld [hl], $00 ; B ; xFxx + ld a, b ; Carga el HI-BYTE del numero + and $0F ; Bitmask del LOW-BYTE + push af ; Preserva este numero (repeticiones) + ld a, b ; Vuelve a cargarlo + and $F0 ; Y elimina esta parte para marcarla como hecha + ld [(NGN_TEMP_VAR + 6)], a ; Actualiza el valor del numero a convertir + pop af ; Recupera el numero de repeticiones + ld b, a ; Indicaselas al bucle + jr @@START_ADD ; Salta al bucle + + @@TRY_XXFX: + ld a, c ; Calcula si son xxFx + and $F0 + jr z, @@TRY_XXXF ; Si no lo son, siguiente prueba + ; xxFx + ld [hl], $16 ; D ; Numero a sumar + inc hl + ld [hl], $00 ; C ; para el digito + inc hl + ld [hl], $00 ; B ; xxFx + ld a, c ; Carga el HI-BYTE del numero + srl a ; Bitshift >> 4 + srl a + srl a + srl a + and $0F ; Bitmask del LOW-BYTE + push af ; Preserva este numero (repeticiones) + ld a, c ; Vuelve a cargarlo + and $0F ; Y elimina esta parte para marcarla como hecha + ld [(NGN_TEMP_VAR + 7)], a ; Actualiza el valor del numero a convertir + pop af ; Recupera el numero de repeticiones + ld b, a ; Indicaselas al bucle + jr @@START_ADD ; Salta al bucle + + @@TRY_XXXF: + ld a, c ; Calcula si son xxxF + and $0F + jr z, @@START_ADD ; Si no lo son, siguiente prueba + ld [hl], $01 ; D ; Numero a sumar + inc hl + ld [hl], $00 ; C ; para el digito + inc hl + ld [hl], $00 ; B ; xxxF + ld a, c ; Carga el HI-BYTE del numero + and $0F ; Bitmask del LOW-BYTE + push af ; Preserva este numero (repeticiones) + ld a, c ; Vuelve a cargarlo + and $F0 ; Y elimina esta parte para marcarla como hecha + ld [(NGN_TEMP_VAR + 7)], a ; Actualiza el valor del numero a convertir + pop af ; Recupera el numero de repeticiones + ld b, a ; Indicaselas al bucle + + @@START_ADD: + ld hl, (NGN_TEMP_VAR + 3) ; Valor a sumar + + @@ADD_LOOP: + push hl ; Preserva los registros + push de + push bc + call NGN_BCD_ADD ; Operacion de suma + pop bc ; Recupera los registros + pop de + pop hl + djnz @@ADD_LOOP ; Si no has terminado, repite + + jp @@CONVERSION_LOOP ; Repite si no has salido + + ; Lee los datos de la variable y preparalos para imprimirlos en BCD + @@CONVERSION_FINISHED: + ld a, [NGN_TEMP_VAR] + ld d, a + ld a, [(NGN_TEMP_VAR + 1)] + ld c, a + ld a, [(NGN_TEMP_VAR + 2)] + and $0F + ld b, a + + ; Imprime el numero + call NGN_TEXT_PRINT_BCD + + ; Sal de la funcion + ret + + ; ---------------------------------------------------------- ; NGN_TEXT_POSITION diff --git a/source/ngn/ngn_vars.asm b/source/ngn/ngn_vars.asm index 34d23e7..b613f7c 100644 --- a/source/ngn/ngn_vars.asm +++ b/source/ngn/ngn_vars.asm @@ -195,10 +195,11 @@ NGN_SPRITE_31: ds 4 ; ----------------------------------------------------------------------- ; Variables genericas -; Total: 2 bytes +; Total: 9 bytes ; ----------------------------------------------------------------------- NGN_RANDOM_SEED: ds 1 ; Semilla del random +NGN_TEMP_VAR: ds 8 ; 8 bytes de variable para temporales diff --git a/source/prog/consts.asm b/source/prog/consts.asm index aa6785d..1c32582 100644 --- a/source/prog/consts.asm +++ b/source/prog/consts.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Definicion de constantes ; (cc) 2018-2020 Cesar Rincon "NightFox" @@ -33,19 +33,11 @@ MEMORY_MAPPER_TEST_PORT .EQU $FC ; Puerto para la pagina ; Usa el NGN_RAM_BUFFER, para las variables, define aqui los offsets -MEMORY_PAGE_ADDR .EQU $40 ; Direccion de memoria de la pagina 2 bytes - -MEMORY_SLOT_ID .EQU $42 ; ID de slot en formato (ExxxSSPP) 1 byte - ; bit 0-1 = Primary slot number - ; bit 2-3 = Sub-slot number (optional) - ; bit 4-6 = Unused - ; bit 7 = 1 if Slot is Expanded - -MEMORY_SLOT_SELECTION .EQU $43 ; Guarda el byte del OUT de seleccion de slot principal [$A8] 1 byte -MEMORY_SUBSLOT_SELECTION .EQU $44 ; Guarda el byte de seleccion de sub-slot [$FFFF] 1 byte -MEMORY_PAGE3_SLOT .EQU $45 ; Guarda el byte de la seleccion de la pagina 3 1 byte -MEMORY_IN_CURRENT_SELECTION .EQU $46 ; Memoria encontrada en la seleccion actual 3 bytes -MEMORY_MAPPER_TOTAL_PAGES .EQU $49 ; Nº de paginas del mapper 2 bytes +MEMORY_SLOT_SELECTION .EQU $100 ; Guarda el byte del OUT de seleccion de slot principal [$A8] 1 byte +MEMORY_SUBSLOT_SELECTION .EQU $101 ; Guarda el byte de seleccion de sub-slot [$FFFF] 1 byte +MEMORY_PAGE3_SLOT .EQU $102 ; Guarda el byte de la seleccion de la pagina 3 1 byte +MEMORY_IN_CURRENT_SELECTION .EQU $103 ; Memoria encontrada en la seleccion actual 3 bytes +MEMORY_MAPPER_TOTAL_PAGES .EQU $106 ; Nº de paginas del mapper 2 bytes MEMORY_MAPPER_PAGES_BACKUP .EQU $200 ; Bytes de las paginas del mapper 256 bytes @@ -176,6 +168,57 @@ MONITOR_COLOR_FRAME .EQU 3 ; Frame actual +; ---------------------------------------------------------- +; Test de la memoria RAM +; ---------------------------------------------------------- + +; Constantes +RAM_TEST_MAPPER_PORT .EQU $FC ; Pagina 1 +RAM_TEST_MAPPER_ADDRESS .EQU $0000 ; Direccion de inicio de la pagina + +; Usa el NGN_RAM_BUFFER, para las variables, define aqui los offsets + +RAM_TEST_TEMP_CURSOR .EQU $200 ; Posicion del cursor (2 bytes) +RAM_TEST_SLOT_INFO_OFFSET .EQU $202 ; Offset para poder acceder a la informacion del SLOT (1 byte) + ; Variable (RAM_SLOT_0...) +RAM_TEST_SLOT_INFO .EQU $203 ; Informacion del slot actual (1 byte) + +RAM_TEST_SHOW_ALL_INFO .EQU $204 ; Muestra TODA la informacion? (1 byte) +RAM_TEST_TOTAL_OPTIONS .EQU $205 ; Numero de opciones detectadas (1 byte) +RAM_TEST_FIRST_OPTION .EQU $206 ; Primera opcion (1 byte) +RAM_TEST_LAST_OPTION .EQU $207 ; Ultima opcion (1 byte) +RAM_TEST_OPTION_LIST .EQU $208 ; ID's de los slots encontrados (1 byte x 16) +RAM_TEST_SLOT_OK .EQU $220 ; El slot/sub-slot actual contiene RAM (1 byte) + +RAM_TEST_TEMP_STRING .EQU $221 ; Cadena de texto temporal (32 bytes) + +RAM_TEST_PAGES_TO_TEST .EQU $250 ; Numero de paginas a probar (1 byte) +RAM_TEST_PAGES_LIST .EQU $251 ; Array de datos de las paginas a probar (7 bytes x 4) + ; [ 1 byte ][ 1 byte ][ 1 byte ][ 1 byte ][ 1 byte ][ 1 byte ][ 1 byte ] + ; [1111][1111][ ][ ][ ] + ; [MAP?][PAGE][ START ADDRESS ][ END ADDRESS ][ SIZE ] + +RAM_TEST_MAPPED_TOTAL_KB .EQU $270 ; Numero total de KB del mapper (2 bytes) +RAM_TEST_MAPPED_TOTAL_PAGES .EQU $272 ; Numero de paginas del mapper (2 bytes) +RAM_TEST_MAPPED_CURRETN_KB .EQU $274 ; KB completados del analisis (2 bytes) +RAM_TEST_MAPPED_CURRENT_PAGE .EQU $276 ; Numero de pagina actual del mapper (1 byte) + +RAM_TEST_BYTE_BACKUP .EQU $280 ; Copia de seguridad del byte a probar (1 byte) +RAM_TEST_BYTE_ERROR .EQU $281 ; Error (1 byte) +RAM_TEST_PAGE_ERRORS .EQU $282 ; Numero de errores de esta pagina (2 bytes) +RAM_TEST_SLOT_ERRORS .EQU $284 ; Numero de errores totales de este slot (2 bytes) + +RAM_TEST_SLOT_SELECTION .EQU $290 ; Seleccion de SLOT usando el puerto A8 (33221100) (1 byte) +RAM_TEST_SUBSLOT_SELECTION .EQU $291 ; Seleccion de SUB-SLOT usando la direccion $FFFF (33221100) (1 byte) +RAM_TEST_FFFF_SELECTION .EQU $292 ; Seleccion de la pagina 3 para acceder a FFFF (1 byte) +RAM_TEST_SLOT_BACKUP .EQU $293 ; Backup del slot actual +RAM_TEST_SUBSLOT_BACKUP .EQU $294 ; Backup del sub-slot actual + +RAM_TEST_BYTE_ROUTINE_ADDR .EQU $700 ; Offset de la rutina +RAM_TEST_BYTE_ROUTINE_SIZE .EQU $FF ; Tamaño de la rutina + + + ;*********************************************************** ; Fin del archivo ;*********************************************************** diff --git a/source/prog/joystick_test.asm b/source/prog/joystick_test.asm index 4378b50..65f3630 100644 --- a/source/prog/joystick_test.asm +++ b/source/prog/joystick_test.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Test de los Joysticks ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/keyboard_test.asm b/source/prog/keyboard_test.asm index 61552a3..c9112d9 100644 --- a/source/prog/keyboard_test.asm +++ b/source/prog/keyboard_test.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Test del teclado ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/main.asm b/source/prog/main.asm index b369ee7..ef9a740 100644 --- a/source/prog/main.asm +++ b/source/prog/main.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Archivo principal ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/main_menu_common.asm b/source/prog/main_menu_common.asm index 3556810..d453dd2 100644 --- a/source/prog/main_menu_common.asm +++ b/source/prog/main_menu_common.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Menu Principal (Funciones comunes) ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/main_menu_p1.asm b/source/prog/main_menu_p1.asm index 81db0b1..7d58f31 100644 --- a/source/prog/main_menu_p1.asm +++ b/source/prog/main_menu_p1.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Menu Principal (Pagina 1) ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/main_menu_p2.asm b/source/prog/main_menu_p2.asm index 25b7daa..09c5e5c 100644 --- a/source/prog/main_menu_p2.asm +++ b/source/prog/main_menu_p2.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Menu Principal (Pagina 2) ; (cc) 2018-2020 Cesar Rincon "NightFox" @@ -79,22 +79,22 @@ FUNCTION_MAIN_MENU_P2: ; Si se pulsa la tecla 1 ld a, [NGN_KEY_1] ; Tecla 1 and $02 ; Detecta "KEY DOWN" - jp nz, FUNCTION_MAIN_MENU_MONITOR_COLOR ; Ejecuta la opcion + jp nz, FUNCTION_MAIN_MENU_RAM_LAYOUT ; Ejecuta la opcion ; Si se pulsa la tecla 2 ld a, [NGN_KEY_2] ; Tecla 2 and $02 ; Detecta "KEY DOWN" - jp nz, FUNCTION_MAIN_MENU_MIXED_MODE ; Ejecuta la opcion + jp nz, FUNCTION_MAIN_MENU_RAM_CHECK ; Ejecuta la opcion ; Si se pulsa la tecla 3 - ld a, [NGN_KEY_3] ; Tecla 3 - and $02 ; Detecta "KEY DOWN" - jp nz, FUNCTION_MAIN_MENU_P2_3 ; Ejecuta la opcion + ld a, [NGN_KEY_3] ; Tecla 3 + and $02 ; Detecta "KEY DOWN" + jp nz, FUNCTION_MAIN_MENU_MONITOR_COLOR ; Ejecuta la opcion ; Si se pulsa la tecla 4 - ld a, [NGN_KEY_4] ; Tecla 4 - and $02 ; Detecta "KEY DOWN" - jp nz, FUNCTION_MAIN_MENU_P2_4 ; Ejecuta la opcion + ld a, [NGN_KEY_4] ; Tecla 4 + and $02 ; Detecta "KEY DOWN" + jp nz, FUNCTION_MAIN_MENU_MIXED_MODE ; Ejecuta la opcion ; Si se pulsa la tecla 5 ld a, [NGN_KEY_5] ; Tecla 5 @@ -181,16 +181,16 @@ FUNCTION_MAIN_MENU_P2: ; Opcion 1 cp 1 - jp z, FUNCTION_MAIN_MENU_MONITOR_COLOR ; Ejecuta la opcion + jp z, FUNCTION_MAIN_MENU_RAM_LAYOUT ; Ejecuta la opcion ; Opcion 2 cp 2 - jp z, FUNCTION_MAIN_MENU_MIXED_MODE ; Ejecuta la opcion + jp z, FUNCTION_MAIN_MENU_RAM_CHECK ; Ejecuta la opcion ; Opcion 3 cp 3 - jp z, FUNCTION_MAIN_MENU_P2_3 ; Ejecuta la opcion + jp z, FUNCTION_MAIN_MENU_MONITOR_COLOR ; Ejecuta la opcion ; Opcion 4 cp 4 - jp z, FUNCTION_MAIN_MENU_P2_4 ; Ejecuta la opcion + jp z, FUNCTION_MAIN_MENU_MIXED_MODE ; Ejecuta la opcion ; Opcion 5 cp 5 jp z, FUNCTION_MAIN_MENU_P2_5 ; Ejecuta la opcion @@ -229,13 +229,13 @@ FUNCTION_MAIN_MENU_P2: ; ---------------------------------------------------------- -; FUNCTION_MAIN_MENU_MONITOR_COLOR [1] +; FUNCTION_MAIN_MENU_RAM_LAYOUT [1] ; ---------------------------------------------------------- -FUNCTION_MAIN_MENU_MONITOR_COLOR: +FUNCTION_MAIN_MENU_RAM_LAYOUT: ; Llama la funcion correspondiente - call FUNCTION_MONITOR_COLOR_TEST_MENU + call FUNCTION_RAM_TEST_LAYOUT_REPORT ; Deshabilita la pantalla para el cambio call $0041 @@ -247,13 +247,13 @@ FUNCTION_MAIN_MENU_MONITOR_COLOR: ; ---------------------------------------------------------- -; FUNCTION_MAIN_MENU_MIXED_MODE [2] +; FUNCTION_MAIN_MENU_RAM_CHECK [2] ; ---------------------------------------------------------- -FUNCTION_MAIN_MENU_MIXED_MODE: +FUNCTION_MAIN_MENU_RAM_CHECK: ; Llama la funcion correspondiente - call FUNCTION_MIXED_MODE_TEST_MENU + call FUNCTION_RAM_TEST_MENU ; Deshabilita la pantalla para el cambio call $0041 @@ -265,12 +265,13 @@ FUNCTION_MAIN_MENU_MIXED_MODE: ; ---------------------------------------------------------- -; FUNCTION_MAIN_MENU_P2_3 [3] +; FUNCTION_MAIN_MENU_MONITOR_COLOR [3] ; ---------------------------------------------------------- -FUNCTION_MAIN_MENU_P2_3: +FUNCTION_MAIN_MENU_MONITOR_COLOR: ; Llama la funcion correspondiente + call FUNCTION_MONITOR_COLOR_TEST_MENU ; Deshabilita la pantalla para el cambio call $0041 @@ -282,12 +283,13 @@ FUNCTION_MAIN_MENU_P2_3: ; ---------------------------------------------------------- -; FUNCTION_MAIN_MENU_P2_4 [4] +; FUNCTION_MAIN_MENU_MIXED_MODE [4] ; ---------------------------------------------------------- -FUNCTION_MAIN_MENU_P2_4: +FUNCTION_MAIN_MENU_MIXED_MODE: ; Llama la funcion correspondiente + call FUNCTION_MIXED_MODE_TEST_MENU ; Deshabilita la pantalla para el cambio call $0041 diff --git a/source/prog/memory_routines.asm b/source/prog/memory_routines.asm index 14cb80a..91afb8f 100644 --- a/source/prog/memory_routines.asm +++ b/source/prog/memory_routines.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Rutinas de la gestion de memoria ; (cc) 2018-2020 Cesar Rincon "NightFox" @@ -46,7 +46,7 @@ FUNCTION_MEMORY_GET_SLOT_LAYOUT: ld a, [hl] ; Lectura del estado del slot - ld hl, SLOT_EXPANDED ; Variable para almacenar el resultado + ld hl, MEMORY_SLOT_EXPANDED ; Variable para almacenar el resultado add hl, de ; Sumale el nº de slot (continua guardado en DE) bit 7, a ; Esta expandido? @@ -79,8 +79,7 @@ FUNCTION_MEMORY_GET_MEMORY_LAYOUT: ld hl, RAM_DETECTED ; Variable BCD ld b, 3 ; 3 bytes (6 digitos) @@RESET_RAM_COUNTER: - xor a - ld [hl], a + ld [hl], $00 inc hl djnz @@RESET_RAM_COUNTER @@ -88,11 +87,21 @@ FUNCTION_MEMORY_GET_MEMORY_LAYOUT: ld hl, RAM_SLOT_0 ld b, 16 ; 4 slots x 4 sub-slots @@RESET_RAM_BANKS_COUNTER: - xor a - ld [hl], a + ld [hl], $00 inc hl djnz @@RESET_RAM_BANKS_COUNTER + ; Pon a 0 los contadores de KB por banco + ld hl, RAM_BANK_SIZE + ld b, 64 ; 4 slots x 4 sub-slots x 4 paginas x 2 bytes por pagina + @@RESET_RAM_BANK_SIZE: + ld [hl], $00 + inc hl + ld [hl], $00 + inc hl + djnz @@RESET_RAM_BANK_SIZE + + ; Recorre los slots y marca si estan expandidos ld bc, $0400 ; B = 4 slots / C = Empieza en el slot 0 @@SLOT_CHECK_LOOP: @@ -102,10 +111,10 @@ FUNCTION_MEMORY_GET_MEMORY_LAYOUT: ld a, c ; Registra el ID de slot and $03 ; Bitmask del nº de slot (xxxxxx11) - ld [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)], a + ld [MEMORY_SLOT_ID], a ; El slot esta expandido? - ld hl, SLOT_EXPANDED ; Lee el flag de expansion (!0 = Expandido) + ld hl, MEMORY_SLOT_EXPANDED ; Lee el flag de expansion (!0 = Expandido) ld d, 0 ; Del nº de slot ld e, c add hl, de ; Sumale el offset del nº de slot @@ -114,9 +123,9 @@ FUNCTION_MEMORY_GET_MEMORY_LAYOUT: jp z, @@SLOT_IS_NOT_EXPANDED ; Slot expandido - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] + ld a, [MEMORY_SLOT_ID] set 7, a - ld [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)], a + ld [MEMORY_SLOT_ID], a ; Bucle de SUB-SLOTS ld bc, $0400 ; B = 4 slots / C = Empieza en el sub-slot 0 @@ -125,12 +134,12 @@ FUNCTION_MEMORY_GET_MEMORY_LAYOUT: ; Preserva los contadores del bucle push bc - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; Lee la informacion de SLOT y FLAG (1xxxxx11) + ld a, [MEMORY_SLOT_ID] ; Lee la informacion de SLOT y FLAG (1xxxxx11) and $83 ; BITMASK (1xxxxx11) sla c ; Bitshift << 2 sla c ; Para colocar el nº de sub-slot en la posicion correcta (xxxx11xx) or c ; Añade la informacion al ID de slot - ld [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)], a ; Y guarda el ID completo + ld [MEMORY_SLOT_ID], a ; Y guarda el ID completo call FUNCION_MEMORY_GET_SLOT_RAM ; Busca toda la RAM en ese SUB-SLOT @@ -146,9 +155,9 @@ FUNCTION_MEMORY_GET_MEMORY_LAYOUT: call FUNCION_MEMORY_GET_SLOT_RAM ; Busca toda la RAM en ese SLOT @@SLOT_CHECK_LOOP_END: - pop bc ; Restaura los contadores del bucle - inc c ; Siguiente slot - djnz @@SLOT_CHECK_LOOP ; Fin del bucle principal (SLOTS) + pop bc ; Restaura los contadores del bucle + inc c ; Siguiente slot + djnz @@SLOT_CHECK_LOOP ; Fin del bucle principal (SLOTS) ; Fin de la funcion ret @@ -196,7 +205,7 @@ FUNCION_MEMORY_GET_SLOT_RAM: FUNCION_MEMORY_GET_RAM_PAGES012_NO_MAPPER: ld hl, $0000 ; Direccion inicial de la pagina - ld [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)], hl + ld [MEMORY_PAGE_ADDR], hl ld b, $0C ; Paginas del 0 al 3 en pasos de 4kb (12 X 4) @@CHECK_PAGES_LOOP: @@ -206,8 +215,8 @@ FUNCION_MEMORY_GET_RAM_PAGES012_NO_MAPPER: di ; Deshabilita las interrupciones ; Paso 1, lee 1 byte - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot - ld hl, [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)] ; Direccion de la pagina + ld a, [MEMORY_SLOT_ID] ; ID de slot + ld hl, [MEMORY_PAGE_ADDR] ; Direccion de la pagina call $000C ; Lee un byte del slot con la ID en A de la direccion HL (RDSLT) ld b, a ; Respaldo del byte leido cpl ; Invierte los bits @@ -215,14 +224,14 @@ FUNCION_MEMORY_GET_RAM_PAGES012_NO_MAPPER: ; Paso 2, escribelo invertido ld e, a ; Byte a escribir ld c, a - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot - ld hl, [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)] ; Direccion de la pagina + ld a, [MEMORY_SLOT_ID] ; ID de slot + ld hl, [MEMORY_PAGE_ADDR] ; Direccion de la pagina push bc call $0014 ; Escribe un byte (E) en el slot con la ID en A en la direccion HL (WRSLT) ; Paso 3, vuelvelo a leer y compara si es el mismo que has escrito - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot - ld hl, [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)] ; Direccion de la pagina + ld a, [MEMORY_SLOT_ID] ; ID de slot + ld hl, [MEMORY_PAGE_ADDR] ; Direccion de la pagina call $000C ; Lee un byte del slot con la ID en A de la direccion HL (RDSLT) pop bc cp c ; Son iguales ? @@ -230,8 +239,8 @@ FUNCION_MEMORY_GET_RAM_PAGES012_NO_MAPPER: ; Paso 4, restaua el byte original en su sitio ld e, b ; Byte a escribir (restaura el original) - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot - ld hl, [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)] ; Direccion de la pagina + ld a, [MEMORY_SLOT_ID] ; ID de slot + ld hl, [MEMORY_PAGE_ADDR] ; Direccion de la pagina call $0014 ; Escribe un byte (E) en el slot con la ID en A en la direccion HL (WRSLT) ; Paso 5, Suma 4kb de esta pagina @@ -243,10 +252,10 @@ FUNCION_MEMORY_GET_RAM_PAGES012_NO_MAPPER: pop bc ; Restaura el contador del bucle - ld hl, [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)] + ld hl, [MEMORY_PAGE_ADDR] ld de, $1000 ; Siguiente segmento de 4kb add hl, de - ld [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)], hl + ld [MEMORY_PAGE_ADDR], hl djnz @@CHECK_PAGES_LOOP @@ -265,7 +274,7 @@ FUNCION_MEMORY_GET_RAM_PAGE3_NO_MAPPER: ; Informa de la direccion inicial de memoria del test ld hl, $C000 - ld [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)], hl + ld [MEMORY_PAGE_ADDR], hl ld b, 4 ; 4 segmentos de 4kb @@CHECK_CHUNKS_LOOP: @@ -284,25 +293,21 @@ FUNCION_MEMORY_GET_RAM_PAGE3_NO_MAPPER: ; Calcula el SLOT [E] ld c, $03 ; Mascara de slot en pagina... [xxxxxx11] en [C] - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; Lee el ID de configuracion de slots + ld a, [MEMORY_SLOT_ID] ; Lee el ID de configuracion de slots and c ; Aplica la mascara ld e, a ; Guarda el slot en E ; Calcula el SUB-SLOT [D] - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; Lee el ID de configuracion de slots + ld a, [MEMORY_SLOT_ID] ; Lee el ID de configuracion de slots srl a ; >> 2 srl a ; Pon los BITS 2 y 3 en 0 y 1 and c ; Aplica la mascara ld d, a ; Guarda el sub-slot en D ; Seleccion de la direccion de memoria a analizar - ld hl, [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)] + ld hl, [MEMORY_PAGE_ADDR] ; Calcula el numero de pagina segun la direccion de memoria - ld a, h ; Con el dato en H - ld b, 6 ; Y desplazando 6 bits a la derecha... - @@GET_PAGE_NUMBER: - srl a ; >> 1 - djnz @@GET_PAGE_NUMBER + call FUNCION_MEMORY_GET_PAGE_NUMBER ld b, a ; Numero de pagina en B ; Has de desplazar el numero de bits a otra ubicacion que no sea la pagina 0? @@ -324,7 +329,7 @@ FUNCION_MEMORY_GET_RAM_PAGE3_NO_MAPPER: ld c, a ; Guardalo en C ; Esta expandido? - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] + ld a, [MEMORY_SLOT_ID] bit 7, a jr z, @@NOT_EXPANDED @@ -367,10 +372,10 @@ FUNCION_MEMORY_GET_RAM_PAGE3_NO_MAPPER: pop bc ; Recupera los registros del contador - ld hl, [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)] + ld hl, [MEMORY_PAGE_ADDR] ld de, $1000 ; Siguiente segmento de 4kb add hl, de - ld [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)], hl + ld [MEMORY_PAGE_ADDR], hl ;djnz @@CHECK_CHUNKS_LOOP ; Fin del bucle dec b @@ -383,6 +388,9 @@ FUNCION_MEMORY_GET_RAM_PAGE3_NO_MAPPER: ; ---------------------------------------------------------- ; Funcion verificar si el segmento es RAM (NO EXPANDIDO) +; A = Configguracion de SLOTS +; HL = Direccion a analizar +; Devuelve E si es RAM ($FF) ; ---------------------------------------------------------- FUNCTION_MEMORY_CHECK_IF_RAM_NO_EXPANDED: @@ -423,6 +431,9 @@ FUNCTION_MEMORY_CHECK_IF_RAM_NO_EXPANDED: ; ---------------------------------------------------------- ; Funcion verificar si el segmento es RAM (EXPANDIDO) +; A = Configuracion de SLOTS (AABBCCDD) +; HL = Direccion a analizar +; Devuelve E si es RAM ($FF) ; ---------------------------------------------------------- FUNCTION_MEMORY_CHECK_IF_RAM_EXPANDED: @@ -485,23 +496,31 @@ FUNCTION_MEMORY_COUNTER_ADD_4KB: ; Define el numero de KB a añadir ld hl, NGN_RAM_BUFFER - ld [hl], $04 + ld [hl], $04 ; D inc hl - ld [hl], $00 + ld [hl], $00 ; C inc hl - ld [hl], $00 + ld [hl], $00 ; B + ; 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 + ; Define el origen y el destino para el contador local ld de, (NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION) ld hl, NGN_RAM_BUFFER ; Realiza la suma call NGN_BCD_ADD + + ; Suma de la memoria en esta pagina + ld de, $0004 + call FUNCTION_MEMORY_PAGE_RAM_SIZE + ; Marca el banco de memoria call FUNCTION_MEMORY_MARK_RAM_BANK + ; Vuelve ret @@ -514,14 +533,11 @@ FUNCTION_MEMORY_COUNTER_ADD_4KB: FUNCTION_MEMORY_MARK_RAM_BANK: ; Lee la direccion actual - ld hl, [(NGN_RAM_BUFFER + MEMORY_PAGE_ADDR)] + ld hl, [MEMORY_PAGE_ADDR] + ; Calcula el numero de pagina en HL + call FUNCION_MEMORY_GET_PAGE_NUMBER + ; Marca el BIT de la pagina actual en C - ; Calcula el numero de pagina - ld a, h - ld b, 6 - @@GET_PAGE_NUMBER: - srl a ; >> 1 - djnz @@GET_PAGE_NUMBER ld b, a ; Guarda el resultado en B (numero de pagina) ld c, 1 ; Marca de la pagina 0 (bit 0) por defecto en C or a @@ -540,23 +556,70 @@ FUNCTION_MEMORY_MARK_RAM_BANK: or c ; Añadelas and $0F ; Bitmask de los 4 primeros bits ld [hl], a ; Actualiza el registro - - ; Si este banco tiene 64kb, posiblemente sea un mapper, indica que esta lleno (BIT 7) si es necesario + + ; Si este banco tiene 64kb, posiblemente sea un mapper, indica que esta lleno (BIT 6) si es necesario ld a, [(NGN_RAM_BUFFER + MEMORY_IN_CURRENT_SELECTION)] sub a, $40 ; Resta 64 - ret c ; Si no ha llegado a 64kb, sal ya + ret c ; Si no ha llegado a 64kb, no lo marques como lleno ; Hay el banco esta lleno, indicalo en el BIT 6 set 6, [hl] + ; Sal de la funcion ret +; ---------------------------------------------------------- +; Funcion para guardar la RAM de cada pagina +; DE = Total de KB a añadir +; Modifica AF, BC, DE, HL +; ---------------------------------------------------------- + +FUNCTION_MEMORY_PAGE_RAM_SIZE: + + ; Preserva el registro con los KB + push de + + ; Lee la direccion actual + ld hl, [MEMORY_PAGE_ADDR] + ; Calcula el numero de pagina en HL + call FUNCION_MEMORY_GET_PAGE_NUMBER + + ; Ahora obten la variable de destino segun el slot, sub-slot y nº de pagina + call FUNCION_MEMORY_GET_RAM_BANK_SIZE_VARIABLE + + pop de ; Recupera los KB a añadir + + push hl ; Preserva la direccion + ld b, h ; Copiala a BC + ld c, l + + ld a, [bc] ; Lee los 2 bytes de datos en la direccion y guardalos en HL + ld h, a + inc bc + ld a, [bc] + ld l, a + + add hl, de ; Sumalo + + ld b, h ; Guarda el resultado en BC + ld c, l + + pop hl ; Recupera la direccion + + ld [hl], b ; Guardalo en la variable de nuevo + inc hl + ld [hl], c + + ; Sal de la funcion + ret + + ; ---------------------------------------------------------- -; Funcion para detectar la RAM un mapper a partir -; de la informacion en la pagina 2 +; Funcion para detectar la RAM un mapper usando una +; de las paginas ; ---------------------------------------------------------- FUNCION_MEMORY_GET_RAM_IN_MAPPER: @@ -576,7 +639,7 @@ FUNCION_MEMORY_GET_RAM_IN_MAPPER: push de ld a, b ; Carga el nº de segmento actual out [MEMORY_MAPPER_TEST_PORT], a ; Seleccion del segmento del mapper - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot + ld a, [MEMORY_SLOT_ID] ; ID de slot ld hl, MEMORY_MAPPER_TEST_PAGE ; 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 @@ -597,7 +660,7 @@ FUNCION_MEMORY_GET_RAM_IN_MAPPER: ld a, c ; Carga el nº de segmento actual out [MEMORY_MAPPER_TEST_PORT], a ; Seleccion del segmento del mapper ld e, $FF ; Byte a escribir - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot + ld a, [MEMORY_SLOT_ID] ; ID de slot ld hl, MEMORY_MAPPER_TEST_PAGE ; 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 @@ -615,7 +678,7 @@ FUNCION_MEMORY_GET_RAM_IN_MAPPER: push bc ; Preserva el registro ld a, c ; Carga el nº de segmento actual out [MEMORY_MAPPER_TEST_PORT], a ; Seleccion del segmento del mapper - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot + ld a, [MEMORY_SLOT_ID] ; ID de slot ld hl, MEMORY_MAPPER_TEST_PAGE ; 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 @@ -626,7 +689,7 @@ FUNCION_MEMORY_GET_RAM_IN_MAPPER: ld [(NGN_RAM_BUFFER + MEMORY_MAPPER_TOTAL_PAGES)], hl push bc ld e, c ; Byte a escribir (nº de segmento) - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] ; ID de slot + ld a, [MEMORY_SLOT_ID] ; ID de slot ld hl, MEMORY_MAPPER_TEST_PAGE ; 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 @@ -648,7 +711,7 @@ FUNCION_MEMORY_GET_RAM_IN_MAPPER: out [MEMORY_MAPPER_TEST_PORT], 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 a, [MEMORY_SLOT_ID] ; ID de slot ld hl, MEMORY_MAPPER_TEST_PAGE ; 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 @@ -673,39 +736,87 @@ FUNCION_MEMORY_GET_RAM_IN_MAPPER: call FUNCION_MEMORY_GET_CURRENT_SLOT_VARIABLE ; Carga en HL la variable con la informacion del slot actual set 7, [hl] + ; Borra el contador de RAM de las paginas del slot/subslot seleccionado + xor a + ld [MEMORY_CURRENT_PAGE], a + call FUNCION_MEMORY_GET_RAM_BANK_SIZE_VARIABLE + ld b, 8 ; 4 paginas x 2 bytes + @@RESET_PAGE_RAM_COUNTER: + ld [hl], 0 + inc hl + djnz @@RESET_PAGE_RAM_COUNTER + ; Resta 64kb al contador de memoria ; Define el numero de KB a añadir ld hl, NGN_RAM_BUFFER - ld [hl], $64 + ld [hl], $64 ; D inc hl - ld [hl], $00 + ld [hl], $00 ; C inc hl - ld [hl], $00 + ld [hl], $00 ; B ; 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 + + ; Indica que las operacion se realizaran sobre la pagina 1 (nº de paginas del mapper) + ld a, 1 + ld [MEMORY_CURRENT_PAGE], a + ; Calcula la direccion de la variable y guardala en BC + call FUNCION_MEMORY_GET_RAM_BANK_SIZE_VARIABLE + ld de, [(NGN_RAM_BUFFER + MEMORY_MAPPER_TOTAL_PAGES)] + ld [hl], d + inc hl + ld [hl], e + + + ; Indica que las operacion se realizaran sobre la pagina 0 (nº de kb del mapper) + xor a + ld [MEMORY_CURRENT_PAGE], a + ; Calcula la direccion de la variable y guardala en BC + call FUNCION_MEMORY_GET_RAM_BANK_SIZE_VARIABLE + ld b, h + ld c, l + ; Suma 16kb al contador de memoria por cada segmento encontrado ld hl, [(NGN_RAM_BUFFER + MEMORY_MAPPER_TOTAL_PAGES)] + @@ADD_MAPPED_MEMORY: + ; Preserva los registros push hl + push bc + ; Define el numero de KB a añadir ld hl, NGN_RAM_BUFFER - ld [hl], $16 + ld [hl], $16 ; D inc hl - ld [hl], $00 + ld [hl], $00 ; C inc hl - ld [hl], $00 + ld [hl], $00 ; B + ; Define el origen y el destino para el contador general ld de, RAM_DETECTED ld hl, NGN_RAM_BUFFER - ; Realiza la suma + + ; Realiza la suma global call NGN_BCD_ADD + + ; Realiza la suma de pagina (solo la 0) + pop bc ; Recupera la direccion de la variable del contador de pagina + ld h, b ; Y guardala en HL + ld l, c + push bc ; Vuelvela a guardar + ld de, $0010 ; Valor a sumar (16kb) + call FUNCTION_MEMORY_PAGE_RAM_SIZE + ; Recupera los registros y repite + pop bc pop hl + + ; Calcula el siguiente ciclo del bucle dec hl ld a, h or l @@ -728,7 +839,7 @@ FUNCION_MEMORY_GET_CURRENT_SLOT_VARIABLE: ; Busca la variable que guarda el slot actual ld hl, RAM_SLOT_0 ; Calcula el offset segun el slot - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] + ld a, [MEMORY_SLOT_ID] and $03 ; bitmask del slot ld b, a ; Prepara el desplazamiento or a @@ -739,7 +850,7 @@ FUNCION_MEMORY_GET_CURRENT_SLOT_VARIABLE: djnz @@CALCULATE_SLOT_OFFSET @@NO_SLOT_OFFSET: ; Calcula el offset segun el sub-slot - ld a, [(NGN_RAM_BUFFER + MEMORY_SLOT_ID)] + ld a, [MEMORY_SLOT_ID] srl a ; Desplazamiento del sub-slot srl a and $03 ; Bitmask del subslot @@ -756,6 +867,98 @@ FUNCION_MEMORY_GET_CURRENT_SLOT_VARIABLE: +; ---------------------------------------------------------- +; Funcion para buscar la variable que guarda la +; informacion de la memoria en un banco concreto +; SLOT/SUBSLOT/PAGINA +; Devuelve la variable en HL +; Modifica AF, BC, DE, HL +; ---------------------------------------------------------- + +FUNCION_MEMORY_GET_RAM_BANK_SIZE_VARIABLE: + + ; Identifica el slot + ld a, [MEMORY_SLOT_ID] + and $03 ; Bitmask para el slot + ld d, a ; Guardalo en D + + ; Identifica el sub-slot + ld a, [MEMORY_SLOT_ID] + srl a ; Bitshift >> 2 + srl a + and $03 ; Bitmask para el sub-slot + ld c, a ; Guardalo en C + + ld e, $00 ; Offset a 0 + + ; Offset por slot + xor a + or d + jr z, @@NO_SLOT_OFFSET + ld b, d + ld a, e + @@SLOT_OFFSET_LOOP: ; Calcula el offset por SLOT + add a, 32 + djnz @@SLOT_OFFSET_LOOP + ld e, a ; Actualiza el offset + + ; Offset por sub-slot + @@NO_SLOT_OFFSET: + xor a + or c ; El SUB-SLOT es mayor de 0? + jr z, @@NO_SUBSLOT_OFFSET + ld b, c ; Numero de sub-slots + ld a, e ; Carga el offset actual + @@SUBSLOT_OFFSET_LOOP: ; Calcula el offset por sub-slot + add a, 8 + djnz @@SUBSLOT_OFFSET_LOOP + ld e, a ; Actualiza el offset + + ; Offset por pagina + @@NO_SUBSLOT_OFFSET: + ld a, [MEMORY_CURRENT_PAGE] ; Carga la pagina actual + or a + jr z, @@NOT_PAGE_OFFSET + ld b, a ; Numero de paginas + ld a, e ; Carga el offset actual + @@PAGE_OFFSET_LOOP: ; Calcula el offset por pagina + add a, 2 + djnz @@PAGE_OFFSET_LOOP + ld e, a ; Actualiza el offset + + ; Calcula la direccion de la variable con su offset + @@NOT_PAGE_OFFSET: + ld d, $00 + ld hl, RAM_BANK_SIZE + add hl, de + + ; Fin de la funcion, devuelve la direccion en HL + ret + + + +; ---------------------------------------------------------- +; Funcion para calcular el nº de pagina segun una +; direccion dada +; HL = Direccion [$0000 - $FFFF] +; Devuelve el nº de pagina en A [0 - 3] +; y guardalo en la variable correspondiente +; Modifica AF, B +; ---------------------------------------------------------- + +FUNCION_MEMORY_GET_PAGE_NUMBER: + + ; Calcula el numero de pagina + ld a, h + ld b, 6 + @@GET_PAGE_NUMBER: + srl a ; >> 1 + djnz @@GET_PAGE_NUMBER + ld [MEMORY_CURRENT_PAGE], a ; Variable para almacenar el numero de pagina + + ; Fin de la funcion, devuelve el nº de pagina en A + ret + ;*********************************************************** diff --git a/source/prog/mixed_mode_test.asm b/source/prog/mixed_mode_test.asm index f778902..db96fd5 100644 --- a/source/prog/mixed_mode_test.asm +++ b/source/prog/mixed_mode_test.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Test del modo mixto ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/monitor_color_test.asm b/source/prog/monitor_color_test.asm index fd708b5..66a4e12 100644 --- a/source/prog/monitor_color_test.asm +++ b/source/prog/monitor_color_test.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Test de color del monitor ; (cc) 2018-2020 Cesar Rincon "NightFox" @@ -321,6 +321,8 @@ FUNCTION_MONITOR_COLOR_TEST_RUN: + + ;*********************************************************** ; Fin del archivo ;*********************************************************** diff --git a/source/prog/psg_test.asm b/source/prog/psg_test.asm index bc6f610..311b681 100644 --- a/source/prog/psg_test.asm +++ b/source/prog/psg_test.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Test PSG ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/ram_test.asm b/source/prog/ram_test.asm new file mode 100644 index 0000000..27bee3f --- /dev/null +++ b/source/prog/ram_test.asm @@ -0,0 +1,872 @@ +;*********************************************************** +; +; MSX DIAGNOSTICS +; Version 1.1.9 +; ASM Z80 MSX +; Test de la memoria RAM +; (cc) 2018-2020 Cesar Rincon "NightFox" +; https://nightfoxandco.com +; +;*********************************************************** + + + + + +; ---------------------------------------------------------- +; Muestra el resumen de la configuracion de la memoria +; RAM instalada +; ---------------------------------------------------------- +FUNCTION_RAM_TEST_LAYOUT_REPORT: + + ; Borra la pantalla + call NGN_TEXT_CLS + + ; Ejecuta la rutina [DISSCR] para deshabilitar la pantalla + call $0041 + + ; ---------------------------------------------------------- + ; Impresion de la informacion: Cabecera + ; ---------------------------------------------------------- + + ; Titulo + ld hl, TEXT_RAM_INFO_HEADER + call NGN_TEXT_PRINT + ld hl, TEXT_DASHED_LINE ; Linea + call NGN_TEXT_PRINT ; Imprimelo + + ; Lista de bancos de RAM + ld hl, $0104 ; Posicion inicial del cuerpo de texto + call NGN_TEXT_POSITION + ld hl, TEXT_RAM_TEST_HEADER ; Titulo + call NGN_TEXT_PRINT ; Imprimelo + ld hl, TEXT_DASHED_LINE ; Linea + call NGN_TEXT_PRINT ; Imprimelo + + ; ---------------------------------------------------------- + ; Obten y muestra la informacion de la memoria RAM + ; (TODOS LOS SLOTS) + ; ---------------------------------------------------------- + ld a, $FF ; Muestra TODA la informacion + ld [(NGN_RAM_BUFFER + RAM_TEST_SHOW_ALL_INFO)], a + ld hl, $0906 ; Posicion inicial + call FUNCTION_RAM_DISPLAY_INFO + ld hl, TEXT_DASHED_LINE ; Linea + call NGN_TEXT_PRINT ; Imprimelo + + ; ---------------------------------------------------------- + ; Impresion de la informacion: Pie de pagina + ; ---------------------------------------------------------- + ld hl, $0118 + call NGN_TEXT_POSITION + ld hl, TEXT_SYSTEM_INFO_EXIT + call NGN_TEXT_PRINT + + ; Ejecuta la rutina [ENASCR] para habilitar la pantalla + call $0044 + + + ; ---------------------------------------------------------- + ; Espera a que se pulse aceptar o cancelar para salir + ; ---------------------------------------------------------- + + @@LOOP: + + ; Lectura del HID + call FUNCTION_SYSTEM_HID_READ + + ; Si se pulsa la tecla "ACEPTAR" + ld a, [SYSKEY_ACCEPT] + and $02 ; Detecta "KEY DOWN" + ret nz + + ; Si se pulsa la tecla "CANCELAR" + ld a, [SYSKEY_CANCEL] + and $02 ; Detecta "KEY DOWN" + ret nz + + ; Espera a la interrupcion del VDP (VSYNC) + halt + + ; Repite el bucle + jr @@LOOP + + + + + +; ---------------------------------------------------------- +; Menu del test de memoria RAM +; ---------------------------------------------------------- +FUNCTION_RAM_TEST_MENU: + + ; Borra la pantalla + call NGN_TEXT_CLS + + ; Ejecuta la rutina [DISSCR] para deshabilitar la pantalla + call $0041 + + ; ---------------------------------------------------------- + ; Impresion de la informacion: Cabecera + ; ---------------------------------------------------------- + + ; Lista de bancos de RAM + ld hl, $0101 ; Posicion inicial del cuerpo de texto + call NGN_TEXT_POSITION + ld hl, TEXT_RAM_TEST_HEADER ; Titulo + call NGN_TEXT_PRINT ; Imprimelo + ld hl, TEXT_DASHED_LINE ; Linea + call NGN_TEXT_PRINT ; Imprimelo + + + ; ---------------------------------------------------------- + ; Obten y muestra la informacion de la memoria RAM + ; (solo los slots disponibles) + ; ---------------------------------------------------------- + xor a ; Muestra solo la informacion presente + ld [(NGN_RAM_BUFFER + RAM_TEST_SHOW_ALL_INFO)], a + ld hl, $0903 ; Posicion incial + call FUNCTION_RAM_DISPLAY_INFO + + + ; ---------------------------------------------------------- + ; Impresion de la informacion: Pie de pagina + ; ---------------------------------------------------------- + ld hl, $0116 ; Posicion inicial del cuerpo de texto + call NGN_TEXT_POSITION + ld hl, TEXT_DASHED_LINE ; Linea + call NGN_TEXT_PRINT ; Imprimelo + ld hl, TEXT_RAM_TEST_HELP ; Instrucciones de ayuda + call NGN_TEXT_PRINT ; Imprimelo + + + ld hl, $0103 ; Posicion inicial del cuerpo de texto + call NGN_TEXT_POSITION + ld a, $C0 + call $00A2 ; [CHPUT] + + + ; Ejecuta la rutina [ENASCR] para habilitar la pantalla + call $0044 + + ; Prepara los datos del menu + xor a + ld [(NGN_RAM_BUFFER + RAM_TEST_FIRST_OPTION)], a ; Primera opcion del menu + ld [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)], a ; Opcion actual del seleccionada + ld [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR + 1)], a ; Ultima opcion seleccionada + ld a, [(NGN_RAM_BUFFER + RAM_TEST_TOTAL_OPTIONS)] + dec a + ld [(NGN_RAM_BUFFER + RAM_TEST_LAST_OPTION)], a ; Ultima opcion del menu + + + + ; ---------------------------------------------------------- + ; Menu de seleccion + ; ---------------------------------------------------------- + + ; Bucle de ejecucion + @@LOOP: + + ; Lectura del HID + call FUNCTION_SYSTEM_HID_READ + + + ; Si se pulsa la tecla "CANCELAR" + ld a, [SYSKEY_CANCEL] + and $02 ; Detecta "KEY DOWN" + ret nz ; Vuelve al menu principal + + + ; Si se pulsa arriba + ld a, [SYSKEY_UP] + and $02 ; Detecta "KEY DOWN" + jr z, @@M_DOWN ; Si no se cumple, siguiente + + ld a, [(NGN_RAM_BUFFER + RAM_TEST_FIRST_OPTION)] ; Carga la primera opcion + ld b, a + ld a, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)] ; Carga la opcion actual + cp b ; Si ya estas en el limite, continua + jr z, @@M_END + dec a ; Resta una opcion + ld [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)], a ; Guarda la seleccion + jr @@M_UPDATE + + + ; Si se pulsa abajo + @@M_DOWN: + ld a, [SYSKEY_DOWN] + and $02 ; Detecta "KEY DOWN" + jr z, @@M_ACCEPT ; Si no se cumple, siguiente + + ld a, [(NGN_RAM_BUFFER + RAM_TEST_LAST_OPTION)] ; Carga la primera opcion + ld b, a + ld a, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)] ; Carga la opcion actual + cp b ; Si ya estas en el limite, continua + jr z, @@M_END + inc a ; Resta una opcion + ld [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)], a ; Guarda la seleccion + + + ; Actualiza el cursor si es necesario + @@M_UPDATE: + ld h, 1 ; Borra la el cursor actual + ld a, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR + 1)] + add 3 ; Correccion de posicion + ld l, a + call NGN_TEXT_POSITION + ld a, $20 + call $00A2 ; [CHPUT] + + ld h, 1 ; Escribe el cursor en la posicion nueva + ld a, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)] + ld [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR + 1)], a + add 3 ; Correccion de posicion + ld l, a + call NGN_TEXT_POSITION + ld a, $C0 + call $00A2 ; [CHPUT] + jr @@M_END + + + ; Fin de las rutinas del menu, aceptacion de la opcion + @@M_ACCEPT: + ld a, [SYSKEY_ACCEPT] + and $02 ; Detecta "KEY DOWN" + jr z, @@M_END ; Salta si no se pulsa + + ; Opcion aceptada, guarda el slot/sub-slot a analizar + ld hl, (NGN_RAM_BUFFER + RAM_TEST_OPTION_LIST) + ld d, 0 + ld a, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)] + ld e, a + add hl, de + ld a, [hl] + ld [MEMORY_SLOT_ID], a + ; Ejecuta el test de RAM + jp FUNCTION_RAM_TEST_RUN + + + ; Fin del menu + @@M_END: + ; Espera a la interrupcion del VDP (VSYNC) + halt + + ; Repite el bucle + jr @@LOOP + + + +; ---------------------------------------------------------- +; Muestra y registra la informacion de la memoria RAM +; HL = Posicion inicial +; ---------------------------------------------------------- +FUNCTION_RAM_DISPLAY_INFO: + + ; ---------------------------------------------------------- + ; Impresion de la informacion: Parrilla de datos + ; ---------------------------------------------------------- + + ; Posicion inicial del cursor + ld [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)], hl + + ; Prepara la cadena de texto + ld hl, TEXT_RAM_TEST_SLOT_ID + ld de, (NGN_RAM_BUFFER + RAM_TEST_TEMP_STRING) + ld bc, $0007 + ldir + + ; Conteo de offset para la seleccion de slot/subslot + xor a + ld [(NGN_RAM_BUFFER + RAM_TEST_SLOT_INFO_OFFSET)], a + ; Total de slots + ld [(NGN_RAM_BUFFER + RAM_TEST_TOTAL_OPTIONS)], a + + ; Bucle de impresion de slots + ld bc, $0400 ; 4 Slots + @@SLOTS_GUI_LOOP: + + push bc ; Preserva los contadores + ld a, c ; Numero actual de slot + ld [MEMORY_CURRENT_SLOT], a + + ; Caracter para el numero de slot + ld hl, (NGN_RAM_BUFFER + RAM_TEST_TEMP_STRING + 2) + ld a, c + add $30 + ld [hl], a + + ; Bucle de los sub-slots + ld bc, $0400 ; 4 sub-slots + @@SUBSLOTS_GUI_LOOP: + + push bc ; Preserva los sub-contadores + + ; Lee el slot y guardalo en E + ld a, [MEMORY_CURRENT_SLOT] + ld e, a + ; Lee el sub-slot + ld a, c + ld [MEMORY_CURRENT_SUBSLOT], a ; Guarda el sub-slot en curso + ; Define el slot y subslot + sla a ; << 2 + sla a ; Coloca el nº de sub-slot en los bits 2 y 3 + or e ; Numero de slot + ld [MEMORY_SLOT_ID], a + ; Esta expandido? + ld hl, MEMORY_SLOT_EXPANDED ; Variable de informacio de expansiones + ld d, $00 ; Prepara el offset sobre la variable + ld a, [MEMORY_CURRENT_SLOT] ; Segun el slot + ld e, a + add hl, de ; Aplica el offset + ld a, [hl] ; Lee el valor + or a ; Si es cero, no pongas el flag + jr z, @@SLOT_ID_DONE + ld a, [MEMORY_SLOT_ID] ; Si esta expandido, marcalo + set 7, a + ld [MEMORY_SLOT_ID], a + + @@SLOT_ID_DONE: + ; Resetea el flag de slot con contenido + xor a + ld [(NGN_RAM_BUFFER + RAM_TEST_SLOT_OK)], a + + exx ; Preserva los registros actuales + ld a, [(NGN_RAM_BUFFER + RAM_TEST_SLOT_INFO_OFFSET)] ; Carga el offset actual + ld e, a ; en DE + ld d, 0 + ld hl, RAM_SLOT_0 ; Selecciona la variable de INFO de slots + add hl, de ; Aplica el offset + ld a, [hl] ; Carga la info + ld [(NGN_RAM_BUFFER + RAM_TEST_SLOT_INFO)], a + exx ; Restaura los registros + + ; Este sub-slot, esta vacio? + ; Y no se ha marcado que se fuerce mostrarlo + ld a, [(NGN_RAM_BUFFER + RAM_TEST_SHOW_ALL_INFO)] + ld e, a + ld a, [(NGN_RAM_BUFFER + RAM_TEST_SLOT_INFO)] + or a + or e + jp z, @@SKIP_THIS_SUBSLOT + + ; No esta vacio, indicalo + ld a, $FF + ld [(NGN_RAM_BUFFER + RAM_TEST_SLOT_OK)], a + + ; Caracter para el numero de sub-slot (C) + ld hl, (NGN_RAM_BUFFER + RAM_TEST_TEMP_STRING + 4) + ld a, c + add $30 + ld [hl], a + + ld hl, (NGN_RAM_BUFFER + RAM_TEST_TEMP_STRING) ; Ubicacion del texto + call NGN_TEXT_PRINT ; Imprimelo + + ; Bucle para el contador de paginas + ld bc, $0400 + @@PAGE_GUI_LOOP: + + push bc ; Preserva el contador + + ld a, c ; Registra el numero de pagina + ld [MEMORY_CURRENT_PAGE], a + + ; Posiciona el texto + ld hl, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)] + call NGN_TEXT_POSITION + + ; Imprime la cantidad de Kb en esta pagina + call FUNCION_MEMORY_GET_RAM_BANK_SIZE_VARIABLE ; Variable guardada en HL + ld b, [hl] + inc hl + ld c, [hl] + ; Esta a 0? + ld a, b + or c + jr z, @@NO_PRINT_ZERO + call NGN_TEXT_PRINT_INTEGER ; Imprimela + ; KB + ld a, $4B + call $00A2 ; [CHPUT] + ld a, $42 + call $00A2 ; [CHPUT] + jr @@NEXT_COLUMN + + ; No Imprimas ceros + @@NO_PRINT_ZERO: + push bc ; Preserva BC durante este bucle + ld b, 6 + @@NO_ZERO_LOOP: + ld a, $C3 + call $00A2 ; [CHPUT] + djnz @@NO_ZERO_LOOP + pop bc ; Recupera BC + + ; Actualiza el contador de este bucle + @@NEXT_COLUMN: + pop bc ; Recupera el contador + inc c ; Siguiente pagina + + ; Mueve el cabezal de escritura + ld hl, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)] + ld de, $0800 + add hl, de + ld [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)], hl + + ; Detecta si es memoria mapeada + ld a, [(NGN_RAM_BUFFER + RAM_TEST_SLOT_INFO)] + bit 7, a ; Si es un MAPPER, indicalo y sal + jr nz, @@ITS_A_MAPPER + + ; Repite + dec b + jp nz, @@PAGE_GUI_LOOP + jr @@NEXT_SUBSLOT + + + @@ITS_A_MAPPER: + exx ; Backup de todos los registros + + ld hl, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)] + call NGN_TEXT_POSITION + ld hl, TEXT_RAM_TEST_MAPPED ; "MAPPED" + call NGN_TEXT_PRINT ; Imprimelo + + ld hl, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)] + ld de, $0800 + add hl, de + ld [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)], hl + call NGN_TEXT_POSITION + ld a, $49 + call $00A2 ; [CHPUT] + ld a, $4E + call $00A2 ; [CHPUT] + ld a, $20 + call $00A2 ; [CHPUT] + call FUNCION_MEMORY_GET_RAM_BANK_SIZE_VARIABLE ; Numero de paginas del mapper + inc hl ; Estan guardadas + inc hl ; en la pagina 1 + ld b, [hl] + inc hl + ld c, [hl] + call NGN_TEXT_PRINT_INTEGER + + ld hl, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)] + ld de, $0800 + add hl, de + ld [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)], hl + call NGN_TEXT_POSITION + ld hl, TEXT_RAM_TEST_PAGES ; " PAGES" + call NGN_TEXT_PRINT ; Imprimelo + + exx ; Recupera todos los registros + + + + ; Siguiente offset de slot/subslot + @@NEXT_SUBSLOT: + + ; Salto de linea + ld a, $0D + call $00A2 ; [CHPUT] + ld a, $0A + call $00A2 ; [CHPUT] + ; Reinicia el cabezal de escritura + ld hl, [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)] + ld h, $09 + inc l + ld [(NGN_RAM_BUFFER + RAM_TEST_TEMP_CURSOR)], hl + + @@SKIP_THIS_SUBSLOT: + ; Calcula el siguiente sub-slot + ld a, [(NGN_RAM_BUFFER + RAM_TEST_SLOT_INFO_OFFSET)] + inc a + ld [(NGN_RAM_BUFFER + RAM_TEST_SLOT_INFO_OFFSET)], a + + pop bc ; Recupera los sub-contadores + + ; Si el slot no esta vacio, indicalo y ponlo en la lista + ld a, [(NGN_RAM_BUFFER + RAM_TEST_SLOT_OK)] + or a + jr z, @@EMPTY_SUBSLOT ; Esta vacio, no lo registres + + ld a, [(NGN_RAM_BUFFER + RAM_TEST_TOTAL_OPTIONS)] ; nº de elementos de la lista actualmente + ld d, 0 + ld e, a + ld hl, (NGN_RAM_BUFFER + RAM_TEST_OPTION_LIST) ; Incio de la lista + add hl, de ; Calcula el offset segun el nº de elementos + ld a, [MEMORY_SLOT_ID] ; ID de slot/sub-slot actual + ld [hl], a ; Registrala en la lista + ld a, [(NGN_RAM_BUFFER + RAM_TEST_TOTAL_OPTIONS)] ; Actualiza el contador de elementos de la lista + inc a + ld [(NGN_RAM_BUFFER + RAM_TEST_TOTAL_OPTIONS)], a + + + @@EMPTY_SUBSLOT: + inc c ; Siguiente sub-slot + + dec b + jp nz, @@SUBSLOTS_GUI_LOOP + + pop bc ; Recupera los contadores + + inc c ; Siguiente slot + + dec b + jp nz, @@SLOTS_GUI_LOOP + + ; Sal de la funcion + ret + + + +; ---------------------------------------------------------- +; Ejecuta test de memoria RAM +; ---------------------------------------------------------- +FUNCTION_RAM_TEST_RUN: + + ; Guarda el slot seleccionado y el sub-slot + ld a, [MEMORY_SLOT_ID] ; Lee la ID de slot + and $03 ; Bitmask para el slot + ld [MEMORY_CURRENT_SLOT], a ; Guardalo + ld a, [MEMORY_SLOT_ID] ; Lee la ID de slot + srl a ; >> 2 + srl a ; Para el sub-slot + and $03 ; Bitmask para el sub-slot + ld [MEMORY_CURRENT_SUBSLOT], a ; Guardalo + + + ; Borra la pantalla + call NGN_TEXT_CLS + + ; Informa del slot que se va a probar + call FUNCTION_RAM_PRINT_SLOT_INFO + + + ; Busca que bancos has de analizar + call FUNCION_MEMORY_GET_CURRENT_SLOT_VARIABLE + ld a, [hl] ; Lee la informacion del slot + ld [MEMORY_CURRENT_LAYOUT], a ; Y guardala + + ; Pasa a buscar en que paginas se realizara el test + xor a + ld [(NGN_RAM_BUFFER + RAM_TEST_PAGES_TO_TEST)], a ; Contador de paginas a 0 + + ; Es un mapper? + ld a, [MEMORY_CURRENT_LAYOUT] + bit 7, a + jr z, @@IS_PAGED_MEMORY + ; Si en un mapper + ld a, 1 + ld [(NGN_RAM_BUFFER + RAM_TEST_PAGES_TO_TEST)], a ; Solo tendra una pagina + ld a, $F0 ; [MAPPED?][PAGE Nº] + ld [(NGN_RAM_BUFFER + RAM_TEST_PAGES_LIST)], a ; Indica que es un mapper y la pagina de analisis + jp FUNCTION_RAM_MAPPED_TEST ; Ejecuta el test para memoria mapeada + + + @@IS_PAGED_MEMORY: + + jp FUNCTION_RAM_PAGED_TEST ; Ejecuta el test para memoria paginada + + + +; ---------------------------------------------------------- +; Imprime la informacion del slot +; ---------------------------------------------------------- + +FUNCTION_RAM_PRINT_SLOT_INFO: + + ; Informa del slot que se va a probar + ld hl, TEXT_RAM_TEST_TESTING_SLOT + call NGN_TEXT_PRINT + ld b, 0 + ld a, [MEMORY_CURRENT_SLOT] + ld c, a + call NGN_TEXT_PRINT_INTEGER + ld a, $2D + call $00A2 ; [CHPUT] + ld b, 0 + ld a, [MEMORY_CURRENT_SUBSLOT] + ld c, a + call NGN_TEXT_PRINT_INTEGER + ld hl, TEXT_NEW_LINE + call NGN_TEXT_PRINT + + ; Sal de la rutina + ret + + + +; ---------------------------------------------------------- +; Espera a que se pulse aceptar o cancelar para +; volver al menu +; ---------------------------------------------------------- + +FUNCTION_RAM_GOTO_MENU: + + ; Lectura del HID + call FUNCTION_SYSTEM_HID_READ + + ; Si se pulsa la tecla "ACEPTAR" + ld a, [SYSKEY_ACCEPT] + and $02 ; Detecta "KEY DOWN" + jp nz, FUNCTION_RAM_TEST_MENU ; Vuelve al menu + + ; Si se pulsa la tecla "CANCELAR" + @@M_CANCEL: + ld a, [SYSKEY_CANCEL] + and $02 ; Detecta "KEY DOWN" + jp nz, FUNCTION_RAM_TEST_MENU ; Vuelve al menu + + ; Espera a la interrupcion del VDP (VSYNC) + halt + + ; Repite el bucle + jr FUNCTION_RAM_GOTO_MENU + + + +; ---------------------------------------------------------- +; Test de memoria mapeada +; ---------------------------------------------------------- +FUNCTION_RAM_MAPPED_TEST: + + ; Prepara la informacion para el test de mapper + xor a + ld [MEMORY_CURRENT_PAGE], a ; Selecciona la pagina 0 + + ; Caracteristicas del mapper (tamaño total y paginas) + call FUNCION_MEMORY_GET_RAM_BANK_SIZE_VARIABLE ; Devuelve en HL la direccion de la informacion + ld de, (NGN_RAM_BUFFER + RAM_TEST_MAPPED_TOTAL_KB) ; Destino de la informacion + ld bc, $0004 ; Copia 4 bytes + ldir + + ; Imprime el resumen + ld hl, (NGN_RAM_BUFFER + RAM_TEST_MAPPED_TOTAL_KB) ; Total de KB + ld b, [hl] + inc hl + ld c, [hl] + call NGN_TEXT_PRINT_INTEGER ; Imprimelos + ld hl, TEXT_SYSTEM_INFO_KB ; Junto a los textos adicionales + call NGN_TEXT_PRINT + ld hl, TEXT_RAM_TEST_IN + call NGN_TEXT_PRINT + ld hl, (NGN_RAM_BUFFER + RAM_TEST_MAPPED_TOTAL_PAGES) ; Numero total de paginas + ld b, [hl] + inc hl + ld c, [hl] + push bc ; ; Guarda en BC el numero de paginas totales + call NGN_TEXT_PRINT_INTEGER ; Imprimelas + ld a, $20 ; Junto a los textos adicionales + call $00A2 ; [CHPUT] + ld hl, TEXT_RAM_TEST_PAGES + call NGN_TEXT_PRINT + ; Salto de linea + ld hl, TEXT_NEW_LINE + call NGN_TEXT_PRINT + ; Salto de linea + ld hl, TEXT_NEW_LINE + call NGN_TEXT_PRINT + + + ; Datos iniciales + ld hl, $0000 + ld [(NGN_RAM_BUFFER + RAM_TEST_SLOT_ERRORS)], hl ; Numero de errores encontrados + + ; Bucle de ejecucion + pop bc ; Recupera el numero de paginas a examinar + ld a, $00 ; Nº de pagina a examinar + ld [(NGN_RAM_BUFFER + RAM_TEST_MAPPED_CURRENT_PAGE)], a + @@PAGES_LOOP: + + push bc ; Preserva el contador del bucle + + call @@TEST_PAGE ; Test de esa pagina + + ; Salto de linea + ld hl, TEXT_NEW_LINE + call NGN_TEXT_PRINT + + ; Suma 1 al contador de paginas + ld a, [(NGN_RAM_BUFFER + RAM_TEST_MAPPED_CURRENT_PAGE)] + inc a + ld [(NGN_RAM_BUFFER + RAM_TEST_MAPPED_CURRENT_PAGE)], a + ; Contador del bucle + pop bc ; Recupera el contador del bucle + dec bc + ld a, b + or c + jr nz, @@PAGES_LOOP ; Repite si aun quedan paginas + + + ; Test completado + call FUNCTION_RAM_PRINT_SLOT_INFO + ld hl, [(NGN_RAM_BUFFER + RAM_TEST_SLOT_ERRORS)] + ld b, h + ld c, l + call NGN_TEXT_PRINT_INTEGER + ld hl, TEXT_RAM_TEST_ERRORS + call NGN_TEXT_PRINT + + ld hl, TEXT_NEW_LINE + call NGN_TEXT_PRINT + ld hl, TEXT_NEW_LINE + call NGN_TEXT_PRINT + ld hl, TEXT_SYSTEM_INFO_EXIT + call NGN_TEXT_PRINT + + ; Vuelve al menu + jp FUNCTION_RAM_GOTO_MENU + + + + ; ---------------------------------------------------------- + ; Examina la pagina seleccionada + ; ---------------------------------------------------------- + @@TEST_PAGE: + + ; Imprime el numero de pagina que se examina + ld hl, TEXT_RAM_TEST_PAGE + call NGN_TEXT_PRINT + ld a, [(NGN_RAM_BUFFER + RAM_TEST_MAPPED_CURRENT_PAGE)] + ld b, 0 + ld c, a + call NGN_TEXT_PRINT_INTEGER + ld a, $20 + call $00A2 ; [CHPUT] + + ; Escaneo de la pagina en busca de fallos + ld hl, $0000 ; Reset del contador de errores + ld [(NGN_RAM_BUFFER + RAM_TEST_PAGE_ERRORS)], hl + ld hl, RAM_TEST_MAPPER_ADDRESS ; Direccion inicial del escaneo + ld [MEMORY_PAGE_ADDR], hl + ld b, $80 ; 128 bloques + @@BLOCK_LOOP: + + exx ; Selecciona los registros sombreados + ld e, $FF ; Reset de error en E' + exx ; Selecciona los registros normales + + push bc ; Preserva el registro del contador BLOCK + + ld b, $80 ; 128 bytes por bloque + @@BYTES_LOOP: + + push bc ; Preserva el registro del contador de bytes + + ; Parametros del test + ld hl, [MEMORY_PAGE_ADDR] ; Direccion HL + ld de, [(NGN_RAM_BUFFER + RAM_TEST_PAGE_ERRORS)] ; Errores DE + ld a, [(NGN_RAM_BUFFER + RAM_TEST_MAPPED_CURRENT_PAGE)] + ld c, a ; Segmento actual C + ld a, [MEMORY_SLOT_ID] + ld b, a ; SLot ID? B + + ; FUNCTION_RAM_BYTE_TEST + ; HL = Direccion + ; DE = nº de errores encontrados + ; C = nº de segmento actual + ; B = ID de slot a analizar + ; E' = Error encontrado + ; Modifica AF, BC, DE, HL, AF', E' + ;call (NGN_RAM_BUFFER + RAM_TEST_BYTE_ROUTINE_ADDR) + ;call FUNCTION_RAM_BYTE_TEST + + ; Actualiza el registro de errores + ld [(NGN_RAM_BUFFER + RAM_TEST_PAGE_ERRORS)], de + + + ; Siguiente direccion + inc hl + ld [MEMORY_PAGE_ADDR], hl + + pop bc ; Recupera el registro del contador de bytes + dec b + jp nz, @@BYTES_LOOP + + + + ; Imprime el testigo de actividad cada 128 bytes de analisis + exx ; Selecciona los registros sombreados + ld a, e ; Lee el estado de E + exx ; Selecciona los registros normales + cp $FF + jp z, @@BYTE_CORRECT + + ld a, $CF ; Error en el byte + jr @@PRINT_BYTE_RESULT + + @@BYTE_CORRECT: + ld a, $C2 ; Byte correcto + + @@PRINT_BYTE_RESULT: ; Imprime el resultado + call $00A2 ; [CHPUT] + + pop bc ; Recupera el registro del contador BLOCK + dec b + jp nz, @@BLOCK_LOOP + + + ; ---------------------------------------------------------- + ; Resumen la pagina seleccionada + ; ---------------------------------------------------------- + ld a, $20 + call $00A2 ; [CHPUT] + + ld hl, [(NGN_RAM_BUFFER + RAM_TEST_PAGE_ERRORS)] ; Errores de este segmento + ld b, h + ld c, l + + ex de, hl ; Guarda en DE los errores + + ld hl, [(NGN_RAM_BUFFER + RAM_TEST_SLOT_ERRORS)] ; Sumalos al contador general de errores + add hl, de + ld [(NGN_RAM_BUFFER + RAM_TEST_SLOT_ERRORS)], hl ; Y guardalos + + call NGN_TEXT_PRINT_INTEGER ; Imprime los errores de esta pagina + ld hl, TEXT_RAM_TEST_ERRORS + call NGN_TEXT_PRINT + + ; Salto de linea + ld hl, TEXT_NEW_LINE + call NGN_TEXT_PRINT + + ; Vuelve al terminar + ret + + + +; ---------------------------------------------------------- +; Test de memoria paginada +; ---------------------------------------------------------- +FUNCTION_RAM_PAGED_TEST: + + ; Vuelve al menu + jp FUNCTION_RAM_GOTO_MENU + + + + + +; ---------------------------------------------------------- +; Test del byte seleccionado +; HL = Direccion +; DE = nº de errores encontrados +; C = nº de segmento actual +; B = ID de slot a analizar +; E' = Error encontrado +; Modifica AF, BC, DE, HL, AF', E' +; ---------------------------------------------------------- +FUNCTION_RAM_BYTE_TEST: + + ; Vuelve de la subrutina + ret + + + + + +;*********************************************************** +; Fin del archivo +;*********************************************************** +RAM_TEST_EOF: \ No newline at end of file diff --git a/source/prog/screen0_test.asm b/source/prog/screen0_test.asm index bafb35f..f37cd97 100644 --- a/source/prog/screen0_test.asm +++ b/source/prog/screen0_test.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Test SCREEN 0 ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/screen1_test.asm b/source/prog/screen1_test.asm index 5c32613..568cb8b 100644 --- a/source/prog/screen1_test.asm +++ b/source/prog/screen1_test.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Test SCREEN 1 ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/screen2_test.asm b/source/prog/screen2_test.asm index bd049ef..08a42ec 100644 --- a/source/prog/screen2_test.asm +++ b/source/prog/screen2_test.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Test SCREEN 2 ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/screen3_test.asm b/source/prog/screen3_test.asm index 6212e5a..158a80f 100644 --- a/source/prog/screen3_test.asm +++ b/source/prog/screen3_test.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Test SCREEN 3 ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/sfx.asm b/source/prog/sfx.asm index 6129041..da9ae09 100644 --- a/source/prog/sfx.asm +++ b/source/prog/sfx.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Funciones de efectos de sonido ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/sprites_test.asm b/source/prog/sprites_test.asm index 5b30369..d52e753 100644 --- a/source/prog/sprites_test.asm +++ b/source/prog/sprites_test.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Test de los Sprites (MODO SCREEN 2) ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/system.asm b/source/prog/system.asm index 4c6483b..40907f0 100644 --- a/source/prog/system.asm +++ b/source/prog/system.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Funciones comunes del sistema ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/system_info.asm b/source/prog/system_info.asm index c1302a5..411f6d4 100644 --- a/source/prog/system_info.asm +++ b/source/prog/system_info.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Informacion del sistema ; (cc) 2018-2020 Cesar Rincon "NightFox" @@ -470,13 +470,13 @@ FUNCTION_SYSTEM_INFO: call $00A2 ; Imprime el caracter en A. Rutina [CHPUT] de la BIOS ld hl, $190E ; Posicion inicial ld bc, $0400 ; 4 repeticiones (B), contador a 0 (C) - @@SLOT_GUI_DRAW_SLOT_EXPANDED: + @@SLOT_GUI_DRAW_MEMORY_SLOT_EXPANDED: push hl ; Guarda la posicion push bc ; Guarda los contadores call NGN_TEXT_POSITION ; Coloca el cursor de texto pop bc ; Preserva el contador push bc - ld hl, SLOT_EXPANDED ; Variable con la informacion + ld hl, MEMORY_SLOT_EXPANDED ; Variable con la informacion ld b, 0 ; Indice de slot (C) add hl, bc ld b, $4E ; Letra "N" @@ -488,7 +488,7 @@ FUNCTION_SYSTEM_INFO: inc c ; Siguiente digito inc hl ; Siguiente fila inc hl - djnz @@SLOT_GUI_DRAW_SLOT_EXPANDED ; Repite hasta imprimir los 4 digitos + djnz @@SLOT_GUI_DRAW_MEMORY_SLOT_EXPANDED ; Repite hasta imprimir los 4 digitos ; Impresion de los bancos de memoria diff --git a/source/prog/vars.asm b/source/prog/vars.asm index 92aef40..214b54d 100644 --- a/source/prog/vars.asm +++ b/source/prog/vars.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Declaracion de variables ; (cc) 2018-2020 Cesar Rincon "NightFox" @@ -41,12 +41,12 @@ VDP_HZ: ds 1 ; Frecuencia de refresco del VDP ; ---------------------------------------------------------- ; Rutinas de gestion de memoria -; Total: 23 bytes +; Total: 158 bytes ; ---------------------------------------------------------- RAM_DETECTED: ds 3 ; RAM detectada (Formato BCD de 3 bytes [000000]) -SLOT_EXPANDED: ds 4 ; El slot esta expandido? (bool 0 / !0) 1 byte x 4 slots +MEMORY_SLOT_EXPANDED: ds 4 ; El slot esta expandido? (bool 0 / !0) 1 byte x 4 slots ; ----------------------------------- ; SUB-SLOT 0 1 2 3 @@ -58,8 +58,28 @@ RAM_SLOT_3: ds 4 ; RAM en el SLOT 3 0xxx0000 0xxx000 ; ----------------------------------- ; PAGINA M 3210 M 3210 M 3210 M 3210 ; ----------------------------------- - - +RAM_BANK_SIZE: ds 128 ; RAM de la pagina en KB +; [ SLOT....0....1....2....3 ] ; 32 bytes offset x slot +; [ SUB0 ][ SUB1 ][ SUB2 ][ SUB3 ] ; 8 byes offset x sub-slot +; [P0][P1][P2][P3][P0][P1][P2][P3][P0][P1][P2][P3][P0][P1][P2][P3] ; 2 bytes offset x page +; Total 128 byes +; Se guarda la catidad de memoria RAM en cada pagina. +; En el caso de la memoria mapeada, la cantidad se guarda en el espacio de la pagina 0 +; y el numero de paginas de 16kb del mapper en el espacio de la pagina 1 + +MEMORY_CURRENT_SLOT: ds 1 ; Numero de slot actual +MEMORY_CURRENT_SUBSLOT: ds 1 ; Numero actual de subslot +MEMORY_CURRENT_PAGE: ds 1 ; Numero actual de pagina +MEMORY_CURRENT_LAYOUT: ds 1 ; Configuracion de RAM actual del slot (RAM_SLOT_N) +MEMORY_PAGE_ADDR: ds 2 ; Direccion de memoria de la pagina + +MEMORY_SLOT_ID: ds 1 ; ID de slot en formato (ExxxSSPP) + ; bit 0-1 = Primary slot number + ; bit 2-3 = Sub-slot number (optional) + ; bit 4-6 = Unused + ; bit 7 = 1 if Slot is Expanded + +@@asMSX_BUG: ; ----------------------------------------------------------------------- ; Teclas diff --git a/source/prog/vdp_routines.asm b/source/prog/vdp_routines.asm index 9dbbf9d..0269271 100644 --- a/source/prog/vdp_routines.asm +++ b/source/prog/vdp_routines.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Rutinas del VDP ; (cc) 2018-2020 Cesar Rincon "NightFox" diff --git a/source/prog/welcome.asm b/source/prog/welcome.asm index 33328a6..8357215 100644 --- a/source/prog/welcome.asm +++ b/source/prog/welcome.asm @@ -1,7 +1,7 @@ ;*********************************************************** ; ; MSX DIAGNOSTICS -; Version 1.1.8 +; Version 1.1.9 ; ASM Z80 MSX ; Archivo principal ; (cc) 2018-2020 Cesar Rincon "NightFox"