diff --git a/compiler/res/prog8lib/prog8lib.asm b/compiler/res/prog8lib/prog8lib.asm index dbd2d98aa..d8ec27be1 100644 --- a/compiler/res/prog8lib/prog8lib.asm +++ b/compiler/res/prog8lib/prog8lib.asm @@ -1976,7 +1976,7 @@ ror2_array_uw .proc strcpy .proc - ; copy a string (0-terminated) from A/Y to (ZPWORD1) + ; copy a string (must be 0-terminated) from A/Y to (P8ZP_SCRATCH_W1) ; it is assumed the target string is large enough. sta P8ZP_SCRATCH_W2 sty P8ZP_SCRATCH_W2+1 diff --git a/compiler/src/prog8/compiler/Main.kt b/compiler/src/prog8/compiler/Main.kt index 4913b1364..99b7a6613 100644 --- a/compiler/src/prog8/compiler/Main.kt +++ b/compiler/src/prog8/compiler/Main.kt @@ -56,7 +56,7 @@ fun compileProgram(filepath: Path, optimizeAst(programAst, errors) postprocessAst(programAst, errors, compilationOptions) - // printAst(programAst) + printAst(programAst) // TODO if(writeAssembly) programName = writeAssembly(programAst, errors, outputDir, optimize, compilationOptions) @@ -219,7 +219,7 @@ private fun writeAssembly(programAst: Program, errors: ErrorReporter, outputDir: programAst.processAstBeforeAsmGeneration(errors) errors.handle() - // printAst(programAst) + printAst(programAst) // TODO CompilationTarget.instance.machine.initializeZeropage(compilerOptions) val assembly = CompilationTarget.instance.asmGenerator( diff --git a/examples/test.p8 b/examples/test.p8 index 8380f1fd7..0d075d9d3 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,43 +1,20 @@ %import textio %import syslib -%import floats %zeropage basicsafe main { - struct Color { - ubyte red - ubyte green - ubyte blue - } - - Color c1 = [11,22,33] - Color c2 = [11,22,33] - Color c3 = [11,22,33] - uword[] colors = [ c1, c2, c3] - - + str planet_name = "12345678" sub start() { - str s1 = "a\nb\nc\nd\n" - str s2 = "a\rb\rc\rd\n" - - txt.print(s2) - txt.print(s2) - - ubyte cc - for cc in s1 { - txt.print_ubhex(cc, false) - txt.chrout(' ') - } - txt.chrout('\n') - for cc in s2 { - txt.print_ubhex(cc, false) - txt.chrout(' ') - } + txt.print(planet_name) txt.chrout('\n') + planet_name = "saturn" ; TODO make strcpy() actually work it now sets the address in the first two bytes... + + txt.print(planet_name) + txt.chrout('\n') } asmsub testX() { @@ -54,7 +31,6 @@ main { _saveX .byte 0 }} } - } diff --git a/examples/textelite.p8 b/examples/textelite.p8 new file mode 100644 index 000000000..11dcf26ed --- /dev/null +++ b/examples/textelite.p8 @@ -0,0 +1,211 @@ +%import textio +%zeropage basicsafe + + +main { + sub start() { + + txt.lowercase() + + ; uword ww = goatsoup.getword($a3, 2) + + goatsoup.set_seed($2211, $f19e) + + goatsoup.planet_name = "saturn" ; TODO make strcpy() actually work it now sets the address in the first two bytes... + goatsoup.print_soup() + txt.chrout('\n') + + repeat 20 { + uword name = goatsoup.random_name() ; TODO : make str name=... work + txt.print(name) ; TODO: make print(random_name()) work + txt.chrout(' ') + } + } + + asmsub testX() { + %asm {{ + stx _saveX + lda #13 + jsr txt.chrout + lda _saveX + jsr txt.print_ub + lda #13 + jsr txt.chrout + ldx _saveX + rts +_saveX .byte 0 + }} + } + +} + +goatsoup { + %option force_output + + str[] words81 = ["fabled", "notable", "well known", "famous", "noted"] + str[] words82 = ["very", "mildly", "most", "reasonably", ""] + str[] words83 = ["ancient", "\x95", "great", "vast", "pink"] + str[] words84 = ["\x9E \x9D plantations", "mountains", "\x9C", "\x94 forests", "oceans"] + str[] words85 = ["shyness", "silliness", "mating traditions", "loathing of \x86", "love for \x86"] + str[] words86 = ["food blenders", "tourists", "poetry", "discos", "\x8E"] + str[] words87 = ["talking tree", "crab", "bat", "lobst", "\xB2"] + str[] words88 = ["beset", "plagued", "ravaged", "cursed", "scourged"] + str[] words89 = ["\x96 civil war", "\x9B \x98 \x99s", "a \x9B disease", "\x96 earthquakes", "\x96 solar activity"] + str[] words8A = ["its \x83 \x84", "the \xB1 \x98 \x99","its inhabitants' \x9A \x85", "\xA1", "its \x8D \x8E"] + str[] words8B = ["juice", "brandy", "water", "brew", "gargle blasters"] + str[] words8C = ["\xB2", "\xB1 \x99", "\xB1 \xB2", "\xB1 \x9B", "\x9B \xB2"] + str[] words8D = ["fabulous", "exotic", "hoopy", "unusual", "exciting"] + str[] words8E = ["cuisine", "night life", "casinos", "sit coms", " \xA1 "] + str[] words8F = ["\xB0", "The planet \xB0", "The world \xB0", "This planet", "This world"] + str[] words90 = ["n unremarkable", " boring", " dull", " tedious", " revolting"] + str[] words91 = ["planet", "world", "place", "little planet", "dump"] + str[] words92 = ["wasp", "moth", "grub", "ant", "\xB2"] + str[] words93 = ["poet", "arts graduate", "yak", "snail", "slug"] + str[] words94 = ["tropical", "dense", "rain", "impenetrable", "exuberant"] + str[] words95 = ["funny", "wierd", "unusual", "strange", "peculiar"] + str[] words96 = ["frequent", "occasional", "unpredictable", "dreadful", "deadly"] + str[] words97 = ["\x82 \x81 for \x8A", "\x82 \x81 for \x8A and \x8A", "\x88 by \x89", "\x82 \x81 for \x8A but \x88 by \x89","a\x90 \x91"] + str[] words98 = ["\x9B", "mountain", "edible", "tree", "spotted"] + str[] words99 = ["\x9F", "\xA0", "\x87oid", "\x93", "\x92"] + str[] words9A = ["ancient", "exceptional", "eccentric", "ingrained", "\x95"] + str[] words9B = ["killer", "deadly", "evil", "lethal", "vicious"] + str[] words9C = ["parking meters", "dust clouds", "ice bergs", "rock formations", "volcanoes"] + str[] words9D = ["plant", "tulip", "banana", "corn", "\xB2weed"] + str[] words9E = ["\xB2", "\xB1 \xB2", "\xB1 \x9B", "inhabitant", "\xB1 \xB2"] + str[] words9F = ["shrew", "beast", "bison", "snake", "wolf"] + str[] wordsA0 = ["leopard", "cat", "monkey", "goat", "fish"] + str[] wordsA1 = ["\x8C \x8B", "\xB1 \x9F \xA2","its \x8D \xA0 \xA2", "\xA3 \xA4", "\x8C \x8B"] + str[] wordsA2 = ["meat", "cutlet", "steak", "burgers", "soup"] + str[] wordsA3 = ["ice", "mud", "Zero-G", "vacuum", "\xB1 ultra"] + str[] wordsA4 = ["hockey", "cricket", "karate", "polo", "tennis"] + + uword[] wordlists = [ + words81, words82, words83, words84, words85, words86, words87, words88, + words89, words8A, words8B, words8C, words8D, words8E, words8F, words90, + words91, words92, words93, words94, words95, words96, words97, words98, + words99, words9A, words9B, words9C, words9D, words9E, words9F, wordsA0, + wordsA1, wordsA2, wordsA3, wordsA4] + + str pairs0 = "abouseitiletstonlonuthnoallexegezacebisousesarmaindirea.eratenbe" + ubyte[4] goatsoup_rnd = [0, 0, 0, 0] + ubyte[4] goatsoup_seed = [0, 0, 0, 0] + + str planet_name = " " ; 8 max + + sub set_seed(uword s1, uword s2) { + goatsoup_seed[0] = lsb(s1) + goatsoup_seed[1] = msb(s1) + goatsoup_seed[2] = lsb(s2) + goatsoup_seed[3] = msb(s2) + reset_rnd() + } + + sub reset_rnd() { + goatsoup_rnd[0] = goatsoup_seed[0] + goatsoup_rnd[1] = goatsoup_seed[1] + goatsoup_rnd[2] = goatsoup_seed[2] + goatsoup_rnd[3] = goatsoup_seed[3] + } + + sub random_name() -> str { + ubyte ii + str name = " " ; 8 chars max + ubyte nx = 0 + for ii in 0 to gen_rnd_number() & 3 { + ubyte x = gen_rnd_number() & $3e + if pairs0[x] != '.' { + name[nx] = pairs0[x] + nx++ + } + if pairs0[x+1] != '.' { + name[nx] = pairs0[x+1] + nx++ + } + } + name[nx] = 0 + name[0] |= 32 ; uppercase first letter + return name + } + + sub gen_rnd_number() -> ubyte { + ubyte x = goatsoup_rnd[0] * 2 + uword a = x as uword + goatsoup_rnd[2] + if goatsoup_rnd[0] > 127 + a ++ + goatsoup_rnd[0] = lsb(a) + goatsoup_rnd[2] = x + x = goatsoup_rnd[1] + ubyte ac = x + goatsoup_rnd[3] + msb(a) + goatsoup_rnd[1] = ac + goatsoup_rnd[3] = x + return ac + } + + sub print_soup() { + ; str source = "\x8F is \x97." + str source = "derp \xb0 \xb1 \xb2 \xb2 xxxx \x8F is \x97." + + reset_rnd() + ubyte c + for c in source { + if c == $00 + break + else if c <= $80 + txt.chrout(c) + else { + if c <= $a4 { + ubyte rnr = gen_rnd_number() + ; TODO recursive call... + ; soup(self.desc_list[ord(c) - 0x81][(rnr >= 0x33) + (rnr >= 0x66) + (rnr >= 0x99) + (rnr >= 0xCC)]) + } else { + if c == $b0 { + txt.print("!!PLANETNAME!!:") + txt.print(planet_name) ; TODO uppercase first char? + } + else if c == $b1 { + ; planet name + ian TODO capitalize first name letter? + txt.print(planet_name) + txt.print("ian") +; name = self.name.title() +; result += name[0] +; for nn in name[1:]: +; if nn in ('e', 'i', '\0'): +; break +; result += nn +; result += "ian" + } + else if c == $b2 { + ; txt.print(random_name()) TODO make this work + uword name = goatsoup.random_name() + txt.print(name) + } + ; else BAD CHAR DATA + } + } + } + } + + asmsub getword(ubyte list @A, ubyte wordidx @Y) -> str @AY { + %asm {{ + sty P8ZP_SCRATCH_REG + sec + sbc #$81 + asl a + tay + lda wordlists,y + sta P8ZP_SCRATCH_W1 + lda wordlists+1,y + sta P8ZP_SCRATCH_W1+1 + lda P8ZP_SCRATCH_REG + asl a + tay + lda (P8ZP_SCRATCH_W1),y + pha + iny + lda (P8ZP_SCRATCH_W1),y + tay + pla + rts + }} + } +}