URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [xrecv/] [XSEND.ASM] - Rev 154
Compare with Previous | Blame | View Log
*** Xmodem Send Utility for Flex9 (xsend.asm)** WITH ACIA MAPPED AT $E000** 2020-05-24 JEK Work in progress.**** FLEX9 FMS CALLS*SYSFCB EQU $C840FMSCLS EQU $D403FMS EQU $D406** FLEX SYSTEM DEFINED ENTRY VECTORS*COLDS EQU $CD00 FLEX COLD START ADDRESSWARMS EQU $CD03 FLEX WARM START ADDRESSRENTER EQU $CD06 RE-ENTER FLEX PROCESSINGINCH EQU $CD09 INPUT CHARACTER (LOW LEVEL) (MAY BE REDIRECTED)INCH2 EQU $CD0C SECONDARY INPUT CHARACTER (NOT REDIRECTED)OUTCH EQU $CD0F OUTPUT CHARACTER (LOW LEVEL) (MAY BE REDIRECTED)OUTCH2 EQU $CD12 SECONDARY CHAR OUTPUT (NOT REDIRECTED)GETCHR EQU $CD15 INPUT CHARACTER ROUTINE (HONOURS TTYSET)PUTCHR EQU $CD18 OUTPUT CHARACTER ROUTINE (HONOURS TTYSET)INBUFF EQU $CD1B INPUT LINE BUFFERPSTRNG EQU $CD1E PRINT STRINGCLASS EQU $CD21 CLASSIFY CHARACTERPCRLF EQU $CD24 PRINT CR/LF SEQUENCENXTCH EQU $CD27 GET NEXT CHARACTER FROM INPUT BUFFERRESTIO EQU $CD2A RESTORE I/O VECTORS ON INCH & OUCHGETFIL EQU $CD2D GET FILE SPECIFICATION (X=FCB) (C=1 IF FORMAT ERROR)LOAD EQU $CD30 LOAD FILE ENTRY POINTSETEXT EQU $CD33 SET UP FILE EXTENSIONADDBX EQU $CD36 ADD ACCB TO X INDEX REGISTEROUTDEC EQU $CD39 OUTPUT DECIMAL NUMBEROUTHEX EQU $CD3C OUTPUT HEXADECIMAL BYTE POINTED TO BY XRPTERR EQU $CD3F I/O ERROR ABORT ROUTINEGETHEX EQU $CD42 GET HEXIDECIMAL SPECIFICATIONOUTADR EQU $CD45 OUTPUT HEXADECIMAL ADDRESS POINTED TO BY XINDEC EQU $CD48 GET DECIMAL NUMBERDOCMD EQU $CD4B DOCMD ENTRY ADDRESS (CALL FLEX AS SUBROUTINE)STATUS EQU $CD4E CHECK TERMINAL INPUT STATUS (Z=1 => NO CHARACTER)** FMS FUNCTION CODES*FMSFRW EQU 0 READ OR WRITE TO FILE (Z=0 => ERROR)FMSFOR EQU 1 OPEN FILE FOR READ (Z=0 => ERROR)FMSFOW EQU 2 OPEN FILE FOR WRITE (Z=0 => ERROR)FMSFOU EQU 3 OPEN FILE FOR UPDATE (1=SEQ RD, 2=RAND RD, 3=RAND WR, 4=CLOSE)FMSFCL EQU 4 CLOSE FILEFMSFRS EQU 5 REWIND FILEFMSDOP EQU 6 OPEN DIRTECTORYFMSGIR EQU 7 GET INFORMATION RECORD (READ DIRECTORY)FMSPIR EQU 8 PUT INFORMATION RECORD (WRITE DIRECTORY)FMSRSS EQU 9 READ SINGLE SECTOR (SET CURRENT TRACK & SECTOR IN FCB)FMSWSS EQU 10 WRITE SINGLE SECTORFMSFDL EQU 11 DELETE FILEFMSRRN EQU 12 RENAME FILEFMSNSS EQU 15 READ OR WRITE NEXT SEQUENTIAL SECTORFMSOSR EQU 16 OPEN SYSTEM INFORMATION RECORDFMSRRB EQU 17 READ RANDOM BYTE FROM SECTOR (SET RANDOM INDEX BYTE IN FCB)FMSWRB EQU 18 WRITE RANDOM BYTE IN SECTOR (ADD 4 TO SKIP SECTOR LINK)FMSFND EQU 20 FIND NEXT DRIVE IN READY STATEFMSPRN EQU 21 POSITION TO RECORD N (STORE ADDRESS IN CURRENT RECORD NUMBER)FMSBOR EQU 22 BACK UP ONE RECORD** FMS ERROR CODES*ERRIFC EQU 1 ILLEGAL FMS FUNCTION CODEERRINU EQU 2 REQUESTED FILE IN USEERRFAE EQU 3 FILE ALREADY EXISTS (OPEN FOR WRITE EXISTING FILE)ERRFNF EQU 4 FILE NOT FOUND (OPEN FOR READ)ERRSDE EQU 5 SYSTEM DIRECTORY ERROR - REBOOT SYSTEMERRSDF EQU 6 SYSTEM DIRECTORY FULLERRDSF EQU 7 ALL AVAILBABLE DISK SPACE HAS BEEN USEDERREOF EQU 8 READ PAST END OF FILEERRRDE EQU 9 FILE READ ERRORERRWRE EQU 10 FILE WRITE ERRORERRWRP EQU 11 FILE IS WRITE PROTRECTEDERRFND EQU 12 FILE IS PROTECTED - FILE NOT DELETEDERRFCB EQU 13 ILLEGAL FILE CONTROL BLOCKERRIDA EQU 14 ILLEGAL DISK ADDRESSERRIDN EQU 15 ILLEGAL DRIVE NUMBERERRBSY EQU 16 DRIVE NOT READYERRFPR EQU 17 FILE IS PROTECTED - ACCESS DENIEDERRSFS EQU 18 SYSTEM FILE STATUS ERRORERRDIR EQU 19 FMS DATA INDEX RANGE ERRORERRFMS EQU 20 FMS INACTIVE - REBOOT SYSTEMERRIFS EQU 21 ILLEGAL FILE SPECIFICATIONERRSFC EQU 22 SYSTEM FILE CLOSE ERRORERRSMO EQU 23 SECTOR MAP OVERFLOWERRNSR EQU 24 NON EXISTAND RECORD NUMBER (NO SUCH RECORD)ERRRNM EQU 25 RECORD NUMBER MATCH ERROR (FILE DAMAGED)ERRSYN EQU 26 COMMAND SYNTAX ERRORERRPRN EQU 27 COMMAND NOT ALLOWED WHILE PRINTINGERRHWC EQU 28 WRONG HARDWARE CONFIGURATION** Condition Code Flags*CFLAG EQU $01 CARRY FLAGVFLAG EQU $02 OVERFLOW FLAGZFLAG EQU $04 ZERO FLAGNFLAG EQU $08 NEGATIVE FLAGIFLAG EQU $10 IRQ MASK CCHFLAG EQU $20 HALF CARRYFFLAG EQU $40 FIRQ MASK CCEFLAG EQU $80 ENTIRE FLAG** Serial Port*ACIAS EQU $E000ACIAC1 EQU ACIASACIAD1 EQU ACIAS+1DELCON EQU 1250 Delay (Processor clock in MHz * 50)** XMODEM Control characters*SOH EQU $01 sent for 128 byte blockSTX EQU $02 sent for 1024 byte blockEOT EQU $04ACK EQU $06NAK EQU $15CAN EQU $18** ASCII CONTROL CHARACTERS*HT EQU $09LF EQU $0ACR EQU $0DRETRY EQU 16** Start*ORG $0100START LBRA LOAD1*** RAM SPACE*CHKSUM FCB 0BLKNUM FCB 0 Xmodem block numberBYTCNT FCB 0 Xmodem byte countSNDCNT FCB 0 Send byte countPADCNT FCB 0 Send byte countDELCNT FCB $00,$00,$00 Xmodem Poll timerBUFPTR FDB 0 Pointer to send bufferTXTFLG FCB 0 Text file flagSPTEMP FDB 0 Stack pointer storeRETRYC FCB 0 Retry countLSTCHR FCB 0 Double CANcel** SEND BUFFER*BUFSIZ EQU 128BUFFER RMB BUFSIZ** Program Stack*RMB 256STACK EQU **** MAIN ENTRY POINT** Get file specification*LOAD1 STS SPTEMPLDS #STACKLDX #SYSFCBJSR GETFILBCS FMSERR** look for 'T' for text file*LOAD2 JSR NXTCHANDA #$5FCMPA #'T Is it a Text File ?BNE OPENRD No, open as binary fileSTA TXTFLGLDX #TXTMSGJSR PSTRNGLDX #SYSFCBLDA #$01 If text file default to ".TXT"JSR SETEXT*** OPEN FILE FOR READ*OPENRD LDX #SYSFCBLDA #FMSFOR open file for readSTA 0,XJSR FMSBNE DSKERRTST TXTFLG Is it a text file ?BNE TXTFILE Yes, space compressionLDX #SYSFCB No, binary, no space compressionLDA #$FFSTA $3B,X** Start from Block 1*TXTFILE LDA #1 Initialize block numberSTA BLKNUMLDA #RETRY Initialize retry countSTA RETRYCLBRA RDSTRT go start transfer*** FINISHED LOAD** Send EOT until receiver sends an ACK*ABORT LDA #EOT Send EOTLBSR OUTTERLBSR INTER Wait for ACKBVS ABORT1 If timeout, terminateCMPA #ACK ACK Received ?BNE ABORT No, send another EOTABORT1 LDX #ENDMSG Yes, report file loadedJSR PSTRNG*** CLOSE FILE*CLOSE LDA #FMSFCL Close fileLDX #SYSFCBSTA 0,XJSR FMSBEQ EXIT*** ERROR IN CLOSING*DSKERR LDA $01,XFMSERR JSR RPTERRJSR FMSCLSEXIT LDS SPTEMPJMP WARMS** READ FILE INTO BUFFER* READ UP TO 128 BYTES*RDSTRT DEC RETRYC decrement the retry countBEQ ABORT terminate transmission if retry count expiresCLR BYTCNT Clear byte countLDX #BUFFER Reset buffer pointer to start of bufferSTX BUFPTR*RDLOOP LDX #SYSFCB Read byte from fileJSR FMSBNE RDERR Check for end of file** TST TXTFLG Text file ?* BEQ RDLP1 No, output binary* CMPA #CR Yes, substitute LF for CR (Linux)* BNE RDLP1* LDA #LF*RDLP1 LDX BUFPTR store character in bufferSTA ,X+STX BUFPTR*INC BYTCNT Increment send buffer byte countLDA BYTCNTCMPA #BUFSIZ Is send buffer full ?BEQ SNDSOH Yes, send a 128 byte recordBRA RDLOOP No, read next byte until EOF** CHECK FOR END OF FILE* IF SO SEND BUFFER AND PAD WITH NULLS*RDERR LDA $01,XCMPA #ERREOF test for End Of File ErrorLBNE ABORT If not, report disk error and close** Send bytes in the send buffer*SNDSOH LDX #BUFFER Reset buffer pointer to start of bufferSTX BUFPTRLDA #BUFSIZ Work out how many bytes to pad outSUBA BYTCNTSTA PADCNTLDA BYTCNTSTA SNDCNTLBEQ ABORT Terminate Transfer if no bytes to send** SEND SOH (START OF HEADER) = $01*LDA #SOH Send start of headerLBSR OUTTER** SEND BLOCK NUMBER*LDA BLKNUM Send Block numberLBSR OUTTER** SEND COMPLEMENT OF BLOCK NUMBER*LDA BLKNUM Send complement of block numberCOMALBSR OUTTER*CLR CHKSUM Clear Checksum** Send Data Block*SNDDAT LDX BUFPTR Send data byte in bufferLDA ,X+STX BUFPTRJSR OUTTER*ADDA CHKSUM Calculate checksumSTA CHKSUM*DEC SNDCNT Decrement sent byte counterBNE SNDDAT Loop until done** Send Pad Bytes*TST PADCNT Test if any pad charactersBEQ SNDCHK No, send checksumSNDPAD LDA #$00 Yes, output nullsJSR OUTTERDEC PADCNT Decrement Pad Byte CountBNE SNDPAD Loop until pad byte count == 0** Send Checksum*SNDCHK LDA CHKSUM Send checksumLBSR OUTTER** wait for acknowledgement*SNDWAI LBSR INTER Wait for ack, Negative ack, Cancel or timeoutBVS SNDUPD If timeout, send block againCMPA #NAK If negative acknowledgeBEQ SNDUPD send block againCMPA #CAN If CancelBEQ SNDCAN Terminate transmission and close fileCMPA #ACK If AcknowledgementBEQ SNDNXT advance block countSTA LSTCHR Update Last CharacterBRA SNDWAI Loop.** Acknowledge received* increment block number,* reset the retry count* and loop for next block*SNDNXT STA LSTCHR Non CAN characterINC BLKNUMLDA #RETRY reset the retry countSTA RETRYCLBRA RDSTRT** Look for two cancells to terminate*SNDCAN CMPA LSTCHRLBEQ ABORTSTA LSTCHRBRA SNDWAI** Store characetr in LSTCHR* And send SOH again*SNDUPD STA LSTCHRLBRA SNDSOH** ACIA INPUT TEST*INTEST LDA ACIAC1BITA #$01RTS** RESET ACIA*ACIRST LDA #$03 master resetSTA ACIAC1LDA #$11STA ACIAC1TST ACIAD1RTS** ACIA INPUT* SET V FLAG IF TIME OUTADR*INTER LDA #16STA DELCNT+0CLR DELCNT+1CLR DELCNT+2INTER0 LDA ACIAC1BITA #$01BNE INTER1BITA #$78BEQ INTER2BSR ACIRSTBRA INTER*INTER1 LDA ACIAD1ANDCC #$FF-VFLAGRTS*INTER2 DEC DELCNT+2BNE INTER0DEC DELCNT+1BNE INTER0DEC DELCNT+0BNE INTER0CLRAORCC #VFLAGRTS** ACIA OUTPUT*OUTTER PSHS A*OUTTE1 LDA ACIAC1BITA #$02BNE OUTTE2BITA #$78BEQ OUTTE1BSR ACIRSTBRA OUTTE1*OUTTE2 PULS ASTA ACIAD1RTS*** MESSAGES*ENDMSG FCC "FILE LOADED"FCB $04TXTMSG FCC "TEXT FILE"FCB $04END START
