LS-DOS 6.3.1 - COMM Utility Assembly Listing (HTML format version)

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

Valid HTML 4.01!