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 / CPM / MODEMS / MODEM / INTRTRAN.LBR / KTRANS.AQM / KTRANS.ASM
Assembly Source File  |  2000-06-30  |  18KB  |  601 lines

  1. ;THIS VERSION DOES NOT CHANGE THE BAUD RATE. THIS MUST BE SET BEFORE ENTERING
  2. ;THIS PROGRAM.
  3. ;THIS IS A PACKAGE FOR FILE TRANSFER BETWEEN CP/M COMPUTERS. IT IS
  4. ;DESIGNED SO THAT ALMOST ANY TYPE OF FILE CAN BE TRANSFERRED. CODES
  5. ;BELOW 20 AND ABOVE 7F ARE TRANSFERRED AS DOUBLE BYTES USING THREE SPECIAL
  6. ;SIGNALLING CODES (11H, 12H, AND 13H). THIS ALLOWS FOR THE FASTEST TRANSFER
  7. ;FOR MOST TYPES OF FILES INCLUDING OBJECT FILES SINCE DOUBLE BYTES ARE ONLY
  8. ;NECESSARY FOR OUT OF RANGE CODES.
  9. ;THIS PROGRAM MUST RESIDE ON BOTH THE SYSTEMS WISHING TO TRANSFER ESPECIALLY
  10. ;IF OBJECT FILES ARE TO BE TRANSFERRED, DUE TO THE UNIQUE FORMAT.
  11. ;******************************************************
  12. ;* THIS VERSION IS FOR THE BIG BOARD SERIAL CHANNEL A *
  13. ;******************************************************
  14.                 ;
  15.                 ;
  16.                 ;
  17.     ASEG            ;DEFINE AN ABSOLUTE SEGMENT
  18.     ORG    0100H        ;ORIGINED FOR START OF CP/M.
  19.                 ;
  20.     CALL    MES0        ;OUTPUT INITIAL HELP MESSAGE.
  21.     CALL    INIT        ;INITIALIZE SERIAL PORT A.
  22.                 ;
  23.                 ;
  24. POLLOP:    MVI    C,06H        ;CHECK CONSOLE STATUS TO SEE IF CHAR IN.
  25.     MVI    E,0FFH        ;    "          "          "
  26.     CALL    0005H        ;    "          "          "
  27.     CPI    00H        ;    "          "          "
  28.     JZ    NOCHAR        ;IF NONE DO NOT TRANSMIT.
  29.                 ;
  30.                 ;
  31.     CPI    03H        ;IF ^C END PROGRAM.
  32.     JZ    0000H        ;    "
  33.                 ;
  34.     CPI    08H        ;IF ^H DISPLAY HELP MESSAGE.
  35.     JNZ    NXT1        ;    "          "
  36.     CALL    MES0        ;    "          "
  37.     JMP    POLLOP        ;RE-LOOP.
  38.                 ;
  39. NXT1:    CPI    12H        ;IF ^R RECEIVE FILE FROM REMOTE.
  40.     JNZ    NXT2        ;    "          "
  41.     CALL    RECEIV        ;    "          "
  42.     JMP    POLLOP        ;RE-LOOP.
  43.                 ;
  44. NXT2:    CPI    14H        ;IF ^T SEND FILE TO REMOTE.
  45.     JNZ    NXT3        ;    "          "
  46.     CALL    SEND        ;    "          "
  47.     JMP    POLLOP        ;RE-LOOP.
  48.                 ;
  49. NXT3:    CALL    TXDATA        ;OUTPUT CHARACTER ON SERIAL PORT A.
  50.                 ;
  51.                 ;
  52. NOCHAR:    CALL    RXDATA        ;CHECK FOR RECEIVE DATA.
  53.     JZ    POLLOP        ;IF NONE JUST RE-LOOP.
  54.                 ;
  55.     MVI    C,06H        ;SEND CHARACTER TO CONSOLE.
  56.     MOV    E,A        ;    "          "
  57.     CALL    0005H        ;    "          "
  58.                 ;
  59.     JMP    POLLOP        ;KEEP LOOPING.
  60.     PAGE
  61. ;THIS IS THE RECEIVE ROUTINE. WHEN CALLED IT PROMPTS THE USER FOR THE
  62. ;FILE NAME AND THEN CAUSES A TRANSFER FROM THE REMOTE COMPUTER TO THIS
  63. ;SYSTEM. UPON FINISHING IT EXECUTES A RETURN TO THE MAIN LOOP IN ORDER TO
  64. ;ACCEPT FURTHER COMMANDS.
  65.                 ;
  66.                 ;
  67.                 ;
  68. RECEIV:    CALL    MES2        ;OUTPUT CP/M FILE NAME MESSAGE.
  69.     CALL    SETFCB        ;LOAD FCB WITH FILE NAME ETC.
  70.     JNZ    ERROR        ;PRINT ENTRY ERROR MESSAGE & RETURN.
  71.                 ;
  72.                 ;
  73.     MVI    C,0FH        ;OPEN FILE.
  74.     LXI    D,005CH        ;    "
  75.     CALL    0005H        ;    "
  76.                 ;
  77.     CPI    0FFH        ;IF ACC IS FF FILE NOT FOUND,
  78.     JZ    MAKER        ;SO JUMP AND MAKE NEW FILE.
  79.                 ;
  80.                 ;
  81. FINLOP:    CALL    MES8        ;OUTPUT OVERWRITE Y/N MESSAGE.
  82.     MVI    C,01H        ;READ CONSOLE CHARACTER.
  83.     CALL    0005H        ;    "
  84.     CPI    'N'        ;IF NO OUTPUT ABORT MESSAGE.
  85.     JZ    MES9        ;    "          "
  86.     CPI    'Y'        ;IF YES CONTINUE AND LOAD FILE,
  87.     JNZ    FINLOP        ;OTHERWISE RE-LOOP UNTIL Y OR N.
  88.                 ;
  89.     MVI    C,13H        ;DELETE OLD FILE.
  90.     LXI    D,005CH        ;    "
  91.     CALL    0005H        ;    "
  92.                 ;
  93. MAKER:    MVI    C,16H        ;MAKE NEW FILE.
  94.     LXI    D,005CH        ;    "
  95.     CALL    0005H        ;    "
  96.                 ;
  97.     CPI    0FFH        ;IF ACC IS FF NO SPACE IS LEFT.
  98.     JZ    MES7        ;    "          "
  99.                 ;
  100.                 ;
  101.     CALL    MES5        ;OUTPUT RECEIVING MESSAGE.
  102.                 ;
  103. TRANSX:    LXI    H,0080H        ;PREPARE TO INPUT 128 BYTE BLOCK.
  104.                 ;
  105. PUTLOP:    CALL    RX800        ;INPUT CHARACTER.
  106.     JZ    TERMIN        ;IF ^Z DETECTED TERMINATE.
  107.                 ;
  108.     MOV    M,A        ;STORE INPUT IN DISK TRANSIENT MEMORY.
  109.                 ;
  110.     INR    L        ;INCREMENT THE MEMORY POINTER.
  111.     JNZ    PUTLOP        ;STOP IF L OVERFLOWS, OTHERWISE KEEP LOOPING.
  112.                 ;
  113.                 ;
  114.     MVI    C,15H        ;WRITE FILE SEQUENTIALLY.
  115.     LXI    D,005CH        ;    "
  116.     CALL    0005H        ;    "
  117.                 ;
  118.     CPI    00H        ;IF ACC IS NOT ZERO THEN
  119.     JNZ    MES7        ;NO SPACE IS LEFT ON DISK.
  120.     JMP    TRANSX        ;RE-LOOP AND INPUT NEXT 128 BYTE BLOCK.
  121.                 ;
  122.                 ;
  123.                 ;
  124. TERMIN:    MVI    M,' '        ;PUT ASCII SPACES IN REST OF BLOCK.
  125.     INR    L        ;    "          "
  126.     JNZ    TERMIN        ;    "          "
  127.                 ;
  128.     MVI    C,15H        ;WRITE FILE SEQUENTIALLY.
  129.     LXI    D,005CH        ;    "
  130.     CALL    0005H        ;    "
  131.                 ;
  132.     MVI    C,10H        ;CLOSE FILE.
  133.     LXI    D,005CH        ;    "
  134.     CALL    0005H        ;    "
  135.                 ;
  136.     CALL    MES6        ;OUTPUT "FINISHED" MESSAGE.
  137.     RET            ;RETURN TO CALLING PROGRAM.
  138.     PAGE
  139. ;THIS IS THE SEND ROUTINE. WHEN CALLED IT PROMPTS THE USER FOR THE FILE
  140. ;NAME AND THEN CAUSES A TRANSFER TO THE REMOTE COMPUTER FROM THIS
  141. ;SYSTEM. UPON FINISHING IT EXECUTES A RETURN TO THE MAIN LOOP IN ORDER TO
  142. ;ACCEPT FURTHER COMMANDS.
  143.                 ;
  144.                 ;
  145.                 ;
  146. SEND:    CALL    MES2        ;OUTPUT CP/M FILE NAME MESSAGE.
  147.     CALL    SETFCB        ;LOAD FCB WITH FILE NAME ETC.
  148.     JNZ    ERROR        ;PRINT ENTRY ERROR MESSAGE & RETURN.
  149.                 ;
  150.     MVI    C,0FH        ;OPEN FILE.
  151.     LXI    D,005CH        ;    "
  152.     CALL    0005H        ;    "
  153.                 ;
  154.     CPI    0FFH        ;IF ACC IS FF FILE NOT FOUND.
  155.     JNZ    FOUND        ;    "          "
  156.     CALL    MES3        ;OUTPUT FILE NOT FOUND MESSAGE.
  157.     RET            ;RETURN TO CALLING PROGRAM.
  158.                 ;
  159.                 ;
  160. FOUND:    CALL    MES4        ;OUTPUT SENDING MESSAGE.
  161.                 ;
  162. TRANS:    MVI    C,14H        ;READ FILE SEQUENTIALLY.
  163.     LXI    D,005CH        ;    "
  164.     CALL    0005H        ;    "
  165.                 ;
  166.     CPI    00H        ;IF ACC IS NOT ZERO END OF FILE,
  167.     JNZ    STOPER        ;SO SEND TERMINATION CHARACTERS ETC.
  168.                 ;
  169.                 ;
  170.     LXI    H,0080H        ;PREPARE TO OUTPUT 128 BYTE BLOCK.
  171.                 ;
  172. TRNLOP:    MOV    A,M        ;SEND CHARACTER TO REMOTE.
  173.     CALL    TX800        ;    "          "
  174.                 ;
  175.     INR    L        ;POINT AT NEXT LOCATION FOR TRANSFER.
  176.     JNZ    TRNLOP        ;IF L = 00 BLOCK IS TRANSFERRED, SO
  177.     JMP    TRANS        ;JUMP AND PICK UP NEXT 128 BYTE BLOCK.
  178.                 ;
  179.                 ;
  180. STOPER:    MVI    A,1AH        ;SEND ^Z TO TERMINATE FILE TRANSFER.
  181.     CALL    TXDATA        ;    "          "
  182.     CALL    MES6        ;OUTPUT "FINISHED" MESSAGE.
  183.     RET            ;RETURN TO CALLING PROGRAM.
  184.     PAGE
  185. ;THIS ROUTINE PREPARES THE FCB WITH DATA INPUT FROM THE KEYBOARD. IT RETURNES
  186. ;WHEN A CARRIAGE RETURN IS RECEIVED, THE FCB HAVING BEING LOADED WITH THE
  187. ;RELEVANT FILE NAME AND DISK DRIVE NUMBER.
  188. ;THE ROUTINE WAITS FOR A CHARACTER, IF IT IS A COLON THE PREVIOUS CHARACTER
  189. ;IS USED TO SET THE SELECTED DRIVE. IF A COLON IS NOT FOUND THE
  190. ;DEFAULT DRIVE IS SELECTED. NEXT CHARACTERS IMMEDIATELY AFTER THE COLON
  191. ;ARE LOADED INTO FCB LOCATIONS 1 TO 8 (MAX OF 8). FINALLY A FULL STOP IS
  192. ;SEARCHED FOR AND THE FIRST THREE CHARACTERS LOADED INTO THE THREE FILE TYPE
  193. ;BYTES. ENTRY ERRORS ARE FLAGGED BY THE ZERO BIT BEING CLEAR ON RETURN.
  194.                 ;
  195.                 ;
  196. SETFCB:    LXI    H,005CH        ;PUT BLANKS UP TO 0067H.
  197. CLRLOP:    MVI    A,' '        ;    "
  198.     MOV    M,A        ;    "
  199.     MOV    A,L        ;    "
  200.     INX    H        ;    "
  201.     CPI    67H        ;    "
  202.     JNZ    CLRLOP        ;    "
  203.                 ;
  204. ZERLOP:    MVI    A,00H        ;PUT ZERO IN REST.
  205.     MOV    M,A        ;    "
  206.     MOV    A,L        ;    "
  207.     INX    H        ;    "
  208.     CPI    7FH        ;    "
  209.     JNZ    ZERLOP        ;    "
  210.                 ;
  211.                 ;
  212.     LXI    H,005CH        ;SET HL TO POINT AT BEGINNING OF FCB.
  213.     MVI    M,00H        ;SET THE DRIVE CODE TO DEFAULT.
  214.                 ;
  215. FCBLOP:    PUSH    H        ;SAVE VITAL REGISTER PAIRS ON STACK.
  216.     MVI    C,01H        ;SE╘ U╨ T╧ US┼ BDO╙ CONSOL┼ INPUT FUNCTION.
  217.     CALL    0005H        ;CALL BDOS.
  218.     POP    H        ;RESTORE VITAL REGISTERS FROM STACK.
  219.                 ;
  220.     CPI    ' '        ;IGNORE A SPACE.
  221.     JZ    FCBLOP        ;    "
  222.                 ;
  223.     CPI    ':'        ;IF A COLON SET DRIVE CODE AND RESET POINTER.
  224.     JZ    COLON        ;OTHERWISE CHECK FOR CARRIAGE RETURN.
  225.                 ;
  226.     CPI    0DH        ;IF CARRIAGE RETURN END PROGRAM.
  227.     RZ            ;    "          "
  228.                 ;
  229.     CPI    '.'        ;IF FULL STOP INPUT FILE TYPE.
  230.     JZ    FITYPE        ;    "          "
  231.                 ;
  232.     MOV    C,A        ;PUT CHARACTER IN REG C.
  233.     INX    H        ;INCREMENT THE FCB POINTER
  234.     MOV    A,L        ;AND ENSURE IT IS NOT 0065H.
  235.     CPI    65H        ;    "          "
  236.     JZ    SIGERR        ;SIGNAL    ENTRY ERROR.
  237.                 ;
  238.     MOV    M,C        ;STORE CHARACTER IN FCB.
  239.     JMP    FCBLOP        ;RE-LOOP FOR NEXT CHARACTER.
  240.                 ;
  241.                 ;
  242.                 ;
  243. COLON:    MOV    A,M        ;PICK UP DRIVE CHARACTER.
  244.     ORA    A        ;IF ZERO NO CHAR BEFORE COLON.
  245.     JZ    FCBLOP        ;    "          "
  246.     DCR    A        ;FIX DRIVE CODE.
  247.     ANI    00001111B    ;    "
  248.     INR    A        ;    "
  249.                 ;
  250.     LXI    H,005CH        ;PLACE DRIVE CODE IN FCB LOCATION 0.
  251.     MOV    M,A        ;    "          "          "
  252.     JMP    FCBLOP        ;RE-LOOP FOR NEXT CHARACTER.
  253.                 ;
  254.                 ;
  255.                 ;
  256. FITYPE:    LXI    H,0064H        ;POINT HL AT BEGINNING OF FILE TYPE - 1.
  257.                 ;
  258. TYPLOP:    PUSH    H        ;SAVE VITAL REGISTER PAIRS ON STACK.
  259.     MVI    C,01H        ;SE╘ U╨ T╧ US┼ BDO╙ CONSOL┼ INPUT FUNCTION.
  260.     CALL    0005H        ;CALL BDOS.
  261.     POP    H        ;RESTORE VITAL REGISTERS FROM STACK.
  262.                 ;
  263.     CPI    0DH        ;IF CARRIAGE RETURN END ROUTINE.
  264.     RZ            ;    "          "
  265.                 ;
  266.     MOV    C,A        ;PUT CHARACTER IN REG C.
  267.     INX    H        ;INCREMENT THE FCB POINTER
  268.     MOV    A,L        ;AND ENSURE IT IS NOT 0068H.
  269.     CPI    68H        ;    "          "
  270.     JZ    SIGERR        ;SIGNAL    ENTRY ERROR.
  271.                 ;
  272.     MOV    M,C        ;STORE CHARACTER IN FCB.
  273.     JMP    TYPLOP        ;RE-LOOP FOR NEXT CHARACTER.
  274.                 ;
  275.                 ;
  276. SIGERR:    MVI    A,80H        ;CLEAR THE ZERO BIT.
  277.     DCR    A        ;    "
  278.     RET            ;RETURN TO CALLING PROGRAM.
  279.     PAGE
  280. ;THIS ROUTINE OUTPUTS A STRING FROM MEMORY STARTING AT THE ADDRESS POINTED
  281. ;TO BY THE REGISTER PAIR HL AND ENDING AT THE LOCATION CONTAINING FF.
  282.                 ;
  283.                 ;
  284.                 ;
  285. STRING:    MOV    A,M        ;LOAD ACC WITH CHARACTER.
  286.     CPI    0FFH        ;IF CHARACTER FF RETURN.
  287.     RZ            ;    "
  288.                 ;
  289.     CALL    TX800        ;SEND CHARACTER TO REMOTE.
  290.     INX    H        ;INC MEMORY POINTER AND,
  291.     JMP    STRING        ;RE-LOOP.
  292.     PAGE
  293. ;THIS ROUTINE OUTPUTS A STRING OF LENGTH N, WHERE N IS CONTAINED IN THE
  294. ;LOCATION POINTED TO BY HL.
  295. ;THE STRING STARTS AT THE LOCATION POINTED TO BY HL + 1.
  296.                 ;
  297.                 ;
  298.                 ;
  299. OUTBUF:    MOV    B,M        ;LOAD B AS A LOOP COUNTER.
  300.                 ;
  301. OUTLOP:    INX    H        ;OUTPUT CHARACTER TO REMOTE.
  302.     MOV    A,M        ;    "
  303.     CALL    TX800        ;    "
  304.     DCR    B        ;LOOP UNTIL B IS ZERO.
  305.     JNZ    OUTLOP        ;    "
  306.                 ;
  307.     RET            ;RETURN TO CALLING PROGRAM.
  308.                 ;
  309.                 ;
  310.                 ;
  311. KEYBUF:    DB    0EH,00H        ;DEFINE KEYBOARD INPUT BUFFER (MAX = 14)
  312.     DB    '        '    ;    "          "          "
  313.     DB    '        '    ;    "          "          "
  314.     PAGE
  315. ;THIS ROUTINE IS USED TO TRANSMIT DATA TO THE REMOTE COMPUTER.
  316. ;TO ALLOW FOR DISK TRANSFERS AT THE REMOTE END IT ALLOWS FOR "ACK" PROTOCOL.
  317. ;THIS ROUTINE ONLY TRANSMITS A CHARACTER AFTER AN "ACK" IS RECEIVED. WHEN
  318. ;THE "ACK" IS RECEIVED CONTROL WILL BE RETURNED TO THE CALLING PROGRAM.
  319. ;TO USE THE ROUTINE THE ACCUMULATOR IS LOADED WITH THE CHARACTER TO BE SENT,
  320. ;AND THIS ROUTINE IS CALLED.
  321. ;THIS ROUTINE ALSO CAUSES THE REMAPPING OF THE CODES TO ALLOW TRANSMISSION
  322. ;OF OUT OF RANGE CHARACTERS USING DOUBLE BYTES. MAPPING IS AS FOLLOWS:
  323. ;
  324. ;        (DC1)  11H ---------- CODES 00H TO 1FH
  325. ;        (DC2)  12H ---------- CODES 80H TO 9FH
  326. ;        (DC2)  13H ---------- CODES A0H TO FFH    
  327.                 ;
  328.                 ;
  329.                 ;
  330. TX800:    PUSH    PSW        ;SAVE DATA TO BE TRANSMITTED ON THE STACK.
  331.     PUSH    PSW        ;    "          "          "
  332.     PUSH    PSW        ;    "          "          "
  333.                 ;
  334. AKWAIT:    CALL    RXDATA        ;WAIT FOR AN "ACK".
  335.     JZ    AKWAIT        ;    "
  336.     CPI    06H        ;    "
  337.     JNZ    AKWAIT        ;    "
  338.     POP    PSW        ;RESTORE DATA TO BE TRANSMITTED.
  339.                 ;
  340.     CPI    20H        ;IF DATA LESS THAN 20 OUTPUT DC1 FIRST.
  341.     JNC    RAWDAT        ;    "          "          "
  342.     MVI    A,11H        ;    "          "          "
  343.     CALL    TXDATA        ;    "          "          "
  344.     POP    PSW        ;ADD 20 TO DATA THEN,
  345.     ADI    20H        ;    "    
  346.     JMP    DATOUT        ;JUMP AND OUTPUT DATA.
  347.                 ;    
  348. RAWDAT:    CPI    80H        ;IF DATA LESS THAN 80 JUST OUTPUT DATA.
  349.     JNC    TRYDC2        ;    "          "          "
  350.     POP    PSW        ;RESTORE DATA THEN,
  351.     JMP    DATOUT        ;JUMP AND OUTPUT DATA.
  352.                 ;    
  353. TRYDC2:    CPI    0A0H        ;IF DATA LESS THAN A0 OUTPUT DC2 FIRST.
  354.     JNC    TRYDC3        ;    "          "          "
  355.     MVI    A,12H        ;    "          "          "
  356.     CALL    TXDATA        ;    "          "          "
  357.     POP    PSW        ;ADD A0 TO DATA THEN,
  358.     ADI    0A0H        ;    "    
  359.     JMP    DATOUT        ;JUMP AND OUTPUT DATA.
  360.                 ;
  361. TRYDC3:    MVI    A,13H        ;IF DATA LESS THAN 100 OUTPUT DC3 FIRST.
  362.     CALL    TXDATA        ;    "          "          "
  363.     POP    PSW        ;ADD 80 TO DATA THEN,
  364.     ADI    80H        ;    "    
  365. DATOUT:    CALL    TXDATA        ;SEND DATA TO THE REMOTE COMPUTER.
  366.                 ;
  367.                 ;
  368. TXRETN:    POP    PSW        ;RESTORE ACCUMULATOR AND,
  369.     RET            ;RETURN TO CALLING PROGRAM.
  370.     PAGE
  371. ;THIS ROUTINE DOES THE INVERSE OF TX800. IT BASICALLY RECEIVES DATA AND
  372. ;PLACES IT IN THE ACCUMULATOR. WHERE THE SPECIAL CODES DC1, DC2 AND DC3
  373. ;ARE RECEIVED THE ROUTINE WAITS FOR THE SECOND CHARACETR AND CAUSES THE
  374. ;NECESSARY CONVERSION TO AN 8 BIT QUANTITY. UPON EXIT IF THE ZERO BIT IS
  375. ;SET A ^Z HAS BEEN DETECTED. 
  376.                 ;
  377.                 ;
  378.                 ;
  379. RX800:    MVI    A,06H        ;OUTPUT AN "ACK".
  380.     CALL    TXDATA        ;    "
  381.                 ;
  382. RXWAIT:    CALL    RXDATA        ;WAIT FOR CHARACTER TO BE RECEIVED.
  383.     JZ    RXWAIT        ;    "          "
  384.                 ;
  385.     CPI    1AH        ;IF ^Z RECEIVED EXIT WITH ZERO BIT SET.
  386.     RZ            ;    "          "          "
  387.                 ;
  388.     CPI    11H        ;IF DC1 RECEIVED WAIT FOR NEXT CHAR & ADD E0.
  389.     JNZ    RXDC2        ;    "          "          "          "
  390. RXWAI1:    CALL    RXDATA        ;    "          "          "          "
  391.     JZ    RXWAI1        ;    "          "          "          "
  392.     ADI    0E0H        ;    "          "          "          "
  393.     JMP    RXEND        ;JUMP AND EXIT WITH DATA.
  394.                 ;
  395. RXDC2:    CPI    12H        ;IF DC2 RECEIVED WAIT FOR NEXT CHAR & ADD 60.
  396.     JNZ    RXDC3        ;    "          "          "          "
  397. RXWAI2:    CALL    RXDATA        ;    "          "          "          "
  398.     JZ    RXWAI2        ;    "          "          "          "
  399.     ADI    60H        ;    "          "          "          "
  400.     JMP    RXEND        ;JUMP AND EXIT WITH DATA.
  401.                 ;
  402. RXDC3:    CPI    13H        ;IF DC3 RECEIVED WAIT FOR NEXT CHAR & ADD 80.
  403.     JNZ    RXEND        ;    "          "          "          "
  404. RXWAI3:    CALL    RXDATA        ;    "          "          "          "
  405.     JZ    RXWAI3        ;    "          "          "          "
  406.     ADI    80H        ;    "          "          "          "
  407.                 ;
  408. RXEND:    CPI    80H        ;CLEAR THE CARRY BIT & RETURN.
  409.     RNZ            ;    "          "
  410.     CPI    81H        ;    "          "
  411.     RNZ            ;    "          "
  412.     PAGE
  413. ;THESE TWO ROUTINES ARE THE RECEIVE AND TRANSMIT SERIAL DATA ROUTINES.
  414. ;TXDATA CAUSES A CHARACTER TO BE SENT AS LONG AS THE TRANSMIT BUFFER IS
  415. ;EMPTY. IF IT IS NOT EMPTY THE PROGRAM WILL LOOP UNTIL IT IS. DATA IS PASSED
  416. ;TO TXDATA IN THE ACCUMULATOR.
  417. ;RXDATA CHECKS THE RECEIVE DATA READY FLAG. IF DATA IS READY IT IS LOADED
  418. ;IN THE ACCUMULATOR AND THE ZERO BIT IS CLEAR UPON RETURN, OTHERWISE THE
  419. ;ACCUMULATOR CONTENTS ARE INDETERMINATE AND THE ZERO BIT IS SET.
  420.                 ;
  421.                 ;
  422.                 ;
  423. TXDATA:    PUSH    PSW        ;SAVE CHARACTER ON THE STACK.
  424. TXWAIT:    IN    06H        ;TEST BIT 2 TO SEE IF TX BUFFER IS EMPTY.
  425.     ANI    00000100B    ;    "          "          "
  426.     JZ    TXWAIT        ;LOOP UNTIL TRANSMITTER IS READY.
  427.     POP    PSW        ;TRANSMIT CHARACTER.
  428.     ANI    01111111B    ;LIMIT DATA RANGE TO 7 BITS.
  429.     OUT    04H        ;    "
  430.                 ;
  431.     RET            ;RETURN TO CALLING PROGRAM.
  432.                 ;
  433.                 ;
  434.                 ; 
  435. RXDATA:    IN    06H        ;TEST BIT 0 TO SEE IF DATA AVAILABLE.
  436.     ANI    00000001B    ;    "          "          "
  437.     RZ            ;IF NOT AVAILABLE RETURN WITH ZERO BIT SET.
  438.                 ;
  439.     IN    04H        ;PU╘ RECEIV┼ DAT┴ IN ACCUMULATOR.
  440.     CMA            ;LIMIT DATA RANGE TO 7 BITS,
  441.     ORI    10000000B    ;AND CLEAR TO ZERO BIT.
  442.     CMA            ;    "
  443.                 ;
  444.     RET            ;RETURN TO CALLING PROGRAM.
  445.     PAGE
  446. ;INITIALIZATION ROUTINE FOR INTERFACES. WHEN INITIALIZATION IS COMPLETE THE
  447. ;Z80 SIO IS SET FOR 8 DATA BITS, NO PARITY, AUTOMATIC DCD & CTS AND CLOCK
  448. ;DIVIDE BY 16.
  449.                 ;
  450.                 ;
  451.                 ;
  452. INIT:    LXI    H,SETUP        ;POINT HL AT BEGINNING OF UART SET UP TABLE.
  453.     MVI    D,11H        ;SET UP FOR 17 LOOPS.
  454.                 ;
  455. INILOP:    MOV    A,M        ;OUTPUT SET UP BYTE.
  456.     OUT    06H        ;    "
  457.     INX    H        ;    "
  458.     DCR    D        ;LOOP 17 TIMES.
  459.     JNZ    INILOP        ;    "
  460.     RET            ;RETURN TO CALLING PROGRAM.
  461.                 ;
  462.                 ;
  463. SETUP:    DB    00011000B    ;ENSURE CHANNEL RESET.
  464.     DB    00011000B    ;    "
  465.     DB    00000001B    ;SETUP REG 1 INIT.
  466.     DB    00000000B    ;WRITE REG 1.
  467.     DB    00000010B    ;SETUP REG 2 INIT.
  468.     DB    00000000B    ;WRITE REG 2.
  469.     DB    00000011B    ;SETUP REG 3 INIT.
  470.     DB    11000001B    ;WRITE REG 3.
  471.     DB    00000100B    ;SETUP REG 4 INIT.
  472.     DB    01000100B    ;WRITE REG 4.
  473.     DB    00000101B    ;SETUP REG 5 INIT.
  474.     DB    11101010B    ;WRITE REG 5.
  475.     DB    00000110B    ;SETUP REG 6 INIT.
  476.     DB    00000000B    ;WRITE REG 6.
  477.     DB    00000111B    ;SETUP REG 7 INIT.
  478.     DB    00000000B    ;WRITE REG 7.
  479.     DB    00000000B    ;SELECT CHANNEL 0.
  480.     PAGE
  481. MES0:    MVI    C,09H        ;SET UP TO USE BDOS PRINT FUNCTION.
  482.     LXI    D,HATPRT    ;    "          "          "
  483.     CALL    0005H        ;CALL BDOS.
  484.     RET            ;RETURN TO CALLING PROGRAM.
  485.  
  486.  
  487. HATPRT:    DB    0DH,0AH
  488.     DB    'CP/M INTER COMPUTER COMMUNICATION PROGRAM, KAYPRO VERSION'
  489.     DB    0DH,0AH
  490.     DB    0DH,0AH
  491.     DB    'MAKE SURE THAT BOTH COMPUTERS HAVE THEIR BAUD RATES',0DH,0AH
  492.     DB    'SET TO THE SAME RATE, WHEN TRANSFERRING A FILE START',0DH,0AH
  493.     DB    'UP THE TRANSMIT END FIRST, THE RECEIVE END CONTROLS',0DH,0AH
  494.     DB    'THE TRANSFER PROCESS',0DH,0AH
  495.     DB    0DH,0AH
  496.     DB    0DH,0AH
  497.     DB    '^T --------- TRANSMIT FILE TO REMOTE',0DH,0AH
  498.     DB    '^R --------- RECEIVE FILE FROM REMOTE',0DH,0AH
  499.     DB    '^H --------- DISPLAY THIS HELP MESSAGE',0DH,0AH
  500.     DB    '^C --------- EXIT TO SYSTEM',0DH,0AH
  501.     DB    0DH,0AH
  502.     DB    0DH,0AH
  503.     DB    'ENTER SELECTION ------->  $'
  504.     PAGE
  505. MES2:    MVI    C,09H        ;SET UP TO USE BDOS PRINT FUNCTION.
  506.     LXI    D,COMCPM    ;    "          "          "
  507.     CALL    0005H        ;CALL BDOS.
  508.     RET            ;RETURN TO CALLING PROGRAM.
  509.  
  510. COMCPM:    DB    0DH,0AH
  511.     DB    0DH,0AH
  512.     DB    'CP/M FILE NAME ------>  $'
  513.  
  514.  
  515.  
  516. MES3:    MVI    C,09H        ;SET UP TO USE BDOS PRINT FUNCTION.
  517.     LXI    D,NOTPRT    ;    "          "          "
  518.     CALL    0005H        ;CALL BDOS.
  519.     RET            ;RETURN TO CALLING PROGRAM.
  520.  
  521.  
  522. NOTPRT:    DB    0DH,0AH
  523.     DB    0DH,0AH
  524.     DB    'FILE NOT FOUND',0DH,0AH,'$'
  525.  
  526.  
  527.  
  528. MES4:    MVI    C,09H        ;SET UP TO USE BDOS PRINT FUNCTION.
  529.     LXI    D,SENPRT    ;    "          "          "
  530.     CALL    0005H        ;CALL BDOS.
  531.     RET            ;RETURN TO CALLING PROGRAM.
  532.  
  533. SENPRT:    DB    0DH,0AH
  534.     DB    0DH,0AH
  535.     DB    'SENDING FILE TO REMOTE',0DH,0AH,'$'
  536.     PAGE
  537. MES5:    MVI    C,09H        ;SET UP TO USE BDOS PRINT FUNCTION.
  538.     LXI    D,RECPRT    ;    "          "          "
  539.     CALL    0005H        ;CALL BDOS.
  540.     RET            ;RETURN TO CALLING PROGRAM.
  541.  
  542. RECPRT:    DB    0DH,0AH
  543.     DB    0DH,0AH
  544.     DB    'RECEIVING FILE FROM REMOTE',0DH,0AH,'$'
  545.  
  546.  
  547.  
  548. MES6:    MVI    C,09H        ;SET UP TO USE BDOS PRINT FUNCTION.
  549.     LXI    D,DUNPRT    ;    "          "          "
  550.     CALL    0005H        ;CALL BDOS.
  551.     RET            ;RETURN TO CALLING PROGRAM.
  552.  
  553.  
  554. DUNPRT:    DB    0DH,0AH
  555.     DB    0DH,0AH
  556.     DB    'FINISHED ! ',0DH,0AH,'$'
  557.  
  558.  
  559.  
  560. MES7:    MVI    C,09H        ;SET UP TO USE BDOS PRINT FUNCTION.
  561.     LXI    D,SPAPRT    ;    "          "          "
  562.     CALL    0005H        ;CALL BDOS.
  563.     RET            ;RETURN TO CALLING PROGRAM.
  564.  
  565. SPAPRT:    DB    0DH,0AH
  566.     DB    0DH,0AH
  567.     DB    'NO MORE SPACE ON DISK ! ',0DH,0AH,'$'
  568.  
  569.  
  570.  
  571. MES8:    MVI    C,09H        ;SET UP TO USE BDOS PRINT FUNCTION.
  572.     LXI    D,WISPRT    ;    "          "          "
  573.     CALL    0005H        ;CALL BDOS.
  574.     RET            ;RETURN TO CALLING PROGRAM.
  575.  
  576. WISPRT:    DB    0DH,0AH
  577.     DB    0DH,0AH
  578.     DB    'DO YOU WISH TO OVERWRITE EXISTING FILE Y OR N ------>  $'
  579.     PAGE
  580. MES9:    MVI    C,09H        ;SET UP TO USE BDOS PRINT FUNCTION.
  581.     LXI    D,ABRPRT    ;    "          "          "
  582.     CALL    0005H        ;CALL BDOS.
  583.     RET            ;RETURN TO CALLING PROGRAM.
  584.  
  585. ABRPRT:    DB    0DH,0AH
  586.     DB    0DH,0AH
  587.     DB    'OPERATION ABORTED ',0DH,0AH,'$'
  588.  
  589.  
  590.  
  591. ERROR:    MVI    C,09H        ;SET UP TO USE BDOS PRINT FUNCTION.
  592.     LXI    D,ERRPRT    ;    "          "          "
  593.     CALL    0005H        ;CALL BDOS.
  594.     RET            ;RETURN TO CALLING PROGRAM.
  595.  
  596. ERRPRT:    DB    0DH,0AH
  597.     DB    0DH,0AH
  598.     DB    'ENTRY ERROR',0DH,0AH,'$'
  599.     PAGE
  600.     END
  601.