Takanori Oshiro
unread,Sep 29, 2023, 6:28:58 AM9/29/23You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
今時使う人はいないと思いますがX bitmap imageをNEC PC-PR150プリンターに出
力するプログラムを書いてみました
動作させるためにはパラレルポートのあるコンピュータでFreeBSDが走っている
必要があります
C言語のファイルが一つだけなので簡単にコンパイルできるでしょう
但しハードウエアを直接操作している部分がありCPUのクロックにあわせてウエ
イトを調整する必要があります
X window systemでウインドウをxwdでダンプしgimpでxbm形式に変換して印刷す
るのに使っています
感熱紙に印刷できて経済的なのは助かるのですが今時のプリンターに比べると
非常に遅いです
幅1280ピクセルくらいまでなら印刷できます
詳しくはソースコードを御覧ください
大城貴紀
---
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <dev/ppbus/ppi.h>
#include <dev/ppbus/ppbconf.h>
#include <unistd.h>
#define WAIT 1000000 /* adjust this with your cpu speed */
void ppout(int,unsigned char);
int main(int argc, char *argv[]){
FILE *fp;
char tmp1[256],tmp2[256],c;
int x,y,i,n,m,j,k,l;
int *data;
int raster[3000][3000];
int fd;
unsigned char b;
char *p;
if((fp=fopen(*++argv,"r"))==NULL){
printf("can't open %s\n",*argv);
return 1;
}
fscanf(fp,"%s %s %d",tmp1,tmp2,&x);
fscanf(fp,"%s %s %d",tmp1,tmp2,&y);
while((c=getc(fp))!='\n')
;
if(x%8){
n=(x/8+1)*y;
}else{
n=(x/8)*y;
}
data = (int *)malloc(n * sizeof(int));
for(i=0;i<n-1;i++){
j=0;
while((c=getc(fp)) !=',' ){
tmp1[j++]=c;
}
j++;
tmp1[j]=c;
j=0;
while(tmp1[j++]!='x')
;
tmp2[0]='0';
tmp2[1]='x';
tmp2[2]=tmp1[j];
tmp2[3]=tmp1[j+1];
tmp2[4]='\0';
sscanf(tmp2,"%x",&m);
*data = m;
data++;
}
j=0;
while((c=getc(fp))!='}'){
tmp1[j++]=c;
}
j++;
tmp1[j]=c;
j=0;
while(tmp1[j++] != 'x')
;
tmp2[0]='0';
tmp2[1]='x';
tmp2[2]=tmp1[j];
tmp2[3]=tmp1[j+1];
tmp2[4]='\0';
sscanf(tmp2,"%x",&m);
*data = m;
data -= n-1;
if(x%8){
k=x/8+1;
}else{
k=x/8;
}
for(i=0;i<y;i++){
for(j=0;j<k;j++){
n=*data & 001;
raster[j*8][i]=n;
n=*data & 002;
n = n>>1;
raster[j*8+1][i]=n;
n=*data & 004;
n = n>>2;
raster[j*8+2][i]=n;
n=*data & 010;
n= n>>3;
raster[j*8+3][i]=n;
n=*data & 020;
n= n>>4;
raster[j*8+4][i]=n;
n=*data & 040;
n=n>>5;
raster[j*8+5][i]=n;
n=*data & 0100;
n=n>>6;
raster[j*8+6][i]=n;
n=*data & 0200;
n=n>>7;
raster[j*8+7][i]=n;
data++;
}
}
/*
for(i=0;i<y;i++){
for(j=0;j<8*k;j++){
if(raster[j][i]){
printf("o");
}else{
printf(" ");
}
}
printf("\n");
}
*/
fd = open("/dev/ppi0",O_RDWR,0600);
if(x<10){
sprintf(tmp1,"000%d",x);
}else if(x<100){
sprintf(tmp1,"00%d",x);
}else if(x<1000){
sprintf(tmp1,"0%d",x);
}else{
sprintf(tmp1,"%d",x);
}
p = tmp1;
b = 0x1b;
ioctl(fd,PPISDATA,&b);
ioctl(fd,PPIGCTRL,&b);
b |= STROBE;
ioctl(fd,PPISCTRL,&b);
for(i=0;i<WAIT;i++)
;
b &= ~STROBE;
ioctl(fd,PPISCTRL,&b);
for(i=0;i<WAIT;i++)
;
b = 'T';
ioctl(fd,PPISDATA,&b);
ioctl(fd,PPIGCTRL,&b);
b |= STROBE;
ioctl(fd,PPISCTRL,&b);
for(i=0;i<WAIT;i++)
;
b &= ~STROBE;
ioctl(fd,PPISCTRL,&b);
for(i=0;i<WAIT;i++)
;
b = '1';
ioctl(fd,PPISDATA,&b);
ioctl(fd,PPIGCTRL,&b);
b |= STROBE;
ioctl(fd,PPISCTRL,&b);
for(i=0;i<WAIT;i++)
;
b &= ~STROBE;
ioctl(fd,PPISCTRL,&b);
for(i=0;i<WAIT;i++)
;
b = '2';
ioctl(fd,PPISDATA,&b);
ioctl(fd,PPIGCTRL,&b);
b |= STROBE;
ioctl(fd,PPISCTRL,&b);
for(i=0;i<WAIT;i++)
;
b &= ~STROBE;
ioctl(fd,PPISCTRL,&b);
for(i=0;i<WAIT;i++)
;
if(y%8){
k=y/8+1;
}else{
k=y/8;
}
for(i=0;i<k;i++){
b = 0x1b;
ioctl(fd,PPISDATA,&b);
ioctl(fd,PPIGCTRL,&b);
b |= STROBE;
ioctl(fd,PPISCTRL,&b);
for(j=0;j<WAIT;j++)
;
b &= ~STROBE;
ioctl(fd,PPISCTRL,&b);
for(j=0;j<WAIT;j++)
;
b = 'S';
ioctl(fd,PPISDATA,&b);
ioctl(fd,PPIGCTRL,&b);
b |= STROBE;
ioctl(fd,PPISCTRL,&b);
for(j=0;j<WAIT;j++)
;
b &= ~STROBE;
ioctl(fd,PPISCTRL,&b);
for(j=0;j<WAIT;j++)
;
for(l=0;l<4;l++){
b=*p++;
ioctl(fd,PPISDATA,&b);
ioctl(fd,PPIGCTRL,&b);
b |= STROBE;
ioctl(fd,PPISCTRL,&b);
for(j=0;j<WAIT;j++)
;
b &= ~STROBE;
ioctl(fd,PPISCTRL,&b);
for(j=0;j<WAIT;j++)
;
}
printf("%d\n",*p);
p-=4;
for(j=0;j<x;j++){
n=0;
n += raster[j][i*8];
n += raster[j][i*8+1] * 2;
n += raster[j][i*8+2] *4;
n += raster[j][i*8+3] *8;
n += raster[j][i*8+4] *16;
n+= raster[j][i*8+5] *32;
n += raster[j][i*8+6] *64;
n += raster[j][i*8+7] *128;
b = (unsigned char)n;
ppout(fd,b);
}
b = 0x0d;
ioctl(fd,PPISDATA,&b);
ioctl(fd,PPIGCTRL,&b);
b |= STROBE;
ioctl(fd,PPISCTRL,&b);
for(l=0;l<WAIT;l++)
;
b &= ~STROBE;
ioctl(fd,PPISCTRL,&b);
for(l=0;l<WAIT;l++)
;
b = 0x0a;
ioctl(fd,PPISDATA,&b);
ioctl(fd,PPIGCTRL,&b);
b |= STROBE;
ioctl(fd,PPISCTRL,&b);
for(l=0;l<WAIT;l++)
;
b &= ~STROBE;
ioctl(fd,PPISCTRL,&b);
for(l=0;l<WAIT;l++)
;
for(l=0;l<100000000;l++)
;
}
close(fd);
free(data);
fclose(fp);
return 0;
}
void ppout(int fd, unsigned char b){
unsigned char val;
int i;
do{
ioctl(fd,PPIGSTATUS,&val);
val &=nACK;
}while(val != 0x40);
val = b;
ioctl(fd,PPISDATA,&val);
ioctl(fd,PPIGCTRL,&val);
val |= STROBE;
ioctl(fd,PPISCTRL,&val);
for(i=0;i<WAIT;i++)
;
val &= ~STROBE;
ioctl(fd,PPISCTRL,&val);
for(i=0;i<WAIT;i++)
;
}