home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / COMMS / MODEM9.ARC / MAIN.ASM < prev    next >
Assembly Source File  |  1991-02-02  |  23KB  |  1,283 lines

  1. ;
  2. ;        MAIN.ASM
  3. ;
  4. ;Main line routines for MODEM9.xx.
  5. ;
  6.     ORG    0AD0H
  7. ;
  8. START:    LXI    H,0
  9.     DAD    SP    ;GET CP/M'S STACK
  10.     SHLD    STACK    ;SAVE IT
  11.     LXI    SP,STACK    ;START LOCAL STACK
  12.     CALL    INITADR    ;INITIALIZE ADDRESSES
  13.     CALL    VERNUM    ;GIVE CONFIGURATION MESSAGE
  14. ;    CALL    INITMOD    ;SET DEFAULT BAUD RATE (300)
  15.     CALL    GETUSR    ;GET USER
  16.     STA    SAVUSR    ;SAVE FOR EXIT
  17.     MVI    A,TRUE    ;0FFH
  18.     STA    NFILFLG
  19.     CMA        ;0
  20.     STA    SAVEFLG
  21.     CALL    PROCOPT    ;PROCESS CONTROL OPTIONS
  22. ;
  23. RESTART:
  24.     LDA    OPTION    ;GET MAIN OPTION
  25.     CPI    ' '    ;NO OPTION SPEC'D?
  26.     JZ    MENU    ;TRUE, GO MENU
  27.     CPI    'H'    ;MENU ASKED FOR?
  28.     JZ    MENU2    ;YES, GO MENU2
  29.     CALL    INITMOD
  30.     CALL    MOVEFCB
  31.     CALL    IN$MODDATP ;GOBBLE UP GARBAGE..
  32.     CALL    IN$MODDATP ;..CHARACTERS ON LINE
  33.     XRA    A
  34.     STA    ECHOFLG    ;RESET ECHO FLAG
  35.     STA    LOCFLG    ;RESET LOCAL FLAG
  36.     LDA    OPTION    ;PROCESS MAIN OPTION
  37.     CPI    'E'    ;ECHO MODE?
  38.     JNZ    NOECH    ;JUMP IF NOT
  39.     MVI    A,TRUE    ;SET ECHO TO TRUE
  40.     STA    ECHOFLG
  41.     JMP    DSKSAVE
  42. NOECH:    CPI    'L'    ;LOCAL ECHO MODE
  43.     JNZ    NOLOC
  44.     MVI    A,TRUE
  45.     STA    LOCFLG
  46.     JMP    DSKSAVE
  47. NOLOC:    CPI    'T'    ;TERMINAL MODE?
  48.     JZ    DSKSAVE    ;YES
  49.     CPI    'S'    ;SEND A FILE?
  50.     JZ    SENDFIL    ;YES
  51.     CPI    'R'    ;RECEIVE A FILE?
  52.     JZ    RCVFIL    ;YES
  53.     CALL    NOTVLDMSG    ;SAY NOT A VALID OPTION
  54.     JMP    MENU    ;NO VALID OPTION SPEC'D, GO MENU
  55. ;
  56. INITADR:
  57.     LHLD    1
  58.     LXI    D,3
  59.     DAD    D
  60.     SHLD    VSTAT+1
  61.     DAD    D
  62.     SHLD    VKEYIN+1
  63.     DAD    D
  64.     SHLD    VTYPE+1
  65.     DAD    D
  66.     SHLD    VLIST+1
  67.     LXI    D,30
  68.     DAD    D
  69.     SHLD    VLSTAT+1
  70.     JMP    INITMOD    ;RETURN DONE FROM THIS ROUTINE..
  71. ;
  72. ; CHECK OPTIONS, PUT 0 IN APPROPRIATE PLACES IN OPTION TABLE
  73. ; IF OPTION SELECTED
  74. ;
  75. PROCOPT:
  76.     LXI    D,FCB+1
  77.     LDAX    D
  78.     STA    OPTION
  79. OPTLP:    INX    D
  80.     LDAX    D
  81.     CPI    ' '
  82.     JZ    ENDOPT
  83.     LXI    H,OPTBL
  84.     MVI    B,OPTBE-OPTBL
  85. OPTCK:    CMP    M
  86.     JNZ    OPTNO
  87.     CPI    'B'
  88.     JNZ    OPTCK1
  89.     LDA    OPTION
  90.     CPI    'S'
  91.     JZ    OPTCK1
  92.     CPI    'R'
  93.     JNZ    OPTNO1
  94. OPTCK1:    MVI    M,0
  95.     JMP    OPTLP
  96. ;
  97. OPTNO:    INX    H
  98.     DCR    B
  99.     JNZ    OPTCK
  100. OPTNO1:    CALL    NOTVLDMSG
  101.     POP    PSW    ;PRESERVE STACK
  102.     JMP    MENU
  103. ;
  104. ENDOPT:    LDA    VSEEFLG    
  105.     ORA    A
  106.     RNZ
  107.     STA    QFLG    ;IF VIEWING SUPPRESS ALL ELSE
  108.     RET
  109. ;
  110. MOVEFCB:
  111.     LXI    H,FCB+16
  112.     LXI    D,FCB
  113.     MVI    B,16
  114.     CALL    MOVE
  115.     XRA    A
  116.     STA    FCBSNO
  117.     STA    FCBEXT
  118.     RET
  119. ;
  120. ;
  121. PRTMSG:    MVI    C,PRINT
  122.     JMP    BDOS
  123. ;
  124. EXIT:    LDA    SAVUSR
  125.     MOV    E,A
  126.     CALL    SETUSR
  127.     LXI    D,80H
  128.     MVI    C,STDMA
  129.     CALL    BDOS
  130.     CALL    CKMODM        ;CATCH ANY GARBAGE CHARACTERS
  131.     LHLD    STACK
  132.     SPHL
  133.     LDA    SAVCCP
  134.     ORA    A
  135.     JZ    0    ;WARM BOOT
  136.     RET
  137. ;
  138. ;INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH
  139. ;
  140. SETFCB:    LXI    D,CMDBUF
  141.     LXI    H,FCB
  142.     CALL    CPMLINE
  143.     CALL    PROCOPT
  144. CHECKNM:
  145.     LDA    FCB+1    ;CHECK ON THE PRIMARY OPTION
  146.     CPI    'E'    ;RETURN IF ECHO OPTION
  147.     RZ
  148.     CPI    'H'    ;RETURN IF HELP OPTION
  149.     RZ
  150.     CPI    'L'    ;RETURN IF LOCAL ECHO OPTION
  151.     RZ
  152.     CPI    'T'
  153.     JZ    TERMSEL
  154.     CPI    'S'
  155.     JZ    CKFILE
  156.     CPI    'R'
  157.     JNZ    BDOPT
  158.     LDA    BATCHFLG ;IF MULT FILE MODE, THEN..
  159.     ORA    A     ;..RECV OPT DOES NOT NEED..
  160.     RZ         ;..NAME.
  161.     JMP    CKFILE
  162. ;
  163. BDOPT:    CALL    ILPRT
  164.     DB    CR,LF,'++ Bad Option ++',CR,LF,0
  165.     JMP    REENT
  166. CKFILE:    LDA    FCB+17    ;IF OPTION THAT NEEDS FILE NAME,..
  167.     CPI    ' '    ;..THEN CHECK TO SEE IF NAME..
  168.     RNZ        ;..EXISTS. IF NOT..
  169. REENT:    CALL    ILPRT    ;..DO EVERYTHING OVER.
  170.     DB    CR,LF,'Re-enter PRIMARY option and file name only: ',BELL,0
  171.     LXI    D,CMDBUF
  172.     CALL    INBUFF
  173.     JMP    SETFCB
  174. ;
  175. TERMSEL:
  176.     LDA    FCB+17
  177.     CPI    ' '
  178.     JNZ    SAVAGN
  179.     MVI    A,FALSE
  180.     STA    SAVEFLG
  181.     MVI    A,TRUE
  182.     STA    NFILFLG
  183.     RET
  184. ;
  185. SAVAGN:
  186.     MVI    A,FALSE
  187.     STA    NFILFLG
  188.     RET
  189. ;
  190. ;
  191. ;ADJUSTS LOOP COUNTERS FOR VARIOUS CLOCK SPEEDS
  192. ;
  193. FIXCNT:    LDA    CLOCK
  194.     CPI    1
  195.     RZ
  196.     PUSH    D
  197.     PUSH    H
  198.     POP    D
  199. CNTMUL:    DAD    D
  200.     DCR    A
  201.     JNZ    CNTMUL
  202.     POP    D
  203.     RET
  204. ;
  205. MOVE128:
  206.     MVI    B,128
  207. MOVE:    MOV    A,M
  208.     STAX    D
  209.     INX    H
  210.     INX    D
  211.     DCR    B
  212.     JNZ    MOVE
  213.     RET
  214. ;
  215. MENU0:
  216.     LDA    NFILFLG
  217.     ORA    A
  218.     JNZ    MENU    ;GO IF NO FILE ACTIVE
  219.     CALL    ILPRT    ;ELSE PRINT MESSAGE
  220.     DB    CR,LF,LF
  221.     DB    1Bh,47h,44h    ;reverse video
  222.     DB    '** There may be text in the memory buffer **',CR,LF
  223.     DB    1Bh,47h,30h    ;normal video
  224.     DB    '** It will be lost unless NOL or WRT commands are used **'
  225.     DB    CR,LF,BELL,0
  226.     MVI    B,2    ;2 MORE BELLS
  227. BLOOP:    LDA    BELRPT    ;GET TIME
  228.     MOV    C,A
  229. BCLOOP:    LXI    H,1000    ;ABOUT 0.03 SECONDS
  230.     CALL    FIXCNT
  231. BILOOP:    MOV    A,L
  232.     ORA    H
  233.     DCX    H
  234.     JNZ    BILOOP
  235.     DCR    C
  236.     JNZ    BCLOOP
  237.     MVI    A,BELL
  238.     CALL    TYPE
  239.     DCR    B
  240.     JNZ    BLOOP
  241. ;
  242. MENU:    LXI    H,RESTSN  ;RESTORE SECTOR NUMBERS..
  243.     LXI    D,SECTNOB ;..FOR NEW FILE TRANSFER.
  244.     MVI    B,SECTNOE-SECTNOB
  245.     CALL    MOVE
  246.     LXI    H,RESTROPT ;RESTORE OPTION TABLE
  247.     LXI    D,OPTBL
  248.     MVI    B,OPTBE-OPTBL
  249.     CALL    MOVE
  250.     MVI    A,0
  251.     STA    MFFLG1    ;RESET MFACCESS ROUTINE..
  252.     CMA        ;..AND MULTI TRANS IN CASE..
  253.     STA    FSTFLG    ;..OF ABORT.
  254.     JMP    XPRT
  255. ;
  256. MENU2:    CALL    CLRTST
  257.     CALL    ILPRT
  258.     DB    '               Single Letter Commands',CR,LF,LF
  259.     DB    ' H  - Display this information',CR,LF
  260.     DB    ' ?  - Display current settings',CR,LF,LF
  261.     DB      ' T  - Terminal mode',CR,LF
  262.     DB      ' E  - Terminal mode with echo',CR,LF
  263.     DB    ' L  - Terminal mode with local echo',CR,LF
  264.     DB    '     For capturing text use T(or E or L) FILENAME.TYP and'
  265.     DB    CR,LF
  266.     DB    '     Start & Stop toggles described on subsequent screen.'
  267.     DB    CR,LF,LF
  268.     DB      ' R  - Receive CP/M file using Christensen Protocol',CR,LF
  269.     DB      ' S  - Send CP/M file using Christensen Protocol',CR,LF
  270.     DB    '     Command is: R(or S) FILENAME.TYP',CR,LF
  271.     DB    '     R and S can use the following subcommands:',CR,LF
  272.     DB    '          B  - Bulk transfer using wildcards (e.g. *.*)',CR,LF
  273.     DB    '          Q  - Quiet mode (no messages to console)',CR,LF
  274.     DB    '          T  - Return to terminal mode after transfer',CR,LF
  275.     DB    '          V  - View bytes transferred on console',CR,LF,LF
  276.     DB    'The single letter commands may also be used on the',CR,LF
  277.     DB    'command line when the program is initially executed.'
  278.     DB    CR,LF,LF,0
  279. ;
  280.     CALL    NXTSCRN
  281. ;
  282.     CALL    ILPRT
  283.     DB    '               Three Letter Commands',CR,LF,LF
  284.     DB      'CPM - Exit from this program to CP/M',CR,LF
  285.     DB      'DIR - List directory and space free (may specify drive)'
  286.     DB    CR,LF
  287.     DB    'ERA - Erase file (may specify drive)',CR,LF
  288.     DB    'LOG - Change default drive/user (specify drive/user)'
  289.     DB    CR,LF
  290.     DB    '      and reset disks.  e.g. LOG A0, LOG B (user unchanged)'
  291.     DB    CR,LF
  292.     DB    'FOP - Display commands for setting terminal mode file',CR,LF
  293.     DB    '      output parameters',CR,LF,0
  294. ;
  295.     LDA    DISCFLG
  296.     ORA    A
  297.     JZ    NODISC
  298.     CALL    ILPRT
  299.     DB    'DSC - Disconnect the modem from the telephone line',CR,LF,0
  300. ;
  301. NODISC:    LDA    SETUPTST
  302.     ORA    A
  303.     JNZ    NOTIME
  304.     CALL    ILPRT
  305.     DB    'TIM - Set S mode time-to-send message',CR,LF,0
  306. ;
  307. NOTIME:
  308.     LDA    TOGGLECRC
  309.     ORA    A
  310.     JZ    NOTOGCRC
  311.     CALL    ILPRT
  312.     DB    'TCC - Toggle Checksum/CRC mode on receive',CR,LF,0
  313. ;
  314. NOTOGCRC:
  315.     LDA    TOGGLEBK
  316.     ORA    A
  317.     JZ    NOTOGBK
  318.     CALL    ILPRT
  319.     DB    'TBR - Toggle backspace to rub conversion',CR,LF,0
  320. ;
  321. NOTOGBK:
  322.     LDA    TOGGLELOC
  323.     ORA    A
  324.     JZ    NOTOGLOC
  325.     CALL    ILPRT
  326.     DB    'TLC - Toggle  1) local command immediate',CR,LF
  327.     DB    '              2) local command after ',0
  328.     LDA    EXTCHR
  329.     CALL    SHFTYPE
  330.     DB    CR,LF,0
  331. ;
  332. NOTOGLOC:
  333.     LDA    TOGGLELF
  334.     ORA    A
  335.     JZ    NOTOGLF
  336.     CALL    ILPRT
  337.     DB    'TLF - Toggle send linefeed after carriage return',CR,LF,0
  338. ;
  339. NOTOGLF:
  340.     CALL    ILPRT
  341.     DB    'NUM - List remote systems',CR,LF,0
  342.     LDA    SETUPTST
  343.     ORA    A
  344.     JZ    NOSETUP
  345.     CALL    ILPRT
  346.     DB    'SET - Set communication ports',CR,LF,0
  347. ;
  348. NOSETUP:
  349.     MVI    A,LF
  350.     CALL    TYPE
  351.     CALL    ILPRT
  352.     DB    '    The following are terminal text buffer commands:'
  353.     DB    CR,LF,0
  354.     CALL    ILPRT
  355.     DB      'DEL - Delete memory buffer and file',CR,LF
  356.     DB      'NOL - Return to terminal mode - no loss of data in buffer'
  357.     DB    CR,LF
  358.     DB      'WRT - Write memory buffer to disk file',CR,LF,LF,0
  359.     CALL    NXTSCRN
  360. ;
  361.     CALL    ILPRT
  362.     DB    '      Local Commands while in Terminal Mode',CR,LF,LF,0
  363.     LDA    EXITCHR
  364.     CALL    SHFTYPE
  365.     DB    '  - Exit to command mode',CR,LF,LF,0
  366.     LDA    TRANLOGON
  367.     ORA    A
  368.     JZ    NOTRANLOG
  369.     LDA    LOGCHR
  370.     CALL    SHFTYPE
  371.     DB    '  - Transmit string',CR,LF
  372.     DB    '     Must be followed by number of string (0-9)',CR,LF
  373.     DB    '     or L to display list of strings',CR,LF,LF,0
  374. ;
  375. NOTRANLOG:
  376.     LDA    LSTTST
  377.     ORA    A
  378.     JZ    NOLST2
  379.     LDA    LSTCHR
  380.     CALL    SHFTYPE
  381.     DB    '  - Toggle printer',CR,LF,0
  382. ;
  383. NOLST2:
  384.     MVI    A,LF
  385.     CALL    TYPE
  386.     LDA    SAVECHR
  387.     CALL    SHFTYPE
  388.     DB    '  - Start copy into buffer',CR,LF,0
  389.     LDA    UNSAVECHR
  390.     CALL    SHFTYPE
  391.     DB      '  - Stop copy into buffer',CR,LF
  392.     DB    '     Start & Stop may be toggled as often as desired.',CR,LF
  393.     DB    '     A ":" at start of line indicates buffer is open.',CR,LF
  394.     DB    '     XOFF automatically used to stop input when writing',CR,LF
  395.     DB    '     full buffer to disk, XON sent to resume.',CR,LF,LF,0
  396.     LDA    TRANCHR
  397.     CALL    SHFTYPE
  398.     DB    '  - Transfer ASCII file to remote',CR,LF,LF,0
  399.     LDA    LOCONEXTCHR
  400.     ORA    A
  401.     LDA    EXTCHR
  402.     JNZ    REMDFLT
  403.     CALL    SHFTYPE
  404.     DB    '  - Send local control character to remote',CR,LF,0
  405.     JMP    XPRT
  406. REMDFLT:
  407.     CALL    SHFTYPE
  408.     DB    '  - Next character will be used for local control',CR,LF,0
  409. ;
  410. XPRT:
  411.     CALL    ILPRT
  412.     DB    CR,LF,'Drive ',0
  413.     MVI    C,CURDSK    ;CURRENT DISK FUNCTION
  414.     CALL    BDOS
  415.     ADI    'A'        ;MAKE ASCII
  416.     CALL    TYPE
  417. ;
  418.     IF  CPM2X    ;IF CPM VER 2.X
  419. ;
  420.     CALL    GETUSR    ;GET CURRENT USER NUMBER
  421.     CPI    0
  422.     JZ    SR3B    ;SKIP IF USER 0
  423.     PUSH    PSW
  424.     CALL    ILPRT
  425.     DB    ', User ',0
  426.     POP    PSW
  427.     MVI    H,0
  428.     MOV    L,A
  429.     CALL    DECOUT    ;REPORT USER
  430. ;
  431.     ENDIF    ;CPM2X
  432. ;
  433. SR3B:    CALL    CRLF
  434.     LDA    NFILFLG
  435.     ORA    A
  436.     JNZ    NOBUFMSG
  437.     CALL    GETSPC
  438.     CALL    ILPRT
  439.     DB    ' bytes of buffer free',CR,LF,0
  440. NOBUFMSG:    
  441.     CALL    ILPRT
  442.     DB    'COMMAND (H for Help): ',0
  443. GETCMD:
  444.     LXI    D,CMDBUF    ;ENTER COMMAND
  445.     CALL    INBUFF
  446.     CALL    CRLF
  447.     LXI    D,CMDBUF+2 ;POINT TO COMMAND
  448.     CALL    ILCOMP
  449.     DB    'CPM',0
  450.     JNC    EXIT
  451.     CALL    ILCOMP
  452.     DB    'LOG',0
  453.     JNC    LOGNEW
  454.     CALL    ILCOMP
  455.     DB    'DIR',0
  456.     JNC    DIR
  457.     CALL    ILCOMP
  458.     DB    'ERA',0
  459.     JNC    ERASEF
  460.     CALL    ILCOMP
  461.     DB    'DSC',0
  462.     JNC    DISC
  463.     CALL    ILCOMP
  464.     DB    '?',0
  465.     JNC    CURPAR
  466.     CALL    ILCOMP
  467.     DB    'SPD',0
  468.     JNC    SETSPD
  469.     CALL    ILCOMP
  470.     DB    'FOP',0
  471.     JNC    TFOMENU
  472.     CALL    ILCOMP
  473.     DB    'TIM',0
  474.     JNC    SETTIM
  475.     CALL    ILCOMP
  476.     DB    'TCC',0
  477.     JNC    TOGCRC
  478.     CALL    ILCOMP
  479.     DB    'TBR',0
  480.     JNC    TOGBKSP
  481.     CALL    ILCOMP
  482.     DB    'TLC',0
  483.     JNC    TOGLOC
  484.     CALL    ILCOMP
  485.     DB    'TLF',0
  486.     JNC    TOGLF
  487.     CALL    ILCOMP
  488.     DB    'TSL',0
  489.     JNC    TOGSTL
  490.     CALL    ILCOMP
  491.     DB    'TXF',0
  492.     JNC    TOGTXOFF
  493.     CALL    ILCOMP
  494.     DB    'TXN',0
  495.     JNC    TOGTXON
  496.     CALL    ILCOMP
  497.     DB    'TWE',0
  498.     JNC    TOGWECH
  499.     CALL    ILCOMP
  500.     DB    'TEF',0
  501.     JNC    TOGTEOF
  502.     CALL    ILCOMP
  503.     DB    'NUM',0
  504.     JNC    NUMPRN
  505.     LDA    SETUPTST
  506.     ORA    A
  507.     JZ    NOSETUP2
  508.     CALL    ILCOMP
  509.     DB    'SET',0
  510.     JNC    SETUPENT
  511. NOSETUP2:
  512.     CALL    ILCOMP
  513.     DB    'NOL',0
  514.     JC    NXTOPT1        ;CARRY SET = NO MATCH
  515.     LDA    NFILFLG
  516.     ORA    A
  517.     JNZ    NOFILOPN    ;GO TELL OPERATOR IF NO FILE OPEN
  518.     CALL    BUFMSG
  519.     LHLD    HLSAVE    ;RETURN TO TERMINAL..
  520.     JMP    TERM    ;..MODE WITH SAVE OPTION..
  521.             ;..IF PREVIOUSLY ENABLED.
  522. ;
  523. NXTOPT1:
  524.     CALL    ILCOMP
  525.     DB    'WRT',0
  526.     JNC    WRTFIL
  527.     CALL    ILCOMP
  528.     DB    'DEL',0
  529.     JNC    NEWFILE
  530.     PUSH    H
  531.     LDA    CMDBUF+2
  532.     LXI    H,COMPLIST
  533.     CALL    COMPARE    ;COMPARES LIST POINTED TO BY HL..
  534.     POP    H    ;..TO CHAR IN A-REG.
  535.     JC    NOTVLD    ;CARRY SET = NO MATCH
  536. DOOPT:    PUSH    H    ;LOAD ORIGINAL FCB WITH TRANSFER..
  537.     CALL    SETFCB    ;..CMDS AND GO TO BEGINNING OF..
  538.     POP    H    ;..PROGRAM. WILL FOLLOW SAME LOGIC..
  539.     JMP    RESTART    ;..AS IF PROGRAM WERE CALLED WITH..
  540.             ;..CP/M COMMAND LINE.
  541. ;
  542. NOTVLD:
  543.     CALL    NOTVLDMSG
  544.     JMP    XPRT
  545. ;
  546. NOTVLDMSG:
  547.     CALL    ILPRT
  548.     DB    '++ Invalid Command ++',CR,LF,BELL,0
  549.     RET
  550. ;
  551. DIR:
  552.     MVI    C,CURDSK
  553.     CALL    BDOS
  554.     STA    DISKSAV
  555.     CALL    DIRLST
  556.     LDA    DISKSAV
  557.     MOV    E,A
  558.     MVI    C,SELDSK
  559.     CALL    BDOS
  560.     JMP    XPRT
  561. ;
  562. LOGNEW:    LDA    NFILFLG
  563.     ORA    A
  564.     JZ    NORESET
  565.     LDA    CMDBUF+6
  566.     CPI    ' '
  567.     JNZ    SPECIFD
  568.     MVI    C,CURDSK
  569.     CALL    BDOS
  570.     ADI    'A'
  571. SPECIFD:
  572.     SUI    'A'
  573.     STA    DISKSAV
  574.     CPI    16
  575.     JNC    NOTVLD
  576. ;
  577.     IF    CPM2X        ;IF CPM VER. 2.X
  578. ;
  579.     LDA    CMDBUF+7    ;GET NEW USER NUMBER
  580.     CPI    ' '        ;CHECK FOR SPACE
  581.     JZ    SR7A        ;EXIT IF NO NEW USER NUMBER SPECIFIED
  582.     CALL    NUMCHK        ;CHECK TO SEE IF IT IS A NUMBER
  583.     MOV    B,A        ;SAVE
  584.     LDA    CMDBUF+8    ;GET SECOND DIGIT
  585.     CPI    ' '
  586.     JZ    SR7B        ;GO IF SPACE
  587.     CALL    NUMCHK
  588.     MOV    C,A        ;SAVE
  589.     MOV    A,B        ;GET SAVED FIRST DIGIT
  590.     ADD    A        ; X2
  591.     ADD    A        ; X4
  592.     ADD    A        ; X8
  593.     ADD    B        ; X9
  594.     ADD    B        ; X10
  595.     ADD    C
  596.     CPI    16        ;CHECK FOR < 16
  597.     JNC    NOTVLD        ;GO IF NOT
  598.     MOV    B,A
  599. SR7B:    PUSH    B
  600.     CALL    GETUSR
  601.     POP    B        ;RESTORE SELECTED USER
  602.     CMP    B        ;AND COMPARE THEM
  603.     JZ    SR7A        ;EXIT IF UNCHANGED
  604.     MOV    E,B        ;ELSE SET NEW USER
  605.     CALL    SETUSR
  606. ;
  607.     ENDIF    ;CPM2X
  608. ;
  609. SR7A:    CALL    ILPRT
  610.     DB    'Insert disk for drive ',0
  611.     LDA    DISKSAV
  612.     ADI    'A'
  613.     CALL    TYPE
  614. NOTCR:    CALL    ILPRT
  615.     DB    CR,LF,'Hit return when ready',0
  616.     CALL    KEYIN
  617.     CPI    CR
  618.     JNZ    NOTCR
  619.     CALL    CRLF
  620.     MVI    C,RESET
  621.     CALL    BDOS    
  622.     LDA    DISKSAV
  623.     MOV    E,A
  624.     MVI    C,SELDSK
  625.     CALL    BDOS
  626.     JMP    XPRT
  627. ;
  628.     IF    CPM2X
  629. ;
  630. GETUSR:    MVI    E,0FFH        ;GET CURRENT USER
  631. SETUSR:    MVI    C,USER        ;SET-UP FUNCTION CALL
  632.     CALL    BDOS        ;NUMBER IN RETURNED IN A
  633.     RET
  634. ;
  635.     ENDIF    ;CPM2X
  636. ;
  637. NORESET:
  638.     CALL    ILPRT
  639.     DB    '++      Terminal mode file open      ++',CR,LF
  640.     DB    '++ Use WRT or DEL before LOG command ++',CR,LF
  641.     DB    CR,LF,LF,BELL,0
  642.     XRA    A
  643.     JMP    XPRT
  644. ;
  645. ERASEF:    LXI    D,CMDBUF ;PUT CMD LINE INTO FCB AT HL
  646.     LXI    H,FCB
  647.     CALL    CPMLINE
  648.     CALL    MOVEFCB    ;MOVE FCB+16 TO FCB
  649.     LDA    FCB+1
  650.     CPI    ' '
  651.     JZ    NOTVLD    ;GO IF NO FILE SPECIFIED
  652.     LXI    D,FCB
  653.     MVI    C,SRCHF
  654.     CALL    BDOS
  655.     INR    A    ;0 IF FILE NOT FOUND
  656.     JNZ    ERAFILE ;OK, GO ERASE
  657.     CALL    ILPRT
  658.     DB    '++ File not found ++',CR,LF,BELL,0
  659.     JMP    XPRT
  660. ;
  661. ERAFILE:
  662.     LXI    D,FCB
  663.     MVI    C,ERASE
  664.     CALL    BDOS
  665.     CALL    ILPRT
  666.     DB    'File erased',CR,LF,0
  667.     JMP    XPRT
  668. ;
  669. DISC:
  670.     LDA    DISCFLG
  671.     ORA    A
  672.     JZ    NOTVLD
  673.     CALL    DISCR
  674.     CALL    ILPRT
  675.     DB    '** Disconnected **',CR,LF,BELL,0
  676.     JMP    XPRT
  677. ;
  678. SETSPD:
  679.     CALL    ILPRT
  680.     DB    'Enter character output delay [0(none) - 9(longest delay)]: ',0
  681.     CALL    NUMGET
  682.     JNC    NOCHG1
  683.     STA    BYTDLY
  684. NOCHG1:    CALL    SPDMSG
  685.     CALL    ILPRT
  686.     DB    CR,LF,'Enter additional delay after <CR> [0-9]: ',0
  687.     CALL    NUMGET
  688.     JNC    NOCHG2
  689.     RLC        ;X2
  690.     RLC        ;X4
  691.     STA    CRDLY
  692. NOCHG2:    CALL    CRDLYMSG
  693.     JMP    XPRT
  694. ;
  695. NUMGET:    LXI    D,CMDBUF
  696.     CALL    INBUFF
  697.     LDA    CMDBUF+2     ;GET NUMBER
  698.     CPI    ' '
  699.     RZ
  700. NUMCHK:    SUI    '0'
  701.     CPI    10
  702.     RC
  703.     POP    PSW        ;PRESERVE STACK
  704.     JMP    NOTVLD
  705. ;
  706. SPDMSG:    CALL    ILPRT
  707.     DB    'Terminal mode file output delay is 0.',0
  708.     LDA    BYTDLY
  709.     CALL    GIVNUM
  710.     CALL    ILPRT
  711.     DB    ' seconds per character',CR,LF,0
  712.     RET
  713. ;
  714. CRDLYMSG:
  715.     CALL    ILPRT
  716.     DB    'Additional delay after <CR> is 0.',0
  717.     LDA    CRDLY
  718.     CALL    GIVNUM
  719.     CALL    ILPRT
  720.     DB    ' seconds',CR,LF,0
  721.     RET
  722. ;
  723. GIVNUM:    ADD    A    ;2X
  724.     CPI    10
  725.     MOV    B,A
  726.     JNC    NOZERO
  727.     MVI    A,'0'
  728.     CALL    TYPE
  729.     MOV    A,B
  730. NOZERO:    PUSH    H
  731.     MOV    L,A
  732.     MVI    H,0
  733.     CALL    DECOUT
  734.     POP    H
  735.     RET
  736. ;
  737. SETTIM:
  738.     LDA    SETUPTST
  739.     ORA    A
  740.     JNZ    NOTVLD
  741.     CALL    ILPRT
  742.     DB    'Use 0-5 to give baud rate for S mode time-to-send message,'
  743.     DB    CR,LF
  744.     DB    'where 0=110, 1=300, 2=600, 3=1200, 4=2400',CR,LF
  745.     DB    '5=4800, and 6=9600 baud',CR,LF,LF,'Enter value: ',0
  746.     CALL    NUMGET
  747.     CPI    6
  748.     JNC    NOTVLD
  749.     STA    MSPEED
  750.     CALL    SETTIM2
  751.     JMP    XPRT
  752. ;
  753. SETTIM2:
  754.     LDA    SETUPTST
  755.     ORA    A
  756.     JNZ    SETTIM3
  757.     CALL    ILPRT
  758.     DB    'Rate for the S mode time-to-send message is set to ',0
  759.     JMP    SETTIM4
  760. SETTIM3:
  761.     CALL    ILPRT
  762.     DB    'Modem speed is ',0
  763. SETTIM4:
  764.     CALL    BAUDPRT
  765.     RET
  766. ;
  767. ;Shows baud rates set for 'time to send' file transfer.
  768. ;
  769. BAUDPRT:
  770.     LXI    H,BAUDSPD
  771.     MVI    D,0
  772.     LDA    MSPEED        ;GET BAUD RATE CODE
  773.     ADD    A        ;X2
  774.     MOV    E,A
  775.     DAD    D        ;POINT TO CORRECT RATE
  776.     MOV    A,M        ;GET FIRST DIGIT
  777.     CALL    TYPE
  778.     INX    H
  779.     MOV    A,M        ;GET SECOND DIGIT
  780.     CALL    TYPE
  781.     LDA    MSPEED        ;CHECK FOR GREATER THAN 1000
  782.     CPI    3
  783.     JC    NOTHOU        ;GO IF LESS
  784.     MVI    A,'0'        ;PRINT EXTRA 0
  785.     CALL    TYPE
  786. NOTHOU:    CALL    ILPRT
  787.     DB    '0 baud',CR,LF,0
  788.     RET
  789. ;
  790. BAUDSPD    DB    '11','30','60','12','24','48','96'
  791. ;
  792. TOGCRC:
  793.     LDA    TOGGLECRC
  794.     ORA    A
  795.     JZ    NOTVLD
  796.     LDA    CKSUMDFLT
  797.     CMA
  798.     STA    CKSUMDFLT
  799.     CALL    TOGCRC2
  800.     JMP    XPRT
  801. ;
  802. TOGCRC2:
  803.     ORA    A
  804.     JNZ    CHEKMSG
  805.     CALL    ILPRT
  806.     DB    'CRC mode set',CR,LF,0
  807.     RET
  808. ;
  809. CHEKMSG:
  810.     CALL    ILPRT
  811.     DB    'Checksum mode set',CR,LF,0
  812.     RET
  813. ;
  814. TOGBKSP:
  815.     LDA    TOGGLEBK
  816.     ORA    A
  817.     JZ    NOTVLD
  818.     LDA    CONVBKSP
  819.     CMA
  820.     STA    CONVBKSP
  821.     CALL    TOGBKSP2
  822.     JMP    XPRT
  823. ;
  824. TOGBKSP2:
  825.     LDA    CONVBKSP
  826.     ORA    A
  827.     JZ    NORUBMSG
  828.     CALL    ILPRT
  829.     DB    'Backspace is rub',CR,LF,0
  830.     RET
  831. ;
  832. NORUBMSG:
  833.     CALL    ILPRT
  834.     DB    'Backspace is backspace',CR,LF,0
  835.     RET
  836. ;
  837. TOGLOC:    LDA    TOGGLELOC
  838.     ORA    A
  839.     JZ    NOTVLD
  840.     LDA    LOCONEXTCHR
  841.     CMA
  842.     STA    LOCONEXTCHR
  843.     CALL    TOGLOC2
  844.     JMP    XPRT
  845. ;
  846. TOGLOC2:
  847.     CALL    ILPRT
  848.     DB    'Use ',0
  849.     LDA    LOCONEXTCHR
  850.     ORA    A
  851.     LDA    EXTCHR
  852.     JZ    LOCMSG
  853.     CALL    SHFTYPE
  854.     DB    ' before local command',CR,LF,0
  855.     RET
  856. ;
  857. LOCMSG: CALL    SHFTYPE
  858.     DB    ' to send local command to remote',CR,LF,0
  859.     RET
  860. ;
  861. TOGLF:    LDA    TOGGLELF
  862.     ORA    A
  863.     JZ    NOTVLD
  864.     LDA    ADDLF
  865.     CMA
  866.     STA    ADDLF
  867.     CALL    TOGLF2
  868.     JMP    XPRT
  869. ;
  870. TOGLF2:
  871.     CALL    ILPRT
  872.     DB    'Linefeed ',0
  873.     LDA    ADDLF
  874.     ORA    A
  875.     JNZ    LFMSG
  876.     CALL    ILPRT
  877.     DB    'NOT ',0
  878. LFMSG:    CALL    ILPRT
  879.     DB    'sent after <CR>',CR,LF,0
  880.     RET
  881. ;
  882. TOGSTL:    LDA    TOGSLF
  883.     ORA    A
  884.     JZ    NOTVLD
  885.     LDA    STRLF
  886.     CMA
  887.     STA    STRLF
  888.     CALL    TOGSTL2
  889.     JMP    XPRT
  890. ;
  891. TOGSTL2:
  892.     CALL    ILPRT
  893.     DB    'Linefeed ',0
  894.     LDA    STRLF
  895.     ORA    A
  896.     JZ    SLFMSG
  897.     CALL    ILPRT
  898.     DB    'NOT ',0
  899. SLFMSG:    CALL    ILPRT
  900.     DB    'sent after <CR> in terminal mode file output',CR,LF,0
  901.     RET
  902. ;
  903. TOGTXOFF:
  904.     LDA    TOGXOFF
  905.     ORA    A
  906.     JZ    NOTVLD
  907.     CALL    ILPRT
  908.     DB    'Use XOFF testing? (Y/N): ',0
  909.     CALL    GETANS
  910.     JC    NOCHG3
  911.     STA    XOFFTST
  912. NOCHG3:    CALL    XOFFMSG
  913.     LDA    XOFFTST
  914.     ORA    A
  915.     JZ    XPRT
  916.     CMA
  917.     STA    XONWAIT
  918.     STA    ECHWAIT
  919.     CALL    THEREF
  920.     CALL    XONMSG
  921.     CALL    ECHMSG
  922.     JMP    XPRT
  923. ;
  924. TOGTXON:
  925.     CALL    ILPRT
  926.     DB    'Use XON waiting after <CR> (Y/N): ',0
  927.     CALL    GETANS
  928.     JC    NOCHG4
  929.     STA    XONWAIT
  930. NOCHG4:    CALL    XONMSG
  931.     LDA    XONWAIT
  932.     ORA    A
  933.     JZ    XPRT
  934.     CMA
  935.     STA    XOFFTST        ;DON'T ALLOW BOTH
  936.     STA    ECHWAIT
  937.     CALL    THEREF
  938.     CALL    XOFFMSG
  939.     CALL    ECHMSG
  940.     JMP    XPRT
  941. ;
  942. TOGWECH:
  943.     CALL    ILPRT
  944.     DB    'Use echo waiting before transmitting next character (Y/N): ',0
  945.     CALL    GETANS
  946.     JC    NOCHG5
  947.     STA    ECHWAIT
  948. NOCHG5:    CALL    ECHMSG
  949.     LDA    ECHWAIT
  950.     ORA    A
  951.     JZ    XPRT
  952.     CMA
  953.     STA    XOFFTST
  954.     STA    XONWAIT
  955.     CALL    THEREF
  956.     CALL    XOFFMSG
  957.     CALL    XONMSG
  958.     JMP    XPRT
  959. ;
  960. ECHMSG:    CALL    ILPRT
  961.     DB    'Waiting for character echo ',0
  962.     LDA    ECHWAIT
  963.     ORA    A
  964.     JNZ    ECHMSG2
  965.     CALL    ILPRT
  966.     DB    'NOT ',0
  967. ECHMSG2:
  968.     CALL    ILPRT
  969.     DB    'used in terminal mode file output',CR,LF,0
  970.     RET
  971. ;
  972. GETANS:
  973.     LXI    D,CMDBUF
  974.     CALL    INBUFF
  975.     LDA    CMDBUF+2     ;GET ANSWER
  976.     CPI    ' '
  977.     CMC
  978.     RZ
  979.     MOV    B,A
  980.     CPI    'N'
  981.     MVI    A,FALSE
  982.     RZ
  983.     MOV    A,B
  984.     CPI    'Y'
  985.     MVI    A,TRUE
  986.     RZ
  987.     POP    PSW        ;PRESERVE STACK
  988.     JMP    NOTVLD
  989. ;
  990. THEREF:    CALL    ILPRT
  991.     DB    'Therefore -',CR,LF,0
  992.     RET
  993. ;
  994. XOFFMSG:
  995.     CALL    ILPRT
  996.     DB    'XOFF testing ',0
  997.     LDA    XOFFTST
  998.     ORA    A
  999.     JNZ    XOTSTON
  1000.     CALL    ILPRT
  1001.     DB    'NOT ',0
  1002. XOTSTON:
  1003.     CALL    ILPRT
  1004.     DB    'used',0
  1005. XONMSG3:
  1006.     CALL    ILPRT
  1007.     DB    ' in terminal mode file output',CR,LF,0
  1008.     RET
  1009. ;
  1010. XONMSG:
  1011.     CALL    ILPRT
  1012.     DB    'XON ',0
  1013.     LDA    XONWAIT
  1014.     ORA    A
  1015.     JNZ    XONMSG2
  1016.     CALL    ILPRT
  1017.     DB    'NOT ',0
  1018. XONMSG2:
  1019.     CALL    ILPRT
  1020.     DB    'automatically tested after <CR>',0
  1021.     JMP    XONMSG3
  1022. ;
  1023. SETUPENT:
  1024.     LDA    SETUPTST
  1025.     ORA    A
  1026.     JZ    NOTVLD
  1027.     CALL    SETUPR
  1028.     JMP    XPRT
  1029. ;
  1030. NEWFILE:
  1031.     LDA    NFILFLG
  1032.     ORA    A
  1033.     JNZ    NOFILOPN    
  1034.     LDA    FCB3+1        ;CHECK THAT FILE WAS REQUESTED
  1035.     CPI    ' '
  1036.     JZ    NOFILOPN    ;IF NO FILE, DON'T ERASE
  1037.     LXI    D,FCB3
  1038.     MVI    C,ERASE
  1039.     CALL    BDOSRT
  1040.     MVI    A,TRUE    ;DO NOT ALLOW TERMINAL..
  1041.     STA    NFILFLG    ;..SAVE SINCE NO FILE..
  1042.     CMA        ;..SPECIFIED.
  1043.     STA    SAVEFLG
  1044.     LXI    H,FCB3
  1045.     CALL    INITFCBS
  1046.     LXI    H,BOTTRAM
  1047.     SHLD    HLSAVE
  1048.     JMP    XPRT
  1049. ;
  1050. WRTFIL:
  1051.     LDA    NFILFLG
  1052.     CPI    TRUE
  1053.     JZ    NOFILOPN
  1054.     LDA    FCB3+1    ;CHECK THAT FILE WAS REQUESTED
  1055.     CPI    ' '
  1056.     JZ    NOFILOPN
  1057.     LHLD    HLSAVE
  1058.     CALL    NUMRECS    ;DISK WRITE ROUTINE AS USED IN..
  1059.     CALL    WRTDSK    ;..IN THE INTDSKSV ROUTINE.
  1060.     CALL    CLOSE3
  1061.     MVI    A,TRUE
  1062.     STA    NFILFLG
  1063.     CMA
  1064.     STA    SAVEFLG
  1065.     LXI    H,FCB3
  1066.     CALL    INITFCBS ;BLANK OUT FCB SO WRITTEN FILE CAN'T BE ERASED.
  1067.     LXI    H,BOTTRAM
  1068.     SHLD    HLSAVE
  1069.     JMP    XPRT
  1070. ;
  1071. NOFILOPN:
  1072.     CALL    ILPRT
  1073.     DB    '++ No File Open ++',CR,LF,BELL,0
  1074.     JMP    XPRT
  1075. ;
  1076. COMPARE:
  1077.     MOV    B,M    ;COMPARES A-REG WITH LIST..
  1078. COMPLP:
  1079.     INX    H    ;..ADDRESSED BY HL. FIRST ELEMENT..
  1080.     CMP    M    ;..OF LIST MUST BE NUMBER OF ELEMENTS..
  1081.     JZ    VALID    ;..BEING COMPARED. RETURNS WITH..
  1082.     DCR    B    ;..CARRY SET IF A-REG DOES NOT..
  1083.     JNZ    COMPLP    ;.. CONTAIN AN ELEMENT IN LIST.
  1084.     STC
  1085. VALID:
  1086.     RET
  1087. ;
  1088. NXTSCRN:
  1089.     CALL    ILPRT
  1090.     DB    'HIT any KEY to CONTINUE',0
  1091. NOKEY1:    CALL    STAT    ;GET KEYBOARD STATUS
  1092.     JZ    NOKEY1    ;KEEP LOOPING UNTIL KEYPRESS
  1093.     CALL    KEYIN    ;GOBBLE UP KEYPRESS
  1094.     CALL    CLRTST
  1095.     RET
  1096. ;
  1097. CLRTST:    LDA    SCRNTEST
  1098.     ORA    A
  1099.     JZ    LOTSALF
  1100.     CALL    CLRSCRN
  1101.     RET
  1102. ;
  1103. LOTSALF:
  1104.     MVI    A,CR
  1105.     CALL    TYPE
  1106.     MVI    B,12
  1107.     MVI    A,LF
  1108. LFLOOP:    CALL    TYPE
  1109.     DCR    B
  1110.     JNZ    LFLOOP
  1111.     RET    
  1112. ;
  1113. CURPAR:
  1114.     CALL    CLRTST
  1115.     CALL    ILPRT
  1116.     DB    '                Current Settings',CR,LF,LF,LF,0
  1117.     LDA    CKSUMDFLT
  1118.     CALL    TOGCRC2
  1119.     LDA    LSTTST
  1120.     ORA    A
  1121.     JZ    NOLST3
  1122.     CALL    LSTMSG
  1123. NOLST3:
  1124.     CALL    DETCAR
  1125.     CALL    SETTIM2
  1126.     CALL    TOGBKSP2
  1127.     CALL    TOGLF2
  1128.     CALL    TOGLOC2
  1129.     CALL    ILPRT
  1130.     DB    'Terminal mode file buffer is ',0
  1131.     LDA    NFILFLG
  1132.     ORA    A
  1133.     JZ    ACTIVE
  1134.     CALL    ILPRT
  1135.     DB    'in',0
  1136. ACTIVE:
  1137.     CALL    ILPRT
  1138.     DB    'active',CR,LF,'Unused portion of buffer is ',0
  1139.     CALL    GETSPC
  1140.     CALL    ILPRT
  1141.     DB    ' bytes',CR,LF,0
  1142.     LDA    SETUPTST
  1143.     ORA    A
  1144.     JZ    NOSETP
  1145.     CALL    GIVEPRM
  1146. NOSETP:    CALL    TOGSTL2
  1147.     CALL    TOGTEOF2
  1148.     CALL    XOFFMSG
  1149.     CALL    XONMSG
  1150.     CALL    ECHMSG
  1151.     CALL    SPDMSG
  1152.     CALL    CRDLYMSG
  1153.     CALL    CRLF
  1154.     JMP    XPRT
  1155. ;
  1156. GETSPC:    CALL    GETMAX
  1157.     MOV    B,A
  1158.     LHLD    HLSAVE
  1159.     STC
  1160.     CMC
  1161.     MVI    A,0
  1162.     SBB    L
  1163.     MOV    L,A
  1164.     MOV    A,B
  1165.     SBB    H
  1166.     MOV    H,A
  1167.     CALL    DECOUT
  1168.     RET
  1169. ;
  1170. TFOMENU:
  1171.     CALL    CLRTST
  1172.     CALL    ILPRT
  1173.     DB    '     Commands for Setting Terminal Mode File Output'
  1174.     DB    ' Parameters',CR,LF,LF,LF
  1175.     DB    'SPD - Set speed of file output',CR,LF
  1176.     DB    'TEF - Toggle transmission of end-of-file character',CR,LF,0
  1177.     LDA    TOGSLF
  1178.     ORA    A
  1179.     JZ    NOTOGSLF
  1180.     CALL    ILPRT
  1181.     DB    'TSL - Toggle stripping linefeeds',CR,LF
  1182.     DB    'TWE - Toggle wait for character echo',CR,LF,0
  1183. ;
  1184. NOTOGSLF:
  1185.     LDA    TOGXOFF
  1186.     ORA    A
  1187.     JZ    NOTOGXOFF
  1188.     CALL    ILPRT
  1189.     DB    'TXF - Toggle XOFF testing',CR,LF
  1190.     DB    'TXN - Toggle XON waiting after <CR>',CR,LF,LF,LF,0
  1191. ;
  1192. NOTOGXOFF:
  1193.     JMP    XPRT
  1194. ;    
  1195. TOGTEOF:
  1196.     LDA    EOFSEND
  1197.     CMA
  1198.     STA    EOFSEND
  1199.     CALL    TOGTEOF2
  1200.     JMP    XPRT
  1201. ;
  1202. TOGTEOF2:
  1203.     CALL    ILPRT
  1204.     DB    'End-of-file character ',0
  1205.     LDA    EOFSEND
  1206.     ORA    A
  1207.     JNZ    EOFMSG
  1208.     CALL    ILPRT
  1209.     DB    'NOT ',0
  1210. EOFMSG:    CALL    ILPRT
  1211.     DB    'sent in terminal mode file output',CR,LF,0
  1212.     RET
  1213. ;
  1214. ;
  1215. ;THIS ROUTINE DISPLAYS THE PHONE NUMBERS IN THE LIBRARY
  1216. ;
  1217. ;    Mods by G Coady  19-oct-83
  1218. ;    Fitted search function so routine doesn't print blank entries to screen
  1219. ;
  1220. NUMPRN:
  1221.     PUSH    H
  1222.     CALL    CLRTST
  1223.     CALL    ILPRT
  1224.     DB    '           Library of Phone Numbers of Remote Systems',0
  1225.     MVI    C,13       ;NUMBER OF LINES TO MOVE
  1226.     LXI    H,NUMBLIB  ;ADDRESS OF SOURCE MEMORY
  1227.     LXI    D,DBUF     ;ADDRESS OF TARGET MEMORY
  1228.     CALL    NEWLINE    ;START WITH CRLF
  1229.     STAX    D          ;+LF
  1230.     INX    D          ;AND BUMP IT
  1231. NUMPRN1:
  1232.     CALL    NUMSCAN        ;MOVE FIRST HALF LINE
  1233.     CALL    SPACES        ;2 ENTRIES + 3 SPACES = 63 CHARACTERS
  1234.     CALL    NUMSCAN        ;SECOND HALF
  1235.     CALL    NEWLINE
  1236.     JMP    NUMPRN1        ;numscan has routine exit !!
  1237. ;
  1238. NUMSCAN:
  1239.     MOV    A,M        ;GET CURRENT CHAR
  1240.     INX    H        ;POINT TO NEXT
  1241.     ORA    A        ;TEST FOR END OF TABLE
  1242.     JZ    NUMPRN2        ;HAVE END OF TABLE, GO PRINT
  1243.     CPI    '='        ;TEST FOR START OF NAME
  1244.     JNZ    NUMSCAN        ;KEEP SCANNING FOR '='
  1245.     MOV    A,M        ;GET CURRENT CHAR
  1246.     CPI    ' '        ;BLANK ???
  1247.     JZ    NUMSCAN        ; YES, TRY FOR NEXT ENTRY
  1248.     MVI    B,30        ;CHAR COUNT FOR MOVE
  1249.     CALL    MOVE        ;STASH IN OUTPUT BUFFER
  1250.     RET
  1251. ;
  1252. NEWLINE:        ;PUTS CR-LF AT MEMORY POINTED BY 'DE'
  1253.     MVI    A,CR    ;CR
  1254.     STAX    D    ;STORE IT
  1255.     MVI    A,LF    ;LF
  1256.     INX    D    ;BUMP POINTER
  1257.     STAX    D    ;STORE LF
  1258.     INX    D    ;BUMP POINTER
  1259.     RET
  1260. ;
  1261. SPACES:    MVI    A,20H    ;SPACE
  1262.     STAX    D
  1263.     INX    D    ;1
  1264.     STAX    D
  1265.     INX    D    ;2
  1266.     STAX    D
  1267.     INX    D    ;3
  1268.     RET
  1269. ;
  1270. NUMPRN2:
  1271.     MVI    A,'$'
  1272.     STAX    D
  1273.     MVI    C,PRINT
  1274.     LXI    D,DBUF    ;POINT TO TABLE OF NUMBERS TO PRINT
  1275.     CALL    BDOS
  1276.     CALL    CRLF
  1277.     POP    H
  1278.     JMP    XPRT
  1279. ;
  1280. ;
  1281.     LINK    CONSOLE
  1282. ;
  1283.