Copy Link
Add to Bookmark
Report

ASSEMBLER (parte II)

eZine's profile picture
Published in 
bakunin
 · 14 Aug 2022

BAKUNIN
bakunin@meganmail.com


Dopo la I ora faccio la II!
Incomincio subito col dire che sono necessari per questa lezione 2 allegati. Indi per cui in questo .zip saranno inseriti i seguenti files:

file_1.asm
file_2.asm
e ovviamente questo file!


Premessa 1:

Le due sorgenti (si dicono sorgenti quei file che devono essere ancora compilati) sono stati impostati per un compilatore della GNU. Questo è anche totalmente compatibile con il MASM (compilatore per Windozz) ma non so per gli altri. Su Linux funziona incredibilmente bene ;-) per windozz funziona solo con MASM (credo, ma ne ho buone certezze). Ora quindi a voi la scelta:

  • Comprarvi MASM al modico prezzo di 300.000 lire
  • Usare un compilatore di Linux scaricabile gratuitamente da Internet se non già compreso nella versione da utilizzare

Premessa 2:

Dato che io sono ONESTO!!! Ammetto che la prima sorgente non l'ho creata io, ma lo scaricata da internet gratuitamente. Volevo creare un file abbastanza semplice, ma poi ho trovato questo. I commenti li ho aggiunti in gran parte io specificando meglio cosa voleva dire, anche se in gran parte c'erano già.


Incominciamo subito con il corso.

INDICE

  1. Aprite file_1.asm e leggete!
  2. Commenti al file_1.asm
  3. File_2.asm con spiegazioni

1. Commenti al file_1.asm

Cosa dire?


Label.

Innanzi tutto che esistono, come in molto altri linguaggi le label.
Le label qui si fanno grazie ai 2 punti.
Così:

PIPPO: 
...
...
...

Semplice!

Ricordate che il programma non funziona se usate Label con nomi riservati cioè con parole che sono comandi. Questo è un grave errore. Per evitare questo semplicemente usate parole italiane.

Dato che le label si usano molto spesso, e dato che i comandi possibili sono tanti, io vi consiglio di usare spesso il carattere _ . Questo carattere è usato spesso per le label dai programmatori seri. Ma non mettetelo come primo carattere.


ESEMPIO:

ciao_bello:

MODEL

Model è un comando che regola prevalentemente il tipo di programma (nel nostro caso MASM) Non in tutti i programmi è necessario come non in tutti i programmi funziona così.

Questo comando funziona così:

  • TINY Che vuol dire fai diventare il futuro programma un .COM .Queso è perché con l'opzione TINY regolo i segmenti che verranno utilizzati all'interno dello stesso programma.
  • C regolo il tipo di linguaggio. Questo è necessario per certe operazioni. perché? Semplicemente perché certe operazioni vanno regolate fuori dall'assembler. Se vi sentite sicuri sul C mettere C (come io ho fatto). Se preferite PASCAL mettete questo. Non cambia nulla in questo programma ma magari in altri di più. Non posso farvi esempi sull'uso di questa istruzione perché la sorgente file_1.asm non ne fa uso. Posso solo dirvi che l'ultimo comando .END sarebbe diventato, se in PASCAL, END. . Nulla di più.
  • NEARSTACK vuol dire che l'intero segmento che il programma utilizzarà sarà preso dal programma stesso.
  • .STACK serve ad evitare errori durante la compilazione. Ai fini del programma non serve
  • .286 serve per dire al compilatore che stiamo usando comandi impostati nel 8088 fino al 286.Avrei potuto utilizzare tranquillamente quelle dello 8088 senza mettere questo comando dato che comunque tutti questi comandi funzionano anche nelle macchine successive.
  • .DATA serve a dire le variabili che utilizzarò nel programma
  • e infine le direttive .CODE e .STARTUP indicano al compilatore che le istruzioni iniziano a partire da .CODE e che l'esecuzione del programma deve iniziare a partire dalla direttiva .STARTUP.
  • .EXIT Con questo comando il compilatore inserisce automaticamente i comando:

MOV AH,4Ch 
INT 21h

e quindi termina il programma. Questi 2 comandi li abbiamo già visti quindi non mi soffermo.

XOR DX,DX

Come vi ho detto ora parliamo di questo comando che vi sembrerà inutile. Questo è posto dopo la label P3:. Se lo eliminate il comando si blocca e dovete riavviare il computer.

Voi sapete che l'istruzione DIV BX serve a dividere il registro DX:AX e il registro BX inserendo il resto in DX. Ma bisogna prima azzerare DX altrimenti si blocca il tutto.

Il registro DX in effetti puo' contenere valori diversi da zero, ma...... al MOMENTO di eseguire l'istruzione DIV , questa deve azzerare DX, quindi DX DEVE avere un valore tale che l'istruzione DIV azzeri DX e questo possa contenere il resto.


------------------Fine del commento del primo programma!------------------


ACCEDERE AD UN DISCHETTO E FORMATTARLO ACCURATAMENTE

Spesso quando si fa una formattazione questa è fatta in modo approssimativo. Infatti molte volte virus cancellati sono ripartiti tranquillamente provocando ancora danni.

In questa sezione impareremo ad accedere al disco a livello fisico (e non logico come di fatto vi accede il famoso FORMAT A: quando il dischetto e' gia' formattato a basso livello, e cioe' nella quasi totalita' dei casi, ivi compresi i dischetti nuovi appena spacchettati).

Quindi facciamo un piano di lavoro:

L'unica cosa che sappiamo fare è usare interrupt del BIOS e quindi useremo queste. Più avanti, se avrò voglia vi farò riscriverò lo stesso programma, ma stavolta accedendo direttamente alle porte di I/O, ed escludendo completamente l'ausilio del BIOS.

Per ora saremo gia' a un discreto grado di comprensione se utilizzeremo le funzioni del BIOS e ne vedremo i risultati, cambiando addirittura il carattere di FILL-UP (cioè il carattere che indica che lo spazio e libero), e mettendo perche' no! la prima lettera di Gaetano, cioe' 1,44 Milioni di G al posto di ˜ (codice ASCII 246) che e' il carattere di FILL-UP standard per i dischetti. Alla fine bastera' verificare qualche centinaio di settori (specialmente nei primi cilindri (o le prime testine) e avremo la garanzia che le routines del BIOS hanno effettivamente formattato a basso livello il nostro Floppy-Disk.

