📄 splc501sys.asm
字号:
//////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////
.include hardware.inc
.include splc501c_io.inc
.include splc501c.inc
.external F_Set_LCD_Page_No
.external F_Set_LCD_Column_Addr
.external F_Read_Lcd_data
.external _Init_LCD_501
.external F_Fill_All_LCD_Value
.external F_Send_data
.external _Read_Lcd_data
.external F_Display_point
.external _Init_IO
.RAM
.CODE
//////////////////////////////////////////////////////////////////////////////
//Filename : _Init_sys
//Function Description : initialize systemClock and Find the "zk_data" position
//Input : no
//Output : [bank1] zk_data at rom bank
//Destory : R1,R2,R3,R4
//////////////////////////////////////////////////////////////////////////////
.public _Init_sys
_Init_sys:
F_Init_sys: .proc
r1=0x0000
[P_SystemClock]=r1
// call _F_image_bank
call F_zk_bank
RETF
.endp
//////////////////////////////////////////////////////////////////////////////
//Filename : F_zk_bank
//Function Description : Find the "zk_data" position
//Input : none
//Output : [bank1] zk_data at rom bank
//Destory : R1,R2,R3,R4
//////////////////////////////////////////////////////////////////////////////
.external bank1
.external tiny3 //zk_data
.public F_zk_bank
F_zk_bank:
r4=0x00
//////
r2=sr
r2&=0x03ff
r1=tiny3 //zk_data //zk_data at zk.asm
F_zk_bank_loop:
sr=r2
r3=D:[r1]
cmp r3,0x00ff
je F_zk_bank_0
r4+=0x0400
r2+=0x0400
jmp F_zk_bank_loop
F_zk_bank_0:
[bank1]=r4
retf
//////////////////////////////////////////////////////////////////////////////
//Filename : _pixel
//Function : display appoint pixel
//Input : x,y
//Output : display a appoint pixel on lcd
//Destroy : R1,r2,r3
//////////////////////////////////////////////////////////////////////////////
.external pixel_page
.external pixel_column
.external pixel_bit
.external TAB_pixel
.public _pixel
_pixel: .proc
PUSH BP,BP TO [SP];
bp=sp
bp+=0x04
r1=[bp]
bp+=0x01
r2=[bp]
F_pixel:
[pixel_column]=r1 //work out column
r1=0x00
[pixel_page]=r1
F_pixel_2:
cmp r2,0x08
jb F_pixel_1
cmp r2,0x08
je F_pixel_1
r2-=0x08
r1=[pixel_page]
r1+=0x01
[pixel_page]=r1
jmp F_pixel_2
F_pixel_1:
r1=TAB_pixel
r1+=r2
r2=[r1]
[pixel_bit]=r2 //work out pixel_bit,pixel_page
// R1 = [pixel_page]
// CALL F_Set_LCD_Page_No
// R2 = [pixel_column]
// CALL F_Set_LCD_Column_Addr
r1=[pixel_page]
[_page]=r1
r1=[pixel_column]
[_page_place]=r1
r3=[pixel_bit]
[_point_value]=r3
call display_a_point
r3=[sign]
r3&=0x01
jnz F_pixel_end
POP BP,BP FROM [SP]
F_pixel_end:
r3=[sign]
r3&=0xfffe
[sign]=r3
retf
.endp
//////////////////////////////////////////////////////////////////////////////
//Filename : F_Get_pixel
//参数: PlotX,PlotY
//Function : appoint pixel state,if r1=0 then point is white else point is black.
//Get the pixel color at (PlotX,PlotY), and store in A.
//Input : x,y
//Output : r1 appoint pixel state on lcd
//Destroy : R1,r2,r3
//用法: FG_GetPixel(short PlotX,short PlotY)
//Example: FG_GetPixel()
// FG_GetPixel(10,20)
//////////////////////////////////////////////////////////////////////////////
F_Get_pixel:
[pixel_column]=r1 //work out column
r1=0x00
[pixel_page]=r1
F_Get_pixel_2:
cmp r2,0x08
jb F_Get_pixel_1
cmp r2,0x08
je F_Get_pixel_1
r2-=0x08
r1=[pixel_page]
r1+=0x01
[pixel_page]=r1
jmp F_Get_pixel_2
F_Get_pixel_1:
r1=TAB_pixel
r1+=r2
r2=[r1]
[pixel_bit]=r2 //work out pixel_bit,pixel_page
R1 = [pixel_page]
CALL F_Set_LCD_Page_No
R2 = [pixel_column]
CALL F_Set_LCD_Column_Addr
call F_Read_Lcd_data
r1=[pixel_bit]
r3=r3 lsr 0x04
r3=r3 lsr 0x04
r1&=r3
F_Get_pixel_end:
retf
//////////////////////////////////////////////////////////////////////////////
//Filename : image
//Function : display image
//Input : x,y,tab
//Output : display image at appoint place
//Destroy : R1,r2,r3
//////////////////////////////////////////////////////////////////////////////
.external image_width_byte
.external image_high_bit
.external image_jumpoff_point_x
.external image_jumpoff_point_y
.external image_tab
.external image_page
.external image_bit
.external image_lcd_data
.external image_temp_data
.external image_temp_data1
.external image_tab_pointer
.public image
image: .proc
PUSH BP,BP TO [SP];
bp=sp
bp+=0x04
r1=[bp]
[image_jumpoff_point_x]=r1
bp+=0x01
r1=[bp]
[image_jumpoff_point_y]=r1
bp+=0x01
r1=[bp]
r1+=0x01
[image_tab]=r1
bp+=0x01
r1=[bp]
[image_width_byte]=r1
bp+=0x01
r1=[bp]
[image_high_bit]=r1 //get parameter form c
F_image:
r1=0x00
[image_page]=r1
[image_temp_data1]=r1
r2=[image_jumpoff_point_y]
F_image_page_no_end:
cmp r2,0x08
jb F_image_page_end
cmp r2,0x08
je F_image_page_end
r2-=0x08
r1=[image_page]
r1+=0x01
[image_page]=r1
jmp F_image_page_no_end
F_image_page_end:
[image_bit]=r2 //work out page and bit of jumping off point
r2=0x00
F_image_no_end:
r1=[image_tab]
[image_tab_pointer]=r1
r1=[image_jumpoff_point_x]
push r1,r2 to [sp] //save [image_jumpoff_point_x],r2
// call F_image_process_1 //display eight row
call F_image_display_eightrow
pop r1,r2 from [sp]
r2+=0x01
[image_jumpoff_point_x]=r1
r1=[image_tab]
r1+=0x01
[image_tab]=r1
[image_tab_pointer]=r1 //data pointer of image
R1 = [image_page]
r1-=0x01
[image_page]=r1
cmp r2,[image_width_byte] //if image end
je F_image_finish
jmp F_image_no_end
F_image_finish:
r1=[sign] //if assembler transfer
r1&=0x01
jne F_image_end
POP BP,BP FROM [SP];
F_image_end:
r1=[sign]
r1&=0xfffe
[sign]=r1
retf
.endp
/////////////////////////////////////////////////////////////////////////
F_image_display_eightrow:
r4=0x00 //pointer of tier data
image_display_eightrow_begin:
R1 = [image_page]
cmp r1,0x0009 //area of page
jb image_eightrow_begin
retf
image_eightrow_begin:
CALL F_Set_LCD_Page_No
R2 = [image_jumpoff_point_x]
CALL F_Set_LCD_Column_Addr
call F_Read_Lcd_data //read data on lcd
r3&=0xff00
[image_lcd_data]=r3
R2 = [image_jumpoff_point_x]
CALL F_Set_LCD_Column_Addr
r3=[image_tab_pointer]
push r1 to [sp]
r1=[sign]
r1&=sign_zk_bank //0x008
jz image_process_bank_1
sr|=[bank] //
r3=d:[r3]
jmp image_process_bank_2
image_process_bank_1:
r3=[r3]
image_process_bank_2:
pop r1 from [sp]
r4+=0x01
r2=[image_bit] //analyze place of image
cmp r2,0x04 //split data of image begin
ja image_split_1_1
image_split_1_2:
cmp r2 ,0x00
je image_split_1_3
r3=r3 lsl 0x01
r2-=0x01
jmp image_split_1_2
image_split_1_1:
r3=r3 lsl 0x04
r2-=0x04
image_split_1_4:
cmp r2 ,0x00
je image_split_1_3
r3=r3 lsl 0x01
r2-=0x01
jmp image_split_1_4
image_split_1_3:
[image_temp_data]=r3 //split data of image end
//r3&=0xff00
r3&=0xff00
r1=[R_GraphicMode_temp]
r1&=0x001c0
image_process_cover_frist:
jnz image_process_xor_frist
r3|=[image_lcd_data] //or data on lcd
jmp image_proc_mod_frist_end
image_process_xor_frist:
cmp r1,0x0100
je image_process_clear_frist
r3^=[image_lcd_data] //xor data on lcd
jmp image_proc_mod_frist_end
image_process_clear_frist:
r3^=0xff00
r3&=[image_lcd_data]
image_proc_mod_frist_end:
//r3|=[image_lcd_data]
r3=r3 lsr 0x04
r3=r3 lsr 0x04
call F_Display_point //display frist part data
R1 = [image_page]
r1-=0x01
cmp r1,0x08 //if overstep area
jb image_second_begin
goto image_process_end
image_second_begin:
CALL F_Set_LCD_Page_No
R2 = [image_jumpoff_point_x]
CALL F_Set_LCD_Column_Addr
call F_Read_Lcd_data //read data on lcd
r3&=0xff00
r3=r3 lsr 0x04
r3=r3 lsr 0x04
[image_lcd_data]=r3
R2 = [image_jumpoff_point_x]
CALL F_Set_LCD_Column_Addr
r3=[image_temp_data]
//r3|=[image_lcd_data]
r3&=0x00ff
r1=[R_GraphicMode_temp]
r1&=bmp_mode_bit
image_process_cover_second:
jne image_process_xor_second
r3|=[image_lcd_data] //or data on lcd
// [image_temp_data1]=r3
jmp image_proc_mod_second_end
image_process_xor_second:
cmp r1,0x0100
je image_process_clear_second
r3^=[image_lcd_data] //xor data on lcd
jmp image_proc_mod_second_end
image_process_clear_second:
r3^=0x00ff
r3&=[image_lcd_data]
image_proc_mod_second_end:
call F_Display_point //display remanent part data
image_process_end:
r1=[image_jumpoff_point_x]
r1-=0x01
[image_jumpoff_point_x]=r1
r3=[image_tab_pointer]
r3+=[image_width_byte]
[image_tab_pointer]=r3
cmp r4,[image_high_bit]
je image_process_complete //if display complete
goto image_display_eightrow_begin
image_process_complete:
retf
//////////////////////////////////////////////////////////////////////////////
//R_GraphicMode:
// 1 byte for graphic mode.
//
// Bit7,6: Bitmap/Char/String
// 00:COVER ;Default Mode
// 01:AND
// 10:OR
// 11:XOR
// Bit5: (unused)
// Bit4,3: Rect/Line/Pixel
// 00:SOLID_COVER ;Default (Bar) Mode
// 01:DOTTED_COVER
// 10:SOLID_XOR
// 11:DOTTED_XOR
//
// Bit2: Pixel Toggle
// 0:COVER(black)(default)
// 1:ERASE(white)
//
// (Toggle Bit for Dotted Line Mode)
// IF bit3=1, that is dotted mode
// then bit2 will be toggled between pixels
// IF bit3=0 then no toggle occured
// Bit1: (unused)
// Bit0: Swapping Flag for LineTo
// @
//X0: 1 byte x-coordinate of current point (CP).
//Y0: 1 byte y-coordinate of CP.
.external R_GraphicMode
.external _x0
.external _y0
///////////////////////////////////////////////////////////////////
//Function Name: FG_InitGraphic
//Parameters:
//Description: Initializing LCD graphics parameters
//Destroy:r1,r2,f3
//Memory Modified:
//Usage: FG_InitGraphic()
//Example:
// FG_InitGraphic()
///////////////////////////////////////////////////////////////////
.public _FG_InitGraphic
_FG_InitGraphic: .proc
call _Init_IO //Initial i/o
call _Init_LCD_501 //Initial SPLC501
r1=0x00
[R_GraphicMode_temp]=r1
[sign]=r1
[_x0]=r1
[_y0]=r1
retf
.endp
///////////////////////////////////////////////////////////////////
//Function Name: FG_ClearScreen
//Parameters: DG_CLS_ERASE(default), DG_CLS_FILL
//Description: Clear LCD screen with 0 or 1.
//Destroy: r1,r2,r3,r4
//Memory Modified: None
//Usage: FG_ClearScreen(short arg)
//Example:
// FG_ClearScreen()
// FG_ClearScreen(DG_CLS_FILL)
///////////////////////////////////////////////////////////////////
.public _FG_ClearScreen
_FG_ClearScreen: .proc
PUSH BP,BP TO [SP]
r1=sp
r2=bp
r2-=r1
cmp r2,0x04
je clearscreen
bp=sp
bp+=0x04
r1=[bp]
cmp r1,0x00
je clearscreen
jmp fillscreen
clearscreen:
r3=0x0000
jmp fillaction
fillscreen:
r3=0xff00
fillaction:
call F_Fill_All_LCD_Value
pop bp,bp from [sp]
retf
.endp
///////////////////////////////////////////////////////////////////
//Function Name: FG_GetBMPMode
// FG_GetLineStyle
// FG_GetRectStyle
// FG_GetCircleStyle
// FG_GetEllipseStyle
// FG_GetCharMode
//Description: Get current graphic mode.
//Destroy: r1
//Memory Modified:
//Usage:
// FG_GetBMPMode()
// FG_GetLineStyle()
// FG_GetRectStyle()
// FG_GetCircleStyle()
// FG_GetEllipseStyle()
// FG_GetCharMode()
///////////////////////////////////////////////////////////////////
.public _FG_GetBMPMode
_FG_GetBMPMode: .proc
PUSH BP,BP TO [SP]
r1=[R_GraphicMode_temp]
r1&=bmp_mode_bit_clear
[R_GraphicMode_temp]=r1
r1=[R_GraphicMode]
r1&=bmp_mode_bit
r1|=[R_GraphicMode_temp]
[R_GraphicMode_temp]=r1
pop bp,bp from [sp]
retf
.endp
//*****************************************************************
.public _FG_GetLineStyle
_FG_GetLineStyle: .proc
PUSH BP,BP TO [SP]
r1=[R_GraphicMode_temp]
r1&=dotted_mode_bit_clear
[R_GraphicMode_temp]=r1
r1=[R_GraphicMode]
r1&=dotted_mode_bit
r1|=[R_GraphicMode_temp]
[R_GraphicMode_temp]=r1
pop bp,bp from [sp]
retf
.endp
//*****************************************************************
.public _FG_GetRectStyle
_FG_GetRectStyle: .proc
call _FG_GetLineStyle
retf
.endp
//*****************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -