1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
| Code Segment
Assume Cs : Code ; CS pointe vers le segment de code
Org 100h ; Apres le PSP, entete d'un fichier executable DOS
Main Proc ; procedure principale
JMP Debut ; saute au debut
; Variables definit pour le programme DOS de copie sur disquettes ______________
Buffer DB 1024 Dup(0)
Ok DB "Copie Ok.",10,13,"La disquette boot est OK, vous pouvez redemarrer votre PC.",10,13,0
Erreur DB "Erreur de copie sur disquette",10,13,0
Message DB "Introduisez une disquette vierge dans le lecteur A:",10,13,0
Nb_Err DB 0
fichier DB "PROGRAM2.EXE",0
OkFile DB "OK Fichier",10,13,0
ErrFile DB "Erreur fichier",10,13,0
; Debut du code de copie sur disquette _________________________________________
Debut: ; initialisation
Mov Ax, Cs ; C'est un .COM, donc 1 segment suffit.
Mov Ds, Ax ; DS = segment data = segment code pour un .COM
Mov Es, Ax ; ES = segment de son choix
mov si, offset Message ; impression du message
call printf
Mov Ah, 00h ; attente d'un appuie sur touche
Int 16h
Mov Si, Offset codeACopier ; adresse source du code a copier ( DS:SI )
Mov Di, Offset Buffer ; adresse de destination ( DS:DI )
Mov Cx, 512 ; on copie 512 octet dans le buffer
Rep MovSB
Mov Ax, 0
Mov Cx, 1
call copieDisk
Mov Ax, Cx
call hex2ascii
call lireFichier
Mov Ax, 0 ; copie du 2eme secteur disquette
Mov Cx, 2 ; issue du programme PROGRAM2.EXE
call copieDisk
Mov Ax, Cx
call hex2ascii
Mov Ax, 512 ; copie du 3eme secteur disquette
Mov Cx, 3 ; issue du programme PROGRAM2.EXE
call copieDisk
Mov Ax, Cx
call hex2ascii
mov si, offset Ok ; Impression du message OK
call printf
Mov Ax, 4C00h ; on quitte le programme MS DOS
Int 21h
copieDisk: ; Ax decalage buffer, Cx secteur
push Ax
push Cx
Copie_Disquette: ; Copie du buffer sur la disquette
Mov Ah, 00h ; fonction 0 -> reset du disque
Mov Dl, 0 ; index du lecteur
Int 13h
pop Cx ; CH numero de cylindre ( 8 dernier bits ), CL numero de secteur 1 a 63 ( bit 0 a 5 ) + 2 bit de cylindre ( 6 et 7 )
Lea Bx, Buffer ; ES:BX buffer du donnees
pop Ax
add Bx, Ax
Mov Ax, 0301h ; fonction 3 ecriture sur le secteur 1
Mov Dx, 0 ; DH numero de tete, DL numero de lecteur
Int 13h
JNC Okay ; Jump si carry flag CF est a 0
Inc Nb_Err ; Si il y a eu une erreur
Cmp Nb_Err, 5 ; moins de 5 erreurs on continue
JL Copie_Disquette
mov si, offset Erreur ; Impression du message
call printf
Okay:
nop
ret
lireFichier:
push ax
push dx
; ouverture du fichier
mov ax, 3D80h
mov dx, offset fichier
int 21h
JNC fichier_ouvert
mov si, offset ErrFile ; Impression du message erreur
call printf
call hex2ascii ; Impression du code d'erreur dans AX
jmp fichier_fin
fichier_ouvert:
push ax
mov si, offset OkFile ; Impression du message erreur
call printf
pop ax
mov bx, ax
push ax
mov ax, 4200h ; deplacemennt de 512 octets
mov cx, 0
mov dx, 200h
int 21h
pop ax
mov bx, ax
push ax
mov ax, 3F00h ; lecture du fichier
mov cx, 1024
mov dx, offset buffer
int 21h
pop ax
mov bx, ax ; On met le handle du fichier dans BX
mov ax, 3E00h
int 21h
fichier_fin:
pop dx
pop ax
ret
; Code est copié sur disquette et sera exécuté lors du BOOT ____________________
codeACopier:
mov ax, 07C0h ; Le boot est copie en 0000:7C00 ou 07C0:0000
mov ds, ax
mov es, ax
mov ax, 8000h ; stack en 0xFFFF
mov ss, ax
mov sp, 0f000h
; la pile qui commence en 0x8F000 et finit en 0x80000 ( SS:SP )
; le segment de donnees qui commence en 0x07C00 et finit en 0x17C00 ( 0000:7C00 a 1000:7C00 )
; le secteur de boot charge en 0x07C00 et qui finit en 0x07CFF. ( 0000:7C00 a 0000:7CFF )
; Initialisation des vecteur d'interruption ____________________________________
push ax
push es
xor ax,ax
mov es,ax ; Es <--- 0
mov word [es:21h*4], offset int21 ; Initialisation du vecteur
mov word [es:21h*4+2], cs ; de l'interruption, CS code segment
pop es
pop ax
; code _________________________________________________________________________
mov ax, 0012h ; 640x480x16
int 10h
mov ax, offset toto
sub ax, offset codeACopier ; lors de la compilation du .COM l'offet et par rapport a celui-ci !!!
mov si, ax ; Impression d'un message
call printf
mov ax, 00h
boucle:
call hex2ascii
inc ax
cmp ax, 100h
jne boucle
mov ax, offset toto
sub ax, offset codeACopier ; lors de la compilation du .COM l'offet et par rapport a celui-ci !!!
mov si, ax ; Impression d'un message
call printf
Mov Ax, 0 ; charge en 7E00
Mov Cx, 2 ; 2eme secteur de le disquette en memoire
call lireDisk
Mov Ax, 512 ; charge en 8000
Mov Cx, 3 ; 3eme secteur de le disquette en memoire
call lireDisk
mov ax, offset titi
sub ax, offset codeACopier ; lors de la compilation du .COM l'offet et par rapport a celui-ci !!!
mov si, ax ; Impression d'un message
call printf
jmp suite ; On saute sur la suite du programme
toto DB "Noopsy 32",10,13,0
titi DB "Lecture OK",10,13,0
printf:
push ax
push bx
printf_debut:
lodsb ; ds:si -> al
cmp al,0 ; fin chaine ?
jz printf_fin
mov ah,0Eh ; appel au service 0x0e, int 0x10 du bios
mov bx,02h ; bx -> attribut, al -> caractere ascii
int 10h
jmp printf_debut
printf_fin:
pop bx
pop ax
ret
; AH = 02h
; AL = number of sectors to read (must be nonzero)
; CH = low eight bits of cylinder number
; CL = sector number 1-63 (bits 0-5)
; high two bits of cylinder (bits 6-7, hard disk only)
; DH = head number
; DL = drive number (bit 7 set for hard disk)
; ES:BX -> data buffer
lireDisk:
push Ax
push Cx
Lire_Disquette: ; Copie du buffer sur la disquette
Mov Ah, 00h ; fonction 0 -> reset du disque
Mov Dl, 0 ; index du lecteur
Int 13h
pop Cx ; CH numero de cylindre ( 8 dernier bits ), CL numero de secteur 1 a 63 ( bit 0 a 5 ) + 2 bit de cylindre ( 6 et 7 )
Mov Bx, 7E00h ; ES:BX buffer du donnees -> 7C00 + 200 ( 512 ) = 7E00
pop Ax
Add Bx, Ax
Mov Ax, 0201h ; fonction 2 lecture secteur 1
Mov Dx, 0 ; DH numero de tete, DL numero de lecteur
Int 13h
JNC Ouais ; Jump si carry flag CF est a 0
;Inc Nb_Err ; Si il y a eu une erreur
;Cmp Nb_Err, 5 ; moins de 5 erreurs on continue
;JL Lire_Disquette
mov ax, offset Erreur
sub ax, offset codeACopier ; lors de la compilation du .COM l'offet et par rapport a celui-ci !!!
mov si, ax ; Impression d'un message
call printf
Ouais:
nop
ret
hex2ascii:
push ax ; on sauve AX
push bx
push dx ; on sauve DX
mov dl, 10h
div dl ; 1C -> 28 / 16 -> 1 dans AL, reste dans AH
cmp al, 0Ah ; converssion AL en 0 -> F
jne passeA
mov dl, 'A'
jmp finConv
passeA:
cmp al, 0Bh ; converssion AL en 0 -> F
jne passeB
mov dl, 'B'
jmp finConv
passeB:
cmp al, 0Ch ; converssion AL en 0 -> F
jne passeC
mov dl, 'C'
jmp finConv
passeC:
cmp al, 0Dh ; converssion AL en 0 -> F
jne passeD
mov dl, 'D'
jmp finConv
passeD:
cmp al, 0Eh ; converssion AL en 0 -> F
jne passeE
mov dl, 'E'
jmp finConv
passeE:
cmp al, 0Fh ; converssion AL en 0 -> F
jne passeF
mov dl, 'F'
jmp finConv
passeF:
add al, 30h ; converssion en nombre
mov dl, al
finConv:
cmp ah, 0Ah ; converssion AL en 0 -> F
jne passeA2
mov dh, 'A'
jmp finConv2
passeA2:
cmp ah, 0Bh ; converssion AL en 0 -> F
jne passeB2
mov dh, 'B'
jmp finConv2
passeB2:
cmp ah, 0Ch ; converssion AL en 0 -> F
jne passeC2
mov dh, 'C'
jmp finConv2
passeC2:
cmp ah, 0Dh ; converssion AL en 0 -> F
jne passeD2
mov dh, 'D'
jmp finConv2
passeD2:
cmp ah, 0Eh ; converssion AL en 0 -> F
jne passeE2
mov dh, 'E'
jmp finConv2
passeE2:
cmp ah, 0Fh ; converssion AL en 0 -> F
jne passeF2
mov dh, 'F'
jmp finConv2
passeF2:
add ah, 30h ; converssion en nombre
mov dh, ah
finConv2:
Mov Ah, 0Eh
Mov Al, '['
Mov Bl, 3
Int 10h
Mov Al, dl
Int 10h
Mov Al, ':'
Int 10h
Mov Al, dh
Int 10h
Mov Al, ']'
Int 10h
pop DX
pop BX
pop AX
ret
int21:
nop
iret
db 174 Dup(144) ; remplissage
dw 0AA55h ; mot magique
; code a copier dans le 2eme secteur de la disquette
suite: ; On arrive ici et on se branche sur le code de program.exe
; Fin du code a copier sur la disquette ________________________________________
Main EndP
Code EndS
End Main |
Partager