0100 ;----------------------- 0110 ; 0120 ;Text Editor Subroutines 0130 ; 0140 ;By: Bryan Schappel 0150 ; 0160 ;FILE: TXTSUB 0170 ; 0180 ;----------------------- 0190 ; 0200 ;SAVE a file 0210 ; 0220 ;This routine will SAVE a file 0230 ;to disk, if there is a file in 0240 ;memory at this time, if there 0250 ;is no file in memory, the 0260 ;command is aborted. The routine 0270 ;will over-write the disk file. 0280 ;it will not ask to replace it. 0290 ; 0300 SAVE LDA FILE? 0310 BNE DSV 0320 RTS 0330 DSV PRINT SAVEM 0340 JSR COPFIL 0350 JSR CONASC 0360 LDA #8 0370 STA IODIR 0380 JSR OPENFIL ;open file 0390 SV1 BMI SVERR 0400 LDX #$10 0410 LDA MEMST 0420 STA ICBAL,X 0430 LDA MEMST+1 0440 STA ICBAH,X 0450 SEC 0460 LDA MEMPNT 0470 SBC MEMST 0480 STA ICBLL,X 0490 LDA MEMPNT+1 0500 SBC MEMST+1 0510 STA ICBLH,X 0520 LDA #11 0530 JSR PERFIO 0540 BMI SVERR 0550 JSR CLOSE1 0560 DEC PAUSE? 0570 JMP CONINT 0580 ; 0590 SVERR PRINT SAVER 0600 SCL JSR CLOSE1 0610 JSR GETKEY 0620 DEC PAUSE? 0630 JMP CONINT 0640 ; 0650 ;This is the PRINT TO DISK, or 0660 ;MANUAL routine. This justs 0670 ;asks for a disk filename, then 0680 ;branches to the proper place 0690 ;in the print routine to produce 0700 ;the output. 0710 ; 0720 MANUAL LDA FILE? 0730 BNE DMAN 0740 RTS 0750 DMAN PRINT PRNTM 0760 JSR COPFIL 0770 LDA #8 0780 STA IODIR 0790 JSR OPENFIL 0800 BMI PERR 0810 BPL PV2 0820 ; 0830 ;PRINT a file 0840 ; 0850 ;This routine will generate page 0860 ;formatted output to any line 0870 ;printer. The text is formatted 0880 ;for 80 columns by the routine 0890 ;LPLINE. The LINES location is 0900 ;used to keep track of where the 0910 ;page is being printed, if LINES 0920 ;=0 then we are at TOP of form, 0930 ;else some where else on the 0940 ;page. The program will number 0950 ;all pages (up to 255, if the 0960 ;page number exceeds 255, then 0970 ;the page number is set to 0) 0980 ;The message 'Page # xxx' is 0990 ;used at the top of each page. 1000 ; 1010 PRINT LDA FILE? 1020 BEQ PV0 1030 PRINT PTEXT 1040 JSR YESNO 1050 BCS PV0 1060 JSR OPENP 1070 BPL PV2 1080 PERR JSR CLOSE1 1090 PRINT PRTER 1100 DEC PAUSE? 1110 JMP GETKEY 1120 PV0 RTS 1130 PV2 LDA #1 1140 STA PAGENUM 1150 LDA MEMST 1160 STA TEXTP 1170 LDA MEMST+1 1180 STA TEXTP+1 1190 PRINTLP JSR LPCR 1200 BMI PERR 1210 LDA PAGENUM 1220 STA LO 1230 JSR CALCNM 1240 LDA NBUF+2 1250 CLC 1260 ADC #$20 1270 STA PAGEN+7 1280 LDA NBUF 1290 CLC 1300 ADC #$20 1310 STA PAGEN+8 1320 LDA NBUF+1 1330 CLC 1340 ADC #$20 1350 STA PAGEN+9 1360 LDY #0 1370 STY LINES 1380 PGNLP LDA PAGEN,Y 1390 STA MYBUF,Y 1400 CMP #EOL 1410 BEQ PGNLP0 1420 INY 1430 BNE PGNLP 1440 PGNLP0 JSR LPRINT ;line #1 1450 BMI PERR 1460 JSR LPCR ;line #2 1470 BMI PERR 1480 LPTEXT JSR LPLINE 1490 BMI PERR 1500 LDA LPLEN 1510 CMP #$FF 1520 BEQ LPDONE 1530 LDA LINES 1540 BNE LPTEXT 1550 BEQ PRINTLP 1560 LPDONE LDA LINES 1570 BEQ LPDONE1 1580 JSR LPCR 1590 JMP LPDONE 1600 LPDONE1 DEC PAUSE? 1610 JMP CLOSE1 1620 ; 1630 ;LOAD a file 1640 ; 1650 ;Here we LOAD a file into 1660 ;memory. If the LOAD is good 1670 ;we convert the file to ICODE 1680 ;by calling - CONINT. If the 1690 ;LOAD is bad we print the error 1700 ;message, and exit. 1710 ; 1720 LOAD PRINT LOADM 1730 JSR COPFIL 1740 LDA #4 1750 STA IODIR 1760 JSR OPENFIL 1770 BMI LOERR 1780 JSR ERASEMEM 1790 LDX #$10 1800 LDA MEMMAX 1810 STA ICBLL,X 1820 LDA MEMMAX+1 1830 STA ICBLH,X 1840 LDA #7 1850 JSR PERFIO 1860 BMI LOERR 1870 LOAG LDX #$10 1880 LDA ICBLL,X 1890 SEC 1900 SBC #1 1910 STA ICBLL,X 1920 LDA ICBLH,X 1930 SBC #0 1940 STA ICBLH,X 1950 LDA MEMST 1960 ADC ICBLL,X 1970 STA MEMPNT 1980 STA TEXTP 1990 LDA MEMST+1 2000 ADC ICBLH,X 2010 STA MEMPNT+1 2020 STA TEXTP+1 2030 JSR CLOSE1 2040 INC FILE? 2050 DEC PAUSE? 2060 LDY #1 2070 LDA #0 2080 LOAL STA (TEXTP),Y 2090 INY 2100 BNE LOAL 2110 JSR CONINT 2120 JMP SCRDRAW 2130 ; 2140 LOERR CPY #136 ;EOF? 2150 BEQ LOAG 2160 JSR CLOSE1 2170 PRINT LOADR 2180 DEC PAUSE? 2190 JMP GETKEY 2200 ; 2210 ;Jump to Beginning of Line 2220 ; 2230 ;We jump to the start of the 2240 ;line by taking the Xpos of the 2250 ;cursor, subtract 1 (since the 2260 ;actual Xpos is kept as 1 less 2270 ;than the number that is shown 2280 ;on the cursor line), then 2290 ;subtract this number from 2300 ;CURMEM. 2310 ; 2320 BLINE LDX CURX 2330 DEX 2340 STX TEMP 2350 LDA CURMEM 2360 SEC 2370 SBC TEMP 2380 STA CURMEM 2390 LDA CURMEM+1 2400 SBC #0 2410 STA CURMEM+1 2420 BLOUT RTS 2430 ; 2440 ;Advance ONE word 2450 ; 2460 ;Here we scan ahead for a SPACE 2470 ;or a RETURN to determine if we 2480 ;have found the end of a word 2490 ;then scan ahead for a non- 2500 ;space character. 2510 ; 2520 UPWORD LDY #0 2530 RLOOP LDA (CURMEM),Y 2540 BEQ UPWRD1 2550 CMP #EOLCHAR 2560 BEQ UPWRD1 2570 INY 2580 BNE RLOOP 2590 RTS 2600 UPWRD1 INY 2610 BNE UPWRD 2620 INC CURMEM+1 2630 LDA CURMEM+1 2640 CMP MEMPNT+1 2650 BCC UPWRD 2660 BNE ENDTEXT 2670 UPWRD LDA (CURMEM),Y 2680 BEQ UPWRD1 2690 ; 2700 ;This routine adds the Y-reg 2710 ;to CURMEM, and then calls 2720 ;CHECKMEM to make sure we did 2730 ;not leave the screen. 2740 ; 2750 ADDY2CP CLC 2760 TYA 2770 ADC CURMEM 2780 STA CURMEM 2790 LDA CURMEM+1 2800 ADC #0 2810 STA CURMEM+1 2820 WRTN JMP CHECKMEM 2830 ENDTEXT LDA MEMPNT 2840 STA CURMEM 2850 LDA MEMPNT+1 2860 STA CURMEM+1 2870 JMP CHECKMEM 2880 ; 2890 ;Goto bottom of text 2900 ; 2910 ;This routine is a little bit 2920 ;tricky. If the end of text is 2930 ;on the screen, we just call 2940 ;ENDTEXT, else we subtract 2950 ;1K from the EOT pointer and 2960 ;call CHECKMEM to scroll to the 2970 ;end of text. 2980 ; 2990 BOTTOM LDA #0 3000 STA TOPLN 3010 LDA MEMPNT+1 3020 SEC 3030 SBC #4 3040 CMP MEMST+1 3050 BCS BOTSAFE 3060 LDA MEMST+1 3070 BOTSAFE STA TOPLN+1 3080 JSR SCRDRAW 3090 JMP ENDTEXT 3100 ; 3110 ;Goto end of line 3120 ; 3130 ;To goto the EOL we move to the 3140 ;Begin of line, and then add 3150 ;line length-1 to the CURMEM 3160 ;pointer. 3170 ; 3180 ENDLN JSR BLINE 3190 LDX CURY 3200 LDA LENTABLE-1,X 3210 TAY 3220 DEY 3230 JMP ADDY2CP 3240 ; 3250 ;Home Cursor 3260 ; 3270 ;All we do here is move to ADR 3280 ;of TOPLN to the CURMEM 3290 ;pointer. 3300 ; 3310 HOME LDA TOPLN 3320 STA CURMEM 3330 LDA TOPLN+1 3340 STA CURMEM+1 3350 RTS 3360 ; 3370 ;Flip Insert mode 3380 ; 3390 ;All we do here is flip the 3400 ;INSMODE mode between 0 and 1. 3410 ;Then the DLI will change the 3420 ;CURSOR line color to reflect 3430 ;the mode change. 3440 ; 3450 IMODE LDA INSMODE 3460 EOR #$01 3470 STA INSMODE 3480 RTS 3490 ; 3500 ;Reverse Characters 3510 ; 3520 ;This command was one I heard 3530 ;PAPERCLIP had so I had to 3540 ;include it here. As you can 3550 ;see it is not hard to do. If 3560 ;you move to the EOT and do a 3570 ;swap, the character is flipped 3580 ;with a blank space. 3590 ; 3600 REVERSE LDY #0 3610 LDA (CURMEM),Y 3620 PHA 3630 INY 3640 LDA (CURMEM),Y 3650 DEY 3660 STA (CURMEM),Y 3670 INY 3680 PLA 3690 STA (CURMEM),Y 3700 RTS 3710 ; 3720 ;Erase all of Memory 3730 ; 3740 ;This is called only to ERASE 3750 ;the entire TEXTPT buffer. It 3760 ;also resets some of my 3770 ;pointers. It fills memory with 3780 ;zeroes. 3790 ; 3800 ERASEMEM LDA MEMST 3810 STA TEXTP 3820 STA TOPLN 3830 STA CURMEM 3840 STA MEMPNT 3850 LDA MEMST+1 3860 STA TEXTP+1 3870 STA TOPLN+1 3880 STA CURMEM+1 3890 STA MEMPNT+1 3900 SEC 3910 LDA # >TXTEND 3920 SBC MEMST+1 3930 STA MEMMAX+1 3940 TAX 3950 LDA #0 3960 STA MEMMAX 3970 ERMEMLP LDY #$FF 3980 DEC TEXTP+1 3990 STA (TEXTP),Y 4000 INY 4010 INC TEXTP+1 4020 ERMLP2 STA (TEXTP),Y 4030 INY 4040 BNE ERMLP2 4050 INC TEXTP+1 4060 DEX 4070 BNE ERMLP2 4080 STA (TEXTP),Y 4090 RTS 4100 ; 4110 ;Insert One Space 4120 ; 4130 ;This sets the INSLEN location 4140 ;to 1 and calls the block 4150 ;insert routine. Then it puts 4160 ;a space under the cursor. 4170 ; 4180 INSCHAR LDA #1 4190 STA INSLEN 4200 LDA #0 4210 STA INSLEN+1 4220 JSR INSBLOCK 4230 LDA #0 4240 TAY 4250 STA (CURMEM),Y 4260 JMP CHECKMEM 4270 ; 4280 ;These are the block inserts 4290 ; 4300 ;This is the 255 char block 4310 ;insert routine. It works much 4320 ;the the 1 char insert routine 4330 ;it only sets INSLEN to 255. 4340 ; 4350 ADD255 LDA #$FF 4360 STA INSLEN 4370 BNE TAB2 4380 ; 4390 ;This routine inserts 5 spaces 4400 ;into the text. 4410 ; 4420 ADDTAB LDA #5 4430 STA INSLEN 4440 JSR TAB2 4450 LDA (CURMEM),Y 4460 BNE NOINCY 4470 INY 4480 NOINCY JMP ADDY2CP 4490 TAB2 LDA #0 4500 STA INSLEN+1 4510 JSR INSBLOCK 4520 LDA #0 4530 TAY 4540 LDX INSLEN 4550 FILLSP STA (CURMEM),Y 4560 INY 4570 DEX 4580 BNE FILLSP 4590 RTS 4600 ; 4610 ;Insert a block of text 4620 ; 4630 ;This is the actual INSERT code 4640 ;it sets up the pointers DEST 4650 ;and FROM, then moves the 4660 ;memory. There are checks made 4670 ;to make certain that you don't 4680 ;go past the EOT memory. 4690 ; 4700 INSBLOCK CLC 4710 LDA MEMPNT 4720 ADC INSLEN 4730 LDA MEMPNT+1 4740 ADC INSLEN+1 4750 CMP # >TXTEND 4760 BCC OKINS 4770 PLA 4780 PLA 4790 RTS 4800 OKINS CLC 4810 LDA CURMEM 4820 STA FROM 4830 ADC INSLEN 4840 STA DEST 4850 LDA CURMEM+1 4860 STA FROM+1 4870 ADC INSLEN+1 4880 STA DEST+1 4890 SEC 4900 LDA MEMPNT 4910 SBC FROM 4920 STA MOVELEN 4930 LDA MEMPNT+1 4940 SBC FROM+1 4950 STA MOVELEN+1 4960 JSR DMOVE 4970 CLC 4980 LDA MEMPNT 4990 ADC INSLEN 5000 STA MEMPNT 5010 LDA MEMPNT+1 5020 ADC INSLEN+1 5030 STA MEMPNT+1 5040 RTS 5050 ; 5060 ;Move Memory Routines 5070 ; 5080 ;The next two routines are the 5090 ;memory move routines. 5100 ;They self-modify for a little 5110 ;extra speed. 5120 ; 5130 DMOVE LDA MOVELEN+1 5140 TAX 5150 ORA MOVELEN 5160 BNE NOTNULL 5170 RTS 5180 NOTNULL CLC 5190 TXA 5200 ADC FROM+1 5210 STA DMVLP+2 5220 LDA FROM 5230 STA DMVLP+1 5240 CLC 5250 TXA 5260 ADC DEST+1 5270 STA DMVLP+5 5280 LDA DEST 5290 STA DMVLP+4 5300 INX 5310 LDY MOVELEN 5320 BNE DMVLP 5330 BEQ SKIPDMV 5340 DMV1 LDY #$FF 5350 DMVLP LDA $FFFF,Y 5360 STA $FFFF,Y 5370 DEY 5380 CPY #$FF 5390 BNE DMVLP 5400 SKIPDMV DEC DMVLP+2 5410 DEC DMVLP+5 5420 DEX 5430 BNE DMV1 5440 RTS 5450 ; 5460 ;Move memory up 5470 ; 5480 UMOVE LDA FROM 5490 STA UMVLP+1 5500 LDA FROM+1 5510 STA UMVLP+2 5520 LDA DEST 5530 STA UMVLP+4 5540 LDA DEST+1 5550 STA UMVLP+5 5560 LDX MOVELEN+1 5570 BEQ SKIPUMV 5580 UMV1 LDA #0 5590 UMV2 STA ENDPOS 5600 LDY #0 5610 UMVLP LDA $FFFF,Y 5620 STA $FFFF,Y 5630 INY 5640 CPY ENDPOS 5650 BNE UMVLP 5660 INC UMVLP+2 5670 INC UMVLP+5 5680 CPX #0 5690 BEQ UMVOUT 5700 DEX 5710 BNE UMV1 5720 SKIPUMV LDA MOVELEN 5730 BNE UMV2 5740 UMVOUT RTS 5750 ; 5760 ;Move cursor Right 5770 ; 5780 ;This simply adds one to the 5790 ;CURMEM pointer and calls the 5800 ;CHECKMEM routine to make sure 5810 ;we did not leave text memory. 5820 ; 5830 GORIGHT BUMP CURMEM 5840 JMP CHECKMEM 5850 ; 5860 ;Move Cursor Left 5870 ; 5880 ;This just subtracts one from 5890 ;CURMEM and calls CHECKMEM. If 5900 ;you go left from the HOME posit 5910 ;the screen will only move one 5920 ;character up in the document. 5930 ;This can cause some minor 5940 ;cosmetic problems for the word 5950 ;wrap later on. 5960 ; 5970 GOLEFT LDA CURMEM 5980 BNE NODEC 5990 DEC CURMEM+1 6000 NODEC DEC CURMEM 6010 JMP CHECKMEM 6020 ; 6030 ;CONTROL-DEL a char 6040 ; 6050 ;This moves the cursor forward, 6060 ;then saves its position, then 6070 ;moves it back again and calls 6080 ;the DELETE2 code to delete the 6090 ;text. 6100 ; 6110 CTRLDEL JSR GORIGHT 6120 JSR DELETE1 6130 JSR GOLEFT 6140 JSR DELETE2 6150 RTS 6160 ; 6170 ;Delete a char (BACK S) 6180 ; 6190 ;This save the CURMEM position 6200 ;then moves left and deletes 6210 ;the text. 6220 ; 6230 CHRDEL JSR DELETE1 6240 JSR GOLEFT 6250 JMP DELETE2 6260 ; 6270 ;Actual delete code 6280 ; 6290 ;Here are the work-horse delete 6300 ;routines, that perform most 6310 ;of the text delete functions. 6320 ; 6330 DELETE1 SEC 6340 LDA CURMEM 6350 SBC MEMST 6360 STA TEMP 6370 LDA CURMEM+1 6380 SBC MEMST+1 6390 ORA TEMP 6400 BNE DELETE1.1 6410 PLA 6420 PLA 6430 RTS 6440 DELETE1.1 LDA CURMEM 6450 STA FROM 6460 LDA CURMEM+1 6470 STA FROM+1 6480 RTS 6490 DELETE2 SEC 6500 LDA CURMEM 6510 STA DEST 6520 EOR #$FF 6530 ADC FROM 6540 STA GOBLEN 6550 LDA CURMEM+1 6560 STA DEST+1 6570 EOR #$FF 6580 ADC FROM+1 6590 STA GOBLEN+1 6600 DELMEM SEC 6610 LDA MEMPNT 6620 SBC DEST 6630 STA MOVELEN 6640 LDA MEMPNT+1 6650 SBC DEST+1 6660 STA MOVELEN+1 6670 BUMP MOVELEN 6680 JSR UMOVE 6690 LDA MEMPNT 6700 SEC 6710 SBC GOBLEN 6720 STA MEMPNT 6730 LDA MEMPNT+1 6740 SBC GOBLEN+1 6750 STA MEMPNT+1 6760 RTS 6770 ; 6780 ;These are the routines 6790 ;that convert the text into 6800 ;the internal form the program 6810 ;uses. 6820 ; 6830 CONASC LDA #0 6840 STA CONFLAG 6850 BEQ DOCON 6860 CONINT LDA #128 6870 STA CONFLAG 6880 DOCON LDA MEMST 6890 STA TEXTP 6900 LDA MEMST+1 6910 STA TEXTP+1 6920 SEC 6930 LDA MEMPNT+1 6940 SBC TEXTP+1 6950 TAX 6960 INX 6970 LDY #0 6980 CVLOOP LDA (TEXTP),Y 6990 PHA 7000 LDA CONFLAG 7010 BEQ COTHER 7020 PLA 7030 CMP #EOL 7040 BNE NOTRTN 7050 LDA #EOLCHAR 7060 BNE OVEROTHER 7070 NOTRTN CMP #$7F 7080 BNE GOASCQ 7090 LDA #125 7100 BNE OVEROTHER 7110 GOASCQ JSR ASC2IC 7120 JMP OVEROTHER 7130 COTHER PLA 7140 CMP #EOLCHAR 7150 BNE NOTRC 7160 LDA #EOL 7170 BNE OVEROTHER 7180 NOTRC CMP #125 7190 BNE GOASCX 7200 LDA #$7F 7210 BNE OVEROTHER 7220 GOASCX JSR IC2ASC 7230 OVEROTHER STA (TEXTP),Y 7240 INY 7250 BNE CVLOOP 7260 INC TEXTP+1 7270 DEX 7280 BNE CVLOOP 7290 RTS 7300 ; 7310 ;Show false spaces 7320 ; 7330 ;This simply flips the middle 7340 ;bit of the middle byte on one 7350 ;of the characters in my set. 7360 ;This produces a small dot on 7370 ;the screen where a word-wrap 7380 ;occured. 7390 ; 7400 PARSE LDA MYSET+$0204 7410 EOR #$10 7420 STA MYSET+$0204 7430 RTS 7440 ; 7450 ;Move Down One Screen 7460 ; 7470 ;This will HOME the cursor and 7480 ;then move the screen down 19 7490 ;lines by simply adding the 7500 ;length of the line, stored in 7510 ;the table - LENTABLE. If we 7520 ;try to go past the EOT, then 7530 ;we call the BOTTOM routine. 7540 ; 7550 DNSC JSR HOME 7560 LDY #0 7570 DNLOOP LDA TOPLN 7580 CLC 7590 ADC LENTABLE,Y 7600 STA TOPLN 7610 STA CURMEM 7620 LDA TOPLN+1 7630 ADC #0 7640 STA TOPLN+1 7650 STA CURMEM+1 7660 INY 7670 CPY #19 7680 BNE DNLOOP 7690 LDA MEMPNT+1 7700 CMP CURMEM+1 7710 BCC DNBT 7720 BEQ DNCL 7730 BCS DNSCO 7740 DNCL LDA MEMPNT 7750 CMP CURMEM 7760 BCC DNSCO 7770 DNBT JMP BOTTOM 7780 DNSCO JSR SCRDRAW 7790 JMP CHECKMEM 7800 ; 7810 ;Move Cursor Down a line 7820 ; 7830 ;This simply moves the cursor 7840 ;to the start of the line, then 7850 ;adds the length of the line to 7860 ;CURMEM. If the cursor is on 7870 ;the last line, we must first 7880 ;scroll the screen (to get the 7890 ;length of the next text line) 7900 ;and add this new length. 7910 ; 7920 DNLN JSR BLINE 7930 LDX CURY 7940 LDA CURMEM 7950 CLC 7960 ADC LENTABLE-1,X 7970 STA CURMEM 7980 LDA CURMEM+1 7990 ADC #0 8000 STA CURMEM+1 8010 CPX #20 8020 BNE DOVER 8030 TXA 8040 PHA 8050 LDA CURX 8060 PHA 8070 LDA TOPLN 8080 CLC 8090 ADC LENTABLE 8100 STA TOPLN 8110 LDA TOPLN+1 8120 ADC #0 8130 STA TOPLN+1 8140 JSR SCRDRAW 8150 PLA 8160 STA CURX 8170 PLA 8180 STA CURY 8190 LDX #19 8200 DOVER LDA LENTABLE,X 8210 CMP CURX 8220 BCC ADDONY 8230 LDA CURX 8240 ADDONY TAY 8250 DEY 8260 JMP ADDY2CP 8270 ; 8280 ;Move cursor Up a line 8290 ; 8300 ;This was the most difficult 8310 ;routine to write for T:EDIT. 8320 ;If the cursor is on any line 8330 ;but one, we simply goto the 8340 ;start of the line, subtract 8350 ;the length of the line before 8360 ;it and then check to see if 8370 ;the cursor Xpos is on the new 8380 ;line. If not we move to the 8390 ;end of the new line. If the 8400 ;cursor was on the TOP line, we 8410 ;run into the problem - How 8420 ;long is the line just off the 8430 ;top of the screen? - To figure 8440 ;this out I wrote a routine 8450 ;much like the BOTTOM routine + 8460 ;the SCRDRAW routine. It steps 8470 ;back 1K and 'draws the screen' 8480 ;until we find the cursor. When 8490 ;we are done with this, we know 8500 ;the length of the line just 8510 ;off the screen. Yeah! This 8520 ;little gem of an idea took 8530 ;weeks to form and a matter of 8540 ;hours to get to work. Enjoy. 8550 ; 8560 UPLN JSR BLINE 8570 LDX CURY 8580 CPX #1 8590 BEQ SCRLUP 8600 DEX 8610 DEX 8620 LDA CURMEM 8630 SEC 8640 SBC LENTABLE,X 8650 STA CURMEM 8660 LDA CURMEM+1 8670 SBC #0 8680 STA CURMEM+1 8690 JMP DOVER 8700 SCRLUP JSR MOVEUP 8710 LDX CURMEM 8720 STX TOPLN 8730 LDX CURMEM+1 8740 STX TOPLN+1 8750 CMP CURX 8760 BCC SCRLUY 8770 LDA CURX 8780 SCRLUY TAY 8790 DEY 8800 JMP ADDY2CP 8810 ; 8820 ;Move CURMEM up one line 8830 ; 8840 ;This routine HOME's the cursor 8850 ;then calls CUROFF, to calc. 8860 ;the length of the unseen line, 8870 ;If Y-reg = $FF, we are at the 8880 ;top of text and abort. 8890 ; 8900 MOVEUP JSR HOME 8910 JSR CUROFF 8920 STY TEMP 8930 CPY #$FF 8940 BNE MVU 8950 RTS 8960 MVU LDA CURMEM 8970 SEC 8980 SBC TEMP 8990 STA CURMEM 9000 LDA CURMEM+1 9010 SBC #0 9020 STA CURMEM+1 9030 TYA 9040 RTS 9050 ; 9060 ;Move the cursor up one screen 9070 ; 9080 ;This simply calls MOVEUP 19 9090 ;times, and when we are done 9100 ;we call CHECKMEM to move the 9110 ;screen up. 9120 ; 9130 UPSC LDA #0 9140 STA LINES 9150 UPSCL JSR MOVEUP 9160 LDA CURMEM 9170 STA TOPLN 9180 LDA CURMEM+1 9190 STA TOPLN+1 9200 INC LINES 9210 LDA LINES 9220 CMP #19 9230 BNE UPSCL 9240 JMP CHECKMEM 9250 ; 9260 ;Delete to end of line 9270 ; 9280 ;This saves the CURMEM position 9290 ;moves to the EOL then deletes 9300 ;the text, very simple. 9310 ; 9320 DEL2CR JSR ERAS1 9330 JSR ENDLN 9340 LDA SAVCUR 9350 SEC 9360 SBC MEMPNT 9370 STA TEMP 9380 LDA SAVCUR+1 9390 SBC MEMPNT+1 9400 ORA TEMP 9410 BCS DEL2CRLV 9420 LDA CURMEM 9430 SEC 9440 SBC MEMPNT 9450 STA TEMP 9460 LDA CURMEM+1 9470 SBC MEMPNT+1 9480 ORA TEMP 9490 BEQ ERAS3 9500 BNE ERAS2 9510 ; 9520 ;The following routines are the 9530 ;ones used to delete to the EOL. 9540 ; 9550 ERAS1 LDA CURMEM 9560 STA DEST 9570 STA SAVCUR 9580 LDA CURMEM+1 9590 STA DEST+1 9600 STA SAVCUR+1 9610 RTS 9620 ; 9630 ERAS2 BUMP CURMEM 9640 ERAS3 SEC 9650 LDA CURMEM 9660 STA FROM 9670 SBC SAVCUR 9680 STA GOBLEN 9690 LDA CURMEM+1 9700 STA FROM+1 9710 SBC SAVCUR+1 9720 STA GOBLEN+1 9730 JSR DELMEM 9740 DEL2CRLV LDA SAVCUR 9750 STA CURMEM 9760 LDA SAVCUR+1 9770 STA CURMEM+1 9780 JMP CHECKMEM 9790 ; 9800 ;Delete all spaces from CURMEM 9810 ;to next non-space character. 9820 ; 9830 ;This simply moves the CURMEM 9840 ;to the next non-space char 9850 ;and deletes all chars between 9860 ;the original position and the 9870 ;new position. 9880 ; 9890 KSPACE LDA CURMEM 9900 STA TEXTP 9910 STA DEST 9920 LDA CURMEM+1 9930 STA TEXTP+1 9940 STA DEST+1 9950 LDY #0 9960 SPCFND LDA (TEXTP),Y 9970 BNE OUTSPC 9980 INY 9990 BNE SPCFND 010000 LDA TEXTP+1 010010 CMP MEMPNT+1 010020 BCC GOINC 010030 LDA MEMPNT 010040 STA TEXTP 010050 LDA MEMPNT+1 010060 STA TEXTP+1 010070 LDY #0 010080 BEQ OUTSPC 010090 GOINC INC TEXTP+1 010100 BNE SPCFND 010110 OUTSPC CLC 010120 TYA 010130 ADC TEXTP 010140 STA FROM 010150 LDA #0 010160 ADC TEXTP+1 010170 STA FROM+1 010180 SEC 010190 LDA MEMPNT 010200 SBC DEST 010210 STA MOVELEN 010220 LDA MEMPNT+1 010230 SBC DEST+1 010240 STA MOVELEN+1 010250 SEC 010260 LDA FROM 010270 SBC DEST 010280 STA GOBLEN 010290 LDA FROM+1 010300 SBC DEST+1 010310 STA GOBLEN+1 010320 BUMP MOVELEN 010330 JSR UMOVE 010340 SEC 010350 LDA MEMPNT 010360 SBC GOBLEN 010370 STA MEMPNT 010380 LDA MEMPNT+1 010390 SBC GOBLEN+1 010400 STA MEMPNT+1 010410 RTS 010420 ; 010430 ;Find a string in memory 010440 ; 010450 ;These are the GLOBAL Search & 010460 ;REPLACE routines. If the 010470 ;Search string is equal in 010480 ;length to the Replace string 010490 ;the S&R goes very fast, else 010500 ;you might wait a little while 010510 ; 010520 FIND PRINT FINDM 010530 JSR INPUT 010540 BCC FINDOK 010550 RTS 010560 FINDOK LDA CEND 010570 STA SLEN 010580 LDY #44 010590 FNDMB LDA MYBUF,Y 010600 STA SBUF,Y 010610 DEY 010620 BPL FNDMB 010630 GLOBL JSR CSRCH 010640 CMP #$FF 010650 BEQ NFND 010660 PRINT REPLM 010670 JSR YN2 010680 BCS NFND 010690 GETREP PRINT REPLW 010700 JSR INPUT 010710 BCC GLBREP 010720 NFND RTS 010730 GLBREP JSR CSRCH 010740 LDA FPOS+1 010750 CMP #$FF 010760 BEQ NFND 010770 JSR REPL 010780 JSR CHECKMEM 010790 JMP GLBREP 010800 CSRCH LDA CURMEM 010810 STA TEXTP 010820 LDA CURMEM+1 010830 STA TEXTP+1 010840 LDY #0 010850 SRCH0 LDX #0 010860 SRCH1 LDA SBUF,X 010870 JSR ASC2IC 010880 CMP (TEXTP),Y 010890 BEQ CY 010900 CPX #0 010910 BNE SRCH0 010920 DEX 010930 CY INY 010940 BNE NOVFL 010950 INC TEXTP+1 010960 LDA TEXTP+1 010970 CMP MEMPNT+1 010980 BEQ NOVFL 010990 BCS NOTFOUND 011000 NOVFL INX 011010 CPX SLEN 011020 BNE SRCH1 011030 CLC 011040 TYA 011050 ADC TEXTP 011060 STA TEMP 011070 LDA TEXTP+1 011080 ADC #0 011090 STA TEMP+1 011100 LDA MEMPNT 011110 CMP TEMP 011120 LDA MEMPNT+1 011130 SBC TEMP+1 011140 BCC NOTFOUND 011150 SEC 011160 LDA TEMP 011170 SBC SLEN 011180 STA CURMEM 011190 STA FPOS 011200 LDA TEMP+1 011210 SBC #0 011220 STA CURMEM+1 011230 STA FPOS+1 011240 JSR CHECKMEM 011250 LDY #0 011260 LDA (CURMEM),Y 011270 EOR #$80 011280 STA (CURMEM),Y 011290 JSR SCRDRAW 011300 LDY #0 011310 LDA (CURMEM),Y 011320 EOR #$80 011330 STA (CURMEM),Y 011340 TYA 011350 RTS 011360 NOTFOUND LDA #$FF 011370 STA FPOS+1 011380 RTS 011390 ; 011400 ;This is the replace routine 011410 ; 011420 REPL SEC 011430 LDA CURMEM 011440 STA DEST 011450 SBC FPOS 011460 STA TEMP 011470 LDA CURMEM+1 011480 STA DEST+1 011490 SBC FPOS+1 011500 ORA TEMP 011510 BNE NOREPL 011520 LDA #$FF 011530 STA FPOS+1 011540 CLC 011550 LDA SLEN 011560 ADC CURMEM 011570 STA FROM 011580 LDA #0 011590 ADC CURMEM+1 011600 STA FROM+1 011610 SEC 011620 LDA MEMPNT 011630 SBC DEST 011640 STA MOVELEN 011650 LDA MEMPNT+1 011660 SBC DEST+1 011670 STA MOVELEN+1 011680 BUMP MOVELEN 011690 LDA SLEN 011700 CMP CEND 011710 BEQ DOREPC 011720 JSR UMOVE 011730 SEC 011740 LDA MEMPNT 011750 SBC SLEN 011760 STA MEMPNT 011770 LDA MEMPNT+1 011780 SBC #0 011790 STA MEMPNT+1 011800 LDA CEND 011810 STA INSLEN 011820 LDA #0 011830 STA INSLEN+1 011840 JSR INSBLOCK 011850 DOREPC LDY #0 011860 REPLOOP LDA MYBUF,Y 011870 JSR ASC2IC 011880 STA (CURMEM),Y 011890 INY 011900 CPY CEND 011910 BNE REPLOOP 011920 CLC 011930 LDA CURMEM 011940 ADC CEND 011950 STA CURMEM 011960 LDA CURMEM+1 011970 ADC #0 011980 STA CURMEM+1 011990 NOREPL JMP CHECKMEM 012000 ; 012010 ;Convert char under cursor to 012020 ;UPPER if LOWER and LOWER if 012030 ;UPPER. 012040 ; 012050 CONVERT LDY #0 012060 LDA (CURMEM),Y 012070 AND #63 012080 CMP #33 012090 BCC NOTALP 012100 CMP #59 012110 BCS NOTALP 012120 LDA (CURMEM),Y 012130 EOR #$40 012140 STA (CURMEM),Y 012150 NOTALP JMP GORIGHT 012160 ; 012170 ;This routine forms a line of 012180 ;text for the printer routine. 012190 ;If the end of text is reached 012200 ;it returns a $FF in LPLEN. 012210 ;else, it returns the CIO 012220 ;error code. 012230 ; 012240 LPLINE JSR ERMYBF 012250 LDY #0 012260 PLOOP1 LDA (TEXTP),Y 012270 CMP #EOLCHAR 012280 BEQ FOUNDSPACE 012290 NOTRET STA MYBUF+4,Y ;LMARG=5 012300 INY 012310 CPY #70 ;70 chars? 012320 BCC PLOOP1 012330 STY LPLEN 012340 FINDSPACE LDA (TEXTP),Y 012350 BEQ FOUNDSPACE 012360 DEY 012370 BNE FINDSPACE 012380 LDY LPLEN 012390 FSPACE INY 012400 LDA (TEXTP),Y 012410 BEQ FOUNDSPACE 012420 DEY 012430 FOUNDSPACE STY LPLEN 012440 OVERSTOR TYA 012450 SEC 012460 ADC TEXTP 012470 STA TEXTP 012480 LDA TEXTP+1 012490 ADC #0 012500 STA TEXTP+1 012510 LDY #0 012520 MAKEASC LDA MYBUF+4,Y 012530 JSR IC2ASC 012540 PHA 012550 AND #$7F 012560 CMP #$20 012570 BCS CHR2BUF 012580 CLC 012590 ADC #$C0 012600 TAX 012610 PLA 012620 TXA 012630 CMP #$C0 012640 BNE CHR2BUF1 012650 LDA #EOL 012660 CHR2BUF1 PHA 012670 CHR2BUF PLA 012680 STA MYBUF+4,Y 012690 INY 012700 CPY LPLEN 012710 BNE MAKEASC 012720 LDA #EOL 012730 STA MYBUF+4,Y 012740 JSR LPRINT 012750 BMI LEAVELPL 012760 SEC 012770 LDA TEXTP 012780 SBC MEMPNT 012790 STA TEMP 012800 LDA TEXTP+1 012810 SBC MEMPNT+1 012820 ORA TEMP 012830 BCC LEAVELP 012840 LDA #$FF 012850 STA LPLEN 012860 LEAVELP LDA #0 012870 LEAVELPL RTS 012880 ; 012890 ;This routine counts the 012900 ;number of words in the text 012910 ;in memory. This is a true 012920 ;count, not faked by counting 012930 ;spaces and dividing by two. 012940 ;The count begins from the 012950 ;top of memory. 012960 ; 012970 CNTWORD LDA MEMST 012980 STA TEXTP 012990 LDA MEMST+1 013000 STA TEXTP+1 013010 LDA #0 013020 STA LO1 013030 STA HI1 013040 PRINT WORDTXT 013050 CNTWLP JSR GETWORD 013060 BCC CNTOK 013070 LDY #0 013080 CNTDN LDA DIRPS+17,Y 013090 CMP #EOL 013100 BEQ CNTKEY 013110 JSR ASC2IC 013120 STA LN1+20,Y 013130 INY 013140 BNE CNTDN 013150 CNTKEY JMP GETKEY 013160 CNTOK BUMP LO1 013170 JSR CONBCD 013180 LDY #4 013190 CNTCPY LDA ABUF+1,Y 013200 STA LN1+14,Y 013210 DEY 013220 BPL CNTCPY 013230 BMI CNTWLP 013240 ; 013250 ;This routine finds a word in 013260 ;memory, it skips spaces until 013270 ;it hits a non-space, then 013280 ;looks for another space. 013290 ;Then we check if we are past 013300 ;the end of the text. 013310 ; 013320 GETWORD LDY #0 013330 GETW1 LDA (TEXTP),Y 013340 AND #$7F 013350 BEQ GETUPL 013360 CMP #EOLCHAR 013370 BNE GOTWORD 013380 GETUPL INY 013390 BNE GETW1 013400 INC TEXTP+1 013410 JSR WRDRTS 013420 BCC GETW1 013430 RTS 013440 GOTWORD JSR ENDWORD 013450 LDY #0 013460 GETWSPC LDA (TEXTP),Y 013470 AND #$7F 013480 BEQ ENDWORD 013490 CMP #EOLCHAR 013500 BEQ ENDWORD 013510 INY 013520 BNE GETWSPC 013530 INC TEXTP+1 013540 BNE GETWSPC 013550 ENDWORD TYA 013560 CLC 013570 ADC TEXTP 013580 STA TEXTP 013590 BCC WRDRTS 013600 INC TEXTP+1 013610 WRDRTS LDA TEXTP 013620 SEC 013630 SBC MEMPNT 013640 STA TEMP 013650 LDA TEXTP+1 013660 SBC MEMPNT+1 013670 ORA TEMP 013680 BCC WRDRTS2 013690 BEQ WRDSET 013700 WRDRTS2 RTS 013710 WRDSET CLC 013720 RTS