[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 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 at nemesis.lonestar.org]