REM REM PROGRAM CHARGEN REM REM THIS PROGRAM INTERACTIVELY GENERATES REM HEX FILES FOR THE CHARACTER GENERATOR REM ROMS FOR THE THE IMSAI VIO VIDEO BOARD REM REM REM COPYRIGHT 1977 IMSAI MANUFACTURING CORP. REM REM VERS 1.0 GEE IF END #1 THEN 9999 IF END #2 THEN 9999 IF END #3 THEN 9999 HEXCONV$="0123456789ABCDEF" DIM LN$(10) DIM STAR$(16) STAR$(0)="****" STAR$(1)=" ***" STAR$(2)="* **" STAR$(3)=" **" STAR$(4)="** *" STAR$(5)=" * *" STAR$(6)="* *" STAR$(7)=" *" STAR$(8)="*** " STAR$(9)=" ** " STAR$(10)="* * " STAR$(11)=" * " STAR$(12)="** " STAR$(13)=" * " STAR$(14)="* " STAR$(15)=" " INPUT "NAME OF CHARACTER FILE";SFILE$ DFILE$=LEFT$(SFILE$,1) IF LEN(SFILE$)=1 THEN 20 FOR I=2 TO LEN(SFILE$) F$=MID$(SFILE$,I,1) IF F$="." THEN 20 DFILE$=DFILE$+F$ IF LEN(DFILE$)>6 THEN DFILE$=LEFT$(DFILE$,6) NEXT I 20 DFILE1$=DFILE$+"1.HEX" DFILE2$=DFILE$+"2.HEX" DFILE3$=DFILE$+"3.HEX" DFILE4$=DFILE$+".CHR" FILE DFILE1$(50),DFILE2$(50),DFILE3$(50),DFILE4$ INPUT "NEW FILE (Y/N)";A$ IF LEFT$(A$,1)<>"Y" THEN 100 FOR I=1 TO 64 N=I-1 GOSUB 200 LINE$=":100"+HEX$+"000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" PRINT #1,I;LINE$ PRINT #2,I;LINE$ PRINT #3,I;LINE$ NEXT I LINE$=":00000000000" PRINT #1,65;LINE$ PRINT #2,65;LINE$ PRINT #3,65;LINE$ 100 PRINT:PRINT:PRINT INPUT "ENTER CODE";A$ DFLAG=0 IF A$<>"DUMP" THEN 101 DFLAG=1 GOTO 700 101 IF LEFT$(A$,1)="Q" THEN 9999 IF A$="CKSUM" THEN 999 EFLAG=0 IF LEFT$(A$,1)<>"E" THEN 102 EFLAG=1 A$=RIGHT$(A$,LEN(A$)-1) 102 IF LEN(A$)=8 THEN 110 PRINT "ENTER 8 BINARY DIGITS" GOTO 100 110 V=0 F=128 FOR I=1 TO 8 AA$=MID$(A$,I,1) IF (AA$="1") OR (AA$="0") THEN 115 PRINT "ILLEGAL CHARACTER CODE" GOTO 100 115 IF AA$="1" THEN V=V+F F=F/2 NEXT I IF EFLAG=1 THEN 800 120 PRINT "INPUT CHARACTER MATRIX" PRINT EFLAG=0 FOR J=1 TO 10 125 PRINT "LINE ";J,"."; INPUT LN$(J) IF LEN(LN$(J))<8 THEN 130 PRINT "LINE TOO LONG" GOTO 125 130 IF LEN(LN$(J))=7 THEN 135 LN$(J)=LN$(J)+" " GOTO 130 135 FOR K=1 TO 7 LNN$=MID$(LN$(J),K,1) IF (LNN$=" ") OR (LNN$="*") THEN 140 PRINT "ILLEGAL CHARACTER" GOTO 125 140 NEXT K NEXT J 142 PRINT:PRINT:PRINT "CODE IS ";A$ PRINT:PRINT "CHARACTER IS:":PRINT ". . . . . . . . ." IF DFLAG<>1 THEN 104 PRINT #4; " " PRINT #4; " " PRINT #4;"CHARACTER CODE:",A$ PRINT #4;" " PRINT #4;". . . . . . . . ." 104 FOR J=1 TO 10 LL$=". " FOR K=1 TO 7 LL$=LL$+MID$(LN$(J),K,1)+" " NEXT K LL$=LL$+"." PRINT LL$ IF DFLAG=1 THEN PRINT #4;LL$ NEXT J PRINT ". . . . . . . . ." IF DFLAG<>1 THEN 106 PRINT #4;". . . . . . . . ." RETURN 106 PRINT:PRINT:INPUT "CHARACTER OK (Y/N)";B$ IF (LEFT$(B$,1)="Y") AND (EFLAG=1) THEN 100 IF LEFT$(B$,1)="Y" THEN 145 PRINT "REENTER CHARACTER" GOTO 120 145 FOR J=1 TO 10 JJ=J-1 N=0 F=1 FOR K=1 TO 7 IF MID$(LN$(J),K,1)=" " THEN N=N+F F=F*2 NEXT K GOSUB 200 IF V>=128 THEN VV=V-128 ELSE VV=V IF JJ>7 THEN 150 PPOSIT=JJ*128+VV LOWADR=INT(PPOSIT/16)+1 IF V>=128 THEN READ #2,LOWADR;LINE$ ELSE READ #1,LOWADR;LINE$ POSIT=(PPOSIT-16*LOWADR+16)*2+9 LINE$=LEFT$(LINE$,POSIT)+HEX$+RIGHT$(LINE$,41-POSIT) IF V>=128 THEN PRINT #2,LOWADR;LINE$ ELSE PRINT #1,LOWADR;LINE$ GOTO 157 150 IF V>=128 THEN VVV=1 ELSE VVV=0 PPOSIT=(JJ-8)*128+VVV*512+VV LOWADR=INT(PPOSIT/16)+1 READ #3,LOWADR;LINE$ POSIT=(PPOSIT-16*LOWADR+16)*2+9 LINE$=LEFT$(LINE$,POSIT)+HEX$+RIGHT$(LINE$,41-POSIT) PRINT #3,LOWADR;LINE$ 157 NEXT J PRINT:PRINT GOTO 100 800 FOR J=1 TO 10 JJ=J-1 IF V>=128 THEN VV=V-128 ELSE VV=V IF JJ>7 THEN 820 PPOSIT=JJ*128+VV LOWADR=INT(PPOSIT/16)+1 IF V>=128 THEN READ #2,LOWADR;LINE$ ELSE READ #1,LOWADR;LINE$ GOTO 830 820 IF V>=128 THEN VVV=1 ELSE VVV=0 PPOSIT=(JJ-8)*128+VVV*512+VV LOWADR=INT(PPOSIT/16)+1 READ #3,LOWADR;LINE$ 830 POSIT=(PPOSIT-16*LOWADR+16)*2+10 CK$=MID$(LINE$,POSIT,1) GOSUB 500 LN$(J)=LEFT$(STAR$(M),3) CK$=MID$(LINE$,POSIT+1,1) GOSUB 500 LN$(J)=STAR$(M)+LN$(J) NEXT J GOTO 142 200 HEX16=INT(N/16) IF HEX16=16 THEN 250 HEX=INT(N-HEX16*16) H16$=MID$(HEXCONV$,HEX16+1,1) H$=MID$(HEXCONV$,HEX+1,1) HEX$=H16$+H$ RETURN 250 HEX$="00" RETURN 400 N=0 L=2 410 CK$=MID$(LINE$,L,1) GOSUB 500 420 N=N+16*M L=L+1 CK$=MID$(LINE$,L,1) GOSUB 500 430 N=N+M IF N>=256 THEN N=N-256 IF N<0 THEN N=0 L=L+1 IF L<42 THEN 410 IF N>=256 THEN N=N-256 N=ABS(256-N) GOSUB 200 LINE$=LEFT$(LINE$,41)+HEX$ RETURN 500 M=0 IF CK$="0" THEN RETURN M=M+1 IF CK$="1" THEN RETURN M=M+1 IF CK$="2" THEN RETURN M=M+1 IF CK$="3" THEN RETURN M=M+1 IF CK$="4" THEN RETURN M=M+1 IF CK$="5" THEN RETURN M=M+1 IF CK$="6" THEN RETURN M=M+1 IF CK$="7" THEN RETURN M=M+1 IF CK$="8" THEN RETURN M=M+1 IF CK$="9" THEN RETURN M=M+1 IF CK$="A" THEN RETURN M=M+1 IF CK$="B" THEN RETURN M=M+1 IF CK$="C" THEN RETURN M=M+1 IF CK$="D" THEN RETURN M=M+1 IF CK$="E" THEN RETURN M=M+1 IF CK$="F" THEN RETURN PRINT "HEX ERROR" GOTO 9999 999 FOR I=1 TO 64 READ #1,I;LINE$ GOSUB 400 PRINT #1,I;LINE$ READ #2,I;LINE$ GOSUB 400 PRINT #2,I;LINE$ READ #3,I;LINE$ GOSUB 400 PRINT #3,I;LINE$ NEXT I GOTO 9999 700 P$="0" FOR P=0 TO 1 Q$="0" FOR Q=0 TO 1 R$="0" FOR R=0 TO 1 S$="0" FOR S=0 TO 1 T$="0" FOR T=0 TO 1 U$="0" FOR U=0 TO 1 W$="0" FOR W=0 TO 1 X$="0" FOR X=0 TO 1 A$=P$+Q$+R$+S$+T$+U$+W$+X$ V=X+2*W+4*U+8*T+16*S+32*R+64*Q+128*P GOSUB 800 X$="1" NEXT X W$="1" NEXT W U$="1" NEXT U T$="1" NEXT T S$="1" NEXT S R$="1" NEXT R Q$="1" NEXT Q P$="1" NEXT P 9999 END