:LIST 1 * TURBO.EDITOR 2 * BY CLAUDE LEYO 3 * COPYRIGHT (C) 1987 4 * BY MICROSPARC, INC. 5 * CONCORD, MA 01742 6 * 7 * BIG MAC/MERLIN ASSEMBLER 8 * 9 ORG $0900 10 JSR IORTS ;A RETURN INSTRUCTION 11 CLC 12 BCC RELOC 13 WNDWDTH EQU $21 ;WINDOW WIDTH 14 CH EQU $24 15 CV EQU $25 16 BASL EQU $28 17 BASH EQU $29 18 BAS2L EQU $2A 19 BAS2H EQU $2B 20 LENGTH EQU $2F ;INSTR LENGTH 21 CSWL EQU $36 22 CSWH EQU $37 23 KSWL EQU $38 24 LINNUM EQU $50 25 PRGBEG EQU $67 ;PROGRAM BEGINNING ADDRESS 26 GP2 EQU $99 27 GP EQU $9B 28 GP3 EQU $9D 29 FAC EQU $9D ;FLOATING PT ACC 30 CHRGET EQU $B1 31 CHRGOT EQU $B7 32 TXTPTR EQU $B8 33 ERRFLG EQU $D8 ;ONERR FLAG. $80=ACTIVE 34 FBUFFR EQU $0100 35 BUFFER EQU $0200 36 SOFTEV EQU $03F2 ;RESET VECTOR 37 PWREDUP EQU $03F4 38 OURCH EQU $057B ;80-COL CH 39 IORESTP EQU $9AA3 ;RESTORE PRODOS I/O HANDLERS 40 WARMSTD EQU $9DBF ;DOS WARMSTART 41 IORESTD EQU $A851 ;RESTORE DOS I/O HANDLERS 42 WARMSTP EQU $BE00 ;PRODOS WARMSTART 43 PRODBUF EQU $BCBD 44 KBD EQU $C000 45 CLR80COL EQU $C000 46 SET80COL EQU $C001 47 CLR80VID EQU $C00C 48 KBDSTB EQU $C010 49 RD80COL EQU $C018 50 RDPAGE2 EQU $C01C 51 RD80VID EQU $C01F 52 TXTPAGE1 EQU $C054 53 TXTPAGE2 EQU $C055 54 BASICIN EQU $C305 55 KWTKTB EQU $CFD0 ;KEYWORD TOKEN TABLE 56 EINLIN EQU $D533 ;END OF INLIN ROUTINE 57 TOKENR EQU $D559 ;TOKENIZATION ROUTINE 58 FNDLIN EQU $D61A ;SEARCH PROGRAM LINE 59 D72C EQU $D72C ;GET KEYWORD SUBROUTINE 60 LINGET EQU $DA0C ;GET LINE NO FROM TXTPTR 61 STROUT EQU $DB3A ;PRINT STRING 62 FLOAT2 EQU $EBA0 ;FLOAT INTEGER INTO FAC 63 FOUT EQU $ED34 ;CONVERT FAC TO STRING 64 INSDS2 EQU $F88E ;DISASSEMBLER 65 RESET EQU $FA62 66 INIT EQU $FB2F 67 TABV EQU $FB5B 68 VERSION EQU $FBB3 ;FOR ID CHECK 69 BASCAL EQU $FBC1 70 UP EQU $FC1A 71 LF EQU $FC66 72 CLREOL EQU $FC9C 73 CLEOLZ EQU $FC9E 74 RDKEY EQU $FD0C 75 KEYIN EQU $FD1B 76 CROUT EQU $FD8E 77 COUT EQU $FDED 78 SETINV EQU $FE80 79 SETNORM EQU $FE84 80 OUTPORT EQU $FE95 ;PR# (SLOT IN ACC) 81 IORTS EQU $FF58 ;RETURN INSTRUCTION 82 * DEFINITIONS UNIQUE TO TURBO.EDITOR 83 SOURCE EQU $85 ;SOURCE LINE 84 TARGET EQU $86 ;TARGET LINE 85 ILL EQU $87 ;LAST LINE OF BASIC INSTR. 86 IMODE EQU $88 ;INSERT MODE 87 REPL EQU $89 ;REPLACE MODE /V2 88 WNDRIGHT EQU $8A ;CURSOR RIGHTMOST INDEX 89 CHSAVE EQU $8B 90 LFTLMT EQU $8C ;LEFT LIMIT 91 LGTHCD EQU $8D ;LENGTH OF COMMAND 92 RVSLST EQU $8E ;LIST INDICATOR 0=FORWARD 93 * 1=BACKWARD 94 ACCSAVE EQU $92 95 XSAVE EQU $93 96 YSAVE EQU $94 97 YSAVE2 EQU $95 98 CVSAVE EQU $96 99 CRCTR EQU $97 ;CARRIAGE RETURN COUNTER 100 SW1 EQU $98 ;SWITCH USED IN EDIT ROUTINE 101 BLANK EQU $20 ;BLANK CHAR 102 * 103 FNCTIX DFB TBEND-FNCHTB 104 * FUNCTION CHAR TABLE 105 FNCHTB = * 106 HEX 8D ;CARRIAGE RETURN 107 DFB R0-R0 108 HEX 84 ;CTRL-D 109 DFB R1-R0 110 HEX FF ;DEL 111 DFB R1-R0 ;DELETE 112 HEX 8F ;CTRL-O 113 DFB R2-R0 ;OVERRIDE 114 HEX 89 ;CTRL-I 115 DFB R3-R0 ;INSERT 116 HEX 8A ;CTRL-J (DOWN-ARROW) 117 DFB R4-R0 118 HEX 88 ;LEFT-ARROW 119 DFB R5-R0 120 HEX 94 ;CTRL-T 121 DFB R6-R0 ;BACKWARD LIST 122 HEX 82 ;CTRL-B 123 DFB R7-R0 ;FORWARD LIST 124 HEX 92 ;CTL-R /V2 125 DFB R11B-R0 126 HEX 9B ;ESCAPE 127 DFB R8-R0 128 HEX 85 ;CTRL-E 129 DFB R9-R0 ;ERASE END OF INSTRUCTION 130 HEX 8B ;CTRL-K (UP-ARROW) 131 DFB R10-R0 132 HEX 93 ;CTRL-S 133 DFB R11-R0 ;SEARCH 134 HEX 8E ;CTRL-N 135 DFB R12-R0 ;NEXT SEARCH-REPLACE /V2 136 HEX 81 ;CTL-A /V2 137 DFB R13-R0 ;RESTORE BASIC LINE /V2 138 HEX 90 139 DFB R16-R0 ;SET 80-COL 140 HEX 91 ;CTRL-Q 141 DFB R14-R0 ;DEACTIVATE EDITOR (FINISH) 142 TBEND EQU * 143 * 144 KADR = * 145 CTLCSW DFB $0 ;CONTROL CHAR SWITCH 146 PRSW DFB $0 ;PRINTER SWITCH 147 KLIST ASC "LIST" 148 SRCHK ASC "SEARCH:" 149 HEX 00 ;END OF STRING 150 SRCHAG ASC "AAAAAAAAAAAA" 151 HEX 00 ;END OF ARGUMENT 152 REPLK ASC "REPLACE BY:" ;/V2 153 HEX 00 ;/V2 154 REPLV ASC " " ;/V2 155 HEX 00 ;/V2 156 XRSAVE DFB $0 157 YRSAVE DFB $0 158 SINDEX DFB $0 159 MACHTYPE DFB $0 ;PLUS=II+ MINUS=IIE OR IIC 160 D80COL DFB $0 ;80-COL CARD ACTIVE INDIC. 161 LNSAVE HEX 0000 162 SYSTEM DFB $0 163 PRTSLOT DFB $1 ;PRINTER SLOT 164 STRLTH DFB $0 ;STRING LENGTH /V2 165 * 166 BEGIN = * 167 * GENERATE RELOCATABLE ADDRESSES 168 JMPENTRY JMP ENTRY 169 JMPINITR JMP INITRSET 170 JMPKADR JMP KADR 171 JMPLSAVE JMP LINESAVE 172 JMPTABLE JMP TABLE 173 * 174 * ADDRESS RELOCATION 175 * 176 RELOC BCS START ;NO BRANCH ON FIRST TIME 177 TSX 178 LDA $0100,X ;LOAD ADDRESS 179 STA GP+1 180 SEC ;PROG WAS ASSEMBLED 181 SBC #$09 ;WITH ORG $0900 182 STA GP2+1 ;RELOC FACTOR 183 CLC 184 ADC #20 ;+9 TO GET BACK PROG ADDR 185 STA GP3+1 ;+11 (PAGES) PROG LENGTH 186 LDA #BEGIN ;FIRST INSTRUCTION 187 STA GP 188 RELOC10 LDY #$0 189 LDA (GP),Y 190 JSR INSDS2 ;DISASSEMBLE INSTRUCTION 191 LDY LENGTH ;INSTR LENGTH -1 192 CPY #$02 193 BNE SUITE 194 LDA (GP),Y ;GET THIRD BYTE OF INSTR 195 CMP #$09 196 BCC SUITE ;< $0900 197 CMP GP3+1 ;OUTSIDE PROG 198 BCS SUITE 199 CLC 200 ADC GP2+1 ;RELOCATE HIGH BYTE 201 STA (GP),Y 202 SUITE TYA ;LENGTH 203 SEC ;ADD 1 204 ADC GP ;NEXT INSTR 205 STA GP ;ADDRESS 206 LDA GP+1 207 ADC #$0 208 STA GP+1 209 CMP GP3+1 ;END OF PROG 210 BNE RELOC10 211 LDA #$90 ;BCC INSTRUCTION CODE 212 STA RELOC ;NO RELOC ON NEXT ENTRY 213 * 214 * INITIALIZE EDITOR 215 * 216 START LDA CSWH ;DETERMINE SYSTEM USED 217 EOR #$9E ;IF DOS 218 STA SYSTEM ;SYSTEM = 0 219 * 220 LDA #INITRSET ;POINT 221 STA SOFTEV ;RESET VECTOR 222 LDA JMPINITR+2 ;AT EDITOR 223 STA SOFTEV+1 ;RESET HANDLER 224 TORESET EOR #$A5 ;MAKE POWER BYTE 225 STA PWREDUP 226 STA CLR80VID ;40-COLUMN VIDEO 227 JMP RESET 228 * 229 * RESET HANDLER 230 * 231 INITRSET LSR D80COL ;RESET 80-COL ACTIVE INDIC. 232 LDA VERSION ;$EA=2+ $06=IIE OR IIC 233 EOR #$FF ;INVERT SIGN 234 STA MACHTYPE 235 INITKSW LDA #ENTRY ;SET UP 236 LDX JMPENTRY+2 ;KEYBOARD HOOK 237 STA KSWL ;TO POINT TO 238 STX KSWL+1 ;EDITOR ENTRY POINT 239 LDX #$F8 240 TXS 241 BIT SYSTEM 242 BNE WARMP ;BRANCH IF PRODOS 243 JMP WARMSTD 244 WARMP JMP WARMSTP 245 * 246 * DISCONNECT EDITOR 247 * 248 OFF LDA SYSTEM 249 BNE OFF20 250 LDX #WARMSTD 251 LDA #>WARMSTD 252 BNE OFF90 253 OFF20 LDX #WARMSTP 254 LDA #>WARMSTP 255 OFF90 STX SOFTEV ;RESET VECTOR 256 STA SOFTEV+1 257 JMP TORESET 258 * 259 * DETERMINE DISPLAY MODE 260 * RETURN MINUS IF 80-COLUMN 261 * 262 T80COL BIT MACHTYPE ;IIE OR IIC? 263 BPL TRTS ;NO. 40-COL ONLY 264 BIT RD80VID ;WHAT DISPLAY MODE? 265 TRTS RTS 266 * 267 * GET A CHAR FROM SCREEN 268 * 269 GETCHAR LDA (BASL),Y 270 JSR T80COL ;WHAT DISPLAY MODE? 271 BPL GET90 ;40-COL 272 STY YSAVE 273 TYA ;CH TO ACC 274 LSR ;DIVIDE BY 2 275 TAY ;CH TO Y-REG 276 PHP ;LOCK INTERRUPTS WHILE 277 SEI ;SCREENHOLES ARE WRONG 278 LDA TXTPAGE2 ;ASSUME PAGE 2 279 BCC GET80 ;=> IT IS 280 LDA TXTPAGE1 ;ODDS GO TO PAGE1 281 GET80 LDA (BASL),Y ;PICK THE CHAR 282 LDY TXTPAGE1 ;RESTORE PAGE 1 283 PLP ;ALLOW IRQ AGAIN 284 LDY YSAVE 285 GET90 PHA 286 PLA 287 BMI PICKRTS 288 AND #$BF 289 PICKRTS RTS 290 * 291 * STORE A CHAR ON SCREEN 292 * 293 STORECH JSR T80COL ;WHAT DISPLAY MODE? 294 BPL ST40 ;40-COL 295 PHA ;SAVE CHAR 296 STY YSAVE 297 TYA 298 LSR ;DIVIDE BY TWO 299 TAY ;CH TO Y-REG 300 PLA 301 PHP ;LOCK INTERRUPTS WHILE 302 SEI ;SCREENHOLES ARE WRONG 303 PHA 304 LDA TXTPAGE2 ;ASSUME PAGE 2 305 BCC STORE80 ;=> IT IS 306 LDA TXTPAGE1 307 STORE80 PLA ;GET CHAR TO BE STORED 308 STA (BASL),Y ;STUFF ONTO SCREEN 309 LDY TXTPAGE1 ;RESTORE PAGE 1 310 PLP ;ALLOW IRQ AGAIN 311 LDY YSAVE 312 RTS 313 ST40 STA (BASL),Y ;DISPLAY IT 314 RTS 315 * 316 * GET CH (CURSOR HORIZ. POSITION) 317 * 318 GETCH LDY CH 319 BIT D80COL ;80-COL MODE? 320 BPL GETCHRTS ;NO 321 LDY OURCH ;YES 322 GETCHRTS RTS 323 * 324 * GO BACK TO READ KEY 325 * 326 GORDKEY PLA ;BYPASS (PRO)DOS 327 PLA 328 LDA SYSTEM 329 BNE GORDK50 330 JSR IORESTD 331 JMP RDKEY 332 GORDK50 JSR IORESTP 333 JMP RDKEY 334 * 335 * EDITOR ENTRY POINT 336 * 337 ENTRY = * 338 CLD 339 * CALL MONITOR KEYBOARD ROUTINE 340 BIT D80COL ;80-COL CARD ACTIVATED? 341 BPL KEYIN40 ;NO 342 JSR BASICIN ;80-COL 343 JMP ED01 344 KEYIN40 JSR KEYIN 345 ED01 STX XRSAVE 346 STY YRSAVE 347 * WHERE DOES PROGRAM COME FROM? 348 * $D443 IS APPLESOFT MAIN ROUTINE ADDRESS 349 TSX ;GET STACK POINTER 350 LDY $0109,X ;DOES PROGRAM COME 351 CPY #$43 ;FROM APPLESOFT MAIN ROUTINE? 352 BNE KB02 ;CERTAINLY NOT 353 LDY $010A,X ;LOOK FURTHER 354 CPY #$D4 355 KB02 BNE KBRTS 356 * EDITOR IS WORKING 357 LDX XRSAVE 358 PHA ;SAVE CHAR 359 LDA CV 360 STA CVSAVE 361 JSR SETNORM ;NORMAL VIDEO 362 JSR INIT ;SCREEN INITIALIZATION 363 LDY WNDWDTH ;CURSOR RIGHT INDEX 364 DEY ;IS ONE LESS 365 STY WNDRIGHT ;WINDOW WIDTH 366 JSR RESTCV ;RESTORE CV 367 LSR PRSW ;RESET PRINTER SWITCH 368 PLA ;RESTORE CHAR 369 * WHEN 80-COL ACTIVE, RDKEYS RETURNS 370 * SCREEN CHAR ON RIGHT-ARROW INSTEAD OF $95 371 LDY KBD ;GET TRUE KEY CODE 372 CPY #$15 ;RIGHT-ARROW? 373 BNE KB09 ;NO 374 LSR IMODE ;RESET INSERT MODE 375 BIT MACHTYPE ;IIE OR IIC? 376 BPL KBRTS ;NO 377 BIT D80COL ;80-COL MODE? 378 BPL KBRTS ;NO 379 * RIGHT-ARROW (80-COLUMN MODE) 380 INC OURCH 381 LDA OURCH ;IS CURSOR 382 CMP WNDWDTH ;ON RIGHT END? 383 BCC KB11 ;NO 384 JSR CROUT ;YES. CARR. RETURN 385 KB11 LDA #$81 ;CTRL-A WILL BE IGNORED 386 BNE KBRTS ;BY THE MONITOR 387 * 388 * TEST IF CHAR IS A FUNCTION CHAR 389 KB09 LDY FNCTIX ;Y POINT TO END OF TABLE + 1 390 KB10 CMP FNCHTB-2,Y ;CTRL CHAR? 391 BEQ FNCHAR ;YES 392 DEY 393 DEY 394 BNE KB10 395 * ORDINARY CHARACTER 396 STA ACCSAVE ; /V2 397 LDY IMODE ;INSERT MODE IN ACTION? 398 BPL NMODE ;NO. 399 JSR GETCH ;UNDER CURSOR 400 JSR GETCHAR ;IS CHAR 401 CMP #$DD ;A PROMPT CHAR? 402 BEQ KB15 ;YES-NEUTRALIZE INSERT MODE 403 JSR INSERT ; /V2 404 JMP KBRTS ; /V2 405 KB15 LDA ACCSAVE ; /V2 406 JMP GORDKEY 407 NMODE JSR GETCH ;IS CURSOR 408 CPY WNDRIGHT ;ON RIGHT END? 409 BNE KB30 410 JSR NEXTLN ;PROMPT ON NEXT LINE? 411 BNE KB25 ;NO 412 * WE MUST CREATE A BLANK LINE 413 LDY CV ;COME BACK TO LINE 414 DEY ;WHERE CURSOR LIVES 415 STY ILL ;IT'S INSTR LAST LINE 416 JSR MVDOWN ;MOVE NEXT INSTR 1 LINE DOWN 417 KB25 JSR PREVLN ;COME BACK TO CURRENT LINE 418 KB30 LDA ACCSAVE ;RESTORE CHAR /V2 419 R8 = * 420 KBRTS LDX XRSAVE 421 KBRTS2 LDY YRSAVE 422 RTS 423 * 424 * CHAR IS A FUNCTION CHAR 425 FNCHAR LSR IMODE ;RESET INSERT MODE 426 LDX FNCHTB-1,Y ;GET OFFSET FROM TABLE 427 STX NEXTI+1 ;STORE INTO BRANCH INSTR. 428 NEXTI BNE * 429 R0 JMP CR00 430 R1 JSR DELETE ; /V2 431 JMP GORDKEY ; /V2 432 R2 SEC ;SET 433 ROR CTLCSW ;CONTROL CHAR SWITCH 434 R3 SEC ;SET 435 ROR IMODE ;INSERT MODE 436 JMP GORDKEY ;GET NEXT INPUT 437 R4 JSR LF ;LINE FEED 438 JMP GORDKEY 439 R5 LDX #$1 440 JMP KBRTS2 441 R6 JMP BKWLST ;BACKWARD LIST 442 R7 JMP RESLST ;RESUME LIST 443 * 444 * ERASE END OF INSTRUCTION 445 * 446 R9 LDA CV 447 STA CVSAVE 448 JSR GETCH ;FROM CURSOR POSITION 449 ER10 JSR CLEOLZ ;CLEAR END OF LINE 450 JSR NEXTLN ;PROMPT ON NEXT LINE? 451 BNE ER10 ;NO-CLEAR LINE 452 JSR RESTCV ;YES. RESTORE CURSOR 453 JMP GORDKEY ;GET NEXT INPUT 454 * 455 * MOVE CURSOR UP 456 * 457 R10 JSR UP 458 R10A JMP GORDKEY 459 * 460 * PRINT "SEARCH:" 461 * 462 R11 JSR PPONBL ;ON BOTTOM LINE 463 LDA #SRCHK 464 R11A LDY JMPKADR+2 ;/V2 465 JSR STROUT ;PRINT MESSAGE 466 JMP GORDKEY ;GET NEXT INPUT 467 * 468 * PRINT "REPLACE BY:" /V2 469 * 470 R11B JSR PPONBL ;/V2 471 LDA #REPLK ;/V2 472 JMP R11A ;/V2 473 * 474 * NEXT SEARCH-REPLACE /V2 475 * 476 R12 LDA LNSAVE ;RESTORE 477 STA LINNUM ;LINNUM 478 LDA LNSAVE+1 479 STA LINNUM+1 480 JSR FNDLIN 481 JSR MAXLIN 482 JMP SRCH06 483 * 484 * RESTORE BASIC LINE 485 * 486 R13 JMP RESTLINE ; /V2 487 * 488 * DISCONNECT EDITOR 489 * 490 R14 JMP OFF 491 * 492 * SET 80-COL 493 * 494 R16 BIT MACHTYPE ;IIE OR IIC? 495 BPL R10A ;NO 496 TESTCARD LDA RDPAGE2 497 ASL 498 LDA #$88 499 BIT RD80COL 500 STA SET80COL 501 PHP 502 STA TXTPAGE2 503 LDY $0400 504 STA $0400 505 LDA $0400 506 STY $0400 507 PLP 508 BCS STAY2 509 STA TXTPAGE1 510 STAY2 BMI STAY80 511 STA CLR80COL 512 STAY80 CMP #$88 513 BNE R10A 514 LDA #$0 515 STA CH 516 JSR $C300 517 SEC 518 ROR D80COL 519 JMP INITKSW 520 * 521 * ACCESS NEXT LINE ON SCREEN 522 * DOES IT BEGIN WITH ]? 523 * 524 NEXTLN INC CV ;INCR CURSOR V (DOWN 1 LINE) 525 LDA CV 526 CMP #24 ;OFF SCREEN? 527 BEQ EXITNL ;YES-RETURN AS IF PROMPT 528 * ON NEXT LINE 529 JSR BASCAL ;NO-CALCULATE BASE ADDRESS 530 * CHECK PROMPT AS FIRST CHARACTER 531 TESTFC = * 532 LDY #$0 ;GET FIRST 533 JSR GETCHAR ;CHAR FROM LINE 534 CMP #$DD ;PROMPT CHAR? 535 EXITNL RTS 536 * 537 PREVLN EQU UP 538 * 539 RESTCV LDA CVSAVE ;RESTORE CURSOR VERT INDEX 540 * 541 SETCV JMP TABV ;SET CV AND BASL/H FROM ACC 542 * AND RETURN 543 * 544 * PRINT PROMPT ON BOTTOM LINE 545 * 546 PPONBL LDA #$17 ;SET CURSOR ON BOTTOM LINE 547 JSR TABV 548 JSR CROUT ;PRINT CARR RET 549 LDA #$DD ;PROMPT 550 JSR COUT ;PRINT CHAR 551 LDX #0 ;RESTORE BUFFER INDEX 552 RTS 553 * 554 * SET LINNUM TO MAX 555 * 556 MAXLIN LDA #$FF 557 STA LINNUM 558 STA LINNUM+1 559 RTS 560 * 561 * GET NEXT INSTRUCTION ADDRESS 562 * AND STORE IT INTO GP 563 * 564 NXTIAD TAY ;ZERO Y 565 LDA (GP),Y ;GET NEXT 566 TAX ;INSTRUCTION 567 INY ;ADDRESS 568 LDA (GP),Y ;AND 569 STX GP ;STORE IT 570 STA GP+1 ;INTO GP 571 RTS 572 * 573 * CARRIAGE RETURN PROCESSING 574 * 575 CR00 JSR GETCH ;CURSOR POSITION INTO Y-REG 576 TYA ;TRANFER 577 TAX ;TO X-REG 578 * SEARCH BEGINNING OF BASIC LINE, MARKED WITH A PROMPT CHAR 579 SRCHPT JSR TESTFC ;CHECK FOR PROMPT 580 BEQ PROMPT ;PROMPT CHAR FOUND 581 LDA CV ;IF CURSOR IS ON 582 BEQ TOPSCN ;TOP OF SCREEN-STOP SEARCH 583 TXA ;ADD LINE LENGTH 584 SEC ;TO 585 ADC WNDWDTH ;COMMAND 586 TAX ;LENGTH 587 JSR PREVLN ;ACCESS PREVIOUS LINE 588 JMP SRCHPT ;CONTINUE SEARCH 589 PROMPT DEX ;DON'T COUNT PROMPT IN 590 * COMMAND LENGTH 591 LDY #$1 ;START MOVE AFTER PROMPT 592 LDA #$0 ;START COUNT AT 0 593 * (SEE REMOVE BLANKS ROUTINE) 594 BEQ CR99 595 TOPSCN LDY #$0 ;START MOVE FROM FIRST CHAR 596 LDA #$1 ;START COUNT AT 1 597 CR99 PHA 598 STX LGTHCD ;SAVE LENGTH OF ENTRY 599 * 600 * MOVE SCREEN LINE TO BUFFER 601 * 602 LDX #0 ;INDEX BUFFER BEGINNING 603 MOVECH JSR GETCHAR ;GET CHAR. FROM SCREEN 604 STA BUFFER,X ;STORE INTO BUFFER 605 INX ;NEXT CHAR IN BUFFER 606 CPX #$EF ;FILLED BUFFER? 607 BEQ MOVEND ;YES 608 INY ;NO-NEXT CHAR ON SCREEN 609 CPY WNDWDTH ;ENTIRE LINE MOVED? 610 BNE MOVECH ;NO-CONTINUE TO MOVE CHAR 611 JSR NEXTLN ;YES-PROMPT ON NEXT LINE? 612 BNE MOVECH ;NO-CONTINUE TO MOVE 613 JSR PREVLN ;YES. COME BACK TO LAST LINE 614 MOVEND DEX ;LAST CHAR IN BUFFER 615 * 616 * REMOVE BLANK CHAR. AT END OF BUFFER 617 * 618 PLA ;IF FIRST LINE IS 40 619 * LAST IS 39 CHAR LONG 620 TAY ;AND COUNT WILL START AT 1 621 RMVBL LDA BUFFER,X ;GET CHAR IN BUFFER 622 CMP #$A0 ;BLANK? 623 BNE RMVEND ;NO 624 INY ;BLANKS COUNT 625 CPY WNDWDTH ;ONE ENTIRE BLANK LINE? 626 BNE RMV05 ;NO 627 JSR PREVLN ;YES-GO TO PREVIOUS LINE 628 LDY #$0 ;START COUNT AT ZERO 629 RMV05 DEX ;PRECEDING CHAR 630 BNE RMVBL ;CONTINUE IF NOT FIRST 631 * 632 LDA BUFFER ;GET FIRST CHAR FROM BUFFER 633 CMP #$A0 ;BLANK? 634 BEQ DIGIT10 ;EMPTY BUFF. PROCESS AS DIGIT /V2 635 * 636 RMVEND INX 637 * 638 * BYPASS BLANKS CHARACTERS AT BEGINNING OF BUFFER 639 * 640 LDY #0 641 BYPBL LDA BUFFER,Y ;IS CHAR IN BUFFER 642 CMP #$A0 ;A BLANK CHAR? 643 BNE TSPCMD ;NO-TEST IF SPECIAL COMMAND /V2 644 INY ;YES-TEST NEXT CHAR 645 BNE BYPBL 646 * 647 * DOE'S LINE BEGIN WITH . ? /V2 648 * 649 TSPCMD CMP #"." 650 BNE TSTDGT 651 JMP SPCMD 652 * 653 * TEST IF CHAR IS ALPHA OR DIGIT 654 * 655 TSTDGT CMP #$BA 656 BCS ALPHA ;GREATER OR EQUAL IS ALPHA 657 CMP #$B0 658 BCC ALPHA ;LESS IS ALPHA 659 * 660 DIGIT STX XSAVE 661 LDA #LINESAVE 662 STA TXTPTR 663 LDA JMPLSAVE+2 664 STA TXTPTR+1 665 LDY #$7F 666 MVLINE LDA BUFFER,Y 667 AND #$7F 668 STA LINESAVE,Y 669 DEY 670 BPL MVLINE 671 CLC 672 JSR LINGET 673 BCC DIGIT10 674 JSR FNDLIN 675 LDY #$EF 676 SAVEINS LDA (GP),Y 677 STA LINESAVE,Y 678 DEY 679 BNE SAVEINS 680 LDX XSAVE 681 * RETURN TO APPLESOFT TO INSERT MODIFIED BASIC LINE 682 * INTO PROGRAM 683 * 684 * BYPASS MONITOR ROUTINES 685 DIGIT10 PLA ;(PRO)DOS 686 PLA 687 PLA ;RDCHAR 688 PLA 689 PLA ;NXTCHAR 690 PLA 691 LDA SYSTEM 692 BNE DIGIT80 ;BRANCH IF PRODOS 693 DEC CV ;MOVE CURSOR UP 694 JSR IORESTD 695 BNE DIGIT90 696 DIGIT80 LDA #$0 697 STA PRODBUF 698 JSR IORESTP 699 DIGIT90 LDA #$8D ;CARRIAGE RETURN 700 JMP (CSWL) 701 * 702 ALPHA LDX LGTHCD ;LENGTH OF COMMAND 703 * 704 * TEST IF LIST COMMAND 705 * 706 LDY #$3 ;LIST IS A 4-LETTER WORD 707 TLIST LDA BUFFER,Y ;GET CHAR FROM BUFFER 708 CMP KLIST,Y ;CMP TO CHAR IN SAME POSITION 709 BNE TSRCH ;COMMAND IS NOT LIST 710 DEY ;CHECK FURTHER 711 BPL TLIST 712 * 713 * LIST COMMAND 714 * 715 LDY #$04 716 LDA BUFFER,Y 717 CMP #"P" ;LISTP COMMAND? 718 BNE LISTCMD 719 LDA #$A0 ;ERASE THE P LETTER 720 STA BUFFER,Y 721 STA PRSW ;SET PRINTER SWITCH 722 LISTCMD JSR EINLIN ;ZERO HIGH-ORDER BIT 723 * ON RETURN X=FF Y=01 724 STX TXTPTR ;SET TEXT 725 STY TXTPTR+1 ;TO $01FF 726 JSR CHRGET ;GET FIRST CHAR 727 LSR ERRFLG ;DISABLE ON ERROR FLAG 728 JSR TOKENR ;TOKENIZATION ROUTINE 729 JSR CHRGET ;GET LIST TOKEN 730 JSR CHRGET ;GET NEXT CHAR 731 JMP LIST 732 * 733 * TEST IF SEARCH COMMAND 734 * 735 TSRCH LDY #$06 ;SEARCH: 7 LETTERS 736 TSRCH1 LDA BUFFER,Y 737 CMP SRCHK,Y 738 BNE TREPL ;COMMAND IS NOT SEARCH /V2 739 DEY 740 BPL TSRCH1 741 JMP SEARCH ; /V2 742 * 743 * REPLACE COMMAND ? /V2 744 * 745 TREPL LDY #10 ; /V2 746 TREPL1 LDA BUFFER,Y ; /V2 747 CMP REPLK,Y ; /V2 748 BNE TC01 ; /V2 749 DEY ; /V2 750 BPL TREPL1 ; /V2 751 JMP REPLACE ; /V2 752 * 753 * OTHER COMMANDS 754 * 755 TC01 JSR CLREOL ;CLEAR TO END OF LINE 756 LDA #$8D ;CARRIAGE RETURN 757 RTS ;RETURN TO (PRO)DOS 758 * 759 * 760 * LIST 761 * 762 L00 LDA #$8D ;SYNTAX ERROR WILL BE 763 RTS ;PRINTED ON RETURN 764 * 765 LIST = * 766 * PARAMETER AFTER LIST 767 BCC RDLIN1 ;BRANCH IF DIGIT 768 BEQ RDLIN1 ;OR : OR END 769 CMP #$C9 ;TOKEN FOR - 770 BEQ RDLIN1 771 CMP #$2C ;COMMA? 772 BNE L00 ;ERROR 773 RDLIN1 JSR LINGET ;FIRST BASIC LINE TO LIST 774 JSR FNDLIN ;SEARCH THIS LINE 775 JSR CHRGOT ;1ST CHAR OF NEXT PARAMETER 776 BEQ CHKLN2 ;NO PARAMETER 777 * (LINNUM2) PARAMETER PRESENT 778 CMP #$C9 ;TOKEN FOR - 779 BEQ RDLIN2 780 CMP #$2C ;COMMA 781 BNE L00 ;ERROR 782 RDLIN2 JSR CHRGET ;LAST LINE TO LIST 783 JSR LINGET ;INTO LINNUM 784 BNE L00 ;ERROR 785 CHKLN2 LDA LINNUM ;IF LINNUM 786 ORA LINNUM+1 ;IS ZERO 787 BNE SETFWD 788 LTOEND JSR MAXLIN ;LIST UP TO END 789 SETFWD LDA #$0 ;SET 790 STA RVSLST ;FORWARD LIST 791 BIT PRSW ;LIST ON PRINTER? 792 BPL LIST10 ;NO 793 LDA CSWL ;PREPARE 794 STA RSTCSWL+1 ;OUTPUT 795 LDA CSWH ;RETURN 796 STA RSTCSWH+1 ;TO SCREEN 797 LDA PRTSLOT ;PRINTER SLOT 798 JSR OUTPORT ;PR# 799 * CHECK KEYBOARD 800 LIST10 LDA KBD ;READ KEYBOARD 801 BMI ENDLST ;DEPRESSED KEY 802 * GET NEXT INSTRUCTION 803 LDY #$01 ;GET POINTER 804 LDA (GP),Y ;TO NEXT INSTRUCTION 805 BEQ ENDLST ;END OF PROGRAM 806 * INITIALIZE PRINT 807 LDA RVSLST ;BACKWARD LIST? 808 BEQ LIST40 ;NO 809 * INIT PRINT ON TOP LINE 810 LDA #0 811 STA CH ;LEFT END 812 STA OURCH ;80-COL CH 813 JSR SETCV 814 JMP LIST50 815 LIST40 JSR CROUT ;CARRIAGE RETURN 816 LIST50 LDA #$DD 817 JSR COUT ;PRINT PROMPT 818 * GET AND EDIT INSTRUCTION 819 JSR GETINS 820 BCS ENDLST 821 JSR PRTINS ;PRINT INSTRUCTION /V2 822 * END OF INSTRUCTION 823 LDA RVSLST ;BACKWARD LIST? 824 BNE ENDIRV ;YES 825 * END OF INSTRUCTION-FORWARD LIST 826 JSR NXTIAD ;GET NEXT INSTR ADDR 827 JMP LIST10 ;PRINT NEXT INSTR 828 * 829 * END OF INSTRUCTION-BACKWARD LIST 830 * STORE NO. OF LAST LISTED LINE INTO LINNUM 831 ENDIRV LDY #2 ;INSTR NO. INDEX 832 LDA (GP),Y ;GET INSTR NO. (LOW BYTE) 833 STA LINNUM ;STORE INTO LINNUM 834 INY ;DO THE SAME 835 LDA (GP),Y ;FOR HIGH BYTE 836 STA LINNUM+1 837 JMP BK20 ;PROCEED WITH BACKWARD LIST 838 * 839 * END OF LIST 840 * 841 ENDLST BIT KBDSTB ;RESTORE KEYBOARD 842 BIT PRSW ;WAS OUTPUT TO PRINTER? 843 BPL ENDLST10 ;NO 844 JSR CROUT ;CLEAR PRINTER BUFFER 845 LSR PRSW ;YES. RESET PRINT SWITCH 846 RSTCSWL LDA #$0 ;REDIRECT 847 STA CSWL ;OUTPUT 848 RSTCSWH LDA #$0 ;TO 849 STA CSWH ;SCREEN 850 ENDLST10 JSR PPONBL ;PRINT PROMPT ON BOTTOM LINE 851 STX RVSLST ;SET FORWARD MODE 852 JMP GORDKEY ;GET NEXT INPUT 853 * 854 * PRINT INSTRUCTION 855 * 856 PRTINS LDX #0 ;BUFFER INDEX 857 PRTIN10 LDA BUFFER,X ;GET CHAR FROM BUFFER 858 BEQ PRTINRTS ;END OF INSTRUCTION 859 JSR PRTCHR ;PRINT CHAR 860 INX ;NEXT CHAR 861 BNE PRTIN10 862 PRTINRTS RTS 863 * 864 * GET AND EDIT INSTRUCTION 865 * RETURN WITH CARRY SET IF BEYOND LIMIT 866 * 867 GETINS INY ;POINT TO INSTR NO. 868 LDA (GP),Y ;GET LOW BYTE 869 TAX ;INTO X-REG 870 INY ;AND HIGH BYTE 871 LDA (GP),Y ;INTO ACC 872 CMP LINNUM+1 ;COMPARE TO LINNUM 873 BNE GET04 ;CHECK IF GREATER OR SMALLER 874 CPX LINNUM ;IF EQUAL LOOK LOW BYTE 875 BEQ GET06 ;LIMIT IS REACHED 876 GET04 BCC GET06 ;LIMIT IS NOT REACHED 877 RTS ;CARRY SET-INSTR NO. > LINNUM 878 GET06 STY YSAVE 879 STA FAC+1 ;BASIC LINE NO. 880 STX FAC+2 ;INTO FAC 881 LDX #$90 882 SEC 883 JSR FLOAT2 ;FLOAT THE INTEGER 884 JSR FOUT ;CONVERT TO STRING 885 LDX #$0 886 GET07 LDA FBUFFR,X ;MOVE CHAR 887 BEQ GET08 ;(END OF STRING) 888 STA BUFFER,X ;TO BUFFER 889 INX ;NEXT CHAR 890 BNE GET07 891 GET08 LDY YSAVE 892 * 893 GETBLK LDA #BLANK ;TAKE A BLANK CHAR 894 GET09 STA BUFFER,X ;STORE CHAR INTO BUFFER 895 INX 896 * GET NEXT CHARACTER 897 GET10 INY ;POINT TO NEXT CHAR 898 LDA (GP),Y ;GET IT 899 BEQ GETRTS ;RETURN ON END OF INSTRUCTION 900 BPL GET09 ;STORE IT, IF NOT A TOKEN 901 * STORE A BLANK 902 STA SW1 ;RESET SWITCH 903 PHA ;SAVE TOKEN 904 CMP #$CD ;BEFORE "AND" 905 BEQ GET14 ;STORE A BLANK 906 CMP #$CE ;BEFORE "OR" 907 BEQ GET14 ;STORE A BLANK 908 CMP #$C8 ;BEFORE FUNCTION OR OPERATOR 909 BCS GET15 ;DON'T STORE A BLANK 910 GET14 LDA #BLANK ;IS LAST STORED CHAR 911 STA SW1 ;(SET SWITCH) 912 CMP BUFFER-1,X ;A BLANK CHAR? 913 BEQ GET15 ;YES 914 STA BUFFER,X ;NO-STORE A BLANK 915 INX 916 GET15 STX XSAVE ;SAVE BUFFER INDEX 917 * CONVERT TOKEN TO KEYWORD 918 PLA ;RESTORE TOKEN 919 PHA ;SAVE IT AGAIN 920 SEC 921 SBC #$7F ;GET TOKEN 922 TAX ;INTO X-REG 923 STY YSAVE ;SAVE CHAR IN PROCESS INDEX 924 LDY #KWTKTB ;GP3 WILL 925 STY GP3 ;POINT TO 926 LDY #>KWTKTB ;KEYWORD TOKEN 927 STY GP3+1 ;TABLE 928 LDY #$FF 929 GET20 DEX ;REVIEW ALL TOKENS 930 BEQ GET40 ;UNTIL YOU FIND THE RIGHT ONE 931 GET30 JSR D72C ;FOR OTHERS 932 BPL GET30 ;SKIP CHAR IN TABLE 933 BMI GET20 ;UP TO LAST 934 GET40 LDX XSAVE ;RESTORE BUFFER INDEX 935 * PRINT KEYWORD 936 GET50 JSR D72C ;GET CORRESPONDING KEYWORD 937 BMI GET60 ;CHAR UP TO LAST 938 STA BUFFER,X ;AND STORE IT 939 INX 940 JMP GET50 941 GET60 AND #$7F 942 STA BUFFER,X 943 INX 944 LDY YSAVE ;REST. CHAR IN PROCESS INDEX 945 PLA ;GET TOKEN 946 CMP #$B2 ;AFTER REM 947 BEQ GET10 ;DON'T STORE A BLANK 948 CMP #$83 ;AFTER DATA 949 BEQ GET10 ;DON'T STORE A BLANK 950 LDA SW1 ;DEPENDING ON SWITCH SETTING 951 BMI GET10 ;DON'T STORE A BLANK 952 BPL GETBLK ;STORE A BLANK 953 GETRTS LDA #$0 ;MARK END 954 STA BUFFER,X ;OF INSTRUCTION 955 CLC 956 RTS ;AND RETURN 957 * 958 * BACKWARD LIST 959 * 960 BKWLST LDA #0 ;SET TO TOP LINE 961 STA ILL ;INSTR. LAST LINE 962 JSR MAXLIN ;SET LINNUM TO MAX 963 STA CV ;SET CV OUT OF SCREEN 964 BK10 JSR NEXTLN ;PROMPT ON NEXT LINE? 965 BEQ BK15 ;YES 966 BK12 JSR CLRLN ;NO-CLEAR LINE 967 LDA CV ;IS CURSOR 968 CMP #23 ;ON BOTTOM LINE? 969 BEQ BK20 ;YES 970 INC ILL ;NO-INSTR LAST LINE IS 971 BNE BK10 ;1 LINE DOWN. ALWAYS BRANCH 972 * LINE BEGINS WITH PROMPT 973 BK15 JSR SRCHIN ;SEARCH INSTR NUMBER 974 BCS BK12 975 * READ BASIC LINE NO. FROM TEXT, CONVERT TO BINARY 976 * AND STORE INTO LINNUM 977 JSR LINGET 978 * MOVE TEXT TO UPPER LINE 979 BK16 DEC ILL ;UNTIL INSTR. LAST LINE 980 BMI BK17 ;IS ON TOP LINE 981 JSR PPONBL ;CARRIAGE RETURN 982 BEQ BK16 ;BRANCH 983 BK17 INC ILL ;RESET ILL ON TOP LINE 984 * SEARCH PROGRAM FOR LINE WHOSE NUMBER IS NEXT TO LINNUM 985 BK20 LDA #0 ;INDICATE NO INSTRUCTION 986 STA GP+1 ;MEETING REQUIREMENT 987 LDA PRGBEG ;GET PROGRAM 988 LDX PRGBEG+1 ;BEGINNING ADDRESS 989 BK21 STA GP2 ;STORE INTO 990 STX GP2+1 ;POINTER 991 LDY #1 ;POINT TO NEXT INSTR. ADDRESS 992 LDA (GP2),Y ;POINTER TO NEXT INSTR 993 BEQ BK80 ;END OF PROGRAM 994 INY ;POINT TO INSTR 995 INY ;LINE NUMBER 996 LDA (GP2),Y ;TAKE INSTR LINE NO. 997 CMP LINNUM+1 ;COMPARE TO LINNUM HIGH BYTE 998 BEQ BK22 ;IF EQUAL LOOK LOW BYTE 999 BCS BK80 ;SHOULD NOT OCCUR 1000 DEY ;LINE NO. < LINNUM 1001 BCC BK23 ;GOTO SAVE LINE NO. 1002 BK22 DEY ;GET LOW 1003 LDA (GP2),Y ;BYTE OF LINE NO. 1004 CMP LINNUM ;COMPARE TO LINNUM 1005 BCS BK80 ;DON'T SEARCH ANY LONGER 1006 BK23 DEY 1007 * SAVE INSTR ADDRESS INTO GP 1008 * IF NEXT LINE NO. IS EQUAL TO LINNUM, THIS ADDRESS 1009 * WILL BE THE RIGHT ONE 1010 LDA GP2 ;INSTR ADDRESS (LOW BYTE) 1011 STA GP 1012 LDA GP2+1 ;INSTR ADDRESS (HIGH BYTE) 1013 STA GP+1 1014 * TAKE NEXT INSTR. ADDRESS 1015 LDA (GP2),Y ;NEXT INSTR ADDRESS 1016 TAX ;INTO X-REG 1017 DEY ;ACCESS LOW BYTE 1018 LDA (GP2),Y ;AND GET INTO ACC 1019 JMP BK21 1020 * MOVE FULL SCREEN 1 LINE DOWN 1021 BK80 LDA #$FF ;ILL=-1 1022 STA ILL ;MOVE WILL START AT LINE 0 1023 STA RVSLST ;SET BACKWARD LIST 1024 JSR MVDOWN 1025 LDA GP+1 ;ANOTHER INSTR. TO LIST? 1026 BEQ BWDEND ;NO 1027 JMP LIST10 ;YES. PRINT IT 1028 BWDEND JMP ENDLST 1029 * 1030 * SEARCH BASIC INSTRUCTION NUMBER 1031 * 1032 * MOVE LINE FROM SCREEN (STARTING POSITION 1) TO BUFFER 1033 SRCHIN LDY WNDRIGHT ;LINE LENGTH 1034 MVC JSR GETCHAR ;GET CHAR FROM SCREEN 1035 STA BUFFER-1,Y ;STORE IT INTO THE BUFFER 1036 DEY ;INDEX PRECEDING CHAR 1037 BNE MVC ;CONTINUE IF NOT FIRST 1038 LDX WNDRIGHT ;END OF LINE 1039 JSR EINLIN ;MARK END OF LINE 1040 STX TXTPTR ;SET TXTPTR 1041 STY TXTPTR+1 ;TO $01FF 1042 * 1043 * EXAMINE FIRST CHARACTER 1044 JSR CHRGET ;GET FIRST NON-BLANK CHAR 1045 RTS 1046 * 1047 * PRINT CHAR.TEST IF IT WAS ON RIGHT END 1048 * 1049 PRTCHR CMP #$20 ;CONTROL CHAR? 1050 BCS PRT01 ;NO 1051 JSR SETINV ;INVERSE VIDEO 1052 EOR #$40 1053 PRT01 EOR #$80 1054 JSR COUT 1055 JSR SETNORM ;NORMAL VIDEO 1056 JSR GETCH ;GET CURSOR HORIZ POSITION 1057 TYA ;INTO ACC 1058 BNE PRTRTS 1059 * CH IS ZERO-LINE FEED HAS OCCURRED 1060 INC CRCTR ;INCREMENT CARR. RET. CTR 1061 LDA RVSLST ;BACKWARD LIST? 1062 BEQ PRTRTS ;NO 1063 JSR MVDOWN ;YES-MOVE SCREEN 1 LINE DOWN 1064 PRTRTS RTS 1065 * 1066 * LIST RESUME 1067 * 1068 RESLST LDA #$17 ;SET CURSOR TO BOTTOM LINE 1069 JSR TABV 1070 FL00 JSR TESTFC ;DOES LINE BEGIN WITH PROMPT 1071 BEQ FL02 ;YES 1072 FL01 JSR CLRLN ;CLEAR LINE 1073 LDA CV ;GET CURSOR VERT. INDEX 1074 BNE FL01A ;NOT ON TOP LINE 1075 SEC ;ON TOP LINE.SET LINNUM 1076 BCS FL03 ;TO ZERO 1077 FL01A JSR PREVLN ;LOOK PREVIOUS LINE 1078 JMP FL00 1079 * LINE BEGINS WITH PROMPT 1080 FL02 JSR SRCHIN ;SEARCH INSTR NUMBER 1081 BCS FL01 ;NOT A VALID INSTR NO. 1082 PHA 1083 JSR CLRLN ;CLEAR LINE 1084 JSR PREVLN ;PUT CURSOR ON PREVIOUS 1085 PLA 1086 CLC ;CLEARED FOR LINGET ROUTINE 1087 FL03 JSR LINGET ;GET INSTR NO. INTO LINNUM 1088 JSR FNDLIN ;SEARCH PROGRAM LINE 1089 JMP LTOEND 1090 * 1091 * INSERT CHARACTER 1092 * 1093 INSERT LDA CV 1094 STA CVSAVE 1095 IN00 JSR NEXTLN ;SEARCH BEGINNING 1096 BNE IN00 ;OF NEXT INSTRUCTION 1097 JSR PREVLN ;COME BACK TO INSTR LAST LINE 1098 LDA CV ;GET VERTICAL INDEX 1099 STA ILL ;SAVE INSTRUCTION LAST LINE 1100 LDY WNDRIGHT ;IS LAST CHAR 1101 JSR GETCHAR ;OF THE LINE 1102 CMP #$A0 ;A BLANK CHAR? 1103 BEQ IN10 ;YES 1104 * IT'S NOT A BLANK-MOVE NEXT INSTRUCTIONS 1 LINE DOWN 1105 LDA ILL ;IS INSTR LAST LINE 1106 CMP #23 ;ON BOTTOM LINE? 1107 BNE IN05 ;NO 1108 JSR LF ;YES-LINE FEED 1109 DEC CVSAVE 1110 BPL IN10 ;BRANCH 1111 IN05 JSR MVDOWN 1112 IN10 LDA CV ;IS CURRENT LINE 1113 CMP ILL ;LAST LINE OF INSTRUCTION 1114 BEQ IN20 1115 LDY WNDRIGHT ;GET LAST CHAR 1116 JSR GETCHAR ;FROM THE LINE 1117 PHA 1118 JSR NEXTLN ;AND STORE IT 1119 PLA 1120 LDY #0 ;AT BEGINNING 1121 JSR STORECH ;OF NEXT LINE 1122 JSR PREVLN ;GO BACK TO CURRENT LINE 1123 IN20 LDY CV ;IS IT LINE 1124 CPY CVSAVE ;WHERE CURSOR LIVES 1125 BNE IN30 ;NO 1126 JSR GETCH ;CURSOR POSITION 1127 JMP IN031 1128 IN30 LDY #$0 ;OR BEGINNING OF LINE 1129 IN031 STY LFTLMT ;WILL STOP THE MOVE 1130 LDY WNDRIGHT ;STARTING FROM NEXT TO LAST 1131 DEY 1132 IN50 JSR GETCHAR ;GET CHAR 1133 INY ;AND INTO NEXT POSITION 1134 JSR STORECH ;STORE IT 1135 DEY ;COME BACK 1136 DEY ;TO PREVIOUS ONE 1137 BMI IN051 1138 CPY LFTLMT ;LEFT LIMIT REACHED? 1139 BCS IN50 ;NO 1140 IN051 LDA CV ;YES-IS IT THE LINE 1141 CMP CVSAVE ;WHERE CURSOR LIVES 1142 BEQ IN60 ;YES 1143 JSR PREVLN ;NO-EXAMINE PREVIOUS LINE 1144 JMP IN10 1145 IN60 JSR RESTCV ;RESTORE CV 1146 LDA ACCSAVE ;RESTORE CHAR /V2 1147 LDY CTLCSW ;IS CTRL CHAR SWITCH SET? 1148 BPL INRTS 1149 LDY MACHTYPE ;II+? 1150 BPL IN70 ;YES 1151 JSR SETINV ;INVERSE VIDEO 1152 CMP #$E0 ;LOWER CASE? 1153 BCC INRTS ;NO 1154 AND #$DF ;CONVERT TO UPPER CASE 1155 INRTS LSR CTLCSW ;RESET SWITCH 1156 RTS ; /V2 1157 IN70 AND #$3F ;INVERSE VIDEO 1158 JMP INRTS 1159 * 1160 * MOVE DOWN DISPLAYED TEXT 1161 * MOVE LINES AFTER INSTR TO LAST LINE DOWN 1 LINE 1162 * 1163 MVDOWN STY YSAVE2 1164 LDA CV ;SAVE 1165 PHA ;CV 1166 LDA #$17 ;SET CURSOR TO BOTTOM LINE 1167 JSR TABV 1168 LDA ILL ;GET INSTR LAST LINE 1169 CMP #22 1170 BEQ MVCLR ;ILL=22 CLEAR LINE 23 1171 CMP #23 1172 BEQ MVRTS ;ILL=23 DO NOTHING 1173 LDY WNDRIGHT ;STARTING FROM RIGHT END 1174 MV05 JSR GETCHAR ;TEST IF CHAR 1175 CMP #$A0 ;IS BLANK 1176 BNE MV10 ;NO 1177 DEY ;YES 1178 BPL MV05 ;TEST CHAR ON THE LEFT 1179 BMI MV25 ;FULL BLANK LINE 1180 MV10 JSR TESTFC ;PROMPT ON NEXT LINE? 1181 BEQ MV25 ;NO 1182 JSR CLRLN ;YES. CLEAR LINE 1183 LDA CV 1184 BEQ MV25 1185 JSR PREVLN 1186 JMP MV10 1187 MV25 = * 1188 LDY #$01 1189 JSR CLEOLZ 1190 LDY #23 ;BOTTOM LINE IS 1191 STY TARGET ;TARGET LINE 1192 DEY ;PREVIOUS ONE IS 1193 STY SOURCE ;SOURCE LINE 1194 MV30 JSR MV40COL 1195 JSR T80COL ;WHAT DISPLAY MODE? 1196 BPL MV35 ;40-COL 1197 PHP ;ENSURE IRQ INHIBITED 1198 SEI ;WHILE TEXTPAGE2 MAPPED IN 1199 LDA TXTPAGE2 1200 JSR MV40COL 1201 LDA TXTPAGE1 1202 PLP 1203 MV35 = * 1204 DEC TARGET ;NEXT TARGET AND 1205 DEC SOURCE ;NEXT SOURCE ARE 1 LINE UP 1206 LDA SOURCE ;IS NEW SOURCE LINE 1207 CMP ILL ;INSTR LAST LINE? 1208 BNE MV30 ;NO 1209 MVCLR JSR CLRLN ;CLEAR LAST SOURCE LINE 1210 INC ILL ;ILL IS NOW 1 LINE DOWN 1211 MVRTS PLA ;RESTORE CV 1212 JSR SETCV ;AND BASL/H 1213 LDY YSAVE2 1214 RTS 1215 MV40COL = * 1216 LDA TARGET ;TARGET LINE 1217 JSR BASCAL ;BASE ADDRESS 1218 STA BAS2L ;POINTED BY BAS2L 1219 LDA BASH 1220 STA BAS2H ;AND BAS2H 1221 LDA SOURCE ;SOURCE LINE 1222 JSR SETCV ;SET CV AND BASL/H 1223 LDY #39 1224 MV40 LDA (BASL),Y ;GET SOURCE CHAR 1225 STA (BAS2L),Y ;STORE INTO TARGET 1226 DEY ;INDEX PRECEDING CHAR 1227 BPL MV40 ;CONTINUE UP TO FIRST 1228 RTS 1229 * 1230 * CLEAR ENTIRE LINE 1231 * 1232 CLRLN LDY #$0 ;START AT BEGINNING 1233 JSR CLEOLZ ;CLEAR LINE 1234 RTS 1235 * 1236 * DELETE CHARACTER 1237 * 1238 DELETE LDA CV 1239 STA CVSAVE 1240 JSR GETCH ;IS CURSOR 1241 DE00 CPY WNDRIGHT ;ON RIGHT END? 1242 BEQ DE01 ;YES 1243 INY ;GET NEXT 1244 JSR GETCHAR ;CHAR. AND 1245 DEY ;STORE ON LEFT 1246 JSR STORECH ;ONE POSITION 1247 INY ;SKIP ONE 1248 BNE DE00 ;AND CONTINUE 1249 DE01 LDA #$A0 ;STORE BLANK 1250 JSR STORECH ;INTO LAST POSITION 1251 JSR NEXTLN ;PROMPT ON NEXT LINE? 1252 BEQ DE02 ;FOUND 1253 LDY #0 ;TAKE FIRST CHAR. 1254 JSR GETCHAR ;OF THE LINE 1255 PHA 1256 JSR PREVLN ;AND STORE IT 1257 LDY WNDRIGHT ;INTO LAST POSITION 1258 PLA 1259 JSR STORECH ;OF PREVIOUS LINE 1260 JSR NEXTLN ;GO BACK TO LINE 1261 LDY #0 ;IN PROCESS 1262 BEQ DE00 1263 DE02 JSR RESTCV ;RESTORE CURSOR 1264 RTS ; /V2 1265 * 1266 * SEARCH 1267 * 1268 SEARCH = * 1269 LDX #7 ;INDEX SEARCH ARG. BEGINNING 1270 CPX LGTHCD ;COMMAND LESS THAN 7 CHAR? 1271 BCS SRCH47 ;YES-COMMAND IS NOT VALID 1272 LSR REPL ;RESET REPLACE MODE /V2 1273 SRCH02 LDA BUFFER,X ;GET ARGUMENT FROM BUFFER 1274 AND #$7F ;CONVERT TO BASIC CODE 1275 CMP #$60 ;LOWER CASE? 1276 BCC SRCH03 ;NO 1277 AND #$5F ;YES. CONVERT TO UPPER CASE 1278 SRCH03 STA SRCHAG-7,X ;STORE INTO SEARCH ARG. AREA 1279 INX ;NEXT CHAR 1280 CPX #19 ;DON'T ACCEPT MORE 1281 BEQ SRCH04 ;THAN 12 CHAR 1282 CPX LGTHCD ;END OF ARGUMENT? 1283 BNE SRCH02 ;NO 1284 SRCH04 LDA #0 ;MARK END 1285 STA SRCHAG-7,X ;OF SEARCH ARGUMENT 1286 STA LINNUM ;SET LINNUM 1287 STA LINNUM+1 ;TO ZERO 1288 JSR FNDLIN ;SEARCH PROGRAM 1289 SRCH05 JSR MAXLIN ;SET LINNUM TO MAX 1290 STA SINDEX ;SINDEX = -1 1291 SRCH06 LDY #$02 ;GET 1292 LDA (GP),Y ;INSTR NO. 1293 STA LNSAVE ;AND 1294 INY ;STORE IT 1295 LDA (GP),Y 1296 STA LNSAVE+1 ;LNSAVE 1297 LDY #$01 ;END OF 1298 LDA (GP),Y ;PROGRAM? 1299 BEQ SRCH47 ;YES 1300 JSR GETINS ;NO-GET AND EDIT INSTR 1301 SRCH08 INC SINDEX ;EQUAL ZERO ON FIRST TIME 1302 LDY SINDEX 1303 LDA BUFFER,Y 1304 CMP #BLANK 1305 BEQ SRCH08 1306 LDX #$FF ;X = -1 1307 SRCH09 INX ;X = 0 ON FIRST TIME 1308 LDA SRCHAG,X ;GET ARGUMENT CHAR 1309 BEQ SRCH50 ;SEARCHED STRING FOUND 1310 CMP #BLANK ;BLANK? 1311 BEQ SRCH09 1312 SRCH15 STY STRLTH ; /V2 1313 LDA BUFFER,Y ;GET CHAR FROM PROGRAM TEXT /V2 1314 BEQ SRCH45 ;END OF INSTR 1315 CMP #BLANK ;BLANK? 1316 BEQ SRCH40 1317 CMP #$60 ;LOWER CASE? 1318 BCC SRCH16 ;NO 1319 AND #$5F ;YES CONVERT TO UPPER CASE 1320 SRCH16 = * 1321 CMP SRCHAG,X ;COMPARE TO ARGUMENT 1322 BNE SRCH08 1323 INY ;NEXT PROGRAM CHAR 1324 BNE SRCH09 ;CONTINUE 1325 SRCH40 INY ;NEXT PROGRAM CHAR 1326 BNE SRCH15 ;CONTINUE 1327 SRCH45 JSR NXTIAD ;GET NEXT INSTR ADDRESS 1328 BNE SRCH05 1329 SRCH47 LDA #$FF ;SET 1330 STA LNSAVE ;SAVED LINE NO. 1331 STA LNSAVE+1 ;TO MAX 1332 JMP ENDLST ;PRINT PROMPT,GET NEXT INPUT 1333 SRCH50 JSR PPONBL ;PRINT PROMPT CHAR 1334 SRCH65 LDA BUFFER,X ;GET CHAR FROM BUFFER 1335 BEQ SRCH80 ;END OF INSTR TEXT 1336 CPX SINDEX ;WHEN THE FIRST CHAR 1337 BNE SRCH75 ;OF THE STRING IS REACHED 1338 JSR GETCH 1339 STY CHSAVE 1340 LDY #0 ;AND START 1341 STY CRCTR ;COUNTING CARR. RETURN 1342 SRCH75 JSR PRTCHR ;PRINT CHAR 1343 INX 1344 BNE SRCH65 1345 SRCH80 LDY CRCTR ;MOVE CURSOR UP 1346 BEQ SRCH85 ;A NO. OF TIMES 1347 SRCH82 JSR UP ;EQUAL TO THE NO. 1348 DEY ;OF CARRIAGE RETURNS 1349 BNE SRCH82 1350 SRCH85 LDY CHSAVE 1351 STY CH 1352 STY OURCH 1353 BIT REPL ;REPLACE MODE ? /V2 1354 BMI REPL05 ;YES /V2 1355 JMP GORDKEY 1356 * 1357 * REPLACE 1358 * 1359 REPLACE = * 1360 LDX #11 1361 CPX LGTHCD 1362 BCS SRCH47 1363 REPL02 LDA BUFFER,X 1364 AND #$7F 1365 STA REPLV-11,X 1366 INX 1367 CPX #23 1368 BEQ REPL04 1369 CPX LGTHCD 1370 BNE REPL02 1371 REPL04 LDA #0 1372 STA REPLV-11,X 1373 LDA #$FF 1374 STA SINDEX 1375 SEC ;SET 1376 ROR REPL ;REPLACE MODE 1377 JMP R12 ;NEXT SEARCH /V2 1378 REPL05 LDX STRLTH 1379 REPL06 CPX SINDEX 1380 BCC REPL08 ; /V2 1381 JSR DELETE 1382 DEX 1383 BNE REPL06 ; /V2 1384 REPL08 LDX #0 1385 REPL09 LDA REPLV,X 1386 BEQ REPL11 1387 STA ACCSAVE 1388 JSR INSERT 1389 INX 1390 BNE REPL09 1391 REPL11 LDA #REPLV 1392 JMP R11A ;DISPLAY AND READ NEXT KEY 1393 * 1394 * 1395 * RESTORE BASIC LINE 1396 * 1397 RESTLINE = * 1398 LDA #LINESAVE 1399 STA GP 1400 LDA JMPLSAVE+2 1401 STA GP+1 1402 JSR MAXLIN 1403 LDY #1 1404 JSR GETINS 1405 JSR PPONBL 1406 JSR PRTINS 1407 JMP GORDKEY 1408 * 1409 * 1410 SPCMD INY 1411 LDA BUFFER,Y ;GET NEXT CHAR /V2 1412 STA ACCSAVE 1413 LDY JMPTABLE+2 1414 DEY 1415 STY SPC40+2 1416 LDY #$0 1417 SPC10 JSR SPCGET 1418 BEQ SPCRTS 1419 CMP ACCSAVE 1420 BEQ SPCHAR 1421 SPC20 JSR SPCGET 1422 BNE SPC20 1423 BEQ SPC10 1424 SPCHAR LDX #0 1425 JSR PPONBL 1426 SPC30 JSR SPCGET 1427 BEQ SPCRTS 1428 JSR COUT 1429 STA BUFFER,X 1430 INX 1431 BNE SPC30 1432 SPCRTS LDA #$8D 1433 RTS 1434 SPCGET INY 1435 BNE SPC40 1436 INC SPC40+2 1437 SPC40 LDA TABLE,Y 1438 RTS 1439 * 1440 LINESAVE DS 240 1441 * 1442 TABLE = * 1443 ASC "1" 1444 ASC "CATALOG,D1" 1445 HEX 00 1446 ASC "2" 1447 ASC "CATALOG,D2" 1448 HEX 00 1449 ASC "*" 1450 ASC "CALL-151" 1451 HEX 00 1452 HEX 00 ;END OF TABLE 1453 FIN EQU * :