Hex Artifact Content
Not logged in

Artifact c22c09b80a674a44f7faccfeceb12e758d3ad94c:


0000: 2f 2f 20 44 72 69 76 65 72 20 66 6f 72 20 74 68  // Driver for th
0010: 65 20 43 46 20 43 61 72 64 20 6f 6e 20 74 68 65  e CF Card on the
0020: 20 62 72 65 61 64 62 6f 61 72 64 0a 0a 2f 2f 20   breadboard..// 
0030: 64 65 66 69 6e 65 73 20 66 6f 72 20 74 68 65 20  defines for the 
0040: 43 46 20 63 61 72 64 20 72 65 67 69 73 74 65 72  CF card register
0050: 73 0a 09 63 66 72 65 67 73 20 3d 20 30 78 66 65  s..cfregs = 0xfe
0060: 30 30 0a 09 63 66 64 61 74 61 20 3d 20 63 66 72  00..cfdata = cfr
0070: 65 67 73 20 2b 20 30 0a 09 63 66 65 72 72 20 20  egs + 0..cferr  
0080: 3d 20 63 66 72 65 67 73 20 2b 20 31 09 2f 2f 20  = cfregs + 1.// 
0090: 72 64 0a 09 63 66 66 65 61 74 20 3d 20 63 66 72  rd..cffeat = cfr
00a0: 65 67 73 20 2b 20 31 09 2f 2f 20 77 72 0a 09 63  egs + 1.// wr..c
00b0: 66 63 6e 74 20 20 3d 20 63 66 72 65 67 73 20 2b  fcnt  = cfregs +
00c0: 20 32 0a 09 63 66 6c 62 61 30 20 3d 20 63 66 72   2..cflba0 = cfr
00d0: 65 67 73 20 2b 20 33 0a 09 63 66 6c 62 61 31 20  egs + 3..cflba1 
00e0: 3d 20 63 66 72 65 67 73 20 2b 20 34 0a 09 63 66  = cfregs + 4..cf
00f0: 6c 62 61 32 20 3d 20 63 66 72 65 67 73 20 2b 20  lba2 = cfregs + 
0100: 35 0a 09 63 66 6c 62 61 33 20 3d 20 63 66 72 65  5..cflba3 = cfre
0110: 67 73 20 2b 20 36 0a 09 63 66 73 74 61 74 20 3d  gs + 6..cfstat =
0120: 20 63 66 72 65 67 73 20 2b 20 37 09 2f 2f 20 72   cfregs + 7.// r
0130: 64 0a 09 63 66 63 6d 64 20 20 3d 20 63 66 72 65  d..cfcmd  = cfre
0140: 67 73 20 2b 20 37 09 2f 2f 20 77 72 0a 0a 2f 2f  gs + 7.// wr..//
0150: 20 64 65 66 69 6e 65 73 20 66 6f 72 20 43 46 20   defines for CF 
0160: 63 61 72 64 20 63 6f 6d 6d 61 6e 64 73 20 69 6e  card commands in
0170: 20 75 70 70 65 72 20 62 79 74 65 0a 09 53 45 54   upper byte..SET
0180: 46 45 41 54 20 3d 20 30 78 65 66 30 30 09 2f 2f  FEAT = 0xef00.//
0190: 20 73 65 74 20 66 65 61 74 75 72 65 0a 09 52 44   set feature..RD
01a0: 53 45 43 54 20 20 3d 20 30 78 32 30 30 30 09 2f  SECT  = 0x2000./
01b0: 2f 20 72 65 61 64 20 73 65 63 74 6f 72 0a 09 57  / read sector..W
01c0: 52 53 45 43 54 20 20 3d 20 30 78 33 30 30 30 09  RSECT  = 0x3000.
01d0: 2f 2f 20 77 72 69 74 65 20 73 65 63 74 6f 72 0a  // write sector.
01e0: 09 49 44 45 4e 54 20 20 20 3d 20 30 78 65 63 30  .IDENT   = 0xec0
01f0: 30 09 2f 2f 20 69 64 65 6e 74 69 66 79 20 64 72  0.// identify dr
0200: 69 76 65 0a 09 42 59 54 45 4d 4f 44 20 3d 20 30  ive..BYTEMOD = 0
0210: 78 30 31 30 30 09 2f 2f 20 38 20 62 69 74 20 61  x0100.// 8 bit a
0220: 63 63 65 73 73 20 6d 6f 64 65 0a 09 0a 2f 2f 20  ccess mode...// 
0230: 64 65 66 69 6e 65 73 20 66 6f 72 20 73 74 61 74  defines for stat
0240: 75 73 20 62 69 74 73 0a 09 45 52 52 20 20 20 20  us bits..ERR    
0250: 20 3d 20 30 78 30 31 30 30 09 2f 2f 20 65 72 72   = 0x0100.// err
0260: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 0a 09 44 52  or condition..DR
0270: 51 20 20 20 20 20 3d 20 30 78 30 38 30 30 09 2f  Q     = 0x0800./
0280: 2f 20 64 61 74 61 20 72 65 71 75 65 73 74 0a 0a  / data request..
0290: 2f 2f 20 69 6d 61 67 65 20 76 65 63 74 6f 72 73  // image vectors
02a0: 20 6c 65 66 74 20 62 65 68 69 6e 64 20 62 79 20   left behind by 
02b0: 62 6f 6f 74 20 6c 6f 61 64 65 72 0a 09 63 66 64  boot loader..cfd
02c0: 73 6b 30 09 3d 20 30 78 66 66 30 30 09 2f 2f 20  sk0.= 0xff00.// 
02d0: 62 61 73 65 20 73 65 63 74 6f 72 20 6f 66 20 44  base sector of D
02e0: 53 4b 30 20 69 6d 61 67 65 20 28 33 32 20 62 69  SK0 image (32 bi
02f0: 74 29 0a 09 63 66 64 73 6b 31 20 20 3d 20 30 78  t)..cfdsk1  = 0x
0300: 66 66 30 34 09 2f 2f 20 62 61 73 65 20 73 65 63  ff04.// base sec
0310: 74 6f 72 20 6f 66 20 44 53 4b 31 20 69 6d 61 67  tor of DSK1 imag
0320: 65 20 28 33 32 20 62 69 74 29 0a 0a 2f 2f 20 61  e (32 bit)..// a
0330: 72 67 75 6d 65 6e 74 73 20 74 6f 20 63 66 5f 63  rguments to cf_c
0340: 61 72 64 5f 72 64 2c 20 63 66 5f 63 61 72 64 5f  ard_rd, cf_card_
0350: 77 72 0a 09 64 65 76 09 3d 20 32 32 0a 09 62 6c  wr..dev.= 22..bl
0360: 6b 6e 6f 09 3d 20 32 34 0a 09 61 64 64 72 09 3d  kno.= 24..addr.=
0370: 20 32 36 0a 09 77 63 6f 75 6e 74 09 3d 20 32 38   26..wcount.= 28
0380: 0a 0a 09 2e 74 65 78 74 0a 0a 2f 2f 20 53 65 65  ....text..// See
0390: 6b 20 64 69 73 6b 20 62 6c 6f 63 6b 0a 73 65 65  k disk block.see
03a0: 6b 3a 0a 09 6c 69 09 72 32 2c 63 66 64 73 6b 30  k:..li.r2,cfdsk0
03b0: 09 2f 2f 20 73 74 61 72 74 69 6e 67 20 73 65 63  .// starting sec
03c0: 74 6f 72 20 6f 66 20 64 73 6b 30 20 69 6d 61 67  tor of dsk0 imag
03d0: 65 0a 09 6d 6f 76 09 40 64 65 76 28 62 70 29 2c  e..mov.@dev(bp),
03e0: 72 30 0a 09 6a 65 71 09 31 66 0a 09 6c 69 09 72  r0..jeq.1f..li.r
03f0: 32 2c 63 66 64 73 6b 31 09 2f 2f 20 73 74 61 72  2,cfdsk1.// star
0400: 74 69 6e 67 20 73 65 63 74 6f 72 20 6f 66 20 64  ting sector of d
0410: 73 6b 31 20 69 6d 61 67 65 0a 31 3a 09 6d 6f 76  sk1 image.1:.mov
0420: 09 40 62 6c 6b 6e 6f 28 62 70 29 2c 72 31 09 2f  .@blkno(bp),r1./
0430: 2f 20 72 65 71 75 65 73 74 65 64 20 73 65 63 74  / requested sect
0440: 6f 72 20 6e 75 6d 62 65 72 0a 09 6d 6f 76 09 28  or number..mov.(
0450: 72 32 29 2b 2c 72 30 09 2f 2f 20 61 64 64 20 73  r2)+,r0.// add s
0460: 74 61 72 74 20 74 6f 20 72 65 71 75 65 73 74 65  tart to requeste
0470: 64 20 74 6f 20 67 65 74 0a 09 61 09 28 72 32 29  d to get..a.(r2)
0480: 2c 72 31 09 09 2f 2f 20 20 20 33 32 20 62 69 74  ,r1..//   32 bit
0490: 20 4c 42 41 20 6f 66 20 72 65 71 2e 20 73 65 63   LBA of req. sec
04a0: 74 6f 72 0a 09 6a 6e 63 20 20 20 20 20 31 66 0a  tor..jnc     1f.
04b0: 09 69 6e 63 09 72 30 0a 31 3a 09 6d 6f 76 62 09  .inc.r0.1:.movb.
04c0: 72 31 2c 40 63 66 6c 62 61 31 09 2f 2f 20 6d 6f  r1,@cflba1.// mo
04d0: 76 65 20 74 68 65 20 4c 42 41 20 74 6f 20 74 68  ve the LBA to th
04e0: 65 20 43 46 20 43 61 72 64 0a 09 73 77 70 62 09  e CF Card..swpb.
04f0: 72 31 09 09 2f 2f 20 20 20 20 72 65 67 69 73 74  r1..//    regist
0500: 65 72 73 20 61 6e 64 20 73 65 74 20 74 72 61 6e  ers and set tran
0510: 73 66 65 72 0a 09 6d 6f 76 62 09 72 31 2c 40 63  sfer..movb.r1,@c
0520: 66 6c 62 61 30 09 2f 2f 20 20 20 20 6c 65 6e 67  flba0.//    leng
0530: 74 68 20 74 6f 20 31 20 73 65 63 74 6f 72 0a 09  th to 1 sector..
0540: 61 6e 64 69 09 72 30 2c 30 78 30 66 66 66 0a 09  andi.r0,0x0fff..
0550: 6f 72 69 09 72 30 2c 30 78 65 30 30 30 0a 09 6d  ori.r0,0xe000..m
0560: 6f 76 62 09 72 30 2c 40 63 66 6c 62 61 33 0a 09  ovb.r0,@cflba3..
0570: 73 77 70 62 09 72 30 0a 09 6d 6f 76 62 09 72 30  swpb.r0..movb.r0
0580: 2c 40 63 66 6c 62 61 32 0a 09 6c 69 09 72 30 2c  ,@cflba2..li.r0,
0590: 30 78 30 31 30 30 0a 09 6d 6f 76 62 09 72 30 2c  0x0100..movb.r0,
05a0: 40 63 66 63 6e 74 0a 09 62 09 28 72 31 31 29 0a  @cfcnt..b.(r11).
05b0: 0a 2f 2f 20 52 65 61 64 20 35 31 32 20 62 79 74  .// Read 512 byt
05c0: 65 20 62 6c 6f 63 6b 20 66 72 6f 6d 20 74 68 65  e block from the
05d0: 20 43 46 20 43 61 72 64 0a 72 64 62 6c 6f 63 6b   CF Card.rdblock
05e0: 3a 0a 31 3a 09 6d 6f 76 62 09 40 63 66 73 74 61  :.1:.movb.@cfsta
05f0: 74 2c 72 30 09 2f 2f 20 77 61 69 74 20 63 61 72  t,r0.// wait car
0600: 64 20 72 65 61 64 79 0a 09 6a 6c 74 09 31 62 0a  d ready..jlt.1b.
0610: 09 6c 69 09 72 30 2c 52 44 53 45 43 54 09 2f 2f  .li.r0,RDSECT.//
0620: 20 69 73 73 75 65 20 72 65 61 64 20 63 6f 6d 6d   issue read comm
0630: 61 6e 64 0a 09 6d 6f 76 62 09 72 30 2c 40 63 66  and..movb.r0,@cf
0640: 63 6d 64 0a 31 3a 09 6d 6f 76 62 09 40 63 66 73  cmd.1:.movb.@cfs
0650: 74 61 74 2c 72 30 09 2f 2f 20 77 61 69 74 20 63  tat,r0.// wait c
0660: 61 72 64 20 72 65 61 64 79 0a 09 6d 6f 76 62 09  ard ready..movb.
0670: 72 30 2c 72 31 0a 09 6a 6c 74 09 31 62 0a 09 61  r0,r1..jlt.1b..a
0680: 6e 64 69 09 72 30 2c 44 52 51 09 09 2f 2f 20 61  ndi.r0,DRQ..// a
0690: 6e 64 20 64 61 74 61 20 72 65 61 64 79 0a 09 6a  nd data ready..j
06a0: 65 71 09 31 62 0a 09 61 6e 64 69 09 72 31 2c 45  eq.1b..andi.r1,E
06b0: 52 52 09 09 2f 2f 20 63 68 65 63 6b 20 66 6f 72  RR..// check for
06c0: 20 65 72 72 6f 72 0a 09 6a 6e 65 09 32 66 0a 09   error..jne.2f..
06d0: 6c 69 09 72 31 2c 35 31 32 0a 31 3a 09 6d 6f 76  li.r1,512.1:.mov
06e0: 62 09 40 63 66 64 61 74 61 2c 28 72 31 30 29 2b  b.@cfdata,(r10)+
06f0: 0a 09 64 65 63 09 72 31 0a 09 6a 6e 65 09 31 62  ..dec.r1..jne.1b
0700: 0a 09 62 09 28 72 31 31 29 0a 0a 32 3a 09 6d 6f  ..b.(r11)..2:.mo
0710: 76 62 09 40 63 66 65 72 72 2c 72 32 09 2f 2f 20  vb.@cferr,r2.// 
0720: 66 65 74 63 68 20 65 72 72 6f 72 20 63 6f 64 65  fetch error code
0730: 0a 09 73 72 6c 09 72 32 2c 38 0a 09 62 09 28 72  ..srl.r2,8..b.(r
0740: 31 31 29 0a 0a 2f 2f 20 72 65 61 64 20 27 77 63  11)..// read 'wc
0750: 6f 75 6e 74 27 20 77 6f 72 64 73 20 66 72 6f 6d  ount' words from
0760: 20 27 64 65 76 27 20 73 74 61 72 74 69 6e 67 20   'dev' starting 
0770: 61 74 20 27 62 6c 6b 6e 6f 27 20 74 6f 20 27 61  at 'blkno' to 'a
0780: 64 64 72 27 0a 09 2e 67 6c 6f 62 6c 09 5f 63 66  ddr'...globl._cf
0790: 72 65 61 64 0a 5f 63 66 72 65 61 64 3a 0a 09 6d  read._cfread:..m
07a0: 6f 76 20 20 20 20 20 72 31 31 2c 72 30 0a 09 62  ov     r11,r0..b
07b0: 6c 20 20 20 20 20 20 40 63 73 76 0a 09 6d 6f 76  l      @csv..mov
07c0: 09 40 77 63 6f 75 6e 74 28 62 70 29 2c 72 39 0a  .@wcount(bp),r9.
07d0: 09 73 72 6c 09 72 39 2c 38 0a 09 6a 65 71 09 32  .srl.r9,8..jeq.2
07e0: 66 0a 09 6d 6f 76 09 40 61 64 64 72 28 62 70 29  f..mov.@addr(bp)
07f0: 2c 72 31 30 0a 31 3a 09 62 6c 09 40 73 65 65 6b  ,r10.1:.bl.@seek
0800: 0a 09 62 6c 09 40 72 64 62 6c 6f 63 6b 0a 09 6a  ..bl.@rdblock..j
0810: 6e 65 09 32 66 0a 09 69 6e 63 09 40 62 6c 6b 6e  ne.2f..inc.@blkn
0820: 6f 28 62 70 29 0a 09 64 65 63 09 72 39 0a 09 6a  o(bp)..dec.r9..j
0830: 6e 65 09 31 62 0a 09 63 6c 72 09 72 32 0a 32 3a  ne.1b..clr.r2.2:
0840: 09 62 09 40 63 72 65 74 0a 0a 2f 2f 20 77 72 69  .b.@cret..// wri
0850: 74 65 20 35 31 32 20 62 79 74 65 20 62 6c 6f 63  te 512 byte bloc
0860: 6b 20 74 6f 20 74 68 65 20 43 46 20 43 61 72 64  k to the CF Card
0870: 0a 77 72 62 6c 6f 63 6b 3a 0a 31 3a 09 6d 6f 76  .wrblock:.1:.mov
0880: 62 09 40 63 66 73 74 61 74 2c 72 30 09 2f 2f 20  b.@cfstat,r0.// 
0890: 77 61 69 74 20 63 61 72 64 20 72 65 61 64 79 0a  wait card ready.
08a0: 09 6a 6c 74 09 31 62 0a 09 6c 69 09 72 30 2c 57  .jlt.1b..li.r0,W
08b0: 52 53 45 43 54 09 2f 2f 20 69 73 73 75 65 20 72  RSECT.// issue r
08c0: 65 61 64 20 63 6f 6d 6d 61 6e 64 0a 09 6d 6f 76  ead command..mov
08d0: 62 09 72 30 2c 40 63 66 63 6d 64 0a 31 3a 09 6d  b.r0,@cfcmd.1:.m
08e0: 6f 76 62 09 40 63 66 73 74 61 74 2c 72 30 09 2f  ovb.@cfstat,r0./
08f0: 2f 20 77 61 69 74 20 63 61 72 64 20 72 65 61 64  / wait card read
0900: 79 0a 09 6a 6c 74 09 31 62 0a 09 61 6e 64 69 09  y..jlt.1b..andi.
0910: 72 30 2c 44 52 51 09 09 2f 2f 20 61 6e 64 20 64  r0,DRQ..// and d
0920: 61 74 61 20 72 65 61 64 79 0a 09 6a 65 71 09 31  ata ready..jeq.1
0930: 62 0a 09 6c 69 09 72 31 2c 35 31 32 0a 31 3a 09  b..li.r1,512.1:.
0940: 6d 6f 76 62 09 28 72 31 30 29 2b 2c 40 63 66 64  movb.(r10)+,@cfd
0950: 61 74 61 0a 09 64 65 63 09 72 31 0a 09 6a 6e 65  ata..dec.r1..jne
0960: 09 31 62 0a 09 6d 6f 76 62 09 40 63 66 73 74 61  .1b..movb.@cfsta
0970: 74 2c 72 30 09 2f 2f 20 63 68 65 63 6b 20 66 6f  t,r0.// check fo
0980: 72 20 65 72 72 6f 72 0a 09 61 6e 64 69 09 72 30  r error..andi.r0
0990: 2c 45 52 52 0a 09 6a 65 71 09 31 66 0a 09 6d 6f  ,ERR..jeq.1f..mo
09a0: 76 62 09 40 63 66 65 72 72 2c 72 32 09 2f 2f 20  vb.@cferr,r2.// 
09b0: 66 65 74 63 68 20 65 72 72 6f 72 20 63 6f 64 65  fetch error code
09c0: 0a 09 73 72 6c 09 72 32 2c 38 0a 31 3a 09 62 09  ..srl.r2,8.1:.b.
09d0: 28 72 31 31 29 0a 0a 2f 2f 20 77 72 69 74 65 20  (r11)..// write 
09e0: 27 77 63 6f 75 6e 74 27 20 77 6f 72 64 73 20 66  'wcount' words f
09f0: 72 6f 6d 20 27 61 64 64 72 27 20 74 6f 20 27 64  rom 'addr' to 'd
0a00: 65 76 27 20 73 74 61 72 74 69 6e 67 20 61 74 20  ev' starting at 
0a10: 27 62 6c 6b 6e 6f 27 0a 09 2e 67 6c 6f 62 6c 09  'blkno'...globl.
0a20: 5f 63 66 77 72 69 74 65 0a 5f 63 66 77 72 69 74  _cfwrite._cfwrit
0a30: 65 3a 0a 09 6d 6f 76 20 20 20 20 20 72 31 31 2c  e:..mov     r11,
0a40: 72 30 0a 09 62 6c 20 20 20 20 20 20 40 63 73 76  r0..bl      @csv
0a50: 0a 09 6d 6f 76 09 40 77 63 6f 75 6e 74 28 62 70  ..mov.@wcount(bp
0a60: 29 2c 72 39 0a 09 73 72 6c 09 72 39 2c 38 0a 09  ),r9..srl.r9,8..
0a70: 6a 65 71 09 32 66 0a 09 6d 6f 76 09 40 61 64 64  jeq.2f..mov.@add
0a80: 72 28 62 70 29 2c 72 31 30 0a 31 3a 09 62 6c 09  r(bp),r10.1:.bl.
0a90: 40 73 65 65 6b 0a 09 62 6c 09 40 77 72 62 6c 6f  @seek..bl.@wrblo
0aa0: 63 6b 0a 09 6a 6e 65 09 32 66 0a 09 69 6e 63 09  ck..jne.2f..inc.
0ab0: 40 62 6c 6b 6e 6f 28 62 70 29 0a 09 64 65 63 09  @blkno(bp)..dec.
0ac0: 72 39 0a 09 6a 6e 65 09 31 62 0a 09 63 6c 72 09  r9..jne.1b..clr.
0ad0: 72 32 0a 32 3a 09 62 09 40 63 72 65 74 0a 0a 2f  r2.2:.b.@cret../
0ae0: 2f 20 69 6e 69 74 20 43 46 20 63 61 72 64 2c 20  / init CF card, 
0af0: 73 65 74 20 38 2d 62 69 74 20 6d 6f 64 65 0a 09  set 8-bit mode..
0b00: 2e 67 6c 6f 62 6c 09 5f 63 66 69 6e 69 74 0a 5f  .globl._cfinit._
0b10: 63 66 69 6e 69 74 3a 0a 31 3a 09 6d 6f 76 62 09  cfinit:.1:.movb.
0b20: 40 63 66 73 74 61 74 2c 72 30 0a 09 6a 6c 74 09  @cfstat,r0..jlt.
0b30: 31 62 0a 09 6d 6f 76 62 09 40 7a 65 72 6f 2c 40  1b..movb.@zero,@
0b40: 63 66 6c 62 61 33 0a 09 6c 69 09 72 30 2c 42 59  cflba3..li.r0,BY
0b50: 54 45 4d 4f 44 0a 09 6d 6f 76 62 09 72 30 2c 40  TEMOD..movb.r0,@
0b60: 63 66 66 65 61 74 0a 09 6c 69 09 72 30 2c 53 45  cffeat..li.r0,SE
0b70: 54 46 45 41 54 0a 09 6d 6f 76 62 09 72 30 2c 40  TFEAT..movb.r0,@
0b80: 63 66 63 6d 64 0a 09 62 09 28 72 31 31 29 0a 09  cfcmd..b.(r11)..
0b90: 0a 09 2e 64 61 74 61 0a 7a 65 72 6f 3a 09 30 0a  ...data.zero:.0.
0ba0: 0a 0a                                            ..