Compare commits
	
		
			33 Commits
		
	
	
		
			feature/vi
			...
			7bf53181e2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 7bf53181e2 | |||
| b7cbad2db7 | |||
| 8c3649f691 | |||
| b47194ed99 | |||
| 6bca42f2a5 | |||
| f1211f3cca | |||
| 0913daebc6 | |||
| d1a4b4d42f | |||
| 2906b8724b | |||
| 5e6e6c394a | |||
| 315050f095 | |||
| f795ba24f8 | |||
| 738307d070 | |||
| 04cff2e2c3 | |||
| 0b5981242b | |||
| f0dc598f44 | |||
| d4236f455e | |||
| 96fcf19c14 | |||
| 8c51bd8690 | |||
| 43464bb550 | |||
| 6a1b87e250 | |||
| 9473e26b50 | |||
| f19444201d | |||
| f907b7e072 | |||
| 80d0183391 | |||
| 5f3de290f3 | |||
| 07106b9aed | |||
| 25df276101 | |||
| 1db74f791a | |||
| 372fda3afc | |||
| 749ffe6d73 | |||
| 76b399f3b5 | |||
| 83f7ebb223 | 
| @@ -1776,15 +1776,14 @@ var | |||||||
|    fb: puint32; |    fb: puint32; | ||||||
|  |  | ||||||
| Begin | Begin | ||||||
|      Ready:= False; |  | ||||||
|      fb:= puint32(uint32(multibootinfo^.framebuffer_addr)); |      fb:= puint32(uint32(multibootinfo^.framebuffer_addr)); | ||||||
|      Console_Properties.Width:= multibootinfo^.framebuffer_width; |      Console_Properties.Width:= multibootinfo^.framebuffer_width; | ||||||
|      Console_Properties.Height:= multibootinfo^.framebuffer_height; |      Console_Properties.Height:= multibootinfo^.framebuffer_height; | ||||||
|      Console_Properties.BitsPerPixel:= multibootinfo^.framebuffer_bpp; |      Console_Properties.BitsPerPixel:= multibootinfo^.framebuffer_bpp; | ||||||
|      Console_Properties.MAX_CELL_X:= (Console_Properties.Width div 8) - 1; |      Console_Properties.MAX_CELL_X:= (Console_Properties.Width div 8) - 1; | ||||||
|      Console_Properties.MAX_CELL_Y:= (Console_Properties.Height div 16) - 1; |      Console_Properties.MAX_CELL_Y:= (Console_Properties.Height div 16) - 1; | ||||||
|      If Console_Properties.BitsPerPixel <> 16 then begin |      If Console_Properties.BitsPerPixel <> 16 then while true do begin | ||||||
|         exit; |  | ||||||
|      end; |      end; | ||||||
|      kpalloc(uint32(fb)); |      kpalloc(uint32(fb)); | ||||||
|      keyboard.hook(@keyhook); |      keyboard.hook(@keyhook); | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								src/cpu.pas
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								src/cpu.pas
									
									
									
									
									
								
							| @@ -291,28 +291,6 @@ begin | |||||||
