Turbo51 Objects
Pascal Compiler for 8051 Microcontrollers
Objects are data structures that merge pascal records and procedures called methods, i.e. data and code together. In order to use objects in Turbo51 you need XDATA memory. The syntax is equivalent to that in Borland Turbo Pascal 7. Turbo51 supports:
- Inheritance
- Static and dynamic objects
- Private fields
- Constructors and destructors
- Static, virtual and dynamic methods
Example:
Program OOP; {$M $0000, $1000, $0000, $1000, 0} Type TLocation = Object X, Y : Integer; Procedure Init (InitX, InitY: Word); Function GetX: Word; Function GetY: Word; end; TPoint = Object (TLocation) Visible: ByteBool; Procedure Init (InitX, InitY: Word); Procedure Show; Procedure Hide; Function IsVisible: byteBool; Procedure MoveTo (NewX, NewY: Word); end; Const clBlack = 0; clGreen = 2; Var Point: TPoint XDATA; Procedure PutPixel (X, Y: Word; Color: Byte); begin // Code to draw pixel end; Procedure TLocation.Init (InitX, InitY: Word); begin X := InitX; Y := InitY; end; Function TLocation.GetX: Word; begin GetX := X; end; Function TLocation.GetY: Word; begin GetY := Y; end; Procedure TPoint.Init (InitX, InitY: Word); begin TLocation.Init (InitX, InitY); Visible := False; end; Procedure TPoint.Show; begin Visible := True; PutPixel (X, Y, clGreen); end; Procedure TPoint.Hide; begin Visible := False; PutPixel (X, Y, clBlack); end; Function TPoint.IsVisible: ByteBool; begin IsVisible := Visible; end; Procedure TPoint.MoveTo (NewX, NewY: Word); begin Hide; X := NewX; Y := NewY; Show; end; begin Point.Init (100, 50); // Initial X,Y at 10, 50 Point.Show; // APoint turns itself on Point.MoveTo (120, 100); // APoint moves to 120, 100 Point.Hide; // APoint turns itself off With Point do begin Init (100, 50); // Initial X, Y at 100, 50 Show; // APoint turns itself on MoveTo (120, 100); // APoint moves to 120, 100 Hide; end; end.
And compiled code would look like this:
; Turbo51 version 0.1.3.10, Copyright 2000 - 2011 Igor Funa $REGISTERBANK (0) _CODE SEGMENT CODE _DATA SEGMENT DATA _XDATA SEGMENT XDATA EXTRN DATA (XSP) EXTRN DATA (XBP) EXTRN IDATA (StackStart) EXTRN XDATA (XDATA_StackStart) EXTRN CODE (sysEnterMethod) EXTRN CODE (sysLoad_XBP_Plus_DPTR_To_DPTR) EXTRN CODE (sysLoadSelfAddress) EXTRN CODE (sysLoadSelfAddressPlus_R1) EXTRN CODE (sysLeaveProc) EXTRN CODE (sysLoadSelfAddressTo_R3R2) ; Program OOP; ; ; {$M $0000, $1000, $0000, $1000, 0} ; ; Type ; TLocation = Object ; X, Y : Integer; ; Procedure Init (InitX, InitY: Word); ; Function GetX: Word; ; Function GetY: Word; ; end; ; ; TPoint = Object (TLocation) ; Visible: ByteBool; ; Procedure Init (InitX, InitY: Word); ; Procedure Show; ; Procedure Hide; ; Function IsVisible: byteBool; ; Procedure MoveTo (NewX, NewY: Word); ; end; ; ; Const RSEG _CONST ; clBlack = 0; ; clGreen = 2; ; ; Var Point: TPoint XDATA; RSEG _XDATA Point: DS 5 ; ; Procedure PutPixel (X, Y: Word; Color: Byte); RSEG _DATA X: DS 2 Y: DS 2 Color: DS 1 RSEG _CODE USING 0 PutPixel: ; begin ; // Code to draw pixel ; end; RET ; ; Procedure TLocation.Init (InitX, InitY: Word); TLocation_Init: ; begin MOV R0, #0 LCALL sysEnterMethod ; X := InitX; MOV DPTR, #-6 LCALL sysLoad_XBP_Plus_DPTR_To_DPTR MOVX A, @DPTR MOV R2, A INC DPTR MOVX A, @DPTR MOV R3, A LCALL sysLoadSelfAddress MOV A, R2 MOVX @DPTR, A INC DPTR MOV A, R3 MOVX @DPTR, A ; Y := InitY; MOV DPTR, #-4 LCALL sysLoad_XBP_Plus_DPTR_To_DPTR MOVX A, @DPTR MOV R2, A INC DPTR MOVX A, @DPTR MOV R3, A MOV R1, #2 LCALL sysLoadSelfAddressPlus_R1 MOV A, R2 MOVX @DPTR, A INC DPTR MOV A, R3 MOVX @DPTR, A ; end; MOV DPTR, #-6 LJMP sysLeaveProc ; ; Function TLocation.GetX: Word; ; begin ; GetX := X; ; end; ; ; Function TLocation.GetY: Word; ; begin ; GetY := Y; ; end; ; ; Procedure TPoint.Init (InitX, InitY: Word); TPoint_Init: ; begin MOV R0, #0 LCALL sysEnterMethod ; TLocation.Init (InitX, InitY); MOV DPTR, #-6 LCALL sysLoad_XBP_Plus_DPTR_To_DPTR MOVX A, @DPTR MOV R2, A INC DPTR MOVX A, @DPTR MOV R3, A MOV DPL, XSP MOV DPH, XSP+1 MOV A, R2 MOVX @DPTR, A INC DPTR MOV A, R3 MOVX @DPTR, A INC DPTR MOV XSP+1, DPH MOV XSP, DPL MOV DPTR, #-4 LCALL sysLoad_XBP_Plus_DPTR_To_DPTR MOVX A, @DPTR MOV R2, A INC DPTR MOVX A, @DPTR MOV R3, A MOV DPL, XSP MOV DPH, XSP+1 MOV A, R2 MOVX @DPTR, A INC DPTR MOV A, R3 MOVX @DPTR, A INC DPTR MOV XSP+1, DPH MOV XSP, DPL LCALL sysLoadSelfAddressTo_R3R2 LCALL TLocation_Init ; Visible := False; MOV R1, #4 LCALL sysLoadSelfAddressPlus_R1 CLR A MOVX @DPTR, A ; end; MOV DPTR, #-6 LJMP sysLeaveProc ; ; Procedure TPoint.Show; TPoint_Show: ; begin MOV R0, #0 LCALL sysEnterMethod ; Visible := True; MOV R1, #4 LCALL sysLoadSelfAddressPlus_R1 MOV A, #1 MOVX @DPTR, A ; PutPixel (X, Y, clGreen); LCALL sysLoadSelfAddress MOVX A, @DPTR MOV X, A INC DPTR MOVX A, @DPTR MOV X+1, A MOV R1, #2 LCALL sysLoadSelfAddressPlus_R1 MOVX A, @DPTR MOV Y, A INC DPTR MOVX A, @DPTR MOV Y+1, A MOV Color, #2 LCALL PutPixel ; end; MOV DPTR, #-2 LJMP sysLeaveProc ; ; Procedure TPoint.Hide; TPoint_Hide: ; begin MOV R0, #0 LCALL sysEnterMethod ; Visible := False; MOV R1, #4 LCALL sysLoadSelfAddressPlus_R1 CLR A MOVX @DPTR, A ; PutPixel (X, Y, clBlack); LCALL sysLoadSelfAddress MOVX A, @DPTR MOV X, A INC DPTR MOVX A, @DPTR MOV X+1, A MOV R1, #2 LCALL sysLoadSelfAddressPlus_R1 MOVX A, @DPTR MOV Y, A INC DPTR MOVX A, @DPTR MOV Y+1, A MOV Color, R0 LCALL PutPixel ; end; MOV DPTR, #-2 LJMP sysLeaveProc ; ; Function TPoint.IsVisible: ByteBool; ; begin ; IsVisible := Visible; ; end; ; ; Procedure TPoint.MoveTo (NewX, NewY: Word); TPoint_MoveTo: ; begin MOV R0, #0 LCALL sysEnterMethod ; Hide; LCALL sysLoadSelfAddressTo_R3R2 LCALL TPoint_Hide ; X := NewX; MOV DPTR, #-6 LCALL sysLoad_XBP_Plus_DPTR_To_DPTR MOVX A, @DPTR MOV R2, A INC DPTR MOVX A, @DPTR MOV R3, A LCALL sysLoadSelfAddress MOV A, R2 MOVX @DPTR, A INC DPTR MOV A, R3 MOVX @DPTR, A ; Y := NewY; MOV DPTR, #-4 LCALL sysLoad_XBP_Plus_DPTR_To_DPTR MOVX A, @DPTR MOV R2, A INC DPTR MOVX A, @DPTR MOV R3, A MOV R1, #2 LCALL sysLoadSelfAddressPlus_R1 MOV A, R2 MOVX @DPTR, A INC DPTR MOV A, R3 MOVX @DPTR, A ; Show; LCALL sysLoadSelfAddressTo_R3R2 LCALL TPoint_Show ; end; MOV DPTR, #-6 LJMP sysLeaveProc CSEG AT $0000 OOP: ; ; begin MOV SP, #StackStart-1 MOV A, #LOW (XDATA_StackStart) MOV XBP, A MOV XSP, A MOV A, #HIGH (XDATA_StackStart) MOV XBP+1, A MOV XSP+1, A ; Point.Init (100, 50); // Initial X,Y at 10, 50 MOV DPL, XSP MOV DPH, XSP+1 MOV A, #LOW ($0064) MOVX @DPTR, A INC DPTR MOV A, #HIGH ($0064) MOVX @DPTR, A INC DPTR MOV XSP+1, DPH MOV XSP, DPL MOV A, #LOW ($0032) MOVX @DPTR, A INC DPTR MOV A, #HIGH ($0032) MOVX @DPTR, A INC DPTR MOV XSP+1, DPH MOV XSP, DPL MOV R2, #LOW (Point) MOV R3, #HIGH (Point) LCALL TPoint_Init ; Point.Show; // APoint turns itself on MOV R2, #LOW (Point) MOV R3, #HIGH (Point) LCALL TPoint_Show ; Point.MoveTo (120, 100); // APoint moves to 120, 100 MOV DPL, XSP MOV DPH, XSP+1 MOV A, #LOW ($0078) MOVX @DPTR, A INC DPTR MOV A, #HIGH ($0078) MOVX @DPTR, A INC DPTR MOV XSP+1, DPH MOV XSP, DPL MOV A, #LOW ($0064) MOVX @DPTR, A INC DPTR MOV A, #HIGH ($0064) MOVX @DPTR, A INC DPTR MOV XSP+1, DPH MOV XSP, DPL MOV R2, #LOW (Point) MOV R3, #HIGH (Point) LCALL TPoint_MoveTo ; Point.Hide; // APoint turns itself off MOV R2, #LOW (Point) MOV R3, #HIGH (Point) LCALL TPoint_Hide ; ; With Point do ; begin ; Init (100, 50); // Initial X, Y at 100, 50 MOV DPL, XSP MOV DPH, XSP+1 MOV A, #LOW ($0064) MOVX @DPTR, A INC DPTR MOV A, #HIGH ($0064) MOVX @DPTR, A INC DPTR MOV XSP+1, DPH MOV XSP, DPL MOV A, #LOW ($0032) MOVX @DPTR, A INC DPTR MOV A, #HIGH ($0032) MOVX @DPTR, A INC DPTR MOV XSP+1, DPH MOV XSP, DPL MOV R2, #LOW (Point) MOV R3, #HIGH (Point) LCALL TPoint_Init ; Show; // APoint turns itself on MOV R2, #LOW (Point) MOV R3, #HIGH (Point) LCALL TPoint_Show ; MoveTo (120, 100); // APoint moves to 120, 100 MOV DPL, XSP MOV DPH, XSP+1 MOV A, #LOW ($0078) MOVX @DPTR, A INC DPTR MOV A, #HIGH ($0078) MOVX @DPTR, A INC DPTR MOV XSP+1, DPH MOV XSP, DPL MOV A, #LOW ($0064) MOVX @DPTR, A INC DPTR MOV A, #HIGH ($0064) MOVX @DPTR, A INC DPTR MOV XSP+1, DPH MOV XSP, DPL MOV R2, #LOW (Point) MOV R3, #HIGH (Point) LCALL TPoint_MoveTo ; Hide; MOV R2, #LOW (Point) MOV R3, #HIGH (Point) LCALL TPoint_Hide ; end; ; end. L_00CF: SJMP L_00CF RSEG _CONST END