feat: debugage X86 sans bogues affichage avec GDB

This commit is contained in:
Nicolas Hordé 2019-07-14 11:26:53 +02:00
parent 72bf3f35c2
commit 26b8139657
7 changed files with 673 additions and 150 deletions

View File

@ -0,0 +1,468 @@
# Special mode for GDB that allows to debug/disassemble REAL MODE x86 code
#
# It has been designed to be used with QEMU or BOCHS gdb-stub
#
# 08/2011 Hugo Mercier - GPL v3 license
#
# Freely inspired from "A user-friendly gdb configuration file" widely available
# on the Internet
set confirm off
set verbose off
set prompt \033[31mreal-mode-gdb$ \033[0m
set output-radix 0d10
set input-radix 0d10
# These make gdb never pause in its output
set height 0
set width 0
# Intel syntax
set disassembly-flavor intel
# Real mode
set architecture i8086
set $SHOW_CONTEXT = 1
set $REAL_MODE = 1
# By default A20 is present
set $ADDRESS_MASK = 0x1FFFFF
# nb of instructions to display
set $CODE_SIZE = 20
define enable-a20
set $ADDRESS_MASK = 0x1FFFFF
end
define disable-a20
set $ADDRESS_MASK = 0x0FFFFF
end
# convert segment:offset address to physical address
define r2p
if $argc < 2
printf "Arguments: segment offset\n"
else
set $ADDR = (((unsigned long)$arg0 & 0xFFFF) << 4) + (((unsigned long)$arg1 & 0xFFFF) & $ADDRESS_MASK)
printf "0x%05X\n", $ADDR
end
end
document r2p
Convert segment:offset address to physical address
Set the global variable $ADDR to the computed one
end
# get address of Interruption
define int_addr
if $argc < 1
printf "Argument: interruption_number\n"
else
set $offset = (unsigned short)*($arg0 * 4)
set $segment = (unsigned short)*($arg0 * 4 + 2)
r2p $segment $offset
printf "%04X:%04X\n", $segment, $offset
end
end
document int_addr
Get address of interruption
end
define compute_regs
set $rax = ((unsigned long)$eax & 0xFFFF)
set $rbx = ((unsigned long)$ebx & 0xFFFF)
set $rcx = ((unsigned long)$ecx & 0xFFFF)
set $rdx = ((unsigned long)$edx & 0xFFFF)
set $rsi = ((unsigned long)$esi & 0xFFFF)
set $rdi = ((unsigned long)$edi & 0xFFFF)
set $rbp = ((unsigned long)$ebp & 0xFFFF)
set $rsp = ((unsigned long)$esp & 0xFFFF)
set $rcs = ((unsigned long)$cs & 0xFFFF)
set $rds = ((unsigned long)$ds & 0xFFFF)
set $res = ((unsigned long)$es & 0xFFFF)
set $rss = ((unsigned long)$ss & 0xFFFF)
set $rip = ((((unsigned long)$cs & 0xFFFF) << 4) + ((unsigned long)$eip & 0xFFFF)) & $ADDRESS_MASK
set $r_ss_sp = ((((unsigned long)$ss & 0xFFFF) << 4) + ((unsigned long)$esp & 0xFFFF)) & $ADDRESS_MASK
set $r_ss_bp = ((((unsigned long)$ss & 0xFFFF) << 4) + ((unsigned long)$ebp & 0xFFFF)) & $ADDRESS_MASK
end
define print_regs
printf "AX: %04X BX: %04X ", $rax, $rbx
printf "CX: %04X DX: %04X\n", $rcx, $rdx
printf "SI: %04X DI: %04X ", $rsi, $rdi
printf "SP: %04X BP: %04X\n", $rsp, $rbp
printf "CS: %04X DS: %04X ", $rcs, $rds
printf "ES: %04X SS: %04X\n", $res, $rss
printf "\n"
printf "IP: %04X EIP:%08X\n", ((unsigned short)$eip & 0xFFFF), $eip
printf "CS:IP: %04X:%04X (0x%05X)\n", $rcs, ((unsigned short)$eip & 0xFFFF), $rip
printf "SS:SP: %04X:%04X (0x%05X)\n", $rss, $rsp, $r_ss_sp
printf "SS:BP: %04X:%04X (0x%05X)\n", $rss, $rbp, $r_ss_bp
end
document print_regs
Print CPU registers
end
define print_eflags
printf "OF <%d> DF <%d> IF <%d> TF <%d>",\
(($eflags >> 0xB) & 1), (($eflags >> 0xA) & 1), \
(($eflags >> 9) & 1), (($eflags >> 8) & 1)
printf " SF <%d> ZF <%d> AF <%d> PF <%d> CF <%d>\n",\
(($eflags >> 7) & 1), (($eflags >> 6) & 1),\
(($eflags >> 4) & 1), (($eflags >> 2) & 1), ($eflags & 1)
printf "ID <%d> VIP <%d> VIF <%d> AC <%d>",\
(($eflags >> 0x15) & 1), (($eflags >> 0x14) & 1), \
(($eflags >> 0x13) & 1), (($eflags >> 0x12) & 1)
printf " VM <%d> RF <%d> NT <%d> IOPL <%d>\n",\
(($eflags >> 0x11) & 1), (($eflags >> 0x10) & 1),\
(($eflags >> 0xE) & 1), (($eflags >> 0xC) & 3)
end
document print_eflags
Print eflags register.
end
# dump content of bytes in memory
# arg0 : addr
# arg1 : nb of bytes
define _dump_memb
if $argc < 2
printf "Arguments: address number_of_bytes\n"
else
set $_nb = $arg1
set $_i = 0
set $_addr = $arg0
while ($_i < $_nb)
printf "%02X ", *((unsigned char*)$_addr + $_i)
set $_i++
end
end
end
# dump content of memory in words
# arg0 : addr
# arg1 : nb of words
define _dump_memw
if $argc < 2
printf "Arguments: address number_of_words\n"
else
set $_nb = $arg1
set $_i = 0
set $_addr = $arg0
while ($_i < $_nb)
printf "%04X ", *((unsigned short*)$_addr + $_i)
set $_i++
end
end
end
# display data at given address
define print_data
if ($argc > 0)
set $seg = $arg0
set $off = $arg1
set $raddr = ($arg0 << 16) + $arg1
set $maddr = ($arg0 << 4) + $arg1
set $w = 16
set $i = (int)0
while ($i < 4)
printf "%08X: ", ($raddr + $i * $w)
set $j = (int)0
while ($j < $w)
printf "%02X ", *(unsigned char*)($maddr + $i * $w + $j)
set $j++
end
printf " "
set $j = (int)0
while ($j < $w)
set $c = *(unsigned char*)($maddr + $i * $w + $j)
if ($c > 32) && ($c < 128)
printf "%c", $c
else
printf "."
end
set $j++
end
printf "\n"
set $i++
end
end
end
define context
printf "---------------------------[ STACK ]---\n"
_dump_memw $r_ss_sp 8
printf "\n"
set $_a = $r_ss_sp + 16
_dump_memw $_a 8
printf "\n"
printf "---------------------------[ DS:SI ]---\n"
print_data $ds $rsi
printf "---------------------------[ ES:DI ]---\n"
print_data $es $rdi
printf "----------------------------[ CPU ]----\n"
print_regs
print_eflags
printf "---------------------------[ CODE ]----\n"
set $_code_size = $CODE_SIZE
# disassemble
# first call x/i with an address
# subsequent calls to x/i will increment address
if ($_code_size > 0)
x /i $rip
set $_code_size--
end
while ($_code_size > 0)
x /i
set $_code_size--
end
end
document context
Print context window, i.e. regs, stack, ds:esi and disassemble cs:eip.
end
define hook-stop
compute_regs
if ($SHOW_CONTEXT > 0)
context
end
end
document hook-stop
!!! FOR INTERNAL USE ONLY - DO NOT CALL !!!
end
# add a breakpoint on an interrupt
define break_int
set $offset = (unsigned short)*($arg0 * 4)
set $segment = (unsigned short)*($arg0 * 4 + 2)
break *$offset
end
define break_int_if_ah
if ($argc < 2)
printf "Arguments: INT_N AH\n"
else
set $addr = (unsigned short)*($arg0 * 4)
set $segment = (unsigned short)*($arg0 * 4 + 2)
break *$addr if ((unsigned long)$eax & 0xFF00) == ($arg1 << 8)
end
end
document break_int_if_ah
Install a breakpoint on INT N only if AH is equal to the expected value
end
define break_int_if_ax
if ($argc < 2)
printf "Arguments: INT_N AX\n"
else
set $addr = (unsigned short)*($arg0 * 4)
set $segment = (unsigned short)*($arg0 * 4 + 2)
break *$addr if ((unsigned long)$eax & 0xFFFF) == $arg1
end
end
document break_int_if_ax
Install a breakpoint on INT N only if AX is equal to the expected value
end
define stepo
## we know that an opcode starting by 0xE8 has a fixed length
## for the 0xFF opcodes, we can enumerate what is possible to have
set $lip = $rip
set $offset = 0
# first, get rid of segment prefixes, if any
set $_byte1 = *(unsigned char *)$rip
# CALL DS:xx CS:xx, etc.
if ($_byte1 == 0x3E || $_byte1 == 0x26 || $_byte1 == 0x2E || $_byte1 == 0x36 || $_byte1 == 0x3E || $_byte1 == 0x64 || $_byte1 == 0x65)
set $lip = $rip + 1
set $_byte1 = *(unsigned char*)$lip
set $offset = 1
end
set $_byte2 = *(unsigned char *)($lip+1)
set $_byte3 = *(unsigned char *)($lip+2)
set $noffset = 0
if ($_byte1 == 0xE8)
# call near
set $noffset = 3
else
if ($_byte1 == 0xFF)
# A "ModR/M" byte follows
set $_mod = ($_byte2 & 0xC0) >> 6
set $_reg = ($_byte2 & 0x38) >> 3
set $_rm = ($_byte2 & 7)
#printf "mod: %d reg: %d rm: %d\n", $_mod, $_reg, $_rm
# only for CALL instructions
if ($_reg == 2 || $_reg == 3)
# default offset
set $noffset = 2
if ($_mod == 0)
if ($_rm == 6)
# a 16bit address follows
set $noffset = 4
end
else
if ($_mod == 1)
# a 8bit displacement follows
set $noffset = 3
else
if ($_mod == 2)
# 16bit displacement
set $noffset = 4
end
end
end
end
# end of _reg == 2 or _reg == 3
else
# else byte1 != 0xff
if ($_byte1 == 0x9A)
# call far
set $noffset = 5
else
if ($_byte1 == 0xCD)
# INTERRUPT CASE
set $noffset = 2
end
end
end
# end of byte1 == 0xff
end
# else byte1 != 0xe8
# if we have found a call to bypass we set a temporary breakpoint on next instruction and continue
if ($noffset != 0)
set $_nextaddress = $eip + $offset + $noffset
printf "Setting BP to %04X\n", $_nextaddress
tbreak *$_nextaddress
continue
# else we just single step
else
nexti
end
end
document stepo
Step over calls
This function will set a temporary breakpoint on next instruction after the call so the call will be bypassed
You can safely use it instead nexti since it will single step code if it's not a call instruction (unless you want to go into the call function)
end
define step_until_iret
set $SHOW_CONTEXT=0
set $_found = 0
while (!$_found)
if (*(unsigned char*)$rip == 0xCF)
set $_found = 1
else
stepo
end
end
set $SHOW_CONTEXT=1
context
end
define step_until_ret
set $SHOW_CONTEXT=0
set $_found = 0
while (!$_found)
set $_p = *(unsigned char*)$rip
if ($_p == 0xC3 || $_p == 0xCB || $_p == 0xC2 || $_p == 0xCA)
set $_found = 1
else
stepo
end
end
set $SHOW_CONTEXT=1
context
end
define step_until_int
set $SHOW_CONTEXT = 0
while (*(unsigned char*)$rip != 0xCD)
stepo
end
set $SHOW_CONTEXT = 1
context
end
# Find a pattern in memory
# The pattern is given by a string as arg0
# If another argument is present it gives the starting address (0 otherwise)
define find_in_mem
if ($argc >= 2)
set $_addr = $arg1
else
set $_addr = 0
end
set $_found = 0
set $_tofind = $arg0
while ($_addr < $ADDRESS_MASK) && (!$_found)
if ($_addr % 0x100 == 0)
printf "%08X\n", $_addr
end
set $_i = 0
set $_found = 1
while ($_tofind[$_i] != 0 && $_found == 1)
set $_b = *((char*)$_addr + $_i)
set $_t = (char)$_tofind[$_i]
if ($_t != $_b)
set $_found = 0
end
set $_i++
end
if ($_found == 1)
printf "Code found at 0x%05X\n", $_addr
end
set $_addr++
end
end
document find_in_mem
Find a pattern in memory
The pattern is given by a string as arg0
If another argument is present it gives the starting address (0 otherwise)
end
define step_until_code
set $_tofind = $arg0
set $SHOW_CONTEXT = 0
set $_found = 0
while (!$_found)
set $_i = 0
set $_found = 1
while ($_tofind[$_i] != 0 && $_found == 1)
set $_b = *((char*)$rip + $_i)
set $_t = (char)$_tofind[$_i]
if ($_t != $_b)
set $_found = 0
end
set $_i++
end
if ($_found == 0)
stepo
end
end
set $SHOW_CONTEXT = 1
context
end

View File

@ -1,9 +1,9 @@
target remote localhost:1234 target remote localhost:1234
set disassembly-flavor intel set disassembly-flavor intel
set architecture i8086 set architecture i8086
display/20i $pc+$cs*16 set tdesc filename ./debug/target.xml
break *0x80010 break *0x80010
cont continue
clear *0x80010 clear *0x80010

112
debug/target.xml Normal file
View File

@ -0,0 +1,112 @@
<?xml version="1.0"?>
<!-- Copyright (C) 2010-2017 Free Software Foundation, Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. -->
<!DOCTYPE target SYSTEM "gdb-target.dtd">
<target>
<architecture>i8086</architecture>
<feature name="org.gnu.gdb.i386.core">
<flags id="i386_eflags" size="4">
<field name="CF" start="0" end="0"/>
<field name="" start="1" end="1"/>
<field name="PF" start="2" end="2"/>
<field name="AF" start="4" end="4"/>
<field name="ZF" start="6" end="6"/>
<field name="SF" start="7" end="7"/>
<field name="TF" start="8" end="8"/>
<field name="IF" start="9" end="9"/>
<field name="DF" start="10" end="10"/>
<field name="OF" start="11" end="11"/>
<field name="NT" start="14" end="14"/>
<field name="RF" start="16" end="16"/>
<field name="VM" start="17" end="17"/>
<field name="AC" start="18" end="18"/>
<field name="VIF" start="19" end="19"/>
<field name="VIP" start="20" end="20"/>
<field name="ID" start="21" end="21"/>
</flags>
<reg name="eax" bitsize="32" type="int32"/>
<reg name="ecx" bitsize="32" type="int32"/>
<reg name="edx" bitsize="32" type="int32"/>
<reg name="ebx" bitsize="32" type="int32"/>
<reg name="esp" bitsize="32" type="data_ptr"/>
<reg name="ebp" bitsize="32" type="data_ptr"/>
<reg name="esi" bitsize="32" type="int32"/>
<reg name="edi" bitsize="32" type="int32"/>
<reg name="eip" bitsize="32" type="code_ptr"/>
<reg name="eflags" bitsize="32" type="i386_eflags"/>
<reg name="cs" bitsize="32" type="int32"/>
<reg name="ss" bitsize="32" type="int32"/>
<reg name="ds" bitsize="32" type="int32"/>
<reg name="es" bitsize="32" type="int32"/>
<reg name="fs" bitsize="32" type="int32"/>
<reg name="gs" bitsize="32" type="int32"/>
<reg name="st0" bitsize="80" type="i387_ext"/>
<reg name="st1" bitsize="80" type="i387_ext"/>
<reg name="st2" bitsize="80" type="i387_ext"/>
<reg name="st3" bitsize="80" type="i387_ext"/>
<reg name="st4" bitsize="80" type="i387_ext"/>
<reg name="st5" bitsize="80" type="i387_ext"/>
<reg name="st6" bitsize="80" type="i387_ext"/>
<reg name="st7" bitsize="80" type="i387_ext"/>
<reg name="fctrl" bitsize="32" type="int" group="float"/>
<reg name="fstat" bitsize="32" type="int" group="float"/>
<reg name="ftag" bitsize="32" type="int" group="float"/>
<reg name="fiseg" bitsize="32" type="int" group="float"/>
<reg name="fioff" bitsize="32" type="int" group="float"/>
<reg name="foseg" bitsize="32" type="int" group="float"/>
<reg name="fooff" bitsize="32" type="int" group="float"/>
<reg name="fop" bitsize="32" type="int" group="float"/>
</feature>
<feature name="org.gnu.gdb.i386.32bit.sse">
<vector id="v4f" type="ieee_single" count="4"/>
<vector id="v2d" type="ieee_double" count="2"/>
<vector id="v16i8" type="int8" count="16"/>
<vector id="v8i16" type="int16" count="8"/>
<vector id="v4i32" type="int32" count="4"/>
<vector id="v2i64" type="int64" count="2"/>
<union id="vec128">
<field name="v4_float" type="v4f"/>
<field name="v2_double" type="v2d"/>
<field name="v16_int8" type="v16i8"/>
<field name="v8_int16" type="v8i16"/>
<field name="v4_int32" type="v4i32"/>
<field name="v2_int64" type="v2i64"/>
<field name="uint128" type="uint128"/>
</union>
<flags id="i386_mxcsr" size="4">
<field name="IE" start="0" end="0"/>
<field name="DE" start="1" end="1"/>
<field name="ZE" start="2" end="2"/>
<field name="OE" start="3" end="3"/>
<field name="UE" start="4" end="4"/>
<field name="PE" start="5" end="5"/>
<field name="DAZ" start="6" end="6"/>
<field name="IM" start="7" end="7"/>
<field name="DM" start="8" end="8"/>
<field name="ZM" start="9" end="9"/>
<field name="OM" start="10" end="10"/>
<field name="UM" start="11" end="11"/>
<field name="PM" start="12" end="12"/>
<field name="FZ" start="15" end="15"/>
</flags>
<reg name="xmm0" bitsize="128" type="vec128" regnum="32"/>
<reg name="xmm1" bitsize="128" type="vec128"/>
<reg name="xmm2" bitsize="128" type="vec128"/>
<reg name="xmm3" bitsize="128" type="vec128"/>
<reg name="xmm4" bitsize="128" type="vec128"/>
<reg name="xmm5" bitsize="128" type="vec128"/>
<reg name="xmm6" bitsize="128" type="vec128"/>
<reg name="xmm7" bitsize="128" type="vec128"/>
<reg name="mxcsr" bitsize="32" type="i386_mxcsr" group="vector"/>
</feature>
</target>

View File

@ -61,17 +61,20 @@ struc ints ;bloc interruption
.sizeof = $ - .number .sizeof = $ - .number
} }
struc mb check,isnotlast,isresident,reference,sizes,names struc mb asize,aname ;Bloc de mémoire
;Bloc de mémoire
{ {
.check db "NH" ;signature du bloc de mémoire. .check db "NH" ;signature du bloc de mémoire.
.isnotlast db 0 ;flag indiquant le dernier bloc .isnotlast db 0 ;flag indiquant le dernier bloc
.isresident db 0 ;flag indiquant que le bloc est resident .isresident db 0 ;flag indiquant que le bloc est resident
.reference dw 0 ;pointeur vers le bloc parent .reference dw 0 ;pointeur vers le bloc parent
.sizes dw 0 ;taille du bloc en paragraphe de 16 octet .sizes dw asize ;taille du bloc en paragraphe de 16 octet
.names db 24 dup (0) ;nom du bloc .names db aname ;nom du bloc
.sizeof = $ - .check .endofstr db 0
.sizeof = 32
} }
virtual at 0
mb mb ?,?
end virtual
struc exe major struc exe major
;Executable COS ;Executable COS

