TITLE Apple II+: Mini-Assembler (2 of 2) Article ID: 7 Created: 9/21/84 Modified: 2/25/98 -------------------------------------------------------------------------------- TOPIC 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. -------------------------------------------------------------------------------- DISCUSSION 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