home *** CD-ROM | disk | FTP | other *** search
- ;
- ; MBOOT.ASM ver 3.0
- ; (revised 5 Nov 80)
- ;
- ;MODEM BOOT PROGRAM by Keith Petersen, W8SDZ.
- ;Thanks to John Taylor for idea of incorporating
- ;simple terminal routine. Based on MODEM.ASM V2.0,
- ;by Ward Christensen with enhancements from MODEM527.
- ;
- ;CP/M - CP/M file transfer program (receive-only)
- ;
- ;This program is intended for use as a way to
- ;initially transfer MODEM.COM or MODEM.ASM to
- ;a new user. It may be used with almost any
- ;modem (see equates). If PMMI or D.C. Hayes modem
- ;is used, then uses 'ORIGINATE' mode, 300 baud.
- ;
- ;A simple terminal routine at start of program allows
- ;user to communicate with a remote system prior to
- ;receiving a file to make it possible to down-load
- ;a file without intervention on the part of the host
- ;system's operator.
- ;
- ;COMMANDS: MBOOT FILENAME.FILETYPE
- ; or MBOOT A:FILENAME.FILETYPE
- ; or MBOOT B:FILENAME.FILETYPE
- ;
- ;The program will operate as a dumb terminal until
- ;an 'ESC' key is typed (ctrl-[). It then branches
- ;to the receive routine. The user may also exit
- ;to CP/M without opening the receive file by typing
- ;ctrl-E from the terminal. The values for the escape
- ;and exit keys may be changed in accordance with the
- ;needs of the user - some keyboards do not have the
- ;'ESC' key and/or provision for control characters.
- ;See equates.
- ;
- ;NOTE: Comments for the source code and tabs have been
- ;removed to make this file easier to transport from one
- ;system to another. (KBP)
- ;
- FALSE EQU 0
- TRUE EQU NOT FALSE
- ;
- STDCPM EQU TRUE ;TRUE, IS STANDARD CP/M
- ALTCPM EQU FALSE ;TRUE, IS ALTERNATE CP/M FOR H8 OR TRS80
- ;
- IF STDCPM
- BASE EQU 0
- ENDIF
- ;
- IF ALTCPM
- BASE EQU 4200H
- ENDIF
- ;
- EXITCHR EQU 05H ;CTL-E TO EXIT TERM MODE TO CP/M
- ESC EQU 1BH ;ESCAPE TO EXIT TERM MODE TO FILE RCVE
- ;
- FASTCLK EQU FALSE ;TRUE FOR 4 MHZ CLOCK
- ;
- PMMI EQU TRUE ;TRUE, IS PMMI MODEM
- DCH EQU FALSE ;TRUE, IS D.C. HAYES MODEM
- ;
- ;IF YOU ARE USING AN EXTERNAL MODEM (NOT S-100 PLUG-IN)
- ;CHANGE THESE EQUATES FOR YOUR MODEM PORT REQUIREMENTS
- ;
- INITREQ EQU FALSE ;TRUE, IF MODEM PORT INIT. REQ'D
- INITC1 EQU 0AAH ;1ST INIT CHAR TO CTL PORT FOR USART
- INITC2 EQU 40H ;2ND "
- INITC3 EQU 4EH ;3RD "
- INITC4 EQU 37H ;4TH "
- ;
- IF NOT PMMI AND NOT DCH
- MODCTLP EQU 02H ;PUT YOUR MODEM CONTROL PORT HERE
- MODSNDB EQU 80H ;YOUR BIT TO TEST FOR SEND
- MODSNDR EQU 80H ;YOUR VALUE WHEN READY
- MODRCVB EQU 40H ;YOUR BIT TO TEST FOR RECEIVE
- MODRCVR EQU 40H ;YOUR VALUE WHEN READY
- MODDATP EQU 03H ;YOUR MODEM DATA PORT
- ENDIF ;END OF EXTERNAL MODEM EQUATES
- ;
- IF PMMI
- MODCTLP EQU 0C0H
- MODSNDB EQU 1
- MODSNDR EQU 1
- MODRCVB EQU 2
- MODRCVR EQU 2
- MODDATP EQU 0C1H
- BAUDRP EQU 0C2H
- MODCTL2 EQU 0C3H
- ORIGMOD EQU 1DH
- ANSWMOD EQU 1EH
- ENDIF
- ;
- IF DCH
- MODCTLP EQU 82H
- MODSNDB EQU 2
- MODSNDR EQU 2
- MODRCVB EQU 1
- MODRCVR EQU 1
- MODDATP EQU 80H
- MODCTL2 EQU 81H
- ORIGMOD EQU 87H
- ANSWMOD EQU 83H
- ENDIF
- ;
- ERRLIM EQU 10
- ;
- SOH EQU 1
- EOT EQU 4
- ACK EQU 6
- NAK EQU 15H
- CAN EQU 18H
- LF EQU 10
- CR EQU 13
- ;
- BDOS EQU BASE+5
- FCB EQU BASE+5CH
- ;
- ORG BASE+100H
- ;
- LXI H,0
- DAD SP
- SHLD STACK
- LXI SP,STACK
- CALL INITADR
- CALL ILPRT
- DB 'MBOOT as of '
- DB '11/5/80',CR,LF,0
- LDA FCB+1
- CPI ' '
- JNZ TERMI
- CALL ILPRT
- DB '++NO FILE NAME SPECIFIED++',CR,LF,0
- JMP EXIT
- ;
- TERMI CALL INITMOD
- IN MODDATP
- IN MODDATP
- CALL ILPRT
- DB CR,LF,'TERMINAL MODE',CR,LF
- DB 'CTL-E exits to CP/M, ESC starts file transfer'
- DB CR,LF,0
- ;
- TERM CALL STAT
- JZ TERML
- CALL KEYIN
- CPI EXITCHR
- JZ EXIT
- CPI ESC
- JZ RCVFIL
- OUT MODDATP
- ;
- IF NOT DCH
- TERML IN MODCTLP
- ENDIF
- ;
- IF DCH
- TERML IN MODCTL2
- ENDIF
- ;
- ANI MODRCVB
- CPI MODRCVR
- JNZ TERM
- IN MODDATP
- ANI 7FH
- CALL TYPE
- JMP TERM
- ;
- RCVFIL CALL ERASFIL
- CALL MAKEFIL
- CALL ILPRT
- DB 'FILE OPEN, READY TO RECEIVE',CR,LF,0
- ;
- RCVLP CALL RCVSECT
- JC RCVEOT
- CALL WRSECT
- CALL INCRSNO
- CALL SENDACK
- JMP RCVLP
- ;
- RCVEOT CALL WRBLOCK
- CALL SENDACK
- CALL CLOSFIL
- CALL ERXIT
- DB CR,LF,'TRANSFER COMPLETE$'
- ;
- RCVSECT XRA A
- STA ERRCT
- ;
- RCVRPT MVI B,10
- CALL RECV
- JC RCVSERR
- CPI SOH
- JZ RCVSOH
- ORA A
- JZ RCVRPT
- CPI EOT
- STC
- RZ
- ;
- RCVSERR MVI B,1
- CALL RECV
- JNC RCVSERR
- MVI A,NAK
- CALL SEND
- LDA ERRCT
- INR A
- STA ERRCT
- CPI ERRLIM
- JC RCVRPT
- ;
- RCVSABT CALL CLOSFIL
- CALL ERXIT
- DB '++UNABLE TO RECEIVE BLOCK'
- DB CR,LF,'++ABORTING++$'
- ;
- RCVSOH MVI B,1
- CALL RECV
- JC RCVSERR
- MOV D,A
- MVI B,1
- CALL RECV
- JC RCVSERR
- CMA
- CMP D
- JZ RCVDATA
- JMP RCVSERR
- ;
- RCVDATA MOV A,D
- STA RCVSNO
- MVI C,0
- LXI H,BASE+80H
- ;
- RCVCHR MVI B,1
- CALL RECV
- JC RCVSERR
- MOV M,A
- INR L
- JNZ RCVCHR
- MOV D,C
- MVI B,1
- CALL RECV
- JC RCVSERR
- CMP D
- JNZ RCVSERR
- LDA RCVSNO
- MOV B,A
- LDA SECTNO
- CMP B
- JZ RECVACK
- INR A
- CMP B
- JNZ ABORT
- RET
- ;
- RECVACK CALL SENDACK
- JMP RCVSECT
- ;
- SENDACK MVI A,ACK
- ;
- SEND PUSH PSW
- ADD C
- MOV C,A
- ;
- IF NOT DCH
- SENDW IN MODCTLP
- ENDIF
- ;
- IF DCH
- SENDW IN MODCTL2
- ENDIF
- ;
- ANI MODSNDB
- CPI MODSNDR
- JNZ SENDW
- POP PSW
- OUT MODDATP
- RET
- ;
- ABORT LXI SP,STACK
- ;
- ABORTL MVI B,1
- CALL RECV
- JNC ABORTL
- MVI A,CAN
- CALL SEND
- ;
- ABORTW MVI B,1
- CALL RECV
- JNC ABORTW
- MVI A,' '
- CALL SEND
- CALL ERXIT
- DB 'MBOOT PROGRAM CANCELLED$'
- ;
- INCRSNO LDA SECTNO
- INR A
- STA SECTNO
- RET
- ;
- ERASFIL LXI D,FCB
- MVI C,17
- CALL BDOS
- INR A
- RZ
- CALL ILPRT
- DB '++FILE EXISTS, TYPE Y TO ERASE: ',0
- CALL KEYIN
- PUSH PSW
- CALL TYPE
- CALL CRLF
- POP PSW
- ANI 5FH
- CPI 'Y'
- JNZ MXIT
- LXI D,FCB
- MVI C,19
- JMP BDOS
- ;
- MAKEFIL LXI D,FCB
- MVI C,22
- CALL BDOS
- INR A
- RNZ
- CALL ERXIT
- DB '++ERROR - CAN''T MAKE FILE',CR,LF
- DB '++DIRECTORY MUST BE FULL$'
- ;
- CLOSFIL LXI D,FCB
- MVI C,16
- CALL BDOS
- INR A
- RNZ
- CALL ERXIT
- DB '++CAN''T CLOSE FILE$'
- ;
- WRSECT LHLD SECPTR
- XCHG
- LXI H,BASE+80H
- CALL MOVE128
- XCHG
- SHLD SECPTR
- LDA SECINBF
- INR A
- STA SECINBF
- CPI 16
- RNZ
- ;
- WRBLOCK LDA SECINBF
- ORA A
- RZ
- MOV C,A
- LXI D,DBUF
- ;
- DKWRLP PUSH H
- PUSH D
- PUSH B
- MVI C,26
- CALL BDOS
- LXI D,FCB
- MVI C,21
- CALL BDOS
- POP B
- POP D
- POP H
- ORA A
- JNZ WRERR
- LXI H,80H
- DAD D
- XCHG
- DCR C
- JNZ DKWRLP
- XRA A
- STA SECINBF
- LXI H,DBUF
- SHLD SECPTR
- ;
- RSDMA LXI D,BASE+80H
- MVI C,26
- JMP BDOS
- ;
- WRERR CALL RSDMA
- CALL ILPRT
- DB '++ERROR WRITING FILE',CR,LF,0
- JMP ABORT
- ;
- RECV PUSH D
- ;
- IF FASTCLK
- MOV A,B
- ADD A
- MOV B,A
- ENDIF
- ;
- MSEC LXI D,50000
- ;
- IF NOT DCH
- MWTI IN MODCTLP
- ENDIF
- ;
- IF DCH
- MWTI IN MODCTL2
- ENDIF
- ;
- ANI MODRCVB
- CPI MODRCVR
- JZ MCHAR
- DCR E
- JNZ MWTI
- DCR D
- JNZ MWTI
- DCR B
- JNZ MSEC
- POP D
- STC
- RET
- ;
- MCHAR IN MODDATP
- POP D
- PUSH PSW
- ADD C
- MOV C,A
- POP PSW
- ORA A
- RET
- ;
- INITADR LHLD BASE+1
- LXI D,3
- DAD D
- SHLD VSTAT+1
- DAD D
- SHLD VKEYIN+1
- DAD D
- SHLD VTYPE+1
- RET
- ;
- INITMOD EQU $
- ;
- IF INITREQ
- MVI A,INITC1
- OUT MODCTLP
- NOP ! NOP ! NOP
- NOP ! NOP
- MVI A,INITC2
- OUT MODCTLP
- NOP ! NOP ! NOP
- NOP ! NOP
- MVI A,INITC3
- OUT MODCTLP
- NOP ! NOP ! NOP
- NOP ! NOP
- MVI A,INITC4
- OUT MODCTLP
- NOP ! NOP ! NOP
- NOP ! NOP
- ENDIF
- ;
- IF PMMI
- MVI A,52
- OUT BAUDRP
- MVI A,7FH
- OUT MODCTL2
- ENDIF
- ;
- IF DCH
- MVI A,16H
- OUT MODCTL2
- ENDIF
- ;
- IF PMMI OR DCH
- ;
- LXI H,4000
- ;
- OFFDLY DCR L
- JNZ OFFDLY
- DCR H
- JNZ OFFDLY
- MVI A,ORIGMOD
- OUT MODCTLP
- ENDIF
- ;
- RET ;<--THIS RET MUST BE HERE
- ;
- CRLF MVI A,CR
- CALL TYPE
- MVI A,LF
- ;
- TYPE PUSH PSW
- PUSH B
- PUSH D
- PUSH H
- MOV C,A
- VTYPE CALL $-$
- POP H
- POP D
- POP B
- POP PSW
- RET
- ;
- STAT PUSH B
- PUSH D
- PUSH H
- VSTAT CALL $-$
- POP H
- POP D
- POP B
- ORA A
- RET
- ;
- KEYIN PUSH B
- PUSH D
- PUSH H
- VKEYIN CALL $-$
- POP H
- POP D
- POP B
- ANI 7FH
- RET
- ;
- ILPRT XTHL
- ;
- ILPLP MOV A,M
- ORA A
- JZ ILPRET
- CALL TYPE
- INX H
- JMP ILPLP
- ;
- ILPRET XTHL
- RET
- ;
- ERXIT POP D
- MVI C,9
- CALL BDOS
- ;
- MXIT CALL ILPRT
- DB CR,LF,'DON''T FORGET TO DISCONNECT MODEM'
- DB CR,LF,0
- ;
- EXIT LHLD STACK
- SPHL
- RET
- ;
- MOVE128 MVI B,128
- ;
- MOVE MOV A,M
- STAX D
- INX H
- INX D
- DCR B
- JNZ MOVE
- RET
- ;
- RCVSNO DB 0
- SECTNO DB 0
- ERRCT DB 0
- EOFLG DB 0
- SECPTR DW DBUF
- SECINBF DB 0
- DS 60
- STACK DS 2
- DBUF EQU $
- ;
- END
-