📄 sdrv_regioncopy.s01
字号:
NAME sdrv_regioncopy(16)
RSEG BBC_DW3(0)
EXTERN DisplayBuffer
EXTERN Hdrv_BuffDataTrans
EXTERN Hdrv_GetBuffData
EXTERN Hdrv_SetWindow
PUBLIC Sdrv_RegionCopy
EXTERN region_win
EXTERN ?CLZ80L_4_04_L00
EXTERN ?SS_DIV_L02
EXTERN ?S_MUL_L02
RSEG BBC_DW3
Sdrv_RegionCopy:
; 1. /*
; 2. ********************************************************************************
; 3. * ACTOS
; 4. * ui dirver show picture
; 5. *
; 6. * (c) Copyright 2002-2003, Actions Co,Ld.
; 7. * All Right Reserved
; 8. *
; 9. * File : Sdrv_RegionCopy.c
; 10. * By : Rcmai
; 11. * Version: 1> v1.00 first version 10/17/2003 10:46PM
; 12. ********************************************************************************
; 13. */
; 14. #include "display.h"
; 15. #include "Drv_S6B33B0A.h"
; 16.
; 17. #pragma memory=constseg(BBS_DW3)
; 18. #pragma memory=default
; 19.
; 20. #pragma memory=dataseg(BBD_DW3)
; 21. #pragma memory=default
; 22.
; 23. #pragma codeseg(BBC_DW3)
; 24.
; 25. ////*******************************************************************************/
; 26. ///* void Sdrv_RegionCopy(region_t sregion, region_t tregion)
; 27. //** FUNCTION: Sdrv_RegionCopy
; 28. //**
; 29. //** Description: 把源区域的数据复制到目的区域
; 30. //** input
; 31. //** region_t *sregion: 指定源区域 ;
; 32. //** region_t *tregion: 指定目的区域
; 33. //**
; 34. //** output
; 35. //** none
; 36. //********************************************************************************/
; 37. void Sdrv_RegionCopy(region_t *sregion, region_t *tregion)
; 38. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH DE
LD HL,65522
ADD HL,SP
LD SP,HL
; 39. int block_pixel;//每一小块象素的个数
; 40. BYTE block_line; //每一小块的行数
; 41. int i;
; 42. //int height_cnt; //高度计数器
; 43. region_t sregionram;//临时使用
; 44. region_t tregionram;//临时使用
; 45. BYTE line_cnt;//行数计数器
; 46.
; 47. BYTE sregiony_tmp;
; 48. BYTE tregiony_tmp;
; 49.
; 50. //把源目区域数据放到临时区作运算
; 51. sregionram = *sregion;
EX DE,HL
LD BC,4
LDIR
; 52. tregionram = *tregion;
LD HL,4
ADD HL,SP
EX DE,HL
LD L,(IX-2)
LD H,(IX-1)
LD C,4
LDIR
; 53.
; 54. //下面强迫目标区域与源区域大小相同
; 55. tregionram.width = sregionram.width;
LD B,(IX-16)
LD (IX-12),B
; 56. tregionram.height = sregionram.height;
LD B,(IX-15)
LD (IX-11),B
; 57.
; 58. if ( (sregionram.x + sregionram.width) > (region_win.x+region_win.width) //源区域横向是否超限
; 59. || (sregionram.y + sregionram.height) > (region_win.y + region_win.height) //源区域纵向是否超限
; 60. || (tregionram.x + sregionram.width) > (region_win.x+region_win.width) //目标区域横向是否超限(源与目宽度一样)
; 61. || (tregionram.y + sregionram.height) > (region_win.y + region_win.height) ) //目标区域纵向是否超限(源与目宽度一样)
LD L,(IX-16)
LD B,C
LD D,B
LD E,(IX-18)
LD H,B
ADD HL,DE
LD C,L
LD B,H
LD DE,(region_win+2)
LD D,0
LD HL,(region_win)
LD H,D
ADD HL,DE
OR 128
SBC HL,BC
JP PO,?0014
XOR H
?0014:
JP M,?0009
LD L,(IX-15)
LD H,D
LD E,(IX-17)
ADD HL,DE
LD C,L
LD B,H
LD DE,(region_win+3)
LD D,0
LD HL,(region_win+1)
LD H,D
ADD HL,DE
OR 128
SBC HL,BC
JP PO,?0015
XOR H
?0015:
JP M,?0009
LD L,(IX-16)
LD H,D
LD E,(IX-14)
ADD HL,DE
LD C,L
LD B,H
LD DE,(region_win+2)
LD D,0
LD HL,(region_win)
LD H,D
ADD HL,DE
OR 128
SBC HL,BC
JP PO,?0016
XOR H
?0016:
JP M,?0009
LD L,(IX-15)
LD H,D
LD E,(IX-13)
ADD HL,DE
LD C,L
LD B,H
LD DE,(region_win+3)
LD D,0
LD HL,(region_win+1)
LD H,D
ADD HL,DE
OR 128
SBC HL,BC
JP PO,?0017
XOR H
?0017:
JP M,?0009
?0002:
?0003:
?0000:
; 62. {
; 63. return; //超限返回
; 64. }
?0001:
; 65.
; 66. //把一个大的矩形分成N个小的矩形块,每个小矩形数据应能用一个page buf 传送完
; 67. // 这样可方便在源,目标间进行数据交换(不断换窗口)
; 68. block_line = DisplayBufLen/(2*(sregionram.width));
LD L,(IX-16)
LD H,D
ADD HL,HL
LD C,L
LD B,H
LD DE,512
CALL ?SS_DIV_L02
LD (IX-7),E
; 69. block_pixel = block_line * (sregionram.width);
LD C,(IX-16)
LD B,0
LD D,B
CALL ?S_MUL_L02
PUSH DE
POP IY
; 70.
; 71. line_cnt = sregionram.height;//保存高度值
LD B,(IX-15)
LD (IX-8),B
; 72. sregionram.height = block_line;
LD B,(IX-7)
LD (IX-15),B
; 73. tregionram.height = block_line;
LD (IX-11),B
; 74.
; 75. if ((sregion->y) >= (tregion->y))
LD L,(IX-2)
LD H,(IX-1)
INC HL
PUSH HL
LD L,(IX-4)
LD H,(IX-3)
INC HL
LD A,(HL)
POP HL
CP (HL)
JR C,?0005
?0004:
?0007:
; 76. {
; 77. //源在目标的下面时,可从上面开始读数据(这样不会覆盖)
; 78. while (line_cnt > block_line)
LD A,(IX-7)
CP (IX-8)
JR NC,?0006
?0008:
; 79. {
; 80. //读出对应区域的图片内容放在暂存中
; 81. Hdrv_SetWindow(&sregionram);
LD HL,0
ADD HL,SP
EX DE,HL
CALL Hdrv_SetWindow
; 82. Hdrv_GetBuffData (DisplayBuffer, block_pixel, NORTransMode_def);
LD HL,0
PUSH HL
PUSH IY
POP BC
LD DE,DisplayBuffer
CALL Hdrv_GetBuffData
POP AF
; 83.
; 84. //把暂时显存区的数据送到LCM
; 85. Hdrv_SetWindow(&tregionram);
LD HL,4
ADD HL,SP
CALL ?0029
; 86. Hdrv_BuffDataTrans(DisplayBuffer, block_pixel*2);
; 87.
; 88. line_cnt -= block_line;
ADD HL,SP
LD A,(HL)
SUB (IX-7)
LD (HL),A
; 89. sregionram.y += block_line; //坐标增加
LD A,(IX-17)
ADD A,(IX-7)
LD (IX-17),A
; 90. tregionram.y += block_line;
LD A,(IX-13)
ADD A,(IX-7)
LD (IX-13),A
JR ?0004
?0006:
; 91. }
; 92.
; 93. i = sregionram.width * line_cnt;//余下的象素个数
CALL ?0028
; 94.
; 95. sregionram.height = line_cnt;
; 96. tregionram.height = line_cnt;
; 97.
; 98. //读出余下不足一个块的区域内容
; 99. Hdrv_SetWindow(&sregionram);
JP ?0018
ADD HL,SP
JP ?0019
CALL Hdrv_SetWindow
; 100. Hdrv_GetBuffData(DisplayBuffer, i, NORTransMode_def);
JP ?0020
PUSH HL
JP ?0021
LD DE,DisplayBuffer
JP ?0022
POP AF
; 101.
; 102. //把暂时显存区的数据送到LCM
; 103. Hdrv_SetWindow(&tregionram);
JP ?0023
ADD HL,SP
JP ?0024
CALL Hdrv_SetWindow
; 104. Hdrv_BuffDataTrans(DisplayBuffer, i*2);
JP ?0025
ADD HL,HL
JP ?0026
LD DE,DisplayBuffer
JP ?0027
; 105. }
; 106. else
JP ?0009
?0005:
; 107. {
; 108. sregiony_tmp = sregionram.y;
LD B,(IX-17)
LD (IX-5),B
; 109. tregiony_tmp = tregionram.y;
LD B,(IX-13)
LD (IX-6),B
?0011:
; 110.
; 111.
; 112. //源在目标的上面时,要从下面开始读数据(这样不会覆盖)
; 113. while (line_cnt > block_line)
LD A,(IX-7)
CP (IX-8)
JR NC,?0010
?0012:
; 114. {
; 115. //读出对应区域的图片内容放在暂存中
; 116. sregionram.y = sregiony_tmp + (line_cnt - block_line);//从下面开始读
LD A,(IX-8)
SUB (IX-7)
ADD A,(IX-5)
LD (IX-17),A
; 117. tregionram.y = tregiony_tmp + (line_cnt - block_line);
LD A,(IX-8)
SUB (IX-7)
ADD A,(IX-6)
LD (IX-13),A
; 118. Hdrv_SetWindow(&sregionram);
LD HL,0
ADD HL,SP
EX DE,HL
CALL Hdrv_SetWindow
; 119. Hdrv_GetBuffData (DisplayBuffer, block_pixel, NORTransMode_def);
LD HL,0
PUSH HL
PUSH IY
POP BC
LD DE,DisplayBuffer
CALL Hdrv_GetBuffData
POP AF
; 120.
; 121. //把暂时显存区的数据送到LCM
; 122. Hdrv_SetWindow(&tregionram);
LD HL,4
ADD HL,SP
CALL ?0029
; 123. Hdrv_BuffDataTrans(DisplayBuffer, block_pixel*2);
; 124.
; 125. line_cnt -= block_line;
ADD HL,SP
LD A,(HL)
SUB (IX-7)
LD (HL),A
JR ?0011
?0010:
; 126. }
; 127.
; 128. i = sregionram.width * line_cnt;//余下的象素个数
CALL ?0028
; 129.
; 130. sregionram.height = line_cnt;
; 131. tregionram.height = line_cnt;
; 132. sregionram.y = sregiony_tmp;
LD B,(IX-5)
LD (IX-17),B
; 133. tregionram.y = tregiony_tmp;
LD B,(IX-6)
LD (IX-13),B
; 134.
; 135. //读出余下不足一个块的区域内容
; 136. Hdrv_SetWindow(&sregionram);
?0018:
LD HL,0
ADD HL,SP
?0019:
EX DE,HL
CALL Hdrv_SetWindow
; 137. Hdrv_GetBuffData(DisplayBuffer, i, NORTransMode_def);
?0020:
LD HL,0
PUSH HL
?0021:
LD C,(IX-10)
LD B,(IX-9)
LD DE,DisplayBuffer
?0022:
CALL Hdrv_GetBuffData
POP AF
; 138.
; 139. //把暂时显存区的数据送到LCM
; 140. Hdrv_SetWindow(&tregionram);
?0023:
LD HL,4
ADD HL,SP
?0024:
EX DE,HL
CALL Hdrv_SetWindow
; 141. Hdrv_BuffDataTrans(DisplayBuffer, i*2);
?0025:
LD L,(IX-10)
LD H,(IX-9)
ADD HL,HL
?0026:
LD C,L
LD B,H
LD DE,DisplayBuffer
?0027:
CALL Hdrv_BuffDataTrans
?0009:
; 142. }
; 143.
; 144.
; 145. }
?0013:
LD SP,IX
POP IX
POP IY
RET
?0028:
LD C,(IX-16)
LD B,0
LD D,B
LD E,(IX-8)
CALL ?S_MUL_L02
LD (IX-10),E
LD (IX-9),D
LD B,(IX-8)
LD (IX-15),B
LD (IX-11),B
RET
?0029:
EX DE,HL
CALL Hdrv_SetWindow
PUSH IY
POP HL
ADD HL,HL
LD C,L
LD B,H
LD DE,DisplayBuffer
CALL Hdrv_BuffDataTrans
LD HL,10
RET
; 146.
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -