[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/11/99 22:02:34 PATCH - LS-DOS 6.2 Page 00001 00001 ;PATCH/ASM 00003 ; 0003 00004 ETX EQU 3 000A 00005 LF EQU 10 000D 00006 CR EQU 13 0040 00007 FLAG EQU 01000000B 0010 00008 ABB EQU 00010000B 00009 ; 0000 00010 *GET SVCMAC:3 ;SVC Macro equivalents 00011 ;SVCMAC/ASM - LS-DOS Version VI 00012 *LIST OFF 00404 *LIST ON 0000 00406 *GET COPYCOM:3 ;Copyright message 00407 ; COPYCOM - File for Copyright COMment block 00408 ; 0000 00409 *GET BUILDVER/ASM:3 00410 ; 00411 ; Buildver/asm is a bit of a kludge since not all utilities can load 00412 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00413 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00414 ; for programs that can use that. 00415 ; FFFF 00416 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00417 ; These switches activate patches made since the 1B release. 00418 ; It is important that all earlier patches be enabled when a higher 00419 ; patch is enabled. 00420 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00421 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00422 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00423 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00424 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00425 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00426 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00427 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00428 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00429 ; 00430 ;End of BUILDVER/ASM 00431 IF @BLD631 00433 ELSE 00434 COM '<*(C) 1982,3,4,6 by LSI*>' 00435 ENDIF 00436 ; 2600 00437 ORG 2600H 00438 ; 00439 BEGIN 2600 00440 @@CKBRKC ;Check if Break hit 2600+3E6A 00441 LD A,106 2602+EF 00442 RST 40 2603 2804 00443 JR Z,BEGINA ;Continue if no break 2605 21FFFF 00444 LD HL,-1 ; else abort 2608 C9 00445 RET 00446 ; 00447 BEGINA 2609 ED73BF27 00448 LD (STACK),SP ;Save original stack 260D E5 00449 PUSH HL ;Save ptr to CMD buffer 260E 00450 @@FLAGS ;Set up IY 260E+3E65 00451 LD A,101 2610+EF 00452 RST 40 2611 21C02D 00453 LD HL,HELLO$ 2614 CD1F2D 00454 CALL $DSPLY ;Display the signon msg 00455 ; 00456 ; Get /CMD file off command line 00457 ; 2617 E1 00458 POP HL ;P/u cmd line ptr 2618 117F2D 00459 LD DE,PGMDCB ;Set up for OPEN 261B 00460 @@FSPEC ;Fetch program filespec 261B+3E4E 00461 LD A,78 261D+EF 00462 RST 40 261E C2512D 00463 JP NZ,PGMREQ ;Quit if illegal name 2621 1A 00464 LD A,(DE) 2622 FE2A 00465 CP '*' ;Test for device spec 2624 CA512D 00466 JP Z,PGMREQ ;Abort if not a filespec 2627 E5 00467 PUSH HL ;Save posn on command line 2628 21792D 00468 LD HL,CMDEXT 262B 00469 @@FEXT ;Default ext to /CMD 262B+3E4F 00470 LD A,79 262D+EF 00471 RST 40 262E D5 00472 PUSH DE ;Save ptr to FCB 262F EB 00473 EX DE,HL ;Pt HL at current name 2630 113330 00474 LD DE,FNM$ ;Store the name away 2633 00475 @@FSPEC ; in case of a later error 2633+3E4E 00476 LD A,78 2635+EF 00477 RST 40 2636 D1 00478 POP DE ;Recover FCB 2637 210033 00479 LD HL,PGMBUF ;Buffer for /CMD file I/O 263A 0600 00480 LD B,0 ;Set lrl=256 263C CDEF2C 00481 CALL $OPEN ;Open the file to fix 00482 ; 00483 ; Get /FIX file (if any) 00484 ; 263F E1 00485 POP HL ;Get command line posn 2640 11A02D 00486 LD DE,FIXDCB ;FCB used for /FIX file 2643 00487 @@FSPEC ;See if a filespec is there 2643+3E4E 00488 LD A,78 2645+EF 00489 RST 40 2646 C27426 00490 JP NZ,CKLIN ;If error, ck for parms there 2649 E5 00491 PUSH HL ;Save command line posn 264A 217C2D 00492 LD HL,FIXEXT 264D 00493 @@FEXT ;Use default ext of /FIX 264D+3E4F 00494 LD A,79 264F+EF 00495 RST 40 2650 21A02D 00496 LD HL,FIXDCB ;Pt HL to start of fix filespec 2653 110930 00497 LD DE,NAMFIX$ ;Buffer to hold filename only 2656 0600 00498 LD B,0 ;Init char count to 0 00499 ; 00500 ; Save patch file name for X header 00501 ; 2658 7E 00502 FXNAM LD A,(HL) ;P/u a char of the filespec 2659 23 00503 INC HL 265A FE2F 00504 CP '/' ;Found the /FIX ext? 265C 2811 00505 JR Z,FXNAM2 ;Quit if so 265E FE3A 00506 CP ':' ;Colon yet? 2660 3808 00507 JR C,FXNAM1 ;If less, must be number 2662 FE41 00508 CP 'A' ;A-Z? 2664 3809 00509 JR C,FXNAM2 ;If less, done 2666 FE5B 00510 CP 'Z'+1 ;If not alpha, done 2668 3005 00511 JR NC,FXNAM2 266A 12 00512 FXNAM1 LD (DE),A ;Store the name char 266B 13 00513 INC DE ;Inc storage ptr 266C 04 00514 INC B ;Inc count of name chars 266D 18E9 00515 JR FXNAM ;Loop for more 266F 78 00516 FXNAM2 LD A,B ;Store the length of 2670 320830 00517 LD (NAMLEN$),A ; the /FIX patch file 2673 E1 00518 POP HL ;Recover command line posn 2674 7E 00519 CKLIN LD A,(HL) ;Test command line 2675 FE0D 00520 CP CR ; for end 2677 2845 00521 JR Z,RDFIX ;Go if found 2679 23 00522 INC HL 267A FE20 00523 CP 20H 267C 28F6 00524 JR Z,CKLIN ;Ignore spaces 267E FE28 00525 CP '(' ;Beginning of parm? 2680 C2492D 00526 JP NZ,PRMERR ;Anything else is a parm error 00527 ; 00528 ; Test for REMOVE or special Option parameters 00529 ; Ignore @@PARAM errors, as the parameters may actually 00530 ; be a command line patch. 00531 ; 2683 115730 00532 LD DE,PTBL$ ;Parameter table 2686 E5 00533 PUSH HL ;Save command line ptr 2687 2B 00534 DEC HL ;Back up to '(' 2688 00535 @@PARAM 2688+3E11 00536 LD A,17 268A+EF 00537 RST 40 268B E1 00538 POP HL ;Restore cmd line ptr 268C 010000 00539 LD BC,$-$ ;"Remove" parm response 268D 00540 RPARM1 EQU $-2 268F 79 00541 LD A,C 2690 32472C 00542 LD (RPARM),A ;Set Remove parm 2693 01FFFF 00543 LD BC,-1 ;O parm - bypass need for 2694 00544 OPARM1 EQU $-2 ; Frr,nn line if OFF 2696 79 00545 LD A,C 2697 32412C 00546 LD (OPARM),A ;Set find flag 269A CABE26 00547 JP Z,RDFIX ;If @PARAM was good, there is 00548 ; no cmd line patch code 00549 ; 00550 ; Check for command line patch code (CLP) 00551 ; 269D 010034 00552 LD BC,FIXDATA ;Space allocated for /FIX data 26A0 7E 00553 CKLIN1 LD A,(HL) ;Get char from cmd line 26A1 FE0D 00554 CP CR 26A3 CAB526 00555 JP Z,CKLIN3 ;Show end of CLP 26A6 FE29 00556 CP ')' 26A8 280B 00557 JR Z,CKLIN3 ;End of CLP if so 26AA 23 00558 INC HL ;Bump buffer ptr 26AB FE3A 00559 CP ':' ;Separator between patches? 26AD 2002 00560 JR NZ,CKLIN2 ;If not, store char 26AF 3E0D 00561 LD A,CR ; else show end of this CLP 26B1 02 00562 CKLIN2 LD (BC),A ;Put byte into fix data buff 26B2 03 00563 INC BC ;Bump buff ptr 26B3 18EB 00564 JR CKLIN1 ;Loop til end of cmd line 00565 ; 26B5 3E0D 00566 CKLIN3 LD A,CR ;Put CR into 26B7 02 00567 LD (BC),A ; CLP buffer 26B8 03 00568 INC BC 26B9 3E03 00569 LD A,ETX ;End buffer with ETX 26BB 02 00570 LD (BC),A 26BC 1839 00571 JR DOFIX ;Start patching... 00572 ; 00573 ; P/u the fix info from the FIX file, rather than 00574 ; the command line. 00575 ; 26BE 3A0830 00576 RDFIX LD A,(NAMLEN$) ;P/u len of /FIX filename 26C1 B7 00577 OR A 26C2 CA512D 00578 JP Z,PGMREQ ;If none used, abort 26C5 FDCB12C6 00579 SET 0,(IY+'S'-'A') ;Set open inhibit bit 26C9 11A02D 00580 LD DE,FIXDCB ;Set up & open /FIX file 26CC 210031 00581 LD HL,FIXBUF 26CF 0600 00582 LD B,0 26D1 CDEF2C 00583 CALL $OPEN 26D4 210048 00584 LD HL,PGMDATA ;Pt HL to highest byte avail 26D7 2B 00585 DEC HL ; for fix data 26D8 010034 00586 LD BC,FIXDATA ;Start of /FIX data storage 26DB CD072D 00587 RDFIX1 CALL $GET1 ;Get a char fm /FIX file 26DE 200F 00588 JR NZ,RDFIX2 ;Jump on error 26E0 E67F 00589 AND 7FH ;Strip bit 7 26E2 2810 00590 JR Z,RDFIX3 ;Take 0 as EOF also 26E4 02 00591 LD (BC),A ;Save fix data char 26E5 03 00592 INC BC ;Advance buffer 26E6 E5 00593 PUSH HL ;Save HL tempy 26E7 ED42 00594 SBC HL,BC ;Room in fixdata buffer? 26E9 E1 00595 POP HL 26EA DA4D2D 00596 JP C,TOOBIG ;Abort if patch data too large 26ED 18EC 00597 JR RDFIX1 ; else loop til EOF 00598 ; 26EF FE1C 00599 RDFIX2 CP 1CH ;End of file? 26F1 C2322D 00600 JP NZ,IOERR ;Abort if not 26F4 3E03 00601 RDFIX3 LD A,ETX ;Mark the end of the fix data 26F6 02 00602 LD (BC),A 00603 ; 00604 ; Start patching the target file 00605 ; 26F7 210034 00606 DOFIX LD HL,FIXDATA ;Pt to start of fix data 00607 ; 26FA E5 00608 DOFIX1 PUSH HL 26FB 21882E 00609 LD HL,RDGINP$ ;"reading input... 26FE CD1F2D 00610 CALL $DSPLY 2701 E1 00611 POP HL 2702 226B2D 00612 LD (SETMSG+1),HL ;Used if error in line 2705 3E00 00613 LD A,$-$ 2706 00614 PASS2 EQU $-1 ;Zero if 1st pass thru data 2707 B7 00615 OR A 2708 7E 00616 LD A,(HL) ;P/U a character 2709 CA142C 00617 JP Z,PASS1 ;Go if 1st pass 270C 7E 00618 LD A,(HL) 270D FE03 00619 CP ETX ;End of patch? 270F 285C 00620 JR Z,PCHDUN 2711 FE2E 00621 CP '.' ;Comment? 2713 CAC527 00622 JP Z,COMMENT 2716 CBAF 00623 RES 5,A ;Make upper case 2718 FE46 00624 CP 'F' ;FIND line? 271A CAC527 00625 JP Z,COMMENT ;Skip on 2nd pass or if O=N 271D FE44 00626 CP 'D' ;Start of D line? 271F CAD727 00627 JP Z,DVERB 2722 FE59 00628 CP 'Y' ;Yank previous patch? 2724 CA4228 00629 JP Z,YANK 2727 FE4C 00630 CP 'L' ;Library overlay? 2729 CA0029 00631 JP Z,LVERB 272C FE52 00632 CP 'R' ;Remove parm ? 272E CA3A28 00633 JP Z,REMOVE 2731 FE4F 00634 CP 'O' ;O parm ? 2733 CAD128 00635 JP Z,OVERB 2736 FE58 00636 CP 'X' ;Start of X line? 2738 C2612D 00637 JP NZ,PCHERR ;Error if none of above 00638 ; 00639 ; Verb = 'X' -> patch by hex load address 00640 ; 273B 117F2D 00641 LD DE,PGMDCB ;Rewind the program to 0 273E 010000 00642 LD BC,0 ;Use POSN so EOF 2741 CDF52C 00643 CALL $POSN ; is not changed 2744 CD4D29 00644 CALL POSFIL ;Posn to end of prgfile 00645 ; 2747 F5 00646 PUSH AF ;Save regs fm display routine 2748 E5 00647 PUSH HL 2749 D5 00648 PUSH DE 274A 21AD2E 00649 LD HL,INSPCH$ ;"installing patch... 274D CD1F2D 00650 CALL $DSPLY 2750 D1 00651 POP DE 2751 E1 00652 POP HL 2752 F1 00653 POP AF 00654 ; 2753 FE02 00655 CP 2 ;Be sure type byte = 2 2755 C2452D 00656 JP NZ,FILERR ;Load file format error 2758 3E01 00657 LD A,1 ;Tempy set LRL to 1 275A 32882D 00658 LD (PGMDCB+9),A ; & backspace the file 275D CDFB2C 00659 CALL $BKSP ; to overwrite old xfer addr 2760 AF 00660 XOR A ;Reset LRL to 256 2761 32882D 00661 LD (PGMDCB+9),A 00662 ; 00663 ; Install the X patch at the end of the prgfile 00664 ; 2764 CD8229 00665 CALL STUFNM ;Generate the patch 2767 7E 00666 LD A,(HL) ;HL => ending posn in fix data 2768 FE03 00667 CP ETX ;Did it go til the end? 276A C2612D 00668 JP NZ,PCHERR ;"Patch format error... 00669 ; 00670 ; Patch/operation complete - close the file 00671 ; 276D 3E0D 00672 PCHDUN LD A,CR ;Move cursor to next line 276F CD2B2D 00673 CALL $DSP 2772 117F2D 00674 LD DE,PGMDCB ;Close the program file 2775 00675 @@CLOSE 2775+3E3C 00676 LD A,60 2777+EF 00677 RST 40 2778 C2322D 00678 JP NZ,IOERR 277B 21EE2F 00679 LD HL,YANKMSG ;Set up in case Yank was done 277E 3A732D 00680 LD A,(YNKFLG) ;Was it a Yank? 2781 B7 00681 OR A 2782 2024 00682 JR NZ,EXLOG ;Yes, log out 2784 21962F 00683 LD HL,SUCCES$ ;"function completed.." 2787 00684 @@LOGOT 00685 IFEQ 00H,1 00686 LD HL, 00687 ENDIF 2787+3E0C 00688 LD A,12 2789+EF 00689 RST 40 278A 2A742D 00690 LD HL,(LINCNT) ;P/u # of D & X lines 278D 7C 00691 LD A,H 278E B5 00692 OR L ;Any? 278F 2814 00693 JR Z,NOCHG ;No D or X verbs 2791 E5 00694 PUSH HL ;Save line count 2792 110100 00695 LD DE,1 ;Exactly 1 line? 2795 ED52 00696 SBC HL,DE 2797 E1 00697 POP HL 2798 2005 00698 JR NZ,NTONE ;Go if more than 1 279A 3E20 00699 LD A,' ' ; else remove "s" from message 279C 32C12F 00700 LD (PLURAL),A 279F 11B12F 00701 NTONE LD DE,LINMSG$ ;Put line count into message 27A2 00702 @@HEXDEC ; as decimal ASCII 27A2+3E61 00703 LD A,97 27A4+EF 00704 RST 40 27A5 21B12F 00705 NOCHG LD HL,LINMSG$ 27A8 00706 EXLOG @@LOGOT ;Show how many lines done 00707 IFEQ 00H,1 00708 LD HL, 00709 ENDIF 27A8+3E0C 00710 LD A,12 27AA+EF 00711 RST 40 00712 ; 27AB 210000 00713 LD HL,0 ;Init no error 27AE E5 00714 $QUIT PUSH HL 27AF 217F2D 00715 LD HL,PGMDCB 27B2 CB7E 00716 BIT 7,(HL) ;Was file left open? 27B4 EB 00717 EX DE,HL ;DE=>DCB possible close 27B5 C4D62C 00718 CALL NZ,FLOPN ;Warn user 27B8 3E0E 00719 LD A,14 ;Cursor on 27BA CD2B2D 00720 CALL $DSP 27BD E1 00721 POP HL 27BE 310000 00722 LD SP,$-$ ;P/u original stack 27BF 00723 STACK EQU $-2 27C1 00724 @@CKBRKC ;Clear break 27C1+3E6A 00725 LD A,106 27C3+EF 00726 RST 40 27C4 C9 00727 RET ;Done with the patching 00728 ; 00729 ; Verb = '.' => comment line 00730 ; HL = start of line in fix data 00731 ; Bypass all chars until a terminator is found 00732 ; 27C5 7E 00733 COMMENT LD A,(HL) ;Look for some terminator 27C6 FE03 00734 CP ETX ;End of the fix data? 27C8 CAFA26 00735 JP Z,DOFIX1 ;Back if so 27CB 23 00736 INC HL ; else bump buffer ptr 27CC FE3B 00737 CP ';' ;Logical EOL? 27CE 2804 00738 JR Z,EOL1 ;Back if so 27D0 FE0D 00739 CP CR ;Physical EOL? 27D2 20F1 00740 JR NZ,COMMENT ;Do next char if not 27D4 C3FA26 00741 EOL1 JP DOFIX1 ;Back to the caller 00742 ; 00743 ; Verb = 'D' -> disk record patch 00744 ; 27D7 CDCC2C 00745 DVERB CALL CNTLIN ;Bump line counter 27DA CDE327 00746 CALL DPOSN ;Posn prgfile to Drr,bb 27DD CD0A28 00747 CALL DLINE ;Put or check the patch line 00748 ; depending on which pass 27E0 C3FA26 00749 JP DOFIX1 ;Do next line 00750 ; 27E3 23 00751 DPOSN INC HL ;Bump fix data buffer ptr 27E4 CD922A 00752 CALL PRSFIX ;Get char or hex pair 27E7 0600 00753 LD B,0 ;Put disk record # 27E9 4F 00754 LD C,A ; into BC 27EA 7E 00755 LD A,(HL) ;If no comma, then 27EB FE2C 00756 CP ',' ; get 3rd & 4th digits 27ED 2804 00757 JR Z,DVERB1 ; in case user put in 27EF CD922A 00758 CALL PRSFIX ; a 4 byte record # 27F2 4F 00759 LD C,A 27F3 117F2D 00760 DVERB1 LD DE,PGMDCB ;Position file to record 27F6 CDF52C 00761 CALL $POSN 27F9 7E 00762 LD A,(HL) ;Check for ',' separator 27FA FE2C 00763 CP ',' ; between record and offset 27FC C2612D 00764 JP NZ,PCHERR ;Abort if not found 27FF 23 00765 INC HL ;Pt to offset bytes 2800 CD252D 00766 CALL $READ ;Read the sector 2803 CD922A 00767 CALL PRSFIX ;Make offset binary in A 2806 32842D 00768 LD (PGMDCB+5),A ;Set byte offset in FCB 2809 C9 00769 RET 00770 ; 00771 ; Dual purpose routine that checks a Drr,bb line 00772 ; or installs it into the program file 00773 ; 280A 7E 00774 DLINE LD A,(HL) ;Next byte in line must 280B FE3D 00775 CP '=' ; be '=' 280D C2612D 00776 JP NZ,PCHERR ;Abort if missing 2810 23 00777 DVERB2 INC HL ;Pt to start of patch data 2811 CD962A 00778 DVERB3 CALL PRSFX1 ;Get patch byte as binary in A 2814 CDB82C 00779 CALL PUTORCHK ;Either write it or check it 2817 7E 00780 LD A,(HL) ;P/u next char 2818 FE0D 00781 CP CR ;Go on CR 281A 2811 00782 JR Z,DVERB4A 281C FE3B 00783 CP ';' ;End of logical line? 281E 280C 00784 JR Z,DVERB4 2820 FE22 00785 CP '"' ;Closing dbl-quote? 2822 2808 00786 JR Z,DVERB4 2824 3AAB2A 00787 LD A,(STRFLG+1) ;If in quote string, 2827 B7 00788 OR A ; do not bump HL past 2828 28E6 00789 JR Z,DVERB2 ; the non-existant space 282A 18E5 00790 JR DVERB3 ;No special, do next byte 00791 ; 282C 7E 00792 DVERB4 LD A,(HL) ;Ignore rest of line 282D 23 00793 DVERB4A INC HL 282E FE0D 00794 CP CR 2830 20FA 00795 JR NZ,DVERB4 ;Loop til physical EOL 2832 3A0627 00796 LD A,(PASS2) ;Patching or checking? 2835 B7 00797 OR A ;If patching, need to 2836 C4012D 00798 CALL NZ,$RWRIT ; re-write the sector 2839 C9 00799 RET ;Done w/line 00800 ; 00801 ; Verb = 'R' -> set flag to yank D patch 00802 ; This routine is needed to check the R parm 00803 ; when doing a CLP, in case the parm was entered 00804 ; after the fix data 00805 ; 283A 3EFF 00806 REMOVE LD A,-1 ;Set Reomve parm true and 283C 32472C 00807 LD (RPARM),A ; then ignore all until the 283F C3C527 00808 JP COMMENT ; next logical line 00809 ; 00810 ; Verb = 'Y' -> yanks patch with same name 00811 ; 2842 7E 00812 YANK LD A,(HL) ;Ignore all chars until 2843 23 00813 INC HL ; the physical EOL 2844 FE0D 00814 CP CR 2846 20FA 00815 JR NZ,YANK 00816 ; 2848 E5 00817 PUSH HL ;Save fix data posn 2849 21DC2E 00818 LD HL,YNKPCH$ ;"yanking patch... 284C CD1F2D 00819 CALL $DSPLY 284F 010000 00820 LD BC,0 ;Rewind the file 2852 117F2D 00821 LD DE,PGMDCB 2855 CDF52C 00822 CALL $POSN 2858 CD072D 00823 YANK1 CALL $GET1 ;Get a "type" byte 285B C2C628 00824 JP NZ,YANK9 ;If error, ck for EOF 285E FE07 00825 CP 7 ;Found a patch? 2860 281B 00826 JR Z,YANK4 ;If so, check name 2862 326A28 00827 LD (TYPCOD+1),A ;Stuff type for testing 2865 CD0B2D 00828 CALL $GET ;Get a block length 2868 47 00829 LD B,A ;Set loop counter 2869 3E00 00830 TYPCOD LD A,0 ;Test type 286B 3D 00831 DEC A ;Ck for type 1 (code block) 286C 2008 00832 JR NZ,YANK2 ;Length ok if not 00833 ; 00834 ; Adjust length for 255 & 256 byte code blocks 00835 ; 286E CD0B2D 00836 CALL $GET ;Read 1st two bytes 2871 05 00837 DEC B ; in case the block was 2872 CD0B2D 00838 CALL $GET ; 255+2 or 256+2 2875 05 00839 DEC B 2876 CD0B2D 00840 YANK2 CALL $GET ;Read rest of block 2879 10FB 00841 YANK3 DJNZ YANK2 287B 18DB 00842 JR YANK1 00843 ; 00844 ; Found patch code area, is this the one? 00845 ; 287D CD0B2D 00846 YANK4 CALL $GET ;Get name len fm file 2880 47 00847 LD B,A ;Save len in B 2881 3A0830 00848 LD A,(NAMLEN$) ;P/u fix file name length 2884 B8 00849 CP B ;If no match, not fix 2885 20EF 00850 JR NZ,YANK2 ; to Yank 2887 210930 00851 LD HL,NAMFIX$ ;Pt to yank file name 288A CD072D 00852 YANK5 CALL $GET1 ;Ck for match of yank 288D C27628 00853 JP NZ,YANK2 ; file name with prog 2890 BE 00854 CP (HL) ; patch name 2891 23 00855 INC HL 2892 20E5 00856 JR NZ,YANK3 ;Back if no match 2894 10F4 00857 DJNZ YANK5 00858 ; 00859 ; Found this fix patch - let's yank it 00860 ; 2896 CD0B2D 00861 YANK6 CALL $GET ;Get type code 2899 FE01 00862 CP 1 ;Ignore block if 289B C2BD28 00863 JP NZ,YANK8 ; type <> 1 (code block) 289E 3E01 00864 LD A,1 ;Set LRL=1 & backspace 28A0 32882D 00865 LD (PGMDCB+9),A ; to overwrite the type byte 28A3 CDFB2C 00866 CALL $BKSP 28A6 AF 00867 XOR A ;Set LRL back to 256 28A7 32882D 00868 LD (PGMDCB+9),A 28AA 3E10 00869 LD A,10H ;Change type=1 to =16 28AC CD112D 00870 CALL $PUT ; and write to prgfile 28AF CD012D 00871 CALL $RWRIT ;Force re-write 28B2 CD0B2D 00872 CALL $GET ;Get length byte 28B5 47 00873 LD B,A ; of patch code block 28B6 CD0B2D 00874 YANK7 CALL $GET 28B9 10FB 00875 DJNZ YANK7 ;Posn past the code block 28BB 18D9 00876 JR YANK6 ;Loop through patch blocks 00877 ; 28BD E1 00878 YANK8 POP HL ;Not type 1, done with yank 28BE 3EFF 00879 LD A,0FFH ;Set Yank flag for 28C0 32732D 00880 LD (YNKFLG),A ; exit message dsply 28C3 C36D27 00881 JP PCHDUN 00882 ; 28C6 FE1C 00883 YANK9 CP 1CH ;Got $GET error, was EOF? 28C8 C2322D 00884 JP NZ,IOERR ;Abort if not, else 28CB 21F72E 00885 LD HL,NOYANK$ ; "can't yank, not in file 28CE C3542D 00886 JP ERREXIT 00887 ; 00888 ; Verb = 'O' -> turn FIND on/off 00889 ; Check special O parameter, determine ON or OFF 00890 ; 28D1 23 00891 OVERB INC HL ;Move past O 28D2 7E 00892 LD A,(HL) 28D3 FE3D 00893 CP '=' ;Next char must be '=' 28D5 201D 00894 JR NZ,WHATIS ; or is an error 28D7 23 00895 INC HL ;Bypass the '=' 28D8 7E 00896 LD A,(HL) 28D9 FE0D 00897 CP CR ;Was it CR or ')'? 28DB 281B 00898 JR Z,OISOFF ;O=is OFF 28DD CBAF 00899 RES 5,A ;Make Upper case 28DF FE4E 00900 CP 'N' 28E1 2815 00901 JR Z,OISOFF ;O=N,NO etc. 28E3 FE59 00902 CP 'Y' ;Y=yes 28E5 2810 00903 JR Z,OISON 28E7 FE4F 00904 CP 'O' 28E9 2009 00905 JR NZ,WHATIS ;Not Y/N/ON/OFF! 28EB CDB32C 00906 CALL GETNXT ;Get nxt, already UC 28EE FE46 00907 CP 'F' 28F0 2806 00908 JR Z,OISOFF ;OFF 28F2 FE4E 00909 CP 'N' 28F4 C2612D 00910 WHATIS JP NZ,PCHERR ;Quit if no acceptable flag 00911 ; 28F7 3E 00912 OISON DB 3EH ;LD A,0AFH 28F8 AF 00913 OISOFF XOR A 28F9 32412C 00914 LD (OPARM),A ;Set parm on or off 28FC 2B 00915 DEC HL 28FD C3C527 00916 JP COMMENT ;Ignore rest til logical EOL 00917 ; 00918 ; Verb = 'L' -> indicate patch to library file 00919 ; 2900 23 00920 LVERB INC HL ;Bypass the 'L' 2901 CD922A 00921 CALL PRSFIX ;Get a hex digit pair 2904 4F 00922 LD C,A ;Stuff for later 2905 328F2B 00923 LD (OVRLY+1),A 2908 7E 00924 LD A,(HL) ;Ck for end of line 2909 23 00925 INC HL 290A FE0D 00926 CP CR 290C C2612D 00927 JP NZ,PCHERR ;Error if not 290F CDE92A 00928 CALL FISAM ;Get isam overlay ptrs 2912 F5 00929 PUSH AF ;Save byte offset 2913 3A802D 00930 LD A,(PGMDCB+1) 2916 CBBF 00931 RES 7,A ;Sector operations only 2918 32802D 00932 LD (PGMDCB+1),A 291B 117F2D 00933 LD DE,PGMDCB ;Position the file to 291E CDF52C 00934 CALL $POSN ;Overlay requested 2921 CD252D 00935 CALL $READ ;Read in the sector 2924 F1 00936 POP AF 2925 32842D 00937 LD (PGMDCB+5),A ;Stuff byte offset in FCB 2928 CD4D29 00938 CALL POSFIL ;Adv "positioning... 292B FE04 00939 CP 4 ;End of ISAM overlay? 292D C2452D 00940 JP NZ,FILERR ;If not, "load format er. 2930 3E01 00941 LD A,1 ;Set LRL=1 2932 32882D 00942 LD (PGMDCB+9),A 2935 CDFB2C 00943 CALL $BKSP ;Backspace over the 4 2938 AF 00944 XOR A ;Now set LRL back to 256 2939 32882D 00945 LD (PGMDCB+9),A 293C CD8229 00946 CALL STUFNM ;Do the patch 293F E5 00947 PUSH HL 2940 21C12E 00948 LD HL,BLDMAP$ ;"rebuilding library map. 2943 CD1F2D 00949 CALL $DSPLY 2946 CD3A2B 00950 CALL RPRMAP ;Rebuild the map 2949 E1 00951 POP HL 294A C3FA26 00952 JP DOFIX1 ;Loop 00953 ; 00954 ; Include the rest of Patch/Cmd 00955 ; 294D 00956 *GET PATCHA:3 00957 ;PATCHA/ASM - Continuation of Patch Program 00958 ; 00959 ; Routine to position to file's end 00960 ; 294D E5 00961 POSFIL PUSH HL ;Save fm display call 294E D5 00962 PUSH DE 294F 216F2E 00963 LD HL,POSLD$ ;"positioning ... 2952 CD1F2D 00964 CALL $DSPLY 2955 D1 00965 POP DE 2956 E1 00966 POP HL 00967 ; 2957 CD0B2D 00968 POSFIL1 CALL $GET ;Get a type byte 295A FE20 00969 CP 20H ;X'20' & up are illegal 295C D2452D 00970 JP NC,FILERR 295F FE02 00971 CP 2 ;Transfer address? 2961 C8 00972 RET Z 2962 FE03 00973 CP 3 ;Not really used in 2964 C8 00974 RET Z ; a file, yet... 2965 FE04 00975 CP 4 ;End of ISAM member? 2967 C8 00976 RET Z 2968 FE0A 00977 CP 0AH ;End of ISAM directory? 296A C8 00978 RET Z 296B 4F 00979 LD C,A ;Save type byte 296C CD0B2D 00980 CALL $GET ;Get block length 296F 47 00981 LD B,A ;Save it for countdown 2970 0D 00982 DEC C ;Was type = 1 ? 2971 2008 00983 JR NZ,POSFIL2 ;Jump if not 2973 CD0B2D 00984 CALL $GET ;Read off the load addr 2976 05 00985 DEC B ;Adjust length for each 2977 CD0B2D 00986 CALL $GET 297A 05 00987 DEC B 297B CD0B2D 00988 POSFIL2 CALL $GET ;Read the block 297E 10FB 00989 DJNZ POSFIL2 2980 18D5 00990 JR POSFIL1 ;Loop to next type code 00991 ; 00992 ; Routine to put the patch name header block into the 00993 ; prg data buffer and then position to the next X'' line 00994 ; 2982 E5 00995 STUFNM PUSH HL ;Save posn in fix data 2983 21992E 00996 LD HL,GENPCH$ ;"generating patch... 2986 CD1F2D 00997 CALL $DSPLY 2989 110048 00998 LD DE,PGMDATA 298C 210830 00999 LD HL,NAMLEN$ ;Pt to fix name field 298F 7E 01000 LD A,(HL) 2990 B7 01001 OR A 2991 280C 01002 JR Z,STUFNM2 ;Go if no name len 2993 3E07 01003 LD A,7 ;Set fix patch type 2995 12 01004 LD (DE),A 2996 13 01005 INC DE 2997 46 01006 LD B,(HL) ;Set header length 2998 04 01007 INC B ;Bump to write length 2999 7E 01008 STUFNM1 LD A,(HL) ;P/u name byte 299A 23 01009 INC HL 299B 12 01010 LD (DE),A ;Put in output buffer 299C 13 01011 INC DE 299D 10FA 01012 DJNZ STUFNM1 ;Loop for namelen 01013 ; 299F E1 01014 STUFNM2 POP HL ;Recover posn in fix data 29A0 226B2D 01015 STUFNM3 LD (SETMSG+1),HL ;Start of this line 29A3 7E 01016 LD A,(HL) 29A4 FE03 01017 CP ETX ;End of fix data? 29A6 CA2F2A 01018 JP Z,RIPPLE 29A9 23 01019 INC HL 29AA FE2E 01020 CP '.' ;Comment? 29AC 2809 01021 JR Z,STUFNM4 29AE CBAF 01022 RES 5,A ;In case lower case 29B0 FE58 01023 CP 'X' ;Start of code line? 29B2 2810 01024 JR Z,DOXVB ;Go if so 29B4 C3612D 01025 JP PCHERR ;"patch input format err 01026 ; 29B7 7E 01027 STUFNM4 LD A,(HL) ;In a comment, loop until 29B8 23 01028 INC HL ; end of line 29B9 FE03 01029 CP ETX ;End of patch code? 29BB CA612D 01030 JP Z,PCHERR ;Abort if so 29BE FE0D 01031 CP CR ;EOL? 29C0 20F5 01032 JR NZ,STUFNM4 ;Loop if not 29C2 18DC 01033 JR STUFNM3 01034 ; 01035 ; Do the 'X' verb patch 01036 ; HL => Fix data buffer 01037 ; DE => Program data buffer 01038 ; 29C4 CDCC2C 01039 DOXVB CALL CNTLIN ;Count installed lines 29C7 3E01 01040 LD A,1 ;Show type 1 (code block) 29C9 12 01041 LD (DE),A ;Put in output buffer 29CA 13 01042 INC DE 29CB D5 01043 PUSH DE ;Save ptr to length 29CC 13 01044 INC DE 29CD 7E 01045 LD A,(HL) ;Should be "'" 29CE 23 01046 INC HL ; around address (X'nnnn') 29CF FE27 01047 CP 27H 29D1 C2612D 01048 JP NZ,PCHERR ;Error if not 29D4 CD922A 01049 CALL PRSFIX ;P/u hex digit pair 29D7 47 01050 LD B,A ;Save hi-order address 29D8 CD922A 01051 CALL PRSFIX ;P/u hex digit pair 29DB 12 01052 LD (DE),A ;Stuff lo-order address 29DC 13 01053 INC DE 29DD 78 01054 LD A,B 29DE 12 01055 LD (DE),A ;Stuff hi-order address 29DF 13 01056 INC DE 29E0 7E 01057 LD A,(HL) ;Syntax requires "=" or 29E1 FE3D 01058 CP '=' ; "'" next 29E3 2806 01059 JR Z,DOXVB1 29E5 FE27 01060 CP 27H ;Bypass optional clsng ' 29E7 C2612D 01061 JP NZ,PCHERR ;Error if not ',= 29EA 23 01062 INC HL 29EB 23 01063 DOXVB1 INC HL ;Bypass the '=' 29EC 0602 01064 LD B,2 ;Len of bytes already stuffed 29EE 7E 01065 DOXVB2 LD A,(HL) ;Get char of fix data 29EF FE22 01066 CP '"' ;ASCII string? 29F1 281F 01067 JR Z,DOXVB5 ;Go process if so 29F3 7E 01068 DOXVB3 LD A,(HL) ;P/u line byte 29F4 23 01069 INC HL 29F5 FE3B 01070 CP ';' ;Logical end? 29F7 2811 01071 JR Z,DOXVB4 ;Ignore trailing 29F9 FE0D 01072 CP CR ;End of line? 29FB 282C 01073 JR Z,DOXVB6 29FD FE20 01074 CP 20H 29FF 28ED 01075 JR Z,DOXVB2 ;Ignore spaces 2A01 2B 01076 DEC HL ;Back up, its a byte 2A02 CD962A 01077 CALL PRSFX1 ;Get the hex digit pair 2A05 12 01078 LD (DE),A ;Stuff into code buffer 2A06 13 01079 INC DE 2A07 04 01080 INC B ;Bump block length 2A08 18E9 01081 JR DOXVB3 01082 ; 01083 ; Bypass until end of line 01084 ; 2A0A 7E 01085 DOXVB4 LD A,(HL) ;P/u the character 2A0B 23 01086 INC HL 2A0C FE0D 01087 CP CR ;End of line? 2A0E 20FA 01088 JR NZ,DOXVB4 2A10 1817 01089 JR DOXVB6 01090 ; 01091 ; Fix has double quote string 01092 ; 2A12 23 01093 DOXVB5 INC HL 2A13 7E 01094 LD A,(HL) ;Get next char 2A14 FE03 01095 CP ETX ;End of fix data? 2A16 CA612D 01096 JP Z,PCHERR ;Can't end w/o some EOL 2A19 23 01097 INC HL 2A1A FE0D 01098 CP CR ;End of line? 2A1C CA292A 01099 JP Z,DOXVB6 ;Valid end 2A1F FE22 01100 CP '"' ;Closing quote? 2A21 28D0 01101 JR Z,DOXVB3 ;Go for more 2A23 2B 01102 DEC HL 2A24 12 01103 LD (DE),A ;Stuff the char 2A25 13 01104 INC DE 2A26 04 01105 INC B ;Bump counter 2A27 18E9 01106 JR DOXVB5 ;Loop until end or " 01107 ; 01108 ; Found valid end - update length 01109 ; 2A29 E3 01110 DOXVB6 EX (SP),HL ;Grab length pointer 2A2A 70 01111 LD (HL),B ;Stuff the length 2A2B E1 01112 POP HL 2A2C C3A029 01113 JP STUFNM3 ;Go for more lines 01114 ; 01115 ; Got to the end of the fix input 01116 ; 2A2F E5 01117 RIPPLE PUSH HL 2A30 EB 01118 EX DE,HL ;Last patch byte to HL 2A31 110048 01119 LD DE,PGMDATA ;Pt to patch code buffer 2A34 AF 01120 XOR A 2A35 ED52 01121 SBC HL,DE ;Calc length of fixup 2A37 22C62B 01122 LD (RPRMAP9+1),HL ;Stuff for later 2A3A 21AD2E 01123 LD HL,INSPCH$ ;"installing patch 2A3D CD1F2D 01124 CALL $DSPLY 2A40 217F2D 01125 LD HL,PGMDCB ;Move prog into fix 2A43 11A02D 01126 LD DE,FIXDCB ; file control block 2A46 012000 01127 LD BC,32 ; for output use 2A49 EDB0 01128 LDIR 2A4B 210032 01129 LD HL,LIBBUF ;Set the i/o buffer 2A4E 22A32D 01130 LD (FIXDCB+3),HL 2A51 11A02D 01131 LD DE,FIXDCB ;Reread the last program 2A54 01132 @@RREAD ; sector 2A54+3E45 01133 LD A,69 2A56+EF 01134 RST 40 2A57 C2322D 01135 JP NZ,IOERR ;Quit on read error 01136 ; 01137 ; Now ripple the file down while stuffing bytes 01138 ; 2A5A 210048 01139 LD HL,PGMDATA ;Beginning of "fixed" code 2A5D 11A02D 01140 RIPPL1 LD DE,FIXDCB ;Get prog byte 2A60 CD072D 01141 CALL $GET1 2A63 C27A2A 01142 JP NZ,RIPPL2 2A66 E5 01143 PUSH HL ;Save buffer ptr & byte 2A67 F5 01144 PUSH AF 2A68 117F2D 01145 LD DE,PGMDCB ;Use the output fcb 2A6B 7E 01146 LD A,(HL) ;P/u byte from fixbuf 2A6C CD112D 01147 CALL $PUT ;Put to disk 2A6F ED4BC62B 01148 LD BC,(RPRMAP9+1) ;Pt to patch length 2A73 09 01149 ADD HL,BC ;Pt past patch code 2A74 F1 01150 POP AF ;Recover prog byte 2A75 77 01151 LD (HL),A ; & stuff after fix code 2A76 E1 01152 POP HL ;Rcvr buf ptr 2A77 23 01153 INC HL ;Bump & loop 2A78 18E3 01154 JR RIPPL1 01155 ; 2A7A FE1C 01156 RIPPL2 CP 1CH ;Got to end of file? 2A7C C2452D 01157 JP NZ,FILERR ;Quit on any other error 2A7F 117F2D 01158 LD DE,PGMDCB 2A82 ED4BC62B 01159 LD BC,(RPRMAP9+1) ;Get length of patch 2A86 7E 01160 RIPPL3 LD A,(HL) ;Put rest of program 2A87 23 01161 INC HL ; (ie the bytes = to 2A88 CD112D 01162 CALL $PUT ; length of patch code) 2A8B 0B 01163 DEC BC ;Do until len left = 0 2A8C 78 01164 LD A,B 2A8D B1 01165 OR C 2A8E 20F6 01166 JR NZ,RIPPL3 2A90 E1 01167 POP HL 2A91 C9 01168 RET 01169 ; 01170 ; Routine to read & convert fix code values 01171 ; 2A92 AF 01172 PRSFIX XOR A ;Entry to clear 2A93 32AB2A 01173 LD (STRFLG+1),A ; STRING check 2A96 7E 01174 PRSFX1 LD A,(HL) ;P/u patch char 2A97 FE03 01175 CP ETX ;End of text? 2A99 CA612D 01176 JP Z,PCHERR ;Error if so 2A9C FE22 01177 CP '"' ;String? 2A9E 200A 01178 JR NZ,STRFLG 2AA0 32AB2A 01179 LD (STRFLG+1),A ;Stuff string indicator 2AA3 23 01180 INC HL 2AA4 7E 01181 LD A,(HL) ;P/u char 2AA5 FE03 01182 CP ETX ;End again? 2AA7 CA612D 01183 JP Z,PCHERR 2AAA 3E00 01184 STRFLG LD A,0 ;Test string flag 2AAC B7 01185 OR A 2AAD 7E 01186 LD A,(HL) ;P/u char again 2AAE 23 01187 INC HL ;Bump pointer 2AAF C0 01188 RET NZ ;Ret if '"' was prev char 2AB0 CDD72A 01189 CALL CVTBIN ;Co nvert hex digit to bin 2AB3 4F 01190 LD C,A ;Save value 2AB4 7E 01191 LD A,(HL) ;P/u next digit 2AB5 23 01192 INC HL 2AB6 FE03 01193 CP ETX ;Backup pointer and ret 2AB8 CA612D 01194 JP Z,PCHERR ; if next char is not hex 2ABB FE30 01195 CP '0' ; else pack it into regC 2ABD 3815 01196 JR C,PRSFX3 ; & place in reg A 2ABF FE3A 01197 CP '9'+1 2AC1 3804 01198 JR C,PRSFX2 2AC3 FE41 01199 CP 'A' 2AC5 380D 01200 JR C,PRSFX3 2AC7 CB01 01201 PRSFX2 RLC C ;Assume digit, move 2AC9 CB01 01202 RLC C ; over a nybble 2ACB CB01 01203 RLC C 2ACD CB01 01204 RLC C 2ACF CDD72A 01205 CALL CVTBIN ;Get hex digit 2AD2 B1 01206 OR C ;Merge hi-order nybble 2AD3 C9 01207 RET 2AD4 79 01208 PRSFX3 LD A,C ;Non-hex char, 2AD5 2B 01209 DEC HL ; rcvr & exit 2AD6 C9 01210 RET 01211 ; 01212 ; Routine to convert hex digit to binary 01213 ; 2AD7 D630 01214 CVTBIN SUB 30H ;1st adjustment to binary 2AD9 DA5D2D 01215 JP C,NONHEX ;Quit if too low 2ADC FE0A 01216 CP 10 ;0-9 range? 2ADE D8 01217 RET C ;Back if so 2ADF CBAF 01218 RES 5,A ;In case lower case 2AE1 D607 01219 SUB 7 2AE3 FE10 01220 CP 16 ;Less than F+1? 2AE5 D8 01221 RET C ;Ok if so 2AE6 C35D2D 01222 JP NONHEX ; else abort 01223 ; 01224 ; Routine to find ISAM member pointer in map table 01225 ; 2AE9 117F2D 01226 FISAM LD DE,PGMDCB 2AEC CD072D 01227 FISAM1 CALL $GET1 ;Get a type byte 2AEF 2808 01228 JR Z,FISAM1A ;Go on no error 2AF1 FE1C 01229 CP 1CH ;EOF? 2AF3 CA412D 01230 JP Z,LIBERR ;Invalid library format 2AF6 C3322D 01231 JP IOERR ; else I/O error 2AF9 FE08 01232 FISAM1A CP 8 ;Start of map table? 2AFB 2820 01233 JR Z,FISAM3 2AFD FE0A 01234 CP 0AH ;End of map table? 2AFF CA3D2D 01235 JP Z,NOVRLY ;Should not be end 2B02 C5 01236 PUSH BC 2B03 4F 01237 LD C,A ;Save TYPE 2B04 CD0B2D 01238 CALL $GET ;Get block length 2B07 47 01239 LD B,A ;Set counter & read 2B08 0D 01240 DEC C 2B09 2008 01241 JR NZ,FISAM1B ;Go if not load record 2B0B CD0B2D 01242 CALL $GET ; else read 1st two 2B0E 05 01243 DEC B ; bytes & then fall thru 2B0F CD0B2D 01244 CALL $GET ; in case len=01 or 02 2B12 05 01245 DEC B 2B13 78 01246 FISAM1B LD A,B 2B14 C1 01247 POP BC 2B15 47 01248 LD B,A 2B16 CD0B2D 01249 FISAM2 CALL $GET ;Through the block 2B19 10FB 01250 DJNZ FISAM2 2B1B 18CF 01251 JR FISAM1 ;Go back for more 01252 ; 01253 ; Found a map field 01254 ; 2B1D CD0B2D 01255 FISAM3 CALL $GET ;Get field length 2B20 47 01256 LD B,A ;Set counter 2B21 CD0B2D 01257 CALL $GET ;Get overlay # 2B24 05 01258 DEC B ;Reduce count 2B25 B9 01259 CP C ;Is this the one? 2B26 20EE 01260 JR NZ,FISAM2 ;Loop to next field 2B28 CD0B2D 01261 CALL $GET ;Get lo-order traadr 2B2B CD0B2D 01262 CALL $GET ;Get hi-order transfer 2B2E CD0B2D 01263 CALL $GET ;Get lo-order NRN 2B31 4F 01264 LD C,A ;Save in C 2B32 CD0B2D 01265 CALL $GET ;Get hi-order NRN 2B35 47 01266 LD B,A ;Save in B 2B36 CD0B2D 01267 CALL $GET ;Get byte offset 2B39 C9 01268 RET 01269 ; 01270 ; Routine to repair the library map 01271 ; 2B3A 117F2D 01272 RPRMAP LD DE,PGMDCB ;Rewind the file 2B3D 010000 01273 LD BC,0 2B40 CDF52C 01274 CALL $POSN 2B43 210048 01275 LD HL,PGMDATA ;Pt to buffer area 2B46 CD0B2D 01276 RPRMAP1 CALL $GET ;Read the map into buf 2B49 FE0A 01277 CP 0AH ;End of table? 2B4B 2821 01278 JR Z,RPRMAP3 2B4D 77 01279 LD (HL),A ;Save type code 2B4E CD0B2D 01280 CALL $GET ;Get length 2B51 47 01281 LD B,A ;Set counter 2B52 7E 01282 LD A,(HL) ;Reget the TYPE 2B53 23 01283 INC HL ;Bump where to stuf len 2B54 3D 01284 DEC A ;Is this a load record? 2B55 70 01285 LD (HL),B ;Put length in too 2B56 23 01286 INC HL 2B57 200C 01287 JR NZ,RPRMAP2 ;Go if other type 2B59 CD0B2D 01288 CALL $GET ; else get two extra 2B5C 05 01289 DEC B ; & adjust length in 2B5D 77 01290 LD (HL),A ; case len = 01 or 02 2B5E 23 01291 INC HL 2B5F CD0B2D 01292 CALL $GET 2B62 05 01293 DEC B 2B63 23 01294 INC HL 2B64 77 01295 LD (HL),A 2B65 CD0B2D 01296 RPRMAP2 CALL $GET ;Save member # & rest of 2B68 77 01297 LD (HL),A ; data entries 2B69 23 01298 INC HL 2B6A 10F9 01299 DJNZ RPRMAP2 2B6C 18D8 01300 JR RPRMAP1 01301 ; 01302 ; Found end of table 01303 ; 2B6E 77 01304 RPRMAP3 LD (HL),A ;Show map end 2B6F 210048 01305 LD HL,PGMDATA ;Pt to beginning 2B72 7E 01306 RPRMAP4 LD A,(HL) ;P/u type code 2B73 23 01307 INC HL 2B74 46 01308 LD B,(HL) ;P/u length 2B75 23 01309 INC HL 2B76 FE08 01310 CP 8 ;Map is type 8 2B78 2811 01311 JR Z,RPRMAP6 2B7A FE0A 01312 CP 0AH ;End of map? 2B7C CA3D2D 01313 JP Z,NOVRLY ;Should not have gotten 2B7F 3D 01314 DEC A 2B80 2004 01315 JR NZ,RPRMAP5 2B82 23 01316 INC HL ;You should know what 2B83 05 01317 DEC B ; this is for by now 2B84 23 01318 INC HL 2B85 05 01319 DEC B 2B86 23 01320 RPRMAP5 INC HL ;Bypass this field 2B87 10FD 01321 DJNZ RPRMAP5 2B89 18E7 01322 JR RPRMAP4 01323 ; 01324 ; Found a type 8, check if ISAM # matches 01325 ; 2B8B 7E 01326 RPRMAP6 LD A,(HL) ;P/u member # 2B8C 23 01327 INC HL 2B8D 05 01328 DEC B ;Count down 2B8E FE00 01329 OVRLY CP 0 ;Compare to patched one 2B90 20F4 01330 JR NZ,RPRMAP5 ;Keep reading until found 2B92 23 01331 INC HL ;Bypass transfer address 2B93 23 01332 INC HL 2B94 5E 01333 LD E,(HL) ;P/u the position lo 2B95 23 01334 INC HL 2B96 56 01335 LD D,(HL) ; & the pos hi 2B97 23 01336 INC HL 2B98 4E 01337 LD C,(HL) ; & the byte offset 2B99 78 01338 LD A,B ;Calc ptr to next field 2B9A D604 01339 SUB 4 2B9C 47 01340 LD B,A 2B9D 23 01341 INC HL 2B9E 10FD 01342 DJNZ $-1 ;Loop to next field 2BA0 7E 01343 RPRMAP7 LD A,(HL) ;End of table? 2BA1 FE0A 01344 CP 0AH ;If end, write the 2BA3 2836 01345 JR Z,RWRMAP ; map back to disk 2BA5 23 01346 INC HL ;Pt to field length 2BA6 46 01347 LD B,(HL) 2BA7 23 01348 INC HL ;Pt to member # 2BA8 23 01349 INC HL ;Transfer Low 2BA9 23 01350 INC HL ;Transfer High 2BAA 23 01351 INC HL ;NRN Low 2BAB 78 01352 LD A,B ;Adjust count for 2BAC D604 01353 SUB 4 ; 4 INC HLs 2BAE 47 01354 LD B,A 2BAF 7E 01355 LD A,(HL) ;If position is the same 2BB0 23 01356 INC HL ; as that of patched 2BB1 BB 01357 CP E ; one, its posn has not 2BB2 200F 01358 JR NZ,RPRMAP8 ; changed, so don't 2BB4 7E 01359 LD A,(HL) ; change it 2BB5 23 01360 INC HL 2BB6 05 01361 DEC B 2BB7 BA 01362 CP D ;Cp the hi order 2BB8 200B 01363 JR NZ,RPRMAP9 2BBA 7E 01364 LD A,(HL) 2BBB B9 01365 CP C ; and the offset 2BBC 2007 01366 JR NZ,RPRMAP9 2BBE 23 01367 LPFLD INC HL 2BBF 10FD 01368 DJNZ $-1 ;Loop to end of field 2BC1 18DD 01369 JR RPRMAP7 01370 ; 01371 ; Add the patch length to each position vector 01372 ; 2BC3 23 01373 RPRMAP8 INC HL ;Bump to offset byte 2BC4 05 01374 DEC B 2BC5 110000 01375 RPRMAP9 LD DE,0 ;P/u patch length 2BC8 7E 01376 LD A,(HL) ;P/u offset & add 2BC9 83 01377 ADD A,E ;Lo-order patch length 2BCA 77 01378 LD (HL),A 2BCB 2B 01379 DEC HL ;Pt to NRN 2BCC 2B 01380 DEC HL 2BCD 7E 01381 LD A,(HL) ;P/u NRN lo-order 2BCE 8A 01382 ADC A,D ;Add to it 2BCF 77 01383 LD (HL),A 2BD0 23 01384 INC HL ;Pt to pos hi order 2BD1 7E 01385 LD A,(HL) ;P/u the hi 2BD2 CE00 01386 ADC A,0 ;Add in any carry 2BD4 77 01387 LD (HL),A 2BD5 23 01388 INC HL ;Pt to next map field 2BD6 110000 01389 LD DE,0 2BD9 18E3 01390 JR LPFLD ;Loop 01391 ; 01392 ; Routine to re-write the library map table 01393 ; 2BDB 117F2D 01394 RWRMAP LD DE,PGMDCB ;Rewind the program file 2DE 010000 01395 LD BC,0 2BE1 CDF52C 01396 CALL $POSN 2BE4 210048 01397 LD HL,PGMDATA ;Pt to mapbuf start 2BE7 7E 01398 RWRMAP1 LD A,(HL) ;Ret when we get to 2BE8 FE0A 01399 CP 0AH ; the map end type 2BEA C8 01400 RET Z 2BEB 4F 01401 LD C,A ;Save the type 2BEC 23 01402 INC HL 2BED CD112D 01403 CALL $PUT ;Put the type 2BF0 7E 01404 LD A,(HL) ;P/u length 2BF1 23 01405 INC HL 2BF2 47 01406 LD B,A ;Save as counter 2BF3 CD112D 01407 CALL $PUT ;Put out the length 2BF6 0D 01408 DEC C ;Again, by now... 2BF7 200C 01409 JR NZ,RWRMAP2 2BF9 7E 01410 LD A,(HL) 2BFA 23 01411 INC HL 2BFB CD112D 01412 CALL $PUT 2BFE 05 01413 DEC B 2BFF 7E 01414 LD A,(HL) 2C00 23 01415 INC HL 2C01 CD112D 01416 CALL $PUT 2C04 05 01417 DEC B 2C05 7E 01418 RWRMAP2 LD A,(HL) ;Put block of code 2C06 23 01419 INC HL 2C07 CD112D 01420 CALL $PUT 2C0A 10F9 01421 DJNZ RWRMAP2 2C0C 18D9 01422 JR RWRMAP1 ;Loop for more 01423 ; 01424 ; This routine enters at PASS1. It does the first pass 01425 ; thru the fix data, and checks for parms as well 01426 ; as checking the Drr,bb and Frr,bb matches. 01427 ; 2C0E 320627 01428 SPASS2 LD (PASS2),A ;Flag pass 2 2C11 C3F726 01429 JP DOFIX ;Start over 01430 ; 2C14 FE2E 01431 PASS1 CP '.' ;Comment line? 2C16 2825 01432 JR Z,OK 2C18 FE03 01433 CP ETX ;End of fix data? 2C1A 28F2 01434 JR Z,SPASS2 ;End of pass1 2C1C CBAF 01435 RES 5,A ;Make Upper case 2C1E FE44 01436 CP 'D' ;D line patch? 2C20 281E 01437 JR Z,FCHK 2C22 FE52 01438 CP 'R' ;Remove parm? 2C24 CA3A28 01439 JP Z,REMOVE 2C27 FE4F 01440 CP 'O' ;Special O parm? 2C29 CAD128 01441 JP Z,OVERB 2C2C FE46 01442 CP 'F' ;Find line data? 2C2E 280D 01443 JR Z,OK 2C30 FE59 01444 CP 'Y' ;Yank parm? 2C32 2809 01445 JR Z,OK 2C34 FE4C 01446 CP 'L' ;Library ISAM number? 2C36 2805 01447 JR Z,OK 2C38 FE58 01448 CP 'X' ;X line patch? 2C3A C2612D 01449 JP NZ,PCHERR ;If not one of these, abort 2C3D C3C527 01450 OK JP COMMENT 01451 ; 01452 ; Check the Drr,bb (if Remove) or Frr,bb line 01453 ; 2C40 3EFF 01454 FCHK LD A,0FFH ;If O parm = OFF, then 2C41 01455 OPARM EQU $-1 ; don't do the check 2C42 B7 01456 OR A 2C43 CAC527 01457 JP Z,COMMENT ;Skip check if O=OFF 2C46 3E00 01458 LD A,$-$ ;Remove parm used? 2C47 01459 RPARM EQU $-1 2C48 B7 01460 OR A 2C49 C2862C 01461 JP NZ,YANKD ;Reverse D & F lines if so 2C4C 22772D 01462 LD (DL),HL ;Save D pointer 2C4F CDA02C 01463 CALL SKPLN ;Move to F line 2C52 CD582C 01464 CALL DOCHK ;Cp F line bytes w/file 2C55 C3FA26 01465 JP DOFIX1 01466 ; 01467 ; 01468 ; Checks Drr,bb and Frr,bb addresses for a match 01469 ; Checks Frr,bb against program file if patching, or 01470 ; Drr,bb if removing 01471 ; 2C58 226B2D 01472 DOCHK LD (SETMSG+1),HL ;Set line error msg 2C5B E5 01473 PUSH HL ;Save posn 2C5C ED5B772D 01474 LD DE,(DL) ;Get D or F line 2C60 0603 01475 LD B,3 ;Init check count 2C62 23 01476 CP3 INC HL 2C63 13 01477 INC DE 2C64 1A 01478 LD A,(DE) 2C65 BE 01479 CP (HL) 2C66 C2C62C 01480 JP NZ,FERROR ;'FIND' error 2C69 10F7 01481 DJNZ CP3 ;Check first 3 bytes 01482 ; 2C6B 0603 01483 LD B,3 ;Assume was 2 digit rec # 2C6D 3E2C 01484 LD A,',' ;Comma? 2C6F BE 01485 CP (HL) 2C70 2802 01486 JR Z,CP5 ;Yes, continue 2C72 0605 01487 LD B,5 ;Adjust, assume 4 dig rec # 2C74 23 01488 CP5 INC HL ;Check rest of 'rr,bb' string 2C75 13 01489 INC DE 2C76 1A 01490 LD A,(DE) 2C77 BE 01491 CP (HL) 2C78 C2C62C 01492 JP NZ,FERROR ;'FIND' error 2C7B 10F7 01493 DJNZ CP5 01494 ; 2C7D E3 01495 EX (SP),HL ;Pointer to '=' in fix line 2C7E CDE327 01496 CALL DPOSN ;Posn file 2C81 E1 01497 POP HL 2C82 CD0A28 01498 CALL DLINE ;Check line for match 2C85 C9 01499 RET 01500 ; 01501 ; Remove used. Check Drr,bb lines instead of Frr,bb lines 01502 ; 2C86 E5 01503 YANKD PUSH HL ;Save D line pointer 2C87 CDA02C 01504 CALL SKPLN ;Move to F line 2C8A 22772D 01505 LD (DL),HL ;Save pointer 2C8D E1 01506 POP HL ;=>D line 2C8E E5 01507 PUSH HL ;Save D line again 2C8F CD582C 01508 CALL DOCHK ;Test D line 2C92 E1 01509 POP HL ;=>'D' 2C93 362E 01510 LD (HL),'.' ;Make comment for pass2 2C95 2A772D 01511 LD HL,(DL) 2C98 3644 01512 LD (HL),'D' ;Make 'F' line into D line 2C9A CDA02C 01513 CALL SKPLN ;=>next line 2C9D C3FA26 01514 JP DOFIX1 01515 ; 01516 ; Skip past the current line, posn to start of next 01517 ; 2CA0 CDA92C 01518 SKPLN CALL SKPLN1 ;Move past current line 2CA3 7E 01519 LD A,(HL) ;Check 1st char next line 2CA4 FE2E 01520 CP '.' ;Is it comment? 2CA6 28F8 01521 JR Z,SKPLN ;Then skip it too 2CA8 C9 01522 RET 01523 ; 2CA9 7E 01524 SKPLN1 LD A,(HL) ;P/u line char 2CAA 23 01525 INC HL 2CAB FE0D 01526 CP CR ;Physical EOL? 2CAD C8 01527 RET Z 2CAE FE3B 01528 CP ';' ;Logical EOL? 2CB0 C8 01529 RET Z 2CB1 18F6 01530 JR SKPLN1 ;Loop until EOL 01531 ; 01532 ; Get the next char, convert to UC 01533 ; 2CB3 7E 01534 GETNXT LD A,(HL) ;P/u the char 2CB4 23 01535 INC HL ;Bump the buffer ptr 2CB5 CBAF 01536 RES 5,A ;Convert to upper 2CB7 C9 01537 RET 01538 ; 01539 ; Either write a char or check for a match 01540 ; 2CB8 4F 01541 PUTORCHK LD C,A ;Char in question 2CB9 3A0627 01542 LD A,(PASS2) ;Write pass? 2CBC B7 01543 OR A 2CBD 79 01544 LD A,C ;Char back in A 2CBE C2112D 01545 JP NZ,$PUT ;Writing patch.. 2CC1 CD0B2D 01546 CALL $GET ;Get next char fm file 2CC4 B9 01547 CP C ;Match w/patch? 2CC5 C8 01548 RET Z ;OK if match 2CC6 211130 01549 FERROR LD HL,LOCERR$ ;Init "Find mismatch 2CC9 C3642D 01550 JP ERRDSP ;Dsply and quit 01551 ; 01552 ; Count patch lines 01553 ; 2CCC E5 01554 CNTLIN PUSH HL 2CCD 2A742D 01555 LD HL,(LINCNT) ;Get current count, 2CD0 23 01556 INC HL ; += 1 2CD1 22742D 01557 LD (LINCNT),HL ; and put it back 2CD4 E1 01558 POP HL 2CD5 C9 01559 RET 01560 ; 01561 ; After an error, show file not closed if needed 01562 ; 2CD6 3A762D 01563 FLOPN LD A,(WRFLAG) ;Did we modify file? 2CD9 B7 01564 OR A 2CDA 2007 01565 JR NZ,MESS ;Yes, don't close it 2CDC 01566 @@CLOSE ;No changes 2CDC+3E3C 01567 LD A,60 2CDE+EF 01568 RST 40 2CDF C2322D 01569 JP NZ,IOERR 2CE2 C9 01570 RET 2CE3 212430 01571 MESS LD HL,WARN1$ ;File is modified but 2CE6 CD1F2D 01572 CALL $DSPLY ;PATCH did not complete 2CE9 214B30 01573 LD HL,WARN2$ ; "oops... 2CEC C31F2D 01574 JP $DSPLY ;Then return to caller 01575 ; 2CEF 01576 $OPEN @@OPEN 2CEF+3E3B 01577 LD A,59 2CF1+EF 01578 RST 40 2CF2 203E 01579 JR NZ,IOERR 2CF4 C9 01580 RET 2CF5 01581 $POSN @@POSN 2CF5+3E42 01582 LD A,66 2CF7+EF 01583 RST 40 2CF8 2038 01584 JR NZ,IOERR 2CFA C9 01585 RET 2CFB 01586 $BKSP @@BKSP 2CFB+3E3D 01587 LD A,61 2CFD+EF 01588 RST 40 2CFE 2032 01589 JR NZ,IOERR 2D00 C9 01590 RET 2D01 01591 $RWRIT @@RWRIT 2D01+3E46 01592 LD A,70 2D03+EF 01593 RST 40 2D04 202C 01594 JR NZ,IOERR 2D06 C9 01595 RET 2D07 01596 $GET1 @@GET ;Use this one if prog might get EOF 2D07+3E03 01597 LD A,3 2D09+EF 01598 RST 40 2D0A C9 01599 RET 2D0B 01600 $GET @@GET ;This one if EOF is also error 2D0B+3E03 01601 LD A,3 2D0D+EF 01602 RST 40 2D0E 2022 01603 JR NZ,IOERR 2D10 C9 01604 RET 2D11 C5 01605 $PUT PUSH BC 2D12 4F 01606 LD C,A 2D13 3EFF 01607 LD A,0FFH ;Flag.. 2D15 32762D 01608 LD (WRFLAG),A ;That file is modified 2D18 01609 @@PUT 2D18+3E04 01610 LD A,4 2D1A+EF 01611 RST 40 2D1B C1 01612 POP BC 2D1C 2014 01613 JR NZ,IOERR 2D1E C9 01614 RET 2D1F 01615 $DSPLY @@DSPLY 01616 IFEQ 00H,1 01617 LD HL, 01618 ENDIF 2D1F+3E0A 01619 LD A,10 2D21+EF 01620 RST 40 2D22 200E 01621 JR NZ,IOERR 2D24 C9 01622 RET 2D25 01623 $READ @@READ 2D25+3E43 01624 LD A,67 2D27+EF 01625 RST 40 2D28 2008 01626 JR NZ,IOERR 2D2A C9 01627 RET 2D2B C5 01628 $DSP PUSH BC 2D2C 4F 01629 LD C,A 2D2D 01630 @@DSP 2D2D+3E02 01631 LD A,2 2D2F+EF 01632 RST 40 2D30 C1 01633 POP BC 2D31 C8 01634 RET Z ;If OK else fall error 01635 ; 01636 ; Error handling 01637 ; 2D32 6F 01638 IOERR LD L,A ;HL also gets error # 2D33 2600 01639 LD H,0 2D35 F6C0 01640 OR 0C0H ;Abbrev, return 2D37 4F 01641 LD C,A 2D38 01642 @@ERROR ;Display the error 2D38+3E1A 01643 LD A,26 2D3A+EF 01644 RST 40 2D3B 181D 01645 JR QUIT1 01646 ; 01647 ; Internal error routine 01648 ; 2D3D 211B2F 01649 NOVRLY LD HL,NOVRLY$ ;"Library not found 2D40 DD 01650 DB 0DDH 2D41 21352F 01651 LIBERR LD HL,LIBERR$ ;"Invalid library 2D44 DD 01652 DB 0DDH 2D45 21652F 01653 FILERR LD HL,FILERR$ ;"Not load file format 2D48 DD 01654 DB 0DDH 2D49 215F2E 01655 PRMERR LD HL,PRMERR$ ;"Parm error 2D4C DD 01656 DB 0DDH 2D4D 21CE2F 01657 TOOBIG LD HL,TOOBIG$ ;"Fix file too big 2D50 DD 01658 DB 0DDH 2D51 21442E 01659 PGMREQ LD HL,PGMREQ$ ;"Patch what file? 2D54 01660 ERREXIT @@LOGOT ;Display the error 01661 IFEQ 00H,1 01662 LD HL, 01663 ENDIF 2D54+3E0C 01664 LD A,12 2D56+EF 01665 RST 40 2D57 21FFFF 01666 LD HL,-1 ;Set abort code 2D5A C3AE27 01667 QUIT1 JP $QUIT 01668 ; 2D5D 217C2F 01669 NONHEX LD HL,NONHEX$ ;"Non hex digit 2D60 DD 01670 DB 0DDH 2D61 214C2F 01671 PCHERR LD HL,PCHERR$ ;"Patch format error 2D64 E5 01672 ERRDSP PUSH HL 2D65 3E0D 01673 LD A,CR ;Move the cursor down 2D67 CD2B2D 01674 CALL $DSP 2D6A 210000 01675 SETMSG LD HL,0 2D6D 01676 @@LOGOT 01677 IFEQ 00H,1 01678 LD HL, 01679 ENDIF 2D6D+3E0C 01680 LD A,12 2D6F+EF 01681 RST 40 2D70 E1 01682 POP HL 2D71 18E1 01683 JR ERREXIT 01684 ; 2D73 00 01685 YNKFLG DB 0 ;Was function YANK? 2D74 0000 01686 LINCNT DW 0 ;Count lines installed 2D76 00 01687 WRFLAG DB 0 ;Did pgm write to file? 2D77 0000 01688 DL DW 0 ;Save pointer to line 2D79 43 01689 CMDEXT DB 'CMD' 4D 44 2D7C 46 01690 FIXEXT DB 'FIX' 49 58 2D7F 00 01691 PGMDCB DB 0 2D80 01692 DS 32 2DA0 01693 FIXDCB DS 32 2DC0 50 01694 HELLO$ DB 'PATCH' 41 54 43 48 2DC5 01695 *GET CLIENT:3 01696 ;CLIENT/ASM - File to establish sign-on headers 01697 ; and version numbers. 01698 ; 01699 ; EACH STRING SHOULD CONTAIN ONLY 63 CHARACTERS !! 01700 ; 01701 IF @BLD631 01702 ; 12345678901234567890123456789012345678901234567890 2DC5 20 01703 DB ' - 6.3.1 - Copyright 1982/83/84/86/90 by MISOSYS, ';<631> 2D 20 36 2E 33 2E 31 20 2D 20 43 6F 70 79 72 69 67 68 74 20 31 39 38 32 2F 38 33 2F 38 34 2F 38 36 2F 39 30 20 62 79 20 4D 49 53 4F 53 59 53 2C 20 2DF7 49 01704 DB 'Inc., ',10 ;<631> 6E 63 2E 2C 20 20 20 20 20 20 20 0A 01705 ELSE 01706 DB ' - 6.3.0 - Copyright 1982/83/84/86 by Logical Syst' 01707 DB 'ems, Inc. ',10 01708 ENDIF 01709 ; 01710 ; DB 'All Rights Reserved. Licensed 1982/83/84 to Tandy ' 01711 ; DB 'Corporation.',10,13 01712 ; 01713 ; DB 'All Rights Reserved. Beta-TEST Level/AD, DO NOT DI' 01714 ; DB 'STRIBUTE !! ',10,13 01715 ; DB 'All Rights reserved by LSI, 8970 N. 55th St. Milwa' 01716 ; DB 'ukee, Wisc. ',10,13 2E04 41 01717 DB 'All Rights Reserved. Unauthorized duplication is p' 6C 6C 20 52 69 67 68 74 73 20 52 65 73 65 72 76 65 64 2E 20 55 6E 61 75 74 68 6F 72 69 7A 65 64 20 64 75 70 6C 69 63 61 74 69 6F 6E 20 69 73 20 70 2E36 72 01718 DB 'rohibited. ',10,13 6F 68 69 62 69 74 65 64 2E 20 20 0A 0D 2E44 50 01719 PGMREQ$ DB 'PROGRAM file name required',CR 52 4F 47 52 41 4D 20 66 69 6C 65 20 6E 61 6D 65 20 72 65 71 75 69 72 65 64 0D 2E5F 50 01720 PRMERR$ DB 'Parameter error',CR 61 72 61 6D 65 74 65 72 20 65 72 72 6F 72 0D 2E6F 1D 01721 POSLD$ DB 29,'Positioning load file',30,32,3 50 6F 73 69 74 69 6F 6E 69 6E 67 20 6C 6F 61 64 20 66 69 6C 65 1E 20 03 2E88 1D 01722 RDGINP$ DB 29,'Reading input',30,32,3 52 65 61 64 69 6E 67 20 69 6E 70 75 74 1E 20 03 2E99 1D 01723 GENPCH$ DB 29,'Generating patch',30,32,3 47 65 6E 65 72 61 74 69 6E 67 20 70 61 74 63 68 1E 20 03 2EAD 1D 01724 INSPCH$ DB 29,'Installing patch',30,32,3 49 6E 73 74 61 6C 6C 69 6E 67 20 70 61 74 63 68 1E 20 03 2EC1 1D 01725 BLDMAP$ DB 29,'Re-building library map',30,32,3 52 65 2D 62 75 69 6C 64 69 6E 67 20 6C 69 62 72 61 72 79 20 6D 61 70 1E 20 03 2EDC 1D 01726 YNKPCH$ DB 29,'Yanking patch from file',30,32,3 59 61 6E 6B 69 6E 67 20 70 61 74 63 68 20 66 72 6F 6D 20 66 69 6C 65 1E 20 03 2EF7 0A 01727 NOYANK$ DB LF,'Can''t yank, ' 43 61 6E 27 74 20 79 61 6E 6B 2C 20 2F04 70 01728 DB 'patch not in load file',CR 61 74 63 68 20 6E 6F 74 20 69 6E 20 6C 6F 61 64 20 66 69 6C 65 0D 2F1B 4C 01729 NOVRLY$ DB 'Library overlay not found',CR 69 62 72 61 72 79 20 6F 76 65 72 6C 61 79 20 6E 6F 74 20 66 6F 75 6E 64 0D 2F35 49 01730 LIBERR$ DB 'Invalid library format',CR 6E 76 61 6C 69 64 20 6C 69 62 72 61 72 79 20 66 6F 72 6D 61 74 0D 2F4C 50 01731 PCHERR$ DB 'Patch input format error',CR 61 74 63 68 20 69 6E 70 75 74 20 66 6F 72 6D 61 74 20 65 72 72 6F 72 0D 2F65 4C 01732 FILERR$ DB 'Load file format error',CR 6F 61 64 20 66 69 6C 65 20 66 6F 72 6D 61 74 20 65 72 72 6F 72 0D 2F7C 4E 01733 NONHEX$ DB 'Non-hex digit encountered',CR 6F 6E 2D 68 65 78 20 64 69 67 69 74 20 65 6E 63 6F 75 6E 74 65 72 65 64 0D 2F96 0A 01734 SUCCES$ DB LF,'Patch function completed.',CR 50 61 74 63 68 20 66 75 6E 63 74 69 6F 6E 20 63 6F 6D 70 6C 65 74 65 64 2E 0D 2FB1 20 01735 LINMSG$ DB ' No patch line' 20 20 4E 6F 20 70 61 74 63 68 20 6C 69 6E 65 2FC1 73 01736 PLURAL DB 's installed.',CR 20 69 6E 73 74 61 6C 6C 65 64 2E 0D 2FCE 46 01737 TOOBIG$ DB 'Fix file too big - partition it',CR 69 78 20 66 69 6C 65 20 74 6F 6F 20 62 69 67 20 2D 20 70 61 72 74 69 74 69 6F 6E 20 69 74 0D 2FEE 50 01738 YANKMSG DB 'Patch successfully yanked',CR 61 74 63 68 20 73 75 63 63 65 73 73 66 75 6C 6C 79 20 79 61 6E 6B 65 64 0D 3008 03 01739 NAMLEN$ DB 3 ;Length of fix file name 3009 43 01740 NAMFIX$ DB 'CLP ' ;Fix file name 4C 50 20 20 20 20 20 3011 46 01741 LOCERR$ DB 'FIND line mismatch',CR 49 4E 44 20 6C 69 6E 65 20 6D 69 73 6D 61 74 63 68 0D 3024 57 01742 WARN1$ DB 'WARNING - File ' 41 52 4E 49 4E 47 20 2D 20 46 69 6C 65 20 3033 20 01743 FNM$ DB ' ' 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 304B 20 01744 WARN2$ DB ' Not Closed',CR 4E 6F 74 20 43 6C 6F 73 65 64 0D 01745 ; 3057 80 01746 PTBL$ DB 80H 3058 56 01747 DB FLAG!ABB!6 3059 52 01748 DB 'REMOVE',0 45 4D 4F 56 45 00 3060 8D26 01749 DW RPARM1 3062 41 01750 DB FLAG!1 3063 4F 01751 DB 'O',0 00 3065 9426 01752 DW OPARM1 3067 00 01753 NOP 01754 ; 3100 01755 ORG $<-8+1<+8 3100 01756 FIXBUF DS 256 ;I/O buffer for /FIX 3200 01757 LIBBUF DS 256 ;I/O buffer for ISAM 3300 01758 PGMBUF DS 256 ;I/O buffer for PGM 3400 01759 FIXDATA DS 1400H ;5k alloted for fix data 4800 01760 PGMDATA EQU $ ;Takes the rest of core 01761 ; 2600 01762 END BEGIN 2600 is the transfer address 00000 Total errors
[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]