|     end; |     end; | ||||||
| end; | end; | ||||||
|  |  | ||||||
| procedure enableAVX(); |  | ||||||
| begin |  | ||||||
|     if CPUID.Capabilities1^.AVX then begin |  | ||||||
|         asm |  | ||||||
|             PUSH EAX |  | ||||||
|             PUSH ECX |  | ||||||
|             PUSH EDX |  | ||||||
|             XOR ECX, ECX |  | ||||||
|             db $0F |  | ||||||
|             db $01 |  | ||||||
|             db $D0 |  | ||||||
|             OR EAX, 7 |  | ||||||
|             db $0F |  | ||||||
|             db $01 |  | ||||||
|             db $D1 |  | ||||||
|             POP EDX |  | ||||||
|             POP ECX |  | ||||||
|             POP EAX |  | ||||||
|         end; |  | ||||||
|     end; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure init(); | procedure init(); | ||||||
| begin | begin | ||||||
|     terminal.registerCommand('CPU', @Terminal_Command_CPU, 'CPU Info.'); |     terminal.registerCommand('CPU', @Terminal_Command_CPU, 'CPU Info.'); | ||||||
| @@ -322,7 +300,6 @@ begin | |||||||
|     getCPUCapabilities; |     getCPUCapabilities; | ||||||
|     getCPUClockSpeed; |     getCPUClockSpeed; | ||||||
|     enableSSE; |     enableSSE; | ||||||
|     enableAVX; |  | ||||||
| end; | end; | ||||||
|  |  | ||||||
| end. | end. | ||||||
| @@ -1,100 +0,0 @@ | |||||||
| //  Copyright 2021 Kieron Morris |  | ||||||
| // |  | ||||||
| //  Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| //  you may not use this file except in compliance with the License. |  | ||||||
| //  You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //  http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| //  Unless required by applicable law or agreed to in writing, software |  | ||||||
| //  distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| //  See the License for the specific language governing permissions and |  | ||||||
| //  limitations under the License. |  | ||||||
|  |  | ||||||
| {  |  | ||||||
| 	Driver->Video->Doublebuffer - Implements a very basic double buffer, tested with VESA drivers. |  | ||||||
| 	 |  | ||||||
| 	@author(Kieron Morris <kjm@kieronmorris.me>) |  | ||||||
| } |  | ||||||
| unit doublebuffer; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     lmemorymanager, tracer, videotypes, serial, util; |  | ||||||
|  |  | ||||||
| //Init the driver, and register with the video interface in a state ready for execution. |  | ||||||
| procedure init(Register : FRegisterDriver); |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| function allocateBackBuffer(Width : uint32; Height : uint32; BitsPerPixel : uint8) : uint64; |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('doublebuffer.allocateBackBuffer.enter'); |  | ||||||
|     //This doesn't currently work... Needs a rework of lmemorymanager |  | ||||||
|     allocateBackBuffer:= uint64(klalloc((Width * Height) * BitsPerPixel)); |  | ||||||
|     tracer.push_trace('doublebuffer.allocateBackBuffer.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure initBackBuffer(VInterface : PVideoInterface; Width : uint32; Height : uint32; BitsPerPixel : uint8); |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('doublebuffer.initBackBuffer.enter'); |  | ||||||
|     if not(VInterface^.BackBuffer.Initialized) then begin |  | ||||||
|         VInterface^.BackBuffer.Location:= allocateBackBuffer(Width, Height, BitsPerPixel); |  | ||||||
|         if (VInterface^.BackBuffer.Location <> 0) then begin |  | ||||||
|             VInterface^.BackBuffer.Width:= Width; |  | ||||||
|             VInterface^.BackBuffer.Height:= Height; |  | ||||||
|             VInterface^.BackBuffer.BitsPerPixel:= BitsPerPixel; |  | ||||||
|             VInterface^.BackBuffer.Initialized:= True; |  | ||||||
|         end; |  | ||||||
|     end; |  | ||||||
|     tracer.push_trace('doublebuffer.initBackBuffer.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure Flush(FrontBuffer : PVideoBuffer; BackBuffer : PVideoBuffer); |  | ||||||
| var |  | ||||||
|     idx : uint32; |  | ||||||
|     Back,Front : uint32; |  | ||||||
|     BufferSize : uint32; |  | ||||||
|  |  | ||||||
| const |  | ||||||
|     //COPY_WIDTH = 64; //Use this for 64bit copies |  | ||||||
|     COPY_WIDTH = 128; //Use this for SSE copies |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     //tracer.push_trace('doublebuffer.Flush.enter'); |  | ||||||
|     if not(BackBuffer^.Initialized) then exit; |  | ||||||
|     if ((FrontBuffer^.Width > BackBuffer^.Width) or (FrontBuffer^.Height > BackBuffer^.Height)) then exit; |  | ||||||
|     Back:= BackBuffer^.Location; |  | ||||||
|     Front:= FrontBuffer^.Location; |  | ||||||
|     BufferSize:= ( ( BackBuffer^.Width * BackBuffer^.Height * BackBuffer^.BitsPerPixel) div COPY_WIDTH ) - 1; |  | ||||||
|     for idx:=0 to BufferSize do begin |  | ||||||
|         //Front[idx]:= Back[idx]; |  | ||||||
|         // -- TODO: Get SSE working here for 128bit copies -- |  | ||||||
|         __SSE_128_memcpy(Back + (idx * 16), Front + (idx * 16));   |  | ||||||
|     end; |  | ||||||
|     //tracer.push_trace('doublebuffer.Flush.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function enable(VideoInterface : PVideoInterface) : boolean; |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('doublebuffer.enable.enter'); |  | ||||||
|     enable:= false; |  | ||||||
|     initBackBuffer(VideoInterface, VideoInterface^.FrontBuffer.Width, VideoInterface^.FrontBuffer.Height, VideoInterface^.FrontBuffer.BitsPerPixel); |  | ||||||
|     if VideoInterface^.BackBuffer.Initialized then begin |  | ||||||
|         VideoInterface^.DefaultBuffer:= @VideoInterface^.BackBuffer; |  | ||||||
|         VideoInterface^.DrawRoutines.Flush:= @Flush; |  | ||||||
|         enable:= true; |  | ||||||
|     end; |  | ||||||
|     tracer.push_trace('doublebuffer.enable.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure init(Register : FRegisterDriver); |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('doublebuffer.init.enter'); |  | ||||||
|     Register('BASIC_DOUBLE_BUFFER', @enable); |  | ||||||
|     tracer.push_trace('doublebuffer.init.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -1,87 +0,0 @@ | |||||||
| //  Copyright 2021 Kieron Morris |  | ||||||
| // |  | ||||||
| //  Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| //  you may not use this file except in compliance with the License. |  | ||||||
| //  You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //  http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| //  Unless required by applicable law or agreed to in writing, software |  | ||||||
| //  distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| //  See the License for the specific language governing permissions and |  | ||||||
| //  limitations under the License. |  | ||||||
|  |  | ||||||
| {  |  | ||||||
| 	Driver->Video->VESA - VESA Display Driver. |  | ||||||
| 	 |  | ||||||
| 	@author(Kieron Morris <kjm@kieronmorris.me>) |  | ||||||
| } |  | ||||||
| unit vesa; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     videotypes, tracer, multiboot, lmemorymanager; |  | ||||||
|  |  | ||||||
| //Init the driver, and register with the video interface in a state ready for execution. |  | ||||||
| procedure init(Register : FRegisterDriver); |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     VESA8, VESA16, VESA24, VESA32; |  | ||||||
|  |  | ||||||
| procedure allocateVESAFrameBuffer(Address : uint32; Width : uint32; Height : uint32); |  | ||||||
| var |  | ||||||
|     LowerAddress, UpperAddress : uint32; |  | ||||||
|     Block : uint32; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('VESA.allocateFrameBuffer.enter'); |  | ||||||
|     LowerAddress:= ((Address) SHR 22)-1; |  | ||||||
|     UpperAddress:= ((Address + (Width * Height)) SHR 22)+1; |  | ||||||
|     For Block:=LowerAddress to UpperAddress do begin |  | ||||||
|         kpalloc(Block SHL 22); |  | ||||||
|     end; |  | ||||||
|     tracer.push_trace('VESA.allocateFrameBuffer.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure initVESAFrameBuffer(VideoBuffer : PVideoBuffer; Location : uint64; Width : uint32; Height : uint32; BitsPerPixel : uint8); |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('VESA.initVESAFrameBuffer.enter'); |  | ||||||
|     if not(VideoBuffer^.Initialized) then begin |  | ||||||
|         VideoBuffer^.Location:= Location; |  | ||||||
|         VideoBuffer^.BitsPerPixel:= BitsPerPixel; |  | ||||||
|         VideoBuffer^.Width:= Width; |  | ||||||
|         VideoBuffer^.Height:= Height; |  | ||||||
|         allocateVESAFrameBuffer(VideoBuffer^.Location, VideoBuffer^.Width, VideoBuffer^.Height); |  | ||||||
|         if VideoBuffer^.Location <> 0 then |  | ||||||
|             VideoBuffer^.Initialized:= True; |  | ||||||
|     end; |  | ||||||
|     tracer.push_trace('VESA.initVESAFrameBuffer.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function enable(VideoInterface : PVideoInterface) : boolean; |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('VESA.enable.enter'); |  | ||||||
|     initVESAFrameBuffer(@VideoInterface^.FrontBuffer, multiboot.multibootinfo^.framebuffer_addr, multiboot.multibootinfo^.framebuffer_width, multiboot.multibootinfo^.framebuffer_height, multiboot.multibootinfo^.framebuffer_bpp); |  | ||||||
|     case (VideoInterface^.FrontBuffer.BitsPerPixel) of |  | ||||||
|         08:VESA8.init(@VideoInterface^.DrawRoutines); |  | ||||||
|         16:VESA16.init(@VideoInterface^.DrawRoutines); |  | ||||||
|         24:VESA24.init(@VideoInterface^.DrawRoutines); |  | ||||||
|         32:VESA32.init(@VideoInterface^.DrawRoutines); |  | ||||||
|     end; |  | ||||||
|     enable:= VideoInterface^.FrontBuffer.Initialized;   |  | ||||||
|     tracer.push_trace('VESA.enable.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure init(Register : FRegisterDriver); |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('VESA.init.enter'); |  | ||||||
|     if Register <> nil then |  | ||||||
|         Register('VESA', @enable);    |  | ||||||
|     tracer.push_trace('VESA.init.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -1,43 +0,0 @@ | |||||||
| //  Copyright 2021 Kieron Morris |  | ||||||
| // |  | ||||||
| //  Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| //  you may not use this file except in compliance with the License. |  | ||||||
| //  You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //  http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| //  Unless required by applicable law or agreed to in writing, software |  | ||||||
| //  distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| //  See the License for the specific language governing permissions and |  | ||||||
| //  limitations under the License. |  | ||||||
|  |  | ||||||
| {  |  | ||||||
| 	Driver->Video->VESA16 - Implementation of VESA 16bpp draw routines for the VESA Driver. |  | ||||||
| 	 |  | ||||||
| 	@author(Kieron Morris <kjm@kieronmorris.me>) |  | ||||||
| } |  | ||||||
| unit vesa16; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     videotypes, vesa, tracer, color; |  | ||||||
|  |  | ||||||
| //Init the draw routines by providing what we support through the DrawRoutines struct. |  | ||||||
| procedure init(DrawRoutines : PDrawRoutines); |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| procedure DrawPixel(Buffer : PVideoBuffer; X : uint32; Y : uint32; Pixel : TRGB32); |  | ||||||
| begin |  | ||||||
|  |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure init(DrawRoutines : PDrawRoutines); |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('vesa16.init.enter');    |  | ||||||
|     tracer.push_trace('vesa16.init.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -1,43 +0,0 @@ | |||||||
| //  Copyright 2021 Kieron Morris |  | ||||||
| // |  | ||||||
| //  Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| //  you may not use this file except in compliance with the License. |  | ||||||
| //  You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //  http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| //  Unless required by applicable law or agreed to in writing, software |  | ||||||
| //  distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| //  See the License for the specific language governing permissions and |  | ||||||
| //  limitations under the License. |  | ||||||
|  |  | ||||||
| {  |  | ||||||
| 	Driver->Video->VESA24 - Implementation of VESA 24bpp draw routines for the VESA Driver. |  | ||||||
| 	 |  | ||||||
| 	@author(Kieron Morris <kjm@kieronmorris.me>) |  | ||||||
| } |  | ||||||
| unit vesa24; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     videotypes, vesa, tracer, color; |  | ||||||
|  |  | ||||||
| //Init the draw routines by providing what we support through the DrawRoutines struct. |  | ||||||
| procedure init(DrawRoutines : PDrawRoutines); |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| procedure DrawPixel(Buffer : PVideoBuffer; X : uint32; Y : uint32; Pixel : TRGB32); |  | ||||||
| begin |  | ||||||
|  |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure init(DrawRoutines : PDrawRoutines); |  | ||||||
| begin |  | ||||||
| 	tracer.push_trace('vesa24.init.enter'); |  | ||||||
| 	tracer.push_trace('vesa24.init.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -1,52 +0,0 @@ | |||||||
| //  Copyright 2021 Kieron Morris |  | ||||||
| // |  | ||||||
| //  Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| //  you may not use this file except in compliance with the License. |  | ||||||
| //  You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //  http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| //  Unless required by applicable law or agreed to in writing, software |  | ||||||
| //  distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| //  See the License for the specific language governing permissions and |  | ||||||
| //  limitations under the License. |  | ||||||
|  |  | ||||||
| {  |  | ||||||
| 	Driver->Video->VESA32 - Implementation of VESA 32bpp draw routines for the VESA Driver. |  | ||||||
| 	 |  | ||||||
| 	@author(Kieron Morris <kjm@kieronmorris.me>) |  | ||||||
| } |  | ||||||
| unit vesa32; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     videotypes, vesa, tracer, color; |  | ||||||
|  |  | ||||||
| //Init the draw routines by providing what we support through the DrawRoutines struct. |  | ||||||
| procedure init(DrawRoutines : PDrawRoutines); |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| procedure DrawPixel(Buffer : PVideoBuffer; X : uint32; Y : uint32; Pixel : TRGB32); |  | ||||||
| var |  | ||||||
|     Location : PuInt32; |  | ||||||
|     LocationIndex : Uint32; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     //tracer.push_trace('vesa32.DrawPixel.enter'); |  | ||||||
|     Location:= Puint32(Buffer^.Location); |  | ||||||
|     LocationIndex:= (Y * Buffer^.Width) + X; |  | ||||||
|     Location[LocationIndex]:= uint32(Pixel); |  | ||||||
|     //tracer.push_trace('vesa32.DrawPixel.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure init(DrawRoutines : PDrawRoutines); |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('vesa32.init.enter'); |  | ||||||
|     DrawRoutines^.DrawPixel:= @DrawPixel; |  | ||||||
|     tracer.push_trace('vesa32.init.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -1,43 +0,0 @@ | |||||||
| //  Copyright 2021 Kieron Morris |  | ||||||
| // |  | ||||||
| //  Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| //  you may not use this file except in compliance with the License. |  | ||||||
| //  You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //  http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| //  Unless required by applicable law or agreed to in writing, software |  | ||||||
| //  distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| //  See the License for the specific language governing permissions and |  | ||||||
| //  limitations under the License. |  | ||||||
|  |  | ||||||
| {  |  | ||||||
| 	Driver->Video->VESA8 - Implementation of VESA 8bpp draw routines for the VESA Driver. |  | ||||||
| 	 |  | ||||||
| 	@author(Kieron Morris <kjm@kieronmorris.me>) |  | ||||||
| } |  | ||||||
| unit vesa8; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     videotypes, vesa, tracer, color; |  | ||||||
|  |  | ||||||
| //Init the draw routines by providing what we support through the DrawRoutines struct. |  | ||||||
| procedure init(DrawRoutines : PDrawRoutines); |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| procedure DrawPixel(Buffer : PVideoBuffer; X : uint32; Y : uint32; Pixel : TRGB32); |  | ||||||
| begin |  | ||||||
|  |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure init(DrawRoutines : PDrawRoutines); |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('vesa8.init.enter');    |  | ||||||
|     tracer.push_trace('vesa8.init.exit');   |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -1,318 +0,0 @@ | |||||||
| //  Copyright 2021 Kieron Morris |  | ||||||
| // |  | ||||||
| //  Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| //  you may not use this file except in compliance with the License. |  | ||||||
| //  You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //  http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| //  Unless required by applicable law or agreed to in writing, software |  | ||||||
| //  distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| //  See the License for the specific language governing permissions and |  | ||||||
| //  limitations under the License. |  | ||||||
|  |  | ||||||
| {  |  | ||||||
| 	Driver->Video->Video - Provides an abstract rasterization/drawing interface. |  | ||||||
| 	 |  | ||||||
| 	@author(Kieron Morris <kjm@kieronmorris.me>) |  | ||||||
| } |  | ||||||
| unit video; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     lmemorymanager, tracer, color, videotypes, hashmap, util, texture; |  | ||||||
|  |  | ||||||
| procedure init(); |  | ||||||
| procedure DrawPixel(X : uint32; Y : uint32; Pixel : TRGB32); |  | ||||||
| procedure DrawLine(x1,y1,x2,y2 : uint32; thickness : uint32; Color : TRGB32); |  | ||||||
| procedure DrawRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Color : TRGB32); |  | ||||||
| procedure FillRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Line_Color : TRGB32; Fill_Color : TRGB32); |  | ||||||
| procedure Flush(); |  | ||||||
|  |  | ||||||
| function register(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean; |  | ||||||
| function enable(DriverIdentifier : pchar) : boolean; |  | ||||||
|  |  | ||||||
| function frontBufferWidth : uint32; |  | ||||||
| function frontBufferHeight : uint32; |  | ||||||
| function frontBufferBpp : uint8; |  | ||||||
| function backBufferWidth : uint32; |  | ||||||
| function backBufferHeight : uint32; |  | ||||||
| function backBufferBpp : uint8; |  | ||||||
|  |  | ||||||
| Procedure basicFDrawTexture(Buffer : PVideoBuffer; X : uint32; Y : uint32; Texture : PTexture); |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| Procedure dummyFDrawPixel(Buffer : PVideoBuffer; X : uint32; Y : uint32; Pixel : TRGB32); |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('video.dummyFDrawPixel.enter'); |  | ||||||
|     //Do nothing, this is the most basic function that must be implemented by a driver. |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| Procedure basicFFlush(FrontBuffer : PVideoBuffer; BackBuffer : PVideoBuffer); |  | ||||||
| var |  | ||||||
|     idx : uint32; |  | ||||||
|     Back,Front : puint32; |  | ||||||
|     BufferSize : uint32; |  | ||||||
|  |  | ||||||
| const |  | ||||||
|     COPY_WIDTH = 32; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     //tracer.push_trace('video.basicFFlush.enter'); |  | ||||||
|     If not(FrontBuffer^.Initialized and BackBuffer^.Initialized) then exit; |  | ||||||
|     if (BackBuffer^.Width > FrontBuffer^.Width) or (BackBuffer^.Height > FrontBuffer^.Height) then exit; |  | ||||||
|     Back:= puint32(BackBuffer^.Location); |  | ||||||
|     Front:= puint32(FrontBuffer^.Location); |  | ||||||
|     BufferSize:= ( (BackBuffer^.Width * BackBuffer^.Height * BackBuffer^.BitsPerPixel ) div COPY_WIDTH ) - 1; |  | ||||||
|     for idx:=0 to BufferSize do begin |  | ||||||
|         Front[idx]:= Back[idx]; |  | ||||||
|     end; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| Procedure basicFDrawTexture(Buffer : PVideoBuffer; X : uint32; Y : uint32; Texture : PTexture); |  | ||||||
| var |  | ||||||
|     i, j : uint32; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     //Draw texture to Buffer at x and y |  | ||||||
|     for i:=0 to Texture^.Height - 1 do begin |  | ||||||
|         for j:=0 to Texture^.Width - 1 do begin |  | ||||||
|             DrawPixel(X + j, Y + i, Texture^.Pixels[(i * Texture^.Width) + j]); |  | ||||||
|         end; |  | ||||||
|     end; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure basicFDrawLine(Buffer : PVideoBuffer; x1,y1,x2,y2 : uint32; thickness : uint32; Color : TRGB32); |  | ||||||
| var |  | ||||||
|     X, Y, DX, DY, DX1, DY1, PX, PY, XE, YE, I : sint32; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('video.basicFDrawLine.enter'); |  | ||||||
|  |  | ||||||
|     if(x1 = x2) then begin |  | ||||||
|         for Y:=Y1 to Y2 do begin |  | ||||||
|             DrawPixel(X1,Y,Color); |  | ||||||
|         end; |  | ||||||
|     end else if (y1 = y2) then begin |  | ||||||
|         for X:=X1 to X2 do begin |  | ||||||
|             DrawPixel(X,Y1,Color); |  | ||||||
|         end; |  | ||||||
|     end else begin |  | ||||||
|         DX:= X2 - X1; |  | ||||||
|         DY:= Y2 - Y1; |  | ||||||
|  |  | ||||||
|         DX1:= util.abs(DX); |  | ||||||
|         DY1:= util.abs(DY); |  | ||||||
|  |  | ||||||
|         PX:= 2 * DY1 - DX1; |  | ||||||
|         PY:= 2 * DX1 - DY1; |  | ||||||
|  |  | ||||||
|         if (DY1 <= DX1) then begin |  | ||||||
|             if (dx >= 0) then begin |  | ||||||
|                 X:= X1; Y:= Y1; XE:= X2; |  | ||||||
|             end else begin |  | ||||||
|                 X:= X2; Y:= Y2; XE:= X1; |  | ||||||
|             end; |  | ||||||
|  |  | ||||||
|             DrawPixel(X, Y, Color); |  | ||||||
|  |  | ||||||
|             I:=0; |  | ||||||
|             while (x < xe) do begin |  | ||||||
|                 X:= X + 1; |  | ||||||
|                 if (PX < 0) then begin |  | ||||||
|                     PX:= PX + 2 + DY1;  |  | ||||||
|                 end else begin |  | ||||||
|                     if(((dx < 0) and (dy < 0)) OR ((dx > 0) and (dy > 0))) then begin |  | ||||||
|                         Y:= Y + 1;   |  | ||||||
|                     end else begin |  | ||||||
|                         Y:= Y - 1; |  | ||||||
|                     end; |  | ||||||
|                     PX:= PX + 2 * (DY1 - DX1); |  | ||||||
|                 end; |  | ||||||
|                 DrawPixel(X,Y,Color); |  | ||||||
|                 I:= I + 1; |  | ||||||
|             end; |  | ||||||
|         end else begin |  | ||||||
|             if (DY >= 0) then begin |  | ||||||
|                 X:= X1; Y:= Y1; YE:= Y2;  |  | ||||||
|             end else begin |  | ||||||
|                 X:= X2; Y:= Y2; YE:= Y1; |  | ||||||
|             end; |  | ||||||
|  |  | ||||||
|             DrawPixel(X, Y, Color); |  | ||||||
|  |  | ||||||
|             I:=0; |  | ||||||
|             while (Y < YE) do begin |  | ||||||
|                 Y:= Y + 1; |  | ||||||
|                 if (PY <= 0) then begin |  | ||||||
|                     PY:= PY + 2 * DX1; |  | ||||||
|                 end else begin |  | ||||||
|                     if (((dx < 0) and (dy < 0)) OR ((dx > 0) and (dy > 0))) then begin |  | ||||||
|                         X:= X + 1;  |  | ||||||
|                     end else begin |  | ||||||
|                         X:= X - 1; |  | ||||||
|                     end; |  | ||||||
|                     PY:= PY + 2 * (dx1 - dy1); |  | ||||||
|                 end; |  | ||||||
|                 DrawPixel(X,Y,Color); |  | ||||||
|                 I:= I + 1; |  | ||||||
|             end; |  | ||||||
|         end; |  | ||||||
|     end; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure basicFDrawRect(Buffer : PVideoBuffer; x1,y1,x2,y2 : uint32; line_thickness : uint32; Color : TRGB32); |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('video.basicFDrawRect.enter'); |  | ||||||
|     DrawLine(x1,y1,x2,y1,line_thickness,Color); |  | ||||||
|     DrawLine(x1,y2,x2,y2,line_thickness,Color); |  | ||||||
|     DrawLine(x1,y1,x1,y2,line_thickness,Color); |  | ||||||
|     DrawLine(x2,y1,x2,y2,line_thickness,Color); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure basicFFillRect(Buffer : PVideoBuffer; x1,y1,x2,y2 : uint32; line_thickness : uint32; Line_Color : TRGB32; Fill_Color : TRGB32); |  | ||||||
| var |  | ||||||
|     Y : uint32; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('video.basicFFillRect.enter');    |  | ||||||
|     for Y:=y1 to y2 do begin |  | ||||||
|         DrawLine(x1,y,x2,y,line_thickness,Fill_Color); |  | ||||||
|     end; |  | ||||||
|     DrawRect(x1,y1,x2,y2,line_thickness,Line_Color); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| var |  | ||||||
|     VideoInterface : TVideoInterface; |  | ||||||
|     DriverMap      : PHashMap; |  | ||||||
|  |  | ||||||
| procedure init(); |  | ||||||
| var |  | ||||||
|     RGB : TRGB32; |  | ||||||
|     x,y : uint32; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('video.init.enter'); |  | ||||||
|     //Ensure the frontbuffer is empty & nil, ready for initialization by a driver. |  | ||||||
|     VideoInterface.FrontBuffer.Initialized:= false; |  | ||||||
|     VideoInterface.FrontBuffer.Width:= 0; |  | ||||||
|     VideoInterface.FrontBuffer.Height:= 0; |  | ||||||
|     VideoInterface.FrontBuffer.BitsPerPixel:= 0; |  | ||||||
|     VideoInterface.FrontBuffer.Location:= 0; |  | ||||||
|  |  | ||||||
|     //Ensure the backbuffer is empty & nil, ready for initialization by a driver. |  | ||||||
|     VideoInterface.BackBuffer.Initialized:= false; |  | ||||||
|     VideoInterface.BackBuffer.Width:= 0; |  | ||||||
|     VideoInterface.BackBuffer.Height:= 0; |  | ||||||
|     VideoInterface.BackBuffer.BitsPerPixel:= 0; |  | ||||||
|     VideoInterface.BackBuffer.Location:= 0; |  | ||||||
|  |  | ||||||
|     //Set the default buffer to be the FrontBuffer, assume no double buffering to begin with. |  | ||||||
|     VideoInterface.DefaultBuffer:= @VideoInterface.FrontBuffer; |  | ||||||
|  |  | ||||||
|     { Set the draw routines to point to dummy/empty routines. |  | ||||||
|       Calls will still succeed but do nothing until a driver has registered. } |  | ||||||
|     VideoInterface.DrawRoutines.DrawPixel:= @dummyFDrawPixel; |  | ||||||
|     VideoInterface.DrawRoutines.Flush:= @basicFFlush; |  | ||||||
|     VideoInterface.DrawRoutines.DrawLine:= @basicFDrawLine; |  | ||||||
|     VideoInterface.DrawRoutines.DrawRect:= @basicFDrawRect; |  | ||||||
|     VideoInterface.DrawRoutines.FillRect:= @basicFFillRect; |  | ||||||
|  |  | ||||||
|     //Initialize our 'DriverMap', a hashmap of loadable display drivers. |  | ||||||
|     DriverMap:= hashmap.new; |  | ||||||
|  |  | ||||||
|     tracer.push_trace('video.init.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function register(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean; |  | ||||||
| var |  | ||||||
|     Value : Void; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('video.register.enter'); |  | ||||||
|     register:= false; |  | ||||||
|     Value:= Hashmap.get(DriverMap, DriverIdentifier); |  | ||||||
|     if (Value = nil) then begin |  | ||||||
|         Hashmap.add(DriverMap, DriverIdentifier, void(EnableCallback)); |  | ||||||
|         register:= true; |  | ||||||
|     end; |  | ||||||
|     tracer.push_trace('video.register.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function enable(DriverIdentifier : pchar) : boolean; |  | ||||||
| var |  | ||||||
|     Value : Void; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     tracer.push_trace('video.enable.enter'); |  | ||||||
|     enable:= false; |  | ||||||
|     Value:= Hashmap.get(DriverMap, DriverIdentifier); |  | ||||||
|     if (Value <> nil) then begin |  | ||||||
|         enable:= FEnableDriver(Value)(@VideoInterface); |  | ||||||
|     end; |  | ||||||
|     tracer.push_trace('video.enable.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure DrawPixel(X : uint32; Y : uint32; Pixel : TRGB32); |  | ||||||
| begin |  | ||||||
|     //tracer.push_trace('video.DrawPixel.enter'); |  | ||||||
|     VideoInterface.DrawRoutines.DrawPixel(VideoInterface.DefaultBuffer, X, Y, Pixel); |  | ||||||
|     //tracer.push_trace('video.DrawPixel.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure Flush(); |  | ||||||
| begin |  | ||||||
|     //tracer.push_trace('video.Flush.enter'); |  | ||||||
|     VideoInterface.DrawRoutines.Flush(@VideoInterface.FrontBuffer, @VideoInterface.BackBuffer); |  | ||||||
|     //tracer.push_trace('video.Flush.exit'); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure DrawLine(x1,y1,x2,y2 : uint32; thickness : uint32; Color : TRGB32); |  | ||||||
| begin |  | ||||||
|     VideoInterface.DrawRoutines.DrawLine(VideoInterface.DefaultBuffer,x1,y1,x2,y2,thickness,Color); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure DrawRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Color : TRGB32); |  | ||||||
| begin |  | ||||||
|     VideoInterface.DrawRoutines.DrawRect(VideoInterface.DefaultBuffer,x1,y1,x2,y2,line_thickness,color); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| procedure FillRect(x1,y1,x2,y2 : uint32; line_thickness : uint32; Line_Color : TRGB32; Fill_Color : TRGB32); |  | ||||||
| begin |  | ||||||
|     VideoInterface.DrawRoutines.FillRect(VideoInterface.DefaultBuffer,x1,y1,x2,y2,line_thickness,Line_Color,Fill_Color); |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function frontBufferWidth : uint32; |  | ||||||
| begin |  | ||||||
|     frontBufferWidth:= VideoInterface.FrontBuffer.Width; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function frontBufferHeight : uint32; |  | ||||||
| begin |  | ||||||
|     frontBufferHeight:= VideoInterface.FrontBuffer.Height; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function frontBufferBpp : uint8; |  | ||||||
| begin |  | ||||||
|     frontBufferBpp:= VideoInterface.FrontBuffer.BitsPerPixel; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function backBufferWidth : uint32; |  | ||||||
| begin |  | ||||||
|     backBufferWidth:= VideoInterface.BackBuffer.Width; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function backBufferHeight : uint32; |  | ||||||
| begin |  | ||||||
|     backBufferHeight:= VideoInterface.BackBuffer.Height; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function backBufferBpp : uint8; |  | ||||||
| begin |  | ||||||
|     backBufferBpp:= VideoInterface.BackBuffer.BitsPerPixel; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -1,92 +0,0 @@ | |||||||
| //  Copyright 2021 Kieron Morris |  | ||||||
| // |  | ||||||
| //  Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| //  you may not use this file except in compliance with the License. |  | ||||||
| //  You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //  http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| //  Unless required by applicable law or agreed to in writing, software |  | ||||||
| //  distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| //  See the License for the specific language governing permissions and |  | ||||||
| //  limitations under the License. |  | ||||||
|  |  | ||||||
| {  |  | ||||||
| 	Driver->Video->Videotypes - Provides types relating to the video framework & driver interface. |  | ||||||
| 	 |  | ||||||
| 	@author(Kieron Morris <kjm@kieronmorris.me>) |  | ||||||
| } |  | ||||||
| unit videotypes; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     color; |  | ||||||
|  |  | ||||||
| type |  | ||||||
|     //Arbitrary pointer to a raw video buffer in memory |  | ||||||
|     VideoBuffer = uint32; |  | ||||||
|  |  | ||||||
|     //Struct representing a Memory Mapped Video Buffer |  | ||||||
|     TVideoBuffer = record |  | ||||||
|         //Has this buffer been initialized? Has it been paged/created in memory? |  | ||||||
|         Initialized     : Boolean; |  | ||||||
|         //Location of the video buffer in memory as a QWORD. |  | ||||||
|         Location        : VideoBuffer; |  | ||||||
|         //How many bits per pixel? |  | ||||||
|         BitsPerPixel    : uint8; |  | ||||||
|         //Width of the buffer. |  | ||||||
|         Width           : uint32; |  | ||||||
|         //Height of the buffer. |  | ||||||
|         Height          : uint32; |  | ||||||
|     end; |  | ||||||
|     //Pointer to a video buffer |  | ||||||
|     PVideoBuffer = ^TVideoBuffer; |  | ||||||
|  |  | ||||||
|     //(Abstract) Draw a pixel to screenspace |  | ||||||
|     FDrawPixel = procedure(Buffer : PVideoBuffer; X : uint32; Y : uint32; Pixel : TRGB32); |  | ||||||
|     //(Abstract) Flush backbuffer to MMIO Buffer |  | ||||||
|     FFlush     = procedure(FrontBuffer : PVideoBuffer; BackBuffer : PVideoBuffer); |  | ||||||
|     //(Abstract) Draw a line to the screen |  | ||||||
|     FDrawLine = procedure(Buffer : PVideoBuffer; x1,y1,x2,y2 : uint32; thickness : uint32; Color : TRGB32); |  | ||||||
|     //(Abstract) Draw a rect to the screen |  | ||||||
|     FDrawRect = procedure(Buffer : PVideoBuffer; x1,y1,x2,y2 : uint32; line_thickness : uint32; Color : TRGB32); |  | ||||||
|     //(Abstract) Draw a filled rect to the screen |  | ||||||
|     FFillRect = procedure(Buffer : PVideoBuffer; x1,y1,x2,y2 : uint32; line_thickness : uint32; Line_Color : TRGB32; Fill_Color : TRGB32); |  | ||||||
|  |  | ||||||
|     //Routines for drawing to the screen |  | ||||||
|     TDrawRoutines = record |  | ||||||
|         DrawPixel : FDrawPixel; |  | ||||||
|         Flush     : FFlush; |  | ||||||
|         DrawLine  : FDrawLine; |  | ||||||
|         DrawRect  : FDrawRect; |  | ||||||
|         FillRect  : FFillRect; |  | ||||||
|     end; |  | ||||||
|     //Pointer to drawing routines |  | ||||||
|     PDrawRoutines = ^TDrawRoutines; |  | ||||||
|  |  | ||||||
|     //Struct representing the whole video driver. |  | ||||||
|     TVideoInterface = record |  | ||||||
|         //Default buffer to be used when rendering, front buffer for no double buffering, back buffer otherwise. |  | ||||||
|         DefaultBuffer   : PVideoBuffer; |  | ||||||
|         //Memory Mapped IO Buffer for raw rasterization. |  | ||||||
|         FrontBuffer     : TVideoBuffer; |  | ||||||
|         //Back buffer used for double buffering, this is flushed to FrontBuffer with flush(); |  | ||||||
|         BackBuffer      : TVideoBuffer; |  | ||||||
|         //Drawing Routines |  | ||||||
|         DrawRoutines    : TDrawRoutines; |  | ||||||
|     end; |  | ||||||
|     //Pointer to a video interface struct. |  | ||||||
|     PVideoInterface = ^TVideoInterface; |  | ||||||
|  |  | ||||||
|     //(Abstract) Enable method for a driver, called from video to enable driver. |  | ||||||
|     FEnableDriver = function(VideoInterface : PVideoInterface) : boolean; |  | ||||||
|     //(Abstract) Register driver, called from a driver to register with the video interface. |  | ||||||
|     FRegisterDriver = function(DriverIdentifier : pchar; EnableCallback : FEnableDriver) : boolean; |  | ||||||
|     //(Abstract) Init driver, called from _somewhere_ to start the driver and register it with the video interface. |  | ||||||
|     FInitDriver = procedure(Register : FRegisterDriver); |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -1,63 +0,0 @@ | |||||||
| //  Copyright 2021 Kieron Morris |  | ||||||
| // |  | ||||||
| //  Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| //  you may not use this file except in compliance with the License. |  | ||||||
| //  You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //  http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| //  Unless required by applicable law or agreed to in writing, software |  | ||||||
| //  distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| //  See the License for the specific language governing permissions and |  | ||||||
| //  limitations under the License. |  | ||||||
|  |  | ||||||
| {  |  | ||||||
| 	Include->Color - Provides types relating to color/graphics. |  | ||||||
| 	 |  | ||||||
| 	@author(Kieron Morris <kjm@kieronmorris.me>) |  | ||||||
| } |  | ||||||
| unit color; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| type |  | ||||||
|     TRGB32 = bitpacked record |  | ||||||
|         B : uint8; |  | ||||||
|         G : uint8; |  | ||||||
|         R : uint8; |  | ||||||
|         A : uint8; |  | ||||||
|     end; |  | ||||||
|     PRGB32 = ^TRGB32; |  | ||||||
|  |  | ||||||
|     TRGB24 = bitpacked record |  | ||||||
|         B : uint8; |  | ||||||
|         G : uint8; |  | ||||||
|         R : uint8; |  | ||||||
|     end; |  | ||||||
|     PRGB23 = ^TRGB24; |  | ||||||
|  |  | ||||||
|     TRGB16 = bitpacked record |  | ||||||
|         B : UBit5; |  | ||||||
|         G : UBit6; |  | ||||||
|         R : UBit5; |  | ||||||
|     end; |  | ||||||
|     PRGB16 = ^TRGB16; |  | ||||||
|  |  | ||||||
|     TRGB8 = bitpacked record |  | ||||||
|         B : UBit2; |  | ||||||
|         G : UBit4; |  | ||||||
|         R : UBit2; |  | ||||||
|     end; |  | ||||||
|     PRGB8 = ^TRGB8; |  | ||||||
|  |  | ||||||
| const |  | ||||||
|     black : TRGB32 = (B: 000; G: 000; R: 000; A: 000); |  | ||||||
|     white : TRGB32 = (B: 255; G: 255; R: 255; A: 000); |  | ||||||
|     red   : TRGB32 = (B: 000; G: 000; R: 255; A: 000); |  | ||||||
|     green : TRGB32 = (B: 000; G: 255; R: 000; A: 000); |  | ||||||
|     blue  : TRGB32 = (B: 255; G: 000; R: 000; A: 000); |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -1,67 +0,0 @@ | |||||||
| unit targa; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     lmemorymanager, texture; |  | ||||||
|  |  | ||||||
| type |  | ||||||
|     TTARGAColor = packed record |  | ||||||
|       b, g, r, a: uint8; |  | ||||||
|     end; |  | ||||||
|     PTARGAColor = ^TTARGAColor; |  | ||||||
|  |  | ||||||
|     TTARGAHeader = packed record |  | ||||||
|         Magic: uint8; |  | ||||||
|         ColorMapType: uint8; |  | ||||||
|         ImageType: uint8; |  | ||||||
|         ColorMapOrigin: uint16; |  | ||||||
|         ColorMapLength: uint16; |  | ||||||
|         ColorMapDepth: uint8; |  | ||||||
|         XOrigin: uint16; |  | ||||||
|         YOrigin: uint16; |  | ||||||
|         Width: uint16; |  | ||||||
|         Height: uint16; |  | ||||||
|         PixelDepth: uint8; |  | ||||||
|         ImageDescriptor: uint8; |  | ||||||
|         Data : PTARGAColor; |  | ||||||
|     end; |  | ||||||
|     PTARGAHeader = ^TTARGAHeader; |  | ||||||
|  |  | ||||||
| Function Parse(buffer : puint8; len : uint32) : PTexture; |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| Function Parse(buffer : puint8; len : uint32) : PTexture; |  | ||||||
| var |  | ||||||
|     header : PTARGAHeader; |  | ||||||
|     i, j : uint32; |  | ||||||
|     data : PTARGAColor; |  | ||||||
|     tex : PTexture; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     if (len < sizeof(TTARGAHeader)) then exit; |  | ||||||
|  |  | ||||||
|     header := PTARGAHeader(buffer); |  | ||||||
|     if (header^.Magic <> $0) or (header^.ImageType <> 2) or (header^.PixelDepth <> 32) then exit; |  | ||||||
|      |  | ||||||
|     //Create a new texture |  | ||||||
|     tex:= texture.newTexture(header^.Width, header^.Height); |  | ||||||
|     tex^.Width:= header^.Width; |  | ||||||
|     tex^.Height:= header^.Height; |  | ||||||
|      |  | ||||||
|     //Copy the data |  | ||||||
|     data := PTARGAColor(header^.Data); |  | ||||||
|     for i := 0 to header^.Height - 1 do begin |  | ||||||
|         for j := 0 to header^.Width - 1 do begin |  | ||||||
|             tex^.Pixels[i * header^.Width + j].r := data^.r; |  | ||||||
|             tex^.Pixels[i * header^.Width + j].g := data^.g; |  | ||||||
|             tex^.Pixels[i * header^.Width + j].b := data^.b; |  | ||||||
|             tex^.Pixels[i * header^.Width + j].a := data^.a; |  | ||||||
|         end; |  | ||||||
|     end; |  | ||||||
|  |  | ||||||
|     Parse := tex; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -1,34 +0,0 @@ | |||||||
| unit texture; |  | ||||||
|  |  | ||||||
| interface |  | ||||||
|  |  | ||||||
| uses |  | ||||||
|     lmemorymanager, color; |  | ||||||
|  |  | ||||||
| type |  | ||||||
|     TTexture = packed record |  | ||||||
|         Width  : uint32;  |  | ||||||
|         Height : uint32;  |  | ||||||
|         Size   : uint32; |  | ||||||
|         Pixels : PRGB32; |  | ||||||
|     end; |  | ||||||
|     PTexture = ^TTexture; |  | ||||||
|  |  | ||||||
| Function newTexture(width, height: uint32): PTexture; |  | ||||||
|  |  | ||||||
| implementation |  | ||||||
|  |  | ||||||
| Function newTexture(width, height: uint32): PTexture; |  | ||||||
| var |  | ||||||
|     texture: PTexture; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     texture:= PTexture(kalloc(sizeof(TTexture))); |  | ||||||
|     texture^.Pixels:= PRGB32(kalloc(width * height * sizeof(TRGB32))); |  | ||||||
|     texture^.Width:= width; |  | ||||||
|     texture^.Height:= height; |  | ||||||
|     texture^.Size:= width * height; |  | ||||||
|     newTexture:= texture; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| end. |  | ||||||
| @@ -49,7 +49,6 @@ procedure io_wait; | |||||||
|  |  | ||||||
| procedure memset(location : uint32; value : uint8; size : uint32); | procedure memset(location : uint32; value : uint8; size : uint32); | ||||||
| procedure memcpy(source : uint32; dest : uint32; size : uint32); | procedure memcpy(source : uint32; dest : uint32; size : uint32); | ||||||
| procedure __SSE_128_memcpy(source : uint32; dest : uint32); |  | ||||||
|  |  | ||||||
| procedure printmemory(source : uint32; length : uint32; col : uint32; delim : PChar; offset_row : boolean); | procedure printmemory(source : uint32; length : uint32; col : uint32; delim : PChar; offset_row : boolean); | ||||||
| procedure printmemoryWND(source : uint32; length : uint32; col : uint32; delim : PChar; offset_row : boolean; WND : HWND); | procedure printmemoryWND(source : uint32; length : uint32; col : uint32; delim : PChar; offset_row : boolean; WND : HWND); | ||||||
| @@ -81,8 +80,6 @@ function RorDWord(AValue : uint32; Dist : uint8) : uint32; | |||||||
|  |  | ||||||
| function MsSinceSystemBoot : uint64; | function MsSinceSystemBoot : uint64; | ||||||
|  |  | ||||||
| function abs(x : sint32) : uint32; |  | ||||||
|  |  | ||||||
| var | var | ||||||
|     endptr : uint32; external name '__end'; |     endptr : uint32; external name '__end'; | ||||||
|     stack  : uint32; external name 'KERNEL_STACK'; |     stack  : uint32; external name 'KERNEL_STACK'; | ||||||
| @@ -92,15 +89,6 @@ implementation | |||||||
| uses | uses | ||||||
|     console, RTC, cpu, serial, strings, isr_types; |     console, RTC, cpu, serial, strings, isr_types; | ||||||
|  |  | ||||||
| function abs(x : sint32) : uint32; |  | ||||||
| var |  | ||||||
|     y : uint32; |  | ||||||
|  |  | ||||||
| begin |  | ||||||
|     y:= x SHR 31; |  | ||||||
|     abs:= (x XOR y) - y; |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function MsSinceSystemBoot : uint64; | function MsSinceSystemBoot : uint64; | ||||||
| begin | begin | ||||||
|     MsSinceSystemBoot:= div6432(getTSC, (CPUID.ClockSpeed.Hz div 1000)); |     MsSinceSystemBoot:= div6432(getTSC, (CPUID.ClockSpeed.Hz div 1000)); | ||||||
| @@ -128,14 +116,6 @@ begin | |||||||
|     div6432:= (r0 SHL 32) OR r4; |     div6432:= (r0 SHL 32) OR r4; | ||||||
| end; | end; | ||||||
|  |  | ||||||
| procedure __SSE_128_memcpy(source : uint32; dest : uint32); assembler; |  | ||||||
| asm |  | ||||||
|     MOV EAX, Source |  | ||||||
|     MOVAPS XMM1, [EAX] |  | ||||||
|     MOV EAX, Dest |  | ||||||
|     MOVAPS [EAX], XMM1 |  | ||||||
| end; |  | ||||||
|  |  | ||||||
| function switchendian16(b : uint16) : uint16; | function switchendian16(b : uint16) : uint16; | ||||||
| begin | begin | ||||||
|     switchendian16:= ((b AND $FF00) SHR 8) OR ((b AND $00FF) SHL 8); |     switchendian16:= ((b AND $FF00) SHR 8) OR ((b AND $00FF) SHL 8); | ||||||
|   | |||||||
| @@ -54,8 +54,7 @@ uses | |||||||
|      base64, |      base64, | ||||||
|      rand, |      rand, | ||||||
|      terminal, |      terminal, | ||||||
|      hashmap, vfs,  |      hashmap, vfs; | ||||||
|      video, vesa, doublebuffer, color; |  | ||||||
|   |   | ||||||
| procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall; | procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall; | ||||||
|   |   | ||||||
| @@ -125,11 +124,6 @@ var | |||||||
|  |  | ||||||
|    HM              : PHashMap; |    HM              : PHashMap; | ||||||
|     |     | ||||||
|    colour          : TRGB32; |  | ||||||
|  |  | ||||||
|    array1          : Array[0..255] of char; |  | ||||||
|    array2          : Array[0..255] of char; |  | ||||||
|     |  | ||||||
| begin | begin | ||||||
|      { Init the base system unit } |      { Init the base system unit } | ||||||
|      System.init(); |      System.init(); | ||||||
| @@ -141,8 +135,6 @@ begin | |||||||
|      multibootinfo:= mbinfo; |      multibootinfo:= mbinfo; | ||||||
|      multibootmagic:= mbmagic; |      multibootmagic:= mbmagic; | ||||||
|  |  | ||||||
|     //video.init(); |  | ||||||
|  |  | ||||||
|      { Ensure tracer is frozen } |      { Ensure tracer is frozen } | ||||||
|      tracer.freeze(); |      tracer.freeze(); | ||||||
|  |  | ||||||
| @@ -209,53 +201,6 @@ begin | |||||||
|      { Call Tracer } |      { Call Tracer } | ||||||
|      tracer.init(); |      tracer.init(); | ||||||
|  |  | ||||||
|      video.init(); |  | ||||||
|      vesa.init(@video.register); |  | ||||||
|      doublebuffer.init(@video.register); |  | ||||||
|      video.enable('VESA'); |  | ||||||
|      video.enable('BASIC_DOUBLE_BUFFER'); |  | ||||||
|      colour:= color.white; |  | ||||||
|  |  | ||||||
|     //  serial.sendHex(uint32(@array1[8])); |  | ||||||
|     //  serial.sendHex(uint32(@array2[8])); |  | ||||||
|     //  for i:=8 to 23 do begin |  | ||||||
|     //     array2[i]:= '?'; |  | ||||||
|     //  end; |  | ||||||
|     //  array2[24]:= #0; |  | ||||||
|  |  | ||||||
|     //  array1[8]:= 'H'; |  | ||||||
|     //  array1[9]:= 'e'; |  | ||||||
|     //  array1[10]:= 'l'; |  | ||||||
|     //  array1[11]:= 'l'; |  | ||||||
|     //  array1[12]:= 'o'; |  | ||||||
|     //  array1[13]:= 'w'; |  | ||||||
|     //  array1[14]:= 'o'; |  | ||||||
|     //  array1[15]:= 'r'; |  | ||||||
|     //  array1[16]:= 'l'; |  | ||||||
|     //  array1[17]:= 'd'; |  | ||||||
|     //  array1[18]:= '1'; |  | ||||||
|     //  array1[19]:= '2'; |  | ||||||
|     //  array1[20]:= '3'; |  | ||||||
|     //  array1[21]:= '4'; |  | ||||||
|     //  array1[22]:= '5'; |  | ||||||
|     //  array1[23]:= '!'; |  | ||||||
|     //  __SSE_128_memcpy(uint32(@array1[8]), uint32(@array2[8])); |  | ||||||
|     //  serial.sendString(pchar(@array2[8])); |  | ||||||
|  |  | ||||||
|      for i:=0 to video.frontBufferWidth-1 do begin |  | ||||||
|         for z:=0 to video.frontBufferHeight-1 do begin |  | ||||||
|             video.DrawPixel(i, z, colour); |  | ||||||
|         end; |  | ||||||
|      end; |  | ||||||
|  |  | ||||||
|      video.DrawLine(50,50,100,100,1,color.black); |  | ||||||
|      video.DrawRect(50,150,100,200,1,color.black); |  | ||||||
|      video.FillRect(50,250,100,300,1,color.black,color.red); |  | ||||||
|      video.DrawLine(50,350,100,350,1,color.black); |  | ||||||
|      video.Flush(); |  | ||||||
|  |  | ||||||
|      while true do begin end; |  | ||||||
|  |  | ||||||
|      { VFS Init } |      { VFS Init } | ||||||
|      vfs.init(); |      vfs.init(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -77,9 +77,9 @@ dd 0 | |||||||
| dd 0 | dd 0 | ||||||
| dd 0 | dd 0 | ||||||
| dd 0 | dd 0 | ||||||
| dd 1600 | dd 1280 | ||||||
| dd 1200 | dd 1024 | ||||||
| dd 32 | dd 16 | ||||||
|  |  | ||||||
| ; | ; | ||||||
| ; Entrypoint | ; Entrypoint | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user