URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [xrecv/] [XRECV.ASM] - Rev 153
Compare with Previous | Blame | View Log
*** FLEX 9 DISK DRIVERS** FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD* WITH I/O MAPPED AT $XE000* AND ROM MAPPED AT $XF000* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM* THE FIRST 64K IS USED BY FLEX,* THE SECOND 128K IS USED AS A ROM DISK* THE REMAINING RAM IS USED FOR A RAM DISK**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*MAPPAG EQU $00 PAGE $0000 DAT ADDRESS** Serial Port*ACIAS EQU $E000ACIAC1 EQU ACIASACIAD1 EQU ACIAS+1DELCON EQU 1250 Delay (Processor clock in MHz * 50)** XMODEM Control characters*SOH EQU $01EOT EQU $04ACK EQU $06NAK EQU $15CAN EQU $18** ASCII CONTROL CHARACTERS*HT EQU $09LF EQU $0ACR EQU $0D** Some dummy Constants*RMAXTRK EQU 48RMAXSEC EQU 14RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC** Start*ORG $0100START LBRA LOAD1*** RAM SPACE*CHKSUM FCB 0BLKNUM FCB 0 Xmodem block numberBYTCNT FCB 0 Xmodem byte countXSTATE FDB 0 Xmodem State VectorDELCNT FCB $00,$00,$00 Xmodem Poll timerBUFPTR FDB 0TEXTFL FCB 0LINECT FCB 0ORG $0200** SECTOR BUFFER*BUFFER RMB 256*** ACIA INPUT TEST*INTEST LDA ACIAC1BITA #$01RTS** RESET ACIA*ACIRST LDA #$03 master resetSTA ACIAC1LDA #$11STA ACIAC1RTS** ACIA INPUT*INTER LDA #16STA DELCNT+0CLR DELCNT+1CLR DELCNT+2INTER0 LDA ACIAC1BITA #$01BNE INTER1BITA #$78BEQ INTER2BSR ACIRSTBRA INTER*INTER1 LDA ACIAD1ANDCC #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** Print Data*PDATA0 BSR OUTTERPDATA1 LDA ,X+CMPA #$04BNE PDATA0RTS** Get a Byte using XModem protocol* Carry clear => no errors* Carry set => errors*XREAD PSHS ULDU XSTATE*XBYTE0 LBSR INTERBVC XBYTE1LDA #NAKLBSR OUTTERLDU #XSTSBRA XBYTE0*XBYTE1 JSR ,UBNE XBYTE0STU XSTATEPULS U,PC** START - LOOK FOR SOH (START OF HEADER) = $01*XSTS CMPA #SOHBNE XSTS1LDU #XSTBANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS*XSTS1 CMPA #EOTBNE XSTS2LDA #ACKLBSR OUTTERORCC #CFLAG+ZFLAG Set (c)=1 abort & exitRTS*XSTS2 CMPA #CANBNE XSTS3ORCC #CFLAG+ZFLAG Set (c)=1 abort & exitRTS*XSTS3 ANDCC #$FF-CFLAG-ZFLAGRTS** Got SOH* Now get block number*XSTB CMPA BLKNUMBNE XSTBELDU #XSTCOMANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Error in block number*XSTBE LDA #NAKLBSR OUTTERLDU #XSTSANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Get complement of block number*XSTCOM COMACMPA BLKNUMBNE XSTBECLR CHKSUMLDA #128STA BYTCNTLDU #XSTDANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Get data bytes*XSTD PSHS AADDA CHKSUMSTA CHKSUMPULS ADEC BYTCNTBNE XSTD1LDU #XSTCXSTD1 STA ,X+ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS** Byte count reached zero* Check checksum byte*XSTC CMPA CHKSUMBNE XSTC1 retry if wrong checksum** Checksum OK ...* increment block number* Don't send ACK until data written to CF*INC BLKNUMLDU #XSTSANDCC #$FF-CFLAG No abortORCC #ZFLAG Valid data (exit)RTS** Checksum Error detected ...* Reset Sector counter in ACCB to last 128 byte boundary* and send NAK*XSTC1 LDX #BUFFERLDA #NAKXSTC2 LBSR OUTTERLDU #XSTSANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS** Acknowledge Data Received*XACK PSHS ALDA #ACKLBSR OUTTERPULS A,PC*** FLEX CALLS*SYSFCB EQU $C840WARMS EQU $CD03OUTCH EQU $CD0FOUTCH2 EQU $CD12GETCHR EQU $CD15PUTCHR EQU $CD18PSTRNG EQU $CD1EGETFIL EQU $CD2DSETEXT EQU $CD33RPTERR EQU $CD3FGETHEX EQU $CD42NXTCH EQU $CD27FMSCLS EQU $D403FMS EQU $D406*** MAIN ENTRY POINT*LOAD1 LDX #SYSFCBJSR >GETFILBCC LOAD2LDB #$15STB $01,XJMP >FMSERRLOAD2 JSR NXTCHANDA #$5FCMPA #'TBNE LOAD3STA TEXTFLLDX #TXTMSGJSR PDATA1BRA OPENWRLOAD3 CMPA #$20BEQ LOAD2*** OPEN FILE FOR WRITE*OPENWR LDX #SYSFCBLDA #$02STA ,XJSR >FMSLBNE DSKERRTST TEXTFLBEQ OPENW1LDA #$01JSR SETEXTBRA OPENW2OPENW1 LDA #$FFSTA $3B,XOPENW2 EQU **LDU #XSTSSTU XSTATELDA #1STA BLKNUM*** WRITE BYTE TO DISK*WRLOOP LDX #BUFFERLBSR XREADLBCS ABORTLDX #BUFFERLDB #128STX BUFPTRSTB BYTCNTWRLP1 LDX BUFPTRLDA ,X+STX BUFPTRTST TEXTFLBEQ WRLP2CMPA #HTBNE WRLP3WRLP4 LDA #$20LDX #SYSFCBJSR FMSINC LINECTLDA LINECTANDA #$07BNE WRLP4BRA WRLP5WRLP3 CMPA #LFBNE WRLP2LDX #SYSFCBJSR FMSBNE DSKERRLDA #CRCLR LINECTDEC LINECTWRLP2 LDX #SYSFCBJSR >FMSBNE DSKERRINC LINECTWRLP5 DEC BYTCNTBNE WRLP1LBSR XACKBRA WRLOOP*** FINISHED LOAD*ABORT LDX #ENDMSGJSR PSTRNGLBSR XACK**** CLOSE FILE*CLOSE LDA #$04LDX #SYSFCBSTA ,XJSR >FMSBEQ EXIT*** ERROR IN CLOSING*DSKERR LDA $01,XFMSERR JSR >RPTERRJSR >FMSCLSEXIT JMP >WARMS*** MESSAGES*ENDMSG FCC "FILE LOADED"FCB $04TXTMSG FCB $0D,$0AFCC "TEXT FILE"FCB $04END START
