home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / modems / modem2 / mboot3.asm < prev    next >
Assembly Source File  |  1983-09-09  |  8KB  |  566 lines

  1. ;
  2. ; MBOOT.ASM ver 3.0
  3. ; (revised 5 Nov 80)
  4. ;
  5. ;MODEM BOOT PROGRAM by Keith Petersen, W8SDZ.
  6. ;Thanks to John Taylor for idea of incorporating
  7. ;simple terminal routine.  Based on MODEM.ASM V2.0,
  8. ;by Ward Christensen with enhancements from MODEM527.
  9. ;
  10. ;CP/M - CP/M file transfer program (receive-only)
  11. ;
  12. ;This program is intended for use as a way to
  13. ;initially transfer MODEM.COM or MODEM.ASM to
  14. ;a new user.  It may be used with almost any
  15. ;modem (see equates).  If PMMI or D.C. Hayes modem
  16. ;is used, then uses 'ORIGINATE' mode, 300 baud.
  17. ;
  18. ;A simple terminal routine at start of program allows
  19. ;user to communicate with a remote system prior to
  20. ;receiving a file to make it possible to down-load
  21. ;a file without intervention on the part of the host
  22. ;system's operator.
  23. ;
  24. ;COMMANDS:  MBOOT FILENAME.FILETYPE
  25. ; or  MBOOT A:FILENAME.FILETYPE
  26. ; or  MBOOT B:FILENAME.FILETYPE
  27. ;
  28. ;The program will operate as a dumb terminal until
  29. ;an 'ESC' key is typed (ctrl-[).  It then branches
  30. ;to the receive routine.  The user may also exit
  31. ;to CP/M without opening the receive file by typing
  32. ;ctrl-E from the terminal.  The values for the escape
  33. ;and exit keys may be changed in accordance with the
  34. ;needs of the user - some keyboards do not have the
  35. ;'ESC' key and/or provision for control characters.
  36. ;See equates.
  37. ;
  38. ;NOTE: Comments for the source code and tabs have been
  39. ;removed to make this file easier to transport from one
  40. ;system to another.  (KBP)
  41. ;
  42. FALSE EQU 0
  43. TRUE  EQU NOT FALSE
  44. ;
  45. STDCPM EQU TRUE  ;TRUE, IS STANDARD CP/M
  46. ALTCPM EQU FALSE ;TRUE, IS ALTERNATE CP/M FOR H8 OR TRS80
  47. ;
  48.  IF STDCPM
  49. BASE EQU 0
  50.  ENDIF
  51. ;
  52.  IF ALTCPM
  53. BASE EQU 4200H
  54.  ENDIF
  55. ;
  56. EXITCHR EQU 05H ;CTL-E TO EXIT TERM MODE TO CP/M
  57. ESC     EQU 1BH ;ESCAPE TO EXIT TERM MODE TO FILE RCVE
  58. ;
  59. FASTCLK EQU FALSE ;TRUE FOR 4 MHZ CLOCK
  60. ;
  61. PMMI EQU TRUE  ;TRUE, IS PMMI MODEM
  62. DCH  EQU FALSE ;TRUE, IS D.C. HAYES MODEM
  63. ;
  64. ;IF YOU ARE USING AN EXTERNAL MODEM (NOT S-100 PLUG-IN)
  65. ;CHANGE THESE EQUATES FOR YOUR MODEM PORT REQUIREMENTS
  66. ;
  67. INITREQ EQU FALSE ;TRUE, IF MODEM PORT INIT. REQ'D
  68. INITC1  EQU 0AAH ;1ST INIT CHAR TO CTL PORT FOR USART
  69. INITC2  EQU 40H  ;2ND  "
  70. INITC3  EQU 4EH  ;3RD  "
  71. INITC4  EQU 37H  ;4TH  "
  72. ;
  73.  IF NOT PMMI AND NOT DCH
  74. MODCTLP EQU 02H ;PUT YOUR MODEM CONTROL PORT HERE
  75. MODSNDB EQU 80H ;YOUR BIT TO TEST FOR SEND
  76. MODSNDR EQU 80H ;YOUR VALUE WHEN READY
  77. MODRCVB EQU 40H ;YOUR BIT TO TEST FOR RECEIVE
  78. MODRCVR EQU 40H ;YOUR VALUE WHEN READY
  79. MODDATP EQU 03H ;YOUR MODEM DATA PORT
  80.  ENDIF  ;END OF EXTERNAL MODEM EQUATES
  81. ;
  82.  IF PMMI
  83. MODCTLP EQU 0C0H
  84. MODSNDB EQU 1
  85. MODSNDR EQU 1
  86. MODRCVB EQU 2
  87. MODRCVR EQU 2
  88. MODDATP EQU 0C1H
  89. BAUDRP  EQU 0C2H
  90. MODCTL2 EQU 0C3H
  91. ORIGMOD EQU 1DH
  92. ANSWMOD EQU 1EH
  93.  ENDIF
  94. ;
  95.  IF DCH
  96. MODCTLP EQU 82H
  97. MODSNDB EQU 2
  98. MODSNDR EQU 2
  99. MODRCVB EQU 1
  100. MODRCVR EQU 1
  101. MODDATP EQU 80H
  102. MODCTL2 EQU 81H
  103. ORIGMOD EQU 87H
  104. ANSWMOD EQU 83H
  105.  ENDIF
  106. ;
  107. ERRLIM EQU 10
  108. ;
  109. SOH EQU 1
  110. EOT EQU 4
  111. ACK EQU 6
  112. NAK EQU 15H
  113. CAN EQU 18H
  114. LF  EQU 10
  115. CR  EQU 13
  116. BDOS EQU BASE+5
  117. FCB  EQU BASE+5CH
  118. ;
  119.  ORG BASE+100H
  120. ;
  121.  LXI H,0
  122.  DAD SP
  123.  SHLD STACK
  124.  LXI SP,STACK
  125.  CALL INITADR
  126.  CALL ILPRT
  127.  DB 'MBOOT as of '
  128.  DB '11/5/80',CR,LF,0
  129.  LDA FCB+1
  130.  CPI ' '
  131.  JNZ TERMI
  132.  CALL ILPRT
  133.  DB '++NO FILE NAME SPECIFIED++',CR,LF,0
  134.  JMP EXIT
  135. ;
  136. TERMI CALL INITMOD
  137.  IN MODDATP
  138.  IN MODDATP
  139.  CALL ILPRT
  140.  DB CR,LF,'TERMINAL MODE',CR,LF
  141.  DB 'CTL-E exits to CP/M, ESC starts file transfer'
  142.  DB CR,LF,0
  143. ;
  144. TERM CALL STAT
  145.  JZ TERML
  146.  CALL KEYIN
  147.  CPI EXITCHR
  148.  JZ EXIT
  149.  CPI ESC
  150.  JZ RCVFIL
  151.  OUT MODDATP
  152. ;
  153.  IF NOT DCH
  154. TERML IN MODCTLP
  155.  ENDIF
  156. ;
  157.  IF DCH
  158. TERML IN MODCTL2
  159.  ENDIF
  160. ;
  161.  ANI MODRCVB
  162.  CPI MODRCVR
  163.  JNZ TERM
  164.  IN MODDATP
  165.  ANI 7FH
  166.  CALL TYPE
  167.  JMP TERM
  168. ;
  169. RCVFIL CALL ERASFIL
  170.  CALL MAKEFIL
  171.  CALL ILPRT
  172.  DB 'FILE OPEN, READY TO RECEIVE',CR,LF,0
  173. ;
  174. RCVLP CALL RCVSECT
  175.  JC RCVEOT
  176.  CALL WRSECT
  177.  CALL INCRSNO
  178.  CALL SENDACK
  179.  JMP RCVLP
  180. ;
  181. RCVEOT CALL WRBLOCK
  182.  CALL SENDACK
  183.  CALL CLOSFIL
  184.  CALL ERXIT
  185.  DB CR,LF,'TRANSFER COMPLETE$' 
  186. ;
  187. RCVSECT XRA A
  188.  STA ERRCT
  189. ;
  190. RCVRPT MVI B,10
  191.  CALL RECV
  192.  JC RCVSERR
  193.  CPI SOH
  194.  JZ RCVSOH
  195.  ORA A
  196.  JZ RCVRPT
  197.  CPI EOT
  198.  STC
  199.  RZ
  200. ;
  201. RCVSERR MVI B,1
  202.  CALL RECV
  203.  JNC RCVSERR
  204.  MVI A,NAK
  205.  CALL SEND
  206.  LDA ERRCT
  207.  INR A
  208.  STA ERRCT
  209.  CPI ERRLIM
  210.  JC RCVRPT
  211. ;
  212. RCVSABT CALL CLOSFIL
  213.  CALL ERXIT
  214.  DB '++UNABLE TO RECEIVE BLOCK'
  215.  DB CR,LF,'++ABORTING++$'
  216. ;
  217. RCVSOH MVI B,1
  218.  CALL RECV
  219.  JC RCVSERR
  220.  MOV D,A
  221.  MVI B,1
  222.  CALL RECV
  223.  JC RCVSERR
  224.  CMA
  225.  CMP D
  226.  JZ RCVDATA
  227.  JMP RCVSERR
  228. ;
  229. RCVDATA MOV A,D
  230.  STA RCVSNO
  231.  MVI C,0
  232.  LXI H,BASE+80H
  233. ;
  234. RCVCHR MVI B,1
  235.  CALL RECV
  236.  JC RCVSERR
  237.  MOV M,A
  238.  INR L
  239.  JNZ RCVCHR
  240.  MOV D,C
  241.  MVI B,1
  242.  CALL RECV
  243.  JC RCVSERR
  244.  CMP D
  245.  JNZ RCVSERR
  246.  LDA RCVSNO
  247.  MOV B,A
  248.  LDA SECTNO
  249.  CMP B
  250.  JZ RECVACK
  251.  INR A
  252.  CMP B
  253.  JNZ ABORT
  254.  RET
  255. ;
  256. RECVACK CALL SENDACK
  257.  JMP RCVSECT
  258. ;
  259. SENDACK MVI A,ACK
  260. ;
  261. SEND PUSH PSW
  262.  ADD C
  263.  MOV C,A
  264. ;
  265.  IF NOT DCH
  266. SENDW IN MODCTLP
  267.  ENDIF
  268. ;
  269.  IF DCH
  270. SENDW IN MODCTL2
  271.  ENDIF
  272. ;
  273.  ANI MODSNDB
  274.  CPI MODSNDR
  275.  JNZ SENDW
  276.  POP PSW
  277.  OUT MODDATP
  278.  RET
  279. ;
  280. ABORT LXI SP,STACK
  281. ;
  282. ABORTL MVI B,1
  283.  CALL RECV
  284.  JNC ABORTL
  285.  MVI A,CAN
  286.  CALL SEND
  287. ;
  288. ABORTW MVI B,1
  289.  CALL RECV
  290.  JNC ABORTW
  291.  MVI A,' '
  292.  CALL SEND
  293.  CALL ERXIT
  294.  DB 'MBOOT PROGRAM CANCELLED$'
  295. ;
  296. INCRSNO LDA SECTNO
  297.  INR A
  298.  STA SECTNO
  299.  RET
  300. ;
  301. ERASFIL LXI D,FCB
  302.  MVI C,17
  303.  CALL BDOS
  304.  INR A
  305.  RZ
  306.  CALL ILPRT
  307.  DB '++FILE EXISTS, TYPE Y TO ERASE: ',0
  308.  CALL KEYIN
  309.  PUSH PSW
  310.  CALL TYPE
  311.  CALL CRLF
  312.  POP PSW
  313.  ANI 5FH
  314.  CPI 'Y'
  315.  JNZ MXIT
  316.  LXI D,FCB
  317.  MVI C,19
  318.  JMP BDOS
  319. ;
  320. MAKEFIL LXI D,FCB
  321.  MVI C,22
  322.  CALL BDOS
  323.  INR A
  324.  RNZ
  325.  CALL ERXIT
  326.  DB '++ERROR - CAN''T MAKE FILE',CR,LF
  327.  DB '++DIRECTORY MUST BE FULL$'
  328. ;
  329. CLOSFIL LXI D,FCB
  330.  MVI C,16
  331.  CALL BDOS
  332.  INR A
  333.  RNZ
  334.  CALL ERXIT
  335.  DB '++CAN''T CLOSE FILE$'
  336. ;
  337. WRSECT LHLD SECPTR
  338.  XCHG
  339.  LXI H,BASE+80H
  340.  CALL MOVE128
  341.  XCHG
  342.  SHLD SECPTR
  343.  LDA SECINBF
  344.  INR A
  345.  STA SECINBF
  346.  CPI 16
  347.  RNZ
  348. ;
  349. WRBLOCK LDA SECINBF
  350.  ORA A
  351.  RZ
  352.  MOV C,A
  353.  LXI D,DBUF
  354. ;
  355. DKWRLP PUSH H
  356.  PUSH D
  357.  PUSH B
  358.  MVI C,26
  359.  CALL BDOS
  360.  LXI D,FCB
  361.  MVI C,21
  362.  CALL BDOS
  363.  POP B
  364.  POP D
  365.  POP H
  366.  ORA A
  367.  JNZ WRERR
  368.  LXI H,80H
  369.  DAD D
  370.  XCHG
  371.  DCR C
  372.  JNZ DKWRLP
  373.  XRA A
  374.  STA SECINBF
  375.  LXI H,DBUF
  376.  SHLD SECPTR
  377. ;
  378. RSDMA LXI D,BASE+80H
  379.  MVI C,26
  380.  JMP BDOS
  381. ;
  382. WRERR CALL RSDMA
  383.  CALL ILPRT
  384.  DB '++ERROR WRITING FILE',CR,LF,0
  385.  JMP ABORT
  386. ;
  387. RECV PUSH D
  388. ;
  389.  IF FASTCLK
  390.  MOV A,B
  391.  ADD A
  392.  MOV B,A
  393.  ENDIF
  394. ;
  395. MSEC LXI D,50000
  396. ;
  397.  IF NOT DCH
  398. MWTI IN MODCTLP
  399.  ENDIF
  400. ;
  401.  IF DCH
  402. MWTI IN MODCTL2
  403.  ENDIF
  404. ;
  405.  ANI MODRCVB
  406.  CPI MODRCVR
  407.  JZ MCHAR
  408.  DCR E
  409.  JNZ MWTI
  410.  DCR D
  411.  JNZ MWTI
  412.  DCR B
  413.  JNZ MSEC
  414.  POP D
  415.  STC
  416.  RET
  417. ;
  418. MCHAR IN MODDATP
  419.  POP D
  420.  PUSH PSW
  421.  ADD C
  422.  MOV C,A
  423.  POP PSW
  424.  ORA A
  425.  RET
  426. ;
  427. INITADR LHLD BASE+1
  428.  LXI D,3
  429.  DAD D
  430.  SHLD VSTAT+1
  431.  DAD D
  432.  SHLD VKEYIN+1
  433.  DAD D
  434.  SHLD VTYPE+1
  435.  RET
  436. ;
  437. INITMOD EQU $
  438. ;
  439.  IF INITREQ 
  440.  MVI A,INITC1
  441.  OUT MODCTLP
  442.  NOP ! NOP ! NOP
  443.  NOP ! NOP
  444.  MVI A,INITC2
  445.  OUT MODCTLP
  446.  NOP ! NOP ! NOP
  447.  NOP ! NOP
  448.  MVI A,INITC3
  449.  OUT MODCTLP
  450.  NOP ! NOP ! NOP
  451.  NOP ! NOP
  452.  MVI A,INITC4
  453.  OUT MODCTLP
  454.  NOP ! NOP ! NOP
  455.  NOP ! NOP
  456.  ENDIF
  457. ;
  458.  IF PMMI
  459.  MVI A,52
  460.  OUT BAUDRP
  461.  MVI A,7FH
  462.  OUT MODCTL2
  463.  ENDIF
  464. ;
  465.  IF DCH
  466.  MVI A,16H
  467.  OUT MODCTL2
  468.  ENDIF
  469. ;
  470.  IF PMMI OR DCH
  471. ;
  472.  LXI H,4000
  473. ;
  474. OFFDLY DCR L
  475.  JNZ OFFDLY
  476.  DCR H
  477.  JNZ OFFDLY
  478.  MVI A,ORIGMOD 
  479.  OUT MODCTLP
  480.  ENDIF
  481. ;
  482.  RET  ;<--THIS RET MUST BE HERE
  483. ;
  484. CRLF MVI A,CR
  485.  CALL TYPE
  486.  MVI A,LF
  487. ;
  488. TYPE PUSH PSW
  489.  PUSH B
  490.  PUSH D
  491.  PUSH H
  492.  MOV C,A
  493. VTYPE CALL $-$
  494.  POP H
  495.  POP D
  496.  POP B
  497.  POP PSW
  498.  RET
  499. ;
  500. STAT PUSH B
  501.  PUSH D
  502.  PUSH H
  503. VSTAT CALL $-$
  504.  POP H
  505.  POP D
  506.  POP B
  507.  ORA A
  508.  RET
  509. ;
  510. KEYIN PUSH B
  511.  PUSH D
  512.  PUSH H
  513. VKEYIN CALL $-$
  514.  POP H
  515.  POP D
  516.  POP B
  517.  ANI 7FH
  518.  RET
  519. ;
  520. ILPRT XTHL
  521. ;
  522. ILPLP MOV A,M
  523.  ORA A
  524.  JZ ILPRET
  525.  CALL TYPE
  526.  INX H
  527.  JMP ILPLP
  528. ;
  529. ILPRET XTHL
  530.  RET
  531. ;
  532. ERXIT POP D
  533.  MVI C,9
  534.  CALL BDOS
  535. ;
  536. MXIT CALL ILPRT
  537.  DB CR,LF,'DON''T FORGET TO DISCONNECT MODEM'
  538.  DB CR,LF,0
  539. ;
  540. EXIT LHLD STACK
  541.  SPHL
  542.  RET
  543. ;
  544. MOVE128 MVI B,128
  545. ;
  546. MOVE MOV A,M
  547.  STAX D
  548.  INX H
  549.  INX D
  550.  DCR B
  551.  JNZ MOVE
  552.  RET
  553. ;
  554. RCVSNO DB 0
  555. SECTNO DB 0
  556. ERRCT DB 0
  557. EOFLG DB 0
  558. SECPTR DW DBUF
  559. SECINBF DB 0
  560.  DS 60
  561. STACK DS 2
  562. DBUF EQU $
  563. ;
  564.  END
  565.