[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 21:17:32 COMM/CMD - LS-DOS 6,2 Page 00001 00001 ;LCOMM/ASM - COMM Communications Program 00004 ; FFFF 00005 BUFFRD EQU -1 ;Set true 0080 00006 BREAK EQU 80H ;Char fm keyboard 000A 00007 LF EQU 10 000D 00008 CR EQU 13 0013 00009 XOFF EQU 'S'&1FH 00010 ; 0000 00011 *GET SVCMAC:3 ;SVC Macro equivalents 00012 ;SVCMAC/ASM - LS-DOS Version VI 00013 *LIST OFF 00405 *LIST ON 0000 00407 *GET COPYCOM:3 ;Copyright messages 00408 ; COPYCOM - File for Copyright COMment block 00409 ; 0000 00410 *GET BUILDVER/ASM:3 00411 ; 00412 ; Buildver/asm is a bit of a kludge since not all utilities can load 00413 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00414 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00415 ; for programs that can use that. 00416 ; FFFF 00417 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00418 ; These switches activate patches made since the 1B release. 00419 ; It is important that all earlier patches be enabled when a higher 00420 ; patch is enabled. 00421 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00422 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00423 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00424 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00425 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00426 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00427 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00428 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00429 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00430 ; 00431 ;End of BUILDVER/ASM 00432 IF @BLD631 00434 ELSE 00435 COM '<*(C) 1982,3,4,6 by LSI*>' 00436 ENDIF 00437 ; 3000 00438 BASE EQU 3000H 3000 00439 ORG BASE 00440 ; 3000 210000 00441 $EXIT LD HL,0 ;Init no error 3003 310000 00442 QUIT$ LD SP,$-$ ;P/u original stack 3004 00443 STACK EQU $-2 3006 00444 @@CKBRKC ;Clear break bit 3006+3E6A 00445 LD A,106 3008+EF 00446 RST 40 3009 C9 00447 RET 00448 ; 300A 21FFFF 00449 $ABORT LD HL,-1 ;Set abort code 300D 18F4 00450 JR QUIT$ 00451 ; 300F E5 00452 $OPEN PUSH HL 3010 210000 00453 LD HL,$-$ ;Address of SFLAG$ 3011 00454 SFLG EQU $-2 3013 CBC6 00455 SET 0,(HL) ;Set open inhibit bit 3015 E1 00456 POP HL 3016 00457 @@OPEN ;Do the open 3016+3E3B 00458 LD A,59 3018+EF 00459 RST 40 3019 C9 00460 RET ;Return with status 00461 ; 301A C5 00462 $ERROR PUSH BC 301B F6C0 00463 OR 0C0H ;Set short,return 301D 4F 00464 LD C,A ;Error code to C 301E 00465 @@ERROR ; for error display 301E+3E1A 00466 LD A,26 3020+EF 00467 RST 40 3021 C1 00468 POP BC 3022 C9 00469 RET 00470 ; 3023 3E00 00471 MAINLP LD A,0 ;Test warning flag set 3025 B7 00472 OR A ; by OUTPUT on NEXTAP 3026 280F 00473 JR Z,ENUFPG ;Go if > 2K of space 3028 21AC37 00474 LD HL,LILPG$ ;Display warning 302B 00475 @@DSPLY 00476 IFEQ 00H,1 00477 LD HL, 00478 ENDIF 302B+3E0A 00479 LD A,10 302D+EF 00480 RST 40 302E 3E13 00481 LD A,XOFF ;Schedule a forced PUT 302F 00482 XOFFP2 EQU $-1 3030 325234 00483 LD (FRCPUT+1),A 3033 AF 00484 XOR A 3034 322430 00485 LD (MAINLP+1),A ;Inhibit until next page 3037 DD219538 00486 ENUFPG LD IX,KIVCTR ;Get key from buffer if 303B CDB438 00487 CALL PGMGET ; available 303E 2022 00488 JR NZ,SENDIT ;Bypass if got one 3040 3E00 00489 FSSW LD A,0 ;FS On/Off (XMIT File) 3042 B7 00490 OR A 3043 2832 00491 JR Z,FSOFF ;Bypass if not XMTG 3045 3AAD38 00492 CKFREPG LD A,(FREEPG) ;Don't get from file 3048 FE0C 00493 CP 12 ; if < 3K buffer space 304A DA7730 00494 JP C,FSOFF ;Go if less 304D 110438 00495 LD DE,FS_FCB ;Get sending FCB 3050 00496 FSSWGO @@GET ;Get a byte to XMIT 3050+3E03 00497 LD A,3 3052+EF 00498 RST 40 3053 280D 00499 JR Z,SENDIT ;Bypass if got byte 3055 FE1C 00500 CP 1CH ;EOF encountered? 3057 2803 00501 JR Z,EOFFS ;Bypass if EOF 3059 CD1A30 00502 CALL $ERROR ;Output error message 305C CDDA33 00503 EOFFS CALL FS_OFF ;Turn off XMIT 305F C3F430 00504 JP SKIPREC ; and ignore this round 3062 4F 00505 SENDIT LD C,A ;Xfer byte 3063 FE00 00506 XLTS1 CP 0 ;Single character send 3065 2002 00507 JR NZ,DPLXSW ; translate table 3067 0E00 00508 XLTS2 LD C,0 3069 0600 00509 DPLXSW LD B,0 ;Duplex On/Off 306B 04 00510 INC B 306C 05 00511 DEC B ;Display on our devices 306D C41631 00512 CALL NZ,DEVOUT ; if duplex on (half) 3070 3AFA33 00513 LCMON LD A,(TASK8A+2) ;Ck CL on 3073 B7 00514 OR A 3074 C40231 00515 CALL NZ,SNDOUT ;Send char if ON 3077 3AFA33 00516 FSOFF LD A,(TASK8A+2) ;Test for CL ON 307A B7 00517 OR A 307B CAF430 00518 JP Z,SKIPREC ;Go if not 307E DD219D38 00519 LD IX,CLREC 3082 CDB438 00520 CALL PGMGET ;Ck for char avail 3085 CAF430 00521 JP Z,SKIPREC ;Go if no char 3088 0600 00522 DSPCTRL LD B,0 ;Ck if display of control 308A 04 00523 INC B ; codes is in effect 308B 05 00524 DEC B 308C 2813 00525 JR Z,SAVCHR ;Go if no ctrl display 308E FE20 00526 CP 20H 3090 300F 00527 JR NC,SAVCHR ;Go if not ctrl 3092 F5 00528 PUSH AF ;Save the char 3093 21BF35 00529 LD HL,BRAKET+1 ;Pt to control char msg 3096 4F 00530 LD C,A 3097 00531 @@HEX8 ;Cvrt char & stuff in buf 3097+3E62 00532 LD A,98 3099+EF 00533 RST 40 309A 21BE35 00534 LD HL,BRAKET ;Start of msg string 309D 00535 @@DSPLY ;Display ASCII control value 00536 IFEQ 00H,1 00537 LD HL, 00538 ENDIF 309D+3E0A 00539 LD A,10 309F+EF 00540 RST 40 30A0 F1 00541 POP AF ;Rcvr char 30A1 4F 00542 SAVCHR LD C,A ;Save char 30A2 0600 00543 SHAKE LD B,0 ;Handshake On/Off 30A4 04 00544 INC B 30A5 05 00545 DEC B 30A6 2820 00546 JR Z,ECHOSW ;Go if off 30A8 FE11 00547 CP 'Q'&1FH ;Ctrl-Q? 30A9 00548 XONP1 EQU $-1 ;Modify if PARM 30AA 2806 00549 JR Z,CTLQ ;Go if so 30AC FE13 00550 CP 'S'&1FH ;Ctrl-S? 30AD 00551 XOFFP1 EQU $-1 ;Modify if parm entered 30AE 2008 00552 JR NZ,NOSQ ;Go if neither 30B0 0600 00553 LD B,0 ;Turn off 30B2 78 00554 CTLQ LD A,B ; or on 30B3 324534 00555 LD (TASK8B+1),A ;*CL send task 30B6 183C 00556 JR SKIPREC ;Discard ctrl code 30B8 FE12 00557 NOSQ CP 'R'&1FH ;Ctrl-R? 30BA 2806 00558 JR Z,CTLR ;Go if so 30BC FE14 00559 CP 'T'&1FH ;Ctrl-T? 30BE 2008 00560 JR NZ,ECHOSW ;Go if neither 30C0 0600 00561 LD B,0 ;Turn off 30C2 78 00562 CTLR LD A,B ; or on 30C3 322E31 00563 LD (FRSW+1),A ;FR device 30C6 182C 00564 JR SKIPREC ;Discard ctrl code 00565 ; 00566 ; Test for ECHO after checking for handshake chars 00567 ; 30C8 0600 00568 ECHOSW LD B,0 ;Echo On/Off? 30CA 04 00569 INC B 30CB 05 00570 DEC B 30CC C4FA30 00571 CALL NZ,CLOUT ;Send char back if ON 30CF 79 00572 LD A,C 30D0 FE0D 00573 CP CR ;Was it a CR? 30D2 200B 00574 JR NZ,NOTCR 30D4 CD0931 00575 CALL ECLF1 ;Send LF back if needed 30D7 21E130 00576 LD HL,CRSW+1 ;Flag for CR recvd 00577 ; 00578 ; Move state of ACCEPT LF switch into CRSW+1 when CR recv'd 00579 ; 30DA 3E00 00580 ACCLFSW LD A,0 ;Show CR found if accept 30DC 77 00581 LD (HL),A ; LF switch is off 30DD 1812 00582 JR TAKEREC ;Dsp CR 00583 ; 00584 ; When LF rcv'd, delete if ACCLFSW is off & last char was CR 00585 ; 30DF 79 00586 NOTCR LD A,C ;Check char 30E0 06FF 00587 CRSW LD B,0FFH ;P/u del LF switch 30E2 21E130 00588 LD HL,CRSW+1 ;Pt to switch 30E5 36FF 00589 LD (HL),0FFH ; (flip off switch -not CR) 30E7 FE0A 00590 CP LF ;Is line feed the char? 30E9 2006 00591 JR NZ,TAKEREC ;Go if not LF 30EB 3A1F34 00592 LD A,(EIGHT+1) ;Also skip if 8 bit 30EE B0 00593 OR B ; switch is off 30EF 2803 00594 JR Z,SKIPREC ;Skip LF if so 00595 ; 30F1 CD1631 00596 TAKEREC CALL DEVOUT ;Out to active devices 30F4 CDE933 00597 SKIPREC CALL TASKS ;Do 3 tasks (incl kbd) 30F7 C32330 00598 JP MAINLP ; & FRIO test then loop 00599 ; 30FA 79 00600 CLOUT LD A,C ;Get char 30FB DD21A138 00601 LD IX,CLSEND ;Set buffer pointers 30FF C3AE38 00602 JP OUTPGM ;Put in output buffer 00603 ; 3102 CDFA30 00604 SNDOUT CALL CLOUT ;Send this character 3105 79 00605 LD A,C ;Is it CR? 3106 FE0D 00606 CP CR 3108 C0 00607 RET NZ ;Done if not 00608 ; 3109 3E00 00609 ECLF1 LD A,$-$ ;Is echo linefeed on? 310A 00610 ECOLF EQU $-1 310B B7 00611 OR A 310C C8 00612 RET Z ;Done if not 310D 3E0A 00613 LD A,LF ;Otherwise load a LF 310F DD21A138 00614 LD IX,CLSEND 3113 C3AE38 00615 JP OUTPGM ;Add to buffer/ret to caller 00616 ; 00617 ; Output to video 00618 ; 3116 3EFF 00619 DEVOUT LD A,0FFH ;Is *DO On/Off? 3118 B7 00620 OR A 3119 2812 00621 JR Z,FRSW ;Bypass if off 311B 79 00622 LD A,C 311C FE0C 00623 CP 0CH ;If formfeed, 311E 4F 00624 LD C,A 311F C5 00625 PUSH BC 3120 2007 00626 JR NZ,NOTCLS ; clear the screen 3122 0E1C 00627 LD C,1CH ;Cursor home 3124 00628 @@DSP 3124+3E02 00629 LD A,2 3126+EF 00630 RST 40 3127 0E1F 00631 LD C,1FH ;Clear to end-of-frame 3129 00632 NOTCLS @@DSP 3129+3E02 00633 LD A,2 312B+EF 00634 RST 40 312C C1 00635 POP BC 00636 ; 00637 ; Send char to our disk if FR on 00638 ; 312D 3E00 00639 FRSW LD A,0 ;FR On/Off - receive file 312F B7 00640 OR A 3130 2808 00641 JR Z,PUTPR ;Bypass if FR off 3132 79 00642 LD A,C 3133 DD21A938 00643 LD IX,FRVCTR ;Put away into the 3137 CDAE38 00644 CALL OUTPGM ; FR buffer 00645 ; 00646 ; Place char into printer buffer if PR on 00647 ; 313A 3E00 00648 PUTPR LD A,0 ;PR On/Off? 313C B7 00649 OR A 313D 2808 00650 JR Z,FRIOSW ;Go if off 313F 79 00651 LD A,C 3140 DD219938 00652 LD IX,PRVCTR ;Place the char in 3144 CDAE38 00653 CALL OUTPGM ; the printer buffer 00654 ; 00655 ; Check if FR to disk is engaged 00656 ; 3147 3EFF 00657 FRIOSW LD A,-1 ;Ck if FR-to-disk is on 3149 B7 00658 OR A 314A C8 00659 RET Z ;Go if not engaged 314B DD21A938 00660 LD IX,FRVCTR ;Is a char available 314F CDB438 00661 CALL PGMGET ; for the disk? 3152 C8 00662 RET Z ;Go if none for disk 3153 212438 00663 LD HL,FR_FCB ;Put char to disk 3156 CB7E 00664 BIT 7,(HL) ;OPEN FCB? 3158 C8 00665 RET Z ;Skip if not 3159 EB 00666 EX DE,HL 315A 4F 00667 LD C,A ;Place char in "C" 315B 00668 @@PUT ; and do the write 315B+3E04 00669 LD A,4 315D+EF 00670 RST 40 315E C8 00671 RET Z ;Back if good 315F CD1A30 00672 CALL $ERROR 3162 CDE433 00673 CALL FRIO_OFF ;Turn FRIO to disk off 3165 C3DF33 00674 JP FR_OFF ;Turn FR off and return 00675 ; 00676 ;command function entered - decode it 00677 ; 3168 010000 00678 CMDKEY LD BC,0 ;Init no device vector 316B 110000 00679 LD DE,0 ;Init no File FCB 316E 218930 00680 LD HL,DSPCTRL+1 ;Pt to ctrl char dsply parm 00681 IF @MOD4 3171 FEA7 00682 CP 27H!80H ;Display control chars? 00683 ENDIF 00684 IF @MOD2 00685 CP '&'+80H 00686 ENDIF 3173 CA3332 00687 JP Z,QFUNC 00688 ; 3176 216A30 00689 LD HL,DPLXSW+1 3179 FEA1 00690 CP '!'+80H ;Ck duplex 317B CA3332 00691 JP Z,QFUNC 00692 ; 317E 21C930 00693 LD HL,ECHOSW+1 00694 IF @MOD4 3181 FEA2 00695 CP '"'+80H ;Ck echo 00696 ENDIF 00697 IF @MOD2 00698 CP '@'+80H 00699 ENDIF 3183 CA3332 00700 JP Z,QFUNC 00701 ; 3186 21A330 00702 LD HL,SHAKE+1 ;Check handshake 00703 IF @MOD4 3189 FEAA 00704 CP '*'+80H 00705 ENDIF 00706 IF @MOD2 00707 CP '_'+80H 00708 ENDIF 318B CA4232 00709 JP Z,QSHAKE 00710 ; 318E 210A31 00711 LD HL,ECOLF 3191 FEA3 00712 CP '#'+80H ;Echo line feed? 3193 CA3332 00713 JP Z,QFUNC 00714 ; 3196 21DB30 00715 LD HL,ACCLFSW+1 ;Check accept-LF 3199 FEA4 00716 CP '$'+80H 319B CA3332 00717 JP Z,QFUNC 00718 ; 319E 211F34 00719 LD HL,EIGHT+1 ;Check 8-bit 00720 IF @MOD4 31A1 FEA9 00721 CP ')'+80H 00722 ENDIF 00723 IF @MOD2 00724 CP '('+80H 00725 ENDIF 31A3 CA3332 00726 JP Z,QFUNC 00727 ; 31A6 019538 00728 LD BC,KIVCTR ;Init *KI put/get index 31A9 218134 00729 LD HL,KISW+1 31AC FEB1 00730 CP '1'+80H ;CK *KI 31AE CA3332 00731 JP Z,QFUNC 00732 ; 31B1 010000 00733 LD BC,0 ;No *DO put/get index 31B4 211731 00734 LD HL,DEVOUT+1 31B7 FEB2 00735 CP '2'+80H ;CK *DO 31B9 2878 00736 JR Z,QFUNC 00737 ; 31BB 019938 00738 LD BC,PRVCTR ;Init *PR put/get index 31BE 213B31 00739 LD HL,PUTPR+1 31C1 FEB3 00740 CP '3'+80H ;CK *PR 31C3 286E 00741 JR Z,QFUNC 00742 ; 31C5 01A138 00743 LD BC,CLSEND ;Init *CL-S put/get index 31C8 21FA33 00744 LD HL,TASK8A+2 31CB FEB4 00745 CP '4'+80H ;CK *CL 31CD 2869 00746 JR Z,QCL 00747 ; 31CF 01A538 00748 LD BC,FSVCTR ;Init *FS put/get index 31D2 110438 00749 LD DE,FS_FCB ;Init *FS FCB 31D5 DD21003A 00750 LD IX,XMTBUF ;Point to buffer 31D9 214130 00751 LD HL,FSSW+1 31DC FEB5 00752 CP '5'+80H ;CK FS 31DE 2853 00753 JR Z,QFUNC 00754 ; 31E0 01A938 00755 LD BC,FRVCTR ;P/u *FR put/get index 31E3 112438 00756 LD DE,FR_FCB ;P/u *FR FCB 31E6 DD21003B 00757 LD IX,RCVBUF ;Pt to buffer 31EA 212E31 00758 LD HL,FRSW+1 31ED FEB6 00759 CP '6'+80H ;CK FR 31EF 2842 00760 JR Z,QFUNC 00761 ; 31F1 214831 00762 LD HL,FRIOSW+1 31F4 110000 00763 LD DE,0 ;No FCB here 31F7 FEB7 00764 CP '7'!80H ;Check FR IO to disk? 31F9 2838 00765 JR Z,QFUNC 00766 ; 31FB FEB8 00767 CP '8'!80H ;Menu request? 31FD CA9A32 00768 JP Z,MENU 00769 ; 00770 IF @MOD4 3200 FEA8 00771 CP '('!80H ;Local clear screen? 00772 ENDIF 00773 IF @MOD2 00774 CP '*'+80H 00775 ENDIF 3202 CA8F32 00776 JP Z,CLS 00777 ; 00778 IF @MOD4 3205 FEA0 00779 CP 20H!80H ;Clr-shf-0? 00780 ENDIF 00781 IF @MOD2 00782 CP ')'+80H 00783 ENDIF 3207 CA6535 00784 JP Z,DOSCMD ;Do CMDR 00785 ; 00786 IF @MOD4 320A FEBD 00787 CP '='+80H ;CK LDOS exit 00788 ENDIF 00789 IF @MOD2 00790 CP '+'+80H 00791 ENDIF 320C C27D32 00792 JP NZ,CMDERR 00793 ; 00794 ; 00795 ; Exit from LCOMM - Remove task vectors 00796 ; 00797 EXIT 00798 IF .NOT.BUFFRD 00799 LD C,8 ;Remove comm line scan task 00800 @@RMTSK 00801 ; 00802 LD C,9 ;Rmv printer task if used 00803 @@RMTSK 00804 ENDIF 00805 ; 00806 IF BUFFRD 320F 11E437 00807 LD DE,CLDCB ;Turn off wakeup feature 3212 FD210000 00808 LD IY,$-$ 3214 00809 OLDVEC EQU $-2 ;Restoring previous state 3216 0E04 00810 LD C,4 3218 00811 @@CTL 3218+3E05 00812 LD A,5 321A+EF 00813 RST 40 00814 ENDIF 00815 ; 321B CDDF33 00816 CALL FR_OFF ;Turn off any receive file 321E 112438 00817 LD DE,FR_FCB 3221 1A 00818 LD A,(DE) 3222 CB7F 00819 BIT 7,A ;Is it an open file? 3224 CA0030 00820 JP Z,$EXIT ;Exit if not else 3227 00821 @@CLOSE ; make sure it's closed 3227+3E3C 00822 LD A,60 3229+EF 00823 RST 40 322A CA0030 00824 JP Z,$EXIT ;Exit if no error 322D CD1A30 00825 CALL $ERROR 3230 C30A30 00826 JP $ABORT ;Terminate 00827 ; 00828 ; Query function ON or OFF 00829 ; 3233 CD5A32 00830 QFUNC CALL QONOFF ;Get On or Off response 3236 77 00831 LD (HL),A ;Save which one 3237 C9 00832 RET 00833 ; 00834 ; Query *CL on or off 00835 ; 3238 CD5A32 00836 QCL CALL QONOFF 323B 77 00837 LD (HL),A 323C B7 00838 OR A ;On or off? 323D C8 00839 RET Z ;Quit if off 323E 324534 00840 LD (TASK8B+1),A ;Force CL-send on as well 3241 C9 00841 RET 00842 ; 00843 ; Query handshake on or off 00844 ; 3242 D5 00845 QSHAKE PUSH DE 3243 00846 @@KEY ;Get one key 3243+3E01 00847 LD A,1 3245+EF 00848 RST 40 3246 D1 00849 POP DE 3247 A7 00850 AND A ;Be sure flags are set 3248 FA5132 00851 JP M,QSHAKE1 ;Go if PF key 324B 326B34 00852 LD (AUTXOFF+1),A ;Save key as auto XOFF 324E 36FF 00853 LD (HL),0FFH ;Turn on handshake 3250 C9 00854 RET 3251 CD5F32 00855 QSHAKE1 CALL QONOFF1 ;Parse ON or OFF 3254 77 00856 LD (HL),A ;Turn on or off 3255 AF 00857 XOR A ;Turn off auto XOFF 3256 326B34 00858 LD (AUTXOFF+1),A 3259 C9 00859 RET 325A D5 00860 QONOFF PUSH DE ;Hang on to register 325B 00861 @@KEY ;Get the operand key 325B+3E01 00862 LD A,1 325D+EF 00863 RST 40 325E D1 00864 POP DE ;Restore the register 325F 00865 QONOFF1 EQU $ 00866 IF @MOD4 325F FEAD 00867 CP '-'+80H ;Ck OFF 00868 ENDIF 00869 IF @MOD2 00870 CP '='+80H 00871 ENDIF 3261 2821 00872 JR Z,TURNOF ; and go if off 00873 IF @MOD4 3263 FEBA 00874 CP ':'+80H ;Ck ON 00875 ENDIF 00876 IF @MOD2 00877 CP '-'+80H 00878 ENDIF 3265 281F 00879 JR Z,TURNON ; and go if on 3267 E3 00880 POPERR EX (SP),HL ;Discard ret address 3268 E1 00881 POP HL 3269 FEB9 00882 CP '9'+80H ;Ck ID 326B CA9633 00883 JP Z,FILID 00884 ; 326E FEB0 00885 CP '0'+80H ;Ck RESET 3270 CA4C33 00886 JP Z,FILRES 00887 ; 3273 FEA5 00888 CP '%'+80H ;Ck REWIND 3275 CA8433 00889 JP Z,FILREW 00890 ; 00891 IF @MOD4 3278 FEA6 00892 CP '&'+80H ;Ck PEOF 00893 ENDIF 00894 IF @MOD2 00895 CP '^'+80H 00896 ENDIF 327A CA8D33 00897 JP Z,FILEOF 00898 ; 327D 218D37 00899 CMDERR LD HL,CMDERR$ ;None of above, dsply 3280 00900 @@DSPLY ; "Unacceptable command... 00901 IFEQ 00H,1 00902 LD HL, 00903 ENDIF 3280+3E0A 00904 LD A,10 3282+EF 00905 RST 40 3283 C9 00906 RET 00907 ; 00908 ; Process OFF 00909 ; 3284 AF 00910 TURNOF XOR A ;Off = 0 3285 C9 00911 RET 00912 ; 00913 ; Process ON 00914 ; 3286 EB 00915 TURNON EX DE,HL ;Shift "FCB" to HL 3287 CB7E 00916 BIT 7,(HL) ;FCB on or non-file? 3289 EB 00917 EX DE,HL ;If non-file, HL now 328A 3EFF 00918 LD A,0FFH ; points to X'0000' 328C C0 00919 RET NZ ; which contains X'F3' 328D 18D8 00920 JR POPERR ;Is an error 00921 ; 00922 ; Process Clear Screen 00923 ; 328F 0E1C 00924 CLS LD C,1CH ;Cursor home 3291 00925 @@DSP 3291+3E02 00926 LD A,2 3293+EF 00927 RST 40 3294 0E1F 00928 LD C,1FH ;Clear to end-of-frame 3296 00929 @@DSP 3296+3E02 00930 LD A,2 3298+EF 00931 RST 40 3299 C9 00932 RET 00933 ; 00934 ; Process MENU 00935 ; 329A 00936 MENU EQU $ 329A 21E635 00937 LD HL,STAT1 ;Clear top row status 329D 11E735 00938 LD DE,STAT1+1 ;1st char always a space 32A0 014200 00939 LD BC,66 32A3 EDB0 00940 LDIR 32A5 210537 00941 LD HL,STAT2 ;Clear bottom row status 32A8 110637 00942 LD DE,STAT2+1 32AB 0E26 00943 LD C,38 32AD EDB0 00944 LDIR 32AF 060F 00945 LD B,15 ;Init loop count 32B1 212D37 00946 LD HL,STATAB ;Words where status stored 32B4 5E 00947 STATLP1 LD E,(HL) ;P/u lo-switch 32B5 23 00948 INC HL 32B6 56 00949 LD D,(HL) ;P/u hi-switch 32B7 23 00950 INC HL 32B8 7E 00951 LD A,(HL) ;P/u lo-stuff 32B9 23 00952 INC HL 32BA E5 00953 PUSH HL ;Save pointer 32BB 66 00954 LD H,(HL) ;P/u hi-stuff 32BC 6F 00955 LD L,A ;Xfer lo-stuff 32BD 1A 00956 LD A,(DE) ;Get status 32BE B7 00957 OR A ;Active or not? 32BF 2802 00958 JR Z,$+4 ;Go if not 32C1 362A 00959 LD (HL),'*' ; else stuf an '*' 32C3 E1 00960 POP HL ;Rcvr pointer 32C4 23 00961 INC HL ;Bump to next pos 32C5 10ED 00962 DJNZ STATLP1 32C7 1A 00963 LD A,(DE) ;P/u shake again 32C8 B7 00964 OR A 32C9 280D 00965 JR Z,STATLP2 ;Go if off 32CB 3A6B34 00966 LD A,(AUTXOFF+1) ;Check if xoff char set 32CE B7 00967 OR A 32CF 2807 00968 JR Z,STATLP2 ;Skip if not special char 32D1 212536 00969 LD HL,STAT1+63 ;Auto x-off char posn 32D4 4F 00970 LD C,A 32D5 00971 @@HEX8 ;Cvrt to ASCII for display 32D5+3E62 00972 LD A,98 32D7+EF 00973 RST 40 32D8 21E535 00974 STATLP2 LD HL,MNUMSG ;Ptr to Comm menu 32DB 00975 @@DSPLY ;Display prelim status 00976 IFEQ 00H,1 00977 LD HL, 00978 ENDIF 32DB+3E0A 00979 LD A,10 32DD+EF 00980 RST 40 32DE 210438 00981 LD HL,FS_FCB ;FS file open? 32E1 CB7E 00982 BIT 7,(HL) 32E3 281C 00983 JR Z,STATLP3 ;Go if closed 32E5 114438 00984 LD DE,DUMMY ;Recover its name w/o 32E8 D5 00985 PUSH DE ; changing the FCB 32E9 012000 00986 LD BC,32 32EC EDB0 00987 LDIR ; by creating a duplicate 32EE D1 00988 POP DE ; open FCB 32EF ED4B4A38 00989 LD BC,(DUMMY+6) ;Get drive and DEC 32F3 D5 00990 PUSH DE 32F4 00991 @@FNAME ;Call for name recover 32F4+3E50 00992 LD A,80 32F6+EF 00993 RST 40 32F7 216937 00994 LD HL,FSNAME$ ;Output "FS-SPEC: " 32FA 00995 @@DSPLY 00996 IFEQ 00H,1 00997 LD HL, 00998 ENDIF 32FA+3E0A 00999 LD A,10 32FC+EF 01000 RST 40 32FD E1 01001 POP HL ;Rcvr fcb pointer and 32FE 01002 @@DSPLY ; display the filespec 01003 IFEQ 00H,1 01004 LD HL, 01005 ENDIF 32FE+3E0A 01006 LD A,10 3300+EF 01007 RST 40 3301 212438 01008 STATLP3 LD HL,FR_FCB ;Is the FR file open? 3304 CB7E 01009 BIT 7,(HL) 3306 281C 01010 JR Z,STATLP4 ;Go if closed 3308 114438 01011 LD DE,DUMMY ;Similar to above 330B D5 01012 PUSH DE 330C 012000 01013 LD BC,32 330F EDB0 01014 LDIR ;Create a duplicate FCB 3311 D1 01015 POP DE 3312 ED4B4A38 01016 LD BC,(DUMMY+6) ;P/u Drive & DEC 3316 D5 01017 PUSH DE 3317 01018 @@FNAME ;Call for name recover 3317+3E50 01019 LD A,80 3319+EF 01020 RST 40 331A 217337 01021 LD HL,FRNAME$ ;"FR-SPEC:" 331D 01022 @@DSPLY 01023 IFEQ 00H,1 01024 LD HL, 01025 ENDIF 331D+3E0A 01026 LD A,10 331F+EF 01027 RST 40 3320 E1 01028 POP HL ;P/u name start 3321 01029 @@DSPLY ; and dsply it 01030 IFEQ 00H,1 01031 LD HL, 01032 ENDIF 3321+3E0A 01033 LD A,10 3323+EF 01034 RST 40 3324 3AAD38 01035 STATLP4 LD A,(FREEPG) ;How much buffer left 3327 0F 01036 RRCA ;Divide by 4 to show 3328 0F 01037 RRCA ; in K 3329 E63F 01038 AND 3FH ;No bit 7 nor 6 332B 218937 01039 LD HL,PAGSPR$+10 ;Where to stuff 332E 06FF 01040 LD B,-1 ;Init to count 10's 3330 04 01041 CVD1 INC B 3331 D60A 01042 SUB 10 ;How many tens? 3333 30FB 01043 JR NC,CVD1 ;Go if no more 3335 F5 01044 CVD2 PUSH AF ;Save remainder 3336 78 01045 LD A,B ;P/u tens 3337 B7 01046 OR A ;Was it zero tens? 3338 0620 01047 LD B,' ' ;Init for space 333A 2802 01048 JR Z,$+4 ;Go if no tens 333C 0630 01049 LD B,'0' ;Init for ASCII 333E 80 01050 ADD A,B ;Convert to ASCII 333F 77 01051 LD (HL),A ;Stuff & bump 3340 23 01052 INC HL 3341 F1 01053 POP AF ;Get remainder 3342 C63A 01054 ADD A,3AH ;Adjust units place 3344 77 01055 LD (HL),A 3345 217F37 01056 LD HL,PAGSPR$ ;"Memory: K" 3348 01057 @@DSPLY 01058 IFEQ 00H,1 01059 LD HL, 01060 ENDIF 3348+3E0A 01061 LD A,10 334A+EF 01062 RST 40 334B C9 01063 RET 01064 ; 01065 ; Process RESET of a "device" 01066 ; 334C 78 01067 FILRES LD A,B ;Check if a device vector 334D B1 01068 OR C ; was passed 334E CA7D32 01069 JP Z,CMDERR ;Go if not - is error 3351 7A 01070 LD A,D ;Check for a possible 3352 B3 01071 OR E ; FCB for disk 3353 2016 01072 JR NZ,FILR4 ;Go if disk else device 01073 ; 01074 ; Reset the page buffer(s) for the device 01075 ; 3355 F3 01076 FILR1 DI ;No interrupts until done 3356 60 01077 LD H,B ;Xfer vector table entry 3357 69 01078 LD L,C ; to grab put/get index 3358 4E 01079 LD C,(HL) ;P/u the PUT pointer 3359 23 01080 INC HL ; and make the GET 335A 46 01081 LD B,(HL) ; pointer equal so 335B 23 01082 INC HL ; buffer contents show 335C 71 01083 LD (HL),C ; as empty 335D 23 01084 INC HL 335E 7E 01085 LD A,(HL) ;P/u the GET pointer to 335F 70 01086 LD (HL),B ; check if in same page 3360 B8 01087 FILR2 CP B ;Is put/get in same page? 3361 2806 01088 JR Z,FILR3 ;Go if it is 3363 67 01089 LD H,A ; else set up to free this 3364 CD4E35 01090 CALL FNPIU ; page by finding next 3367 18F7 01091 JR FILR2 ;Loop until next = 1st 3369 FB 01092 FILR3 EI ;Interrupts back on 336A C9 01093 RET 01094 ; 01095 ; Reset a file device 01096 ; 336B 212438 01097 FILR4 LD HL,FR_FCB ;Turn off the FR or FS 336E AF 01098 XOR A 336F ED52 01099 SBC HL,DE ;Is this the FR? 3371 214130 01100 LD HL,FSSW+1 3374 2006 01101 JR NZ,OFFS 3376 324831 01102 LD (FRIOSW+1),A ;Turn off FR IO to disk 3379 212E31 01103 LD HL,FRSW+1 ;Turn off FR to buffer 337C 77 01104 OFFS LD (HL),A ;Turn off FR or FS 337D 01105 @@CLOSE ;Close the file 337D+3E3C 01106 LD A,60 337F+EF 01107 RST 40 3380 C41A30 01108 CALL NZ,$ERROR ;Show any close error 3383 C9 01109 RET 01110 ; 01111 ; Process REWIND 01112 ; 3384 7A 01113 FILREW LD A,D ;Rewind the specified 3385 B3 01114 OR E ; file (FCB given) if 3386 CA7D32 01115 JP Z,CMDERR ; it is in use 3389 01116 @@REW 3389+3E44 01117 LD A,68 338B+EF 01118 RST 40 338C C9 01119 RET 01120 ; 01121 ; Process PEOF 01122 ; 338D 7A 01123 FILEOF LD A,D ;Check if a file device 338E B3 01124 OR E ; was specified 338F CA7D32 01125 JP Z,CMDERR ;Go if not - is error 3392 01126 @@PEOF ; else position to end 3392+3E41 01127 LD A,65 3394+EF 01128 RST 40 3395 C9 01129 RET 01130 ; 01131 ; Process ID request 01132 ; 3396 7A 01133 FILID LD A,D ;Bad command if not 3397 B3 01134 OR E ; FS or FR specified 3398 CA7D32 01135 JP Z,CMDERR ;Go on error 339B 1A 01136 LD A,(DE) ;Make sure that it is 339C 07 01137 RLCA ; not already open 339D 3834 01138 JR C,NOTNOW ;CF=already open 339F D5 01139 PUSH DE 33A0 DDE5 01140 PUSH IX ;Save buffer pointer 33A2 21C335 01141 LD HL,FILEPMT ;Prompt for filespec 33A5 01142 @@DSPLY 01143 IFEQ 00H,1 01144 LD HL, 01145 ENDIF 33A5+3E0A 01146 LD A,10 33A7+EF 01147 RST 40 33A8 E1 01148 POP HL ;Take file name 33A9 01001F 01149 LD BC,31<8 ;31 chars max 33AC 01150 @@KEYIN ;Get the filespec 33AC+3E09 01151 LD A,9 33AE+EF 01152 RST 40 33AF F5 01153 PUSH AF ;Save flag state 33B0 0E0E 01154 LD C,0EH ;Turn the cursor back on 33B2 01155 @@DSP 33B2+3E02 01156 LD A,2 33B4+EF 01157 RST 40 33B5 F1 01158 POP AF ;Rcvr KEYIN exit state 33B6 D1 01159 POP DE 33B7 D8 01160 RET C ;Ret if BREAK from KEYIN 33B8 E5 01161 PUSH HL ;Save ptr to buffer 33B9 01162 @@FSPEC ;Fetch & parse filespec 33B9+3E4E 01163 LD A,78 33BB+EF 01164 RST 40 33BC 210438 01165 LD HL,FS_FCB ;Ck if FILID req from 33BF AF 01166 XOR A ; FS or FR 33C0 ED52 01167 SBC HL,DE ;What's the FCB? 33C2 E1 01168 POP HL ;Recover buffer 33C3 0600 01169 LD B,0 ;LRL=256 33C5 2005 01170 JR NZ,FILFR ;Go if req from FR 33C7 CD0F30 01171 CALL $OPEN ;Only OPEN a FS 33CA 1803 01172 JR $+5 ;Branch around INIT 33CC 01173 FILFR @@INIT ;Open the receive file 33CC+3E3A 01174 LD A,58 33CE+EF 01175 RST 40 33CF C41A30 01176 CALL NZ,$ERROR ;Show any open error 33D2 C9 01177 RET 01178 ; 33D3 21D135 01179 NOTNOW LD HL,OPENMSG ;"File already open" 33D6 01180 @@DSPLY ;Show why ID failed 01181 IFEQ 00H,1 01182 LD HL, 01183 ENDIF 33D6+3E0A 01184 LD A,10 33D8+EF 01185 RST 40 33D9 C9 01186 RET 01187 ; 01188 ; Routines to turn off file devices 01189 ; 33DA AF 01190 FS_OFF XOR A ;File send 33DB 324130 01191 LD (FSSW+1),A 33DE C9 01192 RET 33DF AF 01193 FR_OFF XOR A ;File receive 33E0 322E31 01194 LD (FRSW+1),A 33E3 C9 01195 RET 33E4 AF 01196 FRIO_OFF XOR A ;Dump to disk 33E5 324831 01197 LD (FRIOSW+1),A 33E8 C9 01198 RET 01199 ; 01200 ; Call various tasks (on each main loop) 01201 ; 33E9 F3 01202 TASKS DI 01203 ; 01204 IF .NOT.BUFFRD ;W fcn does this if bfrd 01205 CALL TASK8A ;Try to receive from *CL 01206 ENDIF 01207 ; 33EA CD4434 01208 CALL TASK8B ;Try to send to *CL 33ED FB 01209 EI 33EE CD7434 01210 CALL TASKK ;Allow interrupts here 01211 IF .NOT.BUFFRD 01212 DI ;If RS232 does not interrupt 01213 ENDIF ;Printer must be task 33F1 CDB834 01214 CALL TASK9 33F4 FB 01215 EI 33F5 C34731 01216 JP FRIOSW ;Check on dump to disk 01217 ; 01218 ; INTERRUPT TASK 8 01219 ; WO/buffer A is done once per main loop + int rate 01220 ; B is done once per main loop + int rate 01221 ; W/buffer A is done by wakeup feature + int rate 01222 ; B is done once per main loop + int rate 01223 ; 01224 IF .NOT.BUFFRD 01225 TCB8 DW TASK8 01226 TASK8 CALL TASK8A 01227 JP TASK8B 01228 ENDIF 01229 ; 33F8 F3 01230 TASK8A DI 33F9 3EFF 01231 LD A,0FFH ;CL recv On/Off 33FB B7 01232 OR A 33FC C8 01233 RET Z ;Done if CL recv off 01234 ; 01235 ; @GET handler to keep interrupts off if possible 01236 ; 33FD 11E437 01237 LD DE,CLDCB ;=> OPEN DCB 3400 62 01238 FNDDVR LD H,D ;Xfer to HL 3401 6B 01239 LD L,E 3402 7E 01240 LD A,(HL) ;Get DCB type 3403 CB6F 01241 BIT 5,A ;Is it linked? 3405 2013 01242 JR NZ,LNKD ;Need CHNIO if so 3407 23 01243 INC HL ;=>address field of DCB 3408 5E 01244 LD E,(HL) ;If routed, address is 3409 23 01245 INC HL ; next DCB to use 340A 56 01246 LD D,(HL) ; else EP of driver 340B CB67 01247 BIT 4,A ;Z = not routed 340D 20F1 01248 JR NZ,FNDDVR ;Loop till not routed 340F E608 01249 AND 00001000B ;Can't talk to NIL device 3411 C0 01250 RET NZ 3412 EB 01251 EX DE,HL ;Address to HL 3413 111D34 01252 LD DE,RETADD ;Put RET address on stack 3416 D5 01253 PUSH DE ; 3417 FE02 01254 CP 2 ;Set C,NZ for input request 3419 E9 01255 JP (HL) ;Go to driver 01256 ; 341A 01257 LNKD @@GET ;Use SVC if LINKED 341A+3E03 01258 LD A,3 341C+EF 01259 RST 40 341D C0 01260 RETADD RET NZ ;NZ means no char rcv'd 01261 ; 341E 0600 01262 EIGHT LD B,0 ;Eight bit mode switch 3420 04 01263 INC B 3421 05 01264 DEC B 3422 2006 01265 JR NZ,XLTR1 ;Go if 8 bit 3424 E67F 01266 AND 7FH ;Strip bit 7 3426 C8 01267 RET Z ;Always ignore nulls 3427 FE7F 01268 CP 7FH ; & DELETE if not 8-bit 3429 C8 01269 RET Z 01270 ; 01271 ; Do XLATER after stripping high bit 01272 ; 342A FE00 01273 XLTR1 CP $-$ ;Character to translate? 342C 2002 01274 JR NZ,TSTNUL ;Go if not a match 342E 3E00 01275 XLTR2 LD A,$-$ ;Replace with xlated char 01276 ; 01277 ; NULL Parm now only affects 8-bit mode 01278 ; 3430 B7 01279 TSTNUL OR A ;Is char a null? 3431 2005 01280 JR NZ,KEEPCH ;Go if not 3433 06FF 01281 ACCNUL LD B,0FFH ;Default to accept nulls 3435 04 01282 INC B ;NZ=nulls wanted 3436 05 01283 DEC B ;Z=don't accept nulls 3437 C8 01284 RET Z 01285 ; 3438 DDE5 01286 KEEPCH PUSH IX ;Place in CL input buf 343A DD219D38 01287 LD IX,CLREC 343E CDD634 01288 CALL OUTPUT ;Out to the buffer if 3441 DDE1 01289 POP IX ; non-null or want nulls 3443 C9 01290 RET 01291 ; 3444 3EFF 01292 TASK8B LD A,0FFH ;CL send On/Off for 3446 B7 01293 OR A ; handshaking 3447 C8 01294 RET Z 3448 0E00 01295 LD C,0 ;Now xmit a CTL0 to 344A 11E437 01296 LD DE,CLDCB ;Ck the status of the 344D 01297 @@CTL ; CL 344D+3E05 01298 LD A,5 344F+EF 01299 RST 40 3450 C0 01300 RET NZ ;Indicates not ready 3451 0E00 01301 FRCPUT LD C,$-$ ;Force a char out? 3453 AF 01302 XOR A ;Clear it after p/u 3454 325234 01303 LD (FRCPUT+1),A 3457 B1 01304 OR C ;Check original status 3458 200D 01305 JR NZ,FRCIT ;Go if force on 345A DDE5 01306 PUSH IX 345C DD21A138 01307 LD IX,CLSEND ;Do we have a char to 3460 CD1635 01308 CALL BUFGET ; send to the CL? 3463 DDE1 01309 POP IX 3465 C8 01310 RET Z ;RET if not 3466 4F 01311 LD C,A ;Save character 3467 01312 FRCIT @@PUT ;Put it out 3467+3E04 01313 LD A,4 3469+EF 01314 RST 40 01315 ; 346A 3E00 01316 AUTXOFF LD A,0 ;Check for auto XOFF 346C B7 01317 OR A ;On? 346D C8 01318 RET Z ;Quit if not 346E 91 01319 SUB C ;Matched char? 346F C0 01320 RET NZ ;Quit if not 3470 324534 01321 LD (TASK8B+1),A ;Pause xmit (XOFF) 3473 C9 01322 RET 01323 ; 3474 01324 TASKK @@KBD ;Scan the keyboard 3474+3E08 01325 LD A,8 3476+EF 01326 RST 40 3477 C0 01327 RET NZ ;Error (or no key depressed) 3478 FE80 01328 CP BREAK ;Ck for brk 1st 347A 2815 01329 JR Z,ISBRK ;Go on a Break 347C B7 01330 OR A ;Then for high bit set 347D FA6831 01331 JP M,CMDKEY ;Go if FN key 3480 06FF 01332 KISW LD B,0FFH ;KI On/Off 3482 04 01333 INC B 3483 05 01334 DEC B 3484 C8 01335 RET Z ;Ret if KI is off 3485 DDE5 01336 NOTBRK PUSH IX 3487 DD219538 01337 LD IX,KIVCTR ; else put key into 348B CDAE38 01338 CALL OUTPGM ; the output buffer 348E DDE1 01339 POP IX 3490 C9 01340 RET 01341 ; 01342 ISBRK 3491 F3 01343 DI 3492 11E437 01344 LD DE,CLDCB ;Pt to *CL 3495 0E01 01345 LD C,1 ;Send CTL 1, a 3497 01346 @@CTL ; Break request 3497+3E05 01347 LD A,5 3499+EF 01348 RST 40 349A FB 01349 EI 349B 01A138 01350 LD BC,CLSEND 349E CD5533 01351 CALL FILR1 ;Reset the CL buffer 34A1 CDDA33 01352 CALL FS_OFF ;Turn off the *FS 34A4 010020 01353 LD BC,2000H ;Time delay 34A7 01354 @@PAUSE 34A7+3E10 01355 LD A,16 34A9+EF 01356 RST 40 34AA 01357 @@CKBRKC ;Reset the break bit 34AA+3E6A 01358 LD A,106 34AC+EF 01359 RST 40 34AD 0E00 01360 LD C,0 ;Init the character 34AF 11E437 01361 LD DE,CLDCB ;P/u the CL DCB 34B2 F3 01362 DI 34B3 01363 @@PUT ;Send the 0 34B3+3E04 01364 LD A,4 34B5+EF 01365 RST 40 34B6 FB 01366 EI 34B7 C9 01367 RET 01368 ; 01369 ; INTERRUPT TASK 9 01370 ; Only if RS232 does not interrupt 01371 ; 01372 IF .NOT.BUFFRD 01373 TCB9 DW TASK9 ;Task ept 01374 ENDIF 34B8 0603 01375 TASK9 LD B,3 ;Max chars/pass 34BA 0E00 01376 PRLOOP LD C,0 ;Test printer status 34BC 110000 01377 LD DE,$-$ ;PDCB$ 34BD 01378 PRDCB EQU $-2 34BF 01379 @@CTL ;Check the status 34BF+3E05 01380 LD A,5 34C1+EF 01381 RST 40 34C2 C0 01382 RET NZ ;Ret if unavailable 34C3 DDE5 01383 PUSH IX 34C5 DD219938 01384 LD IX,PRVCTR ;Get char from printer 01385 IF BUFFRD 34C9 CDB438 01386 CALL PGMGET 01387 ELSE 01388 CALL BUFGET ;Buffer if available 01389 ENDIF 34CC DDE1 01390 POP IX 34CE C8 01391 RET Z ;None to get, back 34CF 4F 01392 LD C,A 34D0 01393 @@PRT ;Output to printer 34D0+3E06 01394 LD A,6 34D2+EF 01395 RST 40 34D3 10E5 01396 DJNZ PRLOOP ;Loop if more 34D5 C9 01397 RET 01398 ; 01399 ; Common routine to stuff various buffers 01400 ; 34D6 DD6E00 01401 OUTPUT LD L,(IX) ;P/u pointer to 34D9 DD6601 01402 LD H,(IX+1) ; buffer PUT 34DC 77 01403 LD (HL),A ;Write char into buffer 34DD DD3400 01404 INC (IX) ;Bump buffer pointer 34E0 C0 01405 RET NZ ;Go if still in same page 34E1 CD3635 01406 CALL NEXTAP ;Find next avail page 34E4 2810 01407 JR Z,DUMPCHR ;Go if no pages available 34E6 DD7701 01408 LD (IX+1),A ;Set index to new page 34E9 21AD38 01409 LD HL,FREEPG ;Reduce the amount of 34EC 35 01410 DEC (HL) ; free pages 34ED 3E07 01411 LD A,7 ;Less than 2K available? 34EF BE 01412 CP (HL) 34F0 D8 01413 RET C ; & return with NZ 34F1 322430 01414 LD (MAINLP+1),A ;Set flag for warning 34F4 B7 01415 OR A ;Ensure NZ return 34F5 C9 01416 RET 01417 ; 01418 ; No more pages available - keep last page 01419 ; 34F6 DD3500 01420 DUMPCHR DEC (IX) ;Dump character and 34F9 AF 01421 XOR A ; return 34FA C9 01422 RET 01423 ; 01424 ; The following code is not executed, as it is too 01425 ; slow at rates >= 1200 baud because interuppts are on. 01426 ; DE must be loaded with KIVCTR. 01427 ; 34FB 00 01428 DB 0 34FC DDE5 01429 PUSH IX ;Dev requesting the output 34FE E1 01430 POP HL 34FF AF 01431 XOR A ;The difference will be 3500 ED52 01432 SBC HL,DE ; the offset into the 3502 116A3E 01433 LD DE,DEVICE$ ; name table 3505 19 01434 ADD HL,DE 3506 010400 01435 LD BC,4 3509 11893E 01436 LD DE,OVRRUN$+3 350C EDB0 01437 LDIR 350E 21863E 01438 LD HL,OVRRUN$ ;Display the buffer 3511 01439 @@DSPLY ; overrun error 01440 IFEQ 00H,1 01441 LD HL, 01442 ENDIF 3511+3E0A 01443 LD A,10 3513+EF 01444 RST 40 3514 AF 01445 XOR A ; reuse current page 3515 C9 01446 RET 01447 ; 01448 ; Check for character available in dynamic buffer 01449 ; 3516 DD6E02 01450 BUFGET LD L,(IX+2) ;P/u pointer to next 3519 DD6603 01451 LD H,(IX+3) ; buffer GET 351C 7D 01452 LD A,L ;Check on in=out lo-order 351D DDBE00 01453 CP (IX) 3520 2005 01454 JR NZ,INNEOUT ;Go if in not equal out 3522 7C 01455 LD A,H ;Check on in=out hi-order 3523 DDBE01 01456 CP (IX+1) 3526 C8 01457 RET Z ;Ret if none to i/o 01458 ; 01459 ; Buffer is not empty - Get next character 01460 ; 3527 7E 01461 INNEOUT LD A,(HL) ;Get a char from buffer 3528 DD3402 01462 INC (IX+2) ;Advance lo-order pointer 352B C0 01463 RET NZ ;Ret if still same page 352C F5 01464 PUSH AF ;Save the character 352D CD4E35 01465 CALL FNPIU ;Find next page in use 3530 DD7703 01466 LD (IX+3),A ;Stuff new page index 3533 F1 01467 POP AF ;Recover the character 3534 25 01468 DEC H ;Set NZ return for rcvd 3535 C9 01469 RET 01470 ; 01471 ; Routine to find next available page buffer 01472 ; 3536 6C 01473 NEXTAP LD L,H ;Point to page buffer 3537 2639 01474 LD H,LINKS<-8 ; index 353r9 3A0039 01475 LD A,(LINKS) ;Get next empty link 353C E5 01476 PUSH HL ;Save this index pointer 353D 6F 01477 LD L,A ;Point to new link 353E 7E 01478 LD A,(HL) ;Get what it links to 353F B7 01479 OR A ;Test if none left 3540 2002 01480 JR NZ,GOTNAP ;Go if still more 3542 E1 01481 POP HL ;Restore reg & return 3543 C9 01482 RET ; with Z-flag for error 01483 ; 01484 ; Found the next available page - set the links 01485 ; 3544 320039 01486 GOTNAP LD (LINKS),A ;Update new next avail 3547 7D 01487 LD A,L ;Xfer index of new page 3548 E1 01488 POP HL ;Rcvr pointer to index 3549 77 01489 LD (HL),A ; of old & link to new 354A 6F 01490 LD L,A ;Repoint to new page's 354B 3600 01491 LD (HL),0 ; index & show it is 354D C9 01492 RET ; the last one 01493 ; 01494 ; Find next page in use 01495 ; 354E 3AAD38 01496 FNPIU LD A,(FREEPG) ;Show one additional 3551 3C 01497 INC A ; page is free 3552 32AD38 01498 LD (FREEPG),A 3555 3A0139 01499 LD A,(HIPAGE) ;P/u highest page avail 3558 6F 01500 LD L,A ;Set HL to its index 3559 7C 01501 LD A,H 355A 2639 01502 LD H,LINKS<-8 ;Show that page links to 355C 77 01503 LD (HL),A ; the one we just emptied 355D 320139 01504 LD (HIPAGE),A ;Now update the new end 3560 6F 01505 LD L,A ;Set HL to the emptied 3561 7E 01506 LD A,(HL) ; page, p/u what it 3562 3600 01507 LD (HL),0 ; linked to, & show old 3564 C9 01508 RET ; is end. Ret A=link 01509 ; 01510 ; Execute a DOS command 01511 ; 3565 21FF2F 01512 DOSCMD LD HL,BASE-1 3568 0601 01513 LD B,1 ;Set LOW$ 356A 01514 @@HIGH$ 356A+3E64 01515 LD A,100 356C+EF 01516 RST 40 356D 219A35 01517 LD HL,CMDPMT ;Issue prompt 3570 01518 @@DSPLY 01519 IFEQ 00H,1 01520 LD HL, 01521 ENDIF 3570+3E0A 01522 LD A,10 3572+EF 01523 RST 40 3573 010050 01524 LD BC,80<8 ;Max characters 3576 214438 01525 LD HL,DUMMY ;=>input buffer 3579 01526 @@KEYIN ;Get command request 3579+3E09 01527 LD A,9 357B+EF 01528 RST 40 357C D8 01529 RET C ;Back on Break 357D 04 01530 INC B 357E 05 01531 DEC B 357F C8 01532 RET Z ; or CR only 3580 EB 01533 EX DE,HL 3581 210000 01534 LD HL,$-$ ;Pt to CFLAG$ 3582 01535 CFLAG EQU $-2 3584 CB46 01536 BIT 0,(HL) ;Get current status 3586 E5 01537 PUSH HL 3587 F5 01538 PUSH AF ;Save memory freeze status 3588 CBC6 01539 SET 0,(HL) ;Freeze memory 358A EB 01540 EX DE,HL 358B 01541 @@CMNDR ;Do the command 358B+3E19 01542 LD A,25 358D+EF 01543 RST 40 358E 21AB35 01544 LD HL,CMPLTD ;Show cmd finished 3591 01545 @@DSPLY 01546 IFEQ 00H,1 01547 LD HL, 01548 ENDIF 3591+3E0A 01549 LD A,10 3593+EF 01550 RST 40 3594 F1 01551 POP AF ;Get the previous status 3595 E1 01552 POP HL ; and CFLAG$ location 3596 C0 01553 RET NZ ;Back if was set before 3597 CB86 01554 RES 0,(HL) ; else restore it 3599 C9 01555 RET 359A 0A 01556 CMDPMT DB LF,LF,'Enter command:',CR 0A 45 6E 74 65 72 20 63 6F 6D 6D 61 6E 64 3A 0D 35AB 0A 01557 CMPLTD DB LF,'Command completed',CR 43 6F 6D 6D 61 6E 64 20 63 6F 6D 70 6C 65 74 65 64 0D 01558 ; 01559 ; Messages 01560 ; 35BE 7B 01561 BRAKET DB '{ }',3 ;Brackets around hex byte 20 20 7D 03 35C3 1D 01562 FILEPMT DB 29,10,'File name: ',3 0A 46 69 6C 65 20 6E 61 6D 65 3A 20 03 35D1 1D 01563 OPENMSG DB 29,10,'File already open',CR 0A 46 69 6C 65 20 61 6C 72 65 61 64 79 20 6F 70 65 6E 0D 35E5 0A 01564 MNUMSG DB LF 35E6 20 01565 STAT1 DB ' ' 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 360A 20 01566 DB ' ',LF 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0A 362E 44 01567 DB 'DUPLX ECHO ECOLF ACCLF REWND PEOF ' 55 50 4C 58 20 45 43 48 4F 20 20 45 43 4F 4C 46 20 41 43 43 4C 46 20 52 45 57 4E 44 20 50 45 4F 46 20 20 3652 20 01568 DB ' DCC CLS 8-B CMD HNDSH EXIT',LF 44 43 43 20 20 20 43 4C 53 20 20 20 38 2D 42 20 20 20 43 4D 44 20 20 48 4E 44 53 48 20 20 45 58 49 54 0A 3676 3D 01569 DB '==1== ==2== ==3== ==4== ==5== ==6== ' 3D 31 3D 3D 20 3D 3D 32 3D 3D 20 3D 3D 33 3D 3D 20 3D 3D 34 3D 3D 20 3D 3D 35 3D 3D 20 3D 3D 36 3D 3D 20 369A 3D 01570 DB '==7== ==8== ==9== ==0== ' 3D 37 3D 3D 20 3D 3D 38 3D 3D 20 3D 3D 39 3D 3D 20 3D 3D 30 3D 3D 20 01571 IF @MOD4 36B2 3D 01572 DB '==:== ==-==' 3D 3A 3D 3D 20 3D 3D 2D 3D 3D 01573 ENDIF 01574 IF @MOD2 01575 DB '==-== =====' 01576 ENDIF 36BD 0A 01577 DB LF 36BE 20 01578 DB ' *KI *DO *PR *CL *FS *FR ' 2A 4B 49 20 20 20 2A 44 4F 20 20 20 2A 50 52 20 20 20 2A 43 4C 20 20 20 2A 46 53 20 20 20 2A 46 52 20 20 36E2 20 01579 DB ' DTD ??? ID RES ON OFF',LF 44 54 44 20 20 20 3F 3F 3F 20 20 20 49 44 20 20 20 20 52 45 53 20 20 20 4F 4E 20 20 20 20 4F 46 46 0A 3705 20 01580 STAT2 DB ' ' 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 372A 20 01581 DB ' ',CR 20 0D 372D 8134 01582 STATAB DW KISW+1,STAT2+2,DEVOUT+1,STAT2+8 0737 1731 0D37 3735 3B31 01583 DW PUTPR+1,STAT2+14,TASK8B+1,STAT2+19 1337 4534 1837 373D FA33 01584 DW TASK8A+2,STAT2+21,FSSW+1,STAT2+26 1A37 4130 1F37 3745 2E31 01585 DW FRSW+1,STAT2+32,FRIOSW+1,STAT2+38 2537 4831 2B37 374D 6A30 01586 DW DPLXSW+1,STAT1+2,ECHOSW+1,STAT1+8 E835 C930 EE35 3755 0A31 01587 DW ECOLF,STAT1+14,ACCLFSW+1,STAT1+20 F435 DB30 FA35 375D 8930 01588 DW DSPCTRL+1,STAT1+38,EIGHT+1,STAT1+50 0C36 1F34 1836 3765 A330 01589 DW SHAKE+1,STAT1+61 2336 3769 46 01590 FSNAME$ DB 'FS-Spec: ',3 53 2D 53 70 65 63 3A 20 03 3773 20 01591 FRNAME$ DB ' FR-Spec: ',3 20 46 52 2D 53 70 65 63 3A 20 03 377F 20 01592 PAGSPR$ DB ' Memory: K',CR 20 4D 65 6D 6F 72 79 3A 20 20 20 4B 0D 378D 2A 01593 CMDERR$ DB '** Invalid command sequence **',CR 2A 20 49 6E 76 61 6C 69 64 20 63 6F 6D 6D 61 6E 64 20 73 65 71 75 65 6E 63 65 20 2A 2A 0D 37AC 57 01594 LILPG$ DB 'Warning! Less than 2K of buffer left ' 61 72 6E 69 6E 67 21 20 4C 65 73 73 20 74 68 61 6E 20 32 4B 20 6F 66 20 62 75 66 66 65 72 20 6C 65 66 74 20 37D1 20 01595 DB ' X-OFF transmitted',CR 58 2D 4F 46 46 20 74 72 61 6E 73 6D 69 74 74 65 64 0D 01596 ; 01597 ; File control blocks 01598 ; 37E4 01599 CLDCB DS 32 3804 01600 FS_FCB DS 32 3824 01601 FR_FCB DS 32 3844 01602 DUMMY DS 81 ;Used for dos cmd buffer also 01603 ; 01604 ; Put/Get index pointers 01605 ; 3895 0000 01606 KIVCTR DW 0,0 0000 3899 0000 01607 PRVCTR DW 0,0 0000 389D 0000 01608 CLREC DW 0,0 0000 38A1 0000 01609 CLSEND DW 0,0 0000 38A5 0000 01610 FSVCTR DW 0,0 0000 38A9 0000 01611 FRVCTR DW 0,0 0000 38AD 01612 FREEPG DS 1 01613 ; 01614 ; Routines to buffer I/O in pgm loop 01615 ; 38AE F3 01616 OUTPGM DI 38AF CDD634 01617 CALL OUTPUT 38B2 FB 01618 EI 38B3 C9 01619 RET 38B4 F3 01620 PGMGET DI 38B5 CD1635 01621 CALL BUFGET 38B8 FB 01622 EI 38B9 C9 01623 RET 01624 ; 01625 ; Page buffer Link table 01626 ; 3900 01627 ORG $<-8+1<+8 3900 01628 LINKS DS 1 ;Link to next available 3901 01629 HIPAGE DS 1 ;Link to last available 3902 01630 DS 1 ;Init to 1st avail 3903 01631 DS 1 ;Init to last avail 3904 01632 DS 252 ;Space for linkage tables 01633 ; 01634 ; Transmit and Receive File buffers 01635 ; 3A00 01636 XMTBUF DS 256 3B00 01637 RCVBUF DS 256 01638 ; 3C00 01641 *GET LCOMMA:3 ;Initialization code 01642 ;LCOMMA/ASM - COMM Initialization Code 01643 ; 01644 ; Entry point to LCOMM 01645 ; 01646 LCOMM 3C00 01647 @@CKBRKC ;Check for break 3C00+3E6A 01648 LD A,106 3C02+EF 01649 RST 40 3C03 2804 01650 JR Z,LCOMMA ;Continue if not 3C05 21FFFF 01651 LD HL,-1 ; else ABORT 3C08 C9 01652 RET 01653 ; 3C09 F3 01654 LCOMMA DI 3C0A ED730430 01655 LD (STACK),SP ;Save for exit 3C0E E5 01656 PUSH HL ;Save ptr to CMD buffer 3C0F 210000 01657 LD HL,0 3C12 01658 @@BREAK ;Disable break vectoring 01659 IFEQ 00H,1 01660 LD HL, 01661 ENDIF 3C12+3E67 01662 LD A,103 3C14+EF 01663 RST 40 3C15 FB 01664 EI 3C16 21533D 01665 LD HL,HELLO$ ;Issue the copyright 3C19 01666 @@DSPLY 01667 IFEQ 00H,1 01668 LD HL, 01669 ENDIF 3C19+3E0A 01670 LD A,10 3C1B+EF 01671 RST 40 3C1C E1 01672 POP HL 3C1D 11E437 01673 LD DE,CLDCB ;Point to FCB 3C20 01674 @@FSPEC ;Get the *CL spec 3C20+3E4E 01675 LD A,78 3C22+EF 01676 RST 40 3C23 C24A3D 01677 JP NZ,BADCL ;Go error if none 3C26 1A 01678 LD A,(DE) 3C27 FE2A 01679 CP '*' ;Ck for device spec 3C29 C24A3D 01680 JP NZ,BADCL ;Go if not a device 3C2C 11A23E 01681 LD DE,PRMTBL$ 3C2F 01682 @@PARAM ;Parse the parms 3C2F+3E11 01683 LD A,17 3C31+EF 01684 RST 40 3C32 F5 01685 PUSH AF ;Save status 3C33 C41A30 01686 CALL NZ,$ERROR ;Display any error 3C36 F1 01687 POP AF 3C37 C20A30 01688 JP NZ,$ABORT ; and then quit 01689 ; 3C3A 0600 01690 LD B,0 3C3C 11E437 01691 LD DE,CLDCB ;Open the comm line 3C3F 01692 @@OPEN 3C3F+3E3B 01693 LD A,59 3C41+EF 01694 RST 40 3C42 F5 01695 PUSH AF 3C43 C41A30 01696 CALL NZ,$ERROR ;Show any open error 3C46 F1 01697 POP AF 3C47 C20A30 01698 JP NZ,$ABORT ; and then quit 3C4A 0E02 01699 LD C,2 ;INIT function for hardware 3C4C 01700 @@CTL ;Just in case 3C4C+3E05 01701 LD A,5 3C4E+EF 01702 RST 40 3C4F 21D63D 01703 LD HL,GETMNU$ ;How the user gets menu 3C52 01704 @@DSPLY 01705 IFEQ 00H,1 01706 LD HL, 01707 ENDIF 3C52+3E0A 01708 LD A,10 3C54+EF 01709 RST 40 3C55 AF 01710 XOR A 3C56 320438 01711 LD (FS_FCB),A ;Init FCB's to OFF 3C59 322438 01712 LD (FR_FCB),A 3C5C ED5BA03E 01713 LD DE,(PRNAME) ;Load 'PR' backwards 3C60 01714 @@GTDCB 3C60+3E52 01715 LD A,82 3C62+EF 01716 RST 40 3C63 22BD34 01717 LD (PRDCB),HL ;Store address for @CTL 3C66 01718 @@FLAGS ;Set up IY 3C66+3E65 01719 LD A,101 3C68+EF 01720 RST 40 3C69 FDE5 01721 PUSH IY 3C6B D1 01722 POP DE 3C6C 211200 01723 LD HL,'S'-'A' ;Offset to SFLAG$ 3C6F 19 01724 ADD HL,DE 3C70 221130 01725 LD (SFLG),HL ;Store for later 3C73 210A00 01726 LD HL,'K'-'A' ;Offset to KFLAG$ 3C76 19 01727 ADD HL,DE 3C77 CB86 01728 RES 0,(HL) ;Be sure BREAK bit is off 3C79 210200 01729 LD HL,'C'-'A' ;CFLAG$ 3C7C 19 01730 ADD HL,DE 3C7D 228235 01731 LD (CFLAG),HL 3C80 CB4E 01732 BIT 1,(HL) ;Doing CMNDR? 3C82 210000 01733 LD HL,0 3C85 45 01734 LD B,L 3C86 2801 01735 JR Z,$+3 ;Use LOW$ if CMNDR 3C88 04 01736 INC B 3C89 01737 @@HIGH$ 3C89+3E64 01738 LD A,100 3C8B+EF 01739 RST 40 3C8C 23 01740 INC HL ;Available for use 3C8D 25 01741 DEC H ; by page buffers 3C8E 44 01742 LD B,H ;Set B to highest usable 3C8F 210039 01743 LD HL,LINKS 3C92 3E3C 01744 LD A,LCOMM<-8 ;Establish 1st usable 3C94 77 01745 LD (HL),A ;Init to 1st available 3C95 2C 01746 INC L ; page buffer 3C96 70 01747 LD (HL),B ;Init to highest page 3C97 2C 01748 INC L ; buffer available 3C98 77 01749 LD (HL),A ;Init to begin & highest 3C99 2C 01750 INC L 3C9A 70 01751 LD (HL),B 01752 ; 01753 ; Establish page buffer linkage table 01754 ; 3C9B 6F 01755 DOLINKS LD L,A ;Init memory begin to 3C9C 3C 01756 INC A ; high bytes for as many 3C9D 77 01757 LD (HL),A ; bytes as pages to top 3C9E B8 01758 CP B 3C9F 20FA 01759 JR NZ,DOLINKS 3CA1 6F 01760 LD L,A 3CA2 3600 01761 LD (HL),0 ;Close out with zero 01762 ; 01763 ; Establish starting page buffers for devices 01764 ; 3CA4 2604 01765 LD H,4 ;Init 1st at links+4 3CA6 DD219538 01766 LD IX,KIVCTR 3CAA CDE63C 01767 CALL INITBUF ;Init *KI page buffer 3CAD DD219938 01768 LD IX,PRVCTR 3CB1 CDE63C 01769 CALL INITBUF ;Init *PR page buffer 3CB4 DD219D38 01770 LD IX,CLREC 3CB8 CDE63C 01771 CALL INITBUF ;Init *CL-R page buffer 3CBB DD21A138 01772 LD IX,CLSEND 3CBF CDE63C 01773 CALL INITBUF ;Init *CL-S page buffer 3CC2 DD21A538 01774 LD IX,FSVCTR 3CC6 CDE63C 01775 CALL INITBUF ;Init *FS page buffer 3CC9 DD21A938 01776 LD IX,FRVCTR 3CCD CDE63C 01777 CALL INITBUF ;Init *FR page buffer 01778 ; 01779 ; Calculate free buffer space 01780 ; 3CD0 2639 01781 LD H,LINKS<-8 ;P/u hi-order link table 3CD2 0600 01782 LD B,0 ;Init count to zero 3CD4 3A0039 01783 LD A,(LINKS) ;Find pointer to 1st spr 3CD7 6F 01784 LD L,A 3CD8 7E 01785 FBS1 LD A,(HL) ;P/u pointer to next 3CD9 B7 01786 OR A ; spare & test if last 3CDA 2804 01787 JR Z,FBS2 ;Exit if no more 3CDC 04 01788 INC B ;Bump counter 3CDD 6F 01789 LD L,A ;Show new pointer 3CDE 18F8 01790 JR FBS1 3CE0 78 01791 FBS2 LD A,B ;Transfer the count 3CE1 32AD38 01792 LD (FREEPG),A ; and save it 3CE4 1818 01793 JR SETUPT 01794 ; 01795 ; Routine to establish starting page buffers 01796 ; 3CE6 DD360000 01797 INITBUF LD (IX),0 ;Show low-order PUT/GET 3CEA DD360200 01798 LD (IX+2),0 ; start at 0 reference 3CEE E5 01799 PUSH HL 3CEF CD3635 01800 CALL NEXTAP ;Find next available page 3CF2 CA463D 01801 JP Z,NOBUFS ;Go if insufficient pages 3CF5 E1 01802 POP HL 3CF6 DD7701 01803 LD (IX+1),A ;Set high-order PUT/GET 3CF9 DD7703 01804 LD (IX+3),A ; page index pointers 3CFC 24 01805 INC H ;Bump to next entry in 3CFD C9 01806 RET ; link table & return 01807 ; 01808 ; Routine to set up the task processor 01809 ; 01810 SETUPT 01811 IF .NOT.BUFFRD 01812 LD DE,TCB8 ;CL task process 01813 LD C,8 01814 @@ADTSK 01815 LD DE,TCB9 ;Printer output task 01816 LD C,9 ;Only if RS232 does 01817 @@ADTSK ; not interrupt 01818 ENDIF 01819 ; 01820 IF BUFFRD 3CFE 11E437 01821 LD DE,CLDCB ;Turn on wakeup feature 3D01 FD21F833 01822 LD IY,TASK8A ;Wakeup driver address 3D05 0E04 01823 LD C,4 ;Set addr CTL value 3D07 F3 01824 DI 3D08 01825 @@CTL ;Send to Com driver 3D08+3E05 01826 LD A,5 3D0A+EF 01827 RST 40 3D0B FB 01828 EI 3D0C FD221432 01829 LD (OLDVEC),IY ;Save previous state 01830 ENDIF 01831 ; 3D10 21EE3D 01832 LD HL,LFEEDS ;Clear most of screen 3D13 01833 @@DSPLY 01834 IFEQ 00H,1 01835 LD HL, 01836 ENDIF 3D13+3E0A 01837 LD A,10 3D15+EF 01838 RST 40 01839 ; 01840 ; Transfer any translation characters 01841 ; 3D16 3AEA3E 01842 LD A,(XLATES+1) ;Transfer the output 3D19 326430 01843 LD (XLTS1+1),A ; translation character 3D1C 3AE93E 01844 LD A,(XLATES) 3D1F 326830 01845 LD (XLTS2+1),A 01846 ; 3D22 3AEC3E 01847 LD A,(XLATER+1) ;Transfer the input 3D25 322B34 01848 LD (XLTR1+1),A ; translation character 3D28 3AEB3E 01849 LD A,(XLATER) 3D2B 322F34 01850 LD (XLTR2+1),A 01851 ; 3D2E 3AE33E 01852 LD A,(NULLPRM) ;Transfer the null parm 3D31 323434 01853 LD (ACCNUL+1),A 3D34 3AE53E 01854 LD A,(XONP) ;Transfer the XON/XOFF 3D37 32A930 01855 LD (XONP1),A ; parms 3D3A 3AE73E 01856 LD A,(XOFFP) 3D3D 32AD30 01857 LD (XOFFP1),A 3D40 322F30 01858 LD (XOFFP2),A 3D43 C32330 01859 JP MAINLP 01860 ; 01861 ; Error handling on initialization 01862 ; 3D46 21413E 01863 NOBUFS LD HL,NOBUFS$ ;"Not enuf mem for buffers 3D49 DD 01864 DB 0DDH 3D4A 21223E 01865 BADCL LD HL,BADCL$ ;"Need RS-232 device name 3D4D 01866 @@LOGOT 01867 IFEQ 00H,1 01868 LD HL, 01869 ENDIF 3D4D+3E0C 01870 LD A,12 3D4F+EF 01871 RST 40 3D50 C30A30 01872 JP $ABORT 01873 ; 01874 Messages 01875 ; 3D53 43 01876 HELLO$ DB 'COMM' 4F 4D 4D 3D57 01877 *GET CLIENT:3 01878 ;CLIENT/ASM - File to establish sign-on headers 01879 ; and version numbers. 01880 ; 01881 ; EACH STRING SHOULD CONTAIN ONLY 63 CHARACTERS !! 01882 ; 01883 IF @BLD631 01884 ; 12345678901234567890123456789012345678901234567890 3D57 20 01885 DB ' - 6.3.1 - Copyright 1982/83/84/86/90 by MISOSYS, ';<631> 2D 20 36 2E 33 2E 31 20 2D 20 43 6F 70 79 72 69 67 68 74 20 31 39 38 32 2F 38 33 2F 38 34 2F 38 36 2F 39 30 20 62 79 20 4D 49 53 4F 53 59 53 2C 20 3D89 49 01886 DB 'Inc., ',10 ;<631> 6E 63 2E 2C 20 20 20 20 20 20 20 0A 01887 ELSE 01888 DB ' - 6.3.0 - Copyright 1982/83/84/86 by Logical Syst' 01889 DB 'ems, Inc. ',10 01890 ENDIF 01891 ; 01892 ; DB 'All Rights Reserved. Licensed 1982/83/84 to Tandy ' 01893 ; DB 'Corporation.',10,13 01894 ; 01895 ; DB 'All Rights Reserved. Beta-TEST Level/AD, DO NOT DI' 01896 ; DB 'STRIBUTE !! ',10,13 01897 ; DB 'All Rights reserved by LSI, 8970 N. 55th St. Milwa' 01898 ; DB 'ukee, Wisc. ',10,13 3D96 41 01899 DB 'All Rights Reserved. Unauthorized duplication is p' 6C 6C 20 52 69 67 68 74 73 20 52 65 73 65 72 76 65 64 2E 20 55 6E 61 75 74 68 6F 72 69 7A 65 64 20 64 75 70 6C 69 63 61 74 69 6F 6E 20 69 73 20 70 3DC8 72 01900 DB 'rohibited. ',10,13 6F 68 69 62 69 74 65 64 2E 20 20 0A 0D 01901 IF @MOD4 3DD6 55 01902 GETMNU$ DB 'Use for menu',LF,CR 73 65 20 3C 43 4C 45 41 52 2D 38 3E 20 66 6F 72 20 6D 65 6E 75 0A 0D 01903 ENDIF 01904 IF @MOD2 01905 GETMNU$ DB 'Use for menu',LF,CR 01906 ENDIF 3DEE 0A 01907 LFEEDS DB LF,LF,LF,LF,LF,LF,LF 0A 0A 0A 0A 0A 0A 3DF5 0A 01908 DB LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,14,3 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0E 03 01909 ; 3E02 00 01910 DC 32,0 ;Patch space 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 01911 ; 3E22 43 01912 BADCL$ DB 'Comm Line driver not specified',CR 6F 6D 6D 20 4C 69 6E 65 20 64 72 69 76 65 72 20 6E 6F 74 20 73 70 65 63 69 66 69 65 64 0D 3E41 49 01913 NOBUFS$ DB 'Insufficient memory to establish buffers',CR 6E 73 75 66 66 69 63 69 65 6E 74 20 6D 65 6D 6F 72 79 20 74 6F 20 65 73 74 61 62 6C 69 73 68 20 62 75 66 66 65 72 73 0D 3E6A 20 01914 DEVICE$ DB ' KI PR CL-RCL-S FS FR ????' 4B 49 20 20 50 52 20 43 4C 2D 52 43 4C 2D 53 20 46 53 20 20 46 52 20 3F 3F 3F 3F 3E86 2A 01915 OVRRUN$ DB '** xxxx Buffer overrun **',3 2A 20 78 78 78 78 20 42 75 66 66 65 72 20 6F 76 65 72 72 75 6E 20 2A 2A 03 3EA0 50 01916 PRNAME DB 'PR' 52 01917 ; 3EA2 58 01918 PRMTBL$ DB 'XLATES' 4C 41 54 45 53 3EA8 E93E 01919 DW XLATES 3EAA 58 01920 DB 'XS ' 53 20 20 20 20 3EB0 E93E 01921 DW XLATES 3EB2 58 01922 DB 'XLATER' 4C 41 54 45 52 3EB8 EB3E 01923 DW XLATER 3EBA 58 01924 DB 'XR ' 52 20 20 20 20 3EC0 EB3E 01925 DW XLATER 3EC2 4E 01926 DB 'NULL ' 55 4C 4C 20 20 3EC8 E33E 01927 DW NULLPRM 3ECA 4E 01928 DB 'N ' 20 20 20 20 20 3ED0 E33E 01929 DW NULLPRM 3ED2 58 01930 DB 'XON ' 4F 4E 20 20 20 3ED8 E53E 01931 DW XONP 3EDA 58 01932 DB 'XOFF ' 4F 46 46 20 20 3EE0 E73E 01933 DW XOFFP 3EE2 00 01934 NOP 01935 ; 3EE3 FFFF 01936 NULLPRM DW -1 ;Default to accept nulls 3EE5 1100 01937 XONP DW 'Q'-40H ;Ctl-Q 3EE7 1300 01938 XOFFP DW 'S'-40H ;Ctl-S 3EE9 0000 01939 XLATES DW 0 3EEB 0000 01940 XLATER DW 0 01941 ; 3C00 01942 END LCOMM 3C00 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]