;
;  _===_ _           _                  ______ _     _             _ _ _
; |  ___| |         | |                 | ___ (_)   | |           (_) | |
; | |__ | | ___  ___| |_ _ __ ___ ______| |_/ /_  __| | ___  _   _ _| | | ___ _   _ _ __
; |  __|| |/ _ \/ __| __| '__/ _ \______| ___ \ |/ _` |/ _ \| | | | | | |/ _ \ | | | '__|
; | |___| |  __/ (__| |_| | | (_) |     | |_/ / | (_| | (_) | |_| | | | |  __/ |_| | |
; \____/|_|\___|\___|\__|_|  \___/      \____/|_|\__,_|\___/ \__,_|_|_|_|\___|\__,_|_|
;
; Test de la mémoire RAM statique sur plateforme Z80 PRO-83
; Code source développé et assemblé sur le site ASM80.com
; Électro-Bidouilleur, V1, Juin 2022. https://www.youtube.com/Électro-Bidouilleur
; Licence de droits: Attribution 4.0 International (CC BY 4.0)  Lisez https://creativecommons.org/licenses/by/4.0/deed.fr  

; DÉFINITION DE MACROS
SRAM_BNK1_ADDR equ 1000h
PIO_B_D equ 041h    ; 0100|0001
PIO_B_C equ 043h    ; 0100|0011

; INITIALISATION DU PORT PIO-B
INIT:
    ld A,0Fh                    ; Configurer le port PIO-B en mode sortie (mode 0)
    out (PIO_B_C),A             ;     "

; TEST DES DEUX BANQUES RAM AVEC 55h
REMPLIR_1_55:
    ld A,01010101b              ; Valeur 55h à écrire dans les cases mémoires
    ld (SRAM_BNK1_ADDR), A      ; Transférer la valeur de l'accumulateur dans la case mémoire de base
    ld HL, SRAM_BNK1_ADDR       ; Transférer l'adresse de la case mémoire de base dans la paire de registres HL
    ld DE, SRAM_BNK1_ADDR + 1   ; Transférer l'adresse de la case mémoire suivante dans la paire de registres DE
    ld BC, 2048                 ; Charger le nombre de cases mémoires à copier dans la paire de registres BC
    ldir                        ; Copie successive de cases mémoires à leur case suivante
TESTER_1_55:
    ld HL, SRAM_BNK1_ADDR       ; Transférer l'adresse de la case mémoire de base dans la paire de registres HL
    ld BC, 2048                 ; Charger le nombre de cases mémoires à vérifier dans la paire de registres BC
ADDR_1_55_SUIV:
    ld A, B                     ; Est-ce que BC = 0000h? (petit truc "ld" et "or" pour vérifier les 16 bits)
    or C                        ;      "
    jp Z,REMPLIR_1_AA             ; Fanion Z = 0? Oui, donc BC est rendu à 0000h, c'est la fin du test 55, sauter au test AA
    ld A,01010101b              ; Z pas égal à 0, faire le test de la case courante.
    cpi                         ; Comparer la valeur dans HL à la valeur dans l'accumulateur, incrémenter HL et décrémenter BC
    jp Z,ADDR_1_55_SUIV         ; Fanion Z levé? Oui, comparaison bonne, bonne valeur lue dans la RAM, passer à la case suivante
    call IMPULS_ERR             ; Fanion Z pas levé: la comparaison a échoué, donc erreur de RAM, envoyer une impulsion
    jp ADDR_1_55_SUIV           ; Passer à la case suivante

; TEST DES DEUX BANQUES RAM AVEC AAh
REMPLIR_1_AA:
    ld A,10101010b              ; Valeur AAh à écrire dans les cases mémoires
    ld (SRAM_BNK1_ADDR), A      ; Transférer la valeur de l'accumulateur dans la case mémoire de base
    ld HL, SRAM_BNK1_ADDR       ; Transférer l'adresse de la case mémoire de base dans la paire de registres HL
    ld DE, SRAM_BNK1_ADDR + 1   ; Transférer l'adresse de la case mémoire suivante dans la paire de registres DE
    ld BC, 2048                 ; Charger le nombre de cases mémoires à copier dans la paire de registres BC
    ldir                        ; Copie successive de cases mémoires à leur case suivante
TESTER_1_AA:                    
    ld HL, SRAM_BNK1_ADDR       ; Transférer l'adresse de la case mémoire de base dans la paire de registres HL
    ld BC, 2048                 ; Charger le nombre de cases mémoires à vérifier dans la paire de registres BC
ADDR_1_AA_SUIV:                 
    ld A, B                     ; Est-ce que BC = 0000h? (petit truc "ld" et "or" pour vérifier les 16 bits)
    or C                        ;      "
    jp Z,REMPLIR_1_55           ; Fanion Z = 0? Oui, donc BC est rendu à 0000h, c'est la fin du test AA, sauter au test 55
    ld A,10101010b              ; Z pas égal à 0, faire le test de la case courante.
    cpi                         ; Comparer la valeur dans HL à la valeur dans l'accumulateur, incrémenter HL et décrémenter BC
    jp Z,ADDR_1_AA_SUIV         ; Fanion Z levé? Oui, comparaison bonne, bonne valeur lue dans la RAM, passer à la case suivante
    call IMPULS_ERR             ; Fanion Z pas levé: la comparaison a échoué, donc erreur de RAM, envoyer une impulsion
    jp ADDR_1_AA_SUIV           ; Passer à la case suivante

IMPULS_ERR:
    ld A, 01h                   ; Charger le port la valeur 00000001b dans l'accumulateur
    out (PIO_B_D), A            ; Transférer l'accumulateur vers le registre de donnée de PIO-B
    ld A, 00h                   ; Charger le port la valeur 00000000b dans l'accumulateur
    out (PIO_B_D), A            ; Transférer l'accumulateur vers le registre de donnée de PIO-B
    ret

