1634 lines
		
	
	
		
			85 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1634 lines
		
	
	
		
			85 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|                                                                       |
 | 
						|
|                                                                       |
 | 
						|
|       Apple-1 simulator for Gigatron TTL microcomputer                |
 | 
						|
|                                                                       |
 | 
						|
|                                                                       |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
gcl0x
 | 
						|
 | 
						|
{
 | 
						|
  References:
 | 
						|
 | 
						|
  Apple-1 Operation Manual:
 | 
						|
        http://apple1.chez.com/Apple1project/Docs/pdf/AppleI_Manual.pdf
 | 
						|
 | 
						|
  Apple BASIC Users Manual -- October 1976:
 | 
						|
        https://archive.org/details/apple1_basic_manual
 | 
						|
 | 
						|
  A Number Game for the 6502 -- September 1976:
 | 
						|
        https://www.applefritter.com/files/Apple1WozDrDobbsMastermind.pdf
 | 
						|
 | 
						|
  Using The Woz Monitor:
 | 
						|
        https://www.sbprojects.net/projects/apple1/wozmon.php
 | 
						|
 | 
						|
  Original MOS6502 source code for WozMon:
 | 
						|
        https://github.com/jefftranter/6502/tree/master/asm/wozmon
 | 
						|
        https://www.sbprojects.com/projects/apple1/wozmon.txt
 | 
						|
 | 
						|
  Eric Smit's disassembly of A1 BASIC:
 | 
						|
        http://www.brouhaha.com/~eric/retrocomputing/apple/apple1/basic/
 | 
						|
 | 
						|
  Online Apple 1 Emulator (Hit [RESET] to enter WozMon):
 | 
						|
        https://www.scullinsteel.com/apple1/
 | 
						|
 | 
						|
  Jeff Jetton's 15-puzzle for the Apple-1
 | 
						|
        https://www.applefritter.com/content/my-first-apple-i-program-15-puzzle
 | 
						|
 | 
						|
 | 
						|
  Zero page usage:
 | 
						|
        $00-$2f         (Gigatron)
 | 
						|
        $30-$35         vIRQ (system)
 | 
						|
        $36-$37         vIRQ (application)
 | 
						|
        $38-$3f         WozMon, Mini-assembler
 | 
						|
        $40-$4c         Mini-assembler, Integer BASIC
 | 
						|
        $4d-$79         Integer BASIC
 | 
						|
        $7a-$7f         _i _j _p for PIA emulation
 | 
						|
        $80             (Gigatron)
 | 
						|
        $81-$e9         Integer BASIC
 | 
						|
        $e0-$ff         Stack
 | 
						|
 | 
						|
  Memory map, with reduced (and split) screen memory:
 | 
						|
        +--------------------------+
 | 
						|
        |0000-00FF   ZEROPAGE+STACK|
 | 
						|
        |0100-01FF   VIDEO+SYSTEM  |
 | 
						|
        |0200-0FFF   RAM           |
 | 
						|
        |0200-027F   KEYBD BUFFER  |
 | 
						|
        |0C8A-0FDD   MINI-ASSEMBLER|
 | 
						|
        |1060-5DFF   SCREEN        | 78 scanlines = 11*7+1
 | 
						|
        |5E00-5FFF   PIA EMULATION |
 | 
						|
        |E000-EFFF   A1 BASIC      | alias 6000-6FFF -> A1 BASIC
 | 
						|
        |F060-FEFF   SCREEN        | alias 7060-7EFF -> 15 scanlines = 2*7+1
 | 
						|
        |FF00-FFFF   APPLE-1 ROM   |
 | 
						|
        |                          |
 | 
						|
        |300R      MASTERMIND      |
 | 
						|
        |400R      15-PUZZLE       |
 | 
						|
        |EEER      MINI-ASSEMBLER  |
 | 
						|
        |C100R     MENU            |
 | 
						|
        |E000R     INTEGER BASIC   |
 | 
						|
        |E2B3R     BASIC WARM START|
 | 
						|
        +--------------------------+
 | 
						|
}
 | 
						|
 | 
						|
_p=$7a          {2 bytes}
 | 
						|
_i=$7c          {2 bytes}
 | 
						|
_j=$7e          {2 bytes}
 | 
						|
 | 
						|
_cursorTimer=$36
 | 
						|
_tmpChar=$36
 | 
						|
_lastKey=$37
 | 
						|
_PIA=$30        {Overlap with (otherwise useless) vIRQ-saved vPC}
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|       ROM type check                                                  |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 | 
						|
*=$200
 | 
						|
 | 
						|
\romType, \romTypeValue_ROMv5-  {Version check >= ROMv5, see Docs/GT1-files.txt}
 | 
						|
