LOGIN   :::   RECOVER PASS   :::   GET ACCOUNT    
Browse
  • Projects
  • Code (CVS)
  • Forums
  • News
  • Articles
  • Polls
  •  
    OpenCores
  • FAQ
  • CVS HowTo
  • Mission
  • Media
  • Tools
  • Advertise
  • Mirrors
  • Logos
  • Contact us
  • Job Opportunity
  •  
    Tools
  • Search
      
  • Download Cores (CVSGet)
  •  
    More
  • Wishbone
  • Perlilog
  • EDA tools
  • OpenTech CD
  •  
    Navigation: All forums > Cvs-checkins > Message List > Message Post

    Message

    Reply | Reply all
    Date Prev | Date Next | Thread Prev | Thread Next Date Index | Thread Index

    From: cvs at opencores.org<cvs@o...>
    Date: Fri Mar 14 16:52:52 CET 2008
    Subject: [cvs-checkins] MODIFIED: System09 ...
    Top
    Date: 00/08/03 14:16:52

    Added: System09/src/fmt fmt_cf8.lst fmt_cf8.s19 fmt_cf8.sh
    fmt_cf8.txt fmt_ide.lst fmt_ide.s19 fmt_ide.sh
    fmt_ide.txt
    Log:
    Updated software - XSA-3S1000 now runs FLEX on an IDE drive or CF card.


    Revision Changes Path
    1.1 System09/src/fmt/fmt_cf8.lst

    http://www.opencores.org/cvsweb.shtml/System09/src/fmt/fmt_cf8.lst?rev=1.1&content-type=text/x-cvsweb-markup

    Index: fmt_cf8.lst
    ===================================================================
    Assembler release DWC_2.0 version 2.11
    May 6, 2004 (c) Motorola (free ware)
    0001 *
    0002 ** FLEX 9 COMPACT FLASH FORMAT PROGRAM
    0003 *
    0004 * FOR B5-X300 and CF with 8 Bit Transfer interface
    0005 *
    0006 *
    0007 0001 CFLAG EQU $01 CARRY FLAG
    0008 0002 VFLAG EQU $02 OVERFLOW FLAG
    0009 0004 ZFLAG EQU $04 ZERO FLAG
    0010 0008 NFLAG EQU $08 NEGATIVE FLAG
    0011 0010 IFLAG EQU $10 IRQ MASK CC
    0012 0020 HFLAG EQU $20 HALF CARRY
    0013 0040 FFLAG EQU $40 FIRQ MASK CC
    0014 0080 EFLAG EQU $80 ENTIRE FLAG
    0015 *
    0016 0000 MAPPAG EQU $00 PAGE $0000 DAT ADDRESS
    0017 *
    0018 * Serial Port
    0019 *
    0020 E000 ACIAS EQU $E000
    0021 E000 ACIAC1 EQU ACIAS
    0022 E001 ACIAD1 EQU ACIAS+1
    0023 04E2 DELCON EQU 1250 Delay (Processor clock in MHz * 50)
    0024 *
    0025 * XMODEM Control characters
    0026 *
    0027 0001 SOH EQU $01
    0028 0004 EOT EQU $04
    0029 0006 ACK EQU $06
    0030 0015 NAK EQU $15
    0031 0018 CAN EQU $18
    0032 *
    0033 * Some dummy Constants
    0034 *
    0035 0040 RMAXTRK EQU 64
    0036 00FF RMAXSEC EQU 255
    0037 3EC1 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
    0038 *
    0039 * Start
    0040 *
    0041 0100 ORG $0100
    0042 0100 17 02 9E START LBSR UFSUB
    0043 0103 6E 9F F8 00 JMP [$F800] Jump to monitor on Completion.
    0044 *
    0045 *
    0046 * RAM SPACE
    0047 *
    0048 0107 00 DRVNUM FCB 0
    0049 0108 00 TRACK FCB 0
    0050 0109 00 SECTOR FCB 0
    0051 010A 00 CHKSUM FCB 0
    0052 010B 00 BLKNUM FCB 0 Xmodem block number
    0053 010C 00 BYTCNT FCB 0 Xmodem byte count
    0054 010D 00 00 XSTATE FDB 0 Xmodem State Vector
    0055 010F 00 00 00 DELCNT FCB $00,$00,$00 Xmodem Poll timer
    0056 0112 00 MAXTRK FCB 0
    0057 0113 00 MAXSEC FCB 0
    0058 0200 ORG $0200
    0059 *
    0060 * SECTOR BUFFER
    0061 *
    0062 0200 BUFFER RMB 256
    0063 *
    0064 *
    0065 * recieve char from remote drive.
    0066 * timeout if no response for approx 1s.
    0067 * Entry: no parameters
    0068 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
    0069 *
    0070 0300 34 30 RCHAR PSHS X,Y
    0071 *
    0072 0302 8E 03 E8 LDX #1000 1000x inner loop
    0073 0305 10 8E 04 E2 RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
    0074 0309 B6 E0 00 RCHAR2 LDA ACIAC1 test for recieved char
    0075 030C 47 ASRA
    0076 030D 25 0A BCS RCHAR3 get character
    0077 030F 31 3F LEAY -1,Y else, continue to count delay
    0078 0311 26 F6 BNE RCHAR2
    0079 0313 30 1F LEAX -1,X
    0080 0315 26 EE BNE RCHAR1
    0081 0317 35 B0 PULS X,Y,PC return with error if timed out
    0082 *
    0083 0319 B6 E0 01 RCHAR3 LDA ACIAD1 return data (carry bit still set)
    0084 031C 35 B0 PULS X,Y,PC
    0085 * 0086 * 0087 * transmit char to remote drive. 0088 * timeout if no response for approx 1s. (allows for use of hardware flow control) 0089 * Entry: (A) = char to transmit 0090 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. 0091 * 0092 031E 34 30 SCHAR PSHS X,Y 0093 0320 34 02 PSHS A 0094 * 0095 0322 8E 03 E8 LDX #1000 1000x inner loop 0096 0325 10 8E 04 E2 SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). 0097 0329 B6 E0 00 SCHAR2 LDA ACIAC1 test for space in transmit FIFO 0098 032C 47 ASRA 0099 032D 47 ASRA 0100 032E 25 0C BCS SCHAR3 send character 0101 0330 31 3F LEAY -1,Y else, continue to count delay 0102 0332 26 F5 BNE SCHAR2 0103 0334 30 1F LEAX -1,X 0104 0336 26 ED BNE SCHAR1 0105 0338 35 02 PULS A 0106 033A 35 B0 PULS X,Y,PC return with error if timed out 0107 * 0108 033C 35 02 SCHAR3 PULS A 0109 033E B7 E0 01 STA ACIAD1 send data (carry bit still set) 0110 0341 35 B0 PULS X,Y,PC 0111 * 0112 * Print Data 0113 * 0114 0343 8D D9 PDATA0 BSR SCHAR 0115 0345 A6 80 PDATA1 LDA ,X+ 0116 0347 81 04 CMPA #$04 0117 0349 26 F8 BNE PDATA0 0118 034B 39 RTS 0119 * 0120 ** 'UF' Format RAMdisc to FLEX standard. 0121 * 0122 034C 0A 0D DISFOS FCB $0A,$0D 0123 034E 46 6F 72 6D 61 74 FCC 'Formating RAMdisk... ' 69 6E 67 20 52 41 4D 64 69 73 6B 2E 2E 2E 20 0124 0363 0A 0D FCB $0A,$0D 0125 0365 44 72 69 76 65 20 FCC 'Drive Number ?' 4E 75 6D 62 65 72 20 3F 0126 0373 04 FCB 4 0127 0374 0A 0D 04 MESS6 FCB $0A,$0D,4 0128 0377 52 61 6D 64 69 73 FCC 'Ramdisk not allocated! ' 6B 20 6E 6F 74 20 61 6C 6C 6F 63 61 74 65 64 21 20 0129 038E 04 FCB 4 0130 038F 0A 0D UFMSG1 FCB $0A,$0D 0131 0391 46 6F 72 6D 61 74 FCC 'Format Complete' 20 43 6F 6D 70 6C 65 74 65 0132 03A0 04 FCB 4 0133 * 0134 03A1 BD 04 B1 UFSUB JSR INITDR 0135 03A4 8E 03 4C LDX #DISFOS 0136 03A7 BD 03 45 JSR PDATA1 0137 03AA 17 FF 53 UFSUB1 LBSR RCHAR 0138 03AD 24 FB BCC UFSUB1 0139 03AF 17 FF 6C LBSR SCHAR 0140 03B2 81 30 CMPA #'0' 0141 03B4 10 25 00 F3 LBLO UFEXIT 0142 03B8 81 33 CMPA #'3' 0143 03BA 10 22 00 ED LBHI UFEXIT 0144 03BE 80 30 SUBA #'0' 0145 03C0 1F 89 TFR A,B 0146 03C2 F7 01 07 STB DRVNUM 0147 03C5 8E 01 04 LDX #DRVNUM-3 0148 03C8 BD 05 22 JSR DRVSEL 0149 * 0150 * set up free chain 0151 * 0152 03CB 8E 02 00 LDX #BUFFER clear out buffer 0153 03CE 4F CLRA 0154 03CF 5F CLRB 0155 03D0 A7 80 DFL1 STA 0,X+ 0156 03D2 5A DECB 0157 03D3 26 FB BNE DFL1 0158 * 0159 03D5 7F 01 08 CLR TRACK 0160 03D8 86 01 LDA #1 0161 03DA B7 01 09 STA SECTOR 0162 03DD 8E 02 00 DFL2 LDX #BUFFER 0163 03E0 B6 01 08 LDA TRACK 0164 03E3 A7 84 STA 0,X 0165 03E5 B6 01 09 LDA SECTOR 0166 03E8 4C INCA 0167 03E9 81 00 CMPA #RMAXSEC+1 last sector on track? 0168 03EB 26 04 BNE DFL3 0169 03ED 6C 84 INC 0,X 0170 03EF 86 01 LDA #1 0171 03F1 A7 01 DFL3 STA 1,X 0172 03F3 B6 01 08 LDA TRACK 0173 03F6 F6 01 09 LDB SECTOR 0174 03F9 BD 04 FE JSR WRITSC 0175 03FC 7C 01 09 INC SECTOR 0176 03FF B6 01 09 LDA SECTOR 0177 0402 81 00 CMPA #RMAXSEC+1 0178 0404 26 D7 BNE DFL2 0179 0406 86 01 LDA #1 0180 0408 B7 01 09 STA SECTOR 0181 040B 7C 01 08 INC TRACK 0182 040E B6 01 08 LDA TRACK 0183 0411 81 40 CMPA #RMAXTRK 0184 0413 26 C8 BNE DFL2 0185 * break free chain at last track/sector 0186 0415 8E 02 00 LDX #BUFFER 0187 0418 86 3F LDA #RMAXTRK-1 0188 041A C6 FF LDB #RMAXSEC 0189 041C BD 04 DD JSR READSC 0190 041F 8E 02 00 LDX #BUFFER 0191 0422 6F 84 CLR 0,X 0192 0424 6F 01 CLR 1,X 0193 0426 86 3F LDA #RMAXTRK-1 0194 0428 C6 FF LDB #RMAXSEC 0195 042A BD 04 FE JSR WRITSC 0196 * set up sector structure, SIR, directory etc 0197 042D 8E 02 00 LDX #BUFFER 0198 0430 4F CLRA 0199 0431 C6 FF LDB #RMAXSEC 0200 0433 BD 04 DD JSR READSC 0201 0436 8E 02 00 LDX #BUFFER 0202 0439 6F 84 CLR 0,X break end of directory chain 0203 043B 6F 01 CLR 1,X 0204 043D 4F CLRA 0205 043E C6 FF LDB #RMAXSEC 0206 0440 BD 04 FE JSR WRITSC 0207 * 0208 0443 8E 02 00 LDX #BUFFER 0209 0446 4F CLRA 0210 0447 C6 03 LDB #3 set up SIR 0211 0449 BD 04 DD JSR READSC 0212 044C 8E 02 00 LDX #BUFFER 0213 044F 6F 84 CLR 0,X break forward link 0214 0451 6F 01 CLR 1,X 0215 0453 CC 52 41 LDD #$5241 set volume name (RAMDISK ) 0216 0456 ED 88 10 STD 16,X 0217 0459 CC 4D 44 LDD #$4D44 0218 045C ED 88 12 STD 18,X 0219 045F CC 49 53 LDD #$4953 0220 0462 ED 88 14 STD 20,X 0221 0465 CC 4B 20 LDD #$4B20 0222 0468 ED 88 16 STD 22,X 0223 046B CC 00 01 LDD #1 volume number 0224 046E ED 88 1B STD 27,X 0225 0471 CC 01 01 LDD #$0101 first trk/sec 01-01 0226 0474 ED 88 1D STD 29,X 0227 0477 86 3F LDA #RMAXTRK-1 0228 0479 C6 FF LDB #RMAXSEC 0229 047B ED 88 1F STD 31,X 0230 047E ED 88 26 STD 38,X 0231 0481 CC 3E C1 LDD #RTOTSEC total DATA sectors (2912-14) 0232 0484 ED 88 21 STD 33,X 0233 * 0234 0487 86 01 LDA #01 month set default creation date (SYS09's birthday!) 0235 0489 A7 88 23 STA 35,X 0236 048C 86 07 LDA #07 day 0237 048E A7 88 24 STA 36,X 0238 0491 86 07 LDA #07 year 0239 0493 A7 88 25 STA 37,X 0240 * 0241 0496 4F RF3 CLRA 0242 0497 C6 03 LDB #3 0243 0499 BD 04 FE JSR WRITSC 0244 * 0245 * LDX #BUFFER 0246 * CLRA 0247 * LDB #1 0248 * JSR READSC 0249 * LDX #BUFFER 0250 * LDA #$AA set the init flag 0251 * STA 0,X 0252 * LDA #$55 0253 * STA 1,X 0254 * CLRA 0255 * LDB #1 0256 * JSR WRITSC 0257 * 0258 * Write Boot sector 0259 * 0260 049C 8E C0 00 LDX #$C000 0261 049F 4F CLRA TRACK 0 0262 04A0 C6 01 LDB #$01 SECTOR 1 0263 04A2 B7 01 08 STA TRACK 0264 04A5 F7 01 09 STB SECTOR 0265 04A8 17 00 53 LBSR WRITSC 0266 * 0267 04AB 8E 03 8F UFEXIT LDX #UFMSG1 0268 04AE 7E 03 45 JMP PDATA1 0269 * 0270 * 0271 ** FLEX 9 COMPACT FLASH DISK DRIVERS 0272 * 0273 * FOR SYS09BUG 1.2 ON THE BURCHED B5-X300 0274 * WITH I/O MAPPED AT $XE000 0275 * AND ROM MAPPED AT $XF000 0276 * THE BURCHED B5-X300 HAS 256KBYTES OF SRAM 0277 * THE FIRST 64K IS USED BY FLEX, 0278 * THE SECOND 192K MAY BE USED AS A RAM DISK 0279 * 0280 * 0281 0010 IMASK EQU $10 IRQ MASK CC 0282 0040 FMASK EQU $40 FIRQ MASK CC 0283 FFF0 DATREG EQU $FFF0 DAT REGISTERS 0284 * 0285 E040 CF_BASE EQU $E040 0286 E040 CF_DATA EQU CF_BASE+0 0287 E041 CF_ERROR EQU CF_BASE+1 ; read error 0288 E041 CF_FEATURE EQU CF_BASE+1 ; write feature 0289 E042 CF_SCNT EQU CF_BASE+2 0290 E043 CF_SNUM EQU CF_BASE+3 0291 E044 CF_CLO EQU CF_BASE+4 0292 E045 CF_CHI EQU CF_BASE+5 0293 E046 CF_HEAD EQU CF_BASE+6 0294 E047 CF_STATUS EQU CF_BASE+7 ; read status 0295 E047 CF_COMAND EQU CF_BASE+7 ; write command 0296 * 0297 * Command Equates 0298 * 0299 0020 CMDREAD EQU $20 ; Read Single sector 0300 0030 CMDWRITE EQU $30 ; Write Single sector 0301 00EF CMDFEATURE EQU $EF 0302 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers 0303 00E0 HEADLBA EQU $E0 0304 * 0305 * Status bit equates 0306 * 0307 0080 BSY EQU $80 0308 0040 DRDY EQU $40 0309 0008 DRQ EQU $08 0310 0001 ERR EQU $01 0311 * 0312 * 0313 * INITIALIZE CF CARD FOR 8 BIT LBA MODE 0314 * 0315 04B1 8D 7F INITDR BSR WAITRDY 0316 04B3 86 E0 LDA #HEADLBA 0317 04B5 B7 E0 46 STA CF_HEAD 0318 04B8 86 01 LDA #FEAT8BIT 0319 04BA B7 E0 41 STA CF_FEATURE 0320 04BD 86 EF LDA #CMDFEATURE 0321 04BF B7 E0 47 STA CF_COMAND 0322 04C2 20 6E BRA WAITRDY 0323 * 0324 * RESTORE DISK DRIVER (SEEK TRACK 00) 0325 * 0326 04C4 8D 5C RESTR1 BSR DRVSEL 0327 04C6 4F CLRA ; Track 0 0328 04C7 C6 01 LDB #$01 ; Sector 1 0329 * 0330 * Seek track and sector 0331 * A holds track number (0 - ??) 0332 * B holds sector number (1 - ??) 0333 * Sector numbers starts from 1 0334 * subtract 1 to start from sector 0 on CF 0335 * 0336 04C9 5A SEEKTS DECB 0337 04CA F7 E0 43 STB CF_SNUM 0338 04CD B7 E0 44 STA CF_CLO 0339 04D0 F6 01 07 LDB DRVNUM 0340 04D3 F7 E0 45 STB CF_CHI 0341 04D6 C6 01 LDB #$01 0342 04D8 F7 E0 42 STB CF_SCNT 0343 04DB 5F CLRB 0344 04DC 39 RTS 0345 * 0346 * READ SECTORS FROM CF 0347 * 0348 * 0349 04DD 8D EA READSC BSR SEEKTS 0350 04DF 86 20 LDA #CMDREAD ; IDE READ MULTIPLE 0351 04E1 B7 E0 47 STA CF_COMAND 0352 04E4 8D 4C BSR WAITRDY 0353 * 0354 * READ LOOP 0355 * 0356 04E6 5F CLRB 0357 04E7 8D 58 RDLP1 BSR WAITDRQ 0358 04E9 B6 E0 40 LDA CF_DATA 0359 04EC A7 80 STA ,X+ 0360 04EE 5A DECB 0361 04EF 26 F6 BNE RDLP1 0362 * 0363 04F1 5F CLRB 0364 04F2 8D 4D RDLP2 BSR WAITDRQ 0365 04F4 B6 E0 40 LDA CF_DATA 0366 04F7 5A DECB 0367 04F8 26 F8 BNE RDLP2 0368 * 0369 04FA 8D 36 BSR WAITRDY 0370 04FC 5F CLRB 0371 04FD 39 RTS 0372 * 0373 * WRITE SECTOR TO CF 0374 * 0375 04FE 8D C9 WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR 0376 0500 86 30 LDA #CMDWRITE ; IDE WRITE MULTIPLE 0377 0502 B7 E0 47 STA CF_COMAND 0378 0505 8D 2B BSR WAITRDY 0379 * 0380 * WRITE LOOP 0381 * 0382 0507 5F CLRB 0383 0508 8D 37 WRTLP1 BSR WAITDRQ 0384 050A A6 80 LDA ,X+ 0385 050C B7 E0 40 STA CF_DATA 0386 050F 5A DECB 0387 0510 26 F6 BNE WRTLP1 0388 * 0389 0512 5F CLRB 0390 0513 8D 2C WRTLP2 BSR WAITDRQ 0391 0515 4F CLRA 0392 0516 B7 E0 40 STA CF_DATA 0393 0519 5A DECB 0394 051A 26 F7 BNE WRTLP2 0395 * 0396 051C 8D 14 BSR WAITRDY 0397 051E 5F CLRB 0398 051F 39 RTS 0399 * 0400 * CHECK FOR BUSY 0401 * Doubles as VERIFY 0402 * 0403 0520 5F BUSY CLRB Never busy 0404 0521 39 RTS 0405 * 0406 * DRIVE SELECT DISK DRIVER 0407 * 0408 0522 A6 03 DRVSEL LDA 3,X GET DRIVE # FROM FCB 0409 0524 81 03 CMPA #3 0410 0526 23 01 BLS DRVS2 IF > 3, SET IT TO 0 0411 0528 4F CLRA 0412 0529 B7 01 07 DRVS2 STA DRVNUM 0413 052C 5F CLRB ; SET Z, CLEAR C 0414 052D 39 RTS 0415 * 0416 * CHECK DRIVE READY DISK DRIVER 0417 * 0418 052E A6 03 CHKDRV LDA 3,X 0419 0530 5F CLRB ; CLEAR C, SET Z 0420 0531 39 RTS 0421 * 0422 * WAIT UNTIL READY 0423 * 0424 0532 B6 E0 47 WAITRDY LDA CF_STATUS 0425 0535 85 80 BITA #BSY 0426 0537 26 F9 BNE WAITRDY 0427 0539 B6 E0 47 LDA CF_STATUS 0428 053C 85 40 BITA #DRDY 0429 053E 27 F2 BEQ WAITRDY 0430 0540 39 RTS 0431 * 0432 * WAIT FOR DATA REQUEST 0433 * 0434 0541 B6 E0 47 WAITDRQ LDA CF_STATUS 0435 0544 85 08 BITA #DRQ 0436 0546 27 F9 BEQ WAITDRQ 0437 0548 39 RTS 0438 * 0439 ******************************************************* 0440 * 0441 * Bootstrap FLEX Loader 0442 * 0443 * SBUG1.8 loads the bootstap loader at $C000 0444 * however the Flex adaption manual has the 0445 * bootstrap loader residing at $C100 0446 * 0447 ****************************************************** 0448 * 0449 * Equates 0450 * 0451 C0FF STACK EQU $C0FF 0452 C300 SCTBUF EQU $C300 0453 * 0454 * Start of Utility 0455 * 0456 C000 ORG $C000 0457 C000 20 0B BOOT BRA LOAD0 0458 C002 00 00 00 FCB 0,0,0 0459 C005 00 TRK FCB 0 File start track 0460 C006 00 SCT FCB 0 File start sector 0461 C007 00 DNS FCB 0 Density Flag (not used) 0462 C008 C0 00 TADR FDB $C000 Transfer address 0463 C00A 00 00 LADR FDB 0 Load Address 0464 C00C 00 DRNUM FCB 0 Drive number 0 0465 * 0466 C00D 10 CE C0 FF LOAD0 LDS #STACK Set up stack 0467 C011 FC C0 05 LDD TRK Set up start track and sector 0468 C014 FD C3 00 STD SCTBUF 0469 C017 10 8E C4 00 LDY #SCTBUF+256 0470 * 0471 * Perform actual file load 0472 * 0473 C01B 8D 35 LOAD1 BSR GETCH Get acharcater 0474 C01D 81 02 CMPA #$02 Data record hearder ? 0475 C01F 27 10 BEQ LOAD2 Skip, is so 0476 C021 81 16 CMPA #$16 Xfr address hearder ? 0477 C023 26 F6 BNE LOAD1 Loop if neither 0478 * 0479 * Get transfer address 0480 * 0481 C025 8D 2B BSR GETCH 0482 C027 B7 C0 08 STA TADR 0483 C02A 8D 26 BSR GETCH 0484 C02C B7 C0 09 STA TADR+1 0485 C02F 20 EA BRA LOAD1 0486 * 0487 * Load data record 0488 * 0489 C031 8D 1F LOAD2 BSR GETCH Get load address 0490 C033 B7 C0 0A STA LADR 0491 C036 8D 1A BSR GETCH 0492 C038 B7 C0 0B STA LADR+1 0493 C03B 8D 15 BSR GETCH Get Bytes count 0494 C03D 1F 89 TFR A,B 0495 C03F 5D TSTB 0496 C040 27 D9 BEQ LOAD1 Loop if count = 0 0497 C042 BE C0 0A LDX LADR Get load address 0498 C045 34 14 LOAD3 PSHS B,X 0499 C047 8D 09 BSR GETCH Get data character 0500 C049 35 14 PULS B,X 0501 C04B A7 80 STA ,X+ Store at load address 0502 C04D 5A DECB 0503 C04E 26 F5 BNE LOAD3 Loop until count = 0 0504 C050 20 C9 BRA LOAD1 0505 * 0506 * Get Character routine 0507 * Reads a sector if needed 0508 * 0509 C052 10 8C C4 00 GETCH CMPY #SCTBUF+256 out of data ? 0510 C056 26 0F BNE GETCH4 Go read Character if not 0511 C058 8E C3 00 GETCH2 LDX #SCTBUF Point to buffer 0512 C05B EC 84 LDD 0,X Get forward Link 0513 C05D 27 0B BEQ GO if zero, file is loaded 0514 C05F 8D 21 BSR READ Read next sector 0515 C061 26 9D BNE BOOT start over if error 0516 C063 10 8E C3 04 LDY #SCTBUF+4 Point past link 0517 C067 A6 A0 GETCH4 LDA ,Y+ Else, get a character 0518 C069 39 RTS 0519 * 0520 * File is loaded, Jump to it 0521 * 0522 C06A 6E 9F C0 08 GO JMP [TADR] Jump to transfer address 0523 0524 * 0525 ** FLEX 9 COMPACT FLASH DISK DRIVERS 0526 * 0527 * FOR SYS09BUG 1.2 ON THE BURCHED B5-X300 0528 * WITH I/O MAPPED AT $XE000 0529 * AND ROM MAPPED AT $XF000 0530 * THE BURCHED B5-X300 HAS 256KBYTES OF SRAM 0531 * THE FIRST 64K IS USED BY FLEX, 0532 * THE SECOND 192K MAY BE USED AS A RAM DISK 0533 * 0534 * 0535 *IMASK EQU $10 IRQ MASK CC 0536 *FMASK EQU $40 FIRQ MASK CC 0537 *DATREG EQU $FFF0 DAT REGISTERS 0538 * 0539 *CF_BASE EQU $E040 0540 *CF_DATA EQU CF_BASE+0 0541 *CF_ERROR EQU CF_BASE+1 ; read error 0542 *CF_FEATURE EQU CF_BASE+1 ; write feature 0543 *CF_SCNT EQU CF_BASE+2 0544 *CF_SNUM EQU CF_BASE+3 0545 *CF_CLO EQU CF_BASE+4 0546 *CF_CHI EQU CF_BASE+5 0547 *CF_HEAD EQU CF_BASE+6 0548 *CF_STATUS EQU CF_BASE+7 ; read status 0549 *CF_COMAND EQU CF_BASE+7 ; write command 0550 * 0551 * Command Equates 0552 * 0553 *CMDREAD EQU $20 ; Read Single sector 0554 *CMDWRITE EQU $30 ; Write Single sector 0555 *CMDFEATURE EQU $EF 0556 *FEAT8BIT EQU $01 ; enable 8 bit transfers 0557 *HEADLBA EQU $E0 0558 * 0559 * Status bit equates 0560 * 0561 *BSY EQU $80 0562 *DRDY EQU $40 0563 *DRQ EQU $08 0564 *ERR EQU $01 0565 * 0566 * Seek track and sector 0567 * A holds track number (0 - ??) 0568 * B holds sector number (1 - ??) 0569 * Sector numbers starts from 1 0570 * subtract 1 to start from sector 0 on CF 0571 * 0572 C06E 5A SEEK DECB 0573 C06F F7 E0 43 STB CF_SNUM 0574 C072 B7 E0 44 STA CF_CLO 0575 C075 F6 C0 0C LDB DRNUM 0576 C078 F7 E0 45 STB CF_CHI 0577 C07B C6 01 LDB #$01 0578 C07D F7 E0 42 STB CF_SCNT 0579 C080 5F CLRB 0580 C081 39 RTS 0581 * 0582 * READ SECTORS FROM CF 0583 * 0584 * 0585 C082 8D EA READ BSR SEEK 0586 C084 86 20 LDA #CMDREAD ; IDE READ MULTIPLE 0587 C086 B7 E0 47 STA CF_COMAND 0588 C089 8D 18 BSR WTRDY 0589 * 0590 * READ LOOP 0591 * 0592 C08B 5F CLRB 0593 C08C 8D 24 READ1 BSR WTDRQ 0594 C08E B6 E0 40 LDA CF_DATA 0595 C091 A7 80 STA ,X+ 0596 C093 5A DECB 0597 C094 26 F6 BNE READ1 0598 * 0599 C096 5F CLRB 0600 C097 8D 19 READ2 BSR WTDRQ 0601 C099 B6 E0 40 LDA CF_DATA 0602 C09C 5A DECB 0603 C09D 26 F8 BNE READ2 0604 * 0605 C09F 8D 02 BSR WTRDY 0606 C0A1 5F CLRB 0607 C0A2 39 RTS 0608 * 0609 * WAIT UNTIL READY 0610 * 0611 C0A3 B6 E0 47 WTRDY LDA CF_STATUS 0612 C0A6 85 80 BITA #BSY 0613 C0A8 26 F9 BNE WTRDY 0614 C0AA B6 E0 47 LDA CF_STATUS 0615 C0AD 85 40 BITA #DRDY 0616 C0AF 27 F2 BEQ WTRDY 0617 C0B1 39 RTS 0618 * 0619 * WAIT FOR DATA REQUEST 0620 * 0621 C0B2 B6 E0 47 WTDRQ LDA CF_STATUS 0622 C0B5 85 08 BITA #DRQ 0623 C0B7 27 F9 BEQ WTDRQ 0624 C0B9 39 RTS 0625 * 0626 END START Program + Init Data = 791 bytes Error count = 0 1.1 System09/src/fmt/fmt_cf8.s19 http://www.opencores.org/cvsweb.shtml/System09/src/fmt/fmt_cf8.s19?rev=1.1&content-type=text/x-cvsweb-markup Index: fmt_cf8.s19 =================================================================== S117010017029E6E9FF800000000000000000000000000002B S123030034308E03E8108E04E2B6E00047250A313F26F6301F26EE35B0B6E00135B03430B8 S123032034028E03E8108E04E2B6E0004747250C313F26F5301F26ED350235B03502B7E05A S12303400135B08DD9A680810426F8390A0D466F726D6174696E672052414D6469736B2EB4 S12303602E2E200A0D4472697665204E756D626572203F040A0D0452616D6469736B206E8C S12303806F7420616C6C6F63617465642120040A0D466F726D617420436F6D706C6574658F S12303A004BD04B18E034CBD034517FF5324FB17FF6C8130102500F38133102200ED80307B S12303C01F89F701078E0104BD05228E02004F5FA7805A26FB7F01088601B701098E0200BB S12303E0B60108A784B601094C810026046C848601A701B60108F60109BD04FE7C0109B67F S12304000109810026D78601B701097C0108B60108814026C88E0200863FC6FFBD04DD8ECF S123042002006F846F01863FC6FFBD04FE8E02004FC6FFBD04DD8E02006F846F014FC6FFC1 S1230440BD04FE8E02004FC603BD04DD8E02006F846F01CC5241ED8810CC4D44ED8812CC0C S12304604953ED8814CC4B20ED8816CC0001ED881BCC0101ED881D863FC6FFED881FED8841 S123048026CC3EC1ED88218601A788238607A788248607A788254FC603BD04FE8EC0004FC3 S12304A0C601B70108F701091700538E038F7E03458D7F86E0B7E0468601B7E04186EFB786 S12304C0E047206E8D5C4FC6015AF7E043B7E044F60107F7E045C601F7E0425F398DEA8686 S12304E020B7E0478D4C5F8D58B6E040A7805A26F65F8D4DB6E0405A26F88D365F398DC932 S12305008630B7E0478D2B5F8D37A680B7E0405A26F65F8D2C4FB7E0405A26F78D145F3907 S12305205F39A603810323014FB701075F39A6035F39B6E047858026F9B6E047854027F22B S10C054039B6E047850827F939B2 S123C000200B000000000000C00000000010CEC0FFFCC005FDC300108EC4008D3581022745 S123C02010811626F68D2BB7C0088D26B7C00920EA8D1FB7C00A8D1AB7C00B8D151F895DC8 S123C04027D9BEC00A34148D093514A7805A26F520C9108CC400260F8EC300EC84270B8D93 S123C06021269D108EC304A6A0396E9FC0085AF7E043B7E044F6C00CF7E045C601F7E04212 S123C0805F398DEA8620B7E0478D185F8D24B6E040A7805A26F65F8D19B6E0405A26F88D01 S11DC0A0025F39B6E047858026F9B6E047854027F239B6E047850827F93930 S9030000FC 1.1 System09/src/fmt/fmt_cf8.sh http://www.opencores.org/cvsweb.shtml/System09/src/fmt/fmt_cf8.sh?rev=1.1&content-type=text/x-cvsweb-markup Index: fmt_cf8.sh =================================================================== ../../Tools/as09/as09.exe cf8fmt.txt -l > cf8fmt.lst 1.1 System09/src/fmt/fmt_cf8.txt http://www.opencores.org/cvsweb.shtml/System09/src/fmt/fmt_cf8.txt?rev=1.1&content-type=text/x-cvsweb-markup Index: fmt_cf8.txt =================================================================== * ** FLEX 9 COMPACT FLASH FORMAT PROGRAM * * FOR B5-X300 and CF with 8 Bit Transfer interface * * CFLAG EQU $01 CARRY FLAG VFLAG EQU $02 OVERFLOW FLAG ZFLAG EQU $04 ZERO FLAG NFLAG EQU $08 NEGATIVE FLAG IFLAG EQU $10 IRQ MASK CC HFLAG EQU $20 HALF CARRY FFLAG EQU $40 FIRQ MASK CC EFLAG EQU $80 ENTIRE FLAG * MAPPAG EQU $00 PAGE $0000 DAT ADDRESS * * Serial Port * ACIAS EQU $E000 ACIAC1 EQU ACIAS ACIAD1 EQU ACIAS+1 DELCON EQU 1250 Delay (Processor clock in MHz * 50) * * XMODEM Control characters * SOH EQU $01 EOT EQU $04 ACK EQU $06 NAK EQU $15 CAN EQU $18 * * Some dummy Constants * RMAXTRK EQU 64 RMAXSEC EQU 255 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC * * Start * ORG $0100 START LBSR UFSUB JMP [$F800] Jump to monitor on Completion. * * * RAM SPACE * DRVNUM FCB 0 TRACK FCB 0 SECTOR FCB 0 CHKSUM FCB 0 BLKNUM FCB 0 Xmodem block number BYTCNT FCB 0 Xmodem byte count XSTATE FDB 0 Xmodem State Vector DELCNT FCB $00,$00,$00 Xmodem Poll timer MAXTRK FCB 0 MAXSEC FCB 0 ORG $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 loop RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). RCHAR2 LDA ACIAC1 test for recieved char ASRA BCS RCHAR3 get character LEAY -1,Y else, continue to count delay BNE RCHAR2 LEAX -1,X BNE RCHAR1 PULS 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,Y PSHS A * LDX #1000 1000x inner loop SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). SCHAR2 LDA ACIAC1 test for space in transmit FIFO ASRA ASRA BCS SCHAR3 send character LEAY -1,Y else, continue to count delay BNE SCHAR2 LEAX -1,X BNE SCHAR1 PULS A PULS X,Y,PC return with error if timed out * SCHAR3 PULS A STA ACIAD1 send data (carry bit still set) PULS X,Y,PC * * Print Data * PDATA0 BSR SCHAR PDATA1 LDA ,X+ CMPA #$04 BNE PDATA0 RTS * ** 'UF' Format RAMdisc to FLEX standard. * DISFOS FCB $0A,$0D FCC 'Formating RAMdisk... ' FCB $0A,$0D FCC 'Drive Number ?' FCB 4 MESS6 FCB $0A,$0D,4 FCC 'Ramdisk not allocated! ' FCB 4 UFMSG1 FCB $0A,$0D FCC 'Format Complete' FCB 4 * UFSUB JSR INITDR LDX #DISFOS JSR PDATA1 UFSUB1 LBSR RCHAR BCC UFSUB1 LBSR SCHAR CMPA #'0' LBLO UFEXIT CMPA #'3' LBHI UFEXIT SUBA #'0' TFR A,B STB DRVNUM LDX #DRVNUM-3 JSR DRVSEL * * set up free chain * LDX #BUFFER clear out buffer CLRA CLRB DFL1 STA 0,X+ DECB BNE DFL1 * CLR TRACK LDA #1 STA SECTOR DFL2 LDX #BUFFER LDA TRACK STA 0,X LDA SECTOR INCA CMPA #RMAXSEC+1 last sector on track? BNE DFL3 INC 0,X LDA #1 DFL3 STA 1,X LDA TRACK LDB SECTOR JSR WRITSC INC SECTOR LDA SECTOR CMPA #RMAXSEC+1 BNE DFL2 LDA #1 STA SECTOR INC TRACK LDA TRACK CMPA #RMAXTRK BNE DFL2 * break free chain at last track/sector LDX #BUFFER LDA #RMAXTRK-1 LDB #RMAXSEC JSR READSC LDX #BUFFER CLR 0,X CLR 1,X LDA #RMAXTRK-1 LDB #RMAXSEC JSR WRITSC * set up sector structure, SIR, directory etc LDX #BUFFER CLRA LDB #RMAXSEC JSR READSC LDX #BUFFER CLR 0,X break end of directory chain CLR 1,X CLRA LDB #RMAXSEC JSR WRITSC * LDX #BUFFER CLRA LDB #3 set up SIR JSR READSC LDX #BUFFER CLR 0,X break forward link CLR 1,X LDD #$5241 set volume name (RAMDISK ) STD 16,X LDD #$4D44 STD 18,X LDD #$4953 STD 20,X LDD #$4B20 STD 22,X LDD #1 volume number STD 27,X LDD #$0101 first trk/sec 01-01 STD 29,X LDA #RMAXTRK-1 LDB #RMAXSEC STD 31,X STD 38,X LDD #RTOTSEC total DATA sectors (2912-14) STD 33,X * LDA #01 month set default creation date (SYS09's birthday!) STA 35,X LDA #07 day STA 36,X LDA #07 year STA 37,X * RF3 CLRA LDB #3 JSR 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 #$C000 CLRA TRACK 0 LDB #$01 SECTOR 1 STA TRACK STB SECTOR LBSR WRITSC * UFEXIT LDX #UFMSG1 JMP 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 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 * * * INITIALIZE CF CARD FOR 8 BIT LBA MODE * INITDR BSR WAITRDY LDA #HEADLBA STA CF_HEAD LDA #FEAT8BIT STA CF_FEATURE LDA #CMDFEATURE STA CF_COMAND BRA WAITRDY * * RESTORE DISK DRIVER (SEEK TRACK 00) * RESTR1 BSR DRVSEL CLRA ; Track 0 LDB #$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 DECB STB CF_SNUM STA CF_CLO LDB DRVNUM STB CF_CHI LDB #$01 STB CF_SCNT CLRB RTS * * READ SECTORS FROM CF * * READSC BSR SEEKTS LDA #CMDREAD ; IDE READ MULTIPLE STA CF_COMAND BSR WAITRDY * * READ LOOP * CLRB RDLP1 BSR WAITDRQ LDA CF_DATA STA ,X+ DECB BNE RDLP1 * CLRB RDLP2 BSR WAITDRQ LDA CF_DATA DECB BNE RDLP2 * BSR WAITRDY CLRB RTS * * WRITE SECTOR TO CF * WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR LDA #CMDWRITE ; IDE WRITE MULTIPLE STA CF_COMAND BSR WAITRDY * * WRITE LOOP * CLRB WRTLP1 BSR WAITDRQ LDA ,X+ STA CF_DATA DECB BNE WRTLP1 * CLRB WRTLP2 BSR WAITDRQ CLRA STA CF_DATA DECB BNE WRTLP2 * BSR WAITRDY CLRB RTS * * CHECK FOR BUSY * Doubles as VERIFY * BUSY CLRB Never busy RTS * * DRIVE SELECT DISK DRIVER * DRVSEL LDA 3,X GET DRIVE # FROM FCB CMPA #3 BLS DRVS2 IF > 3, SET IT TO 0 CLRA DRVS2 STA DRVNUM CLRB ; SET Z, CLEAR C RTS * * CHECK DRIVE READY DISK DRIVER * CHKDRV LDA 3,X CLRB ; CLEAR C, SET Z RTS * * WAIT UNTIL READY * WAITRDY LDA CF_STATUS BITA #BSY BNE WAITRDY LDA CF_STATUS BITA #DRDY BEQ WAITRDY RTS * * WAIT FOR DATA REQUEST * WAITDRQ LDA CF_STATUS BITA #DRQ BEQ WAITDRQ RTS * ******************************************************* * * 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 $C0FF SCTBUF EQU $C300 * * Start of Utility * ORG $C000 BOOT BRA LOAD0 FCB 0,0,0 TRK FCB 0 File start track SCT FCB 0 File start sector DNS FCB 0 Density Flag (not used) TADR FDB $C000 Transfer address LADR FDB 0 Load Address DRNUM FCB 0 Drive number 0 * LOAD0 LDS #STACK Set up stack LDD TRK Set up start track and sector STD SCTBUF LDY #SCTBUF+256 * * Perform actual file load * LOAD1 BSR GETCH Get acharcater CMPA #$02 Data record hearder ? BEQ LOAD2 Skip, is so CMPA #$16 Xfr address hearder ? BNE LOAD1 Loop if neither * * Get transfer address * BSR GETCH STA TADR BSR GETCH STA TADR+1 BRA LOAD1 * * Load data record * LOAD2 BSR GETCH Get load address STA LADR BSR GETCH STA LADR+1 BSR GETCH Get Bytes count TFR A,B TSTB BEQ LOAD1 Loop if count = 0 LDX LADR Get load address LOAD3 PSHS B,X BSR GETCH Get data character PULS B,X STA ,X+ Store at load address DECB BNE LOAD3 Loop until count = 0 BRA LOAD1 * * Get Character routine * Reads a sector if needed * GETCH CMPY #SCTBUF+256 out of data ? BNE GETCH4 Go read Character if not GETCH2 LDX #SCTBUF Point to buffer LDD 0,X Get forward Link BEQ GO if zero, file is loaded BSR READ Read next sector BNE BOOT start over if error LDY #SCTBUF+4 Point past link GETCH4 LDA ,Y+ Else, get a character RTS * * 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 DECB STB CF_SNUM STA CF_CLO LDB DRNUM STB CF_CHI LDB #$01 STB CF_SCNT CLRB RTS * * READ SECTORS FROM CF * * READ BSR SEEK LDA #CMDREAD ; IDE READ MULTIPLE STA CF_COMAND BSR WTRDY * * READ LOOP * CLRB READ1 BSR WTDRQ LDA CF_DATA STA ,X+ DECB BNE READ1 * CLRB READ2 BSR WTDRQ LDA CF_DATA DECB BNE READ2 * BSR WTRDY CLRB RTS * * WAIT UNTIL READY * WTRDY LDA CF_STATUS BITA #BSY BNE WTRDY LDA CF_STATUS BITA #DRDY BEQ WTRDY RTS * * WAIT FOR DATA REQUEST * WTDRQ LDA CF_STATUS BITA #DRQ BEQ WTDRQ RTS * END START 1.1 System09/src/fmt/fmt_ide.lst http://www.opencores.org/cvsweb.shtml/System09/src/fmt/fmt_ide.lst?rev=1.1&content-type=text/x-cvsweb-markup Index: fmt_ide.lst =================================================================== Assembler release DWC_2.0 version 2.11 May 6, 2004 (c) Motorola (free ware) 0001 * 0002 ** FLEX 9 DISK DRIVERS 0003 * 0004 * FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD 0005 * WITH I/O MAPPED AT $XE000 0006 * AND ROM MAPPED AT $XF000 0007 * THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM 0008 * THE FIRST 64K IS USED BY FLEX, 0009 * THE SECOND 128K IS USED AS A ROM DISK 0010 * THE REMAINING RAM IS USED FOR A RAM DISK 0011 * 0012 * 0013 0001 CFLAG EQU $01 CARRY FLAG 0014 0002 VFLAG EQU $02 OVERFLOW FLAG 0015 0004 ZFLAG EQU $04 ZERO FLAG 0016 0008 NFLAG EQU $08 NEGATIVE FLAG 0017 0010 IFLAG EQU $10 IRQ MASK CC 0018 0020 HFLAG EQU $20 HALF CARRY 0019 0040 FFLAG EQU $40 FIRQ MASK CC 0020 0080 EFLAG EQU $80 ENTIRE FLAG 0021 * 0022 0000 MAPPAG EQU $00 PAGE $0000 DAT ADDRESS 0023 * 0024 * Serial Port 0025 * 0026 E000 ACIAS EQU $E000 0027 E000 ACIAC1 EQU ACIAS 0028 E001 ACIAD1 EQU ACIAS+1 0029 04E2 DELCON EQU 1250 Delay (Processor clock in MHz * 50) 0030 * 0031 * XMODEM Control characters 0032 * 0033 0001 SOH EQU $01 0034 0004 EOT EQU $04 0035 0006 ACK EQU $06 0036 0015 NAK EQU $15 0037 0018 CAN EQU $18 0038 * 0039 * Some dummy Constants 0040 * 0041 0040 RMAXTRK EQU 64 0042 00FF RMAXSEC EQU 255 0043 3EC1 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC 0044 * 0045 * Start 0046 * 0047 0100 ORG $0100 0048 0100 17 02 98 START LBSR UFSUB 0049 0103 6E 9F F8 00 JMP [$F800] Jump to monitor on Completion. 0050 * 0051 * 0052 * RAM SPACE 0053 * 0054 0107 00 DRVNUM FCB 0 0055 0108 00 TRACK FCB 0 0056 0109 00 SECTOR FCB 0 0057 010A 00 CHKSUM FCB 0 0058 010B 00 BLKNUM FCB 0 Xmodem block number 0059 010C 00 BYTCNT FCB 0 Xmodem byte count 0060 010D 00 00 XSTATE FDB 0 Xmodem State Vector 0061 010F 00 00 00 DELCNT FCB $00,$00,$00 Xmodem Poll timer 0062 0112 00 MAXTRK FCB 0 0063 0113 00 MAXSEC FCB 0 0064 0200 ORG $0200 0065 * 0066 * SECTOR BUFFER 0067 * 0068 0200 BUFFER RMB 256 0069 * 0070 * 0071 * recieve char from remote drive. 0072 * timeout if no response for approx 1s. 0073 * Entry: no parameters 0074 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. 0075 * 0076 0300 34 30 RCHAR PSHS X,Y 0077 * 0078 0302 8E 03 E8 LDX #1000 1000x inner loop 0079 0305 10 8E 04 E2 RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). 0080 0309 B6 E0 00 RCHAR2 LDA ACIAC1 test for recieved char 0081 030C 47 ASRA 0082 030D 25 0A BCS RCHAR3 get character 0083 030F 31 3F LEAY -1,Y else, continue to count delay 0084 0311 26 F6 BNE RCHAR2 0085 0313 30 1F LEAX -1,X 0086 0315 26 EE BNE RCHAR1 0087 0317 35 B0 PULS X,Y,PC return with error if timed out 0088 * 0089 0319 B6 E0 01 RCHAR3 LDA ACIAD1 return data (carry bit still set) 0090 031C 35 B0 PULS X,Y,PC 0091 * 0092 * 0093 * transmit char to remote drive. 0094 * timeout if no response for approx 1s. (allows for use of hardware flow control) 0095 * Entry: (A) = char to transmit 0096 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. 0097 * 0098 031E 34 30 SCHAR PSHS X,Y 0099 0320 34 02 PSHS A 0100 * 0101 0322 8E 03 E8 LDX #1000 1000x inner loop 0102 0325 10 8E 04 E2 SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). 0103 0329 B6 E0 00 SCHAR2 LDA ACIAC1 test for space in transmit FIFO 0104 032C 47 ASRA 0105 032D 47 ASRA 0106 032E 25 0C BCS SCHAR3 send character 0107 0330 31 3F LEAY -1,Y else, continue to count delay 0108 0332 26 F5 BNE SCHAR2 0109 0334 30 1F LEAX -1,X 0110 0336 26 ED BNE SCHAR1 0111 0338 35 02 PULS A 0112 033A 35 B0 PULS X,Y,PC return with error if timed out 0113 * 0114 033C 35 02 SCHAR3 PULS A 0115 033E B7 E0 01 STA ACIAD1 send data (carry bit still set) 0116 0341 35 B0 PULS X,Y,PC 0117 * 0118 ** 'UF' Format IDE Drive to FLEX standard. 0119 * 0120 0343 0A 0D DISFOS FCB $0A,$0D 0121 0345 46 6F 72 6D 61 74 FCC 'Formating IDE disk... ' 69 6E 67 20 49 44 45 20 64 69 73 6B 2E 2E 2E 20 0122 035B 0A 0D FCB $0A,$0D 0123 035D 44 72 69 76 65 20 FCC 'Drive Number ?' 4E 75 6D 62 65 72 20 3F 0124 036B 04 FCB 4 0125 036C 0A 0D 04 MESS6 FCB $0A,$0D,4 0126 036F 49 44 45 20 64 72 FCC 'IDE drive not allocated! ' 69 76 65 20 6E 6F 74 20 61 6C 6C 6F 63 61 74 65 64 21 20 0127 0388 04 FCB 4 0128 0389 0A 0D UFMSG1 FCB $0A,$0D 0129 038B 46 6F 72 6D 61 74 FCC 'Format Complete' 20 43 6F 6D 70 6C 65 74 65 0130 039A 04 FCB 4 0131 * 0132 039B BD 05 39 UFSUB JSR INITDR 0133 039E 8E 03 43 LDX #DISFOS 0134 03A1 BD 05 32 JSR PDATA1 0135 03A4 17 FF 59 UFSUB1 LBSR RCHAR 0136 03A7 24 FB BCC UFSUB1 0137 03A9 17 FF 72 LBSR SCHAR 0138 03AC 81 30 CMPA #'0' 0139 03AE 10 25 00 F3 LBLO UFEXIT 0140 03B2 81 33 CMPA #'3' 0141 03B4 10 22 00 ED LBHI UFEXIT 0142 03B8 80 30 SUBA #'0' 0143 03BA 1F 89 TFR A,B 0144 03BC F7 01 07 STB DRVNUM 0145 03BF 8E 01 04 LDX #DRVNUM-3 0146 03C2 BD 05 B1 JSR DRVSEL 0147 * 0148 * set up free chain 0149 * 0150 03C5 8E 02 00 LDX #BUFFER clear out buffer 0151 03C8 4F CLRA 0152 03C9 5F CLRB 0153 03CA A7 80 DFL1 STA 0,X+ 0154 03CC 5A DECB 0155 03CD 26 FB BNE DFL1 0156 * 0157 03CF 7F 01 08 CLR TRACK 0158 03D2 86 01 LDA #1 0159 03D4 B7 01 09 STA SECTOR 0160 03D7 8E 02 00 DFL2 LDX #BUFFER 0161 03DA B6 01 08 LDA TRACK 0162 03DD A7 84 STA 0,X 0163 03DF B6 01 09 LDA SECTOR 0164 03E2 4C INCA 0165 03E3 81 00 CMPA #RMAXSEC+1 last sector on track? 0166 03E5 26 04 BNE DFL3 0167 03E7 6C 84 INC 0,X 0168 03E9 86 01 LDA #1 0169 03EB A7 01 DFL3 STA 1,X 0170 03ED B6 01 08 LDA TRACK 0171 03F0 F6 01 09 LDB SECTOR 0172 03F3 BD 05 8D JSR WRITSC 0173 03F6 7C 01 09 INC SECTOR 0174 03F9 B6 01 09 LDA SECTOR 0175 03FC 81 00 CMPA #RMAXSEC+1 0176 03FE 26 D7 BNE DFL2 0177 0400 86 01 LDA #1 0178 0402 B7 01 09 STA SECTOR 0179 0405 7C 01 08 INC TRACK 0180 0408 B6 01 08 LDA TRACK 0181 040B 81 40 CMPA #RMAXTRK 0182 040D 26 C8 BNE DFL2 0183 * break free chain at last track/sector 0184 040F 8E 02 00 LDX #BUFFER 0185 0412 86 3F LDA #RMAXTRK-1 0186 0414 C6 FF LDB #RMAXSEC 0187 0416 BD 05 6C JSR READSC 0188 0419 8E 02 00 LDX #BUFFER 0189 041C 6F 84 CLR 0,X 0190 041E 6F 01 CLR 1,X 0191 0420 86 3F LDA #RMAXTRK-1 0192 0422 C6 FF LDB #RMAXSEC 0193 0424 BD 05 8D JSR WRITSC 0194 * set up sector structure, SIR, directory etc 0195 0427 8E 02 00 LDX #BUFFER 0196 042A 4F CLRA 0197 042B C6 FF LDB #RMAXSEC 0198 042D BD 05 6C JSR READSC 0199 0430 8E 02 00 LDX #BUFFER 0200 0433 6F 84 CLR 0,X break end of directory chain 0201 0435 6F 01 CLR 1,X 0202 0437 4F CLRA 0203 0438 C6 FF LDB #RMAXSEC 0204 043A BD 05 8D JSR WRITSC 0205 * 0206 043D 8E 02 00 LDX #BUFFER 0207 0440 4F CLRA 0208 0441 C6 03 LDB #3 set up SIR 0209 0443 BD 05 6C JSR READSC 0210 0446 8E 02 00 LDX #BUFFER 0211 0449 6F 84 CLR 0,X break forward link 0212 044B 6F 01 CLR 1,X 0213 044D CC 52 41 LDD #$5241 set volume name (RAMDISK ) 0214 0450 ED 88 10 STD 16,X 0215 0453 CC 4D 44 LDD #$4D44 0216 0456 ED 88 12 STD 18,X 0217 0459 CC 49 53 LDD #$4953 0218 045C ED 88 14 STD 20,X 0219 045F CC 4B 20 LDD #$4B20 0220 0462 ED 88 16 STD 22,X 0221 0465 CC 00 01 LDD #1 volume number 0222 0468 ED 88 1B STD 27,X 0223 046B CC 01 01 LDD #$0101 first trk/sec 01-01 0224 046E ED 88 1D STD 29,X 0225 0471 86 3F LDA #RMAXTRK-1 0226 0473 C6 FF LDB #RMAXSEC 0227 0475 ED 88 1F STD 31,X 0228 0478 ED 88 26 STD 38,X 0229 047B CC 3E C1 LDD #RTOTSEC total DATA sectors (2912-14) 0230 047E ED 88 21 STD 33,X 0231 * 0232 0481 86 01 LDA #01 month set default creation date (SYS09's birthday!) 0233 0483 A7 88 23 STA 35,X 0234 0486 86 07 LDA #07 day 0235 0488 A7 88 24 STA 36,X 0236 048B 86 07 LDA #07 year 0237 048D A7 88 25 STA 37,X 0238 * 0239 0490 4F RF3 CLRA 0240 0491 C6 03 LDB #3 0241 0493 BD 05 8D JSR WRITSC 0242 * 0243 * Not sure what this is about 0244 * put bootstrap on track 0 sector 1 0245 * 0246 * LDX #BUFFER 0247 * CLRA 0248 * LDB #1 0249 * JSR READSC 0250 * LDX #BUFFER 0251 * LDA #$AA set the init flag 0252 * STA 0,X 0253 * LDA #$55 0254 * STA 1,X 0255 * CLRA 0256 * LDB #1 0257 * JSR WRITSC 0258 * 0259 * Write Boot sector 0260 * 0261 0496 8E C0 00 LDX #$C000 0262 0499 4F CLRA TRACK 0 0263 049A C6 01 LDB #$01 SECTOR 1 0264 049C B7 01 08 STA TRACK 0265 049F F7 01 09 STB SECTOR 0266 04A2 17 00 E8 LBSR WRITSC 0267 * 0268 04A5 8E 03 89 UFEXIT LDX #UFMSG1 0269 04A8 7E 05 32 JMP PDATA1 0270 * 0271 * Read a byte from the serial port 0272 * 0273 04AB 34 04 LRBYTE PSHS B 0274 04AD 8D 0E BSR LRHEX Get hex digit. 0275 04AF 48 ASLA 0276 04B0 48 ASLA Shift to msb. 0277 04B1 48 ASLA 0278 04B2 48 ASLA 0279 04B3 1F 89 TFR A,B Save in B. 0280 04B5 8D 06 BSR LRHEX Get next digit. 0281 04B7 34 04 PSHS B 0282 04B9 AB E0 ADDA 0,S+ Add together bytes. 0283 04BB 35 84 PULS B,PC 0284 * 0285 04BD BD 04 E6 LRHEX JSR INTER 0286 04C0 29 FB BVS LRHEX 0287 04C2 80 30 SUBA #$30 Remove ascii bias. 0288 04C4 2B F7 BMI LRHEX 0289 04C6 81 09 CMPA #$09 Number? 0290 04C8 2F 0A BLE LRHEX1 Yes. 0291 04CA 81 11 CMPA #$11 Keep testing. 0292 04CC 2B EF BMI LRHEX 0293 04CE 81 16 CMPA #$16 0294 04D0 2E EB BGT LRHEX 0295 04D2 80 07 SUBA #$07 0296 04D4 39 LRHEX1 RTS 0297 * 0298 * ACIA INPUT TEST 0299 * 0300 04D5 B6 E0 00 INTEST LDA ACIAC1 0301 04D8 85 01 BITA #$01 0302 04DA 39 RTS 0303 * 0304 * RESET ACIA 0305 * 0306 04DB 86 03 ACIRST LDA #$03 master reset 0307 04DD B7 E0 00 STA ACIAC1 0308 04E0 86 11 LDA #$11 0309 04E2 B7 E0 00 STA ACIAC1 0310 04E5 39 RTS 0311 * 0312 * ACIA INPUT 0313 * 0314 04E6 86 10 INTER LDA #16 0315 04E8 B7 01 0F STA DELCNT+0 0316 04EB 7F 01 10 CLR DELCNT+1 0317 04EE 7F 01 11 CLR DELCNT+2 0318 04F1 B6 E0 00 INTER0 LDA ACIAC1 0319 04F4 85 01 BITA #$01 0320 04F6 26 08 BNE INTER1 0321 04F8 85 78 BITA #$78 0322 04FA 27 0A BEQ INTER2 0323 04FC 8D DD BSR ACIRST 0324 04FE 20 E6 BRA INTER 0325 * 0326 0500 B6 E0 01 INTER1 LDA ACIAD1 0327 0503 1C 02 ANDCC #VFLAG 0328 0505 39 RTS 0329 * 0330 0506 7A 01 11 INTER2 DEC DELCNT+2 0331 0509 26 E6 BNE INTER0 0332 050B 7A 01 10 DEC DELCNT+1 0333 050E 26 E1 BNE INTER0 0334 0510 7A 01 0F DEC DELCNT+0 0335 0513 26 DC BNE INTER0 0336 0515 4F CLRA 0337 0516 1A 02 ORCC #VFLAG 0338 0518 39 RTS 0339 * 0340 * ACIA OUTPUT 0341 * 0342 0519 34 02 OUTTER PSHS A 0343 * 0344 051B B6 E0 00 OUTTE1 LDA ACIAC1 0345 051E 85 02 BITA #$02 0346 0520 26 08 BNE OUTTE2 0347 0522 85 78 BITA #$78 0348 0524 27 F5 BEQ OUTTE1 0349 0526 8D B3 BSR ACIRST 0350 0528 20 F1 BRA OUTTE1 0351 * 0352 052A 35 02 OUTTE2 PULS A 0353 052C B7 E0 01 STA ACIAD1 0354 052F 39 RTS 0355 * 0356 * Print Data 0357 * 0358 0530 8D E7 PDATA0 BSR OUTTER 0359 0532 A6 80 PDATA1 LDA ,X+ 0360 0534 81 04 CMPA #$04 0361 0536 26 F8 BNE PDATA0 0362 0538 39 RTS 0363 * 0364 ** FLEX 9 IDE DISK DRIVERS 0365 * 0366 * FOR SYS09BUG 1.2 ON THE XSA-3S1000 0367 * WITH I/O MAPPED AT $XE000 0368 * AND ROM MAPPED AT $XF000 0369 * 0370 * 0371 0010 IMASK EQU $10 IRQ MASK CC 0372 0040 FMASK EQU $40 FIRQ MASK CC 0373 * 0374 E100 CF_BASE EQU $E100 0375 E100 CF_DATA EQU CF_BASE+0 0376 E102 CF_ERROR EQU CF_BASE+2 ; read error 0377 E102 CF_FEATURE EQU CF_BASE+2 ; write feature 0378 E104 CF_SCNT EQU CF_BASE+4 0379 E106 CF_SNUM EQU CF_BASE+6 0380 E108 CF_CLO EQU CF_BASE+8 0381 E10A CF_CHI EQU CF_BASE+10 0382 E10C CF_HEAD EQU CF_BASE+12 0383 E10E CF_STATUS EQU CF_BASE+14 ; read status 0384 E10E CF_COMAND EQU CF_BASE+14 ; write command 0385 E11E CF_AUX EQU CF_BASE+30 0386 * 0387 * Command Equates 0388 * 0389 0020 CMDREAD EQU $20 ; Read Single sector 0390 0030 CMDWRITE EQU $30 ; Write Single sector 0391 0006 AUXRESET EQU $06 0392 0002 AUXRSTREL EQU $02 0393 00E0 HEADLBA EQU $E0 0394 * 0395 * Status bit equates 0396 * 0397 0080 BSY EQU $80 0398 0040 DRDY EQU $40 0399 0008 DRQ EQU $08 0400 0001 ERR EQU $01 0401 * 0402 * 0403 * INITIALIZE CF CARD FOR 8 BIT LBA MODE 0404 * 0405 0539 CC 00 06 INITDR LDD #AUXRESET 0406 053C FD E1 1E STD CF_AUX 0407 053F CC 00 02 LDD #AUXRSTREL 0408 0542 FD E1 1E STD CF_AUX 0409 0545 CC 00 E0 LDD #HEADLBA 0410 0548 FD E1 0C STD CF_HEAD 0411 054B 20 74 BRA WAITRDY 0412 * 0413 * RESTORE DISK DRIVER (SEEK TRACK 00) 0414 * 0415 054D 8D 62 RESTR1 BSR DRVSEL 0416 054F 4F CLRA ; Track 0 0417 0550 C6 01 LDB #$01 ; Sector 1 0418 * 0419 * Seek track and sector 0420 * A holds track number (0 - ??) 0421 * B holds sector number (1 - ??) 0422 * Sector numbers starts from 1 0423 * subtract 1 to start from sector 0 on CF 0424 * 0425 0552 34 02 SEEKTS PSHS A 0426 0554 4F CLRA 0427 0555 5A DECB 0428 0556 FD E1 06 STD CF_SNUM 0429 0559 E6 E4 LDB ,S 0430 055B FD E1 08 STD CF_CLO 0431 055E F6 01 07 LDB DRVNUM 0432 0561 FD E1 0A STD CF_CHI 0433 0564 C6 01 LDB #$01 0434 0566 FD E1 04 STD CF_SCNT 0435 0569 5F CLRB 0436 056A 35 82 PULS A,PC 0437 * 0438 * READ SECTORS FROM CF 0439 * 0440 * 0441 056C 8D E4 READSC BSR SEEKTS 0442 056E CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE 0443 0571 FD E1 0E STD CF_COMAND 0444 0574 8D 4B BSR WAITRDY 0445 * 0446 * READ LOOP 0447 * 0448 0576 34 20 PSHS Y 0449 0578 10 8E 01 00 LDY #256 0450 057C 8D 52 RDLP1 BSR WAITDRQ 0451 057E FC E1 00 LDD CF_DATA 0452 0581 E7 80 STB ,X+ 0453 0583 31 3F LEAY -1,Y 0454 0585 26 F5 BNE RDLP1 0455 0587 35 20 PULS Y 0456 * 0457 0589 8D 36 BSR WAITRDY 0458 058B 5F CLRB 0459 058C 39 RTS 0460 * 0461 * WRITE SECTOR TO CF 0462 * 0463 058D 8D C3 WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR 0464 058F CC 00 30 LDD #CMDWRITE ; IDE WRITE MULTIPLE 0465 0592 FD E1 0E STD CF_COMAND 0466 0595 8D 2A BSR WAITRDY 0467 * 0468 * WRITE LOOP 0469 * 0470 0597 34 20 PSHS Y 0471 0599 10 8E 01 00 LDY #256 0472 059D 4F CLRA 0473 059E 8D 30 WRTLP1 BSR WAITDRQ 0474 05A0 E6 80 LDB ,X+ 0475 05A2 FD E1 00 STD CF_DATA 0476 05A5 31 3F LEAY -1,Y 0477 05A7 26 F5 BNE WRTLP1 0478 05A9 35 20 PULS Y 0479 * 0480 05AB 8D 14 BSR WAITRDY 0481 05AD 5F CLRB 0482 05AE 39 RTS 0483 * 0484 * CHECK FOR BUSY 0485 * Doubles as VERIFY 0486 * 0487 05AF 5F BUSY CLRB Never busy 0488 05B0 39 RTS 0489 * 0490 * DRIVE SELECT DISK DRIVER 0491 * 0492 05B1 A6 03 DRVSEL LDA 3,X GET DRIVE # FROM FCB 0493 05B3 81 03 CMPA #3 0494 05B5 23 01 BLS DRVS2 IF > 3, SET IT TO 0 0495 05B7 4F CLRA 0496 05B8 B7 01 07 DRVS2 STA DRVNUM 0497 05BB 5F CLRB ; SET Z, CLEAR C 0498 05BC 39 RTS 0499 * 0500 * CHECK DRIVE READY DISK DRIVER 0501 * 0502 05BD A6 03 CHKDRV LDA 3,X 0503 05BF 5F CLRB ; CLEAR C, SET Z 0504 05C0 39 RTS 0505 * 0506 * WAIT UNTIL READY 0507 * 0508 05C1 FC E1 0E WAITRDY LDD CF_STATUS 0509 05C4 C5 80 BITB #BSY 0510 05C6 26 F9 BNE WAITRDY 0511 05C8 FC E1 0E LDD CF_STATUS 0512 05CB C5 40 BITB #DRDY 0513 05CD 27 F2 BEQ WAITRDY 0514 05CF 39 RTS 0515 * 0516 * WAIT FOR DATA REQUEST 0517 * 0518 05D0 FC E1 0E WAITDRQ LDD CF_STATUS 0519 05D3 C5 08 BITB #DRQ 0520 05D5 27 F9 BEQ WAITDRQ 0521 05D7 39 RTS 0522 * 0523 ******************************************************* 0524 * 0525 * Bootstrap FLEX Loader 0526 * 0527 * SBUG1.8 loads the bootstap loader at $C000 0528 * however the Flex adaption manual has the 0529 * bootstrap loader residing at $C100 0530 * 0531 ****************************************************** 0532 * 0533 * Equates 0534 * 0535 C0FF STACK EQU $C0FF 0536 C300 SCTBUF EQU $C300 0537 * 0538 * Start of Utility 0539 * 0540 C000 ORG $C000 0541 C000 20 0B BOOT BRA LOAD0 0542 C002 00 00 00 FCB 0,0,0 0543 C005 00 TRK FCB 0 File start track 0544 C006 00 SCT FCB 0 File start sector 0545 C007 00 DNS FCB 0 Density Flag (not used) 0546 C008 C0 00 TADR FDB $C000 Transfer address 0547 C00A 00 00 LADR FDB 0 Load Address 0548 C00C 00 DRNUM FCB 0 Drive number 0 0549 * 0550 C00D 10 CE C0 FF LOAD0 LDS #STACK Set up stack 0551 C011 FC C0 05 LDD TRK Set up start track and sector 0552 C014 FD C3 00 STD SCTBUF 0553 C017 10 8E C4 00 LDY #SCTBUF+256 0554 * 0555 * Perform actual file load 0556 * 0557 C01B 8D 35 LOAD1 BSR GETCH Get acharcater 0558 C01D 81 02 CMPA #$02 Data record hearder ? 0559 C01F 27 10 BEQ LOAD2 Skip, is so 0560 C021 81 16 CMPA #$16 Xfr address hearder ? 0561 C023 26 F6 BNE LOAD1 Loop if neither 0562 * 0563 * Get transfer address 0564 * 0565 C025 8D 2B BSR GETCH 0566 C027 B7 C0 08 STA TADR 0567 C02A 8D 26 BSR GETCH 0568 C02C B7 C0 09 STA TADR+1 0569 C02F 20 EA BRA LOAD1 0570 * 0571 * Load data record 0572 * 0573 C031 8D 1F LOAD2 BSR GETCH Get load address 0574 C033 B7 C0 0A STA LADR 0575 C036 8D 1A BSR GETCH 0576 C038 B7 C0 0B STA LADR+1 0577 C03B 8D 15 BSR GETCH Get Bytes count 0578 C03D 1F 89 TFR A,B 0579 C03F 5D TSTB 0580 C040 27 D9 BEQ LOAD1 Loop if count = 0 0581 C042 BE C0 0A LDX LADR Get load address 0582 C045 34 14 LOAD3 PSHS B,X 0583 C047 8D 09 BSR GETCH Get data character 0584 C049 35 14 PULS B,X 0585 C04B A7 80 STA ,X+ Store at load address 0586 C04D 5A DECB 0587 C04E 26 F5 BNE LOAD3 Loop until count = 0 0588 C050 20 C9 BRA LOAD1 0589 * 0590 * Get Character routine 0591 * Reads a sector if needed 0592 * 0593 C052 10 8C C4 00 GETCH CMPY #SCTBUF+256 out of data ? 0594 C056 26 0F BNE GETCH4 Go read Character if not 0595 C058 8E C3 00 GETCH2 LDX #SCTBUF Point to buffer 0596 C05B EC 84 LDD 0,X Get forward Link 0597 C05D 27 0B BEQ GO if zero, file is loaded 0598 C05F 8D 27 BSR READ Read next sector 0599 C061 26 9D BNE BOOT start over if error 0600 C063 10 8E C3 04 LDY #SCTBUF+4 Point past link 0601 C067 A6 A0 GETCH4 LDA ,Y+ Else, get a character 0602 C069 39 RTS 0603 * 0604 * File is loaded, Jump to it 0605 * 0606 C06A 6E 9F C0 08 GO JMP [TADR] Jump to transfer address 0607 0608 * 0609 ** FLEX 9 IDE DISK DRIVERS 0610 * 0611 * FOR SYS09BUG 1.2 ON THE XSA-3S1000 0612 * WITH I/O MAPPED AT $XE000 0613 * AND ROM MAPPED AT $XF000 0614 * 0615 *IMASK EQU $10 IRQ MASK CC 0616 *FMASK EQU $40 FIRQ MASK CC 0617 * 0618 *CF_BASE EQU $E100 0619 *CF_DATA EQU CF_BASE+0 0620 *CF_ERROR EQU CF_BASE+2 ; read error 0621 *CF_FEATURE EQU CF_BASE+2 ; write feature 0622 *CF_SCNT EQU CF_BASE+4 0623 *CF_SNUM EQU CF_BASE+6 0624 *CF_CLO EQU CF_BASE+8 0625 *CF_CHI EQU CF_BASE+10 0626 *CF_HEAD EQU CF_BASE+12 0627 *CF_STATUS EQU CF_BASE+14 ; read status 0628 *CF_COMAND EQU CF_BASE+14 ; write command 0629 *CF_AUX EQU CF_BASE+30 0630 * 0631 * Command Equates 0632 * 0633 *CMDREAD EQU $20 ; Read Single sector 0634 *CMDWRITE EQU $30 ; Write Single sector 0635 *HEADLBA EQU $E0 0636 *AUXRESET EQU $06 0637 *AUXRSTREL EQU $02 0638 * 0639 * Status bit equates 0640 * 0641 *BSY EQU $80 0642 *DRDY EQU $40 0643 *DRQ EQU $08 0644 *ERR EQU $01 0645 * 0646 * Seek track and sector 0647 * A holds track number (0 - ??) 0648 * B holds sector number (1 - ??) 0649 * Sector numbers starts from 1 0650 * subtract 1 to start from sector 0 on CF 0651 * 0652 C06E 34 02 SEEK PSHS A 0653 C070 4F CLRA 0654 C071 5A DECB 0655 C072 FD E1 06 STD CF_SNUM 0656 C075 E6 E4 LDB ,S 0657 C077 FD E1 08 STD CF_CLO 0658 C07A F6 C0 0C LDB DRNUM 0659 C07D FD E1 0A STD CF_CHI 0660 C080 C6 01 LDB #$01 0661 C082 FD E1 04 STD CF_SCNT 0662 C085 5F CLRB 0663 C086 35 82 PULS A,PC 0664 * 0665 * READ SECTORS FROM CF 0666 * 0667 * 0668 C088 8D E4 READ BSR SEEK 0669 C08A CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE 0670 C08D FD E1 0E STD CF_COMAND 0671 C090 8D 17 BSR WTRDY 0672 * 0673 * READ LOOP 0674 * 0675 C092 34 20 PSHS Y 0676 C094 10 8E 01 00 LDY #256 0677 C098 8D 1E READ1 BSR WTDRQ 0678 C09A FC E1 00 LDD CF_DATA 0679 C09D E7 80 STB ,X+ 0680 C09F 31 3F LEAY -1,Y 0681 C0A1 26 F5 BNE READ1 0682 C0A3 35 20 PULS Y 0683 * 0684 C0A5 8D 02 BSR WTRDY 0685 C0A7 5F CLRB 0686 C0A8 39 RTS 0687 * 0688 * WAIT UNTIL READY 0689 * 0690 C0A9 FC E1 0E WTRDY LDD CF_STATUS 0691 C0AC C5 80 BITB #BSY 0692 C0AE 26 F9 BNE WTRDY 0693 C0B0 FC E1 0E LDD CF_STATUS 0694 C0B3 C5 40 BITB #DRDY 0695 C0B5 27 F2 BEQ WTRDY 0696 C0B7 39 RTS 0697 * 0698 * WAIT FOR DATA REQUEST 0699 * 0700 C0B8 FC E1 0E WTDRQ LDD CF_STATUS 0701 C0BB C5 08 BITB #DRQ 0702 C0BD 27 F9 BEQ WTDRQ 0703 C0BF 39 RTS 0704 * 0705 END START Program + Init Data = 940 bytes Error count = 0 1.1 System09/src/fmt/fmt_ide.s19 http://www.opencores.org/cvsweb.shtml/System09/src/fmt/fmt_ide.s19?rev=1.1&content-type=text/x-cvsweb-markup Index: fmt_ide.s19 =================================================================== S11701001702986E9FF8000000000000000000000000000031 S123030034308E03E8108E04E2B6E00047250A313F26F6301F26EE35B0B6E00135B03430B8 S123032034028E03E8108E04E2B6E0004747250C313F26F5301F26ED350235B03502B7E05A S12303400135B00A0D466F726D6174696E6720494445206469736B2E2E2E200A0D44726958 S12303607665204E756D626572203F040A0D04494445206472697665206E6F7420616C6CC1 S12303806F63617465642120040A0D466F726D617420436F6D706C65746504BD05398E033B S12303A043BD053217FF5924FB17FF728130102500F38133102200ED80301F89F701078E5B S12303C00104BD05B18E02004F5FA7805A26FB7F01088601B701098E0200B60108A784B6C1 S12303E001094C810026046C848601A701B60108F60109BD058D7C0109B60109810026D707 S12304008601B701097C0108B60108814026C88E0200863FC6FFBD056C8E02006F846F0162 S1230420863FC6FFBD058D8E02004FC6FFBD056C8E02006F846F014FC6FFBD058D8E020027 S12304404FC603BD056C8E02006F846F01CC5241ED8810CC4D44ED8812CC4953ED8814CCDA S12304604B20ED8816CC0001ED881BCC0101ED881D863FC6FFED881FED8826CC3EC1ED88CC S1230480218601A788238607A788248607A788254FC603BD058D8EC0004FC601B70108F71B S12304A001091700E88E03897E053234048D0E484848481F898D063404ABE03584BD04E60F S12304C029FB80302BF781092F0A81112BEF81162EEB800739B6E0008501398603B7E000CE S12304E08611B7E000398610B7010F7F01107F0111B6E000850126088578270A8DDD20E62B S1230500B6E0011C02397A011126E67A011026E17A010F26DC4F1A02393402B6E00085023C S12305202608857827F58DB320F13502B7E001398DE7A680810426F839CC0006FDE11ECC07 S12305400002FDE11ECC00E0FDE10C20748D624FC60134024F5AFDE106E6E4FDE108F60100 S123056007FDE10AC601FDE1045F35828DE4CC0020FDE10E8D4B3420108E01008D52FCE1F9 S123058000E780313F26F535208D365F398DC3CC0030FDE10E8D2A3420108E01004F8D30C7 S12305A0E680FDE100313F26F535208D145F395F39A603810323014FB701075F39A6035F43 S11B05C039FCE10EC58026F9FCE10EC54027F239FCE10EC50827F93944 S123C000200B000000000000C00000000010CEC0FFFCC005FDC300108EC4008D3581022745 S123C02010811626F68D2BB7C0088D26B7C00920EA8D1FB7C00A8D1AB7C00B8D151F895DC8 S123C04027D9BEC00A34148D093514A7805A26F520C9108CC400260F8EC300EC84270B8D93 S123C06027269D108EC304A6A0396E9FC00834024F5AFDE106E6E4FDE108F6C00CFDE10AFC S123C080C601FDE1045F35828DE4CC0020FDE10E8D173420108E01008D1EFCE100E78031DD S123C0A03F26F535208D025F39FCE10EC58026F9FCE10EC54027F239FCE10EC50827F93904 S9030000FC 1.1 System09/src/fmt/fmt_ide.sh http://www.opencores.org/cvsweb.shtml/System09/src/fmt/fmt_ide.sh?rev=1.1&content-type=text/x-cvsweb-markup Index: fmt_ide.sh =================================================================== ../../Tools/as09/as09.exe cf8fmt.txt -l > cf8fmt.lst 1.1 System09/src/fmt/fmt_ide.txt http://www.opencores.org/cvsweb.shtml/System09/src/fmt/fmt_ide.txt?rev=1.1&content-type=text/x-cvsweb-markup Index: fmt_ide.txt =================================================================== * ** 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 FLAG VFLAG EQU $02 OVERFLOW FLAG ZFLAG EQU $04 ZERO FLAG NFLAG EQU $08 NEGATIVE FLAG IFLAG EQU $10 IRQ MASK CC HFLAG EQU $20 HALF CARRY FFLAG EQU $40 FIRQ MASK CC EFLAG EQU $80 ENTIRE FLAG * MAPPAG EQU $00 PAGE $0000 DAT ADDRESS * * Serial Port * ACIAS EQU $E000 ACIAC1 EQU ACIAS ACIAD1 EQU ACIAS+1 DELCON EQU 1250 Delay (Processor clock in MHz * 50) * * XMODEM Control characters * SOH EQU $01 EOT EQU $04 ACK EQU $06 NAK EQU $15 CAN EQU $18 * * Some dummy Constants * RMAXTRK EQU 64 RMAXSEC EQU 255 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC * * Start * ORG $0100 START LBSR UFSUB JMP [$F800] Jump to monitor on Completion. * * * RAM SPACE * DRVNUM FCB 0 TRACK FCB 0 SECTOR FCB 0 CHKSUM FCB 0 BLKNUM FCB 0 Xmodem block number BYTCNT FCB 0 Xmodem byte count XSTATE FDB 0 Xmodem State Vector DELCNT FCB $00,$00,$00 Xmodem Poll timer MAXTRK FCB 0 MAXSEC FCB 0 ORG $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 loop RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). RCHAR2 LDA ACIAC1 test for recieved char ASRA BCS RCHAR3 get character LEAY -1,Y else, continue to count delay BNE RCHAR2 LEAX -1,X BNE RCHAR1 PULS 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,Y PSHS A * LDX #1000 1000x inner loop SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). SCHAR2 LDA ACIAC1 test for space in transmit FIFO ASRA ASRA BCS SCHAR3 send character LEAY -1,Y else, continue to count delay BNE SCHAR2 LEAX -1,X BNE SCHAR1 PULS A PULS X,Y,PC return with error if timed out * SCHAR3 PULS A STA ACIAD1 send data (carry bit still set) PULS X,Y,PC * ** 'UF' Format IDE Drive to FLEX standard. * DISFOS FCB $0A,$0D FCC 'Formating IDE disk... ' FCB $0A,$0D FCC 'Drive Number ?' FCB 4 MESS6 FCB $0A,$0D,4 FCC 'IDE drive not allocated! ' FCB 4 UFMSG1 FCB $0A,$0D FCC 'Format Complete' FCB 4 * UFSUB JSR INITDR LDX #DISFOS JSR PDATA1 UFSUB1 LBSR RCHAR BCC UFSUB1 LBSR SCHAR CMPA #'0' LBLO UFEXIT CMPA #'3' LBHI UFEXIT SUBA #'0' TFR A,B STB DRVNUM LDX #DRVNUM-3 JSR DRVSEL * * set up free chain * LDX #BUFFER clear out buffer CLRA CLRB DFL1 STA 0,X+ DECB BNE DFL1 * CLR TRACK LDA #1 STA SECTOR DFL2 LDX #BUFFER LDA TRACK STA 0,X LDA SECTOR INCA CMPA #RMAXSEC+1 last sector on track? BNE DFL3 INC 0,X LDA #1 DFL3 STA 1,X LDA TRACK LDB SECTOR JSR WRITSC INC SECTOR LDA SECTOR CMPA #RMAXSEC+1 BNE DFL2 LDA #1 STA SECTOR INC TRACK LDA TRACK CMPA #RMAXTRK BNE DFL2 * break free chain at last track/sector LDX #BUFFER LDA #RMAXTRK-1 LDB #RMAXSEC JSR READSC LDX #BUFFER CLR 0,X CLR 1,X LDA #RMAXTRK-1 LDB #RMAXSEC JSR WRITSC * set up sector structure, SIR, directory etc LDX #BUFFER CLRA LDB #RMAXSEC JSR READSC LDX #BUFFER CLR 0,X break end of directory chain CLR 1,X CLRA LDB #RMAXSEC JSR WRITSC * LDX #BUFFER CLRA LDB #3 set up SIR JSR READSC LDX #BUFFER CLR 0,X break forward link CLR 1,X LDD #$5241 set volume name (RAMDISK ) STD 16,X LDD #$4D44 STD 18,X LDD #$4953 STD 20,X LDD #$4B20 STD 22,X LDD #1 volume number STD 27,X LDD #$0101 first trk/sec 01-01 STD 29,X LDA #RMAXTRK-1 LDB #RMAXSEC STD 31,X STD 38,X LDD #RTOTSEC total DATA sectors (2912-14) STD 33,X * LDA #01 month set default creation date (SYS09's birthday!) STA 35,X LDA #07 day STA 36,X LDA #07 year STA 37,X * RF3 CLRA LDB #3 JSR WRITSC * * Not sure what this is about * put bootstrap on track 0 sector 1 * * 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 #$C000 CLRA TRACK 0 LDB #$01 SECTOR 1 STA TRACK STB SECTOR LBSR WRITSC * UFEXIT LDX #UFMSG1 JMP PDATA1 * * Read a byte from the serial port * LRBYTE PSHS B BSR LRHEX Get hex digit. ASLA ASLA Shift to msb. ASLA ASLA TFR A,B Save in B. BSR LRHEX Get next digit. PSHS B ADDA 0,S+ Add together bytes. PULS B,PC * LRHEX JSR INTER BVS LRHEX SUBA #$30 Remove ascii bias. BMI LRHEX CMPA #$09 Number? BLE LRHEX1 Yes. CMPA #$11 Keep testing. BMI LRHEX CMPA #$16 BGT LRHEX SUBA #$07 LRHEX1 RTS * * ACIA INPUT TEST * INTEST LDA ACIAC1 BITA #$01 RTS * * RESET ACIA * ACIRST LDA #$03 master reset STA ACIAC1 LDA #$11 STA ACIAC1 RTS * * ACIA INPUT * INTER LDA #16 STA DELCNT+0 CLR DELCNT+1 CLR DELCNT+2 INTER0 LDA ACIAC1 BITA #$01 BNE INTER1 BITA #$78 BEQ INTER2 BSR ACIRST BRA INTER * INTER1 LDA ACIAD1 ANDCC #VFLAG RTS * INTER2 DEC DELCNT+2 BNE INTER0 DEC DELCNT+1 BNE INTER0 DEC DELCNT+0 BNE INTER0 CLRA ORCC #VFLAG RTS * * ACIA OUTPUT * OUTTER PSHS A * OUTTE1 LDA ACIAC1 BITA #$02 BNE OUTTE2 BITA #$78 BEQ OUTTE1 BSR ACIRST BRA OUTTE1 * OUTTE2 PULS A STA ACIAD1 RTS * * Print Data * PDATA0 BSR OUTTER PDATA1 LDA ,X+ CMPA #$04 BNE PDATA0 RTS * ** FLEX 9 IDE DISK DRIVERS * * FOR SYS09BUG 1.2 ON THE XSA-3S1000 * WITH I/O MAPPED AT $XE000 * AND ROM MAPPED AT $XF000 * * IMASK EQU $10 IRQ MASK CC FMASK EQU $40 FIRQ MASK CC * CF_BASE EQU $E100 CF_DATA EQU CF_BASE+0 CF_ERROR EQU CF_BASE+2 ; read error CF_FEATURE EQU CF_BASE+2 ; write feature CF_SCNT EQU CF_BASE+4 CF_SNUM EQU CF_BASE+6 CF_CLO EQU CF_BASE+8 CF_CHI EQU CF_BASE+10 CF_HEAD EQU CF_BASE+12 CF_STATUS EQU CF_BASE+14 ; read status CF_COMAND EQU CF_BASE+14 ; write command CF_AUX EQU CF_BASE+30 * * Command Equates * CMDREAD EQU $20 ; Read Single sector CMDWRITE EQU $30 ; Write Single sector AUXRESET EQU $06 AUXRSTREL EQU $02 HEADLBA EQU $E0 * * Status bit equates * BSY EQU $80 DRDY EQU $40 DRQ EQU $08 ERR EQU $01 * * * INITIALIZE CF CARD FOR 8 BIT LBA MODE * INITDR LDD #AUXRESET STD CF_AUX LDD #AUXRSTREL STD CF_AUX LDD #HEADLBA STD CF_HEAD BRA WAITRDY * * RESTORE DISK DRIVER (SEEK TRACK 00) * RESTR1 BSR DRVSEL CLRA ; Track 0 LDB #$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 PSHS A CLRA DECB STD CF_SNUM LDB ,S STD CF_CLO LDB DRVNUM STD CF_CHI LDB #$01 STD CF_SCNT CLRB PULS A,PC * * READ SECTORS FROM CF * * READSC BSR SEEKTS LDD #CMDREAD ; IDE READ MULTIPLE STD CF_COMAND BSR WAITRDY * * READ LOOP * PSHS Y LDY #256 RDLP1 BSR WAITDRQ LDD CF_DATA STB ,X+ LEAY -1,Y BNE RDLP1 PULS Y * BSR WAITRDY CLRB RTS * * WRITE SECTOR TO CF * WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR LDD #CMDWRITE ; IDE WRITE MULTIPLE STD CF_COMAND BSR WAITRDY * * WRITE LOOP * PSHS Y LDY #256 CLRA WRTLP1 BSR WAITDRQ LDB ,X+ STD CF_DATA LEAY -1,Y BNE WRTLP1 PULS Y * BSR WAITRDY CLRB RTS * * CHECK FOR BUSY * Doubles as VERIFY * BUSY CLRB Never busy RTS * * DRIVE SELECT DISK DRIVER * DRVSEL LDA 3,X GET DRIVE # FROM FCB CMPA #3 BLS DRVS2 IF > 3, SET IT TO 0 CLRA DRVS2 STA DRVNUM CLRB ; SET Z, CLEAR C RTS * * CHECK DRIVE READY DISK DRIVER * CHKDRV LDA 3,X CLRB ; CLEAR C, SET Z RTS * * WAIT UNTIL READY * WAITRDY LDD CF_STATUS BITB #BSY BNE WAITRDY LDD CF_STATUS BITB #DRDY BEQ WAITRDY RTS * * WAIT FOR DATA REQUEST * WAITDRQ LDD CF_STATUS BITB #DRQ BEQ WAITDRQ RTS * ******************************************************* * * 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 $C0FF SCTBUF EQU $C300 * * Start of Utility * ORG $C000 BOOT BRA LOAD0 FCB 0,0,0 TRK FCB 0 File start track SCT FCB 0 File start sector DNS FCB 0 Density Flag (not used) TADR FDB $C000 Transfer address LADR FDB 0 Load Address DRNUM FCB 0 Drive number 0 * LOAD0 LDS #STACK Set up stack LDD TRK Set up start track and sector STD SCTBUF LDY #SCTBUF+256 * * Perform actual file load * LOAD1 BSR GETCH Get acharcater CMPA #$02 Data record hearder ? BEQ LOAD2 Skip, is so CMPA #$16 Xfr address hearder ? BNE LOAD1 Loop if neither * * Get transfer address * BSR GETCH STA TADR BSR GETCH STA TADR+1 BRA LOAD1 * * Load data record * LOAD2 BSR GETCH Get load address STA LADR BSR GETCH STA LADR+1 BSR GETCH Get Bytes count TFR A,B TSTB BEQ LOAD1 Loop if count = 0 LDX LADR Get load address LOAD3 PSHS B,X BSR GETCH Get data character PULS B,X STA ,X+ Store at load address DECB BNE LOAD3 Loop until count = 0 BRA LOAD1 * * Get Character routine * Reads a sector if needed * GETCH CMPY #SCTBUF+256 out of data ? BNE GETCH4 Go read Character if not GETCH2 LDX #SCTBUF Point to buffer LDD 0,X Get forward Link BEQ GO if zero, file is loaded BSR READ Read next sector BNE BOOT start over if error LDY #SCTBUF+4 Point past link GETCH4 LDA ,Y+ Else, get a character RTS * * File is loaded, Jump to it * GO JMP [TADR] Jump to transfer address * ** FLEX 9 IDE DISK DRIVERS * * FOR SYS09BUG 1.2 ON THE XSA-3S1000 * WITH I/O MAPPED AT $XE000 * AND ROM MAPPED AT $XF000 * *IMASK EQU $10 IRQ MASK CC *FMASK EQU $40 FIRQ MASK CC * *CF_BASE EQU $E100 *CF_DATA EQU CF_BASE+0 *CF_ERROR EQU CF_BASE+2 ; read error *CF_FEATURE EQU CF_BASE+2 ; write feature *CF_SCNT EQU CF_BASE+4 *CF_SNUM EQU CF_BASE+6 *CF_CLO EQU CF_BASE+8 *CF_CHI EQU CF_BASE+10 *CF_HEAD EQU CF_BASE+12 *CF_STATUS EQU CF_BASE+14 ; read status *CF_COMAND EQU CF_BASE+14 ; write command *CF_AUX EQU CF_BASE+30 * * Command Equates * *CMDREAD EQU $20 ; Read Single sector *CMDWRITE EQU $30 ; Write Single sector *HEADLBA EQU $E0 *AUXRESET EQU $06 *AUXRSTREL EQU $02 * * 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 PSHS A CLRA DECB STD CF_SNUM LDB ,S STD CF_CLO LDB DRNUM STD CF_CHI LDB #$01 STD CF_SCNT CLRB PULS A,PC * * READ SECTORS FROM CF * * READ BSR SEEK LDD #CMDREAD ; IDE READ MULTIPLE STD CF_COMAND BSR WTRDY * * READ LOOP * PSHS Y LDY #256 READ1 BSR WTDRQ LDD CF_DATA STB ,X+ LEAY -1,Y BNE READ1 PULS Y * BSR WTRDY CLRB RTS * * WAIT UNTIL READY * WTRDY LDD CF_STATUS BITB #BSY BNE WTRDY LDD CF_STATUS BITB #DRDY BEQ WTRDY RTS * * WAIT FOR DATA REQUEST * WTDRQ LDD CF_STATUS BITB #DRQ BEQ WTDRQ RTS * END START