home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / packet / packet89.lbr / KERNEL.ASM < prev    next >
Assembly Source File  |  1991-02-21  |  30KB  |  993 lines

  1. ;                    PACKET89.ASM
  2. ;        Derived 12/15/89 from the MODEM Controller, MPLINK
  3. ;               (H19/H89 version of 7/1/81)
  4. ;
  5. ;PLINK IS A CP/M TRANSIENT COMMAND WHICH ALLOWS THE USER TO
  6. ;ESTABLISH A COMMUNICATIONS LINK WITH A REMOTE COMPUTER
  7. ;
  8. ;       ORIGINAL BY L.E. HUGHES    EDCAM        JULY, 1977
  9. ;
  10. ;          WITH HEATH EQUATES ADDED BY TOM JORGENSON.
  11. ;          Optional Triger characters by Steve Vinokuroff.
  12. ;
  13. ;       Revised by Ray Isenson, N6UE┼to∩ interface pacet⌠ NCN├ and
  14. ;       give control of the Lineprinter to the BDOS (12/89)
  15. ;     
  16. ;This version is modified to use the H19/H89 special function keys.
  17. ;It will run on a non-Heath CPU using the H19 terminal; however, if
  18. ;such a system is used, the following equate should be set to zero:
  19. ;
  20. H8ORH89 EQU     1       ;IF H8 OR H89 COMPUTER SET TO 1
  21. ;
  22. ;
  23. ;PLINK CURRENTLY SUPPORTS TWO WAY TRANSFER OF TEXT FILES
  24. ;BETWEEN THE CP/M DISK AND THE REMOTE COMPUTER. THE FOLLOWING
  25. ;CONTROL CODES MAY BE INITIATED FROM THE CONSOLE KEYBOARD:
  26. ;
  27. ;       ****************************************************
  28. ;       *                     COMMANDS:                    *
  29. ;       *                                                  *
  30. ;       *  F1 KEY       SAVE INCOMING ASCII IN RAM BUFFER  *
  31. ;       *               FOR LATER TRANSFER TO DISK         *
  32. ;       *  F2 KEY       WRITE RAM BUFFER TO DISK - ASKS    *
  33. ;       *               FOR DRIVE AND FILENAME.TYP         *
  34. ;       *  F3 KEY       TRANSMIT ASCII FILE TO MODEM.      *
  35. ;       *               ASKS FOR DRIVE AND FILENAME.TYP    *
  36. ;       *  F4 KEY       AUTO LOGON                         *
  37. ;       *  F5 KEY       COPY TO PRINTER SWITCH             *
  38. ;       *  RED KEY      EXIT PLINK TO CP/M WARM BOOT       *
  39. ;       *  CONTROL-C    ABORT FILE SEND TO MODEM           *
  40. ;       *  DELETE       BACKSPACE WHEN IN COMMAND MODE     *
  41. ;       *               ASKING FOR FILENAME                *
  42. ;       *  BACKSPACE    SAME AS DELETE                     *
  43. ;       *  CONTROL-U    ABORT CURRENT LINE WHEN IN COMMAND *
  44. ;       *               MODE ASKING FOR FILENAME           *
  45. ;       *                                                  *
  46. ;       ****************************************************
  47. ;
  48. ;
  49. ;SET NUMBER OF DRIVES FOR PARTICULAR SYSTEM
  50. ;       E.G. 2 = A,B    5 = A,B,C,D,E
  51. ;
  52. NUMDRV  EQU     5       ;ALLOW A: AND B: ONLY
  53. ;
  54. ;
  55. ;BDOS ENTRY POINT AND FUNCTION CODES
  56. ;
  57. BASE    SET     0       ;STANDARD CPM
  58. ;
  59. BDOS    EQU     BASE+5
  60. RESDSK  EQU     13      ;RESET DISK SYSTEM
  61. OFFC    EQU     15      ;OPEN FILE
  62. CFFC    EQU     16      ;CLOSE FILE 
  63. DFFC    EQU     19      ;DELETE FILE
  64. RRFC    EQU     20      ;READ RECORD
  65. WRFC    EQU     21      ;WRITE RECORD 
  66. MFFC    EQU     22      ;MAKE FILE
  67. LSTOUT  EQU     5       ;PRINTER OUTPUT
  68. ;
  69. ;DEFAULT FCB AND FIELD DEFINITIONS 
  70. ;
  71. FCB     EQU     BASE+5CH
  72. FN      EQU     1       ;FILE NAME FIELD (REL)
  73. FT      EQU     9       ;FILE TYPE FIELD (REL)
  74. EX      EQU     12      ;FILE EXTENT FIELD (REL)
  75. NR      EQU     32      ;NEXT RECORD FIELD (REL)
  76. DBUF    EQU     BASE+80H ;DEFAULT DISK BUFFER ADDRESS
  77. ;
  78. ;ASCII CONTROL CHARACTERS
  79. ;
  80. CR      EQU     0DH     ;CARRIAGE RETURN
  81. LF      EQU     0AH     ;LINE FEED
  82. DEL     EQU     7FH     ;DELETE (RUBOUT)
  83. BELL    EQU     07H     ;BELL SIGNAL
  84. TAB     EQU     09H     ;HORIZONTAL TAB
  85. XON     EQU     11H     ;X-ON CHARACTER
  86. NULL    EQU     00H     ;NULL CHAR
  87. ESC     EQU     1BH     ;ESCAPE
  88. BL      EQU     20H     ;BLANK (SPACE)
  89. ;
  90. ;
  91. ;SPECIAL HEATH ONLY BIOS EQUATES
  92. ;
  93. TICCNT  EQU     0BH     ;2 MSEC COUNTER
  94. ;
  95. ;
  96. ;THE FOLLOWING "TRIGER" EQUATE IS SET TO "LF" (LINEFEED)
  97. ;BY DEFAULT. AN OPTIONAL TRIGER CHAR MAY BE PASSED VIA FCB1
  98. ;
  99. ; IE: KERNEL B          WILL SET TRIGER TO "BELL"
  100. ;
  101. ;THE FOLLOWING OPTIONS ARE ALLOWED
  102. ;
  103. ;       1. B = BELL  07H
  104. ;       2. X = XON   11H
  105. ;       3. U = UPLOAD NO TRIGER CHECK AT ALL
  106. ;ANY OTHER ASCII CHARACTER MAY BE PASSED THROUGH FCB1
  107. ;
  108. ;
  109. TRIGER  EQU     LF      ;DEFAULT VALUE
  110. ;
  111. ;
  112. ;WARNING CHARACTER FOR LOW MEMORY
  113. ;
  114. WRNSIG  EQU     BELL    ;IF YOU HAVE ONE, PUT 'BELL' HERE
  115.                         ;...ELSE PUT '*' HERE.
  116. ;
  117. ;MODEM I/O PORT ADDRESSES
  118. ;
  119. MODD    EQU     330Q    ;MODEM BASE PORT
  120. MODS    EQU     MODD+5  ;MODEM STATUS PORT
  121. ;
  122. ;
  123. ;MODEM STATUS PORT BIT DEFINITIONS
  124. ;
  125. MTBE    EQU     20H     ;TRANSMITTER READY FLAG
  126. MRDA    EQU     1H      ;RECEIVER READY FLAG
  127. MXOR    EQU     21H     ;TO COMPLEMENT MTBE AND MRDA
  128. ;
  129. ;       **MAIN PROGRAM**
  130. ;
  131.         ORG     BASE+100H
  132. ;
  133. ;
  134. LINK:   CALL    INIT    ;INITIALIZE
  135. ;
  136. ;        MAIN LOOP 
  137. ;
  138. LINK3:  CALL    CITEST  ;JUMP IF NO DATA FROM CONSOLE 
  139.         JZ      LINK4
  140.         CALL    RCC     ;ELSE READ CONSOLE DATA
  141.         CPI     ESC
  142.         CZ      PCC     ;CALL PCC IF ESC (FUNCTION KEY)
  143.         JZ      LINK4   ;JUMP IF PCC HANDLED CHAR 
  144.         ORI     80H     ;ELSE SET VALID DATA BIT
  145.         STA     INCH    ;AND STORE IN INPUT CHAR BUFFER 
  146. LINK4:  LDA     OUTCH   ;JUMP IF NO DATA FOR CONSOLE
  147.         ORA     A
  148.         JP      LINK5
  149.         ANI     7FH     ;ELSE DISCARD VALID DATA BIT
  150.         CALL    WCC     ;SEND CHAR TO CONSOLE 
  151.         XRA     A       ;THEN CLEAR OUTPUT CHAR BUFFER
  152.         STA     OUTCH
  153. LINK5:  CALL    MITEST  ;JUMP IF NO DATA FROM MODEM 
  154.         JZ      LINK6
  155.         CALL    RMC2    ;ELSE READ MODEM DATA
  156.         CALL    SAVE    ;SAVE CHAR IN TEXT BUFFER IF FLAG ON
  157.         ORI     80H     ;SET DATA VALID BIT 
  158.         STA     OUTCH   ;STORE IN OUTPUT CHAR BUFFER
  159. LINK6:  CALL    MOTEST  ;JUMP IF MODEM XMIT BUFFER BUSY 
  160.         JZ      LINK7
  161.         LDA     INCH    ;JUMP IF NO DATA FOR MODEM
  162.         ORA     A
  163.         JP      LINK7
  164.         ANI     7FH     ;DISCARD VALID DATA BIT
  165.         OUT     MODD    ;OUTPUT CHAR TO MODEM 
  166.         XRA     A       ;...THEN CLEAR INPUT CHAR BUFFER 
  167.         STA     INCH 
  168. LINK7:  JMP     LINK3   ;END OF MAIN LOOP 
  169.  
  170. ;
  171. ;        PCC - PROCESS CONTROL CHARACTER 
  172. ;
  173. ;BECAUSE THIS SECTION USES THE HEATH HARDWARE CLOCK, THE PROGRAM
  174. ;WILL NOT RUN ON OTHER CP/M 2.X SYSTEMS UNLESS A SOFTWARE TIMING
  175. ;LOOP IS SUBSTITUTED FOR THE NEXT 8 STATEMENTS.  THOSE 8 STATEMENTS
  176. ;ARE NOT NECESSARY UNLESS ONE WISHES TO SEND 'ESC' CHARACTERS
  177. ;FROM THE CONSOLE TO THE MODEM.  WITHOUT THESE TIMING STATEMENTS
  178. ;'ESC' MUST BE HIT TWICE TO BE TRANSMITTED ONCE.
  179. ;
  180. PCC:    EQU     $
  181.         IF      H8ORH89
  182.         LDA     TICCNT  ;CHECK FOR SPECIAL FUNCTION KEY
  183.         ADI     10      ;WAIT 20 MSEC FOR NEXT CHAR
  184.         MOV     C,A
  185. ESCTIM: LDA     TICCNT
  186.         CMP     C
  187.         JZ      PCC6    ;IF TOO LONG, NOT SPEC FUCNTION KEY
  188.         CALL    CITEST
  189.         JZ      ESCTIM  ;LOOP UNTIL CONSOLE INPUT
  190.         ENDIF
  191.         CALL    RCC     ;ESC RECEIVED, GET NEXT CHAR FOR FUNCTION
  192.         CPI     'Q'     ;'RED' KEY MEANS EXIT TO CP/M
  193.         JNZ     PCC1 
  194.         PUSH    H
  195.         LHLD    SIZE
  196.         MOV     A,H
  197.         ORA     L
  198.         LXI     H,TBNE
  199.         CNZ     WCS     ;PRINT 'TEXT BUFFER NOT EMPTY'
  200.         LXI     H,AYS   ;PRINT 'ARE YOU SURE'
  201.         CALL    WCS
  202.         POP     H
  203.         CALL    RCC     ;GET ANSWER
  204.         CALL    WCC     ;ECHO IT
  205.         ANI     5FH     ;MAKE UPPER CASE
  206.         CPI     'Y'     ;YES?
  207.         JZ      PCCEX   ;EXIT
  208.         CALL    WCCR    ;CRLF
  209.         XRA     A       ;TELL LINK TO IGNORE THIS CHARACTER 
  210.         RET
  211. ;
  212. PCC1:   CPI     'U'     ;'F3' KEY FOR TRANSMIT FILE
  213.         JNZ     PCC2 
  214.         CALL    STF     ;TRANSMIT TEXT FILE TO MODEM
  215.         XRA     A       ;TELL LINK TO IGNORE THIS CHARACTER 
  216.         RET 
  217. ;
  218. PCC2:   CPI     'S'     ;'F1' KEY MEANS SAVE ALL IN RAM
  219.         JNZ     PCC3 
  220.         MVI     A,1     ;TURN ON TEXT SAVE FLAG 
  221.         STA     FLAG 
  222.         LXI     H,PCCMR ;PRINT 'SAVING INCOMING TEXT IN MEMORY'
  223.         CALL    WCS
  224.         XRA     A       ;TELL LINK TO IGNORE THIS CHARACTER
  225.         RET 
  226. ;
  227. PCC3:   CPI     'T'     ;'F2' KEY MEANS SAVE RAM TEXT TO FILE
  228.         JNZ     PCC4 
  229.         XRA     A       ;TURN OFF TEXT SAVE FLAG
  230.         STA     FLAG 
  231.         CALL    WTB     ;WRITE TEXT BUFFER TO DISK
  232.         XRA     A 
  233.         RET 
  234. ;
  235. PCC4:   CPI     'V'     ;'F4' KEY MEANS AUTO LOGON
  236.         JNZ     PCC5
  237.         LXI     H,ALMSG
  238.         CALL    WCS     ;PRINT 'AUTO LOGON'
  239.         LXI     H,ALBUF
  240. AUTOL:  MOV     A,M
  241.         INX     H
  242.         CPI     'Z'-40H ;AUTOLOG DONE ON ^Z
  243.         JZ      ALBRK
  244.         ANA     A       ;ZERO MEANS EOS
  245.         JZ      STRFIN
  246.         CALL    WMC
  247.         CALL    RMWC    ;READ MODEM, WCC IF AVAILABLE
  248.         JMP     AUTOL
  249. ;
  250. STRFIN: CALL    CITEST  ;INPUT FROM CONSOLE
  251.         JNZ     ALBRK   ;ABORT IF SO
  252.         CALL    MITEST
  253.         JZ      STRFIN  ;WAIT FOR CHAR FROM MODEM
  254.         CALL    RMC2
  255.         CALL    WCC
  256.         CPI     ':'     ;NEXT STRING IF MODEM SENDS ':'
  257.         JZ      AUTOL
  258.         CPI     '+'
  259.         JZ      AUTOL
  260.         JMP     STRFIN  ;KEEP WAITING FOR ':' OR '+'
  261. ;
  262. RMWC:   CALL    MITEST  ;READ MODEM & WRITE CONSOLE IF CHAR
  263.         RZ
  264.         CALL    RMC2
  265.         JMP     WCC
  266. ;
  267. ALBRK:  XRA     A
  268.         RET
  269. ;
  270. ALBUF:  DB      'A',0
  271.         DB      'CIS02',CR,0
  272.         DB      CR,0
  273.         DB      0
  274.         DB      '70000,0000',CR,0
  275.         DB      'PASSWORD',CR,0
  276.         DB      'Z'-40H
  277.         DB      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  278. ;
  279. PCC5:   CPI     'W'     ;'F5' KEY MEANS COPY TO PRINTER
  280.         JNZ     PCC6
  281.         LXI     H,PRTFLG
  282.         MOV     A,M
  283.         CMA
  284.         MOV     M,A     ;COMPLEMENT PRINT FLAG
  285.         ANA     A
  286.         LXI     H,PRTOFF        ;PRINT 'OFF'
  287.         JZ      PRTLAB
  288.         LXI     H,PRTON         ;PRINT 'ON'
  289. PRTLAB: CALL    WCSNP
  290.         XRA     A
  291.         RET
  292. ;
  293. PCC6:   ANA     A       ;LET LINK HANDLE ALL OTHER CONT. CODES
  294.         RET 
  295. ;
  296. PCCEX:  LXI     H,DISMS ;PRINT 'EXIT TO CP/M'
  297.         CALL    WCS
  298.         JMP     BASE    ;EXIT TO WARM BOOT
  299. ;
  300. TBNE:   DB      CR,LF,BELL,'CAUTION: TEXT BUFFER NOT EMPTY',0
  301. AYS:    DB      CR,LF,'EXIT TO CP/M - ARE YOU SURE (Y OR N)?',0
  302. DISMS:  DB      CR,LF,'+++ EXIT TO CP/M +++',CR,LF
  303.         DB      ESC,'j',ESC,'Y',BL+24,BL,ESC,'l',ESC,'k',0
  304. ALMSG:  DB      CR,LF,'AUTOMATIC LOGON',CR,LF,0
  305. PCCMR:  DB      CR,LF,'SAVING INCOMING TEXT IN MEMORY',CR,LF,0
  306. ;
  307. ;        STF - SEND TEXT FILE (TO MODEM) 
  308. ;
  309. STF:    CALL    GFN     ;GET NAME OF DISK FILE TO SEND
  310.         JC      STF6    ;JUMP IF FILE NAME ERROR
  311.         CALL    OPEN    ;TRY TO OPEN SPECIFIED FILE 
  312.         CPI     255     ;JUMP IF FILE NOT FOUND 
  313.         JZ      STF7 
  314. STF1:   CALL    READ    ;READ NEXT RECORD INTO DBUF 
  315.         CPI     1       ;JUMP IF END-OF-FILE
  316.         JZ      STF5 
  317.         LXI     H,DBUF  ;POINT TO DISK BUFFER 
  318.         MVI     C,128
  319. STF2:   CALL    CCTEST  ;CHECK FOR ^C FROM CONSOLE
  320.         MOV     A,M     ;FETCH NEXT CHAR FROM DBUF
  321.         INX     H
  322.         CPI     'Z'-40H ;JUMP IF END-OF-FILE CHARACTER
  323.         JZ      STF5 
  324. OVERL2  CPI     LF      ;IGNORE LINE FEEDS
  325.         JZ      STF4 
  326.         CALL    WMC     ;WRITE CHARACTER TO MODEM 
  327.         CALL    WCC     ;WRITE CHARACTER TO CONSOLE 
  328. OVERL1  CPI     CR      ;JUMP IF NOT CARRIAGE RETURN
  329.         JNZ     STF4 
  330. STF3:   CALL    CCTEST  ;CHECK FOR ^C ABORT
  331.         CALL    MITEST  ;WAIT FOR NEXT MODEM CHARACTER
  332.         JZ      STF3
  333.         CALL    RMC2    ;CHECK MODEM FOR TRIGGER CHAR.
  334. OVERLY  CPI     TRIGER
  335.         JNZ     STF3 
  336.         CALL    WCCR    ;SEND CRLF TO CONSOLE
  337. STF4:   DCR     C       ;LOOP THRU REST OF DBUF 
  338.         JNZ     STF2 
  339.         JMP     STF1    ;GO GET NEXT RECORD FROM DISK 
  340. ;
  341. STF5:   LXI     H,STFSM ;PRINT 'FILE SEND COMPLETE'
  342.         CALL    WCS
  343.         RET 
  344. ;
  345. STF6:   LXI     H,STFS1 ;PRINT 'FILE NAME ERROR'
  346.         CALL    WCS
  347.         RET 
  348. ;
  349. STF7:   LXI     H,STFS2 ;PRINT 'FILE NOT FOUND' 
  350.         CALL    WCS
  351.         RET 
  352. ;
  353. CCTEST: CALL    CITEST  ;CHAR FROM CONSOLE?
  354.         RZ              ;IF NO
  355.         CALL    RCC
  356.         CPI     'C'-40H
  357.         RNZ             ;IGNORE IF NOT ^C
  358.         POP     PSW     ;CLEAR *RET* FROM STACK
  359.         LXI     H,STFSA ;PRINT 'FILE SEND ABORTED'
  360.         CALL    WCS
  361.         RET
  362. ;
  363. STFSM:  DB      'FILE SEND COMPLETE',CR,LF,0
  364. STFS1:  DB      'FILE NAME ERROR',CR,LF,0
  365. STFS2:  DB      'FILE NOT FOUND',CR,LF,0 
  366. STFSA:  DB      CR,LF,'FILE SEND ABORTED',CR,LF,0
  367. ;
  368. ;        SAVE - SAVE CHAR IN TEXT BUFFER IF FLAG ON
  369. ;        ENTRY CONDITIONS
  370. ;               A - CHARACTER TO SAVE
  371. ;
  372. SAVE:   PUSH    PSW
  373.         LDA     FLAG 
  374.         ORA     A
  375.         JNZ     SAVE1
  376.         POP     PSW
  377.         RET 
  378. ;
  379. SAVE1:  POP     PSW
  380.         CPI     DEL     ;RUBOUT (DEL) ?
  381.         RZ              ;YES, IGNORE IT
  382.         CPI     20H     ;TEST FOR CONTROL CHARACTERS
  383.         JNC     SAVE2   ;JUMP IF NOT CONTROL CHAR.
  384.         CPI     CR      ;ALLOW CR TO BE SAVED
  385.         JZ      SAVE2
  386.         CPI     LF      ;ALLOW LF TO BE SAVED
  387.         JZ      SAVE2
  388.         CPI     TAB     ;ALLOW TAB TO BE SAVED
  389.         JZ      SAVE2
  390.         RET             ;IGNORE ALL OTHER CONTROL CHARS.
  391. ;
  392. SAVE2:  PUSH    H
  393.         LHLD    SIZE    ;SIZE = SIZE + 1
  394.         INX     H
  395.         SHLD    SIZE 
  396.         LHLD    PTR
  397.         MOV     M,A
  398.         INX     H
  399.         SHLD    PTR
  400.         PUSH    PSW
  401.         LHLD    BREM
  402.         DCX     H
  403.         SHLD    BREM
  404.         MVI     A,0FFH
  405.         CMP     H
  406.         JZ      SAVEAB  ;ABORT IF TBUF FILLED
  407.         MVI     A,3
  408.         CMP     H
  409.         MVI     A,WRNSIG  ;SIGNAL CONSOLE RUNNING OUT OF SPACE
  410.         CNC     WCC
  411.         PUSH    H       ;HL = BYTES LEFT IN BUFFER
  412.         LXI     H,BRPOS ;POSITION ON 25TH LINE
  413.         CALL    WCSNP   ;CONSOLE WRITE WITHOUT PRINTER
  414.         POP     H
  415.         CALL    DECOUT  ;OUTPUT HL AS DECIMAL
  416.         LXI     H,RESCP
  417.         CALL    WCSNP   ;RESTORE CURSOR POSITION
  418.         POP     PSW
  419.         POP     H
  420.         RET 
  421. ;
  422. BRPOS:  DB      ESC,'j',ESC,'Y',BL+24,BL+75,ESC,'p',0
  423. PRTON:  DB      ESC,'j',ESC,'Y',BL+24,BL+38,ESC,'pon',ESC,'q ',ESC,'k',0
  424. PRTOFF: DB      ESC,'j',ESC,'Y',BL+24,BL+38,ESC,'poff'
  425. RESCP:  DB      ESC,'q',ESC,'k',0
  426. ;
  427. ;       SAVEAB - RAN OUT OF ROOM, ISSUE MESSAGE AND FLOW
  428. ;                THROUGH TO DISK SAVE ROUTINE
  429. ;
  430. SAVEND: DB      BELL,CR,LF,'ABORTING - NO ROOM LEFT',0
  431. ;
  432. SAVEAB: LXI     SP,STACK+64  ;REINITIALIZE STACK
  433.         LXI     H,SAVEND  ;PRINT 'ABORTING - NO ROOM LEFT'
  434.         CALL    WCS
  435.         LXI     H,LINK  ;SET UP RETURN ADDRESS
  436.         PUSH    H       ;LEAVE IT ON THE STACK
  437. ;
  438. ;        WTB - WRITE TEXT BUFFER TO DISK 
  439. ;
  440. WTB:    LHLD    SIZE    ;JUMP IF TEXT BUFFER EMPTY
  441.         MOV     A,L
  442.         ORA     H
  443.         JZ      WTB5 
  444.         MVI     C,RESDSK ;RESET IN CASE READ-ONLY
  445.         CALL    BDOS
  446.         CALL    GFN     ;GET FILE NAME
  447.         JC      WTB6    ;JUMP IF FILE NAME ERROR
  448.         CALL    DELT    ;DELETE OLD FILE, IF ANY
  449.         CALL    MAKE    ;MAKE NEW FILE
  450.         LHLD    SIZE    ;DE = TBUF SIZE 
  451.         XCHG
  452.         LXI     H,DBUF  ;TOP OF STACK POINTS TO DBUF
  453.         PUSH    H
  454.         LXI     H,TBUF  ;HL POINTS TO TBUF
  455. WTB1:   MVI     C,128   ;DISK BUFFER SIZE 
  456. WTB2:   MOV     A,M     ;FETCH NEXT BYTE OF TBUF
  457.         INX     H
  458.         XTHL
  459.         MOV     M,A     ;STORE IN DBUF
  460.         INX     H
  461.         XTHL
  462.         DCX     D       ;SIZE = SIZE - 1
  463.         MOV     A,D     ;EXIT LOOP IF SIZE = 0
  464.         ORA     E
  465.         JZ      WTB3 
  466.         DCR     C       ;LOOP UNTIL DBUF FULL 
  467.         JNZ     WTB2 
  468.         CALL    WRITE   ;WRITE FULL DBUF TO DISK
  469.         JNZ     NOWRT   ;IF WRITE NOT SUCCESSFUL
  470.         XTHL            ;TOP OF STACK POINTS TO DBUF
  471.         LXI     H,DBUF 
  472.         XTHL
  473.         JMP     WTB1    ;LOOP UNTIL END OF TBUF 
  474. ;
  475. WTB3:   POP     H       ;HL POINTS TO CURRENT PLACE IN DBUF 
  476. WTB4:   MVI     M,'Z'-40H ;STORE EOF CODE 
  477.         INX     H
  478.         DCR     C       ;LOOP THRU REST OF DBUF 
  479.         JNZ     WTB4 
  480.         CALL    WRITE   ;WRITE LAST SECTOR TO DISK
  481.         JNZ     NOWRT1  ;IF WRITE NOT SUCCESSFUL
  482.         CALL    CLOSE   ;CLEAN UP ACT AND GO HOME 
  483.         LXI     H,TBUF  ;CLEAR TEXT BUFFER
  484.         SHLD    PTR
  485.         LXI     H,0
  486.         SHLD    SIZE 
  487.         LXI     H,BRPOS ;SET CURSOR TO WRITE BYTES REMAINING
  488.         CALL    WCSNP
  489.         LHLD    BLEN
  490.         SHLD    BREM    ;REMAINING BUFFER IF BUFFER LENGTH
  491.         CALL    DECOUT
  492.         LXI     H,RESCP ;RESTORE CURSOR POSITION
  493.         CALL    WCSNP
  494.         LXI     H,WTBSM ;PRINT 'BUFFER SAVED ON DISK'
  495.         CALL    WCS
  496.         RET 
  497. ;
  498. NOWRT:  POP     H       ;WRITE FAILS, CLEAR STACK
  499. NOWRT1: LXI     H,NWMSG
  500.         CALL    WCS     ;TELL USER TO TRY AGAIN
  501.         JMP     WTB
  502. ;
  503. WTB5:   LXI     H,WTBS1 ;PRINT 'TEXT BUFFER EMPTY'
  504.         CALL    WCS
  505.         RET 
  506. ;
  507. WTB6:   LXI     H,WTBS2 ;PRINT 'FILE NAME ERROR'
  508.         CALL    WCS
  509.         RET 
  510. ;
  511. NWMSG:  DB      CR,LF,BELL,'DISK OVERFLOW - DO AGAIN',CR,LF,0
  512. WTBSM:  DB      CR,LF,'BUFFER SAVED ON DISK',CR,LF
  513.         DB      'MEMORY SAVE CANCELLED',CR,LF,0
  514. WTBS1:  DB      'TEXT BUFFER EMPTY',CR,LF,0
  515. WTBS2:  DB      'FILE NAME ERROR',CR,LF,0
  516. ;
  517. ;        WCS - WRITE CONSOLE STRING
  518. ;
  519. ;        ENTRY CONDITIONS
  520. ;               HL - POINTS TO STRING (TERM BY ZERO BYTE)
  521. ;
  522. WCS:    MOV     A,M
  523.         INX     H
  524.         ORA     A
  525.         RZ
  526.         CALL    WCC
  527.         JMP     WCS
  528. ;
  529. ;        WCSNP - WRITE CONSOLE STRING WITHOUT PRINTER OUTPUT
  530. ;
  531. ;        ENTRY CONDITIONS
  532. ;               HL - POINTS TO STRING (TERM BY ZERO BYTE)
  533. ;
  534. WCSNP:  MOV     A,M
  535.         INX     H
  536.         ORA     A
  537.         RZ
  538.         CALL    WCCNP
  539.         JMP     WCSNP
  540. ;
  541. ;        WCCR - WRITE CONSOLE CARRIAGE RETURN (AND LINE FEED)
  542. ;
  543. WCCR:   MVI     A,CR 
  544.         CALL    WCC
  545.         MVI     A,LF 
  546. ;
  547. ;        WCC - WRITE CONSOLE CHARACTER 
  548. ;        ENTRY CONDITIONS: 
  549. ;               A - CHARACTER TO WRITE 
  550. ;
  551. WCC:    PUSH    PSW
  552.         PUSH    B
  553.         PUSH    D
  554.         PUSH    H
  555.         MOV     C,A     ;GET CHARACTER FOR CBIOS
  556.         PUSH    B
  557. WCCAL:  CALL    $-$     ;MODIFIED BY INIT.
  558.         POP     B       ;C = CHAR
  559.         LDA     PRTFLG
  560.         ANA     A
  561.         CNZ     PRTOUT  ;IF SIMULTANEOUS LISTING WANTED
  562.         POP     H
  563.         POP     D
  564.         POP     B
  565.         POP     PSW
  566.         RET 
  567. ;
  568. ;SEND CHARACTER TO PRINTER
  569. ;       VALUE IN (C)
  570. ;
  571. ;
  572. PRTOUT: MOV     A,C     ;MOVE CHARACTER TO A
  573.         ANI     7FH     ;STRIP 8TH BIT FROM CHARACTER
  574.         MVI     C,LSTOUT;GET LIST OUTPUT FUNCTION
  575.         MOV     E,A     ;PUT CHARACTER IN E
  576.         CALL    BDOS    ;PRINT THE CHARACTER
  577.         RET
  578.  
  579. ;        WCCNP - WRITE CONSOLE CHARACTER WITHOUT PRINTER OUTPUT
  580. ;        ENTRY CONDITIONS: 
  581. ;               A - CHARACTER TO WRITE 
  582. ;
  583. WCCNP:  PUSH    PSW
  584.         PUSH    B
  585.         PUSH    D
  586.         PUSH    H
  587.         MOV     C,A     ;GET CHARACTER FOR CBIOS
  588. WCCAL1: CALL    $-$     ;MODIFIED BY INIT.
  589.         POP     H
  590.         POP     D
  591.         POP     B
  592.         POP     PSW
  593.         RET 
  594. ;
  595. ;        RCS - READ CONSOLE STRING (WITH ECHO) 
  596. ;        EXIT CONDITIONS 
  597. ;               B - NUMBER OF CHARACTERS READ (<255) 
  598. ;               HL - POINTS TO LAST CHAR STORED (CR) 
  599. ;
  600. RCS:    LXI     H,IBUF 
  601.         MVI     B,0
  602. RCS1:   CALL    RCC     ;READ NEXT CHAR FROM CONSOLE
  603.         CPI     DEL     ;JUMP IF NOT DEL
  604.         JNZ     RCS2 
  605.         INR     B       ;IGNORE DEL IF IBUF ALREADY EMPTY 
  606.         DCR     B
  607.         JZ      RCS1 
  608.         DCX     H       ;ELSE DISCARD LAST CHAR 
  609.         MOV     A,M     ;ECHO DISCARDED CHAR TO CONSOLE 
  610.         CALL    WCC
  611.         DCR     B       ;DECREMENT COUNT
  612.         JMP     RCS1    ;       AND LOOP 
  613. ;
  614. RCS2:   CPI     'U'-40H ;JUMP IF NOT CONTROL U
  615.         JNZ     RCS3 
  616.         CALL    WCCR    ;ELSE ABORT CURRENT LINE
  617.         JMP     RCS     ;       AND START OVER 
  618. ;
  619. RCS3:   CALL    WCC     ;ECHO CHAR TO CONSOLE 
  620.         MOV     M,A     ;STORE CHAR IN IBUF 
  621.         INR     B       ;INCREMENT COUNT
  622.         CPI     CR      ;JUMP IF CARRIAGE RETURN
  623.         JZ      RCS4
  624.         INX     H       ;ELSE ADVANCE POINTER 
  625.         JMP     RCS1    ;       AND LOOP 
  626. ;
  627. RCS4:   MVI     A,LF    ;ISSUE LINE FEED AND RETURN 
  628.         CALL    WCC
  629.         RET 
  630. ;
  631. ;        RCC - READ CONSOLE CHARACTER
  632. ;        EXIT CONDITIONS 
  633. ;               A - CHARACTER READ 
  634. ;
  635. RCC:    PUSH    B
  636.         PUSH    D
  637.         PUSH    H
  638. RCCAL:  CALL    $-$     ;MODIFIED BY INIT.
  639.         POP     H
  640.         POP     D
  641.         POP     B
  642.         RET 
  643. ;
  644. ;        WMC - WRITE MODEM CHARACTER 
  645. ;        ENTRY CONDITIONS
  646. ;               A - CHARACTER TO WRITE 
  647. ;
  648. ;
  649. WMC:    PUSH    PSW
  650. WMCL:   IN      MODS 
  651.         XRI     MXOR
  652.         ANI     MTBE
  653.         JNZ     WMCL
  654.         POP     PSW
  655.         ANI     7FH     ;STRIP PARITY BIT
  656.         OUT     MODD 
  657.         RET 
  658. ;
  659. WMS:    MOV     A,M     ;WRITE STRING TO MODEM
  660.         INX     H
  661.         ORA     A
  662.         RZ
  663.         CALL    WMC
  664.         JMP     WMS
  665. ;
  666. ;        RMC - READ MODEM CHARACTER
  667. ;        EXIT CONDITIONS:
  668. ;               A - CHARACTER READ 
  669. ;
  670. ;
  671. RMC:    IN      MODS 
  672.         XRI     MXOR
  673.         ANI     MRDA
  674.         JNZ     RMC
  675. RMC2:   IN      MODD 
  676.         ANI     7FH 
  677.         RET 
  678. ;
  679. ;
  680. ;        GFN - GET FILE NAME 
  681. ;
  682. GFN:    LXI     H,GFNSD ;PRINT 'WHICH DRIVE?'
  683.         CALL    WCS
  684.         CALL    RCC     ;GET ANSWER FROM CONSOLE
  685.         CALL    WCC     ;ECHO IT TO CONSOLE
  686.         ANI     5FH     ;MAKE UPPER CASE
  687.         SUI     'A'-1
  688.         JC      GFN     ;REQUIRE ALPHABETIC
  689.         JZ      GFN
  690.         CPI     NUMDRV+1
  691.         JNC     GFN
  692.         STA     FCB
  693. GFNB:   LXI     H,GFNS1 ;PRINT 'FILENAME? ' 
  694.         CALL    WCS
  695.         CALL    RCS     ;READ RESPONSE INTO IBUF
  696.         LXI     H,FCB+FN  ;BLANK FILL FN AND FT FIELDS
  697.         MVI     C,11 
  698. GFN1:   MVI     M,BL
  699.         INX     H
  700.         DCR     C
  701.         JNZ     GFN1 
  702.         LXI     H,IBUF  ;POINT TO INPUT BUFFER
  703.         LXI     D,FCB+FN  ;SCAN OFF FN FIELD
  704.         MVI     C,9
  705. GFN2:   MOV     A,M     ;FETCH NEXT CHAR FROM IBUF
  706.         INX     H
  707.         CPI     61H     ;IF LC, CONVERT TO UC 
  708.         JC      GFN2A
  709.         SUI     20H
  710. GFN2A:  CPI     CR      ;JUMP IF END OF LINE
  711.         JZ      GFN5 
  712.         CPI     '.'     ;JUMP IF END OF NAME
  713.         JZ      GFN3 
  714.         STAX    D       ;ELSE STORE CHAR IN FN FIELD
  715.         INX     D
  716.         DCR     C       ;LOOP IF 8 OR LESS CHARS SO FAR
  717.         JNZ     GFN2 
  718.         JMP     GFN6    ;ELSE TAKE ERROR EXIT 
  719. ;
  720. GFN3:   LXI     D,FCB+FT  ;SCAN OFF FT FIELD
  721.         MVI     C,4
  722. GFN4:   MOV     A,M     ;FETCH NEXT CHAR FROM IBUF
  723.         INX     H
  724.         CPI     61H     ;IF LC, CONVERT TO UC 
  725.         JC      GFN4A
  726.         SUI     20H
  727. GFN4A:  CPI     CR      ;JUMP IF END OF LINE
  728.         JZ      GFN5 
  729.         STAX    D       ;ELSE STORE CHAR IN FT FIELD
  730.         INX     D
  731.         DCR     C       ;LOOP IF 3 OR LESS CHARS SO FAR
  732.         JNZ     GFN4 
  733.         JMP     GFN6    ;ELSE TAKE ERROR EXIT 
  734. ;
  735. GFN5:   XRA     A
  736.         STA     FCB+EX  ;SET EXTENT NUMBER TO ZERO
  737.         STA     FCB+NR  ;SET RECORD NUMBER TO ZERO
  738.         STC             ;CLEAR ERROR FLAG AND RETURN
  739.         CMC 
  740.         RET 
  741. ;
  742. GFN6:   STC             ;SET ERROR FLAG AND RETURN
  743.         RET 
  744. ;
  745. GFNSD:  DB      CR,LF,'WHICH DRIVE? ',0
  746. GFNS1:  DB      CR,LF,'FILENAME? ',0 
  747. ;
  748. ;        OPEN - OPEN DISK FILE 
  749. ;
  750. OPEN:   PUSH    H
  751.         PUSH    D
  752.         PUSH    B
  753.         LXI     D,FCB
  754.         MVI     C,OFFC 
  755.         CALL    BDOS 
  756.         POP     B
  757.         POP     D
  758.         POP     H
  759.         RET 
  760. ;
  761. ;        READ - READ RECORD FROM DISK FILE 
  762. ;
  763. READ:   PUSH    H
  764.         PUSH    D
  765.         PUSH    B
  766.         LXI     D,FCB
  767.         MVI     C,RRFC 
  768.         CALL    BDOS 
  769.         POP     B
  770.         POP     D
  771.         POP     H
  772.         RET 
  773. ;
  774. ;        CLOSE - CLOSE DISK FILE 
  775. ;
  776. CLOSE:  PUSH    H
  777.         PUSH    D
  778.         PUSH    B
  779.         LXI     D,FCB
  780.         MVI     C,CFFC 
  781.         CALL    BDOS 
  782.         POP     B
  783.         POP     D
  784.         POP     H
  785.         RET 
  786. ;
  787. ;        DELT - DELETE DISK FILE 
  788. ;
  789. DELT:   PUSH    H
  790.         PUSH    D
  791.         PUSH    B
  792.         LXI     D,FCB
  793.         MVI     C,DFFC 
  794.         CALL    BDOS 
  795.         POP     B
  796.         POP     D
  797.         POP     H
  798.         RET 
  799. ;
  800. ;        WRITE - WRITE RECORD TO DISK
  801. ;
  802. WRITE:  PUSH    H
  803.         PUSH    D
  804.         PUSH    B
  805.         LXI     D,FCB
  806.         MVI     C,WRFC 
  807.         CALL    BDOS 
  808.         ANA     A       ;SET 'Z' FLAG FOR ERROR
  809.         POP     B
  810.         POP     D
  811.         POP     H
  812.         RET 
  813. ;
  814. ;        MAKE - MAKE NEW DISK FILE 
  815. ;
  816. MAKE:   PUSH    H
  817.         PUSH    D
  818.         PUSH    B
  819.         LXI     D,FCB
  820.         MVI     C,MFFC
  821.         CALL    BDOS 
  822.         POP     B
  823.         POP     D
  824.         POP     H
  825.         RET 
  826. ;
  827. ;       CITEST - CHECK CONSOLE INPUT STATUS
  828. ;
  829. CITEST: PUSH    B
  830.         PUSH    D
  831.         PUSH    H
  832. CITCAL: CALL    $-$     ;MODIFIED BY INIT.
  833.         ORA     A       ;SET ZERO FLAG
  834.         POP     H
  835.         POP     D
  836.         POP     B
  837.         RET             ;ZERO FLAG CARRIES ANSWER
  838. ;
  839. ;       MITEST - CHECK MODEM INPUT STATUS
  840. ;
  841. MITEST: IN      MODS    ;GET MODEM UART STATUS
  842.         XRI     MXOR    ;INVERT HIGH-TRUE BITS
  843.         ANI     MRDA    ;ANY DATA AVAILABLE?
  844.         MVI     A,0
  845.         JNZ     MITST1
  846.         CMA
  847. MITST1: ORA     A
  848.         RET             ;ZERO FLAG CARRIES ANSWER
  849. ;
  850. ;
  851. ;       MOTEST - CHECK MODEM OUTPUT STATUS
  852. ;
  853. ;
  854. MOTEST: IN      MODS    ;GET MODEM UART STATUS
  855.         XRI     MXOR    ;INVERT HIGH-TRUE BITS
  856.         ANI     MTBE    ;UART READY FOR CHARACTER?
  857.         MVI     A,0
  858.         JNZ     MOTST1  ;ZERO FLAG CARRIES ANSWER
  859.         CMA
  860. MOTST1: ORA     A       ;SET ZERO FLAG IF READY
  861.         RET
  862. ;
  863. ;DECIMAL PRINT SUBROUTINE
  864. ;PRINTS H,L AS A DECIMAL NO.
  865. ;
  866. DECOUT  LXI     D,-10000
  867.         CALL    PRTDGT          ;PRINT 10'S OF THOUSANDS
  868.         LXI     D,-1000
  869.         CALL    PRTDGT          ;PRINT THOUSANDS
  870.         LXI     D,-100
  871.         CALL    PRTDGT          ;PRINT HUNDREDS
  872.         LXI     D,-10
  873.         CALL    PRTDGT          ;PRINT TENS
  874.         LXI     D,-1
  875. PRTDGT  MVI     C,'0'-1         ;INITIALIZE COUNT
  876.         PUSH    H               ;SO INITIAL INX SP'S WON'T HURT
  877. PRT1    INR     C               ;BUMP COUNT OF SUCCESSFUL SUBTR.
  878.         INX     SP              ;"POP" STACK W/O ALTERING REGISTERS
  879.         INX     SP
  880.         PUSH    H               ;SAVE H,L
  881.         DAD     D               ;DO 1 SUBTRACTION
  882.         JC      PRT1            ;IF RESULT STILL POS., DO IT AGAIN
  883.         POP     H               ;RESTORE LAST GOOD VALUE TO H,L
  884.         MOV     A,C
  885.         JMP     WCCNP           ;PRINT CHAR & RET
  886. ;
  887. ;        DATA AREA 
  888. ;
  889. BLEN:   DS      2       ;BUFFER LENGTH
  890. BREM:   DS      2       ;BYTES TBUF REMAINING
  891. PRTFLG: DB      0       ;PRINTER OFF IF ZERO
  892. INCH:   DS      1       ;INPUT CHAR BUFFER (TO CYBER) 
  893. OUTCH:  DS      1       ;OUTPUT CHAR BUFFER (FROM CIBER)
  894. STACK:  DS      80      ;LOCAL STACK
  895. IBUF:   DS      256     ;INPUT BUFFER 
  896. ;
  897. ;        TEXT BUFFER 
  898. ;
  899. FLAG:   DS      1       ;TEXT SAVE FLAG 
  900. PTR:    DS      2       ;TEXT BUFFER POINTER
  901. SIZE:   DS      2       ;TEXT BUFFER SIZE 
  902. TBUF:   EQU     $       ;START OF TEXT BUFFER 
  903. ;
  904. ;INITIAL CODE IS PLACED HERE TO SAVE SPACE (BUFFER OVERWRITES IT)
  905. ;
  906. INIT:   POP     H       ;SAVE RETURN ADDRESS
  907.         LXI     SP,STACK+64     ;CREATE LOCAL STACK 
  908.         PUSH    H       ;RESTORE RETURN ADDRES TO STACK
  909.         LHLD    BASE+1  ;POINT TO CP/M JMP TABLE
  910.         LXI     D,3     ;GET READY TO ADD 3
  911.         DAD     D       ;POINT TO CON STATUS JMP
  912.         SHLD    CITCAL+1 ;MODIFY CALL ADRS
  913.         DAD     D       ;POINT TO CON IN JMP
  914.         SHLD    RCCAL+1 ;MODIFY CALL ADRS
  915.         DAD     D       ;POINT TO CON OUT JMP
  916.         SHLD    WCCAL+1 ;MODIFY CALL ADRS
  917.         SHLD    WCCAL1+1
  918.         LDA     FCB+1   ;SEE IF OPTIONAL TRIGER CHAR
  919.         CPI     20H     ;BLANK.. ?
  920.         JZ      SKP     ;..BLANK SO USE DEFAULT "LF"
  921.         CPI     'B'     ;BELL WANTED
  922.         JZ      TRGBEL
  923.         CPI     'X'     ;XON WANTED
  924.         JZ      TRGXON
  925.         CPI     'U'     ;UPLOADING NO CHECKING FOR TRIGER
  926.         JZ      TRGUPL
  927. ;
  928. SETTRG  STA     OVERLY+1 ;STORE THE CHARACTER AS IS THEN
  929.         JMP     SKP
  930. ;
  931. TRGBEL  MVI     A,BELL
  932.         JMP     SETTRG
  933. ;
  934. TRGXON  MVI     A,XON
  935.         JMP     SETTRG
  936. ;
  937. TRGUPL  XRA     A               ;ZERO OUT JUMP
  938.         STA     OVERL1+1        ;CHANGE CHECK FOR C/R TO NULL
  939.         STA     OVERL2+1        ;AND SEND LINEFEEDS AS WELL
  940. ;
  941. SKP     EQU     $
  942. ;
  943. ;
  944.         XRA     A       ;CLEAR CHAR BUFFERS 
  945.         STA     INCH 
  946.         STA     OUTCH
  947.         STA     FLAG    ;CLEAR TEXT SAVE FLAG 
  948.         LXI     H,TBUF  ;SET PTR TO TBUF
  949.         SHLD    PTR
  950.         LXI     H,0     ;SIZE = 0 
  951.         SHLD    SIZE 
  952.         LHLD    BASE+6
  953.         MVI     L,0
  954.         DCR     H       ;HL = MAX TBUF TOP
  955.         LXI     D,-TBUF
  956.         DAD     D       ;HL = MAX TBUF LEN
  957.         SHLD    BLEN
  958.         SHLD    BREM    ;BUFFER BYTES REMAINING
  959.         LXI     H,LINKMS  ;PRINT SIGN-ON MESSAGE
  960.         CALL    WCSNP
  961.         LHLD    BLEN    ;PRINT BUFFER ON 25TH LINE
  962.         CALL    DECOUT
  963.         LXI     H,RESCP
  964.         CALL    WCSNP
  965.         RET             ;RETURN TO MAIN LOOP
  966. ;
  967. LINKMS: DB      ESC,'E',ESC,'Y',BL+5,BL+22
  968.         DB      'H/Z-89 TNC CONTROLLER - RSI - DEC 89'
  969.         DB      CR,LF,LF,LF
  970.         DB      ESC,'x1',ESC,'j',ESC,'Y',BL+24,BL+5
  971.         DB      ESC,'pSave',ESC,'q   '
  972.         DB      ESC,'pFile',ESC,'q   '
  973.         DB      ESC,'pSend',ESC,'q   '
  974.         DB      ESC,'pN/A',ESC,'q   '
  975.         DB      ESC,'pPrint off',ESC,'q'
  976.         DB      ESC,'Y',BL+24,BL+53,ESC,'pExit',ESC,'q         '
  977.         DB      ESC,'pBuffer = ',0
  978. ;
  979.         END     LINK0
  980. W
  981.         PUSH    B
  982.         PUSH    D
  983.         PUSH    H
  984.         MOV     C,A     ;GET CHARACTER FOR CBIOS