📄 basal_reader_de.s01
字号:
NAME basal_reader_de(17)
RSEG MO_BS_TXT(0)
RSEG UDATA0(0)
PUBLIC CheckLangID
EXTERN ClearScreen
EXTERN FS_FRead
EXTERN FS_FSeek
EXTERN PutS
EXTERN SetTextPos
PUBLIC ToPrevScreenPosition
EXTERN fileName
EXTERN g_reader_vars
PUBLIC lBakSeek
PUBLIC read_buff
PUBLIC read_text
PUBLIC view_page_down
PUBLIC view_page_up
EXTERN ?CLZ80B_4_04_L00
EXTERN ?SL_DIV_L03
EXTERN ?SL_MOD_L03
EXTERN ?SL_CMP_L03
EXTERN ?L_ADDASG_L03
EXTERN ?L_SUBASG_L03
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
EXTERN ?MEMSET_L11
RSEG MO_BS_TXT
ToPrevScreenPosition:
; 1. /*
; 2. ********************************************************************************
; 3. * ACTOS
; 4. * Reader basal module
; 5. *
; 6. * (c) Copyright 2002-2003, Actions Co,Ld.
; 7. * All Right Reserved
; 8. *
; 9. * File : basal_reader_de.c
; 10. * By :
; 11. * Version: 1> v1.00 first version 2006-4-13 15:49
; 12. ********************************************************************************
; 13. ********************************************************************************
; 14. */
; 15. #pragma codeseg(MO_BS_TXT)
; 16. #include "actos.h"
; 17. #include "basal.h"
; 18. #include "ap_reader.h"
; 19. #include "filesys.h"
; 20. #include "TxtDec.h"
; 21.
; 22. #include "ap_common.h"
; 23. #include "display.h"
; 24. #include <Intrz80.h>
; 25. #include "bookmark.h"
; 26. #pragma memory=default
; 27. extern char fileName[50]; //存放书签头部信息的buffer
; 28. long lBakSeek[SCR_ROW+1];
; 29. #define CLEAR_WATCHDOG() output8(REG4E_RTC_WATCH_DOG, (input8(REG4E_RTC_WATCH_DOG) | 0x08))
; 30.
; 31. //////////////////////////////////////////////////
; 32. //恢复前一屏在文件中的位置
; 33. void ToPrevScreenPosition( STRUCT_VIEW_FILE *ViewFileStructPoint )
; 34. {
PUSH BC
PUSH IX
PUSH DE
POP IX
; 35. // CurrentSeek指向当前屏的起始位置
; 36. ViewFileStructPoint->CurrentSeek = ViewFileStructPoint->PrevSeek;
LD HL,6
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
LD (IX+10),L
LD (IX+11),H
LD (IX+12),C
LD (IX+13),B
; 37. }
POP IX
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
CheckLangID:
; 38.
; 39. //////////////////////////////////////////////////
; 40. //检查是否为双字节字 返回TRUE表示双字节字,FALSE表示单字节字
; 41. BOOL CheckLangID( byte LangID )
; 42. {
PUSH BC
PUSH DE
; 43.
; 44. return ( LangID != LAN_ID_ENGLISH && LangID < 5 );
LD B,E
DEC B
JR Z,?0002
LD HL,0
ADD HL,SP
LD A,(HL)
CP 5
JR NC,?0002
LD L,1
JR ?0004
?0002:
LD L,0
?0004:
; 45. }
POP AF
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
read_text:
; 46. //////////////////////////////////////////////////
; 47. //根据扇区号的值读数据到bufFile[],同时将之前的扇区数据保存头尾
; 48. BOOL read_text(STRUCT_VIEW_FILE *ViewFileStructPoint, uint nFileSector )
; 49. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH AF
PUSH DE
POP IY
; 50. byte i;
; 51.
; 52. if( nFileSector >= g_reader_vars.g_txt.SectorTotal )
LD DE,(g_reader_vars+65)
LD L,C
LD H,B
AND A
SBC HL,DE
JR C,?0006
?0005:
; 53. return FALSE;
LD L,0
JP LWRD ?0015
?0006:
; 54.
; 55. if( (nFileSector != ViewFileStructPoint->BufSector)||(nFileSector==0) )
LD L,(IY+14)
LD H,(IY+15)
AND A
SBC HL,BC
JR NZ,?0009
LD A,C
OR B
JR NZ,?0008
?0009:
?0010:
?0007:
; 56. {
; 57. ViewFileStructPoint->BufSector = nFileSector;
LD (IY+14),C
LD (IY+15),B
; 58.
; 59. for( i=0; i<(BUFF_ONE_ROW); i++ )
LD (IX-4),0
?0012:
LD A,(IX-4)
CP 20
JR NC,?0011
?0013:
; 60. {
; 61. // 保留尾部数据到 bufPrev, 保留头部数据到 bufNext
; 62. ViewFileStructPoint->bufPrev[i] = ViewFileStructPoint->bufFile[ FILE_SECTOR-(BUFF_ONE_ROW)+i ];
LD C,A
LD B,0
PUSH IY
POP HL
ADD HL,BC
LD BC,531
ADD HL,BC
LD B,(HL)
PUSH BC
LD C,A
LD B,0
PUSH IY
POP HL
ADD HL,BC
LD C,19
ADD HL,BC
POP BC
LD (HL),B
; 63. ViewFileStructPoint->bufNext[i] = ViewFileStructPoint->bufFile[ i ];
LD C,A
LD B,0
PUSH IY
POP HL
ADD HL,BC
LD C,39
ADD HL,BC
LD B,(HL)
PUSH BC
LD C,A
LD B,0
PUSH IY
POP HL
ADD HL,BC
LD BC,551
ADD HL,BC
POP BC
LD (HL),B
INC (IX-4)
JR ?0012
?0011:
; 64. }
; 65. // 读一个扇区到 ViewFileStructPoint->bufFile
; 66. CLEAR_WATCHDOG(); //清WATCH DOG
IN A,(78)
SET 3,A
OUT (78),A
; 67. FS_FSeek( ViewFileStructPoint->BufSector, SEEK_SET, ViewFileStructPoint->FileHandle );
LD L,(IY+0)
LD H,(IY+1)
PUSH HL
LD C,0
PUSH BC
LD E,(IY+14)
LD D,(IY+15)
LD B,C
CALL LWRD FS_FSeek
POP HL
POP HL
; 68. FS_FRead( (byte*)ViewFileStructPoint->bufFile, 1, ViewFileStructPoint->FileHandle );
LD L,(IY+0)
LD H,(IY+1)
PUSH HL
LD C,1
LD HL,39
PUSH IY
POP DE
ADD HL,DE
EX DE,HL
CALL LWRD FS_FRead
POP HL
?0008:
; 69. }
; 70. return TRUE;
LD L,1
; 71. }
?0015:
LD SP,IX
POP IX
POP IY
JP LWRD ?BANK_FAST_LEAVE_L08
read_buff:
; 72.
; 73. //////////////////////////////////////////////////
; 74. //根据给定的文件内地址读数据到bufPrev,bufFile和bufPrev中,并返回当前显示数据在buffer中的位置
; 75. byte* read_buff(STRUCT_VIEW_FILE *ViewFileStructPoint, long OA_LongAddr, unsigned short ReadDataLength )
; 76. {
PUSH BC
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH AF
PUSH AF
PUSH DE
POP IY
; 77. uint nSector, nOffset;
; 78.
; 79. if( (OA_LongAddr<ViewFileStructPoint->FileLengthBytes) && (ReadDataLength<FILE_SECTOR) )
INC DE
INC DE
EX DE,HL
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
PUSH BC
PUSH DE
LD C,(IX+12)
LD B,(IX+13)
LD L,(IX+10)
LD H,(IX+11)
CALL LWRD ?SL_CMP_L03
JP NC,?0031
LD BC,512
LD L,(IX+14)
LD H,(IX+15)
AND A
SBC HL,BC
JP NC,?0031
?0019:
?0018:
?0016:
; 80. {
; 81. nSector = OA_LongAddr / FILE_SECTOR;
LD L,C
LD H,C
PUSH HL
PUSH BC
LD C,(IX+12)
LD B,(IX+13)
LD L,(IX+10)
LD H,(IX+11)
CALL LWRD ?SL_DIV_L03
LD (IX-2),L
LD (IX-1),H
; 82. nOffset = OA_LongAddr % FILE_SECTOR;
LD HL,0
PUSH HL
LD H,2
PUSH HL
LD C,(IX+12)
LD B,(IX+13)
LD L,(IX+10)
LD H,(IX+11)
CALL LWRD ?SL_MOD_L03
LD (IX-4),L
LD (IX-3),H
; 83.
; 84.
; 85. if( nOffset + ReadDataLength <= FILE_SECTOR ) //第一种情况:不超过一块
LD C,(IX+14)
LD B,(IX+15)
ADD HL,BC
LD C,L
LD B,H
LD HL,512
AND A
SBC HL,BC
JR C,?0021
?0020:
; 86. {
; 87. if( !read_text(ViewFileStructPoint, nSector ) )
CALL LWRD ?0189
INC L
DEC L
JR NZ,?0029
?0022:
; 88. return NULL; // 失败
JR ?0031
?0023:
; 89. return (byte*)ViewFileStructPoint->bufFile + nOffset;
; 90. }
?0021:
; 91. else if( nOffset + ReadDataLength <= FILE_SECTOR + (BUFF_ONE_ROW) ) //第二种情况:超过一块, 不超过FILE_SECTOR + BUFF_ONE_ROW
LD L,(IX+14)
LD H,(IX+15)
LD C,(IX-4)
LD B,(IX-3)
ADD HL,BC
LD C,L
LD B,H
LD HL,532
AND A
SBC HL,BC
JR C,?0025
?0024:
; 92. {
; 93. if( !read_text(ViewFileStructPoint, nSector+1 ) )
LD C,(IX-2)
LD B,(IX-1)
INC BC
CALL LWRD ?0190
INC L
DEC L
JR Z,?0031
?0026:
; 94. return NULL; // 失败
?0027:
; 95. if( !read_text(ViewFileStructPoint, nSector ) ) //通过两次读取,将下一扇区的头部数据保存到BufNext中
CALL LWRD ?0189
INC L
DEC L
JR Z,?0031
?0028:
; 96. return NULL; // 失败
?0029:
; 97. return (byte*)ViewFileStructPoint->bufFile + nOffset;
LD HL,39
PUSH IY
POP BC
ADD HL,BC
LD C,(IX-4)
LD B,(IX-3)
JR ?0179
; 98. }
?0025:
; 99. else if( nOffset > FILE_SECTOR - (BUFF_ONE_ROW) ) //第三种情况:处理(nOffset + ReadDataLength)>(FILE_SECTOR +BUFF_ONE_ROW)的情况
LD C,(IX-4)
LD B,(IX-3)
LD HL,492
AND A
SBC HL,BC
JR NC,?0031
?0030:
; 100. {
; 101. if( !read_text(ViewFileStructPoint, nSector ) )
CALL LWRD ?0189
INC L
DEC L
JR Z,?0031
?0032:
; 102. return NULL; // 失败
?0033:
; 103. if( !read_text(ViewFileStructPoint, nSector+1 ) ) //通过两次读取,将本扇区的尾部数据保存到BufPrev中
LD C,(IX-2)
LD B,(IX-1)
INC BC
CALL LWRD ?0190
INC L
DEC L
JR Z,?0031
?0034:
; 104. return NULL; // 失败
?0035:
; 105. return (byte*)ViewFileStructPoint->bufFile-(FILE_SECTOR-nOffset);
LD HL,39
PUSH IY
POP BC
ADD HL,BC
LD C,(IX-4)
LD B,(IX-3)
ADD HL,BC
LD BC,65024
?0179:
ADD HL,BC
; 106. }
JR ?0036
?0031:
?0017:
; 107. }
; 108. return NULL; // 失败
LD HL,0
; 109. }
?0036:
LD SP,IX
POP IX
POP IY
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
?0189:
LD C,(IX-2)
LD B,(IX-1)
?0190:
PUSH IY
POP DE
LD A,BYTE3 read_text
LD HL,LWRD read_text
JP LWRD ?BANK_CALL_DIRECT_L08
view_page_down:
; 110.
; 111.
; 112. //////////////////////////////////////////////////
; 113. //向后翻阅
; 114. // DealMode =0: 显示一屏并计算下一屏的起始位置;=1: 计算下一屏的起始位置;2 .只读取下一屏数据
; 115. byte view_page_down(STRUCT_VIEW_FILE *ViewFileStructPoint, unsigned char DealMode,int BackGroundID )
; 116. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH DE
LD HL,65520
ADD HL,SP
LD SP,HL
; 117. long LeftFileLength; // 文件剩余长度
; 118. long ReadFileLength; // 已读取的文件长度
; 119. uint ReadLengthOneTime; //读取一次数据的长度
; 120. byte *str; //一次读取数据的首地址
; 121. uint RowHeadPosition; //行首地址(在一次所读数据中的位置)
; 122. BOOL ReReadFlag; //是否需要重新读取数据的标志
; 123. byte row, col; //显示的行列号
; 124. byte CountWords; //一行的显示字数
; 125.
; 126.
; 127. LeftFileLength = ViewFileStructPoint->FileLengthBytes - ViewFileStructPoint->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 L,C
LD H,B
PUSH DE
PUSH HL
LD C,(IX-4)
LD B,(IX-3)
INC BC
INC BC
LD L,C
LD H,B
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD E,(HL)
INC HL
LD D,(HL)
LD L,C
LD H,B
AND A
POP BC
SBC HL,BC
EX DE,HL
POP BC
SBC HL,BC
LD C,L
LD B,H
EX DE,HL
LD (IX-12),L
LD (IX-11),H
LD (IX-10),C
LD (IX-9),B
; 128. if( LeftFileLength <= 0 )
PUSH BC
PUSH HL
LD BC,0
LD L,C
LD H,B
CALL LWRD ?SL_CMP_L03
JR C,?0038
?0037:
; 129. {
; 130. ViewFileStructPoint->CurrentSeek =0;
LD L,10
LD C,(IX-4)
LD B,(IX-3)
ADD HL,BC
XOR A
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
?0038:
; 131. }
; 132.
; 133. if( !DealMode )
XOR A
OR (IX-2)
JR NZ,?0040
?0039:
; 134. ClearScreen(NULL);
LD E,A
LD D,A
CALL LWRD ClearScreen
?0040:
; 135.
; 136.
; 137.
; 138. ReReadFlag = TRUE; // 读入数据
; 139. ReadFileLength = ViewFileStructPoint->CurrentSeek;
LD HL,10
LD C,(IX-4)
LD B,(IX-3)
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
INC HL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -