commit 7b713839a729e1ba9ba94edf7680b2bce52d9c74 Author: J.B. Langston Date: Wed Jan 4 22:40:59 2017 -0500 Initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..b6e9552 --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# Supermon+64 V1.2 +By Jim Butterfield + +## Background +Supermon64 is a machine-language monitor for the Commodore 64 written by [Jim Butterfield](https://en.wikipedia.org/wiki/Jim_Butterfield). It originally appeared as a type-in program in the [January 1983 issue of Compute Magazine](https://archive.org/details/1983-01-compute-magazine). The program was widely distributed by Commodore User's Groups and included on the [demo diskettes](http://www.zimmers.net/anonftp/pub/cbm/demodisks/c64/starter-kit.d64.gz) and tapes that Commodore provided with their hardware. An improved version, 1.2, appeared sometime later. + +After working my way through Jim Butterfield's excellent [Machine Language for the Commodore 64](https://archive.org/details/Machine_Language_for_the_Commodore_Revised_and_Expanded_Edition) using his equally excellent monitor, I set out to try to find the original sources for it. For a piece of public domain software, it wasn't as easy as you'd think. + +I found [this thread](http://comp.sys.cbm.narkive.com/KUAL6oqM/attn-jim-butterfiled-i-m-looking-for-supermon-64-source-code) where someone asked for the sources and Jim Butterfield himself responded. One person pointed to this [modified version](http://www.ffd2.com/fridge/programs/supermon.s) but I wanted the original. Someone else mentioned a file called SPRMON64.SDA at a now-defunct FTP site. I searched for the filename and found it in on a [gopher proxy](https://gopherproxy.meulie.net/sdf.org/1/users/rogertwo/prgs/cbm/c64/programming/). + +I downloaded it and it appears to be the original source and binaries for the updated 1.2 version. Since it doesn't seem to have an official home and it's continued availability on the internet seemed precarious, I decided to give it one on GitHub. + +## Contents + +- [sprmon64_email.txt](sprmon64_email.txt) is the file I downloaded. It is not actually the SDA itself, but an email containing the SDA in a uuencoded attachment. +- [sprmon64.sda](sprmon64.sda) is the actual SDA that I uudecoded from the email I downloaded. +- [sprmon64.d64](sprmon64.d64) - the SDA converted to a d64 image for use in VICE or with sd2iec. + +The original files extracted from the SDA: +- [supermon64.prg](supermon64.prg) is the C64 binary for Supermon 1.2. +- [supermon64 inst.prg](supermon64 inst.prg) is a C64 BASIC program that displays instructions. +- [supermon64 docs.seq](supermon64 docs.seq) is a PETSCII file containing instructions. +- [supermon64.src.seq](supermon64.src.seq) is the PETSCII source code. According to Jim's [email](http://comp.sys.cbm.narkive.com/KUAL6oqM/attn-jim-butterfiled-i-m-looking-for-supermon-64-source-code), these sources are for the [PAL Assembler](https://ist.uwaterloo.ca/~schepers/download.html) by Brad Templeton. + +Converted versions of the original files: +- [supermon64 docs.txt](supermon64 docs.txt) is the PETSCII documentation converted to ASCII. +- [supermon64.src.txt](supermon64.src.txt) is the PETSCII source converted to ASCII. +- [supermon64.asm](supermon64.asm) is the source with fixed indentation and minor tweaks to get it to build successfully in [64tass](https://sourceforge.net/projects/tass64/) and [TMPx](http://style64.org/release/tmpx-v1.1.0-style). I tested the resulting program and it seems to work, but I can't guarantee it's 100% correct. + +## License + +Based on multiple sources, this software appears to be in the public domain. I claim no ownership. diff --git a/sprmon64.d64 b/sprmon64.d64 new file mode 100644 index 0000000..dea249f --- /dev/null +++ b/sprmon64.d64 @@ -0,0 +1,50 @@ +KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK + DISPLAY IS IN LINES OF 84 ™"SO ADDRESSES $200 TO $20F ARE SHOWN.^ ™" IF ONE ADDRESS ONLY IS GIVEN THEN‹ ™"12 LINES (96 LOCATIONS) WILL BE SHOWN.¸ ™"IF NO ADDRESS IS GIVEN DISPLAY WILL GOÕ *™"FROM THE LAST ADDRESS. 4™" EQUIVALENT ASCII  j™"THE ASSEMBLER TYPE A RETURN AFTER THE.t™"THE ADDRESS PROMPT.W~™" PREVIOUS LINES MAY BE CHANGED BY~ˆ™"TYPING OVER THE RIGHT HAND PART.ˆ°9000¤Ä™" D’ 2000’ 2004’ÃΙ". 2000 A9 12 LDA #$12娙". 2002 9D 00 80 STA $8000,X AND TYPING OVER THE(™"RIGHT HAND PART.x90002‚™" FILL MEMORY "SŒ™" F’ 1000’ 1100’ FF–™" FILLS THE MEMORY FROM 1000 HEX TO¦ ™"1100 HEX WITH THE BYTE FF HEX.°Ü9000Åæ™" GO (RUN)"Ùð™" G’ 1000ú™" TURN TO THE MONITOR.þ¤9000˜™" HUNT MEMORY ":¢™" H’ C000’ D000’ 'READh¬™" HUNT THRU MEMORY FROM C000 HEX TO—¶™"D000 HEX FOR THE ASCII STRING READ’ ANDÅÀ™"PRINT THE ADDRESS WHERE IT IS FOUND. AñÊ™"MAXIMUM OF 32 CHAR™" L’b ™" LOAD ANY PROGRAM FROM CASSETTE #1.;c ™" L’ ";Ç(34);"RAM TEST";Ç(34)gd ™" LOAD FROM CASSETTE #1 THE PROGRAMe ™"NAMED RAM TEST’.­j ™" L’ ";Ç(34);"RAM TEST";Ç(34);",08’Ût ™" LOAD FROM DISK (DEVICE 8) THE PROGRA 0C80´ +™"HEX AND NAME IT PROGRAM NAME’.A¾ +™" S’ ";Ç(34);"0:PROGRAM NAME";Ç(34);",08,1200,1F50"nÈ +™" SAVE TO DISK DRIVE #0 MEMORY FROMšÒ +™"1200 HEX UP TO BUT NOT INCLUDING 1F50ÀÜ +™"HEX AND NAME IT PROGRAM NAME’.Êæ +9000èð +™"COMPARE MEMORY IN THE RANGE 1000r ™"HEX TO 1100 HEX WITH MEMORY STARTING:| ™"AT ADDRESS 5000 HEX.D® 9000[¸ ™" CHECK DISK "i ™" @’Ì ™" GET DISK STATUS MESSAGEœÖ ™" @9’Çà ™" GET DISK UNIT 9 STATUS MESSAGEØê ™" R.ùD ™" WHEN COMPLETE, RETURN TO BASICN ™"WITH X’ AND COMMAND:1X ™" PRINT#4:CLOSE 4’";b 9000h¬ ™"‘ SUMMARY "± ™"$’,+’,&’,%’ NUMBER CONVERSION£¶ ™"G’ GO (RUN)À» ™"J’ JUMP (SUBROUTINE)áÀ ™"L’ LOAC’ COMPARE MEMORYûV™"@’ DISK STATUS/COMMAND 90001ª™"‘SUPERMON’ WILL LOAD ITSELF INTO THE^´™"TOP OF MEMORY .. WHEREVER THAT HAPPENS{¾™"TO BE ON YOUR MACHINE.¨Ü™"BE SURE TO NOTE THE SYS COMMAND WHICHÕæ™"LINKS SUPERMON’ TO THE COMi$²""§9020û'™"“  S U P E R M O N + ’"' '™"COMMANDS - USER INPUT IN  REVERSE "- 8'ŽCHARACTERS ARE SHOWN! >™"IN REVERSE AT THE RIGHT.M H™"VALUES ARE CHANGED BY TYPING OVER THE{ R™"DISPLAY FOLLOWED BY A RETURN CHARACTER.… „9000  Ž™" EXIT TO BASIC "­ ˜™" X× ¢™" RETURN TO BASIC READY’ MODE.¬™"WHEN YOU WISH™"STARTED ASSEMBLY AT 2000 HEX. THE:8™"FIRST INSTRUCTION WAS LOAD A REGISTERhB™"WITH IMMEDIATE 18 DECIMAL. IN FOLLOWINGL™"LINES THE USER NEED NOT TYPE THEºV™"A AND ADDRESS. THE SIMPLE ASSEMBLERè`™"PROMPTS WITH THE NEXT ADDRESS. TO EXITâ™" DISASSEMBLES INSTRUCTIONS FROM;ì™"2000 TO 2004 HEX. IF ONE ADDRESS ISgö™"GIVEN, 20 BYTES WILL BE DISASSEMBLED.™"IF NO ADDRESS, START FROM THE LAST¤ +™"USED ADDRESS.Ι" CODE MAY BE REASSEMBLED BY MOVINGø™"THE CURSOR BACK GO TO ADDRESS 1000 HEX AND BEGIN™"RUNNING CODE.F™" IF NO ADDRESS IS GIVEN, THE ADDRESSl™"FROM THE REGISTER IS USED.ˆ"™" JUMP (SUBROUTINE)"œ,™" J’ 1000È6™" CALL ADDRESS 1000 HEX AND BEGINô@™"RUNNING CODE. REACTERS MAY BE USED.Ô™" H’ C000’ D000’ 20’ D2’ FFIÞ™" HUNT MEMORY FROM C000 HEX TO D000vè™"HEX FOR THE SEQUENCE OF BYTES 20 D2 FF¤ò™"AND PRINT THE ADDRESS. A MAXIMUM OF 32½ü™"BYTES MAY BE USED.ÇV 9000×` ™" LOAD "åa Mó~ ™"NAMED RAM TEST’.ˆ ™"THIS COMMAND LEAVES BASIC POINTERS.’ ™"UNCHANGED.8º 9000IŒ +™" SAVE"…– +™" S’ ";Ç(34);"PROGRAM NAME";Ç(34);",01,0800,0C80"±  +™" SAVE TO CASSETTE #1 MEMORY FROMݪ +™"0800 HEX UP TO BUT NOT INCLUDING TRANSFER MEMORY " +ú +™" T’ 1000’ 1100’ 50008 ™" TRANSFER MEMORY IN THE RANGE 1000f ™"HEX TO 1100 HEX AND START STORING IT AT~ ™"ADDRESS 5000 HEX.ˆJ 9000¥T ™" COMPARE MEMORY "Ç^ ™" C’ 1000’ 1100’ 5000ôh ™" @,$0’úô ™" GET DRIVE 0 DIRECTORYþ ™" @,S0:TEMP’: ™" SCRATCH FILE 'TEMP' FROM DISKD 9000a ™" OUTPUT TO PRINTER"ˆ& ™"CALL SUPERMON+ FROM BASIC WITH:©0 ™" OPEN 4,4:CMD 4:SYS 8’"Ò: ™"ALL COMMANDS WILL GO THE PRINTED FROM TAPE OR DISKúÊ ™"M’ MEMORY DISPLAYÔ ™"R’ REGISTER DISPLAY4Þ ™"S’ SAVE TO TAPE OR DISKLè ™"X’ EXIT TO BASICg™"A’ SIMPLE ASSEMBLER~™"D’ DISASSEMBLER”$™"F’ FILL MEMORYª.™"H’ HUNT MEMORYÄL™"T’ TRANSFER MEMORYÝQ™" MODORE. ITð™"MAY BE USED TO RECONNECT THE MONITOR,ú™"IF IT IS ACCIDENTALLY DISCONNECTED BYU™"USE OF THE RUN-STOP/RESTORE KEYS."_ˆ9000h@‰ 30«(#™" HIT ANY KEY TO CONTINUE ’";½2#I²1¤10:¡A$:‚Ñ<#¡A$:‹A TO RETURN TO SUPERMON+,¶™"COMMAND SYS 8’.%è9000Bò™" SIMPLE ASSEMBLER "cü™" A’ 2000’ LDA’ #+18{™" (CHANGES TO:)"š™"A 2000 A9 12 LDA #$12»™"A 2002 ..NEXT INSTRUCTIONå$™" IN THE ABOVE EXAMPLE THE USER. +)d™ "SUPERMON+64 JIM BUTTERFIELD"Cnž(Â(43)ª256¬Â(44)ª71)¥-…"¥.…#¥7…$¥8…% ¥"ÐÆ#Æ"±"É6Ð/¥"ÐÆ#Æ"±"É6ð0…&¥"ÐÆ#Æ"±"e$ª¥&e%H¥7ÐÆ8Æ7h‘7ŠH¥7ÐÆ8Æ7h‘7²¥7…3¥8…4l766  þ6­þÿ6…Á­ÿÿ6… 'ý6©¢  aý6 öû6­üÿ6­ýÿ6©€ ÿ¢h(ÊùغŽ.X   ðÉLк© Õÿ¥)ðç­2ðª ( þ6Lzõ6¦Ã¤Ä©…¹ðÓ µü6°Y û6°T 7ü6ÐO ¥Á‘à áÿð Žü6 |ü6°ïLzõ6°7 Qü6¢ŽŽ 7ü6ÐàðçÉ ðëèàÐëÊ0½8é? Jnn ˆÐöðéL©õ6¢­Ð- @û6ð%°ï©$ è ­ +ÉÌð¥ÂР©0 èˆÐùÎ1 7ü6ðÉ ðÅ èà +½°¶Ž/¢Ž¢Ž3­ §ú6®Ž0ª½|ÿ6 Î `° Qü6 û6©…ÁÐ Zü6 „þ6 áÿð !ú6î­ ü6­ jü6°äLzõ6L©õ6©. Òÿ îû6 áû6 îû6 ±Ã §ú6H®èÊŒ2 0 þ6¬2LQú6±Ã ëû6ÈÀåh¢ ïú6¢àЬð­Éè±Ã(° ü6ˆÐï½/ÿ6 Òÿ½5ÿ6ð ÒÿÊÐÐ` ›ú6iÐèLåû6¦Ä¨ÊeÃè`¨J J°É"ð) €Jª½Þþ6°JJJJ)Р€©ª½"ÿ6°­ eÁ…ÁŠe…š8$Œ +h¨hª­`¥Ã¦ÄHŠ ü6h ü6© ÐÉ Ð © $ Òÿ© +LÒÿ öû6© ÒÿLþ6Ž ü6 ÒÿŠ®LÒÿH )ü6ªhJJJJ)É +ii0`Î1Ž®1½ðÉ:ðÉ?î1®(`¥Á…å…Ä`8¥ÁåÃ…Á¥ÂåÄ…Â`©8¥Áí…Á¥Âé…Â`8­/é/­0é0`©eÃ…ÃæÄ`8¥Ãé…Ã¥Äé…Ä`° +¥Á¤Â)Œ(`°# Q 7ü6ð$Î1É$ðC¥Á ±ÿ©o “ÿ®1î1½ð ¨ÿð ®ÿ öû6¥Á ´ÿ©o –ÿ ¥ÿ ÒÿÉ ð¥)¿ðð «ÿLzõ6L©õ6¥Á ±ÿ©ð “ÿ®1½ð ¨ÿèÐõ ®ÿ öû6¥ÁH ´ÿ©` –ÿ Œ/ ¥ÿ…Á¥ÐD ¥ÿ…Â¥Ð;Î/Ðé 'ý6©¢  aý6© Òÿ ¥ÿð +¦Ð Òÿñ öû6 áÿð äÿð äÿðû а «ÿh ±ÿ©à “ÿ ®ÿLzõ6 öû6Lþ6 þ6 (© Òÿ© Òÿˆ|ÌJrò¤Šª¢¢tttrDh²2²"&&rrˆÈÄÊ&HDD¢È ACDFGHJMRTX@.>;$+&%LSV\ø6´ö6éù67ø6?ö68÷6]ö6Òõ6Wõ6·ö6Ïõ6ý6\ø6ö6ö6 +Iõ6õ6 CHANGES FROM3F™"EARLIER VERSIONS OF SUPERMON ARE:^K™" --DECIMAL OR BINARY INPUT ALLOWED;†P™" --DISK STATUS AND COMMANDS (@);¨U™" --LOOSER (EASIER) SYNTAX.³d 9000Ñn™" NUMBER CONVERSION "âx™" $2000ï‚™" $2000üŒ™" +8192.&æ™" THE USER COULD ASK FOR A NUMBER TOQð™"BE CONVERTED FROM ANY OF THESE BASESyú™"BY GIVING THE APPROPRIATE PREFIX.ƒ,9000 6™" IMPORTANT NOTE -- "Ë@™" AT ANY TIME IN THE FOLLOWING TEXT,öJ™"YOU MAY ENTER ANY NUMBER IN ANY BASE!000000& ¤™" ... WILL BE CONVERTED TO ASSEMBLE:A ®™" A $0400 LDA #$80j ¸™" IF YOU DON'T GIVE A PREFIX, THE‘ ™"MONITOR WILL ASSUME HEXADECIMAL.› ô9000¸ þ™" REGISTER DISPLAY "Å ™" Râ ™" PC SR AC XR YR SPþ ™"; 0000 01 0 AC, XR, YR - A, X, AND Y REGISTERS1 l™" SP - STACK POINTER; ¼9000T Й" M’ 200’ 209„ Ú™">0200 4D 20 32 30 30 20 32 30:M 200 20"³ ä™">0208 39 00 00 04 00 04 00 04:9......."ß î™" DISPLAY MEMORY FROM 0200 HEX TO ø™"0209 HEX. Šþ6©; Òÿ© Òÿ­( ü6 ¹( ëû6ÈÀõ öû6¢Ž1 Ïÿèà(°É Ðñ©ÿ 7ü6ðßÉ ð÷¢ÝÀÿ6ð Êø  þ6Lzõ6à°à°Š +ª½×ÿ6H½Öÿ6HLû62Lš÷6LÜü6l ° Qü6 û6© …ÁÐ Zü6¢FÂfÁÊÐù áÿð vö6© ü6 hü6°îLzõ6L©õ6 ¨ü6  û6° +¥Á™*ÈÀñLzõ6° Qü6  û6° ¥Á‘ÃÈÀò©‘ Òÿ vö6LL1÷6 Žü6 |ü6°ÊLzõ6 µü6°Y  7ü6É'Ð 7ü6ÉðI™È 7ü6ðÀÐóð û6¥Á™È û6°ÀÐñŒ2 öû6 ±ÃÙÐ ÈÌ2Ðó áû6 áÿð Žü6 |ü6°áLzõ6L©õ6 „º„¹ˆ„·„©…¼©…» 7ü6ðYÉ ð÷É"Ю1½ðIèÉ"ð ‘»æ·ÈÀíL©õ6Ž1 7ü6ð0 û6°+¥Á…º û6°" Qü6 û6°= öû6¦Á¤Â­2ÉSÐÑ©…¹©Ã ØÿLzõ6­2ÉVù6½<ÿ6 Îù6¢àЬð­Éè©0° Ëù6ˆÐñ½/ÿ6 Îù6½5ÿ6ð Îù6ÊÐÒð Ëù6 Ëù6­/Í3ðLÛù6¬ð2­0ÉÐ#¥Áåê¥ÂåÄÐfà‚°b¨ÈÐ\à‚XÊÊŠ¬Ð¹À‘ÃˆÐø­‘à öû6©‘ Òÿ . Šþ6 )ú6î­ ü6©Aw© x}¥Ä ü6yŽz¥Ã ü6{Ž|©…ÆLzõ6L©õ6 Îù6Ž®3Ý ð +hhîðèLèø6î3®)˜)ª˜ àŠð JJJ ˆÐúȈÐò`¨¹<ÿ6/¹|ÿ60© 0./*ˆÐöi? ÒÿÊÐêLîû6Î1 @û6° 4ü6Ð +Î1­Ðð É ð É,ðhhL©õ68$­`©…Á…ŠH˜H 7ü6ðÉ ð÷¢ÝÏÿ6ðÊøèÎ1¼ôÿ6½øÿ6 + 7ü6ðc8é0^É +éɰT Ì JðHîÀ +Ð +¢µÁ Êø® +Á&°.ÊÐ÷À +Ð . °­ eÁ…Á­ eÂ…ü6 û6°¥Á ¥Â  Zü6¥Á/¥Â0$8` û6 ü6©$ Òÿ¥Á¦Â åû6 ü6©+ Òÿ 'ý6©¢  aý6 ü6©& Òÿ©¢  Pý6 ü6©% Òÿ©¢  Pý6Lzõ6 Qü6©¢ Êú xøÃ&Ä¢½ }  ÊôˆÐë(`H¥Á¥Â© hŒ +¬ +©.. *ˆó¨Ð àð¬ðî 0 ÒÿÊÐ×`Т,¦ÁàXà °T†Á©……·Ðó`¹«þ6) òû6È(ó` PC SR AC XR YR SP V1.2¿..SYS :’ ERROÒA   @EÐ@ 0"E3Ð@ @E3Ð@ @E³Ð@ "D3ÐŒD"D3ÐŒDš"D3Ð@ "D3Ð@ bx©!‚YM‘’†J…,),#($YX$$Š#]‹¡Š#‹¡)®i¨#$S#$S¡[[¥i$$®®¨­)|œmœ¥i)S„4¥i# ØbZH&b”ˆTDÈThDè”´„t´(ntô + SUPERMON+ INSTR# 10000I™ "SUPERMON+ IS A NEW VERSION OFr(™"'SUPERMON' THE REASON FOR THE NEW˜2™"VERSION IS TO PROVIDE IDENTICALÀ7™"COMMANDS TO THOSE OF THE BUILT-INä<™"MONITOR OF THE COMMODORE 128. A™" THE MOST VISIBLE +–™" &20000! ™" %10000000000000'ª™P´™" IN THE ABOVE EXAMPLE THE USER|¾™"HAS ASKED FOR THE NUMERIC EQUIVALENTS¨È™"TO HEXADECIMAL 2000. THE REPLY SHOWSÔÒ™"THE VALUE IN HEX ($), IN DECIMAL (+),ûÜ™"IN OCTAL (&), AND IN BINARY (%)T™"AND CONVERSION WILL BE DONE FOR YOU.0^™"EXAMPLE:Bh™" M +4096jr™" ... WILL CAUSE A MEMORY DISPLAY“|™"FROM DECIMAL ADDRESS 4096. IN THE¿†™"DISPLAY, THE HEX ADDRESS ($1000) WILLÛ™"BE SHOWN. SIMILARLY,üš™" A +2048 LDA #%10 2 03 04 05- +&™" DISPLAYS THE REGISTER VALUES SAVEDY +0™"WHEN SUPERMON+’ WAS ENTERED. VALUES +:™"MAY BE CHANGED BY TYPING OVER THE¯ +D™"DISPLAY FOLLOWED BY A RETURN CHARACTER.Í +N™" PC - PROGRAM COUNTERê +X™" SR - STATUS REGISTER b™"  zõ6®.š ¨ü6x­(H­)H­*H­+®,¬-@®.š Dö6Œ-Ž,+h*LXõ6 öû6©> Òÿ áû6 ð îû6±Ã ü6ÈÀó & þ6 ±Ãª)¿É"ðŠ)É Š°©. ÒÿÈÀå`©,©€2© µü6° û6L©õ6,2'¥ÃÅÁ¥Äå°­/eÁ…Á­0e…¢½ •ÃÊø©€ öû6  áÿð1±Ã,2‘ÁÑÁð áû6,0 æÁÐæÂÐ L©õ6 hü6 šü6Aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿª¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSPRMON64             2A    ÿ‚SUPERMON+64      ‚SUPERMON+ INST  SUPERMON+64 DOCS SUPERMON+64.SRC ?KKKKKKKKKKKKKKKKK + Ó Õ Ð Å Ò Í Ï Î + 64 ÉN THE FOLLOWING DISCUSSION, KEYBOARD INPUT IN DESIGNATED BY BRACKETS. ÓÕÐÅÒÍÏÎ+ IS A NEW VERSION OF 'ÓÕÐÅÒÍÏÎ' THE REASON FOR THE NEW VERSION IS TO PROVIDE IDENTICAL COMMANDS TO THOSE OF ÓAVE TO DISK DRIVE #0 MEMORY FROM 1200 HEX UP TO BUT NOT INCLUDING 1F50 HEX AND NAME IT "PROGRAM NAME". ÔÒÁÎÓÆÅÒ ÍÅÍÏÒÙ ÔRANSFER MEMORY IN THE RANGE 1000 HEX TO 1100 HEX AND START STORING IT AT ADDRESS  +8192 &20000 %10000000000000 ÉN THE ABOVE EXAMPLE THE USER HAS ASKED FOR THE NUMERIC EQUIVALENTS TO HEXADECIMAL 2000. ÔHE REPLY SHOWS THE VALUE IN HEX ($), IN DECIMAL (+), IN OCTAL (&) AND IN BINARY (%).  ADDRESS. ÔO EXIT THE ASSEMBLER TYPE A RETURN AFTER THE THE ADDRESS PROMPT. ÐREVIOUS LINES MAY BE CHANGED BY TYPING OVER THE RIGHT HAND PART. . 2000 A9 12 LDA #$12 . 2002 9D 00 80 STA $8000,X ÄISAS BE DONE FOR YOU. ÅXAMPLE: ×ILL CAUSE A MEMORY DISPLAY FROM DECIMAL ADDRESS 4096. ÉN THE DISPLAY, THE HEX ADDRESS ($1000) WILL BE SHOWN. ÓIMILARLY, <+2048 LDA#%10000000> ×ILL BE CONVERTED TO ASSEMBLE: "A $04E RIGHT HAND PART. ÆÉÌÌ ÍÅÍÏÒÙ FILLS THE MEMORY FROM 1000 HEX TO 1100 HEX WITH THE BYTE FF HEX. ÇÏ (ÒÕÎ) ÇO TO ADDRESS 1000 HEX AND BEGIN RUNNING CODE. ÉF NO ADDRESS IS GIVEN, THE ADDRESS FROM THE <NGED BY TYPING OVER THE DISPLAY FOLLOWED BY A RETURN CHARACTER. PC - PROGRAM COUNTER SR - STATUS REGISTER AC, XR, YR - A, X, AND Y REGISTERS SP - STACK POINTER >0200 4D 20 32 30 30"READ" AND PRINT THE ADDRESS WHERE IT IS FOUND. Á MAXIMUM OF 32 CHARACTERS MAY BE USED. ÈUNT MEMORY FROM C000 HEX TO D000 HEX FOR THE SEQUENCE OF BYTES 20 D2 FF AND PRINT THE ADDRESS. Á MAXIMUM OF 32 BILL BE SHOWN. ÉF NO ADDRESS IS GIVEN DISPLAY WILL GO FROM THE LAST ADDRESS. ÅQUIVALENT ÁÓÃÉÉ CHARACTERS ARE SHOWN IN REVERSE AT THE RIGHT. ÖALUES ARE CHANGED BY TYPING OVER THE DISPLAY FOLLOWED BY A RETURN CHARACTER. ÅØÉÔ S COMMAND LEAVES BASIC POINTERS UNCHANGED. ÓÁÖÅ ÓAVE TO CASSETTE #1 MEMORY FROM 0800 HEX UP TO BUT NOT INCLUDING 0C80 HEX AND NAME IT "PROGRAM NAME". THE BUILT-IN MONITOR OF THE COMMODORE 128. ÔHE MOST VISIBLE CHANGES FROM EARLIER VERSIONS OF ÓÕÐÅÒÍÏÎ ARE: --DECIMAL OR BINARY INPUT ALLOWED; --DISK STATUS AND COMMANDS (@); --LOOSER (EASIER) SYNTAX. ÎÕÍÂÅÒ ÃÏÎÖÅÒÓÉÏÎ <$2000> $2000 AMPLE THE USER STARTED ASSEMBLY AT 2000 HEX. ÔHE FIRST INSTRUCTION WAS LOAD A REGISTER WITH IMMEDIATE 18 DECIMAL. ÉN FOLLOWING LINES THE USER NEED NOT TYPE THE "A" AND ADDRESS. ÔHE SIMPLE ASSEMBLER PROMPTS WITH THE NEXT ÔHE USER COULD ASK FOR A NUMBER TO BE CONVERTED FROM ANY OF THESE BASES BY GIVING THE APPROPRIATE PREFIX. ÉÍÐÏÒÔÁÎÔ ÎÏÔÅ -- ÁT ANY TIME IN THE FOLLOWING TEXT, YOU MAY ENTER ANY NUMBER IN ANY BASE AND CONVERSION WILLSEMBLES INSTRUCTIONS FROM 2000 TO 2004 HEX. ÉF ONE ADDRESS IS GIVEN, 20 BYTES WILL BE DISASSEMBLED. ÉF NO ADDRESS, START FROM THE LAST USED ADDRESS. ÃODE MAY BE REASSEMBLED BY MOVING THE CURSOR BACK AND TYPING OVER TH00 LDA #$80" ÉF YOU DON'T GIVE A PREFIX, THE MONITOR WILL ASSUME HEXADECIMAL. ÒÅÇÉÓÔÅÒ ÄÉÓÐÌÁÙ PC SR AC XR YR SP ; 0000 01 02 03 04 05 ÄISPLAYS THE REGISTER VALUES SAVED WHEN ÓÕÐÅÒÍÏÎ+ WAS ENTERED. ÖALUES MAY BE CHAPC> REGISTER IS USED. ÊÕÍÐ (ÓÕÂÒÏÕÔÉÎÅ) ÃALL ADDRESS 1000 HEX AND BEGIN RUNNING CODE. ÒETURN TO THE MONITOR. ÈÕÎÔ ÍÅÍÏÒÙ ÈUNT THRU MEMORY FROM C000 HEX TO D000 HEX FOR THE ASCII STRING  20 32 30: M 200 20 >0208 39 00 00 04 00 04 00 04: 9....... ÄISPLAY MEMORY FROM 0200 HEX TO 0209 HEX. ÄISPLAY IS IN LINES OF 8, SO ADDRESSES $200 TO $20F ARE SHOWN. ÉF ONLY ONE ADDRESS IS USED THEN 12 LINES (96 LOCATIONS) W YTES MAY BE USED. ÆÉÌÅ ÈÁÎÄÌÉÎÇ ÌÏÁÄ ÌOAD ANY PROGRAM FROM CASSETTE #1. ÌOAD FROM CASSETTE #1 THE PROGRAM NAMED "RAM TEST". ÌOAD FROM DISK (DEVICE 8) THE PROGRAM NAMED "RAM TEST". ÔHI ÔÏ ÂÁÓÉà ÒETURN TO ÂÁÓÉà ÒÅÁÄÙ MODE. ×HEN YOU WISH TO RETURN TO ÓÕÐÅÒÍÏÎ+, COMMAND "ÓÙÓ 8". ÓÉÍÐÌÅ ÁÓÓÅÍÂÌÅÒ (CHANGES TO:) A 2000 A9 12 LDA #$12 A 2002 ..NEXT INSTRUCTION ÉN THE ABOVE EX +5000 HEX. ÃÏÍÐÁÒÅ ÍÅÍÏÒÙ ÃOMPARE MEMORY IN THE RANGE 1000 HEX TO 1100 HEX WITH MEMORY STARTING AT ADDRESS 5000 HEX. ÄÉÓË ÏÐÅÒÁÔÉÏÎÓ ÃÈÅÃË ÄÉÓË <@> ÇET DISK STATUS MESSAGE <@9> ÇET DISK UNIT 9 STATUS MES JMP STRT MERROR JMP ERROR ; [;] ALTR JSR COPY1P LDY #0 ALTR1 JSR GETPAR BCS ALTRX LDA TMP0 STA SR,Y INY CPY #$05 BCC ALTR1 ALTRX JMP STRT ; [>] ALTM BCS ALTMX JSR COPY12 LDY #0 ALTM1 JSR GETPAR BCS ALTMX LDA TMP0 STA (TMP2),Y INY CPY #8  ITH "X" AND COMMAND: ÓÕÍÍÁÒÙ $ , + , & , % NUMBER CONVERSION G GO (RUN) J JUMP (SUBROUTINE) L LOAD FROM TAPE OR DISK M MEMORY DISPLAY R REGISTER DISPLAY S SAVE TO TAPE OR D ACMD *=*+1 LENGTH *=*+1 MNEMW *=*+3 SAVX *=*+1 OPCODE *=*+1 UPFLG *=*+1 DIGCNT *=*+1 INDIG *=*+1 NUMBIT *=*+1 STASH *=*+2 U0AA0 *=*+10 U0AAE =* STAGE *=*+30 ESTAGE =* *= $0200 INBUFF *=*+40 ENDIN =* PCH *=*+1 PCL *=*+1 SR *=*+1 ACC *=*+1 XR *=*+1 YR Ù HAPPENS TO BE ON YOUR MACHINE. ÂE SURE TO NOTE THE ÓÙÓ COMMAND WHICH LINKS ÓÕÐÅÒÍÏÎ TO THE ÃOMMODORE. ÉT MAY BE USED TO RECONNECT THE MONITOR IF IT IS ACCIDENTALLY DISCONNECTED BY USE OF THE RUN-STOP/RESTORE KEYS. ROUT =$FFD2 LOAD =$FFD5 SAVE =$FFD8 STOP =$FFE1 GETIN =$FFE4 *=$9519 SUPER LDY #MSG4-MSGBAS:JSR SNDMSG LDA SUPAD:STA TMP0 LDA SUPAD+1:STA TMP0+1 JSR CVTDEC LDA #0:LDX #6:LDY #3 JSR NMPRNT:JSR CRLF LDA LINKAD:STA BKVEC LDA LINKAD+1:STA BKVEC+1 LDAISPLAY MEMORY DISPMEM JSR CRLF LDA #">" JSR CHROUT JSR SHOWAD LDY #0 BEQ DMEMGO DMEMLP JSR SPACE DMEMGO LDA (TMP2),Y JSR WRTWO INY CPY #8 BCC DMEMLP LDY #MSG5-MSGBAS:JSR SNDMSG LDY #0 DCHAR LDA (TMP2),Y TAX:AND #$BF:CMP #$22:BEQ DDOT:TXA ANRBYTE INY CPY #7 BCC DISJ ; STRT JSR CRLF LDX #0 STX CHRPNT SMOVE JSR INPUT STA INBUFF,X INX CPX #ENDIN-INBUFF BCS ERROR CMP #$0D BNE SMOVE LDA #0 STA INBUFF-1,X ST1 JSR GETCHR BEQ STRT CMP #$20 BEQ ST1 S0 LDX #KEYTOP-KEYW S1 CMP KEYW,XVY BPL COMPAR1 ; COMPARE ADDS1,ADDS3 LDA TMP2 CMP TMP0 LDA TMP2+1 SBC TMP0+1 BCS COMPAR1 ; ADD ADDS2 TO ADDS1 LDA STORE ADC TMP0 STA TMP0 LDA STORE+1 ADC TMP0+1 STA TMP0+1 LDX #1 TDOWN LDA STASH,X STA TMP2,X DEX BPL TDOWN LDA #$80 STA  DSPM11 JSR COPY12 JSR GETPAR BCC DSMNEW DSPM11 LDA #$0B STA TMP0 BNE DSPBYT DSMNEW JSR SUB12 BCC MERROR LDX #3 DSPM01 LSR TMP0+1 ROR TMP0 DEX BNE DSPM01 DSPBYT JSR STOP BEQ DSPMX JSR DISPMEM LDA #8 JSR BUMPAD2 JSR SUBA1 BCS DSPBYT DSPMXSAGE <@,$0> ÇET DRIVE 0 DIRECTORY <@,S0:TEMP> ÓCRATCH FILE 'TEMP' FROM DISK ÏÕÔÐÕÔ ÔÏ ÐÒÉÎÔÅÒ ÃALL ÓÕÐÅÒÍÏÎ+ FROM BASIC WITH: ÁLL COMMANDS WILL GO THE PRINTER. ×HEN COMPLETE, RETURN TO BASIC W; ******************************** ; * SUPERMON+ 64 JIM BUTTERFIELD * ; * V1.2 AUGUST 20 1985 * ; ******************************** TMP0 =$C1 TMP2 =$C3 SATUS =$90 FNLEN =$B7 SADD =$B9 FA =$BA FNADR =$BB NDX =$C6 KEYD =$0277 BKVEC =$0316 *= $0100 ISK X EXIT TO BASIC A SIMPLE ASSEMBLER D DISASSEMBLER F FILL MEMORY H HUNT MEMORY T TRANSFER MEMORY C COMPARE MEMORY @ DISK STATUS/COMMAND ÓUPERMON WILL LOAD ITSELF INTO THE TOP OF MEMORY...WHEREVER THAT *=*+1 SP *=*+1 STORE *=*+2 CHRPNT *=*+1 SAVY *=*+1 U9F *=*+1 SETMSG =$FF90 SECOND =$FF93 TKSA =$FF96 LISTEN =$FFB1 TALK =$FFB4 SETLFS =$FFBA SETNAM =$FFBD ACPTR =$FFA5 CIOUT =$FFA8 UNTLK =$FFAB UNLSN =$FFAE CHKIN =$FFC6 CLRCHN =$FFCC INPUT =$FFCF CH BCC ALTM1 ALTMX LDA #$91:JSR CHROUT JSR DISPMEM JMP STRT ; [G] GOTO LDX SP:TXS GOTO2 JSR COPY1P SEI:LDA PCH:PHA LDA PCL:PHA LDA SR:PHA LDA ACC:LDX XR:LDY YR:RTI ; [J] JSUB LDX SP:TXS:JSR GOTO2 STY YR:STX XR:STA ACC PHP:PLA:STA SR JMP DSPLYR ; D #$80:JSR SETMSG BRK ; BREAK LDX #$05 BSTACK PLA ;Y,X,A,SR,PCL,PCH STA PCH,X DEX BPL BSTACK CLD TSX STX SP CLI ; [R] DSPLYR LDY #MSG2-MSGBAS:JSR SNDCLR LDA #$3B:JSR CHROUT:LDA #$20:JSR CHROUT LDA PCH:JSR WRTWO LDY #1 DISJ LDA PCH,Y JSR WD #$7F CMP #$20 TXA BCS DCHROK DDOT LDA #$2E DCHROK JSR CHROUT INY CPY #8 BCC DCHAR RTS ; [C] COMPAR LDA #0 .BYTE $2C ; [T] TRANS LDA #$80 STA SAVY LDA #0 STA UPFLG JSR GETDIF BCS TERROR JSR GETPAR BCC TOKAY TERROR JMP ERROR TOKAY BIT SA :BEQ S2 DEX:BPL S1 ; ERROR ERROR LDY #MSG3-MSGBAS:JSR SNDMSG JMP STRT S2 CPX #$13:BCS LSV CPX #$0F:BCS CNVLNK TXA:ASL A:TAX LDA KADDR+1,X:PHA LDA KADDR,X:PHA JMP GETPAR LSV STA SAVY JMP LD CNVLNK JMP CONVRT ; [X] EXIT JMP ($A002) ; [M] DSPLYM BCSUPFLG COMPAR1 JSR CRLF LDY #0 TCLOOP JSR STOP BEQ TEXIT LDA (TMP2),Y BIT SAVY BPL COMPAR2 STA (TMP0),Y COMPAR2 CMP (TMP0),Y BEQ TMVAD JSR SHOWAD TMVAD BIT UPFLG BMI TDECAD INC TMP0 BNE TINCOK INC TMP0+1 BNE TINCOK JMP ERROR TDECAD JSR SUBA1 + JSR SUB21 JMP TMOR TINCOK JSR ADDA2 ; TMOR JSR SUB13 BCS TCLOOP TEXIT JMP STRT ; [H] HUNT JSR GETDIF BCS HERROR LDY #0 JSR GETCHR CMP #"'" BNE NOSTRH JSR GETCHR CMP #0 BEQ HERROR HPAR STA STAGE,Y INY JSR GETCHR BEQ HTGO CPY #ESTAGE-STAGEX RELEND JMP WRADDR ; UB64D LDX TMP2+1 TAY BPL RELC2 DEX RELC2 ADC TMP2 BCC RELC3 INX RELC3 RTS ; GET OPCODE MODE,LEN INSTXX TAY LSR A:BCC IEVEN LSR A:BCS ERR CMP #$22:BEQ ERR ;KILL $89 AND #$07:ORA #$80 IEVEN LSR A:TAX LDA MODE,X:BCS RTMODE FT JSR STOP BEQ HEXIT JSR ADDA2 JSR SUB13 BCS HSCAN HEXIT JMP STRT HERROR JMP ERROR ; [LSV] LD LDY #1:STY FA:STY SADD DEY:STY FNLEN:STY SATUS LDA #>STAGE:STA FNADR+1 LDA #;" HIKEY .ASC "$+&%LSV" KEYTOP =* ; VECTORS KADDR .WORD ASSEM-1,COMPAR-1,DISASS-1,FILL-1 .WORD GOTO-1,HUNT-1,JSUB-1,DSPLYM-1 .WORD DSPLYR-1,TRANS-1,EXIT-1,DSTAT-1KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK \ No newline at end of file diff --git a/sprmon64.sda b/sprmon64.sda new file mode 100644 index 0000000..70f63d0 Binary files /dev/null and b/sprmon64.sda differ diff --git a/sprmon64_email.txt b/sprmon64_email.txt new file mode 100644 index 0000000..5d63602 --- /dev/null +++ b/sprmon64_email.txt @@ -0,0 +1,531 @@ + +From KurtB02@aol.com Mon Aug 28 20:07:18 2000 +Date: Sun, 27 Aug 2000 21:33:43 +0200 +From: KurtB02@aol.com +Newsgroups: comp.binaries.cbm +Followup-To: comp.sys.cbm +Subject: Supermon+64 - (SPRMON64.SDA) + + + ****************************************************** + *** *** + *** comp.binaries.cbm is a moderated binaries- *** + *** only newsgroup (no discussion or *** + *** crossposting allowed) for Commodore 8-bits *** + *** *** + *** For information on comp.binaries.cbm visit *** + *** http://stockholm.ptloma.edu/comp.binaries.cbm/ *** + *** *** + *** This file is also available via FTP from *** + *** ftp://videocam.net.au/cbm/incoming *** + *** (allow time for submission to be received) *** + *** *** + ****************************************************** + + +This SDA contains the Supermon+64 machine-language monitor, a docs file, +and the source code for it. + +Directory for: sprmon64.sda +================================================== +FILENAME TYPE BLKS NOW V STOWAGE DATE +================================================== +sda232.64 p 9 --- - -------- +supermon+64 p 13 12 2 crunched 01jan1980 +supermon+ inst p 29 19 2 crunched 01jan1980 +supermon+64 docs s 24 14 2 crunched 01jan1980 +supermon+64.src s 63 32 2 crunched 01jan1980 +================================================== +Files: 4 129 + + +begin 644 SPRMON64.SDA +M`0@-"`\`GB@R,#8S*0```*D`C2#0J0"-(=!,1`H@10@@AQ`.#<1)4D5#5$]2 +M62!&3U(@5$A)4R#3+L0NP5)#2$E613H-`*`EJ3T@TO^(T/A@3"L)(!P(HNV@ +M$(8OA#"I#2#2_Z``(!H*R0+0Y,@@&@K)!K#<.*4MY2^E+N4PD-&@"B`:"JK( +MJ2(@TO\@&@H@TO_(RM#VJ2(@TO^I("#2_Z73R1/0]:`)(!H*H@3=?PGP`\K0 +M^+U_"2#2_[V$"2#2_[V)"2#2_ZD@(-+_H`@@&@J9DP.(P`/0]:V7`XVF`ZV8 +M`XVG`R"."2"'$"!"651%4P"MF@.%(ZD`A2(.F@,NFP,XI2+MF@.-F@.E(^V; +M`XV;`QBE+VV:`XV:`Z4P;9L#C9L#KIH#K)L#3%H(((<0#PH@S/^I""##_ZG^C8(#(&4.K6T# +MS74#T!"M;@/-=@/0"*E/(-+_J4LLJ3\@TO],:@HLE@,P`CA@(,S_J0@@P_^E +M`0D!A0%,=*2B+ZD`G5P#RA#ZJ3"-``&I.HT!`2!E#LD"T,WH(&4.G6P#Z.`) +MT/4LE@,0`R":#"!E#LD1L+*J&&D$A;>IAXV%#JE9C5<-J0Z-A@ZI#8U8#:`` +MJ0"%NZD!A;P@90Z9`@$@[PO(RM#SJ2R9`@$@[PO(K70#F0(!(.\+J2`@[PNI +M"*J@`86XAKJ$N2!E#B!E#B!E#B#Z"ZQL`\`%T`6I_XUQ`\`"\`W`!/`)P`'0 +M`R!E#AA@H`"8F0#,F0#-F0#.F0#+R-#QJJD`C7L#C7P#C7T#H`4@.`YJB-#Y +M:FIJC8H#R1FP-,D`\"FH(#@.+GX#+G\#+H`#B-#QJ&Z``VY_`VY^`RY[`RY\ +M`RY]`XC0ZR`1#.C0LLYZ`QA@+)8#,`%@3-+_.&"M;`/)!K#WK70#R5#P",E3 +M\`3)5=#H8(XW#*``K8H#S'H#T!^9`,NM>P.9`,RM?`.9`,VM?0.9`,[N>@.B +M`8J9`,]@V0#+D`/(T-2,3PR@_B!;#(C``-#X(%L,K8H#3!X,N0#+F0'+N0#/ +MF0'/N0#,F0',N0#-F0'-N0#.F0'.8%-43])004/+4U%5147:0U)53D/(4U%5 +M05/(0U)53D/(((<0#55.+0"@`*YL`\HP"[EZ##`#R-#XR-#RN7H,2"E_(-+_ +MR&@0\R"'$$E.1RXN+@!@CAL-C!T-("(-+(,#,#ZNA`/P!B"3#4P6#:YL`_`= +MX`'P&>`%\`3@`]`*((0.L!VN;`.0"B"J#;`4D`,@90[@`/`'X`+P`R!6#2!! +M#1BB`*``+(,#8*YO`]`6KG`#T`ZN<0/0!JG_C8,#8,YQ`\YP`\YO`V!([H4# +M384#&&UU`XUU`Y`#[G8#:&!,60W)_O`!8*EMC5<-J0V-6`UH:$SF#(V'`ZE] +MC5<-J0V-6`U,:`V,FPV@DXQ7#:`-C%@-K(<#C(0#C8<#SH0#\`+0#*``J5F- +M5PVI#8U8#:V'`V"I`(V(`XWU#8V&`XV+`^Z+`XUW`XUX`XUY`XP>#HX<#B`X +M#I`,K(8#K8L#&7<#F7<##HL#D`8NBP/NA@/NB`.MB`/)&)`$.$P;#J``V0#+ +M\`20S;#QO@#,['<#T!F^`,WL>`/0$;X`SNQY`]`)N0#/&*(`H`!@R/#-C/4- +MS'H#D,OPR4SP#0$"!`@0($"`C&`.C6(.K($#T`8@90Z-B0.MB0,Y,`[0`A@D +M.`C(P`B0`J``C($#H`"I`"A@C((.K((#P/Z0#!B892^%+Y`"YC"@`+$OR(R" +M`Z``8$R'#B#?#R#(#R!8#XU>`XUK`XU@`ZU=`XU?`ZFNC84.J0Z-A@ZM:P,8 +M8"!8#SB-80/M90.M70.-8@/M9@.0)ZU@`XUK`R"O#ZU>`XU<`XUI`ZU?`XU= +M`XUJ`ZUE`XUA`ZUF`XUB`ZU=`_`PK5P#A12M70,)\(45(%$0(*\/I14I#PG0 +MA14@41"-7`.E%2D/">"%%2!1$(U=`]#+J32-A0ZI#XV&#JU<`XUK`XU@`QA@ +M(+H/L`%@K5X#C6D#K5\#C6H#(/P/K6$#C5X#K6(#C5\#3*X.J0"-7`.L:`,@ +M.`XN7`,N70.(T/2M7`/0.*U=`\D!T#%H:*D`C6\#C7`#C7$#J?^-@P.M;`/) +M!=`6H!`@.`XN;0,N;@.(T/2@*"`X#HC0^CA@K5P#3%X0H`"1_>;]T`+F_F"E +M_(0!D12& +M`5A@I?PI#PGPA16E^X44H`"F`7B$`;$4A@%88$BM:`/)#+`?K6,#T`/.9`/. +M8P.M8P,-9`/0#.YH`PYG`ZUG`XUD`VA@:(V3$&B-E!`@HQ"M___P!B#2_TR/ +M$""C$&R3$.Z3$-`#[I008``````````````````````````````````````` +M`````````````````````````````````````````````````@-@_&,,``P` +M4`M355!%4DU/3BLV-/XA``!!H`3!!(!,!(@@4J9*@2@ELN3)H<:&Q1\0!*1( +MDD5`B"H5*N&)D21*A@@B`(1!L`,@#X4A%%@PHU2%"2LV-1FP8,F"'2-*?\`` +M*$4K%)%2=$(1*\4N%(E2'$*1*BB,R`(@8XB-(=*(R"0V"^B55JM1JTX];!XP +M"$76N'K-VG5A,$6B2BDRIDA)E&F/PQAV%A*QB^J-O6__@=AA2-!41BCF"D*Q +ML,$.`!LV!0@0R/4'T!\VM7/]^<NN/8H`B,,("`'S_),+`$!<<``%#>`P +M"2P+/-I(+O\`0@"[-SRPSR0$//!.$6CL,F`)#T"[S`<%X)GM/C)X\0H;!R#3 +M`!('P-,`"E%`444OZY8@02]K<2(#ACW$P@00,F3Q#ALR['B##4`4T``$!"AZ +M`T'\L)$`&)5`6\8"L-$`<@H%`9"R/30` +M63B)#/L,!`D\44FB1_SGD%,)U+E)5@'>X.$%0$A0"V4-U!95(]0`40<-0-1` +M"Q`"50)4-2(Y$5,?<7436P<06!!;%#)HY&^W#?!5DK4]JO!@&W?VT,BP5]Z4 +M1P+/%$`6F7EF`-`>55#2SR1$/`!!%)3XATX4#0!1"5TE'7&*@8W0.)%@GP`0 +M"WB(M.8!:.FI`IQO5-`D!`+DE#+,*(.4,L(I0S2`2RWT`&'*H&74PC`A0U93 +M!""]0`-(*L,1#32X'UUFG2V,[8T($`@`D<@@BPRVU3ILT`P.`]"<,<@"")PQ +MQ`(PP\,&0>XKD>4-,C`F!@%Q*>&3!U,E0#!DB6BZ$S)L3$+.`F@A><,D`#P@ +M22;H`#*QK99@,``>"SSS`!($H-I3^,Z[#D,#('L%0TQ"LZC2'IN[L``D$\PD +MM,_"L_6X]KIY<%C"BA0`2`A=A-!)!"&T$T("E0`22@^5H!-*]^X\H!EZF-UO +M39V_]`:\(Q?=\P`,B71S1KO/X)'`[8K^^+>Y5H=!73BA=!T&42DK%0+O+)0Q +M2`E#U";$),HLL&@CH712V3X;_)?P(4!,HL8#8$PBPP)=-D+`*O^4D@`E$/"` +M<]_C`54H`(7.F:\$E&$8)1CQ.3KQ@&4;R0.:#H.*W;$`>:HH6_NR<99UK&0] +M)>)>"6@`NS?XA3C``1!Q@!"BS;$`$!S8`>=NQS5R`01`@0(8"[C&%!B`CMYP +M@@.7X$BP`%H00(`]>``I&G"/2I`@ +M-[*X0`%`4`LH`&)2^0#%3.C\C%++24:?8(A)N"*/3\SQURV```4+6.`NT7C`!61P +M@0^PX2YQJ"L7#"3G#<-(#95`D9:AI2=5X(,`(=QW)E!``,+"%KZ(7QA(O)XZ@0Z4U@:$Z`S6:4Q&1LC#CB3@0J4.\^1<=)0(=!&#A#18`-8RHMP.(LG,[H#$)&CP`O$)6 +M!`=(@#%B_0.`9:Q&;.@8@@Q(N`5X;A<6@+$K`%H"7$2X&`9Z\,(2].*#_;%R +M"XPC`@8D0`^3"088+@&.22"@`2J(!20`,3-])$`*#Y#`7>@P`*@1F`JM&$2N +M:46$NE@!#(,@,P[H9('W66(!&(`S+>@``T`T`!^UIC61218(4U,8!_!CG/[" +M,8BH1;$:"<@:/3`0$RM8H`(6J!J34=L'"42U&!8MYBD6`"\H+``:E8`%"9"! +M8&@>HQ)0D.%Q07CF6\1ROYQ"++5*$%4Y`*X-_^,&)6]0!8MN=W>J2``0+`$& +M2S#`8!CK=3>`W`L@/V,27'CP`_@!@3O^;@@4,/`RAN.$4(S``!P*SS[+XI1C +M5NL?@(@MUVXQB-MR[0%#N!P+AG:3.5SNU039W!]B3;87.F,8H1T%$,YVO5L, +M'_BPQMS?KJJ@,.]A"+%J1@P7JP#B*BD$V`I'K&GCA-@%2IEE:1XL:C&GVOLU,?A(76.#[Y\RB\'%_"95M^BI; +M$6,"$'Q]#TC``HCX-_QC-?_"`G##'!/``EQB+=:[IDM@>\!89P"J`)3Y'^!0 +M"4;#([-P)NG`"=DR=.#"`WR[(BQ``Q#X@97ZJ=?XD,_Z(2UA#\A8MT)A#ET( +M&)ZZAAK@L#`<#"'[:!`@AC%BB#$A"`8,B` +M1LB#9LB#,BB$)!"`&C`"'3!!+.!"/]`!'2B#)BA#`7!!$A`@/"B!/"R!(&8" +M`12```"!J/``!`AX'A"!*###0K@#9#B'=_B&1P1`3$)E"" +M,H0`,K``8FP",13`!AB!%D@`&1A!"D2`"HC`!*B`!8C`!:0``+0`!(2`"[0` +M!=B!"[S`#$B!$SQ!"40!`%1!$12%)+B`$XB`!30!$S1%!```%F`!&9"!$SA! +M!$S`"$P!&4B`"(A`$4R$!+:%(HB`&(B#!$B!+"B!"FB``-`!'W`#"5`#&9"" +M#"B#&NBH%+20$UQ*'K"K%/"3$W"0&.B2$RP1%:@3%;23$\P3%21@?8H!&^"3 +M$T"0$R``%$``$(``,``#($@2%6`2%0(````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````@-GOS`<`!,`4`Y355!%4DU/3BL@ +M24Y35/XA``"!0`<""H!X!)2I4B!*B2QY''`$"*B2((J!$E"#E_,3(4ZI0*5L.`#*`8"J>FU+>_)DJD$=`@1)Y:B2) +M5.Y$E!P5DH0)D@%@``CVXH3)DR5+D!R1S%3:5"1/N7+!NI4)425)A@K:*`"< +M`,%3O`S)474F5*P\:`AY(K4K8\2$`QT`T$`)%H=8?@F"\-%R92))B,Q2$L.( +M$\U,K#U9`)B!%I*)J!HE,B3#YLJ3+VH!8B%#E\Y/L"HN`/2`DBY>'BW:SH1) +M#B53H`ZA*/=H1B9'@2J5+&3(D*=.E`C<`!`&*`J>0N`Y(C(A+20J"**"JLR& +M(0*!988:+C,4"$`9`!6`HAJHYWX;ZS(4JLDK+)1"HJD[@FA83S.@F(@+`9S\ +M`2PQBX!B9PN((,F&*K((N6P002@"LQ)`#1I44`*``&"V* +M\P>H+R;*@I`.*B.*!H+(HF!_@<$+"P`^@-&GN(,AH(RT?Q"HI8[MR,4OK)X0 +M((JB*:CIK1LJ*`-`!6!,*&X4!"H5[J77>D.04FS0V::>JD7YC#(2_E3)"F`L +M5:=>I`$^ +M(.=3($(HJ`=\MHA&:S*VB&*&)+1 +M`D`PX-``2&PLL0%``>"P`>@LB+9ZC8+:P>@N&_+#!`9M$DP#CL!\4LOBAV$^ +MZX%LTP6JY9<_HDP\#!JH0`,`;X`CM0*:R*-J!X(^5^[R*OTGJ$Y[.XQF7#9` +MH+)"B$,FXJK\J)OJ[1!6REZFVA!L@:KU,`"!W@J%%5$4HAX@!`06*R0'$K(0 +M0`T+#'#"!@!60."T`@2QU@G!@7Z%C&"Q_:TN/$H^!X%R4=L`0#(0^*PPW#FM +MU(H@(HBHBK+,YU]X57N6`$`_$(2M<-L=:+9D>[,//^I(Z)!($%L4U^C#-A`D +MK#!$_?X@=Y6\R)KJ'C*OI@T$66<"G+RL4,,$`RQP0-`G!%$`8CGB#^`D!AD@ +M4>)R5[K:049EJ:$(:Q@AJ9[JC),`^WD`04"BSJ]^!P%(_`T&,/@/(F0%,4C` +M06)8`1(=P84D-QT%`H>"G!_&)[?^3&MZ:'B-2@!`(B`Q9`7FLS`PK@VJ\M3@ +M1`]"AO7(!B1>S&8.$J,#D/@#8-3,+QZJ0-3X1..RER%C&TE@%)"``)#YG44, +M'`$22#$GM>2@`&'*0YDZ$(P3-*@#3>JX'0!1PQ\@@1,[<+N"1"```Q@3!J:$ +M@3EA8$D86`$`6D"!+'9`E%^8R.051JH[.F0R#'4TH2DR0QF"Y(8(`*`)*##$ +M#NI4DCB0*$5Z(B+)U517(=T)RS]7I=`8"`04N&+'4#X;`L(<-)$R(&15:$+! +MNA2@&1,!@'I`021V,8B1M?C-7R%E4G]4%1R4))Y1[L4M^:S'+*`@EU3*QU%@ +MM*4]Q*&D"$-"-1W$P!6@H!&[.%/'TD03K."C'=WD`P!H@(91OL@"82W%0TOQ +MRBT$"ZTE^SBR@,DC#P#`"&C8%,+MNP#&G>EDW_6 +M^.PF:O/9_8FL@68-!$C`X"-VY7-!)$5+^3H0F,1CC".S%&N@^F9PDWM4]@74?<5#P`"F"2"B?.@IX#!O-K65?F@(",)& +M-R9"#@"(!@S06LH:_Q&%(YISH?\@3R]Z$`'*/@BLSS70`M:C`S`@:&DK($>; +M5GN[]6V4>(-]V`;(`P"K@`%52^O*]ABRJ\L>9SV```N6EJI0Q290F<6HSBM( +M"IF#>=0!>H?WQ0EKOHT4@;4-@(VX-#64J'8)PW0 +M)#,XD,1ZD`(.%V..$@`@!#@\32Q:OG$R63P.T:!SN@`,80#A+>5`,E<-DIC6X0%EE9`$.""L`$5G5'F((5IN%<<0`'.!!M[K\02E(BP@:^T;&CS4VP%6>!1?@P;$ZT].<'T39Q*8Z +M+'&HIXW?'LYN*`"`*```5:K8_M9%JWLD^X_^Q*'(,22GP70 +M`0$NE]OJ1S=!!!#0`)"QD!@E0,#(%IT%D:6(K:PA`@N2`(!A(&!N +M=>K<]9J)+ZNU@R#DK-DL$+#QW"HD"IQ"JD$H!4W64$@9-),"`A!Q](3:D^D* +M9VLH48F^#ZYQE.,``#<0<;.Z7:N^S(E3HZ>Y282!WJ`A`(`Y$/&VNJYIJ<*9 +M-`R9N^F0]RQRT1!A/1*`"`"`71`D0`?5K$"GVM-[J +M&0#`'"`"BG^A/`:A,UO+,"J;NI\XFZ%C!SJP+@#`!R`"GG]A.P@;)6K@O;@1 +M%/LXB6$RL?O*`L`#$E#XET$8%'[(&"%YB)U@/6`"$G@`J$<#`#`!$@3YEW$1 +M+]-SK3IQ"TF`,B!!C'^Q`&>!F#+RGK*0/#`"HQ`I(XBA$`0"$J2%B*0'#\A( +M-BH'G[K@..*3L@:@-0!`&2!!@7^%C+I3F/.#!`7Z'BJ'@MT``#0`$NP$L_G# +M*"#!67`"L&B!.-H`A4V"G%4"`&P"$CR$JDF`>$B0%H`!,GR%*OF'K_'I*3*' +M9!BP#PDROK8`%B`#"(#A;`2`G,P&&(AB/8@!LN59(2+CIBYJLO]I*#+[-I.X +M`0"`#2`#1N0!D3^C,O"((_`IJ@-JO?]@/40`,A!%AVB!%/&#`LTA%`BA/;YK +M3P1!#B`#38QS%DA%%'/"!"`#6ZR1/WJ)F*]$*F_0>61@)KP`,@A$1Q1$$59$ +M"*Y?M1Q-2KIE_&B +M%6K)BY^A/#;#(Z#`5$)A*&C@-?'CAHI(E!SIF^2[O1@Q1`P!`&`#*JPD-F'#L.G95*@3=H``+@! +M*EPD5#)P!+9C'!6C&PAC/&Z&+3*K<#I0)@I!":#"4T)Y<+(Y<0IK*E[P6W8G2?HY2ZZ@_Y1!`#`,Z"! +M7X%0!&441%X55D$#+J!#1$ZB(EJ9,YUCOY1JKZF(DQ+)*U4"':!#4@[*BY5( +M%P``!Z!#5S:;/T@".L0`5`*$-_%*"7*K,H0".J2580Y)@S(62MX7>K%P3H&" +M:-D7&A`5/C`6OE`"0^&#L%"J,C0".A24=>*4J9.A32YA7'YYB40D*/<#`.P" +M.E25=1&$!6@``4(;'R;CAQ/A"PC3)$$8%C"4/Q(#,&!`2UG'"2&5"R+C!R"5 +M$[(5=T&#(&!`7X5R%BB77>&4`Q"I;#662[D57A$`#=8(48V"&+`"@RJ#'6#` +M1'4`"$*6E/$5E3`9A+`#L1!7O(]"%F#`4EG7F!#3;&69,KZSN+V"7!6`:A4Q +M,3#6)!+#`&#`3E6%)?M4K?%6@]SG936Q>D'#%&#`&4`%"UP`!CR4-1**%J)C +M&"B#&"XGJ"H#%&#"5W68!*C$9EJ%>5H!*VD!!V`""$"+!?DW%*(V+.HDJ*T$ +M%`YA-6F!&6`"7!,`D7J@36-&&IW[(T&CMLP:+\&Z&V`"1C-$,A`T=M)36`P# +M)D@!=+!`*6`J=0(`B&AA6="&5A(%ORK#.&""7C/D%""!<*.'1,@V%FG!"V"" +M16M)>BMJ;GHG<5.@2E.%'G,"/F"!4S,T$^*W01@X>%@GJ#\&(G`!%OBT@`NG +M2`O748L"`(@`%M2UI/F#-F!!1VNU`BHI@610&DF`)6#!4)N9!`AX!L0"%LRT +M622`*'[4JOP1G-OS-@CB,`!`#F#!6F>1/`@`IV?`.&#!01=J0Q=W"D')B_&J +M;I%>!*`#`!F#!53<`$@@`C1!X!GP!%KQT!PYW2:VCLA`3!*K2@3H# +M`"``MOCU5,^`LLHR#$5Z!G`!-D``3!,B)`C+(ZC(*&5B*BH+BT6!`LH5)4%V +M.&`#$L`$"Q@"-N#T-5*+%EN""KXY,=JDH.2K,D0`-I`-,"#&`=Z:-3+D.^>4 +M3%CA`50"-C`,(LH#$E-H$[``#;``%PB#+"$-&2B;6S%`DBK#$F`#UR"B-]Z6 +M.$:(*-Y&8C%G#L)B/7P"-H@,,,J;D1QB,"`"W7RE>7JR6&@# +M`(P`+LC,5Z.A@CPV2!!`<`'"S`"'E0!_#A(`VY+D[3H9KYA`<:!#&XJ,48++^@!'K0L/1!A5$QC +M0H+:<(I*I\RCHH'A().A&U6"-^!!WPJ:,L:3.$"# +M`.!#I(H@,50#/E``,)GY`248*41R:F%"_!@$%@AP[/$K<1%?((*%`B3XTDD83KB9*C0I(P +M03)@"9,G2Y8@.2)-5LPC3SGAZ'D)"5$E288*VI1@R68EN6+NB:D(=N\E3X3\ +M=`08,>%`UPFLE?F7*1==EYD0F82$FZK*PPULL,%+AS0$7BLK +M8[@.N&6/?0YH`@4"4$84B62.&@8!%&;(;!B44:!I"X)H>*HS$#"L +M-VMZL,RDWA"(!0\D,.D$`WS`J@M!&FFEJQ[4<,`()TP900!9FH#`D"6D,/(' +M;';I`@J!.$Z&*X^A?J*!(+(H^)"GC/[QEYOFFI@IIPKFY(D%9*D%\((=D!09H`PZ!V81!X81JB!:J,,A*2.V1^&N#$HJ0P$IE&J74A4$A9AK +M-ZK(J%"41.Z':T`)"!6:F\-=1H>L8?4+DSRP+S++'"('.LB,0\*T('EZI.$#"H +MJ/TJVUIBHWE*+*GD4DJM'!JH0),NP%IJ#8%]*I<5UQ2=(]NEN8I/,;N*?4>C +M@MW=!V"IILZ&TJU[!BY>K%:HMLEH?@7X$#2P\/@!-2PPP`E;.E6POJ);"!;2 +M68DNMR*-=`4BJ#)BOI?20$4((H*(Z3)!L,EFT.4NKJE[[8+,;K*[65ZX^QT0 +M$R0Y5MIL%5)(JJ*$U4N.W*$LA^2L?,B@.=L&4,,$`RQP0-`A@A#GP!_@:9>R +MU5G=+M.#\N6$*Q.B"ZV7)43Z0W(U##!6RA!4"M.A +M`E4H$9=/Y*,:Y:"D33>S*N"@915K($Y5?F@__%"2+L!%P=S8B3*&-&%ZJ&(1 +M=^%"F.R!)7O@01`["":4[)JGI72!`H+XDRX6H8]U$!,I"DU2G560)V4L>&9# +M%7LBQ>`,"/C`X"I/@H4*K@(!F(,#9D^F*<6I3R,8P&7N%'O258!-A:M<"V9P +M!L.3*7%U1H*?"5>G$YQNCI7<0AKU2-B!^W;70[-H5V'1 +MA.+\8:"`&:,*<)"=64ZP/R4Y1A-II(3#>?:J(,.@!J@[7^Y>):M+&<7`W#F) +MQDI1"!682EP>N8Z4?`6%S5RG<A"`&-1@!$=`5`&*F/*%)LH!5]%T +MU@[A9IA'0?.49YPBB\JF.S@@`!WH&&@6C?(:2E#5!$M#+`]N0E#>)(2H=11( +M0FYJ-PR:A)(>W<@L->?E`A9(I#W%J8P4`YXZLC5*%=%K@'X+VN8L\>*"A[,)!07,]-/GHR.10KD%=*S[EJ8/=[ +M,"JT(V%M&EP[S4$L%O+L\81H8C`%5"7$6*@4640]/)J8)Y(=K@X5:Z:*49B1 +M42R69Q6J1%$^4P$*Y)N.#5(KK72#!7Q258I#.P7!SLBF\^WNXOR[`@)P4B$E +MGD^61\$A+=!`(\19]-78^)`3`4&EN]TG*TU*"UFE=(K#J0I!WXM+ULE/0RDT +M*BG9TDHERM&D&+IT9!@G/7:(%,>K(RTSFV[GQK73<+"-%"[Y^:H48PXV/ +M.)5UR_2E3Z965.:R`2&N%&Z2@>$ZU5=R$C?K&K)X6\R?0Y5!,&=6SR"K&^''/G;9<^4H95_9/-1X +MY;DF$N[WD!(E%L:)"`HL815SFK4!J?>Q?XRSDL,E*,@A')\X7>J_*:KH+N1\ +M:B!VLV$]Q=M4056Q>A^NNH0KT#,WP1.P_2T?P\([^RD.=:I!PP7WO/Z_4020X^WWHPQ]]T!5R:U[98N539*>*I^F4 +MFQQ3&ILAS'&O'BEIAY5`$,X\:13$FU(HQBH>'Y88@#Y@ZA6A5F@2T=DA'78`0T>\404@QBPE^!P>VG>,QCA1ZKUDX7X,D9M)HH63R0,0Q)ZGZCEMDARCP2"_ +MVE.LVROP"'ALQWW\Q#Y5V"P%J&:<,HW*QZ5K46G<.!0.QXXG.D*FTU\ +MFD;"Q)^C`2S_P#),(P(FP*`KHSYI4S4 +M,P`2\B328CI-R&IR`@TH2P?*44!J(P@(HRJHX),#4!!O\@`H8+)/!Q^>N2*L +MP((K424BP@(LN0I_48KK`"`H$L$8QB?*"6A&"@MH":( +M@@RO2K[;Z16#`RQ.Q"DZ`9U7@JC9(3Y:H#F#8C,.F1C=8B1K%#.JA2(& +M,SC0#$`)88.3)$R=4BA+TJ +M02))2Q+"68]@$X+UR+6@U(006')$:-0BC`TL::(T6R'!@`E[,T*DJ1$E7`L# +M9HS]4.%%,`0CAKH$"9--.AD5ZC(-R1&G0B(HWOEER)(C2I;Z\OE5JE'K/6\! +M6/(4"),G0G3#]C#$R!#?7X8(2>*$R67;5H9DSQ,(CO:@2I80R3,KMF+[MF&N2_3.QTMO)T\=.@.L\^(@AIC]L/CJ +M@L;>VN6^6\K8A8S+*.OJLEG&.@LL&B&%AF:8P:B*@DNAR8H\2CZYY2'"2*"$ +M@M,A((@:FBZC"F?`$2*J*,J.*!F0.JH:(Z+!<:N""M*J2:=6W/HA@Z2L&B6. +M&$+*>(\,TGY"$A!"L,2+"C*(H9P<0CJB')O.8L65/"+`FH4"*KIFAB"LP"*, +M)/+B)H<@'!XYG7)NNJ.J`G;X[(H!1%@0$AC+#_R*&0 +M:V8((U882KG(EADB'B*#O!;)(9*#S=X4A$@>$86?&:+*^(A*D=6G:;+:L,JM +MJC#"02!)#!`C&P`8HPX54B$+IV1BP]2&BO=`H:`&7.Q`HIVZ++0NC +MA06M>]^F8C#8+GHS"*.&BKTEMP,!Q##`)8G>$,/6$R(-J-*YKL@IAI+3376! +M4CHM2*)]4L@AW5H;1AK=[6#U.3\4(AT,8Y0QG8T`,21P]-BTKAG%CG@+"*&$ +MM.#`3HHH@JGTW+TA.2#D#L*IH(`,@HG!C28T:$"#(#0A0A/<0E&TT$90\[1@ +MK]Z3S";VS)-#@+`D+:""\C)"H:(WRBBTL#*2$$B.-DKH`HO(.LB$W6(#C<'4 +M:!Q-##B!GBNC-&A+T\.,T$XK15EN[]J/+<<^490C[N[:![4/ZBBA@CKRNS?@ +M6-)(=;<$FBV,#\$Q"*$I?@O.Q[`>"@UH)G9)$#B.,E)3R'ILWRL-7%:+O;0M +MJ]Z'1HV*JB(8?8/SI=V]IO8!H!K0DA`XOP;"*/2BD>/(0?MH0),@G)YPY>RV +MDF+3PY"%V-8(=6^AW?6P6$N\Z-YQG;N#;"7/FAZ,8`Z"U]0'9:BY6"\,@5C8 +MI<#[&--56SKSIHXI;JF@ +MV=`'[$L'QZR3"C>HUL]^373DW.`J**09LI$'L3S<0!R*T2+)FDD=!!.72.FE +MW'DVLPYDZ1U[X8<>L&F&4OIS!8*TQ!7<-H4@9&23>'9"$XS6M;7NF9D/*/D^ +M*6*+H5>EEW?99,$(*8FI!6/APHQX1@-F\"IC"U5@618HEZ&3C;OC"KZ\Y2,1 +MX2A4+IRIBWPGR8D%*#9%"Z*9I":]9"4IC#T*IPU04`Y,H`1-$2'GHC!I(!MI +M+#EE2DYO8U$;C`ZQG\.S*.DLLS9ZN2Z^C2!N4XA#'BJ0=PNAH``N:T$9L-6N +M+A6GJ4.6V@U"0@#S4:5%:GQ';OZ%F;;5M +MEA7("#^U6H6P0CL&V6KKKMP4*V_YV^,8QSG!DQ4LLDMT7U%7=+'3'=(86$-F +MQ]1J3AP=HBY$1)&TKI2G?+&(;"3I:7H(A3\PI@<3F(+048A4I_'1@&`_C0UV +M-_?77Q&+1HYC:"L$W9G>T0 +MVJ/#H$L%^T`")B7'%2HVE6,2>;!.VF9`@3%P'6RL3D6$++<*&,8;"M!?E3LHX7-?3-S*.NK +ML%WSA_`+-UO*ZPS*BLDY].$>]M32J>E&):EM=`[:DSHP)2Z/%`W>/B`?.\W,'((\!#=E +MB4#7_4E!7Y-8)SLIN\%XYR:ND+`I).1'MH+J&I(3#P]WSL1G[Y=%**@Y;M/(.3#"TUNZY>]O!/.>G8W0`DB!8=$IW6W:"U?Y>+#G0Q4"NYR +MZ5WN"D6YTM6O=I7=7;:G=ZE>TV(F^O9`N,V0@#*$!WXJP-X<"F#N<]>VUM^K +M7_R:[(/$62$VG.X-[X'3O5:GJ4(@R%)=%""`F%SH><#M=O#ID'_F>HYQW5-` +M@QOM.4QV3=#HL!;BL@\?^*./E1@,:?8-JU*B)3\%W=1W2GOIT6;H#P?,C;?PT2H"%3!GIZD=1#M"O +M,6Z?WT_GK[^H+W&#&:,!>"KU.273<2=.^YW',0)?"KSU^QL1>Q9/\Z?_^S?( +MR(9R^0THV9J]H#X6<8%GNR(0NS(^N*H?22/(H`H:NH!X2TN@L"9W$"5W.:=U +M^'/`X%[`!:,8BH!P^KL-*0>=^+&7B883!XP<0*'-P,AA:\I9: +M:K/JTY8&VJMZB#EP&0P0@3(0"0(?!@5O&G_P^PKO,Y;R."#14:A/>8L3*1Z_ +MARBR69[Q^2<0@9HS!0P5XS@/A2;(A%OH!;#1H"X5H85X<58$A8G%H3JR6(1! +M``FFNTQ8>2O=V:3KAKY)"Q$-$@>PZ:50Z+50ZZUCJWK(BE(HF9W\*X^?*YW" +MFWG$!ZNX^`2(L2D2@@S!.[&)!2>%N$"P2UJT.Z5+:48`1D<8>%0TN84Y69WX +MZ(N+2ZWUN@SIXGV(.31:.JP#>I>C"D>,L&[,25K8J%K4@38(`IV\@3(9*:E" +M1J]222(>!A&H2)=EZ#"WVS&>X)FEH#>.XV2`Q;5:*)-SN;0SR[LC"D]46G]L +M\7O\$[%_&J/S\FM<2QQM2#;6\01/)2`0.RH?QB=9@C(H@BB(@I:@L@8(V1DR +M8"?]1SC:)SRH6R'&L)BY,38PEF"(P+VLJ^D^3YGN8EM@4R*I!'(TJ,AQ&"D&0T0`4GH +MT$9R`H/`)Y*UD2;=@1RNFE9H\"=P"+MBF#EON5OJ,H#U@V",8&;&NJ6EJ6P, +M9(H.(2W``P%P@Q;"J1XHX$=:4F@F@V0T"Z#1``F^D&4T`0/!IV_R)B+("7KR +MIP$R9`/(('G*IC.JIS6[93(1IXN@8FR`IK\L9"#/T$MRNFKZ&0'NYD+TI'1*I%;0LB81\XD`T6,\8"=V8R]3H#HH +M@:9UYXUFVC$QBWS>8P^?R,C)#S("'PA@&@AR9\`H1_9@*9XY0[="UL`%EY:*BT680E(^'>18@_*Y@N5 +M,$*!\+[_@:ALJ'36N1-MY@NP2%%A@#0P25'RNW?AZ6#1(*E((0-F@TA&VS%I +M@$C2LX<^*C!?%SI=%&(AEZ(1L1W?"+KU:S2PE+S*%:9CE'[))UYV%AYN%'6^ +M,*GW.WSA%8]A%68)>'`AEDOAE6UJNW5>903A$Y/P9U)Y:JEL@8)C(!!18`RI +ME">+@F!YRG]18&F*`*/16VA>T8'_`6=)!R#(@Q!(\:#(A[*YV@W*JQ$(*CO: +M2Z_/FUN49R975"P9,(M[DY$+A(8P,S9P!(!P5',,J5AYBES58Q:IX+VOZ7;P-XD!Q$.3F$WPHKRW>7C3TT:3`$M^ +M-`DY\"FP!S]ZRH(/J7K-IE08.'Q%%+_&%%^%45@9JQIK$UT!Y:=!\T[Z\83U +M8Z=#:AZSMSXZ.GR%6+>]U(UK\&_-:FD^YROKMBZIV$OY2ZL'RH*1L!&(2`A) +MXR[I&0)7X0GOAWA<1I>R2"9)`Y,.ME\Q9`TP9K`5V:TS +MB7S=VUK^@UP!:IYZ,UW7)!*;RY25VI26>3.?^W*H1SJ-`4?]":7>@'BH1+(\ +M9IM4R)DW>[R-QA3-<`[G]31Z@(9,N9V[)8H1](&1,'LOHJMN<;RON?<0#B(HH8O'E40Q&<'@93`CE!(PEDJ+EEI]BGPIE79K +M\^\(E.M(C$#B61D?#EYRLQK`#H/]THQ&(VHQ@PS=6A(0VQOV#0//!Z[(C:E^ +MRB/'9"Q3C$X91(DY2UP-]_$P@+"@L/1H(/&XFW\5=QO&CAM])=($`H&1L&'* +M$%LJ8%?^2E/^`DW@%`!KH7<-RXAT(T/)(!%&Y^*DB80A\,:0WDT)-#S^"T +MSS`RC,;TF=G45@`?4A.(@2QW3TDR,&Z]H.[,SCQM5IG:9QDP62$=%9-^("EC +M8WSP=PVH@*9(I#+3`X?P%S1MSGFH)$JU"B]P3"[_8LG,D>:\@^P0S9`TSM<( +M)MM\!<0,38/^)1\&9N<"!2YGS+^@^GH`SI>@M)O##PQV@L8DF\:DLD>ANK@6 +M%T3!8`W(BK98+%ZE$2S"@US<`^63#X_J$[.\B&SF*2LYMAJ!@/=90(/+0*QJ9G+8`G(924Y +M@O1:YE)"A=0ZJ>Z9B5"88R,&%W_8"HP +MS>>&LM+H+Q;:KWVRCSH"$0F5I`.H4FC:RSN?QG@56BJ*6\KFX$3J&9QZB@Q!/,`(6[9G`TT:&XIJW +M3@2RQ9NW9FB\;0>[;7=65M1V@STLU: +M"1".88Q.+Y6YSZY;)Y.5"%H?T\TQH$?^8K;J[YUIH2QBXMLR@;)5!!_EG-C6 +M5"WI'=X1[8:]GY`@>\X8I2L?'A7&K,")\C#N:GXXE +M;555=/R9)A,=G$5F!']5>L\9'S?=H`(K8ZS('W;?GSV*GV/'L]9@CI2`'OV3BR16P1L]S-CCS[J_1!WJQX:Q>' +M.SR($0GN64LI3",'KTCJ^Y`]-I##7T]>8/.(37MS7MM=&EP[WZ.6WKX2)`8( +MZ_8U;!0WY!%(:MALR((6,FBR3=OR3,Y#3GL^>?B#3,T<"M_V'61G((.'2]P8 +MHE\>\?T*%L!A.Z[G[0K_83.XN@(5LIJ6G\,`%KM4L[[P'= +M!90L6+^S/E,X`]<&\^OS&=$&`+^VOX@^:;Z,V,MS,MU]#KC\/9&Q]^8=6;`U +M6U#&$GE(U,Y61FF,;:T,-/6HJ0D"29VQW]^KH\(=F$F5D''5]$; +MY9K%GM6%'>SXO>$Y7<&;4C<9'.,8-;Q&OP6RO0UB9>S;=VM48#KFDO2O-Y[/=&;#]=;\OU'OCHVQ>HF7.R9YE528^R'N,A71E)!?.97 +MQ_BR2-_F6S!MJMYKD64L#9'1"#93=IWL7(J,G*_-ON?X-SJ*';ONO@_*5(@, +M3]B'@M"'(Y>74.A#?7\QFO]M[6^:[OWZSO?%71>6G_>G[([E:O=UW +MJ`,EJY7\%J>BR&^5F[O2OA^+LW*?_;US_(LP_^+J$)N)%2>(F]@]F7$'N;T[ +M&@*(F]B_N=5I-^0;)"P=G7[3R-X[O/.G+ZF%?T;"TM&WF"?&@KB)R<)YT,+% +M&\.FJ:F)L?8[_96X`@E0`QF0&@4BBK,3T8R;N"-GW1&^-21CI5>/C7A/Q-B5 +M9L:UC"TWW!&^-21C`1%0]]B(]X1:TA7=&/_.-&6DTQ=GT>_`'!EGW1&^-21C +M`1&0]=B(]P1C+4W<%1M]T'U(7L7>:<\=X5M#,A80`6F/C7A/,-;2Q%W$%AM] +M1"5G7<7>K92JMS1=K48'RH^@,!8]I@:;80S(^KV8MI8LK-AN'K7?_S4B8C37 +M6Q#=(*:\ZQ`F#@6M@ZC:D1%9'#7(G,A)&L!)O)&ETPL>T@V(@!#!,T)K";HE +MM9:@9W-N'%OILAS=@`@('7AV!.!1@XR@#.WF?6N\4:[\7WKP +M+/5H++L=E43Z`?4B+7?Z2=]RY\%RB?2P(3;+G<0)S$8*.$L64DXBRR'_@EP6 +M4H[27K[U9R$HT0IZ9"'E_,R1Q#L/+6C2.O6(:W<6@A*MC))[QUM//!%H@X"$ +MX`ZR!2!1@#CV"O=`RL;%&X,Q41B(8R^HC2-MUV3S2B,YKW%-`G-UDAXYKW$\ +MO(<"A%%$TJ1?^U8N1I]_3R*J2]Q3KU9X\6=ZA8[UXSB1W-\[GU^$DC3B3W;6 +M`)OP2RWQ>:4^F`F2!LC3>%:./TWP\`C($2"(!33_3B*J>S`YJX(TZH.9D,4D +MY@!GD9\86_4DHKH_<*.UQAC[D!(KJC2P"3]GD3"JK2KN.)%#\PS9W*8JW!3O +M6S]+1V(X^EY$/XI^NXR;X$[WAC4W..'V1@&_D_.4=']TXCB1O&6,L0])DX#@H?2^/@!P!@EA`ZRA(#KX'DS/B`M?N!B".@Q(>XOC@ +M

