CP/M-80 2.2 emulator with API
Project description
cpm80
CP/M-80 2.2 emulator with Python API.
Based on the fast and flexible z80 emulator.
Installing
$ pip install cpm80
Running and terminating
$ cpm80
>save 1 dump.dat
A>dir
A: DUMP DAT
A>exit
Enter exit
or just hit Ctrl + C three
times to quit the emulator.
Running commands automatically
From the command line:
$ cpm80 dir 'save 1 a.dat' dir
Alternatively, we can use the API's StringKeyboard
class to
feed arbitrary commands to the command processor, CCP, thus
replacing KeyboardDevice
console readers used by default:
import cpm80
COMMANDS = (
'dir',
'save 1 a.dat',
'dir',
)
console_reader = cpm80.StringKeyboard(*COMMANDS)
m = cpm80.I8080CPMMachine(console_reader=console_reader)
m.run()
Output:
A>dir
NO FILE
A>save 1 a.dat
A>dir
A: A DAT
A>
Getting output as a string
Similarly, we can replace DisplayDevice
console writers used by
default with custom writers to do special work for the emulator's
output.
For example, one could use a StringDisplay
writer to gather the
output into a string.
d = cpm80.StringDisplay()
m = cpm80.I8080CPMMachine(
console_reader=cpm80.StringKeyboard('dir'),
console_writer=d)
m.run()
print(d.string)
Making BDOS calls
BDOS calls can be performed on the machine object directly or by using convenience wrappers.
m = cpm80.I8080CPMMachine()
STR_ADDR = 0x100
m.set_memory_block(STR_ADDR, b'Hello $')
m.bdos_call(m.C_WRITESTR, de=STR_ADDR)
m.write_str('World!\n')
Working with files
Similarly, using BDOS wrappers one can manipulate files on disks.
drive = cpm80.DiskDrive()
m = cpm80.I8080CPMMachine(drive=drive)
m.make_file('file.txt')
m.write_file(f'bin(100) is {bin(100)}\n'.encode())
m.close_file()
del m
# Then read and print the contents of the file using another machine.
m = cpm80.I8080CPMMachine(drive=drive)
m.open_file('file.txt')
print(m.read_file())
m.close_file()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.