Quindi faremo:

  1. Procuriamoci le informazioni che ci servono, cioè il driver e altre cosucce.
  2. Chiediamo conferma all'utente per la formattazione. Lo facciamo attraverso la richiesta di Y. Se ciò non accade si esce.
  3. Proiettiamo una mascherina dello stato di aggiornamento della formattazione. (La formattazione a basso livello e' abbastanza lunga e un utente impaziente potrebbe spegnere il computer o attivare un CTRL+ALT+CANC.)
  4. Iniziamo la formattazione traccia per traccia (dopo aver definito ogni settore), e verifichiamo se e' stata eseguita regolarmente. In caso di errore (ripetuto oltre le 4 volte) diamo il messaggio di errore e il codice corrispondente.
  5. Alla fine, prima di saltare alla nostra funzione DISK_VIEW inseriamo nel primo settore assoluto il BPB (il Blocco dei Parametri del BIOS) che ci consentira' di potervi accedere (dal BIOS) e anche di poter continuare facilmente a scrivere a livello fisico (settore per settore) qualunque dato vogliamo.
  6. Rendiamo semplice l'uscita dal programma allorché l'utente preme il tasto ESC (cod. ASCII 1Bh).

Ora beccatevi il file_2.asm

-------------------FINE SECONDA SORGENTE E SPIEGAZIONI---------------

Ciao a tutti da:

BAKUNIN
bakunin@meganmail.com

file_1.asm

;Incominciamo col dire che con i punti e virgola faccio i commenti 
;In questo txt non vado a capo poichË non devo. Certi comando sono un po' lunghetti
;fateci l'abitudine

.MODEL TINY,C,NEARSTACK ;Ve le spiego dopo
.STACK ;nel txt principale
.286

.DATA
;Ve lo spiego nel txt generale

CONT1 BYTE 0
CONT BYTE 5
PRV WORD 0
MSGMADE DB 'QUESTO PROGR. RESTITUISCE IL CODICE IN ESADECIMALE,BINARIO O DECIMALE DI UN CHAR'
DB 'Programma di Gaetano Gambilonghi v. A. De Gasperi 17/A Buccheri (SR) '
DB 'Vers. 0.0 Inserire un CARATTERE '

;Sono o no onesto?

;Qui sono finiti le costanti aperte con DATA

.CODE
.STARTUP

;Incominciamo!

MOV AH,0 ; SET MODALITA' VIDEO
MOV AL,3 ; MODALITA' 3 = TESTO a colori 80 x 25
INT 10H ; Esegui ( e pulisci anche lo schermo)

mov ah,13h ; Funzione 13h = visualizza una serie di caratteri

lea bp,MSGMADE ; Load Effective Address dei caratteri di MSGMADE
; in BP va indicato l'inizio dell'indirizzo della
; nostra stringa. (Carica l'Indirizzo Effettivo).
; Questo vuol dire che legge tra di dati quello che si chiama MSGMADE lo fa vedere


mov al,01h ; sub funzione 1 = gli attributi di tutti i caratteri
; sono specificati in BL, e il cursore deve avanzare

mov bh,0 ; Pagina video 0 ( in primo piano)

mov bl,70H ; i colori dei caratteri (7) e dello sfondo (0)

mov dx,0 ; N. di riga (DH = 0) e di colonna (DL = 0) cioe'
; inizia in alto a sinistra alla posizione 0,0

mov cx,240 ; Quanti caratteri ? ( tutti i 240 della stringa).

int 10h ; Esegui i comandi precedenti

cifra1:
mov ah,07h ;aspetta un carattere da tastiera
int 21h ;e lo memorizza in al
push ax ;salva temporaneamente ax nello stack
mov bx,ax ;fa una copia di al in bl
mov dl,al ;fa un altra copia di al in dl
;per poi lavorare in dl
shr dl,4 ;ruota a destra il carattere premuto di 4 bit
;per prendere i 4 bit piu' significativi
add dl,30h ;aggiunge 30h in modo da poter visualizzare la cifra
cmp dl,3ah ;verifica se dl e' minore di 3ah, se lo e' va a visual
jl visual ;se no continua......
add dl,7h ;ed aggiunge un 7 per poter visualizzare la lettera

visual:
mov ah,2 ;visualizza o la prima cifra
int 21h ;oppure la prima lettera

cifra2:
pop ax ;riprende il valore di ax dallo stack

mov dl,al ;fa nuovamente una copia del carattere premuto in dl

and dl,0fh ;fa un and logico per prendere i 4 bit di destra
add dl,30h ;aggiunge 30h in modo da poter visualizzare la cifra
cmp dl,3ah ;verifica se dl e' minore di 3ah, se lo e' va a visual1
jl visual1 ;se no continua.....
add dl,7h ;ed aggiunge 7 per visualizzare la lettera

visual1:
mov ah,02h ;visualizza o la seconda cifra
int 21h ;oppure la seconda lettera

mov ah,02h ;visualizza la lettera h
mov dl,48h ;che sta per indicare
int 21h ;numero in esadecimale


BINARIO: ;procedura per stampare in binario
mov ah,02h ;si mette alla linea successiva
mov dl,0ah ;per non creare confusione
int 21h ;tra il numero esadecimale ed il numero binario

mov ah,02h ;si mette all inizio della linea
mov dl,0dh
int 21h

mov cx,08h ;imposta il registro contatore a 8 (per gli 8 bit)
push bx ;salva nello stack bx (il carattere premuto)

p1:
rcl bl,1 ;ruota a sinistra con il riporto la lettera premuta
;copiata precedentemente anche in bl
mov dl,00h ;azzera il registro dl
adc dl,30h ;aggiunge al riporto 30h e lo memorizza in dl
mov ah,02h ;per avere la cifra (1 oppure 0) gia'
int 21h ;pronta per poterla stampare
loop p1 ;ripete p1 tante volte quanto e' detto da cx

mov ah,02h ;visualizza la lettera
mov dl,42h ;b che sta per indicare
int 21h ;numero in binario

mov ah,02h ;come esadecimale
mov dl,0ah
int 21h

mov ah,02h
mov dl,0dh
int 21h


DECIMALE: ;procedura per stampare in decimale
pop bx ;riprende dallo stack bx (il carattere premuto)
mov ax,bx ;fa una copia in ax di bx
mov bx,000ah ;mette in bx il valore 10 che servira' come divisore
xor cx,cx ;azzera cx

p3:
xor dx,dx ;azzera anche dx (il registro di riporto). Vi spiego il suo
;finzionamento nel txt principale.
and ax,00ffh ;prende solo gli 8 bit meno significativi
(carattere) div bx ;divide per 10:il risultato in ax e il riporto in dx
push dx ;salva nello stack il resto
inc cx ;la prossima divisione
cmp al,0 ;sono finite le divisioni?
je p4 ;se si va a p4 (visualizzare)
jmp p3 ;altrimenti continua un altra divisione

p4:
pop dx ;riprende i resti uno alla volta
add dx,30h ;lo trasforma in carattere ascii(stampabile)
mov ah,02h ;stampa
int 21h ;il carattere
dec cx ;controlla le cifre
cmp cx,0 ;sono finite?
je fine1 ;se si finisce
jmp p4 ;altrimenti prendi le altre cifre




fine1:


.EXIT
END

;Non Ë complicato...
;Se non capite qualche cosa rileggete perchË Ë molto logico.
;Ora andate al file assembler_II.txt per vedere particolari commenti


file_2.asm

;LWFORMAT LOW LEVEL FORMAT OVVERO FORMATTATORE AL PIU BASSO LIVELLO 

.model tiny,c,nearstack
.stack 1024
.486

.data



PG_UP byte 0
PG_DOWN byte 0
drvs byte 'A'


count BYTE 0
count1 byte 0
cnt1 BYTE 16
cod_err BYTE 0
tipo_drv BYTE 0
provv BYTE 0
num_cyl WORD 0
num_test BYTE 0
max_settore BYTE 18
max_traccia BYTE 79
max_lato BYTE 1
s_puntat_ddpt WORD 0
o_puntat_ddpt WORD 0
quale_vis word 0
ch_r BYTE 0
drv BYTE 0
traccia db 0
lato BYTE 0
settore BYTE 0
num_byte byte 0
f_tableAB DWORD 0
of_rip word ?
sg_rip word ?
cnt word 0
colore byte 60h
DD_PT db 512 dup(20H) ; IL DISK DATA PARAMETER TABLE'

clrsc db 2000 dup(20h)
buff_provv db 1024 dup(47h)
fr_attrib db 512 dup(0)
primo_half byte 1

msg_G db 'PER PROSEGUIRE CON LA FORMATTAZIONE premere <G> per 1,44M oppure <g> per 720K '
msg_udp db ' USARE <Pg Up> - <Pg Dwn> per visualizzare i settori ( <ESC> per uscire ) '


msg_err01 db ' COMANDO NON VALIDO - <ERRORE DEL PROGRAMMA> '
msg_err02 db ' CONTRASSEGNO DEGLI INDIRIZZI NON TROVATO - <ERRORE PROGRAMMA> O DEL DISCO '
msg_err03 db ' DISCO PROTETTO IN SCRITTURA <ERRORE UTENTE> '
msg_err04 db ' SETTORE NON TROVATO - '
msg_err05 db ' RESET FALLITO <ERRORE CONTROLLER> '
msg_err06 db ' FLOPPY DISK RIMOSSO <ERRORE UTENTE> '
msg_err07 db ' TABELLA DEI PARAMETRI ROVINATA '
msg_err08 db ' OVERFLOW DEL DMA '
msg_err09 db ' IL DMA HA SUPERATO I CONFINI DI SEGMENTO '
msg_err0A db ' FLAG DI SETTORE NON VALIDO '
msg_err010 db ' ERRORE CRC <ECC> IRRIMEDIABILE '
msg_err011 db ' ECC HA CORRETTO ERRORE DEI DATI '
msg_err020 db ' ERRORE DEL CONTROLLER '
msg_err040 db ' ERRORE DI RICERCA '
msg_err080 db ' ERRORE DI TIME OUT <TROPPO TEMPO TRASCORSO> CAUSA PROBABILE: DISCO NON INSERITO'
msg_err0AA db ' DRIVE NON PRONTO '
msg_err0BB db ' ERRORE GENERICO NON INDIVIDUATO DAL BIOS '
msg_err0CC db ' ERRORE DI SCRITTURA '
msg_err0E0 db ' ERRORE DI STATO '






msg_dskw0 db ' SETTORE ASSOLUTO: 0 =----> TRACCIA : 0 SETTORE : 1 LATO : 0 '

fine_frmt db ' FORMATTAZIONE A BASSO LIVELLO COMPLETATA. PREMERE UN TASTO PER IL DISK VIEW '

vpg db ' '
db ' ATTENZIONE!!!! Usando LWFORMAT nessuna routine di alcun genere vi consentirÖ di'
db ' recuperare i dati presenti nel disco.QUESTI SARANNO CANCELLATI DEFINITIVAMENTE.'
db ' '



msg0 db ' '
db 'Programma creato da: '
db ' Michael Bakunin '

db 'Questo programma consente di formattare a basso livello un Floppy ed ä stato '
db 'progettato soprattutto per distruggere in modo sicuro e inequivocabile qualunque'
db 'tipo di virus allocato in qualunque settore. '
db 'Questo viene reso possibile grazie alle particolari routines che alla fine della'
db 'formattazione assicurano che tutto si sia svolto regolarmente. Infatti alcuni '
db 'virus simulano le funzioni a basso livello, ma di fatto non consentono la '
db 'scrittura nelle aree a loro riservate, e quindi restano residenti nel disco. '
db 'Alla fine della formattazione apparirÖ lo schermo del DISK VIEW secondo '
db 'uno stile semplice e gradevole. '
db 'Vedrete, se tutto si ä svolto regolarmente, che il carattere di fill up ä una '
db 'serie lunghissima di G (codice Hex 47), in tutte le tracce e in tutti i settori '
db 'tranne nel settore 0 (assoluto) dove vengono inseriti i dati personalizzati '
db 'del BPB (Bios Parameter Block). Si puï esplorare lo intero Disco, ma riteniamo '
db 'sufficiente uno sguardo al primo settore, (settore 0). '

db 'PRIMA DI UTILIZZARE DISCHETTI CONTENENTI PROGRAMMI, ASSICURATEVI CHE '
db 'QUESTI SIANO STATI SEMPRE PROTETTI IN SCRITTURA. FATE ATTENZIONE '
db 'A NON REINIETTARE VIRUS USANDO DISCHETTI INFETTI. PULITELI PRIMA CON LWFORMAT. '
db ' '

msg_A db ' STA PER ESSERE FORMATTATO IL DRIVE A: '
msg_B db ' STA PER ESSERE FORMATTATO IL DRIVE B: '


msg_frmt12M db '-B- HA UN FORMATO DI 1,2 MBytes PREMERE <ESC> PER NON FORMATTARE '
msg_sect12M db ' …ÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕª '
db ' IN CORSO LA FORMATTAZIONE DI B: 1,2 MB - ∫ TRACCIA ∫ SETTORE ∫ LATO ∫ '
db ' FORMATO STANDARD 512 BYTES PER SETTORE ∫ ∫ ∫ ∫ '
db ' 80 TRACCE, 15 SETTORI, 2 LATI »ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕº '

msg_frmt360K db '-B- HA UN FORMATO DI 360 KBytes PREMERE <ESC> PER NON FORMATTARE '
msg_sect360K db ' …ÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕª '
db ' IN CORSO LA FORMATTAZIONE DI B: 360 KB - ∫ TRACCIA ∫ SETTORE ∫ LATO ∫ '
db ' FORMATO STANDARD 512 BYTES PER SETTORE ∫ ∫ ∫ ∫ '
db ' 40 TRACCE, 9 SETTORI, 2 LATI »ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕº '

msg_frmt720K db '-B- HA UN FORMATO DI 720 KBytes PREMERE <ESC> PER NON FORMATTARE '
msg_sect720K db ' …ÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕª '
db ' IN CORSO LA FORMATTAZIONE DI B: 720 KB - ∫ TRACCIA ∫ SETTORE ∫ LATO ∫ '
db ' FORMATO STANDARD 512 BYTES PER SETTORE ∫ ∫ ∫ ∫ '
db ' 80 TRACCE, 9 SETTORI, 2 LATI »ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕº '

msg_frmt14M db '-B- HA UN FORMATO DI 1,44 MBytes PREMERE <ESC> PER NON FORMATTARE '
msg_sect14M db ' …ÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕª '
db 'IN CORSO LA FORMATTAZIONE DI B: 1,44 MB - ∫ TRACCIA ∫ SETTORE ∫ LATO ∫ '
db ' FORMATO STANDARD 512 BYTES PER SETTORE ∫ ∫ ∫ ∫ '
db ' 80 TRACCE, 18 SETTORI, 2 LATI »ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕº '

msg_frmt12MA db '-A- HA UN FORMATO DI 1,2 MBytes PREMERE <ESC> PER NON FORMATTARE '
msg_sect12MA db ' …ÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕª '
db ' IN CORSO LA FORMATTAZIONE DI A: 1,2 MB - ∫ TRACCIA ∫ SETTORE ∫ LATO ∫ '
db ' FORMATO STANDARD 512 BYTES PER SETTORE ∫ ∫ ∫ ∫ '
db ' 80 TRACCE, 15 SETTORI, 2 LATI »ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕº '

msg_frmt360KA db '-A- HA UN FORMATO DI 360 KBytes PREMERE <ESC> PER NON FORMATTARE '
msg_sect360KA db ' …ÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕª '
db ' IN CORSO LA FORMATTAZIONE DI A: 360 KB - ∫ TRACCIA ∫ SETTORE ∫ LATO ∫ '
db ' FORMATO STANDARD 512 BYTES PER SETTORE ∫ ∫ ∫ ∫ '
db ' 40 TRACCE, 9 SETTORI, 2 LATI »ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕº '

msg_frmt720KA db '-A- HA UN FORMATO DI 720 KBytes PREMERE <ESC> PER NON FORMATTARE '
msg_sect720KA db ' …ÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕª '
db ' IN CORSO LA FORMATTAZIONE DI A: 720 KB - ∫ TRACCIA ∫ SETTORE ∫ LATO ∫ '
db ' FORMATO STANDARD 512 BYTES PER SETTORE ∫ ∫ ∫ ∫ '
db ' 80 TRACCE, 9 SETTORI, 2 LATI »ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕº '

msg_frmt14MA db '-A- HA UN FORMATO DI 1,44 MBytes PREMERE <ESC> PER NON FORMATTARE '
msg_sect14MA db ' …ÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕÀÕÕÕÕÕÕÕÕÕÕª '
db 'IN CORSO LA FORMATTAZIONE DI A: 1,44 MB - ∫ TRACCIA ∫ SETTORE ∫ LATO ∫ '
db ' FORMATO STANDARD 512 BYTES PER SETTORE ∫ ∫ ∫ ∫ '
db ' 80 TRACCE, 18 SETTORI, 2 LATI »ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕ ÕÕÕÕÕÕÕÕÕÕº '

; OCCUPATI N. Bytes OFFSET
primo_settore db 0EBH, 03CH, 90H ; istruzione di salto 3 B 00
db 'LWFOR_AB' ; nome e versione 8 B 03
db 00, 02 ; 512 bytes per sett. 2 B 0B
db 01 ; 1 settore/un. all. 1 B 0D
db 01, 00 ; 1 settore riservato 2 B 0E
db 02 ; numero di Fat 1 B 10
db 0E0H, 00 ; numero voci root dir 2 B 11
db 40h, 0BH ; num.tot sett. 2880 2 B 13
db 0F0h ; ident. supp. magn.? 1 B 15
db 09, 00 ; num. sett. per fat 2 B 16
db 12h, 00 ; sett.per traccia 2 B 18
db 02, 00 ; num. testine 2 B 1A
db 00, 00 ; nem. sett. nascosti 2 B 1C
db ' NELLE PRIME DUE RIGHE ABBIAMO INSERITO IL Bios Parameter Block IN QUESTA AREA'
db ' RESTANTE IL SISTEMA OPERATIVO INSERIRA LA ROUTINE DEL LOADER FINO AI DUE ULTIMI'
db ' BYTE (MARKER DI SETTORE ZERO DI BOOT <AA 55>). ORA USARE FORMATGGGGGGGGGGGGGG'
db 240 dup (47h) ; routine del loader 480 B
db 55h, 0AAh ; marker sett. 0 2 B



msg_npres db ' ATTENZIONE!!!! IL DRIVE SELEZIONATO NON ESISTE NEL VOSTRO SISTEMA '




msg1 db ' '
db 'ATTENZIONE !!!!!!!!! '
db 'dopo una formattazione a basso livello TUTTI i dati contenuti nel disco saranno '
db 'PERDUTI in modo irrimediabile e sovrascritti con una serie interminabile di '
db '...GGGGGGGGGGGGGGGGGGGGG...... SIETE PROPRIO SICURI di voler distruggere tutti'
db 'i dati in esso contenuti??? '
db 'Digitare Y se si desidera formattare, o qualunque altro carattere per uscire. '


msg_qdr db ' PREMERE <ESC> o QUALUNQUE altro carattere per saltare la formattazione e '
db ' utilizzare il DISK PATCH. '
db ' Quale Disco fisico si desidera formattare? ( A - B ) '

msg_errore db 'ATTENZIONE!!! ERRORE DISCO. RIMUOVERE LA CAUSA E RIPROVARE; codice errore: '

dsk_vis0 db '…ÕÕÕÕÕÕÕ—ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ—ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ—ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕª'
db '∫ OFFS. ≥ 00 01 02 03 04 05 06 07 ≥ 08 09 0A 0B 0C 0D 0E 0F ≥ DUMP ∫'
db 'ÃÕÕÕÕÕÕÕÿÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÿÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÿÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕπ'
db '∫ 000 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 010 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 020 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 030 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 040 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 050 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 060 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 070 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 080 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 090 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 0A0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 0B0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 0C0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 0D0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 0E0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 0F0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '»ÕÕÕÕÕÕÕœÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕœÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕœÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕº'

dsk_vis1 db '…ÕÕÕÕÕÕÕ—ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ—ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ—ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕª'
db '∫ OFFS. ≥ 00 01 02 03 04 05 06 07 ≥ 08 09 0A 0B 0C 0D 0E 0F ≥ DUMP ∫'
db 'ÃÕÕÕÕÕÕÕÿÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÿÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÿÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕπ'
db '∫ 100 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 110 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 120 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 130 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 140 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 150 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 160 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 170 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 180 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 190 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 1A0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 1B0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 1C0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 1D0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 1E0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '∫ 1F0 ≥ 00 00 00 00 00 00 00 00 ≥ 00 00 00 00 00 00 00 00 ≥ ................ ∫'
db '»ÕÕÕÕÕÕÕœÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕœÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕœÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕº'











.code
.startup

call reset_B
mov traccia,0
mov lato,0
mov settore,1


piniz1:
call cls
lea bp,vpg
mov colore,10H
mov cx,320
call mess
call waitchar




call cls
lea bp,msg0
mov cx,1840
mov colore,20h
call mess
call waitchar
call q_dr
cmp al,'a'
je is_a
cmp al,'A'
je is_a
cmp al,'b'
je is_b
cmp al,'B'
je is_b


mov drv,0


; INSERIRE QUI ROUTINE PER LETTURA DI SETTORI E TIPO DRIVE


jmp disk_view
;===================================================
; DRIVE A
is_a:
mov drv,0
mov drvs,'A'
call cls




lea bp,msg_A
mov cx,80
mov colore,30h
call mess
lea bp,msg1
mov cx,560
mov dx,100h
mov colore,40h
call messd
call waitchar
cmp al,'Y'
je @F
jmp disk_view
;altrimenti continua
@@:


call int_11
mov ah,cod_err
cmp ah,0
je @F
jmp mess_npres




mov count,4
@@:
mov dl,drv
call reset_B
jnc @F
dec count
jnz @B
mov cod_err,ah
call errore
call waitchar
jmp fine

@@:
call acq_driv


mov ah,cod_err
cmp ah,0
je @F
call errore
call waitchar
jmp fine

@@:
mov bl,tipo_drv ;1=5,25-360k 2=5,25-1,2M
;3=3,5-720K 4=3,5-1,4M
cmp bl,2
jna @F
jmp prova4A

@@:

jmp fine
;------------------------

prova4A:
mov max_traccia,79
mov max_lato,1
mov max_settore,18

cmp bl,3
ja @F
mov max_settore,9

@@:

mov count,4
prova4AA:

nop ; drive A tipo 720 o 1440 KB
mov ah,02h ;determina il tipo di dischetto
mov dl,drv ;leggendo un settore >9 (se no errore 1,2M altrimenti 320k)
mov al,1 ;leggi 1 settore
mov dh,0 ;lato 0 (o 1)
mov cl,17 ;numero di settore >9 (1,2M=15 1,44M=18)
mov ch,69 ;numero di traccia da 0 a 79
lea bx,buff_provv ; in ES:BX il buffer per i settori da leggere

int 13h
mov cod_err,ah
;cmp ah,4 err_ settore non trovato ok,ä 720k
;je is_720KA
cmp ah,0
je is_14MA
dec count
jz @F
mov dl,drv
call reset_B
jmp prova4AA

@@:
cmp ah,4
je is_720KA
push ds
pop es
call errore

lea bp,msg_G
mov cx,80
mov dx,200h
mov colore,17h
call messd
call waitchar
mov al,ch_r
cmp al,'G'
je is_14MA
cmp al,'g'
je is_720KA
jmp fine
;----------------------------------

is_14MA:
call cls
lea bp,msg_frmt14MA
mov cx,80
mov colore,50h
call mess
mov al,ch_r
call waitchar
cmp al,1bh
jne @F
jmp fine

@@:
call cls
lea bp,msg_sect14MA
mov cx,320
call mess
jmp format14MA


jmp fine

;----------------------------

is_720KA:
call cls
prova4ABA:
mov count,4
prova4AABA:

nop ; drive A tipo 720
mov ah,02h ;determina il tipo di dischetto
mov dl,drv ;leggendo un settore >9 (se no errore 1,2M altrimenti 320k)
mov al,1 ;leggi 1 settore
mov dh,0 ;lato 0 (o 1)
mov cl,4 ;numero di settore >9 (1,2M=15 1,44M=18)
mov ch,5 ;numero di traccia da 0 a 79
lea bx,buff_provv ; in ES:BX il buffer per i settori da leggere

int 13h
mov cod_err,ah
cmp ah,0
je FUORI11
dec count
jz @F
mov dl,drv
call reset_B
jmp prova4AABA

@@: call errore
call waitchar
call reset_B
lea bp,msg_G
mov cx,80
mov dx,200h
mov colore,17h
call messd
call waitchar
mov al,ch_r
cmp al,'G'
je format14MA
cmp al,'g'
je FUORI11
jmp fine

FUORI11:

mov max_lato,1
mov max_traccia,79
mov max_settore,9
lea bx,msg_sect14MA
mov al,drvs
mov byte ptr [bx+109],al
mov ax,'27'
mov word ptr [bx+112],ax
mov ax,' 0'
mov word ptr [bx+114],ax
mov al,'K'
mov byte ptr [bx+117],al
mov ax,'90'
mov word ptr [bx+252],ax

jmp format14MA



;==================== OK FORMATTA 14MA ===============================
;==================== 1,44 Mb Drive A ================================
format14MA:


;------------------------------------
; CHIAMARE FUNZIONE 18H ??? SI, per acquisire il DD_PT

;prima preparare ddpt

lea si,DD_PT

push ES
mov count,4
@@:
mov ah,18H

mov dl,drv ; drive 0
mov ch,max_traccia ; 80 tracce
mov cl,max_settore ; 18 settori
mov dh,max_lato ; i lati ??
int 13h
jnc @F
mov cod_err,ah
call reset_B
dec count
jnz @B
pop es
jmp errore

@@:
mov cx,200h
@@:
mov al,byte ptr ES:[DI] ;

mov byte ptr DS:[si],al ;
inc di
inc si
dec cx
jnz @B
lea si,DD_PT

mov byte ptr DS:[si+8],47h ; fill char G

cli ; passiamo il ptr ES:DI nel vettore 1Eh
push ds
push si
mov ax,0 ; vettore 1Eh
mov es,ax

mov bx,word ptr es:[78h] ; 78h
mov of_rip,bx
mov bx,word ptr es:[7Ah] ; 7Ah
mov sg_rip,bx
pop ax
mov word ptr es:[78H],ax ;78h
pop ax
mov word ptr es:[7AH],ax ;7Ah

pop es
sti

;----------------------------------



;------- preparare il format attribute ------------
; ES:BX ptr to : 0 = numero di traccia da formattare
; 1 = lato del disketto (0 o 1)
; 2 = numero del settore (per interleaving calcolare)
; 3 = numero di byte in questo settore
; ( 0=128 , 1=256 , 2=512 (default per DOS), 3=1024)
; ripetere (0 - 3 ) = 4 x il numero di settori da formattare

; format attribute ES:BX
; il formato 1,44M ha 18 settori per traccia, percio il buffer
; sara di 18 x 4 = 72 bytes (ma bisogna riservarne 512) in fr_attrib

; routine per il sist_fr_attrib

mov traccia,0 ; da 0 a N-1 ( 0 - 79 )
mov lato,0 ; 0 - 1
mov settore,1 ; da 1 a M ( 1 - 18 )
mov num_byte,2 ; 2=512 byte per settore

lea bx,fr_attrib
call vis_trck
costruisci:

mov al,traccia
mov byte ptr es:[bx],al
inc bx
mov al,lato
mov byte ptr es:[bx],al
inc bx
mov al,settore
mov byte ptr es:[bx],al
inc bx
mov byte ptr es:[bx],2 ; 2=512 byte
inc bx
call vis_trck
inc settore
mov al,settore
cmp al,max_settore

ja @F
jmp costruisci

@@: lea bx,fr_attrib
mov count,4
@@:
call formatta_questa_traccia

;call reset_B
mov ah,cod_err
cmp ah,0
je @F
call reset_B
dec count
jnz @B
call errore
call waitchar
jmp fine



@@:
lea bx,fr_attrib
mov settore,1
inc lato
mov al,lato
cmp al,max_lato
jna @F
mov lato,0
inc traccia
mov al,traccia
cmp al,max_traccia
ja ppp1
@@:
jmp costruisci

ppp1:

nop

; OK ha finito di formattare
;ripristiniamo vett. int 1E
cli ; passiamo il ptr ES:DI nel vettore 1Eh

push es

mov ax,0 ; vettore 1Eh
mov es,ax

mov ax,of_rip
mov word ptr es:[78h],ax
mov ax,sg_rip
mov word ptr es:[7Ah],ax

pop es
sti
lea bp,fine_frmt
mov cx,80
mov dx,0600h
mov colore,70h
call messd
call waitchar



mov traccia,0
mov lato,0
call scrivi_pr_sett
mov ah,cod_err
cmp ah,0
je @F
jmp errore


@@:
call verifica
mov ah,cod_err
cmp ah,0
je @F
jmp errore

@@:
mov traccia,0
mov lato,0
mov settore,1

jmp disk_view
;----------------------------------
;routine

formatta_questa_traccia:

pusha
push es
push ds

mov ah,5
mov al,max_settore ;settori x traccia
mov dl,0 ;drive 0=A
mov dh,lato ; testina
mov ch,traccia ; cilindro
mov cl,0
int 13h
pop ds
pop es
mov cod_err,ah
popa

ret


verifica:
mov ah,4
mov al,18
mov dh,lato
mov ch,traccia
int 13h


ret
;===================================================
;-----------

; DRIVE B
is_b:
mov drv,1
call cls




lea bp,msg_B
mov cx,80
call mess
lea bp,msg1
mov cx,560
mov dx,100h
call messd
call waitchar
cmp al,'Y'
jne fine
;altrimenti continua

call int_11
mov ah,cod_err
cmp ah,0
je @F
jmp mess_npres




mov count,4
@@:
mov dl,drv
call reset_B
jnc @F
dec count
jnz @B
mov cod_err,ah
call errore
call waitchar
jmp fine

@@:
call acq_driv


mov ah,cod_err
cmp ah,0
je @F
call errore
call waitchar
jmp fine

@@:

mov bl,tipo_drv ;1=5,25-360k 2=5,25-1,2M
;3=3,5-720K 4=3,5-1,4M


cmp bl,2
jna @F

jmp prova4B

@@:
mov count,4
prova3B:
mov ah,02h ;determina il tipo di dischetto
mov dl,drv ;leggendo un settore >9 (se no errore 1,2M altrimenti 320k)
mov al,1 ;leggi 1 settore
mov dh,0 ;lato 0 (o 1)
mov cl,14 ;numero di settore >9 (1,2M=15 1,44M=18)
mov ch,39 ;numero di traccia da 0 a 39 o da 0 a 79
lea bx,buff_provv ; in ES:BX il buffer per i settori da leggere
int 13h
mov cod_err,ah
cmp ah,4 ; err_ settore non trovato ok,ä 360k
je is_360K
cmp ah,0
je is_12M
dec count
jz @F
mov dl,drv
call reset_B
jmp prova3B

@@:
push ds
pop es
call errore
call waitchar
jmp fine
;----------------------------------

is_12M:
call cls
lea bp,msg_frmt12M
mov cx,80
call mess
call waitchar
mov al,ch_r
cmp al,1bh
jne @F
jmp fine



@@:
call cls
lea bp,msg_sect12M
mov cx,320
call mess
call waitchar

jmp fine

;----------------------------

is_360K:
call cls
lea bp,msg_frmt360K
mov cx,80
call mess
call waitchar
mov al,ch_r
cmp al,1bh
jne @F
jmp fine

@@:
call cls
lea bp,msg_sect360K
mov cx,320
call mess
call waitchar






jmp fine

prova4B:
nop ; drive B tipo 720 o 1440 KB
mov ah,02h ;determina il tipo di dischetto
mov dl,1 ;leggendo un settore >9 (se no errore 1,2M altrimenti 320k)
mov al,1 ;leggi 1 settore
mov dh,0 ;lato 0 (o 1)
mov cl,14 ;numero di settore >9 (1,2M=15 1,44M=18)
mov ch,69 ;numero di traccia da 0 a 79
lea bx,buff_provv ; in ES:BX il buffer per i settori da leggere
int 13h
mov cod_err,ah
cmp ah,4 ; err_ settore non trovato ok,ä 360k
je is_720K
cmp ah,0
je is_14M
dec count
jz @F
mov dl,0
call reset_B
jmp prova4B

@@:
push ds
pop es
call errore
call waitchar
jmp fine

;----------------------------------

is_14M:
call cls
lea bp,msg_frmt14M
mov cx,80
call mess
call waitchar
mov al,ch_r
cmp al,1bh
jne @F
jmp fine

@@:
call cls
lea bp,msg_sect14M
mov cx,320
call mess
call waitchar

jmp fine


;----------------------------

is_720K:
call cls
lea bp,msg_frmt720K
mov cx,80
call mess
call waitchar
mov al,ch_r
cmp al,1bh
jne @F
jmp fine

@@:
call cls
lea bp,msg_sect720K
mov cx,320
call mess
call waitchar






jmp fine






;=====================================================






;------------------------------
;Subroutines chiamate con CALL
;===================================================

mess:
mov dx,0 ; in posizione 0,0
;--------------------------
messd: ; in posizione definita da DL - DH
mov ah,19
mov al,1
mov bh,0 ; pagina 0
mov bl,colore
int 10h

ret
;--------------------------------------

waitchar:
mov ah,7
int 21h
mov ch_r,al
ret
;--------------------------------------

cls:
mov ah,0
mov al,3
int 10h
ret
;-------------------------------------

viscar:
pusha
mov ah,2
mov dl,al
int 21h
popa
ret
;-------------------------------------

q_dr: lea bp,msg_qdr ;quale drive
mov cx,221

call cls
call mess
mov ah,7
int 21h
ret
;---------------------------------------

errore:
call cls
lea bp,msg_errore
mov dl,cod_err
shr dl,4

add dl,30h
cmp dl,39h
jna @F
add dl,7
@@:

mov byte ptr[bp+77],dl
mov dl,cod_err
and dl,0fh
add dl,30h
cmp dl,39h
jna @F
add dl,7
@@:
mov byte ptr[bp+78],dl
mov dx,00h
mov cx,80
mov colore,60H
lea bp,msg_errore
call mess

mov dx,100h
mov cx,80
mov al,cod_err
cmp al,1
jne @F
lea bp,msg_err01
jmp fin_err
@@: cmp al,2
jne @F
lea bp,msg_err02
jmp fin_err
@@: cmp al,3
jne @F
lea bp,msg_err03
jmp fin_err
@@: cmp al,4
jne @F
lea bp,msg_err04
jmp fin_err
@@: cmp al,5
jne @F
lea bp,msg_err05
jmp fin_err
@@: cmp al,6
jne @F
lea bp,msg_err06
jmp fin_err
@@: cmp al,7
jne @F
lea bp,msg_err07
jmp fin_err
@@: cmp al,8
jne @F
lea bp,msg_err08
jmp fin_err
@@: cmp al,9
jne @F
lea bp,msg_err09
jmp fin_err
@@: cmp al,0AH
jne @F
lea bp,msg_err0A
jmp fin_err
@@: cmp al,10H
jne @F
lea bp,msg_err010
jmp fin_err
@@: cmp al,11H
jne @F
lea bp,msg_err011
jmp fin_err
@@: cmp al,20H
jne @F
lea bp,msg_err020
jmp fin_err
@@: cmp al,40H
jne @F
lea bp,msg_err040
jmp fin_err
@@: cmp al,80H
jne @F
lea bp,msg_err080
jmp fin_err
@@: cmp al,0AAH
jne @F
lea bp,msg_err0AA
jmp fin_err
@@: cmp al,0CCH
jne @F
lea bp,msg_err0CC
jmp fin_err
@@: cmp al,0EEH
jne @F
lea bp,msg_err0E0
jmp fin_err
@@: lea bp,msg_err0BB


fin_err: call messd

ret
;--------------------------------------------

disk_present:
mov ah,02h ;determina se il disco ä presente
mov dl,1 ;leggendo un settore <9 (per qualunque tipo di disco)
mov al,1 ;leggi 1 settore
mov dh,0 ;lato 0 (o 1)
mov cl,7 ;numero di settore <9
mov ch,60 ;numero di traccia da 0 a 79
lea bx,buff_provv ; in ES:BX il buffer per i settori da leggere
int 13h
mov cod_err,ah
cmp ah,0
je @F

@@:
ret ;tutto ok
;----------------------------------------------

int_11:
mov cod_err,0
int 11h ; vediamo se ä installato B:
and ax,0c0h
cmp al,40h ; 0=1 drive 1=2 drive
je @F
cmp drvs,'A'
je @F

mov cod_err,1

@@: ret
;------------------------------
vis_trck:
pusha
push es
push ds
lea bp,msg_sect14MA
mov cx,320
mov dl,traccia
shr dl,4
add dl,30h
cmp dl,39h
jna @F
add dl,7

@@:
mov byte ptr[bp+206],dl
mov dl,traccia
and dl,0fh
add dl,30h
cmp dl,39h
jna @F
add dl,7
@@:
mov byte ptr[bp+207],dl


mov dl,settore
shr dl,4
add dl,30h
cmp dl,39h
jna @F
add dl,7

@@:
mov byte ptr[bp+218],dl
mov dl,settore
and dl,0fh
add dl,30h
cmp dl,39h
jna @F
add dl,7
@@:
mov byte ptr[bp+219],dl

mov dl,lato
and dl,0fh
add dl,30h
mov byte ptr[bp+230],dl

lea bp,msg_sect14MA


mov dx,0

mov ah,19
mov al,1
mov bh,0 ; pagina 0
mov bl,60H
int 10h
pop ds
pop es

popa


ret
;--------------------------------

reset_B:
pusha
push ds
push es
mov count1,3
@@:
mov ah,0
mov dl,drv
int 13h ;reset

mov ah,1
mov dl,drv
int 13h ;read status
cmp ah,0
je @F
dec count1
jnz @B
@@:
pop es
pop ds
mov cod_err,ah
popa
ret
;--------------------------------

acq_driv:
push es
mov ah,8h
mov dl,drv
int 13h ;acquisire i parametri del drive
mov cod_err,ah

mov tipo_drv,bl ;1=5,25-360k 2=5,25-1,2M
;3=3,5-720K 4=3,5-1,4M
mov max_settore,cl ;massimo numero di settori
mov max_traccia,ch ;massimo numero di tracce
mov max_lato,dh ;massimo numero di lati (sempre 1??)
mov s_puntat_ddpt,ES
mov o_puntat_ddpt,DI ; in ES:DI la DD_PT
pop es

ret
;----------------------------------
scrivi_pr_sett:

pusha

mov count,4
@@:
mov ah,3
mov al,1 ; quanti settori
mov dl,drv ; drive
mov dh,0 ; lato
mov cl,1 ; sett. 1 n
mov ch,0 ;traccia
lea bx,primo_settore
cmp max_settore,18
je babc
mov al,2
mov byte ptr [bp+0dh],al
mov al,70H
mov byte ptr [bx+11h],al ; voci root dir

mov ax,1440 ; n. totale settori
mov word ptr [bx+13h],ax
mov al,0F9H ; identificativ0 disco 720K
mov byte ptr [bx+15h],al
mov al,3
mov byte ptr [bx+16h],al ; settori per fat
mov al,9
mov byte ptr [bx+18h],al ; settori per traccia

;========= cmp max_settore con i formati diversi
;===================================================
;===================================================
babc:
mov ah,3
mov al,1 ; quanti settori

int 13h
mov cod_err,ah
jnc @F
call reset_B
dec count
jnz @B
call errore
call waitchar
popa
pop ax
jmp fine
jmp @B
@@:
popa
ret

;------------------------------------
mess_npres:

lea bp,msg_npres
mov cx,80
call mess
call waitchar
jmp fine
;-------------------------------------
;============================DISK VIEW========================

disk_view:


call cls

lea bp,dsk_vis0
mov quale_vis,bp

xor primo_half,1
cmp primo_half,0
je @F
lea bp,dsk_vis1
mov quale_vis,bp
jmp ko_pr_ha
@@:
call vis_trck1

mov count,4
@@:
mov ah,2
mov al,1 ; quanti settori
mov dl,drv ; drive
mov dh,lato ; lato
mov cl,settore ; sett. 1 n
mov ch,traccia ;traccia 0 n-1
lea bx,buff_provv
int 13h
mov cod_err,ah
cmp ah,0
je @F
call reset_B
dec count
jnz @B
call errore
call waitchar
jmp fine

ko_pr_ha:

@@: mov cnt,512
mov cnt1,16

lea bx,buff_provv
mov bp,quale_vis
add bp,302
cmp primo_half,0
jne @F

CALL METTI_DIRETT
@@:
mov cnt,512
mov cnt1,16
lea bx,buff_provv
mov bp,quale_vis
add bp,250
cmp primo_half,0
je @F
call METTI_metti
jmp bab
@@:
CALL METTI_HEX
bab:
lea bp,msg_dskw0



mov dx,0100h
mov colore,20h
mov cx,80
call messd
lea bp,msg_udp
mov cx,79
mov dx,1700h
mov colore,70h
call messd






mov PG_UP,0
mov PG_DOWN,0

@@:
call w_ch
cmp PG_UP,1
JE PG_UP1
cmp PG_DOWN,1
je PG_DOWN1
cmp al,1bh
jne @B
jmp fine

PG_DOWN1:

call DOPO_PG_DOWN
jmp disk_view


PG_UP1:
call DOPO_PG_UP
jmp disk_view






jmp fine
;--------------ROUTINES----------
vis_trck1:
pusha
push es
push ds
mov dx,0
mov ah,0 ; calcoliamo settore_assoluto
mov al,traccia
mov ch,0
mov cl,max_lato
add cl,1
mul cx ; traccia * max_lato in ax
mov ch,0
mov cl,max_settore
mul cx
cmp lato,0
je @F
mov bx,ax
mov ah,0
mov al,lato
mov ch,0
mov cl,max_settore
mul cx
add ax,bx

@@:
mov ch,0
mov cl,settore
add ax,cx
sub ax,1


lea bp,msg_dskw0
mov cx,80
mov dl,ah
shr dl,4
add dl,30h
cmp dl,39h
jna @F
add dl,7

@@:
mov byte ptr[bp+19],dl
mov dl,ah
and dl,0fh
add dl,30h
cmp dl,39h
jna @F
add dl,7
@@:
mov byte ptr[bp+20],dl

mov dl,al
shr dl,4
add dl,30h
cmp dl,39h
jna @F
add dl,7

@@:
mov byte ptr[bp+21],dl
mov dl,al
and dl,0fh
add dl,30h
cmp dl,39h
jna @F
add dl,7
@@:
mov byte ptr[bp+22],dl

;----------

mov dl,traccia
shr dl,4
add dl,30h
cmp dl,39h
jna @F
add dl,7

@@:
mov byte ptr[bp+38],dl
mov dl,traccia
and dl,0fh
add dl,30h
cmp dl,39h
jna @F
add dl,7
@@:
mov byte ptr[bp+39],dl


mov dl,settore
shr dl,4
add dl,30h
cmp dl,39h
jna @F
add dl,7

@@:
mov byte ptr[bp+58],dl
mov dl,settore
and dl,0fh
add dl,30h
cmp dl,39h
jna @F
add dl,7
@@:
mov byte ptr[bp+59],dl

mov dl,lato
and dl,0fh
add dl,30h
mov byte ptr[bp+75],dl

lea bp,msg_sect14MA


mov dx,0

mov ah,19
mov al,1
mov bh,0 ; pagina 0
mov bl,60H
int 10h
pop ds
pop es

popa


ret
;--------------------------------








METTI_DIRETT:
mov al,byte ptr es:[bx]
cmp al,20h
jnb @F
mov al,'_'
@@:
mov byte ptr es:[bp],al
inc bx
inc bp
dec cnt1
cmp cnt1,0
jnz @F
mov cnt1,16
add bp,64
@@:
dec cnt
cmp cnt,256
jne @F
add bp,320
@@:
cmp cnt,0
jne METTI_DIRETT

ret
;------------------------
METTI_HEX:

mov al,byte ptr es:[bx]
call trasf_hex ; in AH+AL il cod. ascii dei numeri
mov byte ptr es:[bp],ah
inc bp
mov byte ptr es:[bp],al
inc bp

inc bx
inc bp
dec cnt1
cmp cnt1,8
jne @F
add bp,2
@@:
cmp cnt1,0
jnz @F
mov cnt1,16
add bp,30
@@:
dec cnt
cmp cnt,256
jne @F
add bp,320
@@:
cmp cnt,0
jne METTI_HEX

METTI_metti:
call cls
mov bp,quale_vis
mov colore,70h
mov dx,0200h
mov cx,1600
call messd

ret
;--------------------------
trasf_hex:
mov ah,0
push dx
push ax
and al,0F0H
shr al,4
add al,30H
cmp al,39H
jna @F
add al,7
@@: mov ah,al
pop dx
mov al,dl
and al,0Fh
add al,30h
cmp al,39H
jna @F
add al,7
@@: pop dx

ret
;-------------------------------
DOPO_PG_DOWN:
cmp primo_half,0
je FINE_PG_DOWN
inc settore
mov al,settore
cmp al,max_settore
jna FINE_PG_DOWN
mov settore,1
inc lato
mov al,lato
cmp al,max_lato
jna FINE_PG_DOWN
mov lato,0
inc traccia
mov al,traccia
cmp al,max_traccia
jna FINE_PG_DOWN
mov traccia,0

FINE_PG_DOWN:
ret
;------------------
DOPO_PG_UP:
cmp primo_half,0
jne FINE_PG_UP
dec settore
mov al,settore
cmp al,0h
jne FINE_PG_UP
mov al,max_settore
mov settore,al
dec lato
mov al,lato
cmp al,0ffh
jne FINE_PG_UP
mov al,max_lato
mov lato,al
dec traccia
mov al,traccia
cmp al,0ffh
jne FINE_PG_UP
mov al,max_traccia
xor primo_half,1
mov traccia,al

FINE_PG_UP:
ret
;---------------------------------------
w_ch:
mov al,0
mov ah,0
int 16h
cmp al,0
je is_esteso
ret
is_esteso:
cmp ah,73
je is_up
cmp ah,81
je is_dn
ret
is_up:
mov PG_UP,1
ret
is_dn:
mov PG_DOWN,1
ret
;--------------------------------------------

fine:
call cls

.exit
end

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT