[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

VGA output on macppc



	許です。

	G4 Tiでpresentaitonをしようと思っていろいろ試したんですが、以下の
	ような問題に悩んでいます。

	1) G4 Tiで
	   - 640x480
	   - 800x600
	   - 1024x768
	   それぞれのモード用の modeline 設定
	2) それぞれのモードに「Xを終了する事無しに」切替える方法
	   (まぁ、これは一度終了させても良いけど)
	3) それをVGA outに出力させる方法
	   一応、添付してみました。が、動くかどうかを試すには、1)をclearし
	   なければならないので試せていません。

	どなたか、解決できている方いらっしゃいませんか?

ほ
/*
*  Copyright (C) 1996 Paul Mackerras (paulus@linuxcare.com.au)
*
*  This program is free software; you can redistribute it and/or
*  modify it under the terms of the GNU General Public License
*  as published by the Free Software Foundation; either version
*  2 of the License, or (at your option) any later version.
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/mman.h>

static inline void eieio()
{
   asm volatile("eieio" : :);
}

unsigned long regs;

static inline unsigned int ld(int regno)
{
    unsigned int x;

    asm volatile ("lwbrx %0,0,%1; eieio" : "=r" (x) : "r" (regs + regno));
    return x;
}

static inline void st(int regno, unsigned int x)
{
    asm volatile ("stwbrx %0,0,%1; eieio" : : "r" (x), "r" (regs + regno));
}

main(int ac, char **av)
{
    int fd, on;
    int a, x;

    if ((fd = open("/dev/ttyE0", O_RDWR)) < 0) {
	perror("/dev/ttyE0");
 	exit(1);
    }
    regs = (unsigned long)
	mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0xa0000000);
    if (regs == -1) {
	perror("mmap");
	exit(1);
    }
    on = (ac > 1)? atoi(av[1]): 1;

    st(0x300, ld(0x200));
    st(0x304, ld(0x204));
    st(0x308, ld(0x208));
    st(0x30c, ld(0x20c));
    st(0x324, ld(0x224));
    st(0x32c, ld(0x22c));

    st(0x3f8, on? ((ld(0x50) & 0x700) | 0x2210000): 0x4000000);

    st(0x3e0, ld(0x2e0));
    st(0x3e4, ld(0x2e4));

    x = ld(0x8) & ~0xff;
    st(0x8, x | 2);
    a = ld(0x9);
    st(0x8, x | 0xaa);
    st(0x9, a & ~0x20000);

    st(0x8, x | 3);
    a = ld(0x9);
    st(0x8, x | 0xab);
    st(0x9, a);

    st(0x8, x | 4);
    a = ld(0x9);
    st(0x8, 0xac);
    st(0x9, a);

    st(0x58, (ld(0x58) & ~0x10));

    st(0x54, on? (ld(0x54) | 0x8000): (ld(0x54) & ~0x8000));

    exit(0);
}