******************************************************************************** * Disassembly of "CHAIN". * * * * This seems to match the program on the DOS 3.3 system master disk. It works * * with Applesoft in RAM or ROM. * ******************************************************************************** MON_CSWL .eq $36 ;character output hook (lo) MON_CSWH .eq $37 ;character output hook (hi) MON_A1L .eq $3c ;general purpose MON_A2L .eq $3e ;general purpose MON_A4L .eq $42 ;general purpose BAS_VARTAB .eq $69 {addr/2} ;pointer to start of Applesoft variables (2b) BAS_ARYTAB .eq $6b {addr/2} ;pointer to start of Applesoft array space (2b) BAS_STREND .eq $6d {addr/2} ;pointer to end of numeric storage (2b) BAS_FRETOP .eq $6f {addr/2} ;pointer to end of string storage (2b) BAS_HIGHDS .eq $94 {addr/2} ;block copy pointer (2b) BAS_HIGHTR .eq $96 {addr/2} ;block copy pointer (2b) BAS_LOWTR .eq $9b {addr/2} ;general pointer (2b) BAS_FAC .eq $9d {addr/6} ;floating point accumulator (6b) BAS_FACSIGN .eq $a2 ;single byte sign of FAC BAS_PRGEND .eq $af {addr/2} ;pointer to end of program (2b) BAS_TXTPTR .eq $b8 {addr/2} ;points at next char or token (2b) BAS_REMSTK .eq $f8 ;stack pointer saved before each statement DOS_CHARIO .eq $03ea ;jumps to routine that connects DOS KSW/CSW MON_MOVE .eq $fe2c ;move bytes from A1 to A4 until A1=A2 MON_SETVID .eq $fe93 ;reset char output handler to ROM .org $0208 0208: 20 85 03 jsr InitCalls ;set up calls into Applesoft 020b: 20 a6 03 jsr GARBAG ;collect garbage before doing work 020e: a9 07 lda #$07 0210: 85 8f sta $8f 0212: a5 69 lda BAS_VARTAB 0214: a6 6a ldx BAS_VARTAB+1 0216: 85 9d sta BAS_FAC 0218: 86 9e stx BAS_FAC+1 021a: e4 6c L021A cpx BAS_ARYTAB+1 021c: d0 04 bne L0222 021e: c5 6b cmp BAS_ARYTAB 0220: f0 05 beq L0227 0222: 20 7e 02 L0222 jsr L027E 0225: f0 f3 beq L021A 0227: 85 9f L0227 sta BAS_FAC+2 0229: 86 a0 stx BAS_FAC+3 022b: a9 03 lda #$03 022d: 85 8f sta $8f 022f: a5 9f L022F lda BAS_FAC+2 0231: a6 a0 ldx BAS_FAC+3 0233: e4 6e L0233 cpx BAS_STREND+1 0235: d0 07 bne L023E 0237: c5 6d cmp BAS_STREND 0239: d0 03 bne L023E 023b: 4c e0 02 jmp L02E0 023e: 85 9d L023E sta BAS_FAC 0240: 86 9e stx BAS_FAC+1 0242: a0 00 ldy #$00 0244: b1 9d lda (BAS_FAC),y 0246: aa tax 0247: c8 iny 0248: b1 9d lda (BAS_FAC),y 024a: 08 php 024b: c8 iny 024c: b1 9d lda (BAS_FAC),y 024e: 65 9f adc BAS_FAC+2 0250: 85 9f sta BAS_FAC+2 0252: c8 iny 0253: b1 9d lda (BAS_FAC),y 0255: 65 a0 adc BAS_FAC+3 0257: 85 a0 sta BAS_FAC+3 0259: 28 plp 025a: 10 d3 bpl L022F 025c: 8a txa 025d: 30 d0 bmi L022F 025f: c8 iny 0260: b1 9d lda (BAS_FAC),y 0262: a0 00 ldy #$00 0264: 0a asl A 0265: 69 05 adc #$05 0267: 65 9d adc BAS_FAC 0269: 85 9d sta BAS_FAC 026b: 90 02 bcc L026F 026d: e6 9e inc BAS_FAC+1 026f: a6 9e L026F ldx BAS_FAC+1 0271: e4 a0 L0271 cpx BAS_FAC+3 0273: d0 04 bne L0279 0275: c5 9f cmp BAS_FAC+2 0277: f0 ba beq L0233 0279: 20 88 02 L0279 jsr L0288 027c: f0 f3 beq L0271 027e: b1 9d L027E lda (BAS_FAC),y 0280: 30 46 bmi L02C8 0282: c8 iny 0283: b1 9d lda (BAS_FAC),y 0285: 10 41 bpl L02C8 0287: c8 iny 0288: b1 9d L0288 lda (BAS_FAC),y 028a: f0 3c beq L02C8 028c: c8 iny 028d: b1 9d lda (BAS_FAC),y 028f: aa tax 0290: c8 iny 0291: b1 9d lda (BAS_FAC),y 0293: 85 9c sta BAS_LOWTR+1 0295: 86 9b stx BAS_LOWTR 0297: c5 b0 cmp BAS_PRGEND+1 0299: f0 02 beq L029D 029b: b0 2b bcs L02C8 029d: 88 L029D dey 029e: 88 dey 029f: b1 9d lda (BAS_FAC),y 02a1: 48 pha 02a2: 38 sec 02a3: a5 6f lda BAS_FRETOP 02a5: 85 94 sta BAS_HIGHDS 02a7: f1 9d sbc (BAS_FAC),y 02a9: c8 iny 02aa: 91 9d sta (BAS_FAC),y 02ac: 85 6f sta BAS_FRETOP 02ae: c8 iny 02af: a5 70 lda BAS_FRETOP+1 02b1: 85 95 sta BAS_HIGHDS+1 02b3: e9 00 sbc #$00 02b5: 91 9d sta (BAS_FAC),y 02b7: 85 70 sta BAS_FRETOP+1 02b9: 68 pla 02ba: 18 clc 02bb: 65 9b adc BAS_LOWTR 02bd: 85 96 sta BAS_HIGHTR 02bf: a5 9c lda BAS_LOWTR+1 02c1: 69 00 adc #$00 02c3: 85 97 sta BAS_HIGHTR+1 02c5: 20 a9 03 jsr BLTU2 02c8: a5 8f L02C8 lda $8f 02ca: 18 clc 02cb: 65 9d adc BAS_FAC 02cd: 85 9d sta BAS_FAC 02cf: 90 02 bcc L02D3 02d1: e6 9e inc BAS_FAC+1 02d3: a5 9d L02D3 lda BAS_FAC 02d5: a6 9e ldx BAS_FAC+1 02d7: a0 00 ldy #$00 02d9: 60 rts 02da: c4 c1 cf cc LoadCommand .rstr “LOAD” ;Ctrl+M Ctrl+D LOAD 02de: 84 .dd1 $84 02df: 8d .dd1 $8d 02e0: a9 00 L02E0 lda #$00 02e2: 85 94 sta BAS_HIGHDS 02e4: 85 9c sta BAS_LOWTR+1 02e6: 85 97 sta BAS_HIGHTR+1 02e8: a9 69 lda #$69 02ea: 85 9b sta BAS_LOWTR 02ec: a9 71 lda #$71 02ee: 85 96 sta BAS_HIGHTR 02f0: a9 01 lda #$01 02f2: 85 95 sta BAS_HIGHDS+1 02f4: 20 a9 03 jsr BLTU2 02f7: a2 01 ldx #$01 02f9: b5 69 L02F9 lda BAS_VARTAB,x 02fb: 95 9b sta BAS_LOWTR,x 02fd: b5 6d lda BAS_STREND,x 02ff: 95 96 sta BAS_HIGHTR,x 0301: b5 6f lda BAS_FRETOP,x 0303: 95 94 sta BAS_HIGHDS,x 0305: ca dex 0306: f0 f1 beq L02F9 0308: 20 a9 03 jsr BLTU2 030b: a5 94 lda BAS_HIGHDS 030d: 85 a1 sta BAS_FAC+4 030f: a6 95 ldx BAS_HIGHDS+1 0311: e8 inx 0312: 86 a2 stx BAS_FACSIGN ; Issue DOS command to load new program. 0314: a0 06 ldy #$06 0316: b9 d9 02 L0316 lda LoadCommand-1,y 0319: 20 a0 03 jsr OUTDO 031c: 88 dey 031d: d0 f7 bne L0316 031f: c8 iny 0320: b1 b8 :FileNameLoop lda (BAS_TXTPTR),y ;extract filename 0322: f0 0a beq L032E 0324: c9 22 cmp #‘"’ ;closing quote? 0326: f0 06 beq L032E 0328: 20 a0 03 jsr OUTDO 032b: c8 iny 032c: d0 f2 bne :FileNameLoop 032e: a9 3c L032E lda #<Continue 0330: 85 36 sta MON_CSWL 0332: a9 03 lda #>Continue 0334: 85 37 sta MON_CSWH 0336: 20 ea 03 jsr DOS_CHARIO ;reconnect DOS 0339: 4c a3 03 jmp CRDO ;print <return> 033c: 20 93 fe Continue jsr MON_SETVID 033f: 20 ea 03 jsr DOS_CHARIO 0342: 20 9d 03 jsr SETPTRS 0345: 38 sec 0346: a5 69 lda BAS_VARTAB 0348: e5 f8 sbc BAS_REMSTK 034a: 85 9d sta BAS_FAC 034c: a5 6a lda BAS_VARTAB+1 034e: e5 f9 sbc $f9 0350: 85 9e sta BAS_FAC+1 0352: a2 fa ldx #$fa 0354: 20 76 03 jsr L0376 0357: e8 inx 0358: 20 76 03 jsr L0376 035b: a2 01 ldx #$01 035d: b5 fe L035D lda $fe,x 035f: 95 6f sta BAS_FRETOP,x 0361: 95 3e sta MON_A2L,x 0363: b5 a1 lda BAS_FAC+4,x 0365: 95 3c sta MON_A1L,x 0367: b5 69 lda BAS_VARTAB,x 0369: 95 42 sta MON_A4L,x 036b: ca dex 036c: f0 ef beq L035D 036e: a0 00 ldy #$00 0370: 20 2c fe jsr MON_MOVE 0373: 6c ae 03 jmp (NEWSTT_I) ;start program? 0376: 18 L0376 clc 0377: b5 00 lda $00,x 0379: 65 9d adc BAS_FAC 037b: 95 71 sta $71,x 037d: e8 inx 037e: b5 00 lda $00,x 0380: 65 9e adc BAS_FAC+1 0382: 95 71 sta $71,x 0384: 60 rts 0385: ad 00 e0 InitCalls lda $e000 ;check for Applesoft in ROM 0388: a0 0b ldy #$0b 038a: c9 4c cmp #$4c ;is it a JMP instruction? 038c: f0 02 beq :InRom ;yes, copy $03b8-3c3 to $03ac-3b7 038e: a0 17 ldy #$17 ;no, copy $03c4-3cf to $03ac-3b7 0390: a2 0b :InRom ldx #$0b 0392: b9 b8 03 :Loop lda BasicInRom,y 0395: 9d ac 03 sta SETPTRS_I,x 0398: 88 dey 0399: ca dex 039a: 10 f6 bpl :Loop 039c: 60 rts 039d: 6c ac 03 SETPTRS jmp (SETPTRS_I) 03a0: 6c b2 03 OUTDO jmp (OUTDO_I) 03a3: 6c b0 03 CRDO jmp (CRDO_I) 03a6: 6c b4 03 GARBAG jmp (GARBAG_I) 03a9: 6c b6 03 BLTU2 jmp (BLTU2_I) 03ac: 00 SETPTRS_I .dd1 $00 ;set TXTPTR, clear vars 03ad: 00 .dd1 $00 03ae: 00 NEWSTT_I .dd1 $00 ;perform NEXT statement 03af: 00 .dd1 $00 03b0: 00 CRDO_I .dd1 $00 ;print <return> 03b1: 00 .dd1 $00 03b2: 00 OUTDO_I .dd1 $00 ;print char from A-reg 03b3: 00 .dd1 $00 03b4: 00 GARBAG_I .dd1 $00 ;collect garbage 03b5: 00 .dd1 $00 03b6: 00 BLTU2_I .dd1 $00 ;move block of memory up (LOWTR:HIGHTR->STREND) 03b7: 00 .dd1 $00 03b8: 65 d6 BasicInRom .dd2 $d665 03ba: d2 d7 .dd2 $d7d2 03bc: fb da .dd2 $dafb 03be: 5c db .dd2 $db5c 03c0: 84 e4 .dd2 $e484 03c2: 9a d3 .dd2 $d39a 03c4: 65 0e BasicInRam .dd2 $0e65 03c6: d4 0f .dd2 $0fd4 03c8: fc 12 .dd2 $12fc 03ca: 5f 13 .dd2 $135f 03cc: 7b 1c .dd2 $1c7b 03ce: 9a 0b .dd2 $0b9a
No exported symbols found.