AnonimoVeneziano
03-02-2005, 21:07
Ciao,
In altra discussione su questo forum ( quello sulle scritte con gli asterischi ) ho letto che tramite una chiamata al BIOS video si può ricavare con apparente semplicità la tabella dei patterns dei pixel dei vari caratteri .
Ovviamente mi è venuta voglia di farlo pure io! Volevo anch'io estrarre sta benedetta tabella e metterla in un file , così ho risvegliato dal letargo il mio bel AMD 80286 16Mhz 1,5 MB di ram e mi sono messo a smanettare con NASM.
La tabella che volevo estrarre era esattamente quella presente nella discussione che ho letto(per vedere se ci ero riuscito), ossia quella dei caratteri 8x8 (doppio punto mi sembra) .
Ecco il programma originale .
[BITS 16]
SEGMENT code
..start:
MOV AX, data
MOV DS, AX
MOV AX, stack
MOV SS, AX
MOV AH, 3CH
XOR CX, CX
MOV DX, filename
INT 21H
PUSH AX
MOV AX, 1130H
MOV BH, 3
INT 10H
POP BX
MOV AH, 40H
MOV CX, 2048
MOV DX, ES
MOV DS, DX
MOV DX, BP
INT 21H
MOV AH, 3EH
INT 21H
MOV AX, 4C00H
INT 21H
SEGMENT data
filename db "char.vga", 0
SEGMENT stack stack
resb 512
stacktop:
Quello che fa sto prog è semplicemente creare un file "char.vga" e metterci dentro i dati puntati da ES:BP , che è ossia il valore di ritorno dell' interrupt INT 10h AX=1130h BH=03h .
Per il numero di byte da leggere ho contato numero di byte per encodare ogni carattere (16 , che è il valore di ritorno in CX di INT 10h) * numero dei caratteri ASCII (128) = 2048
Inutile dire che non funzionava.
Nel file "char.vga" mi ritrovavo valori diversi da quelli che mi dovevo aspettare, e sembrava quasi che invece di leggere l'area di memoria che gli avevo assegnato leggesse qualcos'altro (che a prima vista, controllando il contenuto del file, mi sembrava il buffer della memoria video, o qualcosa del genere).
Ero molto irritato e ho tentato di tutto, fino a che , preso dalla disperazione , non ho detto : "Vabbè, a sto punto proviamo a copiare tutto in una stringa e poi scrivere sul file invece di scrivere direttamente dall' indirizzo impostato dalla chiamata a INT 10h"
E così ho buttato giù quest'altra versione :
[BITS 16]
SEGMENT code
..start:
MOV AX, data
MOV DS, AX
MOV AX, stack
MOV SS, AX
MOV AH, 3CH
XOR CX, CX
MOV DX, filename
INT 21H
PUSH AX
MOV AX, 1130H
MOV BH, 3
INT 10H
MOV DI, ES
MOV DS, DI
MOV DI, data
MOV ES, DI
MOV DI, table
MOV SI, BP
MOV CX, 2048
REP MOVSB
POP BX
MOV AH, 40H
MOV CX, 2048
MOV DI, DS
MOV ES, DI
MOV DI, data
MOV DS, DI
MOV DX, table
INT 21H
MOV AH, 3EH
INT 21H
MOV AX, 4C00H
INT 21H
SEGMENT data
filename db "char.vga", 0
table resb 2048
SEGMENT stack stack
resb 512
stacktop:
Come vedete copio in una stringa TABLE con REP MOVSB i dati e poi li scrivo sul file da lì
Questo funziona correttamente, infatti sono riuscito ad estrarre sta benedetta tabella in questo modo anche se faccio un po' troppi Switch tra segmenti per i miei gusti.
La mia domanda è :
"Perchè non sono stato in grado di fare tutto direttamente? Il DOS ha qualche limitazione che non può agire con le Syscalls su certe aree di memoria ? (mi sembra che l'area di memoria in questione sia FFFF:BEB2 se non sbaglio , ossia i valori assegnati rispettivamente a ES e BP dopo la chiamata a INT 10h)"
Grazie mille
Ciao
In altra discussione su questo forum ( quello sulle scritte con gli asterischi ) ho letto che tramite una chiamata al BIOS video si può ricavare con apparente semplicità la tabella dei patterns dei pixel dei vari caratteri .
Ovviamente mi è venuta voglia di farlo pure io! Volevo anch'io estrarre sta benedetta tabella e metterla in un file , così ho risvegliato dal letargo il mio bel AMD 80286 16Mhz 1,5 MB di ram e mi sono messo a smanettare con NASM.
La tabella che volevo estrarre era esattamente quella presente nella discussione che ho letto(per vedere se ci ero riuscito), ossia quella dei caratteri 8x8 (doppio punto mi sembra) .
Ecco il programma originale .
[BITS 16]
SEGMENT code
..start:
MOV AX, data
MOV DS, AX
MOV AX, stack
MOV SS, AX
MOV AH, 3CH
XOR CX, CX
MOV DX, filename
INT 21H
PUSH AX
MOV AX, 1130H
MOV BH, 3
INT 10H
POP BX
MOV AH, 40H
MOV CX, 2048
MOV DX, ES
MOV DS, DX
MOV DX, BP
INT 21H
MOV AH, 3EH
INT 21H
MOV AX, 4C00H
INT 21H
SEGMENT data
filename db "char.vga", 0
SEGMENT stack stack
resb 512
stacktop:
Quello che fa sto prog è semplicemente creare un file "char.vga" e metterci dentro i dati puntati da ES:BP , che è ossia il valore di ritorno dell' interrupt INT 10h AX=1130h BH=03h .
Per il numero di byte da leggere ho contato numero di byte per encodare ogni carattere (16 , che è il valore di ritorno in CX di INT 10h) * numero dei caratteri ASCII (128) = 2048
Inutile dire che non funzionava.
Nel file "char.vga" mi ritrovavo valori diversi da quelli che mi dovevo aspettare, e sembrava quasi che invece di leggere l'area di memoria che gli avevo assegnato leggesse qualcos'altro (che a prima vista, controllando il contenuto del file, mi sembrava il buffer della memoria video, o qualcosa del genere).
Ero molto irritato e ho tentato di tutto, fino a che , preso dalla disperazione , non ho detto : "Vabbè, a sto punto proviamo a copiare tutto in una stringa e poi scrivere sul file invece di scrivere direttamente dall' indirizzo impostato dalla chiamata a INT 10h"
E così ho buttato giù quest'altra versione :
[BITS 16]
SEGMENT code
..start:
MOV AX, data
MOV DS, AX
MOV AX, stack
MOV SS, AX
MOV AH, 3CH
XOR CX, CX
MOV DX, filename
INT 21H
PUSH AX
MOV AX, 1130H
MOV BH, 3
INT 10H
MOV DI, ES
MOV DS, DI
MOV DI, data
MOV ES, DI
MOV DI, table
MOV SI, BP
MOV CX, 2048
REP MOVSB
POP BX
MOV AH, 40H
MOV CX, 2048
MOV DI, DS
MOV ES, DI
MOV DI, data
MOV DS, DI
MOV DX, table
INT 21H
MOV AH, 3EH
INT 21H
MOV AX, 4C00H
INT 21H
SEGMENT data
filename db "char.vga", 0
table resb 2048
SEGMENT stack stack
resb 512
stacktop:
Come vedete copio in una stringa TABLE con REP MOVSB i dati e poi li scrivo sul file da lì
Questo funziona correttamente, infatti sono riuscito ad estrarre sta benedetta tabella in questo modo anche se faccio un po' troppi Switch tra segmenti per i miei gusti.
La mia domanda è :
"Perchè non sono stato in grado di fare tutto direttamente? Il DOS ha qualche limitazione che non può agire con le Syscalls su certe aree di memoria ? (mi sembra che l'area di memoria in questione sia FFFF:BEB2 se non sbaglio , ossia i valori assegnati rispettivamente a ES e BP dopo la chiamata a INT 10h)"
Grazie mille
Ciao