0800: ORG $800
0800: 20 4B D6 JSR NEW ;SCRATCH ANY BASIC PROGRAM
0803: A9 00 LDA #$00
0805: 8D 00 08 STA #$0800
0808: 4C 9D 08 JMP RESETZ ;BRANCH MINI/ASSEM'S START
080B: E9 81 REL SBC #$81 ;IS FMT COMPATIBLE
080D: 4A LSR A ;WITH RELATIVE MODE?
080E: DO 14 BNE ERR3 ;NO.
0810: A4 3F LDY A2H
0812: A6 3E LDX A2L ;DOUBLE DECREMENT
0814: DO 01 BNE REL2
0816: 88 DEY
0817: CA REL2 DEX
0818: 8A TXA
0819: 18 CLC
081A: E5 3A SBC PCL ;FORM ADDRESS PC-2
081C: 85 3E STA A2L
081E: 10 01 BPL REL3
0820: C8 INY
0821: 98 REL3 TYA
0822: E5 3B SBC PCH
0824: D0 6B ERR3 BNE ERR ;TOO FAR TO BRANCH ERROR
0826: *
0826: A4 2F FINDOP LDY LENGTH
0828: B9 3D 00 FNDOP2 LDA A1H,Y ;MOVE INST TO (PC)
082B: 91 3A STA (PCL),Y
082D: 88 DEY
082E: 10 F8 BPL FNDOP2
0830: 20 1A FC JSR CURSUP
0833: 20 1A FC JSR CURSUP ;RESTORE CURSOR
0836: 20 DO F8 JSR INSTDSP ;TYPE FORMATTED LINE
0839: 20 53 F9 JSR PCADJ ;UPDATE PC
083C: 84 3B STY PCH
083E: 85 3A STA PCL
0840: 4C A0 08 JMP NXTLINE ;GET NEXT LINE
0843: 20 BE FF FKMON3 JSR TOSVB ;GO TO DELIM HANDLER
0846: A4 34 LDY YSAV ;RESTORE Y-INDEX
0848: 20 A7 FF FKMON JSR GETNUM ;READ PARAM
084B: 84 34 STY YSAV ;SAVE Y-INDEX
084D: A0 17 LDY #$17 ;INIT DELIM INDEX
084F: 88 FKMON2 DEY ;CHECK NEXT DELIM
0850: 30 4B BMI RESETZ ;ERR IF UNRECOGNIZED DELIM
0852: D9 CC FF CMP CHRTBL,Y ;COMPARE WITH DELIM TABLE
0855: D0 F8 BNE FKMON2 ;NO MATCH
0857: CO 15 CPY #$15 ;MATCH, IS IT CR?
0859: D0 E8 BNE FKMON3 ;NO HANDLE IT IN MONITOR
085B: A5 31 LDA MODE
085D: A0 00 LDY #$00
085F: C6 34 DEC YSAV
0861: 20 00 FE JSR BL1 ;HANDLE CR OUTSIDE MONITOR
0864: 4C A0 08 JMP NXTLINE
0867: *
0867: A5 3D TRYNEXT LDA A1H ;GET TRIAL OPCODE
0869: 20 8E F8 JSR INSDS2 ;GET FMT + LENGTH FOR
086C: AA TAX ;OPCODE
086D: BD 00 FA LDA MNEMR,X ;GET LOWER MNEMONIC BYTE
0870: C5 42 CMP A4L ;MATCH?
0872: D0 13 BNE NEXTOP ;NO, TRY NEXT OPCODE
0874: BD CO F9 LDA MNEML, X ;GET UPPER MNEMONIC BYTE
0877: C5 43 CMP A4H ;MATCH ?
0879: DO OC BNE NEXTOP ;NO, TRY NEXT OPCODE
087B: A5 44 LDA FMT
087D: A4 2E LDY FORMAT ;GET TRIAL FORMAT
087F: CO 9D CPY #$9D ;IS TRIAL FORMAT RELATIVE?
0881: FO 88 BEQ REL ;YES
0883: C5 2E CMP FORMAT ;SAME FORMAT?
0885: FO 9F BEQ FINDOP ;YES
0887: C6 3D NEXTOP DEC A1H ;NO, TRY NEXT OPCODE
0889: DO DC BNE TRYNEXT
088B: E6 44 INC FMT ;NO MORE, TRY WITH LEN=2
088D: C6 35 DEC L ;WAS L=2 ALREADY?
088F: FO D6 BEQ TRYNEXT ;NO
0891:
0891: A4 34 ERR LDY YSAV ;YES, UNRECOGNIZED INST.
0893: 98 ERR2 TYA
0894: AA TAX
0895: 20 4A F9 JSR PRBL2 ;PRINT ^ UNDER LAST READ
0898: A9 DE LDA #$DE ;CHAR TO INDICATE ERROR
089A: 20 ED FD JSR COUT ;POSITION
089D: 20 EA FF RESETZ JSR BELL
08AO: A9 A1 NXTLINE LDA #$A1 ; '!'
08A2: 85 33 STA PROMPT ;INITIALIZE PROMPT
08A4: 20 67 FD JSR GETLNZ ;GET LINE
08A7: 20 C7 FF JSR ZMODE ;INIT SCREEN STUFF
08AA: AD 00 02 LDA IN ;GET CHAR
08AD: C9 AO CMP #$AO ;ASCII SPACE?
08AF: FO 13 BEQ SPACE ;YES
08B1: C8 INY
08B2: C9 A4 CMP #$A4 ;ASCII '$' IN COL 1?
08B4: FO 92 BEQ FKMON ;YES,SIMULATE MONITOR
08B6: 88 DEY ;NO, BACKUP A CHAR
08B7: 20 A7 FF JSR GETNUM ;GET A NUMBER
08BA: C9 93 CMP #$93 ;':' TERMINATOR?
08BC: DO D5 ERR4 BNE ERR2 ;NO, ERR
08BE: 8A TXA
08BF: FO D2 BEQ ERR2 ;NO ADDR PRECEDING COLON
08C1: 20 78 FE JSR A1PCLP ;MOVE ADDR TO PCL, PCH
08C4: A9 03 SPACE LDA #$03 ;COUNT OF CHAR IN MNEMONIC
08C6: 85 3D STA A1H
08C8: 20 EF 09 NXTMN JSR GETNSP ;GET 1ST MNEMONIC CHARACTER
08CB: OA ASL A
08CC: E9 BE SBC #$BE ;SUBTRACT OFFSET
08CE: C9 C2 CMP #$C2 ;LEGAL CHARACTER?
08DO: 90 C1 BCC ERR2 ;NO
08D2: OA ASL A ;COMPRESS-LEFT JUSTIFY
08D3: OA ASL A
08D4: A2 04 LDX #$04
08D6: 0A NXTM2 ASL A ;DO 5 TRIPLE WORD SHIFTS
08D7: 26 42 ROL A4L
08D9: 26 43 ROL A4H
08DB: CA DEX
08DC: 10 F8 BPL NXTM2
08DE: C6 3D DEC A1H ;DONE WITH 3 CHAR?
08EO: FO F4 BEQ NXTM2 ;YES BUT DO 1 MORE SHIFT
08E2: 10 E4 BPL NXTMN ;NO
08E4: *
08E4: A2 05 LDX #$05 ;5-CHAR ADDRESSING MODE
0836: 20 3F 09 FORM2 JSR GETNSP ;GET 1ST CHAR OF ADDRESS
08E9: 84 34 STY YSAV
08EB: DD B4 F9 CMP CHAR1,X ;1ST CHAR MATCH PATTERN?
08EE: DO 13 BNE FORM3 ;NO
08FO: 20 3F 09 JSR GETNSP ;YES, GET 2ND CHAR
08F3: DD BA F9 CMP CHAR2,X ;MATCHES SECOND HALF?
08F6: FO ON BEQ FORM5 ;YES
08F8: BD BA F9 LDA CHAR2,X ;NO, IS 2ND HALF ZERO?
08FB: FO 07 BEQ FORM4 ;YES
08FD: C9 A4 CMP #$A4 ;NO 2ND HAL OPTIONAL?
08FF: FO 03 BEQ FORM4 ;YES
0901: A4 34 LDY YSAV
0903: 18 FORM3 CLC ;CLEAR CARRY NO MATCH
0904: 88 FORM4 DEY ;BACK UP ONE CHARACTER
0905: 26 44 FORM5 ROL FMT ;FORM FORMAT BYTE
0907: EO 03 CPX #$03 ;TIME TO CHECK FOR ADDRESS
0909: DO OD BNE FORM7 ;NO
090B: 20 A7 FF JSR GETNUM ;YES
090E: A5 3F LDA A2H
0910: FO 01 BEQ FORM6 ;HIGH ORDER BYTE ZERO
0912: E8 INX ;NO, INCR FOR 2-BYTE
0913: 86 35 FORM6 STX L ;STORE LENGTH
0915: A2 03 LDX #$03 ;RELOAD FORMAT INDEX
0917: 88 DEY ;BACKUP A CHARACTER
0918: 86 3D FORM7 STX A1H ;SAVE INDEX
091A: CA DEX ;DONE WITH FORMAT CHECK?
091B: 10 C9 BPL FORM2 ;NO
091D: A5 44 LDA FMT ;YES PUT LENGTH
091F: OA ASL A ;IN LOW BITS
0920: OA ASL A
0921: 05 35 ORA L
0923: C9 20 CMP #$20
0925: BO 06 BCS FORM8 ;ADD $ IF NONZERO LENGTH
0927: A6 35 LDX L ;AND DON'T ALREADY HAVE IT
0929: FO 02 BEQ FORM8
092B: 09 80 ORA #$80
092D: 85 44 FORM8 STA FMT
092F: 84 34 STY YSAV
0931: B9 00 02 LDA IN,Y ;GET NEXT NONBLANK
0934: C9 BB CMP #$BB ;';' START OF COMMENT
0936: FO 04 BEQ FORM9 ;YES
0938: C9 8D CMP #$8D ;A CARRIAGE RETURN ?
093A: DO 80 BNE ERR4 ;NO, ERR
093C: 4C 67 08 FORM9 JMP TRYNEXT
093F: *
093F: B9 OO 02 GETNSP LDA IN,Y
0942: C8 INY
0943: C9 AO CMP #$AO ;GET NEXT NON BLANK CHAR
0945: FO F8 BEQ GETNSP
0947: 60 RTS