From 55ab780ddbdaab9792debbb16e792a02b0ad013d Mon Sep 17 00:00:00 2001 From: 4am Date: Fri, 17 Apr 2020 20:59:25 -0400 Subject: [PATCH] initial import --- .gitignore | 2 + Makefile | 37 + .../courier-prime-specimen.png | Bin 0 -> 2693 bytes .../courier-prime-specimen.xcf | Bin 0 -> 7586 bytes res/Courier Double Prime/font.py | 28 + res/Courier Double Prime/font.txt | 416 ++++++ res/_FileInformation.txt | 1 + res/levels/A | 130 ++ res/levels/B | 130 ++ res/levels/C | 130 ++ res/levels/D | 130 ++ res/levels/E | 179 +++ res/levels/F | 179 +++ res/levels/G | 179 +++ res/levels/H | 179 +++ res/levels/I | 520 ++++++++ res/levels/J | 43 + res/levels/samples/01 | 12 + res/levels/samples/02 | 37 + res/levels/unsorted | 1138 +++++++++++++++++ res/work.po | Bin 0 -> 143360 bytes src/constants.a | 56 + src/ds.puzzle.a | 256 ++++ src/hw.vbl.a | 41 + src/hw.vbl.init.a | 45 + src/macros.a | 176 +++ src/million.a | 134 ++ src/million.init.a | 275 ++++ src/ui.common.a | 165 +++ src/ui.font.a | 201 +++ src/ui.font.data.a | 865 +++++++++++++ src/ui.title.a | 130 ++ 32 files changed, 5814 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 res/Courier Double Prime/courier-prime-specimen.png create mode 100644 res/Courier Double Prime/courier-prime-specimen.xcf create mode 100755 res/Courier Double Prime/font.py create mode 100644 res/Courier Double Prime/font.txt create mode 100644 res/_FileInformation.txt create mode 100644 res/levels/A create mode 100644 res/levels/B create mode 100644 res/levels/C create mode 100644 res/levels/D create mode 100644 res/levels/E create mode 100644 res/levels/F create mode 100644 res/levels/G create mode 100644 res/levels/H create mode 100644 res/levels/I create mode 100644 res/levels/J create mode 100644 res/levels/samples/01 create mode 100644 res/levels/samples/02 create mode 100644 res/levels/unsorted create mode 100644 res/work.po create mode 100644 src/constants.a create mode 100644 src/ds.puzzle.a create mode 100644 src/hw.vbl.a create mode 100644 src/hw.vbl.init.a create mode 100644 src/macros.a create mode 100644 src/million.a create mode 100644 src/million.init.a create mode 100644 src/ui.common.a create mode 100644 src/ui.font.a create mode 100644 src/ui.font.data.a create mode 100644 src/ui.title.a 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 0000000000000000000000000000000000000000..da1b8839167506e51de528afe24641a1bfaf89ee GIT binary patch literal 2693 zcmds3X;4#F7`+Kdf)q>&PFV~@sEUqJ(5dW!$`Yu8A_%ezvJ?;y4Fm{*2-?vp5|CC2 zM6hHKu&mZ3tPy2e(SXQe5G;#f6O$0xLI5Rw{PTw!w$thKzPWSfoj2#+^X~V3_uPwz zT?ne{wbugxRGl2{jsO6s0szZGDnST-wsQ+KCet$RYhc;Hzj(-dXX`JhxTzdBjs7=G>-(XG49-d&Bv{k8Tjc%^$` zURTDf0q`G5%?H2+zyTJ(0E!9#(gpxUETkU==|=)8P<+?t_rU)=>-`cwwAR{LAO79< zt@UrQJ|2*FDO@}2t>9C)$xf&6(rP|>N}$i2@RW1zq}=N_Z62l`gikp zk=k$5=i7J2w9jyoJ&Q_$Be^>Cv7Og~G7EMghP@rY?w{(U6=T>YJSt4BjqrRUePua- z*T}hnspFDXY;CEq>hY~v%7WcG@!1_ZXjn12P%G_g3z|j1{jDod>gVX@7NUyi;w-a) zr)NfI9t_p!3bp$@hpZL3vz3c2P&LSwG|N?){@r*hbDz|-iOjp~`M$nLlw@uIZUgWh zll>g}hMvCs9iiU-pw`0VEMxQ~)pTTQPPVZJxx3XTJu1@TS`CgnyY~nZ3zU`GOVi_m zHH2ibhd4Pbxyv@3a$wrfN3`~8l!Er%*CtCvx29@2+bN&(Fn3Zu6H}mU|r%&O|?gtG)+djv@2kN7pA&H_jz8p z9qvob;(WVIm-Fnl*@yEuabZ`z!$KS}KbZTKV8d_<10MP^ePJQ*P8%!J^JI%?=E)Ro zaF&;>$4z}IE7Jk6*5>r&aT}ldGJ#=eghX0?vG$0i<>WZ6V3}l9Sg={!FBIAoc$T_B zjkLaM2+itOc}>m`^<<3tnWgn4d7h-9BI>4ttOm5uhAUu-CjkYU)Cq_eB7;W}YOm?8 zW&AOmUkrcN_(TP*S!WU1z+brPFPt{zXt6hfUL$ydLTCDm3+duP$3WrhN4i^ti}c@y z?BGy%zCBCQ2r?KMUT_~;nu`@q{(i70)3-OT5I?ywqS%cCj6_eTG>o!kLW~t?j>`a- zGp(V*p4sCd2gClB%I5~Ed6pO9AU6kXqh^5mFPaQ=P=1D?t=(i+kJq)c{%2k@e|!ptmh|?JO*af`4W=#^cilzl}h>n#wx9t124KMw)vQLqVI8-O?v12%>< z^&W=)INGifhRsh^XJ_4tk9$So`mvf@@ZD+WlIPDj<3~=MqGX*`^=1ntH(#oG)8s+h zQoVJ5vFtkaYT29Kne8o>rmE#?&FR%mzE+wnIQ@P7`dWn;2t_;5b#j%iM((Ulu1?J*v%#fF#uXw)WRi8HA20*ciDw>aA?ot z!w~Pkm+)_od=CSoQ5zVG+Q5OR4IGTxz@exOj7M$YaMT8lL~Y<`)CP`4ZQyv+22Mn6 zV4@PWg_BVmcsgnWr=m9SOwCFGOwNyfLsl zd{OMd+jp^A@tvNr>U_;}YtE^fH|sj1)$+8F<@tW-3_M|u57I+(<^6olTX4&KwJ%hB zuTb_1b*ECrZMje>&EpW`^thG$e4XP>7V2((+N-%!zE{N?s$Tc z57WT;W|7AgzGH`1_x6x5XAQiockjhHWE1dcyR7>Rj*2)uZoq+V(?^sobzW&geW{W` zQl*28iUoI7UgX=gc5ekU|I2`mHphYA8_nS2Jp^kw!KsI_z$ zlvW+_&y2w^H2b&9BvEE;j??syr6)e5(Ne|)h};gcn0E?ulFDKdQkWwPMPej2IerSd zjIHn)EB0eNGoa(@Zh)h-74&1kAq08|?J${3R#$T=a9OAu5V5k8@FiRhl8m_O(gG$! z62Sy@Yo1hy(My6al_bHHWSKyxF>nXuTyHX26M!TpN4^9y20NT=3dP3Yb?STS$i0o$ z);v?Wt$Z`4k%>JPE`vs2=!fw$8`4c5CDgU(DKc&wrn%4lwUTU6D@J0#LoX$& zYiTea37s=892yS0CXr-rZ?d8&NJ5b-p4CfFm&=;dGqRZ0X92($RuOj`28YWcsfFCE zxqCC3tPEzCKnGf;FoE>wQb)PB?ff?odG3#4N@ySj20i4Y8v^Es0xm=@*i{8Fy%n2n zo)P8d>rhqYIyFvghF4z^4gpQG3y$qmM(?4d@;8VlU|6D^NMwdATVW~U#(gvr@ z;A~~LX(};FObJ`&)zZZrRyVh##A*UQEt9$@&9MA+4-0GN3n3Y1&C}rvf0!fY8q;s| zSwkMO?=gre5;HsAo2`f~@0l!Cs?FN5K!kNIF_Ai^CN)HpJw%atGs{Mnt?bw$XN6@j zohZ_yqV2 z_zL(Q_zCz0xUJMy__4Jc$N@WmL0}(n6gUG+0u|sg@H+4|@ILS{@F{Q;_zw6H_!;;O zxQkElSzsg31M~rVfkVJ);6>m9@G|fk@Fwsc@F8#=_#F5K_yM>D{0jVz7$kx9z;<94 zFbs?WCxP=okuh3Yr-J*qAA|o*4aAYl{{Z+K>nSX!ueqjhT?6#yiI#te4g$P-0loeH E2`>u0$^ZZW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f1011116a33c4976c062a06ead9ef32caee0b43f GIT binary patch literal 143360 zcmeI4eSA|zy7=duleS6P(zLW1UOmfe0;pB@{x%m8Dndz1D4>WhtGhu(Q+#9h-ra?( zd#&2A+1gXnU0oa9V2lKNVoyC$LF*+Zyl&FvWgxt?TA(156lgg>d8a48XHsC@`}W8E zeD?l6`}<5O$()%vGtYeIndi(rGpCG2=4^L!wBEr%an)LG_BRa;H5kQGms z2Z@}3v|aZE%BgloSQZdK5$T^!Y(8-RjMewgQP#Vv4pOR2cE|Y_w z7d4m-lpCKPozv*f?V25!T`p(F^~!@jO?A1%>dbkKq4IWChre|h&YP7ukMH&wLgn!k zzAF|gcb1ZmSt4?l`$ksJu3i+Yor3E7;p^2_lt8{%!#bmQjTKX=C5 z2l(qh0lRZXV3Bj?b5^7sIcD0-S-+JbmIF~F=Z7QKe8?F;~&22 z8{RTc=V{Jx87|o7=z_tZZ_oDi8@6ut?cU+rx?}w&AKtZN(~g7>QUVW{xd|B)gW;;E zILV*iiu=16d|~xOd!W>u71x+Kt==@jc~4+gd7yMjdAajmy>otGrgQx2iQ(Ty`E|Ok z@m=?H-6L}lT<40~10{Or1JKk3fd`!PEJx=ng|epW0XMtl0So`UE-=r?zo^6C`Ch5M zUu&{#xnJ3C)Vh>&;o7L-3Zg%hzyJXbU6@m5vz5)Q_zMyJ4@MRtH1PS|_*@2MA|rEc zpxnrn%0i=1ayq)}2RVZg`VOT7?2Tj^_$z2 z95atO+woC;TRJ-=3YYrboNeDI$kP1TmCj5&TkM<^y`qJzKQhf@i}SQPt;wL#l^C*m z@6#=1bydzB$ZO$mQDwf@0Fnt;H2m*X>9tYV@JSdQnyh4s=uHUl8zxGc(L(lUp*X_- z%Q$Huuzall7XzZY#Fc_3B3>0TBGT(o`1RlB8x6(8S!|f}MAVQaY6Vrr8vi}%{9>zvaRwJj zIUB*dQiXFs0>clb%Nyg9lw09Ofr$zaMnS-38vUSUnr+K8IIFxO9S{~o1r$}Xh|K*s z1HN>u&=7%Im3+}AWJdh1fz~lO5c}FFB?I8v5sxC9xzVysdX+WjDKje>p^6o67hYu{ zVN2F%`L5uKLLUoWqaq=9bnT$gb$O#9rAj|q9^&Idg+W(-p^_6SYz!0`E7^FVd!G$y z1yBNT&5USS!h4#CYo=KBWw%@yYd_Lg;Y@9Y8-o#SFqI3q6oxrtkYTLbq$C@2f=9_o4Oc(Lhwy?I~#4rb?|lGhV9P zf$x-_*TxUyi4YlkNsEd8Z3h37utf(kt?P9-AHKK7byx==dGKbrw9N-bhYyVQHfFWr z3yL~)Pw%0_Fs%Dd`A(iXbi}uQcf7Z|&)3y`@~Hk*?Y}cF9K;kdnJ_3J58%#Ed*Tel z6X!I@MeyY=2;`T$bD=`cHbW+f!@m)GS z{@T@Q=<}gi$l$4h0p;=QwpOuN5q+Kybq$q+g*Butv9&rp7ru9{)8ScCREHmvBD(nd z@`KP+>1!RddZ58dW_+Pig2!BI_HgMwouZdeH2xmu1Va=kfKQJo)Z#zun%3yV@s^%7 zy7K4O=z=ZvIsyfJhQ-;wku5*dd8DkgCV;=rm$-Dc?`V%tIdkgRnL|B53veAebL^;( zIPJin_ty~Hny=+2iRmB2Re_c;ECWO}4Ac)l%=LwJbD}-5d-JwOEaUeo+ZJ z5s}`A!ml0NcR9osS(J&L>y`1HSQ#x=b!IBV#FEbAIInr+l}IpDno-)g)U4;qAW^xIGl z&e(>un6t=?QP4yMHcE`8uGpCq$hLH6IJ0GTi{5CLilagf8PI&S%HMtk%pU(+wGBp< zKP#-`yC6zThMS{Mo}GZX{^Lh0 z3Re`ZFtpa)5fKLo%f^WtocVm%^uqFS;-AtX`7zL`vGJ6=K=|c2UslKfYWG8vPYoH& zT%5Dud-zXHMs0Z@ALlv?EL!Qzc*rN69WVT99Ir8%+{0T*+1rWWvO|K^{K}l-h#s?!SgYX_#5E{|QgHh*g5SL01f3>qR>-5n9V^viJ`L&VK__=xnYah`k< z{6WMH*aP_h8IpykO~y)2_|63B!V#13j0sB7JMROvp6;CCECpA*!8wyh$ae)KWfh&U z)5IS(A#AdOG23Z!3|vSrj8n$MS?IMueta_?GHLlZLm@=QIj}aGv|?yX;$~;Q?b0~X z|74rOSzwn^I|vwHXTcc&ug_@b&G=Eyp{L5DNneHg}a zLwQizY4V=hD}873&hM9wn7sCWFlN1XM2J$AgGJSJ!`y_h%_xA*5xbyY#H-LFwtLMm zW@N1;Jw6zteTAVqKdk^6^3Q{y9?nAYQA9p&A|E#wKVG9eNkRoqW6ZetCg)HH4|Wb& ze6w>{tMYtZ<3val#EIl)Z*U?E;%1RVc|ZML_$w0Tt0y!!PVD5AL44N){>=%tJ!aS; z89tG}IKfsn0a8V@>SiUUvA!^duXGh{xf!2Zb(5kc*PCu~UxMtA2XZ!878{%fH`|qO z4-DR16u$YKu}fx!OYM0eKyPba!FNr#@c8-M-P#CoIMxEM0K znb@XbZg%rfr?Gm7-D>6<9p&Z0uw$aDSW{k(FPS;J&NO6--jq8fd%}=uRUS@ zf0};6h@1%|eZmO%KahU?`?}TqkKfv5#w#0&->_Qy5b86aKIV=-W0lqFXLX|xI`knE z{E%xTN#;q9elw88&zeZm<&VP*Y78S}PN5UJ$IzQHI%KTOMsGHvLk(|!iVjsG^kxtp z`uJnZ6_fo#=Jl)(+1IrWheJ#u%d`JckpEGP&(nf#^`Mk1n!@Mckuaro#Z>?N755}p zOd~c#WS#d}`23AvEXGA(UOPTAFeXG|WbOZ>8vpvHHh=b-Dc^vPyeXR$DB!=(6C7NDCv* znFG@d>7j@%5vhGAQu}ViF1!;F;Oh$a=hS;C+ZPcV7qL&@XUpld?Ky}(Jn-NDL;qf0 z(|zW9=gqUtniD zw970nycelk8EHnH0A|t~QTR34&;dz^D7nR2n5DwfNY+ATSosJM$rULX$Yh&*a6o{x z=W|T+ynSIyhE@EK&tA`K*BkvBUrq~R%~{ULdi~6YJ~>~g_8wyUvx$&w`* zQv`QJYrbXq$NSuDC1>f*lCM@~9lcv-E3+C~zT9V;Ak;?!_Xxj_1f~kVi#VVPuO-8d zZn^u>W$&y>oGH9(zWt{^dHjh*b`a!nF|2BZhJEH8u&^ZqSwzSRKYlKkjM2lq)UXdy z91cql=yTl>xVQ}>9hNJ0R9-fx{N6`q&%FQsN5;)5 zn?3WtWM2Dzq^>U_oQt#>{i@^b>A(Kze(%b!len)gFXCfDCFDtK{8@?lmSCu4|F8P- zuVSGREBtrf>u{F%Q23pGW#rBh{8ac?{d&Vtc~p6Pv7$F~eBS}v@&g(Ky2WQkAXr|> zIH&WU9e~9ml*Jcy!eDwk(v%m8G7Z{g74JnHLCG7jN`H)y=VbHBNYndp)fch(BBF`c zMMMS$n}%;YAaC(yXqSabJkya2UtB$N#oS~vFhgOIFf*04{I>^W&SbQcTLSl)73X~* ze=ux_2s_nqeni-%KDSeKPA``y`ML1FM(|Crf-F&ndjB=z3YB<&9jPgI)t4CU$z*3X zOsB^}oew}s1cY)fo*|#s2So&#y{|;Ya(COy%CYtAH=y1p%!|n4*tIx zc~`oaC46zve|Zh^#t$U%Md{UulEKFhx=qsSB((LQd!*zfp&bX^h0^%K zf-rHH=0~NJs$83UFNpdEi@fK~49}gJE#pm1i8F;w8E!QQeeQ77 zSnT10{d!@wYMvGhf6-6Kec2D>L|*tvb!YJRcgi;pT1`TKI3(wi5C?tCpFRNJx`>^? za;8dYHv`*8RR1;ew*@5yx5%+pX}Zhzt^pa|JdDX5ldhhH7TeX zG*C=y5^hjV)csBkNup~hIr8%~RQ&>}G#KEkLSpg2_!5P49Wc%Q}2uRaZeZdC_l zH7ihxk|i2IR?PKoOACB!(^l10UxBX(O)4yG@JL>ltg(jIsgReSb69FpjgJO4)K`F^XjH|AKr2x@^lwv>3W55HWNbV1cpqGXVEGk< z8gD-;Ys6U=d%P51hWT(wTm$`?iw%&2SI)}W(wnN1Wn2Co=_BcGHFpYl+{7{q9KW#! zW?A{l<1izi<#3kP$ejY)QOkAko)hvOKf7k8H}!3p>3Dl)D?VG}WjnlRe-d9Hsb4@j z%~Mp;;CocD1I|5ZjIE09`KhY=LRXo577j}d4q2CX_Saiu4P{1rmfTcl+j`iKYP{%L zL9m)D@jRv0U_X|H$;X(L}D$P}e<*GDK75+sfYTl{* zgMVarf$G(CKviYMf~Eu3_ZR!Ug&pBb{azkoPy5-rC2DxS>K#w=NTsSUp#xyaKN1$J zwNIp7U=SPwfTO6RNliscBH9Pb+s%|>#Z)BTFq5Am*OlCfAcKGKq~zVqMGNWGdKE} z7OUzR+W~$ZX{IWSN_XD^Nz-9g$`oahWbP0iP^AeSLa8c^?`Sr4kScx%RSYT-YaKhbW7w-oRLLIqG2ks*kbjCaJi2)7F z0fFIo+yb=$z!!79~SM+9lzU6d3Z*N4P1`l$P1OQJ;0=|p?{eFvTD9j5)vd#ZZGx(d#k%bRm_2d6#V*vQ)ei~*_YT*g zoM;C1^`3BVw1d{;VK?IQh54$)bqMzpeRx2H;`wpMED9&iu#2U3{+46PVwkI1!K;9A z(w7fSE{zFup+(MF0&xD|gnWxMwgYOD#&rmSDiwD4k!6CLN$Tbds->q+twbP1pcI4(%mSIf?KDdj>aL9> zr&Yd-2!nG;8%+H2u3q@&&3V0Vs9*|UIP3@GZAilNgaop{BH%Md`}R83qFe$!H7>Tg z|E;Uc=w8cDJtof=k#D-^Zq;SD39iTTc>feLFE(ryW7C!(iGVJ1lW#!4jublGH{pql&?@9PM-WNpHcRlHOL++9qf4 zKS{dBfR!Yca|mRGoM4AR4Db(vA8MV7;n3wpai+x%m;2YjLmw`SPo>NEu2YFs=E?2X zt#7Ny`VrCn^?Y?wUI)d?UyxhFcSg(#+|X(`2UpNIUy3|Wwn0T1AhMBIV62HjF#UA- zuE8)&L_v_spd}HwPsxEam>{L?y-|G7?ngil#z(xFx!a}H)+m;5FmgDi>qbgx88#G z7Hi6TQ+tc~Tkp{JWDFlS+H0(2Xy)xFJ#zhixBy=fSj@9VM-ZAAgi7T+LbmX_;0m;7Tl^I)xD(Fy{xv@!2p_mLarb=hPFFP!^7GK zx@`*I(7oNQ7VEl7@u{v^wuRl01@yR>_YQBDURJ$D?b1uCx3E22*ly`@k@92Z?*Y}dQBy)O~l`?9J-_%xAr z-Qf0cK|5w#4P*vyuXC$bBH`fnZEn@!ej#XvrHYQ+TvOpzmt6lZ{6U4_Z4D})cS5#G zUKMgHH<9+;ExA=FfQbIC%0F;Ip3nq&8%TrP+9Bv$5BgTl9D=^_pl`&gT#qVv)ZWjD zNNdQH<592)P$F#D)i%J$`34V-;fuWuYVSL6^)1dJSMR9&x#RBr_S!$F(mSf~vf7}( z?Pc})|DZ)`0L6yfG6w}rkhvtjT<-3NUTAIrwSsyT4urT~IgIO;!uD>)Q`jzRzb}ainf&$e_GFD`cssO{q=3f1tAbApT0L^$T6kA&@~Fib zq}|yhYIwU|c!x9$ddetyRKq#`?Gv&BcG{!bN$zwW!K)gV4{aCTQ(K0$gQ5E)m|W*{ zP+BW6gwZLzM~3+yVVFyEkMkd$2s$9r&D4OKAMbIgo4)=#U2DlSvEA2L1@Ww7;kgTxwmdu7)xO zpJ-YE4BB8n^(9q$A58H}B;?MEvoKBasqKYr;B24L(~{Muz{zBHj_rjW-->G!M~D<^ z)D~@>2x zxO-l&JP~q%6LBn5TdozeO!z1K6FsePvioR{oChTbN~YMuPtR@8yf4&NzCl@*Ou9KQu>xM7~P-s$R-d33W~-2Y)e6# z_cb-VQuP$H!81cK2Fjf_sMyRbp6#4tCv2dx7okFXJQo&Z<*-TuMJ$KM9Q44p_f_{G zAL9Kzu*F;lGuq-ta7V&b0X)XQq`pf|tjFNEx<<5tD-sU3`^))6kF50=2$cLbyWcu+ zeGQVGXbhj-E1yrZ17(^dGFCAsmnHyXd&RN=JYmjrs z8pb)3h@4(k_*2)FEeV?UJ%xk8VLRO8FBc7@SeWpi?vZ~WMsOh{_^slgzr<#XuRwAC zmEM}xtKLG9$g!3EM!P;sJOWkCj1Z^^k>4DTA_}}huasE+u@}IXDO+tj$H8{ zU6IG|p+nMJ5znwTP-pPqiojnw;T~=!B(mF-OkQ&pf@#qlV9P)O zj({~(N4CS0Ls#X^Zzma1n=gZS55Nr6sW4*`exo)vL&G@eS4hOUHP}=OrKBJMk8IFo z!Y(Pq@1LV$1GKLXW;HG8#=uTrgSnGDQX?>@Tz#5<-XIpq08Yds% zKUVlX%F;vfY00maD<_22D*yX)<`R5J2&jPyXL(>Qyruy;pX{35HG8{Xh2P%y$uHLR z`cxQRWlZ_@)hf>At*50A)Lg%+%)qPUt=}7X&eE>3e5(;w`T^BKMvvSKJrhuskF?7I zvtef_?XPjKG+Chxhn0Uz0ldCU3y9wHfm&Y@leVcnehAnu5sPIBR6v`Z6|h4&x8;^L zqoTJ6tJD^KoA9C9v{EGlulWPjUW2vJB;|e(xHV*}uaNJkQHHd}@Y%qeuDL{h4&?8e zGjq0b=*xMxldSMO$_zjR=HMQe?YI)M-MUJh^P!42$FTk{H%*##x^|_ylu6coplXc` ziz}QJux~NfWQVFNph0s%NL%O-p?2#4-+5=DQD6;i7Ce-n(gPL;jB?n}R$mVD4MQ8) zYuF8kZ4*K9X<+e|?oP6bOZO$|W?dWj1K1nR1QL}6gB}@)-C3!E>G}0m)%%iKQ^qP9 z@IfTQFRATd>NBwhtkD@eUw9_`is~t93%^Dz6y${H9*E@=r{NRS$oq=w&V;)l4|0cE0MYd>Rx)4$TeNLDEqSPrrT9=HsR6E9jBQ3pHnz14X{$t@A)q{jw1O`TSaj!o z;OPK=M|y)6wr91=$PfgpXEFvA#sba{aDmjM9Z>j(!Y5$z1hBy^!`imJ6>%4VwSr~$ zCw;PwU)Y!Sin8*(U}(Wqx%Ww*sLGvo{);~OHqs#QQ)#ZsqhW~z1W?;R^{^HJyLn(_ zJJy2bG`|9t(`c7(BSqnff2j_t$spAfT`T*zkrd8=)`SkZb8XeAza02w-!Y7*uyI_N$x_+9YHmW(#yju&87Mcg#G zFs)jUc8Clmw-0YKzv3C*25t_RV&V)k#f163kFi4YGmQ>tlihJ`!eAFGNOQ^XI+rf- zvuh8BV`K~-hSJh=kM!t;QG4E}@q>{7g8&y7{45Ol{VTyoi;b;@v)3kqkX+Q(>WZ@R zIa}W)(ori{r(KAv%U6)Wb!{?3?z?%wctE5dh0`;e7_<}j@ppE^P!PT(b4K9{nBoX6 zi2{k4|d0NDwLoHik(!bDK`lqlHe zs<1}oGcRkcmVpXGWE=qN{?Ap=9(>28&(cqS$N|bvrhzLiLHPOvY^7ROH8B4o z4>xyK&|#{vXs!IwbI{Hkm#`N%FjX%4-c*?wSBUlA(gt?dt0yA{9KqA$B^LaMs6h9D zh-qsEnhWiRPgtsfaf5Xm#KV$G_-EA$i!I@wVCD-MpHUsKkOK|5HeZ1feEBU!s`-^5 zIND$XFv`gasY4zsy&WmzZ-u!GajpAuzb=AB2FO6XLY#csY*gTJ56?qz4=S9^dBpaM zBjDq7-vd5sBfs~eJQ#e}F>plSSBOxs4%d(=6#8|Hc9Jozx0u9bithQi>79rlrMb@lu_Tx;P9Er2cuIkv*oto@VphSFxPr{k z2Ykjuh@U@{_Va(59?}ZPohd&{KntI#{tS4Ee+G-3%djupqV^_;9&b;m@}OqO9#Z*Z z-7*KmoSb%9pl%}$((PsHcB=~73vSY&1D1PnhAc>>&(-CH?XX;x)~L&i+F`W{v(4e{ zcK2Fv#97Jec{+#!>qT(55+|g57r5bIBV$|#EGdYa!u@ znlJE(J-zsVb0}mG4sV0wc*EP^Ac`HvR-A{UHpT8jXr3{>CV)YlyH>^jZ0o-)!S{2v zO_#+g;VXEiUy*;>^p(1Gt*Sii&jL3ExQvE?lR^ic3hySB9DRZ`+!X^f>r@hBxZtY& zO7&;e{hJzI2W=R!NmafKZ@Siy0{)3BaxU?>YMcKJGPf81(cZLHjqy)iktPH**L;okL)T=JuF*HugIo7X41Z_5zVl$0 z5}+eNB@?nic95qAq=2P-s3Zu-fTqXS$y1%PU7*?J_#cw+)5=e}`i~Dsu<6KbeD-?8 zkcT6lha(VkhIBM)(|fYpf`QrI7hydiF0|N#;TIyp4mJE@M8K*Y_LCYF9(wD=i1&pE zY%N_crYr>|LqR98icf(*ZNO<{t${@tC{18)oOOqqx2Z56>}F)9)wsB#X7Su$XGDJQ zhFJAS=7OsYCa|zUMW*u@KH-w%#VaxoSI)U)=c+G7pZ90|t@t7j+pJ6bIEWo` z{x?6@P8la4OUb_jfP=ZHpQ~+*2AYS$`_VjD7tXvP=DuxhhFIAF8EIkKXY^6ioT8$TTZMzcl!J< zuRe3t_ksVz>Ws`RS6TV&Nw-$aoj3pf2jG+ii++L7#__ozMPB+1P%Ww|;SE|1%jD!5 zhroLvBMrCkRlk3WyahsD3E|s4K7>*SE)qNRo zw0JQ&VwAF-=cF)K4rVIKIq!4cD@EW?ld}ZGbl#I5S5ur*m0=_iE=eL>lSIgxUL=%s zP3yYX&fmfD8%f32t8A=?A?U)F>~ReYf-F2Jp6C9?54JA;xI3eJp3MmdW3=&ncV>5f z(r^JaMj4z5y98QXkgQ41XV-HL3hQbxKEIyR^U?1YEf41Z59iBk*}&CLfla@Gdf^iq z>dOmFCtYB;2%=omvcGrs4&7oHY41>eK!CMQqQ*eVgBh3VkWf{p4E(E@y zulI)QqQ{T(c&|Lpm!ZFHVFFsEceA?mDN`$N!46s1HM5e1(3Y9f!wEYaD~CCI?UID> zPy!B_EOk!h-`mT7vs)`Bg{2U)?U97=NJ6WJKiUBMV&R&oNzt2pS-cZUzO03_Wtq~# z1fR3hg!AB-hch89O%$Jp`<2Ha?b&jeFerO`CAF1_)l>O~gnQ`r%7md$9KU@@0#BA6 zO<47nhIBF>)bwIv>!S%JkHj|U`NVDq6zh&jFC?}-l)!%qOfPpA@cjunEFx?X9)<$L z@OLA4w8z~mPQ*QMDMX?56X0(`*e+nb@M3}=yOTe?I}9y&G$Fm1@II2@@7n3(8u*%> zup?9PXae>`exBF{mD)gGpG`o`!p{^Y{wYBk`?G`*3Tt_pT=YJhz+w0{LNVk|V@xG~8e{cTJJO_5+MJZ3&v#2bna1WynhcrLZ{pO?Y+%c)dVb;?!i zeyib+KBU#;q*gUHrR2}QTo>IGOQp8r-EAG6sUyjgO5eq+phJIP5qbxV;=7<9?}2Ib zvMgH3u;_h`MXTW)|3@r?K4uuy#4$*M_dc58Rgq5^4t)y7`7^MkpR(qMms$Vcg>s}!@a&B+57Y$LptGcwDaqQyB<$SgTyA1d%>>9SrVU)ghcaIh{ZWDgvsA?i61Z$?~U)l`Wbc@zc6g= ztEa;8yxJ(Q?6x}g*G6GkV{!pl>%eR$t~F;(2s-SR0SjQ@YzOy9DB+w8$Fbgwj;M|L zG{>zDtAjtb$AvG7d-$$BVvu}D@X_E~h+!8l@knY{FwE^*J=F_lq&DipCjygw=n-Tv zUnTK=`#^jPX-#+FZsq>KH09p%z}*AUfhoshvhfj=|L=3>#~^akwEr0G-X$YBSGpSw z6hP!#eb4tQ@*%6^`0fYE>=igJeWsiN%BMH4S98PI0O-PR<%u9pdL+#kD=&wIB zaJL|USTbNLEtymK`x?w-TX#dZLb{o8A@bIf@F8zF!rMOZn$JOThj;nc;iUy{SBvP~BtFyoVq^pOn3HwpsQ;mGssJ2r>#wXs zgD2ISV7cDwsnS3I4(Sv}$aFdxH@KNrenEk9SuAuqolnBly}J4d{;h(j4K}p*Um+W8 z)xi}G|EN`qqN8NiH_9dYHZ77hp?`rbl?;vNRjw7E^s_6*u37ZZfj7&x^cToKZVWxGJX2lm=T|u6c5|M5YyHz*|LTIKxrz&#zcPp$y&0S@1=m~t z)n%9pla{AFnLL@wJbV>iP-|Sg$hjyOdfHpX!dZq3dhrwQtFT!L*&CGo0A|&q(63!e zR?u*yz0ro6IdTD z#F?$d8*Q%|I`#7T?mYQ(mpioDZu_ah{8Q%=KU($lil>teaM-UApgaRIU_QWH{wKp?j&(Ms5AWG ztX$^`NNs%$#gw~BUCQl^p=$G+_0@Xi0N|rYcPH9?z76f0GsbLa*YmB-8+Ps3@#jR|XxzMI^R8X- z%>|=(ZQi|S*Y>Xxo40P>xclbZ&54a)ZCJnY&o>))uiw!0;aA%?@AK{5vGrzCVr|o= z&{rt)lMU+=@x--P|5)@YOWqL7Mw-i+S2drdeDMwIcT3WLJ|h2jV_}ADyz&^ro#|?4 z%|Far{fOnK<-;*@9a3_E)s_be+!_4)hN`nyHW;AW;=h;KWUITIMhzU@TyAsJ(o~Hp9cA}N0Bq~>4@qA@@|VS{kc8;xu(F+6p(ai3DmRr z*#aLzev}7A#AhNUD}Fmtz%W`L{pRlMAAiJ5KJgnSUDDcuN0aFnWd@4rxL(Xh%!#4D zVH^`LUyj3jyqpo9oen#^K_f7EJ{E;p1V@&$JSZ<2t2*Oq5KtZ*5ai=FoFn#b<9Ilf zr{NXG4u3k1v;$txVbij~QGX)1KHaPvZ|yiP%S*qp_Ob9b5BkRHXNpK(d7;&MclOX9 zf246DsPPMpll5hyFA$y(K(MevP6T6<{fNBIbC}$w~F zi4I2}N6LlD2Fmrb22#AA<;a)iiUSX8M(_sqegyk-;QOe`X{`g5NGpPfNH-Y#nf&$c z-}LhWch0qLa`#xSSYTYGwS72DrQru&v*5}1jrU>oD34szA4-4{paduZN`Mle1SkPY zfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle z1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZ zN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=p zpaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq z0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`< z5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)ht zC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPY zfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle z1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZ zN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=p zpaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq z0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`< z5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)ht zC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPY zfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle r1SkPYfD)htC;>`<5}*Vq0ZM=ppaduZN`Mle1SkPYfD-usj==u~ + !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"