URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [upld/] [upld_cf8.asm] - Rev 120
Go to most recent revision | 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** Some dummy Constants*RMAXTRK EQU 48RMAXSEC EQU 14RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC** Start*ORG $0100START LBSR UXSUBJMP [$F800] Jump to monitor on Completion.*** RAM SPACE*DRVNUM FCB 0TRACK FCB 0SECTOR FCB 0CHKSUM FCB 0BLKNUM FCB 0 Xmodem block numberBYTCNT FCB 0 Xmodem byte countXSTATE FDB 0 Xmodem State VectorDELCNT FCB $00,$00,$00 Xmodem Poll timerMAXTRK FCB 0MAXSEC 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 #$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** Print Data*PDATA0 BSR OUTTERPDATA1 LDA ,X+CMPA #$04BNE PDATA0RTS*** 'UX' Xmodem ROM Disk upload*UXMES0 FCB $0D,$0AFCC 'Xmodem ROM Disk Upload'FCB 4UXMES1 FCB $0D,$0AFCC 'Upload Complete'FCB 4UXMES2 FCB $0D,$0AFCC 'Upload Error'FCB 4UXMSG3 FCB $0D,$0AFCC 'Drive Number :'FCB 4UXMSG4 FCB $0D,$0AFCC 'Are You Sure ? (Y/N)'FCB 4** Print Banner*UXSUB LDX #UXMES0LBSR PDATA1** Prompt for Disk drive number (0 to 3)*LDX #UXMSG3LBSR PDATA1UXSUB1 LBSR INTERBVS UXSUB1LBSR OUTTERCMPA #'0LBLO UXEXITCMPA #'3LBHI UXEXITSUBA #'0STA DRVNUM** Report selected drive*LDX #UXMSG3LBSR PDATA1LDA DRVNUMADDA #'0LBSR OUTTER** Ask for confirmation (Y/N)*LDX #UXMSG4LBSR PDATA1UXSUB2 LBSR INTERBVS UXSUB2LBSR OUTTERANDA #$5FCMPA #'NLBEQ UXEXITCMPA #'YBNE UXSUB** We have confirmation ... now load the disk image*LBSR INITDRLDU #XSTSTSTU XSTATELDA #1STA BLKNUM** Sector1*LDX #BUFFER*CLRA TRACK 0LDB #$01 SECTOR 1STA TRACKSTB SECTOR*LBSR XREADLBCS UXERRLBSR XACKLBSR XREADLBCS UXERR*LDX #BUFFERLDA TRACKLDB SECTORLBSR WRITSCLBSR XACK** Sector 2*LDX #BUFFER*LDA TRACKLDB SECTORINCBSTA TRACKSTB SECTOR*LBSR XREADLBCS UXERRLBSR XACKLBSR XREADLBCS UXERR*LDX #BUFFERLDA TRACKLDB SECTORLBSR WRITSC*LBSR XACK** Sector 3 - SIR*LDX #BUFFER*LDA TRACKLDB SECTORINCBSTA TRACKSTB SECTOR*LBSR XREADLBCS UXERRLBSR XACKLBSR XREADLBCS UXERR*LDX #BUFFERLDA 38,XINCASTA MAXTRKLDB 39,XINCBSTB MAXSECLDA TRACKLDB SECTORLBSR WRITSC*LBSR XACK** Sector 4 to Last Track & Sector**LDA TRACKLDB SECTORINCB*UXLOOP LDX #BUFFERSTA TRACKSTB SECTOR*LBSR XREADLBCS UXERRLBSR XACKLBSR XREADLBCS UXERR*LDX #BUFFERLDA TRACKLDB SECTORLBSR WRITSCLBSR XACK*LDA TRACKLDB SECTORINCBCMPB MAXSECBNE UXLOOPLDB #1INCACMPA MAXTRKBNE UXLOOP*** Write Boot sector*LDX #$C000CLRA TRACK 0LDB #$01 SECTOR 1STA TRACKSTB SECTORLBSR WRITSC*UXEXIT LDX #UXMES1JMP PDATA1*UXERR LDX #UXMES2LBRA PDATA1** Get a Byte using XModem protocol* Carry clear => no errors* Carry set => errors*XREAD PSHS ULDU XSTATE*XBYTE0 LBSR INTERBVC XBYTE1LDA #NAKLBSR OUTTERLDU #XSTSTBRA XBYTE0*XBYTE1 JSR ,UBNE XBYTE0STU XSTATEPULS U,PC** START - LOOK FOR SOH (START OF HEADER) = $01*XSTST CMPA #SOHBNE XSTST1LDU #XSTBLANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS*XSTST1 CMPA #EOTBNE XSTST2LDA #ACKLBSR OUTTERORCC #CFLAG+ZFLAG Set (c)=1 abort & exitRTS*XSTST2 CMPA #CANBNE XSTST3ORCC #CFLAG+ZFLAG Set (c)=1 abort & exitRTS*XSTST3 ANDCC #$FF-CFLAG-ZFLAGRTS** Got SOH* Now get block number*XSTBL CMPA BLKNUMBNE XSTBLELDU #XSTCOMANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Error in block number*XSTBLE LDA #NAKLBSR OUTTERLDU #XSTSTANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Get complement of block number*XSTCOM COMACMPA BLKNUMBNE XSTBLECLR CHKSUMLDA #128STA BYTCNTLDU #XSTDAANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Get data bytes*XSTDA PSHS AADDA CHKSUMSTA CHKSUMPULS ADEC BYTCNTBNE XSTDA1LDU #XSTCKXSTDA1 STA ,X+ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS** Byte count reached zero* Check checksum byte*XSTCK CMPA CHKSUMBNE XSTCK1 retry if wrong checksum** Checksum OK ...* increment block number* Don't send ACK until data written to CF*INC BLKNUMLDU #XSTSTANDCC #$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*XSTCK1 PSHS BTFR X,DDECBANDB #128TFR D,XPULS BLDA #NAKXSTCK2 LBSR OUTTERLDU #XSTSTANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS** Acknowledge Data Received*XACK PSHS ALDA #ACKLBSR OUTTERPULS A,PC**** FLEX 9 COMPACT FLASH DISK DRIVERS** FOR SYS09BUG 1.2 ON THE BURCHED B5-X300* WITH I/O MAPPED AT $XE000* AND ROM MAPPED AT $XF000* THE BURCHED B5-X300 HAS 256KBYTES OF SRAM* THE FIRST 64K IS USED BY FLEX,* THE SECOND 192K MAY BE USED AS A RAM DISK**IMASK EQU $10 IRQ MASK CCFMASK EQU $40 FIRQ MASK CCDATREG EQU $FFF0 DAT REGISTERS*CF_BASE EQU $E040CF_DATA EQU CF_BASE+0CF_ERROR EQU CF_BASE+1 ; read errorCF_FEATURE EQU CF_BASE+1 ; write featureCF_SCNT EQU CF_BASE+2CF_SNUM EQU CF_BASE+3CF_CLO EQU CF_BASE+4CF_CHI EQU CF_BASE+5CF_HEAD EQU CF_BASE+6CF_STATUS EQU CF_BASE+7 ; read statusCF_COMAND EQU CF_BASE+7 ; write command** Command Equates*CMDREAD EQU $20 ; Read Single sectorCMDWRITE EQU $30 ; Write Single sectorCMDFEATURE EQU $EFFEAT8BIT EQU $01 ; enable 8 bit transfersHEADLBA EQU $E0** Status bit equates*BSY EQU $80DRDY EQU $40DRQ EQU $08ERR EQU $01*** INITIALIZE CF CARD FOR 8 BIT LBA MODE*INITDR BSR WAITRDYLDA #HEADLBASTA CF_HEADLDA #FEAT8BITSTA CF_FEATURELDA #CMDFEATURESTA CF_COMANDBRA WAITRDY** Seek track and sector* A holds track number (0 - ??)* B holds sector number (1 - ??)* Sector numbers starts from 1* subtract 1 to start from sector 0 on CF*SEEKTS DECBSTB CF_SNUMSTA CF_CLOLDB DRVNUMSTB CF_CHILDB #$01STB CF_SCNTCLRBRTS** READ SECTORS FROM CF**READSC BSR SEEKTSLDA #CMDREAD ; IDE READ MULTIPLESTA CF_COMANDBSR WAITRDY** READ LOOP*CLRBRDLP1 BSR WAITDRQLDA CF_DATASTA ,X+DECBBNE RDLP1*CLRBRDLP2 BSR WAITDRQLDA CF_DATADECBBNE RDLP2*BSR WAITRDYCLRBRTS** WRITE SECTOR TO CF*WRITSC BSR SEEKTS ; SEEK TRACK & SECTORLDA #CMDWRITE ; IDE WRITE MULTIPLESTA CF_COMANDBSR WAITRDY** WRITE LOOP*CLRBWRTLP1 BSR WAITDRQLDA ,X+STA CF_DATADECBBNE WRTLP1*CLRBWRTLP2 BSR WAITDRQCLRASTA CF_DATADECBBNE WRTLP2*BSR WAITRDYCLRBRTS** CHECK FOR BUSY* Doubles as VERIFY*BUSY CLRB Never busyRTS** DRIVE SELECT DISK DRIVER*DRVSEL LDA 3,X GET DRIVE # FROM FCBCMPA #3BLS DRVS2 IF > 3, SET IT TO 0CLRADRVS2 STA DRVNUMCLRB ; SET Z, CLEAR CRTS** CHECK DRIVE READY DISK DRIVER*CHKDRV LDA 3,XCLRB ; CLEAR C, SET ZRTS** WAIT UNTIL READY*WAITRDY LDA CF_STATUSBITA #BSYBNE WAITRDYLDA CF_STATUSBITA #DRDYBEQ WAITRDYRTS** WAIT FOR DATA REQUEST*WAITDRQ LDA CF_STATUSBITA #DRQBEQ WAITDRQRTS********************************************************** Bootstrap FLEX Loader** SBUG1.8 loads the bootstap loader at $C000* however the Flex adaption manual has the* bootstrap loader residing at $C100********************************************************* Equates*STACK EQU $C0FFSCTBUF EQU $C300** Start of Utility*ORG $C000BOOT BRA LOAD0FCB 0,0,0TRK FCB 0 File start trackSCT FCB 0 File start sectorDNS FCB 0 Density Flag (not used)TADR FDB $C000 Transfer addressLADR FDB 0 Load AddressDRNUM FCB 0 Drive number 0*LOAD0 LDS #STACK Set up stackLDD TRK Set up start track and sectorSTD SCTBUFLDY #SCTBUF+256** Perform actual file load*LOAD1 BSR GETCH Get acharcaterCMPA #$02 Data record hearder ?BEQ LOAD2 Skip, is soCMPA #$16 Xfr address hearder ?BNE LOAD1 Loop if neither** Get transfer address*BSR GETCHSTA TADRBSR GETCHSTA TADR+1BRA LOAD1** Load data record*LOAD2 BSR GETCH Get load addressSTA LADRBSR GETCHSTA LADR+1BSR GETCH Get Bytes countTFR A,BTSTBBEQ LOAD1 Loop if count = 0LDX LADR Get load addressLOAD3 PSHS B,XBSR GETCH Get data characterPULS B,XSTA ,X+ Store at load addressDECBBNE LOAD3 Loop until count = 0BRA LOAD1** Get Character routine* Reads a sector if needed*GETCH CMPY #SCTBUF+256 out of data ?BNE GETCH4 Go read Character if notGETCH2 LDX #SCTBUF Point to bufferLDD 0,X Get forward LinkBEQ GO if zero, file is loadedBSR READ Read next sectorBNE BOOT start over if errorLDY #SCTBUF+4 Point past linkGETCH4 LDA ,Y+ Else, get a characterRTS** File is loaded, Jump to it*GO JMP [TADR] Jump to transfer address*** FLEX 9 COMPACT FLASH DISK DRIVERS** FOR SYS09BUG 1.2 ON THE BURCHED B5-X300* WITH I/O MAPPED AT $XE000* AND ROM MAPPED AT $XF000* THE BURCHED B5-X300 HAS 256KBYTES OF SRAM* THE FIRST 64K IS USED BY FLEX,* THE SECOND 192K MAY BE USED AS A RAM DISK***IMASK EQU $10 IRQ MASK CC*FMASK EQU $40 FIRQ MASK CC*DATREG EQU $FFF0 DAT REGISTERS**CF_BASE EQU $E040*CF_DATA EQU CF_BASE+0*CF_ERROR EQU CF_BASE+1 ; read error*CF_FEATURE EQU CF_BASE+1 ; write feature*CF_SCNT EQU CF_BASE+2*CF_SNUM EQU CF_BASE+3*CF_CLO EQU CF_BASE+4*CF_CHI EQU CF_BASE+5*CF_HEAD EQU CF_BASE+6*CF_STATUS EQU CF_BASE+7 ; read status*CF_COMAND EQU CF_BASE+7 ; write command** Command Equates**CMDREAD EQU $20 ; Read Single sector*CMDWRITE EQU $30 ; Write Single sector*CMDFEATURE EQU $EF*FEAT8BIT EQU $01 ; enable 8 bit transfers*HEADLBA EQU $E0** Status bit equates**BSY EQU $80*DRDY EQU $40*DRQ EQU $08*ERR EQU $01** Seek track and sector* A holds track number (0 - ??)* B holds sector number (1 - ??)* Sector numbers starts from 1* subtract 1 to start from sector 0 on CF*SEEK DECBSTB CF_SNUMSTA CF_CLOLDB DRNUMSTB CF_CHILDB #$01STB CF_SCNTCLRBRTS** READ SECTORS FROM CF**READ BSR SEEKLDA #CMDREAD ; IDE READ MULTIPLESTA CF_COMANDBSR WTRDY** READ LOOP*CLRBREAD1 BSR WTDRQLDA CF_DATASTA ,X+DECBBNE READ1*CLRBREAD2 BSR WTDRQLDA CF_DATADECBBNE READ2*BSR WTRDYCLRBRTS** WAIT UNTIL READY*WTRDY LDA CF_STATUSBITA #BSYBNE WTRDYLDA CF_STATUSBITA #DRDYBEQ WTRDYRTS** WAIT FOR DATA REQUEST*WTDRQ LDA CF_STATUSBITA #DRQBEQ WTDRQRTS*END START
Go to most recent revision | Compare with Previous | Blame | View Log
