disassembling - hex2bin is used for converting hexadecimal files into\na binary file. - used z80dasm to disassemble machine code into\nhexadecimal - use xxd to view the hex code and machine code side by side\n- ghidra, reverse engineering suite used for analysis
\nhttps://www.noagendashow.net/ https://twostopbits.com/\nhttps://en.wikipedia.org/wiki/Programmable_ROM https://en.wikipedia.org/wiki/Dual_in-line_package https://www.tablix.org/~avian/blog/articles/z80dasm/ https://ghidra-sre.org/\nhttps://hex2bin.sourceforge.net/
\n1.prom-location-on-board.jpg 2.prom-ready-to-read.jpg
\nIntelhex file snipet:
\n:100600003E0FCD8E043E0ECD8E04211441360023C4\n:1006100036003A6341326A41CDB204CDC404CD61A3\n:1006200005215541CB46C46306210F41CB6E281CE2\n:10063000210241CB4E28CE210F41CB7E2809FEEC72\n:10064000CAC306FEED287CCD45071849CB66284570\n:10065000210741CB76203B21154134CB8ECB9ECB5D\n:10066000961832FEFFC8CB4E2808FEE42004CB8E3D\n:10067000D1C9211941BED0FE31D8215541CB6628C0\n:1006800003FE31C8321341CBA7CBAF215541CBD6A6\n:10069000D1C9CD45072114413400003A2E41BEC2D4\n:1006A0001E0636000000211541CB46216B417E2BF2\n:1006B0002016BE200F3E132B772124413600210F38\n:1006C000413EFFC934C31806BE28EA3EC9CD8E0498\n:1006D0002115417EC60477CB5E200CCBA6AF01006E\n:1006E00041CD9104C31E063E2018F3210F41CB6675\n:1006F000202DCB6E28093A1341FEE4CCD107C93E28\n:10070000FFC9CDEB06210F41CB662013CB6E28EF3E\n:100710003A1341FEE12804FEE22004CDD107C93A94\n:100720001341C93E200614219042772310FCC921B1\n:100730002541367C233614CD5207C9212541362068\n:1007400023362018F2FB2125413680233601CD5374\n:1007500007C9F31680211241CBCECB964E0640CB73
\nxxd output showing text that's displayed on the screen when the\ndevice boots
\n000025d0: f4f5 f6f7 f9ef e1e2 0ded e8f8 30e4 3d3b ............0.=;\n000025e0: 272f e550 3839 4f4b 4c2c 2e49 3637 5548 '/.P89OKL,.I67UH\n000025f0: 4a4e 4d59 3435 5446 4756 4252 3233 4553 JNMY45TFGVBR23ES\n00002600: 4458 4357 e631 5141 5ae7 20ec ebea 2020 DXCW.1QAZ. ...\n00002610: 2020 2020 0f53 454c 4543 5420 4143 5449 .SELECT ACTI\n00002620: 5649 5459 1053 454c 4543 5420 434c 4153 VITY.SELECT CLAS\n00002630: 5320 312d 3906 4c45 5353 4f4e 1053 454c S 1-9.LESSON.SEL\n00002640: 4543 5420 4c45 5645 4c20 312d 3405 4c45 ECT LEVEL 1-4.LE\n00002650: 5645 4c12 5345 4c45 4354 2053 4543 5449 VEL.SELECT SECTI\n00002660: 4f4e 2031 2d32 1231 2d45 5841 4d50 4c45 ON 1-2.1-EXAMPLE\n00002670: 2050 524f 4752 414d 5310 322d 4241 5349 PROGRAMS.2-BASI\n00002680: 4320 434f 4d50 5554 4552 1045 5841 4d50 C COMPUTER.EXAMP\n00002690: 4c45 2050 524f 4752 414d 530e 5052 452d LE PROGRAMS.PRE-\n000026a0: 4241 5349 4320 5631 2e30 1253 454c 4543 BASIC V1.0.SELEC
\nz80dasm output:
\n push af ;0040 f5 .\n push bc ;0041 c5 .\n push de ;0042 d5 .\n push hl ;0043 e5 .\n ld hl,0410fh ;0044 21 0f 41 ! . A\n res 4,(hl) ;0047 cb a6 . .\n res 5,(hl) ;0049 cb ae . .\n set 6,(hl) ;004b cb f6 . .\n bit 0,(hl) ;004d cb 46 . F\n jr nz,27 ;004f 20 19 .\n bit 1,(hl) ;0051 cb 4e . N\n jr z,41 ;0053 28 27 ( '\n ld hl,0410eh ;0055 21 0e 41 ! . A\n inc (hl) ;0058 34 4\n ld a,(hl) ;0059 7e ~\n cp 032h ;005a fe 32 . 2\n jr nz,32 ;005c 20 1e .\n ld (hl),000h ;005e 36 00 6 .\n ld hl,0410ch ;0060 21 0c 41 ! . A\n inc (hl) ;0063 34 4\n jr nz,24 ;0064 20 16 .\n inc hl ;0066 23 #\n inc (hl) ;0067 34 4\n jr 20 ;0068 18 12 . .\n ld hl,0410ch ;006a 21 0c 41 ! . A\n inc (hl) ;006d 34 4\n jr nz,14 ;006e 20 0c .\n inc hl ;0070 23 #\n inc (hl) ;0071 34 4\n ld a,(hl) ;0072 7e ~\n cp 00ch ;0073 fe 0c . .\n jr nz,7 ;0075 20 05 .\n ld hl,0410fh ;0077 21 0f 41 ! . A\n set 2,(hl) ;007a cb d6 . .
\nIf you've gotten this far, the forth code, read bottom up:
\n-promreader\nmarker -promreader\n\n2variable low-mem\n2variable high-mem\n\n\\ 22-29\n$22 constant LOW-BYTE\n$21 constant DDRA\n$20 constant PINA\n\n\\ 53=PB0, 52=PB1\n$25 constant PAGE\n$24 constant DDRB\n$23 constant PINB\n%0000.0001 constant PAGE-SELECT\n%0000.0010 constant CHIP-ENABLE\n\n\\ 37-30 (reversed on board)\n$28 constant HIGH-BYTE\n$27 constant DDRC\n$26 constant PINC\n\n\\ 49-42 (reversed on board)\n$10b constant PORTL\n$10a constant DDRL\n$109 constant DATA\n\nvariable LineFeed\nvariable Address\nvariable CheckSum\n\n$10 constant ByteCount\n0 constant RecordType\n\n: port-init ( -- )\n PAGE-SELECT DDRB mset\n CHIP-ENABLE DDRB mset\n $ff DDRA mset\n $ff DDRC mset\n $ff DDRL mclr\n $ff PORTL mset\n CHIP-ENABLE PAGE mset\n PAGE-SELECT PAGE mclr\n;\n\n: hex>ascii ( n -- c c ) dup $f0 and 4 rshift swap $0f and digit swap digit ;\n\n: checksum+ ( n -- ) CheckSum @ + CheckSum ! ;\n\n: .output ( n -- ) ( dup ) ( checksum+ ) emit emit ;\n\n: address ( n -- )\n Address @\n dup $ff00 and 8 rshift swap\n $00ff and swap\n dup checksum+\n hex>ascii\n .output\n hex>ascii\n .output\n;\n\n: add>bytes ( n -- n n ) dup $ff00 and 8 rshift swap $00ff and ;\n\n: build-record ( n -- ) dup checksum+ hex>ascii .output ;\n\n: header ( -- )\n ." :"\n ByteCount build-record\n Address @ add>bytes swap build-record build-record\n RecordType build-record\n;\n\n: .checksum ( -- )\n CheckSum @ invert 1+\n build-record\n 0 CheckSum !\n cr\n;\n\n\n: address+ ( -- n ) Address @ 1+ dup Address ! ;\n\n: line-feed+ ( -- )\n LineFeed @ 1+\n dup\n ByteCount = if\n ( .checksum )\n 0 LineFeed !\n cr\n else\n LineFeed !\n then\n;\n\n: read-data ( -- d )\n CHIP-ENABLE PAGE mclr 10 ms\n DATA c@ 10 ms\n CHIP-ENABLE PAGE mset 10 ms\n ;\n\n: set-high-byte HIGH-BYTE c! ;\n\n: set-low-byte LOW-BYTE c! ;\n\n: get-data ( -- n )\n Address @ add>bytes\n set-low-byte\n set-high-byte\n read-data\n build-record\n;\n\n: page-read ( -- )\n 0 CheckSum ! 0 Address ! cr\n begin\n 0\n header\n begin\n get-data\n Address @ 1+ Address !\n 1+\n dup 16 =\n until\n drop\n .checksum\n Address @\n 0=\n until\n ." :00000001FF" cr\n;\n\n\n: dump-prom ( -- )\n port-init\n ." Page 1" cr\n page-read\n PAGE-SELECT PAGE mset\n ." Page 2" cr\n page-read\n ;
\nPROM location on board
\n
PROM ready to read
\n