L"RL!E#.-2T\PS9 +M7.C21(3O9:24WD)\8@QQ- +M=<^5@])5/O)F,C6ZUB?.XQO%X#SVU9/PWS6[HFH#.E(#1!X34P"[6ILQ4LW= +MB%76W,6(]X1*=XS*C<3"U=C=O-*H"Q6-T1V-T83RJY?\S:5!"G\A]$2-#JU@ +M9%/?;9Z:T!A-H"*"L>W%U16&\#[0Y5$3DAAVX9)#8RQA``%;L0Z)(172.-/% +M&P/O`?4T" +M7UQ=92WS1VQ33Q.-`=O%Y5$3RI-).=/%8Q\0@1(0`?4TT1BP7UQ=`0FP\$U" +M`O4T]=7%Y5$3XI(S7;PQ(`=03Y,73H2'2`9VS@"8(@1`:I@(H@;B!@V06 +MD@4"`0/P3@D0``OP(B:S(1&2`@%P`&\6%APN@3#P9N$2(SDP`B]B(A80`"OP +M$@K\`1@0``?P5BPH,P\N@0CP#@.2`Q/P9B$A`1OP`L5A,`]0XA((`F_%@K)N +M(!`P`V_%DAX0`#OP`L5AZ"LN@1#P`L5A2&"675Q=`0F!`@V&S`Z0``NP`@V& +MT-?%&P.(I#^&``?0``F!`@V&3/7%&P.^`(W_`PV0``NP`DW6TM?%&P.(I#^& +M``?0``F!`@V&3/7%&P.!`@V&S`Z0``NP`DW6TM?%&P.(I#^&``?0``F!`@V& +M3/7%&P.!`@V&S`Z0``NP`@V0@!!]7;PQ@$CZ8PAP``V0$"C08,A47[PQ8`;0 +M^#_0``FP``O09"U]7;PQ@$CZ,PX(`PV0``NP``V&T/;%&X/$`HW_`PV0``NP +M`$W6TM?%&P.(I#_C@##0``FP``O0H+9H7+PQ8#K0^#_0``FP``O09"U]7;PQ +M@$CZ8PAP``V0$"C08,A47[PQ8#K0^#_0``FP``O09"U]7;PQ@$CZ8PAP``V0 +M$"C08,A47[PQ`-OLW"K0``FP`P?0B!_:.OQL7UQ=84CZ&R/?,`[?,(Z@7+PQ +M8`;08$CZ`PFP`B?0`$D9T,+%&T.]`0UJSP[C`!O0``FPB,;%&P/R`@UJD\6- +MF\_%U94Q@C#0&"-P`HTQTNW%&P,P`3/0&"-P`(TQDN:-2QHJ7+PQ`"MP`@V& +MI#^0`*ML7+PQ;!K0&".P``V&H*[#%^K%U57$@C#0,`[S1RP(`XTQTM?%&P.P +M@@C0,,Z>1^R>BY_$7;PQ5";0,`[S1RR(`(TQTM?%&T-E`@WC['G$@@C0B)_$ +M7;PQ8`;0&"-P`DW$`B?0B!^?7+PQ`!MP`HWX`0?01"QP`HTQTM?%&\.F`0V0 +M`"LP`TW$[KDQTM?%&\.F`0V0`"LP`TW$`B?0B)_$7;PQ8`;01"SS`PFP[CF0 +M`*L47;PQD#W0``FP`2?0&".P`(TQ9O#%&P.%`(WX@2C0B!]P`(WX\?[%&P,P +M`2?08$CZ`PFP@S#08`AM7[PQ`".P`@UJ@S#0``FP@0C0H#;=7KPQD#W0``FP +M`2?0&"-P`@V0`"M]7;PQ``>P`,VM`DW6`@O01*S$7;PQD#W0``FP`2?0&",P +M`XWXH6[!7EQ=`0E5`PV0`-OL``FP,C^0`(ML7+PQ`!.P`0V0`-OLH#:P``WC +MR,;%&P.P`@O0``FP``O0H!1P``V0`&L&7[PQ`!MP``V0``NP``V0%"O0H'8& +M7[PQ8`;0``EI``V&``?0,$X&7[PQ`#NP``V0D`;0&"-P``V0`!N?7+PQ`#NP +M``VI`0O0H!0(`PV0`(MH7+PQ`/OLD-KLB!^P``WCB,;%&P-F`(WX,;_XS8[X +M"-2%FE3R(@X38#% +MY5$3`@E0`QF0^I2V"XCUHB*"(1##69B:B-;%<7RCM3?6EHHUE0I7M7>IQ`A? +M`RS0<7RCJ1G(EXH3X'2I:!0(E8J$LB7(\C7``AW'-YJ$LB4HE@PI?`RS0<7RCM3?6EHJ2EXIB\C62IR6H4M&.X1KU@C)HD@P-R2WV[-G% +MU57$IC^&,#^&``?08"B2FQ;I(2S]9!CU@C)HDHRL[E7%7EQ=80BP``V&`#/0 +M8`@P`PVF^1TC40G0<7RC,1734'?77QS'-QJM-"8"```````````````````` +3`````````````````````````' +` +end + diff --git a/supermon inst.prg b/supermon inst.prg new file mode 100644 index 0000000..3bd095b Binary files /dev/null and b/supermon inst.prg differ diff --git a/supermon64 docs.seq b/supermon64 docs.seq new file mode 100644 index 0000000..fec36f4 --- /dev/null +++ b/supermon64 docs.seq @@ -0,0 +1 @@ + Ó Õ Ð Å Ò Í Ï Î + 64 ÉN THE FOLLOWING DISCUSSION, KEYBOARD INPUT IN DESIGNATED BY BRACKETS. ÓÕÐÅÒÍÏÎ+ IS A NEW VERSION OF 'ÓÕÐÅÒÍÏÎ' THE REASON FOR THE NEW VERSION IS TO PROVIDE IDENTICAL COMMANDS TO THOSE OF THE BUILT-IN MONITOR OF THE COMMODORE 128. ÔHE MOST VISIBLE CHANGES FROM EARLIER VERSIONS OF ÓÕÐÅÒÍÏÎ ARE: --DECIMAL OR BINARY INPUT ALLOWED; --DISK STATUS AND COMMANDS (@); --LOOSER (EASIER) SYNTAX. ÎÕÍÂÅÒ ÃÏÎÖÅÒÓÉÏÎ <$2000> $2000 +8192 &20000 %10000000000000 ÉN THE ABOVE EXAMPLE THE USER HAS ASKED FOR THE NUMERIC EQUIVALENTS TO HEXADECIMAL 2000. ÔHE REPLY SHOWS THE VALUE IN HEX ($), IN DECIMAL (+), IN OCTAL (&) AND IN BINARY (%). ÔHE USER COULD ASK FOR A NUMBER TO BE CONVERTED FROM ANY OF THESE BASES BY GIVING THE APPROPRIATE PREFIX. ÉÍÐÏÒÔÁÎÔ ÎÏÔÅ -- ÁT ANY TIME IN THE FOLLOWING TEXT, YOU MAY ENTER ANY NUMBER IN ANY BASE AND CONVERSION WILL BE DONE FOR YOU. ÅXAMPLE: ×ILL CAUSE A MEMORY DISPLAY FROM DECIMAL ADDRESS 4096. ÉN THE DISPLAY, THE HEX ADDRESS ($1000) WILL BE SHOWN. ÓIMILARLY, <+2048 LDA#%10000000> ×ILL BE CONVERTED TO ASSEMBLE: "A $0400 LDA #$80" ÉF YOU DON'T GIVE A PREFIX, THE MONITOR WILL ASSUME HEXADECIMAL. ÒÅÇÉÓÔÅÒ ÄÉÓÐÌÁÙ PC SR AC XR YR SP ; 0000 01 02 03 04 05 ÄISPLAYS THE REGISTER VALUES SAVED WHEN ÓÕÐÅÒÍÏÎ+ WAS ENTERED. ÖALUES MAY BE CHANGED BY TYPING OVER THE DISPLAY FOLLOWED BY A RETURN CHARACTER. PC - PROGRAM COUNTER SR - STATUS REGISTER AC, XR, YR - A, X, AND Y REGISTERS SP - STACK POINTER >0200 4D 20 32 30 30 20 32 30: M 200 20 >0208 39 00 00 04 00 04 00 04: 9....... ÄISPLAY MEMORY FROM 0200 HEX TO 0209 HEX. ÄISPLAY IS IN LINES OF 8, SO ADDRESSES $200 TO $20F ARE SHOWN. ÉF ONLY ONE ADDRESS IS USED THEN 12 LINES (96 LOCATIONS) WILL BE SHOWN. ÉF NO ADDRESS IS GIVEN DISPLAY WILL GO FROM THE LAST ADDRESS. ÅQUIVALENT ÁÓÃÉÉ CHARACTERS ARE SHOWN IN REVERSE AT THE RIGHT. ÖALUES ARE CHANGED BY TYPING OVER THE DISPLAY FOLLOWED BY A RETURN CHARACTER. ÅØÉÔ ÔÏ ÂÁÓÉÃ ÒETURN TO ÂÁÓÉÃ ÒÅÁÄÙ MODE. ×HEN YOU WISH TO RETURN TO ÓÕÐÅÒÍÏÎ+, COMMAND "ÓÙÓ 8". ÓÉÍÐÌÅ ÁÓÓÅÍÂÌÅÒ (CHANGES TO:) A 2000 A9 12 LDA #$12 A 2002 ..NEXT INSTRUCTION ÉN THE ABOVE EXAMPLE THE USER STARTED ASSEMBLY AT 2000 HEX. ÔHE FIRST INSTRUCTION WAS LOAD A REGISTER WITH IMMEDIATE 18 DECIMAL. ÉN FOLLOWING LINES THE USER NEED NOT TYPE THE "A" AND ADDRESS. ÔHE SIMPLE ASSEMBLER PROMPTS WITH THE NEXT ADDRESS. ÔO EXIT THE ASSEMBLER TYPE A RETURN AFTER THE THE ADDRESS PROMPT. ÐREVIOUS LINES MAY BE CHANGED BY TYPING OVER THE RIGHT HAND PART. . 2000 A9 12 LDA #$12 . 2002 9D 00 80 STA $8000,X ÄISASSEMBLES INSTRUCTIONS FROM 2000 TO 2004 HEX. ÉF ONE ADDRESS IS GIVEN, 20 BYTES WILL BE DISASSEMBLED. ÉF NO ADDRESS, START FROM THE LAST USED ADDRESS. ÃODE MAY BE REASSEMBLED BY MOVING THE CURSOR BACK AND TYPING OVER THE RIGHT HAND PART. ÆÉÌÌ ÍÅÍÏÒÙ FILLS THE MEMORY FROM 1000 HEX TO 1100 HEX WITH THE BYTE FF HEX. ÇÏ (ÒÕÎ) ÇO TO ADDRESS 1000 HEX AND BEGIN RUNNING CODE. ÉF NO ADDRESS IS GIVEN, THE ADDRESS FROM THE REGISTER IS USED. ÊÕÍÐ (ÓÕÂÒÏÕÔÉÎÅ) ÃALL ADDRESS 1000 HEX AND BEGIN RUNNING CODE. ÒETURN TO THE MONITOR. ÈÕÎÔ ÍÅÍÏÒÙ ÈUNT THRU MEMORY FROM C000 HEX TO D000 HEX FOR THE ASCII STRING "READ" AND PRINT THE ADDRESS WHERE IT IS FOUND. Á MAXIMUM OF 32 CHARACTERS MAY BE USED. ÈUNT MEMORY FROM C000 HEX TO D000 HEX FOR THE SEQUENCE OF BYTES 20 D2 FF AND PRINT THE ADDRESS. Á MAXIMUM OF 32 BYTES MAY BE USED. ÆÉÌÅ ÈÁÎÄÌÉÎÇ ÌÏÁÄ ÌOAD ANY PROGRAM FROM CASSETTE #1. ÌOAD FROM CASSETTE #1 THE PROGRAM NAMED "RAM TEST". ÌOAD FROM DISK (DEVICE 8) THE PROGRAM NAMED "RAM TEST". ÔHIS COMMAND LEAVES BASIC POINTERS UNCHANGED. ÓÁÖÅ ÓAVE TO CASSETTE #1 MEMORY FROM 0800 HEX UP TO BUT NOT INCLUDING 0C80 HEX AND NAME IT "PROGRAM NAME". ÓAVE TO DISK DRIVE #0 MEMORY FROM 1200 HEX UP TO BUT NOT INCLUDING 1F50 HEX AND NAME IT "PROGRAM NAME". ÔÒÁÎÓÆÅÒ ÍÅÍÏÒÙ ÔRANSFER MEMORY IN THE RANGE 1000 HEX TO 1100 HEX AND START STORING IT AT ADDRESS 5000 HEX. ÃÏÍÐÁÒÅ ÍÅÍÏÒÙ ÃOMPARE MEMORY IN THE RANGE 1000 HEX TO 1100 HEX WITH MEMORY STARTING AT ADDRESS 5000 HEX. ÄÉÓË ÏÐÅÒÁÔÉÏÎÓ ÃÈÅÃË ÄÉÓË <@> ÇET DISK STATUS MESSAGE <@9> ÇET DISK UNIT 9 STATUS MESSAGE <@,$0> ÇET DRIVE 0 DIRECTORY <@,S0:TEMP> ÓCRATCH FILE 'TEMP' FROM DISK ÏÕÔÐÕÔ ÔÏ ÐÒÉÎÔÅÒ ÃALL ÓÕÐÅÒÍÏÎ+ FROM BASIC WITH: ÁLL COMMANDS WILL GO THE PRINTER. ×HEN COMPLETE, RETURN TO BASIC WITH "X" AND COMMAND: ÓÕÍÍÁÒÙ $ , + , & , % NUMBER CONVERSION G GO (RUN) J JUMP (SUBROUTINE) L LOAD FROM TAPE OR DISK M MEMORY DISPLAY R REGISTER DISPLAY S SAVE TO TAPE OR DISK X EXIT TO BASIC A SIMPLE ASSEMBLER D DISASSEMBLER F FILL MEMORY H HUNT MEMORY T TRANSFER MEMORY C COMPARE MEMORY @ DISK STATUS/COMMAND ÓUPERMON WILL LOAD ITSELF INTO THE TOP OF MEMORY...WHEREVER THAT HAPPENS TO BE ON YOUR MACHINE. ÂE SURE TO NOTE THE ÓÙÓ COMMAND WHICH LINKS ÓÕÐÅÒÍÏÎ TO THE ÃOMMODORE. ÉT MAY BE USED TO RECONNECT THE MONITOR IF IT IS ACCIDENTALLY DISCONNECTED BY USE OF THE RUN-STOP/RESTORE KEYS. \ No newline at end of file diff --git a/supermon64 docs.txt b/supermon64 docs.txt new file mode 100644 index 0000000..53e7609 --- /dev/null +++ b/supermon64 docs.txt @@ -0,0 +1,285 @@ + S U P E R M O N + 64 + +In the following discussion, keyboard +input in designated by brackets. + + + + +SUPERMON+ is a new version of +'SUPERMON' the reason for the new +version is to provide identical +commands to those of the built-in +monitor of the commodore 128. + + +The most visible changes from earlier +versions of SUPERMON are: + + --decimal or binary input allowed; + --disk status and commands (@); + --looser (easier) syntax. + + +NUMBER CONVERSION + +<$2000> + $2000 + +8192 + &20000 + %10000000000000 + + In the above example the user + has asked for the numeric + equivalents to hexadecimal 2000. + The reply shows the value in hex + ($), in decimal (+), in octal (&) + and in binary (%). + + The user could ask for a number + to be converted from any of these + bases by giving the appropriate + prefix. + + + IMPORTANT NOTE -- + At any time in the following text, + you may enter any number in any + base and conversion will be done + for you. + +Example: + + + Will cause a memory display from + decimal address 4096. In the + display, the hex address ($1000) + will be shown. Similarly, + +<+2048 lda#%10000000> + Will be converted to assemble: + "a $0400 lda #$80" + + If you don't give a prefix, the + monitor will assume hexadecimal. + + +REGISTER DISPLAY + + + + pc sr ac xr yr sp +; 0000 01 02 03 04 05 + + Displays the register values + saved when SUPERMON+ was entered. + Values may be changed by typing + over the display followed by a + return character. + + pc - program counter + sr - status register + ac, xr, yr - a, x, and y + registers + sp - stack pointer + + + + +>0200 4d 20 32 30 30 20 32 30: m 200 20 +>0208 39 00 00 04 00 04 00 04: 9....... + + Display memory from 0200 hex to + 0209 hex. Display is in lines of + 8, so addresses $200 to $20f are + shown. If only one address is + used then 12 lines (96 locations) + will be shown. If no address is + given display will go from the + last address. Equivalent ASCII + characters are shown in reverse + at the right. Values are changed + by typing over the display + followed by a return character. + + +EXIT TO BASIC + + + Return to BASIC READY mode. When + you wish to return to SUPERMON+, + command "SYS 8". + + +SIMPLE ASSEMBLER + + + + (changes to:) + a 2000 a9 12 lda #$12 + a 2002 ..next instruction + + In the above example the user + started assembly at 2000 hex. The + first instruction was load a + register with immediate 18 + decimal. In following lines the + user need not type the "a" and + address. The simple assembler + prompts with the next address. To + exit the assembler type a return + after the the address prompt. + + Previous lines may be changed by + typing over the right hand part. + + + + . 2000 a9 12 lda #$12 + . 2002 9d 00 80 sta $8000,x + + Disassembles instructions from + 2000 to 2004 hex. If one address + is given, 20 bytes will be + disassembled. If no address, + start from the last used address. + + Code may be reassembled by moving + the cursor back and typing over + the right hand part. + + +FILL MEMORY + + + fills the memory from 1000 hex to + 1100 hex with the byte ff hex. + +GO (RUN) + + + Go to address 1000 hex and begin + running code. If no address is + given, the address from the + register is used. + +JUMP (SUBROUTINE) + + + Call address 1000 hex and begin + running code. Return to the + monitor. + +HUNT MEMORY + + + Hunt thru memory from c000 hex to + d000 hex for the ascii string + "read" and print the address + where it is found. A maximum of + 32 characters may be used. + + Hunt memory from c000 hex to d000 + hex for the sequence of bytes + 20 d2 ff and print the address. A + maximum of 32 bytes may be used. + +FILE HANDLING + +LOAD + + + Load any program from cassette #1. + + + Load from cassette #1 the program + named "ram test". + + + Load from disk (device 8) the + program named "ram test". This + command leaves basic pointers + unchanged. + +SAVE + + + Save to cassette #1 memory from + 0800 hex up to but not including + 0c80 hex and name it + "program name". + + + Save to disk drive #0 memory from + 1200 hex up to but not including + 1f50 hex and name it + "program name". + +TRANSFER MEMORY + + + Transfer memory in the range 1000 + hex to 1100 hex and start storing + it at address 5000 hex. + +COMPARE MEMORY + + + Compare memory in the range 1000 + hex to 1100 hex with memory + starting at address 5000 hex. + +DISK OPERATIONS + +CHECK DISK + +<@> + Get disk status message + +<@9> + Get disk unit 9 status message + +<@,$0> + Get drive 0 directory + +<@,s0:temp> + Scratch file 'temp' from disk + + +OUTPUT TO PRINTER + Call SUPERMON+ from basic with: + + All commands will go the printer. + When complete, return to basic + with "x" and command: + + + + SUMMARY + + $ , + , & , % number conversion + g go (run) + j jump (subroutine) + l load from tape or disk + m memory display + r register display + s save to tape or disk + x exit to basic + a simple assembler + d disassembler + f fill memory + h hunt memory + t transfer memory + c compare memory + @ disk status/command + + + +Supermon will load itself into the top +of memory...wherever that happens to +be on your machine. Be sure to note +the SYS command which links SUPERMON +to the Commodore. It may be used to +reconnect the monitor if it is +accidentally disconnected by use of +the run-stop/restore keys. diff --git a/supermon64.asm b/supermon64.asm new file mode 100644 index 0000000..db33b96 --- /dev/null +++ b/supermon64.asm @@ -0,0 +1,1392 @@ +; ******************************** +; * SUPERMON+ 64 JIM BUTTERFIELD * +; * V1.2 AUGUST 20 1985 * +; * * +; * REFORMATTED FOR 64TASS * +; * DEC 2016 BY J.B. LANGSTON * +; ******************************** + +TMP0 =$C1 +TMP2 =$C3 +SATUS =$90 +FNLEN =$B7 +SADD =$B9 +FA =$BA +FNADR =$BB +NDX =$C6 +KEYD =$0277 +BKVEC =$0316 + + *= $0100 + +ACMD .fill 1 +LENGTH .fill 1 +MNEMW .fill 3 +SAVX .fill 1 +OPCODE .fill 1 +UPFLG .fill 1 +DIGCNT .fill 1 +INDIG .fill 1 +NUMBIT .fill 1 +STASH .fill 2 +U0AA0 .fill 10 +U0AAE =* +STAGE .fill 30 +ESTAGE =* + + *= $0200 + +INBUFF .fill 40 +ENDIN =* +PCH .fill 1 +PCL .fill 1 +SR .fill 1 +ACC .fill 1 +XR .fill 1 +YR .fill 1 +SP .fill 1 +STORE .fill 2 +CHRPNT .fill 1 +SAVY .fill 1 +U9F .fill 1 + +SETMSG =$FF90 +SECOND =$FF93 +TKSA =$FF96 +LISTEN =$FFB1 +TALK =$FFB4 +SETLFS =$FFBA +SETNAM =$FFBD +ACPTR =$FFA5 +CIOUT =$FFA8 +UNTLK =$FFAB +UNLSN =$FFAE +CHKIN =$FFC6 +CLRCHN =$FFCC +INPUT =$FFCF +CHROUT =$FFD2 +LOAD =$FFD5 +SAVE =$FFD8 +STOP =$FFE1 +GETIN =$FFE4 + + *=$9519 + +SUPER LDY #MSG4-MSGBAS + JSR SNDMSG + LDA SUPAD + STA TMP0 + LDA SUPAD+1 + STA TMP0+1 + JSR CVTDEC + LDA #0 + LDX #6 + LDY #3 + JSR NMPRNT + JSR CRLF + LDA LINKAD + STA BKVEC + LDA LINKAD+1 + STA BKVEC+1 + LDA #$80 + JSR SETMSG + BRK + +BREAK LDX #$05 +BSTACK PLA ;Y,X,A,SR,PCL,PCH + STA PCH,X + DEX + BPL BSTACK + CLD + TSX + STX SP + CLI + + ; [R] +DSPLYR LDY #MSG2-MSGBAS + JSR SNDCLR + LDA #$3B + JSR CHROUT + LDA #$20 + JSR CHROUT + LDA PCH + JSR WRTWO + LDY #1 +DISJ LDA PCH,Y + JSR WRBYTE + INY + CPY #7 + BCC DISJ + +STRT JSR CRLF + LDX #0 + STX CHRPNT +SMOVE JSR INPUT + STA INBUFF,X + INX + CPX #ENDIN-INBUFF + BCS ERROR + CMP #$0D + BNE SMOVE + LDA #0 + STA INBUFF-1,X +ST1 JSR GETCHR + BEQ STRT + CMP #$20 + BEQ ST1 +S0 LDX #KEYTOP-KEYW +S1 CMP KEYW,X + BEQ S2 + DEX + BPL S1 + + ; ERROR +ERROR LDY #MSG3-MSGBAS + JSR SNDMSG + JMP STRT +S2 CPX #$13 + BCS LSV + CPX #$0F + BCS CNVLNK + TXA + ASL A + TAX + LDA KADDR+1,X + PHA + LDA KADDR,X + PHA + JMP GETPAR +LSV STA SAVY + JMP LD +CNVLNK JMP CONVRT + + ; [X] +EXIT JMP ($A002) + + ; [M] +DSPLYM BCS DSPM11 + JSR COPY12 + JSR GETPAR + BCC DSMNEW +DSPM11 LDA #$0B + STA TMP0 + BNE DSPBYT +DSMNEW JSR SUB12 + BCC MERROR + LDX #3 +DSPM01 LSR TMP0+1 + ROR TMP0 + DEX + BNE DSPM01 +DSPBYT JSR STOP + BEQ DSPMX + JSR DISPMEM + LDA #8 + JSR BUMPAD2 + JSR SUBA1 + BCS DSPBYT +DSPMX JMP STRT +MERROR JMP ERROR + + ; [;] +ALTR JSR COPY1P + LDY #0 +ALTR1 JSR GETPAR + BCS ALTRX + LDA TMP0 + STA SR,Y + INY + CPY #$05 + BCC ALTR1 +ALTRX JMP STRT + + ; [>] +ALTM BCS ALTMX + JSR COPY12 + LDY #0 +ALTM1 JSR GETPAR + BCS ALTMX + LDA TMP0 + STA (TMP2),Y + INY + CPY #8 + BCC ALTM1 +ALTMX LDA #$91 + JSR CHROUT + JSR DISPMEM + JMP STRT + + ; [G] +GOTO LDX SP + TXS +GOTO2 JSR COPY1P + SEI + LDA PCH + PHA + LDA PCL + PHA + LDA SR + PHA + LDA ACC + LDX XR + LDY YR + RTI + + ; [J] +JSUB LDX SP + TXS + JSR GOTO2 + STY YR + STX XR + STA ACC + PHP + PLA + STA SR + JMP DSPLYR + + ; DISPLAY MEMORY +DISPMEM JSR CRLF + LDA #">" + JSR CHROUT + JSR SHOWAD + LDY #0 + BEQ DMEMGO +DMEMLP JSR SPACE +DMEMGO LDA (TMP2),Y + JSR WRTWO + INY + CPY #8 + BCC DMEMLP + LDY #MSG5-MSGBAS + JSR SNDMSG + LDY #0 +DCHAR LDA (TMP2),Y + TAX + AND #$BF + CMP #$22 + BEQ DDOT + TXA + AND #$7F + CMP #$20 + TXA + BCS DCHROK +DDOT LDA #$2E +DCHROK JSR CHROUT + INY + CPY #8 + BCC DCHAR + RTS + + ; [C] +COMPAR LDA #0 + .BYTE $2C + + ; [T] +TRANS LDA #$80 + STA SAVY + LDA #0 + STA UPFLG + JSR GETDIF + BCS TERROR + JSR GETPAR + BCC TOKAY +TERROR JMP ERROR +TOKAY BIT SAVY + BPL COMPAR1 + ; COMPARE ADDS1,ADDS3 + LDA TMP2 + CMP TMP0 + LDA TMP2+1 + SBC TMP0+1 + BCS COMPAR1 + ; ADD ADDS2 TO ADDS1 + LDA STORE + ADC TMP0 + STA TMP0 + LDA STORE+1 + ADC TMP0+1 + STA TMP0+1 + LDX #1 +TDOWN LDA STASH,X + STA TMP2,X + DEX + BPL TDOWN + LDA #$80 + STA UPFLG +COMPAR1 JSR CRLF + LDY #0 +TCLOOP JSR STOP + BEQ TEXIT + LDA (TMP2),Y + BIT SAVY + BPL COMPAR2 + STA (TMP0),Y +COMPAR2 CMP (TMP0),Y + BEQ TMVAD + JSR SHOWAD +TMVAD BIT UPFLG + BMI TDECAD + INC TMP0 + BNE TINCOK + INC TMP0+1 + BNE TINCOK + JMP ERROR +TDECAD JSR SUBA1 + JSR SUB21 + JMP TMOR +TINCOK JSR ADDA2 + +TMOR JSR SUB13 + BCS TCLOOP +TEXIT JMP STRT + + ; [H] +HUNT JSR GETDIF + BCS HERROR + LDY #0 + JSR GETCHR + CMP #"'" + BNE NOSTRH + JSR GETCHR + CMP #0 + BEQ HERROR +HPAR STA STAGE,Y + INY + JSR GETCHR + BEQ HTGO + CPY #ESTAGE-STAGE + BNE HPAR + BEQ HTGO +NOSTRH JSR RDPAR +HLP LDA TMP0 + STA STAGE,Y + INY + JSR GETPAR + BCS HTGO + CPY #ESTAGE-STAGE + BNE HLP +HTGO STY SAVY + JSR CRLF +HSCAN LDY #0 +HLP3 LDA (TMP2),Y + CMP STAGE,Y + BNE HNOFT + INY + CPY SAVY + BNE HLP3 + ; MATCH FOUND + JSR SHOWAD +HNOFT JSR STOP + BEQ HEXIT + JSR ADDA2 + JSR SUB13 + BCS HSCAN +HEXIT JMP STRT +HERROR JMP ERROR + + ; [LSV] +LD LDY #1 + STY FA + STY SADD + DEY + STY FNLEN + STY SATUS + LDA #>STAGE + STA FNADR+1 + LDA #;" +HIKEY .TEXT "$+&%LSV" +KEYTOP =* + + ; VECTORS +KADDR .WORD ASSEM-1,COMPAR-1,DISASS-1,FILL-1 + .WORD GOTO-1,HUNT-1,JSUB-1,DSPLYM-1 + .WORD DSPLYR-1,TRANS-1,EXIT-1,DSTAT-1 + .WORD ASSEM-1,ALTM-1,ALTR-1 + + ; MODULO NUMBER SYSTEMS +MODTAB .BYTE $10,$0A,$08,02 + + ; BITS PER NUMBER SYSTEM +LENTAB .BYTE $04,$03,$03,$01 +LINKAD .WORD BREAK +SUPAD .WORD SUPER \ No newline at end of file diff --git a/supermon64.prg b/supermon64.prg new file mode 100644 index 0000000..bc6d932 Binary files /dev/null and b/supermon64.prg differ diff --git a/supermon64.src.seq b/supermon64.src.seq new file mode 100644 index 0000000..944b607 --- /dev/null +++ b/supermon64.src.seq @@ -0,0 +1 @@ +; ******************************** ; * SUPERMON+ 64 JIM BUTTERFIELD * ; * V1.2 AUGUST 20 1985 * ; ******************************** TMP0 =$C1 TMP2 =$C3 SATUS =$90 FNLEN =$B7 SADD =$B9 FA =$BA FNADR =$BB NDX =$C6 KEYD =$0277 BKVEC =$0316 *= $0100 ACMD *=*+1 LENGTH *=*+1 MNEMW *=*+3 SAVX *=*+1 OPCODE *=*+1 UPFLG *=*+1 DIGCNT *=*+1 INDIG *=*+1 NUMBIT *=*+1 STASH *=*+2 U0AA0 *=*+10 U0AAE =* STAGE *=*+30 ESTAGE =* *= $0200 INBUFF *=*+40 ENDIN =* PCH *=*+1 PCL *=*+1 SR *=*+1 ACC *=*+1 XR *=*+1 YR *=*+1 SP *=*+1 STORE *=*+2 CHRPNT *=*+1 SAVY *=*+1 U9F *=*+1 SETMSG =$FF90 SECOND =$FF93 TKSA =$FF96 LISTEN =$FFB1 TALK =$FFB4 SETLFS =$FFBA SETNAM =$FFBD ACPTR =$FFA5 CIOUT =$FFA8 UNTLK =$FFAB UNLSN =$FFAE CHKIN =$FFC6 CLRCHN =$FFCC INPUT =$FFCF CHROUT =$FFD2 LOAD =$FFD5 SAVE =$FFD8 STOP =$FFE1 GETIN =$FFE4 *=$9519 SUPER LDY #MSG4-MSGBAS:JSR SNDMSG LDA SUPAD:STA TMP0 LDA SUPAD+1:STA TMP0+1 JSR CVTDEC LDA #0:LDX #6:LDY #3 JSR NMPRNT:JSR CRLF LDA LINKAD:STA BKVEC LDA LINKAD+1:STA BKVEC+1 LDA #$80:JSR SETMSG BRK ; BREAK LDX #$05 BSTACK PLA ;Y,X,A,SR,PCL,PCH STA PCH,X DEX BPL BSTACK CLD TSX STX SP CLI ; [R] DSPLYR LDY #MSG2-MSGBAS:JSR SNDCLR LDA #$3B:JSR CHROUT:LDA #$20:JSR CHROUT LDA PCH:JSR WRTWO LDY #1 DISJ LDA PCH,Y JSR WRBYTE INY CPY #7 BCC DISJ ; STRT JSR CRLF LDX #0 STX CHRPNT SMOVE JSR INPUT STA INBUFF,X INX CPX #ENDIN-INBUFF BCS ERROR CMP #$0D BNE SMOVE LDA #0 STA INBUFF-1,X ST1 JSR GETCHR BEQ STRT CMP #$20 BEQ ST1 S0 LDX #KEYTOP-KEYW S1 CMP KEYW,X:BEQ S2 DEX:BPL S1 ; ERROR ERROR LDY #MSG3-MSGBAS:JSR SNDMSG JMP STRT S2 CPX #$13:BCS LSV CPX #$0F:BCS CNVLNK TXA:ASL A:TAX LDA KADDR+1,X:PHA LDA KADDR,X:PHA JMP GETPAR LSV STA SAVY JMP LD CNVLNK JMP CONVRT ; [X] EXIT JMP ($A002) ; [M] DSPLYM BCS DSPM11 JSR COPY12 JSR GETPAR BCC DSMNEW DSPM11 LDA #$0B STA TMP0 BNE DSPBYT DSMNEW JSR SUB12 BCC MERROR LDX #3 DSPM01 LSR TMP0+1 ROR TMP0 DEX BNE DSPM01 DSPBYT JSR STOP BEQ DSPMX JSR DISPMEM LDA #8 JSR BUMPAD2 JSR SUBA1 BCS DSPBYT DSPMX JMP STRT MERROR JMP ERROR ; [;] ALTR JSR COPY1P LDY #0 ALTR1 JSR GETPAR BCS ALTRX LDA TMP0 STA SR,Y INY CPY #$05 BCC ALTR1 ALTRX JMP STRT ; [>] ALTM BCS ALTMX JSR COPY12 LDY #0 ALTM1 JSR GETPAR BCS ALTMX LDA TMP0 STA (TMP2),Y INY CPY #8 BCC ALTM1 ALTMX LDA #$91:JSR CHROUT JSR DISPMEM JMP STRT ; [G] GOTO LDX SP:TXS GOTO2 JSR COPY1P SEI:LDA PCH:PHA LDA PCL:PHA LDA SR:PHA LDA ACC:LDX XR:LDY YR:RTI ; [J] JSUB LDX SP:TXS:JSR GOTO2 STY YR:STX XR:STA ACC PHP:PLA:STA SR JMP DSPLYR ; DISPLAY MEMORY DISPMEM JSR CRLF LDA #">" JSR CHROUT JSR SHOWAD LDY #0 BEQ DMEMGO DMEMLP JSR SPACE DMEMGO LDA (TMP2),Y JSR WRTWO INY CPY #8 BCC DMEMLP LDY #MSG5-MSGBAS:JSR SNDMSG LDY #0 DCHAR LDA (TMP2),Y TAX:AND #$BF:CMP #$22:BEQ DDOT:TXA AND #$7F CMP #$20 TXA BCS DCHROK DDOT LDA #$2E DCHROK JSR CHROUT INY CPY #8 BCC DCHAR RTS ; [C] COMPAR LDA #0 .BYTE $2C ; [T] TRANS LDA #$80 STA SAVY LDA #0 STA UPFLG JSR GETDIF BCS TERROR JSR GETPAR BCC TOKAY TERROR JMP ERROR TOKAY BIT SAVY BPL COMPAR1 ; COMPARE ADDS1,ADDS3 LDA TMP2 CMP TMP0 LDA TMP2+1 SBC TMP0+1 BCS COMPAR1 ; ADD ADDS2 TO ADDS1 LDA STORE ADC TMP0 STA TMP0 LDA STORE+1 ADC TMP0+1 STA TMP0+1 LDX #1 TDOWN LDA STASH,X STA TMP2,X DEX BPL TDOWN LDA #$80 STA UPFLG COMPAR1 JSR CRLF LDY #0 TCLOOP JSR STOP BEQ TEXIT LDA (TMP2),Y BIT SAVY BPL COMPAR2 STA (TMP0),Y COMPAR2 CMP (TMP0),Y BEQ TMVAD JSR SHOWAD TMVAD BIT UPFLG BMI TDECAD INC TMP0 BNE TINCOK INC TMP0+1 BNE TINCOK JMP ERROR TDECAD JSR SUBA1 JSR SUB21 JMP TMOR TINCOK JSR ADDA2 ; TMOR JSR SUB13 BCS TCLOOP TEXIT JMP STRT ; [H] HUNT JSR GETDIF BCS HERROR LDY #0 JSR GETCHR CMP #"'" BNE NOSTRH JSR GETCHR CMP #0 BEQ HERROR HPAR STA STAGE,Y INY JSR GETCHR BEQ HTGO CPY #ESTAGE-STAGE BNE HPAR BEQ HTGO NOSTRH JSR RDPAR HLP LDA TMP0 STA STAGE,Y INY JSR GETPAR BCS HTGO CPY #ESTAGE-STAGE BNE HLP HTGO STY SAVY JSR CRLF HSCAN LDY #0 HLP3 LDA (TMP2),Y CMP STAGE,Y BNE HNOFT INY CPY SAVY BNE HLP3 ; MATCH FOUND JSR SHOWAD HNOFT JSR STOP BEQ HEXIT JSR ADDA2 JSR SUB13 BCS HSCAN HEXIT JMP STRT HERROR JMP ERROR ; [LSV] LD LDY #1:STY FA:STY SADD DEY:STY FNLEN:STY SATUS LDA #>STAGE:STA FNADR+1 LDA #;" HIKEY .ASC "$+&%LSV" KEYTOP =* ; VECTORS KADDR .WORD ASSEM-1,COMPAR-1,DISASS-1,FILL-1 .WORD GOTO-1,HUNT-1,JSUB-1,DSPLYM-1 .WORD DSPLYR-1,TRANS-1,EXIT-1,DSTAT-1 .WORD ASSEM-1,ALTM-1,ALTR-1 ; MODULO NUMBER SYSTEMS MODTAB .BYTE $10,$0A,$08,02 ; BITS PER NUMBER SYSTEM LENTAB .BYTE $04,$03,$03,$01 LINKAD .WORD BREAK SUPAD .WORD SUPER \ No newline at end of file diff --git a/supermon64.src.txt b/supermon64.src.txt new file mode 100644 index 0000000..5b91137 --- /dev/null +++ b/supermon64.src.txt @@ -0,0 +1,1104 @@ +; ******************************** +; * supermon+ 64 jim butterfield * +; * v1.2 august 20 1985 * +; ******************************** +tmp0 =$c1 +tmp2 =$c3 +satus =$90 +fnlen =$b7 +sadd =$b9 +fa =$ba +fnadr =$bb +ndx =$c6 +keyd =$0277 +bkvec =$0316 +*= $0100 +acmd *=*+1 +length *=*+1 +mnemw *=*+3 +savx *=*+1 +opcode *=*+1 +upflg *=*+1 +digcnt *=*+1 +indig *=*+1 +numbit *=*+1 +stash *=*+2 +u0aa0 *=*+10 +u0aae =* +stage *=*+30 +estage =* +*= $0200 +inbuff *=*+40 +endin =* +pch *=*+1 +pcl *=*+1 +sr *=*+1 +acc *=*+1 +xr *=*+1 +yr *=*+1 +sp *=*+1 +store *=*+2 +chrpnt *=*+1 +savy *=*+1 +u9f *=*+1 +setmsg =$ff90 +second =$ff93 +tksa =$ff96 +listen =$ffb1 +talk =$ffb4 +setlfs =$ffba +setnam =$ffbd +acptr =$ffa5 +ciout =$ffa8 +untlk =$ffab +unlsn =$ffae +chkin =$ffc6 +clrchn =$ffcc +input =$ffcf +chrout =$ffd2 +load =$ffd5 +save =$ffd8 +stop =$ffe1 +getin =$ffe4 +*=$9519 +super ldy #msg4-msgbas:jsr sndmsg + lda supad:sta tmp0 + lda supad+1:sta tmp0+1 + jsr cvtdec + lda #0:ldx #6:ldy #3 + jsr nmprnt:jsr crlf + lda linkad:sta bkvec + lda linkad+1:sta bkvec+1 + lda #$80:jsr setmsg + brk +; +break ldx #$05 +bstack pla ;y,x,a,sr,pcl,pch + sta pch,x + dex + bpl bstack + cld + tsx + stx sp + cli +; [r] +dsplyr ldy #msg2-msgbas:jsr sndclr + lda #$3b:jsr chrout:lda #$20:jsr chrout + lda pch:jsr wrtwo + ldy #1 +disj lda pch,y + jsr wrbyte + iny + cpy #7 + bcc disj +; +strt jsr crlf + ldx #0 + stx chrpnt +smove jsr input + sta inbuff,x + inx + cpx #endin-inbuff + bcs error + cmp #$0d + bne smove + lda #0 + sta inbuff-1,x +st1 jsr getchr + beq strt + cmp #$20 + beq st1 +s0 ldx #keytop-keyw +s1 cmp keyw,x:beq s2 + dex:bpl s1 +; error +error ldy #msg3-msgbas:jsr sndmsg + jmp strt +s2 cpx #$13:bcs lsv + cpx #$0f:bcs cnvlnk + txa:asl a:tax + lda kaddr+1,x:pha + lda kaddr,x:pha + jmp getpar +lsv sta savy + jmp ld +cnvlnk jmp convrt +; [x] +exit jmp ($a002) +; [m] +dsplym bcs dspm11 + jsr copy12 + jsr getpar + bcc dsmnew +dspm11 lda #$0b + sta tmp0 + bne dspbyt +dsmnew jsr sub12 + bcc merror + ldx #3 +dspm01 lsr tmp0+1 + ror tmp0 + dex + bne dspm01 +dspbyt jsr stop + beq dspmx + jsr dispmem + lda #8 + jsr bumpad2 + jsr suba1 + bcs dspbyt +dspmx jmp strt +merror jmp error +; [;] +altr jsr copy1p + ldy #0 +altr1 jsr getpar + bcs altrx + lda tmp0 + sta sr,y + iny + cpy #$05 + bcc altr1 +altrx jmp strt +; [>] +altm bcs altmx + jsr copy12 + ldy #0 +altm1 jsr getpar + bcs altmx + lda tmp0 + sta (tmp2),y + iny + cpy #8 + bcc altm1 +altmx lda #$91:jsr chrout + jsr dispmem + jmp strt +; [g] +goto ldx sp:txs +goto2 jsr copy1p + sei:lda pch:pha + lda pcl:pha + lda sr:pha + lda acc:ldx xr:ldy yr:rti +; [j] +jsub ldx sp:txs:jsr goto2 + sty yr:stx xr:sta acc + php:pla:sta sr + jmp dsplyr +; display memory +dispmem jsr crlf + lda #">" + jsr chrout + jsr showad + ldy #0 + beq dmemgo +dmemlp jsr space +dmemgo lda (tmp2),y + jsr wrtwo + iny + cpy #8 + bcc dmemlp + ldy #msg5-msgbas:jsr sndmsg + ldy #0 +dchar lda (tmp2),y + tax:and #$bf:cmp #$22:beq ddot:txa + and #$7f + cmp #$20 + txa + bcs dchrok +ddot lda #$2e +dchrok jsr chrout + iny + cpy #8 + bcc dchar + rts +; [c] +compar lda #0 + .byte $2c +; [t] +trans lda #$80 + sta savy + lda #0 + sta upflg + jsr getdif + bcs terror + jsr getpar + bcc tokay +terror jmp error +tokay bit savy + bpl compar1 +; compare adds1,adds3 + lda tmp2 + cmp tmp0 + lda tmp2+1 + sbc tmp0+1 + bcs compar1 +; add adds2 to adds1 + lda store + adc tmp0 + sta tmp0 + lda store+1 + adc tmp0+1 + sta tmp0+1 + ldx #1 +tdown lda stash,x + sta tmp2,x + dex + bpl tdown + lda #$80 + sta upflg +compar1 jsr crlf + ldy #0 +tcloop jsr stop + beq texit + lda (tmp2),y + bit savy + bpl compar2 + sta (tmp0),y +compar2 cmp (tmp0),y + beq tmvad + jsr showad +tmvad bit upflg + bmi tdecad + inc tmp0 + bne tincok + inc tmp0+1 + bne tincok + jmp error +tdecad jsr suba1 + jsr sub21 + jmp tmor +tincok jsr adda2 +; +tmor jsr sub13 + bcs tcloop +texit jmp strt +; [h] +hunt jsr getdif + bcs herror + ldy #0 + jsr getchr + cmp #"'" + bne nostrh + jsr getchr + cmp #0 + beq herror +hpar sta stage,y + iny + jsr getchr + beq htgo + cpy #estage-stage + bne hpar + beq htgo +nostrh jsr rdpar +hlp lda tmp0 + sta stage,y + iny + jsr getpar + bcs htgo + cpy #estage-stage + bne hlp +htgo sty savy + jsr crlf +hscan ldy #0 +hlp3 lda (tmp2),y + cmp stage,y + bne hnoft + iny + cpy savy + bne hlp3 +; match found + jsr showad +hnoft jsr stop + beq hexit + jsr adda2 + jsr sub13 + bcs hscan +hexit jmp strt +herror jmp error +; [lsv] +ld ldy #1:sty fa:sty sadd + dey:sty fnlen:sty satus + lda #>stage:sta fnadr+1 + lda #;" +hikey .asc "$+&%lsv" +keytop =* +; vectors +kaddr .word assem-1,compar-1,disass-1,fill-1 +.word goto-1,hunt-1,jsub-1,dsplym-1 +.word dsplyr-1,trans-1,exit-1,dstat-1 +.word assem-1,altm-1,altr-1 +; modulo number systems +modtab .byte $10,$0a,$08,02 +; bits per number system +lentab .byte $04,$03,$03,$01 +linkad .word break +supad .word super