• [^] # Re: Nostalgie, nostalgie

    Posté par . 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.

     ...
     ; 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