J'ai traduit jusque ce qu'il faut du programme C passe en lien par totof2000 en assembleur (https://files.osdev.org/mirrors/geezer/osd/graphics/modes.c) pour passer en mode 13h sans utiliser le BIOS. Seule la fonction write_regs() etait necessaire, ainsi que le tableau g_320x200x256. La palette me semble rudimentaire mais facilement reprogrammable.
Malheureusement mon XT n'a qu'une carte CGA donc j'ai teste ca avec dosemu.
...
; passe en mode 13h
mov si,g_320x200x256
call write_regs
; ES = segment de base de la memoire video
mov ax,0a000h
mov es,ax
; efface l'ecran
xor di,di
xor ax,ax
mov cx,320*200/2
cld
rep stosw
; pixel en 160,100
mov byte [es:100*320+160],1
...
VGA_AC_INDEX equ 3c0h
VGA_AC_WRITE equ 3c0h
VGA_AC_READ equ 3c1h
VGA_MISC_WRITE equ 3c2h
VGA_SEQ_INDEX equ 3c4h
VGA_SEQ_DATA equ 3c5h
VGA_CRTC_INDEX equ 3d4h
VGA_CRTC_DATA equ 3d5h
VGA_GC_INDEX equ 3ceh
VGA_GC_DATA equ 3cfh
VGA_INSTAT_READ equ 3dah
VGA_NUM_SEQ_REGS equ 5
VGA_NUM_CRTC_REGS equ 25
VGA_NUM_GC_REGS equ 9
VGA_NUM_AC_REGS equ 21
g_320x200x256:
; MISC
db 63h
; SEQ
db 03h, 01h, 0Fh, 00h, 0Eh
; CRTC
db 5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
db 00h, 41h, 00h, 00h, 00h, 00h, 00h, 00h
db 9Ch, 0Eh, 8Fh, 28h, 40h, 96h, 0B9h, 0A3h
db 0FFh
; GC
db 00h, 00h, 00h, 00h, 00h, 40h, 05h, 0Fh
db 0FFh
; AC
db 00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
db 08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh
db 41h, 00h, 0Fh, 00h, 00
;void write_regs(unsigned char *regs)
;{
; unsigned i;
;
; Entree : DS:SI = tableau g_xxx
write_regs:
cld
;/* write MISCELLANEOUS reg */
; outportb(VGA_MISC_WRITE, *regs);
; regs++;
mov dx,VGA_MISC_WRITE
lodsb
out dx,al
;/* write SEQUENCER regs */
; for(i = 0; i < VGA_NUM_SEQ_REGS; i++)
; {
; outportb(VGA_SEQ_INDEX, i);
; outportb(VGA_SEQ_DATA, *regs);
; regs++;
; }
xor cl,cl
.l1:
mov dx,VGA_SEQ_INDEX
mov al,cl
out dx,al
mov dx,VGA_SEQ_DATA
lodsb
out dx,al
inc cl
cmp cl,VGA_NUM_SEQ_REGS
jnz .l1
;/* unlock CRTC registers */
; outportb(VGA_CRTC_INDEX, 0x03);
; outportb(VGA_CRTC_DATA, inportb(VGA_CRTC_DATA) | 0x80);
; outportb(VGA_CRTC_INDEX, 0x11);
; outportb(VGA_CRTC_DATA, inportb(VGA_CRTC_DATA) & ~0x80);
mov dx,VGA_CRTC_INDEX
mov al,3
out dx,al
mov dx,VGA_CRTC_DATA
in al,dx
or al,80h
out dx,al
mov dx,VGA_CRTC_INDEX
mov al,11h
out dx,al
mov dx,VGA_CRTC_DATA
in al,dx
and al,7fh
out dx,al
;/* make sure they remain unlocked */
; regs[0x03] |= 0x80;
; regs[0x11] &= ~0x80;
or byte [si+3],80h
and byte [si+11h],7fh
;/* write CRTC regs */
; for(i = 0; i < VGA_NUM_CRTC_REGS; i++)
; {
; outportb(VGA_CRTC_INDEX, i);
; outportb(VGA_CRTC_DATA, *regs);
; regs++;
; }
xor cl,cl
.l2:
mov dx,VGA_CRTC_INDEX
mov al,cl
out dx,al
mov dx,VGA_CRTC_DATA
lodsb
out dx,al
inc cl
cmp cl,VGA_NUM_CRTC_REGS
jnz .l2
;/* write GRAPHICS CONTROLLER regs */
; for(i = 0; i < VGA_NUM_GC_REGS; i++)
; {
; outportb(VGA_GC_INDEX, i);
; outportb(VGA_GC_DATA, *regs);
; regs++;
; }
xor cl,cl
.l3:
mov dx,VGA_GC_INDEX
mov al,cl
out dx,al
mov dx,VGA_GC_DATA
lodsb
out dx,al
inc cl
cmp cl,VGA_NUM_GC_REGS
jnz .l3
;/* write ATTRIBUTE CONTROLLER regs */
; for(i = 0; i < VGA_NUM_AC_REGS; i++)
; {
; (void)inportb(VGA_INSTAT_READ);
; outportb(VGA_AC_INDEX, i);
; outportb(VGA_AC_WRITE, *regs);
; regs++;
; }
xor cl,cl
.l4:
mov dx,VGA_INSTAT_READ
in al,dx
mov dx,VGA_AC_INDEX
mov al,cl
out dx,al
mov dx,VGA_AC_WRITE
lodsb
out dx,al
inc cl
cmp cl,VGA_NUM_AC_REGS
jnz .l4
;/* lock 16-color palette and unblank display */
; (void)inportb(VGA_INSTAT_READ);
; outportb(VGA_AC_INDEX, 0x20);
mov dx,VGA_INSTAT_READ
in al,dx
mov dx,VGA_AC_INDEX
mov al,20h
out dx,al
ret
[^] # Re: Nostalgie, nostalgie
Posté par popcorn . En réponse au message impossible d'afficher des pixels via le mode reel. Évalué à 3.
J'ai traduit jusque ce qu'il faut du programme C passe en lien par totof2000 en assembleur (https://files.osdev.org/mirrors/geezer/osd/graphics/modes.c) pour passer en mode 13h sans utiliser le BIOS. Seule la fonction write_regs() etait necessaire, ainsi que le tableau g_320x200x256. La palette me semble rudimentaire mais facilement reprogrammable.
Malheureusement mon XT n'a qu'une carte CGA donc j'ai teste ca avec dosemu.