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