1000 DEFINT A-Z:A=0:B=1:REM This version is intended for compilation by MSX-BACON. Otherwise it will run very slowly, provided it can even fit in BASIC RAM.
2
1010 GOSUB 1020:GOTO 2010
3
1020 DIM L(7),K(7),T(7):BEEP:SCREEN 2:COLOR 15,1,1:CLS:F=0:E=&H2000
1140 FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=Z MOD 32 TO 1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD9+2*L):GOSUB 1760:NEXT J:NEXT X:NEXT Y
16
1150 Z=Z+2:GOTO 1110
17
1160 IF K>=&H80 THEN K=K+8*96-&H20
18
1170 OUT &HD9,(K-&H20)\&H40:OUT &HD8,(K-&H20)MOD&H40
19
1180 FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=Z MOD 32 TO 1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD9+2*L):ON 1-(X=(Z MOD 32)) GOSUB 1780,1760:NEXT J:NEXT X:NEXT Y
20
1190 Z=Z+1:GOTO 1110
21
1200 ' v1.0
22
1210 OUT &HD9,&H2:OUT &HD8,&H3C:OUT &HDB,&H2:OUT &HDA,&H3A
23
1220 FOR L=1 TO 0 STEP -1:FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=2*L+Z MOD 32 TO 2*L+1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD9+2*L):GOSUB 1760:NEXT J:NEXT X:NEXT Y:NEXT L
24
1230 Z=Z+4
25
1240 GOSUB 1710:IF A=1 THEN GOTO 1660
26
1250 CLS:Z=0:D=0:Y=0:S$=" "+T$+" 2/9: Interleaving A "+V$+" ":W=&HFF:GOSUB 1750:W=0:Z=0:D=0
27
1260 RESTORE 1950:FOR N=0 TO 7:READ K$:L=0:K=VAL("&H"+K$):GOSUB 1690:L(N)=L:K(N)=K:T(N)=T:NEXT N
28
1270 FOR N=2 TO 7:IF L(0)<>0 OR L(N)<>L(N-2)OR L(N)=L(N-1)OR((K(N)<>K(N-2))AND(T(N)<>T(N-2)))THEN SCREEN 0:PRINT"Data does not conform":A=1:GOTO 1660:ELSE NEXT N
29
1280 'plan 1/2/3/4
30
1290 FOR R=0 TO 1:GOSUB 1800
31
1300 FOR L=0 TO 1:FOR N=0 TO 7:K=K(N):T=T(N):IF L(N)<>L THEN GOTO 1350
32
1310 IF (R MOD 2=1) AND (N<2 OR T((8+N-2)MOD 8)<>T) THEN OUT &HD8+2*L,T
33
1320 IF N<2 OR K((8+N-2)MOD 8)<>K THEN OUT &HD9+2*L,K
34
1330 IF (R MOD 2=0) AND (N<2 OR T((8+N-2)MOD 8)<>T) THEN OUT &HD8+2*L,T
35
1340 FOR Y=1+2*((Z+2*N)\32) TO 4+2*((Z+2*N)\32):GOSUB 1680:NEXT Y
36
1350 NEXT N:NEXT L:Z=Z+16:IF(Z MOD 32)<16 THEN Z=Z+32
37
1360 NEXT R
38
1370 'plan 5/6/7/8
39
1380 FOR R=0 TO 3:GOSUB 1800
40
1390 FOR N2=0 TO 7 STEP 2:FOR P=0 TO 5:L=(-(((P>=1)AND(P<=2))OR(P=4)))XOR(R MOD 2):N=N2+L:K=K(N):T=T(N)
41
1400 IF ((R\2)MOD 2=1) AND (P<2 AND (N<2 OR T((8+N-2)MOD 8)<>T)) THEN OUT &HD8+2*L,T
42
1410 IF P<2 AND (N<2 OR K((8+N-2)MOD 8)<>K) THEN OUT &HD9+2*L,K
43
1420 IF ((R\2)MOD 2=0) AND (P<2 AND (N<2 OR T((8+N-2)MOD 8)<>T)) THEN OUT &HD8+2*L,T
44
1430 IF P>=2 THEN FOR Y=1-2*(P>=4)+2*((Z+2*N)\32) TO 2-2*(P>=4)+2*((Z+2*N)\32):GOSUB 1680:NEXT Y
45
1440 NEXT P:NEXT N2:Z=Z+16:IF(Z MOD 32)<16 THEN Z=Z+32
46
1450 NEXT R
47
1460 'plan 9/10/11/12
48
1470 FOR R=0 TO 3:GOSUB 1800
49
1480 FOR N2=0 TO 7 STEP 2:FOR P=0 TO 4+2*2*32-1:L=(P MOD 2)XOR(-(P<4))XOR(R MOD 2):N=N2+L:K=K(N):T=T(N)
50
1490 IF ((R\2)MOD 2=1) AND (P>=2 AND P<4 AND (N<2 OR T((8+N-2)MOD 8)<>T)) THEN OUT &HD8+2*L,T
51
1500 IF P<2 AND (N<2 OR K((8+N-2)MOD 8)<>K) THEN OUT &HD9+2*L,K
52
1510 IF ((R\2)MOD 2=0) AND (P>=2 AND P<4 AND (N<2 OR T((8+N-2)MOD 8)<>T)) THEN OUT &HD8+2*L,T
53
1520 IF P>=4 THEN Y=1+((P-4)\32) MOD 4+2*((Z+2*N)\32):X=((P-4)\16) MOD 2+(Z+2*N) MOD 32:J=((P-4)\2) MOD 8:G=INP(&HD9+2*L):GOSUB 1760
54
1530 NEXT P:NEXT N2:Z=Z+16:IF(Z MOD 32)<16 THEN Z=Z+32
55
1540 NEXT R
56
1550 GOSUB 1710:IF A=1 THEN GOTO 1660
57
1560 CLS:Z=0:D=0:Y=0:S$=" "+T$+" 3/9: Interleaving B "+V$+" ":W=&HFF:GOSUB 1750:W=0:Z=0:D=0
58
1570 'plan 13/14/15/16
59
1580 FOR R=0 TO 3:GOSUB 1800
60
1590 FOR N2=0 TO 7 STEP 2:FOR P=0 TO 4+4-1:L=(P MOD 2)XOR(-(P<4))XOR(R MOD 2):N=N2+L:K=K(N):T=T(N)
61
1600 IF (P<2 AND R<2) OR (P>=2 AND P<4 AND R>=2 AND R<4) AND (N<2 OR K((8+N-2)MOD 8)<>K) THEN OUT &HD9+2*L,K
62
1610 IF (P<2 AND R>=2 AND R<4) OR (P>=2 AND P<4 AND R<2) AND (N<2 OR T((8+N-2)MOD 8)<>T) THEN OUT &HD8+2*L,T
63
1620 IF P>=4 THEN FOR Y=1-2*(P>=6)+2*((Z+2*N)\32) TO 2-2*(P>=6)+2*((Z+2*N)\32):GOSUB 1680:NEXT Y
64
1630 NEXT P:NEXT N2:Z=Z+16:IF(Z MOD 32)<16 THEN Z=Z+32
65
1640 NEXT R
66
1650 GOSUB 1710:IF A=1 THEN GOTO 1660
67
1660 IF A=1 THEN SCREEN 0:PRINT"Abnormal exit"
68
1670 IF B<>2 THEN RETURN:ELSE GOTO 2000
69
1680 FOR X=(Z+2*N) MOD 32 TO 1+(Z+2*N) MOD 32:FOR J=0 TO 7:G=INP(&HD9+2*L):GOSUB 1760:NEXT J:NEXT X:RETURN
70
1690 T=(K MOD &H100)-&H20:K=K\&H100-&H20:IF K>=&H30 THEN K=K-&H30:L=1:ELSE IF K>&H9 AND K<&H30 THEN K=K-&H6:T=T+&H40
71
1700 K=K*96+T:T=K MOD&H40:K=K\&H40:RETURN
72
1710 Y=23:S$=N$:W=&HFF:GOSUB 1750:W=0
73
1720 I$=INKEY$:IF I$=CHR$(&H3) OR I$=CHR$(&H1B) THEN SCREEN 0:A=1:GOTO 1740:ELSE:IF I$<>"" THEN GOTO 1720:ELSE BEEP
74
1730 I$=INKEY$:IF I$="" THEN GOTO 1730:ELSE IF I$=CHR$(&H3) OR I$=CHR$(&H1B) THEN SCREEN 0:A=1:GOTO 1740
75
1740 RETURN
76
1750 D=0:FOR X=0 TO LEN(S$)-1:V=ASC(MID$(S$,1+X,1)):Q=7+2*(V>=&H20 AND V<&H7F):FOR J=0 TO 7:G=PEEK(C+8*V+J):GOSUB 1760:NEXT J:D=D+Q-7:NEXT X:Q=7:RETURN
77
1760 GG=G XOR W:IF GG=0 THEN RETURN:ELSE XX=8*X+D:IF GG=&HFF THEN YY=8*Y+J:LINE(XX,YY)-(XX+Q,YY),15:RETURN:ELSE IF Q=7 AND D MOD 8=0 THEN GOTO 1790:ELSE M=&H80:YY=8*Y+J:FOR I=0 TO Q:IF (GG\M)MOD 2<>0 THEN PSET(XX+I,YY),15
2120 FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=Z MOD 32 TO 1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD9+2*L):GOSUB 1760:NEXT J:NEXT X:NEXT Y
114
2130 Z=Z+2:GOTO 2090
115
2140 IF K>=&H80 THEN K=K+8*96-&H20
116
2150 OUT &HD9,(K-&H20)\&H40+ZY:OUT &HD8,(K-&H20)MOD&H40+ZZ
117
2160 FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=Z MOD 32 TO 1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD9+2*L):ON 1-(X=(Z MOD 32)) GOSUB 1780,1760:NEXT J:NEXT X:NEXT Y
118
2170 Z=Z+1:GOTO 2090
119
2180 ' v1.0 only varying upper address bits
120
2190 OUT &HD9,&HC2:OUT &HD8,&HBC:OUT &HDB,&H42:OUT &HDA,&H3A
121
2200 FOR L=1 TO 0 STEP -1:FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=2*L+Z MOD 32 TO 2*L+1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD9+2*L):GOSUB 1760:NEXT J:NEXT X:NEXT Y:NEXT L
2290 FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=Z MOD 32 TO 1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD8+2*L):GOSUB 1760:NEXT J:NEXT X:NEXT Y
131
2300 Z=Z+2:GOTO 2260
132
2310 IF K>=&H80 THEN K=K+8*96-&H20
133
2320 OUT &HD9,(K-&H20)\&H40:OUT &HD8,(K-&H20)MOD&H40
134
2330 FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=Z MOD 32 TO 1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD8+2*L):ON 1-(X=(Z MOD 32)) GOSUB 1780,1760:NEXT J:NEXT X:NEXT Y
135
2340 Z=Z+1:GOTO 2260
136
2350 ' v1.0 only lower-port readbacks
137
2360 OUT &HD9,&H2:OUT &HD8,&H3C:OUT &HDB,&H2:OUT &HDA,&H3A
138
2370 FOR L=1 TO 0 STEP -1:FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=2*L+Z MOD 32 TO 2*L+1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD8+2*L):GOSUB 1760:NEXT J:NEXT X:NEXT Y:NEXT L
139
2380 Z=Z+4
140
2390 GOSUB 1710:IF A=1 THEN GOTO 2570
141
2400 CLS:Z=0:D=0:Y=0:S$=" "+T$+" 6/9: Read Port Flips "+V$+" ":W=&HFF:GOSUB 1750:W=0:Z=0:D=0
142
2410 ' 8x16 / 16x16 Kanji only read-port address LSB flips
2460 FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=Z MOD 32 TO 1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD9-(J MOD 2)+2*L):GOSUB 1760:NEXT J:NEXT X:NEXT Y
148
2470 Z=Z+2:GOTO 2430
149
2480 IF K>=&H80 THEN K=K+8*96-&H20
150
2490 OUT &HD9,(K-&H20)\&H40:OUT &HD8,(K-&H20)MOD&H40
151
2500 FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=Z MOD 32 TO 1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD9-(J MOD 2)+2*L):ON 1-(X=(Z MOD 32)) GOSUB 1780,1760:NEXT J:NEXT X:NEXT Y
152
2510 Z=Z+1:GOTO 2430
153
2520 ' v1.0 only read-port address LSB flips
154
2530 OUT &HD9,&H2:OUT &HD8,&H3C:OUT &HDB,&H2:OUT &HDA,&H3A
155
2540 FOR L=1 TO 0 STEP -1:FOR Y=1+2*(Z\32) TO 2+2*(Z\32):FOR X=2*L+Z MOD 32 TO 2*L+1+Z MOD 32:FOR J=0 TO 7:G=INP(&HD9-(J MOD 2)+2*L):GOSUB 1760:NEXT J:NEXT X:NEXT Y:NEXT L