View File

@ -31,10 +31,10 @@ debug: debug-system
redebug: clean debug redebug: clean debug
debug-boot: all copy qemu-debug debug-boot: all copy qemu-debug
(sleep 2;cgdb -x ./debug/boot.txt) (sleep 2;gdb -ix ./debug/gdb_init_real_mode.txt -x ./debug/boot.txt)
debug-system: all copy qemu-debug debug-system: all copy qemu-debug
(sleep 2;cgdb -x ./debug/system.txt) (sleep 2;gdb -ix ./debug/gdb_init_real_mode.txt -x ./debug/system.txt)
qemu-debug: qemu-debug:
(killall qemu-system-i386;qemu-system-i386 -m 1G -fda ./final/cos2000.img -s -S &) (killall qemu-system-i386;qemu-system-i386 -m 1G -fda ./final/cos2000.img -s -S &)

View File

@ -134,12 +134,13 @@ firstmb dw 0
;Charge les sections du block %0 ;Charge les sections du block %0
proc mbloadsection uses ax bx cx si di ds es, blocks:word proc mbloadsection uses ax bx cx si di ds es, blocks:word
local toresov[200]:WORD
mov ax,[blocks] mov ax,[blocks]
mov es,ax mov es,ax
mov ds,ax mov ds,ax
cmp word [0],"EC" cmp word [0],"EC"
jne .notace jne .notace
lea si,[.toresov] lea si,[toresov]
mov word [ss:si],0FFFFh mov word [ss:si],0FFFFh
virtual at 0 virtual at 0
.exe exe .exe exe
@ -194,7 +195,6 @@ popad
.depandserror: .depandserror:
stc stc
ret ret
.toresov dw 60 dup (0)
endp endp
@ -209,10 +209,8 @@ proc mbinit uses ax cx si di ds es
mov es,ax mov es,ax
mov si,afree mov si,afree
xor di,di xor di,di
virtual at 0 mov cx,mb.sizeof
.mb mb cld
end virtual
mov cx,.mb.sizeof
rep movsb rep movsb
clc clc
ret ret
@ -221,8 +219,7 @@ proc mbinit uses ax cx si di ds es
ret ret
endp endp
afree mb "HN",0,0,0,0A000h-memorystart,"Libre" afree mb 0A000h-memorystart,"Libre"
db 0
;Creér un bloc de nom %0 de taille %1 (octets) -> n°segment dans AX ;Creér un bloc de nom %0 de taille %1 (octets) -> n°segment dans AX
proc mbcreate uses bx cx dx si di ds es, blocks:word, size:word proc mbcreate uses bx cx dx si di ds es, blocks:word, size:word
@ -248,23 +245,20 @@ proc mbcreate uses bx cx dx si di ds es, blocks:word, size:word
cmp dl,false cmp dl,false
je .notenougtmem je .notenougtmem
mov es,bx mov es,bx
virtual at 0 cmp word [es:mb.check],"NH"
.mb mb
end virtual
cmp word [es:.mb.check],"NH"
jne .memoryerror jne .memoryerror
cmp [es:.mb.isnotlast],true cmp [es:mb.isnotlast],true
sete dl sete dl
cmp [es:.mb.reference],free cmp [es:mb.reference],free
jne .notsogood jne .notsogood
mov ax,[es:.mb.sizes] mov ax,[es:mb.sizes]
cmp cx,ax cmp cx,ax
ja .notsogood ja .notsogood
mov word [es:.mb.check],"NH" mov word [es:mb.check],"NH"
mov [es:.mb.isnotlast],true mov [es:mb.isnotlast],true
mov [es:.mb.reference],gs mov [es:mb.reference],gs
mov [es:.mb.isresident],false mov [es:mb.isresident],false
lea di,[es:.mb.names] lea di,[es:mb.names]
push cx push cx
mov cx,24/4 mov cx,24/4
mov si,[blocks] mov si,[blocks]
@ -278,18 +272,18 @@ proc mbcreate uses bx cx dx si di ds es, blocks:word, size:word
je .nofree je .nofree
dec ax dec ax
dec ax dec ax
mov [es:.mb.sizes],cx mov [es:mb.sizes],cx
add cx,bx add cx,bx
mov es,cx mov es,cx
mov si,afree mov si,afree
xor di,di xor di,di
mov cx,.mb.sizeof mov cx,mb.sizeof
push cs push cs
pop ds pop ds
cld cld
rep movsb rep movsb
mov [es:.mb.isnotlast],dl mov [es:mb.isnotlast],dl
mov [es:.mb.sizes],ax mov [es:mb.sizes],ax
.nofree: .nofree:
mov ax,bx mov ax,bx
pop gs pop gs
@ -298,7 +292,7 @@ proc mbcreate uses bx cx dx si di ds es, blocks:word, size:word
.notsogood: .notsogood:
inc bx inc bx
inc bx inc bx
add bx,[es:.mb.sizes] add bx,[es:mb.sizes]
jmp .searchfree jmp .searchfree
.memoryerror: .memoryerror:
pop gs pop gs
@ -317,20 +311,17 @@ proc mbfree uses ax bx cx si di ds es, blocks:word
dec bx dec bx
dec bx dec bx
mov es,bx mov es,bx
virtual at 0 cmp word [es:mb.check],"NH"
.mb mb
end virtual
cmp word [es:.mb.check],"NH"
jne .memoryerror jne .memoryerror
cmp [es:.mb.reference],free cmp [es:mb.reference],free
je .wasfree je .wasfree
cmp [es:.mb.isresident],true cmp [es:mb.isresident],true
je .wasresident je .wasresident
mov [es:.mb.reference],free mov [es:mb.reference],free
push cs push cs
pop ds pop ds
mov si,.isfree mov si,.isfree
lea di,[es:.mb.names] lea di,[es:mb.names]
mov cx,6 mov cx,6
cld cld
rep movsb rep movsb
@ -339,24 +330,24 @@ proc mbfree uses ax bx cx si di ds es, blocks:word
dec bx dec bx
.searchtofree: .searchtofree:
mov es,bx mov es,bx
cmp word [es:.mb.check],"NH" cmp word [es:mb.check],"NH"
jne .memoryerror jne .memoryerror
inc bx inc bx
inc bx inc bx
add bx,[es:.mb.sizes] add bx,[es:mb.sizes]
cmp [es:.mb.sizes],0 cmp [es:mb.sizes],0
je .nottofree je .nottofree
cmp ax,[es:.mb.reference] cmp ax,[es:mb.reference]
jne .nottofree jne .nottofree
mov [es:.mb.isresident],false mov [es:mb.isresident],false
mov [es:.mb.reference],free mov [es:mb.reference],free
mov si,.isfree mov si,.isfree
lea di,[es:.mb.names] lea di,[es:mb.names]
mov cx,6 mov cx,6
cld cld
rep movsb rep movsb
.nottofree: .nottofree:
cmp [es:.mb.isnotlast],true cmp [es:mb.isnotlast],true
je .searchtofree je .searchtofree
stdcall mbclean stdcall mbclean
ret ret
@ -382,23 +373,20 @@ proc mbclean uses ax bx dx es gs
xor dx,dx xor dx,dx
.searchfree: .searchfree:
mov gs,bx mov gs,bx
virtual at 0 cmp word [gs:mb.check],"NH"
.mb mb
end virtual
cmp word [gs:.mb.check],"NH"
jne .memoryerror jne .memoryerror
inc bx inc bx
inc bx inc bx
add bx,[gs:.mb.sizes] add bx,[gs:mb.sizes]
cmp word [gs:.mb.sizes],0 cmp word [gs:mb.sizes],0
je .notenougtmem je .notenougtmem
cmp [gs:.mb.reference],free cmp [gs:mb.reference],free
jne .notfree jne .notfree
cmp ax,0 cmp ax,0
je .notmeetfree je .notmeetfree
add dx,[gs:.mb.sizes] add dx,[gs:mb.sizes]
mov word [gs:.mb.check],0 mov word [gs:mb.check],0
mov dword [gs:.mb.names],0 mov dword [gs:mb.names],0
inc dx inc dx
inc dx inc dx
jmp .nottrigered jmp .nottrigered
@ -410,16 +398,16 @@ proc mbclean uses ax bx dx es gs
cmp ax,0 cmp ax,0
je .nottrigered je .nottrigered
mov es,ax mov es,ax
add [es:.mb.sizes],dx add [es:mb.sizes],dx
xor ax,ax xor ax,ax
.nottrigered: .nottrigered:
cmp [gs:.mb.isnotlast],true cmp [gs:mb.isnotlast],true
je .searchfree je .searchfree
cmp ax,0 cmp ax,0
je .reallyfinish je .reallyfinish
mov es,ax mov es,ax
add [es:.mb.sizes],dx add [es:mb.sizes],dx
mov [es:.mb.isnotlast],false mov [es:mb.isnotlast],false
.reallyfinish: .reallyfinish:
clc clc
ret ret
@ -437,12 +425,9 @@ proc mbresident uses bx es, blocks:word
dec bx dec bx
dec bx dec bx
mov es,bx mov es,bx
virtual at 0 cmp word [es:mb.check],"NH"
.mb mb
end virtual
cmp word [es:.mb.check],"NH"
jne .memoryerror jne .memoryerror
mov [es:.mb.isresident],true mov [es:mb.isresident],true
ret ret
.memoryerror: .memoryerror:
stc stc
@ -455,12 +440,9 @@ proc mbnonresident uses bx es, blocks:word
dec bx dec bx
dec bx dec bx
mov es,bx mov es,bx
virtual at 0 cmp word [es:mb.check],"NH"
.mb mb
end virtual
cmp word [es:.mb.check],"NH"
jne .memoryerror jne .memoryerror
mov [es:.mb.isresident],false mov [es:mb.isresident],false
ret ret
.memoryerror: .memoryerror:
stc stc
@ -474,15 +456,12 @@ proc mbchown uses bx dx es,blocks:word, owner:word
dec bx dec bx
dec bx dec bx
mov es,bx mov es,bx
virtual at 0 cmp word [es:mb.check],"NH"
.mb mb
end virtual
cmp word [es:.mb.check],"NH"
jne .memoryerror jne .memoryerror
cmp [es:.mb.reference],free cmp [es:mb.reference],free
je .wasfree je .wasfree
mov dx,[owner] mov dx,[owner]
mov [es:.mb.reference],dx mov [es:mb.reference],dx
ret ret
.memoryerror: .memoryerror:
stc stc
@ -511,21 +490,18 @@ proc mbget uses bx dx es, num:word
xor dx,dx xor dx,dx
.searchfree: .searchfree:
mov es,bx mov es,bx
virtual at 0 cmp word [es:mb.check],"NH"
.mb mb
end virtual
cmp word [es:.mb.check],"NH"
jne .memoryerror jne .memoryerror
inc bx inc bx
inc bx inc bx
add bx,[es:.mb.sizes] add bx,[es:mb.sizes]
cmp [es:.mb.sizes],0 cmp [es:mb.sizes],0
je .memoryerror je .memoryerror
cmp dx,[num] cmp dx,[num]
je .foundmcb je .foundmcb
ja .notfound ja .notfound
inc dx inc dx
cmp [es:.mb.isnotlast],true cmp [es:mb.isnotlast],true
je .searchfree je .searchfree
.memoryerror: .memoryerror:
stc stc
@ -549,16 +525,13 @@ proc mbfind uses bx si di es, blocks:word
mov si,[blocks] mov si,[blocks]
.search: .search:
mov es,bx mov es,bx
virtual at 0 lea di,[es:mb.names]
.mb mb cmp word [es:mb.check],"NH"
end virtual
lea di,[es:.mb.names]
cmp word [es:.mb.check],"NH"
jne .memoryerror jne .memoryerror
inc bx inc bx
inc bx inc bx
add bx,[es:.mb.sizes] add bx,[es:mb.sizes]
cmp [es:.mb.sizes],0 cmp [es:mb.sizes],0
je .memoryerror je .memoryerror
push si di push si di
.cmpnames: .cmpnames:
@ -573,7 +546,7 @@ proc mbfind uses bx si di es, blocks:word
.ok: .ok:
pop di si pop di si
je .foundmcb je .foundmcb
cmp [es:.mb.isnotlast],true cmp [es:mb.isnotlast],true
je .search je .search
.notfound: .notfound:
stc stc
@ -596,19 +569,16 @@ proc mbfindsb uses bx dx si di es, blocks:word, owner:word
dec bx dec bx
dec bx dec bx
mov si,[blocks] mov si,[blocks]
virtual at 0 lea di,[es:mb.names]
.mb mb
end virtual
lea di,[es:.mb.names]
mov dx,[owner] mov dx,[owner]
.search: .search:
mov es,bx mov es,bx
cmp word [es:.mb.check],"NH" cmp word [es:mb.check],"NH"
jne .memoryerror jne .memoryerror
inc bx inc bx
inc bx inc bx
add bx,[es:.mb.sizes] add bx,[es:mb.sizes]
cmp [es:.mb.sizes],0 cmp [es:mb.sizes],0
je .memoryerror je .memoryerror
push si di push si di
.cmpnames: .cmpnames:
@ -623,10 +593,10 @@ proc mbfindsb uses bx dx si di es, blocks:word, owner:word
.ok: .ok:
pop di si pop di si
jne .notfoundmcb jne .notfoundmcb
cmp [es:.mb.reference],dx cmp [es:mb.reference],dx
je .foundmcb je .foundmcb
.notfoundmcb: .notfoundmcb:
cmp [es:.mb.isnotlast],true cmp [es:mb.isnotlast],true
je .search je .search
.notfound: .notfound:
stc stc

