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 / SIMTEL / CPMUG / CPMUG006.ARK / MODEM.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  12KB  |  646 lines

  1. ;MODEM ROUTINE - SEND, RECV, COMPUTER, TERMINAL
  2. ; * * * * * * * * * * * * * * * * * * * *
  3. ;SENSE SWITCH CONTROLS:            *
  4. ;                    *
  5. ;    A12 UP TO DISPLAY INCOMING DATA *
  6. ;    A13 UP TO DISPLAY OUTGOING DATA *
  7. ; * * * * * * * * * * * * * * * * * * * *
  8. ;
  9. ;09/23/77 FIRST WRITTEN BY WARD CHRISTENSEN
  10. ;09/25/77 FIRST TESTING COMPLETE
  11. ;09/26/77 ADD ERROR$LIMIT EQU
  12. ;10/01/77 CHANGE EXIT$CHAR FROM CTL-C TO
  13. ;      CTL-E FOR USE W/TIMESHARING COMPUTERS
  14. ;10/10/77 CORRECT TO SEND ANY LENGTH FILE
  15. ;
  16. MODEM$CTL$PORT    EQU    4
  17. MODEM$SEND$MASK    EQU    2
  18. SEND$READY    EQU    2    ;VALUE WHEN READY
  19. MODEM$RECV$MASK    EQU    1
  20. RECV$READY    EQU    1    ;BIT ON WHEN READY
  21. MODEM$DATA$PORT    EQU    5
  22. KEY$CTL$PORT    EQU    0    ;KEYBOARD STATUS
  23. KEY$READY$MASK    EQU    2
  24. KEY$READY    EQU    2    ;VALUE WHEN KEYBOARD READY
  25. KEY$DATA$PORT    EQU    1
  26. INIT$REQD    EQU    1    ;MODEM INIT. REQ'D?
  27. INIT$CHAR$1    EQU    3    ;FIRST INIT CHAR TO CTL PORT
  28. INIT$CHAR$2    EQU    15H    ;2ND INIT CHAR TO CTL PORT
  29. ERROR$LIMIT    EQU    10    ;MAX ALLOWABLE ERRORS
  30. EXIT$CHAR    EQU    'E'-40H ;CHAR TO EXIT FROM T OR C
  31.     ORG    100H
  32.     CALL    START    ;GO PRINT ID
  33.     DB    'MODEM PROGRAM AS OF '
  34.     DB    '10/10/77',13,10,'$'
  35. ;FLAG FOR GENERATING TEST CODE TO USE KEYBOARD
  36. ;TO ECHO ACK/NAK WHILE TESTING:
  37. TEST    EQU    0    ;GENERATE TEST CODE
  38. ;
  39. ;DEFINE ASCII CHARACTERS USED
  40. SOH    EQU    1
  41. EOT    EQU    4
  42. ACK    EQU    6
  43. NAK    EQU    15H
  44. LF    EQU    10
  45. CR    EQU    13
  46. ;
  47. START    POP    D    ;GET ID MESSAGE
  48.     MVI    C,PRINT
  49.     CALL    BDOS    ;PRINT ID MESSAGE
  50. ;INIT PRIVATE STACK
  51.     LXI    H,0    ;HL=0
  52.     DAD    SP    ;HL=STACK FROM CP/M
  53.     SHLD    STACK    ;..SAVE IT
  54.     LXI    SP,STACK    ;SP=MY STACK
  55. ;
  56.     CALL    INIT$PORT
  57. ;GOBBLE UP GARBAGE CHARS FROM THE LINE
  58.     MVI    B,1    ;TIMEOUT DELAY
  59.     CALL    RECV
  60.     MVI    B,1
  61.     CALL    RECV
  62. ;
  63.     LDA    FCB+1    ;GET OPTION (S R C T)
  64.     PUSH    PSW    ;SAVE OPTION
  65.     CALL    MOVE$FCB ;MOVE FROM 6C TO 5C
  66.     POP    PSW    ;GET OPTION
  67.     CPI    'S'
  68.     JZ    SEND$FILE
  69.     CPI    'R'
  70.     JZ    RECV$FILE
  71.     CPI    'C'
  72.     JZ    COMPUTER
  73.     CPI    'T'
  74.     JZ    TERMINAL
  75. ;INVALID OPTION
  76.     CALL    ERXIT    ;EXIT W/ERROR
  77.     DB    '++INVALID OPTION ON MODEM COMMAND - ',CR,LF
  78.     DB    'MUST BE ONE OF THE FOLLOWING:',CR,LF
  79.     DB    'MODEM SEND FILENAME',CR,LF
  80.     DB    'MODEM RECV FILENAME',CR,LF
  81.     DB    'MODEM COMPUTER',CR,LF
  82.     DB    'MODEM TERMINAL',CR,LF
  83.     DB    '  ABBREV. ALLOWED: S R C T$'
  84. ;
  85. ;****************COMPUTER****************
  86. ;
  87. ;TERMINAL-TERMINAL W/ECHO SENT BY THIS PROGRAM
  88. ;'EXIT$CHAR' TYPED TO RE-BOOT
  89. ;IF ONE COMPUTER IS IN COMPUTER MODE,
  90. ;THE OTHER SHOULD BE IN TERMINAL MODE.
  91. ;AT NO TIME SHOULD BOTH BE IN COMPUTER
  92. ;MODE BECAUSE LINE ERRORS WILL BE PING-PONGED
  93. ;BACK AND FORTH AD INFINITUM.
  94. COMPUTER:
  95.     IN    MODEM$CTL$PORT
  96.     ANI    MODEM$RECV$MASK
  97.     CPI    RECV$READY
  98.     JZ    LINE$CHAR
  99. ;NOTHING FROM LINE, CHECK KEYBOARD
  100.     MVI    C,CONST    ;CHECK STATUS
  101.     CALL    BDOS
  102.     ORA    A    ;READY?
  103.     JZ    COMPUTER ;..NO
  104.     MVI    C,RDCON
  105.     CALL    BDOS    ;GET CHAR
  106.     CPI    EXIT$CHAR ;END?
  107.     JZ    EXIT    ;YES, EXIT
  108.     OUT    MODEM$DATA$PORT ;SEND CHAR
  109.     JMP    COMPUTER
  110. ;GOT CHAR FROM LINE
  111. LINE$CHAR:
  112.     IN    MODEM$DATA$PORT
  113.     OUT    MODEM$DATA$PORT ;ECHO
  114.     CALL    TYPE    ;TYPE IT
  115.     JMP    COMPUTER
  116. ;
  117. ;**************TERMINAL****************
  118. ;
  119. ;SEE NOTES UNDER 'COMPUTER'
  120. ;
  121. TERMINAL:
  122.     IN    KEY$CTL$PORT
  123.     ANI    KEY$READY$MASK
  124.     CPI    KEY$READY
  125.     JNZ    TRECV    ;NOTHING FROM KEYBOARD
  126.     IN    KEY$DATA$PORT
  127.     ANI    7FH
  128.     CPI    EXIT$CHAR ;TIME TO END?
  129.     JZ    EXIT
  130.     OUT    MODEM$DATA$PORT
  131. TRECV    IN    MODEM$CTL$PORT
  132.     ANI    MODEM$RECV$MASK
  133.     CPI    RECV$READY
  134.     JNZ    TERMINAL
  135.     IN    MODEM$DATA$PORT
  136.     CALL    TYPE
  137.     JMP    TERMINAL
  138. ;INIT SERIAL PORT
  139. INIT$PORT:
  140.     LXI    D,MSG$BAUD
  141.     CALL    PRINT$MESSAGE
  142.     IF    INIT$REQD
  143.     MVI    A,INIT$CHAR$1
  144.     OUT    MODEM$CTL$PORT
  145.     MVI    A,INIT$CHAR$2
  146.     OUT    MODEM$CTL$PORT
  147.     ENDIF
  148. ;GET THE SPEED
  149.     XRA    A    ;GET A ZERO
  150.     CALL    SEND    ;SEND A CHAR
  151.     XRA    A    ;GET ZERO
  152.     CALL    SEND    ;SEND AGAIN
  153. ;WAIT, TIMING TO DETERMINE BAUD RATE
  154.     LXI    B,0    ;INIT COUNT
  155. INIT$WAIT:
  156.     IN    MODEM$CTL$PORT
  157.     ANI    MODEM$SEND$MASK
  158.     CPI    SEND$READY
  159.     JZ    INIT$WAIT$END
  160.     DCR    C
  161.     JNZ    INIT$WAIT
  162.     DCR    B
  163.     JNZ    INIT$WAIT
  164.     CALL    ERXIT
  165.     DB    '++TIME OUT DETERMINING BAUD RATE$'
  166. INIT$WAIT$END:
  167.     MOV    A,B    ;GET COUNT
  168.     CPI    0F5H    ;110 BAUD = F0,
  169.     JC    BAUD$110 ;300 BAUD = FA
  170. ;BAUD RATE 300
  171.     LXI    D,MSG$300
  172. INIT$PRINT:
  173.     CALL    PRINT$MESSAGE
  174.     RET        ;FROM INIT$PORT
  175. BAUD$110:
  176.     LXI    D,MSG$110
  177.     JMP    INIT$PRINT
  178. MSG$BAUD DB 'BAUD RATE IS $'
  179. MSG$110    DB    '110',CR,LF,'$'
  180. MSG$300    DB    '300',CR,LF,'$'
  181. ;MOVE FCB (SECOND OPERAND ON COMMAND)
  182. ; TO NORMAL FCB LOCATION
  183. MOVE$FCB:
  184.     LXI    H,FCB
  185.     LXI    D,FCB+16
  186.     MVI    B,16
  187. MOVE$LOOP:
  188.     LDAX    D
  189.     MOV    M,A
  190.     INX    D
  191.     INX    H
  192.     DCR    B
  193.     JNZ    MOVE$LOOP
  194.     XRA    A    ;GET 0
  195.     STA    FCB+32    ;ZERO RECORD #
  196.     RET
  197. ;
  198. ;*****************SEND FILE***************
  199. ;
  200. SEND$FILE:
  201.     CALL    OPEN$FILE    ;OPEN THE FILE
  202.     LXI    D,OPENM
  203.     CALL    PRINT$MESSAGE
  204. SENDB    XRA    A    ;GET A ZERO
  205.     STA    ERRCT    ;ZERO ERROR COUNT
  206. ;READ SECTOR, SEND IT
  207.     CALL    READ$SECTOR
  208.     LDA    SECTNO    ;INCR SECT NO.
  209.     INR    A
  210.     STA    SECTNO
  211. ;SEND OR REPEAT SECTOR
  212. REPTB    LXI    D,SECTMSG
  213.     CALL    PRINT$MESSAGE
  214.     LDA    SECTNO
  215.     CALL    HEXO
  216.     CALL    CRLF
  217.     MVI    A,SOH
  218.     CALL    SEND
  219.     LDA    SECTNO
  220.     CALL    SEND
  221.     LDA    SECTNO
  222.     CMA
  223.     CALL    SEND
  224.     MVI    C,0    ;INIT CKSUM
  225.     LXI    H,80H
  226. SENDC    MOV    A,M
  227.     CALL    SEND
  228.     INX    H
  229.     MOV    A,H
  230.     CPI    1    ;DONE WITH SECTOR?
  231.     JNZ    SENDC
  232. ;SECTOR SENT, SEND CKSUM
  233.     MOV    A,C    ;GET CKSUM
  234.     CALL    SEND
  235. ;GET ACK ON SECTOR
  236.     MVI    B,4    ;WAIT 4 SECONDS MAX
  237.     CALL    RECV
  238.     JNC    SNTO    ;NO TIMEOUT
  239. ;TIMED OUT WAITING FOR ACK
  240.     CALL    TOUT    ;PRINT 'TIMEOUT', ERRCT
  241. DATERR    LDA    ERRCT
  242.     INR    A
  243.     STA    ERRCT
  244.     CPI    ERROR$LIMIT
  245.     JC    REPTB    ;REPEAT SECTOR
  246. ;SECTOR SEND NO GOOD AFTER 10 TRIES
  247.     CALL    ERXIT
  248.     DB    'CAN''T SEND SECTOR '
  249.     DB    '- ABORTING',13,10,'$'
  250. SECTMSG    DB    'SENDING SECTOR $'
  251. ;NO TIMEOUT SENDING SECTOR
  252. SNTO    CPI    ACK    ;ACK RECIEVED?
  253.     JZ    SENDB    ;..YES, SEND NEXT SECT
  254. ;ACK NOT RECIEVED
  255.     CALL    HEXO    ;TYPE CHR IN HEX
  256.     LXI    D,ERR1
  257.     CALL    PRINT$MESSAGE
  258.     JMP    DATERR    ;GO TO DATA ERROR
  259. ERR1    DB    'H RECEIVED, NOT ACK',13,10,'$'
  260. OPENM    DB    'FILE OPEN',13,10,'$'
  261. ;
  262. ;**************RECEIVE FILE****************
  263. ;
  264. RECV$FILE:
  265.     CALL    ERASE$OLD$FILE
  266.     CALL    MAKE$NEW$FILE
  267. RECV$LOOP:
  268.     XRA    A    ;GET 0
  269.     STA    ERRCT    ;INIT ERROR COUNT
  270. RECV$HDR:
  271.     LXI    D,RMSG
  272.     CALL    PRINT$MESSAGE
  273.     LDA    SECTNO
  274.     INR    A
  275.     CALL    HEXO
  276.     CALL    CRLF
  277.     MVI    B,5    ;5 SEC TIMEOUT
  278.     CALL    RECV
  279.     JNC    RHNTO    ;NO TIMEOUT
  280. RECV$HDR$TIMEOUT:
  281.     CALL    TOUT    ;PRINT TIMEOUT
  282. RECV$SECT$ERR:
  283. ;PURGE THE LINE OF INPUT CHARS
  284.     MVI    B,1    ;1 SEC W/NO CHARS
  285.     CALL    RECV
  286.     JNC    RECV$SECT$ERR ;LOOP UNTIL SENDER DONE
  287.     MVI    A,NAK
  288.     CALL    SEND    ;SEND NAK
  289.     LDA    ERRCT
  290.     INR    A
  291.     STA    ERRCT
  292.     CPI    ERROR$LIMIT
  293.     JC    RECV$HDR
  294.     CALL    ERXIT
  295.     DB    '++UNABLE TO GET VALID HEADER',0DH,0AH,'$'
  296. RMSG    DB    'WAITING FOR SECTOR #$'
  297. ;GOT CHAR - MUST BE SOH
  298. RHNTO    CPI    SOH
  299.     JZ    GOT$SOH
  300.     ORA    A    ;00 FROM SPEED CHECK?
  301.     JZ    RECV$HDR
  302.     CPI    EOT
  303.     JZ    GOT$EOT
  304. ;DIDN'T GET SOH - 
  305.     CALL    HEXO
  306.     LXI    D,ERRSOH
  307.     CALL    PRINT$MESSAGE
  308.     JMP    RECV$SECT$ERR
  309. ERRSOH    DB    'H RECEIVED, NOT SOH',0DH,0AH,'$'
  310. GOT$SOH:
  311.     MVI    B,1
  312.     CALL    RECV
  313.     JC    RECV$HDR$TIMEOUT
  314.     MOV    D,A    ;D=BLK #
  315.     MVI    B,1
  316.     CALL    RECV    ;GET CMA'D SECT #
  317.     JC    RECV$HDR$TIMEOUT
  318.     CMA
  319.     CMP    D    ;GOOD SECTOR #?
  320.     IF    TEST
  321.     JMP    RECV$SECTOR
  322.     ENDIF
  323.     JZ    RECV$SECTOR
  324. ;GOT BAD SECTOR #
  325.     LXI    D,ERR2
  326.     CALL    PRINT$MESSAGE
  327.     JMP    RECV$SECT$ERR
  328. ERR2    DB    '++BAD SECTOR # IN HDR',0DH,0AH,'$'
  329. ;
  330. RECV$SECTOR:
  331.     MOV    A,D    ;GET SECTOR #
  332.     STA    RECVD$SECT$NO
  333.     MVI    C,0    ;INIT CKSUM
  334.     LXI    H,80H    ;POINT TO BUFFER
  335. RECV$CHAR:
  336.     MVI    B,1    ;1 SEC TIMEOUT
  337.     CALL    RECV    ;GET CHAR
  338.     JC    RECV$HDR$TIMEOUT
  339.     MOV    M,A    ;STORE CHAR
  340.     INR    L    ;DONE?
  341.     JNZ    RECV$CHAR
  342. ;VERIFY CHECKSUM
  343.     MOV    D,C    ;SAVE CHECKSUM
  344.     MVI    B,1    ;TIMEOUT
  345.     CALL    RECV    ;GET CHECKSUM
  346.     JC    RECV$HDR$TIMEOUT
  347.     CMP    D    ;CHECK
  348.     JNZ    RECV$CKSUM$ERR
  349. ;
  350. ;GOT A SECTOR, WRITE IF = 1+PREV SECTOR
  351. ;
  352.     LDA    RECVD$SECT$NO
  353.     MOV    B,A    ;SAVE IT
  354.     LDA    SECTNO    ;GET PREV
  355.     INR    A    ;CALC NEXT SECTOR #
  356.     CMP    B    ;MATCH?
  357.     JNZ    DO$ACK
  358. ;GOT NEW SECTOR - WRITE IT
  359.     LXI    D,FCB
  360.     MVI    C,WRITE
  361.     CALL    BDOS
  362.     ORA    A
  363.     JNZ    WRITE$ERROR
  364.     LDA    RECVD$SECT$NO
  365.     STA    SECTNO    ;UPDATE SECTOR #
  366. DO$ACK    MVI    A,ACK
  367.     CALL    SEND
  368.     JMP    RECV$LOOP
  369. ;
  370. WRITE$ERROR:
  371.     CALL    ERXIT
  372.     DB    '++ERROR WRITING FILE',0DH,0AH,'$'
  373. ;
  374. RECV$CKSUM$ERR:
  375.     LXI    D,ERR3
  376.     CALL    PRINT$MESSAGE
  377.     JMP    RECV$SECT$ERR
  378. ERR3    DB    '++BAD CKSUM ON SECTOR'
  379.     DB    0DH,0AH,'$'
  380. ;
  381. GOT$EOT:
  382.     MVI    A,ACK    ;ACK THE EOT
  383.     CALL    SEND
  384.     LXI    D,FCB
  385.     MVI    C,CLOSE
  386.     CALL    BDOS
  387.     INR    A
  388.     JNZ    XFER$CPLT
  389.     CALL    ERXIT
  390.     DB    '++ERROR CLOSING FILE$'
  391. ;
  392. ERASE$OLD$FILE:
  393.     LXI    D,FCB
  394.     MVI    C,SRCHF    ;SEE IF IT EXISTS
  395.     CALL    BDOS
  396.     INR    A    ;FOUND?
  397.     RZ        ;NO, RETURN
  398.     LXI    D,EXIST
  399.     CALL    PRINT$MESSAGE
  400.     MVI    C,RDCON
  401.     CALL    BDOS
  402.     CPI    'Y'
  403.     JNZ    0    ;REBOOT IF NOT ERASE
  404.     CALL    CRLF
  405. ;ERASE OLD FILE
  406.     LXI    D,FCB
  407.     MVI    C,ERASE
  408.     CALL    BDOS
  409.     RET
  410. EXIST    DB    '++FILE EXISTS, TYPE Y TO ERASE:$'
  411. ;
  412. MAKE$NEW$FILE:
  413.     LXI    D,FCB
  414.     MVI    C,MAKE
  415.     CALL    BDOS
  416.     INR    A    ;FF=BAD
  417.     RNZ        ;OPEN OK
  418. ;DIRECTORY FULL - CAN'T MAKE FILE
  419.     CALL    ERXIT
  420.     DB    '++ERROR - CAN''T MAKE FILE',0DH,0AH
  421.     DB    '++DIRECTORY MUST BE FULL',0DH,0AH,'$'
  422. ;
  423. ; S U B R O U T I N E S
  424. ;
  425. ;OPEN FILE
  426. OPEN$FILE    LXI    D,FCB
  427.     MVI    C,OPEN
  428.     CALL    BDOS
  429.     INR    A    ;OPEN OK?
  430.     RNZ        ;GOOD OPEN
  431.     CALL    ERXIT
  432.     DB    'CAN''T OPEN FILE$'
  433. ; - - - - - - - - - - - - - - -
  434. PRINT$MESSAGE:
  435.     MVI    C,PRINT
  436.     JMP    BDOS    ;PRINT MESSAGE, RETURN
  437. ; - - - - - - - - - - - - - - -
  438. ;EXIT PRINTING MESSAGE FOLLOWING 'CALL ERXIT'
  439. ERXIT    POP    D    ;GET MESSAGE
  440.     CALL    PRINT$MESSAGE    ;PRINT IT
  441. EXIT    LHLD    STACK    ;GET ORIGINAL STACK
  442.     SPHL        ;RESTORE IT
  443.     RET        ;--EXIT-- TO CP/M
  444. ; - - - - - - - - - - - - - - -
  445. ;MODEM RECV
  446. RECV    PUSH    D    ;SAVE
  447. MSEC    LXI    D,0BBBBH    ;1 SEC DCR COUNT
  448.     IF    NOT TEST
  449. MWTI    IN    MODEM$CTL$PORT
  450.     ANI    MODEM$RECV$MASK
  451.     CPI    RECV$READY
  452.     JZ    MCHAR    ;GOT CHAR
  453.     ENDIF
  454.     IF    TEST
  455. MWTI    IN    KEY$CTL$PORT    ;READ KEYBOARD
  456.     ANI    KEY$READY$MASK
  457.     CPI    KEY$READY
  458.     JZ    MCHAR
  459.     ENDIF
  460.     DCR    E    ;COUNT DOWN
  461.     JNZ    MWTI    ;FOR TIMEOUT
  462.     DCR    D
  463.     JNZ    MWTI
  464.     DCR    B    ;DCR # OF SECONDS
  465.     JNZ    MSEC
  466. ;MODEM TIMED OUT RECEIVING
  467.     POP    D    ;RESTORE D,E
  468.     STC        ;CARRY SHOWS TIMEOUT
  469.     RET
  470. ;GOT MODEM CHAR
  471.     IF    NOT TEST
  472. MCHAR    IN    MODEM$DATA$PORT
  473.     ENDIF
  474.     IF    TEST
  475. MCHAR    IN    KEY$DATA$PORT
  476.     ANI    7FH    ;DEL PARITY FROM KEYBOAREAD
  477.     ENDIF
  478.     POP    D    ;RESTORE DE
  479. ;CALC CHECKSUM
  480.     PUSH    PSW
  481.     ADD    C
  482.     MOV    C,A
  483. ;CHECK IF MONITORING INPUT
  484.     IN    0FFH
  485.     ANI    10H
  486.     JZ    NO$MON$INPUT
  487.     POP    PSW
  488.     PUSH    PSW
  489.     CALL    SHOW    ;CHAR RECEIVED
  490. NO$MON$INPUT:
  491.     POP    PSW
  492. ;TURN OFF CARRY TO SHOW NO TIMEOUT
  493.     ORA    A
  494.     RET
  495. ; - - - - - - - - - - - - - - -
  496. ;MODEM SEND CHAR ROUTINE
  497. SEND    PUSH    PSW
  498. ;CHECK IF MONITORING OUTPUT
  499.     IN    0FFH
  500.     ANI    20H
  501.     JZ    NO$MON$OUTPUT
  502.     POP    PSW
  503.     PUSH    PSW
  504.     CALL    SHOW
  505. NO$MON$OUTPUT:
  506.     POP    PSW
  507.     PUSH    PSW
  508.     ADD    C    ;CALC CKSUM
  509.     MOV    C,A
  510. SENDW    IN    MODEM$CTL$PORT
  511.     ANI    MODEM$SEND$MASK
  512.     CPI    SEND$READY
  513.     JNZ    SENDW
  514.     POP    PSW    ;GET CHAR
  515.     OUT    MODEM$DATA$PORT
  516.     RET
  517. ; - - - - - - - - - - - - - - -
  518. ;SHOW CHAR RECEIVED OR SENT
  519. SHOW    CPI    0AH    ;LF?
  520.     JZ    TYPE
  521.     CPI    0DH
  522.     JZ    TYPE
  523.     CPI    09    ;TAB
  524.     JZ    TYPE
  525.     CPI    ' '
  526.     JC    SHOWHEX
  527.     CPI    7FH
  528.     JC    TYPE
  529. SHOWHEX    PUSH    PSW
  530.     MVI    A,'('
  531.     CALL    TYPE
  532.     POP    PSW
  533.     CALL    HEXO
  534.     MVI    A,')'
  535.     JMP    TYPE
  536. ; - - - - - - - - - - - - - - -
  537. ;PRINT TIMEOUT MESSAGE
  538. TOUTM    DB    'TIMEOUT $'
  539. TOUT    LXI    D,TOUTM
  540.     CALL    PRINT$MESSAGE
  541. PRINT$ERRCT:
  542.     LDA    ERRCT
  543.     CALL    HEXO    ;FALL INTO CR/LF
  544. ; - - - - - - - - - - - - - - -
  545. CRLF    MVI    A,13
  546.     CALL    TYPE
  547.     MVI    A,10
  548. ; - - - - - - - - - - - - - - -
  549. TYPE    PUSH    PSW
  550.     PUSH    B
  551.     PUSH    D
  552.     PUSH    H
  553.     MOV    E,A
  554.     MVI    C,WRCON
  555.     CALL    BDOS
  556.     POP    H
  557.     POP    D
  558.     POP    B
  559.     POP    PSW
  560.     RET
  561. ; - - - - - - - - - - - - - - -
  562. ;HEX OUTPUT
  563. HEXO    PUSH    PSW
  564.     RAR
  565.     RAR
  566.     RAR
  567.     RAR
  568.     CALL    NIBBL
  569.     POP    PSW
  570. NIBBL    ANI    0FH
  571.     CPI    10
  572.     JC    ISNUM
  573.     ADI    7
  574. ISNUM    ADI    '0'
  575.     JMP    TYPE
  576. ; - - - - - - - - - - - - - - -
  577. ;FILE READ ROUTINE
  578. READ$SECTOR:
  579.     LXI    D,FCB
  580.     MVI    C,READ
  581.     CALL    BDOS
  582.     ORA    A
  583.     RZ
  584.     DCR    A    ;EOF?
  585.     JNZ    RDERR
  586. ;EOF
  587.     XRA    A
  588.     STA    ERRCT
  589.     LXI    D,FSENTM ;FILE SENT MESSAGE
  590.     CALL    PRINT$MESSAGE
  591. SEOT    MVI    A,EOT
  592.     CALL    SEND
  593.     MVI    B,5    ;WAIT 5 SEC FOR TIMEOUT
  594.     CALL    RECV
  595.     JC    EOTTOT    ;EOT TIMEOUT
  596.     CPI    ACK
  597.     JZ    XFER$CPLT
  598. ;ACK NOT RECIEVED
  599.     CALL    HEXO
  600.     LXI    D,ERR1
  601.     CALL    PRINT$MESSAGE
  602. EOTERR    LDA    ERRCT
  603.     INR    A
  604.     STA    ERRCT
  605.     CPI    ERROR$LIMIT
  606.     JC    SEOT
  607.     CALL    ERXIT
  608.     DB    'NO ACK RECIEVED ON EOT$',10,13
  609. FSENTM    DB    13,10,'FILE SENT, SENDING EOT''S',10,13,'$'
  610. ;TIMEOUT ON EOT
  611. EOTTOT    CALL    TOUT
  612.     JMP    EOTERR
  613. ;READ ERROR
  614. RDERR    CALL    ERXIT
  615.     DB    '++FILE READ ERROR$'
  616. ; - - - - - - - - - - - - - - -
  617. ;DONE - CLOSE UP SHOP
  618. XFER$CPLT:
  619.     CALL    ERXIT
  620.     DB    13,10,'TRANSFER COMPLETE$'
  621.     DS    40    ;STACK AREA
  622. STACK    DS    2    ;STACK POINTER
  623. RECVD$SECT$NO    DB    0
  624. SECTNO    DB    0    ;CURRENT SECTOR NUMBER 
  625. ERRCT    DB    0    ;ERROR COUNT
  626. ;
  627. ; BDOS EQUATES (VERSION 2)
  628. ;
  629. RDCON    EQU    1
  630. WRCON    EQU    2
  631. PRINT    EQU    9
  632. CONST    EQU    11    ;CONSOLE STAT
  633. OPEN    EQU    15    ;0FFH=NOT FOUND
  634. CLOSE    EQU    16    ;   "    "
  635. SRCHF    EQU    17    ;   "    "
  636. SRCHN    EQU    18    ;   "    "
  637. ERASE    EQU    19    ;NO RET CODE
  638. READ    EQU    20    ;0=OK, 1=EOF
  639. WRITE    EQU    21    ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
  640. MAKE    EQU    22    ;0FFH=BAD
  641. REN    EQU    23    ;0FFH=BAD
  642. STDMA    EQU    26
  643. BDOS    EQU    5
  644. REIPL    EQU    0
  645. FCB    EQU    5CH    ;SYSTEM FCB
  646.