home *** CD-ROM | disk | FTP | other *** search
- ; COPYRIGHT 1984 BY JOHN M. BLALOCK
-
- ; ####################################
- ; ## ##
- ; ## GETIT.ASM ##
- ; ## ##
- ; ## Written by: ##
- ; ## ##
- ; ## John M. Blalock ##
- ; ## April 22, 1984 ##
- ; ## ##
- ; ####################################
-
- ; This program is a very simple CP/M terminal and ASCII
- ; text capture program. Once customized for your
- ; particular computer, it will enable you to communicate to
- ; another computer via a serial port. It is expected that
- ; the serial port will be connected to a modem. GETIT will
- ; allow you to transfer ASCII files from the remote
- ; computer to yours and save them on disk as long as the
- ; files are no larger than the available capture buffer.
- ; Longer files will have to be broken up into smaller
- ; segments and recombined on your computer with PIP.
-
- ; Once you have established communications with the remote
- ; computer, entering Ctl-Y from your console will cause
- ; GETIT to start saving text sent from the remote computer
- ; into a RAM buffer that starts at 0100H. This capture
- ; function can be toggled on and/or off by subsequent entry
- ; of another Ctl-Y. An ASCII BELL character is sent to the
- ; console when capture is toggled on, and nothing is sent
- ; when it is toggled off.
-
- ; Entering Ctl-E will cause GETIT to exit to CP/M after
- ; first telling you the decimal number of pages in the
- ; capture buffer. GETIT will also exit when the buffer is
- ; filled. An X-OFF (Ctl-S) is first sent to the remote
- ; computer that will stop further output by it as long as
- ; it supports the X-ON/X-OFF protocol. The captured data
- ; will be in your RAM starting at 0100H and can be saved to
- ; disk by entering SAVE nn FILENAME.EXT where nn is the
- ; number of pages GETIT told you to SAVE.
-
- ; GETIT is purposefully short and simple to facilitate
- ; entry of its source code from the keyboard. Leave out
- ; the comments - you have them here. Probably the first
- ; thing for which you will want to use it (and perhaps its
- ; only use) is to download a better, more capable
- ; communications program. But it does solve the Catch-22
- ; problem of not being able to download any communications
- ; program because you don't have any to start with. If
- ; MDM730.HEX is available on the remote computer, capture
- ; it with GETIT, LOAD it, and now you have a good
- ; communications program.
-
- ; GETIT is released for use in the public domain for non-
- ; profit usage only. If it helps you sell your product, I
- ; would like to share in the profits. If you sell GETIT, I
- ; want all the profits. Any questions should be addressed
- ; to John Blalock, Blalock and Associates, PO Box 39356,
- ; Phoenix, AZ 85069. Include an SASE if you want a reply.
-
-
- ; MODEM CONSTANTS - You will need to change these to match
- ; your particular UART. If your UART transmit buffer empty
- ; and/or receive data available bits are low true, you'll
- ; have to change the conditional jumps that test these bits
- ; from JNZ to JZ and from JZ to JNZ. The affected lines
- ; are marked with an asterick (*) in the comments below.
-
- MDATA EQU 080H ;MODEM DATA PORT
- MSTAT EQU 081H ;MODEM STATUS PORT
- TXRDY EQU 001H ;TX BUFFER EMPTY BIT
- RXRDY EQU 002H ;RX DATA AVAILABLE BIT
-
-
- ; Equate DEST to 0C0H bytes or more below the CCP in your
- ; version of CP/M. The higher it is, the larger the
- ; capture buffer will be. I have 52.5K bytes available in
- ; the capture buffer with my version of CP/M and the
- ; following DEST value.
-
- DEST EQU 0D340H ;PROGRAM IS RELOCATED TO HERE
-
- ; The following equates shouldn't require any changes for a
- ; standard CP/M system.
-
- BASE EQU 0000H ;CP/M BASE ADDRESS
- BUFF EQU BASE + 0100H ;CAPTURE BUFFER START ADDRESS
- BDOS EQU 0005H ;BDOS ENTRY ADDRESS
- CAPT EQU 'Y'-40H ;CTL-Y = START/STOP CAPTURE
- EXIT EQU 'E'-40H ;CTL-E = STOP, EXIT TO CP/M
- BELL EQU 07H ;BEEP THE CONSOLE
- CR EQU 0DH ;ASCII CARRIAGE RETURN
- LF EQU 0AH ;ASCII LINE FEED
-
- ORG BUFF ;PROGRAM STARTS HERE
-
- BEGIN LDA BASE+2 ;GET BIOS PAGE NUMBER AND
- STA PCONST+2 ; PATCH PROGRAM WITH YOUR
- STA PCONIN+2 ; BIOS ENTRY ADDRESSES
- STA PCONOUT+2
- INIT ;Insert here any code required to initialize your
- ;UART if it is not already initialized by some
- ;other program or your CP/M cold boot routine.
- BMOVE LXI D,DEST ;BLOCK MOVE DESTINATION
- LXI H,START ;FIRST ADDRESS TO MOVE
- MVI C,PEND-START ;NUMBER OF BYTES TO MOVE
- MVLOOP MOV A,M ;GET A BYTE
- STAX D ;MOVE IT
- INX H ;BUMP POINTERS
- INX D
- DCR C ;COUNT THE BYTE
- JNZ MVLOOP ;LOOP 'TIL DONE
- JMP GETIT ;NOW GO RUN THE PROGRAM
- START EQU $ ;START OF RELOCATED CODE
- OFFSET EQU DEST-START ;PROGRAM OFFSET AMOUNT
- GETIT EQU $+OFFSET ;PROGRAM START IN HI MEMORY
- LXI H,BUFF ;INITIALIZE BUFFER POINTER
- GETLP EQU $+OFFSET ;MAIN PROGRAM LOOP
- IN MSTAT ;GET MODEM STATUS
- ANI RXRDY ;DATA AVAILABLE ?
- JNZ RXDRDY ;YES, THEN JUMP *
- CALL CONST ;NO, CHECK KEYBOARD
- ORA A ;ANYTHING TYPED ?
- JZ GETLP ;NO, THEN LOOP FOREVER
- CALL CONIN ;YES, GET IT
- CPI CAPT ;CTL-Y ?
- JZ TOGCAPT ;YES, TOGGLE CAPTURE FLAG
- CPI EXIT ;CTL-E ?
- JZ ENDIT1 ;YES, WE'RE DONE FOR NOW
- MOV C,A ;NO, MOVE CHARACTER TO C
- CALL SENDIT ;SEND THE CHARACTER
- JMP GETLP ;LOOP FOREVER
- SENDIT EQU $+OFFSET ;SEND (C) TO MODEM
- IN MSTAT ;GET MODEM STATUS
- ANI TXRDY ;TX BUFFER EMPTY ?
- JZ SENDIT ;NO, LOOP UNTIL EMPTY *
- MOV A,C ;CHAR TO REG A
- OUT MDATA ;SEND TO MODEM
- RET
- RXDRDY EQU $+OFFSET ;RX DATA IS AVAILABLE
- IN MDATA ;GET MODEM CHARACTER
- ANI 7FH ;CLEAR PARITY BIT
- MOV C,A ;PUT IN REG C
- LDA CAPTFG ;GET CAPTURE FLAG
- ORA A ;WANT TO SAVE IT ?
- JZ NOSAVE ;NO, THEN DON'T SAVE
- MOV M,C ;YES, PUT CHAR IN MEMORY
- INX H ;INCREMENT POINTER
- MOV A,H ;CHECK FOR TOO FAR
- CPI DEST SHR 8 ;CAN'T SAVE THIS MUCH
- JZ ENDIT ;EXIT IF BUFFER IS FULL
- ;Insert " JMP GETLP" here if using a slow console.
- ;You won't see the data as it's being saved, but
- ;you'll get it without missing characters.
- NOSAVE EQU $+OFFSET ;NOT SAVING OR NOT FULL
- CALL CONOUT ;DISPLAY RECEIVED CHAR
- JMP GETLP ;AND LOOP SOME MORE
- TOGCAPT EQU $+OFFSET ;TOGGLE CAPTURE FLAG
- LDA CAPTFG ;GET IT
- CMA ;COMPLEMENT IT
- STA CAPTFG ;RESTORE FLAG
- ORA A ;CAPTURE NOW ON ?
- JZ GETLP ;NO, BACK TO LOOPING
- MVI C,BELL ;YES, TELL USER CAPTURE
- CALL CONOUT ; HAS BEEN TOGGLED ON
- JMP GETLP ;BACK TO LOOPING
- ENDIT EQU $+OFFSET ;BUFFER FULL, GO TO CP/M
- MVI C,'S'-40H ;STOP OUTPUT IF POSSIBLE
- CALL SENDIT ; WITH A CTL-S
- ENDIT1 EQU $+OFFSET ;ENTER HERE TO EXIT W/O ^S
- MVI A,'Z'-40H ;END OF FILE FLAG
- MOV M,A ;SAVE IN BUFFER
- MOV A,H ;GET NUM OF PAGES TO SAVE
- PUSH PSW ;SAVE ON STACK
- LXI D,SAVE ;POINT DE TO "SAVE" MESSAGE
- MVI C,9 ;PRINT STRING FUNCTION
- CALL BDOS ;PRINT EXITING MESSAGE
- POP PSW ;RESTORE NUMBER OF PAGES
- MVI C,'0' ;INIT HUNDREDS DIGIT
- HUND EQU $+OFFSET ;LOOP HERE 'TIL < 100
- SUI 100 ;ANY HUNDREDS DIGITS?
- JC TENS ;NO, CHECK TENS
- INR C ;YES, BUMP HUNDREDS DIGIT
- JMP HUND ;ANY MORE HUNDREDS ?
- TENS EQU $+OFFSET ;NO MORE HUNDREDS
- ADI 100 ;PUT BACK 100
- PUSH PSW ;SAVE COUNT
- CALL CONOUT ;PRINT HUNDREDS DIGIT
- POP PSW ;RESTORE COUNT
- MVI C,'0' ;INIT TENS DIGIT
- TEN1 EQU $+OFFSET ;LOOP HERE 'TIL < 10
- SUI 10 ;ANY TENS DIGITS?
- JC ONES ;NO, CHECK ONES
- INR C ;YES, BUMP TENS DIGIT
- JMP TEN1 ;ANY MORE TENS?
- ONES EQU $+OFFSET ;NO MORE TENS
- ADI 10+'0' ;PUT BACK 10, ADD ASCII BIAS
- PUSH PSW ;SAVE NUMBER
- CALL CONOUT ;PRINT TENS DIGIT
- POP PSW ;RESTORE ONES DIGIT
- MOV C,A ;PASS TO CONOUT IN REG C
- CALL CONOUT ;PRINT ONES DIGIT
- RET ;BACK TO CP/M
- CONST EQU $+OFFSET ;PATCHED BY PROGRAM TO
- PCONST JMP BASE+6H ; YOUR BIOS CONST ADDRESS
- CONIN EQU $+OFFSET ;PATCHED BY PROGRAM TO
- PCONIN JMP BASE+9H ; YOUR BIOS CONIN ADDRESS
- CONOUT EQU $+OFFSET ;PATCHED BY PROGRAM TO
- PCONOUT JMP BASE+0CH ; YOUR BIOS CONOUT ADDRESS
- SAVE EQU $+OFFSET ;EXITING MESSAGE
- DB BELL,CR,LF,LF,'GETIT exiting, SAVE $'
- CAPTFG EQU $+OFFSET ;CAPTURE FLAG
- DB 0 ;00 = NO CAPTURE, DEFAULT
- PEND EQU $ ;END OF RELOCATED PROGRAM
- END