[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]