diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9955f60 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +/build/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..804adc8 --- /dev/null +++ b/Makefile @@ -0,0 +1,37 @@ +# +# Million Perfect Letters makefile +# assembles source code, optionally builds a disk image and mounts it +# +# original by Quinn Dunki on 2014-08-15 +# One Girl, One Laptop Productions +# http://www.quinndunki.com/blondihacks +# +# adapted by 4am on 2020-04-16 +# + +# third-party tools required to build + +# https://sourceforge.net/projects/acme-crossass/ +ACME=acme + +# https://www.brutaldeluxe.fr/products/crossdevtools/cadius/ +# https://github.com/sicklittlemonkey/cadius +# version 1.4.0 or later +CADIUS=cadius + +BUILDDISK=build/million + +asm: + mkdir -p build + $(ACME) -r build/million.lst src/million.a 2>build/log + cp res/work.po "$(BUILDDISK)".po >build/log + cp res/_FileInformation.txt build/ >build/log + $(CADIUS) ADDFILE "${BUILDDISK}".po "/MILLION/" "build/MILLION.SYSTEM" >build/log + +clean: + rm -rf build/ + +mount: + open "$(BUILDDISK)".po + +all: clean asm mount diff --git a/res/Courier Double Prime/courier-prime-specimen.png b/res/Courier Double Prime/courier-prime-specimen.png new file mode 100644 index 0000000..da1b883 Binary files /dev/null and b/res/Courier Double Prime/courier-prime-specimen.png differ diff --git a/res/Courier Double Prime/courier-prime-specimen.xcf b/res/Courier Double Prime/courier-prime-specimen.xcf new file mode 100644 index 0000000..b542b46 Binary files /dev/null and b/res/Courier Double Prime/courier-prime-specimen.xcf differ diff --git a/res/Courier Double Prime/font.py b/res/Courier Double Prime/font.py new file mode 100755 index 0000000..174e977 --- /dev/null +++ b/res/Courier Double Prime/font.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +def myhex(bitstring): + return hex(int(bitstring, 2))[2:].rjust(2, "0").upper() + +leftdata = [ [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [] ] +rightdata = [ [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [] ] +with open("font.txt", "r") as f: + for c in 'ABCDEFGHJIKLMNOPQRSTUVWXYZ': + #print(c) + for row in range(16): + left = f.read(7) + right = f.read(7) + f.readline() + left = "0b1" + left[::-1] + right = "0b1" + right[::-1] + #print(myhex(left), myhex(right)) + leftdata[row].append(myhex(left)) + rightdata[row].append(myhex(right)) +print("; This file is automatically generated") +for row in range(16): + print("LeftFontRow%s" % row) + for c, i in zip(leftdata[row], range(len(leftdata[row]))): + print(" !byte $%s ; %s" % (c, chr(i+65))) +for row in range(16): + print("RightFontRow%s" % row) + for c, i in zip(rightdata[row], range(len(rightdata[row]))): + print(" !byte $%s ; %s" % (c, chr(i+65))) diff --git a/res/Courier Double Prime/font.txt b/res/Courier Double Prime/font.txt new file mode 100644 index 0000000..a651187 --- /dev/null +++ b/res/Courier Double Prime/font.txt @@ -0,0 +1,416 @@ +00000000000000 +00111111100000 +00111111110000 +00111111110000 +00001111110000 +00001110111000 +00001100111000 +00011100111000 +00011111111100 +00011111111100 +00111111111100 +00111000001110 +11111100111111 +11111100111111 +11111100111111 +00000000000000 +00000000000000 +01111111110000 +01111111111000 +01111111111100 +00011100011100 +00011100011100 +00011111111000 +00011111111000 +00011111111100 +00011100001110 +00011100001110 +00011100001110 +01111111111110 +01111111111100 +01111111111000 +00000000000000 +00000000000000 +00000111101110 +00011111111110 +00111111111110 +00111100011110 +01111000001110 +01110000001110 +01110000000000 +01110000000000 +01110000000000 +01111000000000 +00111100001110 +00111111111110 +00011111111110 +00000111111000 +00000000000000 +00000000000000 +01111111110000 +01111111111100 +01111111111110 +00011100011110 +00011100001111 +00011100000111 +00011100000111 +00011100000111 +00011100000111 +00011100001111 +00011100011110 +01111111111110 +01111111111100 +01111111110000 +00000000000000 +00000000000000 +01111111111110 +01111111111110 +01111111111110 +00011100001110 +00011100000000 +00011111100000 +00011111110000 +00011111100000 +00011100001110 +00011100001110 +00011100001110 +01111111111110 +01111111111110 +01111111111110 +00000000000000 +00000000000000 +01111111111110 +01111111111110 +01111111111110 +00011100001110 +00011100000000 +00011100000000 +00011111110000 +00011111110000 +00011111110000 +00011100000000 +00011100000000 +01111111100000 +01111111100000 +01111111100000 +00000000000000 +00000000000000 +00000111101110 +00011111111110 +00111111111110 +00111100011110 +01111000001110 +01110000001110 +01110000000000 +01110001111111 +01110001111111 +01111001111111 +00111100001110 +00111111111110 +00011111111110 +00000111111000 +00000000000000 +00000000000000 +01111100111110 +01111100111110 +01111100111110 +00111000011100 +00111000011100 +00111111111100 +00111111111100 +00111111111100 +00111000011100 +00111000011100 +00111000011100 +01111100111110 +01111100111110 +01111100111110 +00000000000000 +00000000000000 +00111111111000 +01111111111100 +00111111111000 +00000111000000 +00000111000000 +00000111000000 +00000111000000 +00000111000000 +00000111000000 +00000111000000 +00000111000000 +01111111111100 +01111111111100 +01111111111100 +00000000000000 +00000000000000 +00001111111111 +00001111111111 +00001111111111 +00000000111000 +00000000111000 +00000000111000 +00000000111000 +01110000111000 +01110000111000 +01110000111000 +01111001111000 +01111111111000 +00111111110000 +00011111100000 +00000000000000 +00000000000000 +01111110111110 +01111110111111 +01111110111111 +00011100011100 +00011100111000 +00011101110000 +00011111100000 +00011111111000 +00011111111000 +00011100011100 +00011100011100 +01111111001111 +01111111001111 +01111111000111 +00000000000000 +00000000000000 +01111111100000 +01111111100000 +01111111100000 +00011100000000 +00011100000000 +00011100000000 +00011100000100 +00011100001110 +00011100001110 +00011100001110 +00011100001110 +01111111111110 +01111111111110 +01111111111110 +00000000000000 +00000000000000 +01111000001111 +01111100011111 +01111100011111 +00111110111110 +00111110111110 +00111110111110 +00111011101110 +00111011101110 +00111011101110 +00111001001110 +00111000001110 +01111110111111 +01111110111111 +01111110111111 +00000000000000 +00000000000000 +01111000111110 +01111100111110 +00111110011100 +00111110011100 +00111110011100 +00111011011100 +00111011011100 +00111001111100 +00111001111100 +00111000111100 +00111000111100 +01111100011100 +01111100011100 +01111100001100 +00000000000000 +00000000000000 +00000111110000 +00011111111100 +00111111111110 +00111100011110 +01111000001111 +01110000000111 +01110000000111 +01110000000111 +01110000000111 +01111000001111 +00111000011110 +00111111111110 +00011111111100 +00000111110000 +00000000000000 +00000000000000 +01111111110000 +01111111111100 +01111111111100 +00011100011110 +00011100001110 +00011100001110 +00011100011110 +00011111111110 +00011111111100 +00011111110000 +00011100000000 +01111111100000 +01111111100000 +01111111100000 +00000000000000 +00001111110000 +00011111111000 +00111111111100 +00111000011100 +01110000001110 +01110000001110 +01110000001110 +01110000001110 +00111000011100 +00111111111100 +00011111111000 +00000111110000 +00001100000100 +00011111111110 +00111111111110 +00111111111100 +00000000000000 +01111111111000 +01111111111100 +01111111111110 +00011100011110 +00011100001110 +00011100001110 +00011111111100 +00011111111000 +00011111111000 +00011100111100 +00011100011110 +01111111011111 +01111111001111 +01111111000111 +00000000000000 +00000000000000 +00001111011000 +00011111111000 +00111111111000 +00111000011000 +00111000000000 +00111100000000 +00011111110000 +00000111111000 +00000000111100 +00110000011100 +00111000011100 +00111111111100 +00111111111000 +00111011110000 +00000000000000 +00000000000000 +01111111111110 +01111111111110 +01111111111110 +01110011101110 +01110011101110 +01110011101110 +01110011101110 +00000011100000 +00000011100000 +00000011100000 +00000011100000 +00011111111100 +00011111111100 +00011111111100 +00000000000000 +00000000000000 +01111100111110 +01111100111110 +01111100111110 +00111000011100 +00111000011100 +00111000011100 +00111000011100 +00111000011100 +00111000011100 +00111000011100 +00111100111100 +00111111111100 +00011111111000 +00001111110000 +00000000000000 +00000000000000 +11111100111111 +11111100111111 +11111100111111 +00111000001110 +00111000011100 +00011100011100 +00011100111100 +00011100111000 +00001110111000 +00001111110000 +00000111110000 +00000111100000 +00000111100000 +00000011100000 +00000000000000 +00000000000000 +11111100011111 +11111100011111 +11111100011111 +01110000000111 +00110001000110 +00110011100110 +00110011100110 +00110111110110 +00110110110110 +00111110111110 +00111100111110 +00111100011110 +00111100011100 +00011000011100 +00000000000000 +00000000000000 +01111110111111 +01111110111111 +01111110111111 +00011100011100 +00001110111000 +00001111110000 +00000111100000 +00000111110000 +00001111110000 +00011100111000 +00111000011100 +11111100111111 +11111100111111 +11111100111111 +00000000000000 +00000000000000 +11111100111111 +11111100111111 +11111100111111 +00111000011100 +00011100111100 +00001111111000 +00001111110000 +00000111110000 +00000011100000 +00000011100000 +00000011100000 +00011111111100 +00011111111100 +00011111111100 +00000000000000 +00000000000000 +00111111111100 +00111111111100 +00111111111000 +00111000111000 +00111000110000 +00111001100000 +00000011000000 +00000110000000 +00000110011100 +00001100011100 +00011000011100 +00111111111100 +00111111111100 +00111111111100 +00000000000000 diff --git a/res/_FileInformation.txt b/res/_FileInformation.txt new file mode 100644 index 0000000..1673bc0 --- /dev/null +++ b/res/_FileInformation.txt @@ -0,0 +1 @@ +MILLION.SYSTEM=Type(FF),AuxType(2000),Access(C3) diff --git a/res/levels/A b/res/levels/A new file mode 100644 index 0000000..ded0b46 --- /dev/null +++ b/res/levels/A @@ -0,0 +1,130 @@ +# 4x3, easy +ARUH +WLCM +BHOR + +ARCH +BLUR +WHOM +-- +UPUG +THGE +WAON + +THUG +UPON +WAGE +-- +SGOY +AANT +ZHES + +AGES +SHOT +ZANY +-- +EARY +RECB +HPIC + +EPIC +HERB +RACY +-- +NSVB +BAMR +UOEY + +BOMB +NAVY +USER +-- +GVAE +ESIR +IELL + +EVIL +GEAR +ISLE +-- +IIAA +CDEL +DASE + +CASE +DIAL +IDEA +-- +IECF +RHET +WTAH + +ITCH +REEF +WHAT +-- +SOLA +EIAM +VXSO + +EXAM +SOLO +VISA +-- +TLGE +UROM +SERP + +SLOP +TERM +URGE +-- +CNFP +SDIF +EUGY + +CUFF +EDGY +SNIP +-- +IYTN +SUOC +CCNE + +CUTE +ICON +SYNC +-- +RYDE +EHIS +CIEC + +CHIC +EYES +RIDE +-- +PRCX +LYLS +AONO + +ARCS +LYNX +POLO +-- +LARR +SVEY +OPMB + +LAMB +OVER +SPRY +-- +BEOK +ASRS +JRPW + +ASPS +BROW +JERK +-- +[eof] diff --git a/res/levels/B b/res/levels/B new file mode 100644 index 0000000..1cf8387 --- /dev/null +++ b/res/levels/B @@ -0,0 +1,130 @@ +# 5x3, easy +KUADL +FREEY +GNNNE + +FUNNY +GRADE +KNEEL +-- +EIAIS +MRJEY +GNLON + +ENJOY +GRAIN +MILES +-- +SACDY +LUOES +MTDMP + +LACES +MUDDY +STOMP +-- +RHUCY +TEEMT +ELPAP + +ELECT +REPAY +THUMP +-- +RALLH +STDIO +MUYCE + +MULCH +RADIO +STYLE +-- +MIELD +BOMMY +WUAST + +BOAST +MUMMY +WIELD +-- +SOUNG +YSSAS +EHOWY + +ESSAY +SHOWS +YOUNG +-- +MOBND +HLVUA +AYEEM + +ALBUM +HYENA +MOVED +-- +CITTH +SNUED +AONUL + +ANNUL +CITED +SOUTH +-- +AEAER +NINDE +FBESY + +ABASE +FINER +NEEDY +-- +OBIRK +QPBNT +AUEOS + +ABBOT +OPENS +QUIRK +-- +AUSLW +BEGEE +RRNON + +ARSON +BUGLE +RENEW +-- +THDED +FEIGH +CUNKY + +CEDED +FUNKY +THIGH +-- +FRADY +RECHE +NIILL + +FRILL +NICHE +READY +-- +OPUDN +ATTCK +SUROO + +APRON +OUTDO +STUCK +-- +NECNG +UNXUE +WROLS + +NEXUS +UNCLE +WRONG +-- +[eof] diff --git a/res/levels/C b/res/levels/C new file mode 100644 index 0000000..293c456 --- /dev/null +++ b/res/levels/C @@ -0,0 +1,130 @@ +# 6x3, easy +OBPGIR +LAJEET +NONKCN + +LONGER +NAPKIN +OBJECT +-- +BUTIEE +PNODPD +URNMLT + +BUNDLE +PROMPT +UNTIED +-- +TSUPTT +FAIOOD +ERCLRY + +ESCORT +FAULTY +TRIPOD +-- +JIEEGD +CVLTRE +AAVNEN + +AVENGE +CAVERN +JILTED +-- +EIAZER +SSCROS +PLMMAW + +ESCROW +PLAZAS +SIMMER +-- +MUFDUY +DPSEAR +SEIREM + +DEFRAY +MUSEUM +SPIDER +-- +PPIAEA +SNSNYS +IAPURE + +INSURE +PAPAYA +SPINES +-- +CICAIC +POBRTS +ORNNAE + +COBRAS +ORNATE +PICNIC +-- +NBBLTD +EEURON +AYEOIS + +ABBOTS +EYELID +NEURON +-- +TIPTLE +REROAT +VULLRS + +REPORT +TURTLE +VILLAS +-- +WATCHL +UNCGOY +PEDOES + +PATCHY +UNCOOL +WEDGES +-- +DAPOFF +FULEOD +CETCNN + +CUTOFF +DEPEND +FALCON +-- +ORGTOY +WOAUSR +LICGLT + +LOCUST +ORATOR +WIGGLY +-- +ZETTTD +FANIEH +CLOWLE + +CATTLE +FLOWED +ZENITH +-- +PLAIET +CURKVO +STCNOE + +CUCKOO +PLANET +STRIVE +-- +OONOIR +MUTTOS +REBBTD + +MENTOR +OUTBID +ROBOTS +-- +[eof] diff --git a/res/levels/D b/res/levels/D new file mode 100644 index 0000000..f3d56a5 --- /dev/null +++ b/res/levels/D @@ -0,0 +1,130 @@ +# 7x3, easy +PRTFELE +MHERINS +SIOTBET + +MITTENS +PROFILE +SHERBET +-- +ELSNTNG +DSOTIRS +CITAOET + +CLONING +DISTORT +ESTATES +-- +CUNVERE +DOCTATD +GIESSET + +CONVERT +DICTATE +GUESSED +-- +GSAISRE +AUSFTED +SLNTITS + +ASSISTS +GUNFIRE +SLATTED +-- +CAPLICG +SLOAKED +PREFENT + +CLOAKED +PREFECT +SAPLING +-- +UNECEEY +BRSVITN +DIDATRD + +BREVITY +DISCERN +UNDATED +-- +ASEVTIS +SMARATL +PRSERLY + +ASSERTS +PREVAIL +SMARTLY +-- +BHAVDEY +ANNUITO +SRUDADR + +ANNUITY +BRAVADO +SHUDDER +-- +AQVGRNC +COUEIUP +BEGATIG + +AQUATIC +BEGGING +COVERUP +-- +HIATFUD +PUSPHNR +SETIEEL + +HEATHER +PITIFUL +SUSPEND +-- +KIASOEP +SHNTHIS +PERITDR + +KINSHIP +PERIODS +SHATTER +-- +VRTFPEA +CIAATID +TELERAN + +CRAFTED +TILAPIA +VETERAN +-- +HEGIAAO +MVRDCRL +AAOCEDS + +AVOCADO +HERDERS +MAGICAL +-- +TAIPASE +AEUTLIT +MGMDETN + +AGITATE +MAUDLIN +TEMPEST +-- +GPLLERC +DYARMAN +SANATIY + +DYNAMIC +GALLERY +SPARTAN +-- +DEAUUEL +STCLNSH +MOLIBCK + +DECIBEL +MOLLUSK +STAUNCH +-- +[eof] diff --git a/res/levels/E b/res/levels/E new file mode 100644 index 0000000..4fcea4b --- /dev/null +++ b/res/levels/E @@ -0,0 +1,179 @@ +# 4x4, intermediate +# Try to find the optimal solution +IOLA +ALOO +DEEI +HDSK + +ALSO +DELI +HOOK +IDEA +DESK +-- +RNDO +UANK +HVER +OIGH + +HIGH +OVER +RANK +UNDO +RINK +-- +UDOR +ONEM +HUTO +THNG + +HUNG +ODOR +THEM +UNTO +ONTO +-- +MATI +OILP +PREO +TNXK + +MILK +ONTO +PREP +TAXI +TALK +-- +CULP +EDAK +LEGM +FANY + +CALM +EDGY +FUNK +LEAP +LEAK +-- +OMIK +IODM +JUET +BTNY + +BODY +ITEM +JUNK +OMIT +BUNK +-- +WHNR +AVEM +CCOE +ELIT + +ACNE +CLOT +EVER +WHIM +WHOM +-- +TARY +VIIW +EHAC +KPND + +EPIC +KIND +THAW +VARY +TINY +-- +ODGW +SNLE +ELTY +MYEH + +EDGE +MYTH +ONLY +SLEW +EDGY +-- +EHOS +PIIE +MLCT +CNDC + +CHIC +ENDS +MICE +PLOT +CLOT +-- +AIUC +DCMD +SRSN +IPEY + +ARMY +DISC +ICED +SPUN +DIED +-- +OOHS +ECDE +NWLO +TUFU + +ECHO +NUDE +OWLS +TOFU +NODE +-- +BILY +GUOW +AACD +PNET + +ANEW +BUOY +GILD +PACT +BALD +-- +AVZN +OBEZ +MYLY +BUTH + +ABLY +BUZZ +MYTH +OVEN +OBEY +-- +POHN +NCUS +HEEO +ERMY + +ECHO +HEMS +NOUN +PREY +PEES +-- +ZUAW +MRTO +DERA +TYNH + +DRAW +MYTH +TUNA +ZERO +META +-- +[eof] diff --git a/res/levels/F b/res/levels/F new file mode 100644 index 0000000..6ba5cba --- /dev/null +++ b/res/levels/F @@ -0,0 +1,179 @@ +# 5x4, intermediate +# Try to find the optimal solution +GTRIL +SIIRY +VVENS +ERNYP + +EVERY +GRINS +STRIP +VINYL +STIRS +-- +RILIT +CUIEA +DGBNG +AOGRR + +AGING +COBRA +DIGIT +RULER +DOING +-- +MXTCK +KNYRR +CAIOA +ELAMB + +CLIMB +EXTRA +KNACK +MAYOR +CLICK +-- +ABIOO +OADTT +DLOSY +PHBER + +ABBOT +DAISY +OLDER +PHOTO +ABBEY +-- +AOUON +GYAZH +NATCE +LMLRD + +AMAZE +GOURD +LATCH +NYLON +NOTCH +-- +BRUSG +FUZNE +YAAON +EORZY + +BARON +ERASE +FUZZY +YOUNG +BORNE +-- +JAIDP +CUDOS +ILUME +RGLGO + +CLUMP +IGLOO +JUDGE +RAIDS +CALMS +-- +LEIOY +SYRBN +FRLUP +POBDE + +FELON +LOBBY +PRIDE +SYRUP +PYLON +-- +GWRSE +ENOOH +JASER +AUAMD + +AWASH +EASED +GNOME +JUROR +GNASH +-- +LHIFL +DAOVA +CUNUF +GLRKS + +CLIFF +DUNKS +GHOUL +LARVA +LURKS +-- +FNIUK +THRKE +UESOY +PUDNR + +FUROR +PESKY +THINK +UNDUE +PERKY +-- +ILGFD +FURER +HRUOF +SEKAN + +FLUFF +HERON +IRKED +SUGAR +FUROR +-- +ALPPK +WFOUR +BHIOS +VAACL + +AFOUL +BLACK +VAPOR +WHIPS +BLOCK +-- +LBNNT +AYBRO +ZAOUA +MEIGG + +ABOUT +LYING +MANGO +ZEBRA +ABORT +-- +SWNLA +HAGND +MOOUY +RYERE + +HYENA +MANLY +ROGUE +SWORD +SWORE +-- +GNRPN +MLGNR +IOAAE +SUYOH + +GLYPH +INANE +MORON +SUGAR +MORPH +-- +[eof] diff --git a/res/levels/G b/res/levels/G new file mode 100644 index 0000000..1d353a2 --- /dev/null +++ b/res/levels/G @@ -0,0 +1,179 @@ +# 6x4, intermediate +# Try to find the optimal solution +REASAS +ABPOPY +GIQLRB +LRSUOR + +ABSORB +GRASPS +LIQUOR +REPLAY +LESSOR +-- +CADPIE +OOMICY +MRCHAC +RENULD + +COMPLY +MANIAC +ORCHID +REDUCE +MODULE +-- +CXPUME +EILCAN +ROSOIL +BAONSC + +BIONIC +COLUMN +EXPOSE +RASCAL +CASUAL +-- +RNMONS +SLFFIX +FEOIVE +AUANKT + +ANOINT +FLANKS +REMOVE +SUFFIX +REFINE +-- +BCFSLY +SEIITE +AHUOED +CLOERT + +ACUITY +BEFORE +CLOSET +SHIELD +CLOSED +-- +OIRHIN +GOVEBP +DRPSNY +HESIAE + +DIVINE +GOSSIP +HEREBY +ORPHAN +HEREIN +-- +IXRODS +BAAKRT +ETHLID +PLEAEC + +BARKED +EXHORT +ITALIC +PLEADS +PARKED +-- +ILEETT +VROCKY +BIFTCS +PNRILE + +BLOCKS +INFECT +PRETTY +VIRILE +BLOCKY +-- +UECIYA +GNPRIC +POLAEE +SATHKT + +GOTHIC +PAPAYA +SECRET +UNLIKE +SACHET +-- +RCRTUD +SEFKNM +PITAOE +BOCUPP + +BOTTOM +PICKUP +REFUND +SCRAPE +RECTUM +-- +EEPHON +CLSORA +SNIGMT +RIAMPS + +CLAMPS +ENIGMA +RESORT +SIPHON +REPORT +-- +VNONKD +IHPTTY +AMUIEE +CETUNT + +ANOINT +CHUNKY +IMPUTE +VETTED +AMOUNT +-- +ELUOWY +MHBLOR +WCITSN +OUTMAS + +ELBOWS +MUTTON +OCULAR +WHIMSY +OUTLAY +-- +TEMKRE +EYEBED +CNTNDS +DRCIAL + +CYMBAL +DECKED +ENTIRE +TRENDS +DECIDE +-- +QADRTO +IOESWT +HUHUCS +MNIADK + +HAIRDO +INDUCT +MOHAWK +QUESTS +HOISTS +-- +EIZNRE +SOQAID +WFFUGY +BEUICN + +BOUNCE +EFFIGY +SEQUIN +WIZARD +BOUNCY +-- +[eof] diff --git a/res/levels/H b/res/levels/H new file mode 100644 index 0000000..28d1f4f --- /dev/null +++ b/res/levels/H @@ -0,0 +1,179 @@ +# 7x4, intermediate +# Try to find the optimal solution +BEUVATE +MAASEIT +SRTNLGN +GOOWIEY + +BETWEEN +GRAVITY +MOONLIT +SAUSAGE +GRANITE +-- +HEGDDSD +THNOEAS +CITURNT +ASEHUER + +ASTOUND +CHEDDAR +HIGHEST +TENURES +TENURED +-- +WNDIRAC +BEUEMEL +EOLNCIS +ADMCOME + +ADMIRAL +BOUNCES +ENDEMIC +WELCOME +ADMIRES +-- +SUUAMES +ULWPTPH +BRIURDE +TPPNOSD + +BLUNTED +SUPPOSE +TRIUMPH +UPWARDS +TRIPODS +-- +SLESVEC +NMAENUL +ETMDTIS +IERIFSE + +ELASTIC +IMMENSE +NEEDFUL +STRIVES +SLEEVES +-- +WPEBARB +RORCILE +AHJRKET +SDUUNCD + +ADJUNCT +RHUBARB +SPECKLE +WORRIED +SPURNED +-- +VEPUORD +HRRITEK +IMSDBNY +AITWILG + +ARTWORK +HERDING +IMPUTED +VISIBLY +VISITED +-- +ILLNRNS +SNFENMO +FICHGGE +AHIIELY + +ALCHEMY +FILINGS +INFERNO +SHINGLE +ALLERGY +-- +NCTWAOS +IOIECNN +OARAITG +FNFLGRD + +FORWARD +INFECTS +NAILING +OCTAGON +FAILING +-- +SHHOELY +ETTCLAS +TXSTMMN +OYIAKED + +EXHALED +OTTOMAN +SYSTEMS +THICKLY +THICKEN +-- +HNUSIHD +STCTSTT +WOAUGNE +IROIUEG + +HOUSING +INCISED +STATUTE +WROUGHT +STATING +-- +DACEANR +WNYTEEL +SXEAKLS +ERSWIDG + +DRYWALL +EXCEEDS +SNEAKER +WASTING +EASTING +-- +TTLEZAT +EEGTOSR +ADHBREL +SUVANOE + +ADVERSE +ETHANOL +SELTZER +TUGBOAT +SEVERAL +-- +SITKLLE +HUPIIOW +THAABAS +COSLCEL + +CITABLE +HUSKIES +SHALLOW +TOPICAL +CUTICLE +-- +STNIPSH +AIOUIOR +LNGPMEN +DYAASIC + +ANGUISH +DYNAMIC +LIAISON +STOPPER +SNAPPER +-- +CRNQRAS +AUFAIEL +MEHFSIT +GPOEUNA + +APHASIA +CROQUET +GENERAL +MUFFINS +GENESIS +-- +[eof] diff --git a/res/levels/I b/res/levels/I new file mode 100644 index 0000000..8899506 --- /dev/null +++ b/res/levels/I @@ -0,0 +1,520 @@ +# 4x5, advanced +# Try to find the optimal solution + + + + +# needs-work + + + + +OWCS +QOGT +ZIOK +URID +KUEE + +KICK +OWED +QUIT +URGE +ZOOS +OWES +-- +LHUG +UOSM +CTER +NSRH +EICP + +CHUG +ETCH +LISP +NORM +USER +COUP +-- +OEIO +KNRZ +FHWP +VIZI +SUTB + +FUZZ +KIWI +ONTO +SHIP +VERB +SNIP +-- +IDDR +HUEY +UNNH +LISC +ZELO + +HUSH +IDLY +LEER +UNDO +ZINC +LUSH +-- +RROA +EPAU +OICP +UCRN +KEWI + +ECRU +KIWI +ORCA +REAP +UPON +KERN +-- +FHZK +DAOE +CUEP +ACAY +IWCD + +AWAY +CHOP +DUCK +FAZE +ICED +FACE +-- +OKEA +UROM +ITRD +CEGG +MLLE + +CLOG +ITEM +MELD +OKRA +URGE +MERE +-- +EERY +CUHB +OLET +GCFN +LNLO + +CURB +ECHO +GLEN +LEFT +ONLY +CULT +-- +SUCO +ERNC +VELL +OYHA +PCRY + +ECHO +ORCA +PULL +SYNC +VERY +SELL +-- +KRUS +YOAD +AKOK +OIIR +EGCY + +ARID +EGOS +KICK +OKAY +YOUR +ARCS +-- +GICR +UANC +RUUY +ZRRB +PPON + +GRUB +PURR +RACY +UPON +ZINC +ZANY +-- +AMNX +JKOA +OTZZ +LARM +EYIR + +ATOM +EMIR +JAZZ +LYNX +OKRA +LAIR +-- +MRLG +SAAS +WUIP +ABEM +HMOY + +ABLY +HUES +MAIM +SMOG +WRAP +SUES +-- +LNIC +GPTH +MING +REVW +EYAY + +EPIC +GNAW +LEVY +MYTH +RING +ENVY +-- +RAOA +OSNL +UOAG +AQES +WKUY + +AQUA +OKAY +RANG +USES +WOOL +WOES +-- +IENO +YASC +ZNDY +UILL +ETEM + +EASY +ITEM +UNDO +YELL +ZINC +ZANY +-- +OIIA +NURD +EMER +KKLL +ICKE + +EMIR +ICED +KILL +NUKE +OKRA +NULL +-- +DEOR +OUIB +ARLO +LLNG +CDSI + +ALSO +CRIB +DELI +LUNG +ODOR +CLOG +-- +AREY +LANG +WOTP +IEIH +KNCL + +ARTY +INCH +KEEP +LONG +WAIL +ARCH +-- +NAUA +GHOK +TEMN +UUWB +MPTG + +GAWK +META +NUMB +THUG +UPON +NEON +-- +BUXN +SDAZ +TNZI +EAEE +OMGG + +BUZZ +EDGE +OMEN +SNAG +TAXI +SAGE +-- +WIEH +AMIS +SJAR +QUUG +ODSZ + +AJAR +ODES +QUIZ +SMUG +WISH +SUES +-- +SDIC +ZOGR +AUNF +DROD +EIRY + +ARID +DOOR +EDGY +SURF +ZINC +AIRY +-- +GOUK +QEIH +WTYM +JLAS +IUCZ + +GLUM +ITCH +JOYS +QUIZ +WEAK +GUYS +-- +UXRM +OAAD +CUEY +RNDN +IMBO + +CARD +IMAM +OXEN +RUBY +UNDO +OMEN +-- +EAWA +YNON +AIEL +RTSS +VEDP + +ATOP +ENDS +REEL +VISA +YAWN +AIDS +-- +-- +KLUH +OOOF +SPRI +HATY +FIWB + +FLUB +HOOF +KIWI +OATH +SPRY +SLOB +-- +EKBY +ARIT +TUVN +LEOO +CCHS + +AKIN +CUBS +ECHO +LEVY +TROT +TRIO +-- +MUPW +LEOD +SPUP +AVMN +TYLE + +AVOW +LUMP +MELD +SPUN +TYPE +MULE +-- +LUIY +WCHA +TAWN +EGLP +UHNO + +ECHO +LAWN +TUNA +UGLY +WHIP +THIN +-- +WQBA +HOIE +EADS +TWUN +ABOF + +AQUA +EBBS +HOOF +TWIN +WADE +TABS +-- +OCCO +MBPN +APOS +SSIE +EUHK + +ASPS +ECHO +MUCK +OBOE +SPIN +SUCK +-- +AUPY +WGAE +OKTO +EYOP +HHIS + +AUTO +EGOS +HYPE +OKAY +WHIP +HUTS +-- +LNDO +UAOT +OERN +IDWA +SKSL + +IDOL +LAST +OKRA +SEWN +UNDO +LAWN +-- +LOGN +OUUP +YNEH +EMCR +IDME + +EDGE +INCH +LUMP +OMEN +YOUR +ONCE +-- +UGNY +ENEE +SVLH +LOUN +ILCM + +EVEN +INCH +LONE +SLUM +UGLY +SOLE +-- +MUEA +DEGN +OOCH +EDMI +CPLY + +COMA +DELI +EDGY +MUCH +OPEN +COLA +-- +BHCK +HIPE +EYIT +WDUG +CUMN + +BUCK +CHUG +EDIT +HYMN +WIPE +HYPE +-- +EAEN +VCHO +BRZM +STIY +AUMZ + +ARMY +BUZZ +ECHO +STEM +VAIN +BRIM +-- +[eof] diff --git a/res/levels/J b/res/levels/J new file mode 100644 index 0000000..a6a769d --- /dev/null +++ b/res/levels/J @@ -0,0 +1,43 @@ +# 5x5, advanced +AANNE +SNMLG +CTPEH +UPZCP +BUUIL + +APPLE +BUNCH +CAMEL +STUNG +UNZIP +SAUCE +-- +AEOIW DLEOK WWNLI TCDBM SIIAD ALIBI DENIM SCOLD TWEAK WIDOW WIELD +ADIKR KUKEE VNOWN LOAPY BACCT ADAPT BAKER KNOWN LUCKY VOICE ADOPT +ACPVD VENPY ONATE PRMER KOCUS ARMED KNAVE OCCUR POPPY VENTS VENUE +AEUIN ETJOD SCCNY WRRRG GNEKO ACRID ENJOY GECKO STERN WRUNG STUNG +AFZEY PIMLR CUIIP OHFZA SDRMT ADMIT CHIMP OFFER PIZZA SURLY CURLY +AHHRF WETCR CRNDO FSOMH UOAEA AROMA CONDO FETCH USHER WHARF COACH +AHSMT EUIFB HDURE TRTKY DXOOL ADORE DRIFT EXTOL HUSKY THUMB DROOL +AIMFE WODMY CROET LLTCH YUIPL ALOFT CRIME LUMPY WITCH YODEL COMET +DBZZE ULTAS OOMYY NNEIM GIOOD DIZZY GLOOM NOMAD OBEYS UNTIE GLEAM +DWNZH BAGCP CEFML AIZUY MLUIC AWFUL BENCH CLUMP DIZZY MAGIC MANIC +FALUE AHAST OUCIB QCUMR TNTRC ANTIC FALSE OCCUR QUART THUMB TACIT +GIDIN UHOEE RARKH SULFY CNICO CHOKE GULCH RADIO SIREN UNIFY SILKY +GIGTY WSSID LROUC FOIEH EHDAL ESSAY FRIED GHOUL LOGIC WIDTH FROTH +GUUZY LOYOL RDZFN IEMNE FAFLD FUZZY GAFFE IDYLL LEMON ROUND FOUND +HUECG CRIBY SNBUM OHNAN BOROH BUNCH CREAM HOBBY ONION SHRUG HUNCH +ISOAN MACOE TESIP UPENS SNZUW ISSUE MACAW SPOON TEENS UNZIP MASON +LODEP TUULE OPGUL RHIMM HAVBY HOVEL LADLE OPIUM RUGBY THUMP ROGUE +LHUHC OSLCK TUGST UYIIA SARAL LYRIC OUGHT SALSA THICK USUAL SHUCK +OOIPD PHCAL RRBOE SEAGN VXOUW OXBOW PROUD REIGN SHAPE VOCAL PECAN +SNJAR RAPOY MOITL UIVIK TMOCC MAJOR RIVAL SMOCK TOPIC UNITY SAVOR +TTDIA SRBZY WIZGN PEOFE UAFAC PIZZA STOIC TAFFY URBAN WEDGE SEDAN +PHTLL TCLHR OICCY KEIUN MNEOK KNELL MELON OCCUR PITHY THICK ONION +HOINA SSEEN UMOTO RETGR MYHCK HYENA MOTTO REIGN SMOCK USHER METER +MORUK WEAOE KIYIW GRDPM SATAF GRAPE KAYAK MOTIF SERUM WIDOW MADAM +UNERP KDZGS YAOLD IMAIA OIRME IMAGE KARMA ODORS UNZIP YIELD IDOLS +SABUS KOMSR GMTAY HYOBT MIEHK GAMUT HOBBY KIOSK MYTHS SMEAR MOTHS +BNLEF SUNKI OFUAK ETTFN KAYUY BULKY ENNUI KAYAK OFTEN STUFF EATEN +PCCLY CEUOO KASKR ONBWN TOOUD COULD KNOWN OCCUR PESKY TABOO TACKY +[eof] diff --git a/res/levels/samples/01 b/res/levels/samples/01 new file mode 100644 index 0000000..c703dff --- /dev/null +++ b/res/levels/samples/01 @@ -0,0 +1,12 @@ +BRSED +GMAGE +IAISF +P P + M + +BASED +GRASP +GRIEF +IMAGE +PRISM +BRIEF diff --git a/res/levels/samples/02 b/res/levels/samples/02 new file mode 100644 index 0000000..d39116d --- /dev/null +++ b/res/levels/samples/02 @@ -0,0 +1,37 @@ +ZIRST +GOARS +TRUNA +H NED +L E + +GRUNT +HORSE +LINES +TIARA +ZONED +GIANT +GORED +GORES +GOURD +GRAND +GRANT +GRASS +HIRED +HIRES +HOARD +HORNS +HOUND +HOURS +HOUSE +LIARS +LINED +LOANS +LOUSE +TIRED +TIRES +TOAST +TONED +TONES +TOURS +TRUST +ZONES diff --git a/res/levels/unsorted b/res/levels/unsorted new file mode 100644 index 0000000..d48a79c --- /dev/null +++ b/res/levels/unsorted @@ -0,0 +1,1138 @@ +CIAE +DLEM +WEPW + +CLAW +DEEM +WIPE +CLAM +-- +ACIE +URMP +RUGD + +ACID +RUMP +URGE +ARID +-- +SOLP +GUGO +LPEW + +GULP +LOGO +SPEW +SOLO +-- +NAPM +BROS +OBIE + +BRIM +NAPS +OBOE +NAPE +-- +VOOM +OARY +ZDES + +ODES +VARY +ZOOM +OARS +ZOOS +-- +MGNO +RUOT +EEMS + +EGOS +MEMO +RUNT +RENT +RUNS +-- +GRAP +TLSM +HOUE + +GLUM +HOSE +TRAP +GLUE +GRAM +TRUE +-- +SROP +PAWD +DHEN + +DAWN +PROP +SHED +DROP +PAWN +PREP +SHOP +-- +SAEFT +DRIIA +PKSTN + +DRIFT +PASTA +SKEIN +-- +DEXCK +CIOEY +VLARS + +CLOCK +DIARY +VEXES +-- +OETLCY +FIAUMO +LUGSAE + +FIASCO +LEGUME +OUTLAY +-- +APDFLY +GAORTT +UBSHOS + +ABORTS +GADFLY +UPSHOT +-- +HILVCY +SLEAED +FOJSHK + +FLESHY +HIJACK +SOLVED +-- +YPTHWH +UNCOTS +SAATCN + +SNATCH +UPTOWN +YACHTS +-- +CRZCER +VHOTUS +RIYIHM + +CROCUS +RHYTHM +VIZIER +-- +ADIGIS +BALBEO +OPANOA + +ADAGIO +BALBOA +OPINES +-- +MXAMPP +CITCAS +ERDANT + +CRAMPS +EXTANT +MIDCAP +-- +SQIWATD +ALUMEUE +CEAEOES + +AQUEOUS +CLIMATE +SEAWEED +-- +MISKTTY +LUBRARS +PROCEOR + +LIBRARY +MUSKETS +PROCTOR +-- +SRIIESS +OADBATH +HEBRNAL + +HEIRESS +ORDINAL +SABBATH +-- +PAWAIDY +VRRIRTT +ONOBANS + +ONWARDS +PROBITY +VARIANT +-- +RCIU +ITAH +EECY +PRRN + +ECRU +ITCH +PRAY +REIN +ETCH +-- +ALRTA +SFAIX +PMFMT +KAELE + +AFFIX +KARMA +PLATE +SMELT +SLATE +-- +AXMYA +EWCBL +SALSP +POAEH + +AWASH +EXCEL +POLYP +SAMBA +SALSA +-- +MOOLIY +EHPBNC +HXUTEG +CILIBT + +CHUBBY +EXOTIC +HOPING +MILLET +COLLET +COPING +-- +LOBOIS +IEEIDC +ACATGY +NNDSEO + +ACETIC +INDIGO +LEASES +NOBODY +INDIES +-- +WREEOT +DURPSL +SAVMTH +CIPSLE + +CRESOL +DIVEST +SUPPLE +WARMTH +SUREST +-- +WCLNTM +QNEDNS +OUIIED +IEFARE + +INFIRM +OCEANS +QUINTE +WELDED +INLAND +ONLINE +WEEDED +-- +VISOUN +TMFFIS +USEART +COLTSE + +COFFIN +TSETSE +UMLAUT +VISORS +COLORS +TIFFIN +-- +LIWAAS +SURVRP +HAGCER +FOCLUL + +FOWLER +HICCUP +LARVAL +SUGARS +FORCES +HOWLER +SOCCER +-- +RTRINN +UNOLOR +GEISEE +AIFDLS + +ATOLLS +GIRDER +REFINE +UNISON +ANODES +GIRDLE +RIFLES +-- +DRAIEY +UNUWRM +NQDUOR +SEWTLN + +DRAWER +NEWTON +SQUIRM +UNDULY +NEATLY +NEUTER +SEATER +-- +FOKWTM +LEORUH +HIUIES +GLLEND + +FOURTH +GLOWED +HELIUM +LIKENS +FLOWED +LILIES +-- +SITIOE +TLGMIC +DHYETD +MEEHVS + +DIGITS +METHOD +SLEEVE +THYMIC +SHEETS +SIGHTS +TIGHTS +-- +KHMDIT +SINRPS +FEAGHN +RRIALY + +FRIGHT +KINDLY +REMAIN +SHARPS +FINALS +KINGLY +SINGLY +-- +ACOIGM +NRCROE +PUBNSR +DEDTUS + +ACCRUE +DEBTOR +NUDISM +PRONGS +AUDIOS +-- +YNIBIW +FDLULT +ERTLOE +IEESCO + +EDIBLE +FRESCO +INTUIT +YELLOW +FEEBLE +FELLOW +-- +PBAUED +ONVELY +JETRIE +UUDGSL + +JUDGED +OBTUSE +PEARLY +UNVEIL +PETREL +PUTRID +UNDULY +-- +PRUGKS +UAAANL +WETIAE +FPRVEG + +FRUGAL +PARING +UPTAKE +WEAVES +FARING +WARING +-- +MEQORD +BIKUDS +AOOEET +HCLDIY + +ACQUIT +BIKERS +HOODED +MELODY +HIKERS +MOLDED +-- +LUNPNT +TRRYEY +CATKIX +DOOOUC + +CUTOUT +DONKEY +LARYNX +TROPIC +CARPET +TURKEY +-- +CRTWAS +AYMRNL +DSDMCD +ZIOEEO + +ASTRAL +CROWNS +DIMMED +ZYDECO +AROMAS +CRORES +DROWNS +-- +VONAAS +RROSNE +AETTTD +TASUHL + +AROUND +ROTATE +TENTHS +VASSAL +RENTAL +VESTAL +VESTAS +-- +FOVELX +MUCARE +SAPICS +ALFFIA + +ALPACA +FACILE +MOVERS +SUFFIX +SAVERS +SUPERS +-- +NHPNOD +CIEHES +TYRRST +AMMUDR + +AMENDS +CYPHER +NIMROD +THRUST +CIPHER +THERES +TIERED +-- +SCOVEL +RHULAR +OESIMA +MINORT + +MINIMA +OCULAR +RESORT +SHOVEL +MENIAL +-- +IEVIUM +BULENT +QNOCKZ +HLARTY + +BLOCKY +HELIUM +INVENT +QUARTZ +HEARTY +QUAINT +QUORUM +-- +EOREUE +VIBGEY +PMMTGS +SHAMRL + +EMBERS +POMMEL +SHAGGY +VIRTUE +PHAGES +-- +TMELTS +NHAFEM +EEVCIT +DIBOUN + +DEVOUT +EMBLEM +NIACIN +THEFTS +NIECES +-- +LUIKIE +NNCICY +CRANUP +EOMTTC + +CRITIC +ENMITY +LOCKUP +NUANCE +LUCITE +-- +MHEKLL +TRLUSE +IIFAED +BNRIKS + +BREAKS +INFUSE +MILKED +THRILL +INFILL +THRALL +-- +FIMRRS +TEAINY +NAWTBD +INFAHG + +FIFTHS +INWARD +NEARBY +TAMING +NAMING +TIMING +-- +SOTEEO +TMRTBA +AUOOTG +MTMANR + +AMOEBA +MUTTER +STRONG +TOMATO +SORTER +STRANG +STRATA +-- +PORZET +CBAPAY +AIMULD +WEZVPS + +ABRUPT +COMPLY +PIZZAS +WEAVED +PEAVEY +PIMPED +WEAVES +-- +ARURSY +MISTRA +DANMDT +GOTIAS + +ARTIST +DISMAY +GOURDS +MANTRA +DRUIDS +GANTRY +-- +SECRIP +RRSUUC +IIONCT +PTAKLH + +IRONIC +PICKUP +RESULT +STARCH +PEANUT +PICNIC +SEARCH +-- +ADDUED +SLILLY +PUOMPS +CKZZDE + +ADDLED +CLOUDS +PUZZLE +SKIMPY +CLIMES +CLOUDY +SKILLS +-- +ASCEEG +SONIAL +BISDNE +NUXKTS + +ASSETS +BOXING +NICKEL +SUNDAE +BONING +BUSING +SOCIAL +-- +DQBPDR +EMNTWK +SESAET +BAUOOY + +BANTER +DESPOT +EMBODY +SQUAWK +DEBTOR +EASTER +-- +QCTIEG +OUWATR +LEELVE +KOIPNS + +KEEPER +LOWING +OCTAVE +QUILTS +OCEANS +OCTANE +OUTING +-- +ETETLE +MODNMH +SCZECA +HUTDER + +ECZEMA +HOTTER +MUDDLE +STENCH +HUDDLE +MUTTER +-- +IIGUNR +AADGCN +CGUAEA +BBRBOT + +ABDUCT +BIGGER +CARBON +IGUANA +BADGER +BAGGER +BARBER +-- +MSSIGW +IOVEON +ANADRT +SHHAWK + +ASSIGN +INVERT +MOHAWK +SHADOW +ASSERT +INSERT +-- +FUSAGY +PIEILE +CLAFIA +BRCNDX + +BUSILY +CICADA +FLANGE +PREFIX +BRANDY +-- +MNBILC +AMPMIT +IURRCY +HOEAAE + +ANEMIC +HURRAY +IMPACT +MOBILE +MORALE +-- +SDNFFS +RHOTSL +WORIUT +AIUOEH + +ADRIFT +ROUTES +SINFUL +WHOOSH +SHRIFT +-- +KHABTN +SISSLS +JRENKE +PABMIO + +JASMIN +KIBBLE +PRESTO +SHANKS +PRANKS +-- +DHMUAO +MADRCL +AOOEET +CFFNLD + +AFFECT +CHORAL +DAMNED +MODULO +MOORED +-- +ETCNOG +SOOASN +BDGONT +CREIED + +BREAST +COCOON +EDGING +STONED +BOOING +-- +FCTACY +ATELEL +SHLERD +CIAIAK + +ATTACK +CHEERY +FILIAL +SCALED +FILLED +-- +SHTEFD +CEOKOS +VUCOLN +BIXUNF + +BECKON +CUTOFF +SHOULD +VIXENS +SECOND +-- +SUGGCN +JBQUUS +AOJOIT +HEYEER + +ABJECT +HUGGER +JOYOUS +SEQUIN +JOGGER +-- +GIYISP +HAADEH +MELHTS +FOTNUM + +FETISH +GIANTS +HOLDUP +MAYHEM +HELIUM +-- +CUBELG +BYCTPS +VEGMRR +HLIOOY + +BLIMPS +CYBORG +HUGELY +VECTOR +HECTOR +-- +CYOBNS +GRMDRG +AUNUAY +SCHIPL + +ACHING +CYMBAL +GROUPS +SUNDRY +ARMING +-- +TAUENT +EBHNOG +OTPOSC +RRLTIR + +ETHNIC +OBLONG +RAPTOR +TRUEST +TALENT +-- +WPOCLA +UIWWNS +GCADOD +ARSIIM + +ACACIA +GROWLS +UPWIND +WISDOM +GRAINS +-- +DLMLNW +GOAIDS +YEHNMO +SCLEOA + +DOMINO +GLANDS +SCHEMA +YELLOW +SOLIDS +-- +APLITY +TRAVMB +FETOID +UNILEA + +APLOMB +FEALTY +TRIVIA +UNTIED +FELLED +-- +AYPRCCX +EHOUYNE +CMATTEA +PRNIIAL + +AMPUTEE +CYNICAL +EROTICA +PHARYNX +CHATTEL +-- +CNSTALE +RODCRRM +SEREEIY +IAVMIUL + +CADMIUM +INSTALL +REVERIE +SORCERY +INSTILL +-- +OPRPAMT +CELCCIL +WOBIHNN +DUTREAS + +CURRENT +DOLPHIN +OPTICAL +WEBCAMS +CURRANT +-- +CLBIVNN +REVSOAS +BHAFFLY +GIINKOL + +BLANKLY +CHIFFON +GIBSONS +REVIVAL +REASONS +-- +STUMKAM +AILGRUR +BLESNES +PEALWIX + +ALUMNUS +BEESWAX +PILGRIM +STALKER +PILSNER +-- +COBAACL +FRPCOKS +EMNLRAK +ZIATTIN + +CONTAIN +EMBARKS +FRACTAL +ZIPLOCK +CONTRAS +-- +SUPCETR +OINSULE +CASPBCY +MPAIIAT + +CAPSULE +MINIBAR +OPACITY +SUSPECT +MISSILE +-- +SUVENUD +DPUNIFN +ORECKEY +RETLANE + +DRUNKEN +OUTLAND +REVENUE +SPECIFY +OUTLINE +-- +POJWMLC +EROOYEA +BLLEEID +ANUGURS + +ARUGULA +BLOWERS +ENJOYED +POLEMIC +BLOOMED +-- +VNFAEED +EFOLLNS +UICECTT +BUPOVIC + +BUCOLIC +EFFECTS +UNPAVED +VIOLENT +VIOLETS +-- +EIHEMON +CHAMEIC +SCNILSR +TPRONET + +CHRONIC +ECHELON +SPAMMER +TINIEST +SCAMMER +-- +EOHE +BUCL +WCIS +INKO +VEGH + +BUGS +ECHO +INCH +VEIL +WOKE +BOGS +BOIL +INKS +-- +GDUA +TNOO +FRBW +OLDX +EUTY + +EDDY +FLUX +GROW +ONTO +TUBA +FLOW +GLOW +-- +KOLY +DIWH +AECN +IREI +JDIR + +ARCH +DEER +IDLY +JOIN +KIWI +DELI +DOWN +KEEN +-- +CUOF +BAUA +WHVH +MQEY +AOCT + +AQUA +BOOT +CHEF +MUCH +WAVY +BUOY +WHEY +-- +REIL +WWNS +KHWM +OIAB +FLUI + +FLUB +KIWI +OWNS +REAL +WHIM +FLAB +WINS +-- +YWPP +TUED +UYRE +AOLK +JSMY + +AWRY +JUMP +TYPE +USED +YOLK +JURY +TOLD +TORE +-- +RIGA +IUIH +ONEY +WDTM +HHBO + +HIGH +IDEA +ONTO +RUBY +WHIM +INTO +WHEY +WITH +-- +LFMR +AIAE +IUZZ +HDSA +JAEK + +AFAR +HUSK +IDEA +JAZZ +LIME +HAZE +LIAR +-- +EACR +LTIH +AOGY +YULZ +FBZA + +ABLY +ETCH +FUZZ +LAIR +YOGA +EACH +FAIR +LAZY +-- +LNEM +TRBY +NAOA +PIIB +KUVU + +KNOB +LIEU +NAVY +PRIM +TUBA +LAVA +PREY +TRIM +-- diff --git a/res/work.po b/res/work.po new file mode 100644 index 0000000..f101111 Binary files /dev/null and b/res/work.po differ diff --git a/src/constants.a b/src/constants.a new file mode 100644 index 0000000..55d3e17 --- /dev/null +++ b/src/constants.a @@ -0,0 +1,56 @@ +;license:MIT +;(c) 2020 by 4am +; + +; soft switches +KBD = $C000 ; last key pressed (if any) +STOREOFF = $C000 ; STA then use the following 4 flags: +READMAINMEM = $C002 ; STA to read from main mem +READAUXMEM = $C003 ; STA to read from aux mem +WRITEMAINMEM = $C004 ; STA to write to main mem +WRITEAUXMEM = $C005 ; STA to write to aux mem +CLRC3ROM = $C00A ; STA to use internal Slot 3 ROM (required to use 128K and DHGR) +SETC3ROM = $C00B ; STA to use external Slot 3 ROM (required to detect VidHD in slot 3) +CLR80VID = $C00C ; 40 columns (also used to get out of DHGR mode) +SET80VID = $C00D ; 80 columns (also used to get into DHGR mode) +PRIMARYCHARSET= $C00E ; no mousetext for you +CLEARKBD = $C010 ; clear last key pressed +SPEAKER = $C030 ; chirp chirp +CLOCKCTL = $C034 ; bits 0-3 are IIgs border color (also VidHD) +GFXMODE = $C050 +TEXTMODE = $C051 +FULLGFX = $C052 +MIXGFX = $C053 +PAGE1 = $C054 ; page 1 (affects text, HGR, DHGR) +PAGE2 = $C055 ; page 2 (affects text, HGR, DHGR) +LORES = $C056 +HIRES = $C057 + +; ROM routines and addresses +ROM_TEXT = $FB2F +ROM_MACHINEID =$FBB3 +ROM_HOME = $FC58 +ROM_WAIT = $FCA8 +ROM_COUT = $FDED +ROM_NORMAL = $FE84 ; NORMAL text (instead of INVERSE or FLASH) +ROM_IN0 = $FE89 ; SETKBD +ROM_PR0 = $FE93 ; SETVID + +; zero page +PARAM = $00 ; word (used by PARAMS_ON_STACK macro, so basically everywhere) +PTR = $02 ; word +SRC = $04 ; word +DEST = $06 ; word +SAVE = $08 ; word +HTAB = $24 ; byte +VTAB = $25 ; byte +RNDSEED = $4E ; word + +; application constants +original_char = $ED ; byte +char = $EE ; byte +charrow = $EF ; byte +GENSCROLLDOWN = $0800 ; 0x0900 bytes +GENSCROLLUP = $1100 ; 0x0900 bytes +HGRLO = $1A00 ; 0xC0 bytes +HGRHI = $1B00 ; 0xC0 bytes diff --git a/src/ds.puzzle.a b/src/ds.puzzle.a new file mode 100644 index 0000000..6c1dc69 --- /dev/null +++ b/src/ds.puzzle.a @@ -0,0 +1,256 @@ +;license:MIT +;(c) 2020 by 4am +; +; data storage routines for puzzles +; + +puzzle_logical_width ; number of letters per word (4..7) + !byte 0 +puzzle_logical_height ; number of rows with letters (1..5) + !byte 0 +puzzle_offsets ; how far each column has been scrolled down from top of grid + !fill 8, 0 +puzzle_data ; character data + !fill 8, 0 +puzzle_data1 + !fill 8, 0 +puzzle_data2 + !fill 8, 0 +puzzle_data3 + !fill 8, 0 +puzzle_data4 + !fill 8, 0 +puzzle_data5 + !fill 8, 0 +puzzle_data6 + !fill 8, 0 +puzzle_data7 + !fill 8, 0 +puzzle_data8 + !fill 8, 0 +puzzle_word_count ; number of records in + !byte 0 +puzzle_words ; 32 x 8-byte records + !fill 256, 0 ; each record is a -length word, no prefix + +InitPuzzle +; in: A = logical puzzle width (number of letters in each word, 4..7) + sta puzzle_logical_width + lda #0 + sta puzzle_logical_height + sta puzzle_word_count + ldx #8 +- sta puzzle_offsets-1, x + dex + bne - +- sta puzzle_words, x + inx + bne - + rts + +AddLineToPuzzle +; in: A/Y points to length character buffer (no prefix, no suffix) +; out: clobbers all registers +; clobbers $FE/$FF + +ST16 $FE + lda puzzle_logical_height + asl + asl + asl + tax + ldy #0 +- lda ($FE), y + sta puzzle_data, x + inx + iny + cpy puzzle_logical_width + bne - + inc puzzle_logical_height + rts + +AddTargetWordToPuzzle +; in: A/Y points to length character buffer (no prefix, no suffix) + +ST16 $FE + lda puzzle_word_count + asl + asl + asl + tax + ldy #0 +- lda ($FE), y + sta puzzle_words, x + inx + iny + cpy puzzle_logical_width + bne - + inc puzzle_word_count + rts + +CheckForTargetWord +; in: none +; out: C clear if a target word was found on row 4 +; C set if no target word found + +LDADDR puzzle_words + +ST16 $FE + ldx #0 ; word index +@checkword + ldy #0 ; character index +- lda puzzle_data4, y + and #$7F ; letters within puzzle have high bit set if they've been used before + cmp ($FE), y ; (which is fine, and on later puzzles is guaranteed to happen eventually) + bne @nextword + iny + cpy puzzle_logical_width + bne - + ; found matching word + ; set high bit on all letters in row 4 + ldy #0 +- lda puzzle_data4, y + ora #$80 + sta puzzle_data4, y + iny + cpy puzzle_logical_width + bne - + clc + rts +@nextword + lda $FE + clc + adc #8 + sta $FE + bcc + + inc $FF ++ inx + cpx puzzle_word_count + bne @checkword + sec + rts + +ScrollPuzzleDown +; in: Y = logical column to scroll +; out: C clear if puzzle was scrolled down +; C set if puzzle was already as far down as it can go +; preserves X/Y + lda puzzle_offsets, y + cmp #4 + beq @fail + + lda puzzle_data7, y + sta puzzle_data8, y + + lda puzzle_data6, y + sta puzzle_data7, y + + lda puzzle_data5, y + sta puzzle_data6, y + + lda puzzle_data4, y + sta puzzle_data5, y + + lda puzzle_data3, y + sta puzzle_data4, y + + lda puzzle_data2, y + sta puzzle_data3, y + + lda puzzle_data1, y + sta puzzle_data2, y + + lda puzzle_data, y + sta puzzle_data1, y + + lda #0 + sta puzzle_data, y + + lda puzzle_offsets, y + clc + adc #1 + sta puzzle_offsets, y + clc + rts +@fail sec + rts + +ScrollPuzzleUp +; in: Y = logical column to scroll +; out: C clear if puzzle was scrolled up +; C set if puzzle was already as far up as it can go +; preserves X/Y + lda puzzle_offsets, y + clc + adc puzzle_logical_height + cmp #5 + beq @fail + + lda puzzle_data1, y + sta puzzle_data, y + + lda puzzle_data2, y + sta puzzle_data1, y + + lda puzzle_data3, y + sta puzzle_data2, y + + lda puzzle_data4, y + sta puzzle_data3, y + + lda puzzle_data5, y + sta puzzle_data4, y + + lda puzzle_data6, y + sta puzzle_data5, y + + lda puzzle_data7, y + sta puzzle_data6, y + + lda puzzle_data8, y + sta puzzle_data7, y + + lda #0 + sta puzzle_data8, y + + lda puzzle_offsets, y + sec + sbc #1 + sta puzzle_offsets, y + clc + rts +@fail sec + rts + +RedrawPuzzle + jsr Home + jsr DrawThinLines + +LDADDR puzzle_data + +ST16 $FE + ldx #0 ; logical row +-- ldy #0 ; logical column +- lda ($FE), y + jsr DrawCharacter + iny + cpy puzzle_logical_width + bne - + lda $FE + clc + adc #8 + sta $FE + bcc + + inc $FF ++ inx + cpx puzzle_logical_height + bne -- + + bit GFXMODE + rts + +AnimatePuzzleIntoPlace + ldy #0 +-- ldx #4 +- jsr ScrollPuzzleDown + jsr ScrollDown + dex + bne - + iny + cpy #7 + bne -- + rts diff --git a/src/hw.vbl.a b/src/hw.vbl.a new file mode 100644 index 0000000..eaa4c31 --- /dev/null +++ b/src/hw.vbl.a @@ -0,0 +1,41 @@ +;license:MIT +;(c) 2020 by qkumba +; +; Functions to enable and disable VBL polling on various Apple II models + +WaitForVBL + jmp WaitForVBL_iie ; SMC to RTS on a II+ + +UnwaitForVBL + rts ; SMC to JMP on a IIc + !word iUnwaitForVBL + +iWaitForVBL + sei ; IIc is special + sta $C07F ; enable access to VBL register + sta $C05B ; enable VBL polling + sta $C07E ; disable access to VBL register +WaitForVBL_iie ; IIe/IIgs have a relatively sane VBL + ; but it's reversed between the two + ; so we default to IIe, and patch in + ; the reverse case if it's a IIGS. +- bit $C019 +patch_VBL_iigs1 + bpl - +patch_VBL_iic1 +- lda $C019 ; $c019 bit 7 is sticky, reset it (SMC->#$70 for IIc) +patch_VBL_iic2 +patch_VBL_iigs2 + bmi - +WaitForVBL_nop ; II/II+ have no easy VBL + rts + +iUnwaitForVBL +- bit $C019 + bpl - + lda $C070 ; $c019 bit 7 is sticky, reset it + sta $C07F ; enable access to VBL register + sta $C05A ; disable VBL polling + sta $C07E ; disable access to VBL register + cli + rts diff --git a/src/hw.vbl.init.a b/src/hw.vbl.init.a new file mode 100644 index 0000000..f5671cc --- /dev/null +++ b/src/hw.vbl.init.a @@ -0,0 +1,45 @@ +;license:MIT +;(c) 2020 by qkumba +; +; Identify platform and construct appropriate VBL routine + +romid = $FBB3 +; $38=][, $EA=][+, $06=//e compatible +ROMID_IIECOMPAT = 6 +romid_ec = $FBC0 +; $EA=//e original, $E0=//e enhanced, $E1=//e EDM, $00=//c + +; IIGS +idroutine = $FE1F ; SEC, JSR $FE1F, BCS notgs + +InitVBL + ldx romid + cpx #ROMID_IIECOMPAT + bne @build_none ; not a //e + lda romid_ec + beq @build_iic ; //c family + sec + jsr idroutine ; check for IIgs + bcs @NotGS + lda #$30 + sta patch_VBL_iigs1 + lda #$10 + sta patch_VBL_iigs2 +@NotGS + rts +@build_iic + lda #$70 + sta patch_VBL_iic1+1 + lda #$60 + sta patch_VBL_iic2 + lda #iWaitForVBL + sta WaitForVBL+2 + lda #$4C + sta UnwaitForVBL + rts +@build_none + lda #$60 + sta WaitForVBL + rts diff --git a/src/macros.a b/src/macros.a new file mode 100644 index 0000000..63e063e --- /dev/null +++ b/src/macros.a @@ -0,0 +1,176 @@ +;license:MIT +;(c) 2020 by 4am +; +; common assembler macros (6502 compatible) +; + +; .hgrlo, .hgr1hi will each be filled with $C0 bytes +; based on routine by John Brooks +; posted on comp.sys.apple2 on 2018-07-11 +; https://groups.google.com/d/msg/comp.sys.apple2/v2HOfHOmeNQ/zD76fJg_BAAJ +!macro BUILD_HGR_LOOKUP_TABLES .hgrlo, .hgr1hi { + ldx #0 +- txa + and #$F8 + bpl + + ora #5 ++ asl + bpl + + ora #5 ++ asl + asl + sta .hgrlo,x + txa + and #7 + rol + asl .hgrlo,x + rol + ora #$20 + sta .hgr1hi,x + inx + cpx #$C0 + bne - +} + +; for functions that take parameters on the stack +; set (PARAM) to point to the parameters and +; move the stack pointer to the first byte after the parameters +; clobbers A,X,Y +!macro PARAMS_ON_STACK .bytes { + pla + sta PARAM + clc + adc #.bytes + tay + pla + sta PARAM+1 + adc #0 + pha + tya + pha +} + +; for functions that take parameters on the stack +; load a 16-bit value from the parameters on the stack into A (low) and Y (high) +; (assumes PARAMS_ON_STACK was used first) +!macro LDPARAM .offset { + ldy #.offset + lda (PARAM),y + pha + iny + lda (PARAM),y + tay + pla +} + +; for functions that take parameters on the stack +; load a 16-bit value from the parameters on the stack into A (low) and Y (high) +; then store it as new source +; (assumes PARAMS_ON_STACK was used first) +!macro LDPARAMPTR .offset,.dest { + ldy #.offset + lda (PARAM),y + sta .dest + iny + lda (PARAM),y + sta .dest+1 +} + +; load the address of .ptr into A (low) and Y (high) +!macro LDADDR .ptr { + lda #<.ptr + ldy #>.ptr +} + +; load a 16-bit value into A (low) and Y (high) +!macro LD16 .ptr { + lda .ptr + ldy .ptr+1 +} + +; store a 16-bit value from A (low) and Y (high) +!macro ST16 .ptr { + sta .ptr + sty .ptr+1 +} + +; decrement a 16-bit value in A (low) and Y (high) +!macro DEC16 { + sec + sbc #1 + bcs + + dey ++ +} + +; increment a 16-bit value in A (low) and Y (high) +!macro INC16 { + clc + adc #1 + bne + + iny ++ +} + +; compare a 16-bit value in A (low) and Y (high) to an absolute address +!macro CMP16ADDR .addr { + cmp .addr + bne + + cpy .addr+1 ++ +} + +; compare a 16-bit value in A (low) and Y (high) to an immediate value +!macro CMP16 .val { + cmp #<.val + bne + + cpy #>.val ++ +} + +!macro LBPL .target { + bmi + + jmp .target ++ +} + +!macro LBNE .target { + beq + + jmp .target ++ +} + +!macro LBCS .target { + bcc + + jmp .target ++ +} + +!macro READ_ROM_NO_WRITE { + bit $C082 +} + +; use BIT to swallow the following 1-byte opcode +!macro HIDE_NEXT_BYTE { + !byte $24 +} + +; use BIT to swallow the following 2-byte opcode +!macro HIDE_NEXT_2_BYTES { + !byte $2C +} + +!macro RTS_IF_KEY { + bit $c000 + bpl + + rts ++ +} + +; debugging +!macro DEBUGWAIT { + bit $c010 +- bit $c000 + bpl - + bit $c010 +} diff --git a/src/million.a b/src/million.a new file mode 100644 index 0000000..1b2ead8 --- /dev/null +++ b/src/million.a @@ -0,0 +1,134 @@ +;license:MIT +;(c) 2020 by 4am +; +!cpu 6502 +!to "build/MILLION.SYSTEM",plain +*=$2000 + +column = $FC +row = $FD + + !source "src/constants.a" ; no code + !source "src/macros.a" ; no code + !source "src/million.init.a" ; one-time initialization code + !source "src/hw.vbl.init.a" + +FirstMover +!pseudopc $4000 { +Start + jsr TitlePage + lda #7 + jsr InitPuzzle + + +LDADDR puzzleline1 + jsr AddLineToPuzzle + +LDADDR puzzleline2 + jsr AddLineToPuzzle + +LDADDR puzzleline3 + jsr AddLineToPuzzle + + +LDADDR targetword1 + jsr AddTargetWordToPuzzle + +LDADDR targetword2 + jsr AddTargetWordToPuzzle + +LDADDR targetword3 + jsr AddTargetWordToPuzzle + + lda #0 + sta selected_logical_column + jsr RedrawPuzzle + jsr AnimatePuzzleIntoPlace + jsr DrawColumnSelectionIndicator + bit $c010 + jmp PlayEventLoop + +selected_logical_column + !byte 0 + +PlayEventLoop +- lda $c000 + bpl - + bit $c010 + cmp #$8B ; up arrow + beq EventUpArrow + cmp #$8A ; down arrow + beq EventDownArrow + cmp #$88 ; left arrow + beq EventLeftArrow + cmp #$95 ; right arrow + beq EventRightArrow + jmp PlayEventLoop + +EventUpArrow + ldy selected_logical_column + jsr ScrollPuzzleUp + bcs @fail + jsr ScrollUp + jsr CheckForTargetWord + bcc FoundTargetWord + bcs @done +@fail jsr SoftBell +@done jmp PlayEventLoop + +EventDownArrow + ldy selected_logical_column + jsr ScrollPuzzleDown + bcs @fail + jsr ScrollDown + jsr CheckForTargetWord + bcc FoundTargetWord + bcs @done +@fail jsr SoftBell +@done jmp PlayEventLoop + +FoundTargetWord + ldx #4 + ldy #0 +- lda puzzle_data4, y + jsr DrawCharacter + iny + cpy puzzle_logical_width + bne - + jmp PlayEventLoop + +EventLeftArrow + ldy selected_logical_column + jsr EraseColumnSelectionIndicator + bne + + ldy puzzle_logical_width ++ dey + sty selected_logical_column + jsr DrawColumnSelectionIndicator + jmp PlayEventLoop + +EventRightArrow + ldy selected_logical_column + jsr EraseColumnSelectionIndicator + iny + cpy puzzle_logical_width + bcc + + ldy #0 ++ sty selected_logical_column + jsr DrawColumnSelectionIndicator + jmp PlayEventLoop + +puzzleline1 + !raw "PRTFELE" +puzzleline2 + !raw "MHERINS" +puzzleline3 + !raw "SIOTBET" +targetword1 + !raw "MITTENS" +targetword2 + !raw "PROFILE" +targetword3 + !raw "SHERBET" + + !source "src/ds.puzzle.a" + !source "src/hw.vbl.a" + !source "src/ui.title.a" + !source "src/ui.common.a" + !source "src/ui.font.a" + !source "src/ui.font.data.a" +} diff --git a/src/million.init.a b/src/million.init.a new file mode 100644 index 0000000..ea28cab --- /dev/null +++ b/src/million.init.a @@ -0,0 +1,275 @@ +;license:MIT +;(c) 2020 by 4am +; +; initialize program, generate lookup tables and dynamically generated code +; + + +READ_ROM_NO_WRITE + sta PRIMARYCHARSET + sta CLR80VID + sta STOREOFF + sta READMAINMEM + sta WRITEMAINMEM + jsr ROM_TEXT + jsr ROM_HOME + jsr ROM_NORMAL + jsr ROM_IN0 + jsr ROM_PR0 + +BUILD_HGR_LOOKUP_TABLES HGRLO, HGRHI + jsr InitScrollUp + jsr InitScrollDown + + ldx #$20 + ldy #0 +@a lda FirstMover,y +@b sta $4000,y + iny + bne @a + inc @a+2 + inc @b+2 + dex + bne @a + jmp Start + +InitScrollUp + lda #GENSCROLLUP + sta $FF + ldy #$00 + ldx #$00 +@loadleft + inx + cpx #$55 + bne + + lda #$A5 ; LDA/zp + jsr StoreAndInc + lda #$FE + jsr StoreAndInc + jmp @storeleft ++ cpx #$6B + bne + + lda #$A5 ; LDA/zp + jsr StoreAndInc + lda #$FC + jsr StoreAndInc + jmp @storeleft ++ lda #$B9 ; LDA addr,Y + jsr StoreAndInc + lda HGRLO, x + jsr StoreAndInc + lda HGRHI, x + jsr StoreAndInc +@storeleft + dex + cpx #$55 + bne + + lda #$85 ; STA/zp + jsr StoreAndInc + lda #$FE + jsr StoreAndInc + jmp @loadright ++ cpx #$6B + bne + + lda #$85 ; STA/zp + jsr StoreAndInc + lda #$FC + jsr StoreAndInc + jmp @loadright ++ lda #$99 ; STA addr,Y + jsr StoreAndInc + lda HGRLO, x + jsr StoreAndInc + lda HGRHI, x + jsr StoreAndInc +@loadright + inx + cpx #$55 + bne + + lda #$A5 ; LDA/zp + jsr StoreAndInc + lda #$FF + jsr StoreAndInc + jmp @storeright ++ cpx #$6B + bne + + lda #$A5 ; LDA/zp + jsr StoreAndInc + lda #$FD + jsr StoreAndInc + jmp @storeright ++ lda #$B9 ; LDA addr,Y + jsr StoreAndInc + lda HGRLO, x + clc + adc #1 + jsr StoreAndInc + lda HGRHI, x + jsr StoreAndInc +@storeright + dex + cpx #$55 + bne + + lda #$85 ; STA/zp + jsr StoreAndInc + lda #$FF + jsr StoreAndInc + jmp @next ++ cpx #$6B + bne + + lda #$85 ; STA/zp + jsr StoreAndInc + lda #$FD + jsr StoreAndInc + jmp @next ++ lda #$99 ; STA addr,Y + jsr StoreAndInc + lda HGRLO, x + clc + adc #1 + jsr StoreAndInc + lda HGRHI, x + jsr StoreAndInc +@next + inx + cpx #$BF + +LBNE @loadleft + + lda #$CA ; DEX + jsr StoreAndInc + lda #$F0 ; BEQ + jsr StoreAndInc + lda #$03 + jsr StoreAndInc + lda #$4C ; JMP + jsr StoreAndInc + lda #GENSCROLLUP + jsr StoreAndInc + lda #$60 ; RTS + ; /!\ execution falls through here +StoreAndInc + sta ($FE), y + iny + bne + + inc $FF ++ rts + +InitScrollDown + lda #GENSCROLLDOWN + sta $FF + ldy #$00 + ldx #$BF +@loadleft + dex + cpx #$55 + bne + + lda #$A5 ; LDA/zp + jsr StoreAndInc + lda #$FE + jsr StoreAndInc + jmp @storeleft ++ cpx #$6B + bne + + lda #$A5 ; LDA/zp + jsr StoreAndInc + lda #$FC + jsr StoreAndInc + jmp @storeleft ++ lda #$B9 ; LDA addr,Y + jsr StoreAndInc + lda HGRLO, x + jsr StoreAndInc + lda HGRHI, x + jsr StoreAndInc +@storeleft + inx + cpx #$55 + bne + + lda #$85 ; STA/zp + jsr StoreAndInc + lda #$FE + jsr StoreAndInc + jmp @loadright ++ cpx #$6B + bne + + lda #$85 ; STA/zp + jsr StoreAndInc + lda #$FC + jsr StoreAndInc + jmp @loadright ++ lda #$99 ; STA addr,Y + jsr StoreAndInc + lda HGRLO, x + jsr StoreAndInc + lda HGRHI, x + jsr StoreAndInc +@loadright + dex + cpx #$55 + bne + + lda #$A5 ; LDA/zp + jsr StoreAndInc + lda #$FF + jsr StoreAndInc + jmp @storeright ++ cpx #$6B + bne + + lda #$A5 ; LDA/zp + jsr StoreAndInc + lda #$FD + jsr StoreAndInc + jmp @storeright ++ lda #$B9 ; LDA addr,Y + jsr StoreAndInc + lda HGRLO, x + clc + adc #1 + jsr StoreAndInc + lda HGRHI, x + jsr StoreAndInc +@storeright + inx + cpx #$55 + bne + + lda #$85 ; STA/zp + jsr StoreAndInc + lda #$FF + jsr StoreAndInc + jmp @next ++ cpx #$6B + bne + + lda #$85 ; STA/zp + jsr StoreAndInc + lda #$FD + jsr StoreAndInc + jmp @next ++ lda #$99 ; STA addr,Y + jsr StoreAndInc + lda HGRLO, x + clc + adc #1 + jsr StoreAndInc + lda HGRHI, x + jsr StoreAndInc +@next + dex + +LBNE @loadleft + + lda #$CA ; DEX + jsr StoreAndInc + lda #$F0 ; BEQ + jsr StoreAndInc + lda #$03 + jsr StoreAndInc + lda #$4C ; JMP + jsr StoreAndInc + lda #GENSCROLLDOWN + jsr StoreAndInc + lda #$60 ; RTS + jmp StoreAndInc diff --git a/src/ui.common.a b/src/ui.common.a new file mode 100644 index 0000000..ceac6a7 --- /dev/null +++ b/src/ui.common.a @@ -0,0 +1,165 @@ +;license:MIT +;(c) 2020 by 4am +; +; common graphics functions +; + +GlobalLeftMargin + ; TODO other values for smaller puzzles + ; $0A for 7-letter puzzles + !byte $0A + +Home +; in: none, but assumes text screen 1 is clear (this is done at program startup) +; out: hi-res page 1 cleared but text screen 1 still displayed + bit PAGE1 + bit FULLGFX + bit HIRES + bit TEXTMODE + ldx #$20 + stx @erase+2 + ldy #$00 + tya +@erase sta $2000,y + iny + bne @erase + inc @erase+2 + dex + bne @erase + rts + +DrawThinLines + ldx #$55 + jsr DrawThinLine + ldx #$6B + ; /!\ execution falls through here +DrawThinLine +; in: X = HGR row (0x00..0xBF) + lda #$AA + ldy HGRLO, x + sty $FE + ldy HGRHI, x + sty $FF + ldy GlobalLeftMargin + dey +- sta ($FE), y + eor #$7F + iny + cpy #$1F ; TODO + bcc - + rts + +ScrollDown +; in: Y = logical column to scroll +; out: X/Y preserved + stx @x+1 + sty @y+1 + ldx #$16 + jsr LogicalColumnToPhysicalColumn + jsr InitScrollStorage + jsr WaitForVBL + jsr GENSCROLLDOWN + jsr UnwaitForVBL +@x ldx #$FD ; SMC +@y ldy #$FD ; SMC + rts + +ScrollUp +; in: Y = logical column to scroll +; out: X/Y preserved + stx @x+1 + sty @y+1 + ldx #$16 + jsr LogicalColumnToPhysicalColumn + jsr InitScrollStorage + jsr WaitForVBL + jsr GENSCROLLUP + jsr UnwaitForVBL +@x ldx #$FD ; SMC +@y ldy #$FD ; SMC + rts + +InitScrollStorage + lda #$00 + sta $FC + sta $FD + sta $FE + sta $FF + rts + +LogicalColumnToPhysicalColumn +; in: Y contains logical column number +; out: Y contains physical byte offset to use against an HGR base address +; A clobbered +; X preserved + lda GlobalLeftMargin + clc + bcc + +- adc #$03 ++ dey + bpl - + tay + rts + +EraseColumnSelectionIndicator +; out: preserves X/Y + stx @x+1 + sty @y+1 + jsr DrawThinLines +@x ldx #$FD ; SMC +@y ldy #$FD ; SMC + rts + +DrawColumnSelectionIndicator +; out: preserves X/Y + stx @x+1 + sty @y+1 + ldx #$55 + jsr DrawOneSelectionIndicator + ldx #$6B + jsr DrawOneSelectionIndicator +@x ldx #$FD ; SMC +@y ldy #$FD ; SMC + rts + +DrawOneSelectionIndicator + lda HGRLO, x + sta $FE + lda HGRHI, x + sta $FF + ldy GlobalLeftMargin + dey + lda #$D5 + ldx selected_logical_column + beq + +- iny + iny + iny + eor #$7F + dex + bne - ++ ldx #4 +- sta ($FE), y + eor #$7F + iny + dex + bne - + rts + +;------------------------------------------------------------------------------ +; SoftBell +; +; in: none +; out: all registers and flags clobbered +;------------------------------------------------------------------------------ +SoftBell + ldx #32 +- lda #2 + jsr ROM_WAIT + bit SPEAKER + lda #33 + jsr ROM_WAIT + bit SPEAKER + dex + bne - + rts diff --git a/src/ui.font.a b/src/ui.font.a new file mode 100644 index 0000000..9a48619 --- /dev/null +++ b/src/ui.font.a @@ -0,0 +1,201 @@ +;license:MIT +;(c) 2020 by 4am +; +; font drawing routines +; + +!macro COMPUTE_DRAW_ADDRESSES { + ldx charrow + lda HGRLO, x + sta $F0 + sta $F2 + inc $F2 + lda HGRHI, x + sta $F1 ; ($F0) -> base address of top row to draw (used for upper-left block of each character) + sta $F3 ; ($F2) -> base address + 1 of top row to draw (used for upper-right block of each character) + ldx char ; X = 0-based index into LeftFontRow0 array for the character we're drawing + ldy HTAB +} + +!macro INC_AND_RECOMPUTE_DRAW_ADDRESSES { + inc charrow + +COMPUTE_DRAW_ADDRESSES +} + +DrawCharacter +; A contains character (0x41..0x5A) +; X contains logical line number (0x00..0x08) +; Y contains logical column number (0x00..0x0C) +; HGR row is (0x16 * X) +; which needs to total no more than 0xB0 +; character will be drawn on HGR row, byte offset (GlobalLeftMargin + (3 * Y)) +; which needs to total no more than 0x26 +; preserves X/Y +; clobbers A/all flags +; clobbers $ED..$F7 + sta original_char + and #$7F + sec + sbc #$41 + bpl + + rts ++ sta char + stx @x+1 + sty @y+1 + jsr LogicalColumnToPhysicalColumn + sty HTAB + lda #$00 + clc + bcc + +- adc #$16 ++ dex + bpl - + sta charrow + + +COMPUTE_DRAW_ADDRESSES + lda LeftFontRow0, x ; draw row 0, byte 0 + sta ($F0), y + lda RightFontRow0, x ; draw row 0, byte 1 + sta ($F2), y + + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + bit original_char + bmi + + lda LeftFontRow1, x ; draw row 1, byte 0 + sta ($F0), y + lda RightFontRow1, x ; draw row 1, byte 1 + sta ($F2), y + jmp ++ ++ lda #0 + sta ($F0), y + sta ($F2), y +++ + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + lda LeftFontRow2, x ; draw row 2, byte 0 + sta ($F0), y + lda RightFontRow2, x ; draw row 2, byte 1 + sta ($F2), y + + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + bit original_char + bmi + + lda LeftFontRow3, x ; draw row 3, byte 0 + sta ($F0), y + lda RightFontRow3, x ; draw row 3, byte 1 + sta ($F2), y + jmp ++ ++ lda #0 + sta ($F0), y + sta ($F2), y +++ + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + lda LeftFontRow4, x ; draw row 4, byte 0 + sta ($F0), y + lda RightFontRow4, x ; draw row 4, byte 1 + sta ($F2), y + + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + bit original_char + bmi + + lda LeftFontRow5, x ; draw row 5, byte 0 + sta ($F0), y + lda RightFontRow5, x ; draw row 5, byte 1 + sta ($F2), y + jmp ++ ++ lda #0 + sta ($F0), y + sta ($F2), y +++ + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + lda LeftFontRow6, x ; draw row 6, byte 0 + sta ($F0), y + lda RightFontRow6, x ; draw row 6, byte 1 + sta ($F2), y + + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + bit original_char + bmi + + lda LeftFontRow7, x ; draw row 7, byte 0 + sta ($F0), y + lda RightFontRow7, x ; draw row 7, byte 1 + sta ($F2), y + jmp ++ ++ lda #0 + sta ($F0), y + sta ($F2), y +++ + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + lda LeftFontRow8, x ; draw row 8, byte 0 + sta ($F0), y + lda RightFontRow8, x ; draw row 8, byte 1 + sta ($F2), y + + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + bit original_char + bmi + + lda LeftFontRow9, x ; draw row 9, byte 0 + sta ($F0), y + lda RightFontRow9, x ; draw row 9, byte 1 + sta ($F2), y + jmp ++ ++ lda #0 + sta ($F0), y + sta ($F2), y +++ + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + lda LeftFontRow10, x ; draw row 10, byte 0 + sta ($F0), y + lda RightFontRow10, x ; draw row 10, byte 1 + sta ($F2), y + + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + bit original_char + bmi + + lda LeftFontRow11, x ; draw row 11, byte 0 + sta ($F0), y + lda RightFontRow11, x ; draw row 11, byte 1 + sta ($F2), y + jmp ++ ++ lda #0 + sta ($F0), y + sta ($F2), y +++ + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + lda LeftFontRow12, x ; draw row 12, byte 0 + sta ($F0), y + lda RightFontRow12, x ; draw row 12, byte 1 + sta ($F2), y + + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + bit original_char + bmi + + lda LeftFontRow13, x ; draw row 13, byte 0 + sta ($F0), y + lda RightFontRow13, x ; draw row 13, byte 1 + sta ($F2), y + jmp ++ ++ lda #0 + sta ($F0), y + sta ($F2), y +++ + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + lda LeftFontRow14, x ; draw row 14, byte 0 + sta ($F0), y + lda RightFontRow14, x ; draw row 14, byte 1 + sta ($F2), y + + +INC_AND_RECOMPUTE_DRAW_ADDRESSES + bit original_char + bmi + + lda LeftFontRow15, x ; draw row 15, byte 0 + sta ($F0), y + lda RightFontRow15, x ; draw row 15, byte 1 + sta ($F2), y + jmp ++ ++ lda #0 + sta ($F0), y + sta ($F2), y +++ +@x ldx #$FD ; SMC +@y ldy #$FD ; SMC + rts diff --git a/src/ui.font.data.a b/src/ui.font.data.a new file mode 100644 index 0000000..13bae60 --- /dev/null +++ b/src/ui.font.data.a @@ -0,0 +1,865 @@ +; This file is automatically generated +LeftFontRow0 + !byte $80 ; A + !byte $80 ; B + !byte $80 ; C + !byte $80 ; D + !byte $80 ; E + !byte $80 ; F + !byte $80 ; G + !byte $80 ; H + !byte $80 ; I + !byte $80 ; J + !byte $80 ; K + !byte $80 ; L + !byte $80 ; M + !byte $80 ; N + !byte $80 ; O + !byte $80 ; P + !byte $F0 ; Q + !byte $80 ; R + !byte $80 ; S + !byte $80 ; T + !byte $80 ; U + !byte $80 ; V + !byte $80 ; W + !byte $80 ; X + !byte $80 ; Y + !byte $80 ; Z +LeftFontRow1 + !byte $FC ; A + !byte $FE ; B + !byte $E0 ; C + !byte $FE ; D + !byte $FE ; E + !byte $FE ; F + !byte $E0 ; G + !byte $BE ; H + !byte $FC ; I + !byte $F0 ; J + !byte $FE ; K + !byte $FE ; L + !byte $9E ; M + !byte $9E ; N + !byte $E0 ; O + !byte $FE ; P + !byte $F8 ; Q + !byte $FE ; R + !byte $F0 ; S + !byte $FE ; T + !byte $BE ; U + !byte $BF ; V + !byte $BF ; W + !byte $FE ; X + !byte $BF ; Y + !byte $FC ; Z +LeftFontRow2 + !byte $FC ; A + !byte $FE ; B + !byte $F8 ; C + !byte $FE ; D + !byte $FE ; E + !byte $FE ; F + !byte $F8 ; G + !byte $BE ; H + !byte $FE ; I + !byte $F0 ; J + !byte $FE ; K + !byte $FE ; L + !byte $BE ; M + !byte $BE ; N + !byte $F8 ; O + !byte $FE ; P + !byte $FC ; Q + !byte $FE ; R + !byte $F8 ; S + !byte $FE ; T + !byte $BE ; U + !byte $BF ; V + !byte $BF ; W + !byte $FE ; X + !byte $BF ; Y + !byte $FC ; Z +LeftFontRow3 + !byte $FC ; A + !byte $FE ; B + !byte $FC ; C + !byte $FE ; D + !byte $FE ; E + !byte $FE ; F + !byte $FC ; G + !byte $BE ; H + !byte $FC ; I + !byte $F0 ; J + !byte $FE ; K + !byte $FE ; L + !byte $BE ; M + !byte $FC ; N + !byte $FC ; O + !byte $FE ; P + !byte $9C ; Q + !byte $FE ; R + !byte $FC ; S + !byte $FE ; T + !byte $BE ; U + !byte $BF ; V + !byte $BF ; W + !byte $FE ; X + !byte $BF ; Y + !byte $FC ; Z +LeftFontRow4 + !byte $F0 ; A + !byte $B8 ; B + !byte $BC ; C + !byte $B8 ; D + !byte $B8 ; E + !byte $B8 ; F + !byte $BC ; G + !byte $9C ; H + !byte $E0 ; I + !byte $80 ; J + !byte $B8 ; K + !byte $B8 ; L + !byte $FC ; M + !byte $FC ; N + !byte $BC ; O + !byte $B8 ; P + !byte $8E ; Q + !byte $B8 ; R + !byte $9C ; S + !byte $CE ; T + !byte $9C ; U + !byte $9C ; V + !byte $8E ; W + !byte $B8 ; X + !byte $9C ; Y + !byte $9C ; Z +LeftFontRow5 + !byte $F0 ; A + !byte $B8 ; B + !byte $9E ; C + !byte $B8 ; D + !byte $B8 ; E + !byte $B8 ; F + !byte $9E ; G + !byte $9C ; H + !byte $E0 ; I + !byte $80 ; J + !byte $B8 ; K + !byte $B8 ; L + !byte $FC ; M + !byte $FC ; N + !byte $9E ; O + !byte $B8 ; P + !byte $8E ; Q + !byte $B8 ; R + !byte $9C ; S + !byte $CE ; T + !byte $9C ; U + !byte $9C ; V + !byte $8C ; W + !byte $F0 ; X + !byte $B8 ; Y + !byte $9C ; Z +LeftFontRow6 + !byte $B0 ; A + !byte $F8 ; B + !byte $8E ; C + !byte $B8 ; D + !byte $F8 ; E + !byte $B8 ; F + !byte $8E ; G + !byte $FC ; H + !byte $E0 ; I + !byte $80 ; J + !byte $B8 ; K + !byte $B8 ; L + !byte $FC ; M + !byte $DC ; N + !byte $8E ; O + !byte $B8 ; P + !byte $8E ; Q + !byte $B8 ; R + !byte $BC ; S + !byte $CE ; T + !byte $9C ; U + !byte $B8 ; V + !byte $CC ; W + !byte $F0 ; X + !byte $F0 ; Y + !byte $9C ; Z +LeftFontRow7 + !byte $B8 ; A + !byte $F8 ; B + !byte $8E ; C + !byte $B8 ; D + !byte $F8 ; E + !byte $F8 ; F + !byte $8E ; G + !byte $FC ; H + !byte $E0 ; I + !byte $80 ; J + !byte $F8 ; K + !byte $B8 ; L + !byte $DC ; M + !byte $DC ; N + !byte $8E ; O + !byte $B8 ; P + !byte $8E ; Q + !byte $F8 ; R + !byte $F8 ; S + !byte $CE ; T + !byte $9C ; U + !byte $B8 ; V + !byte $CC ; W + !byte $E0 ; X + !byte $F0 ; Y + !byte $C0 ; Z +LeftFontRow8 + !byte $F8 ; A + !byte $F8 ; B + !byte $8E ; C + !byte $B8 ; D + !byte $F8 ; E + !byte $F8 ; F + !byte $8E ; G + !byte $FC ; H + !byte $E0 ; I + !byte $8E ; J + !byte $F8 ; K + !byte $B8 ; L + !byte $DC ; M + !byte $9C ; N + !byte $8E ; O + !byte $F8 ; P + !byte $9C ; Q + !byte $F8 ; R + !byte $E0 ; S + !byte $C0 ; T + !byte $9C ; U + !byte $B8 ; V + !byte $EC ; W + !byte $E0 ; X + !byte $E0 ; Y + !byte $E0 ; Z +LeftFontRow9 + !byte $F8 ; A + !byte $B8 ; B + !byte $8E ; C + !byte $B8 ; D + !byte $B8 ; E + !byte $F8 ; F + !byte $8E ; G + !byte $9C ; H + !byte $E0 ; I + !byte $8E ; J + !byte $F8 ; K + !byte $B8 ; L + !byte $DC ; M + !byte $9C ; N + !byte $8E ; O + !byte $F8 ; P + !byte $FC ; Q + !byte $F8 ; R + !byte $80 ; S + !byte $C0 ; T + !byte $9C ; U + !byte $F0 ; V + !byte $EC ; W + !byte $F0 ; X + !byte $C0 ; Y + !byte $E0 ; Z +LeftFontRow10 + !byte $FC ; A + !byte $B8 ; B + !byte $9E ; C + !byte $B8 ; D + !byte $B8 ; E + !byte $B8 ; F + !byte $9E ; G + !byte $9C ; H + !byte $E0 ; I + !byte $8E ; J + !byte $B8 ; K + !byte $B8 ; L + !byte $9C ; M + !byte $9C ; N + !byte $9E ; O + !byte $F8 ; P + !byte $F8 ; Q + !byte $B8 ; R + !byte $8C ; S + !byte $C0 ; T + !byte $9C ; U + !byte $F0 ; V + !byte $FC ; W + !byte $B8 ; X + !byte $C0 ; Y + !byte $B0 ; Z +LeftFontRow11 + !byte $9C ; A + !byte $B8 ; B + !byte $BC ; C + !byte $B8 ; D + !byte $B8 ; E + !byte $B8 ; F + !byte $BC ; G + !byte $9C ; H + !byte $E0 ; I + !byte $9E ; J + !byte $B8 ; K + !byte $B8 ; L + !byte $9C ; M + !byte $9C ; N + !byte $9C ; O + !byte $B8 ; P + !byte $E0 ; Q + !byte $B8 ; R + !byte $9C ; S + !byte $C0 ; T + !byte $BC ; U + !byte $E0 ; V + !byte $BC ; W + !byte $9C ; X + !byte $C0 ; Y + !byte $98 ; Z +LeftFontRow12 + !byte $BF ; A + !byte $FE ; B + !byte $FC ; C + !byte $FE ; D + !byte $FE ; E + !byte $FE ; F + !byte $FC ; G + !byte $BE ; H + !byte $FE ; I + !byte $FE ; J + !byte $FE ; K + !byte $FE ; L + !byte $FE ; M + !byte $BE ; N + !byte $FC ; O + !byte $FE ; P + !byte $B0 ; Q + !byte $FE ; R + !byte $FC ; S + !byte $F8 ; T + !byte $FC ; U + !byte $E0 ; V + !byte $BC ; W + !byte $BF ; X + !byte $F8 ; Y + !byte $FC ; Z +LeftFontRow13 + !byte $BF ; A + !byte $FE ; B + !byte $F8 ; C + !byte $FE ; D + !byte $FE ; E + !byte $FE ; F + !byte $F8 ; G + !byte $BE ; H + !byte $FE ; I + !byte $FC ; J + !byte $FE ; K + !byte $FE ; L + !byte $FE ; M + !byte $BE ; N + !byte $F8 ; O + !byte $FE ; P + !byte $F8 ; Q + !byte $FE ; R + !byte $FC ; S + !byte $F8 ; T + !byte $F8 ; U + !byte $E0 ; V + !byte $BC ; W + !byte $BF ; X + !byte $F8 ; Y + !byte $FC ; Z +LeftFontRow14 + !byte $BF ; A + !byte $FE ; B + !byte $E0 ; C + !byte $FE ; D + !byte $FE ; E + !byte $FE ; F + !byte $E0 ; G + !byte $BE ; H + !byte $FE ; I + !byte $F8 ; J + !byte $FE ; K + !byte $FE ; L + !byte $FE ; M + !byte $BE ; N + !byte $E0 ; O + !byte $FE ; P + !byte $FC ; Q + !byte $FE ; R + !byte $DC ; S + !byte $F8 ; T + !byte $F0 ; U + !byte $C0 ; V + !byte $98 ; W + !byte $BF ; X + !byte $F8 ; Y + !byte $FC ; Z +LeftFontRow15 + !byte $80 ; A + !byte $80 ; B + !byte $80 ; C + !byte $80 ; D + !byte $80 ; E + !byte $80 ; F + !byte $80 ; G + !byte $80 ; H + !byte $80 ; I + !byte $80 ; J + !byte $80 ; K + !byte $80 ; L + !byte $80 ; M + !byte $80 ; N + !byte $80 ; O + !byte $80 ; P + !byte $FC ; Q + !byte $80 ; R + !byte $80 ; S + !byte $80 ; T + !byte $80 ; U + !byte $80 ; V + !byte $80 ; W + !byte $80 ; X + !byte $80 ; Y + !byte $80 ; Z +RightFontRow0 + !byte $80 ; A + !byte $80 ; B + !byte $80 ; C + !byte $80 ; D + !byte $80 ; E + !byte $80 ; F + !byte $80 ; G + !byte $80 ; H + !byte $80 ; I + !byte $80 ; J + !byte $80 ; K + !byte $80 ; L + !byte $80 ; M + !byte $80 ; N + !byte $80 ; O + !byte $80 ; P + !byte $87 ; Q + !byte $80 ; R + !byte $80 ; S + !byte $80 ; T + !byte $80 ; U + !byte $80 ; V + !byte $80 ; W + !byte $80 ; X + !byte $80 ; Y + !byte $80 ; Z +RightFontRow1 + !byte $83 ; A + !byte $87 ; B + !byte $BB ; C + !byte $87 ; D + !byte $BF ; E + !byte $BF ; F + !byte $BB ; G + !byte $BE ; H + !byte $8F ; I + !byte $FF ; J + !byte $BE ; K + !byte $83 ; L + !byte $F8 ; M + !byte $BE ; N + !byte $87 ; O + !byte $87 ; P + !byte $8F ; Q + !byte $8F ; R + !byte $8D ; S + !byte $BF ; T + !byte $BE ; U + !byte $FE ; V + !byte $FC ; W + !byte $FE ; X + !byte $FE ; Y + !byte $9F ; Z +RightFontRow2 + !byte $87 ; A + !byte $8F ; B + !byte $BF ; C + !byte $9F ; D + !byte $BF ; E + !byte $BF ; F + !byte $BF ; G + !byte $BE ; H + !byte $9F ; I + !byte $FF ; J + !byte $FE ; K + !byte $83 ; L + !byte $FC ; M + !byte $BE ; N + !byte $9F ; O + !byte $9F ; P + !byte $9F ; Q + !byte $9F ; R + !byte $8F ; S + !byte $BF ; T + !byte $BE ; U + !byte $FE ; V + !byte $FC ; W + !byte $FE ; X + !byte $FE ; Y + !byte $9F ; Z +RightFontRow3 + !byte $87 ; A + !byte $9F ; B + !byte $BF ; C + !byte $BF ; D + !byte $BF ; E + !byte $BF ; F + !byte $BF ; G + !byte $BE ; H + !byte $8F ; I + !byte $FF ; J + !byte $FE ; K + !byte $83 ; L + !byte $FC ; M + !byte $9C ; N + !byte $BF ; O + !byte $9F ; P + !byte $9C ; Q + !byte $BF ; R + !byte $8F ; S + !byte $BF ; T + !byte $BE ; U + !byte $FE ; V + !byte $FC ; W + !byte $FE ; X + !byte $FE ; Y + !byte $8F ; Z +RightFontRow4 + !byte $87 ; A + !byte $9C ; B + !byte $BC ; C + !byte $BC ; D + !byte $B8 ; E + !byte $B8 ; F + !byte $BC ; G + !byte $9C ; H + !byte $81 ; I + !byte $8E ; J + !byte $9C ; K + !byte $80 ; L + !byte $BE ; M + !byte $9C ; N + !byte $BC ; O + !byte $BC ; P + !byte $B8 ; Q + !byte $BC ; R + !byte $8C ; S + !byte $BB ; T + !byte $9C ; U + !byte $B8 ; V + !byte $F0 ; W + !byte $9C ; X + !byte $9C ; Y + !byte $8E ; Z +RightFontRow5 + !byte $8E ; A + !byte $9C ; B + !byte $B8 ; C + !byte $F8 ; D + !byte $80 ; E + !byte $80 ; F + !byte $B8 ; G + !byte $9C ; H + !byte $81 ; I + !byte $8E ; J + !byte $8E ; K + !byte $80 ; L + !byte $BE ; M + !byte $9C ; N + !byte $F8 ; O + !byte $B8 ; P + !byte $B8 ; Q + !byte $B8 ; R + !byte $80 ; S + !byte $BB ; T + !byte $9C ; U + !byte $9C ; V + !byte $B1 ; W + !byte $8E ; X + !byte $9E ; Y + !byte $86 ; Z +RightFontRow6 + !byte $8E ; A + !byte $8F ; B + !byte $B8 ; C + !byte $F0 ; D + !byte $83 ; E + !byte $80 ; F + !byte $B8 ; G + !byte $9F ; H + !byte $81 ; I + !byte $8E ; J + !byte $87 ; K + !byte $80 ; L + !byte $BE ; M + !byte $9D ; N + !byte $F0 ; O + !byte $B8 ; P + !byte $B8 ; Q + !byte $B8 ; R + !byte $80 ; S + !byte $BB ; T + !byte $9C ; U + !byte $9C ; V + !byte $B3 ; W + !byte $87 ; X + !byte $8F ; Y + !byte $83 ; Z +RightFontRow7 + !byte $8E ; A + !byte $8F ; B + !byte $80 ; C + !byte $F0 ; D + !byte $87 ; E + !byte $87 ; F + !byte $80 ; G + !byte $9F ; H + !byte $81 ; I + !byte $8E ; J + !byte $83 ; K + !byte $90 ; L + !byte $BB ; M + !byte $9D ; N + !byte $F0 ; O + !byte $BC ; P + !byte $B8 ; Q + !byte $9F ; R + !byte $87 ; S + !byte $BB ; T + !byte $9C ; U + !byte $9E ; V + !byte $B3 ; W + !byte $83 ; X + !byte $87 ; Y + !byte $81 ; Z +RightFontRow8 + !byte $9F ; A + !byte $9F ; B + !byte $80 ; C + !byte $F0 ; D + !byte $83 ; E + !byte $87 ; F + !byte $FF ; G + !byte $9F ; H + !byte $81 ; I + !byte $8E ; J + !byte $8F ; K + !byte $B8 ; L + !byte $BB ; M + !byte $9F ; N + !byte $F0 ; O + !byte $BF ; P + !byte $9C ; Q + !byte $8F ; R + !byte $8F ; S + !byte $83 ; T + !byte $9C ; U + !byte $8E ; V + !byte $B7 ; W + !byte $87 ; X + !byte $87 ; Y + !byte $80 ; Z +RightFontRow9 + !byte $9F ; A + !byte $B8 ; B + !byte $80 ; C + !byte $F0 ; D + !byte $B8 ; E + !byte $87 ; F + !byte $FF ; G + !byte $9C ; H + !byte $81 ; I + !byte $8E ; J + !byte $8F ; K + !byte $B8 ; L + !byte $BB ; M + !byte $9F ; N + !byte $F0 ; O + !byte $9F ; P + !byte $9F ; Q + !byte $8F ; R + !byte $9E ; S + !byte $83 ; T + !byte $9C ; U + !byte $8E ; V + !byte $B6 ; W + !byte $87 ; X + !byte $83 ; Y + !byte $9C ; Z +RightFontRow10 + !byte $9F ; A + !byte $B8 ; B + !byte $80 ; C + !byte $F8 ; D + !byte $B8 ; E + !byte $80 ; F + !byte $FF ; G + !byte $9C ; H + !byte $81 ; I + !byte $8E ; J + !byte $9C ; K + !byte $B8 ; L + !byte $B9 ; M + !byte $9E ; N + !byte $F8 ; O + !byte $87 ; P + !byte $8F ; Q + !byte $9E ; R + !byte $9C ; S + !byte $83 ; T + !byte $9C ; U + !byte $87 ; V + !byte $BE ; W + !byte $8E ; X + !byte $83 ; Y + !byte $9C ; Z +RightFontRow11 + !byte $B8 ; A + !byte $B8 ; B + !byte $B8 ; C + !byte $BC ; D + !byte $B8 ; E + !byte $80 ; F + !byte $B8 ; G + !byte $9C ; H + !byte $81 ; I + !byte $8F ; J + !byte $9C ; K + !byte $B8 ; L + !byte $B8 ; M + !byte $9E ; N + !byte $BC ; O + !byte $80 ; P + !byte $87 ; Q + !byte $BC ; R + !byte $9C ; S + !byte $83 ; T + !byte $9E ; U + !byte $87 ; V + !byte $BE ; W + !byte $9C ; X + !byte $83 ; Y + !byte $9C ; Z +RightFontRow12 + !byte $FE ; A + !byte $BF ; B + !byte $BF ; C + !byte $BF ; D + !byte $BF ; E + !byte $83 ; F + !byte $BF ; G + !byte $BE ; H + !byte $9F ; I + !byte $8F ; J + !byte $F9 ; K + !byte $BF ; L + !byte $FE ; M + !byte $9C ; N + !byte $BF ; O + !byte $83 ; P + !byte $90 ; Q + !byte $FD ; R + !byte $9F ; S + !byte $9F ; T + !byte $9F ; U + !byte $83 ; V + !byte $BC ; W + !byte $FE ; X + !byte $9F ; Y + !byte $9F ; Z +RightFontRow13 + !byte $FE ; A + !byte $9F ; B + !byte $BF ; C + !byte $9F ; D + !byte $BF ; E + !byte $83 ; F + !byte $BF ; G + !byte $BE ; H + !byte $9F ; I + !byte $87 ; J + !byte $F9 ; K + !byte $BF ; L + !byte $FE ; M + !byte $9C ; N + !byte $9F ; O + !byte $83 ; P + !byte $BF ; Q + !byte $F9 ; R + !byte $8F ; S + !byte $9F ; T + !byte $8F ; U + !byte $83 ; V + !byte $9C ; W + !byte $FE ; X + !byte $9F ; Y + !byte $9F ; Z +RightFontRow14 + !byte $FE ; A + !byte $8F ; B + !byte $8F ; C + !byte $87 ; D + !byte $BF ; E + !byte $83 ; F + !byte $8F ; G + !byte $BE ; H + !byte $9F ; I + !byte $83 ; J + !byte $F1 ; K + !byte $BF ; L + !byte $FE ; M + !byte $98 ; N + !byte $87 ; O + !byte $83 ; P + !byte $BF ; Q + !byte $F1 ; R + !byte $87 ; S + !byte $9F ; T + !byte $87 ; U + !byte $83 ; V + !byte $9C ; W + !byte $FE ; X + !byte $9F ; Y + !byte $9F ; Z +RightFontRow15 + !byte $80 ; A + !byte $80 ; B + !byte $80 ; C + !byte $80 ; D + !byte $80 ; E + !byte $80 ; F + !byte $80 ; G + !byte $80 ; H + !byte $80 ; I + !byte $80 ; J + !byte $80 ; K + !byte $80 ; L + !byte $80 ; M + !byte $80 ; N + !byte $80 ; O + !byte $80 ; P + !byte $9F ; Q + !byte $80 ; R + !byte $80 ; S + !byte $80 ; T + !byte $80 ; U + !byte $80 ; V + !byte $80 ; W + !byte $80 ; X + !byte $80 ; Y + !byte $80 ; Z diff --git a/src/ui.title.a b/src/ui.title.a new file mode 100644 index 0000000..099eac8 --- /dev/null +++ b/src/ui.title.a @@ -0,0 +1,130 @@ +TitlePage + jsr Home + ;TODO add logical-width parameter + jsr DrawThinLines + + lda #3 + sta row + +LDADDR title + +ST16 $FE +-- lda #6 + sta column +- ldy column + lda ($FE), y + ldx row + jsr DrawCharacter + dec column + bpl - + lda $FE + clc + adc #7 + sta $FE + bcc + + inc $FF ++ inc row + lda row + cmp #6 + bne -- + + bit GFXMODE + + lda #$00 + jsr ROM_WAIT + +RTS_IF_KEY + jsr ROM_WAIT + +RTS_IF_KEY + jsr ROM_WAIT + +RTS_IF_KEY + + ldy #$00 + jsr ScrollUp + ldy #$02 + jsr ScrollDown + iny + jsr ScrollUp + ldy #$05 + jsr ScrollDown + iny + jsr ScrollUp + +@loop + +RTS_IF_KEY + lda #$00 + jsr ROM_WAIT + +RTS_IF_KEY + jsr ROM_WAIT + +RTS_IF_KEY + jsr ROM_WAIT + +RTS_IF_KEY + + ldy #$00 + jsr ScrollDown + jsr ScrollDown + iny + jsr ScrollDown + iny + jsr ScrollUp + iny + jsr ScrollDown + iny + jsr ScrollDown + iny + jsr ScrollUp + iny + jsr ScrollDown + jsr ScrollDown + + +RTS_IF_KEY + lda #$00 + jsr ROM_WAIT + +RTS_IF_KEY + jsr ROM_WAIT + +RTS_IF_KEY + jsr ROM_WAIT + +RTS_IF_KEY + + ldy #$00 + jsr ScrollUp + ldy #$02 + jsr ScrollUp + iny + jsr ScrollDown + ldy #$05 + jsr ScrollUp + iny + jsr ScrollUp + + +RTS_IF_KEY + lda #$00 + jsr ROM_WAIT + +RTS_IF_KEY + jsr ROM_WAIT + +RTS_IF_KEY + jsr ROM_WAIT + +RTS_IF_KEY + rts +!if 0 { + ldy #$00 + jsr ScrollUp + iny + jsr ScrollUp + iny + jsr ScrollDown + jsr ScrollDown + iny + jsr ScrollUp + jsr ScrollUp + iny + jsr ScrollUp + iny + jsr ScrollDown + jsr ScrollDown + iny + jsr ScrollUp + + jmp @loop +} +title + !raw "PELTEOT" + !raw "LIRFICS" + !raw "M TL RN"