[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/19/99 01:24:51 SPOOL - LS-DOS 6.2 Page 00001 00001 ;LBSPOOL/ASM - Spool command 00003 ; 0000 00004 *GET LBSPOOLA:3 00005 ;LBSPOOLA/ASM - SPOOL setup 00006 ; 002C 00007 PAR_ERR EQU 44 ;Parameter Error 0003 00008 ETX EQU 3 000D 00009 CR EQU 13 0028 00010 RST28 EQU 28H 2300 00011 LOWBUF$ EQU 2300H ;Low memory disk I/O buff 001F 00012 KITSK@ EQU 31 ;FLGTAB+31 00013 ; 0000 00014 *GET SVCMAC:3 ;SVC Macro equivalents 00015 ;SVCMAC/ASM - LS-DOS Version VI 00016 *LIST OFF 00408 *LIST ON 00410 *LIST OFF ;Get LDOS60/EQU 00548 *LIST ON 00549 ; 2400 00550 ORG 2400H 00551 ; 00552 ; Save stack & call Spool routine 00553 ; 2400 ED730B24 00554 SPOOL LD (SAVESP+1),SP ;Save SP 2404 CD5924 00555 CALL SPOOL1 ;Call SPOOL Code 2407 210000 00556 EXIT LD HL,0 ;Successful exit 00557 ; 00558 ; P/u stack & clear any pending00559 ; 240A 310000 00560 SAVESP LD SP,$-$ ;P/u original stack 240D 00561 @@CKBRKC ;Clear any 240D+3E6A 00562 LD A,106 240F+EF 00563 RST 40 2410 C9 00564 RET ;Ret to DOS 00565 ; 00566 ; Informative Message Exit 00567 ; 2411 217D29 00568 CLEARD LD HL,CLEARD$ 2414 DD 00569 DB 0DDH 2415 21A829 00570 RESUMD LD HL,RESUMD$ 2418 DD 00571 DB 0DDH 2419 219229 00572 PAUSED LD HL,PAUSED$ 241C DD 00573 DB 0DDH 241D 213A2A 00574 SPLACT LD HL,SPLACT$ 2420 DD 00575 DB 0DDH 2421 21D529 00576 SPLONM LD HL,SPLONM$ 2424 DD 00577 DB 0DDH 2425 21BF29 00578 SPLOFM LD HL,SPLOFM$ 2428 DD 00579 DB 0DDH 2429 21EF29 00580 SPLOPM LD HL,SPLOPM$ 242C DD 00581 DB 0DDH 242D 21112A 00582 PRMBGM LD HL,PRMBGM$ 2430 00583 @@LOGOT 00584 IFEQ 00H,1 00585 LD HL, 00586 ENDIF 2430+3E0C 00587 LD A,12 2432+EF 00588 RST 40 2433 18D2 00589 JR EXIT 00590 ; 00591 ; I/O Error Processor 00592 ; 2435 3E2C 00593 PRMERR LD A,PAR_ERR ;Parameter Error 2437 6F 00594 IOERR LD L,A ;Set HL = Error # 2438 2600 00595 LD H,0 243A F6C0 00596 OR 0C0H ;Set short, return 243C 4F 00597 LD C,A ;Error code to C 243D 00598 @@ERROR ;Dsply error 243D+3E1A 00599 LD A,26 243F+EF 00600 RST 40 2440 18C8 00601 JR SAVESP ;Exit 00602 ; 00603 ; Internal Error Message Handler 00604 ; 2442 21C72A 00605 BADDCB LD HL,BADDCB$ 2445 DD 00606 DB 0DDH 2446 216029 00607 NOFIND LD HL,NOFIND$ 2449 DD 00608 DB 0DDH 244A 21972A 00609 INUSE LD HL,INUSE$ 244D DD 00610 DB 0DDH 244E 21AD2A 00611 CANT LD HL,CANT$ 2451 00612 @@LOGOT 00613 IFEQ 00H,1 00614 LD HL, 00615 ENDIF 2451+3E0C 00616 LD A,12 2453+EF 00617 RST 40 2454 21FFFF 00618 ERREXIT LD HL,-1 ;Set abort code 2457 18B1 00619 JR SAVESP ;Exit 00620 ; 00621 ; SPOOL1 - Set up system to Spool Output 00622 ; 00623 SPOOL1 2459 E5 00624 PUSH HL ;Save INBUF$ pointer 245A 00625 @@FLAGS ;Get flag table pointer 245A+3E65 00626 LD A,101 245C+EF 00627 RST 40 245D DD211D2D 00628 LD IX,PRMSAV ;Point to parm save area 2461 11142D 00629 LD DE,SPOOL$ ;If already resident, 2464 00630 @@GTMOD ; don't need to check 2464+3E53 00631 LD A,83 2466+EF 00632 RST 40 2467 2032 00633 JR NZ,SPL1 ; if memory available 2469 ED53A428 00634 LD (SVDCB),DE ;Save DCB pointer 246D 22B228 00635 LD (SVBGN),HL ;Save module begin 2470 210400 00636 LD HL,4 ;Get parm save pointer 2473 19 00637 ADD HL,DE 2474 22DD28 00638 LD (HIPARM),HL ;Save for use by clear 2477 DDE5 00639 PUSH IX ;Also put address in DE 2479 D1 00640 POP DE ;Shift saved parms into 247A 010B00 00641 LD BC,11 ; spool driver front end 247D EDB0 00642 LDIR 247F DD5E04 00643 LD E,(IX+4) ;P/u previous MPARM 2482 DD5605 00644 LD D,(IX+5) 2485 ED538D26 00645 LD (MPARM+1),DE ;Stuff as new default 2489 DD5E06 00646 LD E,(IX+6) ;P/u previous DPARM 248C DD5607 00647 LD D,(IX+7) 248F ED531B26 00648 LD (DPARM+1),DE ;Stuff as new default 2493 DD7E0A 00649 LD A,(IX+10) ;P/u old bank # 2496 E67F 00650 AND 07FH ;Strip hi bit 2498 32B625 00651 LD (BPARM+1),A ; & save as default 249B E1 00652 SPL1 POP HL ;Get INBUF$ pointer 00653 ; 00654 ; Fetch device spec to spool 00655 ; 249C 11E22A 00656 SPL2 LD DE,SPLDCB ;Fetch device spec 249F 00657 @@FSPEC ; to spool 249F+3E4E 00658 LD A,78 24A1+EF 00659 RST 40 24A2 E5 00660 PUSH HL ;Save inbuf$ ptr 24A3 201E 00661 JR NZ,USEPR ;Use *PR if no entry 24A5 1A 00662 LD A,(DE) ;If a device spec not 24A6 FE2A 00663 CP '*' ; found, maybe it was 24A8 2824 00664 JR Z,SPL2A ; the spool file spec 00665 ; 00666 ; File spec fetched - Move to spool FCB 00667 ; 24AA EB 00668 EX DE,HL ;DCB to HL 24AB 11332F 00669 LD DE,SPLFCB ;Point to spool FCB 24AE D5 00670 PUSH DE 24AF 012000 00671 LD BC,32 24B2 EDB0 00672 LDIR ;Move it in 24B4 21092B 00673 LD HL,PR$ ;Move in default spec 24B7 11E22A 00674 LD DE,SPLDCB ; for spool device 24BA 010400 00675 LD BC,4 24BD EDB0 00676 LDIR 24BF AF 00677 XOR A 24C0 D1 00678 POP DE ;Point to SPLFCB 24C1 181B 00679 JR SPL2B ;Go - we have spec 24C3 21092B 00680 USEPR LD HL,PR$ ;Move in default spec 24C6 11E22A 00681 LD DE,SPLDCB 24C9 010400 00682 LD BC,4 24CC EDB0 00683 LDIR 00684 ; 00685 ; Fetch file spec to use as disk spool buffer 00686 ; 24CE E1 00687 SPL2A POP HL ;Get inbuf$ ptr 24CF ED5BE32A 00688 LD DE,(SPLDCB+1) ;Stuff device name for 24D3 ED53022B 00689 LD (DSKSPC),DE ; default spool file name 24D7 11332F 00690 LD DE,SPLFCB ;Fetch spool filespec 24DA 00691 @@FSPEC 24DA+3E4E 00692 LD A,78 24DC+EF 00693 RST 40 24DD E5 00694 PUSH HL ;Save separator char 24DE F5 00695 SPL2B PUSH AF ; & line pointer 24DF 21022B 00696 LD HL,DSKSPC ;Default to XX/SPL 24E2 2803 00697 JR Z,SPL2C 24E4 00698 @@FSPEC ; if user entered none 24E4+3E4E 00699 LD A,78 24E6+EF 00700 RST 40 24E7 21052B 00701 SPL2C LD HL,SPLEXT ;Default ext to SPL 24EA 00702 @@FEXT 24EA+3E4F 00703 LD A,79 24EC+EF 00704 RST 40 24ED F1 00705 POP AF ;Rcvr line pointer 24EE E1 00706 POP HL 24EF FE3A 00707 CP ':' ;Drive entered? 24F1 201C 00708 JR NZ,GETPRM 24F3 1A 00709 SPL3 LD A,(DE) ;Wait for ETX or EOL 24F4 FE0D 00710 CP CR 24F6 2807 00711 JR Z,SPL4 24F8 FE03 00712 CP 3 24FA 2803 00713 JR Z,SPL4 24FC 13 00714 INC DE 24FD 18F4 00715 JR SPL3 24FF 3E3A 00716 SPL4 LD A,':' ;Stuff colon for drive 2501 12 00717 LD (DE),A 2502 13 00718 INC DE 2503 7E 00719 LD A,(HL) ;P/u possible drive # 2504 FE0D 00720 CP CR 2506 CA3524 00721 JP Z,PRMERR ;Parm error if EOL 2509 23 00722 INC HL 250A 12 00723 LD (DE),A ;Stuff drive # 250B 13 00724 INC DE 250C 3E03 00725 LD A,3 250E 12 00726 LD (DE),A ;Stuff ETX 00727 ; 00728 ; Get parameter entries 00729 ; 250F 110D2B 00730 GETPRM LD DE,PRMTBL$ ;Get parms 2512 00731 @@PARAM 2512+3E11 00732 LD A,17 2514+EF 00733 RST 40 2515 C23524 00734 JP NZ,PRMERR ;Jump on parm error 00735 ; 00736 ; Check on OFF 00737 ; 2518 110000 00738 OPARM LD DE,0 ;P/u off parm 251B 1C 00739 INC E ;On or off? 251C CA3128 00740 JP Z,SPLOFF ;Jump if OFF 00741 ; 00742 ; Check on RESUME despooling 00743 ; 251F 110000 00744 RPARM LD DE,0 ;P/u Resume parm 2522 1C 00745 INC E ;Was it used? 2523 CA1C28 00746 JP Z,RESUME ;Go if so 00747 ; 00748 ; Check on PAUSE 00749 ; 2526 110000 00750 PPARM LD DE,0 ;P/u Pause parm 2529 1C 00751 INC E ;Was it used? 252A CA0728 00752 JP Z,PAUSE ;Go if so 00753 ; 00754 ; Check on CLEAR 00755 ; 252D 110000 00756 CPARM LD DE,0 ;P/u Clear parm 2530 1C 00757 INC E ;Was is used? 2531 CAD428 00758 JP Z,CLEAR ;Go if so 00759 ; 00760 ; Assume request to be to install 00761 ; 2534 FDCB0246 00762 BIT 0,(IY+'C'-'A') ;Can't insert spool if 2538 C24E24 00763 JP NZ,CANT ; memory frozen 253B FDCB0346 00764 BIT 0,(IY+'D'-'A') ;Is spooler already on? 253F C22124 00765 JP NZ,SPLONM ;Quit if so 00766 ; 00767 ; If module resident, ck parm sizes 00768 ; 2542 11142D 00769 LD DE,SPOOL$ 2545 00770 @@GTMOD 2545+3E53 00771 LD A,83 2547+EF 00772 RST 40 2548 202B 00773 JR NZ,FNDDCB ;Go if no area in mem 254A DD6E04 00774 LD L,(IX+4) ;Prev. MPARM 254D DD6605 00775 LD H,(IX+5) 2550 ED5B8D26 00776 LD DE,(MPARM+1) 2554 B7 00777 OR A 2555 ED52 00778 SBC HL,DE ;Old must = new 2557 C22D24 00779 JP NZ,PRMBGM ;Abort if bad 255A DD6E06 00780 LD L,(IX+6) ;D parm 255D DD6607 00781 LD H,(IX+7) 2560 ED5B1B26 00782 LD DE,(DPARM+1) 2564 ED52 00783 SBC HL,DE 2566 C22D24 00784 JP NZ,PRMBGM ;Abort if not same as old 2569 DD7E0A 00785 LD A,(IX+10) ;Bank # 256C E67F 00786 AND 07FH ;Strip hi bit 256E 2AB625 00787 LD HL,(BPARM+1) 2571 BD 00788 CP L 2572 C22D24 00789 JP NZ,PRMBGM ;Abort if not same as old 00790 ; 00791 ; Find device to spool 00792 ; 2575 ED5BE32A 00793 FNDDCB LD DE,(SPLDCB+1) ;P/u device name 2579 00794 @@GTDCB ;Find in device tables 2579+3E52 00795 LD A,82 257B+EF 00796 RST 40 257C C23724 00797 JP NZ,IOERR ;Jump on not found 257F CB66 00798 CKRTE BIT 4,(HL) ;Routed device? 2581 2807 00799 JR Z,CKLNK ;Bypass if not 2583 2C 00800 CKRTE1 INC L ;Pt to vector 2584 7E 00801 LD A,(HL) ;P/u vector DCB address 2585 2C 00802 INC L ; & test it 2586 66 00803 LD H,(HL) 2587 6F 00804 LD L,A 2588 18F5 00805 JR CKRTE 258A CB6E 00806 CKLNK BIT 5,(HL) ;If linked, get DCB 258C 20F5 00807 JR NZ,CKRTE1 258E CB76 00808 BIT 6,(HL) ;If filtered, trace to 2590 281B 00809 JR Z,SETDVR ; its DCB in header 2592 54 00810 LD D,H ;Save to ck inactive 2593 5D 00811 LD E,L 2594 2C 00812 INC L 2595 7E 00813 LD A,(HL) ;Get vector to module 2596 2C 00814 INC L 2597 66 00815 LD H,(HL) 2598 6F 00816 LD L,A 2599 010400 00817 LD BC,4 ;HL now points to the 259C 09 00818 ADD HL,BC ; entry point. Get its 259D 4E 00819 LD C,(HL) ; DCB address by peeking 259E 0C 00820 INC C ; past the name field 259F 09 00821 ADD HL,BC 25A0 7E 00822 LD A,(HL) ;Get low-order 25A1 23 00823 INC HL 25A2 66 00824 LD H,(HL) ;Get hi-order 25A3 6F 00825 LD L,A 25A4 E5 00826 PUSH HL ;If DCB is itself, then 25A5 ED52 00827 SBC HL,DE ; it's some error 25A7 E1 00828 POP HL ; else continue to 25A8 20D5 00829 JR NZ,CKRTE ; search the chain 25AA C34224 00830 JP BADDCB 00831 ; 00832 ; Found the device 00833 ; 25AD CB4E 00834 SETDVR BIT 1,(HL) ;Device handle @PUT? 25AF CA4224 00835 JP Z,BADDCB ;Can't do if not 25B2 22252D 00836 LD (MODDVR),HL ;Stuff DCB table address 00837 ; 00838 ; Check BANK spec for availability 00839 ; 25B5 010000 00840 BPARM LD BC,0 ;Pick up the bank # 25B8 79 00841 LD A,C ;If bank=0, no need 25B9 B0 00842 OR B ; to test for 25BA 281B 00843 JR Z,LOCDCB ; availability 00844 IF @BLD631 25BC FE1F 00845 CP 31 ;<631>This version does banks 0-31 00846 ELSE 00847 CP 8 ;This version supports banks 0-7 00848 ENDIF 25BE D23524 00849 JP NC,PRMERR ;Out of range 25C1 CBFF 00850 SET 7,A ;Set for transfer 25C3 32612D 00851 LD (BANKX1),A ;Stuff for module A 25C6 32832D 00852 LD (BANKX2),A 25C9 32902D 00853 LD (BANKX3),A 25CC 32272D 00854 LD (SPLBNK),A 25CF 0602 00855 LD B,2 ;Test if bank 1-x 25D1 00856 @@BANK ; is available 25D1+3E66 00857 LD A,102 25D3+EF 00858 RST 40 25D4 C24A24 00859 JP NZ,INUSE ;Quit if not available 00860 ; 00861 ; Locate a spare DCB for the spool module 00862 ; 25D7 110000 00863 LOCDCB LD DE,0 25DA 00864 @@GTDCB 25DA+3E52 00865 LD A,82 25DC+EF 00866 RST 40 25DD 3E21 00867 LD A,33 ;Init "No device space... 25DF C23724 00868 JP NZ,IOERR ;Go if no spare DCBs 25E2 22192D 00869 LD (S0DCB),HL ;Save pointer 25E5 22B62D 00870 LD (S0DCB1),HL 25E8 E5 00871 PUSH HL ;Save DCB field pointer 25E9 11532F 00872 LD DE,'/S' ;Let's find a link name 25EC 14 00873 NAMLP INC D ;Bump "2nd" character 25ED 00874 @@GTDCB ;If we find this name 25ED+3E52 00875 LD A,82 25EF+EF 00876 RST 40 25F0 28FA 00877 JR Z,NAMLP ; look for another 25F2 E1 00878 POP HL ;Get DCB pointer 25F3 CBDE 00879 SET 3,(HL) ;NIL in case of error 25F5 010600 00880 LD BC,6 25F8 09 00881 ADD HL,BC ;Point to name field 25F9 73 00882 LD (HL),E ; & stuff in the 25FA 2C 00883 INC L ; selected spool name 25FB 72 00884 LD (HL),D 00885 ; 00886 ; Create a disk file for spooling 00887 ; 25FC ED5B1B26 00888 LD DE,(DPARM+1) ;P/u disk size 2600 DD7306 00889 LD (IX+6),E ;Save DPARM for next time 2603 DD7207 00890 LD (IX+7),D ; SPOOL is entered 2606 7A 00891 LD A,D 2607 B3 00892 OR E 2608 284E 00893 JR Z,PUHIGH ;No file if DISK=0 260A 11332F 00894 LD DE,SPLFCB ;Init the spool file 260D 21002C 00895 LD HL,BUFFER 2610 FDCB12C6 00896 SET 0,(IY+'S'-'A') ;Init file open bit 2614 00897 @@INIT 2614+3E3A 00898 LD A,58 2616+EF 00899 RST 40 2617 C23724 00900 JP NZ,IOERR ;Jump on init error 261A 010400 00901 DPARM LD BC,4 ;D parm (default=4K) 261D 78 00902 LD A,B ;Parm error if > 4095K 261E E6F0 00903 AND 0F0H 2620 C23524 00904 PRMERRA JP NZ,PRMERR ;Go if too big a file 2623 CB21 00905 SLA C ;Multiply K by 4 2625 CB10 00906 RL B ; to calculate sectors 2627 CB21 00907 SLA C 2629 CB10 00908 RL B 262B ED43FF26 00909 LD (IPLDSK1+1),BC ;Stuff disk K 262F 0B 00910 DEC BC ;Adjust for 0 offset 2630 00911 @@POSN ;Position to end 2630+3E42 00912 LD A,66 2632+EF 00913 RST 40 2633 00914 @@WRITE ;Write a junk sector 2633+3E4B 00915 LD A,75 2635+EF 00916 RST 40 2636 C23724 00917 JP NZ,IOERR ;Jump on write error 2639 00918 @@REW ;Restore file to 0 2639+3E44 00919 LD A,68 263B+EF 00920 RST 40 263C 00921 @@WEOF ;End of file mark 263C+3E4A 00922 LD A,74 263E+EF 00923 RST 40 263F ED4B392F 00924 LD BC,(SPLFCB+6) ;P/u DEC & drive 2643 00925 @@DIRRD ;Read its dir record 2643+3E57 00926 LD A,87 2645+EF 00927 RST 40 2646 C23724 00928 JP NZ,IOERR ;Quit on read error 2649 23 00929 INC HL ;Point to DIR+1 264A CBFE 00930 SET 7,(HL) ;Turn on CREATE bit 264C 00931 @@DIRWR ;Write dir back 264C+3E58 00932 LD A,88 264E+EF 00933 RST 40 264F C23724 00934 JP NZ,IOERR ;Jump on error 2652 210023 00935 LD HL,LOWBUF$ ;Revise I/O buffer 2655 22362F 00936 LD (SPLFCB+3),HL ; in file's FCB 00937 ; 00938 ; Get current HIGH$ 00939 ; 2658 210000 00940 PUHIGH LD HL,0 ;Set HLB to zero to 265B 45 00941 LD B,L ; fetch HIGH$ 265C 00942 @@HIGH$ 265C+3E64 00943 LD A,100 265E+EF 00944 RST 40 265F 22BC26 00945 LD (GBUF1+1),HL ;Save for later 2662 22BD27 00946 LD (OLDHI+1),HL 00947 ; 00948 ; If bank RAM, recalculate MPARM 00949 ; 2665 3AB625 00950 LD A,(BPARM+1) ;Alternate banks requested? 2668 B7 00951 OR A 2669 2821 00952 JR Z,MPARM ;Go if not 00953 ; 00954 ; Recalculate MEM parameter to use the 00955 ; Maximum space in bank RAM. Formula is 00956 ; [((32768 - 512 for module) - ((DPARM+1)*16)] 00957 ; Divided by 260. The 260 is derived from 00958 ; 256-byte page plus 4-bytes for pointers. 00959 ; Then revise to K from pages. 00960 ; 266B 2A1B26 00961 LD HL,(DPARM+1) 266E 23 00962 INC HL ;Bump by 1 266F 29 00963 ADD HL,HL ;Times 16 2670 29 00964 ADD HL,HL 2671 29 00965 ADD HL,HL 2672 29 00966 ADD HL,HL 2673 4D 00967 LD C,L ;Xfer to BC for subtract 2674 44 00968 LD B,H 2675 21007E 00969 LD HL,32768-512 ;RAM space - module space 2678 AF 00970 XOR A ;The remainder is for 2679 ED42 00971 SBC HL,BC ; MEM pages and ptrs 267B CB3C 00972 SRL H ;A divide by 260 is 267D CB1D 00973 RR L ; accomplished by 267F 0E82 00974 LD C,260/2 ; div 2 and div 130 2681 00975 @@DIV16 2681+3E5E 00976 LD A,94 2683+EF 00977 RST 40 2684 4D 00978 LD C,L 2685 44 00979 LD B,H 2686 CB39 00980 SRL C ;Calculate 2688 CB39 00981 SRL C ; K = pages / 4 268A 1815 00982 JR CALCPTR 00983 ; 00984 ; Calculate memory buffer space requested 00985 ; 268C 010100 00986 MPARM LD BC,1 ;MEM parm - default 1K 268F 78 00987 LD A,B ;Test entry - must be 2690 B7 00988 OR A ;< 33K 2691 208D 00989 JR NZ,PRMERRA ;Hi-order must = 0 2693 B9 00990 CP C ;MEM = 0 ? 2694 CA3524 00991 JP Z,PRMERR ;Yes - Parameter Error 2697 7C 00992 LD A,H ;Get hi-order HIGH$ 2698 D681 00993 SUB 81H ;Can't go below 8000H 269A 1F 00994 RRA ;Divide by 2 269B CB3F 00995 SRL A ; & again to calc K 269D 91 00996 SUB C ;Reduce by K of req 269E DA3524 00997 JP C,PRMERR ;Error if goes < 8000H 26A1 DD7104 00998 CALCPTR LD (IX+4),C ;Stuff MEM parm into 26A4 DD7005 00999 LD (IX+5),B ; save area 01000 ; 01001 ; Add memory buffer space to disk space 01002 ; 26A7 2A1B26 01003 LD HL,(DPARM+1) ;P/u disk K 26AA 09 01004 ADD HL,BC ;Calculate pointer 26AB 29 01005 ADD HL,HL ; buffer space required 26AC 29 01006 ADD HL,HL ; (D+M)*16 + 4 extra 26AD 23 01007 INC HL ; used to detect the end 26AE 29 01008 ADD HL,HL 26AF 29 01009 ADD HL,HL 01010 ; 01011 ; Retrieve high memory space for buffers 01012 ; 26B0 E5 01013 PUSH HL 26B1 DD6E00 01014 LD L,(IX+0) ;P/u saved HIGH$ entry 26B4 DD6601 01015 LD H,(IX+1) 26B7 7D 01016 LD A,L ;If <> 0, then SPOOL 26B8 B4 01017 OR H ; is resident 26B9 2009 01018 JR NZ,GBUF2 26BB 210000 01019 GBUF1 LD HL,$-$ ;P/u current high 26BE DD7500 01020 LD (IX+0),L ;Save the value 26C1 DD7401 01021 LD (IX+1),H 26C4 223629 01022 GBUF2 LD (SVEND+1),HL ;Stuff highest byte used 01023 ; 01024 ; If bank RAM used, reset to X'FFFF' 01025 ; 26C7 23 01026 INC HL ;Pt to lower 256 26C8 2E00 01027 LD L,0 ; byte block boundary 26CA 3AB625 01028 LD A,(BPARM+1) ;Bank specified? 26CD B7 01029 OR A 26CE 2801 01030 JR Z,$+3 ;Jump if not 26D0 65 01031 LD H,L ;Set to FFFF+1 = 0 26D1 4F 01032 LD C,A ;Reside bank for 26D2 0600 01033 LD B,0 ; module B 26D4 01034 @@BANK 26D4+3E66 01035 LD A,102 26D6+EF 01036 RST 40 26D7 C23724 01037 JP NZ,IOERR ;Quit on bank error 26DA DD7E04 01038 LD A,(IX+4) ;P/u MEM parm 26DD 07 01039 RLCA ;MEM * 4 = # of 26DE 07 01040 RLCA ; 256-byte blocks 26DF 47 01041 LD B,A ;Go back that number 26E0 ED44 01042 NEG ; of blocks needed 26E2 84 01043 ADD A,H ;HL now reserves buffer 26E3 67 01044 LD H,A ; blocks for MEM 26E4 22532F 01045 LD (PUTNXT$),HL ;Stuff pointers to begin 26E7 22552F 01046 LD (GETNXT$),HL ; of memory blocks 26EA 4C 01047 LD C,H 26EB D1 01048 POP DE ;Get (D+M)*16+4 26EC AF 01049 XOR A ;Backup the # of D+M 26ED ED52 01050 SBC HL,DE ; sectors 01051 ; 01052 ; Initialize the memory pointers 01053 ; 26EF E5 01054 PUSH HL ;Save pointer 26F0 3600 01055 IPLMEM LD (HL),0 ;Init the 4-byte fields 26F2 23 01056 INC HL ; for each of the disk & 26F3 3600 01057 LD (HL),0 ; memory block pointers 26F5 23 01058 INC HL 26F6 71 01059 LD (HL),C ;Stuff memory hi-order 26F7 23 01060 INC HL 26F8 3600 01061 LD (HL),0 26FA 23 01062 INC HL 26FB 0C 01063 INC C ;Bump memory hi-order 26FC 10F2 01064 DJNZ IPLMEM 01065 ; 01066 ; Initialize the disk pointers 01067 ; 26FE 110000 01068 IPLDSK1 LD DE,0 ;P/u # of disk sectors 2701 7A 01069 LD A,D 2702 B3 01070 OR E 2703 2815 01071 JR Z,IPLDSK3 ;Bypass if none 2705 010000 01072 LD BC,0 ;Set up a disk pointer 2708 3600 01073 IPLDSK2 LD (HL),0 ; for each disk block 270A 23 01074 INC HL 270B 3600 01075 LD (HL),0 270D 23 01076 INC HL 270E 71 01077 LD (HL),C ;Stuff block number 270F 23 01078 INC HL 2710 70 01079 LD (HL),B 2711 CBFE 01080 SET 7,(HL) ;Set bit 7 to indicate 2713 23 01081 INC HL ; this pntr is for disk 2714 03 01082 INC BC ;Inc block number 2715 1B 01083 DEC DE 2716 7A 01084 LD A,D ;Test if finished 2717 B3 01085 OR E 2718 20EE 01086 JR NZ,IPLDSK2 ;Loop if not 271A 3600 01087 IPLDSK3 LD (HL),0 ;One more used to 271C 23 01088 INC HL ; indicate the end 271D 3600 01089 LD (HL),0 ; of the pointer fields 271F 23 01090 INC HL 2720 36FF 01091 LD (HL),0FFH 2722 23 01092 INC HL 2723 36FF 01093 LD (HL),0FFH 2725 E1 01094 POP HL ;Rcvr start of pointers 2726 E5 01095 PUSH HL 2727 22572F 01096 LD (MAPPTR$),HL ; & stuff for later use 272A 22592F 01097 LD (PUTBLK$),HL 272D 225B2F 01098 LD (GETBLK$),HL 2730 7C 01099 LD A,H ;Stuff 1st MEM block ptr 2731 75 01100 LD (HL),L ; with table addr 2732 23 01101 INC HL 2733 77 01102 LD (HL),A 01103 ; 01104 ; Modify driver for spooling device vector address 01105 ; 2734 FD7E1F 01106 LD A,(IY+KITSK@) ;Transfer device hook 2737 FD6E20 01107 LD L,(IY+KITSK@+1) 273A FD6621 01108 LD H,(IY+KITSK@+2) 273D 32982D 01109 LD (GETBLK0),A 2740 22992D 01110 LD (GETBLK0+1),HL 2743 FDE5 01111 PUSH IY ;Set up address 2745 D1 01112 POP DE ; in despooler 2746 210F00 01113 LD HL,'P'-'A' ;PFLAG use to 2749 19 01114 ADD HL,DE ; determine if spooler 274A 226D2D 01115 LD (DFLAG),HL ; is Paused 274D 226F2E 01116 LD (DFLAG1),HL 2750 C1 01117 POP BC ;Start of MEM block tbl 2751 0B 01118 DEC BC ;Get last byte to use 2752 C5 01119 PUSH BC 2753 115E2F 01120 LD DE,DVRBEND ;Point to module B 2756 215F2F 01121 LD HL,RELTABB ;Point to table 2759 CD3029 01122 CALL RELO ;Relocate absolute refs 01123 ; 01124 ; If bank 0, then wipe out module A 01125 ; 275C 3AB625 01126 LD A,(BPARM+1) ;Alternate bank used? 275F B7 01127 OR A 2760 2019 01128 JR NZ,MOVMODB ;Skip next if so 2762 21002D 01129 LD HL,FIX1 ;Shift in JPs for the 2765 115C2D 01130 LD DE,PUTCHAR ; bank transfer 2768 010500 01131 LD BC,5 ; linkage 276B EDB0 01132 LDIR 276D 117F2D 01133 LD DE,FIX2UP 2770 0E05 01134 LD C,5 2772 EDB0 01135 LDIR 2774 118C2D 01136 LD DE,GETBLK 2777 0E05 01137 LD C,5 2779 EDB0 01138 LDIR 277B D1 01139 MOVMODB POP DE ;Get last byte to use 277C 215E2F 01140 LD HL,DVRBEND ;Last byte of module 277F 01A901 01141 LD BC,DVRBEND-DVRBBGN+1 2782 EDB8 01142 LDDR 2784 D5 01143 PUSH DE ;New last byte 01144 ; 01145 ; Switch to bank 0 always 01146 ; 2785 010000 01147 LD BC,0 ;Set function 0, bank 0 2788 01148 @@BANK 2788+3E66 01149 LD A,102 278A+EF 01150 RST 40 278B C23724 01151 JP NZ,IOERR ;Quit on bank error 278E C1 01152 POP BC 01153 ; 01154 ; If module B is in bank x, switch HIGH for A 01155 ; 278F 3AB625 01156 LD A,(BPARM+1) ;P/u alternate bank resp. 2792 B7 01157 OR A 2793 280D 01158 JR Z,STORHI ;Go if none used 2795 4F 01159 LD C,A ;Reserve the bank 2796 0603 01160 LD B,3 ;Set function # 3 2798 01161 @@BANK 2798+3E66 01162 LD A,102 279A+EF 01163 RST 40 279B C23724 01164 JP NZ,IOERR ;Quit on bank error 279E ED4B3629 01165 LD BC,(SVEND+1) ;P/u bank-A HIGH$ 27A2 C5 01166 STORHI PUSH BC 01167 ; 01168 ; Relocate absolute addresses in module A 01169 ; 27A3 119A2D 01170 LD DE,DVRAEND ;Point to last used in A 27A6 219B2D 01171 LD HL,RELTABA ;Point to relo table 27A9 CD3029 01172 CALL RELO ;Relocate absolute refs 27AC D1 01173 POP DE ;Get last byte to use 27AD 219A2D 01174 LD HL,DVRAEND ;Last byte of module 27B0 018C00 01175 LD BC,DVRAEND-DVRABGN+1 27B3 EDB8 01176 LDDR 27B5 211100 01177 LD HL,PRMSAV+2-DVRABGN+1 27B8 19 01178 ADD HL,DE ;Data area in himem 27B9 73 01179 LD (HL),E 27BA 23 01180 INC HL 27BB 72 01181 LD (HL),D ;Save high$ there 01182 ; 01183 ; Stuff new HIGH$ 01184 ; 27BC 210000 01185 OLDHI LD HL,$-$ ;P/u old HIGH$ 27BF ED52 01186 SBC HL,DE ;Check if old HIGH$ is 27C1 3805 01187 JR C,NOSET ; already lower 27C3 EB 01188 EX DE,HL ;New HIGH$ to HL 27C4 01189 @@HIGH$ ;Stuff new HIGH$ 27C4+3E64 01190 LD A,100 27C6+EF 01191 RST 40 27C7 EB 01192 EX DE,HL 27C8 13 01193 NOSET INC DE ;Point to module start 27C9 2A192D 01194 LD HL,(S0DCB) ;P/u module DCB pointer 27CC 3646 01195 LD (HL),46H ; & set to filter 27CE 23 01196 INC HL ;Pt to DCB vector pos 27CF 73 01197 LD (HL),E ;Put entry point of 27D0 23 01198 INC HL ; module into DCB 27D1 72 01199 LD (HL),D 27D2 116A2D 01200 LD DE,DSPLTCB ;Calculate entry point 27D3 01201 RX05 EQU $-2 27D5 0E09 01202 LD C,9 ;This will be task 9 27D7 01203 @@ADTSK 27D7+3E1D 01204 LD A,29 27D9+EF 01205 RST 40 27DA 218C2D 01206 LD HL,GETBLK ;Now update device hook 27DB 01207 RX06 EQU $-2 01208 ; 01209 ; Interface to KITSK - No need to DI/EI 01210 ; As KITSK not used by interrupts 01211 ; 27DD FD7421 01212 LD (IY+KITSK@+2),H ;Move in device 27E0 FD7520 01213 LD (IY+KITSK@+1),L ; vector and a 27E3 3EC3 01214 LD A,0C3H ; JP opcode 27E5 FD771F 01215 LD (IY+KITSK@),A 27E8 FDCB03C6 01216 SET 0,(IY+'D'-'A') ;Turn on device flag bit 27EC FDCB0FFE 01217 SET 7,(IY+'P'-'A') ;Show not paused 01218 ; 01219 ; Filter the specified device driver 01220 ; 27F0 2A252D 01221 LD HL,(MODDVR) ;Ptr to device DCB 27F3 ED5B192D 01222 LD DE,(S0DCB) ;Ptr to spooler DCB 27F7 0603 01223 LD B,3 27F9 F3 01224 DI ;Interrupts off during swap 27FA 4E 01225 SWAP LD C,(HL) ;Swap first 3 bytes 27FB 1A 01226 LD A,(DE) 27FC 77 01227 LD (HL),A ; of the DCBs 27FD 79 01228 LD A,C 27FE 12 01229 LD (DE),A 27FF 2C 01230 INC L ;Bump DCB pointers 2800 1C 01231 INC E 2801 10F7 01232 DJNZ SWAP ;Loop 3 times 2803 FB 01233 EI 2804 C31D24 01234 JP SPLACT ;Set complete 01235 ; 01236 ; Routine to PAUSE despooling 01237 ; 2807 FDCB0346 01238 PAUSE BIT 0,(IY+'D'-'A') ;Spool resident? 280B CA2524 01239 JP Z,SPLOFM ;Quit if not 280E FDCB0F7E 01240 BIT 7,(IY+'P'-'A') ;Ck first if active 2812 FDCB0FBE 01241 RES 7,(IY+'P'-'A') ; then turn off 01242 IF @BLD631F 2816 212924 01243 LD HL,SPLOPM ;<631F>Patch 01244 ELSE 01245 JP Z,SPLOPM ;Quit if already paused 01246 ENDIF 2819 C31924 01247 JP PAUSED 01248 ; 01249 ; Routine to RESUME despooling 01250 ; 281C FDCB0346 01251 RESUME BIT 0,(IY+'D'-'A') ;Ck first if resident 2820 CA2524 01252 JP Z,SPLOFM ;Quit if not 2823 FDCB0F7E 01253 BIT 7,(IY+'P'-'A') ;See if despooling now 2827 FDCB0FFE 01254 SET 7,(IY+'P'-'A') 282B C22124 01255 JP NZ,SPLONM ;Can't resume if so 282E C31524 01256 JP RESUMD 01257 ; 01258 ; Routine to turn off the spooler 01259 ; 2831 FDCB0346 01260 SPLOFF BIT 0,(IY+'D'-'A') ;Test if off already 2835 CA2524 01261 JP Z,SPLOFM ;Go if off now 2838 11142D 01262 LD DE,SPOOL$ ;Find out where spooler 283B 01263 @@GTMOD 283B+3E53 01264 LD A,83 283D+EF 01265 RST 40 283E C24624 01266 JP NZ,NOFIND ;Quit if not there 2841 FDCB0386 01267 RES 0,(IY+'D'-'A') ; else turn off 2845 FDCB0FBE 01268 RES 7,(IY+'P'-'A') ;Show paused also 2849 018900 01269 LD BC,GETBLK0-DVRABGN 284C 09 01270 ADD HL,BC ;Point to KITSK@ swap 284D 7E 01271 LD A,(HL) 284E FD771F 01272 LD (IY+KITSK@),A ;Restuff KIHOOK 2851 23 01273 INC HL 2852 7E 01274 LD A,(HL) 2853 FD7520 01275 LD (IY+KITSK@+1),L 2856 23 01276 INC HL 2857 7E 01277 LD A,(HL) 2858 FD7721 01278 LD (IY+KITSK@+2),A 285B 0E09 01279 LD C,9 ;Remove task 9 from 285D 01280 @@RMTSK ; the task processor 285D+3E1E 01281 LD A,30 285F+EF 01282 RST 40 01283 ; 01284 ; Attempt to reclaim memory space 01285 ; 2860 210000 01286 LD HL,0 ;Get current HIGH$ 2863 45 01287 LD B,L 2864 01288 @@HIGH$ 2864+3E64 01289 LD A,100 2866+EF 01290 RST 40 2867 DD5E02 01291 LD E,(IX+2) ;Get HIGH$ after spool 286A DD5603 01292 LD D,(IX+3) ; was installed 286D AF 01293 XOR A 286E ED52 01294 SBC HL,DE ;Is it the same now? 2870 DD5E00 01295 LD E,(IX+0) ;Get HIGH before res 2873 DD7700 01296 LD (IX+0),A ; & clear data 2876 DD5601 01297 LD D,(IX+1) 2879 DD7701 01298 LD (IX+1),A 287C 21552A 01299 LD HL,NOMEM$ ;Init "Can't reclaim... 287F 2007 01300 JR NZ,LOGMEM ;Go if HIGH$ different 2881 EB 01301 EX DE,HL ; else release memory 2882 01302 @@HIGH$ ; by resetting HIGH$ 2882+3E64 01303 LD A,100 2884+EF 01304 RST 40 2885 21702A 01305 LD HL,GOTMEM$ ;"Memory released 2888 01306 LOGMEM @@LOGOT 01307 IFEQ 00H,1 01308 LD HL, 01309 ENDIF 2888+3E0C 01310 LD A,12 288A+EF 01311 RST 40 01312 ; 01313 ; De-use any RAM bank 01314 ; 288B DD7E0A 01315 LD A,(IX+10) ;P/u bank used 01316 IF @BLD631F 288E E61F 01317 AND 1FH ;<631F>Strip up to 30 01318 ELSE 01319 AND 7 ;Strip 3-7 01320 ENDIF 2890 2811 01321 JR Z,RESDCB ;Jump if only bank 0 2892 4F 01322 LD C,A ;Save bank in C 2893 F630 01323 OR '0' ;Convert to ASCII for dsply 01324 IF @BLD631F 2895 CDEF29 01325 CALL P631F1 ;<631F>Patch 01326 ELSE 01327 LD (FREBNK$+5),A ;Stuff in message 01328 ENDIF 2898 0601 01329 LD B,1 ;Function to reset BUR$ 289A 01330 @@BANK ;Free the bank 289A+3E66 01331 LD A,102 289C+EF 01332 RST 40 289D 21872A 01333 LD HL,FREBNK$ ;Init"Bank released 28A0 01334 @@LOGOT 01335 IFEQ 00H,1 01336 LD HL, 01337 ENDIF 28A0+3E0C 01338 LD A,12 28A2+EF 01339 RST 40 01340 ; 01341 ; RESET the device 01342 ; 28A3 210000 01343 RESDCB LD HL,$-$ 28A4 01344 SVDCB EQU $-2 ;Point to SPOOL DCB ptr 28A6 5E 01345 LD E,(HL) ; & get the DCB ptr 28A7 23 01346 INC HL ; into reg DE 28A8 56 01347 LD D,(HL) 01348 ; 01349 ; Check if DCB is inactive [user RESET *PR] 01350 ; 28A9 D5 01351 PUSH DE ;Save DCB pointer 28AA 1C 01352 INC E 28AB 1A 01353 LD A,(DE) ;Get DCB vector contents 28AC 4F 01354 LD C,A ; into reg BC 28AD 1C 01355 INC E 28AE 1A 01356 LD A,(DE) 28AF 47 01357 LD B,A 28B0 D1 01358 POP DE ;Recover DCB pointer 28B1 210000 01359 LD HL,$-$ ;P/u start of module 28B2 01360 SVBGN EQU $-2 28B4 AF 01361 XOR A ;If vector points to 28B5 ED42 01362 SBC HL,BC ; start of module, 28B7 C8 01363 RET Z ; we are finished 28B8 DD6E08 01364 LD L,(IX+8) ;P/u DCB being spooled 28BB DD6609 01365 LD H,(IX+9) 28BE EB 01366 EX DE,HL ;SPOOL to HL, 28BF 0603 01367 LD B,3 ; device to DE 28C1 F3 01368 DI 28C2 7E 01369 SWAP1 LD A,(HL) ;Undo the SPOOLer 28C3 3600 01370 LD (HL),0 ; by swapping back the 28C5 12 01371 LD (DE),A ; original vector and 28C6 2C 01372 INC L ; zeroing the spool DCB 28C7 1C 01373 INC E 28C8 10F8 01374 DJNZ SWAP1 28CA 2C 01375 INC L ;Point to name field 28CB 2C 01376 INC L ; & wipe it out 28CC 2C 01377 INC L 28CD 3600 01378 LD (HL),0 28CF 2C 01379 INC L 28D0 3600 01380 LD (HL),0 28D2 FB 01381 EI 28D3 C9 01382 RET ;Done - return 01383 ; 01384 ; Routine to CLEAR the SPOOL buffer 01385 ; 28D4 FDCB0346 01386 CLEAR BIT 0,(IY+'D'-'A') ;Spool active? 28D8 CA2524 01387 JP Z,SPLOFM ;Go if not active 28DB DD210000 01388 LD IX,$-$ ;Parms in himem 28DD 01389 HIPARM EQU $-2 28DF DD6E0B 01390 LD L,(IX+11) ;P/u SPLFCB pointer 28E2 DD660C 01391 LD H,(IX+12) 28E5 DD4E0A 01392 LD C,(IX+10) ;P/u RAM bank used 28E8 CBB9 01393 RES 7,C ;Set on xfer to bank 28EA 0600 01394 LD B,0 ;Function to load bank 28EC F3 01395 DI ;Interrupts off now 28ED 01396 @@BANK 28ED+3E66 01397 LD A,102 28EF+EF 01398 RST 40 28F0 C5 01399 PUSH BC ;Save old bank 28F1 E5 01400 PUSH HL ;Xfer FCB pointer 28F2 DDE1 01401 POP IX ; to IX 28F4 DD6E24 01402 LD L,(IX+24H) ;Get LINK map pointer 28F7 DD6625 01403 LD H,(IX+25H) 28FA E5 01404 PUSH HL 28FB 3600 01405 CLEAR1 LD (HL),0 ;Reset every link 28FD 23 01406 INC HL 28FE 3600 01407 LD (HL),0 2900 23 01408 INC HL ;Bypass page pointer 2901 23 01409 INC HL 2902 7E 01410 LD A,(HL) ;Ck for TABEND 2903 23 01411 INC HL 2904 3C 01412 INC A ;End if it was X'FF' 2905 20F4 01413 JR NZ,CLEAR1 2907 E1 01414 POP HL ;Point to LINK start 2908 DD7526 01415 LD (IX+26H),L ;Reset PUTBLK$ 290B DD7427 01416 LD (IX+27H),H 290E DD7528 01417 LD (IX+28H),L ;Reset GETBLK$ 2911 DD7429 01418 LD (IX+29H),H 2914 7C 01419 LD A,H ;Show 1st LINK position 2915 75 01420 LD (HL),L ; is the "last" one by 2916 23 01421 INC HL ; loading it to point 2917 77 01422 LD (HL),A ; to itself 2918 23 01423 INC HL ;P/u the page pointer 2919 46 01424 LD B,(HL) 291A DD7021 01425 LD (IX+21H),B ;Stuff PUTNXT$ 291D DD362000 01426 LD (IX+20H),0 2921 DD7023 01427 LD (IX+23H),B ;Stuff GETNXT$ 2924 DD362200 01428 LD (IX+22H),0 2928 C1 01429 POP BC ;Reload previous bank 2929 01430 @@BANK 2929+3E66 01431 LD A,102 292B+EF 01432 RST 40 292C FB 01433 EI 292D C31124 01434 JP CLEARD 01435 ; 01436 ; Relocate internal references in driver 01437 ; HL = relocation table 01438 ; DE = pointer to last byte of module 01439 ; BC = pointer to last RAM byte to use 01440 ; 2930 DDE5 01441 RELO PUSH IX ;Save index reg 2932 E5 01442 PUSH HL ;Xfer rel tab pointer 2933 DDE1 01443 POP IX 2935 210000 01444 SVEND LD HL,$-$ ;P/u last byte used 2938 22112D 01445 LD (DVRABGN+2),HL ; & stuff into module 293B 60 01446 LD H,B ;Xfer last byte to 293C 69 01447 LD L,C ; use to HL 293D AF 01448 XOR A ;Clear carry flag 293E ED52 01449 SBC HL,DE 2940 44 01450 LD B,H ;Move to BC 2941 4D 01451 LD C,L 2942 DD7E00 01452 LD A,(IX) ;Get table length 2945 DD23 01453 INC IX 2947 DD6E00 01454 RLOOP LD L,(IX) ;Get address to change 294A DD6601 01455 LD H,(IX+1) 294D 5E 01456 LD E,(HL) ;P/U address 294E 23 01457 INC HL 294F 56 01458 LD D,(HL) 2950 EB 01459 EX DE,HL ;Offset it 2951 09 01460 ADD HL,BC 2952 EB 01461 EX DE,HL 2953 72 01462 LD (HL),D ;And put back 2954 2B 01463 DEC HL 2955 73 01464 LD (HL),E 2956 DD23 01465 INC IX 2958 DD23 01466 INC IX 295A 3D 01467 DEC A 295B 20EA 01468 JR NZ,RLOOP ;Loop till done 295D DDE1 01469 POP IX 295F C9 01470 RET 01471 ; 2960 43 01472 NOFIND$ DB 'Can''t locate SPOOL in memory',CR 61 6E 27 74 20 6C 6F 63 61 74 65 20 53 50 4F 4F 4C 20 69 6E 20 6D 65 6D 6F 72 79 0D 297D 53 01473 CLEARD$ DB 'SPOOL buffer cleared',CR 50 4F 4F 4C 20 62 75 66 66 65 72 20 63 6C 65 61 72 65 64 0D 2992 44 01474 PAUSED$ DB 'Despooling now paused',CR 65 73 70 6F 6F 6C 69 6E 67 20 6E 6F 77 20 70 61 75 73 65 64 0D 29A8 44 01475 RESUMD$ DB 'Despooling now resumed',CR 65 73 70 6F 6F 6C 69 6E 67 20 6E 6F 77 20 72 65 73 75 6D 65 64 0D 29BF 53 01476 SPLOFM$ DB 'Spooler is not active',CR 70 6F 6F 6C 65 72 20 69 73 20 6E 6F 74 20 61 63 74 69 76 65 0D 29D5 53 01477 SPLONM$ DB 'Spooler is already active',CR 70 6F 6F 6C 65 72 20 69 73 20 61 6C 72 65 61 64 79 20 61 63 74 69 76 65 0D 01478 IF @BLD631F 01479 SPLOPM$ ;<631F> 29EF 69 01480 P631F1 LD L,C ;<631F> 29F0 2600 01481 LD H,0 ;<631F> 29F2 118C2A 01482 LD DE,2A8CH ;<631F> 29F5 C5 01483 PUSH BC ;<631F> 29F6 0602 01484 LD B,2 ;<631F> 29F8 3E5F 01485 LD A,5FH ;<631F>@@HEXD 29FA EF 01486 RST 28H ;<631F> 29FB C1 01487 POP BC ;<631F> 29FC C9 01488 RET ;<631F> 29FD 79 01489 DB 'y ' ;<631F> 20 29FF 61 01490 DB 'active but paused',CR ;<631F> 63 74 69 76 65 20 62 75 74 20 70 61 75 73 65 64 0D 01491 ELSE 01492 SPLOPM$ DB 'Spooler already active but paused',CR 01493 ENDIF 2A11 43 01494 PRMBGM$ DB 'Cannot reinstall with altered parameters',CR 61 6E 6E 6F 74 20 72 65 69 6E 73 74 61 6C 6C 20 77 69 74 68 20 61 6C 74 65 72 65 64 20 70 61 72 61 6D 65 74 65 72 73 0D 2A3A 53 01495 SPLACT$ DB 'Spooler is now operational',CR 70 6F 6F 6C 65 72 20 69 73 20 6E 6F 77 20 6F 70 65 72 61 74 69 6F 6E 61 6C 0D 2A55 43 01496 NOMEM$ DB 'Can''t reclaim memory space',CR 61 6E 27 74 20 72 65 63 6C 61 69 6D 20 6D 65 6D 6F 72 79 20 73 70 61 63 65 0D 2A70 4D 01497 GOTMEM$ DB 'Memory space reclaimed',CR 65 6D 6F 72 79 20 73 70 61 63 65 20 72 65 63 6C 61 69 6D 65 64 0D 01498 IF @BLD631F 2A87 42 01499 FREBNK$ DB 'Bank xx freed ',CR ;<631F> 61 6E 6B 20 78 78 20 66 72 65 65 64 20 20 0D 01500 ELSE 01501 FREBNK$ DB 'Bank x released',CR 01502 ENDIF 2A97 52 01503 INUSE$ DB 'Requested bank in use',CR 65 71 75 65 73 74 65 64 20 62 61 6E 6B 20 69 6E 20 75 73 65 0D 2AAD 4E 01504 CANT$ DB 'No memory space available',CR 6F 20 6D 65 6D 6F 72 79 20 73 70 61 63 65 20 61 76 61 69 6C 61 62 6C 65 0D 2AC7 44 01505 BADDCB$ DB 'Device driver incompatible',CR 65 76 69 63 65 20 64 72 69 76 65 72 20 69 6E 63 6F 6D 70 61 74 69 62 6C 65 0D 2AE2 01506 SPLDCB DS 32 2B02 58 01507 DSKSPC DB 'XX/' 58 2F 2B05 53 01508 SPLEXT DB 'SPL',3 50 4C 03 2B09 2A 01509 PR$ DB '*PR',ETX 50 52 03 01510 ; 2B0D D2 01511 PRMTBL$ DB 'R'!80H ;6.x table format 0080 01512 VAL EQU 80H 0040 01513 SW EQU 40H 0020 01514 STR EQU 20H 0010 01515 SGL EQU 10H 2B0E 93 01516 DB VAL!SGL!3,'MEM',0 4D 45 4D 00 2B13 8D26 01517 DW MPARM+1 2B15 94 01518 DB VAL!SGL!4,'DISK',0 44 49 53 4B 00 2B1B 1B26 01519 DW DPARM+1 2B1D 43 01520 DB SW!3,'OFF',0 4F 46 46 00 2B22 1925 01521 DW OPARM+1 2B24 41 01522 DB SW!1,'N',0 4E 00 2B27 1925 01523 DW OPARM+1 2B29 94 01524 DB VAL!SGL!4,'BANK',0 42 41 4E 4B 00 2B2F B625 01525 DW BPARM+1 2B31 55 01526 DB SW!SGL!5,'PAUSE',0 50 41 55 53 45 00 2B38 2725 01527 DW PPARM+1 2B3A 56 01528 DB SW!SGL!6,'RESUME',0 52 45 53 55 4D 45 00 2B42 2025 01529 DW RPARM+1 2B44 55 01530 DB SW!SGL!5,'CLEAR',0 43 4C 45 41 52 00 2B4B 2E25 01531 DW CPARM+1 2B4D 00 01532 NOP 01533 ; 2C00 01534 ORG $<-8+1<8 2C00 01535 BUFFER DS 256 01537 ; 2D00 01538 *GET LBSPOOLB:3 01539 ;LBSPOOLB/ASM - Actual spool driver 01540 ; 01541 ; 01542 ; This is the spool/despool driver - bank 0 01543 ; 2D00 CDC32D 01544 FIX1 CALL SPLR2 ;Code mods to module-A 2D01 01545 RX16 EQU $-2 ; if strictly bank-0 2D03 AF 01546 XOR A 2D04 C9 01547 RET 2D05 CD732E 01548 CALL DSPLR1 2D06 01549 RX17 EQU $-2 2D08 AF 01550 XOR A 2D09 C9 01551 RET 2D0A CDBA2E 01552 CALL GETBLK2 2D0B 01553 RX18 EQU $-2 2D0D AF 01554 XOR A 2D0E C9 01555 RET 01556 ; 2D0F 01557 DVRABGN EQU $ 2D0F 1819 01558 JR DVREPT ;Branch around linkage 2D11 0000 01559 DW $-$ ;Last byte used 2D13 05 01560 DB 5 2D14 53 01561 SPOOL$ DB 'SPOOL' 50 4F 4F 4C 2D19 0000 01562 S0DCB DW 0,0 ;Space for DCB pointers 0000 2D1D 0000 01563 PRMSAV DW 0 ;HIGH$ before space alloc 2D1F 0E2D 01564 DW DVRABGN-1 ;HIGH$ after space alloc 2D21 0000 01565 DW 0 ;Previous MPARM 2D23 0000 01566 DW 0 ;Previous DPARM 2D25 0000 01567 MODDVR DW 0 ;DCB address of device 2D27 00 01568 SPLBNK DB 0 ;Bank of RAM 2D28 332F 01569 DW SPLFCB ;FCB pointer 2D28 01570 RX8 EQU $-2 01571 ; 2D2A 2830 01572 DVREPT JR Z,PUTCHAR ;Go on @PUT 2D2C 3003 01573 JR NC,CKCTL ;Go on @CTL 2D2E 3E00 01574 LD A,0 ;Show nothing on @GET 2D30 C9 01575 RET 2D31 AF 01576 CKCTL XOR A 2D32 C9 01577 RET ;Show available on CTL-0 01578 ; 01579 ; Move stack low if needed 01580 ; 2D33 E5 01581 STKCTL PUSH HL 2D34 210580 01582 LD HL,8005H 2D37 39 01583 ADD HL,SP ;Stack in what bank? 2D38 E1 01584 POP HL 2D39 D0 01585 RET NC ;Ok if stack low 2D3A F3 01586 DI 2D3B 225A2D 01587 LD (SVHL),HL 2D3C 01588 RX19 EQU $-2 2D3E E1 01589 POP HL ;Return address 2D3F ED73582D 01590 LD (SAVSTK),SP ;Save the current stack 2D41 01591 RX20 EQU $-2 01592 IF @BLD631 2D43 314003 01593 LD SP,STACK$-40H ;<631>Force it low 01594 ELSE 01595 LD SP,STACK$-20H ;Force it low 01596 ENDIF 2D46 E5 01597 PUSH HL ;User ret back on 2D47 21512D 01598 LD HL,SPOLRET 2D48 01599 RX21 EQU $-2 2D4A E3 01600 EX (SP),HL ;Now, ultimate ret 1st, 2D4B E5 01601 PUSH HL ; and local ret 2nd 2D4C 2A5A2D 01602 LD HL,(SVHL) ;Restore HL 2D4D 01603 RX23 EQU $-2 2D4F FB 01604 EI 2D50 C9 01605 RET 01606 ; 01607 SPOLRET 2D51 F3 01608 DI ;Just in case 2D52 ED7B582D 01609 LD SP,(SAVSTK) ;Get the old stack 2D54 01610 RX22 EQU $-2 2D56 FB 01611 EI 2D57 C9 01612 RET 2D58 0000 01613 SAVSTK DW 0 2D5A 0000 01614 SVHL DW 0 01615 ; 01616 ; Character to PUT - Get bank activated 01617 ; 2D5C 21B82D 01618 PUTCHAR LD HL,SPLR1A ;Point to transfer addr 2D5D 01619 RX01 EQU $-2 2D5F 59 01620 LD E,C ;Xfer char to PUT 2D60 018000 01621 LD BC,0<8!0!80H ;P/u function & bank req 2D61 01622 BANKX1 EQU $-2 2D63 CD332D 01623 CALL STKCTL ;Move stack low? 2D64 01624 RX24 EQU $-2 2D66 01625 @@BANK ; & invoke bank transfer 2D66+3E66 01626 LD A,102 2D68+EF 01627 RST 40 2D69 C9 01628 RET 01629 ; 01630 ; Task processor despooling routine 01631 ; 2D6A 6C2D 01632 DSPLTCB DW DSPLR ;Despool task control blk 2D6A 01633 RX02 EQU $-2 2D6C 3A0000 01634 DSPLR LD A,($-$) ;P/u PFLAG$ & ck if 2D6D 01635 DFLAG EQU $-2 ; despooling is active 2D6F 07 01636 RLCA 2D70 D0 01637 RET NC ;Back if not 2D71 2A192D 01638 LD HL,(S0DCB) ;If spooler is inactive 2D72 01639 RX08 EQU $-2 ; then don't try to 2D74 2C 01640 INC L ; do any despooling 2D75 4E 01641 LD C,(HL) ;Get DCB vector 2D76 2C 01642 INC L 2D77 46 01643 LD B,(HL) ; into BC 2D78 210F2D 01644 LD HL,DVRABGN ;P/u spooler start 2D79 01645 RX09 EQU $-2 2D7B AF 01646 XOR A 2D7C ED42 01647 SBC HL,BC ;If the same, then 2D7E C8 01648 RET Z ; module is not active 2D7F 21642E 01649 FIX2UP LD HL,DSPLR0 ;Point to transfer addr 2D80 01650 RX03 EQU $-2 2D82 018000 01651 LD BC,0<8!0!80H ;P/u function & bank req 2D83 01652 BANKX2 EQU $-2 2D85 CD332D 01653 CALL STKCTL ;Move stack low? 2D86 01654 RX25 EQU $-2 2D88 01655 @@BANK ; & invoke bank transfer 2D88+3E66 01656 LD A,102 2D8A+EF 01657 RST 40 2D8B C9 01658 RET 01659 ; 01660 ; KI task routine to get a disk block 01661 ; 2D8C 21B02E 01662 GETBLK LD HL,GETBLK1 ;Point to transfer addr 2D8D 01663 RX04 EQU $-2 2D8F 018000 01664 LD BC,0<8!0!80H ;P/u function & bank req 2D90 01665 BANKX3 EQU $-2 2D92 CD332D 01666 CALL STKCTL ;Move stack low? 2D93 01667 RX26 EQU $-2 2D95 01668 @@BANK ; & invoke bank transfer 2D95+3E66 01669 LD A,102 2D97+EF 01670 RST 40 2D98 00 01671 GETBLK0 DB 0,0,0 ;Orig @KITSK 00 00 2D9A 01672 DVRAEND EQU $-1 2D9B 0D 01673 RELTABA DB TABALEN 2D9C 6A2D 01674 DW RX02,RX05,RX06,RX08,RX09 D327 DB27 722D 792D 2DA6 3C2D 01675 DW RX19,RX20,RX21,RX22,RX23 412D 482D 542D 4D2D 2DB0 642D 01676 DW RX24,RX25,RX26 862D 932D 000D 01677 TABALEN EQU $-RELTABA/2 01678 ; 01679 ; 2DB6 01680 DVRBBGN EQU $ 01681 ; 01682 ; Spool/despool module in bank x 01683 ; 2DB6 0000 01684 S0DCB1 DW 0 01685 ; 01686 ; Spool a character 01687 ; 2DB8 E5 01688 SPLR1A PUSH HL ;Save new transfer addr 2DB9 C5 01689 PUSH BC ;Save invocation 2DBA 4B 01690 LD C,E ;Get char to PUT 2DBB CDC32D 01691 CALL SPLR2 ;Spool a char 2DBC 01692 RX1 EQU $-2 2DBE C1 01693 POP BC 2DBF E1 01694 POP HL 2DC0 01695 @@BANK ;Transfer back 2DC0+3E66 01696 LD A,102 2DC2+EF 01697 RST 40 2DC3 DD21332F 01698 SPLR2 LD IX,SPLFCB 2DC5 01699 RX2 EQU $-2 2DC7 DD6E20 01700 LD L,(IX+20H) ;P/u next buffer position 2DCA DD6621 01701 LD H,(IX+21H) 2DCD 71 01702 LD (HL),C ;Stuff char received 2DCE F3 01703 DI 2DCF DD3420 01704 SPLR3 INC (IX+20H) ;Inc lo order 2DD2 2807 01705 JR Z,SPLR5 ;Jump if block full 2DD4 CD6E2E 01706 CALL DSPLR1X ;Output to *PR if avail 2DD5 01707 RX3 EQU $-2 2DD7 FB 01708 EI 2DD8 C3BA2E 01709 JP GETBLK2 2DD9 01710 RX4 EQU $-2 2DDB DD6E24 01711 SPLR5 LD L,(IX+24H) ;P/u pointer to table 2DDE DD6625 01712 LD H,(IX+25H) 2DE1 7E 01713 SPLR6 LD A,(HL) ;Find spare pointer field 2DE2 23 01714 INC HL 2DE3 B6 01715 OR (HL) 2DE4 2805 01716 JR Z,SPLR7 ;Jump if spare 2DE6 23 01717 INC HL ; else index to next 2DE7 23 01718 INC HL 2DE8 23 01719 INC HL 2DE9 18F6 01720 JR SPLR6 2DEB 2B 01721 SPLR7 DEC HL 2DEC E5 01722 PUSH HL ;Save pointer 2DED 23 01723 INC HL 2DEE 23 01724 INC HL 2DEF 46 01725 LD B,(HL) ;P/u memory segment byte 2DF0 23 01726 INC HL ; or lo-order recno 2DF1 7E 01727 LD A,(HL) ;End of table? 2DF2 FEFF 01728 CP 0FFH 2DF4 200B 01729 JR NZ,SPLR10 ;Jump if still space 2DF6 E1 01730 POP HL 2DF7 CD6E2E 01731 SPLR8 CALL DSPLR1X ;Output to *PR if avail 2DF8 01732 RX5 EQU $-2 2DFA FB 01733 EI 2DFB CDBA2E 01734 SPLR9 CALL GETBLK2 ;Disk rec to bring back? 2DFC 01735 RX6 EQU $-2 2DFE F3 01736 DI 2DFF 18DA 01737 JR SPLR5 2E01 CB7F 01738 SPLR10 BIT 7,A ;Test mem or disk block 2E03 2021 01739 JR NZ,SPLR12 ;Jump if disk pointer 01740 ; 01741 ; Found a spare memory pointer 01742 ; 2E05 E1 01743 POP HL ;Rcvr ptr to start 2E06 E5 01744 PUSH HL ; of spare table field 2E07 75 01745 LD (HL),L ;Place address of table 2E08 7C 01746 LD A,H ; position into table 2E09 23 01747 INC HL 2E0A 77 01748 LD (HL),A 2E0B DD7021 01749 LD (IX+21H),B ;Stuff hi-order free mem 2E0E DD6E26 01750 LD L,(IX+26H) ;P/u current table ptr 2E11 DD6627 01751 LD H,(IX+27H) 2E14 DD752A 01752 LD (IX+2AH),L ;Stuff last block pointer 2E17 DD742B 01753 LD (IX+2BH),H 2E1A C1 01754 POP BC ;Rcvr ptr to field start 2E1B 71 01755 LD (HL),C ;Set up a link to this 2E1C 23 01756 INC HL ; block in last block 2E1D 70 01757 LD (HL),B 2E1E DD7126 01758 LD (IX+26H),C ;Reset current block ptr 2E21 DD7027 01759 LD (IX+27H),B 2E24 FB 01760 EI 2E25 C9 01761 RET 01762 ; 2E26 01763 SPLR12 EQU $ 2E26 FB 01764 EI 2E27 48 01765 LD C,B ;Lo order recno 2E28 E60F 01766 AND 0FH ;Hi-order recno 2E2A 47 01767 LD B,A 2E2B DDE5 01768 PUSH IX ;Position file to recno 2E2D D1 01769 POP DE ;FCB to DE 2E2E 01770 @@POSN ;Posn to desired record 2E2E+3E42 01771 LD A,66 2E30+EF 01772 RST 40 2E31 00 01773 DB 0,0,0 ;Reserved 00 00 2E34 DD4E26 01774 LD C,(IX+26H) ;P/u current table ptr 2E37 DD4627 01775 LD B,(IX+27H) 2E3A E1 01776 POP HL ;P/u ptr to this disk 2E3B E5 01777 PUSH HL ;Block table field 2E3C 71 01778 LD (HL),C ;Tell this disk block 2E3D 23 01779 INC HL ; field which memory 2E3E 70 01780 LD (HL),B ; block it is storing 2E3F C1 01781 POP BC ;Exchange link in last 2E40 DD6E2A 01782 LD L,(IX+2AH) ; block pointer with new 2E43 DD662B 01783 LD H,(IX+2BH) ; link since this memory 2E46 71 01784 LD (HL),C ; block is now on disk 2E47 23 01785 INC HL 2E48 70 01786 LD (HL),B 2E49 DD712A 01787 LD (IX+2AH),C 2E4C DD702B 01788 LD (IX+2BH),B 2E4F 010001 01789 LD BC,256 ;Block move the page 2E52 69 01790 LD L,C ; into the low memory 2E53 DD6621 01791 LD H,(IX+21H) ; buuffer fo disk I/O 2E56 D5 01792 PUSH DE ;Save fcb pointer 2E57 110023 01793 LD DE,LOWBUF$ 2E5A EDB0 01794 LDIR 2E5C D1 01795 POP DE 2E5D 01796 @@WRITE ;Write out the block 2E5D+3E4B 01797 LD A,75 2E5F+EF 01798 RST 40 2E60 00 01799 DB 0,0,0 ;Reserved 00 00 2E63 C9 01800 RET 01801 ; 2E64 E5 01802 DSPLR0 PUSH HL ;Save new transfer addr 2E65 C5 01803 PUSH BC ;Save invocation 2E66 CD732E 01804 CALL DSPLR1 ;Send device a char 2E67 01805 RX7 EQU $-2 2E69 C1 01806 POP BC 2E6A E1 01807 POP HL 2E6B 01808 @@BANK ;Transfer back 2E6B+3E66 01809 LD A,102 2E6D+EF 01810 RST 40 01811 ; 01812 ; Routine will output a char to PR if available 01813 ; 2E6E 3A0000 01814 DSPLR1X LD A,($-$) ;P/u PFLAG$ & ck if 2E6F 01815 DFLAG1 EQU $-2 ; despooling is active 2E71 07 01816 RLCA 2E72 D0 01817 RET NC ;Back if not active 2E73 010004 01818 DSPLR1 LD BC,4<8!0 ;Init to CTL-0 2E76 DDE5 01819 PUSH IX ;Save current DCB vector 2E78 DD2AB62D 01820 PUDCB LD IX,(S0DCB1) ;Point to printer 2E7A 01821 RX9 EQU $-2 2E7C 01822 @@CHNIO ;Ck *PR status 2E7C+3E14 01823 LD A,20 2E7E+EF 01824 RST 40 2E7F DDE1 01825 POP IX 2E81 C0 01826 RET NZ ;Ret if not avail 2E82 DD21332F 01827 PUFCB LD IX,SPLFCB 2E84 01828 RX10 EQU $-2 2E86 DD7E23 01829 LD A,(IX+23H) ;See if char in buffer 2E89 B7 01830 OR A ; to send to the printer 2E8A C8 01831 RET Z ;Ret if none 2E8B 67 01832 LD H,A ;None also if GET pointer 2E8C DDBE21 01833 CP (IX+21H) ; is same as PUT pointer 2E8F DD7E22 01834 LD A,(IX+22H) 2E92 2004 01835 JR NZ,DSPLR2 2E94 DDBE20 01836 CP (IX+20H) 2E97 C8 01837 RET Z ;In & out the same 2E98 6F 01838 DSPLR2 LD L,A ;P/u the character 2E99 4E 01839 LD C,(HL) ;Xfer to output reg 2E9A DDE5 01840 PUSH IX ;Save this dcb vector 2E9C 0602 01841 LD B,2 ;Set chain for PUT 2E9E DD2AB62D 01842 PUDCB1 LD IX,(S0DCB1) ;Pt to spooled DCB 2EA0 01843 RX11 EQU $-2 2EA2 01844 @@CHNIO ;Output the char 2EA2+3E14 01845 LD A,20 2EA4+EF 01846 RST 40 2EA5 DDE1 01847 POP IX ;Rcvr dcb 2EA7 DD3422 01848 INC (IX+22H) ;Bump PUT (out) ptr 2EAA C0 01849 RET NZ ;Ret if still more in buf 2EAB DD362300 01850 LD (IX+23H),0 ;Block empty, turn off 2EAF C9 01851 RET ; hi-order & exit 01852 ; 01853 ; Routine to see if we can grab a block back from 01854 ; the disk file & insert into a spare memory block 01855 ; 2EB0 E5 01856 GETBLK1 PUSH HL ;Save new transfer addr 2EB1 C5 01857 PUSH BC ;Save invocation 2EB2 CDBA2E 01858 CALL GETBLK2 ;Spool a char 2EB3 01859 RX12 EQU $-2 2EB5 C1 01860 POP BC 2EB6 E1 01861 POP HL 2EB7 01862 @@BANK ;Transfer back 2EB7+3E66 01863 LD A,102 2EB9+EF 01864 RST 40 2EBA F5 01865 GETBLK2 PUSH AF 2EBB DDE5 01866 PUSH IX ;Save in case DSPLR1 2EBD 3A562F 01867 GETBLK3 LD A,(SPLFCB+23H) ;Jump if block being 2EBE 01868 RX13 EQU $-2 2EC0 B7 01869 OR A ; printed is not empty 2EC1 202D 01870 JR NZ,GETBLK6 01871 ; 01872 ; The block's been despooled. Get 1 from D,M? 01873 ; 2EC3 E5 01874 PUSH HL 2EC4 D5 01875 PUSH DE 2EC5 C5 01876 PUSH BC 2EC6 DD21332F 01877 GETBLK4 LD IX,SPLFCB 2EC8 01878 RX14 EQU $-2 2ECA DD6E28 01879 LD L,(IX+28H) ;P/u pointer of block 2ECD DD6629 01880 LD H,(IX+29H) ; being printed 2ED0 E5 01881 PUSH HL 2ED1 4E 01882 LD C,(HL) ;Point to POSN or hi-mem 2ED2 23 01883 INC HL ; byte of field this 2ED3 46 01884 LD B,(HL) ; field points to 2ED4 210200 01885 LD HL,2 ;P/u the POSN or hi-order 2ED7 09 01886 ADD HL,BC 2ED8 7E 01887 LD A,(HL) 2ED9 23 01888 INC HL 2EDA CB7E 01889 BIT 7,(HL) ;Jump if it is pointing 2EDC 201B 01890 JR NZ,GETBLK7 ; to a disk block 2EDE DD7723 01891 LD (IX+23H),A ;Reset hi order of where 2EE1 E1 01892 POP HL ; next block coming from 2EE2 3600 01893 LD (HL),0 ;Show that this block 2EE4 23 01894 INC HL ; is spare 2EE5 3600 01895 LD (HL),0 2EE7 DD7128 01896 LD (IX+28H),C ;Set the next block 2EEA DD7029 01897 LD (IX+29H),B ; to be printed 2EED C1 01898 GETBLK5 POP BC 2EEE D1 01899 POP DE 2EEF E1 01900 POP HL 2EF0 01901 GETBLK6 EQU $ 2EF0 F3 01902 DI 2EF1 CD6E2E 01903 CALL DSPLR1X ;Check if we can despool 2EF2 01904 RX15 EQU $-2 ; a character while 2EF4 FB 01905 EI ; we are in here 2EF5 DDE1 01906 POP IX 2EF7 F1 01907 POP AF 2EF8 C9 01908 RET 01909 ; 01910 ; Next block to print is on disk, get it 01911 ; 2EF9 4F 01912 GETBLK7 LD C,A ;Set up position 2EFA 7E 01913 LD A,(HL) 2EFB E60F 01914 AND 0FH 2EFD 47 01915 LD B,A 2EFE DDE5 01916 PUSH IX ;Set FCB & position 2F00 D1 01917 POP DE ; the spool file 2F01 01918 @@POSN 2F01+3E42 01919 LD A,66 2F03+EF 01920 RST 40 2F04 00 01921 DB 0,0,0 ;Reserved 00 00 2F07 E1 01922 POP HL ;Rcvr table ptr of 2F08 E5 01923 PUSH HL ; block just finished 2F09 23 01924 INC HL 2F0A 23 01925 INC HL ;P/u its buffer location 2F0B 01926 @@READ ;Read block from file 2F0B+3E43 01927 LD A,67 2F0D+EF 01928 RST 40 2F0E 00 01929 DB 0,0,0 ;Reserved 00 00 2F11 010001 01930 LD BC,256 ;Block move from the 2F14 56 01931 LD D,(HL) ; low memory buffer 2F15 59 01932 LD E,C ; to RAM page 2F16 210023 01933 LD HL,LOWBUF$ 2F19 EDB0 01934 LDIR 2F1B E1 01935 POP HL ;Tbl ptr of block fin'd 2F1C E5 01936 PUSH HL 2F1D 7E 01937 LD A,(HL) ;P/u field addrress of 2F1E 23 01938 INC HL ; the next table field 2F1F 66 01939 LD H,(HL) ; that gets printed 2F20 6F 01940 LD L,A 2F21 4E 01941 LD C,(HL) ;P/u field address of the 2F22 3600 01942 LD (HL),0 ; block after that to 2F24 23 01943 INC HL ; print & show this one 2F25 46 01944 LD B,(HL) ; as empty (this was the 2F26 3600 01945 LD (HL),0 ; disk one just vacated) 2F28 E1 01946 POP HL 2F29 71 01947 LD (HL),C ;Reset current printing 2F2A 23 01948 INC HL ; block & point to 2F2B 70 01949 LD (HL),B ; new next block 2F2C 23 01950 INC HL 2F2D 46 01951 LD B,(HL) 2F2E DD7023 01952 LD (IX+23H),B ;Show where new printing 2F31 18BA 01953 JR GETBLK5 ; block is & exit 01954 ; 01955 ; File control block area for spool file 01956 ; 2F33 01957 SPLFCB DS 32 01958 ; 01959 ; Pointer to the memory location where the next 01960 ; character received from *XX can be put 01961 ; 2F53 01962 PUTNXT$ DS 2 01963 ; 01964 ; Pointer to where the next character to print 01965 ; is going to come from 01966 ; 2F55 01967 GETNXT$ DS 2 01968 ; 01969 ; Pointer to start of block map table 01970 ; table configuration is: 01971 ; TAB+0/1 -> store the TAB address if the field 01972 ; is currently in use for receiving. If a 01973 ; block is not current, it stores the 01974 ; address of the next TAB to print. If 01975 ; a disk field, then stores the TAB address 01976 ; of the previous block (link back) 01977 ; 01978 ; TAB+2 -> for a memory block, stores the hi-order 01979 ; byte of where the memory block starts. If 01980 ; a disk byte, stores the lo-order POSN #. 01981 ; 01982 ; TAB+3 -> s/b 0 for a memory block or if a disk 01983 ; block, it contains the hi-order POSN 01984 ; vector with bit 7 set. 01985 ; 2F57 01986 MAPPTR$ DS 2 01987 ; 01988 ; Pointer to the beginning of the memory table 01989 ; block pointer for the block that is receiving 01990 ; characters from *PR calls (the current block) 01991 ; 2F59 01992 PUTBLK$ DS 2 01993 ; 01994 ; Pointer to the memory table field for the block 01995 ; that is printing characters 01996 ; 2F5B 01997 GETBLK$ DS 2 01998 ; 01999 ; Points to the table position of the previous 02000 ; block. This is used to reset the previous link 02001 ; 2F5D 0000 02002 DW 0 2F5E 02003 DVRBEND EQU $-1 2F5F 15 02004 RELTABB DB TABBLEN 2F60 5D2D 02005 DW RX01,RX03,RX04 802D 8D2D 2F66 BC2D 02006 DW RX1,RX2,RX3,RX4,RX5,RX6,RX7,RX8 C52D D52D D92D F82D FC2D 672E 282D 2F76 7A2E 02007 DW RX9,RX10,RX11,RX12,RX13,RX14,RX15 842E A02E B32E BE2E C82E F22E 2F84 012D 02008 DW RX16,RX17,RX18 062D 0B2D 0015 02009 TABBLEN EQU $-RELTABB/2 02010 ; 02012 ; 2400 02014 END SPOOL 2400 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]