1 ORG $300 2 A1L = $3C ;MOVE source start 3 A1H = $3D 4 PTR = A1L ;Ptr for fixing links 5 A2L = $3E ;MOVE source end 6 A2H = $3F 7 DIFF = $40 ;Offset for move (at A3L,A3H) 8 A4L = $42 ;MOVE dest start 9 A4H = $43 10 LINNUM = $50 ;GETADR puts address here 11 TXTTAB = $67 ;Ptr to prog start 12 VARTAB = $69 ;Ptr to vars start 13 HIGHDS = $94 ;BLTUC dest end 14 HIGHTR = $96 ;BLTUC source end 15 LOWTR = $9B ;BLTUC source start 16 PRGEND = $AF ;Ptr to prog end 17 TXTPTR = $B8 ;Ptr to token being interpreted 18 BLTUC = $D39A ;Block move up 19 CLEARC = $D66C ;CLEAR statement 20 NEWSTT = $D7D2 ;Execute next statement 21 FRMNUM = $DD67 ;Eval numeric expr 22 CHKCOM = $DEBE ;Parse comma 23 GETADR = $E752 ;Convert FAC to address 24 MOVE = $FE2C ;Block move down 0300: 20 BE DE 25 JSR CHKCOM ;Check for comma 0303: 20 67 DD 26 JSR FRMNUM ;Parse number 0306: 20 52 E7 27 JSR GETADR ;Convert to addr in LINNUM 0309: A5 50 28 LDA LINNUM ;DIFF = how far to move 030B: 38 29 SEC 030C: E5 67 30 SBC TXTTAB 030E: 85 40 31 STA DIFF 0310: A5 51 32 LDA LINNUM+1 0312: E5 68 33 SBC TXTTAB+1 0314: 85 41 34 STA DIFF+1 0316: 05 40 35 ORA DIFF ;DIFF=0? 0318: F0 22 36 BEQ DONE1 ;If so, nothing to do 031A: B0 22 37 BCS UP ;If moving up, use BLTUC 031C: A5 67 38 LDA TXTTAB ;Else moving down--set up MOVE 031E: 85 3C 39 STA A1L 0320: A5 68 40 LDA TXTTAB+1 0322: 85 3D 41 STA A1H 0324: A5 AF 42 LDA PRGEND ;Moves 1 byte too many, but who cares? 0326: 85 3E 43 STA A2L 0328: A5 B0 44 LDA PRGEND+1 032A: 85 3F 45 STA A2H 032C: A5 50 46 LDA LINNUM 032E: 85 42 47 STA A4L 0330: A5 51 48 LDA LINNUM+1 0332: 85 43 49 STA A4H 0334: A0 00 50 LDY #0 0336: 20 2C FE 51 JSR MOVE ;Move (returns Y unchanged) 0339: 98 52 TYA 033A: F0 1E 53 BEQ FIXLNK ;(Always taken) 033C: F0 70 54 DONE1 BEQ DONE ;(Because DONE is too far to reach from above) 033E: A5 67 55 UP LDA TXTTAB ;Moving up--set up BLTUC 0340: 85 9B 56 STA LOWTR 0342: A5 68 57 LDA TXTTAB+1 0344: 85 9C 58 STA LOWTR+1 0346: A5 AF 59 LDA PRGEND 0348: 85 96 60 STA HIGHTR 034A: 18 61 CLC 034B: 65 40 62 ADC DIFF 034D: 85 94 63 STA HIGHDS 034F: A5 B0 64 LDA PRGEND+1 0351: 85 97 65 STA HIGHTR+1 0353: 65 41 66 ADC DIFF+1 0355: 85 95 67 STA HIGHDS+1 0357: 20 9A D3 68 JSR BLTUC ;Move (returns Y=0) 035A: A5 50 69 FIXLNK LDA LINNUM ;Fix line links 035C: 85 3C 70 STA PTR ;LINNUM points to 1st link 035E: A5 51 71 LDA LINNUM+1 0360: 85 3D 72 STA PTR+1 0362: C8 73 INY ;Now Y=1 0363: B1 3C 74 FIX1 LDA (PTR),Y ;Is link hi byte 0? 0365: F0 17 75 BEQ FIXPTRS ;If so, all links fixed 0367: 88 76 DEY 0368: B1 3C 77 LDA (PTR),Y ;Add DIFF to link 036A: 18 78 CLC 036B: 65 40 79 ADC DIFF 036D: 91 3C 80 STA (PTR),Y 036F: AA 81 TAX 0370: C8 82 INY 0371: B1 3C 83 LDA (PTR),Y 0373: 65 41 84 ADC DIFF+1 0375: 91 3C 85 STA (PTR),Y 0377: 85 3D 86 STA PTR+1 ;Point at next link 0379: 86 3C 87 STX PTR 037B: 98 88 TYA 037C: D0 E5 89 BNE FIX1 ;(Always taken) 037E: A5 51 90 FIXPTRS LDA LINNUM+1 ;Fix prog & var pointers 0380: 85 68 91 STA TXTTAB+1 ;LINNUM -> TXTTAB 0382: A5 50 92 LDA LINNUM 0384: 85 67 93 STA TXTTAB 0386: D0 02 94 BNE DLO 0388: C6 51 95 DEC LINNUM+1 038A: C6 50 96 DLO DEC LINNUM ;Go back a byte 038C: 88 97 DEY 038D: 98 98 TYA 038E: 91 50 99 STA (LINNUM),Y ;Zero out byte before prog 0390: A5 AF 100 LDA PRGEND ;PRGEND+DIFF -> PRGEND & VARTAB 0392: 18 101 CLC 0393: 65 40 102 ADC DIFF 0395: 85 AF 103 STA PRGEND 0397: 85 69 104 STA VARTAB 0399: A5 B0 105 LDA PRGEND+1 039B: 65 41 106 ADC DIFF+1 039D: 85 B0 107 STA PRGEND+1 039F: 85 6A 108 STA VARTAB+1 03A1: A5 B8 109 LDA TXTPTR ;TXTPTR+DIFF -> TXTPTR 03A3: 18 110 CLC 03A4: 65 40 111 ADC DIFF 03A6: 85 B8 112 STA TXTPTR 03A8: A5 B9 113 LDA TXTPTR+1 03AA: 65 41 114 ADC DIFF+1 03AC: 85 B9 115 STA TXTPTR+1 03AE: 20 6C D6 116 DONE JSR CLEARC ;Clear vars & stack 03B1: 4C D2 D7 117 JMP NEWSTT ;Continue program at new loc --End assembly, 180 bytes, Errors: 0