上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top
ようやくキャラクタ単位での色制御ができるようになってきました。

写真は取り合えず出してみたテスト画面です。


まだまだ途中ですが、苦労したインラインアセンブラバージョンですのでソースをあげておきます。
アセンブラ部は完成してみればたったの20行ちょっとですが、えらく手こずってしまいました。

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">





変数の引き渡し部(ソース内でgOFFSETを渡している所)をマクロで組んでいたらなぜか分かりませんが
値がアセンブラに渡らず、そこで一番手間取ってしまいました。その前にあるgFCは普通に渡せたのですが。。。
マクロをやめてメイン内に普通に書いてみたら直りましたが、マクロの組み方に問題が有ったのか?


/*
* File: main.c
*
* ichigojam color adopter assembler version
* Created on 2015/07/06
*/

#include
#include
#include
#include

#pragma config PMDL1WAY = OFF
#pragma config IOL1WAY = OFF
#pragma config FUSBIDIO = OFF
#pragma config FVBUSONIO = OFF
#pragma config FPLLIDIV = DIV_1
#pragma config FPLLMUL = MUL_15
#pragma config FPLLODIV = DIV_1
#pragma config FNOSC = FRCPLL
#pragma config FSOSCEN = OFF
#pragma config POSCMOD = XT
#pragma config OSCIOFNC = OFF
#pragma config FPBDIV = DIV_1
#pragma config FCKSM = CSDCMD
#pragma config WDTPS = PS1
#pragma config WINDIS = OFF
#pragma config FWDTEN = OFF
#pragma config FWDTWINSZ = WINSZ_50
#pragma config DEBUG = OFF
#pragma config JTAGEN = OFF
#pragma config ICESEL = RESERVED
#pragma config PWP = OFF
#pragma config BWP = OFF
#pragma config CP = OFF

void proc_line(void);
void uart_putc (unsigned char);
unsigned int uart_getc(void);
void uart_puttext(unsigned char *);
void uart_putnum (unsigned int n);
void uart_puthex (unsigned int n);

int gOFFSET;
int gFC[32*2*25*2];
int gBC[32*2*25*2];
int lines = 0;

#define proc_bit { \
asm volatile("lw $t6,0($t2)");\
asm volatile("andi $t6,$t6,2");\
asm volatile("sra $t6,$t6,1");\
asm volatile("mul $t6,$t6,$t7");\
asm volatile("ori $t6,8");\
asm volatile("sw $t6,0($t3)");\
asm volatile("nop");\
asm volatile("nop");\
asm volatile("nop");\
}
#define proc_char0 {\
asm volatile("lw $t7,0($t0)");\
proc_bit;asm volatile("nop");\
proc_bit;asm volatile("nop");\
proc_bit;asm volatile("nop");asm volatile("nop");\
proc_bit;asm volatile("nop");\
proc_bit;asm volatile("nop");\
proc_bit;\
asm volatile("addi $t0,$t0,4");\
}

//************ MAIN ******************

int main() {

int t,i,j;

SYSTEMConfigPerformance(120000000);
ANSELB = 0;
ANSELA = 0;
TRISB = 0x0002000; // RB3-0 VIDEO OUTPUT , RB13= RXD1
TRISA = 0x0000007; // RA1-0 VISEO INPUT
ODCA = 0;

REFOCONbits.RODIV = 2;
REFOTRIMbits.ROTRIM = 256;
REFOCONbits.ON = 1; // Reference Oscillator Module enabled
REFOCONbits.OE = 1; // Reference clock is driven out on REFCLKO pin
RPA4Rbits.RPA4R = 0b0111;

RPB15R =0x0001; // RB15 = TXD1
U1RXR =0x0003; // RB13= RXD1

U1MODE = 0x0000;
U1STAbits.UTXEN = 1; // enable transmit pin
U1STAbits.URXEN = 1; // enable receive pin
U1BRG = 30000000 / 16 / 115200 - 1;
U1STAbits.OERR=0;
U1MODEbits.ON = 1; // enable UART

LATB = 0x08;

uart_puttext("***** ICHIGOJAM COLOR ADOPTER *****************\n");
uart_puttext("STRATED.\n");

for(i=0;i<64;i++) {
for (j=0;j<50;j++) {
if (i<100) {
gFC[j*64+i] = 0x08 | (i%7) +1;
}else{
gFC[j*64+i] = 0x0f;
}
gBC[j*64+i] = 0x08;
}
}

gOFFSET = 0;

while(1) {

while(PORTAbits.RA0 == 1) {asm volatile("nop");} // Wait for BLANKING
LATB=0x00; t=0;
while(PORTAbits.RA0 == 0) {t++;}
LATB=0x08;

if (t<100) { // If HBLANK
if ((lines < 0)||(lines >=200)) {
LATB=0x08;
while(PORTAbits.RA0 == 1) {
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
} // while displaying
lines++;
}else{
for (i=0;i<132;i++) {asm volatile("nop");}
// asm volatile("nop");asm volatile("nop");asm volatile("nop");

asm volatile("la $t0,%0"::"i"(&gFC[0]));
asm volatile("la $t2,%0"::"i"(&gOFFSET));
asm volatile("lw $t6,0($t2)");
asm volatile("add $t0,$t6,$t0");
asm volatile("la $t1,%0"::"i"(&gBC[0]));
asm volatile("la $t2,%0"::"i"(&gOFFSET));
asm volatile("lw $t6,0($t2)");
asm volatile("add $t1,$t6,$t1");
asm volatile("la $t2,%0"::"i"(&PORTA));
asm volatile("la $t3,%0"::"i"(&PORTB));

proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0;
proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0;
proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0;
proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0; proc_char0;

LATB=0x08;
lines++;
gOFFSET = (lines/4) * 64 * 4;
}
}else{
lines = -21; // if VBLANK
}
}
}

void uart_putc (unsigned char c)
{
while (U1STAbits.UTXBF); // wait for trasmit buffer enmpty
U1TXREG = c; // set data
}

void uart_puttext(unsigned char *c)
{
unsigned char *c0;
c0 = c;
while (*c0 != 0x00) {
while (U1STAbits.UTXBF); // wait for trasmit buffer enmpty
U1TXREG = *c0; // set data
c0++;
}
}
unsigned int uart_getc(void)
{
if (!U1STAbits.URXDA) {
return 0xffff;
}else{
return ((unsigned int)(U1RXREG)&0x00ff);
}
}
void uart_putnum (unsigned int n){
int n0,i,n1;
n0 = n % 100000; n1=10000;
for (i=0;i<5;i++) {
uart_putc(0x30 + (n0/n1));
n0 %= n1;
n1 /= 10;
}
}


後はシリアル通信でichigojamからのコマンドを受けるのと、あとはちらつきを抑えないと。
ちらつきは手ごわいかもしれません。

また本業が立て込んでいますので、今週末に続きができるかどうか。。。。。

2015.07.07 Tue l ICHIGOJAM l コメント (0) l top

コメント

コメントの投稿












上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。