add memory lib + maps

This commit is contained in:
Frater 2026-02-07 16:03:29 +01:00
commit 4b62e01e82
10 changed files with 521 additions and 411 deletions

View file

@ -29,29 +29,29 @@
; =============================================================================
dump_ram_words:
jcxz .done ; Sécurité : si CX=0, on sort
jcxz .done ; Sécurité : si CX=0, on sort
.loop:
lodsw ; Charge [DS:SI] dans AX et incrémente SI de 2
; Note: x86 est Little Endian. Si RAM = 12 34,
; AX vaudra 0x3412.
lodsw ; Charge [DS:SI] dans AX et incrémente SI de 2
; Note: x86 est Little Endian. Si RAM = 12 34,
; AX vaudra 0x3412.
push cx ; Sauvegarde le compteur de boucle principal
push si ; Sauvegarde le pointeur (si cga_putc le modifie)
push cx ; Sauvegarde le compteur de boucle principal
push si ; Sauvegarde le pointeur (si cga_putc le modifie)
call print_word_hex ; Affiche AX sous forme "XXXX"
call print_word_hex ; Affiche AX sous forme "XXXX"
; (Optionnel) Ajouter un espace entre chaque mot pour la lisibilité
mov al, ' '
call cga_putc
; (Optionnel) Ajouter un espace entre chaque mot pour la lisibilité
mov al, ' '
call cga_putc
pop si ; Restaure SI
pop cx ; Restaure CX
pop si ; Restaure SI
pop cx ; Restaure CX
loop .loop ; Décrémente CX et boucle si != 0
loop .loop ; Décrémente CX et boucle si != 0
.done:
ret
ret
; =============================================================================
; Fonction : print_word_hex
@ -60,31 +60,30 @@ dump_ram_words:
; Sortie : Affiche "1A2B" via cga_putc
; =============================================================================
print_word_hex:
pusha
mov dx, ax
mov cx, 4 ; 4 caractères hex dans un mot de 16 bits
pusha
mov dx, ax
mov cx, 4 ; 4 caractères hex dans un mot de 16 bits
.next_digit:
; On veut afficher les bits 12-15 d'abord.
; L'astuce est de faire une rotation à gauche de 4 bits.
; Le quartet de poids fort se retrouve en bas (bits 0-3).
rol dx, 4
.next_digit:
; On veut afficher les bits 12-15 d'abord.
; L'astuce est de faire une rotation à gauche de 4 bits.
; Le quartet de poids fort se retrouve en bas (bits 0-3).
rol dx, 4
mov ax, dx ; Copie temporaire
and al, 0x0F ; On isole les 4 derniers bits (0 à 15)
mov ax, dx ; Copie temporaire
and al, 0x0F ; On isole les 4 derniers bits (0 à 15)
call nibble_to_ascii ; Convertit AL en caractère ASCII
call nibble_to_ascii ; Convertit AL en caractère ASCII
; call cga_putc ; Affiche le caractère
xor bx, bx
mov bl, al
push bx
call cga_putc
add sp, 2
loop .next_digit ; Répète 4 fois
xor bx, bx
mov bl, al
push bx
call cga_putc
add sp, 2
loop .next_digit ; Répète 4 fois
popa
ret
popa
ret
; =============================================================================
; Fonction : nibble_to_ascii
@ -93,12 +92,12 @@ print_word_hex:
; Sortie : AL (caractère '0'-'9' ou 'A'-'F')
; =============================================================================
nibble_to_ascii:
cmp al, 9
ja .letter ; Si > 9, c'est une lettre (A-F)
cmp al, 9
ja .letter ; Si > 9, c'est une lettre (A-F)
; Sinon c'est un chiffre : 0x0 -> '0'
add al, '0'
ret
add al, '0' ; Sinon c'est un chiffre : 0x0 -> '0'
ret
.letter:
add al, 'A' - 10 ; Convertit 10 -> 'A', 11 -> 'B', etc.
ret
.letter: ; Convertit 10 -> 'A', 11 -> 'B', etc.
add al, 'A' - 10
ret