View File

@ -455,9 +455,6 @@ showbuffers db '\l\c02Contenu des tampons disquette\l\l\c07'
diskbuffers diskbuffer diskbuffers diskbuffer
code_dump: code_dump:
virtual at 0
.mb mb
end virtual
invoke gettypeditem,di,0,' ' invoke gettypeditem,di,0,' '
invoke mbfind,di invoke mbfind,di
jc notmbfind jc notmbfind
@ -472,10 +469,7 @@ code_dump:
notace2: notace2:
push non push non
suitelikeace2: suitelikeace2:
virtual at 0 cmp word [gs:mb.isnotlast],true
.mb mb
end virtual
cmp word [gs:.mb.isnotlast],true
je notlast2 je notlast2
push oui ;CE? str0 2 push oui ;CE? str0 2
jmp suitelikelast2 jmp suitelikelast2
@ -485,29 +479,20 @@ suitelikelast2:
mov dx,gs mov dx,gs
push edx ;Emplacement memoire hex 2 push edx ;Emplacement memoire hex 2
;parent ;parent
virtual at 0 cmp [gs:mb.reference],0
.mb mb
end virtual
cmp [gs:.mb.reference],0
jne nextdetect2 jne nextdetect2
push cs push cs
push none ;parent lstr0 2x2 push none ;parent lstr0 2x2
add bx,[gs:.mb.sizes] add bx,[gs:mb.sizes]
jmp suitemn2 jmp suitemn2
nextdetect2: nextdetect2:
virtual at 0 mov dx,[gs:mb.reference]
.mb mb
end virtual
mov dx,[gs:.mb.reference]
dec dx dec dx
dec dx dec dx
push dx ;parent lstr0 2x2 push dx ;parent lstr0 2x2
push .mb.names push mb.names
suitemn2: suitemn2:
virtual at 0 cmp [gs: mb.isresident],true
.mb mb
end virtual
cmp [gs: .mb.isresident],true
jne notresident2 jne notresident2
push oui ;resident str0 2 push oui ;resident str0 2
jmp suitelistmcb2 jmp suitelistmcb2
@ -515,14 +500,11 @@ notresident2:
push non ;resident str0 2 push non ;resident str0 2
suitelistmcb2: suitelistmcb2:
xor edx,edx xor edx,edx
virtual at 0 mov dx,[gs:mb.sizes]
.mb mb
end virtual
mov dx,[gs:.mb.sizes]
shl edx,4 shl edx,4
push edx push edx
push gs ;nom lstr0 2x2 push gs ;nom lstr0 2x2
push .mb.names push mb.names
push dumpshow ;ligne push dumpshow ;ligne
invoke print invoke print
cmp word [fs:0x0],'EC' cmp word [fs:0x0],'EC'
@ -1037,29 +1019,20 @@ suitelikeace:
mov dx,fs mov dx,fs
push edx ;Emplacement memoire hex 2 push edx ;Emplacement memoire hex 2
;parent ;parent
virtual at 0 cmp [gs:mb.reference],0
.mb mb
end virtual
cmp [gs:.mb.reference],0
jne nextdetect jne nextdetect
push cs push cs
push none ;parent lstr0 2x2 push none ;parent lstr0 2x2
add bx,[gs:.mb.sizes] add bx,[gs:mb.sizes]
jmp suitemn jmp suitemn
nextdetect: nextdetect:
virtual at 0 mov dx,[gs:mb.reference]
.mb mb
end virtual
mov dx,[gs:.mb.reference]
dec dx dec dx
dec dx dec dx
push dx ;parent lstr0 2x2 push dx ;parent lstr0 2x2
push .mb.names push mb.names
suitemn: suitemn:
virtual at 0 cmp [gs: mb.isresident],true
.mb mb
end virtual
cmp [gs: .mb.isresident],true
jne notresident jne notresident
push oui ;resident str0 2 push oui ;resident str0 2
jmp suitelistmcb jmp suitelistmcb
@ -1067,15 +1040,12 @@ notresident:
push non ;resident str0 2 push non ;resident str0 2
suitelistmcb: suitelistmcb:
xor edx,edx xor edx,edx
virtual at 0 mov dx,[gs: mb.sizes]
.mb mb
end virtual
mov dx,[gs: .mb.sizes]
shl edx,4 shl edx,4
push 6 ;decimal 4 + type 2 push 6 ;decimal 4 + type 2
push edx push edx
push gs ;nom lstr0 2x2 push gs ;nom lstr0 2x2
push .mb.names push mb.names
push line2 ;ligne push line2 ;ligne
invoke print invoke print
jmp listmcb jmp listmcb