📄 bookmark.s01
字号:
NAME bookmark(17)
RSEG CODE_1(0)
RSEG CSTR(0)
RSEG UDATA0(0)
RSEG BOOKMARK_D(0)
EXTERN FS_FClose
EXTERN FS_FCreate
EXTERN FS_FOpen
EXTERN FS_FRead
EXTERN FS_FWrite
EXTERN FS_GetFileLen
EXTERN FS_GetUnalignedLen
PUBLIC add_bookmark
PUBLIC bkmarks
PUBLIC buf
PUBLIC close_bookmark
PUBLIC del_bookmark_id
EXTERN fileName
PUBLIC g_bookmark_handle
EXTERN g_comval
EXTERN g_reader_vars
PUBLIC get_bookmark
PUBLIC get_num_bookmarks
PUBLIC initBuf
PUBLIC init_bookmark
PUBLIC result
EXTERN ui_err_msg
PUBLIC whitespace
EXTERN ?CLZ80B_4_04_L00
EXTERN ?L_LSH_L03
EXTERN ?UL_RSH_L03
EXTERN ?L_ORASG_L03
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
EXTERN ?STRCPY_L11
RSEG CODE_1
whitespace:
; 1. /*
; 2. *******************************************************************************
; 3. * e Document Reader
; 4. * (c) Copyright 2003-2004, ACTION Co,Ltd.
; 5. * All Right Reserved
; 6. *
; 7. * File : bookmark.c
; 8. * By : ruanyong
; 9. * Version: v1.00 first version 2004-11-16 17:28
; 10. ********************************************************************************
; 11. */
; 12. #pragma codeseg(CODE_1)
; 13. #include <stdlib.h>
; 14. #include <stdio.h>
; 15. #include <string.h>
; 16.
; 17. #include "ap_reader.h"
; 18. #include "bookmark.h"
; 19. #include "filesys.h"
; 20. #include "ui_res.h"
; 21. void initBuf(void);
; 22. bool result;
; 23. UInt g_bookmark_handle;
; 24. bkmark_node bkmarks[MAX_BKMARK_NUM];
; 25. extern char fileName[50]; //存放书签头部信息的buffer
; 26. #pragma memory=dataseg(BOOKMARK_D)
; 27. UChar buf[FILESIZE];
; 28. #pragma memory=default
; 29. //#pragma codeseg(BOOKMARK_D)
; 30. //UChar buf[FILESIZE];
; 31. //#pragma memory=default
; 32. /*
; 33. * 判断字符是否是空格意义符号
; 34. */
; 35. int
; 36. whitespace(char ch)
; 37. {
; 38. switch (ch)
LD A,E
CP 9
JR C,?0004
CP 11
JR C,?0003
CP 13
JR Z,?0003
CP 32
JR NZ,?0004
?0003:
; 39. {
; 40. case ' ':
; 41. case '\t':
; 42. case '\n':
; 43. case '\r':
; 44. return 1;
LD HL,1
; 45. default:
JR ?0005
?0004:
; 46. return 0;
LD HL,0
; 47. }
?0005:
JP LWRD ?BANK_FAST_LEAVE_L08
?0002:
; 48. }
strip_spaces:
; 49.
; 50.
; 51. /*
; 52. * 删除一个字符串开头和串尾的空格,参数str被修改
; 53. * 空格符号包括' ','\n','\r','\t'。
; 54. */
; 55. static char *
; 56. strip_spaces(char *str)
; 57. {
PUSH BC
PUSH DE
; 58. /*
; 59. int x;
; 60.
; 61. if (!str)
; 62. return NULL;
; 63.
; 64. x = 0;
; 65. while ( whitespace(str[x]) && (str[x] != '\0') )
; 66. x++;
; 67.
; 68. if (x != 0) // 前移x个字符
; 69. memmove(str, str+x, strlen(str)-x+1);
; 70.
; 71. x = strlen(str)-1;
; 72. while (whitespace(str[x]) && (x != 0))
; 73. x--;
; 74.
; 75. str[x+1] = '\0'; // 截断后面的空字符
; 76. */
; 77. return str;
LD L,E
LD H,D
; 78. }
POP AF
POP BC
RET
trim_string:
; 79.
; 80.
; 81. /*
; 82. * 去掉不可打印的字符,并以空格替代,参数str被修改
; 83. */
; 84. static char *
; 85. trim_string(char *str)
; 86. {
PUSH BC
PUSH DE
; 87.
; 88. return str;
LD L,E
LD H,D
; 89. }
POP AF
POP BC
RET
fileLength:
; 90.
; 91. static UInt32
; 92. fileLength(UInt32 file)
; 93. {
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH DE
PUSH AF
PUSH AF
PUSH AF
PUSH AF
; 94. UInt32 LastPgSize = FS_GetUnalignedLen(file); //取最后一个PAGE的BYTE数 (只有一个扇区)
CALL LWRD FS_GetUnalignedLen
LD A,H
RLCA
SBC A,A
LD C,A
LD B,C
LD (IX-8),L
LD (IX-7),H
LD (IX-6),C
LD (IX-5),B
; 95. UInt32 PageNum = FS_GetFileLen(file);
LD E,(IX-4)
LD D,(IX-3)
CALL LWRD FS_GetFileLen
; 96. return ( (PageNum-1 )* BUFSIZE + LastPgSize);
PUSH BC
PUSH HL
LD HL,65535
POP BC
ADD HL,BC
EX DE,HL
LD HL,65535
POP BC
ADC HL,BC
LD C,L
LD B,H
EX DE,HL
LD A,9
CALL LWRD ?L_LSH_L03
PUSH BC
PUSH HL
LD L,(IX-8)
LD H,(IX-7)
POP BC
ADD HL,BC
EX DE,HL
LD L,(IX-6)
LD H,(IX-5)
POP BC
ADC HL,BC
LD C,L
LD B,H
EX DE,HL
; 97. }
LD SP,IX
POP IX
RET
hex2str:
; 98.
; 99. static char*
; 100. hex2str(char* b, UInt32 hex)
; 101. {
PUSH BC
PUSH IX
PUSH AF
PUSH DE
POP IX
; 102. byte i = 0;
LD HL,0
ADD HL,SP
LD (HL),0
?0007:
; 103.
; 104. for ( ; i < sizeof(UInt32); i++ ) {
LD A,(HL)
CP 4
JR NC,?0006
?0008:
; 105. b[i] = (hex>>i*8) & 0xFF;
LD C,A
LD B,0
PUSH IX
POP HL
ADD HL,BC
PUSH HL
ADD A,A
ADD A,A
ADD A,A
LD HL,10
ADD HL,SP
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
CALL LWRD ?UL_RSH_L03
LD B,L
POP HL
LD (HL),B
LD HL,0
ADD HL,SP
INC (HL)
JR ?0007
?0006:
; 106. }
; 107. b[4] = 0;
LD (IX+4),0
; 108.
; 109. return b;
PUSH IX
POP HL
; 110. }
POP AF
POP IX
POP BC
RET
str2hex:
; 111.
; 112. static UInt32
; 113. str2hex(char *b)
; 114. {
PUSH IX
PUSH AF
PUSH AF
PUSH AF
PUSH DE
POP IX
; 115. UInt32 ret=0;
; 116. byte i = 0;
LD HL,2
ADD HL,SP
XOR A
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
LD L,A
LD H,A
ADD HL,SP
LD (HL),A
?0011:
; 117.
; 118. for ( ; i < 4; i++ )
LD A,(HL)
CP 4
LD HL,2
JR NC,?0010
?0012:
; 119. ret = ret | ((UInt32)b[i]& 0x000000FF) << 8*i ;
ADD HL,SP
PUSH HL
ADD A,A
ADD A,A
ADD A,A
DEC HL
DEC HL
LD C,(HL)
LD B,0
PUSH IX
POP HL
ADD HL,BC
LD L,(HL)
LD C,B
LD H,C
CALL LWRD ?L_LSH_L03
EX DE,HL
POP HL
CALL LWRD ?L_ORASG_L03
LD HL,0
ADD HL,SP
INC (HL)
JR ?0011
?0010:
; 120.
; 121. return ret;
ADD HL,SP
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
; 122. }
POP AF
POP AF
POP AF
POP IX
RET
gen_bkfilename:
; 123.
; 124. static bool
; 125. gen_bkfilename(char *str)
; 126. {
PUSH DE
; 127. /* char *t = str;
; 128. t = strrchr(t,'.');
; 129. strcpy(t,".bmk");
; 130. */
; 131. return 0;
XOR A
; 132. }
POP HL
RET
split_node:
; 133.
; 134. static void
; 135. split_node( char* str,int i)
; 136. {
PUSH IY
PUSH IX
PUSH DE
POP IX
PUSH BC
POP IY
; 137. bkmarks[i].offset = str2hex(str);
LD L,C
LD H,B
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks
ADD HL,BC
PUSH HL
CALL LWRD str2hex
EX DE,HL
POP HL
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
; 138. memcpy( bkmarks[i].title, &str[4],sizeof(bkmarks[i].title) );
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
LD HL,4
PUSH IX
POP BC
ADD HL,BC
LD BC,12
LDIR
; 139. }
POP IX
POP IY
RET
init_bookmark:
; 140.
; 141. /**
; 142. * Description: init_bookmark初始化书签功能
; 143. *
; 144. * @return(s) : 0-success;1-failure
; 145. */
; 146. bool init_bookmark()
; 147. {
PUSH BC
PUSH DE
PUSH IX
LD HL,65524
ADD HL,SP
LD SP,HL
; 148. int i;
; 149. char bkfile[FILENMAELEN];
; 150. char *a = bkfile;
PUSH HL
POP IX
; 151. initBuf();
LD A,BYTE3 initBuf
LD HL,LWRD initBuf
CALL LWRD ?BANK_CALL_DIRECT_L08
; 152. for ( i = 0; i < MAX_BKMARK_NUM; i++ )
LD DE,0
?0015:
LD BC,32784
LD L,E
LD H,D
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0014
?0016:
; 153. { // FILL out
; 154. bkmarks[i].offset = 0xFFFFFFFF;
LD L,E
LD H,D
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks
ADD HL,BC
LD B,255
LD (HL),B
INC HL
LD (HL),B
INC HL
LD (HL),B
INC HL
LD (HL),B
INC DE
JR ?0015
?0014:
; 155. }
; 156. memcpy(bkfile, g_reader_vars.location.filename,8);
LD BC,8
LD L,B
LD H,B
ADD HL,SP
EX DE,HL
LD HL,g_reader_vars+32
LDIR
; 157. if ( NULL != a )
PUSH IX
POP HL
LD A,L
OR H
JR Z,?0019
?0018:
; 158. {
; 159. strcpy(&bkfile[8],"BMK");
LD DE,?0020
LD L,C
LD H,B
ADD HL,SP
LD C,8
ADD HL,BC
CALL LWRD ?STRCPY_L11
; 160. bkfile[11]=0;
LD HL,11
ADD HL,SP
LD (HL),B
; 161. g_bookmark_handle = FS_FOpen(bkfile,FS_OPEN_NORMAL);
LD C,B
LD L,C
LD H,B
ADD HL,SP
EX DE,HL
CALL LWRD FS_FOpen
LD (g_bookmark_handle),HL
; 162. if( NULL == g_bookmark_handle )
LD A,L
OR H
JR NZ,?0022
?0021:
; 163. { // 书签文件不存在,创建书签文件
; 164. g_bookmark_handle = FS_FCreate(bkfile);
LD L,A
LD H,A
ADD HL,SP
EX DE,HL
CALL LWRD FS_FCreate
LD (g_bookmark_handle),HL
; 165. if( NULL == g_bookmark_handle )
LD A,L
OR H
JR NZ,?0025
?0023:
; 166. {// 错误处理
; 167. // FIXME: please change to create error
; 168. ui_err_msg(EBOKMSG5,EBOKMSG5,g_comval.langid);
LD BC,(g_comval+12)
LD B,A
PUSH BC
LD BC,429
LD DE,429
LD A,BYTE3 ui_err_msg
LD HL,LWRD ui_err_msg
CALL LWRD ?BANK_CALL_DIRECT_L08
POP AF
; 169. return 1;
JR ?0019
; 170. }
?0024:
; 171. return 0;
; 172. }
?0022:
; 173. else
; 174. { // 书签文件已存在,初始化书签列表
; 175.
; 176. FS_FRead(buf, 1, g_bookmark_handle);
PUSH HL
LD C,1
LD DE,buf
CALL LWRD FS_FRead
POP HL
; 177. for (i = 0; i <FILESIZE/(NODELEN*2); i++ )
LD DE,0
?0026:
LD BC,32784
LD L,E
LD H,D
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0025
?0027:
; 178. {
; 179. split_node(&buf[i*NODELEN],i);
PUSH DE
PUSH DE
EX DE,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,buf
ADD HL,BC
EX DE,HL
POP BC
CALL LWRD split_node
POP DE
INC DE
JR ?0026
?0025:
; 180. }
; 181. return 0;
LD L,0
; 182. }
JR ?0029
?0019:
; 183. }
; 184.
; 185. return 1;
LD L,1
; 186. }
?0029:
EX DE,HL
LD HL,12
ADD HL,SP
LD SP,HL
EX DE,HL
POP IX
POP DE
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
close_bookmark:
; 187.
; 188.
; 189. /**
; 190. * Description: 关闭书签功能
; 191. *
; 192. * @return(s) : 0-success;1-failure
; 193. */
; 194. bool close_bookmark()
; 195. {
PUSH BC
PUSH DE
PUSH IX
; 196. int i = 0;
LD IX,0
?0031:
; 197. // UChar buf[FILESIZE];
; 198. while (( 0xFFFFFFFF != bkmarks[i].offset)&&(i<MAX_BKMARK_NUM) )
PUSH IX
POP HL
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,?0030
LD BC,32784
PUSH IX
POP HL
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0030
?0034:
?0033:
?0032:
; 199. {
; 200. hex2str( &buf[i*NODELEN], bkmarks[i].offset );
PUSH IX
POP HL
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
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
; 201. memcpy( &buf[i*NODELEN+sizeof(UInt32)], bkmarks[i].title,sizeof(bkmarks[i].title));
PUSH IX
POP HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
EX DE,HL
LD HL,buf+4
ADD HL,DE
EX DE,HL
PUSH IX
POP HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,bkmarks+4
ADD HL,BC
LD BC,12
LDIR
; 202. i++;
INC IX
JR ?0031
?0030:
; 203. }
; 204. if( 0xFFFFFFFF == bkmarks[i].offset) //删除一个书签后要将offset清为0xffffffff
PUSH IX
POP HL
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,?0036
?0035:
; 205. hex2str(&buf[i*NODELEN],0xffffffff);
LD HL,65535
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -