mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1375 lines
74 KiB
1375 lines
74 KiB
1 .title ccpb03.s derived from ccpb03.asm
|
|
2 .sbttl by Douglas Goodall 5/16/2011 dwg
|
|
3
|
|
4 .module ccpb03
|
|
5 .optsdcc -mz80
|
|
6
|
|
7 ;--------------------------------------------------------
|
|
8 ; Public variables in this module
|
|
9 ;--------------------------------------------------------
|
|
10 .globl _ccp
|
|
11 ;--------------------------------------------------------
|
|
12 ; special function registers
|
|
13 ;--------------------------------------------------------
|
|
14 ;--------------------------------------------------------
|
|
15 ; ram data
|
|
16 ;--------------------------------------------------------
|
|
17 .area _DATA
|
|
18 ;--------------------------------------------------------
|
|
19 ; overlayable items in ram
|
|
20 ;--------------------------------------------------------
|
|
21 .area _OVERLAY
|
|
22 ;--------------------------------------------------------
|
|
23 ; external initialized ram data
|
|
24 ;--------------------------------------------------------
|
|
25 ;--------------------------------------------------------
|
|
26 ; global & static initialisations
|
|
27 ;--------------------------------------------------------
|
|
28 .area _HOME
|
|
29 .area _GSINIT
|
|
30 .area _GSFINAL
|
|
31 .area _GSINIT
|
|
32 ;--------------------------------------------------------
|
|
33 ; Home
|
|
34 ;--------------------------------------------------------
|
|
35 .area _HOME
|
|
36 .area _HOME
|
|
37 ;--------------------------------------------------------
|
|
38 ; code
|
|
39 ;--------------------------------------------------------
|
|
40
|
|
41 ; .area _CODE
|
|
42 .area _CCPB03
|
|
43
|
|
0000 44 _ccp_start::
|
|
0000 45 _ccp:
|
|
46
|
|
0001 47 MON = 1 ;ADD THE CCP MON COMMAND
|
|
0001 48 USRDSP = 1 ;SHOW THE USER NUMBER
|
|
0001 49 CHKU0B = 1 ;CHECK FOR TRANSIENTS ON USER 0 TOO
|
|
0001 50 ENDFIL = 1 ;FILE FULL CCP SIZE
|
|
51 ;
|
|
52 ;**************************************************************
|
|
53 ;*
|
|
54 ;* C C P - C O N S O L E C O M M A N D P R O C E S S O R
|
|
55 ;*
|
|
56 ;**************************************************************
|
|
57 ;*
|
|
0003 58 IOBYTE = 3 ; I/O DEFINITION BYTE.
|
|
0004 59 TDRIVE = 4 ; CURRENT DRIVE NAME AND USER NUMBER.
|
|
0005 60 ENTRY = 5 ; ENTRY POINT FOR THE CP/M BDOS.
|
|
005C 61 TFCB = 0x5C ; DEFAULT FILE CONTROL BLOCK.
|
|
0080 62 TBUFF = 0x80 ; I/O BUFFER AND COMMAND LINE STORAGE.
|
|
0100 63 TBASE = 0x0100 ; TRANSIANT PROGRAM STORAGE AREA.
|
|
FC00 64 MONADR = 0x0FC00 ;MONITOR PROGRAM
|
|
65 ;
|
|
66 ; SET CONTROL CHARACTER .EQUATES.
|
|
67 ;
|
|
0003 68 CNTRLC = 0x03 ; CONTROL-C
|
|
0005 69 CNTRLE = 0x05 ; CONTROL-E
|
|
0008 70 BS = 0x08 ; BACKSPACE
|
|
0009 71 TAB = 0x09 ; TAB
|
|
000A 72 LF = 0x0A ; LINE FEED
|
|
000C 73 FF = 0x0C ; FORM FEED
|
|
000D 74 CR = 0x0D ; CARRIAGE RETURN
|
|
0010 75 CNTRLP = 0x10 ; CONTROL-P
|
|
0012 76 CNTRLR = 0x12 ; CONTROL-R
|
|
0013 77 CNTRLS = 0x13 ; CONTROL-S
|
|
0015 78 CNTRLU = 0x15 ; CONTROL-U
|
|
0018 79 CNTRLX = 0x18 ; CONTROL-X
|
|
001A 80 CNTRLZ = 0x1A ; CONTROL-Z (END-OF-FILE MARK)
|
|
002A 81 ASTERICK = 0x2A
|
|
003A 82 COLON = 0x3A
|
|
003C 83 LESSTHAN = 0x3C
|
|
0020 84 ASCSPACE = 0x20 ; SPACE
|
|
002E 85 PERIOD = 0x2e ; PERIOD
|
|
003D 86 EQUAL = 0x3D
|
|
003E 87 GREATERTHAN = 0x3E
|
|
003F 88 QUESTION = 0x3F ;QUESTION MARK
|
|
005F 89 UNDERSCORE = 0x5F
|
|
007B 90 LCURLY = 0x7B ; {
|
|
007F 91 DEL = 0x7F ; RUBOUT
|
|
92 ;
|
|
93 ; SET ORIGIN FOR CP/M
|
|
94 ;
|
|
95
|
|
003B 96 NK = 59 ;SYSTEM SIZE
|
|
9C00 97 BASE = (NK*1024)-0x5000
|
|
D000 98 CCPO = BASE+0x3400 ;CCP ORIGIN
|
|
D800 99 BDOSO = BASE+0x3C00 ;BDOS ORIGIN
|
|
E600 100 BIOSO = BASE+0x4A00 ;BIOS ORIGIN
|
|
101
|
|
102 ;dwg; .ORG CCPO
|
|
103 ;
|
|
0000 C3r54s03 104 CBASE: JP COMMAND ; EXECUTE COMMAND PROCESSOR (CCP).
|
|
0003 C3r50s03 105 JP CLEARBUF ; ENTRY TO EMPTY INPUT BUFFER BEFORE STARTING CCP.
|
|
106
|
|
107 ;
|
|
108 ; STANDARD CP/M CCP INPUT BUFFER. FORMAT IS (MAX LENGTH),
|
|
109 ; (ACTUAL LENGTH), (CHAR #1), (CHAR #2), (CHAR #3), ETC.
|
|
110 ;
|
|
0006 7F 111 INBUFF: .DB 127 ; LENGTH OF INPUT BUFFER.
|
|
112
|
|
113 ; N8VEM - if add any text after this point, change .DB 0 below to length
|
|
114 ; and put a 0 after the text, and delete the same number of zeros after the dig
|
|
115 ; so that inpoint ends up at the same spot
|
|
116 ; INBUFF+1 is cleared on the next warm boot, so only runs once.
|
|
0007 00 117 .DB 0 ;CURRENT LENGTH OF CONTENTS.
|
|
118
|
|
119
|
|
120 ; .DB 17 ; Autoboot length of string
|
|
121 ; .DB "SUPERSUB AUTOEXEC"
|
|
122 ; .DB 0 ; zero at end
|
|
123
|
|
124
|
|
0008 43 4F 50 59 52 49 125 .ascii "COPYRIGHT"
|
|
47 48 54
|
|
0011 20 31 39 37 39 20 126 .ascii " 1979 (C) BY "
|
|
28 43 29 20 42 59
|
|
20
|
|
001E 44 49 47 49 54 41 127 .ascii "DIGITAL RESEARCH "
|
|
4C 20 52 45 53 45
|
|
41 52 43 48 20 20
|
|
20 20
|
|
0032 20 20 128 .ascii " "
|
|
129
|
|
130 ;dwg; .ORG INBUFF+128
|
|
131 ;dwg; becausje org's are not allowed in rel areas, it has been
|
|
132 ; replaced with the following array of .db's to achieve the
|
|
133 ; same purpose
|
|
0034 00 00 00 00 00 00 134 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
00 00 00 00 00 00
|
|
00 00 00 00
|
|
0044 00 00 00 00 00 00 135 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
00 00 00 00 00 00
|
|
00 00 00 00
|
|
0054 00 00 00 00 00 00 136 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
00 00 00 00 00 00
|
|
00 00 00 00
|
|
0064 00 00 00 00 00 00 137 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
00 00 00 00 00 00
|
|
00 00 00 00
|
|
0074 00 00 00 00 00 00 138 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
00 00 00 00 00 00
|
|
00 00 00 00
|
|
0084 00 00 139 .db 0,0
|
|
140
|
|
141 ;; s/b d086 here
|
|
142
|
|
0086r08s00 143 INPOINT:.DW INBUFF+2 ; INPUT LINE POINTER
|
|
0088 00 00 144 NAMEPNT:.DW 0 ; INPUT LINE POINTER USED FOR ERROR MESSAGE. POINTS TO
|
|
145 ; ;START OF NAME IN ERROR.
|
|
146 ;
|
|
147 ; ROUTINE TO PRINT (A) ON THE CONSOLE. ALL REGISTERS USED.
|
|
148 ;
|
|
008A 5F 149 PRINT: LD E,A ; SETUP BDOS CALL.
|
|
008B 0E 02 150 LD C,#2
|
|
008D C3 05 00 151 JP ENTRY
|
|
152 ;
|
|
153 ; ROUTINE TO PRINT (A) ON THE CONSOLE AND TO SAVE (BC).
|
|
154 ;
|
|
0090 C5 155 PRINTB: PUSH BC
|
|
0091 CDr8As00 156 CALL PRINT
|
|
0094 C1 157 POP BC
|
|
0095 C9 158 RET
|
|
159 ;
|
|
160 ; ROUTINE TO SEND A CARRIAGE RETURN, LINE FEED COMBINATION
|
|
161 ; TO THE CONSOLE.
|
|
162 ;
|
|
0096 3E 0D 163 CRLF: LD A,#CR
|
|
0098 CDr90s00 164 CALL PRINTB
|
|
009B 3E 0A 165 LD A,#LF
|
|
009D C3r90s00 166 JP PRINTB
|
|
167 ;
|
|
168 ; ROUTINE TO SEND ONE SPACE TO THE CONSOLE AND SAVE (BC).
|
|
169 ;
|
|
00A0 3E 20 170 SPACE: LD A,#ASCSPACE
|
|
00A2 C3r90s00 171 JP PRINTB
|
|
172 ;
|
|
173 ; ROUTINE TO PRINT CHARACTER STRING POINTED TO BE (BC) ON THE
|
|
174 ; CONSOLE. IT MUST TERMINATE WITH A NULL BYTE.
|
|
175 ;
|
|
00A5 C5 176 PLINE: PUSH BC
|
|
00A6 CDr96s00 177 CALL #CRLF
|
|
00A9 E1 178 POP HL
|
|
00AA 7E 179 PLINE2: LD A,(HL)
|
|
00AB B7 180 OR A
|
|
00AC C8 181 RET Z
|
|
00AD 23 182 INC HL
|
|
00AE E5 183 PUSH HL
|
|
00AF CDr8As00 184 CALL PRINT
|
|
00B2 E1 185 POP HL
|
|
00B3 C3rAAs00 186 JP PLINE2
|
|
187 ;
|
|
188 ; ROUTINE TO RESET THE DISK SYSTEM.
|
|
189 ;
|
|
00B6 0E 0D 190 RESDSK: LD C,#13
|
|
00B8 C3 05 00 191 JP ENTRY
|
|
192 ;
|
|
193 ; ROUTINE TO SELECT DISK (A).
|
|
194 ;
|
|
00BB 5F 195 DSKSEL: LD E,A
|
|
00BC 0E 0E 196 LD C,#14
|
|
00BE C3 05 00 197 JP ENTRY
|
|
198 ;
|
|
199 ; ROUTINE TO CALL BDOS AND SAVE THE RETURN CODE. THE ZERO
|
|
200 ; FLAG IS SET ON A RETURN OF 0FFH.
|
|
201 ;
|
|
00C1 CD 05 00 202 ENTRY1: CALL ENTRY
|
|
00C4 32rFAs07 203 LD (RTNCODE),A ; SAVE RETURN CODE.
|
|
00C7 3C 204 INC A ; SET ZERO IF 0FFH RETURNED.
|
|
00C8 C9 205 RET
|
|
206 ;
|
|
207 ; ROUTINE TO OPEN A FILE. (DE) MUST POINT TO THE FCB.
|
|
208 ;
|
|
00C9 0E 0F 209 OPEN: LD C,#15
|
|
00CB C3rC1s00 210 JP ENTRY1
|
|
211 ;
|
|
212 ; ROUTINE TO OPEN FILE AT (FCB).
|
|
213 ;
|
|
00CE AF 214 OPENFCB:XOR A ; CLEAR THE RECORD NUMBER BYTE AT FCB+32
|
|
00CF 32rF9s07 215 LD (FCB+32),A
|
|
00D2 11rD9s07 216 LD DE,#FCB
|
|
00D5 C3rC9s00 217 JP OPEN
|
|
218 ;
|
|
219 ; ROUTINE TO CLOSE A FILE. (DE) POINTS TO FCB.
|
|
220 ;
|
|
00D8 0E 10 221 CLOSE: LD C,#16
|
|
00DA C3rC1s00 222 JP ENTRY1
|
|
223 ;
|
|
224 ; ROUTINE TO SEARCH FOR THE FIRST FILE WITH AMBIGUEOUS NAME
|
|
225 ; (DE).
|
|
226 ;
|
|
00DD 0E 11 227 SRCHFST:LD C,#17
|
|
00DF C3rC1s00 228 JP ENTRY1
|
|
229 ;
|
|
230 ; SEARCH FOR THE NEXT AMBIGEOUS FILE NAME.
|
|
231 ;
|
|
00E2 0E 12 232 SRCHNXT:LD C,#18
|
|
00E4 C3rC1s00 233 JP ENTRY1
|
|
234 ;
|
|
235 ; SEARCH FOR FILE AT (FCB).
|
|
236 ;
|
|
00E7 11rD9s07 237 SRCHFCB:LD DE,#FCB
|
|
00EA C3rDDs00 238 JP SRCHFST
|
|
239 ;
|
|
240 ; ROUTINE TO DELETE A FILE POINTED TO BY (DE).
|
|
241 ;
|
|
00ED 0E 13 242 DELETE: LD C,#19
|
|
00EF C3 05 00 243 JP ENTRY
|
|
244 ;
|
|
245 ; ROUTINE TO CALL THE BDOS AND SET THE ZERO FLAG IF A ZERO
|
|
246 ; STATUS IS RETURNED.
|
|
247 ;
|
|
00F2 CD 05 00 248 ENTRY2: CALL ENTRY
|
|
00F5 B7 249 OR A ; SET ZERO FLAG IF APPROPRIATE.
|
|
00F6 C9 250 RET
|
|
251 ;
|
|
252 ; ROUTINE TO READ THE NEXT RECORD FROM A S.EQUENTIAL FILE.
|
|
253 ; (DE) POINTS TO THE FCB.
|
|
254 ;
|
|
00F7 0E 14 255 RDREC: LD C,#20
|
|
00F9 C3rF2s00 256 JP ENTRY2
|
|
257 ;
|
|
258 ; ROUTINE TO READ FILE AT (FCB).
|
|
259 ;
|
|
00FC 11rD9s07 260 READFCB:LD DE,#FCB
|
|
00FF C3rF7s00 261 JP RDREC
|
|
262 ;
|
|
263 ; ROUTINE TO WRITE THE NEXT RECORD OF A S.EQUENTIAL FILE.
|
|
264 ; (DE) POINTS TO THE FCB.
|
|
265 ;
|
|
0102 0E 15 266 WRTREC: LD C,#21
|
|
0104 C3rF2s00 267 JP ENTRY2
|
|
268 ;
|
|
269 ; ROUTINE TO CREATE THE FILE POINTED TO BY (DE).
|
|
270 ;
|
|
0107 0E 16 271 CREATE: LD C,#22
|
|
0109 C3rC1s00 272 JP ENTRY1
|
|
273 ;
|
|
274 ; ROUTINE TO RENAME THE FILE POINTED TO BY (DE). NOTE THAT
|
|
275 ; THE NEW NAME STARTS AT (DE+16).
|
|
276 ;
|
|
010C 0E 17 277 RENAM: LD C,#23
|
|
010E C3 05 00 278 JP ENTRY
|
|
279 ;
|
|
280 ; GET THE CURRENT USER CODE.
|
|
281 ;
|
|
0111 1E FF 282 GETUSR: LD E,#0x0FF
|
|
283 ;
|
|
284 ; ROUTNE TO GET OR SET THE CURRENT USER CODE.
|
|
285 ; IF (E) IS FF THEN THIS IS A GET, ELSE IT IS A SET.
|
|
286 ;
|
|
0113 287 GETSETUC:
|
|
0113 0E 20 288 LD C,#32
|
|
0115 C3 05 00 289 JP ENTRY
|
|
290 ;
|
|
291 ; ROUTINE TO SET THE CURRENT DRIVE BYTE AT (TDRIVE).
|
|
292 ;
|
|
0118 CDr11s01 293 SETCDRV:CALL GETUSR ; GET USER NUMBER
|
|
011B 87 294 ADD A,A ; AND SHIFT INTO THE UPPER 4 BITS.
|
|
011C 87 295 ADD A,A
|
|
011D 87 296 ADD A,A
|
|
011E 87 297 ADD A,A
|
|
011F 21rFBs07 298 LD HL,#CDRIVE ; NOW ADD IN THE CURRENT DRIVE NUMBER.
|
|
0122 B6 299 OR (HL)
|
|
0123 32 04 00 300 LD (TDRIVE),A ; AND SAVE.
|
|
0126 C9 301 RET
|
|
302 ;
|
|
303 ; MOVE CURRENTLY ACTIVE DRIVE DOWN TO (TDRIVE).
|
|
304 ;
|
|
0127 3ArFBs07 305 MOVECD: LD A,(CDRIVE)
|
|
012A 32 04 00 306 LD (TDRIVE),A
|
|
012D C9 307 RET
|
|
308 ;
|
|
309 ; ROUTINE TO CONVERT (A) INTO UPPER CASE ASCII. ONLY LETTERS
|
|
310 ; ARE AFFECTED.
|
|
311 ;
|
|
012E FE 41 312 UPPER: CP #0x41 ; CHECK FOR LETTERS IN THE RANGE OF 'A' TO 'Z'.
|
|
0130 D8 313 RET C
|
|
0131 FE 7B 314 CP #LCURLY
|
|
0133 D0 315 RET NC
|
|
0134 E6 5F 316 AND #0x5F ; CONVERT IT IF FOUND.
|
|
0136 C9 317 RET
|
|
318 ;
|
|
319 ; ROUTINE TO GET A LINE OF INPUT. WE MUST CHECK TO SEE IF THE
|
|
320 ; USER IS IN (BATCH) MODE. IF SO, THEN READ THE INPUT FROM FILE
|
|
321 ; ($$$.SUB). AT THE END, RESET TO CONSOLE INPUT.
|
|
322 ;
|
|
0137 3ArB7s07 323 GETINP: LD A,(BATCH) ; IF =0, THEN USE CONSOLE INPUT.
|
|
013A B7 324 OR A
|
|
013B CAr94s01 325 JP Z,GETINP1
|
|
326 ;
|
|
327 ; USE THE SUBMIT FILE ($$$.SUB) WHICH IS PREPARED BY A
|
|
328 ; SUBMIT RUN. IT MUST BE ON DRIVE (A) AND IT WILL BE DELETED
|
|
329 ; IF AND ERROR OCCURES (LIKE EOF).
|
|
330 ;
|
|
013E 3ArFBs07 331 LD A,(CDRIVE) ; SELECT DRIVE 0 IF NEED BE.
|
|
0141 B7 332 OR A
|
|
0142 3E 00 333 LD A,#0 ; ALWAYS USE DRIVE A FOR SUBMIT.
|
|
0144 C4rBBs00 334 CALL NZ,DSKSEL ; SELECT IT IF R.EQUIRED.
|
|
0147 11rB8s07 335 LD DE,#BATCHFCB
|
|
014A CDrC9s00 336 CALL OPEN ; LOOK FOR IT.
|
|
014D CAr94s01 337 JP Z,GETINP1 ; IF NOT THERE, USE NORMAL INPUT.
|
|
0150 3ArC7s07 338 LD A,(BATCHFCB+15) ; GET LAST RECORD NUMBER+1.
|
|
0153 3D 339 DEC A
|
|
0154 32rD8s07 340 LD (BATCHFCB+32),A
|
|
0157 11rB8s07 341 LD DE,#BATCHFCB
|
|
015A CDrF7s00 342 CALL RDREC ; READ LAST RECORD.
|
|
015D C2r94s01 343 JP NZ,GETINP1 ; QUIT ON END OF FILE.
|
|
344 ;
|
|
345 ; MOVE THIS RECORD INTO INPUT BUFFER.
|
|
346 ;
|
|
0160 11r07s00 347 LD DE,#INBUFF+1
|
|
0163 21 80 00 348 LD HL,#TBUFF ; DATA WAS READ INTO BUFFER HERE.
|
|
0166 06 80 349 LD B,#128 ; ALL 128 CHARACTERS MAY BE USED.
|
|
0168 CDr38s04 350 CALL HL2DE ; (HL) TO (DE), (B) BYTES.
|
|
016B 21rC6s07 351 LD HL,#BATCHFCB+14
|
|
016E 36 00 352 LD (HL),#0 ; ZERO OUT THE 'S2' BYTE.
|
|
0170 23 353 INC HL ; AND DECREMENT THE RECORD COUNT.
|
|
0171 35 354 DEC (HL)
|
|
0172 11rB8s07 355 LD DE,#BATCHFCB ; CLOSE THE BATCH FILE NOW.
|
|
0175 CDrD8s00 356 CALL CLOSE
|
|
0178 CAr94s01 357 JP Z,GETINP1 ; QUIT ON AN ERROR.
|
|
017B 3ArFBs07 358 LD A,(CDRIVE) ; RE-SELECT PREVIOUS DRIVE IF NEED BE.
|
|
017E B7 359 OR A
|
|
017F C4rBBs00 360 CALL NZ,DSKSEL ; DON'T DO NEEDLESS SELECTS.
|
|
361 ;
|
|
362 ; PRINT LINE JUST READ ON CONSOLE.
|
|
363 ;
|
|
0182 21r08s00 364 LD HL,#INBUFF+2
|
|
0185 CDrAAs00 365 CALL PLINE2
|
|
0188 CDrC0s01 366 CALL CHKCON ; CHECK CONSOLE, QUIT ON A KEY.
|
|
018B CArA5s01 367 JP Z,GETINP2 ; JUMP IF NO KEY IS PRESSED.
|
|
368 ;
|
|
369 ; TERMINATE THE SUBMIT JOB ON ANY KEYBOARD INPUT. DELETE THIS
|
|
370 ; FILE SUCH THAT IT IS NOT RE-STARTED AND JUMP TO NORMAL KEYBOARD
|
|
371 ; INPUT SECTION.
|
|
372 ;
|
|
018E CDrDBs01 373 CALL DELBATCH ; DELETE THE BATCH FILE.
|
|
0191 C3r7As03 374 JP CMMND1 ; AND RESTART COMMAND INPUT.
|
|
375 ;
|
|
376 ; GET HERE FOR NORMAL KEYBOARD INPUT. DELETE THE SUBMIT FILE
|
|
377 ; INCASE THERE WAS ONE.
|
|
378 ;
|
|
0194 CDrDBs01 379 GETINP1:CALL DELBATCH ; DELETE FILE ($$$.SUB).
|
|
0197 CDr18s01 380 CALL SETCDRV ; RESET ACTIVE DISK.
|
|
019A 0E 0A 381 LD C,#10 ; GET LINE FROM CONSOLE DEVICE.
|
|
019C 11r06s00 382 LD DE,#INBUFF
|
|
019F CD 05 00 383 CALL ENTRY
|
|
01A2 CDr27s01 384 CALL MOVECD ; RESET CURRENT DRIVE (AGAIN).
|
|
385 ;
|
|
386 ; CONVERT INPUT LINE TO UPPER CASE.
|
|
387 ;
|
|
01A5 21r07s00 388 GETINP2:LD HL,#INBUFF+1
|
|
01A8 46 389 LD B,(HL) ; (B)=CHARACTER COUNTER.
|
|
01A9 23 390 GETINP3:INC HL
|
|
01AA 78 391 LD A,B ; END OF THE LINE?
|
|
01AB B7 392 OR A
|
|
01AC CArB8s01 393 JP Z,GETINP4
|
|
01AF 7E 394 LD A,(HL) ; CONVERT TO UPPER CASE.
|
|
01B0 CDr2Es01 395 CALL UPPER
|
|
01B3 77 396 LD (HL),A
|
|
01B4 05 397 DEC B ; ADJUST CHARACTER COUNT.
|
|
01B5 C3rA9s01 398 JP GETINP3
|
|
01B8 77 399 GETINP4:LD (HL),A ; ADD TRAILING NULL.
|
|
01B9 21r08s00 400 LD HL,#INBUFF+2
|
|
01BC 22r86s00 401 LD (INPOINT),HL ; RESET INPUT LINE POINTER.
|
|
01BF C9 402 RET
|
|
403 ;
|
|
404 ; ROUTINE TO CHECK THE CONSOLE FOR A KEY PRESSED. THE ZERO
|
|
405 ; FLAG IS SET IS NONE, ELSE THE CHARACTER IS RETURNED IN (A).
|
|
406 ;
|
|
01C0 0E 0B 407 CHKCON: LD C,#11 ; CHECK CONSOLE.
|
|
01C2 CD 05 00 408 CALL ENTRY
|
|
01C5 B7 409 OR A
|
|
01C6 C8 410 RET Z ; RETURN IF NOTHING.
|
|
01C7 0E 01 411 LD C,#1 ; ELSE GET CHARACTER.
|
|
01C9 CD 05 00 412 CALL ENTRY
|
|
01CC B7 413 OR A ; CLEAR ZERO FLAG AND RETURN.
|
|
01CD C9 414 RET
|
|
415 ;
|
|
416 ; ROUTINE TO GET THE CURRENTLY ACTIVE DRIVE NUMBER.
|
|
417 ;
|
|
01CE 0E 19 418 GETDSK: LD C,#25
|
|
01D0 C3 05 00 419 JP ENTRY
|
|
420 ;
|
|
421 ; SET THE STABDARD DMA ADDRESS.
|
|
422 ;
|
|
01D3 11 80 00 423 STDDMA: LD DE,#TBUFF
|
|
424 ;
|
|
425 ; ROUTINE TO SET THE DMA ADDRESS TO (DE).
|
|
426 ;
|
|
01D6 0E 1A 427 DMASET: LD C,#26
|
|
01D8 C3 05 00 428 JP ENTRY
|
|
429 ;
|
|
430 ; DELETE THE BATCH FILE CREATED BY SUBMIT.
|
|
431 ;
|
|
01DB 432 DELBATCH:
|
|
01DB 21rB7s07 433 LD HL,#BATCH ; IS BATCH ACTIVE?
|
|
01DE 7E 434 LD A,(HL)
|
|
01DF B7 435 OR A
|
|
01E0 C8 436 RET Z
|
|
01E1 36 00 437 LD (HL),#0 ; YES, DE-ACTIVATE IT.
|
|
01E3 AF 438 XOR A
|
|
01E4 CDrBBs00 439 CALL DSKSEL ; SELECT DRIVE 0 FOR SURE.
|
|
01E7 11rB8s07 440 LD DE,#BATCHFCB ; AND DELETE THIS FILE.
|
|
01EA CDrEDs00 441 CALL DELETE
|
|
01ED 3ArFBs07 442 LD A,(CDRIVE) ; RESET CURRENT DRIVE.
|
|
01F0 C3rBBs00 443 JP DSKSEL
|
|
444 ;
|
|
445 ; PRINT BACK FILE NAME WITH A '?' TO INDICATE A SYNTAX ERROR.
|
|
446 ;
|
|
01F3 CDr96s00 447 SYNERR: CALL CRLF ; END CURRENT LINE.
|
|
01F6 2Ar88s00 448 LD HL,(NAMEPNT) ; THIS POINTS TO NAME IN ERROR.
|
|
01F9 7E 449 SYNERR1:LD A,(HL) ; PRINT IT UNTIL A SPACE OR NULL IS FOUND.
|
|
01FA FE 20 450 CP #ASCSPACE
|
|
01FC CAr0Cs02 451 JP Z,SYNERR2
|
|
01FF B7 452 OR A
|
|
0200 CAr0Cs02 453 JP Z,SYNERR2
|
|
0203 E5 454 PUSH HL
|
|
0204 CDr8As00 455 CALL PRINT
|
|
0207 E1 456 POP HL
|
|
0208 23 457 INC HL
|
|
0209 C3rF9s01 458 JP SYNERR1
|
|
020C 3E 3F 459 SYNERR2:LD A,#QUESTION ; ADD TRAILING '?'.
|
|
020E CDr8As00 460 CALL PRINT
|
|
0211 CDr96s00 461 CALL CRLF
|
|
0214 CDrDBs01 462 CALL DELBATCH ; DELETE ANY BATCH FILE.
|
|
0217 C3r7As03 463 JP CMMND1 ; AND RESTART FROM CONSOLE INPUT.
|
|
464 ;
|
|
465 ; CHECK CHARACTER AT (DE) FOR LEGAL COMMAND INPUT. NOTE THAT THE
|
|
466 ; ZERO FLAG IS SET IF THE CHARACTER IS A DELIMITER.
|
|
467 ;
|
|
021A 1A 468 CHECK: LD A,(DE)
|
|
021B B7 469 OR A
|
|
021C C8 470 RET Z
|
|
021D FE 20 471 CP #ASCSPACE ; CONTROL CHARACTERS ARE NOT LEGAL HERE.
|
|
021F DArF3s01 472 JP C,SYNERR
|
|
0222 C8 473 RET Z ; CHECK FOR VALID DELIMITER.
|
|
0223 FE 3D 474 CP #EQUAL
|
|
0225 C8 475 RET Z
|
|
0226 FE 5F 476 CP #UNDERSCORE
|
|
0228 C8 477 RET Z
|
|
0229 FE 2E 478 CP #PERIOD
|
|
022B C8 479 RET Z
|
|
022C FE 3A 480 CP #COLON
|
|
022E C8 481 RET Z
|
|
022F FE 3B 482 CP #0x3b
|
|
0231 C8 483 RET Z
|
|
0232 FE 3C 484 CP #LESSTHAN
|
|
0234 C8 485 RET Z
|
|
0235 FE 3E 486 CP #GREATERTHAN
|
|
0237 C8 487 RET Z
|
|
0238 C9 488 RET
|
|
489 ;
|
|
490 ; GET THE NEXT NON-BLANK CHARACTER FROM (DE).
|
|
491 ;
|
|
0239 492 NONBLANK:
|
|
0239 1A 493 LD A,(DE)
|
|
023A B7 494 OR A ; STRING ENDS WITH A NULL.
|
|
023B C8 495 RET Z
|
|
023C FE 20 496 CP #ASCSPACE
|
|
023E C0 497 RET NZ
|
|
023F 13 498 INC DE
|
|
0240 C3r39s02 499 JP NONBLANK
|
|
500 ;
|
|
501 ; ADD (HL)=(HL)+(A)
|
|
502 ;
|
|
0243 85 503 ADDHL: ADD A,L
|
|
0244 6F 504 LD L,A
|
|
0245 D0 505 RET NC ; TAKE CARE OF ANY CARRY.
|
|
0246 24 506 INC H
|
|
0247 C9 507 RET
|
|
508 ;
|
|
509 ; CONVERT THE FIRST NAME IN (FCB).
|
|
510 ;
|
|
0248 3E 00 511 CONVFST:LD A,#0
|
|
512 ;
|
|
513 ; FORMAT A FILE NAME (CONVERT * TO '?', ETC.). ON RETURN,
|
|
514 ; (A)=0 IS AN UNAMBIGEOUS NAME WAS SPECIFIED. ENTER WITH (A) .EQUAL TO
|
|
515 ; THE POSITION WITHIN THE FCB FOR THE NAME (EITHER 0 OR 16).
|
|
516 ;
|
|
024A 21rD9s07 517 CONVERT:LD HL,#FCB
|
|
024D CDr43s02 518 CALL ADDHL
|
|
0250 E5 519 PUSH HL
|
|
0251 E5 520 PUSH HL
|
|
0252 AF 521 XOR A
|
|
0253 32rFCs07 522 LD (CHGDRV),A ; INITIALIZE DRIVE CHANGE FLAG.
|
|
0256 2Ar86s00 523 LD HL,(INPOINT) ; SET (HL) AS POINTER INTO INPUT LINE.
|
|
0259 EB 524 EX DE,HL
|
|
025A CDr39s02 525 CALL NONBLANK ; GET NEXT NON-BLANK CHARACTER.
|
|
025D EB 526 EX DE,HL
|
|
025E 22r88s00 527 LD (NAMEPNT),HL ; SAVE POINTER HERE FOR ANY ERROR MESSAGE.
|
|
0261 EB 528 EX DE,HL
|
|
0262 E1 529 POP HL
|
|
0263 1A 530 LD A,(DE) ; GET FIRST CHARACTER.
|
|
0264 B7 531 OR A
|
|
0265 CAr73s02 532 JP Z,CONVRT1
|
|
0268 DE 40 533 SBC A,#0x41-1 ; MIGHT BE A DRIVE NAME, CONVERT TO BINARY.
|
|
026A 47 534 LD B,A ; AND SAVE.
|
|
026B 13 535 INC DE ; CHECK NEXT CHARACTER FOR A ':'.
|
|
026C 1A 536 LD A,(DE)
|
|
026D FE 3A 537 CP #COLON
|
|
026F CAr7As02 538 JP Z,CONVRT2
|
|
0272 1B 539 DEC DE ; NOPE, MOVE POINTER BACK TO THE START OF THE LINE.
|
|
0273 3ArFBs07 540 CONVRT1:LD A,(CDRIVE)
|
|
0276 77 541 LD (HL),A
|
|
0277 C3r80s02 542 JP CONVRT3
|
|
027A 78 543 CONVRT2:LD A,B
|
|
027B 32rFCs07 544 LD (CHGDRV),A ; SET CHANGE IN DRIVES FLAG.
|
|
027E 70 545 LD (HL),B
|
|
027F 13 546 INC DE
|
|
547 ;
|
|
548 ; CONVERT THE BASIC FILE NAME.
|
|
549 ;
|
|
0280 06 08 550 CONVRT3:LD B,#8
|
|
0282 CDr1As02 551 CONVRT4:CALL CHECK
|
|
0285 CArA3s02 552 JP Z,CONVRT8
|
|
0288 23 553 INC HL
|
|
0289 FE 2A 554 CP #ASTERICK ; NOTE THAT AN '*' WILL FILL THE REMAINING
|
|
028B C2r93s02 555 JP NZ,CONVRT5 ; FIELD WITH '?'.
|
|
028E 36 3F 556 LD (HL),#QUESTION
|
|
0290 C3r95s02 557 JP CONVRT6
|
|
0293 77 558 CONVRT5:LD (HL),A
|
|
0294 13 559 INC DE
|
|
0295 05 560 CONVRT6:DEC B
|
|
0296 C2r82s02 561 JP NZ,CONVRT4
|
|
0299 CDr1As02 562 CONVRT7:CALL CHECK ; GET NEXT DELIMITER.
|
|
029C CArAAs02 563 JP Z,GETEXT
|
|
029F 13 564 INC DE
|
|
02A0 C3r99s02 565 JP CONVRT7
|
|
02A3 23 566 CONVRT8:INC HL ; BLANK FILL THE FILE NAME.
|
|
02A4 36 20 567 LD (HL),#ASCSPACE
|
|
02A6 05 568 DEC B
|
|
02A7 C2rA3s02 569 JP NZ,CONVRT8
|
|
570 ;
|
|
571 ; GET THE EXTENSION AND CONVERT IT.
|
|
572 ;
|
|
02AA 06 03 573 GETEXT: LD B,#3
|
|
02AC FE 2E 574 CP #PERIOD
|
|
02AE C2rD3s02 575 JP NZ,GETEXT5
|
|
02B1 13 576 INC DE
|
|
02B2 CDr1As02 577 GETEXT1:CALL CHECK
|
|
02B5 CArD3s02 578 JP Z,GETEXT5
|
|
02B8 23 579 INC HL
|
|
02B9 FE 2A 580 CP #ASTERICK
|
|
02BB C2rC3s02 581 JP NZ,GETEXT2
|
|
02BE 36 3F 582 LD (HL),#QUESTION
|
|
02C0 C3rC5s02 583 JP GETEXT3
|
|
02C3 77 584 GETEXT2:LD (HL),A
|
|
02C4 13 585 INC DE
|
|
02C5 05 586 GETEXT3:DEC B
|
|
02C6 C2rB2s02 587 JP NZ,GETEXT1
|
|
02C9 CDr1As02 588 GETEXT4:CALL CHECK
|
|
02CC CArDAs02 589 JP Z,GETEXT6
|
|
02CF 13 590 INC DE
|
|
02D0 C3rC9s02 591 JP GETEXT4
|
|
02D3 23 592 GETEXT5:INC HL
|
|
02D4 36 20 593 LD (HL),#ASCSPACE
|
|
02D6 05 594 DEC B
|
|
02D7 C2rD3s02 595 JP NZ,GETEXT5
|
|
02DA 06 03 596 GETEXT6:LD B,#3
|
|
02DC 23 597 GETEXT7:INC HL
|
|
02DD 36 00 598 LD (HL),#0
|
|
02DF 05 599 DEC B
|
|
02E0 C2rDCs02 600 JP NZ,GETEXT7
|
|
02E3 EB 601 EX DE,HL
|
|
02E4 22r86s00 602 LD (INPOINT),HL ; SAVE INPUT LINE POINTER.
|
|
02E7 E1 603 POP HL
|
|
604 ;
|
|
605 ; CHECK TO SEE IF THIS IS AN AMBIGEOUS FILE NAME SPECIFICATION.
|
|
606 ; SET THE (A) REGISTER TO NON ZERO IF IT IS.
|
|
607 ;
|
|
02E8 01 0B 00 608 LD BC,#11 ; SET NAME LENGTH.
|
|
02EB 23 609 GETEXT8:INC HL
|
|
02EC 7E 610 LD A,(HL)
|
|
02ED FE 3F 611 CP #QUESTION ; ANY QUESTION MARKS?
|
|
02EF C2rF3s02 612 JP NZ,GETEXT9
|
|
02F2 04 613 INC B ; COUNT THEM.
|
|
02F3 0D 614 GETEXT9:DEC C
|
|
02F4 C2rEBs02 615 JP NZ,GETEXT8
|
|
02F7 78 616 LD A,B
|
|
02F8 B7 617 OR A
|
|
02F9 C9 618 RET
|
|
619 ;
|
|
620 ; CP/M COMMAND TABLE. NOTE COMMANDS CAN BE EITHER 3 OR 4 CHARACTERS LONG.
|
|
621 ;
|
|
0001 622 .if MON
|
|
0007 623 NUMCMDS = 7 ; NUMBER OF COMMANDS
|
|
624 .else
|
|
625 NUMCMDS = 6 ; NUMBER OF COMMANDS
|
|
626 .endif
|
|
627
|
|
02FA 44 49 52 20 628 CMDTBL: .ascii "DIR "
|
|
02FE 45 52 41 20 629 .ascii "ERA "
|
|
0302 54 59 50 45 630 .ascii "TYPE"
|
|
0306 53 41 56 45 631 .ascii "SAVE"
|
|
030A 52 45 4E 20 632 .ascii "REN "
|
|
030E 55 53 45 52 633 .ascii "USER"
|
|
0001 634 .if MON
|
|
0312 4D 4F 4E 20 635 .ascii "MON "
|
|
636 .ENDIF
|
|
637
|
|
0316r70s04 638 CMDADR: .DW DIRECT
|
|
0318r18s05 639 .DW ERASE
|
|
031Ar56s05 640 .DW TYPE
|
|
031CrA6s05 641 .DW SAVE
|
|
031Er09s06 642 .DW RENAME
|
|
0320r87s06 643 .DW USER
|
|
0001 644 .IF MON
|
|
0322r6Ds04 645 .DW MONITOR
|
|
646 .ENDIF
|
|
0324r9Es06 647 .DW UNKNOWN
|
|
648 ;
|
|
649 ; SEARCH THE COMMAND TABLE FOR A MATCH WITH WHAT HAS JUST
|
|
650 ; BEEN ENTERED. IF A MATCH IS FOUND, THEN WE JUMP TO THE
|
|
651 ; PROPER SECTION. ELSE JUMP TO (UNKNOWN).
|
|
652 ; ON RETURN, THE (C) REGISTER IS SET TO THE COMMAND NUMBER
|
|
653 ; THAT MATCHED (OR NUMCMDS+1 IF NO MATCH).
|
|
654 ;
|
|
0326 21rFAs02 655 SEARCH: LD HL,#CMDTBL
|
|
0329 0E 00 656 LD C,#0
|
|
032B 79 657 SEARCH1:LD A,C
|
|
032C FE 07 658 CP #NUMCMDS ; THIS COMMANDS EXISTS.
|
|
032E D0 659 RET NC
|
|
032F 11rDAs07 660 LD DE,#FCB+1 ; CHECK THIS ONE.
|
|
0332 06 04 661 LD B,#4 ; MAX COMMAND LENGTH.
|
|
0334 1A 662 SEARCH2:LD A,(DE)
|
|
0335 BE 663 CP (HL)
|
|
0336 C2r47s03 664 JP NZ,SEARCH3 ; NOT A MATCH.
|
|
0339 13 665 INC DE
|
|
033A 23 666 INC HL
|
|
033B 05 667 DEC B
|
|
033C C2r34s03 668 JP NZ,SEARCH2
|
|
033F 1A 669 LD A,(DE) ; ALLOW A 3 CHARACTER COMMAND TO MATCH.
|
|
0340 FE 20 670 CP #ASCSPACE
|
|
0342 C2r4Cs03 671 JP NZ,SEARCH4
|
|
0345 79 672 LD A,C ; SET RETURN REGISTER FOR THIS COMMAND.
|
|
0346 C9 673 RET
|
|
0347 23 674 SEARCH3:INC HL
|
|
0348 05 675 DEC B
|
|
0349 C2r47s03 676 JP NZ,SEARCH3
|
|
034C 0C 677 SEARCH4:INC C
|
|
034D C3r2Bs03 678 JP SEARCH1
|
|
679 ;
|
|
680 ; SET THE INPUT BUFFER TO EMPTY AND THEN START THE COMMAND
|
|
681 ; PROCESSOR (CCP).
|
|
682 ;
|
|
0350 683 CLEARBUF:
|
|
0350 AF 684 XOR A
|
|
0351 32r07s00 685 LD (INBUFF+1),A ; SECOND BYTE IS ACTUAL LENGTH.
|
|
0354 31rB7s07 686 COMMAND:LD SP,#CCPSTACK ; SETUP STACK AREA.
|
|
0357 C5 687 PUSH BC ; NOTE THAT (C) SHOULD BE .EQUAL TO:
|
|
0358 79 688 LD A,C ; (UUUUDDDD) WHERE 'UUUU' IS THE USER NUMBER
|
|
0359 1F 689 RRA ; AND 'DDDD' IS THE DRIVE NUMBER.
|
|
035A 1F 690 RRA
|
|
035B 1F 691 RRA
|
|
035C 1F 692 RRA
|
|
035D E6 0F 693 AND #0x0F ; ISOLATE THE USER NUMBER.
|
|
035F 5F 694 LD E,A
|
|
0360 CDr13s01 695 CALL GETSETUC ; AND SET IT.
|
|
0363 CDrB6s00 696 CALL RESDSK ; RESET THE DISK SYSTEM.
|
|
0366 32rB7s07 697 LD (BATCH),A ; CLEAR BATCH MODE FLAG.
|
|
0369 C1 698 POP BC
|
|
036A 79 699 LD A,C
|
|
036B E6 0F 700 AND #0x0F ; ISOLATE THE DRIVE NUMBER.
|
|
036D 32rFBs07 701 LD (CDRIVE),A ; AND SAVE.
|
|
0370 CDrBBs00 702 CALL DSKSEL ; ...AND SELECT.
|
|
0373 3Ar07s00 703 LD A,(INBUFF+1)
|
|
0376 B7 704 OR A ; ANYTHING IN INPUT BUFFER ALREADY?
|
|
0377 C2rA6s03 705 JP NZ,CMMND2 ; YES, WE JUST PROCESS IT.
|
|
706 ;
|
|
707 ; ENTRY POINT TO GET A COMMAND LINE FROM THE CONSOLE.
|
|
708 ;
|
|
037A 31rB7s07 709 CMMND1: LD SP,#CCPSTACK ; SET STACK STRAIGHT.
|
|
037D CDr96s00 710 CALL CRLF ; START A NEW LINE ON THE SCREEN.
|
|
0380 CDrCEs01 711 CALL GETDSK ; GET CURRENT DRIVE.
|
|
0383 C6 41 712 ADD A,#0x41
|
|
0385 CDr8As00 713 CALL PRINT ; PRINT CURRENT DRIVE.
|
|
0001 714 .IF USRDSP
|
|
0388 CDr11s01 715 CALL GETUSR ;GET CURRENT USER NUMBER
|
|
038B FE 0A 716 CP #10 ;TWO DIGITS?
|
|
038D 38 0A 717 JR C,CMMND3 ;NO
|
|
038F 3E 31 718 LD A,#0x31 ;PRINT LEADING '1'
|
|
0391 CDr8As00 719 CALL PRINT
|
|
0394 CDr11s01 720 CALL GETUSR ;GET CURRENT USER NUMBER
|
|
0397 D6 0A 721 SUB #10 ;SUBTRACT 10
|
|
0399 C6 30 722 CMMND3: ADD A,#0x30
|
|
039B CDr8As00 723 CALL PRINT
|
|
724 .ENDIF
|
|
039E 3E 3E 725 LD A,#GREATERTHAN
|
|
03A0 CDr8As00 726 CALL PRINT ; AND ADD PROMPT.
|
|
03A3 CDr37s01 727 CALL GETINP ; GET LINE FROM USER.
|
|
728 ;
|
|
729 ; PROCESS COMMAND LINE HERE.
|
|
730 ;
|
|
03A6 11 80 00 731 CMMND2: LD DE,#TBUFF
|
|
03A9 CDrD6s01 732 CALL DMASET ; SET STANDARD DMA ADDRESS.
|
|
03AC CDrCEs01 733 CALL GETDSK
|
|
03AF 32rFBs07 734 LD (CDRIVE),A ; SET CURRENT DRIVE.
|
|
03B2 CDr48s02 735 CALL CONVFST ; CONVERT NAME TYPED IN.
|
|
03B5 C4rF3s01 736 CALL NZ,SYNERR ; WILD CARDS ARE NOT ALLOWED.
|
|
03B8 3ArFCs07 737 LD A,(CHGDRV) ; IF A CHANGE IN DRIVES WAS INDICATED,
|
|
03BB B7 738 OR A ; THEN TREAT THIS AS AN UNKNOWN COMMAND
|
|
03BC C2r9Es06 739 JP NZ,UNKNOWN ; WHICH GETS EXECUTED.
|
|
03BF CDr26s03 740 CALL SEARCH ; ELSE SEARCH COMMAND TABLE FOR A MATCH.
|
|
741 ;
|
|
742 ; NOTE THAT AN UNKNOWN COMMAND RETURNS
|
|
743 ; WITH (A) POINTING TO THE LAST ADDRESS
|
|
744 ; IN OUR TABLE WHICH IS (UNKNOWN).
|
|
745 ;
|
|
03C2 21r16s03 746 LD HL,#CMDADR ; NOW, LOOK THRU OUR ADDRESS TABLE FOR COMMAND (A).
|
|
03C5 5F 747 LD E,A ; SET (DE) TO COMMAND NUMBER.
|
|
03C6 16 00 748 LD D,#0
|
|
03C8 19 749 ADD HL,DE
|
|
03C9 19 750 ADD HL,DE ; (HL)=(CMDADR)+2*(COMMAND NUMBER).
|
|
03CA 7E 751 LD A,(HL) ; NOW PICK OUT THIS ADDRESS.
|
|
03CB 23 752 INC HL
|
|
03CC 66 753 LD H,(HL)
|
|
03CD 6F 754 LD L,A
|
|
03CE E9 755 JP (HL) ; NOW EXECUTE IT.
|
|
756 ;
|
|
757 ; READ ERROR WHILE TYPEING A FILE.
|
|
758 ;
|
|
03CF 01rD5s03 759 RDERROR:LD BC,#RDERR
|
|
03D2 C3rA5s00 760 JP PLINE
|
|
03D5 52 65 61 64 20 45 761 RDERR: .asciz "Read Error"
|
|
72 72 6F 72 00
|
|
762
|
|
763 ;
|
|
764 ; R.EQUIRED FILE WAS NOT LOCATED.
|
|
765 ;
|
|
03E0 01rE6s03 766 NONE: LD BC,#NOFILE
|
|
03E3 C3rA5s00 767 JP PLINE
|
|
03E6 4E 6F 20 46 69 6C 768 NOFILE: .asciz "No File"
|
|
65 00
|
|
769 ;
|
|
770 ; DECODE A COMMAND OF THE FORM 'A>FILENAME NUMBER{ FILENAME}.
|
|
771 ; NOTE THAT A DRIVE SPECIFIER IS NOT ALLOWED ON THE FIRST FILE
|
|
772 ; NAME. ON RETURN, THE NUMBER IS IN REGISTER (A). ANY ERROR
|
|
773 ; CAUSES 'FILENAME?' TO BE PRINTED AND THE COMMAND IS ABORTED.
|
|
774 ;
|
|
03EE CDr48s02 775 DECODE: CALL CONVFST ; CONVERT FILENAME.
|
|
03F1 3ArFCs07 776 LD A,(CHGDRV) ; DO NOT ALLOW A DRIVE TO BE SPECIFIED.
|
|
03F4 B7 777 OR A
|
|
03F5 C2rF3s01 778 JP NZ,SYNERR
|
|
03F8 21rDAs07 779 LD HL,#FCB+1 ; CONVERT NUMBER NOW.
|
|
03FB 01 0B 00 780 LD BC,#11 ; (B)=SUM REGISTER, (C)=MAX DIGIT COUNT.
|
|
03FE 7E 781 DECODE1:LD A,(HL)
|
|
03FF FE 20 782 CP #ASCSPACE ; A SPACE TERMINATES THE NUMERAL.
|
|
0401 CAr29s04 783 JP Z,DECODE3
|
|
0404 23 784 INC HL
|
|
0405 D6 30 785 SUB #0x30 ; MAKE BINARY FROM ASCII.
|
|
0407 FE 0A 786 CP #10 ; LEGAL DIGIT?
|
|
0409 D2rF3s01 787 JP NC,SYNERR
|
|
040C 57 788 LD D,A ; YES, SAVE IT IN (D).
|
|
040D 78 789 LD A,B ; COMPUTE (B)=(B)*10 AND CHECK FOR OVERFLOW.
|
|
040E E6 E0 790 AND #0x0E0
|
|
0410 C2rF3s01 791 JP NZ,SYNERR
|
|
0413 78 792 LD A,B
|
|
0414 07 793 RLCA
|
|
0415 07 794 RLCA
|
|
0416 07 795 RLCA ; (A)=(B)*8
|
|
0417 80 796 ADD A,B ; .......*9
|
|
0418 DArF3s01 797 JP C,SYNERR
|
|
041B 80 798 ADD A,B ; .......*10
|
|
041C DArF3s01 799 JP C,SYNERR
|
|
041F 82 800 ADD A,D ; ADD IN NEW DIGIT NOW.
|
|
0420 DArF3s01 801 DECODE2:JP C,SYNERR
|
|
0423 47 802 LD B,A ; AND SAVE RESULT.
|
|
0424 0D 803 DEC C ; ONLY LOOK AT 11 DIGITS.
|
|
0425 C2rFEs03 804 JP NZ,DECODE1
|
|
0428 C9 805 RET
|
|
0429 7E 806 DECODE3:LD A,(HL) ; SPACES MUST FOLLOW (WHY?).
|
|
042A FE 20 807 CP #ASCSPACE
|
|
042C C2rF3s01 808 JP NZ,SYNERR
|
|
042F 23 809 INC HL
|
|
0430 0D 810 DECODE4:DEC C
|
|
0431 C2r29s04 811 JP NZ,DECODE3
|
|
0434 78 812 LD A,B ; SET (A)=THE NUMERIC VALUE ENTERED.
|
|
0435 C9 813 RET
|
|
814 ;
|
|
815 ; MOVE 3 BYTES FROM (HL) TO (DE). NOTE THAT THERE IS ONLY
|
|
816 ; ONE REFERENCE TO THIS AT (A2D5H).
|
|
817 ;
|
|
0436 06 03 818 MOVE3: LD B,#3
|
|
819 ;
|
|
820 ; MOVE (B) BYTES FROM (HL) TO (DE).
|
|
821 ;
|
|
0438 7E 822 HL2DE: LD A,(HL)
|
|
0439 12 823 LD (DE),A
|
|
043A 23 824 INC HL
|
|
043B 13 825 INC DE
|
|
043C 05 826 DEC B
|
|
043D C2r38s04 827 JP NZ,HL2DE
|
|
0440 C9 828 RET
|
|
829 ;
|
|
830 ; COMPUTE (HL)=(TBUFF)+(A)+(C) AND GET THE BYTE THAT'S HERE.
|
|
831 ;
|
|
0441 21 80 00 832 EXTRACT:LD HL,#TBUFF
|
|
0444 81 833 ADD A,C
|
|
0445 CDr43s02 834 CALL ADDHL
|
|
0448 7E 835 LD A,(HL)
|
|
0449 C9 836 RET
|
|
837 ;
|
|
838 ; CHECK DRIVE SPECIFIED. IF IT MEANS A CHANGE, THEN THE NEW
|
|
839 ; DRIVE WILL BE SELECTED. IN ANY CASE, THE DRIVE BYTE OF THE
|
|
840 ; FCB WILL BE SET TO NULL (MEANS USE CURRENT DRIVE).
|
|
841 ;
|
|
044A AF 842 DSELECT:XOR A ; NULL OUT FIRST BYTE OF FCB.
|
|
044B 32rD9s07 843 LD (FCB),A
|
|
044E 3ArFCs07 844 LD A,(CHGDRV) ; A DRIVE CHANGE INDICATED?
|
|
0451 B7 845 OR A
|
|
0452 C8 846 RET Z
|
|
0453 3D 847 DEC A ; YES, IS IT THE SAME AS THE CURRENT DRIVE?
|
|
0454 21rFBs07 848 LD HL,#CDRIVE
|
|
0457 BE 849 CP (HL)
|
|
0458 C8 850 RET Z
|
|
0459 C3rBBs00 851 JP DSKSEL ; NO. SELECT IT THEN.
|
|
852 ;
|
|
853 ; CHECK THE DRIVE SELECTION AND RESET IT TO THE PREVIOUS
|
|
854 ; DRIVE IF IT WAS CHANGED FOR THE PRECEEDING COMMAND.
|
|
855 ;
|
|
045C 3ArFCs07 856 RESETDR:LD A,(CHGDRV) ; DRIVE CHANGE INDICATED?
|
|
045F B7 857 OR A
|
|
0460 C8 858 RET Z
|
|
0461 3D 859 DEC A ; YES, WAS IT A DIFFERENT DRIVE?
|
|
0462 21rFBs07 860 LD HL,#CDRIVE
|
|
0465 BE 861 CP (HL)
|
|
0466 C8 862 RET Z
|
|
0467 3ArFBs07 863 LD A,(CDRIVE) ; YES, RE-SELECT OUR OLD DRIVE.
|
|
046A C3rBBs00 864 JP DSKSEL
|
|
865
|
|
0001 866 .IF MON
|
|
867 ;
|
|
868 ;**************************************************************
|
|
869 ;*
|
|
870 ;* M O N I T O R C O M M A N D
|
|
871 ;*
|
|
872 ;**************************************************************
|
|
873 ;
|
|
046D C3 00 FC 874 MONITOR: JP MONADR
|
|
875 .ENDIF
|
|
876
|
|
877 ;
|
|
878 ;**************************************************************
|
|
879 ;*
|
|
880 ;* D I R E C T O R Y C O M M A N D
|
|
881 ;*
|
|
882 ;**************************************************************
|
|
883 ;
|
|
0470 CDr48s02 884 DIRECT: CALL CONVFST ; CONVERT FILE NAME.
|
|
0473 CDr4As04 885 CALL DSELECT ; SELECT INDICATED DRIVE.
|
|
0476 21rDAs07 886 LD HL,#FCB+1 ; WAS ANY FILE INDICATED?
|
|
0479 7E 887 LD A,(HL)
|
|
047A FE 20 888 CP #ASCSPACE
|
|
047C C2r88s04 889 JP NZ,DIRECT2
|
|
047F 06 0B 890 LD B,#11 ; NO. FILL FIELD WITH '?' - SAME AS *.*.
|
|
0481 36 3F 891 DIRECT1:LD (HL),#QUESTION
|
|
0483 23 892 INC HL
|
|
0484 05 893 DEC B
|
|
0485 C2r81s04 894 JP NZ,DIRECT1
|
|
0488 1E 00 895 DIRECT2:LD E,#0 ; SET INITIAL CURSOR POSITION.
|
|
048A D5 896 PUSH DE
|
|
048B CDrE7s00 897 CALL SRCHFCB ; GET FIRST FILE NAME.
|
|
048E CCrE0s03 898 CALL Z,NONE ; NONE FOUND AT ALL?
|
|
0491 CAr14s05 899 DIRECT3:JP Z,DIRECT9 ; TERMINATE IF NO MORE NAMES.
|
|
0494 3ArFAs07 900 LD A,(RTNCODE) ; GET FILE'S POSITION IN SEGMENT (0-3).
|
|
0497 0F 901 RRCA
|
|
0498 0F 902 RRCA
|
|
0499 0F 903 RRCA
|
|
049A E6 60 904 AND #0x60 ; (A)=POSITION*32
|
|
049C 4F 905 LD C,A
|
|
049D 3E 0A 906 LD A,#10
|
|
049F CDr41s04 907 CALL EXTRACT ; EXTRACT THE TENTH ENTRY IN FCB.
|
|
04A2 17 908 RLA ; CHECK SYSTEM FILE STATUS BIT.
|
|
04A3 DAr08s05 909 JP C,DIRECT8 ; WE DON'T LIST THEM.
|
|
04A6 D1 910 POP DE
|
|
04A7 7B 911 LD A,E ; BUMP NAME COUNT.
|
|
04A8 1C 912 INC E
|
|
04A9 D5 913 PUSH DE
|
|
04AA E6 03 914 AND #3 ; AT END OF LINE?
|
|
04AC F5 915 PUSH AF
|
|
04AD C2rC5s04 916 JP NZ,DIRECT4
|
|
04B0 CDr96s00 917 CALL CRLF ; YES, END THIS LINE AND START ANOTHER.
|
|
04B3 C5 918 PUSH BC
|
|
04B4 CDrCEs01 919 CALL GETDSK ; START LINE WITH ('A:').
|
|
04B7 C1 920 POP BC
|
|
04B8 C6 41 921 ADD A,#0x41
|
|
04BA CDr90s00 922 CALL PRINTB
|
|
04BD 3E 3A 923 LD A,#COLON
|
|
04BF CDr90s00 924 CALL PRINTB
|
|
04C2 C3rCDs04 925 JP DIRECT5
|
|
04C5 CDrA0s00 926 DIRECT4:CALL SPACE ; ADD SEPERATOR BETWEEN FILE NAMES.
|
|
04C8 3E 3A 927 LD A,#COLON
|
|
04CA CDr90s00 928 CALL PRINTB
|
|
04CD CDrA0s00 929 DIRECT5:CALL SPACE
|
|
04D0 06 01 930 LD B,#1 ; 'EXTRACT' EACH FILE NAME CHARACTER AT A TIME.
|
|
04D2 78 931 DIRECT6:LD A,B
|
|
04D3 CDr41s04 932 CALL EXTRACT
|
|
04D6 E6 7F 933 AND #0x7F ; STRIP BIT 7 (STATUS BIT).
|
|
04D8 FE 20 934 CP #ASCSPACE ; ARE WE AT THE END OF THE NAME?
|
|
04DA C2rF2s04 935 JP NZ,DRECT65
|
|
04DD F1 936 POP AF ; YES, DON'T PRINT SPACES AT THE END OF A LINE.
|
|
04DE F5 937 PUSH AF
|
|
04DF FE 03 938 CP #3
|
|
04E1 C2rF0s04 939 JP NZ,DRECT63
|
|
04E4 3E 09 940 LD A,#9 ; FIRST CHECK FOR NO EXTENSION.
|
|
04E6 CDr41s04 941 CALL EXTRACT
|
|
04E9 E6 7F 942 AND #0x7F
|
|
04EB FE 20 943 CP #ASCSPACE
|
|
04ED CAr07s05 944 JP Z,DIRECT7 ; DON'T PRINT SPACES.
|
|
04F0 3E 20 945 DRECT63:LD A,#ASCSPACE ; ELSE PRINT THEM.
|
|
04F2 CDr90s00 946 DRECT65:CALL PRINTB
|
|
04F5 04 947 INC B ; BUMP TO NEXT CHARACTER PSOITION.
|
|
04F6 78 948 LD A,B
|
|
04F7 FE 0C 949 CP #12 ; END OF THE NAME?
|
|
04F9 D2r07s05 950 JP NC,DIRECT7
|
|
04FC FE 09 951 CP #9 ; NOPE, STARTING EXTENSION?
|
|
04FE C2rD2s04 952 JP NZ,DIRECT6
|
|
0501 CDrA0s00 953 CALL SPACE ; YES, ADD SEPERATING SPACE.
|
|
0504 C3rD2s04 954 JP DIRECT6
|
|
0507 F1 955 DIRECT7:POP AF ; GET THE NEXT FILE NAME.
|
|
0508 CDrC0s01 956 DIRECT8:CALL CHKCON ; FIRST CHECK CONSOLE, QUIT ON ANYTHING.
|
|
050B C2r14s05 957 JP NZ,DIRECT9
|
|
050E CDrE2s00 958 CALL SRCHNXT ; GET NEXT NAME.
|
|
0511 C3r91s04 959 JP DIRECT3 ; AND CONTINUE WITH OUR LIST.
|
|
0514 D1 960 DIRECT9:POP DE ; RESTORE THE STACK AND RETURN TO COMMAND LEVEL.
|
|
0515 C3r92s07 961 JP GETBACK
|
|
962 ;
|
|
963 ;**************************************************************
|
|
964 ;*
|
|
965 ;* E R A S E C O M M A N D
|
|
966 ;*
|
|
967 ;**************************************************************
|
|
968 ;
|
|
0518 CDr48s02 969 ERASE: CALL CONVFST ; CONVERT FILE NAME.
|
|
051B FE 0B 970 CP #11 ; WAS '*.*' ENTERED?
|
|
051D C2r3Bs05 971 JP NZ,ERASE1
|
|
0520 01r4Bs05 972 LD BC,#YESNO ; YES, ASK FOR CONFIRMATION.
|
|
0523 CDrA5s00 973 CALL PLINE
|
|
0526 CDr37s01 974 CALL GETINP
|
|
0529 21r07s00 975 LD HL,#INBUFF+1
|
|
052C 35 976 DEC (HL) ; MUST BE EXACTLY 'Y'.
|
|
052D C2r7As03 977 JP NZ,CMMND1
|
|
0530 23 978 INC HL
|
|
0531 7E 979 LD A,(HL)
|
|
0532 FE 59 980 CP #0x59
|
|
0534 C2r7As03 981 JP NZ,CMMND1
|
|
0537 23 982 INC HL
|
|
0538 22r86s00 983 LD (INPOINT),HL ; SAVE INPUT LINE POINTER.
|
|
053B CDr4As04 984 ERASE1: CALL DSELECT ; SELECT DESIRED DISK.
|
|
053E 11rD9s07 985 LD DE,#FCB
|
|
0541 CDrEDs00 986 CALL DELETE ; DELETE THE FILE.
|
|
0544 3C 987 INC A
|
|
0545 CCrE0s03 988 CALL Z,NONE ; NOT THERE?
|
|
0548 C3r92s07 989 JP GETBACK ; RETURN TO COMMAND LEVEL NOW.
|
|
054B 41 6C 6C 20 28 59 990 YESNO: .asciz "All (Y/N)?"
|
|
2F 4E 29 3F 00
|
|
991 ;
|
|
992 ;**************************************************************
|
|
993 ;*
|
|
994 ;* T Y P E C O M M A N D
|
|
995 ;*
|
|
996 ;**************************************************************
|
|
997 ;
|
|
0556 CDr48s02 998 TYPE: CALL CONVFST ; CONVERT FILE NAME.
|
|
0559 C2rF3s01 999 JP NZ,SYNERR ; WILD CARDS NOT ALLOWED.
|
|
055C CDr4As04 1000 CALL DSELECT ; SELECT INDICATED DRIVE.
|
|
055F CDrCEs00 1001 CALL OPENFCB ; OPEN THE FILE.
|
|
0562 CArA0s05 1002 JP Z,TYPE5 ; NOT THERE?
|
|
0565 CDr96s00 1003 CALL CRLF ; OK, START A NEW LINE ON THE SCREEN.
|
|
0568 21rFDs07 1004 LD HL,#NBYTES ; INITIALIZE BYTE COUNTER.
|
|
056B 36 FF 1005 LD (HL),#0x0FF ; SET TO READ FIRST SECTOR.
|
|
056D 21rFDs07 1006 TYPE1: LD HL,#NBYTES
|
|
0570 7E 1007 TYPE2: LD A,(HL) ; HAVE WE WRITTEN THE ENTIRE SECTOR?
|
|
0571 FE 80 1008 CP #128
|
|
0573 DAr80s05 1009 JP C,TYPE3
|
|
0576 E5 1010 PUSH HL ; YES, READ IN THE NEXT ONE.
|
|
0577 CDrFCs00 1011 CALL READFCB
|
|
057A E1 1012 POP HL
|
|
057B C2r99s05 1013 JP NZ,TYPE4 ; END OR ERROR?
|
|
057E AF 1014 XOR A ; OK, CLEAR BYTE COUNTER.
|
|
057F 77 1015 LD (HL),A
|
|
0580 34 1016 TYPE3: INC (HL) ; COUNT THIS BYTE.
|
|
0581 21 80 00 1017 LD HL,#TBUFF ; AND GET THE (A)TH ONE FROM THE BUFFER (TBUFF).
|
|
0584 CDr43s02 1018 CALL ADDHL
|
|
0587 7E 1019 LD A,(HL)
|
|
0588 FE 1A 1020 CP #CNTRLZ ; END OF FILE MARK?
|
|
058A CAr92s07 1021 JP Z,GETBACK
|
|
058D CDr8As00 1022 CALL PRINT ; NO, PRINT IT.
|
|
0590 CDrC0s01 1023 CALL CHKCON ; CHECK CONSOLE, QUIT IF ANYTHING READY.
|
|
0593 C2r92s07 1024 JP NZ,GETBACK
|
|
0596 C3r6Ds05 1025 JP TYPE1
|
|
1026 ;
|
|
1027 ; GET HERE ON AN END OF FILE OR READ ERROR.
|
|
1028 ;
|
|
0599 3D 1029 TYPE4: DEC A ; READ ERROR?
|
|
059A CAr92s07 1030 JP Z,GETBACK
|
|
059D CDrCFs03 1031 CALL RDERROR ; YES, PRINT MESSAGE.
|
|
05A0 CDr5Cs04 1032 TYPE5: CALL RESETDR ; AND RESET PROPER DRIVE
|
|
05A3 C3rF3s01 1033 JP SYNERR ; NOW PRINT FILE NAME WITH PROBLEM.
|
|
1034 ;
|
|
1035 ;**************************************************************
|
|
1036 ;*
|
|
1037 ;* S A V E C O M M A N D
|
|
1038 ;*
|
|
1039 ;**************************************************************
|
|
1040 ;
|
|
05A6 CDrEEs03 1041 SAVE: CALL DECODE ; GET NUMERIC NUMBER THAT FOLLOWS SAVE.
|
|
05A9 F5 1042 PUSH AF ; SAVE NUMBER OF PAGES TO WRITE.
|
|
05AA CDr48s02 1043 CALL CONVFST ; CONVERT FILE NAME.
|
|
05AD C2rF3s01 1044 JP NZ,SYNERR ; WILD CARDS NOT ALLOWED.
|
|
05B0 CDr4As04 1045 CALL DSELECT ; SELECT SPECIFIED DRIVE.
|
|
05B3 11rD9s07 1046 LD DE,#FCB ; NOW DELETE THIS FILE.
|
|
05B6 D5 1047 PUSH DE
|
|
05B7 CDrEDs00 1048 CALL DELETE
|
|
05BA D1 1049 POP DE
|
|
05BB CDr07s01 1050 CALL CREATE ; AND CREATE IT AGAIN.
|
|
05BE CArF4s05 1051 JP Z,SAVE3 ; CAN'T CREATE?
|
|
05C1 AF 1052 XOR A ; CLEAR RECORD NUMBER BYTE.
|
|
05C2 32rF9s07 1053 LD (FCB+32),A
|
|
05C5 F1 1054 POP AF ; CONVERT PAGES TO SECTORS.
|
|
05C6 6F 1055 LD L,A
|
|
05C7 26 00 1056 LD H,#0
|
|
05C9 29 1057 ADD HL,HL ; (HL)=NUMBER OF SECTORS TO WRITE.
|
|
05CA 11 00 01 1058 LD DE,#TBASE ; AND WE START FROM HERE.
|
|
05CD 7C 1059 SAVE1: LD A,H ; DONE YET?
|
|
05CE B5 1060 OR L
|
|
05CF CArEAs05 1061 JP Z,SAVE2
|
|
05D2 2B 1062 DEC HL ; NOPE, COUNT THIS AND COMPUTE THE START
|
|
05D3 E5 1063 PUSH HL ; OF THE NEXT 128 BYTE SECTOR.
|
|
05D4 21 80 00 1064 LD HL,#128
|
|
05D7 19 1065 ADD HL,DE
|
|
05D8 E5 1066 PUSH HL ; SAVE IT AND SET THE TRANSFER ADDRESS.
|
|
05D9 CDrD6s01 1067 CALL DMASET
|
|
05DC 11rD9s07 1068 LD DE,#FCB ; WRITE OUT THIS SECTOR NOW.
|
|
05DF CDr02s01 1069 CALL WRTREC
|
|
05E2 D1 1070 POP DE ; RESET (DE) TO THE START OF THE LAST SECTOR.
|
|
05E3 E1 1071 POP HL ; RESTORE SECTOR COUNT.
|
|
05E4 C2rF4s05 1072 JP NZ,SAVE3 ; WRITE ERROR?
|
|
05E7 C3rCDs05 1073 JP SAVE1
|
|
1074 ;
|
|
1075 ; GET HERE AFTER WRITING ALL OF THE FILE.
|
|
1076 ;
|
|
05EA 11rD9s07 1077 SAVE2: LD DE,#FCB ; NOW CLOSE THE FILE.
|
|
05ED CDrD8s00 1078 CALL CLOSE
|
|
05F0 3C 1079 INC A ; DID IT CLOSE OK?
|
|
05F1 C2rFAs05 1080 JP NZ,SAVE4
|
|
1081 ;
|
|
1082 ; PRINT OUT ERROR MESSAGE (NO SPACE).
|
|
1083 ;
|
|
05F4 01r00s06 1084 SAVE3: LD BC,#NOSPACE
|
|
05F7 CDrA5s00 1085 CALL PLINE
|
|
05FA CDrD3s01 1086 SAVE4: CALL STDDMA ; RESET THE STANDARD DMA ADDRESS.
|
|
05FD C3r92s07 1087 JP GETBACK
|
|
1088
|
|
0600 4E 6F 20 53 70 61 1089 NOSPACE: .asciz "No Space"
|
|
63 65 00
|
|
1090 ;
|
|
1091 ;**************************************************************
|
|
1092 ;*
|
|
1093 ;* R E N A M E C O M M A N D
|
|
1094 ;*
|
|
1095 ;**************************************************************
|
|
1096 ;
|
|
0609 CDr48s02 1097 RENAME: CALL CONVFST ; CONVERT FIRST FILE NAME.
|
|
060C C2rF3s01 1098 JP NZ,SYNERR ; WILD CARDS NOT ALLOWED.
|
|
060F 3ArFCs07 1099 LD A,(CHGDRV) ; REMEMBER ANY CHANGE IN DRIVES SPECIFIED.
|
|
0612 F5 1100 PUSH AF
|
|
0613 CDr4As04 1101 CALL DSELECT ; AND SELECT THIS DRIVE.
|
|
0616 CDrE7s00 1102 CALL SRCHFCB ; IS THIS FILE PRESENT?
|
|
0619 C2r72s06 1103 JP NZ,RENAME6 ; YES, PRINT ERROR MESSAGE.
|
|
061C 21rD9s07 1104 LD HL,#FCB ; YES, MOVE THIS NAME INTO SECOND SLOT.
|
|
061F 11rE9s07 1105 LD DE,#FCB+16
|
|
0622 06 10 1106 LD B,#16
|
|
0624 CDr38s04 1107 CALL HL2DE
|
|
0627 2Ar86s00 1108 LD HL,(INPOINT) ; GET INPUT POINTER.
|
|
062A EB 1109 EX DE,HL
|
|
062B CDr39s02 1110 CALL NONBLANK ; GET NEXT NON BLANK CHARACTER.
|
|
062E FE 3D 1111 CP #EQUAL ; ONLY ALLOW AN '=' OR '_' SEPERATOR.
|
|
0630 CAr38s06 1112 JP Z,RENAME1
|
|
0633 FE 20 1113 CP #ASCSPACE
|
|
0635 C2r6Cs06 1114 JP NZ,RENAME5
|
|
0638 EB 1115 RENAME1:EX DE,HL
|
|
0639 23 1116 INC HL ; OK, SKIP SEPERATOR.
|
|
063A 22r86s00 1117 LD (INPOINT),HL ; SAVE INPUT LINE POINTER.
|
|
063D CDr48s02 1118 CALL CONVFST ; CONVERT THIS SECOND FILE NAME NOW.
|
|
0640 C2r6Cs06 1119 JP NZ,RENAME5 ; AGAIN, NO WILD CARDS.
|
|
0643 F1 1120 POP AF ; IF A DRIVE WAS SPECIFIED, THEN IT
|
|
0644 47 1121 LD B,A ; MUST BE THE SAME AS BEFORE.
|
|
0645 21rFCs07 1122 LD HL,#CHGDRV
|
|
0648 7E 1123 LD A,(HL)
|
|
0649 B7 1124 OR A
|
|
064A CAr52s06 1125 JP Z,RENAME2
|
|
064D B8 1126 CP B
|
|
064E 70 1127 LD (HL),B
|
|
064F C2r6Cs06 1128 JP NZ,RENAME5 ; THEY WERE DIFFERENT, ERROR.
|
|
0652 70 1129 RENAME2:LD (HL),B ; RESET AS PER THE FIRST FILE SPECIFICATION.
|
|
0653 AF 1130 XOR A
|
|
0654 32rD9s07 1131 LD (FCB),A ; CLEAR THE DRIVE BYTE OF THE FCB.
|
|
0657 CDrE7s00 1132 RENAME3:CALL SRCHFCB ; AND GO LOOK FOR SECOND FILE.
|
|
065A CAr66s06 1133 JP Z,RENAME4 ; DOESN'T EXIST?
|
|
065D 11rD9s07 1134 LD DE,#FCB
|
|
0660 CDr0Cs01 1135 CALL RENAM ; OK, RENAME THE FILE.
|
|
0663 C3r92s07 1136 JP GETBACK
|
|
1137 ;
|
|
1138 ; PROCESS RENAME ERRORS HERE.
|
|
1139 ;
|
|
0666 CDrE0s03 1140 RENAME4:CALL NONE ; FILE NOT THERE.
|
|
0669 C3r92s07 1141 JP GETBACK
|
|
066C CDr5Cs04 1142 RENAME5:CALL RESETDR ; BAD COMMAND FORMAT.
|
|
066F C3rF3s01 1143 JP SYNERR
|
|
0672 01r7Bs06 1144 RENAME6:LD BC,#EXISTS ; DESTINATION FILE ALREADY EXISTS.
|
|
0675 CDrA5s00 1145 CALL PLINE
|
|
0678 C3r92s07 1146 JP GETBACK
|
|
067B 46 69 6C 65 20 45 1147 EXISTS: .asciz "File Exists"
|
|
78 69 73 74 73 00
|
|
1148 ;
|
|
1149 ;**************************************************************
|
|
1150 ;*
|
|
1151 ;* U S E R C O M M A N D
|
|
1152 ;*
|
|
1153 ;**************************************************************
|
|
1154 ;
|
|
0687 CDrEEs03 1155 USER: CALL DECODE ; GET NUMERIC VALUE FOLLOWING COMMAND.
|
|
068A FE 10 1156 CP #16 ; LEGAL USER NUMBER?
|
|
068C D2rF3s01 1157 JP NC,SYNERR
|
|
068F 5F 1158 LD E,A ; YES BUT IS THERE ANYTHING ELSE?
|
|
0690 3ArDAs07 1159 LD A,(FCB+1)
|
|
0693 FE 20 1160 CP #ASCSPACE
|
|
0695 CArF3s01 1161 JP Z,SYNERR ; YES, THAT IS NOT ALLOWED.
|
|
0698 CDr13s01 1162 CALL GETSETUC ; OK, SET USER CODE.
|
|
069B C3r95s07 1163 JP GETBACK1
|
|
1164 ;
|
|
1165 ;**************************************************************
|
|
1166 ;*
|
|
1167 ;* T R A N S I A N T P R O G R A M C O M M A N D
|
|
1168 ;*
|
|
1169 ;**************************************************************
|
|
1170 ;
|
|
069E 3ArDAs07 1171 UNKNOWN:LD A,(FCB+1) ; ANYTHING TO EXECUTE?
|
|
06A1 FE 20 1172 CP #ASCSPACE
|
|
06A3 C2rBAs06 1173 JP NZ,UNKWN1
|
|
06A6 3ArFCs07 1174 LD A,(CHGDRV) ; NOPE, ONLY A DRIVE CHANGE?
|
|
06A9 B7 1175 OR A
|
|
06AA CAr95s07 1176 JP Z,GETBACK1 ; NEITHER???
|
|
06AD 3D 1177 DEC A
|
|
06AE 32rFBs07 1178 LD (CDRIVE),A ; OK, STORE NEW DRIVE.
|
|
06B1 CDr27s01 1179 CALL MOVECD ; SET (TDRIVE) ALSO.
|
|
06B4 CDrBBs00 1180 CALL DSKSEL ; AND SELECT THIS DRIVE.
|
|
06B7 C3r95s07 1181 JP GETBACK1 ; THEN RETURN.
|
|
1182 ;
|
|
1183 ; HERE A FILE NAME WAS TYPED. PREPARE TO EXECUTE IT.
|
|
1184 ;
|
|
06BA 11rE2s07 1185 UNKWN1: LD DE,#FCB+9 ; AN EXTENSION SPECIFIED?
|
|
06BD 1A 1186 LD A,(DE)
|
|
06BE FE 20 1187 CP #ASCSPACE
|
|
06C0 C2rF3s01 1188 JP NZ,SYNERR ; YES, NOT ALLOWED.
|
|
06C3 D5 1189 UNKWN2: PUSH DE
|
|
06C4 CDr4As04 1190 CALL DSELECT ; SELECT SPECIFIED DRIVE.
|
|
06C7 D1 1191 POP DE
|
|
06C8 21r8Fs07 1192 LD HL,#COMFILE ; SET THE EXTENSION TO 'COM'. LD HL,COMFILE
|
|
06CB CDr36s04 1193 CALL MOVE3 ; move 3 bytes from (HL) to (DE) to add .COM
|
|
06CE CDrCEs00 1194 CALL OPENFCB ; AND OPEN THIS FILE.
|
|
06D1 C2rEAs06 1195 JP NZ,UNKWNA ;GOT IT
|
|
0001 1196 .IF CHKU0B
|
|
06D4 1E 00 1197 LD E,#0 ;TRY USER 0, THIS DRIVE
|
|
06D6 CDr13s01 1198 CALL GETSETUC ; OK, SET USER CODE.
|
|
06D9 CDrCEs00 1199 CALL OPENFCB
|
|
06DC C2rEAs06 1200 JP NZ,UNKWNA ;GOT IT
|
|
06DF 21rD9s07 1201 LD HL,#FCB ;SEE IF ON DRIVE B, USER 0
|
|
06E2 36 02 1202 LD (HL),#2
|
|
06E4 CDrCEs00 1203 CALL OPENFCB
|
|
06E7 CAr77s07 1204 JP Z,UNKWN9 ;NOPE
|
|
1205 .ENDIF
|
|
1206 ;
|
|
1207 ; LOAD IN THE PROGRAM.
|
|
1208 ;
|
|
06EA 21 00 01 1209 UNKWNA: LD HL,#TBASE ; STORE THE PROGRAM STARTING HERE.
|
|
06ED E5 1210 UNKWN3: PUSH HL
|
|
06EE EB 1211 EX DE,HL
|
|
06EF CDrD6s01 1212 CALL DMASET ; SET TRANSFER ADDRESS.
|
|
06F2 11rD9s07 1213 LD DE,#FCB ; AND READ THE NEXT RECORD.
|
|
06F5 CDrF7s00 1214 CALL RDREC
|
|
06F8 C2r0Ds07 1215 JP NZ,UNKWN4 ; END OF FILE OR READ ERROR?
|
|
06FB E1 1216 POP HL ; NOPE, BUMP POINTER FOR NEXT SECTOR.
|
|
06FC 11 80 00 1217 LD DE,#128
|
|
06FF 19 1218 ADD HL,DE
|
|
0700 11r00s00 1219 LD DE,#CBASE ; ENOUGH ROOM FOR THE WHOLE FILE?
|
|
0703 7D 1220 LD A,L
|
|
0704 93 1221 SUB E
|
|
0705 7C 1222 LD A,H
|
|
0706 9A 1223 SBC A,D
|
|
0707 D2r7Ds07 1224 JP NC,UNKWN0 ; NO, IT CAN'T FIT.
|
|
070A C3rEDs06 1225 JP UNKWN3
|
|
1226 ;
|
|
1227 ; GET HERE AFTER FINISHED READING.
|
|
1228 ;
|
|
070D E1 1229 UNKWN4: POP HL
|
|
070E 3D 1230 DEC A ; NORMAL END OF FILE?
|
|
070F C2r7Ds07 1231 JP NZ,UNKWN0
|
|
0712 CDr5Cs04 1232 CALL RESETDR ; YES, RESET PREVIOUS DRIVE.
|
|
0715 CDr48s02 1233 CALL CONVFST ; CONVERT THE FIRST FILE NAME THAT FOLLOWS
|
|
0718 21rFCs07 1234 LD HL,#CHGDRV ; COMMAND NAME.
|
|
071B E5 1235 PUSH HL
|
|
071C 7E 1236 LD A,(HL) ; SET DRIVE CODE IN DEFAULT FCB.
|
|
071D 32rD9s07 1237 LD (FCB),A
|
|
0720 3E 10 1238 LD A,#16 ; PUT SECOND NAME 16 BYTES LATER.
|
|
0722 CDr4As02 1239 CALL CONVERT ; CONVERT SECOND FILE NAME.
|
|
0725 E1 1240 POP HL
|
|
0726 7E 1241 LD A,(HL) ; AND SET THE DRIVE FOR THIS SECOND FILE.
|
|
0727 32rE9s07 1242 LD (FCB+16),A
|
|
072A AF 1243 XOR A ; CLEAR RECORD BYTE IN FCB.
|
|
072B 32rF9s07 1244 LD (FCB+32),A
|
|
072E 11 5C 00 1245 LD DE,#TFCB ; MOVE IT INTO PLACE AT(005CH).
|
|
0731 21rD9s07 1246 LD HL,#FCB
|
|
0734 06 21 1247 LD B,#33
|
|
0736 CDr38s04 1248 CALL HL2DE
|
|
0739 21r08s00 1249 LD HL,#INBUFF+2 ; NOW MOVE THE REMAINDER OF THE INPUT
|
|
073C 7E 1250 UNKWN5: LD A,(HL) ; LINE DOWN TO (0080H). LOOK FOR A NON BLANK.
|
|
073D B7 1251 OR A ; OR A NULL.
|
|
073E CAr4As07 1252 JP Z,UNKWN6
|
|
0741 FE 20 1253 CP #ASCSPACE
|
|
0743 CAr4As07 1254 JP Z,UNKWN6
|
|
0746 23 1255 INC HL
|
|
0747 C3r3Cs07 1256 JP UNKWN5
|
|
1257 ;
|
|
1258 ; DO THE LINE MOVE NOW. IT ENDS IN A NULL BYTE.
|
|
1259 ;
|
|
074A 06 00 1260 UNKWN6: LD B,#0 ; KEEP A CHARACTER COUNT.
|
|
074C 11 81 00 1261 LD DE,#TBUFF+1 ; DATA GETS PUT HERE.
|
|
074F 7E 1262 UNKWN7: LD A,(HL) ; MOVE IT NOW.
|
|
0750 12 1263 LD (DE),A
|
|
0751 B7 1264 OR A
|
|
0752 CAr5Bs07 1265 JP Z,UNKWN8
|
|
0755 04 1266 INC B
|
|
0756 23 1267 INC HL
|
|
0757 13 1268 INC DE
|
|
0758 C3r4Fs07 1269 JP UNKWN7
|
|
075B 78 1270 UNKWN8: LD A,B ; NOW STORE THE CHARACTER COUNT.
|
|
075C 32 80 00 1271 LD (TBUFF),A
|
|
075F CDr96s00 1272 CALL CRLF ; CLEAN UP THE SCREEN.
|
|
0762 CDrD3s01 1273 CALL STDDMA ; SET STANDARD TRANSFER ADDRESS.
|
|
0765 CDr18s01 1274 CALL SETCDRV ; RESET CURRENT DRIVE.
|
|
0768 CD 00 01 1275 CALL TBASE ; AND EXECUTE THE PROGRAM.
|
|
1276 ;
|
|
1277 ; TRANSIANT PROGRAMS RETURN HERE (OR REBOOT).
|
|
1278 ;
|
|
076B 31rB7s07 1279 LD SP,#BATCH ; SET STACK FIRST OFF.
|
|
076E CDr27s01 1280 CALL MOVECD ; MOVE CURRENT DRIVE INTO PLACE (TDRIVE).
|
|
0771 CDrBBs00 1281 CALL DSKSEL ; AND RESELECT IT.
|
|
0774 C3r7As03 1282 JP CMMND1 ; BACK TO COMAND MODE.
|
|
1283 ;
|
|
1284 ; GET HERE IF SOME ERROR OCCURED.
|
|
1285 ;
|
|
0777 CDr5Cs04 1286 UNKWN9: CALL RESETDR ; INPROPER FORMAT.
|
|
077A C3rF3s01 1287 JP SYNERR
|
|
077D 01r86s07 1288 UNKWN0: LD BC,#BADLOAD ; READ ERROR OR WON'T FIT.
|
|
0780 CDrA5s00 1289 CALL PLINE
|
|
0783 C3r92s07 1290 JP GETBACK
|
|
0786 42 61 64 20 4C 6F 1291 BADLOAD:.asciz "Bad Load"
|
|
61 64 00
|
|
078F 43 4F 4D 1292 COMFILE:.ascii "COM" ; COMMAND FILE EXTENSION.
|
|
1293 ;
|
|
1294 ; GET HERE TO RETURN TO COMMAND LEVEL. WE WILL RESET THE
|
|
1295 ; PREVIOUS ACTIVE DRIVE AND THEN EITHER RETURN TO COMMAND
|
|
1296 ; LEVEL DIRECTLY OR PRINT ERROR MESSAGE AND THEN RETURN.
|
|
1297 ;
|
|
0792 CDr5Cs04 1298 GETBACK:CALL RESETDR ; RESET PREVIOUS DRIVE.
|
|
0795 1299 GETBACK1:
|
|
0795 CDr48s02 1300 CALL CONVFST ; CONVERT FIRST NAME IN (FCB).
|
|
0798 3ArDAs07 1301 LD A,(FCB+1) ; IF THIS WAS JUST A DRIVE CHANGE R.EQUEST,
|
|
079B D6 20 1302 SUB #ASCSPACE ; MAKE SURE IT WAS VALID.
|
|
079D 21rFCs07 1303 LD HL,#CHGDRV
|
|
07A0 B6 1304 OR (HL)
|
|
07A1 C2rF3s01 1305 JP NZ,SYNERR
|
|
07A4 C3r7As03 1306 JP CMMND1 ; OK, RETURN TO COMMAND LEVEL.
|
|
1307 ;
|
|
1308 ; CCP STACK AREA.
|
|
1309 ;
|
|
07A7 00 00 00 00 00 00 1310 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
00 00 00 00 00 00
|
|
00 00 00 00
|
|
07B7 1311 CCPSTACK:
|
|
1312 ;dwg; .EQU $ ;END OF CCP STACK AREA.
|
|
1313
|
|
1314 ;
|
|
1315 ; BATCH (OR SUBMIT) PROCESSING INFORMATION STORAGE.
|
|
1316 ;
|
|
07B7 00 1317 BATCH: .DB 0 ; BATCH MODE FLAG (0=NOT ACTIVE).
|
|
07B8 00 1318 BATCHFCB:.DB 0
|
|
07B9 24 24 24 20 20 20 1319 .ascii "$$$ SUB"
|
|
20 20 53 55 42
|
|
07C4 00 00 00 00 00 00 1320 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
00 00 00 00 00 00
|
|
00 00 00 00 00 00
|
|
00 00 00
|
|
1321 ;
|
|
1322 ; FILE CONTROL BLOCK SETUP BY THE CCP.
|
|
1323 ;
|
|
07D9 00 1324 FCB: .DB 0
|
|
07DA 20 20 20 20 20 20 1325 .asciz " "
|
|
20 20 20 20 20 00
|
|
07E6 00 00 00 00 1326 .DB 0,0,0,0
|
|
1327
|
|
07EA 20 20 20 20 20 20 1328 .asciz " "
|
|
20 20 20 20 20 00
|
|
07F6 00 00 00 00 1329 .DB 0,0,0,0
|
|
1330
|
|
07FA 00 1331 RTNCODE:.DB 0 ; STATUS RETURNED FROM BDOS CALL.
|
|
07FB 00 1332 CDRIVE: .DB 0 ; CURRENTLY ACTIVE DRIVE.
|
|
07FC 00 1333 CHGDRV: .DB 0 ; CHANGE IN DRIVES FLAG (0=NO CHANGE).
|
|
07FD 00 00 1334 NBYTES: .DW 0 ; BYTE COUNTER USED BY TYPE.
|
|
1335
|
|
1336 ;dwg; .IF ENDFIL
|
|
1337 ;dwg; .ORG CCPO+07FFH
|
|
1338 ;dwg; .DB 055H
|
|
1339 ;dwg; .ENDIF
|
|
1340 ;dwg; .END
|
|
1341
|
|
1342
|
|
07FF 1343 _ccp_end::
|
|
1344 .area _CODE
|
|
1345 .area _CABS
|
|
|