diff --git a/README.creole b/README.creole index 546bb4f0..55966e78 100644 --- a/README.creole +++ b/README.creole @@ -129,9 +129,9 @@ Dragon 32 and 64 ROMs in Text mode: {{http://www.jensdiemer.de/static/jensdiemer.de/screenshots/20140805_DragonPy_Dragon64_01.png|screenshot Dragon 64}} -CoCo Color Basic v1.3 in Text mode: +CoCo with Extended Color Basic v1.1 in Text mode: -{{http://www.jensdiemer.de/static/jensdiemer.de/screenshots/20140805_DragonPy_CoCo_ColorBasic.png|screenshot CoCo BASIC}} +{{http://www.jensdiemer.de/static/jensdiemer.de/screenshots/20140827_DragonPy_CoCo_ExtendedColorBasic01.png|screenshot CoCo Extended Color BASIC}} "sbc09" ROM in Tkinter window: diff --git a/download_ROMs.sh b/download_ROMs.sh index 42810eb0..5232238f 100755 --- a/download_ROMs.sh +++ b/download_ROMs.sh @@ -8,7 +8,6 @@ if [ ! -f dragonpy/Dragon32/d32.rom ]; then unzip -o "d32.zip" rm d32.zip mv "Dragon Data Ltd - Dragon 32 - IC17.ROM" d32.rom - sha1sum -c d32.rom.sha1 ) fi ( @@ -19,7 +18,7 @@ fi echo "========================================================================" -if [ ! -f dragonpy/Dragon64/d64.rom ]; then +if [ ! -f dragonpy/Dragon64/d64_ic17.rom ]; then ( set -x cd dragonpy/Dragon64/ @@ -27,7 +26,6 @@ if [ ! -f dragonpy/Dragon64/d64.rom ]; then unzip -o "d64_ic17.zip" rm "d64_ic17.zip" mv "Dragon Data Ltd - Dragon 64 - IC17.ROM" d64_ic17.rom - sha1sum -c d64_ic17.rom.sha1 ) echo "========================================================================" @@ -39,67 +37,31 @@ if [ ! -f dragonpy/Dragon64/d64.rom ]; then unzip -o "d64_ic18.zip" rm "d64_ic18.zip" mv "Dragon Data Ltd - Dragon 64 - IC18.ROM" d64_ic18.rom - sha1sum -c d64_ic18.rom.sha1 - - python create_d64_rom.py ) fi ( cd dragonpy/Dragon64/ set -x - sha1sum -c d64.rom.sha1 -) - -echo "========================================================================" - -if [ ! -f "dragonpy/CoCo/Color Basic v1.3 (1982)(Tandy).rom" ]; then -( - set -x - cd dragonpy/CoCo/ - wget -nv http://archive.worldofdragon.org/archive/index.php?dir=Roms/CoCo/\&file=Color%20Basic%20v1.3%20%281982%29%28Tandy%29.zip -O ColorBasic1.3.zip - unzip -o "ColorBasic1.3.zip" - rm "ColorBasic1.3.zip" -) -fi -( - cd dragonpy/CoCo/ - set -x - sha1sum -c "Color Basic v1.3 (1982)(Tandy).rom.sha1" -) - -echo "========================================================================" - -if [ ! -f "dragonpy/CoCo/Color Basic v1.2 (1982)(Tandy).rom" ]; then -( - set -x - cd dragonpy/CoCo/ - wget -nv http://archive.worldofdragon.org/archive/index.php?dir=Roms/CoCo/\&file=Color%20Basic%20v1.2%20%281982%29%28Tandy%29.zip -O ColorBasic1.2.zip - unzip -o "ColorBasic1.2.zip" - rm "ColorBasic1.2.zip" -) -fi -( - cd dragonpy/CoCo/ - set -x - sha1sum -c "Color Basic v1.2 (1982)(Tandy).rom.sha1" + sha1sum -c d64_ic17.rom.sha1 + sha1sum -c d64_ic18.rom.sha1 ) echo "========================================================================" -if [ ! -f "dragonpy/CoCo/ExtendedColorBasic1.1.rom" ]; then +if [ ! -f "dragonpy/CoCo/bas13.rom" ]; then ( set -x cd dragonpy/CoCo/ - wget -nv http://archive.worldofdragon.org/archive/index.php?dir=Roms/CoCo/\&file=Extended%20Color%20Basic%20v1.1%20%281982%29%28Tandy%29.zip -O ExtendedColorBasic1.1.zip - unzip -o "ExtendedColorBasic1.1.zip" - rm "ExtendedColorBasic1.1.zip" - mv "COCO.ROM" "ExtendedColorBasic1.1.rom" + wget -nv http://mess.oldos.net/coco2b.zip + unzip -o "coco2b.zip" + rm "coco2b.zip" ) fi ( cd dragonpy/CoCo/ set -x - sha1sum -c "ExtendedColorBasic1.1.rom.sha1" + sha1sum -c "bas13.rom.sha1" + sha1sum -c "extbas11.rom.sha1" ) diff --git a/dragonlib/CoCo/basic_tokens.py b/dragonlib/CoCo/basic_tokens.py index ed47b8fa..72d83a9e 100644 --- a/dragonlib/CoCo/basic_tokens.py +++ b/dragonlib/CoCo/basic_tokens.py @@ -5,7 +5,12 @@ ======================================= informations from: + + * Color BASIC 1.3: http://sourceforge.net/p/toolshed/code/ci/default/tree/cocoroms/bas.asm + + * Extended Color BASIC 1.1: + http://sourceforge.net/p/toolshed/code/ci/default/tree/cocoroms/extbas.asm :created: 2014 by Jens Diemer - www.jensdiemer.de :copyleft: 2014 by the DragonPy team, see AUTHORS for more details. @@ -13,7 +18,8 @@ """ -COCO_BASIC_TOKENS = { +# Revesed word tokens from Color BASIC 1.3: +COCO_COLOR_BASIC_TOKENS = { 0x80: "FOR", 0x81: "GO", 0x82: "REM", @@ -91,6 +97,56 @@ 0xff92: "INKEY$", 0xff93: "MEM", } + +# Revesed word tokens from Extended Color BASIC 1.1: +COCO_EXTENDED_COLOR_BASIC_TOKENS = { + 0xb5: "DEL", + 0xb6: "EDIT", + 0xb7: "TRON", + 0xb8: "TROFF", + 0xb9: "DEF", + 0xba: "LET", + 0xbb: "LINE", + 0xbc: "PCLS", + 0xbd: "PSET", + 0xbe: "PRESET", + 0xbf: "SCREEN", + 0xc0: "PCLEAR", + 0xc1: "COLOR", + 0xc2: "CIRCLE", + 0xc3: "PAINT", + 0xc4: "GET", + 0xc5: "PUT", + 0xc6: "DRAW", + 0xc7: "PCOPY", + 0xc8: "PMODE", + 0xc9: "PLAY", + 0xca: "DLOAD", + 0xcb: "RENUM", + 0xcc: "FN", + 0xcd: "USING", + + # Function tokens - all proceeded by 0xff to differentiate from operators + + 0xff94: "ATN", + 0xff95: "COS", + 0xff96: "TAN", + 0xff97: "EXP", + 0xff98: "FIX", + 0xff99: "LOG", + 0xff9a: "POS", + 0xff9b: "SQR", + 0xff9c: "HEX$", + 0xff9d: "VARPTR", + 0xff9e: "INSTR", + 0xff9f: "TIMER", + 0xffa0: "PPOINT", + 0xffa1: "STRING$", +} + +# Merged tokens: +COCO_BASIC_TOKENS = COCO_COLOR_BASIC_TOKENS.copy() +COCO_BASIC_TOKENS.update(COCO_EXTENDED_COLOR_BASIC_TOKENS) if __name__ == '__main__': @@ -102,19 +158,24 @@ # http://archive.worldofdragon.org/index.php?title=Tokens print """ +* "CoCo A": - Tokens from Color BASIC 1.3 +* "CoCo B": - Additional tokens from Extended Color BASIC 1.1 only {| class="wikitable" style="font-family: monospace; background-color:#ffffcc;" cellpadding="10" |- ! value ! Dragon token -! CoCo +! CoCo A +token +! CoCo B token """ for value in values: - coco_statement = COCO_BASIC_TOKENS.get(value, "") + coco_basic_statement = COCO_COLOR_BASIC_TOKENS.get(value, "") + coco_extended_basic_statement = COCO_EXTENDED_COLOR_BASIC_TOKENS.get(value, "") dragon_statement = DRAGON32_BASIC_TOKENS.get(value, "") - if coco_statement == "" and dragon_statement == "": + if coco_basic_statement == "" and coco_extended_basic_statement=="" and dragon_statement == "": continue if value > 0xff: @@ -125,6 +186,8 @@ print "|-" print "| %s" % value print "| %s" % dragon_statement - print "| %s" % coco_statement + print "| %s" % coco_basic_statement + print "| %s" % coco_extended_basic_statement + print "|-" print "|}" diff --git a/dragonlib/api.py b/dragonlib/api.py index a148aab3..75d4699f 100644 --- a/dragonlib/api.py +++ b/dragonlib/api.py @@ -10,12 +10,12 @@ :license: GNU GPL v3 or above, see LICENSE for more details. """ +from dragonlib.CoCo.basic_tokens import COCO_BASIC_TOKENS from dragonlib.core.basic import BasicListing, RenumTool, BasicTokenUtil,\ BasicLine from dragonlib.core.basic_parser import BASICParser from dragonlib.dragon32.basic_tokens import DRAGON32_BASIC_TOKENS from dragonlib.utils.logging_utils import log -from dragonlib.CoCo.basic_tokens import COCO_BASIC_TOKENS DRAGON32 = "Dragon32" @@ -110,5 +110,3 @@ class CoCoAPI(Dragon32API): MACHINE_NAME = "CoCo" BASIC_TOKENS = COCO_BASIC_TOKENS - # Default memory location of BASIC listing start - DEFAULT_PROGRAM_START = 0x0601 diff --git a/dragonpy/CoCo/Color Basic v1.2 (1982)(Tandy).rom.sha1 b/dragonpy/CoCo/Color Basic v1.2 (1982)(Tandy).rom.sha1 deleted file mode 100644 index 80e226e6..00000000 --- a/dragonpy/CoCo/Color Basic v1.2 (1982)(Tandy).rom.sha1 +++ /dev/null @@ -1 +0,0 @@ -0f14dc46c647510eb0b7bd3f53e33da07907d04f Color Basic v1.2 (1982)(Tandy).rom diff --git a/dragonpy/CoCo/Color Basic v1.3 (1982)(Tandy).rom.sha1 b/dragonpy/CoCo/Color Basic v1.3 (1982)(Tandy).rom.sha1 deleted file mode 100644 index 2bc5f102..00000000 --- a/dragonpy/CoCo/Color Basic v1.3 (1982)(Tandy).rom.sha1 +++ /dev/null @@ -1 +0,0 @@ -28b92bebe35fa4f026a084416d6ea3b1552b63d3 Color Basic v1.3 (1982)(Tandy).rom diff --git a/dragonpy/CoCo/ExtendedColorBasic1.1.rom.sha1 b/dragonpy/CoCo/ExtendedColorBasic1.1.rom.sha1 deleted file mode 100644 index d642b21b..00000000 --- a/dragonpy/CoCo/ExtendedColorBasic1.1.rom.sha1 +++ /dev/null @@ -1 +0,0 @@ -ac7253a9b5ade2375308bd8f5a677335fa342ba2 ExtendedColorBasic1.1.rom diff --git a/dragonpy/CoCo/bas13.rom.sha1 b/dragonpy/CoCo/bas13.rom.sha1 new file mode 100644 index 00000000..9b2abee6 --- /dev/null +++ b/dragonpy/CoCo/bas13.rom.sha1 @@ -0,0 +1 @@ +28b92bebe35fa4f026a084416d6ea3b1552b63d3 bas13.rom diff --git a/dragonpy/CoCo/config.py b/dragonpy/CoCo/config.py index 907b6aa4..59f3eef1 100644 --- a/dragonpy/CoCo/config.py +++ b/dragonpy/CoCo/config.py @@ -9,17 +9,16 @@ :license: GNU GPL v3 or above, see LICENSE for more details. """ -import os import logging +import os from dragonlib.api import CoCoAPI from dragonlib.utils.logging_utils import log - from dragonpy.CoCo.mem_info import get_coco_meminfo from dragonpy.Dragon32.config import Dragon32Cfg from dragonpy.Dragon32.keyboard_map import get_coco_keymatrix_pia_result -from dragonpy.core.configs import COCO from dragonpy.components.rom import ROMFile +from dragonpy.core.configs import COCO class CoCoCfg(Dragon32Cfg): @@ -46,36 +45,22 @@ class CoCoCfg(Dragon32Cfg): ROM_START = 0x8000 ROM_END = 0xFFFF -# """ -# EXTENDED COLOR BASIC -# ROM files from "MESS BIOS images" in file "coco2b.zip" -# -# $a000-$bfff - 'bas13.rom' - size: $1fff (dez.: 8191) Bytes -# $8000-$9fff - 'extbas11.rom' - size: $1fff (dez.: 8191) Bytes -# """ -# ROM_START = 0x8000 -# DEFAULT_ROMS = ( -# ROMFile(address=0x8000, max_size=0x4000, -# filepath=os.path.join(os.path.abspath(os.path.dirname(__file__)), -# "extbas11.rom" -# ) -# ), -# ROMFile(address=0xA000, max_size=0x4000, -# filepath=os.path.join(os.path.abspath(os.path.dirname(__file__)), -# "bas13.rom" -# ) -# ), -# ) - """ - COLOR BASIC - $a000-$bfff - Color Basic 1.x - size: $1fff (dez.: 8191) Bytes + EXTENDED COLOR BASIC + + $a000-$bfff - 'bas13.rom' - size: $1fff (dez.: 8191) Bytes + $8000-$9fff - 'extbas11.rom' - size: $1fff (dez.: 8191) Bytes """ - ROM_START = 0xA000 + ROM_START = 0x8000 DEFAULT_ROMS = ( + ROMFile(address=0x8000, max_size=0x4000, + filepath=os.path.join(os.path.abspath(os.path.dirname(__file__)), + "extbas11.rom" + ) + ), ROMFile(address=0xA000, max_size=0x4000, filepath=os.path.join(os.path.abspath(os.path.dirname(__file__)), - "Color Basic v1.3 (1982)(Tandy).rom" + "bas13.rom" ) ), ) @@ -97,6 +82,9 @@ def __init__(self, cmd_args): # (0x0152, 0x0159): (None, self.keyboard_matrix_state), (0x0115, 0x0119): (self.rnd_seed_read, self.rnd_seed_write) } + self.memory_word_middlewares = { + (0x0019, 0x0027): (None, self.basic_addresses_write), + } def rnd_seed_read(self, cycles, last_op_address, address, byte): log.critical("%04x| read $%02x RND() seed from: $%04x", last_op_address, byte, address) @@ -106,6 +94,20 @@ def rnd_seed_write(self, cycles, last_op_address, address, byte): log.critical("%04x| write $%02x RND() seed to: $%04x", last_op_address, byte, address) return byte + def basic_addresses_write(self, cycles, last_op_address, address, word): + """ + 0113 0019 TXTTAB RMB 2 *PV BEGINNING OF BASIC PROGRAM + 0114 001B VARTAB RMB 2 *PV START OF VARIABLES + 0115 001D ARYTAB RMB 2 *PV START OF ARRAYS + 0116 001F ARYEND RMB 2 *PV END OF ARRAYS (+1) + 0117 0021 FRETOP RMB 2 *PV START OF STRING STORAGE (TOP OF FREE RAM) + 0118 0023 STRTAB RMB 2 *PV START OF STRING VARIABLES + 0119 0025 FRESPC RMB 2 UTILITY STRING POINTER + 0120 0027 MEMSIZ RMB 2 *PV TOP OF STRING SPACE + """ + log.critical("%04x| write $%04x to $%04x", last_op_address, word, address) + return word + def get_initial_RAM(self): """ init the Dragon RAM diff --git a/dragonpy/CoCo/extbas11.rom.sha1 b/dragonpy/CoCo/extbas11.rom.sha1 new file mode 100644 index 00000000..77951b01 --- /dev/null +++ b/dragonpy/CoCo/extbas11.rom.sha1 @@ -0,0 +1 @@ +ad927fb4f30746d820cb8b860ebb585e7f095dea extbas11.rom diff --git a/dragonpy/Dragon64/create_d64_rom.py b/dragonpy/Dragon64/create_d64_rom.py deleted file mode 100644 index 8889c6b7..00000000 --- a/dragonpy/Dragon64/create_d64_rom.py +++ /dev/null @@ -1,8 +0,0 @@ - -with open("d64.rom", "wb") as out: - with open("d64_ic17.rom", "rb") as f: # "Dragon Data Ltd - Dragon 64 - IC17.ROM" - out.write(f.read()) - with open("d64_ic18.rom", "rb") as f: # "Dragon Data Ltd - Dragon 64 - IC18.ROM" - out.write(f.read()) - -print out.name, "created." \ No newline at end of file diff --git a/dragonpy/Dragon64/d64.rom.sha1 b/dragonpy/Dragon64/d64.rom.sha1 deleted file mode 100644 index 0de8ea4c..00000000 --- a/dragonpy/Dragon64/d64.rom.sha1 +++ /dev/null @@ -1 +0,0 @@ -d7785bd971172501bac87273e91a91b202d4dcbb d64.rom