[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:29:53 SYSTEM - LS-DOS 6.2 Page 00001 00001 ;LBSYSTEM/ASM - SYSTEM Command 00003 ; 00EC 00004 MODPORT EQU 0ECH 000D 00005 CR EQU 13 00006 ; 0000 00007 *GET SVCMAC:3 ;SVC Macro equivalents 00008 ;SVCMAC/ASM - LS-DOS Version VI 00009 *LIST OFF 00401 *LIST ON 00403 *LIST OFF ;Get SYS0/EQU 00856 *LIST ON 00857 ; 2400 00858 ORG 2400H 00859 ; 00860 IF @BLD631 2400 C3E525 00861 JP LSYSTEM ;<631> 2403 4E 00862 NOMEM$ DB 'No memory space available',CR ;<631> 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 241D 50 00863 PRMERR$ DB 'Parameter error',CR ;<631> 61 72 61 6D 65 74 65 72 20 65 72 72 6F 72 0D 242D 43 00864 NOCYL8$ DB 'CYL=c invalid on 8" drive',CR ;<631> 59 4C 3D 63 20 69 6E 76 61 6C 69 64 20 6F 6E 20 38 22 20 64 72 69 76 65 0D 2447 43 00865 BADCYL$ DB 'Cylinder count out of range <35-96>',CR;<631> 79 6C 69 6E 64 65 72 20 63 6F 75 6E 74 20 6F 75 74 20 6F 66 20 72 61 6E 67 65 20 3C 33 35 2D 39 36 3E 0D 246B 43 00866 BADSYS$ DB 'Can''t SYSRES requested module',CR ;<631> 61 6E 27 74 20 53 59 53 52 45 53 20 72 65 71 75 65 73 74 65 64 20 6D 6F 64 75 6C 65 0D 2489 53 00867 MODRES$ DB 'System module already resident',CR ;<631> 79 73 74 65 6D 20 6D 6F 64 75 6C 65 20 61 6C 72 65 61 64 79 20 72 65 73 69 64 65 6E 74 0D 24A8 45 00868 EIPMPT DM 'Enter DCT driver: ',3 ;<631> 6E 74 65 72 20 44 43 54 20 64 72 69 76 65 72 20 3C 42 52 45 41 4B 3D 64 65 66 61 75 6C 74 3E 20 3A 20 03 24CC 42 00869 BADBS$ DB 'Boot step out of range <0-3>',CR ;<631> 6F 6F 74 20 73 74 65 70 20 6F 75 74 20 6F 66 20 72 61 6E 67 65 20 3C 30 2D 33 3E 0D 24E9 44 00870 DCTEXT DM 'DCT' ;<631> 43 54 00871 ; 24EC 00872 PRMTBL$ EQU $ ;<631> 24EC 41 00873 DB 'ALIVE ' ;<631> 4C 49 56 45 20 24F2 7627 00874 DW ALIVE+1 ;<631> 24F4 41 00875 DB 'AMPM ' ;<631> 4D 50 4D 20 20 24FA 4026 00876 DW AMPM+1 ;<631> 24FC 42 00877 DB 'BSTEP ' ;<631> 53 54 45 50 20 2502 AA26 00878 DW BSPARM+1 ;<631> 2504 44 00879 DM 'DRIVER' ;<631> 52 49 56 45 52 250A 1F2A 00880 DW DVRPARM+1 ;<631> 250C 46 00881 DB 'FAST ' ;<631> 41 53 54 20 20 2512 0326 00882 DW FPARM+1 ;<631> 2514 53 00883 DB 'SLOW ' ;<631> 4C 4F 57 20 20 251A FC25 00884 DW SLOW+1 ;<631> 251C 53 00885 DB 'SWAP ' ;<631> 57 41 50 20 20 2522 082B 00886 DW SWAP+1 ;<631> 2524 53 00887 DB 'SYSRES' ;<631> 59 53 52 45 53 252A E427 00888 DW SYSRES+1 ;<631> 252C 53 00889 DB 'SYSTEM' ;<631> 59 53 54 45 4D 2532 F62A 00890 DW SYSPRM+1 ;<631> 2534 54 00891 DB 'TYPE ' ;<631> 59 50 45 20 20 253A 1327 00892 DW TYPE+1 ;<631> 253C 57 00893 DB 'WP ' ;<631> 50 20 20 20 20 2542 4F29 00894 DW WPARM+1 ;<631> 2544 42 00895 DB 'BLINK ' ;<631> 4C 49 4E 4B 20 254A CB26 00896 DW BLINK+1 ;<631> 254C 42 00897 DB 'BREAK ' ;<631> 52 45 41 4B 20 2552 5626 00898 DW BREAK+1 ;<631> 2554 43 00899 DB 'CYL ' ;<631> 59 4C 20 20 20 255A 6429 00900 DW CYLPRM+1 ;<631> 255C 44 00901 DB 'DATE ' ;<631> 41 54 45 20 20 2562 7C26 00902 DW DATE+1 ;<631> 2564 44 00903 DB 'DELAY ' ;<631> 45 4C 41 59 20 256A CE29 00904 DW DELAY+1 ;<631> 256C 43 00905 DB 'CKDRV ' ;<631> 4B 44 52 56 20 2572 E629 00906 DW CKDRV+1 ;<631> 2574 44 00907 DB 'DISABL' ;<631> 49 53 41 42 4C 257A 9629 00908 DW DISABL+1 ;<631> 257C 44 00909 DB 'DRIVE ' ;<631> 52 49 56 45 20 2582 2C29 00910 DW DRIVE+1 ;<631> 2584 45 00911 DB 'ENABLE' ;<631> 4E 41 42 4C 45 258A A729 00912 DW ENABLE+1 ;<631> 258C 47 00913 DB 'GRAPHI' ;<631> 52 41 50 48 49 2592 6127 00914 DW GRAPHI+1 ;<631> 2594 4C 00915 DB 'LARGE ' ;<631> 41 52 47 45 20 259A E426 00916 DW LARGE+1 ;<631> 259C 52 00917 DB 'RESTOR' ;<631> 45 53 54 4F 52 25A2 FC26 00918 DW RPARM+1 ;<631> 25A4 53 00919 DB 'SMALL ' ;<631> 4D 41 4C 4C 20 25AA EE26 00920 DW SMALPRM+1 ;<631> 25AC 50 00921 DB 'PRTIME' ;<631> 52 54 49 4D 45 25B2 6A26 00922 DW PRTIME+1 ;<631> 25B4 53 00923 DB 'STEP ' ;<631> 54 45 50 20 20 25BA B329 00924 DW STEP+1 ;<631> 25BC 54 00925 DB 'TIME ' ;<631> 49 4D 45 20 20 25C2 9326 00926 DW TIME+1 ;<631> 25C4 54 00927 DB 'TRACE ' ;<631> 52 41 43 45 20 25CA 2726 00928 DW TRACE+1 ;<631> 25CC 53 00929 DB 'SMOOTH' ;<631> 4D 4F 4F 54 48 25D2 2827 00930 DW SMOOTH+1 ;<631> 25D4 48 00931 DB 'HERTZ5' ;<631> 45 52 54 5A 35 25DA 4727 00932 DW HERTZ50+1 ;<631> 25DC 48 00933 DB 'HERTZ6' ;<631> 45 52 54 5A 36 25E2 5427 00934 DW HERTZ60+1 ;<631> 25E4 00 00935 NOP ;<631> 25E5 ED73C72A 00936 LSYSTEM:LD (LSAVESP+1),SP ;<631>Save the stack 00937 ELSE 00938 SYSTEM 00939 ENDIF 25E9 00940 @@CKBRKC ;Check for 25E9+3E6A 00941 LD A,106 25EB+EF 00942 RST 40 00943 IF @BLD631 25EC C2C32A 00944 JP NZ,ABORT ;<631>Abort 00945 ELSE 00946 JR Z,SYSTEM1 ;Go if not 00947 LD HL,-1 ; else abort 00948 RET 00949 ; 00950 LSAVESP LD SP,$-$ ;P/u original stack 00951 @@CKBRKC ;Clear any 00952 RET ;Ret to DOS 00953 ; 00954 ; Internal Error Message Handling 00955 ; 00956 NOMEM LD HL,NOMEM$ ;"No memroy available 00957 DB 0DDH 00958 PRMERR LD HL,PRMERR$ ;"Parm error 00959 SETERR @@LOGOT 00960 FRCERR LD HL,-1 ;Set abort code 00961 JR LSAVESP ;Exit 00962 ; 00963 ; I/O Error Handler 00964 ; 00965 IOERR LD L,A ;Error # to HL 00966 LD H,0 00967 OR 0C0H ;Set brief to return 00968 LD C,A 00969 @@ERROR ;Display the error 00970 JR LSAVESP ;Exit 00971 ; 00972 ; SYSTEM1 - Set the O/S's parameters 00973 ; 00974 SYSTEM1 00975 LD (LSAVESP+1),SP ;Save the stack 00976 ; 00977 ENDIF 25EF 11EC24 00978 LD DE,PRMTBL$ ;Get parms 25F2 00979 @@PARAM 25F2+3E11 00980 LD A,17 25F4+EF 00981 RST 40 25F5 C2E12A 00982 JP NZ,PRMERR ;Jump on parm error 25F8 00983 @@FLAGS ;Get IY = flagtab 25F8+3E65 00984 LD A,101 25FA+EF 00985 RST 40 25FB 010000 00986 SLOW LD BC,0 ;Test SLOW parm 25FE 78 00987 LD A,B 25FF B1 00988 OR C 2600 2013 00989 JR NZ,SETSLOW ;Jump if SLOW entered 2602 010000 00990 FPARM LD BC,0 ;P/u FAST parm 2605 78 00991 LD A,B 2606 B1 00992 OR C 2607 281D 00993 JR Z,FPEND ;Neither SLOW nor FAST? 2609 FDCB12DE 00994 SET 3,(IY+'S'-'A') ;Set fast in flag 00995 IF @MOD4 260D FDCB0CF6 00996 SET 6,(IY+'M'-'A') ;Set bit 6 in port mask 00997 ENDIF 2611 0655 00998 LD B,55H ;Init time slice byte 2613 1808 00999 JR SETCLK ;Go set it 01000 ; 01001 ; Turn off FAST 01002 ; 2615 FDCB129E 01003 SETSLOW RES 3,(IY+'S'-'A') ;Reset the FAST bit 01004 IF @MOD4 2619 FDCB0CB6 01005 RES 6,(IY+'M'-'A') ;Reset bit in port mask 01006 ENDIF 261D 78 01007 SETCLK LD A,B 261E 322B00 01008 LD (TIMSL$),A ;Set 55H=fast, FFH=slow 01009 IF @MOD4 2621 FD7E0C 01010 LD A,(IY+'M'-'A') ;Update the port 2624 D3EC 01011 OUT (MODPORT),A 01012 ENDIF 2626 01013 FPEND EQU $ 01014 ; 01015 ; Trace entry 01016 ; 2626 010100 01017 TRACE LD BC,1 ;Init to pass by 2629 78 01018 LD A,B 262A B1 01019 OR C 262B 280D 01020 JR Z,TROFF ;Go if Trace off 262D 3C 01021 INC A 262E 200F 01022 JR NZ,TREND ;Go if not entered 01023 IF @MOD4 2630 11B107 01024 LD DE,TRACE_INT ;Pt to trace SYSRES rtn 01025 ENDIF 01026 IF @MOD2 01027 LD DE,DO_TRACE ;Address 01028 ENDIF 2633 0E07 01029 LD C,7 ;Init to task 7 2635 01030 @@ADTSK ;Turn TRACE (ON) 2635+3E1D 01031 LD A,29 2637+EF 01032 RST 40 2638 1805 01033 JR TREND 263A 0E07 01034 TROFF LD C,7 ;Init to task 7 263C 01035 @@RMTSK ;Remove TRACE task 263C+3E1E 01036 LD A,30 263E+EF 01037 RST 40 263F 01038 TREND EQU $ 01039 IF @BLD631 263F 010100 01040 AMPM: LD BC,1 ;<631> 2642 78 01041 LD A,B ;<631> 2643 B1 01042 OR C ;<631> 2644 280B 01043 JR Z,L2651 ;<631> 2646 78 01044 LD A,B ;<631> 2647 A1 01045 AND C ;<631> 2648 3C 01046 INC A ;<631> 2649 200A 01047 JR NZ,BREAK ;<631> 264B FDCB08A6 01048 RES 4,(IY+'I'-'A') ;<631> 264F 1804 01049 JR BREAK ;<631> 2651 FDCB08E6 01050 L2651: SET 4,(IY+'I'-'A') ;<631> 01051 ENDIF 01052 ; 01053 ; Routine to handle BREAK 01054 ; 2655 010100 01055 BREAK LD BC,1 ;Init BREAK=ON 2658 78 01056 LD A,B 2659 B1 01057 OR C 265A 2809 01058 JR Z,BRKOFF ;Jump if BREAK=OFF 265C 3C 01059 INC A ;Check Break=ON 265D 200A 01060 JR NZ,BRKEND ;Go if no parm used 265F FDCB12A6 01061 RES 4,(IY+'S'-'A') ;Correct system flag 2663 1804 01062 JR BRKEND 01063 ; 01064 ; Disable key 01065 ; 2665 FDCB12E6 01066 BRKOFF SET 4,(IY+'S'-'A') 2669 01067 BRKEND EQU $ 01068 ; 01069 ; Date prompt suppression during BOOT 01070 ; 2669 010100 01071 PRTIME: LD BC,1 ;Init to pass by 01072 IF @BLD631 266C 21290E 01073 LD HL,@PRTIMO ;<631>DEC DE opcode in Printer driver 266F 78 01074 LD A,B ;<631> 2670 B1 01075 OR C ;<631> 2671 2807 01076 JR Z,DISTIMO ;<631>Load a NOP over DEC DE 2673 78 01077 LD A,B ;<631> 2674 A1 01078 AND C ;<631> 2675 3C 01079 INC A ;<631> 2676 2003 01080 JR NZ,DATE ;<631> 2678 3E1B 01081 LD A,1BH ;<631>DEC DE opcode (default) 267A 77 01082 DISTIMO:LD (HL),A ;<631> 267B 010100 01083 DATE: LD BC,1 ;<631> 01084 ENDIF 267E 78 01085 LD A,B 267F B1 01086 OR C 2680 06FF 01087 LD B,0FFH ;Init to DATE Suppress 2682 2804 01088 JR Z,DOFF ;Go if suppress 2684 3C 01089 INC A 2685 200B 01090 JR NZ,DATEND ;Go if not entered 2687 47 01091 LD B,A ;B=0 on no suppress 2688 CDF52B 01092 DOFF CALL GETCFG ;Get track 0, sector 2 268B 78 01093 LD A,B ;Get back the code byte 268C 32C21D 01094 LD (DTPMT$&0FFH+SBUFF$),A 268F CDF22B 01095 CALL PUTCFG ;Write it back 2692 01096 DATEND EQU $ 01097 ; 01098 ; Time prompt suppression during BOOT 01099 ; 2692 010100 01100 TIME LD BC,1 ;Init to pass by 2695 78 01101 LD A,B 2696 B1 01102 OR C 2697 06FF 01103 LD B,0FFH ;Init to TIME Suppress 2699 2804 01104 JR Z,TOFF ;Go if suppress 269B 3C 01105 INC A 269C 200B 01106 JR NZ,TIMEND ;Go if not entered 269E 47 01107 LD B,A ;B=0 on no suppress 269F CDF52B 01108 TOFF CALL GETCFG ;Get track 0, sector 2 26A2 78 01109 LD A,B ;Get back the code byte 26A3 32C31D 01110 LD (TMPMT$&0FFH+SBUFF$),A 26A6 CDF22B 01111 CALL PUTCFG ;Write it back 26A9 01112 TIMEND EQU $ 01113 ; 01114 ; BOOT Step rate adjust 01115 ; 26A9 01FFFF 01116 BSPARM LD BC,-1 ;P/u parm 26AC 04 01117 INC B ;User entry? 26AD 281B 01118 JR Z,BSPEND ;Go if not entered 26AF 79 01119 LD A,C ;Transfer parm 26B0 FE04 01120 CP 4 26B2 3808 01121 JR C,GUDBS ;Ok if < 4 26B4 21CC24 01122 LD HL,BADBS$ ; else bad step rate 26B7 CDE42A 01123 CALL SETERR 26BA 180E 01124 JR BSPEND 26BC 47 01125 GUDBS LD B,A ;Save step 26BD CDF52B 01126 CALL GETCFG ;Get System Info Sector 26C0 2E73 01127 LD L,70H+3 ;Offset to data 26C2 7E 01128 LD A,(HL) ;P/u DCT+3 parms 26C3 E6FC 01129 AND 0FCH ;Strip off boot step 26C5 B0 01130 OR B ;Merge new 26C6 77 01131 LD (HL),A ;Stuff back 26C7 CDF22B 01132 CALL PUTCFG ;Write it back 26CA 01133 BSPEND EQU $ 01134 ; 01135 ; BLINK parm 01136 ; 26CA 010100 01137 BLINK LD BC,1 ;P/U parm 26CD 78 01138 LD A,B 26CE B1 01139 OR C 26CF 3D 01140 DEC A ;Specified? 26D0 2829 01141 JR Z,BLIEND ;Go if not 26D2 3C 01142 INC A 26D3 2006 01143 JR NZ,BLNKON ;Go if BLINK=ON 26D5 FDCB15F6 01144 SET 6,(IY+'V'-'A') ;Turn off blinking 01145 IF @MOD2 01146 LD A,($CRSCHAR) ;Get current char 01147 AND 1FH ;Keep size only 01148 JR SETBLK ;Setup 01149 ENDIF 01150 IF @MOD4 26D9 1820 01151 JR BLIEND ;Continue 01152 ENDIF 26DB FDCB15B6 01153 BLNKON RES 6,(IY+'V'-'A') ;Turn on blinking 26DF FEFF 01154 CP 0FFH ;If not just BLINK, 01155 IF @MOD4 26E1 2012 01156 JR NZ,SETBLK ; set user cursor 01157 ENDIF 01158 IF @MOD2 01159 JR Z,LARGE ;Go if not 01160 BLIADJ SUB 7 ;Force in range 0-7 01161 JR NC,BLIADJ ;Go till in range 01162 ADD A,7 ;Add back last sub 01163 OR 01000000B ;Set blink enable 1/16 01164 JR SETBLK ;Continue 01165 ENDIF 26E3 010000 01166 LARGE LD BC,0 ; else test if large, 26E6 0C 01167 INC C ; small, or default 01168 IF @MOD2 01169 LD A,01000111B ;Standard cursor 01170 ENDIF 01171 IF @MOD4 26E7 3E5F 01172 LD A,'_' ;Standard cursor 01173 ENDIF 26E9 2002 01174 JR NZ,SMALPRM 01175 IF @MOD2 01176 LD A,01000000B ;To large 01177 ENDIF 01178 IF @MOD4 26EB 3E8F 01179 LD A,8FH ;To large 01180 ENDIF 26ED 010000 01181 SMALPRM LD BC,0 26F0 0C 01182 INC C 26F1 2002 01183 JR NZ,SETBLK 01184 IF @MOD2 01185 LD A,01000101B ;Small 01186 ENDIF 01187 IF @MOD4 26F3 3E88 01188 LD A,88H ;Small 01189 ENDIF 26F5 4F 01190 SETBLK LD C,A ;Xfer cursor char to C 26F6 0608 01191 LD B,8 ;Cursor update function 26F8 01192 @@VDCTL 26F8+3E0F 01193 LD A,15 26FA+EF 01194 RST 40 26FB 01195 BLIEND EQU $ 01196 ; 01197 ; RESTORE parameter 01198 ; 26FB 010100 01199 RPARM LD BC,1 ;P/U parm 26FE 78 01200 LD A,B 26FF B1 01201 OR C 2700 3D 01202 DEC A ;Specified? 2701 280F 01203 JR Z,REND ;Go if not 2703 3C 01204 INC A 2704 2001 01205 JR NZ,RSTRON ;Go if RESTORE=on 2706 3E 01206 DB 3EH ;Make LD A,n 2707 AF 01207 RSTRON XOR A 2708 47 01208 LD B,A ;Save step 2709 CDF52B 01209 CALL GETCFG ;Get config sector 270C 2EC4 01210 LD L,RSTOR$&0FFH ;Pt to RESTORE flag 270E 70 01211 LD (HL),B ;Stuff back 270F CDF22B 01212 CALL PUTCFG ;Put it back 2712 01213 REND EQU $ 01214 ; 01215 ; Type ahead processing 01216 ; 2712 010100 01217 TYPE LD BC,1 ;P/u Type parm value 2715 78 01218 LD A,B 2716 B1 01219 OR C 2717 3D 01220 DEC A ;Was Type used? 2718 280D 01221 JR Z,TYPEND ;Jump if TYPE not entered 271A 3C 01222 INC A 271B 2006 01223 JR NZ,TYPEON ;Jump if TYPE=ON 271D FDCB038E 01224 RES 1,(IY+'D'-'A') ;Turn TYPE off 2721 1804 01225 JR TYPEND 2723 FDCB03CE 01226 TYPEON SET 1,(IY+'D'-'A') ;Turn TYPE on 2727 01227 TYPEND EQU $ 01228 ; 01229 ; Process SMOOTH 01230 ; 2727 010100 01231 SMOOTH LD BC,1 ;P/u Smooth parm value 272A 78 01232 LD A,B 272B B1 01233 OR C 272C 3D 01234 DEC A ;Was Smooth used? 272D 2817 01235 JR Z,SMEND ;Skip if not entered 272F 3C 01236 INC A 2730 200B 01237 JR NZ,SMON ;Go if Smooth=ON 01238 IF @MOD4 2732 FDCB039E 01239 RES 3,(IY+'D'-'A') ;Show OFF in DFLAG$ 2736 3E00 01240 LD A,00 ;Set to store NOP 2738 320E00 01241 LD (FDDINT$),A ; put it there 01242 ENDIF 273B 1809 01243 JR SMEND 273D 01244 SMON EQU $ 01245 IF @MOD4 273D FDCB03DE 01246 SET 3,(IY+'D'-'A') ;Show ON in DFLAG$ 2741 3EF3 01247 LD A,0F3H ;DI opcode 2743 320E00 01248 LD (FDDINT$),A ; put it there 01249 ENDIF 2746 01250 SMEND EQU $ 01251 ; 01252 ; Routine to process HERTZ selection 01253 ; 2746 010100 01254 HERTZ50 LD BC,1 ;P/u H50 parm value 2749 78 01255 LD A,B 274A B1 01256 OR C 274B 3D 01257 DEC A ;Check if parm entered 274C 2805 01258 JR Z,HZ50END ;Go if not 274E 3E19 01259 LD A,25 ;Init 25 ints/sec 2750 325007 01260 LD (HERTZ$),A ;Put value in timer code 2753 01261 HZ50END EQU $ 2753 010100 01262 HERTZ60 LD BC,1 ;P/u H60 parm value 2756 78 01263 LD A,B 2757 B1 01264 OR C 2758 3D 01265 DEC A ;Check if parm entered 2759 2805 01266 JR Z,HZ60END ;Go if not 275B 3E1E 01267 LD A,30 ;Init 30 ints/sec 275D 325007 01268 LD (HERTZ$),A ; & load it to timer 2760 01269 HZ60END EQU $ 01270 ; 01271 ; Routine to process GRAPHIC 01272 ; 2760 010100 01273 GRAPHI LD BC,1 ;Init for bypass 2763 78 01274 LD A,B 2764 B1 01275 OR C 2765 3D 01276 DEC A ;Check if parm entered 2766 280D 01277 JR Z,GRAEND ;Go if not entered 2768 3C 01278 INC A ;Test of GRAPHIC=off 2769 2806 01279 JR Z,GROFF ;Go if off 276B FDCB03FE 01280 SET 7,(IY+'D'-'A') ; else turn on 276F 1804 01281 JR GRAEND 2771 FDCB03BE 01282 GROFF RES 7,(IY+'D'-'A') ;Turn graphic off 2775 01283 GRAEND EQU $ 01284 ; 01285 ; Routine to process ALIVE 01286 ; 2775 010100 01287 ALIVE LD BC,1 ;P/u Alive parm value 2778 78 01288 LD A,B 2779 B1 01289 OR C 277A 3D 01290 DEC A ;Check if entered 277B 2866 01291 JR Z,ALVEND ;Bypass if parm omitted 277D 3C 01292 INC A 277E 2007 01293 JR NZ,ALIVEON ;Jump if ALIVE=ON 01294 IF @MOD2 01295 LD C,6 ;Slot alive 01296 ENDIF 01297 IF @MOD4 2780 0E03 01298 LD C,3 ;Slot alive 01299 ENDIF 2782 01300 @@RMTSK ;Remove it if OFF 2782+3E1E 01301 LD A,30 2784+EF 01302 RST 40 2785 185C 01303 JR ALVEND 01304 ; 2787 01305 ALIVEON EQU $ 01306 IF @MOD2 01307 LD C,6 ;Slot alive 01308 LD DE,DO_ALIVE ;Task address 01309 @@ADTSK ;Add task 01310 ENDIF 01311 IF @MOD4 2787 CD0C2C 01312 CALL GOTMEM? ;Is HIGH$ frozen? 278A DADD2A 01313 JP C,NOMEM ;Quit if so 278D CD042C 01314 CALL GETHI$ ;Get address for Alive 2790 22BC27 01315 LD (ALVBGN+2),HL ;Stuff last byte used 2793 012900 01316 LD BC,ALVEND-ALVBGN ;Get len of code 2796 AF 01317 XOR A 2797 ED42 01318 SBC HL,BC ;Calc new HIGH$ 2799 0600 01319 LD B,0 279B 01320 @@HIGH$ ;Stuff new HIGH$ 279B+3E64 01321 LD A,100 279D+EF 01322 RST 40 279E 23 01323 INC HL ;Point to module start 279F E5 01324 PUSH HL ;Save start 27A0 0E10 01325 LD C,ALVTCB-ALVBGN+2 27A2 09 01326 ADD HL,BC ;Point to alive task 27A3 22C827 01327 LD (ALVTCB),HL ; & stuff ALIVE TCB 27A6 E3 01328 EX (SP),HL ;Rcvr start of module 27A7 EB 01329 EX DE,HL ; into DE 27A8 21BA27 01330 LD HL,ALVBGN 27AB 012900 01331 LD BC,ALVEND-ALVBGN 27AE EDB0 01332 LDIR ;Move to high memory 27B0 D1 01333 POP DE ;Rcvr start of task 27B1 1B 01334 DEC DE ;Back up to TCB 27B2 1B 01335 DEC DE 27B3 0E03 01336 LD C,3 ;Add as task 3 27B5 01337 @@ADTSK 27B5+3E1D 01338 LD A,29 27B7+EF 01339 RST 40 27B8 1829 01340 JR ALVEND 01341 ENDIF 01342 ; 01343 ; ALIVE high memory module 01344 ; 01345 IF @MOD4 27BA 18FE 01346 ALVBGN JR $ 27BC 0000 01347 DW $-$ 27BE 05 01348 DB 5,'ALIVE' 41 4C 49 56 45 27C4 0000 01349 DW 0,0 0000 27C8 0000 01350 ALVTCB DW 0 27CA 214F00 01351 LD HL,79 ;Get character at 0,79 27CD E5 01352 PUSH HL 27CE 0601 01353 LD B,1 ;Set function 1 27D0 CD990B 01354 CALL @VDCTL ;P/u character currently 27D3 FEA3 01355 CP 0A3H ; on the screen and 27D5 3E93 01356 LD A,93H ; exchange it 27D7 2802 01357 JR Z,ALIVE1 27D9 3EA3 01358 LD A,0A3H 27DB E1 01359 ALIVE1 POP HL 27DC 0602 01360 LD B,2 ;Function to put char 27DE 4F 01361 LD C,A 27DF CD990B 01362 CALL @VDCTL ; at row,col 27E2 C9 01363 RET 01364 ENDIF 27E3 01365 ALVEND EQU $ 01366 ; 01367 ; Routine to process SYSRES 01368 ; 27E3 01FFFF 01369 SYSRES LD BC,-1 ;P/u Sysres parm value 27E6 04 01370 INC B ;Test if parm entered 27E7 CA2429 01371 JP Z,RESEND ;Go if not 27EA CD0C2C 01372 CALL GOTMEM? ;Is high memory available 27ED DADD2A 01373 JP C,NOMEM ;Quit if not 27F0 79 01374 LD A,C ;Get module to reside 27F1 B7 01375 OR A 27F2 2837 01376 JR Z,BADSYS ;Cannot sysres 0 27F4 FE02 01377 CP 2 ;Check if it is SYS2 27F6 2005 01378 JR NZ,TEST6 ;Go if not 27F8 217404 01379 LD HL,DCT$+4 ;Point to SYSTEM DCT 27FB CBBE 01380 RES 7,(HL) ; & allow CKDRV now 27FD FE06 01381 TEST6 CP 6 27FF 3808 01382 JR C,GUDSYS ;Can sysres 1-5 2801 FE09 01383 CP 9 2803 3826 01384 JR C,BADSYS ;Cannot sysres 6-8 2805 FE0D 01385 CP 13 2807 3022 01386 JR NC,BADSYS ;Nothing > 12 yet 2809 F5 01387 GUDSYS PUSH AF ;Save sysres req 280A 216D1A 01388 LD HL,HKRES$+1 ;Check if the driver 280D 5E 01389 LD E,(HL) ; is already resident 280E 23 01390 INC HL 280F 56 01391 LD D,(HL) 2810 217F1A 01392 LD HL,CKMOD@ ;Standard address 2813 B7 01393 OR A ;Reset carry 2814 ED52 01394 SBC HL,DE ;No driver if = 2816 2871 01395 JR Z,PUTDVR ;Go and install driver 2818 21E0FF 01396 LD HL,-32 ;Find restab$ pos 281B 19 01397 ADD HL,DE ;Pt to vector table 281C 07 01398 RLCA ;Request x 2 281D 85 01399 ADD A,L 281E 6F 01400 LD L,A 281F 3001 01401 JR NC,$+3 2821 24 01402 INC H ;RESTAB$ + entry index 2822 23 01403 INC HL ;Pt to hi order 2823 7E 01404 LD A,(HL) ;P/u hi order 2824 B7 01405 OR A 2825 281B 01406 JR Z,MOVITIN ;Go if not there 2827 218924 01407 LD HL,MODRES$ ; else show already res'ed 282A DD 01408 DB 0DDH 282B 216B24 01409 BADSYS LD HL,BADSYS$ 282E CDE42A 01410 CALL SETERR ;Log & Set error 2831 F1 01411 POP AF 2832 C32429 01412 JP GETSEC2 2835 18FE 01413 RES1 JR $ ;No real entry 2837 0000 01414 DW $-$ ;Last used 2839 04 01415 DB 4,'SYS ' 53 59 53 20 283E 0000 01416 DW 0,0 0000 2841 01417 RES1E EQU $-1 2842 326900 01418 MOVITIN LD (OVRLY$),A ;Show no overlay res 2845 F1 01419 POP AF ;Rcvr requested SYS 2846 F5 01420 PUSH AF 2847 C602 01421 ADD A,2 ;Adjust for dec 2849 F680 01422 OR 80H ;Set Sys request 284B E5 01423 PUSH HL ;Save restab$ addr 284C CD7F1A 01424 CALL CKMOD@ ;Load SYSn, no exec 284F CD042C 01425 CALL GETHI$ ;P/u HIGH$ 2852 223728 01426 LD (RES1+2),HL ;Save in header 2855 EB 01427 EX DE,HL 2856 ED4BFE23 01428 LD BC,(MAXCOR$-2) ;P/u length of SYSx 285A 21001E 01429 LD HL,1E00H ;Pt to start of overlay 285D 09 01430 ADD HL,BC 285E 2B 01431 DEC HL ;Point to last byte 285F C5 01432 PUSH BC ;Save length 2860 EDB8 01433 LDDR 2862 C1 01434 POP BC ;Rcvr length of SYSx 2863 78 01435 LD A,B ; & stuff in front 2864 12 01436 LD (DE),A ; of SYSRESed module 2865 1B 01437 DEC DE 2866 79 01438 LD A,C 2867 12 01439 LD (DE),A 2868 E1 01440 POP HL ;Rcvr RESTAB ptr 2869 72 01441 LD (HL),D ;Save hi order addr 286A 2B 01442 DEC HL 286B 73 01443 LD (HL),E ;Save low order addr 286C F1 01444 POP AF ;Rcvr module requested 286D FE0A 01445 CP 10 ;Convert to ASCII 286F 3802 01446 JR C,$+4 2871 C607 01447 ADD A,7 2873 C630 01448 ADD A,'0' 2875 213D28 01449 LD HL,RES1+8 2878 77 01450 LD (HL),A ;Stuff module name 2879 1B 01451 DEC DE ;Pt to 1st free byte 01452 ; & move in the 287A 010D00 01453 LD BC,13 ; linkage protocol 287D 214128 01454 LD HL,RES1E 2880 EDB8 01455 LDDR 2882 EB 01456 EX DE,HL 2883 01457 @@HIGH$ ;Stuff new HIGH$ (B=0) 2883+3E64 01458 LD A,100 2885+EF 01459 RST 40 2886 C32429 01460 JP RESEND 01461 ; 2889 CD042C 01462 PUTDVR CALL GETHI$ ;P/u high mem 288C 22B828 01463 LD (RESBGN+2),HL ;Stuff last used 288F 016E00 01464 LD BC,RESEND-RESBGN 2892 ED42 01465 SBC HL,BC ;Make space for driver 2894 0600 01466 LD B,0 2896 01467 @@HIGH$ ;Stuff new value 2896+3E64 01468 LD A,100 2898+EF 01469 RST 40 2899 E5 01470 PUSH HL ;Save new HIGH$ 289A 110D00 01471 LD DE,13 ;Pt to RESTAB$-3 289D 19 01472 ADD HL,DE 289E 22F128 01473 LD (RESD1+1),HL ;Stuff ptr to RESTAB$-3 28A1 E1 01474 POP HL 28A2 23 01475 INC HL ;Resbgn 28A3 E5 01476 PUSH HL 28A4 EB 01477 EX DE,HL ;Where it goes to DE 28A5 21B628 01478 LD HL,RESBGN ;Where it's now 28A8 EDB0 01479 LDIR ;Move up to high 28AA E1 01480 POP HL ;Rcvr where it got to 28AB 112F00 01481 LD DE,32+RESTAB$-RESBGN ;Index start of dvr 28AE 19 01482 ADD HL,DE ;Pt to driver entry 28AF 226D1A 01483 LD (HKRES$+1),HL ;Hook into SYS0 28B2 F1 01484 POP AF ;Rcvr code & loop 28B3 C30928 01485 JP GUDSYS ; to get the request 01486 ; 28B6 18FE 01487 RESBGN JR $ ;No real entry 28B8 0000 01488 DW $-$ 28BA 06 01489 DB 6,'SYSRES' 53 59 53 52 45 53 28C1 0000 01490 DW 0,0 0000 28C5 0100 01491 RESTAB$ DW 1,0,0,0,0,0,1,1 0000 0000 0000 0000 0000 0100 0100 28D5 0000 01492 DW 0,0,0,0,0,0,0,0 0000 0000 0000 0000 0000 0000 0000 01493 ; 28E5 E5 01494 RESDVR PUSH HL 28E6 F5 01495 PUSH AF ;Save SYS needed 28E7 216900 01496 LD HL,OVRLY$ ;Check if already in 28EA AE 01497 XOR (HL) ; overlay area 28EB E60F 01498 AND 0FH ;Strip garbage 28ED 2830 01499 JR Z,NOTRES 28EF F1 01500 POP AF 28F0 21C628 01501 RESD1 LD HL,RESTAB$+1 ;P/u table ptr 28F3 F5 01502 PUSH AF 28F4 E60F 01503 AND 0FH ;Check if in high mem 28F6 07 01504 RLCA ;X 2 28F7 85 01505 ADD A,L 28F8 6F 01506 LD L,A 28F9 3001 01507 JR NC,$+3 28FB 24 01508 INC H 28FC 7E 01509 LD A,(HL) ;P/u hi order 28FD B7 01510 OR A 28FE 281F 01511 JR Z,NOTRES ;Go if not in high 2900 2B 01512 DEC HL ;Pt to low 2901 6E 01513 LD L,(HL) ;P/u lo order vector 2902 67 01514 LD H,A ;Xfer hi order 2903 D5 01515 PUSH DE ;Save these regs 2904 C5 01516 PUSH BC 2905 4E 01517 LD C,(HL) ;P/u module length 2906 23 01518 INC HL ; into BC 2907 46 01519 LD B,(HL) 2908 23 01520 INC HL ;Point to module start 2909 11001E 01521 LD DE,1E00H ;Point to overlay region 290C ED53751A 01522 LD (HKRES$+9),DE ;Upd TRAADR 2910 C5 01523 PUSH BC ;Save the length 2911 EDB0 01524 LDIR 2913 E1 01525 POP HL ;Rcvr the length 2914 22FE23 01526 LD (MAXCOR$-2),HL ;Stuff pointer 2917 C1 01527 POP BC ;Restore regs 2918 D1 01528 POP DE 2919 F1 01529 POP AF 291A 32701A 01530 LD (HKRES$+4),A ;Show its resident 291D E1 01531 POP HL ; in tempy loc'n 291E C9 01532 RET 291F F1 01533 NOTRES POP AF 2920 E1 01534 POP HL 2921 C37F1A 01535 JP CKMOD@ 2924 01536 RESEND EQU $ 01537 ; 01538 ; Routine to process DRIVE parameter 01539 ; 2924 3A6429 01540 GETSEC2 LD A,(CYLPRM+1) ;If CYL=c entered, 2927 B7 01541 OR A ; get config sector 2928 C4F52B 01542 CALL NZ,GETCFG 292B 01FFFF 01543 DRIVE LD BC,-1 292E DD21701D 01544 LD IX,SBUFF$+70H ;Pt to DCT sector fields 2932 FD217004 01545 LD IY,DCT$ ;Init to do all DCT$'s * 2936 04 01546 INC B 2937 280B 01547 JR Z,CKEI ;Go if Drive not entered 2939 79 01548 LD A,C 293A FE08 01549 CP 8 ;Drive in range? 293C D2E12A 01550 JP NC,PRMERR ;Go if > 7 293F 01551 @@GTDCT ;Get its DCT 293F+3E51 01552 LD A,81 2941+EF 01553 RST 40 2942 FDE5 01554 PUSH IY ;Save the DCT address 2944 01555 CKEI EQU $ 01556 ; 2944 FDE5 01557 ADJEI PUSH IY ;Calc IY offset into 2946 E1 01558 POP HL ; DCTs to adjust IX 2947 1190FB 01559 LD DE,-DCT$ ; without affecting IY 294A 19 01560 ADD HL,DE 294B EB 01561 EX DE,HL 294C DD19 01562 ADD IX,DE 294E 01563 DRVLOOP EQU $ 01564 ; 01565 ; Routine to process WP parameter 01566 ; 294E 010100 01567 WPARM LD BC,1 ;P/u WP parm value 2951 78 01568 LD A,B 2952 B1 01569 OR C 2953 3D 01570 DEC A ;Check if entered 2954 280D 01571 JR Z,WPEND ; and go if not 2956 3C 01572 INC A 2957 2806 01573 JR Z,WPOFF ;Go if OFF 2959 FDCB03FE 01574 WPON SET 7,(IY+3) ;Turn on write protect 295D 1804 01575 JR WPEND 295F FDCB03BE 01576 WPOFF RES 7,(IY+3) ;Turn off write protect 2963 01577 WPEND EQU $ 01578 ; 01579 ; Routine to process CYL parameter 01580 ; 2963 010000 01581 CYLPRM LD BC,0 ;P/u Cyl parm value 2966 78 01582 LD A,B 2967 B1 01583 OR C 2968 282B 01584 JR Z,CYLEND ;Go if parm not entered 296A DDCB036E 01585 BIT 5,(IX+3) ;If drive is 8", 296E 280C 01586 JR Z,CYL1 ; can't do it 2970 3A2C29 01587 LD A,(DRIVE+1) ;If drive entered, 2973 B7 01588 OR A ; give error msg 2974 212D24 01589 LD HL,NOCYL8$ ;'Can't CYL on 8" drive ' 2977 C4E42A 01590 CALL NZ,SETERR ;Msg if DRIVE=d 297A 1819 01591 JR DISABL 297C 79 01592 CYL1 LD A,C ;P/u user entry 297D 3D 01593 DEC A 297E FE22 01594 CP 34 ;Not < 35 allowed 2980 3804 01595 JR C,BADCYL ;Go if bad 2982 FE60 01596 CP 96 ;Max for 5-1/4" floppy 2984 380C 01597 JR C,GUDCYL ;Good if < 96 2986 214724 01598 BADCYL LD HL,BADCYL$ ;"Cyl out of range 2989 CDE42A 01599 CALL SETERR ;Dsply and quit 298C AF 01600 XOR A 298D 326429 01601 LD (CYLPRM+1),A 2990 1803 01602 JR DISABL 2992 DD7706 01603 GUDCYL LD (IX+6),A ;Stuff default DCT 2995 01604 CYLEND EQU $ 01605 ; 01606 ; Routine to process DISABL parameter 01607 ; 2995 010000 01608 DISABL LD BC,0 ;P/u parm value 2998 78 01609 LD A,B 2999 B1 01610 OR C 299A 280A 01611 JR Z,ENABLE ;Go if not DISABLE 299C 3A2C29 01612 LD A,(DRIVE+1) ;Don't permit disable 299F 3C 01613 INC A ; if DRIVE parm not 29A0 2810 01614 JR Z,STEP ; entered 29A2 3EC9 01615 LD A,0C9H ;Init disable byte 29A4 1809 01616 JR ENADIS 29A6 010000 01617 ENABLE LD BC,0 ;P/u parm value 29A9 78 01618 LD A,B 29AA B1 01619 OR C 29AB 2805 01620 JR Z,STEP ;Go if not ENABLE 29AD 3EC3 01621 LD A,0C3H ;Init enable byte 29AF FD7700 01622 ENADIS LD (IY),A ;Stuff Ena or Dis byte 01623 ; 01624 ; Routine to process STEP parameter 01625 ; 29B2 01FFFF 01626 STEP LD BC,-1 ;P/u Step parm value 29B5 04 01627 INC B 29B6 2815 01628 JR Z,STEPEND ;Go if STEP not entered 29B8 79 01629 LD A,C 29B9 FE04 01630 CP 4 ;Step must be < 4 29BB D2E12A 01631 JP NC,PRMERR ;Quit if out of range 29BE FDCB0466 01632 BIT 4,(IY+4) ;Alien controller? 29C2 2039 01633 JR NZ,WDESD ;Bypass if alien 29C4 FD7E03 01634 LD A,(IY+3) ;P/u DCT byte and 29C7 E6FC 01635 AND 0FCH ; mask out old step 29C9 B1 01636 OR C ;Or in the new value 29CA FD7703 01637 LD (IY+3),A ; and put back in DCT 29CD 01638 STEPEND EQU $ 01639 ; 01640 ; Routine to process DELAY parameter 01641 ; 29CD 010100 01642 DELAY LD BC,1 ;P/u the parm value 29D0 78 01643 LD A,B 29D1 B1 01644 OR C 29D2 3D 01645 DEC A ;Check if entered 29D3 2810 01646 JR Z,CKDRV ;Go if no delay entered 29D5 3C 01647 INC A ;Check if OFF 29D6 0600 01648 LD B,0 ;Init delay=on 29D8 2002 01649 JR NZ,DELAY1 ;Go if ON 29DA 0604 01650 LD B,4 ;Init delay=off 29DC FD7E03 01651 DELAY1 LD A,(IY+3) ;Update delay 29DF E6FB 01652 AND 0FBH ; in DCT 29E1 B0 01653 OR B 29E2 FD7703 01654 LD (IY+3),A 01655 ; 01656 ; Routine to process CKDRV parameter 01657 ; 29E5 010100 01658 CKDRV LD BC,1 ;P/u Ckdrv parm value 29E8 78 01659 LD A,B 29E9 B1 01660 OR C 29EA 3D 01661 DEC A ;Check if entered 29EB 2810 01662 JR Z,WDESD ;Go if not entered 29ED 3C 01663 INC A ;See if OFF or ON 29EE 0600 01664 LD B,0 ;Init ckdrv=on 29F0 2002 01665 JR NZ,CKDRV1 ;Go if ON 29F2 0680 01666 LD B,80H ;Set bit 7, ckdrv off 29F4 FD7E04 01667 CKDRV1 LD A,(IY+4) ;Update ckdrv bit 29F7 E67F 01668 AND 7FH ; by removing old state, 29F9 B0 01669 OR B ; merging 0 or 80H 29FA FD7704 01670 LD (IY+4),A ; and putting back in DCT 29FD 3A2C29 01671 WDESD LD A,(DRIVE+1) ;Drive parm used prev ? 2A00 3C 01672 INC A 2A01 2014 01673 JR NZ,PUTSEC2 ;Go if DRIVE entered 2A03 110A00 01674 LD DE,10 ; else loop thru all DCTs 2A06 DD19 01675 ADD IX,DE ;Advance to next DCT 2A08 FD19 01676 ADD IY,DE 2A0A FDE5 01677 PUSH IY 2A0C E1 01678 POP HL ;Xfer DCT start to HL 2A0D 7D 01679 LD A,L ;Ck on end of DCTs 2A0E FEC0 01680 CP 80+70H ;Offset is 70H 2A10 DA4E29 01681 JP C,DRVLOOP ;Loop until done 2A13 210000 01682 LD HL,0 ;Show no DCT given 2A16 E5 01683 PUSH HL 2A17 3A6429 01684 PUTSEC2 LD A,(CYLPRM+1) ;If CYL=c entered 2A1A B7 01685 OR A ; put config sector 2A1B C4F22B 01686 CALL NZ,PUTCFG 01687 ; 01688 ; Routine to process DRIVER parameter 01689 ; 2A1E 110000 01690 DVRPARM LD DE,0 ;P/u parm value 2A21 7A 01691 LD A,D 2A22 B3 01692 OR E 2A23 CAF42A 01693 JP Z,DVR4 ;Go if DRIVER not entered 2A26 3C 01694 INC A ;Full name given? 2A27 2823 01695 JR Z,GETN3 ;Go if not & prompt 2A29 21FB2C 01696 LD HL,FCB1+1 ; else pick it up 2A2C E5 01697 PUSH HL ;Save ptr to start 2A2D 1A 01698 GETN1 LD A,(DE) ;P/u name char 2A2E FE0D 01699 CP CR 2A30 2815 01700 JR Z,GETN2 ;Exit on eol 2A32 FE2C 01701 CP ',' 2A34 2811 01702 JR Z,GETN2 ;Exit on end of parm 2A36 FE22 01703 CP '"' 2A38 280D 01704 JR Z,GETN2 ;Exit on closing quote 2A3A FE29 01705 CP ')' 2A3C 2809 01706 JR Z,GETN2 ;Exit on end of parms 2A3E FE03 01707 CP 3 2A40 2805 01708 JR Z,GETN2 ;Exit on JCL line end 2A42 77 01709 LD (HL),A ; else xfer the char 2A43 13 01710 INC DE 2A44 23 01711 INC HL 2A45 18E6 01712 JR GETN1 ;Loop 2A47 360D 01713 GETN2 LD (HL),CR ;End with CR 2A49 E1 01714 POP HL ;Recover name ptr 2A4A 1845 01715 JR DVR2 2A4C 01716 GETN3 @@DSPLY EIPMPT ;"Enter dct dvr name 01717 IFEQ 01H,1 2A4C+21A824 01718 LD HL,EIPMPT 01719 ENDIF 2A4F+3E0A 01720 LD A,10 2A51+EF 01721 RST 40 2A52 21FB2C 01722 LD HL,FCB1+1 ;Pt to buffer 2A55 010018 01723 LD BC,24<8 ;24 char max 2A58 01724 @@KEYIN ;Get filespec 2A58+3E09 01725 LD A,9 2A5A+EF 01726 RST 40 2A5B 3034 01727 JR NC,DVR2 ;Go if not BREAK 01728 ; 01729 ; BREAK entered on DRIVER request 01730 ; Reset all drive code table positions 01731 ; if DRIVE not entered 01732 ; 2A5D CDF52B 01733 CALL GETCFG ;Get SIS 2A60 210019 01734 LD HL,SBUFF$+70H-DCT$ ;Pt to tables "offset" 2A63 3A2C29 01735 DDCT1 LD A,(DRIVE+1) ;Was Drive entered? 2A66 3C 01736 INC A 2A67 D1 01737 POP DE ;Rcvr drive # 2A68 2003 01738 JR NZ,DDCT2 2A6A 117004 01739 LD DE,DCT$ ;Else use all 8 2A6D 19 01740 DDCT2 ADD HL,DE ;Index the specific DCT 2A6E 7B 01741 DVRA LD A,E 2A6F FE98 01742 CP 40+70H 2A71 3EC9 01743 LD A,0C9H ;Disable drives 4-7 2A73 3002 01744 JR NC,DVRB 2A75 3EC3 01745 LD A,0C3H 2A77 77 01746 DVRB LD (HL),A ;Stuff vector (JP/RET) 2A78 2C 01747 INC L ;Pt to default DCT+3 2A79 2C 01748 INC L 2A7A 2C 01749 INC L 2A7B 1C 01750 INC E ;Pt to resident DCT+3 2A7C 1C 01751 INC E 2A7D 1C 01752 INC E 2A7E 010700 01753 LD BC,7 ;Shift defaults to 2A81 EDB0 01754 LDIR ; resident DCT 2A83 3A2C29 01755 DVRC LD A,(DRIVE+1) ;Test if drive entered 2A86 3C 01756 INC A 01757 IF @BLD631 2A87 2005 01758 JR NZ,SYSPRM$ ;<631> 01759 ELSE 01760 JR NZ,SYSPRM ;Go if yes 01761 ENDIF 2A89 7B 01762 LD A,E ;Ck on end of DCTs 2A8A FEC0 01763 CP 80+70H 2A8C 30E0 01764 JR NC,DVRA ;Loop until all 8 01765 IF @BLD631 2A8E C3F52A 01766 SYSPRM$:JP SYSPRM ;<631> 01767 ELSE 01768 JR SYSPRM 01769 ENDIF 2A91 7E 01770 DVR2 LD A,(HL) ;Is first char ? 2A92 FE0D 01771 CP CR 2A94 285E 01772 JR Z,DVR4 ;Bypass if default 2A96 CD0C2C 01773 CALL GOTMEM? 2A99 D1 01774 POP DE ;Pop to keep stack 2A9A DADD2A 01775 JP C,NOMEM ; straight if error 2A9D D5 01776 PUSH DE 2A9E 11FA2C 01777 LD DE,FCB1 ;Else fetch spec 2AA1 01778 @@FSPEC 2AA1+3E4E 01779 LD A,78 2AA3+EF 01780 RST 40 2AA4 21E924 01781 LD HL,DCTEXT ;Use /DCT as the 2AA7 01782 @@FEXT ; default extension 2AA7+3E4F 01783 LD A,79 2AA9+EF 01784 RST 40 2AAA 01785 @@FLAGS 2AAA+3E65 01786 LD A,101 2AAC+EF 01787 RST 40 2AAD FDCB12D6 01788 SET 2,(IY+'S'-'A') ;Set RUN bit 2AB1 01789 @@LOAD ;Load the prog 2AB1+3E4C 01790 LD A,76 2AB3+EF 01791 RST 40 2AB4 D1 01792 POP DE ;Recover drive table 2AB5 C2E92A 01793 JP NZ,IOERR ;Quit on load error 2AB8 D5 01794 PUSH DE 2AB9 E5 01795 PUSH HL ;Save prog's traadr 2ABA 21F42A 01796 LD HL,DVR4 ;Pt to our return 2ABD E3 01797 EX (SP),HL ;Exch with his 2ABE FDCB02DE 01798 SET 3,(IY+'C'-'A') ;Set system request 2AC2 E9 01799 JP (HL) ;Go to prog 01800 IF @BLD631 2AC3 21FFFF 01801 ABORT: LD HL,0FFFFH ;<631> 01802 ; 2AC6 310000 01803 LSAVESP LD SP,$-$ ;<631>P/u original stack 2AC9 01804 @@CKBRKC ;<631>Clear any 2AC9+3E6A 01805 LD A,106 2ACB+EF 01806 RST 40 2ACC C9 01807 RET ;<631>Ret to DOS 01808 ; 01809 ; Internal Error Message Handling 01810 ; 2ACD 21C42C 01811 MANABT: LD HL,MANABT$ ;<631> 2AD0 DD 01812 DB 0DDH ;<631> 2AD1 21112C 01813 JCLON: LD HL,JCLON$ ;<631> 2AD4 DD 01814 DB 0DDH ;<631> 2AD5 21A32C 01815 SPCERR: LD HL,SPCERR$ ;<631> 2AD8 DD 01816 DB 0DDH ;<631> 2AD9 217A2C 01817 SAMDRV: LD HL,SAMDRV$ ;<631> 2ADC DD 01818 DB 0DDH ;<631> 2ADD 210324 01819 NOMEM LD HL,NOMEM$ ;<631>"No memory available 2AE0 DD 01820 DB 0DDH ;<631> 2AE1 211D24 01821 PRMERR: LD HL,PRMERR$ ;<631> 2AE4 01822 SETERR @@LOGOT ;<631> 01823 IFEQ 00H,1 01824 LD HL, 01825 ENDIF 2AE4+3E0C 01826 LD A,12 2AE6+EF 01827 RST 40 2AE7 18DA 01828 JR ABORT ;<631>Exit 01829 ; 01830 ; I/O Error Handler 01831 ; 2AE9 6F 01832 IOERR LD L,A ;<631>Error # to HL 2AEA 2600 01833 LD H,0 ;<631> 2AEC F6C0 01834 OR 0C0H ;<631>Set brief to return 2AEE 4F 01835 LD C,A ;<631> 2AEF 01836 @@ERROR ;<631>Display the error 2AEF+3E1A 01837 LD A,26 2AF1+EF 01838 RST 40 2AF2 18D2 01839 JR LSAVESP ;<631>Exit 01840 ENDIF 2AF4 D1 01841 DVR4 POP DE ;Rcvr drive table 01842 ; 01843 ; System = new system drive 01844 ; 2AF5 01FFFF 01845 SYSPRM LD BC,-1 ;P/u parm value 2AF8 78 01846 LD A,B 01847 IF @BLD631 2AF9 A1 01848 AND C ;<631> 2AFA 3C 01849 INC A ;<631> 2AFB 280A 01850 JR Z,SWAP ;<631> 2AFD ED43082B 01851 LD (SWAP$),BC ;<631> 2B01 210000 01852 LD HL,0 ;<631> 2B04 222C29 01853 LD (DRIVE+1),HL ;<631> 2B08 01854 SWAP$: EQU $+1 2B07 01FFFF 01855 SWAP: LD BC,0FFFFH ;<631> 2B0A 78 01856 LD A,B ;<631> 2B0B A1 01857 AND C ;<631> 2B0C 3C 01858 INC A ;<631> 2B0D 286E 01859 JR Z,L2B7D ;<631> 2B0F 79 01860 LD A,C ;<631> 2B10 FE08 01861 CP 8 ;<631> 2B12 D2D52A 01862 JP NC,SPCERR ;<631> 2B15 32482B 01863 LD (L2B48),A ;<631> 2B18 21582B 01864 LD HL,L2B58 ;<631> 2B1B B7 01865 OR A ;<631> 2B1C 2804 01866 JR Z,L2B22 ;<631> 2B1E 77 01867 LD (HL),A ;<631> 2B1F 21482B 01868 LD HL,L2B48 ;<631> 2B22 C630 01869 L2B22: ADD A,30H ;<631> 2B24 32652C 01870 LD (SRCDRV$),A ;<631> 2B27 3A2C29 01871 LD A,(DRIVE+1) ;<631> 2B2A FE08 01872 CP 8 ;<631> 2B2C D2D52A 01873 JP NC,SPCERR ;<631> 2B2F 77 01874 LD (HL),A ;<631> 2B30 C630 01875 ADD A,'0' ;<631> 2B32 326C2C 01876 LD (DSTDRV$),A ;<631> 2B35 7E 01877 LD A,(HL) ;<631> 2B36 A9 01878 XOR C ;<631> 2B37 CAD92A 01879 JP Z,SAMDRV ;<631> 2B3A 3A482B 01880 L2B3A: LD A,(L2B48) ;<631> 2B3D B7 01881 OR A ;<631> 2B3E 3A582B 01882 LD A,(L2B58) ;<631> 2B41 CCA32B 01883 CALL Z,L2BA3 ;<631> 2B44 CD812B 01884 CALL L2B81 ;<631> 2B48 01885 L2B48: EQU $+1 ;<631> 2B47 0E00 01886 LD C,0 ;<631> 2B49 01887 @@GTDCT ;<631> 2B49+3E51 01888 LD A,81 2B4B+EF 01889 RST 40 2B4C FDCB047E 01890 BIT 7,(IY+4) ;<631> 2B50 FDCB04BE 01891 RES 7,(IY+4) ;<631> 2B54 F5 01892 PUSH AF ;<631> 2B55 FDE5 01893 PUSH IY ;<631> 2B58 01894 L2B58: EQU $+1 ;<631> 2B57 0E00 01895 LD C,0 ;<631> 2B59 01896 @@GTDCT ;<631> 2B59+3E51 01897 LD A,81 2B5B+EF 01898 RST 40 2B5C E1 01899 POP HL ;<631> 2B5D F1 01900 POP AF ;<631> 2B5E FDCB04BE 01901 RES 7,(IY+4) ;<631> 2B62 2804 01902 JR Z,L2B68 ;<631> 2B64 FDCB04FE 01903 SET 7,(IY+4) ;<631> 2B68 FDE5 01904 L2B68: PUSH IY ;<631> 2B6A D1 01905 POP DE ;<631> 2B6C 01906 L2B6C: EQU $+1 ;<631> 2B6B 010A00 01907 LD BC,000AH ;<631> 2B6E 1A 01908 L2B6E: LD A,(DE) ;<631> 2B6F EDA0 01909 LDI ;<631> 2B71 2B 01910 DEC HL ;<631> 2B72 77 01911 LD (HL),A ;<631> 2B73 23 01912 INC HL ;<631> 2B74 EA6E2B 01913 JP PE,L2B6E ;<631> 2B77 215D2C 01914 LD HL,ARESWP$ ;<631> 2B7A 01915 @@DSPLY ;<631> 01916 IFEQ 00H,1 01917 LD HL, 01918 ENDIF 2B7A+3E0A 01919 LD A,10 2B7C+EF 01920 RST 40 2B7D 210000 01921 L2B7D: LD HL,0 ;<631> 2B80 C9 01922 RET ;<631> 2B81 217C00 01923 L2B81: LD HL,SFLAG$ ;<631> 2B84 CB6E 01924 BIT 5,(HL) ;<631> 2B86 C8 01925 RET Z ;<631> 2B87 21C600 01926 LD HL,JFCB$+6 ;<631> 2B8A 3A482B 01927 LD A,(L2B48) ;<631> 2B8D 47 01928 LD B,A ;<631> 2B8E AE 01929 XOR (HL) ;<631> 2B8F E607 01930 AND 07H ;<731> 2B91 3A582B 01931 LD A,(L2B58) ;<631> 2B94 2007 01932 JR NZ,L2B9D ;<631> 2B96 47 01933 LD B,A ;<631> 2B97 7E 01934 L2B97: LD A,(HL) ;<631> 2B98 E6F8 01935 AND 0F8H ;<631> 2B9A B0 01936 OR B ;<631> 2B9B 77 01937 LD (HL),A ;<631> 2B9C C9 01938 RET ;<631> 2B9D AE 01939 L2B9D: XOR (HL) ;<631> 2B9E E607 01940 AND 07H ;<631> 2BA0 28F5 01941 JR Z,L2B97 ;<631> 2BA2 C9 01942 RET ;<631> 2BA3 32AC2B 01943 L2BA3: LD (L2BAC),A ;<631> 2BA6 C630 01944 ADD A,'0' ;<631> 2BA8 325A2C 01945 LD (NDRIVE$),A ;<631> 01946 ELSE 01947 JP PATCH1 ;Set HL=0, no abort if exit 01948 ; 01949 CONT1 DEC A 01950 CP 8 ;Drive in range? 01951 JP NC,PRMERR ;Go if > 7 01952 ENDIF 01953 IF @BLD631 2BAC 01954 L2BAC: EQU $+1 2BAB 0E00 01955 L2BAB: LD C,0 ;<631> 01956 ENDIF 01957 ; 01958 ; Check on diskette in place 01959 ; 2BAD 01960 @@CKDRV 2BAD+3E21 01961 LD A,33 2BAF+EF 01962 RST 40 2BB0 2024 01963 JR NZ,SYSP2 ;Prompt if no diskette 2BB2 01964 @@GTDCT ;Get its DCT 2BB2+3E51 01965 LD A,81 2BB4+EF 01966 RST 40 01967 ; 01968 ; Perform minimal check for SYSTEM disk 01969 ; 2BB5 FD5609 01970 SYSP1 LD D,(IY+9) ;P/u the dir cyl 2BB8 21001D 01971 LD HL,SBUFF$ 2BBB 5D 01972 LD E,L ;Init for GAT read 2BBC 01973 @@RDSSC ;Read the sector 2BBC+3E55 01974 LD A,85 2BBE+EF 01975 RST 40 2BBF C2E92A 01976 JP NZ,IOERR ;Quit on read error 2BC2 2ECD 01977 LD L,0CDH ;Check the SYSTEM bit 2BC4 CB7E 01978 BIT 7,(HL) 2BC6 200E 01979 JR NZ,SYSP2 ;Not system? Go prompt 2BC8 21001D 01980 LD HL,SBUFF$ ;Point to buffer 2BCB 1E05 01981 LD E,5 ;Point to dir sec #5 2BCD 01982 @@RDSSC ;Read the sector 2BCD+3E55 01983 LD A,85 2BCF+EF 01984 RST 40 2BD0 7E 01985 LD A,(HL) ;P/u the byte 2BD1 E650 01986 AND 01010000B ;Check for a system file 2BD3 FE50 01987 CP 01010000B ; and not killed 01988 ; in this slot, (SYS1) 01989 IF @BLD631 2BD5 C8 01990 RET Z ;<631> 2BD6 217C00 01991 SYSP2: LD HL,SFLAG$ ;<631> 2BD9 CB6E 01992 BIT 5,(HL) ;<631> 2BDB C2D12A 01993 JP NZ,JCLON ;<631> 2BDE 213A2C 01994 LD HL,NDSYS$ ;<631> 2BE1 01995 @@DSPLY ;<631> 01996 IFEQ 00H,1 01997 LD HL, 01998 ENDIF 2BE1+3E0A 01999 LD A,10 2BE3+EF 02000 RST 40 2BE4 21FA2C 02001 LD HL,FCB1 ;<631> 2BE7 010000 02002 LD BC,0 ;<631> 2BEA 02003 @@KEYIN ;<631> 2BEA+3E09 02004 LD A,9 2BEC+EF 02005 RST 40 2BED 30BC 02006 JR NC,L2BAB ;<631> 2BEF C3CD2A 02007 JP MANABT ;<631> 02008 ELSE 02009 JR Z,SYSP3 ;Alive and a SYS file 02010 ; 02011 ; Diskette is not a SYSTEM diskette 02012 ; 02013 SYSP2 LD A,C ;Stuff drive # in msg 02014 ADD A,'0' ;Cvrt drive to ASCII 02015 LD (NDRIVE$),A 02016 @@DSPLY NDSYS$ ;"Need system diskette.. 02017 LD HL,FCB1 ;Create response buffer 02018 LD BC,0<8 ;Only BREAK or ENTER 02019 @@KEYIN ;Wait for entry 02020 RET C ;Exit on 02021 JR SYSPRM ;Continue to check 02022 ; 02023 SYSP3 LD HL,DCT$+4 02024 BIT 7,(HL) ;Check Ckdrv bit in DCT 02025 RES 7,(HL) ;Enable it for now 02026 LD HL,DCT$ 02027 LD DE,FCB1 ;Use FCB space 02028 PUSH DE ;Save where temp 02029 PUSH HL ;Save where new SYSTEM 02030 LD BC,10 ;Save current SYS's DCT 02031 LDIR 02032 RES 7,(IY+4) ;Make sure OFF 02033 JR Z,NOSET ;Only set if it was set 02034 ; on the SYSTEM drive 02035 SET 7,(IY+4) ;CKDRV inhibit drive 0 02036 NOSET PUSH IY ;New DCT to HL 02037 POP HL 02038 POP DE ;Rcvr SYS DCT now 02039 PUSH HL ;Save where it goes 02040 LD C,10 02041 LDIR ;New DCT into SYSTEM 02042 POP DE ;P/u where old SYS goes 02043 POP HL ;P/u temp address 02044 LD C,10 ;Move old SYS to new DCT 02045 LDIR 02046 LD HL,NWSYS$ ;"New sys drive installed 02047 JP SETERR ;Display and exit w/abort 02048 ; in case JCL active 02049 ENDIF 02050 ; 02051 ; Routines to read/write the config sector 02052 ; 2BF2 3E35 02053 PUTCFG LD A,53 ;@WRSEC 02054 ; 02055 IF @MOD4 2BF4 21 02056 DB 21H ;Ignore next with LD HL, 02057 ENDIF 02058 IF @MOD2 02059 JR PUTGETC ;Jump over if mod2 02060 ENDIF 02061 ; 2BF5 02062 GETCFG EQU $ 02063 IF @MOD4 2BF5 3E31 02064 LD A,49 ;@RDSEC 2BF7 110200 02065 LD DE,0<8+2 ;Config sector 02066 ENDIF 02067 ; 02068 IF @MOD2 02069 LD A,(DCT$+3) ;Drive 0 dct data 02070 AND 28H ;Bit 5/3 02071 CP 20H ;8" floppy? 02072 JR NZ,SETSYS1 ;Go if not 02073 LD A,(DCT$+4) ;Get data 02074 AND 50H ;Bit 6/4 02075 CP 40H ;DD not alien? 02076 JR NZ,SETSYS1 ;Go if not 02077 ; 02078 LD HL,SBUFF$ ;System buffer 02079 LD A,(DCT$+9) ;Get dir cylinder 02080 LD D,A ;Pass to D 02081 LD E,0 ;Init sector 0 02082 LD C,E ;Init drive 0 02083 @@RDSSC ;Read directory 02084 JR NZ,PUTGETE ;Go on disk error 02085 LD A,(SBUFF$+0CDH) ;Get gat data byte 02086 BIT 7,A ;Is data disk? 02087 SETSYS1 LD DE,0<8+2 ;Init sysinfo sector 02088 JR NZ,$+3 ;Go if data disk 02089 INC D ;Else new sysinfo 02090 LD A,49 ;Init RDSEC 02091 ENDIF 02092 ; 2BFA 21001D 02093 PUTGETC LD HL,SBUFF$ ;System buffer 02094 IF @BLD631 2BFD 4D 02095 LD C,L ;<631> 02096 ELSE 02097 LD C,0 ; in system drive 02098 ENDIF 2BFE EF 02099 RST 40 ;Read or Write 2BFF C8 02100 RET Z ;Back if good i/o 2C00 E1 02101 PUTGETE POP HL 2C01 C3E92A 02102 JP IOERR ; else abort 02103 ; 02104 ; Routine to get HIGH$ 02105 ; 2C04 0600 02106 GETHI$ LD B,0 ;Init to get HIGH$ 2C06 60 02107 LD H,B 2C07 68 02108 LD L,B 2C08 02109 @@HIGH$ ;Get current HIGH$ 2C08+3E64 02110 LD A,100 2C0A+EF 02111 RST 40 2C0B C9 02112 RET 02113 ; 02114 ; Routine to test if HIGH$ is frozen 02115 ; 2C0C 3A6C00 02116 GOTMEM? LD A,(CFLAG$) ;Check if memory can 2C0F 0F 02117 RRCA ; be altered 2C10 C9 02118 RET 02119 ; 02120 IF @BLD631 2C11 43 02121 JCLON$: DB 'Can''t prompt for SYSTEM disk during JCL!',CR ;<631> 61 6E 27 74 20 70 72 6F 6D 70 74 20 66 6F 72 20 53 59 53 54 45 4D 20 64 69 73 6B 20 64 75 72 69 6E 67 20 4A 43 4C 21 0D 2C3A 49 02122 NDSYS$: DB 'Insert SYSTEM diskette in drive ' ;<631> 6E 73 65 72 74 20 53 59 53 54 45 4D 20 64 69 73 6B 65 74 74 65 20 69 6E 20 64 72 69 76 65 20 2C5A 58 02123 NDRIVE$:DB 'X ',CR ;<631> 20 0D 2C5D 44 02124 ARESWP$:DB 'Drives :' ;<631> 72 69 76 65 73 20 3A 2C65 53 02125 SRCDRV$:DB 'S and :' ;<631> 20 61 6E 64 20 3A 2C6C 44 02126 DSTDRV$:DB 'D now swapped',CR ;<631> 20 6E 6F 77 20 73 77 61 70 70 65 64 0D 2C7A 53 02127 SAMDRV$:DB 'Source & Destination are the same drive!',CR ;<631> 6F 75 72 63 65 20 26 20 44 65 73 74 69 6E 61 74 69 6F 6E 20 61 72 65 20 74 68 65 20 73 61 6D 65 20 64 72 69 76 65 21 0D 2CA3 44 02128 SPCERR$:DB 'Drive specification error <0-7>!',CR ;<631> 72 69 76 65 20 73 70 65 63 69 66 69 63 61 74 69 6F 6E 20 65 72 72 6F 72 20 3C 30 2D 37 3E 21 0D 2CC4 4D 02129 MANABT$:DB 'Manual abort!',CR ;<631> 61 6E 75 61 6C 20 3C 42 52 45 41 4B 3E 20 61 62 6F 72 74 21 0D 02130 ELSE 02131 NOMEM$ DB 'No memory space available',CR 02132 PRMERR$ DB 'Parameter error',CR 02133 NOCYL8$ DB 'CYL=c invalid on 8" drive',CR 02134 BADCYL$ DB 'Cylinder count out of range <35-96>',CR 02135 BADSYS$ DB 'Can''t SYSRES requested module',CR 02136 MODRES$ DB 'System module already resident',CR 02137 EIPMPT DM 'Enter DCT driver : ',3 02138 NWSYS$ DB 'New SYSTEM drive installed',CR 02139 NDSYS$ DB 'Insert SYSTEM diskette in drive X ',CR 02140 BADBS$ DB 'Boot step out of range <0-3>',CR 02141 DCTEXT DM 'DCT' 02142 ; 02143 PRMTBL$ EQU $ 02144 DB 'ALIVE ' 02145 DW ALIVE+1 02146 DB 'BSTEP ' 02147 DW BSPARM+1 02148 DM 'DRIVER' 02149 DW DVRPARM+1 02150 DB 'FAST ' 02151 DW FPARM+1 02152 DB 'SLOW ' 02153 DW SLOW+1 02154 DB 'SYSRES' 02155 DW SYSRES+1 02156 DB 'SYSTEM' 02157 DW SYSPRM+1 02158 DB 'TYPE ' 02159 DW TYPE+1 02160 DB 'WP ' 02161 DW WPARM+1 02162 DB 'BLINK ' 02163 DW BLINK+1 02164 DB 'BREAK ' 02165 DW BREAK+1 02166 DB 'CYL ' 02167 DW CYLPRM+1 02168 DB 'DATE ' 02169 DW DATE+1 02170 DB 'DELAY ' 02171 DW DELAY+1 02172 DB 'CKDRV ' 02173 DW CKDRV+1 02174 DB 'DISABL' 02175 DW DISABL+1 02176 DB 'DRIVE ' 02177 DW DRIVE+1 02178 DB 'ENABLE' 02179 DW ENABLE+1 02180 DB 'GRAPHI' 02181 DW GRAPHI+1 02182 DB 'LARGE ' 02183 DW LARGE+1 02184 DB 'RESTOR' 02185 DW RPARM+1 02186 DB 'SMALL ' 02187 DW SMALPRM+1 02188 DB 'STEP ' 02189 DW STEP+1 02190 DB 'TIME ' 02191 DW TIME+1 02192 DB 'TRACE ' 02193 DW TRACE+1 02194 DB 'SMOOTH' 02195 DW SMOOTH+1 02196 DB 'HERTZ5' 02197 DW HERTZ50+1 02198 DB 'HERTZ6' 02199 DW HERTZ60+1 02200 NOP 02201 ENDIF 02202 ; 02203 IF @BLD631 2CDA 53 02204 DC 32,'S' ;<631>Patch space (Roys special edition?) 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 02205 ELSE 02206 PATCH1 LD HL,0 ;Set HL=0 "NO ERRORS" 02207 OR C 02208 INC A ;Parm entered? 02209 RET Z ;Exit if not 02210 JP CONT1 ;Continue on now 02211 ; 02212 DC 16,0 ;Patch space 02213 ENDIF 2CFA 00 02214 FCB1 DC 32,0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02215 ; 25E5 02216 END LSYSTEM 25E5 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]