[if<0 do _frameCount _vPCH:     {https://forum.gigatron.io/viewtopic.php?f=4&t=130}
 | 
						|
      loop]
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|       Initialize                                                      |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 | 
						|
{ This code runs once and is then reused as the input buffer for wozmon }
 | 
						|
 | 
						|
$00a0 _sysArgs0=                {Clear last pixel row}
 | 
						|
$7e60 _sysArgs2=
 | 
						|
\SYS_SetMemory_v2_54 _sysFn= 54!!
 | 
						|
 | 
						|
$1ee _p= {videoTable+119*2}     {Pointer, later used as Pos}
 | 
						|
[do
 | 
						|
  $7e _p.                       {Shared empty pixel line at $7e60}
 | 
						|
  <_p, 2- <_p. if>=0loop]
 | 
						|
$101 {videoTable+1} _p= $60 _p. {Use offsets 96..255 for pixel data, not 0..159}
 | 
						|
                                {The reason is that it makes important}
 | 
						|
                                { addresses available: $c100, $d010..$d013}
 | 
						|
$10ff _p=                       {Put cursor on right side. This causes an automatic
 | 
						|
                                 newline at the first invokation of _CharOut}
 | 
						|
 | 
						|
&_vIRQ_v5 _i=
 | 
						|
&_vIRQ_ENTER _i:                {Set vIRQ vector}
 | 
						|
 | 
						|
254 \frameCount.                {First interrupt after at least one full frame}
 | 
						|
 | 
						|
&_Apple1 _vLR=                  {Prepare transfer to main loop}
 | 
						|
&_PRE_RESET                     {Start address for 6502 program}
 | 
						|
[ret]                           {Jump to Main (the brackets avoid the
 | 
						|
                                 automatic vLR patch by compilegcl.py)}
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|                                                                       |
 | 
						|
|       Mastermind                                                      |
 | 
						|
|                                                                       |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
*=$300
 | 
						|
 | 
						|
{
 | 
						|
        WRITTEN BY STEVE WOZNIAK
 | 
						|
        PUBLISHED IN DOCTOR DOBBS JOURNAL SEPT 1976
 | 
						|
 | 
						|
        """MASTERMIND is a number guessing game. In this version the computer
 | 
						|
        generates a 5-digit, random number where the digits are limited to
 | 
						|
        0 through 7. The user attemtps to guess the number in the fewest
 | 
						|
        possible tries. After each guess the computer informs the user as
 | 
						|
        to how many digits were correct (contained in the random number)
 | 
						|
        and in the correct position by printing `+' signs, and how many
 | 
						|
        digits are correct and in the wrong position with `-' signs. The
 | 
						|
        user is not informed as to exactly which digit positions the `+'
 | 
						|
        and the `-' signs correspond. A skilled player can usually win in
 | 
						|
        6 or 7 tries."""
 | 
						|
 | 
						|
        https://www.applefritter.com/files/Apple1WozDrDobbsMastermind.pdf
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
_TRIES=$E2      {[Gigatron] Was: $F2}
 | 
						|
_RNDL=$E3       {[Gigatron] Was: $F3}
 | 
						|
_RNDH=$E4       {[Gigatron] Was: $F4}
 | 
						|
_RND2L=$E5      {[Gigatron] Was: $F5}
 | 
						|
_N=$E6          {[Gigatron] Was: $F6}
 | 
						|
_N_minus1=$E5
 | 
						|
_N_plus5=$EB
 | 
						|
_GUESS=$EB      {[Gigatron] Was: $FB}
 | 
						|
_GUESS_plus4=$EF
 | 
						|
_GUESS_plus5=$F0
 | 
						|
 | 
						|
_MSTMIND=*      #_LDXIM_        #$24            {[Gigatron] Include help}
 | 
						|
_MSGLP=*        #_LDAAX_        ##_MSG_minus1
 | 
						|
                #_JSR_          ##_ECHO         {PRINT 'READY?'}
 | 
						|
                #_DEX_
 | 
						|
                #_BNE_          #@_MSGLP
 | 
						|
                #_STXZ_         #_TRIES         {SET TRIES TO ZERO.}
 | 
						|
_RNDLP=*        #_INCZ_         #_RNDL
 | 
						|
                #_BNE_          #@_RND2         {FORM 2-BYTE RANDOM NUMBER}
 | 
						|
                #_INCZ_         #_RNDH          {UNTIL KET DOWN.}
 | 
						|
_RND2=*         #_LDA_          ##_KBDCR
 | 
						|
                #_BPL_          #@_RNDLP
 | 
						|
                #_JSR_          ##_CHARIN       {CLEAR STROBE.}
 | 
						|
_NXTRY=*      { #_SEC_                        }
 | 
						|
              { #_SED_                        }
 | 
						|
              { #_TXA_                        }
 | 
						|
              { #_ADCZ_         #_TRIES       } {ADD 1 TO TRIES IN DECIMAL MODE}
 | 
						|
              { #_STAZ_         #_TRIES       }
 | 
						|
              { #_CLD_                        }
 | 
						|
              { vvvvvvvvvvvvvvvvvvvvvvvvvvvvv BCD increment without SED by Michael T. Barry }
 | 
						|
                #_INCZ_         #_TRIES
 | 
						|
                #_LDAZ_         #_TRIES
 | 
						|
                #_ANDIM_        #$F
 | 
						|
                #_CMPIM_        #10
 | 
						|
                #_BCS_          #@_NXTRY
 | 
						|
              { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ }
 | 
						|
_NXTLIN=*       #_JSR_          ##_CRLF
 | 
						|
                #_LDAZ_         #_TRIES         {OUTPUT CRLF AND TRIES (IN BCD)}
 | 
						|
                #_JSR_          ##_PRBYTE
 | 
						|
                #_LDAIM_        #$A0            {OUTPUT BLANK.}
 | 
						|
                #_TAY_
 | 
						|
                #_JSR_          ##_ECHO
 | 
						|
                #_LDAZ_         #_RNDL
 | 
						|
                #_STAZ_         #_RND2L
 | 
						|
                #_LDAZ_         #_RNDH
 | 
						|
                #_LDXIM_        #$5             {SET ARRAY N TO 5 DIGITS OF}
 | 
						|
_DIGEN=*        #_STYZX_        #_N_minus1      {RANDOM NUMBER.  DIGITS ARE}
 | 
						|
                #_LDYIM_        #$3             {0 THROUGH 7.}
 | 
						|
_BITGEN=*       #_LSRA_
 | 
						|
                #_ROLZ_         #_RND2L
 | 
						|
                #_ROLZX_        #_N_minus1
 | 
						|
                #_DEY_
 | 
						|
                #_BNE_          #@_BITGEN
 | 
						|
                #_DEX_
 | 
						|
                #_BNE_          #@_DIGEN
 | 
						|
_RDKEY=*        #_JSR_          ##_CHARIN
 | 
						|
                #_JSR_          ##_ECHO
 | 
						|
                #_EORIM_        #$B0            {CONVERTS DIGITS TO TRUE VALUE.}
 | 
						|
                #_CMPIM_        #$8             {IF NOT 0 TO 7 THEN REPEAT LINE}
 | 
						|
                #_BCS_          #@_NXTLIN       {WITH SAME TRIES VALUE.}
 | 
						|
                #_STAZX_        #_GUESS_plus4   {SAVE USER DIGIT.}
 | 
						|
                #_DEX_
 | 
						|
                #_CPXIM_        #$FB            {DONE 5 DIGITS?}
 | 
						|
                #_BNE_          #@_RDKEY
 | 
						|
                #_LDYIM_        #$FB            {WIN COUNT (FOR 5 MATCHES).}
 | 
						|
                #_LDAIM_        #$A0            {PRINT BLANK.}
 | 
						|
_PLUS1=*        #_JSR_          ##_ECHO
 | 
						|
_PLUS2=*        #_LDAZX_        #_GUESS_plus5   {DOES GUESS MATCH RANDOM NUMBER}
 | 
						|
                #_CMPZX_        #_N_plus5       {FOR THIS DIGIT POSITION?}
 | 
						|
                #_BNE_          #@_PLUS3        {NO, TRY NEXT POSITION}
 | 
						|
                #_STYZX_        #_N_plus5       {SET DIG OF RAND NUMBER TO $FB}
 | 
						|
                #_LDAIM_        #$AB            {-$FF SO NO 'MINUS' MATCH.}
 | 
						|
                #_STAZX_        #_GUESS_plus5   {SET DIG OF GUESS TO $AB SO}
 | 
						|
                #_INY_                          {*  NO 'MINUS' MATCH.}
 | 
						|
                #_BNE_          #@_PLUS1        {INCR. WIN COUNTER AND LOOP.}
 | 
						|
                #_LDXIM_        #$2D            {IF WIN, OUTPUT WIN MESSAGE [Gigatron] Include help}
 | 
						|
                #_BNE_          #@_MSGLP        {*  AND BEGIN NEW GAME.}
 | 
						|
_PLUS3=*        #_INX_                          {*  NEXT DIGIT OF 'PLUS' SCAN.}
 | 
						|
                #_BNE_          #@_PLUS2
 | 
						|
                #_LDYIM_        #$FB
 | 
						|
_MINUS1=*       #_LDXZY_        #_GUESS_plus5   {GET DIGIT OF USER GUESS.}
 | 
						|
                #_TXA_
 | 
						|
                #_LDXIM_        #$FB
 | 
						|
_MINUS2=*       #_CMPZX_        #_N_plus5       {COMP TO DIGIT OF RAND NUMBER.}
 | 
						|
                #_BNE_          #@_MINUS3       {NO MATCH.}
 | 
						|
                #_STYZX_        #_N_plus5       {SET RAND DIGIT TO $FB-$FF}
 | 
						|
                #_LDAIM_        #$AD            {SUBSTITUTE $AD FOR GUESS DIGIT}
 | 
						|
                #_JSR_          ##_ECHO
 | 
						|
_MINUS3=*       #_INX_                          {* NEXT RANDOM DIGIT.}
 | 
						|
                #_BNE_          #@_MINUS2       {*    LOOP.}
 | 
						|
                #_INY_                          {* NEXT USER DIGIT.}
 | 
						|
                #_BNE_          #@_MINUS1       {     LOOP.}
 | 
						|
                #_BEQ_
 | 
						|
_MSG_minus1=*
 | 
						|
                                #@_NXTRY        {UPDATE TRIES FOR NEXT LINE.}
 | 
						|
_MSG=*          #$BF                            {'?'}
 | 
						|
                #$D9                            {'Y'}
 | 
						|
                #$C4                            {'D'}
 | 
						|
                #$C1                            {'A'}
 | 
						|
                #$C5                            {'E'}
 | 
						|
                #$D2                            {'R'}
 | 
						|
                #$8D                            {CR.}
 | 
						|
                #$8D                            {CR.}
 | 
						|
                #$B7 #$AD #$B0 #$A0 #$CD #$CF   {'GUESS FIVE DIGITS FROM 0-7'}
 | 
						|
                #$D2 #$C6 #$A0 #$D3 #$D4 #$C9
 | 
						|
                #$C7 #$C9 #$C4 #$A0 #$C5 #$D6
 | 
						|
                #$C9 #$C6 #$A0 #$D3 #$D3 #$C5
 | 
						|
                #$D5 #$C7
 | 
						|
                #$8D                            {CR.}
 | 
						|
                #$8D                            {CR.}
 | 
						|
                #$CE                            {'N'}
 | 
						|
                #$C9                            {'I'}
 | 
						|
                #$D7                            {'W'}
 | 
						|
                #$A0                            {BLANK}
 | 
						|
                #$D5                            {'U'}
 | 
						|
                #$CF                            {'O'}
 | 
						|
                #$D9                            {'Y'}
 | 
						|
                #$A0                            {BLANK}
 | 
						|
                #$AB                            {'+'}
 | 
						|
_CRLF=*         #_LDAIM_        #$8D
 | 
						|
                #_JMP_          ##_ECHO
 | 
						|
_CHARIN=*       #_LDA_          ##_KBDCR        {WAIT FOR STROBE}
 | 
						|
                #_BPL_          #@_CHARIN
 | 
						|
                #_LDA_          ##_KBD          {READ KEY AND CLEAR STROBE.}
 | 
						|
                #_RTS_
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|                                                                       |
 | 
						|
|       15-Puzzle by Jeff Jetton                                        |
 | 
						|
|                                                                       |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 | 
						|
{ v v v v v v v v v v v v   Insert 15-PUZZLE image here   v v v v v v v v v v v v }
 | 
						|
{ Generated by: cd 15puz && ./make.sh }
 | 
						|
 | 
						|
 | 
						|
*=$400
 | 
						|
 #$d8 #$a2 #$ff #$9a #$a9 #$2a #$85 #$5a #$20 #$55 #$05 #$a9 #$8b #$85 #$58 #$a9
 | 
						|
 #$06 #$85 #$59 #$20 #$ad #$04 #$20 #$cb #$04 #$d0 #$0e #$a9 #$be #$85 #$58 #$a9
 | 
						|
 #$06 #$85 #$59 #$20 #$ad #$04 #$20 #$e8 #$04 #$20 #$1f #$06 #$20 #$6a #$05 #$20
 | 
						|
 #$e8 #$04 #$20 #$a8 #$04 #$20 #$09 #$05 #$20 #$27 #$05 #$20 #$bb #$04 #$c9 #$51
 | 
						|
 #$d0 #$03 #$4c #$9a #$04 #$20 #$9e #$05 #$a5 #$51 #$c9 #$10 #$d0 #$0a #$c6 #$5d
 | 
						|
 #$f0 #$b6 #$20 #$38 #$05 #$4c #$3b #$04 #$20 #$e8 #$04 #$20 #$a8 #$04 #$20 #$0c
 | 
						|
 #$06 #$f0 #$03 #$4c #$35 #$04 #$20 #$43 #$05 #$a9 #$8e #$85 #$58 #$a9 #$07 #$85
 | 
						|
 #$59 #$20 #$ad #$04 #$a5 #$55 #$20 #$ef #$ff #$a9 #$a3 #$85 #$58 #$a9 #$07 #$85
 | 
						|
 #$59 #$20 #$ad #$04 #$20 #$27 #$05 #$a9 #$bb #$85 #$58 #$a9 #$07 #$85 #$59 #$20
 | 
						|
 #$ad #$04 #$20 #$cb #$04 #$d0 #$03 #$4c #$29 #$04 #$a9 #$d0 #$85 #$58 #$a9 #$07
 | 
						|
 #$85 #$59 #$20 #$ad #$04 #$4c #$00 #$c1 #$a9 #$0d #$4c #$ef #$ff #$a0 #$00 #$b1
 | 
						|
 #$58 #$f0 #$07 #$20 #$ef #$ff #$c8 #$4c #$af #$04 #$60 #$20 #$de #$04 #$ad #$11
 | 
						|
 #$d0 #$10 #$f8 #$ad #$10 #$d0 #$29 #$7f #$4c #$ef #$ff #$20 #$bb #$04 #$c9 #$4e
 | 
						|
 #$f0 #$0a #$c9 #$59 #$f0 #$07 #$20 #$38 #$05 #$4c #$cb #$04 #$ba #$60 #$a5 #$5a
 | 
						|
 #$0a #$90 #$02 #$49 #$a9 #$85 #$5a #$60 #$20 #$a8 #$04 #$20 #$a8 #$04 #$a2 #$00
 | 
						|
 #$a0 #$04 #$b5 #$40 #$20 #$ef #$ff #$88 #$d0 #$05 #$a0 #$04 #$20 #$a8 #$04 #$e8
 | 
						|
 | 
						|
*=$500
 | 
						|
 #$e0 #$10 #$d0 #$ee #$a9 #$08 #$85 #$5d #$60 #$e6 #$56 #$a5 #$56 #$29 #$0f #$c9
 | 
						|
 #$0a #$b0 #$f6 #$a5 #$56 #$38 #$e9 #$a0 #$90 #$0c #$85 #$56 #$e6 #$57 #$a5 #$57
 | 
						|
 #$29 #$0f #$c9 #$0a #$b0 #$f6 #$60 #$a5 #$57 #$f0 #$03 #$20 #$dc #$ff #$a5 #$56
 | 
						|
 #$20 #$dc #$ff #$a9 #$20 #$4c #$ef #$ff #$a9 #$7a #$85 #$58 #$a9 #$07 #$85 #$59
 | 
						|
 #$4c #$ad #$04 #$a5 #$5a #$29 #$38 #$aa #$bd #$49 #$06 #$f0 #$07 #$20 #$ef #$ff
 | 
						|
 #$e8 #$4c #$48 #$05 #$60 #$a9 #$20 #$85 #$4f #$a9 #$0f #$85 #$52 #$a2 #$0f #$a0
 | 
						|
 #$4f #$98 #$9d #$3f #$00 #$88 #$ca #$d0 #$f8 #$60 #$a9 #$00 #$85 #$56 #$85 #$57
 | 
						|
 #$85 #$5c #$a6 #$55 #$bd #$13 #$06 #$85 #$5b #$20 #$de #$04 #$a5 #$5a #$29 #$0f
 | 
						|
 #$18 #$69 #$41 #$c5 #$5c #$f0 #$f2 #$20 #$9e #$05 #$a5 #$51 #$c9 #$10 #$f0 #$e9
 | 
						|
 #$a5 #$50 #$85 #$5c #$c6 #$5b #$d0 #$e1 #$20 #$0c #$06 #$f0 #$cd #$60 #$85 #$50
 | 
						|
 #$c9 #$20 #$f0 #$3c #$a2 #$00 #$b5 #$40 #$c5 #$50 #$f0 #$08 #$e8 #$e0 #$10 #$d0
 | 
						|
 #$f5 #$4c #$e0 #$05 #$86 #$51 #$8a #$29 #$0c #$85 #$53 #$a5 #$52 #$29 #$0c #$c5
 | 
						|
 #$53 #$d0 #$10 #$8a #$38 #$e5 #$52 #$10 #$05 #$a9 #$ff #$4c #$f2 #$05 #$a9 #$01
 | 
						|
 #$4c #$f2 #$05 #$8a #$29 #$03 #$85 #$53 #$a5 #$52 #$29 #$03 #$c5 #$53 #$f0 #$05
 | 
						|
 #$a2 #$10 #$86 #$51 #$60 #$8a #$38 #$e5 #$52 #$10 #$05 #$a9 #$fc #$4c #$f2 #$05
 | 
						|
 #$a9 #$04 #$85 #$54 #$a5 #$52 #$aa #$18 #$65 #$54 #$a8 #$b9 #$40 #$00 #$95 #$40
 | 
						|
 | 
						|
*=$600
 | 
						|
 #$a9 #$20 #$99 #$40 #$00 #$84 #$52 #$c4 #$51 #$d0 #$e9 #$60 #$a2 #$0f #$a9 #$4f
 | 
						|
 #$85 #$53 #$bd #$3f #$00 #$c5 #$53 #$d0 #$05 #$c6 #$53 #$ca #$d0 #$f4 #$60 #$a9
 | 
						|
 #$60 #$85 #$58 #$a9 #$07 #$85 #$59 #$20 #$ad #$04 #$20 #$bb #$04 #$85 #$55 #$c9
 | 
						|
 #$31 #$10 #$03 #$4c #$3e #$06 #$a9 #$35 #$38 #$e5 #$55 #$30 #$01 #$60 #$20 #$38
 | 
						|
 #$05 #$4c #$2a #$06 #$03 #$09 #$13 #$23 #$ff #$48 #$4f #$4f #$52 #$41 #$59 #$21
 | 
						|
 #$00 #$48 #$55 #$5a #$5a #$41 #$48 #$21 #$00 #$57 #$4f #$4f #$48 #$4f #$4f #$21
 | 
						|
 #$00 #$59 #$49 #$50 #$50 #$49 #$45 #$21 #$00 #$53 #$57 #$45 #$45 #$54 #$21 #$00
 | 
						|
 #$00 #$43 #$4f #$4f #$4c #$21 #$00 #$00 #$00 #$4e #$49 #$43 #$45 #$21 #$00 #$00
 | 
						|
 #$00 #$47 #$41 #$44 #$5a #$4f #$4f #$4b #$53 #$21 #$00 #$0d #$0d #$31 #$35 #$20
 | 
						|
 #$50 #$55 #$5a #$5a #$4c #$45 #$20 #$2d #$20 #$42 #$59 #$20 #$4a #$45 #$46 #$46
 | 
						|
 #$20 #$4a #$45 #$54 #$54 #$4f #$4e #$0d #$0d #$49 #$4e #$53 #$54 #$52 #$55 #$43
 | 
						|
 #$54 #$49 #$4f #$4e #$53 #$20 #$28 #$59 #$2f #$4e #$29 #$3f #$20 #$00 #$0d #$0d
 | 
						|
 #$54 #$59 #$50 #$45 #$20 #$41 #$20 #$4c #$45 #$54 #$54 #$45 #$52 #$20 #$4f #$4e
 | 
						|
 #$20 #$54 #$48 #$45 #$20 #$53 #$41 #$4d #$45 #$0d #$52 #$4f #$57 #$20 #$4f #$52
 | 
						|
 #$20 #$43 #$4f #$4c #$55 #$4d #$4e #$20 #$41 #$53 #$20 #$54 #$48 #$45 #$20 #$45
 | 
						|
 #$4d #$50 #$54 #$59 #$0d #$53 #$50 #$41 #$43 #$45 #$20 #$54 #$4f #$20 #$53 #$4c
 | 
						|
 | 
						|
*=$700
 | 
						|
 #$49 #$44 #$45 #$20 #$54 #$48 #$41 #$54 #$20 #$4c #$45 #$54 #$54 #$45 #$52 #$0d
 | 
						|
 #$28 #$41 #$4e #$44 #$20 #$41 #$4e #$59 #$20 #$42 #$45 #$54 #$57 #$45 #$45 #$4e
 | 
						|
 #$29 #$20 #$54 #$4f #$57 #$41 #$52 #$44 #$53 #$0d #$54 #$48 #$45 #$20 #$53 #$50
 | 
						|
 #$41 #$43 #$45 #$2e #$20 #$54 #$59 #$50 #$45 #$20 #$51 #$20 #$54 #$4f #$20 #$51
 | 
						|
 #$55 #$49 #$54 #$2e #$0d #$54 #$48 #$49 #$53 #$20 #$49 #$53 #$20 #$54 #$48 #$45
 | 
						|
 #$20 #$53 #$4f #$4c #$56 #$45 #$44 #$20 #$50 #$55 #$5a #$5a #$4c #$45 #$3a #$00
 | 
						|
 #$0d #$44 #$49 #$46 #$46 #$49 #$43 #$55 #$4c #$54 #$59 #$20 #$4c #$45 #$56 #$45
 | 
						|
 #$4c #$20 #$28 #$31 #$2d #$35 #$29 #$3f #$20 #$00 #$0d #$53 #$4f #$52 #$52 #$59
 | 
						|
 #$2e #$20 #$54 #$52 #$59 #$20 #$41 #$47 #$41 #$49 #$4e #$3a #$20 #$00 #$20 #$59
 | 
						|
 #$4f #$55 #$20 #$53 #$4f #$4c #$56 #$45 #$44 #$0d #$41 #$20 #$4c #$45 #$56 #$45
 | 
						|
 #$4c #$20 #$00 #$20 #$50 #$55 #$5a #$5a #$4c #$45 #$21 #$0d #$0d #$54 #$4f #$54
 | 
						|
 #$41 #$4c #$20 #$4d #$4f #$56 #$45 #$53 #$3a #$20 #$00 #$0d #$0d #$50 #$4c #$41
 | 
						|
 #$59 #$20 #$41 #$47 #$41 #$49 #$4e #$20 #$28 #$59 #$2f #$4e #$29 #$3f #$20 #$00
 | 
						|
 #$0d #$0d #$42 #$59 #$45 #$21 #$0d #$00
 | 
						|
{ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^   Insert 15-PUZZLE image here   ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ }
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|                                                                       |
 | 
						|
|       Mini-assembler (and disassembler)                               |
 | 
						|
|                                                                       |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
*=$be5
 | 
						|
 | 
						|
_USAGE1=*       #_JSR_          ##_ECHO
 | 
						|
                #_INX_
 | 
						|
_USAGE=*        #_LDAAX_        ##_USAGE2       { WozMon has X=0 on G }
 | 
						|
                #_BNE_          #@_USAGE1
 | 
						|
{$0BEE}         #_JMP_          ##_CMDLINE      { BEER. Courtesy Jac Goudsmit }
 | 
						|
 | 
						|
_USAGE2=*                                  #$0D
 | 
						|
                `USAGE:                    #$0D
 | 
						|
                ``!800:P
 | 
						|
*=$c00                 `HA````ASSEMBLE`1ST  #$0D
 | 
						|
                ``!`LDA`#1````ASSEMBLE`NEXT #$0D
 | 
						|
                ``!800L```````DISASSEMBLE   #$0D
 | 
						|
                ``!L``````````NEXT`SCREEN   #$0D
 | 
						|
                ``!(RETURN)```EXIT          #$0D
 | 
						|
                ``BEER````````SKIP`USAGE    #0
 | 
						|
 | 
						|
{
 | 
						|
        WRITTEN BY STEVE WOZNIAK & ALLEN BAUM
 | 
						|
        AND PUBLISHED IN DOCTOR DOBBS JOURNAL
 | 
						|
        SEPT 1976
 | 
						|
 | 
						|
        ;======================================
 | 
						|
        ;    ** ENHANCED WOZMON EXTENSION **
 | 
						|
        ;    MINI-ASSEMBLER AND DISASSEMBLER
 | 
						|
        ;       FOR THE APPLE 1 COMPUTER
 | 
						|
        ;  BASED ON THE CODE OF STEVE WOZNIAK
 | 
						|
        ;       AND ALLEN BAUM, 1976/1977
 | 
						|
        ; MANUALLY AND LOVINGLY ADAPTED BY THE
 | 
						|
        ;    HAND OF MICHAEL T. BARRY, 2020
 | 
						|
        ;    MODIFICATIONS MADE IN 2020 ARE
 | 
						|
        ;     FREE TO USE WITH ATTRIBUTION
 | 
						|
        ;        <<< 6502 FOREVER!! >>>
 | 
						|
        ;======================================
 | 
						|
 | 
						|
        Merged and transcribed both sources to the
 | 
						|
        Apple-1 emulator for Gigatron v6502 by
 | 
						|
        Marcel van Kervinck 2019/2020
 | 
						|
}
 | 
						|
 | 
						|
                *=$c8a
 | 
						|
 | 
						|
_FORMAT=$40
 | 
						|
_LENGTH=$41
 | 
						|
_LMNEM=$42
 | 
						|
_RMNEM=$43
 | 
						|
_PCL=$44
 | 
						|
_PCH=$45
 | 
						|
_A1L=$46
 | 
						|
_A1H=$47
 | 
						|
_A2L=$48
 | 
						|
_A2H=$49
 | 
						|
_A4L=$4a
 | 
						|
_A4H=$4b
 | 
						|
_FMT=$4c
 | 
						|
 | 
						|
_LIST=*         #_LDAIM_        #12 {was 20}    {DISASSEM 20 INSTR}
 | 
						|
_LIST1=*        #_PHA_                          {STACK LOOP COUNTER}
 | 
						|
                #_JSR_          ##_INSTDSP      {DISASSEM ONE INSTR}
 | 
						|
                #_JSR_          ##_PCADJ        {UPDATE VIRTUAL PC}
 | 
						|
                #_STAZ_         #_PCL
 | 
						|
                #_STYZ_         #_PCH
 | 
						|
                #_PLA_                          {UPDATE LOOP COUNTER}
 | 
						|
                #_SEC_
 | 
						|
                #_SBCIM_        #1
 | 
						|
                #_BNE_          #@_LIST1        {LOOP FOR 20 INSTRS}
 | 
						|
 | 
						|
_CMDLINE=*      #_JSR_          ##_GETLNZ       {INPUT A FRESH LINE}
 | 
						|
                #_TXA_                          {NULL INPUT?}
 | 
						|
                #_BNE_          #@_CMDLIN2
 | 
						|
                #_JMP_          ##_GETLINE      {YES: BACK TO WOZMON}
 | 
						|
_CMDLIN2=*      #_LDYIM_        #0              {START AT 1ST CHAR}
 | 
						|
                #_JSR_          ##_GETNUM       {PARSE OPTIONAL ADDR}
 | 
						|
                #_PHA_
 | 
						|
                #_TXA_                          {EMPTY ADDR FIELD?}
 | 
						|
                #_BEQ_          #@_CMDLIN3      {YES: USE DEFAULT PC}
 | 
						|
_A1PCLP=*       #_LDAZX_        #_A1L           {ASSUMES X=1}
 | 
						|
                #_STAZX_        #_PCL           {COPY FROM A1 TO PC}
 | 
						|
                #_DEX_
 | 
						|
                #_BPL_          #@_A1PCLP
 | 
						|
_CMDLIN3=*      #_PLA_
 | 
						|
                #_CMPIM_        #$05            {'L' COMMAND?}
 | 
						|
                #_BEQ_          #@_LIST         {YES: DISASSEMBLE}
 | 
						|
                #_CMPIM_        #$99            {' ' COMMAND?}
 | 
						|
                #_BEQ_          #@_ASSEM        {YES: ASM AT CURR PC}
 | 
						|
                #_CMPIM_        #$93            {':' COMMAND?}
 | 
						|
                #_BNE_          #@_FORM8A       {NO: ERROR}
 | 
						|
_ASSEM=*        #_LDAIM_        #3              {# OF CHARS IN MNEM}
 | 
						|
                #_STAZ_         #_A1H
 | 
						|
_NXTMN=*        #_JSR_          ##_GETNSP       {GET A MNEM CHAR}
 | 
						|
_NXTM=*         #_ASLA_
 | 
						|
                #_SBCIM_        #$BE            {SUBTRACT OFFSET}
 | 
						|
                #_CMPZ_         #$C2            {LEGAL CHAR?}
 | 
						|
                #_BCC_          #@_FORM8A       {NO}
 | 
						|
                #_ASLA_                         {COMPRESS/LT-JUSTIFY}
 | 
						|
                #_ASLA_
 | 
						|
                #_LDXIM_        #4
 | 
						|
_NXTM2=*        #_ASLA_                         {DO 5 24-BIT SHIFTS}
 | 
						|
                #_ROLZ_         #_A4L
 | 
						|
                #_ROLZ_         #_A4H
 | 
						|
                #_DEX_
 | 
						|
                #_BPL_          #@_NXTM2
 | 
						|
                #_DECZ_         #_A1H           {DONE WITH 3 CHARS?}
 | 
						|
                #_BEQ_          #@_NXTM2        {YES: ONE LAST SHIFT}
 | 
						|
                #_BPL_          #@_NXTMN        {NO}
 | 
						|
_FORM1=*        #_LDXIM_        #5              {5 CHARS IN ADR MODE}
 | 
						|
_FORM2=*        #_JSR_          ##_GETNSP       {GET 1ST CHR OF ADDR}
 | 
						|
                #_STYZ_         #_YSAV
 | 
						|
                #_CMPAX_        ##_CHAR1        {1ST CHR MATCH PATT?}
 | 
						|
                #_BNE_          #@_FORM3        {NO}
 | 
						|
                #_JSR_          ##_GETNSP       {YES: GET 2ND CHAR}
 | 
						|
                #_CMPAX_        ##_CHAR2        {MATCHES 2ND HALF?}
 | 
						|
                #_BEQ_          #@_FORM5        {YES}
 | 
						|
                #_LDAAX_        ##_CHAR2        {NO: IS 2ND HALF 0?}
 | 
						|
                #_BEQ_          #@_FORM4        {YES}
 | 
						|
                #_CMPIM_        #$A4            {NO: 2ND HALF OPT?}
 | 
						|
                #_BEQ_          #@_FORM4        {YES}
 | 
						|
*=$d00
 | 
						|
                #_LDYZ_         #_YSAV
 | 
						|
_FORM3=*        #_CLC_                          {CLEAR BIT-NO MATCH}
 | 
						|
_FORM4=*        #_DEY_                          {BACK UP 1 CHAR}
 | 
						|
_FORM5=*        #_ROLZ_         #_FMT           {FORM FORMAT BYTE}
 | 
						|
                #_CPXIM_        #3              {TIME TO CHECK ADDR?}
 | 
						|
                #_BNE_          #@_FORM7        {NO}
 | 
						|
                #_JSR_          ##_GETNUM       {YES: PARSE IT}
 | 
						|
                #_LDAZ_         #_A2H
 | 
						|
                #_BEQ_          #@_FORM6        {HIGH-ORDER BYTE 0?}
 | 
						|
                #_INX_                          {NO: INCR FOR 2-BYTE}
 | 
						|
_FORM6=*        #_STXZ_         #_L             {STORE LENGTH}
 | 
						|
                #_LDXIM_        #3              {RELOAD FMT INDEX}
 | 
						|
                #_DEY_                          {BACK UP 1 CHAR}
 | 
						|
_FORM7=*        #_STXZ_         #_A1H           {SAVE INDEX}
 | 
						|
                #_DEX_                          {DONE W/FMT CHECK?}
 | 
						|
                #_BPL_          #@_FORM2        {NO}
 | 
						|
                #_LDAZ_         #_FMT           {YES: PUT LENGTH}
 | 
						|
                #_ASLA_                         {IN LOW BITS}
 | 
						|
                #_ASLA_
 | 
						|
                #_ORAZ_         #_L
 | 
						|
                #_CMPIM_        #$20
 | 
						|
                #_BCS_          #@_FORM8
 | 
						|
                #_LDXZ_         #_L
 | 
						|
                #_BEQ_          #@_FORM8
 | 
						|
                #_ORAIM_        #$80
 | 
						|
_FORM8=*        #_STAZ_         #_FMT
 | 
						|
                #_STYZ_         #_YSAV
 | 
						|
                #_LDAAY_        ##_IN           {GET NEXT NONBLANK}
 | 
						|
                #_CMPIM_        #$BB {";"}      {START OF COMMENT?}
 | 
						|
                #_BEQ_          #@_TRYNEXT      {YES}
 | 
						|
                #_CMPIM_        #$8D            {CR?}
 | 
						|
_FORM8A=*       #_BNE_          #@_ERR2         {NO: ERROR}
 | 
						|
_TRYNEXT=*      #_LDAZ_         #_A1H           {GET TRIAL OPCODE}
 | 
						|
                #_JSR_          ##_INSDS2       {GET FMT+LEN FOR IT}
 | 
						|
                #_TAX_
 | 
						|
                #_LDAAX_        ##_MNEMR        {GET LOWER MNEM BYTE}
 | 
						|
                #_CMPZ_         #_A4L           {MATCH?}
 | 
						|
                #_BNE_          #@_NEXTOP       {NO: TRY NEXT OPCODE}
 | 
						|
                #_LDAAX_        ##_MNEML        {GET UPPER MNEM BYTE}
 | 
						|
                #_CMPZ_         #_A4H           {MATCH?}
 | 
						|
                #_BNE_          #@_NEXTOP       {NO: TRY NEXT OPCODE}
 | 
						|
                #_LDAZ_         #_FMT
 | 
						|
                #_LDYZ_         #_FORMAT        {GET TRIAL FORMAT}
 | 
						|
                #_CPYIM_        #$9D            {IS IT RELATIVE?}
 | 
						|
                #_BEQ_          #@_REL          {YES}
 | 
						|
                #_CMPZ_         #_FORMAT        {SAME FORMAT?}
 | 
						|
                #_BEQ_          #@_FINDOP       {YES}
 | 
						|
_NEXTOP=*       #_DECZ_         #_A1H           {NO: TRY NEXT OPCODE}
 | 
						|
                #_BNE_          #@_TRYNEXT
 | 
						|
                #_INCZ_         #_FMT           {NO MORE: TRY LEN=2}
 | 
						|
                #_DECZ_         #_L             {WAS L=2 ALREADY?}
 | 
						|
                #_BEQ_          #@_TRYNEXT      {NO: KEEP TRYING}
 | 
						|
_ERR1=*         #_LDYZ_         #_YSAV          {YES: UNREC. INST}
 | 
						|
_ERR2=*         #_TYA_
 | 
						|
                #_TAX_
 | 
						|
                #_JSR_          ##_CROUT
 | 
						|
                #_JSR_          ##_PRBL2        {PRINT '^' BELOW THE}
 | 
						|
                #_LDAIM_        #$DE {"^"}      {  LAST PARSED CHAR}
 | 
						|
                #_JSR_          ##_ECHO         {  TO SHOW ERR POSN}
 | 
						|
                #_JMP_          ##_CMDLINE      {NEXT COMMAND LINE}
 | 
						|
 | 
						|
_REL=*          #_SBCIM_        #$81            {YES: IS FMT COMPAT}
 | 
						|
                #_LSRA_                         {  W/RELATIVE MODE?}
 | 
						|
                #_BNE_          #@_ERR1         {NO: ERROR OUT}
 | 
						|
                #_LDYZ_         #_A2H
 | 
						|
                #_LDXZ_         #_A2L           {DOUBLE DECREMENT}
 | 
						|
                #_BNE_          #@_REL2
 | 
						|
                #_DEY_
 | 
						|
_REL2=*         #_DEX_
 | 
						|
                #_TXA_
 | 
						|
                #_CLC_
 | 
						|
                #_SBCZ_         #_PCL           {CALC ADDR-PC-2}
 | 
						|
                #_STAZ_         #_A2L
 | 
						|
                #_BPL_          #@_REL3
 | 
						|
                #_INY_
 | 
						|
_REL3=*         #_TYA_
 | 
						|
                #_SBCZ_         #_PCH
 | 
						|
                #_BNE_          #@_ERR          {ERROR IF TOO FAR}
 | 
						|
_FINDOP=*       #_LDYZ_         #_LENGTH
 | 
						|
_FNDOP2=*       #_LDAAY_        ##_A1H          {MOVE INST TO (PC)}
 | 
						|
                #_STAIY_        #_PCL
 | 
						|
                #_DEY_
 | 
						|
                #_BPL_          #@_FNDOP2
 | 
						|
                #_LDAIM_        #1              {DISASSEMBLE RESULT}
 | 
						|
                #_JMP_          ##_LIST1        {BACK TO CMD LINE}
 | 
						|
 | 
						|
_INSDS1=*       #_LDXZ_         #_PCL           {PRINT PCL,H}
 | 
						|
                #_LDYZ_         #_PCH
 | 
						|
                #_JSR_          ##_CROUT
 | 
						|
                #_JSR_          ##_PRNTYX
 | 
						|
                #_LDYIM_        #0
 | 
						|
                #_LDAIM_        #$AD {"-"}      {PRINT '-'}
 | 
						|
                #_JSR_          ##_ECHO
 | 
						|
                #_JSR_          ##_PRBLNK       {PRINT 3 BLANKS}
 | 
						|
                #_LDAIX_        #_PCL           {GET OPCODE}
 | 
						|
_INSDS2=*       #_TAY_
 | 
						|
                #_LSRA_                         {EVEN/ODD TEST}
 | 
						|
                #_BCC_          #@_IEVEN
 | 
						|
                #_LSRA_                         {* TEST BIT 1}
 | 
						|
                #_BCS_          #@_ERR          {*  XXXXXX11 INSTR. INVALID.}
 | 
						|
                #_CMPIM_        #$22
 | 
						|
                #_BEQ_          #@_ERR          {*  10001001 INSTR. INVALID.}
 | 
						|
                #_ANDIM_        #$7             {MASK 3 BITS FOR ADDRESS MODE &}
 | 
						|
                #_ORAIM_        #$80            {*  ADD INDEXING OFFSET.}
 | 
						|
_IEVEN=*        #_LSRA_                         {* LSB INTO CARRY FOR}
 | 
						|
                #_TAX_                          {* LEFT/RIGHT TEST BELOW.}
 | 
						|
                #_LDAAX_        ##_MODE1        {INDEX INTO ADDRESS MODE TABLE.}
 | 
						|
                #_BCS_          #@_RTMODE       {IF CARRY SET USE LSD FOR}
 | 
						|
                #_LSRA_                         {* PRINT FORMAT INDEX}
 | 
						|
                #_LSRA_
 | 
						|
                #_LSRA_                         {* IF CARRY CLEAR USE MSD.}
 | 
						|
                #_LSRA_
 | 
						|
_RTMODE=*       #_ANDIM_        #$F             {MASK FOR 4-BIT INDEX.}
 | 
						|
                #_BNE_          #@_GETFMT       {$0 FOR INVALID OP CODES.}
 | 
						|
_ERR=*          #_LDYIM_        #$80            {SUBSTITUTE $80 FOR INVALID OP,}
 | 
						|
                #_LDAIM_        #$0             {SET PRINT FORMAT INDEX TO 0}
 | 
						|
_GETFMT=*       #_TAX_
 | 
						|
                #_LDAAX_        ##_MODE2        {INDEX INTO PRINT FORMAT TABLE.}
 | 
						|
                #_STAZ_         #_FORMAT        {SAVE FOR ADDRESS FIELD FORMAT.}
 | 
						|
                #_ANDIM_        #$3             {MASK 2-BIT LENGTH. 0=1-BYTE}
 | 
						|
                #_STAZ_         #_LENGTH        {*  1=2-BYTE, 2=3-BYTE.}
 | 
						|
                #_TYA_                          {* OP CODE.}
 | 
						|
                #_ANDIM_        #$8F            {MASK IT FOR 1XXX1010 TEST.}
 | 
						|
                #_TAX_                          {SAVE IT.}
 | 
						|
                #_TYA_                          {* OP CODE TO 'A' AGAIN.}
 | 
						|
                #_LDYIM_        #$3
 | 
						|
                #_CPXIM_        #$8A
 | 
						|
                #_BEQ_          #@_MNNDX3
 | 
						|
_MNNDX1=*       #_LSRA_
 | 
						|
                #_BCC_          #@_MNNDX3       {FORM INDEX INTO MNEMONIC TABLE.}
 | 
						|
                #_LSRA_
 | 
						|
_MNNDX2=*       #_LSRA_                         {* 1XXX1010 -> 00101XXX}
 | 
						|
                #_ORAIM_        #$20            {* XXXYYY01 -> 00111XXX}
 | 
						|
                #_DEY_                          {* XXXYYY10 -> 00110XXX}
 | 
						|
                #_BNE_          #@_MNNDX2       {* XXXYY100 -> 00100XXX}
 | 
						|
                #_INY_                          {* XXXXX000 -> 000XXXXX}
 | 
						|
_MNNDX3=*       #_DEY_
 | 
						|
                #_BNE_          #@_MNNDX1
 | 
						|
                #_RTS_
 | 
						|
 | 
						|
_INSTDSP=*      #_JSR_          ##_INSDS1       {GEN FMT, LEN BYTES}
 | 
						|
*=$e00
 | 
						|
                #_PHA_                          {* SAVE MNEMONIC TABLE INDEX.}
 | 
						|
_PROP=*         #_LDAIY_        #_PCL
 | 
						|
                #_JSR_          ##_PRBYTE
 | 
						|
                #_LDXIM_        #$1
 | 
						|
_PROPBL=*       #_JSR_          ##_PRBL2
 | 
						|
                #_CPYZ_         #_LENGTH        {PRINT INSTR (1 TO 3 BYTES)}
 | 
						|
                #_INY_                          {IN A 12 CHARACTYER FIELD.}
 | 
						|
                #_BCC_          #@_PROP
 | 
						|
                #_LDXIM_        #$3             {CHAR COUNT FOR MNEMONIC PRINT.}
 | 
						|
                #_CPYIM_        #$3
 | 
						|
                #_BCC_          #@_PROPBL
 | 
						|
                #_PLA_                          {RECOVER MNEMONIC INDEX.}
 | 
						|
                #_TAY_
 | 
						|
                #_LDAAY_        ##_MNEML
 | 
						|
                #_STAZ_         #_LMNEM         {FETCH 3-CHAR MNEMONIC}
 | 
						|
                #_LDAAY_        ##_MNEMR        {*  (PACKED IN TWO BYTES)}
 | 
						|
                #_STAZ_         #_RMNEM
 | 
						|
_PRMN1=*        #_LDAIM_        #$0
 | 
						|
                #_LDYIM_        #$5
 | 
						|
_PRMN2=*        #_ASLZ_         #_RMNEM
 | 
						|
                #_ROLZ_         #_LMNEM         {SHIFT 5 BITS OF CHAR INTO 'A'.}
 | 
						|
                #_ROLA_                         {* (CLEAR CARRY)}
 | 
						|
                #_DEY_
 | 
						|
                #_BNE_          #@_PRMN2
 | 
						|
                #_ADCIM_        #$BF            {ADD '?' OFFSET.}
 | 
						|
                #_JSR_          ##_ECHO         {OUTPUT A CHAR OR MNEMONIC}
 | 
						|
                #_DEX_
 | 
						|
                #_BNE_          #@_PRMN1
 | 
						|
                #_JSR_          ##_PRBLNK       {OUTPUT 3 BLANKS.}
 | 
						|
                #_LDXIM_        #$6             {COUNT FOR 6 PRINT FORMAT BITS.}
 | 
						|
_PRADR1=*       #_CPXIM_        #$3
 | 
						|
                #_BNE_          #@_PRADR3       {IF X=3 THEN PRINT ADDRESS VAL.}
 | 
						|
                #_LDYZ_         #_LENGTH
 | 
						|
                #_BEQ_          #@_PRADR3       {NO PRINT IF LENGTH=0.}
 | 
						|
_PRADR2=*       #_LDAZ_         #_FORMAT
 | 
						|
                #_CMPIM_        #$E8            {HANDLE REL ADDRESSING MODE}
 | 
						|
                #_LDAIY_        #_PCL           {SPECIAL (PRINT TARGET ADDR)}
 | 
						|
                #_BCS_          #@_RELADR       {* (NOT DISPLACEMENT)}
 | 
						|
                #_JSR_          ##_PRBYTE       {OUTPUT 1- OR 2- BYTE ADDRESS.}
 | 
						|
                #_DEY_                          {MORE SIGNIFICANT BYTE FIRST.}
 | 
						|
                #_BNE_          #@_PRADR2
 | 
						|
_PRADR3=*       #_ASLZ_         #_FORMAT        {TEST NEXT PRINT FORMAT BIT.}
 | 
						|
                #_BCC_          #@_PRADR4       {IF 0, DONT PRINT}
 | 
						|
                #_LDAAX_        ##_CHAR1_minus1 {CORRESPONDING CHAR.}
 | 
						|
                #_JSR_          ##_ECHO         {OUTPUT 1 OR 2 CHARS.}
 | 
						|
                #_LDAAX_        ##_CHAR2_minus1 {*   (IF CHAR FROM CHAR2 IS 0,}
 | 
						|
                #_BEQ_          #@_PRADR4       {*     DON'T FRINT IT)}
 | 
						|
                #_JSR_          ##_ECHO
 | 
						|
_PRADR4=*       #_DEX_
 | 
						|
                #_BNE_          #@_PRADR1
 | 
						|
                #_RTS_                          {*RETURN IF DONE 6 FORMAT BITS.}
 | 
						|
_RELADR=*       #_JSR_          ##_PCADJ3       {PCL,H + DISPL + 1 TO 'A','Y'.}
 | 
						|
                #_TAX_
 | 
						|
                #_INX_
 | 
						|
                #_BNE_          #@_PRNTYX       {*    +1 TO 'X','Y'.}
 | 
						|
                #_INY_
 | 
						|
_PRNTYX=*       #_TYA_
 | 
						|
                #_JSR_          ##_PRBYTE       {PRINT TARGET ADDRESS OF BRANCH}
 | 
						|
_PRNTX=*        #_TXA_                          {AND RETURN}
 | 
						|
                #_JMP_          ##_PRBYTE
 | 
						|
 | 
						|
_PRBLNK=*       #_LDXIM_        #$1             {BLANK COUNT [Gigatron] Was: #$3}
 | 
						|
_PRBL2=*        #_LDAIM_        #$A0
 | 
						|
_PRBL3=*        #_JSR_          ##_ECHO         {OUTPUT A BLANK}
 | 
						|
                #_DEX_
 | 
						|
                #_BNE_          #@_PRBL2        {LOOP UNTIL COUNT =0}
 | 
						|
                #_RTS_
 | 
						|
 | 
						|
_NOTACR=*       #_CMPIM_        #$9B            {ESC?}
 | 
						|
                #_BEQ_          #@_CANCEL       {YES: START OVER}
 | 
						|
                #_JSR_          ##_ECHO         {PRINT CHAR}
 | 
						|
                #_CMPIM_        #$DF {"_"}
 | 
						|
                #_BEQ_          #@_BCKSPC
 | 
						|
                #_INX_
 | 
						|
                #_BPL_          #@_NXTCHAR      {128 CHARS MAX}
 | 
						|
_CANCEL=*       #_LDAIM_        #$DC {"\"}
 | 
						|
                #_JSR_          ##_ECHO
 | 
						|
_GETLNZ=*       #_JSR_          ##_CROUT        {FRESH LINE}
 | 
						|
                #_LDAIM_        #$A1 {"!"}      {PROMPT CHAR}
 | 
						|
                #_JSR_          ##_ECHO
 | 
						|
                #_LDXIM_        #1
 | 
						|
_BCKSPC=*       #_DEX_
 | 
						|
                #_BMI_          #@_GETLNZ
 | 
						|
_NXTCHAR=*      #_BIT_          ##_KBDCR        {WAIT FOR KEY PRESS}
 | 
						|
                #_BPL_          #@_NXTCHAR      {NO KEY YET}
 | 
						|
                #_LDA_          ##_KBD          {LOAD CHAR}
 | 
						|
                #_STAAX_        ##_IN           {STORE IN BUFFER}
 | 
						|
                #_CMPIM_        #$8D            {CR?}
 | 
						|
                #_BNE_          #@_NOTACR       {NO: KEEP GOING}
 | 
						|
                #_RTS_                          {YES: X=BUFLEN}
 | 
						|
 | 
						|
_GETNSP=*       #_LDAAY_        ##_IN
 | 
						|
                #_INY_
 | 
						|
                #_CMPIM_        #$A0 {" "}      {SKIP OVER SPACES}
 | 
						|
                #_BEQ_          #@_GETNSP
 | 
						|
                #_RTS_
 | 
						|
 | 
						|
_CROUT=*        #_LDAIM_        #$8D
 | 
						|
                #_JMP_          ##_ECHO
 | 
						|
 | 
						|
_GETNUM=*       #_LDXIM_        #0              {CLEAR VALID # FLAG}
 | 
						|
                #_STXZ_         #_A2L           {CLEAR A2}
 | 
						|
                #_STXZ_         #_A2H
 | 
						|
                #_BEQ_          #@_NXTCHR
 | 
						|
_XDIG=*         #_LDXIM_        #3
 | 
						|
                #_ASLA_                         {GOT HEX DIGIT,}
 | 
						|
                #_ASLA_                         {  SHIFT INTO A2}
 | 
						|
                #_ASLA_
 | 
						|
                #_ASLA_
 | 
						|
_NXTBIT=*       #_ASLA_
 | 
						|
                #_ROLZ_         #_A2L
 | 
						|
                #_ROLZ_         #_A2H
 | 
						|
                #_DEX_                          {LEAVE X=$FF IF DIG}
 | 
						|
                #_BPL_          #@_NXTBIT
 | 
						|
_NXTBAS=*       #_LDAZX_        #_A2H
 | 
						|
                #_STAZX_        #_A1H
 | 
						|
_NXTBS2=*       #_INX_
 | 
						|
                #_BEQ_          #@_NXTBAS
 | 
						|
_NXTCHR=*       #_LDAAY_        ##_IN           {GET CHAR}
 | 
						|
                #_INY_                          {ADVANCE INDEX}
 | 
						|
                #_EORIM_        #$B0
 | 
						|
                #_CMPIM_        #10             {DECIMAL DIGIT?}
 | 
						|
                #_BCC_          #@_XDIG         {YES: ACCUMULATE}
 | 
						|
                #_ADCIM_        #$88
 | 
						|
                #_CMPIM_        #$FA            {'A'-'F'}
 | 
						|
                #_BCS_          #@_XDIG         {YES: ACCUMULATE}
 | 
						|
                #_RTS_                          {NO: RETURN WITH}
 | 
						|
                                                {  X=0: NO NUMBER}
 | 
						|
                                                {  X=1: NUMBER}
 | 
						|
 | 
						|
_XMON=* {$0EEE} #_JMP_          ##_USAGE        {[Gigatron] Easy to remember entry point}
 | 
						|
 | 
						|
_PCADJ=*        #_LDAZ_         #_LENGTH        {0=1-BYTE, 1=2-BYTE, 2=3-BYTE.}
 | 
						|
                #_SEC_
 | 
						|
_PCADJ3=*       #_LDYZ_         #_PCH
 | 
						|
                #_TAX_                          {* TEST DISPL SIGN (FOR REL}
 | 
						|
                #_BPL_          #@_PCADJ4       {*   BRANCH). EXTEND NEG}
 | 
						|
                #_DEY_                          {*   BY DECREMENTING PCH.}
 | 
						|
_PCADJ4=*       #_ADCZ_         #_PCL
 | 
						|
                #_BCC_          #@_RTS1         {PCL+LENGTH (OR DISPL) +1 TO A.}
 | 
						|
                #_INY_                          {*  CARRY INTO Y (PCH)}
 | 
						|
_RTS1=*         #_RTS_
 | 
						|
 | 
						|
*=$f00
 | 
						|
_MODE1=*        #$40 #$2  #$45 #$3
 | 
						|
                #$D0 #$8  #$40 #$9
 | 
						|
                #$30                            {XXXXXXZ0 INSTRS..}
 | 
						|
                #$22
 | 
						|
                #$45                            {*  Z=0, LEFT HALF-BYTE}
 | 
						|
                #$33                            {*  Z=1, RIGHT HALF-BYTE}
 | 
						|
                #$D0 #$8  #$40 #$9
 | 
						|
                #$40 #$2  #$45 #$33
 | 
						|
                #$D0 #$8  #$40 #$9
 | 
						|
                #$40 #$2  #$45 #$B3
 | 
						|
                #$D0 #$8  #$40 #$9
 | 
						|
                #$0  #$22 #$44 #$33
 | 
						|
                #$D0 #$8C #$44 #$0
 | 
						|
                #$11 #$22 #$44 #$33
 | 
						|
                #$D0 #$8C #$44 #$9A
 | 
						|
                #$10 #$22 #$44 #$33
 | 
						|
                #$D0 #$8  #$40 #$9
 | 
						|
                #$10 #$22 #$44 #$33
 | 
						|
                #$D0 #$8  #$40 #$9
 | 
						|
                #$62
 | 
						|
                #$13                            {YYXXXZ01 INSTRS.}
 | 
						|
                #$78
 | 
						|
                #$A9
 | 
						|
 | 
						|
_MODE2=*        #$0                             {ERR}
 | 
						|
                #$21                            {IMM}
 | 
						|
                #$81                            {Z-PAG}
 | 
						|
                #$82                            {ABS}
 | 
						|
                #$0                             {IMPL}
 | 
						|
                #$0                             {ACC}
 | 
						|
                #$59                            {(Z-PAG,X)}
 | 
						|
                #$4D                            {(Z-PAG),Y}
 | 
						|
                #$91                            {Z-PAG,X}
 | 
						|
                #$92                            {ABS,X}
 | 
						|
                #$86                            {ABS,Y}
 | 
						|
                #$4A                            {(ABS)}
 | 
						|
                #$85                            {Z-PAG,Y}
 | 
						|
_CHAR1_minus1=* #$9D                            {REL}
 | 
						|
 | 
						|
_CHAR1=*        #$AC                            {','}
 | 
						|
                #$A9                            {')'}
 | 
						|
                #$AC                            {','}
 | 
						|
                #$A3                            {'#'}
 | 
						|
                #$A8                            {'('}
 | 
						|
_CHAR2_minus1=* #$A4                            {'$'}
 | 
						|
 | 
						|
_CHAR2=*        #$D9                            {'Y'}
 | 
						|
                #$0
 | 
						|
                #$D8                            {'X'}
 | 
						|
                #$A4                            {'$'}
 | 
						|
                #$A4                            {'$'}
 | 
						|
                #$0
 | 
						|
 | 
						|
_MNEML=*        #$1C #$8A #$1C #$23             {XXXXX000 INSTRS.}
 | 
						|
                #$5D #$8B #$1B #$A1
 | 
						|
                #$9D #$8A #$1D #$23
 | 
						|
                #$9D #$8B #$1D #$A1
 | 
						|
                #$0  #$29 #$19 #$AE
 | 
						|
                #$69 #$A8 #$19 #$23
 | 
						|
                #$24 #$53 #$1B #$23
 | 
						|
                #$24 #$53 #$19 #$A1
 | 
						|
                #$0  #$1A #$5B #$5B             {XXXYY100 INSTRS.}
 | 
						|
                #$A5 #$69 #$24 #$24
 | 
						|
                #$AE #$AE #$A8 #$AD             {1XXX1010 INSTRS.}
 | 
						|
                #$29 #$0  #$7C #$0
 | 
						|
                #$15 #$9C #$6D #$9C             {XXXYYY10 INSTRS.}
 | 
						|
                #$A5 #$69 #$29 #$53
 | 
						|
                #$84 #$13 #$34 #$11             {XXXYYY01 INSTRS.}
 | 
						|
                #$A5 #$69 #$23 #$A0
 | 
						|
 | 
						|
_MNEMR=*        #$D8 #$62 #$5A #$48             {XXXXX000 INSTRS}
 | 
						|
                #$26 #$62 #$94 #$88
 | 
						|
                #$54 #$44 #$C8 #$54
 | 
						|
                #$68 #$44 #$E8 #$94
 | 
						|
                #$0  #$B4 #$8  #$84
 | 
						|
                #$74 #$B4 #$28 #$6E
 | 
						|
                #$74 #$F4 #$CC #$4A
 | 
						|
                #$72 #$F2 #$A4 #$8A
 | 
						|
                #$0  #$AA #$A2 #$A2             {XXXYY100 INSTRS}
 | 
						|
                #$74 #$74 #$74 #$72
 | 
						|
                #$44 #$68 #$B2 #$32             {1XXX1010 INSTRS.}
 | 
						|
                #$B2 #$0  #$22 #$26
 | 
						|
                #$1A #$1A #$26 #$26             {XXXYYY10 INSTRS.}
 | 
						|
                #$72 #$72 #$88 #$C8
 | 
						|
                #$C4 #$CA #$26 #$48             {XXXYYY01 INSTRS.}
 | 
						|
                #$44 #$44 #$A2 #$C8
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|       vIRQ_ENTER                                                      |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
*=$5e00
 | 
						|
 | 
						|
_vIRQ_ENTER=*
 | 
						|
[
 | 
						|
  {-- Enter interrupt --}
 | 
						|
  push                          {Non-leaf function}
 | 
						|
 | 
						|
  {-- Handle KBD --}
 | 
						|
  &_lastKey, _serialRaw^ 255&   {First trigger on key changes}
 | 
						|
  [if<>0
 | 
						|
    &_KBD _PIA=                 {Pointer to PIA register $D010}
 | 
						|
    &_serialRaw, &_lastKey.     {"serialLast" isn't useful for this}
 | 
						|
    255^ [if<>0 255^            {But ignore key releases}
 | 
						|
      $60- [if>=0 $20-] $60+    {Map to upper case, delete becomes rubout}
 | 
						|
      10^ [if=0 7] 10^          {Map 10 CR to 13 LF}
 | 
						|
      26^ [if=0 %0=] 26^        {Attempt BRK on Ctrl-Z; May need retries}
 | 
						|
      127& 128-                 {Set bits 7..15}
 | 
						|
      _PIA:                     {Update KBD and KBDCR in one go}
 | 
						|
    ]]
 | 
						|
 | 
						|
  {-- Handle DSP --}
 | 
						|
  &_DSP _PIA= peek              {Pointer to PIA register $D012 and fetch}
 | 
						|
  [if<>0                        {Test DSP for non-zero value (instead of bit 7)}
 | 
						|
    <_tmpChar.                  {Keep copy for below}
 | 
						|
    128| &_CharOut!             {Emit the character, ensure bit 7 is set}
 | 
						|
    \vSP, 2+ deek 66+ [if=0     {HACK! If the return address is $ffbe, then eat}
 | 
						|
      _p 2- _p=]                { 2 pixels and let wozmon fit on a small screen}
 | 
						|
    0 _PIA.                     {Clear DSP}
 | 
						|
    &_KBD _PIA= peek            {If last key press compares equal to the char}
 | 
						|
    [if<>0 _tmpChar^ 127&]      { that was just emitted (or 0, for wozmon),}
 | 
						|
    [if=0 _PIA:]                { then also clear KBDCR. This is NOT how the}
 | 
						|
                                { true PIA works, but it fools most programs...}
 | 
						|
    31 <_cursorTimer.]          {Restart the cursor cycle. This prevents it}
 | 
						|
                                { from getting drawn within the next 10 frames.}
 | 
						|
 | 
						|
  {-- Handle cursor --}
 | 
						|
  {
 | 
						|
    Flashing rate and duty cycle are given by the 555 bistable circuit.
 | 
						|
    From the the schematic:
 | 
						|
        R1  =  10K
 | 
						|
        R2  =  10K
 | 
						|
        C   =  25 uF
 | 
						|
    Giving:
 | 
						|
        f   =  1.44  / ((R1 + 2*R2) * C)  =  1.92 Hz  =  31.2 frames
 | 
						|
        T1  =  0.693 * ((R1 + R2)   * C)  =   346 ms  =  20.8 frames
 | 
						|
        T2  =  0.693 * ( R2         * C)  =   173 ms  =  10.4 frames
 | 
						|
 | 
						|
    Video taken from the Apple-1 on display at LCM+L:
 | 
						|
        https://www.youtube.com/watch?v=FtOCumsDtlE
 | 
						|
        (11 frames on, 5 frames off, taken at 30 fps)
 | 
						|
  }
 | 
						|
  <_cursorTimer, 1-
 | 
						|
  [if<0
 | 
						|
    $a0 &_CharOut!              {` '}
 | 
						|
    _p 6- _p=                   {Go back}
 | 
						|
    30]                         {31 frames at 60 Hz}
 | 
						|
  <_cursorTimer.
 | 
						|
  20^ [if=0                     {67% duty cycle}
 | 
						|
    $c0 &_CharOut!              {`@'}
 | 
						|
    _p 6- _p=]                  {Go back}
 | 
						|
 | 
						|
  {-- Return from interrupt --}
 | 
						|
 | 
						|
  &_Break_minus2 _PIA=          {Restore the vPC damage we did above}
 | 
						|
  pop
 | 
						|
  255 \frameCount.              {New interrupt in next frame. Note: "255"}
 | 
						|
                                { *may* cause a race condition and crash!}
 | 
						|
  \vIRQ_Return 0??              {vIRQ return sequence}
 | 
						|
]
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|       Startup message                                                 |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 | 
						|
_PRE_RESET=*
 | 
						|
                {Set visible pixel lines in video table}
 | 
						|
                #_CLC_
 | 
						|
                #_LDXIM_ #0
 | 
						|
                #_LDYIM_ #12
 | 
						|
_L1=*           #_LDAAY_ ##_ROWS
 | 
						|
                #_STYZ_  #_YSAV
 | 
						|
                #_LDYIM_ #7
 | 
						|
_L2=*           #_STAAX_ ##\videoTable
 | 
						|
                #_ADCIM_ #1
 | 
						|
                #_INX_
 | 
						|
                #_INX_
 | 
						|
                #_DEY_
 | 
						|
                #_BNE_   #@_L2
 | 
						|
                #_INX_
 | 
						|
                #_INX_
 | 
						|
                #_INX_
 | 
						|
                #_INX_
 | 
						|
                #_LDYZ_  #_YSAV
 | 
						|
                #_DEY_
 | 
						|
                #_BPL_   #@_L1
 | 
						|
 | 
						|
                {Initialize terminal through "ACI"}
 | 
						|
                #_JMP_   ##_MENU
 | 
						|
 | 
						|
_ROWS=*         { Page of each row's first pixel line, backwards }
 | 
						|
                #$77 #$70 #$56 #$4f #$48 #$41 #$3a #$33 #$2c #$25 #$1e #$17 #$10
 | 
						|
 | 
						|
_BREAK=*        #_CLD_
 | 
						|
                #_CLI_
 | 
						|
                #_LDXIM_ #$F7
 | 
						|
                #_TXS_
 | 
						|
                #_JMP_   ##_ESCAPE
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|       Main vCPU loop                                                  |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
*=$5f00
 | 
						|
 | 
						|
_Apple1=*
 | 
						|
 | 
						|
{
 | 
						|
  Main loop from the perspective of the Gigatron I/O system.
 | 
						|
  It is practically doing nothing, just starting v6502 sequences
 | 
						|
  through the designated SYS call, to transfer control from vCPU
 | 
						|
  to v6502.  When the SYS call returns to vCPU mode (due to a
 | 
						|
  BRK instruction), fetch the 6502 IRQ vector and start again.
 | 
						|
 | 
						|
  The only other vCPU code is the vertical blank interrupt that
 | 
						|
  emulates the PIA registers.
 | 
						|
}
 | 
						|
 | 
						|
[do
 | 
						|
  _v6502_PC=                    {Reset v6502 PC}
 | 
						|
  \SYS_Run6502_v4_80 _sysFn=
 | 
						|
 | 
						|
_Break_minus2=*                 {To help our overly thrifty vIRQ handler}
 | 
						|
  80!!                          {Run 6502 code until BRK}
 | 
						|
 | 
						|
{_Break=*}                      {After v6502 BRK instruction, resume here}
 | 
						|
  $fffe deek                    {Fake 6502 IRQ}
 | 
						|
  loop]
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|       Character output with automatic scrolling                       |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 | 
						|
_CharOut=*
 | 
						|
[
 | 
						|
  {Minimalistic terminal output, with bit 7 set}
 | 
						|
 | 
						|
  _i=                           {Temp park argument here}
 | 
						|
 | 
						|
  6--                           {Preserve v6502 state}
 | 
						|
  _sysArgs0 %0=                 {v6502_ADL v6502_ADH}
 | 
						|
  _sysArgs2 %2=                 {v6502_IR  v6502_P}
 | 
						|
  _sysArgs4 %4=                 {v6502_Qz  v6502_Qn}
 | 
						|
 | 
						|
  \SYS_VDrawBits_134 _sysFn=    {Prepare SYS calls}
 | 
						|
  $3f00 _sysArgs0=              {White pen color and clear bitmask}
 | 
						|
  \sysArgs2.                    {Clear bitmask}
 | 
						|
 | 
						|
  _i \sysArgs3.                 {Keep copy of character in sysArgs3}
 | 
						|
  $8d^ [if<>0                   {Test for CR...}
 | 
						|
    <_p, 251- if>0 0]           {...or line wrap}
 | 
						|
  [if=0
 | 
						|
 | 
						|
    {-------------------------------------------------------------------+
 | 
						|
    |       Newline                                                     |
 | 
						|
    +-------------------------------------------------------------------}
 | 
						|
 | 
						|
    { Clear cursor symbol }
 | 
						|
    _p _sysArgs4=               {Set drawing position}
 | 
						|
    255& 251- [if<=0 -5]        {Clear 5 or 1 slices depending on margin}
 | 
						|
    [do
 | 
						|
      134!! <_sysArgs4++        {Whipes out any `@'}
 | 
						|
      1+ if<0loop]
 | 
						|
 | 
						|
    { Find the top text row }
 | 
						|
    $61 <_p.                    {Go to start of line, nicely indent by 1 pixel}
 | 
						|
    $9f+ _i=                    {i==$100: start of the video table}
 | 
						|
    peek >_p.                   {Go to what is now still the top text row}
 | 
						|
 | 
						|
    { Clear the text row }
 | 
						|
    _p 2- _sysArgs4=            {Set drawing position for clearing}
 | 
						|
    [do
 | 
						|
      $700 _sysArgs4+ peek      {Preserve pixel on 8th line because of overlap}
 | 
						|
      1& \sysArgs2.             { in 7 line text mode. Assume bit 0 differs.}
 | 
						|
 | 
						|
      134!!                     {SYS call to draw 8 pixels vertically}
 | 
						|
      <_sysArgs4++              {Step 1 pixel right}
 | 
						|
      \sysArgs4, if<>0loop]     {Loop until end of pixel line}
 | 
						|
 | 
						|
    { Scroll everything up by modifying the video indirection table }
 | 
						|
    [do
 | 
						|
      _i 18+ _j=                {j looks 9 entries ahead of i}
 | 
						|
      peek \sysArgs2.           {Swap scanlines}
 | 
						|
      _i, _j.
 | 
						|
      \sysArgs2, _i.
 | 
						|
      <_i++ <_i++               {Advance to next entry in video table}
 | 
						|
      <_i, 216^ if<>0loop]      {Until all done}
 | 
						|
 | 
						|
    { The cleared text row has now bubbled down to the bottom }
 | 
						|
  ]
 | 
						|
 | 
						|
  \sysArgs3, $a0-               {WozMon sends ASCII with bit 7 set}
 | 
						|
  [if>=0                        {If printable}
 | 
						|
 | 
						|
    {-------------------------------------------------------------------+
 | 
						|
    |       DrawChar                                                    |
 | 
						|
    +-------------------------------------------------------------------}
 | 
						|
 | 
						|
    { Draw ASCII character (32..127) on screen in 5x8 pixels }
 | 
						|
    { and advance cursor position }
 | 
						|
 | 
						|
    64- [if>=0 32-] 14+         {Map ASCII 96..127 to 64..95}
 | 
						|
    [if<0 50+ _i= \font32up     {ASCII 32..81}
 | 
						|
     else     _i= \font82up]    {ASCII 82..127}
 | 
						|
    _j= _i 2<< _i+              {Multiply char code by 5}
 | 
						|
    _j+ _j=                     {Add to page address to reach bitmap data}
 | 
						|
 | 
						|
    _p _sysArgs4=               {Screen position for character}
 | 
						|
    6+ _p=                      {Advance by 6 pixels}
 | 
						|
 | 
						|
    5 [do _i=                   {Draw character as 5 vertical bit slices}
 | 
						|
      _j 0??                    {Get bit slice as byte from ROM table}
 | 
						|
      $fe& \sysArgs2.           {Clear bottom pixel}
 | 
						|
      $700 _sysArgs4+ peek      {Preserve pixel on 8th line because of overlap}
 | 
						|
      [if<>0 <\sysArgs2++]      { in 7 line text mode. Assumes background is 0.}
 | 
						|
      134!!                     {SYS call to draw 8 pixels vertically}
 | 
						|
      <_j++ <_sysArgs4++        {Advance to next byte}
 | 
						|
      _i 1- if>0loop]           {Looping}
 | 
						|
  ]
 | 
						|
 | 
						|
  %0 _sysArgs0=
 | 
						|
  %2 _sysArgs2=
 | 
						|
  %4 _sysArgs4=
 | 
						|
  6++ ret
 | 
						|
]
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|       Apple-1 Cassette Interface                                      |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 | 
						|
*=$c100
 | 
						|
                #_LDAIM_ #$aa           {`*' for authenticity}
 | 
						|
                #_JSR_   ##_ECHO
 | 
						|
_MENU=*
 | 
						|
                #_LDX_   ##_MSG1        {Print welcome message part 1}
 | 
						|
_L3=*           #_LDAAX_ ##_MSG1
 | 
						|
                #_JSR_   ##_ECHO
 | 
						|
                #_DEX_
 | 
						|
                #_BNE_   #@_L3
 | 
						|
 | 
						|
                #_LDX_   ##_MSG2        {Print welcome message part 2}
 | 
						|
_L4=*           #_LDAAX_ ##_MSG2
 | 
						|
                #_JSR_   ##_ECHO
 | 
						|
                #_DEX_
 | 
						|
                #_BNE_   #@_L4
 | 
						|
 | 
						|
_L5=*           #_BIT_   ##_DSP         {Wait for processing of last char}
 | 
						|
                #_BMI_   #@_L5
 | 
						|
                #_JMP_   ##_RESET
 | 
						|
 | 
						|
_MSG2=*         #@_MSG2_END
 | 
						|
 | 
						|
                { 'CTL-Z WOZMON' }
 | 
						|
                #$8d #$ce #$cf #$cd #$da #$cf #$d7 #$a0
 | 
						|
                #$da #$ad #$cc #$d4 #$c3
 | 
						|
 | 
						|
                { 'E2B3R BASIC WARM START\r' }
 | 
						|
                #$8d #$d4 #$d2 #$c1 #$d4 #$d3 #$a0 #$cd
 | 
						|
                #$d2 #$c1 #$d7 #$a0 #$c3 #$c9 #$d3 #$c1
 | 
						|
                #$c2 #$a0 #$d2 #$b3 #$c2 #$b2 #$c5
 | 
						|
 | 
						|
                {       'INTEGER BASIC\r' }
 | 
						|
                #$8d #$c3 #$c9 #$d3 #$c1 #$c2 #$a0 #$d2
 | 
						|
                #$c5 #$c7 #$c5 #$d4 #$ce #$c9
 | 
						|
_MSG2_END=*
 | 
						|
 | 
						|
*=$c200
 | 
						|
_MSG1=*         #@_MSG1_END
 | 
						|
 | 
						|
                { 'E000R ' }
 | 
						|
                #$a0 #$d2 #$b0 #$b0 #$b0 #$c5
 | 
						|
 | 
						|
                { 'C100R MENU\r' }
 | 
						|
                #$8d #$d5 #$ce #$c5 #$cd #$a0 #$d2 #$b0
 | 
						|
                #$b0 #$b1 #$c3
 | 
						|
 | 
						|
                { 'EEER  MINI-ASSEMBLER\r' }
 | 
						|
                #$8d #$d2 #$c5 #$cc #$c2 #$cd #$c5 #$d3
 | 
						|
                #$d3 #$c1 #$ad #$c9 #$ce #$c9 #$cd #$a0
 | 
						|
                #$a0 #$d2 #$c5 #$c5 #$c5
 | 
						|
 | 
						|
                { '400R  15-PUZZLE\r' }
 | 
						|
                #$8d #$c5 #$cc #$da #$da #$d5 #$d0 #$ad
 | 
						|
                #$b5 #$b1 #$a0 #$a0 #$d2 #$b0 #$b0 #$b4
 | 
						|
 | 
						|
                { '300R  MASTERMIND\r'}
 | 
						|
                #$8d #$c4 #$ce #$c9 #$cd #$d2 #$c5 #$d4
 | 
						|
                #$d3 #$c1 #$cd #$a0 #$a0 #$d2 #$b0 #$b0
 | 
						|
                #$b3
 | 
						|
 | 
						|
                { 'APPLE-1 ON TTL\r\r' }
 | 
						|
                #$8d #$8d #$cc #$d4 #$d4 #$a0 #$ce #$cf
 | 
						|
                #$a0 #$b1 #$ad #$c5 #$cc #$d0 #$d0 #$c1
 | 
						|
 | 
						|
                { '\r' ... }
 | 
						|
                #$8d #$8d #$8d
 | 
						|
_MSG1_END=*
 | 
						|
 | 
						|
                {
 | 
						|
                  Create message bytes in Python with:
 | 
						|
                  s = 'Message text'
 | 
						|
                  ' '.join('#$%02x'%(ord(c)+128) for c in reversed(s))
 | 
						|
                }
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|       PIA init                                                        |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 | 
						|
*=$d010         #0      {KBD}
 | 
						|
                #0      {KBDCR}
 | 
						|
                #0      {DSP}
 | 
						|
                #0      {DSPCR}
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|       A1 BASIC                                                        |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 | 
						|
{ v v v v v v v v v v v v   Insert BASIC image here   v v v v v v v v v v v v }
 | 
						|
{ Generated by: cd a1basic && ./make.sh }
 | 
						|
 | 
						|
 | 
						|
*=$e000
 | 
						|
 #$4c #$b0 #$e2 #$ad #$11 #$d0 #$10 #$fb #$ad #$10 #$d0 #$60 #$8a #$29 #$20 #$f0
 | 
						|
 #$23 #$a9 #$a0 #$85 #$44 #$4c #$c9 #$e3 #$a9 #$20 #$c5 #$81 #$b0 #$0c #$a9 #$8d
 | 
						|
 #$a0 #$07 #$20 #$c9 #$e3 #$a9 #$a0 #$88 #$d0 #$f8 #$a0 #$00 #$b1 #$42 #$e6 #$42
 | 
						|
 #$d0 #$02 #$e6 #$43 #$60 #$20 #$15 #$e7 #$20 #$76 #$e5 #$a5 #$42 #$c5 #$46 #$a5
 | 
						|
 #$43 #$e5 #$47 #$b0 #$ef #$20 #$6d #$e0 #$4c #$3b #$e0 #$a5 #$ca #$85 #$42 #$a5
 | 
						|
 #$cb #$85 #$43 #$a5 #$4c #$85 #$46 #$a5 #$4d #$85 #$47 #$d0 #$de #$20 #$15 #$e7
 | 
						|
 #$20 #$6d #$e5 #$a5 #$44 #$85 #$42 #$a5 #$45 #$85 #$43 #$b0 #$c7 #$86 #$d8 #$a9
 | 
						|
 #$a0 #$85 #$82 #$20 #$2a #$e0 #$98 #$85 #$44 #$20 #$2a #$e0 #$aa #$20 #$2a #$e0
 | 
						|
 #$20 #$1b #$e5 #$20 #$18 #$e0 #$84 #$82 #$aa #$10 #$18 #$0a #$10 #$e9 #$a5 #$44
 | 
						|
 #$d0 #$03 #$20 #$11 #$e0 #$8a #$20 #$c9 #$e3 #$a9 #$25 #$20 #$1a #$e0 #$aa #$30
 | 
						|
 #$f5 #$85 #$44 #$c9 #$01 #$d0 #$05 #$a6 #$d8 #$4c #$cd #$e3 #$48 #$84 #$ce #$a2
 | 
						|
 #$ed #$86 #$cf #$c9 #$51 #$90 #$04 #$c6 #$cf #$e9 #$50 #$48 #$b1 #$ce #$aa #$88
 | 
						|
 #$b1 #$ce #$10 #$fa #$e0 #$c0 #$b0 #$04 #$e0 #$00 #$30 #$f2 #$aa #$68 #$e9 #$01
 | 
						|
 #$d0 #$e9 #$24 #$44 #$30 #$03 #$20 #$f8 #$ef #$b1 #$ce #$10 #$10 #$aa #$29 #$3f
 | 
						|
 #$85 #$44 #$18 #$69 #$a0 #$20 #$c9 #$e3 #$88 #$e0 #$c0 #$90 #$ec #$20 #$0c #$e0
 | 
						|
 #$68 #$c9 #$5d #$f0 #$a4 #$c9 #$28 #$d0 #$8a #$f0 #$9e #$20 #$18 #$e1 #$95 #$50
 | 
						|
 | 
						|
*=$e100
 | 
						|
 #$d5 #$88 #$90 #$11 #$a0 #$2b #$4c #$e0 #$e3 #$20 #$34 #$ee #$d5 #$50 #$90 #$f4
 | 
						|
 #$20 #$e4 #$ef #$95 #$88 #$4c #$23 #$e8 #$20 #$34 #$ee #$f0 #$e7 #$38 #$e9 #$01
 | 
						|
 #$60 #$20 #$18 #$e1 #$95 #$50 #$18 #$f5 #$88 #$4c #$02 #$e1 #$a0 #$14 #$d0 #$d6
 | 
						|
 #$20 #$18 #$e1 #$e8 #$b5 #$50 #$85 #$da #$65 #$ce #$48 #$a8 #$b5 #$88 #$85 #$db
 | 
						|
 #$65 #$cf #$48 #$c4 #$ca #$e5 #$cb #$b0 #$e3 #$a5 #$da #$69 #$fe #$85 #$da #$a9
 | 
						|
 #$ff #$a8 #$65 #$db #$85 #$db #$c8 #$b1 #$da #$d9 #$cc #$00 #$d0 #$0f #$98 #$f0
 | 
						|
 #$f5 #$68 #$91 #$da #$99 #$cc #$00 #$88 #$10 #$f7 #$e8 #$60 #$ea #$a0 #$80 #$d0
 | 
						|
 #$95 #$a9 #$00 #$20 #$0a #$e7 #$a0 #$02 #$94 #$88 #$20 #$0a #$e7 #$a9 #$bf #$20
 | 
						|
 #$c9 #$e3 #$a0 #$00 #$20 #$9e #$e2 #$94 #$88 #$ea #$ea #$ea #$b5 #$51 #$85 #$ce
 | 
						|
 #$b5 #$89 #$85 #$cf #$e8 #$e8 #$20 #$bc #$e1 #$b5 #$4e #$d5 #$86 #$b0 #$15 #$f6
 | 
						|
 #$4e #$a8 #$b1 #$ce #$b4 #$50 #$c4 #$44 #$90 #$04 #$a0 #$83 #$d0 #$c1 #$91 #$da
 | 
						|
 #$f6 #$50 #$90 #$e5 #$b4 #$50 #$8a #$91 #$da #$e8 #$e8 #$60 #$b5 #$51 #$85 #$da
 | 
						|
 #$38 #$e9 #$02 #$85 #$44 #$b5 #$89 #$85 #$db #$e9 #$00 #$85 #$45 #$a0 #$00 #$b1
 | 
						|
 #$44 #$18 #$e5 #$da #$85 #$44 #$60 #$b5 #$53 #$85 #$ce #$b5 #$8b #$85 #$cf #$b5
 | 
						|
 #$51 #$85 #$da #$b5 #$89 #$85 #$db #$e8 #$e8 #$e8 #$a0 #$00 #$94 #$88 #$94 #$a8
 | 
						|
 #$c8 #$94 #$50 #$b5 #$4d #$d5 #$85 #$08 #$48 #$b5 #$4f #$d5 #$87 #$90 #$07 #$68
 | 
						|
 | 
						|
*=$e200
 | 
						|
 #$28 #$b0 #$02 #$56 #$50 #$60 #$a8 #$b1 #$ce #$85 #$44 #$68 #$a8 #$28 #$b0 #$f3
 | 
						|
 #$b1 #$da #$c5 #$44 #$d0 #$ed #$f6 #$4f #$f6 #$4d #$b0 #$d7 #$20 #$d7 #$e1 #$4c
 | 
						|
 #$36 #$e7 #$20 #$54 #$e2 #$06 #$ce #$26 #$cf #$90 #$0d #$18 #$a5 #$46 #$65 #$da
 | 
						|
 #$85 #$46 #$a5 #$47 #$65 #$db #$85 #$47 #$88 #$f0 #$09 #$06 #$46 #$26 #$47 #$10
 | 
						|
 #$e4 #$4c #$7e #$e7 #$a5 #$46 #$20 #$08 #$e7 #$a5 #$47 #$95 #$a8 #$06 #$45 #$90
 | 
						|
 #$28 #$4c #$6f #$e7 #$a9 #$55 #$85 #$45 #$20 #$5b #$e2 #$a5 #$ce #$85 #$da #$a5
 | 
						|
 #$cf #$85 #$db #$20 #$15 #$e7 #$84 #$46 #$84 #$47 #$a5 #$cf #$10 #$09 #$ca #$06
 | 
						|
 #$45 #$20 #$6f #$e7 #$20 #$15 #$e7 #$a0 #$10 #$60 #$20 #$6c #$ee #$f0 #$c5 #$ff
 | 
						|
 #$c9 #$84 #$d0 #$02 #$46 #$78 #$c9 #$df #$f0 #$11 #$c9 #$9b #$f0 #$06 #$99 #$00
 | 
						|
 #$02 #$c8 #$10 #$0a #$a0 #$8b #$20 #$c4 #$e3 #$a0 #$01 #$88 #$30 #$f6 #$20 #$03
 | 
						|
 #$e0 #$ea #$ea #$20 #$c9 #$e3 #$c9 #$8d #$d0 #$d6 #$a9 #$df #$99 #$00 #$02 #$60
 | 
						|
 #$20 #$d3 #$ef #$20 #$cd #$e3 #$46 #$d9 #$a9 #$be #$20 #$c9 #$e3 #$a0 #$00 #$84
 | 
						|
 #$82 #$24 #$78 #$10 #$0c #$a6 #$76 #$a5 #$77 #$20 #$1b #$e5 #$a9 #$a0 #$20 #$c9
 | 
						|
 #$e3 #$a2 #$ff #$9a #$20 #$9e #$e2 #$84 #$e9 #$8a #$85 #$c8 #$a2 #$18 #$20 #$91
 | 
						|
 #$e4 #$a5 #$c8 #$69 #$00 #$85 #$de #$a9 #$00 #$aa #$69 #$02 #$85 #$df #$a1 #$de
 | 
						|
 #$29 #$f0 #$c9 #$b0 #$f0 #$03 #$4c #$83 #$e8 #$a0 #$02 #$b1 #$de #$99 #$cd #$00
 | 
						|
 | 
						|
*=$e300
 | 
						|
 #$88 #$d0 #$f8 #$20 #$8a #$e3 #$a5 #$e9 #$e5 #$c8 #$c9 #$04 #$f0 #$a8 #$91 #$de
 | 
						|
 #$a5 #$ca #$f1 #$de #$85 #$44 #$a5 #$cb #$e9 #$00 #$85 #$45 #$a5 #$44 #$c5 #$cc
 | 
						|
 #$a5 #$45 #$e5 #$cd #$90 #$45 #$a5 #$ca #$f1 #$de #$85 #$46 #$a5 #$cb #$e9 #$00
 | 
						|
 #$85 #$47 #$b1 #$ca #$91 #$46 #$e6 #$ca #$d0 #$02 #$e6 #$cb #$a5 #$42 #$c5 #$ca
 | 
						|
 #$a5 #$43 #$e5 #$cb #$b0 #$e0 #$b5 #$44 #$95 #$ca #$ca #$10 #$f9 #$b1 #$de #$a8
 | 
						|
 #$88 #$b1 #$de #$91 #$46 #$98 #$d0 #$f8 #$24 #$78 #$10 #$09 #$b5 #$77 #$75 #$75
 | 
						|
 #$95 #$77 #$e8 #$f0 #$f7 #$10 #$7e #$00 #$00 #$00 #$00 #$a0 #$14 #$d0 #$71 #$20
 | 
						|
 #$15 #$e7 #$a5 #$42 #$85 #$46 #$a5 #$43 #$85 #$47 #$20 #$75 #$e5 #$a5 #$42 #$85
 | 
						|
 #$44 #$a5 #$43 #$85 #$45 #$d0 #$0e #$20 #$15 #$e7 #$20 #$6d #$e5 #$a5 #$46 #$85
 | 
						|
 #$42 #$a5 #$47 #$85 #$43 #$a0 #$00 #$a5 #$ca #$c5 #$44 #$a5 #$cb #$e5 #$45 #$b0
 | 
						|
 #$16 #$a5 #$44 #$d0 #$02 #$c6 #$45 #$c6 #$44 #$a5 #$46 #$d0 #$02 #$c6 #$47 #$c6
 | 
						|
 #$46 #$b1 #$44 #$91 #$46 #$90 #$e0 #$a5 #$46 #$85 #$ca #$a5 #$47 #$85 #$cb #$60
 | 
						|
 #$20 #$c9 #$e3 #$c8 #$b9 #$00 #$eb #$30 #$f7 #$c9 #$8d #$d0 #$06 #$a9 #$00 #$85
 | 
						|
 #$81 #$a9 #$8d #$e6 #$81 #$4c #$ef #$ff #$ea #$ea #$ea #$ea #$ea #$ea #$a0 #$06
 | 
						|
 #$20 #$d3 #$ee #$24 #$d9 #$30 #$03 #$4c #$b6 #$e2 #$4c #$9a #$eb #$2a #$69 #$a0
 | 
						|
 #$dd #$00 #$02 #$d0 #$53 #$b1 #$86 #$0a #$30 #$06 #$88 #$b1 #$86 #$30 #$29 #$c8
 | 
						|
 | 
						|
*=$e400
 | 
						|
 #$86 #$c8 #$98 #$48 #$a2 #$00 #$a1 #$86 #$aa #$4a #$49 #$48 #$11 #$86 #$c9 #$c0
 | 
						|
 #$90 #$01 #$e8 #$c8 #$d0 #$f3 #$68 #$a8 #$8a #$4c #$c0 #$e4 #$e6 #$e9 #$a6 #$e9
 | 
						|
 #$f0 #$bc #$9d #$00 #$02 #$60 #$a6 #$c8 #$a9 #$a0 #$e8 #$dd #$00 #$02 #$b0 #$fa
 | 
						|
 #$b1 #$86 #$29 #$3f #$4a #$d0 #$b6 #$bd #$00 #$02 #$b0 #$06 #$69 #$3f #$c9 #$1a
 | 
						|
 #$90 #$6f #$69 #$4f #$c9 #$0a #$90 #$69 #$a6 #$85 #$c8 #$b1 #$86 #$29 #$e0 #$c9
 | 
						|
 #$20 #$f0 #$7a #$b5 #$b0 #$85 #$c8 #$b5 #$d1 #$85 #$e9 #$88 #$b1 #$86 #$0a #$10
 | 
						|
 #$fa #$88 #$b0 #$38 #$0a #$30 #$35 #$b4 #$58 #$84 #$87 #$b4 #$90 #$e8 #$10 #$da
 | 
						|
 #$f0 #$b3 #$c9 #$7e #$b0 #$22 #$ca #$10 #$04 #$a0 #$06 #$10 #$29 #$94 #$90 #$a4
 | 
						|
 #$87 #$94 #$58 #$a4 #$c8 #$94 #$b0 #$a4 #$e9 #$94 #$d1 #$29 #$1f #$a8 #$b9 #$20
 | 
						|
 #$ec #$0a #$a8 #$a9 #$76 #$2a #$85 #$87 #$d0 #$01 #$c8 #$c8 #$86 #$85 #$b1 #$86
 | 
						|
 #$30 #$84 #$d0 #$05 #$a0 #$0e #$4c #$e0 #$e3 #$c9 #$03 #$b0 #$c3 #$4a #$a6 #$c8
 | 
						|
 #$e8 #$bd #$00 #$02 #$90 #$04 #$c9 #$a2 #$f0 #$0a #$c9 #$df #$f0 #$06 #$86 #$c8
 | 
						|
 #$20 #$1c #$e4 #$c8 #$88 #$a6 #$85 #$b1 #$86 #$88 #$0a #$10 #$cf #$b4 #$58 #$84
 | 
						|
 #$87 #$b4 #$90 #$e8 #$b1 #$86 #$29 #$9f #$d0 #$ed #$85 #$72 #$85 #$73 #$98 #$48
 | 
						|
 #$86 #$85 #$b4 #$d0 #$84 #$c9 #$18 #$a9 #$0a #$85 #$79 #$a2 #$00 #$c8 #$b9 #$00
 | 
						|
 #$02 #$29 #$0f #$65 #$72 #$48 #$8a #$65 #$73 #$30 #$1c #$aa #$68 #$c6 #$79 #$d0
 | 
						|
 | 
						|
*=$e500
 | 
						|
 #$f2 #$85 #$72 #$86 #$73 #$c4 #$e9 #$d0 #$de #$a4 #$c9 #$c8 #$84 #$e9 #$20 #$1c
 | 
						|
 #$e4 #$68 #$a8 #$a5 #$73 #$b0 #$a9 #$a0 #$00 #$10 #$8b #$85 #$73 #$86 #$72 #$a2
 | 
						|
 #$04 #$86 #$c9 #$a9 #$b0 #$85 #$79 #$a5 #$72 #$dd #$63 #$e5 #$a5 #$73 #$fd #$68
 | 
						|
 #$e5 #$90 #$0d #$85 #$73 #$a5 #$72 #$fd #$63 #$e5 #$85 #$72 #$e6 #$79 #$d0 #$e7
 | 
						|
 #$a5 #$79 #$e8 #$ca #$f0 #$0e #$c9 #$b0 #$f0 #$02 #$85 #$c9 #$24 #$c9 #$30 #$04
 | 
						|
 #$a5 #$82 #$f0 #$0b #$20 #$c9 #$e3 #$24 #$78 #$10 #$04 #$99 #$00 #$02 #$c8 #$ca
 | 
						|
 #$10 #$c1 #$60 #$01 #$0a #$64 #$e8 #$10 #$00 #$00 #$00 #$03 #$27 #$a5 #$ca #$85
 | 
						|
 #$46 #$a5 #$cb #$85 #$47 #$e8 #$a5 #$47 #$85 #$45 #$a5 #$46 #$85 #$44 #$c5 #$4c
 | 
						|
 #$a5 #$45 #$e5 #$4d #$b0 #$26 #$a0 #$01 #$b1 #$44 #$e5 #$ce #$c8 #$b1 #$44 #$e5
 | 
						|
 #$cf #$b0 #$19 #$a0 #$00 #$a5 #$46 #$71 #$44 #$85 #$46 #$90 #$03 #$e6 #$47 #$18
 | 
						|
 #$c8 #$a5 #$ce #$f1 #$44 #$c8 #$a5 #$cf #$f1 #$44 #$b0 #$ca #$60 #$46 #$78 #$a5
 | 
						|
 #$4c #$85 #$ca #$a5 #$4d #$85 #$cb #$a5 #$4a #$85 #$cc #$a5 #$4b #$85 #$cd #$a9
 | 
						|
 #$00 #$85 #$83 #$85 #$84 #$85 #$86 #$a9 #$00 #$85 #$1d #$60 #$a5 #$d0 #$69 #$05
 | 
						|
 #$85 #$d2 #$a5 #$d1 #$69 #$00 #$85 #$d3 #$a5 #$d2 #$c5 #$ca #$a5 #$d3 #$e5 #$cb
 | 
						|
 #$90 #$03 #$4c #$6b #$e3 #$a5 #$ce #$91 #$d0 #$a5 #$cf #$c8 #$91 #$d0 #$a5 #$d2
 | 
						|
 #$c8 #$91 #$d0 #$a5 #$d3 #$c8 #$91 #$d0 #$a9 #$00 #$c8 #$91 #$d0 #$c8 #$91 #$d0
 | 
						|
 | 
						|
*=$e600
 | 
						|
 #$a5 #$d2 #$85 #$cc #$a5 #$d3 #$85 #$cd #$a5 #$d0 #$90 #$43 #$85 #$ce #$84 #$cf
 | 
						|
 #$20 #$ff #$e6 #$30 #$0e #$c9 #$40 #$f0 #$0a #$4c #$28 #$e6 #$06 #$c9 #$49 #$d0
 | 
						|
 #$07 #$a9 #$49 #$85 #$cf #$20 #$ff #$e6 #$a5 #$4b #$85 #$d1 #$a5 #$4a #$85 #$d0
 | 
						|
 #$c5 #$cc #$a5 #$d1 #$e5 #$cd #$b0 #$94 #$b1 #$d0 #$c8 #$c5 #$ce #$d0 #$06 #$b1
 | 
						|
 #$d0 #$c5 #$cf #$f0 #$0e #$c8 #$b1 #$d0 #$48 #$c8 #$b1 #$d0 #$85 #$d1 #$68 #$a0
 | 
						|
 #$00 #$f0 #$db #$a5 #$d0 #$69 #$03 #$20 #$0a #$e7 #$a5 #$d1 #$69 #$00 #$95 #$88
 | 
						|
 #$a5 #$cf #$c9 #$40 #$d0 #$1c #$88 #$98 #$20 #$0a #$e7 #$88 #$94 #$88 #$a0 #$03
 | 
						|
 #$f6 #$88 #$c8 #$b1 #$d0 #$30 #$f9 #$10 #$09 #$a9 #$00 #$85 #$d4 #$85 #$d5 #$a2
 | 
						|
 #$18 #$48 #$a0 #$00 #$b1 #$de #$10 #$18 #$0a #$30 #$81 #$20 #$ff #$e6 #$20 #$08
 | 
						|
 #$e7 #$20 #$ff #$e6 #$95 #$a8 #$24 #$d4 #$10 #$01 #$ca #$20 #$ff #$e6 #$b0 #$e6
 | 
						|
 #$c9 #$28 #$d0 #$1f #$a5 #$de #$20 #$0a #$e7 #$a5 #$df #$95 #$88 #$24 #$d4 #$30
 | 
						|
 #$0b #$a9 #$01 #$20 #$0a #$e7 #$a9 #$00 #$95 #$88 #$f6 #$88 #$20 #$ff #$e6 #$30
 | 
						|
 #$f9 #$b0 #$d3 #$24 #$d4 #$10 #$06 #$c9 #$04 #$b0 #$d0 #$46 #$d4 #$a8 #$85 #$d6
 | 
						|
 #$b9 #$98 #$e9 #$29 #$55 #$0a #$85 #$d7 #$68 #$a8 #$b9 #$98 #$e9 #$29 #$aa #$c5
 | 
						|
 #$d7 #$b0 #$09 #$98 #$48 #$20 #$ff #$e6 #$a5 #$d6 #$90 #$95 #$b9 #$10 #$ea #$85
 | 
						|
 #$ce #$b9 #$88 #$ea #$85 #$cf #$20 #$fc #$e6 #$4c #$d8 #$e6 #$6c #$ce #$00 #$e6
 | 
						|
 | 
						|
*=$e700
 | 
						|
 #$de #$d0 #$02 #$e6 #$df #$b1 #$de #$60 #$94 #$87 #$ca #$30 #$03 #$95 #$50 #$60
 | 
						|
 #$a0 #$66 #$4c #$e0 #$e3 #$a0 #$00 #$b5 #$50 #$85 #$ce #$b5 #$a8 #$85 #$cf #$b5
 | 
						|
 #$88 #$f0 #$0e #$85 #$cf #$b1 #$ce #$48 #$c8 #$b1 #$ce #$85 #$cf #$68 #$85 #$ce
 | 
						|
 #$88 #$e8 #$60 #$20 #$4a #$e7 #$20 #$15 #$e7 #$98 #$20 #$08 #$e7 #$95 #$a8 #$c5
 | 
						|
 #$ce #$d0 #$06 #$c5 #$cf #$d0 #$02 #$f6 #$50 #$60 #$20 #$82 #$e7 #$20 #$59 #$e7
 | 
						|
 #$20 #$15 #$e7 #$24 #$cf #$30 #$1b #$ca #$60 #$20 #$15 #$e7 #$a5 #$cf #$d0 #$04
 | 
						|
 #$a5 #$ce #$f0 #$f3 #$a9 #$ff #$20 #$08 #$e7 #$95 #$a8 #$24 #$cf #$30 #$e9 #$20
 | 
						|
 #$15 #$e7 #$98 #$38 #$e5 #$ce #$20 #$08 #$e7 #$98 #$e5 #$cf #$50 #$23 #$a0 #$00
 | 
						|
 #$10 #$90 #$20 #$6f #$e7 #$20 #$15 #$e7 #$a5 #$ce #$85 #$da #$a5 #$cf #$85 #$db
 | 
						|
 #$20 #$15 #$e7 #$18 #$a5 #$ce #$65 #$da #$20 #$08 #$e7 #$a5 #$cf #$65 #$db #$70
 | 
						|
 #$dd #$95 #$a8 #$60 #$20 #$15 #$e7 #$a4 #$ce #$f0 #$05 #$88 #$a5 #$cf #$f0 #$0c
 | 
						|
 #$60 #$a5 #$81 #$09 #$07 #$a8 #$c8 #$a9 #$a0 #$20 #$c9 #$e3 #$c4 #$81 #$b0 #$f7
 | 
						|
 #$60 #$20 #$b1 #$e7 #$20 #$15 #$e7 #$a5 #$cf #$10 #$0a #$a9 #$ad #$20 #$c9 #$e3
 | 
						|
 #$20 #$72 #$e7 #$50 #$ef #$88 #$84 #$d5 #$86 #$cf #$a6 #$ce #$20 #$1b #$e5 #$a6
 | 
						|
 #$cf #$60 #$20 #$15 #$e7 #$a5 #$ce #$85 #$76 #$a5 #$cf #$85 #$77 #$88 #$84 #$78
 | 
						|
 #$c8 #$a9 #$0a #$85 #$74 #$84 #$75 #$60 #$20 #$15 #$e7 #$a5 #$ce #$a4 #$cf #$10
 | 
						|
 | 
						|
*=$e800
 | 
						|
 #$f2 #$20 #$15 #$e7 #$b5 #$50 #$85 #$da #$b5 #$88 #$85 #$db #$a5 #$ce #$91 #$da
 | 
						|
 #$c8 #$a5 #$cf #$91 #$da #$e8 #$60 #$68 #$68 #$24 #$d5 #$10 #$05 #$20 #$cd #$e3
 | 
						|
 #$46 #$d5 #$60 #$a0 #$ff #$84 #$d7 #$60 #$20 #$cd #$ef #$f0 #$07 #$a9 #$25 #$85
 | 
						|
 #$d6 #$88 #$84 #$d4 #$e8 #$60 #$a5 #$ca #$a4 #$cb #$d0 #$5a #$a0 #$41 #$a5 #$84
 | 
						|
 #$c9 #$08 #$b0 #$5e #$a8 #$e6 #$84 #$a5 #$de #$99 #$00 #$11 #$a5 #$df #$99 #$08
 | 
						|
 #$11 #$a5 #$dc #$99 #$10 #$11 #$a5 #$dd #$99 #$18 #$11 #$20 #$15 #$e7 #$20 #$6d
 | 
						|
 #$e5 #$90 #$04 #$a0 #$37 #$d0 #$3b #$a5 #$44 #$a4 #$45 #$85 #$dc #$84 #$dd #$2c
 | 
						|
 #$11 #$d0 #$30 #$4f #$18 #$69 #$03 #$90 #$01 #$c8 #$a2 #$ff #$86 #$d9 #$9a #$85
 | 
						|
 #$de #$84 #$df #$20 #$79 #$e6 #$24 #$d9 #$10 #$49 #$18 #$a0 #$00 #$a5 #$dc #$71
 | 
						|
 #$dc #$a4 #$dd #$90 #$01 #$c8 #$c5 #$4c #$d0 #$d1 #$c4 #$4d #$d0 #$cd #$a0 #$34
 | 
						|
 #$46 #$d9 #$4c #$e0 #$e3 #$a0 #$4a #$a5 #$84 #$f0 #$f7 #$c6 #$84 #$a8 #$b9 #$0f
 | 
						|
 #$11 #$85 #$dc #$b9 #$17 #$11 #$85 #$dd #$be #$87 #$00 #$b9 #$07 #$11 #$a8 #$8a
 | 
						|
 #$4c #$7a #$e8 #$a0 #$63 #$20 #$c4 #$e3 #$a0 #$01 #$b1 #$dc #$aa #$c8 #$b1 #$dc
 | 
						|
 #$20 #$1b #$e5 #$4c #$b3 #$e2 #$c6 #$83 #$a0 #$5b #$a5 #$83 #$f0 #$c4 #$a8 #$b5
 | 
						|
 #$50 #$d9 #$ff #$11 #$d0 #$f0 #$b5 #$88 #$d9 #$07 #$12 #$d0 #$e9 #$b9 #$0f #$12
 | 
						|
 #$85 #$da #$b9 #$17 #$12 #$85 #$db #$20 #$15 #$e7 #$ca #$20 #$93 #$e7 #$20 #$01
 | 
						|
 | 
						|
*=$e900
 | 
						|
 #$e8 #$ca #$a4 #$83 #$b9 #$47 #$12 #$95 #$a7 #$b9 #$3f #$12 #$a0 #$00 #$20 #$08
 | 
						|
 #$e7 #$20 #$82 #$e7 #$20 #$59 #$e7 #$20 #$15 #$e7 #$a4 #$83 #$a5 #$ce #$f0 #$05
 | 
						|
 #$59 #$17 #$12 #$10 #$12 #$b9 #$1f #$12 #$85 #$dc #$b9 #$27 #$12 #$85 #$dd #$be
 | 
						|
 #$2f #$12 #$b9 #$37 #$12 #$d0 #$87 #$c6 #$83 #$60 #$a0 #$54 #$a5 #$83 #$c9 #$08
 | 
						|
 #$f0 #$9a #$e6 #$83 #$a8 #$b5 #$50 #$99 #$00 #$12 #$b5 #$88 #$99 #$08 #$12 #$60
 | 
						|
 #$20 #$15 #$e7 #$a4 #$83 #$a5 #$ce #$99 #$3f #$12 #$a5 #$cf #$99 #$47 #$12 #$a9
 | 
						|
 #$01 #$99 #$0f #$12 #$a9 #$00 #$99 #$17 #$12 #$a5 #$dc #$99 #$1f #$12 #$a5 #$dd
 | 
						|
 #$99 #$27 #$12 #$a5 #$de #$99 #$2f #$12 #$a5 #$df #$99 #$37 #$12 #$60 #$20 #$15
 | 
						|
 #$e7 #$a4 #$83 #$a5 #$ce #$99 #$0f #$12 #$a5 #$cf #$4c #$66 #$e9 #$00 #$00 #$00
 | 
						|
 #$00 #$00 #$00 #$00 #$00 #$00 #$00 #$00 #$00 #$00 #$00 #$ab #$03 #$03 #$03 #$03
 | 
						|
 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$3f #$3f #$c0 #$c0 #$3c #$3c
 | 
						|
 #$3c #$3c #$3c #$3c #$3c #$30 #$0f #$c0 #$cc #$ff #$55 #$00 #$ab #$ab #$03 #$03
 | 
						|
 #$ff #$ff #$55 #$ff #$ff #$55 #$cf #$cf #$cf #$cf #$cf #$ff #$55 #$c3 #$c3 #$c3
 | 
						|
 #$55 #$f0 #$f0 #$cf #$56 #$56 #$56 #$55 #$ff #$ff #$55 #$03 #$03 #$03 #$03 #$03
 | 
						|
 #$03 #$03 #$ff #$ff #$ff #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$03
 | 
						|
 #$03 #$03 #$03 #$03 #$03 #$00 #$ab #$03 #$57 #$03 #$03 #$03 #$03 #$07 #$03 #$03
 | 
						|
 | 
						|
*=$ea00
 | 
						|
 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$03 #$aa #$ff #$ff #$ff #$ff #$ff
 | 
						|
 #$17 #$ff #$ff #$19 #$5d #$35 #$4b #$f2 #$ec #$87 #$6f #$ad #$b7 #$e2 #$f8 #$54
 | 
						|
 #$80 #$96 #$85 #$82 #$22 #$10 #$33 #$4a #$13 #$06 #$0b #$4a #$01 #$40 #$47 #$7a
 | 
						|
 #$00 #$ff #$23 #$09 #$5b #$16 #$b6 #$cb #$ff #$ff #$fb #$ff #$ff #$24 #$f6 #$4e
 | 
						|
 #$59 #$50 #$00 #$ff #$23 #$a3 #$6f #$36 #$23 #$d7 #$1c #$22 #$c2 #$ae #$ba #$23
 | 
						|
 #$ff #$ff #$21 #$30 #$1e #$03 #$c4 #$20 #$00 #$c1 #$ff #$ff #$ff #$a0 #$30 #$1e
 | 
						|
 #$a4 #$d3 #$b6 #$bc #$aa #$3a #$01 #$50 #$7e #$d8 #$d8 #$a5 #$3c #$ff #$16 #$5b
 | 
						|
 #$28 #$03 #$c4 #$1d #$00 #$0c #$4e #$00 #$3e #$00 #$a6 #$b0 #$00 #$bc #$c6 #$57
 | 
						|
 #$8c #$01 #$27 #$ff #$ff #$ff #$ff #$ff #$e8 #$ff #$ff #$e8 #$e0 #$e0 #$e0 #$ef
 | 
						|
 #$ef #$e3 #$e3 #$e5 #$e5 #$e7 #$e7 #$ee #$ef #$ef #$e7 #$e7 #$e2 #$ef #$e7 #$e7
 | 
						|
 #$ec #$ec #$ec #$e7 #$ec #$ec #$ec #$e2 #$00 #$ff #$e8 #$e1 #$e8 #$e8 #$ef #$eb
 | 
						|
 #$ff #$ff #$e0 #$ff #$ff #$ef #$ee #$ef #$e7 #$e7 #$00 #$ff #$e8 #$e7 #$e7 #$e7
 | 
						|
 #$e8 #$e1 #$e2 #$ee #$ee #$ee #$ee #$e8 #$ff #$ff #$e1 #$e1 #$ef #$ee #$e7 #$e8
 | 
						|
 #$ee #$e7 #$ff #$ff #$ff #$ee #$e1 #$ef #$e7 #$e8 #$ef #$ef #$eb #$e9 #$e8 #$e9
 | 
						|
 #$e9 #$e8 #$e8 #$e8 #$e8 #$ff #$e8 #$e8 #$e8 #$ee #$e7 #$e8 #$ef #$ef #$ee #$ef
 | 
						|
 #$ee #$ef #$ee #$ee #$ef #$ee #$ee #$ee #$e1 #$e8 #$e8 #$ff #$ff #$ff #$ff #$ff
 | 
						|
 | 
						|
*=$eb00
 | 
						|
 #$be #$b3 #$b2 #$b7 #$b6 #$37 #$d4 #$cf #$cf #$a0 #$cc #$cf #$ce #$47 #$d3 #$d9
 | 
						|
 #$ce #$d4 #$c1 #$58 #$cd #$c5 #$cd #$a0 #$c6 #$d5 #$cc #$4c #$d4 #$cf #$cf #$a0
 | 
						|
 #$cd #$c1 #$ce #$d9 #$a0 #$d0 #$c1 #$d2 #$c5 #$ce #$53 #$d3 #$d4 #$d2 #$c9 #$ce
 | 
						|
 #$47 #$ce #$cf #$a0 #$c5 #$ce #$44 #$c2 #$c1 #$c4 #$a0 #$c2 #$d2 #$c1 #$ce #$c3
 | 
						|
 #$48 #$be #$b8 #$a0 #$c7 #$cf #$d3 #$d5 #$c2 #$53 #$c2 #$c1 #$c4 #$a0 #$d2 #$c5
 | 
						|
 #$d4 #$d5 #$d2 #$4e #$be #$b8 #$a0 #$c6 #$cf #$d2 #$53 #$c2 #$c1 #$c4 #$a0 #$ce
 | 
						|
 #$c5 #$d8 #$54 #$d3 #$d4 #$cf #$d0 #$d0 #$c5 #$c4 #$a0 #$c1 #$d4 #$20 #$aa #$aa
 | 
						|
 #$aa #$20 #$a0 #$c5 #$d2 #$d2 #$0d #$be #$b2 #$b5 #$35 #$d2 #$c1 #$ce #$c7 #$45
 | 
						|
 #$c4 #$c9 #$4d #$d3 #$d4 #$d2 #$a0 #$cf #$d6 #$c6 #$4c #$dc #$0d #$d2 #$c5 #$d4
 | 
						|
 #$d9 #$d0 #$c5 #$a0 #$cc #$c9 #$ce #$c5 #$8d #$3f #$46 #$d9 #$90 #$03 #$4c #$c3
 | 
						|
 #$e8 #$a6 #$cf #$9a #$a6 #$ce #$a0 #$8d #$d0 #$02 #$a0 #$99 #$20 #$c4 #$e3 #$86
 | 
						|
 #$ce #$ba #$86 #$cf #$a0 #$fe #$84 #$d9 #$c8 #$84 #$c8 #$20 #$99 #$e2 #$84 #$e9
 | 
						|
 #$a2 #$18 #$a9 #$30 #$20 #$91 #$e4 #$e6 #$d9 #$a6 #$ce #$a4 #$c8 #$0a #$85 #$ce
 | 
						|
 #$c8 #$b9 #$00 #$02 #$c9 #$74 #$f0 #$d2 #$49 #$b0 #$c9 #$0a #$b0 #$f0 #$c8 #$c8
 | 
						|
 #$84 #$c8 #$b9 #$00 #$02 #$48 #$b9 #$ff #$01 #$a0 #$00 #$20 #$08 #$e7 #$68 #$95
 | 
						|
 #$a8 #$a5 #$ce #$c9 #$c7 #$d0 #$03 #$20 #$6f #$e7 #$4c #$01 #$e8 #$ff #$ff #$ff
 | 
						|
 | 
						|
*=$ec00
 | 
						|
 #$50 #$20 #$13 #$ec #$d0 #$15 #$20 #$0b #$ec #$d0 #$10 #$20 #$82 #$e7 #$20 #$6f
 | 
						|
 #$e7 #$50 #$03 #$20 #$82 #$e7 #$20 #$59 #$e7 #$56 #$50 #$4c #$36 #$e7 #$ff #$ff
 | 
						|
 #$c1 #$ff #$7f #$d1 #$cc #$c7 #$cf #$ce #$c5 #$9a #$98 #$8b #$96 #$95 #$93 #$bf
 | 
						|
 #$b2 #$32 #$2d #$2b #$bc #$b0 #$ac #$be #$35 #$8e #$61 #$ff #$ff #$ff #$dd #$fb
 | 
						|
 #$20 #$c9 #$ef #$15 #$4f #$10 #$05 #$20 #$c9 #$ef #$35 #$4f #$95 #$50 #$10 #$cb
 | 
						|
 #$4c #$c9 #$ef #$40 #$60 #$8d #$60 #$8b #$00 #$7e #$8c #$33 #$00 #$00 #$60 #$03
 | 
						|
 #$bf #$12 #$00 #$40 #$89 #$c9 #$47 #$9d #$17 #$68 #$9d #$0a #$00 #$40 #$60 #$8d
 | 
						|
 #$60 #$8b #$00 #$7e #$8c #$3c #$00 #$00 #$60 #$03 #$bf #$1b #$4b #$67 #$b4 #$a1
 | 
						|
 #$07 #$8c #$07 #$ae #$a9 #$ac #$a8 #$67 #$8c #$07 #$b4 #$af #$ac #$b0 #$67 #$9d
 | 
						|
 #$b2 #$af #$ac #$af #$a3 #$67 #$8c #$07 #$a5 #$ab #$af #$b0 #$f4 #$ae #$a9 #$b2
 | 
						|
 #$b0 #$7f #$0e #$27 #$b4 #$ae #$a9 #$b2 #$b0 #$7f #$0e #$28 #$b4 #$ae #$a9 #$b2
 | 
						|
 #$b0 #$64 #$07 #$a6 #$a9 #$67 #$af #$b4 #$af #$a7 #$78 #$b4 #$a5 #$ac #$78 #$7f
 | 
						|
 #$02 #$ad #$a5 #$b2 #$67 #$a2 #$b5 #$b3 #$af #$a7 #$ee #$b2 #$b5 #$b4 #$a5 #$b2
 | 
						|
 #$7e #$8c #$39 #$b4 #$b8 #$a5 #$ae #$67 #$b0 #$a5 #$b4 #$b3 #$27 #$af #$b4 #$07
 | 
						|
 #$9d #$19 #$b2 #$af #$a6 #$7f #$05 #$37 #$b4 #$b5 #$b0 #$ae #$a9 #$7f #$05 #$28
 | 
						|
 #$b4 #$b5 #$b0 #$ae #$a9 #$7f #$05 #$2a #$b4 #$b5 #$b0 #$ae #$a9 #$e4 #$ae #$a5
 | 
						|
 | 
						|
*=$ed00
 | 
						|
 #$00 #$ff #$ff #$47 #$a2 #$a1 #$b4 #$7f #$0d #$30 #$ad #$a9 #$a4 #$7f #$0d #$23
 | 
						|
 #$ad #$a9 #$a4 #$67 #$ac #$ac #$a1 #$a3 #$00 #$40 #$80 #$c0 #$c1 #$80 #$00 #$47
 | 
						|
 #$8c #$68 #$8c #$db #$67 #$9b #$68 #$9b #$50 #$8c #$63 #$8c #$7f #$01 #$51 #$07
 | 
						|
 #$88 #$29 #$84 #$80 #$c4 #$80 #$57 #$71 #$07 #$88 #$14 #$ed #$a5 #$ad #$af #$ac
 | 
						|
 #$ed #$a5 #$ad #$a9 #$a8 #$f2 #$af #$ac #$af #$a3 #$71 #$08 #$88 #$ae #$a5 #$ac
 | 
						|
 #$68 #$83 #$08 #$68 #$9d #$08 #$71 #$07 #$88 #$60 #$76 #$b4 #$af #$ae #$76 #$8d
 | 
						|
 #$76 #$8b #$51 #$07 #$88 #$19 #$b8 #$a4 #$ae #$b2 #$f2 #$b3 #$b5 #$f3 #$a2 #$a1
 | 
						|
 #$ee #$a7 #$b3 #$e4 #$ae #$b2 #$eb #$a5 #$a5 #$b0 #$51 #$07 #$88 #$39 #$81 #$c1
 | 
						|
 #$4f #$7f #$0f #$2f #$00 #$51 #$06 #$88 #$29 #$c2 #$0c #$82 #$57 #$8c #$6a #$8c
 | 
						|
 #$42 #$ae #$a5 #$a8 #$b4 #$60 #$ae #$a5 #$a8 #$b4 #$4f #$7e #$1e #$35 #$8c #$27
 | 
						|
 #$51 #$07 #$88 #$09 #$8b #$fe #$e4 #$af #$ad #$f2 #$af #$e4 #$ae #$a1 #$dc #$de
 | 
						|
 #$9c #$dd #$9c #$de #$dd #$9e #$c3 #$dd #$cf #$ca #$cd #$cb #$00 #$47 #$9d #$ad
 | 
						|
 #$a5 #$ad #$af #$ac #$76 #$9d #$ad #$a5 #$ad #$a9 #$a8 #$e6 #$a6 #$af #$60 #$8c
 | 
						|
 #$20 #$af #$b4 #$b5 #$a1 #$f2 #$ac #$a3 #$f2 #$a3 #$b3 #$60 #$8c #$20 #$ac #$a5
 | 
						|
 #$a4 #$ee #$b5 #$b2 #$60 #$ae #$b5 #$b2 #$f4 #$b3 #$a9 #$ac #$60 #$8c #$20 #$b4
 | 
						|
 #$b3 #$a9 #$ac #$7a #$7e #$9a #$22 #$20 #$00 #$60 #$03 #$bf #$60 #$03 #$bf #$1f
 | 
						|
 | 
						|
*=$ee00
 | 
						|
 #$20 #$b1 #$e7 #$e8 #$e8 #$b5 #$4f #$85 #$da #$b5 #$87 #$85 #$db #$b4 #$4e #$98
 | 
						|
 #$d5 #$86 #$b0 #$09 #$b1 #$da #$20 #$c9 #$e3 #$c8 #$4c #$0f #$ee #$a9 #$ff #$85
 | 
						|
 #$d5 #$60 #$e8 #$a9 #$00 #$95 #$88 #$95 #$a8 #$b5 #$87 #$38 #$f5 #$4f #$95 #$50
 | 
						|
 #$4c #$23 #$e8 #$ff #$20 #$15 #$e7 #$a5 #$cf #$d0 #$28 #$a5 #$ce #$60 #$20 #$34
 | 
						|
 #$ee #$a4 #$c8 #$c9 #$30 #$b0 #$21 #$c0 #$28 #$b0 #$1d #$60 #$ea #$ea #$20 #$34
 | 
						|
 #$ee #$60 #$ea #$8a #$a2 #$01 #$b4 #$ce #$94 #$4c #$b4 #$48 #$94 #$ca #$ca #$f0
 | 
						|
 #$f5 #$aa #$60 #$a0 #$77 #$4c #$e0 #$e3 #$a0 #$7b #$d0 #$f9 #$20 #$54 #$e2 #$a5
 | 
						|
 #$da #$d0 #$07 #$a5 #$db #$d0 #$03 #$4c #$7e #$e7 #$06 #$ce #$26 #$cf #$26 #$46
 | 
						|
 #$26 #$47 #$a5 #$46 #$c5 #$da #$a5 #$47 #$e5 #$db #$90 #$0a #$85 #$47 #$a5 #$46
 | 
						|
 #$e5 #$da #$85 #$46 #$e6 #$ce #$88 #$d0 #$e1 #$60 #$ff #$ff #$ff #$ff #$ff #$ff
 | 
						|
 #$20 #$15 #$e7 #$6c #$ce #$00 #$a5 #$4c #$d0 #$02 #$c6 #$4d #$c6 #$4c #$a5 #$48
 | 
						|
 #$d0 #$02 #$c6 #$49 #$c6 #$48 #$a0 #$00 #$b1 #$4c #$91 #$48 #$a5 #$ca #$c5 #$4c
 | 
						|
 #$a5 #$cb #$e5 #$4d #$90 #$e0 #$4c #$53 #$ee #$c9 #$28 #$b0 #$9b #$a8 #$a5 #$c8
 | 
						|
 #$60 #$ea #$ea #$98 #$aa #$a0 #$6e #$20 #$c4 #$e3 #$8a #$a8 #$20 #$c4 #$e3 #$a0
 | 
						|
 #$72 #$4c #$c4 #$e3 #$20 #$15 #$e7 #$06 #$ce #$26 #$cf #$30 #$fa #$b0 #$dc #$d0
 | 
						|
 #$04 #$c5 #$ce #$b0 #$d6 #$60 #$20 #$15 #$e7 #$b1 #$ce #$94 #$a7 #$4c #$08 #$e7
 | 
						|
 | 
						|
*=$ef00
 | 
						|
 #$20 #$34 #$ee #$a5 #$ce #$48 #$20 #$15 #$e7 #$68 #$91 #$ce #$60 #$ff #$ff #$ff
 | 
						|
 #$20 #$6c #$ee #$a5 #$ce #$85 #$46 #$a5 #$cf #$85 #$47 #$4c #$44 #$e2 #$20 #$e4
 | 
						|
 #$ee #$4c #$34 #$e1 #$20 #$e4 #$ee #$b4 #$88 #$b5 #$50 #$69 #$fe #$b0 #$01 #$88
 | 
						|
 #$85 #$da #$84 #$db #$18 #$65 #$ce #$95 #$50 #$98 #$65 #$cf #$95 #$88 #$a0 #$00
 | 
						|
 #$b5 #$50 #$d1 #$da #$c8 #$b5 #$88 #$f1 #$da #$b0 #$80 #$4c #$23 #$e8 #$20 #$15
 | 
						|
 #$e7 #$a5 #$4e #$20 #$08 #$e7 #$a5 #$4f #$d0 #$04 #$c5 #$4e #$69 #$00 #$29 #$7f
 | 
						|
 #$85 #$4f #$95 #$a8 #$a0 #$11 #$a5 #$4f #$0a #$18 #$69 #$40 #$0a #$26 #$4e #$26
 | 
						|
 #$4f #$88 #$d0 #$f2 #$a5 #$ce #$20 #$08 #$e7 #$a5 #$cf #$95 #$a8 #$4c #$7a #$e2
 | 
						|
 #$20 #$15 #$e7 #$a4 #$ce #$c4 #$4c #$a5 #$cf #$e5 #$4d #$90 #$1f #$84 #$48 #$a5
 | 
						|
 #$cf #$85 #$49 #$4c #$b6 #$ee #$20 #$15 #$e7 #$a4 #$ce #$c4 #$ca #$a5 #$cf #$e5
 | 
						|
 #$cb #$b0 #$09 #$84 #$4a #$a5 #$cf #$85 #$4b #$4c #$b7 #$e5 #$4c #$cb #$ee #$ea
 | 
						|
 #$ea #$ea #$ea #$20 #$c9 #$ef #$20 #$71 #$e1 #$4c #$bf #$ef #$20 #$03 #$ee #$a9
 | 
						|
 #$ff #$85 #$c8 #$a9 #$74 #$8d #$00 #$02 #$60 #$20 #$36 #$e7 #$e8 #$20 #$36 #$e7
 | 
						|
 #$b5 #$50 #$60 #$a9 #$00 #$85 #$4a #$85 #$4c #$a9 #$08 #$85 #$4b #$a9 #$10 #$85
 | 
						|
 #$4d #$4c #$ad #$e5 #$d5 #$88 #$d0 #$01 #$18 #$4c #$02 #$e1 #$20 #$b7 #$e5 #$4c
 | 
						|
 #$36 #$e8 #$20 #$b7 #$e5 #$4c #$5b #$e8 #$e0 #$80 #$d0 #$01 #$88 #$4c #$0c #$e0
 | 
						|
{ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^   Insert BASIC image here   ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ }
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|       WozMon                                                          |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 | 
						|
*=$ff00
 | 
						|
 | 
						|
        { Original ZP usage is 24.2B, but that's taken by Gigatron }
 | 
						|
 | 
						|
   _XAML=$38        _XAML_minus1=$37
 | 
						|
   _XAMH=$39
 | 
						|
    _STL=$3A         _STL_minus1=$39
 | 
						|
    _STH=$3B
 | 
						|
      _L=$3C           _L_minus1=$3B
 | 
						|
      _H=$3D
 | 
						|
   _YSAV=$3E
 | 
						|
   _MODE=$3F
 | 
						|
 | 
						|
       { Patches with respect to original are marked [Gigatron] }
 | 
						|
 | 
						|
     _IN=$200
 | 
						|
 | 
						|
       _KBD=$D010
 | 
						|
     _KBDCR=$D011
 | 
						|
       _DSP=$D012
 | 
						|
     _DSPCR=$D013
 | 
						|
 | 
						|
_RESET=*        #_CLD_                  {Clear decimal arithmetic mode.          }
 | 
						|
                #_CLI_
 | 
						|
                #_LDYIM_ #$7F           {Mask for DSP data direction register.   }
 | 
						|
                #_STY_   ##_DSP
 | 
						|
                #_LDAIM_ #$A7           {KBD and DSP control register mask.      }
 | 
						|
                #_STA_   ##_KBDCR
 | 
						|
                #_STA_   ##_DSPCR
 | 
						|
_NOTCR=*        #_CMPIM_ #$DF           {"<-"?                                   }
 | 
						|
                #_BEQ_   #@_BACKSPACE   {Yes.                                    }
 | 
						|
                #_CMPIM_ #$9B           {ESC?                                    }
 | 
						|
                #_BEQ_   #@_ESCAPE      {Yes.                                    }
 | 
						|
                #_INY_                  {Advance text index.                     }
 | 
						|
                #_BPL_   #@_NEXTCHAR    {Auto ESC if > 127.                      }
 | 
						|
_ESCAPE=*       #_LDAIM_ #$DC           {"\".                                    }
 | 
						|
                #_JSR_   ##_ECHO        {Output it.                              }
 | 
						|
_GETLINE=*      #_LDAIM_ #$8D           {CR.                                     }
 | 
						|
                #_JSR_   ##_ECHO        {Output it.                              }
 | 
						|
                #_LDYIM_ #$01           {Initiallize text index.                 }
 | 
						|
_BACKSPACE=*    #_DEY_                  {Back up text index.                     }
 | 
						|
                #_BMI_   #@_GETLINE     {Beyond start of line, reinitialize.     }
 | 
						|
_NEXTCHAR=*     #_LDA_   ##_KBDCR       {Key ready?                              }
 | 
						|
                #_BPL_   #@_NEXTCHAR    {Loop until ready.                       }
 | 
						|
                #_LDA_   ##_KBD         {Load character. B7 should be '1'.       }
 | 
						|
                #_STAAY_ ##_IN          {Add to text buffer.                     }
 | 
						|
                #_JSR_   ##_ECHO        {Display character.                      }
 | 
						|
                #_CMPIM_ #$8D           {CR?                                     }
 | 
						|
                #_BNE_   #@_NOTCR       {No.                                     }
 | 
						|
                #_LDYIM_ #$FF           {Reset text index.                       }
 | 
						|
                #_LDAIM_ #$00           {For XAM mode.                           }
 | 
						|
                #_TAX_                  {0->X.                                   }
 | 
						|
_SETSTOR=*      #_ASLA_                 {Leaves $7B if setting STOR mode.        }
 | 
						|
_SETMODE=*      #_STAZ_  #_MODE         {$00 = XAM, $7B= STOR,$AE= BLOK XAM      }
 | 
						|
_BLSKIP=*       #_INY_                  {Advance text index.                     }
 | 
						|
_NEXTITEM=*     #_LDAAY_ ##_IN          {Get character.                          }
 | 
						|
                #_CMPIM_ #$8D           {CR?                                     }
 | 
						|
                #_BEQ_   #@_GETLINE     {Yes, done this line.                    }
 | 
						|
                #_CMPIM_ #$AE           {"."?                                    }
 | 
						|
                #_BCC_   #@_BLSKIP      {Skip delimiter.                         }
 | 
						|
                #_BEQ_   #@_SETMODE     {Yes, BLOCK XAM mode.                    }
 | 
						|
                #_CMPIM_ #$BA           {":"?                                    }
 | 
						|
                #_BEQ_   #@_SETSTOR     {Yes, set STOR mode.                     }
 | 
						|
                #_CMPIM_ #$D2           {"R"?                                    }
 | 
						|
                #_BEQ_   #@_RUN         {Yes, run user program.                  }
 | 
						|
                #_STXZ_  #_L            {$00->L.                                 }
 | 
						|
                #_STXZ_  #_H            { and H.                                 }
 | 
						|
                #_STYZ_  #_YSAV         {Save Y for comparison.                  }
 | 
						|
_NEXTHEX=*      #_LDAAY_ ##_IN          {Get character for hex test.             }
 | 
						|
                #_EORIM_ #$B0           {Map digits to $0-9.                     }
 | 
						|
                #_CMPIM_ #$0A           {Digit?                                  }
 | 
						|
                #_BCC_   #@_DIG         {Yes.                                    }
 | 
						|
                #_ADCIM_ #$88           {Map letter "A"-"F" to $FA-FF.           }
 | 
						|
                #_CMPIM_ #$FA           {Hex letter?                             }
 | 
						|
                #_BCC_   #@_NOTHEX      {No, character not hex.                  }
 | 
						|
_DIG=*          #_ASLA_                 {                                        }
 | 
						|
                #_ASLA_                 {Hex digit to MSD of A.                  }
 | 
						|
                #_ASLA_                 {                                        }
 | 
						|
                #_ASLA_                 {                                        }
 | 
						|
                #_LDXIM_ #$04           {Shift count.                            }
 | 
						|
_HEXSHIFT=*     #_ASLA_                 {Hex digit left, MSB to carry.           }
 | 
						|
                #_ROLZ_  #_L            {Rotate into LSD.                        }
 | 
						|
                #_ROLZ_  #_H            {Rotate into MSD's.                      }
 | 
						|
                #_DEX_                  {Done 4 shifts?                          }
 | 
						|
                #_BNE_   #@_HEXSHIFT    {No, loop.                               }
 | 
						|
                #_INY_                  {Advance text index.                     }
 | 
						|
                #_BNE_   #@_NEXTHEX     {Always taken. Check next character for hex.}
 | 
						|
_NOTHEX=*       #_CPYZ_  #_YSAV         {Check if L, H empty (no hex digits).    }
 | 
						|
                #_BEQ_   #@_ESCAPE      {Yes, generate  ESC sequence.            }
 | 
						|
                #_BITZ_  #_MODE         {Test MODE byte.                         }
 | 
						|
                #_BVC_   #@_NOTSTOR     {B6 = 0 for STOR, 1 for XAM and BLOCK XAM}
 | 
						|
                #_LDAZ_  #_L            {LSD's of hex data.                      }
 | 
						|
                #_STAIX_ #_STL          {Store at current 'store index'.         }
 | 
						|
                #_INCZ_  #_STL          {Increment store index.                  }
 | 
						|
                #_BNE_   #@_NEXTITEM    {Get next item. (no carry).              }
 | 
						|
                #_INCZ_  #_STH          {Add carry to 'store index' high order.  }
 | 
						|
_TONEXTITEM=*   #_JMP_   ##_NEXTITEM    {Get next command item.                  }
 | 
						|
_RUN=*          #_JMI_   ##_XAML        {Run at current XAM index.               }
 | 
						|
_NOTSTOR=*      #_BMI_   #@_XAMNEXT     {B7 = 0 for XAM, 1 for BLOCK XAM.        }
 | 
						|
                #_LDXIM_ #$02           {Byte count.                             }
 | 
						|
_SETADR=*       #_LDAZX_ #_L_minus1     {Copy hex data to                        }
 | 
						|
                #_STAZX_ #_STL_minus1   {  'store index'.                        }
 | 
						|
                #_STAZX_ #_XAML_minus1  {And to 'XAM index'.                     }
 | 
						|
                #_DEX_                  {Next of 2 bytes.                        }
 | 
						|
                #_BNE_   #@_SETADR      {Loop unless X = 0.                      }
 | 
						|
_NXTPRNT=*      #_BNE_   #@_PRDATA      {NE means no address to print.           }
 | 
						|
                #_LDAIM_ #$8D           {CR.                                     }
 | 
						|
                #_JSR_   ##_ECHO        {Output it.                              }
 | 
						|
                #_LDAZ_  #_XAMH         {'Examine index' high-order byte.        }
 | 
						|
                #_JSR_   ##_PRBYTE      {Output it in hex format.                }
 | 
						|
                #_LDAZ_  #_XAML         {Low-order 'examine index' byte.         }
 | 
						|
                #_JSR_   ##_PRBYTE      {Output it in hex format.                }
 | 
						|
                #_LDAIM_ #$BA           {":".                                    }
 | 
						|
                #_JSR_   ##_ECHO        {Output it.                              }
 | 
						|
_PRDATA=*       #_LDAIM_ #$A0           {Blank.                                  }
 | 
						|
                #_JSR_   ##_ECHO        {Output it.                              }
 | 
						|
                #_LDAIX_ #_XAML         {Get data byte at 'examine index'.       }
 | 
						|
                #_JSR_   ##_PRBYTE      {Output it in hex format.                }
 | 
						|
_XAMNEXT=*      #_STXZ_  #_MODE         {0->MODE (XAM mode).                     }
 | 
						|
                #_LDAZ_  #_XAML         {                                        }
 | 
						|
                #_CMPZ_  #_L            {Compare 'examine index' to hex data.    }
 | 
						|
                #_LDAZ_  #_XAMH         {                                        }
 | 
						|
                #_SBCZ_  #_H            {                                        }
 | 
						|
                #_BCS_   #@_TONEXTITEM  {Not less, so no more data to output.    }
 | 
						|
                #_INCZ_  #_XAML         {                                        }
 | 
						|
                #_BNE_   #@_MOD8CHK     {Increment 'examine index'.              }
 | 
						|
                #_INCZ_  #_XAMH         {                                        }
 | 
						|
_MOD8CHK=*      #_LDAZ_  #_XAML         {Check low-order 'examine index' byte    }
 | 
						|
                #_ANDIM_ #$07           {  For MOD 8= 0                          }
 | 
						|
                #_BPL_   #@_NXTPRNT     {Always taken.                           }
 | 
						|
_PRBYTE=*       #_PHA_                  {Save A for LSD.                         }
 | 
						|
                #_LSRA_                 {                                        }
 | 
						|
                #_LSRA_                 {                                        }
 | 
						|
                #_LSRA_                 {MSD to LSD position.                    }
 | 
						|
                #_LSRA_                 {                                        }
 | 
						|
                #_JSR_   ##_PRHEX       {Output hex digit.                       }
 | 
						|
                #_PLA_                  {Restore A.                              }
 | 
						|
_PRHEX=*        #_ANDIM_ #$0F           {Mask LSD for hex print.                 }
 | 
						|
                #_ORAIM_ #$B0           {Add "0".                                }
 | 
						|
                #_CMPIM_ #$BA           {Digit?                                  }
 | 
						|
                #_BCC_   #@_ECHO        {Yes, output it.                         }
 | 
						|
                #_ADCIM_ #$06           {Add offset for letter.                  }
 | 
						|
                                        {[Gigatron] Order reversed for fake PIA: }
 | 
						|
_ECHO=*         #_STA_   ##_DSP         {Output character.  Sets DA.             }
 | 
						|
_WAITECHO=*     #_BIT_   ##_DSP         {DA bit (B7) cleared yet?                }
 | 
						|
                #_BNE_   #@_WAITECHO    {No, wait for display.                   }
 | 
						|
                #_RTS_                  {Return.                                 }
 | 
						|
                #$00 #$00               {(unused)                                }
 | 
						|
{FFFA}          ##$0000                 {(NMI)                                   }
 | 
						|
{FFFC}          ##_RESET                {(RESET)                                 }
 | 
						|
{FFFE}          ##_BREAK                {(IRQ/BRK)                               }
 | 
						|
 | 
						|
{-----------------------------------------------------------------------+
 | 
						|
|                                                                       |
 | 
						|
+-----------------------------------------------------------------------}
 | 
						|
 |