home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv084.ark / MBOOT3-A.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  465 lines

  1. ;
  2. ; MBOOT.ASM ver 3.1
  3. ; (revised 8 Jun 82 by Bill Bolton)
  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).
  16. ;
  17. ;A simple terminal routine at start of program allows
  18. ;user to communicate with a remote system prior to
  19. ;receiving a file to make it possible to down-load
  20. ;a file without intervention on the part of the host
  21. ;system's operator.
  22. ;
  23. ;COMMANDS:  MBOOT FILENAME.FILETYPE
  24. ; or  MBOOT A:FILENAME.FILETYPE
  25. ; or  MBOOT B:FILENAME.FILETYPE
  26. ;
  27. ;The program will operate as a dumb terminal until
  28. ;an 'ESC' key is typed (ctrl-[).  It then branches
  29. ;to the receive routine.  The user may also exit
  30. ;to CP/M without opening the receive file by typing
  31. ;ctrl-E from the terminal.  The values for the escape
  32. ;and exit keys may be changed in accordance with the
  33. ;needs of the user - some keyboards do not have the
  34. ;'ESC' key and/or provision for control characters.
  35. ;See equates.
  36. ;
  37. ;NOTE: Comments for the source code and tabs have been
  38. ;removed to make this file easier to transport from one
  39. ;system to another. It may look strange but will assemble
  40. ;OK (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. SPEED EQU 6    ;CPU speed in Mhz (to nearest Mhz)
  60. ;
  61. ;CHANGE THESE EQUATES FOR YOUR MODEM PORT REQUIREMENTS
  62. ;
  63. INITREQ EQU FALSE ;TRUE, IF MODEM PORT INITIALISATION REQUIRED
  64. ;
  65. MODSTAT EQU 5DH ;PUT YOUR MODEM STATUS PORT HERE
  66. MODSNDB EQU 01H ;YOUR BIT TO TEST FOR SEND
  67. MODSNDR EQU 01H ;YOUR VALUE WHEN READY
  68. MODRCVB EQU 02H ;YOUR BIT TO TEST FOR RECEIVE
  69. MODRCVR EQU 02H ;YOUR VALUE WHEN READY
  70. MODDATA EQU 5CH ;YOUR MODEM DATA PORT
  71. ;
  72. ;
  73. ERRLIM EQU 10
  74. ;
  75. SOH EQU 1
  76. EOT EQU 4
  77. ACK EQU 6
  78. NAK EQU 15H
  79. CAN EQU 18H
  80. LF  EQU 10
  81. CR  EQU 13
  82. BDOS EQU BASE+5
  83. FCB  EQU BASE+5CH
  84. ;
  85.  ORG BASE+100H
  86. ;
  87.  LXI H,0
  88.  DAD SP
  89.  SHLD STACK
  90.  LXI SP,STACK
  91.  CALL INITADR
  92.  CALL ILPRT
  93.  DB 'MBOOT 3.1 as of '
  94.  DB '08/Jun/82',CR,LF,0
  95.  LDA FCB+1
  96.  CPI ' '
  97.  JNZ TERMI
  98.  CALL ILPRT
  99.  DB '++NO FILE NAME SPECIFIED++',CR,LF,0
  100.  JMP EXIT
  101. ;
  102. TERMI CALL INITMOD
  103.  IN MODDATA
  104.  IN MODDATA
  105.  CALL ILPRT
  106.  DB CR,LF,'TERMINAL MODE',CR,LF
  107.  DB 'CTL-E exits to CP/M, ESC starts file transfer'
  108.  DB CR,LF,0
  109. ;
  110. TERM CALL STAT
  111.  JZ TERML
  112.  CALL KEYIN
  113.  CPI EXITCHR
  114.  JZ EXIT
  115.  CPI ESC
  116.  JZ RCVFIL
  117.  OUT MODDATA
  118. ;
  119. TERML IN MODSTAT
  120.  ANI MODRCVB
  121.  CPI MODRCVR
  122.  JNZ TERM
  123.  IN MODDATA
  124.  ANI 7FH
  125.  CALL TYPE
  126.  JMP TERM
  127. ;
  128. RCVFIL CALL ERASFIL
  129.  CALL MAKEFIL
  130.  CALL ILPRT
  131.  DB 'FILE OPEN, READY TO RECEIVE',CR,LF,0
  132. ;
  133. RCVLP CALL RCVSECT
  134.  JC RCVEOT
  135.  CALL WRSECT
  136.  CALL INCRSNO
  137.  CALL SENDACK
  138.  JMP RCVLP
  139. ;
  140. RCVEOT CALL WRBLOCK
  141.  CALL SENDACK
  142.  CALL CLOSFIL
  143.  CALL ERXIT
  144.  DB CR,LF,'TRANSFER COMPLETE$' 
  145. ;
  146. RCVSECT XRA A
  147.  STA ERRCT
  148. ;
  149. RCVRPT MVI B,SPEED*10
  150.  CALL RECV
  151.  JC RCVSERR
  152.  CPI SOH
  153.  JZ RCVSOH
  154.  ORA A
  155.  JZ RCVRPT
  156.  CPI EOT
  157.  STC
  158.  RZ
  159. ;
  160. RCVSERR MVI B,SPEED
  161.  CALL RECV
  162.  JNC RCVSERR
  163.  MVI A,NAK
  164.  CALL SEND
  165.  LDA ERRCT
  166.  INR A
  167.  STA ERRCT
  168.  CPI ERRLIM
  169.  JC RCVRPT
  170. ;
  171. RCVSABT CALL CLOSFIL
  172.  CALL ERXIT
  173.  DB '++UNABLE TO RECEIVE BLOCK'
  174.  DB CR,LF,'++ABORTING++$'
  175. ;
  176. RCVSOH MVI B,SPEED
  177.  CALL RECV
  178.  JC RCVSERR
  179.  MOV D,A
  180.  MVI B,SPEED
  181.  CALL RECV
  182.  JC RCVSERR
  183.  CMA
  184.  CMP D
  185.  JZ RCVDATA
  186.  JMP RCVSERR
  187. ;
  188. RCVDATA MOV A,D
  189.  STA RCVSNO
  190.  MVI C,0
  191.  LXI H,BASE+80H
  192. ;
  193. RCVCHR MVI B,SPEED
  194.  CALL RECV
  195.  JC RCVSERR
  196.  MOV M,A
  197.  INR L
  198.  JNZ RCVCHR
  199.  MOV D,C
  200.  MVI B,SPEED
  201.  CALL RECV
  202.  JC RCVSERR
  203.  CMP D
  204.  JNZ RCVSERR
  205.  LDA RCVSNO
  206.  MOV B,A
  207.  LDA SECTNO
  208.  CMP B
  209.  JZ RECVACK
  210.  INR A
  211.  CMP B
  212.  JNZ ABORT
  213.  RET
  214. ;
  215. RECVACK CALL SENDACK
  216.  JMP RCVSECT
  217. ;
  218. SENDACK MVI A,ACK
  219. ;
  220. SEND PUSH PSW
  221.  ADD C
  222.  MOV C,A
  223. ;
  224. SENDW IN MODSTAT
  225.  ANI MODSNDB
  226.  CPI MODSNDR
  227.  JNZ SENDW
  228.  POP PSW
  229.  OUT MODDATA
  230.  RET
  231. ;
  232. ABORT LXI SP,STACK
  233. ;
  234. ABORTL MVI B,SPEED
  235.  CALL RECV
  236.  JNC ABORTL
  237.  MVI A,CAN
  238.  CALL SEND
  239. ;
  240. ABORTW MVI B,1
  241.  CALL RECV
  242.  JNC ABORTW
  243.  MVI A,' '
  244.  CALL SEND
  245.  CALL ERXIT
  246.  DB 'MBOOT PROGRAM CANCELLED$'
  247. ;
  248. INCRSNO LDA SECTNO
  249.  INR A
  250.  STA SECTNO
  251.  RET
  252. ;
  253. ERASFIL LXI D,FCB
  254.  MVI C,17
  255.  CALL BDOS
  256.  INR A
  257.  RZ
  258.  CALL ILPRT
  259.  DB '++FILE EXISTS, TYPE Y TO ERASE: ',0
  260.  CALL KEYIN
  261.  PUSH PSW
  262.  CALL TYPE
  263.  CALL CRLF
  264.  POP PSW
  265.  ANI 5FH
  266.  CPI 'Y'
  267.  JNZ MXIT
  268.  LXI D,FCB
  269.  MVI C,19
  270.  JMP BDOS
  271. ;
  272. MAKEFIL LXI D,FCB
  273.  MVI C,22
  274.  CALL BDOS
  275.  INR A
  276.  RNZ
  277.  CALL ERXIT
  278.  DB '++ERROR - CAN''T MAKE FILE',CR,LF
  279.  DB '++DIRECTORY MUST BE FULL$'
  280. ;
  281. CLOSFIL LXI D,FCB
  282.  MVI C,16
  283.  CALL BDOS
  284.  INR A
  285.  RNZ
  286.  CALL ERXIT
  287.  DB '++CAN''T CLOSE FILE$'
  288. ;
  289. WRSECT LHLD SECPTR
  290.  XCHG
  291.  LXI H,BASE+80H
  292.  CALL MOVE128
  293.  XCHG
  294.  SHLD SECPTR
  295.  LDA SECINBF
  296.  INR A
  297.  STA SECINBF
  298.  CPI 16
  299.  RNZ
  300. ;
  301. WRBLOCK LDA SECINBF
  302.  ORA A
  303.  RZ
  304.  MOV C,A
  305.  LXI D,DBUF
  306. ;
  307. DKWRLP PUSH H
  308.  PUSH D
  309.  PUSH B
  310.  MVI C,26
  311.  CALL BDOS
  312.  LXI D,FCB
  313.  MVI C,21
  314.  CALL BDOS
  315.  POP B
  316.  POP D
  317.  POP H
  318.  ORA A
  319.  JNZ WRERR
  320.  LXI H,80H
  321.  DAD D
  322.  XCHG
  323.  DCR C
  324.  JNZ DKWRLP
  325.  XRA A
  326.  STA SECINBF
  327.  LXI H,DBUF
  328.  SHLD SECPTR
  329. ;
  330. RSDMA LXI D,BASE+80H
  331.  MVI C,26
  332.  JMP BDOS
  333. ;
  334. WRERR CALL RSDMA
  335.  CALL ILPRT
  336.  DB '++ERROR WRITING FILE',CR,LF,0
  337.  JMP ABORT
  338. ;
  339. RECV PUSH D
  340. MSEC LXI D,12500
  341. ;
  342. MWTI IN MODSTAT
  343.  ANI MODRCVB
  344.  CPI MODRCVR
  345.  JZ MCHAR
  346.  DCR E
  347.  JNZ MWTI
  348.  DCR D
  349.  JNZ MWTI
  350.  DCR B
  351.  JNZ MSEC
  352.  POP D
  353.  STC
  354.  RET
  355. ;
  356. MCHAR IN MODDATA
  357.  POP D
  358.  PUSH PSW
  359.  ADD C
  360.  MOV C,A
  361.  POP PSW
  362.  ORA A
  363.  RET
  364. ;
  365. INITADR LHLD BASE+1
  366.  LXI D,3
  367.  DAD D
  368.  SHLD VSTAT+1
  369.  DAD D
  370.  SHLD VKEYIN+1
  371.  DAD D
  372.  SHLD VTYPE+1
  373.  RET
  374. ;
  375. INITMOD EQU $
  376. ;
  377.  IF INITREQ     ;Insert any UART initialisation code here
  378.  ENDIF
  379. ;
  380. ;
  381.  RET  ;<--THIS RET MUST BE HERE
  382. ;
  383. CRLF MVI A,CR
  384.  CALL TYPE
  385.  MVI A,LF
  386. ;
  387. TYPE PUSH PSW
  388.  PUSH B
  389.  PUSH D
  390.  PUSH H
  391.  MOV C,A
  392. VTYPE CALL $-$
  393.  POP H
  394.  POP D
  395.  POP B
  396.  POP PSW
  397.  RET
  398. ;
  399. STAT PUSH B
  400.  PUSH D
  401.  PUSH H
  402. VSTAT CALL $-$
  403.  POP H
  404.  POP D
  405.  POP B
  406.  ORA A
  407.  RET
  408. ;
  409. KEYIN PUSH B
  410.  PUSH D
  411.  PUSH H
  412. VKEYIN CALL $-$
  413.  POP H
  414.  POP D
  415.  POP B
  416.  ANI 7FH
  417.  RET
  418. ;
  419. ILPRT XTHL
  420. ;
  421. ILPLP MOV A,M
  422.  ORA A
  423.  JZ ILPRET
  424.  CALL TYPE
  425.  INX H
  426.  JMP ILPLP
  427. ;
  428. ILPRET XTHL
  429.  RET
  430. ;
  431. ERXIT POP D
  432.  MVI C,9
  433.  CALL BDOS
  434. ;
  435. MXIT CALL ILPRT
  436.  DB CR,LF,'DON''T FORGET TO DISCONNECT MODEM'
  437.  DB CR,LF,0
  438. ;
  439. EXIT LHLD STACK
  440.  SPHL
  441.  RET
  442. ;
  443. MOVE128 MVI B,128
  444. ;
  445. MOVE MOV A,M
  446.  STAX D
  447.  INX H
  448.  INX D
  449.  DCR B
  450.  JNZ MOVE
  451.  RET
  452. ;
  453. RCVSNO DB 0
  454. SECTNO DB 0
  455. ERRCT DB 0
  456. EOFLG DB 0
  457. SECPTR DW DBUF
  458. SECINBF DB 0
  459.  DS 60
  460. STACK DS 2
  461. DBUF EQU $
  462. ;
  463.  END
  464.