[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/11/99 21:41:08 SYS11 - LS-DOS 6.2 Page 00001 00001 ;SYS11/ASM - LS-DOS 6.2 00002 *MOD 00004 ; 000A 00005 LF EQU 10 000D 00006 CR EQU 13 00007 *LIST OFF ;Get SYS0/EQU 00323 *LIST ON 0000 00324 *GET COPYCOM:3 ;Copyright message 00325 ; COPYCOM - File for Copyright COMment block 00326 ; 0000 00327 *GET BUILDVER/ASM:3 00328 ; 00329 ; Buildver/asm is a bit of a kludge since not all utilities can load 00330 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00331 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00332 ; for programs that can use that. 00333 ; FFFF 00334 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00335 ; These switches activate patches made since the 1B release. 00336 ; It is important that all earlier patches be enabled when a higher 00337 ; patch is enabled. 00338 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00339 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00340 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00341 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00342 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00343 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00344 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00345 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00346 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00347 ; 00348 ;End of BUILDVER/ASM 00349 IF @BLD631 00351 ELSE 00352 COM '<*(C) 1982,3,4,6 by LSI*>' 00353 ENDIF 00354 ; 1E00 00355 ORG 1E00H 00356 ; 1E00 E670 00357 SYS11 AND 70H 1E02 C8 00358 RET Z ;Back on zero entry 1E03 E5 00359 PUSH HL 1E04 217400 00360 LD HL,KFLAG$ ;Reset the1E07 CB96 00361 RES 2,(HL) ; bit every time 1E09 E1 00362 POP HL 1E0A FE20 00363 CP 20H ;New @EXIT? 1E0C 2847 00364 JR Z,NEWEXIT 1E0E FE40 00365 CP 40H ;New keyboard request 1E10 CAD61E 00366 JP Z,KEYREQ ; after input of a line? 1E13 FE50 00367 CP 50H ;//INPUT followup 1E15 CABA20 00368 JP Z,GETKEY 1E18 FE10 00369 CP 10H ;Initial entry to DO? 1E1A C0 00370 RET NZ 00371 ; 00372 ; initialization of sysres hooks 00373 ; 1E1B F3 00374 DI ;Clock off for now 1E1C 217400 00375 LD HL,KFLAG$ ;Reset break bit only on 1E1F CB86 00376 RES 0,(HL) ; initial entry 1E21 217C00 00377 LD HL,SFLAG$ 1E24 CB6E 00378 BIT 5,(HL) ;If DO already in effect 1E26 CBEE 00379 SET 5,(HL) ; don't rehook 1E28 2005 00380 JR NZ,IPLDO1 1E2A 3EAD 00381 LD A,0ADH ;Change @EXIT,@ABORT to use 1E2C 320C1B 00382 LD (@EXIT+1),A ; SYS11 rather than SYS1 1E2F 318003 00383 IPLDO1 LD SP,STACK$ 1E32 FB 00384 EI ;Clock back on 1E33 11C000 00385 LD DE,JFCB$ ;At end of SYSTEM/JCL? 1E36 CD8F15 00386 CALL @CKEOF 1E39 C20F1B 00387 JP NZ,@ERROR 1E3C 114F1E 00388 LD DE,IPLDO2 ;Init JCLCB$ 1E3F ED530402 00389 LD (JCLCB$+1),DE 1E43 CD771E 00390 CALL GETLINE ;Get a line from the file 1E46 11A919 00391 LD DE,@DOKEY ;Change vector to SYS11, 1E49 ED530402 00392 LD (JCLCB$+1),DE ; entry 4 1E4D 1825 00393 JR $?1 ;Go interpret it 1E4F 11C000 00394 IPLDO2 LD DE,JFCB$ ;JCLCB$ input routine 1E52 C33806 00395 JP @GET 00396 ; 00397 ; New @EXIT processing 00398 ; 1E55 318003 00399 NEWEXIT LD SP,STACK$ ;Reset the stack 1E58 FB 00400 EI 1E59 7C 00401 LD A,H ;Ck for error return 1E5A B5 00402 OR L 1E5B 2023 00403 JR NZ,ABORT 1E5D 217C00 00404 LD HL,SFLAG$ 1E60 CB66 00405 BIT 4,(HL) ;BREAK key disabled? 1E62 2005 00406 JR NZ,NEWEX1 1E64 CD5305 00407 CALL @CKBRKC ;Check on 1E67 2017 00408 JR NZ,ABORT 1E69 11C000 00409 NEWEX1 LD DE,JFCB$ ;Exit if end of JCL 1E6C CD8F15 00410 CALL @CKEOF 1E6F 2041 00411 JR NZ,EXIT 1E71 CD771E 00412 CALL GETLINE ;Grab a JCL line 1E74 C37E19 00413 $?1 JP @CMNDI 1E77 212004 00414 GETLINE LD HL,INBUF$ ;Pt to line buffer 1E7A 01004F 00415 LD BC,79<8 ;Max 79 chars 1E7D C38505 00416 JP @KEYIN 00417 ; 00418 ; New ABORT processor 00419 ; 1E80 216821 00420 ABORT LD HL,ABORT$ ;"Job abort... 1E83 11081B 00421 LD DE,@ABORT 1E86 1830 00422 JR EXIT1 00423 ; 00424 ; Scan for ENTER or BREAK 00425 ; 1E88 3A7C00 00426 KSCN LD A,(SFLAG$) ;Only test BREAK if 1E8B CB67 00427 BIT 4,A ; BREAK key enabled 1E8D 3A7400 00428 LD A,(KFLAG$) 1E90 2004 00429 JR NZ,KSCN1 1E92 CB47 00430 BIT 0,A ;BREAK detected? 1E94 20EA 00431 JR NZ,ABORT 1E96 CB57 00432 KSCN1 BIT 2,A ;Test 1E98 C8 00433 RET Z ;Back if not 1E99 CD3506 00434 KSCN2 CALL @KBD ;Clear the type ahead 1E9C 28FB 00435 JR Z,KSCN2 1E9E 217400 00436 LD HL,KFLAG$ ;Reset the ENTER bit 1EA1 CB96 00437 RES 2,(HL) 1EA3 C5 00438 PUSH BC 1EA4 060B 00439 LD B,3000<-8 1EA6 CD8203 00440 CALL @PAUSE 1EA9 C1 00441 POP BC 1EAA 7E 00442 LD A,(HL) ;Don't return until clear 1EAB E604 00443 AND 4 1EAD EE04 00444 XOR 4 1EAF 28E8 00445 JR Z,KSCN2 1EB1 C9 00446 RET 00447 ; 00448 ; Continuation of EXIT processing 00449 ; 1EB2 217421 00450 EXIT LD HL,JOBDUN$ ;"Job done... 1EB5 110B1B 00451 LD DE,@EXIT 1EB8 D5 00452 EXIT1 PUSH DE 1EB9 CD0005 00453 CALL @LOGOT ;Log & fall thru 00454 ; 00455 ; Turn off the DO processor 00456 ; 1EBC 00457 DOOFF EQU $ 1EBC F3 00458 DI 1EBD 217C00 00459 LD HL,SFLAG$ ;Reset flag 1EC0 CBAE 00460 RES 5,(HL) 1EC2 AF 00461 XOR A 1EC3 32C000 00462 LD (JFCB$),A ;Show fcb is closed 1EC6 67 00463 LD H,A ;Set = 0 for @EXIT 1EC7 6F 00464 LD L,A 1EC8 110802 00465 LD DE,KIDCB$ ;Clear any type ahead 1ECB 3E03 00466 LD A,3 1ECD CD2306 00467 CALL @CTL ; buffer (no streaming) 1ED0 3E93 00468 LD A,93H ;Restore @EXIT SVC 1ED2 320C1B 00469 LD (@EXIT+1),A ; back to SYS1 1ED5 C9 00470 RET 00471 ; 00472 ; Keyboard request processor 00473 ; 1ED6 210A00 00474 KEYREQ LD HL,10 ;Back stack up 5 words 1ED9 39 00475 ADD HL,SP ;SYS0,RET,DE,HL,IX,BC 1EDA 4E 00476 LD C,(HL) ;Get contents of BC 1EDB 23 00477 INC HL ; prior to keyboard 1EDC 46 00478 LD B,(HL) ; request & DRIVER save 00479 ; 00480 ; @KEYIN is requesting an entire line 00481 ; 1EDD 11C000 00482 KEYLINE LD DE,JFCB$ ;Ck on end of JCL file 1EE0 C5 00483 PUSH BC 1EE1 CD8F15 00484 CALL @CKEOF 1EE4 C1 00485 POP BC 1EE5 20CB 00486 JR NZ,EXIT 1EE7 78 00487 LD A,B ;Do we need to re-read 1EE8 B9 00488 CP C ; the JCL sector? 1EE9 C23806 00489 JP NZ,@GET 1EEC CD9A14 00490 CALL @RREAD ;Get the sector back 1EEF C20F1B 00491 JP NZ,@ERROR 1EF2 CD3806 00492 CALL @GET 1EF5 B7 00493 OR A 1EF6 28BA 00494 JR Z,EXIT 1EF8 FE2F 00495 CP '/' ;Is this line execution 1EFA 2802 00496 JR Z,GOTSLSH ; JCL code to parse? 1EFC BF 00497 CP A ;Set Z-flag 1EFD C9 00498 RET 00499 ; 00500 ; Found an execution code line 00501 ; 1EFE C5 00502 GOTSLSH PUSH BC 1EFF D5 00503 PUSH DE 00504 IF @BLD631G 1F00 0650 00505 LD B,80 ;<631G>Only 79+CR char line 00506 ELSE 00507 LD B,79 ;Only 79 char line 00508 ENDIF 1F02 212004 00509 LD HL,INBUF$ ;Get rest of line 1F05 E5 00510 PUSH HL ; into JCL buffer 1F06 77 00511 GOTSL1 LD (HL),A ;Compare for CR as end 1F07 23 00512 INC HL ; of line 1F08 FE0D 00513 CP CR 1F0A 2807 00514 JR Z,GOTSL2 1F0C CD3806 00515 CALL @GET ;Get a character 1F0F 10F5 00516 DJNZ GOTSL1 ; up to 79 max 1F11 183F 00517 JR BADJCL ;Line too long 1F13 E1 00518 GOTSL2 POP HL ;Rcvr pointer to buf 1F14 E5 00519 PUSH HL 1F15 23 00520 INC HL ;Pt to 2nd char 1F16 7E 00521 LD A,(HL) 1F17 FE2F 00522 CP '/' ;Found a //? 1F19 2032 00523 JR NZ,REKEY2 1F1B 23 00524 INC HL ;Ck on /// 1F1C 96 00525 SUB (HL) 1F1D CAC71F 00526 JP Z,KEYIN6 ;Jump if /// 1F20 D6F6 00527 SUB 0F6H 1F22 D2C31F 00528 JP NC,KEYIN5 ;Jump if 3rd char is 0-9 1F25 E3 00529 EX (SP),HL ;P/u start of command 1F26 CD0305 00530 CALL @LOGER ; line & log it 1F29 E3 00531 EX (SP),HL 1F2A 7E 00532 GOTSL3 LD A,(HL) ;Was char ENTER? 1F2B FE0D 00533 CP CR 1F2D 281E 00534 JR Z,REKEY2 1F2F FE20 00535 CP ' ' ;Ignore leading spaces 1F31 23 00536 INC HL 1F32 28F6 00537 JR Z,GOTSL3 1F34 2B 00538 DEC HL 1F35 115921 00539 LD DE,LILBUF ;Put possible parm -> buf 1F38 0605 00540 LD B,5 ;Max length of parm 1F3A CDCE20 00541 CALL PARSER ;Parse parm 1F3D 200E 00542 JR NZ,REKEY2 1F3F 115921 00543 LD DE,LILBUF 1F42 017D21 00544 LD BC,PARMTBL ;Is the parm a macro? 1F45 CD1721 00545 CALL FNDPARM 1F48 2003 00546 JR NZ,REKEY2 ;Bypass if not in tbl 1F4A D5 00547 PUSH DE ;Stack routine's entry 1F4B C9 00548 RET ; & go to it 1F4C C1 00549 REKEY1 POP BC 1F4D E1 00550 REKEY2 POP HL 1F4E D1 00551 POP DE 1F4F C1 00552 POP BC 1F50 188B 00553 JR KEYLINE 1F52 215F21 00554 BADJCL LD HL,BADJCL$ ;"invalid JCL... 1F55 C3831E 00555 JP ABORT+3 00556 ; 00557 ; Process //STOP 00558 ; 1F58 CDBC1E 00559 STOP CALL DOOFF ;Turn off DO proc 1F5B E1 00560 POP HL 1F5C D1 00561 POP DE 1F5D C1 00562 POP BC 1F5E FB 00563 EI 1F5F C32806 00564 JP @KEY ;Go back to keyboard 00565 ; 00566 ; Process //DELAY 00567 ; 1F62 E3 00568 DELAY EX (SP),HL ;Pt to //delay line 1F63 CD2D05 00569 CALL @DSPLY ; and display it 1F66 E3 00570 EX (SP),HL 1F67 CDE103 00571 CALL @DECHEX ;Cvrt entry to binary 1F6A 41 00572 LD B,C ;Set count 1F6B CD2220 00573 DELAY1 CALL SILEN1 ;Delay a bit 1F6E 10FB 00574 DJNZ DELAY1 1F70 18DB 00575 JR REKEY2 00576 ; 00577 ; Process //PAUSE 00578 ; 1F72 E1 00579 PAUSE POP HL ;Display "pause.. 1F73 E5 00580 PUSH HL 1F74 CD2D05 00581 CALL @DSPLY 1F77 CD881E 00582 PAUSE1 CALL KSCN ;Loop for BREAK or ENTER 1F7A 28FB 00583 JR Z,PAUSE1 00584 IF @BLD631 00585 REKEY22 00586 ENDIF 1F7C 18CF 00587 JR REKEY2 00588 ; 00589 ; Process //KEYIN 00590 ; 1F7E E1 00591 KEYIN POP HL ;Rcvr pointer to "KEYIN 1F7F E5 00592 PUSH HL 1F80 7E 00593 KEYIN1 LD A,(HL) ;Display JCL command line 1F81 23 00594 INC HL 1F82 FE0D 00595 CP CR 1F84 2805 00596 JR Z,KEYIN2 1F86 CD4206 00597 CALL @DSP 1F89 18F5 00598 JR KEYIN1 1F8B CD2806 00599 KEYIN2 CALL @KEY ;Get & display the char 1F8E CD4206 00600 CALL @DSP 1F91 32C41F 00601 LD (KEYIN5+1),A ;Stuff for compare 1F94 3E0D 00602 LD A,CR 1F96 CD4206 00603 CALL @DSP ;Write new line 1F99 E1 00604 KEYIN3 POP HL 1F9A E5 00605 PUSH HL 1F9B 11C000 00606 LD DE,JFCB$ ;Ck for end of JCL 1F9E CD8F15 00607 CALL @CKEOF 1FA1 C2B21E 00608 JP NZ,EXIT 00609 KEYIN4 00610 IF @BLD631 00611 IF @BLD631G 1FA4 0650 00612 LD B,80 ;<631G> 00613 ELSE 00614 LD B,79 ;<631> 00615 ENDIF 00616 KEYIN4B 00617 ENDIF 1FA6 CD3806 00618 CALL @GET ;Xfer a line of JCL 1FA9 77 00619 LD (HL),A ; to buffer 1FAA 23 00620 INC HL 1FAB FE0D 00621 CP CR 00622 IF @BLD631 1FAD 2804 00623 JR Z,KEYIN4A ;<631> 1FAF 10F5 00624 DJNZ KEYIN4B ;<631> 1FB1 189F 00625 JR BADJCL ;<631> 00626 KEYIN4A 00627 ELSE 00628 JR NZ,KEYIN4 00629 ENDIF 1FB3 E1 00630 POP HL 1FB4 E5 00631 PUSH HL 1FB5 7E 00632 LD A,(HL) ;Look for // to find 1FB6 FE2F 00633 CP '/' ;Start of procedure block 1FB8 20DF 00634 JR NZ,KEYIN3 1FBA 23 00635 INC HL 1FBB BE 00636 CP (HL) ;//? 1FBC 20DB 00637 JR NZ,KEYIN3 1FBE 23 00638 INC HL ;Point to proc label 1FBF 96 00639 SUB (HL) ;Is label a '/' noting 1FC0 2805 00640 JR Z,KEYIN6 ; exec phase cond's end? 1FC2 7E 00641 LD A,(HL) ;Nope, get proc label 1FC3 FE00 00642 KEYIN5 CP 0 ;Same as key entry? 1FC5 20D2 00643 JR NZ,KEYIN3 ;No match? check next one 1FC7 32C41F 00644 KEYIN6 LD (KEYIN5+1),A ;Stuff 0 if /// 1FCA E1 00645 POP HL 1FCB E5 00646 PUSH HL 1FCC CD0305 00647 CALL @LOGER ;Log the command 00648 IF @BLD631 1FCF 18AB 00649 JR REKEY22 ;<631> 00650 ELSE 00651 JR REKEY2 00652 ENDIF 00653 ; 00654 ; Process //ALERT 00655 ; 1FD1 AF 00656 ALERT XOR A 1FD2 320120 00657 LD (ALERT4+1),A ;Start with clean flag 1FD5 7E 00658 ALERT1 LD A,(HL) ;Ignore spaces 1FD6 23 00659 INC HL 1FD7 FE20 00660 CP ' ' 1FD9 28FA 00661 JR Z,ALERT1 1FDB FE2C 00662 CP ',' ;Comma separator? 1FDD 28F6 00663 JR Z,ALERT1 1FDF FE0D 00664 CP CR ;End of line? 1FE1 CA4D1F 00665 JP Z,REKEY2 1FE4 FE29 00666 CP ')' ;Closing paren? 1FE6 2809 00667 JR Z,ALERT2 1FE8 FE28 00668 CP '(' ;Start of parms? 1FEA 200F 00669 JR NZ,ALERT3 ;If none of the above... 1FEC 22F21F 00670 LD (ALERT2+1),HL ;Save ptr to parm start 1FEF 18E4 00671 JR ALERT1 00672 ; 00673 ; Check here when closing parm received 00674 ; 1FF1 210000 00675 ALERT2 LD HL,0 ;P/u ptr to '(' if there 1FF4 7C 00676 LD A,H ;If the //ALERT1 started 1FF5 B5 00677 OR L ; with a '(', then 1FF6 20DD 00678 JR NZ,ALERT1 ; repeat the parm 1FF8 C3521F 00679 JP BADJCL ; parsing else exit 00680 ; 00681 ; Assumed integer parm found 00682 ; 1FFB 2B 00683 ALERT3 DEC HL ;Backup pointer 1FFC CDE103 00684 CALL @DECHEX ;Cvrt value to binary 1FFF 41 00685 LD B,C ;Keep value as counter 2000 3E00 00686 ALERT4 LD A,0 ;Flip flag: entries 1, 3, 2002 EEFF 00687 XOR 0FFH ; 5, ... are noise, 2, 2004 320120 00688 LD (ALERT4+1),A ; 4, 6, ... are silence 2007 4F 00689 LD C,A 2008 CB41 00690 BIT 0,C ;Test noise or silence 200A C49203 00691 CALL NZ,@SOUND ;Call for sound out 200D CB41 00692 BIT 0,C ; then test again 200F CC1A20 00693 CALL Z,SILENCE ;Silence is golden 2012 CD881E 00694 CALL KSCN ;Ck BREAK or ENTER 2015 C24D1F 00695 JP NZ,REKEY2 ;Go on enter 2018 18BB 00696 JR ALERT1 ;Loop if not 00697 ; 00698 ; Silence routine 00699 ; 201A B0 00700 SILENCE OR B ;A was zero 201B C8 00701 RET Z 201C CD2220 00702 CALL SILEN1 ;Delay a bit 201F 10F9 00703 DJNZ SILENCE ; for duration 2021 C9 00704 RET 2022 C5 00705 SILEN1 PUSH BC ;Delay for 0.1 sec 2023 019B19 00706 LD BC,6555 2026 CD8203 00707 CALL @PAUSE 2029 C1 00708 POP BC 202A C9 00709 RET 00710 ; 00711 ; Process //FLASH 00712 ; 202B CDE103 00713 FLASH CALL @DECHEX 202E 41 00714 LD B,C ;P/u the flash count 202F E1 00715 POP HL 2030 E5 00716 PUSH HL 2031 C5 00717 FLASH1 PUSH BC 2032 CD2D05 00718 CALL @DSPLY ;Display the prompt 2035 010040 00719 LD BC,4000H ;Countdown to flash msg 2038 CD881E 00720 FLASH2 CALL KSCN ;Keep testing 203B C24C1F 00721 JP NZ,REKEY1 ; key during countdown 203E 0B 00722 DEC BC ;BREAK would abort 203F 78 00723 LD A,B 2040 B1 00724 OR C 2041 20F5 00725 JR NZ,FLASH2 ;Loop until count=0 2043 3E1B 00726 LD A,27 ;Erase the message line 2045 CD4206 00727 CALL @DSP 2048 3E1E 00728 LD A,30 204A CD4206 00729 CALL @DSP 204D CD2220 00730 CALL SILEN1 ;Delay while blanked 2050 C1 00731 POP BC 2051 10DE 00732 DJNZ FLASH1 2053 C34D1F 00733 FLASH3 JP REKEY2 00734 ; 00735 ; Process //SLEEP and //WAIT 00736 ; 2056 3E 00737 SLEEP DB 3EH ;Make it LD A,0AFH 2057 AF 00738 WAIT XOR A 2058 327720 00739 LD (SLPWT+1),A ;Save entry state 205B E3 00740 EX (SP),HL ;Display the JCL line 205C CD2D05 00741 CALL @DSPLY 205F E3 00742 EX (SP),HL 2060 115921 00743 LD DE,TIMFLD ;Pt to time field 2063 0603 00744 LD B,3 ;Set up loop counter 2065 1805 00745 JR PAKTIM1 2067 FE0A 00746 PAKTIM CP ':'-30H ;Test valid separator 2069 C2521F 00747 JP NZ,BADJCL 206C C5 00748 PAKTIM1 PUSH BC 206D CDE103 00749 CALL @DECHEX ;Cvrt the hours 2070 71 00750 LD (HL),C ;Store time parm 2071 EDA0 00751 LDI ;Shift & bump HL & DE 2073 C1 00752 POP BC ;Rcvr the loop counter 2074 10F1 00753 DJNZ PAKTIM ;Loop for 3 values 2076 3E00 00754 SLPWT LD A,0 ;P/u sleep/wait flag 2078 B7 00755 OR A 2079 281F 00756 JR Z,TSTIME ;Go if //WAIT 207B 215B21 00757 LD HL,TIMFLD+2 ;Point to seconds 207E 112D00 00758 LD DE,TIME$ 2081 0602 00759 LD B,2 2083 1A 00760 SLP1 LD A,(DE) ;Add secs/mins 2084 86 00761 ADD A,(HL) 2085 77 00762 LD (HL),A ;Store 2086 D63C 00763 SUB 60 ;Ck overflow to mins/hrs 2088 3804 00764 JR C,SLP2 ;Go if none 208A 77 00765 LD (HL),A ;Update value mod 60 208B 2B 00766 DEC HL ; & bump next field 208C 34 00767 INC (HL) 208D 23 00768 INC HL ;Adj for dec 208E 13 00769 SLP2 INC DE ;Bump time$ 208F 2B 00770 DEC HL ;Bump user field 2090 10F1 00771 DJNZ SLP1 2092 1A 00772 LD A,(DE) ;Add hours 2093 86 00773 ADD A,(HL) 2094 77 00774 LD (HL),A 2095 D618 00775 SUB 24 ;Wrap past midnight? 2097 3801 00776 JR C,TSTIME ;Go if not else 2099 77 00777 LD (HL),A ; adjust mod 24 00778 ; 00779 ; Wait until the system clock advances to request 00780 ; 209A CD881E 00781 TSTIME CALL KSCN ;Scan for BREAK 209D 215921 00782 LD HL,TIMFLD 20A0 112F00 00783 LD DE,TIME$+2 20A3 0603 00784 LD B,3 ;Set loop counter 20A5 1A 00785 CKTIME LD A,(DE) ;P/u a time value 20A6 BE 00786 CP (HL) ;Match user input? 20A7 20F1 00787 JR NZ,TSTIME ;Go if no match 20A9 23 00788 INC HL ;Inc the user req ptr 20AA 1B 00789 DEC DE ;Dec the time string ptr 20AB 10F8 00790 DJNZ CKTIME ;Loop for 3 values 20AD 18A4 00791 JR FLASH3 ;All match, exit! 00792 ; 00793 ; Process //INPUT request 00794 ; 20AF E1 00795 INPUT POP HL ;Recover JCL line & 20B0 CD2D05 00796 CALL @DSPLY ; pump it to screen 20B3 3EDD 00797 LD A,0DDH ;Change sysres hook 20B5 32AA19 00798 LD (@DOKEY+1),A 20B8 D1 00799 POP DE ;Stack integrity 20B9 C1 00800 POP BC ;Get @KEYIN values 00801 ; 00802 ; This next routine will satisfy the request 00803 ; 20BA CD2806 00804 GETKEY CALL @KEY ;Fetch from keyboard 20BD F5 00805 PUSH AF ;Don't disturb flag 20BE 3D 00806 DEC A 20BF 2806 00807 JR Z,UNHOOK ;Change back on BREAK 20C1 FE0C 00808 CP CR-1 ; or ENTER 20C3 2802 00809 JR Z,UNHOOK 20C5 F1 00810 POP AF 20C6 C9 00811 RET 20C7 3ECD 00812 UNHOOK LD A,0CDH ;Restore sysres hook 20C9 32AA19 00813 LD (@DOKEY+1),A 20CC F1 00814 POP AF ;Get saved character 20CD C9 00815 RET 00816 ; 00817 ; Parameter list & scanners 00818 ; 00819 ; Parse a field 00820 ; (HL) => command line 00821 ; (DE) => FCB area 00822 ; Z <= found valid field 00823 ; NZ <= found invalid field 00824 ; 20CE 0608 00825 PARSER LD B,8 ;Set length 20D0 78 00826 PAR1 LD A,B 20D1 320521 00827 LD (PAR6+1),A 20D4 04 00828 INC B 20D5 7E 00829 PAR2 LD A,(HL) 20D6 FE03 00830 CP 3 ;ETX? 20D8 2826 00831 JR Z,PAR5 20DA FE0D 00832 CP CR ; ? 20DC 2822 00833 JR Z,PAR5 20DE FE28 00834 CP '(' ;Begin of parm? 20E0 281E 00835 JR Z,PAR5 20E2 23 00836 INC HL ;Bump pointer to next 20E3 CD0921 00837 CALL TST09AZ ;Test if 0-9,A-Z 20E6 300A 00838 JR NC,PAR3 ;Go if one of the above 20E8 FE61 00839 CP 'a' ;Check on lower case 20EA 3814 00840 JR C,PAR5 ;Jump on non-alpha 20EC FE7B 00841 CP 'z'+1 ;Is it a-z? 20EE 3010 00842 JR NC,PAR5 ;Jump on non-alpha 20F0 CBAF 00843 RES 5,A ;Convert lower to upper 20F2 05 00844 PAR3 DEC B ;Count down 20F3 2808 00845 JR Z,PAR4 20F5 12 00846 LD (DE),A ;Xfer the char 20F6 AF 00847 XOR A ;Show at least 1 valid 20F7 320521 00848 LD (PAR6+1),A ; char was detected 20FA 13 00849 INC DE ;Bump FCB pointer 20FB 18D8 00850 JR PAR2 ;Loop 00851 ; 20FD 04 00852 PAR4 INC B ;Here on max chars ck'd 20FE 18D5 00853 JR PAR2 2100 4F 00854 PAR5 LD C,A ;Save separator 2101 3E03 00855 LD A,3 ;Stuff ETX 2103 12 00856 LD (DE),A 2104 3E00 00857 PAR6 LD A,0 ;Set Z-flag if at least 2106 B7 00858 OR A ; 1 valid char detected 2107 79 00859 LD A,C ;Recover separator char 2108 C9 00860 RET 2109 FE30 00861 TST09AZ CP '0' ;Special character? 210B D8 00862 RET C ;Go if not in range 210C FE3A 00863 CP '9'+1 ;Jump on digit 0-9 210E 3805 00864 JR C,EXITC ;Go if 0-9 & make NC 2110 FE41 00865 CP 'A' ;Jump on spec char 2112 D8 00866 RET C ;Go with C-flag if 3B-40 2113 FE5B 00867 CP 'Z'+1 ;Jump on A-Z 2115 3F 00868 EXITC CCF ;Switch flag of result 2116 C9 00869 RET 00870 ; 00871 ; Find parameter in table 00872 ; (HL) => pointer to line 00873 ; (DE) => pointer to buffer area 00874 ; (BC) => pointer to parameter table 00875 ; C <= entry # of parm in table 00876 ; (DE) <= parm vector address 00877 ; Z <= set if found 00878 ; NZ <= if not found in table 00879 ; Routine similar as FIND.PARM in SYS1 - dif width 00880 ; 2117 E5 00881 FNDPARM PUSH HL 2118 60 00882 LD H,B ;Xfer the table address 2119 69 00883 LD L,C 211A 1A 00884 FND1 LD A,(DE) ;P/u input byte 211B BE 00885 CP (HL) ;Match 1st char of table? 211C 280D 00886 JR Z,FND3 ;Jump if 1st matches 211E C5 00887 FND2 PUSH BC ; else bypass that entry 211F 010700 00888 LD BC,7 ;Width of table 2122 09 00889 ADD HL,BC 2123 C1 00890 POP BC 2124 7E 00891 LD A,(HL) ;Test for table end 2125 B7 00892 OR A 2126 20F2 00893 JR NZ,FND1 ;Loop if not at end 2128 E1 00894 POP HL 2129 3C 00895 INC A ; else set NZ return 212A C9 00896 RET 00897 ; 00898 ; 1st matches, does the rest? 00899 ; 212B 0604 00900 FND3 LD B,4 ;# chars remaining 212D E5 00901 PUSH HL 212E D5 00902 PUSH DE 212F 13 00903 FND4 INC DE 2130 23 00904 INC HL 2131 1A 00905 LD A,(DE) ;P/u input char 2132 FE03 00906 CP 3 ;ETX? 2134 281A 00907 JR Z,FND7 2136 FE0D 00908 CP CR ;End of line? 2138 2816 00909 JR Z,FND7 213A BE 00910 CP (HL) ;Match with table? 213B 200E 00911 JR NZ,FND6 ;Exit & test the char 213D 10F0 00912 DJNZ FND4 ;Loop for limit 213F D1 00913 FND5 POP DE ;Must be a match 2140 C1 00914 POP BC 2141 210500 00915 LD HL,5 ;Point to vector 2144 09 00916 ADD HL,BC 2145 5E 00917 LD E,(HL) ;Xfer vector to DE 2146 23 00918 INC HL 2147 56 00919 LD D,(HL) 2148 E1 00920 POP HL 2149 AF 00921 XOR A ; & show it found 214A C9 00922 RET 00923 ; 00924 ; No match if alphanumeric unless a space 00925 ; 214B CD0921 00926 FND6 CALL TST09AZ ;Ck for 0-9, A-Z 214E 3005 00927 JR NC,FND8 ;Go if one of the above 2150 7E 00928 FND7 LD A,(HL) ;Loop if table has 2151 FE20 00929 CP ' ' ; trailing spaces 2153 28EA 00930 JR Z,FND5 2155 D1 00931 FND8 POP DE 2156 E1 00932 POP HL 2157 18C5 00933 JR FND2 00934 ; 2159 00935 LILBUF DS 6 2159 00936 TIMFLD EQU LILBUF 215F 42 00937 BADJCL$ DB 'Bad JCL, ' 61 64 20 4A 43 4C 2C 20 2168 4A 00938 ABORT$ DB 'Job aborted',CR 6F 62 20 61 62 6F 72 74 65 64 0D 2174 4A 00939 JOBDUN$ DB 'Job done',CR 6F 62 20 64 6F 6E 65 0D 217D 41 00940 PARMTBL DB 'ABORT' 42 4F 52 54 2182 801E 00941 DW ABORT 2184 41 00942 DB 'ALERT' 4C 45 52 54 2189 D11F 00943 DW ALERT 218B 44 00944 DB 'DELAY' 45 4C 41 59 2190 621F 00945 DW DELAY 2192 45 00946 DB 'EXIT ' 58 49 54 20 2197 B21E 00947 DW EXIT 2199 46 00948 DB 'FLASH' 4C 41 53 48 219E 2B20 00949 DW FLASH 21A0 4B 00950 DB 'KEYIN' 45 59 49 4E 21A5 7E1F 00951 DW KEYIN 21A7 50 00952 DB 'PAUSE' 41 55 53 45 21AC 721F 00953 DW PAUSE 21AE 53 00954 DB 'SLEEP' 4C 45 45 50 21B3 5620 00955 DW SLEEP 21B5 53 00956 DB 'STOP ' 54 4F 50 20 21BA 581F 00957 DW STOP 21BC 57 00958 DB 'WAIT ' 41 49 54 20 21C1 5720 00959 DW WAIT 21C3 49 00960 DB 'INPUT' 4E 50 55 54 21C8 AF20 00961 DW INPUT 21CA 00 00962 NOP 21CB 00963 LAST EQU $ 00964 IFGT $,DIRBUF$ 00965 ERR 'Module too big' 00966 ENDIF 23FE 00967 ORG MAXCOR$-2 23FE CB03 00968 DW LAST-SYS11 ;Overlay size 00969 ; 1E00 00970 END SYS11 1E00 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]