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