FC18: Converted NCR magic sparkler to smoke signal for missing sparkler

This commit is contained in:
Willem Cazander 2025-08-22 15:39:33 +02:00
parent e7e26b569b
commit 7ea17d7628
6 changed files with 35 additions and 47 deletions

View file

@ -196,15 +196,7 @@ public class FourCornerZionStenoLexer {
return true; return true;
} }
private void ncrBankReset() { private void ncrBankFire() {
for (int i = 0; i < denominatorBank.length; i++) {
denominatorBank[i] = 0;
numeratorBank[i] = 0;
}
}
private void ncrBankFire(boolean magic) {
fireSignals.fireStateNCR1632BankSparkler(magic);
BigInteger denominator = BigInteger.ONE; BigInteger denominator = BigInteger.ONE;
for (int i = 0; i < denominatorBank.length; i++) { for (int i = 0; i < denominatorBank.length; i++) {
denominator = denominator.add(BigInteger.valueOf(denominatorBank[i]).shiftLeft(i * 9)); denominator = denominator.add(BigInteger.valueOf(denominatorBank[i]).shiftLeft(i * 9));
@ -214,6 +206,11 @@ public class FourCornerZionStenoLexer {
numerator = numerator.add(BigInteger.valueOf(numeratorBank[i]).shiftLeft(i * 9)); numerator = numerator.add(BigInteger.valueOf(numeratorBank[i]).shiftLeft(i * 9));
} }
handler.strobeNCR1632(denominator, numerator); handler.strobeNCR1632(denominator, numerator);
// reset the bank after each fire
for (int i = 0; i < denominatorBank.length; i++) {
denominatorBank[i] = 0;
numeratorBank[i] = 0;
}
} }
private void decModeReset() { private void decModeReset() {
@ -351,30 +348,27 @@ public class FourCornerZionStenoLexer {
@Override @Override
public void process(FourCornerZionStenoLexer lexer, int idxFirst, int idxLast) { public void process(FourCornerZionStenoLexer lexer, int idxFirst, int idxLast) {
lexer.ncrBankReset(); boolean missingSparkler = true;
boolean magicSparkler = true;
for (int i = idxFirst; i <= idxLast; i++) { for (int i = idxFirst; i <= idxLast; i++) {
int cakePoint = lexer.input.get(i); int cakePoint = lexer.input.get(i);
if (cakePoint >= FourCornerDotCake.FC_NCR1632_DEN.getStart() && cakePoint <= FourCornerDotCake.FC_NCR1632_DEN.getStop()) { if (cakePoint >= FourCornerDotCake.FC_NCR1632_DEN.getStart() && cakePoint <= FourCornerDotCake.FC_NCR1632_DEN.getStop()) {
int denominatorX = cakePoint - FourCornerDotCake.FC_NCR1632_DEN.getStart(); int denominatorX = cakePoint - FourCornerDotCake.FC_NCR1632_DEN.getStart();
lexer.denominatorBank[denominatorX / 512] = denominatorX % 512; lexer.denominatorBank[denominatorX / 512] = denominatorX % 512;
magicSparkler = true; missingSparkler = true;
continue; continue;
} }
int numeratorX = cakePoint - FourCornerDotCake.FC_NCR1632_NUM.getStart(); int numeratorX = cakePoint - FourCornerDotCake.FC_NCR1632_NUM.getStart();
lexer.numeratorBank[numeratorX / 512] = numeratorX % 512; lexer.numeratorBank[numeratorX / 512] = numeratorX % 512;
if (cakePoint > CAKEPOINT_BANK0_END) { if (cakePoint > CAKEPOINT_BANK0_END) {
magicSparkler = true; missingSparkler = true;
continue; // Only fire fraction on lowest value select continue; // Only fire fraction on lowest value select
} }
lexer.ncrBankFire(false); lexer.ncrBankFire();
lexer.ncrBankReset(); missingSparkler = false;
magicSparkler = false;
} }
if (magicSparkler) { if (missingSparkler) {
lexer.ncrBankFire(true); lexer.smokeSignals.burnNCR1632MissingBankSparkler(lexer.currLine, lexer.currCol);
lexer.ncrBankReset();
} }
} }
} }
@ -724,8 +718,7 @@ public class FourCornerZionStenoLexer {
lexer.numeratorBank[lexer.cdcDECModeNCR68NumPage] = lexer.cdcDECModeNCR68NumValue; lexer.numeratorBank[lexer.cdcDECModeNCR68NumPage] = lexer.cdcDECModeNCR68NumValue;
lexer.cdcDECModeNCR68NumPage = 0; lexer.cdcDECModeNCR68NumPage = 0;
lexer.cdcDECModeNCR68NumValue = 0; lexer.cdcDECModeNCR68NumValue = 0;
lexer.ncrBankFire(false); lexer.ncrBankFire();
lexer.ncrBankReset();
} }
return true; return true;
} }

