From 77aa05a06cced4989b160b01c44432e702bd4286 Mon Sep 17 00:00:00 2001 From: Alec Obradovich Date: Sat, 24 Jan 2015 15:32:06 -0600 Subject: [PATCH] lcd things why did we stop making 6 bit byte computers --- img/pixel.png | Bin 186 -> 525 bytes js/Byte.ts | 2 +- js/LCD.js | 112 ++++++++++++++++++++++++++++++++++++++++++++- js/LCD.js.map | 2 +- js/LCD.ts | 122 ++++++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 231 insertions(+), 7 deletions(-) diff --git a/img/pixel.png b/img/pixel.png index d5dbda1a3d3a5dfc848aa56c74b121daf28a936c..6f73e1581b883fb04c4d5cd27e6ccd174e3fdbe0 100644 GIT binary patch delta 449 zcmV;y0Y3h^0gVJ9iBL{Q4GJ0x0000DNk~Le0000k000062m$~A05c>zJCPw+e*u0; zL_t(IPtDLtPr_gj24Mb@aRJ0u+DcnW7bq=d-<2YpfEF!UR7eGZ01=TyqaHk%@FyLG zi)St*lgS*u%sk&~nSb5CeVgm|(Q9-1(K09J{aM54mfFKJt#zz-@+B=^(^J`EAYTnf zGeS}o{UJISXBn?kkdJW6PO=C_f7(dKVR`y6VAuNnan=CM{jg$A>Uvu>y2YxV0*zV? zm9!WLK%*p>Xolxy!XKhY_5d^pzJpUX1lz_)>nfG;+x7G3ZEva#=lb2CVvg%q?L4fj zHPhPd$!R@OX(TcQIadiq(tI)}N?|&fU|A9KDJ~b|a0`bhz6)O@=zW?)f1y|r_xPM% z`H1u5K855YLJX4Z-wXm?B9@e89{*D5zg&W*GphBb7dH=uyFvNf$X>P8-*}tpXy delta 107 zcmeBW*~O^X8Q|y6%O%Cdz`(%k>ERLtq?v%2jRQocx!y>fs2JhMpzZ167$Om#{9=Br zZEBsZ^Ytx73f%|KoxF1L?xcg4&Iz1Inz4NsbH{-zulN{3j|;51d#cC@sGq^p)z4*} HQ$iB}Z963& diff --git a/js/Byte.ts b/js/Byte.ts index a672a2e..61a155c 100644 --- a/js/Byte.ts +++ b/js/Byte.ts @@ -67,7 +67,7 @@ class Byte { this.Set(val ? (this.value | Math.pow(2, pos)) : (this.value & ~Math.pow(2, pos))); } - public Test(pos: number) { + public Test(pos: number): boolean { pos = pos % 8; return (this.value & Math.pow(2, pos)) != 0; } diff --git a/js/LCD.js b/js/LCD.js index 75f0f53..e383668 100644 --- a/js/LCD.js +++ b/js/LCD.js @@ -1,3 +1,11 @@ +/// +var Direction; +(function (Direction) { + Direction[Direction["UP"] = 0] = "UP"; + Direction[Direction["RIGHT"] = 1] = "RIGHT"; + Direction[Direction["DOWN"] = 2] = "DOWN"; + Direction[Direction["LEFT"] = 3] = "LEFT"; +})(Direction || (Direction = {})); var LCD = (function () { function LCD() { } @@ -5,10 +13,110 @@ var LCD = (function () { LCD.screen = document.getElementById("lcd"); for (var y = 0; y < 64; y++) { var row = LCD.screen.insertRow(0); - for (var x = 0; x < 96; x++) - row.insertCell(0).innerHTML = ""; + for (var x = 0; x < 120; x++) { + var cell = row.insertCell(x); + cell.style.backgroundPosition = "-" + (LCD.contrast * 2) + "px 0px"; + if (x == 95) + cell.style.borderRight = "4px solid white"; + } + LCD.vram[y] = []; + for (var x = 0; x < 15; x++) + LCD.vram[y][x] = new Byte(0); } }; + LCD.GetCell = function (x, y) { + return LCD.screen.rows[y % 64].cells[x % 120]; + }; + LCD.SetCellX = function (cell, x) { + cell.style.backgroundPosition = -x + "px " + cell.style.backgroundPosition.split(" ")[1]; + }; + LCD.SetCellY = function (cell, y) { + cell.style.backgroundPosition = cell.style.backgroundPosition.split(" ")[0] + " " + -y + "px"; + }; + LCD.SetPixel = function (x, y, value) { + if (value === void 0) { value = true; } + LCD.SetCellY(LCD.GetCell(x, y), value ? 2 : 0); + }; + LCD.IncrementCursor = function () { + switch (LCD.inc) { + case 0 /* UP */: + LCD.cursor[0] = (LCD.cursor[0] - 1) % 64; + break; + case 2 /* DOWN */: + LCD.cursor[0] = (LCD.cursor[0] + 1) % 64; + break; + case 1 /* RIGHT */: + LCD.cursor[1] = (LCD.cursor[1] + 1) % (LCD.mode ? 15 : 20); + break; + case 3 /* LEFT */: + LCD.cursor[1] = (LCD.cursor[1] - 1) % (LCD.mode ? 15 : 20); + break; + } + }; + LCD.SetContrast = function (value) { + LCD.contrast = Math.floor((value % 64) * (23 / 64)); + for (var y = 0; y < 64; y++) { + for (var x = 0; x < 120; x++) + LCD.SetCellX(LCD.GetCell(x, y), LCD.contrast * 2); + } + }; + LCD.Disable = function () { + LCD.enabled = false; + for (var y = 0; y < 64; y++) { + for (var x = 0; x < 120; x++) + LCD.SetCellY(LCD.GetCell(x, y), 4); + } + }; + LCD.Enable = function () { + LCD.enabled = true; + for (var y = 0; y < 64; y++) { + for (var x = 0; x < 15; x++) { + for (var bit = 0; bit < 8; bit++) + LCD.SetPixel(x * 8 + (bit), y, LCD.vram[y][x].Test(7 - bit)); + } + } + }; + LCD.Read = function () { + var value; + if (LCD.mode) + value = LCD.vram[LCD.cursor[0]][LCD.cursor[1]]; + else { + value = new Byte(0); + for (var bit = 0; bit < 6; bit++) + value.Bit(5 - bit, LCD.vram[LCD.cursor[0]][Math.floor((6 * LCD.cursor[1] + bit) / 8)].Test(7 - ((6 * LCD.cursor[1] + bit) % 8))); + } + LCD.IncrementCursor(); + return value; + }; + LCD.Write = function (value) { + if (LCD.mode) { + LCD.vram[LCD.cursor[0]][LCD.cursor[1]] = value; + for (var bit = 0; bit < 8; bit++) + LCD.SetPixel(8 * LCD.cursor[1] + bit, LCD.cursor[0], value.Test(7 - bit)); + } + else { + for (var bit = 0; bit < 6; bit++) { + console.log(value.Test(bit)); + LCD.SetPixel(6 * LCD.cursor[1] + bit, LCD.cursor[0], value.Test(5 - bit)); + LCD.vram[LCD.cursor[0]][Math.floor((6 * LCD.cursor[1] + bit) / 8)].Bit(7 - ((6 * LCD.cursor[1] + bit) % 8), value.Test(5 - bit)); + } + } + LCD.IncrementCursor(); + }; + LCD.SetRow = function (row) { + LCD.cursor[0] = row % 64; + }; + LCD.SetColumn = function (col) { + LCD.cursor[1] = col % (LCD.mode ? 15 : 20); + }; + LCD.SetMode = function () { + }; + LCD.contrast = 12; + LCD.vram = []; + LCD.cursor = [0, 0]; // row ; column + LCD.mode = true; // false: 6 bit ; true: 8 bit + LCD.inc = 2 /* DOWN */; + LCD.enabled = true; return LCD; })(); //# sourceMappingURL=LCD.js.map \ No newline at end of file diff --git a/js/LCD.js.map b/js/LCD.js.map index 49e99b5..058d8c1 100644 --- a/js/LCD.js.map +++ b/js/LCD.js.map @@ -1 +1 @@ -{"version":3,"file":"LCD.js","sourceRoot":"","sources":["LCD.ts"],"names":["LCD","LCD.constructor","LCD.Init"],"mappings":"AAAA,IAAM,GAAG;IAATA,SAAMA,GAAGA;IAYTC,CAACA;IARUD,QAAIA,GAAXA;QACIE,GAAGA,CAACA,MAAMA,GAAqBA,QAAQA,CAACA,cAAcA,CAACA,KAAKA,CAACA,CAACA;QAC9DA,GAAGA,CAAAA,CAACA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,EAAEA,EAAEA,CAACA,EAAEA,EAAEA,CAACA;YACzBA,IAAIA,GAAGA,GAAwBA,GAAGA,CAACA,MAAMA,CAACA,SAASA,CAACA,CAACA,CAACA,CAACA;YACvDA,GAAGA,CAAAA,CAACA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,EAAEA,EAAEA,CAACA,EAAEA;gBACtBA,GAAGA,CAACA,UAAUA,CAACA,CAACA,CAACA,CAACA,SAASA,GAAGA,EAAEA,CAACA;QACzCA,CAACA;IACLA,CAACA;IACLF,UAACA;AAADA,CAACA,AAZD,IAYC"} \ No newline at end of file +{"version":3,"file":"LCD.js","sourceRoot":"","sources":["LCD.ts"],"names":["Direction","LCD","LCD.constructor","LCD.Init","LCD.GetCell","LCD.SetCellX","LCD.SetCellY","LCD.SetPixel","LCD.IncrementCursor","LCD.SetContrast","LCD.Disable","LCD.Enable","LCD.Read","LCD.Write","LCD.SetRow","LCD.SetColumn","LCD.SetMode"],"mappings":"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"} \ No newline at end of file diff --git a/js/LCD.ts b/js/LCD.ts index 7b08aa6..66e879d 100644 --- a/js/LCD.ts +++ b/js/LCD.ts @@ -1,13 +1,129 @@ +/// + +enum Direction { UP, RIGHT, DOWN, LEFT } + class LCD { private static screen: HTMLTableElement; - + private static contrast: number = 12; + private static vram: Byte[][] = []; + private static cursor: number[] = [0,0]; // row ; column + private static mode: boolean = true; // false: 6 bit ; true: 8 bit + private static inc: Direction = Direction.DOWN; + private static enabled: boolean = true; static Init() { LCD.screen = document.getElementById("lcd"); for(var y = 0; y < 64; y++) { var row = LCD.screen.insertRow(0); - for(var x = 0; x < 96; x++) - row.insertCell(0).innerHTML = ""; + for(var x = 0; x < 120; x++) { + var cell = row.insertCell(x); + cell.style.backgroundPosition = "-"+ (LCD.contrast * 2) +"px 0px"; + if(x == 95) cell.style.borderRight = "4px solid white"; + } + + LCD.vram[y] = []; + for(var x = 0; x < 15; x++) + LCD.vram[y][x] = new Byte(0); } } + + private static GetCell(x: number, y: number): HTMLTableCellElement { + return (LCD.screen.rows[y % 64]).cells[x % 120]; + } + + private static SetCellX(cell: HTMLTableCellElement, x: number) { + cell.style.backgroundPosition = -x +"px "+ cell.style.backgroundPosition.split(" ")[1]; + } + + private static SetCellY(cell: HTMLTableCellElement, y: number) { + cell.style.backgroundPosition = cell.style.backgroundPosition.split(" ")[0] +" "+ -y +"px"; + } + + private static SetPixel(x: number, y: number, value: boolean = true) { + LCD.SetCellY(LCD.GetCell(x, y), value ? 2 : 0); + } + + private static IncrementCursor() { + switch(LCD.inc) { + case Direction.UP: + LCD.cursor[0] = (LCD.cursor[0] - 1) % 64; + break; + case Direction.DOWN: + LCD.cursor[0] = (LCD.cursor[0] + 1) % 64; + break; + case Direction.RIGHT: + LCD.cursor[1] = (LCD.cursor[1] + 1) % (LCD.mode ? 15 : 20); + break; + case Direction.LEFT: + LCD.cursor[1] = (LCD.cursor[1] - 1) % (LCD.mode ? 15 : 20); + break; + } + } + + public static SetContrast(value: number) { + LCD.contrast = Math.floor((value % 64) * (23/64)); + for(var y = 0; y < 64; y++) { + for(var x = 0; x < 120; x++) + LCD.SetCellX(LCD.GetCell(x, y), LCD.contrast * 2); + } + } + + public static Disable() { + LCD.enabled = false; + + for(var y = 0; y < 64; y++) { + for(var x = 0; x < 120; x++) + LCD.SetCellY(LCD.GetCell(x, y), 4); + } + } + + public static Enable() { + LCD.enabled = true; + + for(var y = 0; y < 64; y++) { + for(var x = 0; x < 15; x++) { + for(var bit = 0; bit < 8; bit++) + LCD.SetPixel(x*8 + (bit), y, LCD.vram[y][x].Test(7-bit)); + } + } + } + + public static Read(): Byte { + var value; + if(LCD.mode) value = LCD.vram[LCD.cursor[0]][LCD.cursor[1]]; + else { + value = new Byte(0); + for(var bit = 0; bit < 6; bit++) + value.Bit(5-bit, LCD.vram[LCD.cursor[0]][Math.floor((6 * LCD.cursor[1] + bit) / 8)].Test(7 - ((6 * LCD.cursor[1] + bit) % 8))); + } + LCD.IncrementCursor(); + return value; + } + + public static Write(value: Byte) { + if(LCD.mode) { + LCD.vram[LCD.cursor[0]][LCD.cursor[1]] = value; + for(var bit = 0; bit < 8; bit++) + LCD.SetPixel(8 * LCD.cursor[1] + bit, LCD.cursor[0], value.Test(7 - bit)); + } else { + for(var bit = 0; bit < 6; bit++) { + console.log(value.Test(bit)); + LCD.SetPixel(6 * LCD.cursor[1] + bit, LCD.cursor[0], value.Test(5 - bit)); + LCD.vram[LCD.cursor[0]][Math.floor((6*LCD.cursor[1]+bit)/8)].Bit(7-((6*LCD.cursor[1]+bit)%8), value.Test(5-bit)); + } + } + LCD.IncrementCursor(); + } + + public static SetRow(row: number) { + LCD.cursor[0] = row % 64; + } + + public static SetColumn(col: number) { + LCD.cursor[1] = col % (LCD.mode ? 15 : 20); + } + + public static SetMode() { + + } } \ No newline at end of file