Difference between revisions of "Project:Infotec displays"
m (removed nortHACKton link (no web.archive.org archive link available - just kill it off)) |
|||
(67 intermediate revisions by 9 users not shown) | |||
Line 1: | Line 1: | ||
− | Donated by Nottinghack, who have a [http://wiki.nottinghack.org.uk/wiki/BigClocks project page] with pictures.Further information [http:// | + | Donated by Nottinghack, who have a [http://wiki.nottinghack.org.uk/wiki/BigClocks project page] with pictures. Further information posted by [http://leedshackspace.org.uk/projects-2/brunell-station-clocks/ Leeds]. |
+ | |||
+ | == Status == | ||
+ | |||
+ | The screen on one side has been damaged and a roughly 10x10 pixel area is dead. | ||
+ | |||
+ | Works fine apart from that. | ||
+ | |||
+ | == Hardware == | ||
+ | |||
+ | [http://www.flickr.com/photos/fishies_go_pook/sets/72157627801508165/with/6258987178/ Photos] by Akki | ||
+ | |||
+ | The serial port is exposed as a header on some master boards, in the comms ribbon cables, and as DE-9 connectors on the case board (where the power is split between the two units). | ||
+ | |||
+ | [[File:Infotec_COM0_pinout.jpg|300px]] [[File:Infotec_COM0_IDC_pinout.jpg|320px]] | ||
+ | |||
+ | The header, with the register pin to the left, left-to-right, top-to-bottom is RX, TX, GND, GND. | ||
+ | |||
+ | == Notes == | ||
+ | |||
+ | Mark has done some work on the dumped rom, including extracting the fonts at Tom's [http://pastebin.com/nUY9CKE2 suggestion]: | ||
+ | |||
+ | A little more on possible protocols here: http://www.infotec.co.uk/index.php?page=communication | ||
+ | |||
+ | https://github.com/marksteward/Infotec/ | ||
+ | |||
+ | The serial port is probably accessible using RS422 via the junction board that distributes power and signal to both clocks in the outer case. It is also available on the clock control board at RS232 levels (the signals are combined using combinational logic, rather than chosen with a switch). This is the small white 3-pin connector between the coin cell and the 2-pin connector for the front panel LED. Pins are ground, txd, rxd, counting from the edge of the motherboard towards the daughterboard. Protocol is 9600 8,n,1 | ||
+ | |||
+ | == Protocols == | ||
+ | The command | ||
+ | |||
+ | >PR#0#00#00,07,08#25,05,2012,2#3D< | ||
+ | |||
+ | sets the time to 00:07:08 (and, presumably, the calendar to 25/5/12 though we don't know how to display that at the moment). The tailing 3D is a checksum - the 2-digit hex representation of the XOR of all the preceding characters, starting with the '>'. | ||
+ | |||
+ | The clock seems to initially set itself up for 19200 baud serial port but later in the initialisation changes it to 9600. | ||
+ | |||
+ | Turning on DIP switch 8 and cycling power puts the clock in a display test mode. | ||
+ | |||
+ | Typing <>< into the clock causes it to sleep for a couple of seconds. | ||
+ | |||
+ | == Numbered commands == | ||
+ | |||
+ | Command messages are in the format: | ||
+ | >inflags#sendresponse#cmdnum#serialtask#inbuf#args,args,...#checksum< | ||
+ | |||
+ | '''<''', '''>''' and '''#''' in inbuf are escaped using '''^''' | ||
+ | |||
+ | All except inbuf are in hex. As a start, try <code>0</code> for inflags, <code>1</code> for sendresponse, <code>0</code> for serialtask, and <code>cc</code> to ignore the checksum | ||
+ | |||
+ | === 0x0 Display text === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! buf | ||
+ | | message | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | | ||
+ | * 0 = left | ||
+ | * 1 = centre | ||
+ | |- | ||
+ | ! arg1 | ||
+ | | time to display for? | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | >0#1#0#00#asd##cc< | ||
+ | >00#40#01##3B< | ||
+ | |||
+ | |||
+ | === 0x1 ? === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! buf | ||
+ | | message | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | Bitfield of 4 flags. | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | Seems to reboot for anything at the moment. There's probably something we need to prepare. | ||
+ | |||
+ | >0#1#1#00#blah#2#cc< | ||
+ | >00#40#01##3B< | ||
+ | |||
+ | === 0x2 Scroll text upwards === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! buf | ||
+ | | message | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | delay in secs | ||
+ | |- | ||
+ | ! arg1 | ||
+ | | | ||
+ | * 0 = don't repeat | ||
+ | * 1 = repeat | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | Text is centred, and wrapped! | ||
+ | |||
+ | >0#1#2#00#hello#2,0#cc< | ||
+ | >00#40#01##3B< | ||
+ | |||
+ | === 0x3 Display wrapped text === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! buf | ||
+ | | message | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | | ||
+ | * 0 = don't centre | ||
+ | * 1 = centre | ||
+ | |- | ||
+ | ! arg1 | ||
+ | | | ||
+ | * ? | ||
+ | * ? | ||
+ | |- | ||
+ | ! arg2 | ||
+ | | delay between pages | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | >0#1#3#00#hello world#1,0,2#cc< | ||
+ | >00#00#01##3F< | ||
+ | |||
+ | |||
+ | === 0x4 Clear screen? === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | | ||
+ | * ? | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | >0#1#4#00##ff#cc< | ||
+ | >00#00#01##3F< | ||
+ | |||
+ | === 0x5 Clear screen? === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | | ||
+ | * ? | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | Also set some serial flag | ||
+ | >0#1#5#00##1#cc< | ||
+ | >00#00#01##3F< | ||
+ | |||
+ | === 0x6 Stop animation === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | | ||
+ | * ? | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | >0#1#6#00##0#cc< | ||
+ | >00#00#01##3F< | ||
+ | |||
+ | === 0x7 Stop animation? === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | | ||
+ | * 0 = ? | ||
+ | * 1 = ? | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | >0#1#7#00##0#cc< | ||
+ | >00#00#01##3F< | ||
+ | |||
+ | === 0x8 Display text ? === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! buf | ||
+ | | message | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | | ||
+ | * 0 = ? | ||
+ | * 1 = ? | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | >0#1#8#00#hello world#0#cc< | ||
+ | >00#00#01##3F< | ||
+ | |||
+ | === 0x9 ? === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! buf | ||
+ | | message | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | | ||
+ | * 0 = ? | ||
+ | * 1 = ? (Seems to turn on the test pattern) | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | >0#1#9#00##0#cc< | ||
+ | >00#00#01##3F< | ||
+ | |||
+ | |||
+ | |||
+ | === 0xa Display by half-screens === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! buf | ||
+ | | message | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | | ||
+ | * 0 = ? | ||
+ | * 1 = ? (might crash it) | ||
+ | |- | ||
+ | ! arg1 | ||
+ | | 0x10-0xbf = clear top half afterwards? wrapping height? | ||
+ | |- | ||
+ | ! arg2 | ||
+ | | 1 = do top half, then bottom half | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | >0#1#a#00#hi there#0,0,0#cc< | ||
+ | >00#00#01##3F< | ||
+ | |||
+ | === 0x8b Set time === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | hours | ||
+ | |- | ||
+ | ! arg1 | ||
+ | | minutes | ||
+ | |- | ||
+ | ! arg2 | ||
+ | | seconds | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | >0#1#8b#00##14,3B,3B#cc< | ||
+ | ? | ||
+ | |||
+ | === 0x8c Set date === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! serialtask | ||
+ | | | ||
+ | * display 0, 1, etc. | ||
+ | * flag 0x80 for all | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | day | ||
+ | |- | ||
+ | ! arg1 | ||
+ | | month | ||
+ | |- | ||
+ | ! arg2 | ||
+ | | year | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! colspan=2 | ? | ||
+ | |} | ||
+ | |||
+ | >0#1#8c#00##1F,0C,0A#cc< | ||
+ | ? | ||
+ | |||
+ | === 0xF0 Get serial task count === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! colspan=2 | ''none'' | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | count | ||
+ | |} | ||
+ | |||
+ | >0#1#F0####cc< | ||
+ | >00#80#01#03#34< | ||
+ | |||
+ | |||
+ | >0#1#F1####cc< | ||
+ | >00#03#00##3D< | ||
+ | |||
+ | >0#1#F2####cc< | ||
+ | >00#80#01#00#37< | ||
+ | |||
+ | === 0xF3 Get time === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! colspan=2 | ''none'' | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | hours | ||
+ | |- | ||
+ | ! arg1 | ||
+ | | minutes | ||
+ | |- | ||
+ | ! arg2 | ||
+ | | seconds | ||
+ | |} | ||
+ | |||
+ | >0#1#F3####cc< | ||
+ | >00#80#01#02,32,29#3F< | ||
+ | |||
+ | === 0xF4 Get date === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! colspan=2 | ''none'' | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | date | ||
+ | |- | ||
+ | ! arg1 | ||
+ | | month | ||
+ | |- | ||
+ | ! arg2 | ||
+ | | year | ||
+ | |} | ||
+ | |||
+ | >0#1#F4####cc< | ||
+ | >00#80#01#1E,05,0A#37< | ||
+ | |||
+ | === 0xF5 Get version === | ||
+ | {| class="wikitable" | ||
+ | ! colspan=2 | Input | ||
+ | |- | ||
+ | ! colspan=2 | ''none'' | ||
+ | |- | ||
+ | ! colspan=2 | Output | ||
+ | |- | ||
+ | ! flags | ||
+ | | ? | ||
+ | |- | ||
+ | ! arg0 | ||
+ | | Major version | ||
+ | |- | ||
+ | ! arg1 | ||
+ | | Minor version | ||
+ | |} | ||
+ | |||
+ | >0#1#F5####cc< | ||
+ | >00#80#01#04,07#18< | ||
== Firmware == | == Firmware == | ||
Line 21: | Line 493: | ||
Disassembly at http://github.com/marksteward/Infotec/. | Disassembly at http://github.com/marksteward/Infotec/. | ||
+ | |||
+ | [[Category:Projects]] | ||
+ | [[Category:Space_Infrastructure_Projects]] |
Latest revision as of 23:37, 13 December 2015
Donated by Nottinghack, who have a project page with pictures. Further information posted by Leeds.
Status
The screen on one side has been damaged and a roughly 10x10 pixel area is dead.
Works fine apart from that.
Hardware
Photos by Akki
The serial port is exposed as a header on some master boards, in the comms ribbon cables, and as DE-9 connectors on the case board (where the power is split between the two units).
The header, with the register pin to the left, left-to-right, top-to-bottom is RX, TX, GND, GND.
Notes
Mark has done some work on the dumped rom, including extracting the fonts at Tom's suggestion:
A little more on possible protocols here: http://www.infotec.co.uk/index.php?page=communication
https://github.com/marksteward/Infotec/
The serial port is probably accessible using RS422 via the junction board that distributes power and signal to both clocks in the outer case. It is also available on the clock control board at RS232 levels (the signals are combined using combinational logic, rather than chosen with a switch). This is the small white 3-pin connector between the coin cell and the 2-pin connector for the front panel LED. Pins are ground, txd, rxd, counting from the edge of the motherboard towards the daughterboard. Protocol is 9600 8,n,1
Protocols
The command
>PR#0#00#00,07,08#25,05,2012,2#3D<
sets the time to 00:07:08 (and, presumably, the calendar to 25/5/12 though we don't know how to display that at the moment). The tailing 3D is a checksum - the 2-digit hex representation of the XOR of all the preceding characters, starting with the '>'.
The clock seems to initially set itself up for 19200 baud serial port but later in the initialisation changes it to 9600.
Turning on DIP switch 8 and cycling power puts the clock in a display test mode.
Typing <>< into the clock causes it to sleep for a couple of seconds.
Numbered commands
Command messages are in the format: >inflags#sendresponse#cmdnum#serialtask#inbuf#args,args,...#checksum<
<, > and # in inbuf are escaped using ^
All except inbuf are in hex. As a start, try 0
for inflags, 1
for sendresponse, 0
for serialtask, and cc
to ignore the checksum
0x0 Display text
Input | |
---|---|
serialtask |
|
buf | message |
arg0 |
|
arg1 | time to display for? |
Output | |
? |
>0#1#0#00#asd##cc< >00#40#01##3B<
0x1 ?
Input | |
---|---|
serialtask |
|
buf | message |
arg0 | Bitfield of 4 flags. |
Output | |
? |
Seems to reboot for anything at the moment. There's probably something we need to prepare.
>0#1#1#00#blah#2#cc< >00#40#01##3B<
0x2 Scroll text upwards
Input | |
---|---|
serialtask |
|
buf | message |
arg0 | delay in secs |
arg1 |
|
Output | |
? |
Text is centred, and wrapped!
>0#1#2#00#hello#2,0#cc< >00#40#01##3B<
0x3 Display wrapped text
Input | |
---|---|
serialtask |
|
buf | message |
arg0 |
|
arg1 |
|
arg2 | delay between pages |
Output | |
? |
>0#1#3#00#hello world#1,0,2#cc< >00#00#01##3F<
0x4 Clear screen?
Input | |
---|---|
serialtask |
|
arg0 |
|
Output | |
? |
>0#1#4#00##ff#cc< >00#00#01##3F<
0x5 Clear screen?
Input | |
---|---|
serialtask |
|
arg0 |
|
Output | |
? |
Also set some serial flag
>0#1#5#00##1#cc< >00#00#01##3F<
0x6 Stop animation
Input | |
---|---|
serialtask |
|
arg0 |
|
Output | |
? |
>0#1#6#00##0#cc< >00#00#01##3F<
0x7 Stop animation?
Input | |
---|---|
serialtask |
|
arg0 |
|
Output | |
? |
>0#1#7#00##0#cc< >00#00#01##3F<
0x8 Display text ?
Input | |
---|---|
serialtask |
|
buf | message |
arg0 |
|
Output | |
? |
>0#1#8#00#hello world#0#cc< >00#00#01##3F<
0x9 ?
Input | |
---|---|
serialtask |
|
buf | message |
arg0 |
|
Output | |
? |
>0#1#9#00##0#cc< >00#00#01##3F<
0xa Display by half-screens
Input | |
---|---|
serialtask |
|
buf | message |
arg0 |
|
arg1 | 0x10-0xbf = clear top half afterwards? wrapping height? |
arg2 | 1 = do top half, then bottom half |
Output | |
? |
>0#1#a#00#hi there#0,0,0#cc< >00#00#01##3F<
0x8b Set time
Input | |
---|---|
serialtask |
|
arg0 | hours |
arg1 | minutes |
arg2 | seconds |
Output | |
? |
>0#1#8b#00##14,3B,3B#cc< ?
0x8c Set date
Input | |
---|---|
serialtask |
|
arg0 | day |
arg1 | month |
arg2 | year |
Output | |
? |
>0#1#8c#00##1F,0C,0A#cc< ?
0xF0 Get serial task count
Input | |
---|---|
none | |
Output | |
arg0 | count |
>0#1#F0####cc< >00#80#01#03#34<
>0#1#F1####cc< >00#03#00##3D<
>0#1#F2####cc< >00#80#01#00#37<
0xF3 Get time
Input | |
---|---|
none | |
Output | |
arg0 | hours |
arg1 | minutes |
arg2 | seconds |
>0#1#F3####cc< >00#80#01#02,32,29#3F<
0xF4 Get date
Input | |
---|---|
none | |
Output | |
arg0 | date |
arg1 | month |
arg2 | year |
>0#1#F4####cc< >00#80#01#1E,05,0A#37<
0xF5 Get version
Input | |
---|---|
none | |
Output | |
flags | ? |
arg0 | Major version |
arg1 | Minor version |
>0#1#F5####cc< >00#80#01#04,07#18<
Firmware
NEC 27 (25), which is almost identical to a 186, with register bank switching, DMA and a simple buffering (macro) system for interrupts. User manual and with opcodes and with chart.
External bus | 8-bit |
Clock speed | 8MHz? |
DMA channels | 2 |
Serial | built-in |
Timers | 2 |
Internal data area | 256 bytes based at xxe00 |
Special functions | 256 bytes based at xxf00 |
Disassembly at http://github.com/marksteward/Infotec/.