initial import

This commit is contained in:
4am 2020-04-17 20:59:25 -04:00
parent f65d79efe2
commit 55ab780ddb
32 changed files with 5814 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.DS_Store
/build/

37
Makefile Normal file
View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

View File

@ -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)))

View File

@ -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

1
res/_FileInformation.txt Normal file
View File

@ -0,0 +1 @@
MILLION.SYSTEM=Type(FF),AuxType(2000),Access(C3)

130
res/levels/A Normal file
View File

@ -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]

130
res/levels/B Normal file
View File

@ -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]

130
res/levels/C Normal file
View File

@ -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]

130
res/levels/D Normal file
View File

@ -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]

179
res/levels/E Normal file
View File

@ -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]

179
res/levels/F Normal file
View File

@ -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]

179
res/levels/G Normal file
View File

@ -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]

179
res/levels/H Normal file
View File

@ -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]

520
res/levels/I Normal file
View File

@ -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]

43
res/levels/J Normal file
View File

@ -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]

12
res/levels/samples/01 Normal file
View File

@ -0,0 +1,12 @@
BRSED
GMAGE
IAISF
P P
M
BASED
GRASP
GRIEF
IMAGE
PRISM
BRIEF

37
res/levels/samples/02 Normal file
View File

@ -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

1138
res/levels/unsorted Normal file

File diff suppressed because it is too large Load Diff

BIN
res/work.po Normal file

Binary file not shown.

56
src/constants.a Normal file
View File

@ -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

256
src/ds.puzzle.a Normal file
View File

@ -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 <puzzle_words>
!byte 0
puzzle_words ; 32 x 8-byte records
!fill 256, 0 ; each record is a <puzzle_logical_width>-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 <puzzle_logical_width> 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 <puzzle_logical_width> 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

41
src/hw.vbl.a Normal file
View File

@ -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

45
src/hw.vbl.init.a Normal file
View File

@ -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+1
lda #>iWaitForVBL
sta WaitForVBL+2
lda #$4C
sta UnwaitForVBL
rts
@build_none
lda #$60
sta WaitForVBL
rts

176
src/macros.a Normal file
View File

@ -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
}

134
src/million.a Normal file
View File

@ -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"
}

275
src/million.init.a Normal file
View File

@ -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 $FE
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 #>GENSCROLLUP
jsr StoreAndInc
lda #$60 ; RTS
; /!\ execution falls through here
StoreAndInc
sta ($FE), y
iny
bne +
inc $FF
+ rts
InitScrollDown
lda #<GENSCROLLDOWN
sta $FE
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 #>GENSCROLLDOWN
jsr StoreAndInc
lda #$60 ; RTS
jmp StoreAndInc

165
src/ui.common.a Normal file
View File

@ -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

201
src/ui.font.a Normal file
View File

@ -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

865
src/ui.font.data.a Normal file
View File

@ -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

130
src/ui.title.a Normal file
View File

@ -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"