Apple II+: Mini-Assembler (2 of 2)

The attached listing is a relocated version of the mini-assembler for the Apple II+ with instructions for the Apple II version. This version can be BRUN from the disk or BLOADed and start with CALL 2048 from Applesoft.
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

Published Date: Feb 20, 2012