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