📄 bookmark.s01
字号:
PUSH HL
PUSH HL
PUSH IX
POP HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,buf
ADD HL,BC
EX DE,HL
CALL LWRD hex2str
POP AF
POP AF
?0036:
; 206. result=FS_FWrite(buf, 1, g_bookmark_handle);
LD HL,(g_bookmark_handle)
PUSH HL
LD C,1
LD DE,buf
CALL LWRD FS_FWrite
POP HL
LD (result),A
; 207. FS_FClose(g_bookmark_handle);
LD DE,(g_bookmark_handle)
CALL LWRD FS_FClose
; 208. return 0; // always good;
LD L,0
; 209. }
POP IX
POP DE
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
add_bookmark:
; 210.
; 211.
; 212. /**
; 213. * Description: add_bookmark-向书签列表加入一新的书签;若书签标题为空,
; 214. * 则自动使用偏移位置作为标题
; 215. *
; 216. * @param(s) : vf - 结构的指针
; 217. * @param(s) : title - 书签标题
; 218. * @param(s) : offset- 书签所在的绝对偏移位置
; 219. * @return(s) : 0-success; 1-failure
; 220. */
; 221. bool add_bookmark(STRUCT_VIEW_FILE *vf, UChar *title, UInt32 offset)
; 222. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH DE
LD HL,65518
ADD HL,SP
LD SP,HL
; 223. int i;
; 224. UChar *tt;
; 225. UInt32 CurFileLen,LeftFileLen;
; 226. uint CurrentOffset,ReadLengthOneTime;
; 227.
; 228. CurFileLen=vf->CurrentSeek;
LD HL,10
ADD HL,DE
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD E,(HL)
INC HL
LD D,(HL)
LD (IX-18),C
LD (IX-17),B
LD (IX-16),E
LD (IX-15),D
; 229.
; 230. tt=fileName;
LD (IX-20),LOW(fileName)
LD (IX-19),HIGH(fileName)
?0038:
; 231. /////////////////////过滤回车换行 英文空格 中文空格
; 232. while((tt[0]==0x20)||(tt[0]==0x0a)||(tt[0]==0x0d)||(tt[0]==0xa1))
LD L,(IX-20)
LD H,(IX-19)
LD A,(HL)
CP 32
JR Z,?0040
LD A,(HL)
CP 10
JR Z,?0040
LD A,(HL)
CP 13
JR Z,?0040
LD A,(HL)
CP 161
JR NZ,?0037
?0040:
?0041:
?0039:
; 233. {
; 234. if(tt[0]==0xa1)
LD A,(HL)
CP 161
JR NZ,?0043
?0042:
; 235. {
; 236. if(tt[1]==0xa1)
INC HL
LD A,(HL)
CP 161
JR NZ,?0037
?0044:
; 237. tt+=2;
LD HL,2
ADD HL,SP
LD A,(HL)
ADD A,2
LD (HL),A
INC HL
LD A,(HL)
ADC A,0
LD (HL),A
; 238. else
JR ?0038
?0045:
; 239. break;
?0046:
; 240. }
; 241. else
?0043:
; 242. tt++;
INC (IX-20)
JR NZ,?0038
INC (IX-19)
?0047:
JR ?0038
?0037:
; 243. }
; 244. ///////////////////////
; 245. if ( 0xFFFFFFFF == bkmarks[0].offset ) // 加入的第一个书签
LD BC,(bkmarks+2)
LD HL,(bkmarks)
LD A,L
AND H
AND C
AND B
INC A
JR NZ,?0049
?0048:
; 246. {
; 247. bkmarks[0].offset = CurFileLen;
LD C,(IX-16)
LD B,(IX-15)
LD L,(IX-18)
LD H,(IX-17)
LD (bkmarks),HL
LD (bkmarks+2),BC
; 248. memcpy( bkmarks[0].title, tt, MAX_TITLE_LEN);
LD BC,12
LD DE,bkmarks+4
LD L,(IX-20)
LD H,(IX-19)
LDIR
; 249. }
; 250. else // 已经有书签
JP LWRD ?0050
?0049:
; 251. {
; 252. // Cauz there is only 16 items in the file, we simply
; 253. // search from the beginning to decide where to insert
; 254. i = 0;
XOR A
LD (IX-22),A
LD (IX-21),A
?0052:
; 255. while ( i < MAX_BKMARK_NUM )
LD BC,32784
LD L,(IX-22)
LD H,(IX-21)
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0051
?0053:
; 256. {
; 257. if( bkmarks[i].offset > CurFileLen ) //已到链表尾或在链表之前插入
LD L,(IX-22)
LD H,(IX-21)
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD E,(HL)
INC HL
LD D,(HL)
PUSH DE
PUSH BC
AND A
LD L,(IX-18)
LD H,(IX-17)
POP BC
SBC HL,BC
LD L,(IX-16)
LD H,(IX-15)
POP BC
SBC HL,BC
JR C,?0051
?0054:
; 258. break;
?0055:
; 259. else if ( bkmarks[i].offset == CurFileLen )
LD L,(IX-22)
LD H,(IX-21)
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD E,(HL)
INC HL
LD D,(HL)
LD L,C
LD H,B
LD C,(IX-18)
LD B,(IX-17)
AND A
SBC HL,BC
JR NZ,?0057
EX DE,HL
LD C,(IX-16)
LD B,(IX-15)
SBC HL,BC
JP Z,?0092
?0056:
; 260. return 0; // already there, keep it
?0057:
; 261.
; 262. i++;
INC (IX-22)
JR NZ,?0052
INC (IX-21)
JR ?0052
?0051:
; 263. }
; 264. /* now we get the point to insert */
; 265. if ( 0xFFFFFFFF == bkmarks[i].offset ) // 已经到链表尾
LD L,(IX-22)
LD H,(IX-21)
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks
ADD HL,BC
LD A,(HL)
INC HL
AND (HL)
INC HL
AND (HL)
INC HL
AND (HL)
INC A
JR NZ,?0059
?0058:
; 266. {
; 267. /* 加到链表末 */
; 268. bkmarks[i].offset = CurFileLen;
LD L,(IX-22)
LD H,(IX-21)
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
JR ?0093
; 269. memcpy( bkmarks[i].title, tt, MAX_TITLE_LEN );
; 270. return 0;
; 271. }
?0059:
; 272. else if ( bkmarks[MAX_BKMARK_NUM-1].offset == 0xFFFFFFFF )
LD HL,bkmarks+240
LD A,(HL)
INC HL
AND (HL)
INC HL
AND (HL)
INC HL
AND (HL)
INC A
JP NZ,?0061
?0060:
; 273. {
; 274. /* 在链表中间插入 */
; 275. /* [1],[2],...[*],[*+1],[*+2],.... */
; 276. /* | | */
; 277. /* prev cur */
; 278. /* [*],[×],[*+1] */
; 279. /* | */
; 280. /* pre,cur */
; 281. int j;
; 282. for ( j = MAX_BKMARK_NUM-1; j > i; j-- )
LD IY,15
?0063:
PUSH IY
POP BC
LD L,(IX-22)
LD H,(IX-21)
OR 128
SBC HL,BC
JP PO,?0089
XOR H
?0089:
JP P,?0062
?0064:
; 283. {
; 284. bkmarks[j].offset = bkmarks[j-1].offset; //链表后移
PUSH IY
POP HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks-16
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
PUSH HL
PUSH IY
POP HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,bkmarks
ADD HL,DE
POP DE
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
; 285. memcpy( bkmarks[j].title, bkmarks[j-1].title, MAX_TITLE_LEN );
PUSH IY
POP HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
LD HL,bkmarks+4
ADD HL,DE
EX DE,HL
PUSH IY
POP HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks-12
ADD HL,BC
LD BC,12
LDIR
DEC IY
JR ?0063
?0062:
; 286. }
; 287. bkmarks[i].offset = CurFileLen;
LD L,(IX-22)
LD H,(IX-21)
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks
?0093:
ADD HL,BC
LD C,(IX-16)
LD B,(IX-15)
LD E,(IX-18)
LD (HL),E
LD D,(IX-17)
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
; 288. memcpy( bkmarks[i].title, tt, MAX_TITLE_LEN );
LD BC,12
LD L,(IX-22)
LD H,(IX-21)
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
LD HL,bkmarks+4
ADD HL,DE
EX DE,HL
LD L,(IX-20)
LD H,(IX-19)
LDIR
; 289. return 0;
?0092:
LD L,0
; 290. }
JR ?0066
?0061:
; 291. else
; 292. {
; 293. /* the bookmarks number reaches MAX_BKMARK_NUM */
; 294. /* give some warning messages :del some bkmark:*/
; 295. // FIXME::
; 296. ui_err_msg(EBOKMSG3,EBOKMSG3,g_comval.langid);
LD BC,(g_comval+12)
LD B,0
PUSH BC
LD BC,427
LD E,C
LD D,B
LD A,BYTE3 ui_err_msg
LD HL,LWRD ui_err_msg
CALL LWRD ?BANK_CALL_DIRECT_L08
POP AF
; 297. return 1;
; 298. }
?0050:
; 299. }
; 300.
; 301. return 1;
LD L,1
; 302. }
?0066:
LD SP,IX
POP IX
POP IY
JP LWRD ?BANK_FAST_LEAVE_L08
del_bookmark_id:
; 303.
; 304. bool del_bookmark_id(UInt8 id) //根据ID号来删除书签
; 305. {
PUSH BC
PUSH DE
PUSH AF
; 306. byte i = id;
LD HL,0
ADD HL,SP
PUSH HL
LD B,E
POP HL
LD (HL),B
; 307.
; 308. if( i >= MAX_BKMARK_NUM )
LD A,B
CP 16
JR C,?0068
?0067:
; 309. return 1;
LD L,1
JR ?0073
?0068:
?0070:
; 310. for ( ; i < MAX_BKMARK_NUM-1; i++ )
LD HL,0
ADD HL,SP
LD A,(HL)
CP 15
JR NC,?0069
?0071:
; 311. {
; 312. bkmarks[i].offset = bkmarks[i+1].offset;
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks+16
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
PUSH HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,bkmarks
ADD HL,DE
POP DE
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
; 313. memcpy( bkmarks[i].title, bkmarks[i+1].title, MAX_TITLE_LEN );
LD BC,12
LD L,A
LD H,B
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
LD HL,bkmarks+4
ADD HL,DE
EX DE,HL
LD L,A
LD H,B
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks+20
ADD HL,BC
LD BC,12
LDIR
LD L,C
LD H,B
ADD HL,SP
INC (HL)
JR ?0068
?0069:
; 314. }
; 315.
; 316. bkmarks[MAX_BKMARK_NUM-1].offset = 0xFFFFFFFF;
LD BC,65535
LD (bkmarks+240),BC
LD (bkmarks+242),BC
; 317. return 0;
LD L,0
; 318. }
?0073:
POP AF
POP AF
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
get_num_bookmarks:
; 319.
; 320. /*
; 321. * 取书签数
; 322. */
; 323. byte get_num_bookmarks()
; 324. {
PUSH BC
PUSH DE
; 325. byte i = 0;
LD E,0
?0075:
; 326. while( bkmarks[i].offset != 0xFFFFFFFF && i < MAX_BKMARK_NUM )
LD L,E
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks
ADD HL,BC
LD A,(HL)
INC HL
AND (HL)
INC HL
AND (HL)
INC HL
AND (HL)
INC A
JR Z,?0074
LD A,E
CP 16
JR NC,?0074
?0078:
?0077:
?0076:
; 327. i++;
INC E
JR ?0075
?0074:
; 328.
; 329. return i;
LD L,E
; 330. }
POP DE
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
get_bookmark:
; 331.
; 332.
; 333. /*
; 334. * 取书签
; 335. */
; 336. bkmark_node
; 337. get_bookmark(UInt8 id)
; 338. {
PUSH BC
PUSH DE
; 339. //ASSERT( id >= MAX_BKMARK_NUM );
; 340. return bkmarks[id];
LD L,C
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks
ADD HL,BC
LD BC,16
PUSH DE
LDIR
POP HL
; 341. }
POP AF
POP AF
JP LWRD ?BANK_FAST_LEAVE_L08
initBuf:
; 342.
; 343. /* 输出书签列表 */
; 344. /*
; 345. void list_bookmarks()
; 346. {
; 347. //while(
; 348. }
; 349. */
; 350. /*
; 351. bool gen_pop_list(pop_up_list_t *list,int headid)
; 352. {
; 353. list->strid = 0;
; 354. list->total = 2;
; 355. list->active = g_reader_vars.playflag;
; 356. list->string_id = g_comval.langid;
; 357. list->headid = headid;
; 358.
; 359. return 0; // always good
; 360. }
; 361. */
; 362. void
; 363. initBuf(void)
; 364. {
PUSH BC
PUSH DE
; 365. byte i=0;
LD E,0
?0080:
; 366. for(;i<FILESIZE/NODELEN;i++)
LD A,E
CP 32
JR NC,?0079
?0081:
; 367. {
; 368. buf[i*NODELEN]=0xff;
LD L,E
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,buf
ADD HL,BC
LD (HL),255
; 369. buf[i*NODELEN+1]=0xff;
LD L,E
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,buf+1
ADD HL,BC
LD (HL),255
; 370. buf[i*NODELEN+2]=0xff;
LD L,E
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,buf+2
ADD HL,BC
LD (HL),255
; 371. buf[i*NODELEN+3]=0xff;
LD L,E
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,buf+3
ADD HL,BC
LD (HL),255
INC E
; 372. }
; 373. }
JR ?0080
?0079:
POP DE
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
; 374.
; 375. #pragma function = default
RSEG CSTR
?0020:
DEFB 'BMK'
DEFB 0
RSEG UDATA0
result:
DEFS 1
g_bookmark_handle:
DEFS 2
bkmarks:
DEFS 256
RSEG BOOKMARK_D
buf:
DEFS 512
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -