diff options
Diffstat (limited to 'src/machine')
| -rw-r--r-- | src/machine/cgascr.rs | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/src/machine/cgascr.rs b/src/machine/cgascr.rs index f67501c..091c50d 100644 --- a/src/machine/cgascr.rs +++ b/src/machine/cgascr.rs @@ -8,29 +8,47 @@ pub struct CGAScreen{ #[allow(dead_code)] impl CGAScreen{ - pub fn new(cows:u32, rows:u32) -> Self { - Self {max_cows: cows, max_rows:rows,} + pub fn new(rows:u32, cols:u32) -> Self { + Self {max_rows:rows, max_cows:cols} + } + + + fn get_index(&self,row:u32, col:u32) -> u32{ + col + row*self.max_cows } - // this function should be the only one that "directly touches" // the memory by address. // and since it's unsafe, it shouldn't be public - // - // fn show(&self, x:u32, y:u32, c:char, attr:u8){ - // - // } + pub fn show(&self, row:u32, col:u32, c:char, attr:u8){ + let index = self.get_index(row, col); + + unsafe{ + *vga_buffer.offset(index as isize * 2) = c as u8; + *vga_buffer.offset(index as isize * 2 + 1) = attr; + } + + } + + pub fn putchar(&self, ch:char){ + + } + + pub fn setpos(){} + pub fn getpos(){} + + + // Sanity Check of the cgascreen pub fn test(&self){ let mut r = 0; let mut c = 0; - + + let mut counter = 0; while r<self.max_rows { while c<self.max_cows { - let index:u32 = r*self.max_cows + c; - unsafe { - *vga_buffer.offset(index as isize * 2) = index as u8; - *vga_buffer.offset(index as isize * 2 + 1) = index as u8; - } + let ch = (counter & 0xff) as u8; + self.show(r,c,ch as char, ch); + counter += 1; c+=1; } r+=1; |
