亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? c64-fs.c

?? 偉大的Contiki工程, 短小精悍 的操作系統(tǒng), 學(xué)習(xí)編程不可不看
?? C
字號(hào):
/** * \defgroup c64fs C64 file system and disk functions. * @{ * * The C64 file system functions are divided into two categories: * those that deal with C64 files and the C64 disk directory, and * those that allow direct block access to the disk. The former * functions can be used for accessing regular files, whereas the * latter functions are used e.g. to download D64 files onto 1541 * disks. * * \note The C64 filesystem functions currently only work with the * 1541/1541-II/1571 and compatible drives, and not with the IDE64 * hard disks or the 1581/FD2000 3.5" drives. * *  *//** * \file * C64 file system operations interface for Contiki. * \author Adam Dunkels <adam@dunkels.com> * *//* * Copyright (c) 2003, Adam Dunkels. * All rights reserved.  * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * 2. Redistributions in binary form must reproduce the above *    copyright notice, this list of conditions and the following *    disclaimer in the documentation and/or other materials provided *    with the distribution.  * 3. The name of the author may not be used to endorse or promote *    products derived from this software without specific prior *    written permission.   * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   * * This file is part of the Contiki desktop environment  * * $Id: c64-fs.c,v 1.1 2007/05/23 23:11:28 oliverschmidt Exp $ * */#include "c64-dio.h"#include "c64-dio-asm.h"#include "c64-fs.h"#include <string.h>#include <stdio.h>struct directory_entry {  unsigned char type;  unsigned char track, sect;  unsigned char name[16];  unsigned char reltrack, relsect, relreclen;  unsigned char unused1, unused2, unused3, unused4;  unsigned char tmptrack, tmpsect;  unsigned char blockslo, blockshi;};unsigned char _c64_fs_dirbuf[256];unsigned char _c64_fs_dirbuftrack = 0, _c64_fs_dirbufsect = 0;unsigned char _c64_fs_filebuf[256];unsigned char _c64_fs_filebuftrack = 0, _c64_fs_filebufsect = 0;static struct c64_fs_dirent lastdirent;static struct c64_fs_dir opendir;static struct c64_fs_dirent opendirent;/*-----------------------------------------------------------------------------------*//** * Open a file. * * The file description must be allocated by the caller and a pointer * to it is passed to this function. * * \param name A pointer to the name of the file to be opened. * \param f A pointer to the file descriptor struct. * * \retval 0 If the file was successfully opened. * \retval -1 If the file does not exist. *//*-----------------------------------------------------------------------------------*/intc64_fs_open(const char *name, register struct c64_fs_file *f){  /* First check if we already have the file cached. If so, we don't     need to do an expensive directory lookup. */  if(strncmp(lastdirent.name, name, 16) == 0) {    f->track = lastdirent.track;    f->sect = lastdirent.sect;    f->ptr = 2;    return 0;  }  /* Not in cache, so we walk through directory instead. */  c64_fs_opendir(&opendir);  do {    c64_fs_readdir_dirent(&opendir, &opendirent);    if(strncmp(opendirent.name, name, 16) == 0) {      f->track = opendirent.track;      f->sect = opendirent.sect;      f->ptr = 2;      return 0;    }  } while(c64_fs_readdir_next(&opendir) == 0);  /* The file was not found in the directory. We flush the directory     buffer cache now in order to prevent a nasty problem from     happening: If the first directory block of an empty disk was     cached, *all* subsequent file opens would return "file not     found". */  _c64_fs_dirbuftrack = 0; /* There are no disk blocks on track 0. */  return -1;}/*-----------------------------------------------------------------------------------*//** * Read data from an open file. * * This function reads data from an open file into a buffer than must * be allocated by the caller. * * \param f A pointer to a file descriptor structure that must have * been opened with c64_fs_open(). * * \param buf A pointer to the buffer in which the data should be placed. * * \param len The maxiumum amount of bytes to read. * * \return The number of bytes that actually was read, or 0 if an end * of file was encountered. *//*-----------------------------------------------------------------------------------*/#if !NOASM#pragma optimize(push, off)#endif /* !NOASM */int __fastcall__c64_fs_read(register struct c64_fs_file *f, char *buf, int len){  static int i;  /* Check if current block is already in buffer, and if not read it     from disk. */#if NOASM  if(f->track != _c64_fs_filebuftrack ||     _c64_fs_filebufsect != f->sect) {    _c64_fs_filebuftrack = f->track;    _c64_fs_filebufsect = f->sect;    c64_dio_read_block(_c64_fs_filebuftrack, _c64_fs_filebufsect,		       _c64_fs_filebuf);  }#else /* NOASM */  asm("ldy #%b", offsetof(struct c64_fs_file, track));  asm("lda (regbank+%b),y", 4);  asm("cmp %v", _c64_fs_filebuftrack);  asm("bne doblock");    asm("ldy #%b", offsetof(struct c64_fs_file, sect));  asm("lda (regbank+%b),y", 4);  asm("cmp %v", _c64_fs_filebufsect);  asm("bne doblock");  asm("jmp noblock");  asm("doblock:");    asm("ldy #%b", offsetof(struct c64_fs_file, track));  asm("lda (regbank+%b),y", 4);  asm("sta %v", _c64_fs_filebuftrack);  asm("sta %v", c64_dio_asm_track);    asm("ldy #%b", offsetof(struct c64_fs_file, sect));  asm("lda (regbank+%b),y", 4);  asm("sta %v", _c64_fs_filebufsect);  asm("sta %v", c64_dio_asm_sector);  asm("lda #<(%v)", _c64_fs_filebuf);  asm("sta %v", c64_dio_asm_ptr);  asm("lda #>(%v)", _c64_fs_filebuf);  asm("sta %v+1", c64_dio_asm_ptr);  asm("jsr %v", c64_dio_asm_read_block);  asm("noblock:");#endif /* NOASM */  if(_c64_fs_filebuf[0] == 0 &&     f->ptr == _c64_fs_filebuf[1]) {    return 0; /* EOF */  }  for(i = 0; i < len; ++i) {#if NOASM        *buf = _c64_fs_filebuf[f->ptr];    ++f->ptr;#else /* NOASM */	    asm("ldy #%o+1", buf);    asm("jsr ldaxysp");    asm("sta ptr2");    asm("stx ptr2+1");    asm("ldy #%b", offsetof(struct c64_fs_file, ptr));    asm("lda (regbank+%b),y", 4);        asm("tax");    asm("ldy #0");    asm("lda %v,x", _c64_fs_filebuf);    asm("sta (ptr2),y");    asm("inx");    asm("txa");    asm("ldy #%b", offsetof(struct c64_fs_file, ptr));    asm("sta (regbank+%b),y", 4);    #endif /* NOASM */        if(_c64_fs_filebuf[0] == 0) {      if(f->ptr == _c64_fs_filebuf[1]) {	/* End of file reached, we return the amount of bytes read so	   far. */	return i + 1;      }    } else if(f->ptr == 0) {      /* Read new block into buffer and set buffer state	 accordingly. */      _c64_fs_filebuftrack = f->track = _c64_fs_filebuf[0];      _c64_fs_filebufsect = f->sect = _c64_fs_filebuf[1];      f->ptr = 2;      c64_dio_read_block(_c64_fs_filebuftrack,			 _c64_fs_filebufsect, _c64_fs_filebuf);    }        ++buf;  }  return i;}#if !NOASM    #pragma optimize(pop)#endif /* !NOASM *//*-----------------------------------------------------------------------------------*//** * Close an open file. * * \param f A pointer to a file descriptor struct that previously has * been opened with c64_fs_open(). *//*-----------------------------------------------------------------------------------*/voidc64_fs_close(struct c64_fs_file *f){  }/*-----------------------------------------------------------------------------------*//** * \internal * Read a directory buffer into the _c64_fs_dirbuf buffer. * * This function is shared between this and  the c64-fs-raw module. * * \param track The track of the directory block. * \param sect The sector of the directory block. *//*-----------------------------------------------------------------------------------*/void_c64_fs_readdirbuf(unsigned char track, unsigned char sect){  if(_c64_fs_dirbuftrack == track &&     _c64_fs_dirbufsect == sect) {    /* Buffer already contains requested block, return. */    return;  }  c64_dio_read_block(track, sect, _c64_fs_dirbuf);  _c64_fs_dirbuftrack = track;  _c64_fs_dirbufsect = sect;}/*-----------------------------------------------------------------------------------*//** * Open the disk directory for reading. * * The caller must supply a pointer to a directory descriptor. * * \param d A pointer to a directory description that must be * allocated by the caller. *//*-----------------------------------------------------------------------------------*/unsigned charc64_fs_opendir(register struct c64_fs_dir *d){  d->track = 18;  d->sect = 1;  d->ptr = 2;  return 0;}/*-----------------------------------------------------------------------------------*//** * Read the current directory entry. * * This function reads the directory entry to which the directory * descriptor currently points into a struct c64_fs_dirent supplied by * the caller. * * The function c64_fs_readdir_next() is used to move the directory * entry pointer forward in the directory. * * \param d A pointer to a directory descriptor previously opened with c64_fs_opendir(). * * \param f A pointer to a directory entry that must have been * previously allocated by the caller. *//*-----------------------------------------------------------------------------------*/voidc64_fs_readdir_dirent(register struct c64_fs_dir *d,		      register struct c64_fs_dirent *f){  struct directory_entry *de;  int i;  register char *nameptr;    _c64_fs_readdirbuf(d->track, d->sect);  de = (struct directory_entry *)&_c64_fs_dirbuf[d->ptr];  nameptr = de->name;  for(i = 0; i < 16; ++i) {    if(*nameptr == 0xa0) {      *nameptr = 0;      break;    }    ++nameptr;  }  strncpy(f->name, de->name, 16);  f->track = de->track;  f->sect = de->sect;  f->size = de->blockslo + (de->blockshi >> 8);  memcpy(&lastdirent, f, sizeof(struct c64_fs_dirent));}/*-----------------------------------------------------------------------------------*//** * Move the directory pointer forward. * * This function moves the directory entry pointer in the directory * descriptor forward so that it points to the next file. * * \param d A pointer to a directory descriptor previously opened with * c64_fs_opendir(). * * \retval 1 If there are no more directory entried in the directory. * \retval 0 There were more directory entries and the pointer has * been moved to point to the next one. *//*-----------------------------------------------------------------------------------*/unsigned charc64_fs_readdir_next(struct c64_fs_dir *d){  struct directory_entry *de; again:  _c64_fs_readdirbuf(d->track, d->sect);  if(d->ptr == 226) {    if(_c64_fs_dirbuf[0] == 0) {      return 1;    }    d->track = _c64_fs_dirbuf[0];    d->sect = _c64_fs_dirbuf[1];    d->ptr = 2;  } else {    d->ptr += 32;  }  de = (struct directory_entry *)&_c64_fs_dirbuf[d->ptr];  if(de->type == 0) {    goto again;  }  return 0;}/*-----------------------------------------------------------------------------------*//** * Close a directory descriptor previously opened by c64_fs_opendir(). * * \param d A poitner to a directory descriptor previously opened with * c64_fs_opendir(). *//*-----------------------------------------------------------------------------------*/voidc64_fs_closedir(struct c64_fs_dir *d){  }/*-----------------------------------------------------------------------------------*//** @} */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久蜜桃av一区精品变态类天堂| 一区二区三区91| 亚洲欧美成aⅴ人在线观看| 丝瓜av网站精品一区二区| 国产成人av资源| 91精品国产麻豆| 亚洲精品国产无天堂网2021| 国模一区二区三区白浆| 在线国产亚洲欧美| 国产精品久久久久久亚洲伦| 免费高清在线视频一区·| 欧美性高清videossexo| 最新久久zyz资源站| 国产一区二区在线电影| 91精品啪在线观看国产60岁| 亚洲丝袜精品丝袜在线| 岛国av在线一区| 久久久影视传媒| 韩国精品主播一区二区在线观看 | 美女视频黄a大片欧美| 色哟哟日韩精品| 国产精品美女久久久久久2018 | 欧美三级韩国三级日本一级| 国产精品视频观看| 国产精品一级片| 欧美电影免费提供在线观看| 亚洲高清免费视频| 777精品伊人久久久久大香线蕉| 一区二区三区四区不卡在线| 97精品国产露脸对白| 亚洲日本成人在线观看| 成人av高清在线| 亚洲视频你懂的| 色综合天天综合狠狠| 亚洲欧美福利一区二区| 色综合天天综合给合国产| 亚洲美女一区二区三区| 91捆绑美女网站| 亚洲一区二区三区四区在线观看 | 国产精品理伦片| 成人午夜又粗又硬又大| 中文字幕乱码日本亚洲一区二区| 国产成人啪免费观看软件| 久久精品一区二区三区不卡牛牛| 国产精品1024| 亚洲人吸女人奶水| 欧美唯美清纯偷拍| 日本不卡一区二区三区| 日韩一级在线观看| 国产成人在线看| 亚洲裸体xxx| 制服丝袜亚洲精品中文字幕| 男女激情视频一区| 欧美激情综合在线| 在线欧美日韩国产| 免费欧美高清视频| 国产精品视频一区二区三区不卡| 91在线porny国产在线看| 亚洲国产wwwccc36天堂| 精品99一区二区三区| 97久久精品人人澡人人爽| 亚洲午夜久久久久久久久电影院| 欧美一区二区三区成人| 丰满白嫩尤物一区二区| 亚洲国产一区二区三区 | 欧美主播一区二区三区| 免费在线视频一区| 国产精品美女久久久久aⅴ| 精品视频免费在线| 国产盗摄一区二区| 亚洲国产美国国产综合一区二区| 久久这里都是精品| 欧美系列亚洲系列| 国产高清不卡二三区| 亚洲国产一二三| 欧美激情一区二区三区不卡| 欧美三级视频在线播放| 国产乱人伦精品一区二区在线观看| 亚洲精品日韩综合观看成人91| 欧美一二三四区在线| 91在线丨porny丨国产| 裸体在线国模精品偷拍| 一区二区三区中文免费| 久久品道一品道久久精品| 欧美日韩精品一区二区三区四区| 国产一区二区免费看| 丝袜脚交一区二区| 亚洲男女毛片无遮挡| 国产色产综合色产在线视频| 欧美一区二区三区视频| 欧美影视一区在线| 91在线视频播放地址| 国产精品一区二区在线观看不卡| 午夜免费久久看| 依依成人综合视频| 亚洲人亚洲人成电影网站色| 久久久99免费| 久久综合久久综合久久综合| 欧美日韩精品免费| 在线影院国内精品| 99久久99久久免费精品蜜臀| 国产成人在线视频网站| 精品在线观看免费| 麻豆精品一区二区三区| 日日夜夜精品视频免费| 午夜久久久久久| 午夜精品一区二区三区电影天堂 | 国产亚洲精品久| 日韩一区二区三区免费观看| 欧美日韩高清不卡| 欧美日韩一区二区三区高清| 在线观看av不卡| 色狠狠av一区二区三区| 色哟哟欧美精品| 在线一区二区观看| 欧美伊人精品成人久久综合97| 91成人免费在线视频| 在线观看亚洲a| 欧美日韩亚洲综合| 91精品国产综合久久久久久久| 欧美日韩成人一区二区| 欧美一级xxx| 久久久亚洲综合| 国产精品久久久久久久久免费丝袜 | 欧美成人aa大片| 欧美成人精品1314www| 久久色成人在线| 国产农村妇女精品| 亚洲特黄一级片| 亚洲综合精品久久| 免费在线观看一区| 国产乱子轮精品视频| 91在线云播放| 欧美另类高清zo欧美| 精品三级在线看| 国产精品久久久久久久久晋中 | 欧美一级二级三级乱码| 精品国产乱码久久久久久蜜臀| 欧美精品一区视频| 国产精品午夜电影| 午夜视频一区二区三区| 国产在线观看一区二区| 色综合久久久久综合99| 制服丝袜国产精品| 国产精品毛片久久久久久| 亚洲伊人伊色伊影伊综合网| 免费精品视频最新在线| 成人黄色网址在线观看| 欧美精品日韩精品| 中文字幕va一区二区三区| 亚洲一区二区三区在线| 国产精品正在播放| 欧美亚洲丝袜传媒另类| 久久久99精品免费观看不卡| 亚洲精品国产第一综合99久久| 日本不卡高清视频| 色综合中文字幕| 久久久亚洲午夜电影| 亚洲6080在线| 成人精品免费视频| 日韩欧美国产三级电影视频| 国产精品美女久久久久av爽李琼 | 国产91对白在线观看九色| 在线观看日韩电影| 久久久久久久久久久久久久久99| 一区二区在线观看不卡| 国产伦精一区二区三区| 欧美精品丝袜中出| 亚洲欧洲av色图| 国产精品一区二区久激情瑜伽| 欧美撒尿777hd撒尿| 成人欧美一区二区三区白人| 久久99国产精品免费网站| 日本高清成人免费播放| 欧美国产激情一区二区三区蜜月| 日韩av高清在线观看| 在线一区二区三区| 亚洲视频每日更新| 成人一区二区在线观看| 精品欧美乱码久久久久久| 亚洲mv大片欧洲mv大片精品| 色综合色综合色综合| 国产精品久久久久国产精品日日| 九色|91porny| 日韩午夜精品电影| 日本aⅴ亚洲精品中文乱码| 欧美性猛交一区二区三区精品 | 国产日韩精品视频一区| 久久国产福利国产秒拍| 欧美日韩在线播放一区| 亚洲午夜一区二区| 欧亚洲嫩模精品一区三区| 亚洲欧美日韩中文字幕一区二区三区| 粉嫩高潮美女一区二区三区| 亚洲精品一线二线三线无人区| 免费看黄色91| 精品88久久久久88久久久| 狠狠狠色丁香婷婷综合激情| 精品国产免费人成电影在线观看四季| 日本欧美加勒比视频|