URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [fmt/] [fmt_cf8.asm] - Rev 78
Go to most recent revision | Compare with Previous | Blame | View Log
*** FLEX 9 COMPACT FLASH FORMAT PROGRAM** FOR B5-X300 and CF with 8 Bit Transfer interface**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 64RMAXSEC EQU 255RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC** Start*ORG $0100START LBSR UFSUBJMP [$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*** recieve char from remote drive.* timeout if no response for approx 1s.* Entry: no parameters* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.*RCHAR PSHS X,Y*LDX #1000 1000x inner loopRCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).RCHAR2 LDA ACIAC1 test for recieved charASRABCS RCHAR3 get characterLEAY -1,Y else, continue to count delayBNE RCHAR2LEAX -1,XBNE RCHAR1PULS X,Y,PC return with error if timed out*RCHAR3 LDA ACIAD1 return data (carry bit still set)PULS X,Y,PC*** transmit char to remote drive.* timeout if no response for approx 1s. (allows for use of hardware flow control)* Entry: (A) = char to transmit* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.*SCHAR PSHS X,YPSHS A*LDX #1000 1000x inner loopSCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).SCHAR2 LDA ACIAC1 test for space in transmit FIFOASRAASRABCS SCHAR3 send characterLEAY -1,Y else, continue to count delayBNE SCHAR2LEAX -1,XBNE SCHAR1PULS APULS X,Y,PC return with error if timed out*SCHAR3 PULS ASTA ACIAD1 send data (carry bit still set)PULS X,Y,PC** Print Data*PDATA0 BSR SCHARPDATA1 LDA ,X+CMPA #$04BNE PDATA0RTS*** 'UF' Format RAMdisc to FLEX standard.*DISFOS FCB $0A,$0DFCC 'Formating RAMdisk... 'FCB $0A,$0DFCC 'Drive Number ?'FCB 4MESS6 FCB $0A,$0D,4FCC 'Ramdisk not allocated! 'FCB 4UFMSG1 FCB $0A,$0DFCC 'Format Complete'FCB 4*UFSUB JSR INITDRLDX #DISFOSJSR PDATA1UFSUB1 LBSR RCHARBCC UFSUB1LBSR SCHARCMPA #'0'LBLO UFEXITCMPA #'3'LBHI UFEXITSUBA #'0'TFR A,BSTB DRVNUMLDX #DRVNUM-3JSR DRVSEL** set up free chain*LDX #BUFFER clear out bufferCLRACLRBDFL1 STA 0,X+DECBBNE DFL1*CLR TRACKLDA #1STA SECTORDFL2 LDX #BUFFERLDA TRACKSTA 0,XLDA SECTORINCACMPA #RMAXSEC+1 last sector on track?BNE DFL3INC 0,XLDA #1DFL3 STA 1,XLDA TRACKLDB SECTORJSR WRITSCINC SECTORLDA SECTORCMPA #RMAXSEC+1BNE DFL2LDA #1STA SECTORINC TRACKLDA TRACKCMPA #RMAXTRKBNE DFL2* break free chain at last track/sectorLDX #BUFFERLDA #RMAXTRK-1LDB #RMAXSECJSR READSCLDX #BUFFERCLR 0,XCLR 1,XLDA #RMAXTRK-1LDB #RMAXSECJSR WRITSC* set up sector structure, SIR, directory etcLDX #BUFFERCLRALDB #RMAXSECJSR READSCLDX #BUFFERCLR 0,X break end of directory chainCLR 1,XCLRALDB #RMAXSECJSR WRITSC*LDX #BUFFERCLRALDB #3 set up SIRJSR READSCLDX #BUFFERCLR 0,X break forward linkCLR 1,XLDD #$5241 set volume name (RAMDISK )STD 16,XLDD #$4D44STD 18,XLDD #$4953STD 20,XLDD #$4B20STD 22,XLDD #1 volume numberSTD 27,XLDD #$0101 first trk/sec 01-01STD 29,XLDA #RMAXTRK-1LDB #RMAXSECSTD 31,XSTD 38,XLDD #RTOTSEC total DATA sectors (2912-14)STD 33,X*LDA #01 month set default creation date (SYS09's birthday!)STA 35,XLDA #07 daySTA 36,XLDA #07 yearSTA 37,X*RF3 CLRALDB #3JSR WRITSC** LDX #BUFFER* CLRA* LDB #1* JSR READSC* LDX #BUFFER* LDA #$AA set the init flag* STA 0,X* LDA #$55* STA 1,X* CLRA* LDB #1* JSR WRITSC** Write Boot sector*LDX #$C000CLRA TRACK 0LDB #$01 SECTOR 1STA TRACKSTB SECTORLBSR WRITSC*UFEXIT LDX #UFMSG1JMP PDATA1**** 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** RESTORE DISK DRIVER (SEEK TRACK 00)*RESTR1 BSR DRVSELCLRA ; Track 0LDB #$01 ; Sector 1** 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