View file

@ -32,8 +32,6 @@ public interface FourCornerZionStenoLexerFire {
void fireStateScannerMatch(int blockStart, int blockStop, int matchPoint, int idxFirst, int idxLast); void fireStateScannerMatch(int blockStart, int blockStop, int matchPoint, int idxFirst, int idxLast);
void fireStateNCR1632BankSparkler(boolean magic);
interface Adapter extends FourCornerZionStenoLexerFire { interface Adapter extends FourCornerZionStenoLexerFire {
@Override @Override
@ -43,9 +41,5 @@ public interface FourCornerZionStenoLexerFire {
@Override @Override
default void fireStateScannerMatch(int blockStart, int blockStop, int matchPoint, int idxFirst, int idxLast) { default void fireStateScannerMatch(int blockStart, int blockStop, int matchPoint, int idxFirst, int idxLast) {
} }
@Override
default void fireStateNCR1632BankSparkler(boolean magic) {
}
} }
} }

View file

@ -43,6 +43,8 @@ public interface FourCornerZionStenoLexerSmoke {
void burnSandWalkerStepUnaligned(int line, int col, int size); void burnSandWalkerStepUnaligned(int line, int col, int size);
void burnNCR1632MissingBankSparkler(int line, int col);
interface Adapter extends FourCornerZionStenoLexerSmoke { interface Adapter extends FourCornerZionStenoLexerSmoke {
@Override @Override
@ -68,6 +70,10 @@ public interface FourCornerZionStenoLexerSmoke {
@Override @Override
default void burnSandWalkerStepUnaligned(int line, int col, int size) { default void burnSandWalkerStepUnaligned(int line, int col, int size) {
} }
@Override
default void burnNCR1632MissingBankSparkler(int line, int col) {
}
} }
interface AdapterMonoPipe extends FourCornerZionStenoLexerSmoke { interface AdapterMonoPipe extends FourCornerZionStenoLexerSmoke {
@ -103,5 +109,10 @@ public interface FourCornerZionStenoLexerSmoke {
default void burnSandWalkerStepUnaligned(int line, int col, int size) { default void burnSandWalkerStepUnaligned(int line, int col, int size) {
burnMonoPipe(line, col, "burnSandWalkerStepUnaligned:" + size); burnMonoPipe(line, col, "burnSandWalkerStepUnaligned:" + size);
} }
@Override
default void burnNCR1632MissingBankSparkler(int line, int col) {
burnMonoPipe(line, col, "burnNCR1632MissingBankSparkler");
}
} }
} }

View file

@ -63,7 +63,6 @@ public class FourCornerRecipeTest {
BigInteger v2 = BigInteger.valueOf(12345); BigInteger v2 = BigInteger.valueOf(12345);
FourCornerRecipe.embedNCR1632FractionX06(cdcX06, v2, BigInteger.ONE); FourCornerRecipe.embedNCR1632FractionX06(cdcX06, v2, BigInteger.ONE);
FourCornerRecipe.embedNCR1632FractionX18(cdcX18, v2, BigInteger.ONE); FourCornerRecipe.embedNCR1632FractionX18(cdcX18, v2, BigInteger.ONE);
System.out.println(FourCornerUnicodeDisplay.raw().renderFromInt18(cdcX06));
String resX06 = FourCornerUnicodeDisplay.text().renderFromInt18(cdcX06); String resX06 = FourCornerUnicodeDisplay.text().renderFromInt18(cdcX06);
String resX18 = FourCornerUnicodeDisplay.text().renderFromInt18(cdcX18); String resX18 = FourCornerUnicodeDisplay.text().renderFromInt18(cdcX18);
Assertions.assertEquals(resX18, resX06); Assertions.assertEquals(resX18, resX06);
@ -79,7 +78,6 @@ public class FourCornerRecipeTest {
FourCornerRecipe.embedNCR1632FractionX06(cdcX06, v, BigInteger.ONE); FourCornerRecipe.embedNCR1632FractionX06(cdcX06, v, BigInteger.ONE);
FourCornerRecipe.embedNCR1632FractionX18(cdcX18, v, BigInteger.ONE); FourCornerRecipe.embedNCR1632FractionX18(cdcX18, v, BigInteger.ONE);
} }
System.out.println(FourCornerUnicodeDisplay.raw().renderFromInt18(cdcX06));
String resX06 = FourCornerUnicodeDisplay.text().renderFromInt18(cdcX06); String resX06 = FourCornerUnicodeDisplay.text().renderFromInt18(cdcX06);
String resX18 = FourCornerUnicodeDisplay.text().renderFromInt18(cdcX18); String resX18 = FourCornerUnicodeDisplay.text().renderFromInt18(cdcX18);
Assertions.assertEquals(resX18, resX06); Assertions.assertEquals(resX18, resX06);

View file

@ -41,23 +41,24 @@ import org.x4o.fc18.cake2.zero33.dec1.FCDotDEC2701DashPX0;
public class LexerNCRTest { public class LexerNCRTest {
@Test @Test
public void testNCRMagicSparkler() throws Exception { public void testNCRSmokeSignals() throws Exception {
TestFireWalker fireWalker = new TestFireWalker(); TestSmokeReader smokeReader = new TestSmokeReader();
FourCornerZionStenoLexer lexer = new FourCornerZionStenoLexer(new FourCornerZion7Candlelier.Adapter() {}, true); FourCornerZionStenoLexer lexer = new FourCornerZionStenoLexer(new FourCornerZion7Candlelier.Adapter() {}, true);
lexer.withFireSignals(fireWalker); lexer.withSmokeSignals(smokeReader);
List<Integer> cdc = new ArrayList<>(); List<Integer> cdc = new ArrayList<>();
cdc.add(FourCornerDotCake.FC_NCR1632_DEN.getStart() + (512*3) + 1); /// auto NXX_001 cdc.add(FourCornerDotCake.FC_NCR1632_DEN.getStart() + (512*3) + 1); /// auto NXX_001
Assertions.assertEquals(0, fireWalker.ncr1632BankSparkler); Assertions.assertEquals(0, smokeReader.pipeSmokeClouds);
lexer.read(cdc); lexer.read(cdc);
Assertions.assertEquals(1, fireWalker.ncr1632BankSparkler); Assertions.assertEquals(1, smokeReader.pipeSmokeClouds);
Assertions.assertEquals("burnNCR1632MissingBankSparkler", smokeReader.pipeError);
cdc.addAll(FCDotDEC2701DashPX0.ESC_STOP.baklavaPointSequence()); // the print above auto value + next test cdc.addAll(FCDotDEC2701DashPX0.ESC_STOP.baklavaPointSequence()); // the print above auto value + next test
cdc.add(FourCornerDotCake.FC_NCR1632_NUM.getStart() - 1 + 123); // normal NXX_123 cdc.add(FourCornerDotCake.FC_NCR1632_NUM.getStart() - 1 + 123); // normal NXX_123
cdc.add(FourCornerDotCake.FC_NCR1632_NUM.getStart() + (512*4) + 2); /// auto NXX_123 + this cdc.add(FourCornerDotCake.FC_NCR1632_NUM.getStart() + (512*4) + 2); /// auto NXX_123 + this
fireWalker.reset(); smokeReader.reset();
lexer.read(cdc); lexer.read(cdc);
Assertions.assertEquals(2, fireWalker.ncr1632BankSparkler); Assertions.assertEquals(2, smokeReader.pipeSmokeClouds);
cdc.addAll(FCDotDEC2701DashPX0.ESC_STOP.cakePointSequence()); // the print above auto value + next test (normal bank reset) cdc.addAll(FCDotDEC2701DashPX0.ESC_STOP.cakePointSequence()); // the print above auto value + next test (normal bank reset)
cdc.add(FourCornerDotCake.FC_NCR1632_DEN.getStart() - 1 + 11); cdc.add(FourCornerDotCake.FC_NCR1632_DEN.getStart() - 1 + 11);
@ -68,9 +69,9 @@ public class LexerNCRTest {
cdc.add(FourCornerDotCake.FC_NCR1632_NUM.getStop()); cdc.add(FourCornerDotCake.FC_NCR1632_NUM.getStop());
cdc.add(FourCornerDotCake.FC_NCR1632_NUM.getStop()); // embedded bank reset cdc.add(FourCornerDotCake.FC_NCR1632_NUM.getStop()); // embedded bank reset
cdc.add(FourCornerDotCake.FC_NCR1632_NUM.getStart() - 1 + 123); // normal NXX_123 cdc.add(FourCornerDotCake.FC_NCR1632_NUM.getStart() - 1 + 123); // normal NXX_123
fireWalker.reset(); smokeReader.reset();
lexer.read(cdc); lexer.read(cdc);
String res = "¹/₁₃₄₂₁₇₇₂₉¹²³/₁¹³⁷⁴³⁸⁹⁵³⁴⁷³/₁⁴⁹³⁴⁷⁴⁵⁶²⁴⁴¹²¹⁷/₁₆₁₀₆₁₂₇₄₇²⁴⁶⁸⁴⁷³³⁴²⁸²⁷²⁷³⁷⁶⁷⁶⁷⁴¹⁵⁶⁰²⁰³³²⁸⁰⁶⁹¹⁶¹⁷⁰⁹³⁹⁸³¹⁸⁴⁹⁹⁸⁵³⁵⁵³⁹²³⁰⁹⁰¹⁶⁸⁶⁴⁶⁵⁷⁸⁵²¹³⁷⁴⁵⁶⁷²¹¹⁷²⁴⁹³⁷⁶⁸⁴⁰⁴²⁰³⁰⁴⁶⁶⁷³⁵²³⁶³⁴⁷⁴⁰¹²²⁰¹⁵⁶⁷²⁰⁴¹⁹⁴³⁹⁹⁴⁷⁴¹²⁰⁸³⁶⁵¹⁰⁵⁷⁸²⁹¹⁵¹⁷⁷⁰⁹⁷⁸²⁸²³⁰¹⁹⁶⁴⁹⁵⁴⁶⁸⁴⁶³³¹/₁"; String res = "[0:1:burnNCR1632MissingBankSparkler]¹²³/₁₃₄₂₁₇₇₂₉[0:8:burnNCR1632MissingBankSparkler]⁴⁹³⁴⁷⁴⁵⁶²⁴⁴¹²¹⁷/₁₆₁₀₆₁₂₇₄₇²⁴⁶⁸⁴⁷³³⁴²⁸²⁷²⁷³⁷⁶⁷⁶⁷⁴¹⁵⁶⁰²⁰³³²⁸⁰⁶⁹¹⁶¹⁷⁰⁹³⁹⁸³¹⁸⁴⁹⁹⁸⁵³⁵⁵³⁹²³⁰⁹⁰¹⁶⁸⁶⁴⁶⁵⁷⁸⁵²¹³⁷⁴⁵⁶⁷²¹¹⁷²⁴⁹³⁷⁶⁸⁴⁰⁴²⁰³⁰⁴⁶⁶⁷³⁵²³⁶³⁴⁷⁴⁰¹²²⁰¹⁵⁶⁷²⁰⁴¹⁹⁴³⁹⁹⁴⁷⁴¹²⁰⁸³⁶⁵¹⁰⁵⁷⁸²⁹¹⁵¹⁷⁷⁰⁹⁷⁸²⁸²³⁰¹⁹⁶⁴⁹⁵⁴⁶⁸⁴⁶³³¹/₁";
Assertions.assertEquals(res, FourCornerUnicodeDisplay.text().renderFromInt18(cdc)); Assertions.assertEquals(res, FourCornerUnicodeDisplay.text().renderFromInt18(cdc));
} }

View file

@ -34,7 +34,6 @@ public class TestFireWalker implements FourCornerZionStenoLexerFire.Adapter {
int scanBlockStart; int scanBlockStart;
int scanBlockStop; int scanBlockStop;
int scanMatchPoint; int scanMatchPoint;
int ncr1632BankSparkler;
public TestFireWalker() { public TestFireWalker() {
reset(); reset();
@ -45,7 +44,6 @@ public class TestFireWalker implements FourCornerZionStenoLexerFire.Adapter {
scanBlockStart = 0; scanBlockStart = 0;
scanMatchPoint = 0; scanMatchPoint = 0;
scanMatchPoint = 0; scanMatchPoint = 0;
ncr1632BankSparkler = 0;
} }
@Override @Override
@ -59,11 +57,4 @@ public class TestFireWalker implements FourCornerZionStenoLexerFire.Adapter {
scanBlockStop = blockStop; scanBlockStop = blockStop;
scanMatchPoint = matchPoint; scanMatchPoint = matchPoint;
} }
@Override
public void fireStateNCR1632BankSparkler(boolean magic) {
if (magic) {
ncr1632BankSparkler++;
}
}
} }