From: Justin Wind Date: Sat, 12 May 2012 22:10:02 +0000 (-0700) Subject: added doc files, test for display X-Git-Url: https://git.squeep.com/?a=commitdiff_plain;h=19bb0a4e64c9ab3e62ff4bbd959289704ee5b8f1;p=dcpu16 added doc files, test for display --- diff --git a/docs/clock.txt b/docs/clock.txt new file mode 100644 index 0000000..71bbc8b --- /dev/null +++ b/docs/clock.txt @@ -0,0 +1,17 @@ +Name: Generic Clock (compatible) +ID: 0x12d0b402 +Version: 1 + +Interrupts do different things depending on contents of the A register: + + A | BEHAVIOR +---+---------------------------------------------------------------------------- + 0 | The B register is read, and the clock will tick 60/B times per second. + | If B is 0, the clock is turned off. + 1 | Store number of ticks elapsed since last call to 0 in C register + 2 | If register B is non-zero, turn on interrupts with message B. If B is zero, + | disable interrupts +---+---------------------------------------------------------------------------- + +When interrupts are enabled, the clock will trigger an interrupt whenever it +ticks. diff --git a/docs/keyboard.txt b/docs/keyboard.txt new file mode 100644 index 0000000..afa4482 --- /dev/null +++ b/docs/keyboard.txt @@ -0,0 +1,31 @@ +Name: Generic Keyboard (compatible) +ID: 0x30cf7406 +Version: 1 + +Interrupts do different things depending on contents of the A register: + + A | BEHAVIOR +---+---------------------------------------------------------------------------- + 0 | Clear keyboard buffer + 1 | Store next key typed in C register, or 0 if the buffer is empty + 2 | Set C register to 1 if the key specified by the B register is pressed, or + | 0 if it's not pressed + 3 | If register B is non-zero, turn on interrupts with message B. If B is zero, + | disable interrupts +---+---------------------------------------------------------------------------- + +When interrupts are enabled, the keyboard will trigger an interrupt when one or +more keys have been pressed, released, or typed. + +Key numbers are: + 0x10: Backspace + 0x11: Return + 0x12: Insert + 0x13: Delete + 0x20-0x7f: ASCII characters + 0x80: Arrow up + 0x81: Arrow down + 0x82: Arrow left + 0x83: Arrow right + 0x90: Shift + 0x91: Control diff --git a/docs/lem1802.txt b/docs/lem1802.txt new file mode 100644 index 0000000..4db2f42 --- /dev/null +++ b/docs/lem1802.txt @@ -0,0 +1,106 @@ +NE_LEM1802 v1.0 + + \ | ___ + |\ \| ___ + | \ + + NYA ELEKTRISKA + innovation information + + + + +DCPU-16 Hardware Info: + Name: LEM1802 - Low Energy Monitor + ID: 0x7349f615, version: 0x1802 + Manufacturer: 0x1c6c8b36 (NYA_ELEKTRISKA) + + +Description: + The LEM1802 is a 128x96 pixel color display compatible with the DCPU-16. + The display is made up of 32x12 16 bit cells. Each cell displays one + monochrome 4x8 pixel character out of 128 available. Each cell has its own + foreground and background color out of a palette of 16 colors. + + The LEM1802 is fully backwards compatible with LEM1801 (0x7349f615/0x1801), + and adds support for custom palettes and fixes the double buffer color + bleed bug. + + +Interrupt behavior: + When a HWI is received by the LEM1802, it reads the A register and does one + of the following actions: + + 0: MEM_MAP_SCREEN + Reads the B register, and maps the video ram to DCPU-16 ram starting + at address B. See below for a description of video ram. + If B is 0, the screen is disconnected. + When the screen goes from 0 to any other value, the the LEM1802 takes + about one second to start up. Other interrupts sent during this time + are still processed. + 1: MEM_MAP_FONT + Reads the B register, and maps the font ram to DCPU-16 ram starting + at address B. See below for a description of font ram. + If B is 0, the default font is used instead. + 2: MEM_MAP_PALETTE + Reads the B register, and maps the palette ram to DCPU-16 ram starting + at address B. See below for a description of palette ram. + If B is 0, the default palette is used instead. + 3: SET_BORDER_COLOR + Reads the B register, and sets the border color to palette index B&0xF + 4: MEM_DUMP_FONT + Reads the B register, and writes the default font data to DCPU-16 ram + starting at address B. + Halts the DCPU-16 for 256 cycles + 5: MEM_DUMP_PALETTE + Reads the B register, and writes the default palette data to DCPU-16 + ram starting at address B. + Halts the DCPU-16 for 16 cycles + + +Video ram: + The LEM1802 has no internal video ram, but rather relies on being assigned + an area of the DCPU-16 ram. The size of this area is 386 words, and is + made up of 32x12 cells of the following bit format (in LSB-0): + ffffbbbbBccccccc + The lowest 7 bits (ccccccc) select define character to display. + ffff and bbbb select which foreground and background color to use. + If B (bit 7) is set the character color will blink slowly. + + +Font ram: + The LEM1802 has a default built in font. If the user chooses, they may + supply their own font by mapping a 256 word memory region with two words + per character in the 128 character font. + By setting bits in these words, different characters and graphics can be + achieved. For example, the character F looks like this: + word0 = 1111111100001001 + word1 = 0000100100000000 + Or, split into octets: + word0 = 11111111 / + 00001001 + word1 = 00001001 / + 00000000 + + +Palette ram: + The LEM1802 has a default built in palette. If the user chooses, they may + supply their own palette by mapping a 16 word memory region with one word + per palette entry in the 16 color palette. + Each color entry has the following bit format (in LSB-0): + 0000rrrrggggbbbb + Where r, g, b are the red, green and blue channels. A higher value means a + lighter color. + + +A message from Ola: + Hello! + + It is fun to see that so many people use our products. When I was a small + boy, my dad used to tell me "Ola, take care of those who understand less + than you. Lack of knowledge is dangerous, but too much is worse". + Here at Nya Elektriska have we always tried to improve mankind by showing + them the tools required to improve and reach their true potential. + Together, you will wake up in time. + + - Ola Kristian Carlsson \ No newline at end of file diff --git a/docs/spc2000.txt b/docs/spc2000.txt new file mode 100644 index 0000000..94cf610 --- /dev/null +++ b/docs/spc2000.txt @@ -0,0 +1,84 @@ +NE_SPC2000 v1.1 + + \ | ___ + |\ \| ___ + | \ + + NYA ELEKTRISKA + innovation information + + +DCPU-16 Hardware Info: + Name: SPC2000 - Suspension Chamber 2000 + ID: 0x40e41d9d, version: 0x005e + Manufacturer: 0x1c6c8b36 (NYA_ELEKTRISKA) + + +======================= WARNING WARNING WARNING WARNING ======================== + FERMIONS NEAR THE ACTIVATION RADIUS ARE CATASTROPHICALLY DESTROYED. DO NOT + USE NEAR EARTH OR MARS OR ANY OTHER FUTURE EARTH COLONIES. DO NOT TAMPER + WITH THE VACUUM DETECTOR. DO NOT USE IN AN UNEVEN GRAVITATIONAL FIELD. DO + NOT USE WHEN ROTATING. DO NOT USE WHEN ACCELERATING. ABSOLUTELY NO WARRANTY + IS PROVIDED, USE AT YOUR OWN RISK. + THE ZEF882 INCLUDED IN THIS SUSPENSION CHAMBER IS ILLEGAL IN ALL COUNTRIES. +======================= WARNING WARNING WARNING WARNING ======================== + +Description: + The SPC2000 is a deep sleep cell based on the ZEF882 time dilation field + generator (available from Polytron Corporation Incorporated). + It provides safe and nearly instantaneous time passage, making long journeys + in space much easier on the passengers, and allowing cargo to reach its + destination with minimal aging occurring. + Due to the nature of the ZEF882, it affects the entire vessel (50 meter + radius, and will only engage in a near vacuum. Once the SPC2000 is active, + the vessel will be almost nowhere to an external observer, and detection of + the vessel is beyond unlikely. + Because of the strong extra-dimensional acceleration and non-linear temporal + distortion that occurs, it's highly recommended that passengers are strapped + in and asleep when triggering the SCP2000. + + +Improvements: + * Added the ability to set the unit to skip to something other than the + default setting of milliseconds. + + +Interrupt behavior: + When a HWI is received by the SPC2000, it reads the A register and does one + of the following actions: + + 0: GET_STATUS + Sets the C register to 1 if the SPC2000 is ready to trigger. If it's not, + the B register is set to one of the following values: + 0x0000: ######################## - EVACUATE VESSEL IMMEDIATELY + 0x0001: Not in a vacuum + 0x0002: Not enough fuel + 0x0003: Gravitational forces too uneven + 0x0004: Too much angular momentum + 0x0005: One or more cell doors are open + 0x0006: Mechanical error + 0xffff: Unknown error - EVACUATE VESSEL IMMEDIATELY + 1: SET_UNIT_TO_SKIP + Reads the B register, and reads a 64 bit number from memory address B + in big endian, and sets the number of units to skip to that number. + 2: TRIGGER_DEVICE + Performs GET_STATUS, and if C is 0, triggers the SCP2000. The status can + be read as the result of the GET_STATUS call. + 3: SET_SKIP_UNIT + Reads the B register, and sets the size of the unit to skip to one of: + 0x0000: Milliseconds + 0x0001: Minutes + 0x0002: Days + 0x0003: Years + + +A message from Ola: + Good morning, + + Thanks for purchasing this piece of hardware! I hope it will enlighten you + and give you new hope in life. As this suspension chamber basically works as + a one way time machine, I suppose I should wish you a pleasant journey, and + ask of you to enjoy the future. It is yours now. All of it. + + - Ola Kristian Carlsson + \ No newline at end of file diff --git a/hw_spc2000.c b/hw_spc2000.c new file mode 100644 index 0000000..2fa0c7b --- /dev/null +++ b/hw_spc2000.c @@ -0,0 +1,80 @@ +#include +#include +#include + +#include "dcpu16.h" +#include "hw_spc2000.h" + +static dcpu16_hw_signal_t spc2000_reset_; +static dcpu16_hw_signal_t spc2000_cycle_; +static dcpu16_hw_signal_t spc2000_hwi_; +static struct dcpu16_hw hw_ = { + .name_ = "SPC2000 - Suspension Chamber 2000", + .id_l = 0x1d9d, + .id_h = 0x40e4, + .ver = 0x005e, + .mfg_l = 0x8b36, + .mfg_h = 0x1c6c, + .hwi = spc2000_hwi_, + .cycle = spc2000_cycle_, + .reset = spc2000_reset_, + .data = (struct spc2000_ *)NULL +}; + +struct spc2000_ { + DCPU16_WORD skip_unit; + long long skip; +}; + +static +void spc2000_reset_(struct dcpu16 *vm, void *data) { + struct spc2000_ *spc2000 = (struct spc2000_ *)data; + + (void)vm; + + memset(spc2000, 0, sizeof *spc2000); +} + +static +void spc2000_cycle_(struct dcpu16 *vm, void *data) { + struct spc2000_ *spc2000 = (struct spc2000_ *)data; + + (void)vm; + (void)spc2000; +} + +static +void spc2000_hwi_(struct dcpu16 *vm, void *data) { + struct spc2000_ *spc2000 = (struct spc2000_ *)data; + DCPU16_WORD reg_a = vm->reg[DCPU16_REG_A], + reg_b = vm->reg[DCPU16_REG_B]; + long long x; + + switch (reg_a) { + case 0: /* GET_STATUS */ + case 2: /* TRIGGER_DEVICE */ + /* check status */ + vm->reg[DCPU16_REG_C] = 0; + vm->reg[DCPU16_REG_B] = 0; + if (reg_a == 0 + || vm->reg[DCPU16_REG_C] != 0) + break; + /* trigger */ + vm->warn_cb_("spc2000 triggered\n"); + break; + + case 1: /* SET_UNIT_TO_SKIP */ + spc2000->skip = vm->ram[reg_b]; + x = vm->ram[reg_b + 1]; + spc2000->skip |= x << 16; + x = vm->ram[reg_b + 2]; + spc2000->skip |= x << 32; + x = vm->ram[reg_b + 3]; + spc2000->skip |= x << 48; + break; + + case 3: /* SET_SKIP_UNIT */ + spc2000->skip_unit = reg_b; + break; + } +} diff --git a/hw_spc2000.h b/hw_spc2000.h new file mode 100644 index 0000000..44cc015 --- /dev/null +++ b/hw_spc2000.h @@ -0,0 +1,7 @@ +#ifndef SPC2000_H_IE4EG0MO +#define SPC2000_H_IE4EG0MO + +struct dcpu16_hw *spc2000_new(struct dcpu16 *); +void spc2000_del(struct dcpu16_hw **); + +#endif /* SPC2000_H_IE4EG0MO */ diff --git a/tests/test.bin b/tests/test.bin deleted file mode 100644 index cb007d8..0000000 Binary files a/tests/test.bin and /dev/null differ diff --git a/tests/test_lem1802.dasm b/tests/test_lem1802.dasm new file mode 100644 index 0000000..898808b --- /dev/null +++ b/tests/test_lem1802.dasm @@ -0,0 +1,37 @@ +; bare-bones test to locate, activate, and write to a display + +HWN [num] +:loop + SUB [num], 1 + HWQ [num] + IFE B, 0x7349 + SET PC, found + SET PC, loop + +:found + ; located the first display, power it on + SET B, 0x8000 + SET A, 0 + HWI [num] + + ; set border + SET B, 0x0003 + SET A, 3 + HWI [num] + + ; show some text + SET I, string + SET J, 0x8000 + ; color + SET Z, 0x1e00 +:print + BOR [i], Z + STI [j], [i] + IFN [I], 0 + SET PC, print + +:wait + SET PC, wait + +:num dat 0x0000 +:string dat "yerf!", 0 \ No newline at end of file