; History: ; The first versions of CPE were developed on a Commodore Amiga 500, 7MHz. ; They were quite slow! I converted it to Intel assembler after I bought a PC ; in June 93. I derived some ideas for the Z80 emulation from a public domain ; CP/M emulator by Charlie Gibbs called SIMCPM for the Amiga. I had to rewrite ; it completely since it supported neither banking nor interrupts. The only ; remains of SimCPM are some labels in the Z80 section and the opcode tables. ; ; v0.0: 910602 Basic emulation of z80 instructions ; Some emulation of CPC's Mode 1 is done (SLOOOOOOW!) ; v0.1: 910605 Added some I/O support ; v0.2: 910607 increased speed about 10 times, but it's still slow ; probably the best way to speed the whole thing up ; is a 68040 board ; v0.3: 920504 fixed bug in GA memory management, so upper rom is called ; now; added primitive interrupts (every 1000 Z80 instructions) ; v0.4: 920505 keyboard emulation added; exit now possible with both ALT keys ; v0.5: 920506 fixed bugs in Z80 XOR A, SBC and ADC commands; frame fly ; interrupts; keymap (there were two Z keys) ; most OS and BASIC functions are now working properly ; added colors and video mode 2 support ; still not working: scrolling, floating point arithmetics ; v0.6: 920507 completely rewrote code for Z80 DAA and ADD,SUB,SBC,ADC ; instructions. Result: BASIC arithmetics are now working ; almost correctly, but occasionally there are still some ; problems. Added scrolling (sloooooow!) ; v0.7: 920509 now supporting multiple roms; added rom 7 (floppy control) ; no floppy hardware emulation right now ; added some optimizations ; v0.8: 920512 implemented floppy emulation by redirecting subroutines in ; the CPC's floppy ROM to 68000 code. Except formatting, all ; major disk operations are emulated. The file DriveA.dat ; contains the data of the emulated CPC drive. CP/M can be ; started and will work properly (I tested it with ; INFOCOM's ENCHANTER). Currently only standard disk formats ; (9 secs/track, 512 bytes/sec) are emulated ; v1.0: 920513 implemented video mode 0. In this version, all major functions ; of the CPC should be working (I didn't test all of them, ; though). ; on startup not only the current directory is checked for ROM ; files, but also a volume called "CPemul:" ; v1.1: 920515 found two bugs in Z80 simulation code, a minor one ; in the LD (HL),H instruction and a rather nasty one which ; prevented the DAA command from working when a PUSH/POP AF ; occurred before it. Since the 68000 does not implement BCD ; arithmetics by a halfcarry and an add/subtract indicator, but ; has instructions for adding and subtracting BCD bytes, a Z80 ; emulator has to find a workaround. This is done by saving ; both operands of each add operation. When a DAA occurs, these ; operands are restored and added with the 68000 Add BCD command ; The result is written in the accumulator. This is fine as long ; as there is nothing like PUSH AF/ADD A,C/POP AF in the code. ; But exactly this happens when an interrupt occurs between the ; ADD and the DAA commands. Solution in this version: have an ; extra stack for the BCD operands. The number of errors has ; been reduced, but there are still occasional errors. ; Improved interrupt emulation, TETRIS now works. ; CRTC emulation now supports variable screen widths ; added primitive form of Z80 debugging (regs printout) ; v1.2: 920517 almost complete Z80 disassembler (except DDs&FDs) ; simple Z80 singlestep debugger implemented ; v1.25: 920519 fixed bug in debugger's (f)orward command, added (z)ip ; added (c)olor mode command ; v1.3: 920521 more bugs fixed in cpe2.asm; RR (HL) didn't write back ; (HL) contents after the operation. The M flag is now set ; correctly after a BIT instruction (even Z80 experts may be ; surprised to learn that this flag should be set although ; even the official Z80 documentation says the flag contents is ; unknown after BIT. I didn't find out until some program used ; a JP M,xxxx after a BIT 7,(HL) instruction). The result of ; all this: the game "The Sentinel" now displays 3D gfx ; correctly. ; also new this version: mode 0 scrolling without ugly stripes, ; better emulation of IN instruction, undocumented opcodes ; DD/FD 67/6F ; v1.4: 920527 found out why ELITE was crashing: the time between ; interrupts was too small. ; Fixed some more bugs: EX (SP),IX / EX (SP),IY ; increased speed of LDIR instruction, added debugger commands ; i1-i3 (interrupt speeds, for ELITE mainly) ; v1.5: 920529 fixed bug in calcind macro, which was responsible for the ; errors in Turbo Pascal numeric output (offsets to IX were ; always positive, although 80..FF must be interpreted as ; negative numbers. This one may have been left over from SIMCPM. ; I am not sure though, and can't find out since I deleted the ; SIMCPM files ; added debugger 'm' command ; v1.6: 920602 'm' command now working correctly ; corrected bugs in keymap, added joystick emulation ; did some research on the floppy controller IO addresses ; FA7E/FB7E/FB7F. I think I have quite a good idea about what ; is happening when the floppy rom accesses those addresses. ; v1.7: 920603 implemented some elements of floppy emulation; some rom7 ; routines no longer have to be replaced by special 68000 ; routines. Hardware emulation for track selection and sector ; ID information now replaces old 68000 routines ; v1.8: 920604 implemented floppy controller $46/$66 commands ; v1.9: 920609 implemented Z80 (R)efresh register. It is used by some games ; as an instruction counter for decoding parts of their ; memory. "Certain games" means Bard's Tale, which nevertheless ; does not feel like working right now. ; Also fixed a bug in OUT (C),D --> Starglider now ; displays gfx correctly ; v1.9b: 921019 now Kickstart 2.0 compatible (how could I mess up OpenWindow ; like that !?!) ; v2.0: 950212 RELEASED ; changed volume name from CPEmul: to CPE: ; commented out the 68000 native emulation parts, because they ; only work for 664 ROMs. ; v2.0a: 950219 made a 680x0 version, for x >= 1. Also new: a small utility ; to convert .DSK files to the old .DAT format ; Oops, there seems to be a bug left in the Z80 emulation. ; 'Labyrinth' from CPCPD1.DSK doesn't work as it should. ; ; *************************************************************************** ; ; v2.00: 930926 first version for IBM-AT and ¯100% compatible®... ; first version that is working at least a bit, that is. ; Some mode 1 support, colors work, no floppy disk emulation ; Strange behaviour though from the emulated keyboard (in fact, ; it is not emulated, but produces characters anyway...) ; This is my first program in 80386 assembler which is longer ; than ten lines. ; v2.01: 930927 another bug bites the dust - in fact, hundreds of them! ; the result: working support of all cpc gfx modes ; (incl. scrolling & weird modes & colors & blinking) ; working keyboard emulation (PC/XT compatible keyboard) ; other hardware requirements: VGA, 80386 ; trouble with BASIC's NEXT command (FPO stuff) ; v2.05: 930928 fixed bugs IN (BIT 2,whatever) --> no trouble with testing ; the ESC key. Also fixed: flags were often killed when AX ; had to be PUSHed to do an operation (DD/FD adds...) ; v2.10: 931027 floppy load is now emulated. Elite & Tetris work! ; complete crash for Bard's Tale, though ; Starglider: same problem as on the Amiga ; v2.11: 931028 corrected some flag settings --> correct hex output from ; BASIC ; v2.12: 931225 more bug corrections: better R register implementation, so ; Bard's Tale now loads ; no problem now when screen width is set to 0, so Bard's Tale ; no longer crashes immediately after loading - it WORKS!!!! ; multiple sector read now works (BT did not even get to the ; R register part on the INTeL version until now) ; DD6F/DD67 were reversed - that was Starglider's problem. ; Now gfx were displayed.. until the machine crashed: I had ; forgotten a POP CX in DD22/FD22... oops. Starglider now works! ; something incredible happened: I had nowhere in the INTeL version ; used the dozmf macro for BIT 7 instructions, but Sentinel showed ; its gfx correctly nevertheless, I have no idea why it failed ; to do so on the Amiga version. And I have no idea why it keeps ; saying "wrong secret code" (aarggh)! ; v2.2: 940206 Received Marco Vieth's emulator two days ago. Amazed by the ; speed of his screen refresh I realized that there must be a ; faster method than the one I used, so I improved my routines quite ; a bit. I no longer have three separate routines for screen refresh, ; but only one universal routine which handles all modes and is ; significantly faster than the old three ones. ; ldir has been sped up quite a bit (same method as in Amiga version) ; poor lddr is still the same... ; v2.21: 940207 FINALLY!! I have found the bug which caused Sentinel to fail... ; it was, as usual, one wrong character: "gbhl AX" instead of ; "gbhl AL" in CB16. It Is NoW wOrKiNg!!! ; v2.3: 940209 implemented better interrupt emulation. Interrupts are now called ; almost precisely 300 times a second. Problem: LDIR, LDDR and ; other time-consuming operations may delay an interrupt. I may ; have to use another routine in the future. Currently I use ; BIOS interrupt 15h, function 83h ; v2.4: 940213 G.A.Lunter's documentation to his ZX Spectrum emulator helped ; me find 8 missing opcodes in my code: CB30..CB37 (SLL A..(HL)) ; Gigacad now works. Implemented sector save by bypassing rom 7 ; code ; v2.41: 940214 corrected HALT which did not work with the new interrupt model ; better emulation of 8255, so AIRBALLS now works - but no overscan :-( ; At least, the keyboard interrupt now works as it should - and ; it was about time! Also: slightly faster screen refresh ; v2.42: 940220 many little optimizations resulting in a nice speed increase: ; ELITE now works at normal interrupt frequency ; Screen redraw routines have been improved: they are a lot faster ; now and more friendly to the eye (the pointer to the PC screen ; is now used as loop variable, so screen is refreshed from top ; to bottom instead of ¯draw the first line of all characters...®) ; Disk write corrected (working again!). None of my programs ; have any difficulties now. Problems though with MV's disk: ; I suspect he uses RAM-Banking, which I have not implemented ; Almost nothing from this disk works! ; v2.43: 940221 fixed a bug that was introduced in the last version: screen ; width 40 height 0 crashed the machine (a table of 256 lines was ; generated instead of one with no lines) ; v2.5: 940223 OVERSCAN! Muri & Airballs now display their full screens! ; better interrupt emulation (now 292 ints/sec instead of 256) ; The problem is the PC's RTC which can only generate interrupt ; frequencies like 1024 or 2048Hz etc. ; v2.6: 940225 this version implements what I have always dreamed of: colored ; stripes! I am incredibly happy with these, even if they don't ; always start at the exact line. In fact, there is a lot of ; room for improvements, but the most important thing is that ; ELITE now has correctly colored zones. ; v2.7: 940303 This version introduces double buffering support - AIRBALLS ; is significantly faster than on an older version. Everything ; else works as usual, only Starglider did not like the change ; and crashes a bit more often - but I am used to having nothing ; but trouble with this program. ; v2.71: 940312 implemented diskchange feature and corrected some bugs. ; most of MVs programs now work, DD7D changed F instead of A! ; v2.8: 940317 this version uses the timer instead of the RTC and has the ; correct interrupt speed of 300.4Hz, exactly the same screen ; refresh rate in PCRTC mode 2 and thus better color stripes. ; v2.9: 940320 many little speedups and a major one: R emulation can now ; be switched off via a different opcode table. Not quite enough ; for troublemaker Starglider though, it still has to run with ; half the interrupt speed. ; implemented a nice little menu to control various aspects of ; the emulation: R register, FF synchronization, double buffering, ; interrupt omission, ffly bit reset ; v2.91: 940331 corrected the bug in scroll routines, it is now possible to use ; 8 bit access instead of 16 bit. Screen widths up to 255 no longer ; crash both CPC and PC. FDC emulation improved, no crashes after ; diskchanges any more ; v2.92: 940401 corrected bug in RR (IX+d); better emulation of illegal FDs; ; FDC can now write without patch. Cassette emulation! Loads ; from the DOS directory TAPE\. Can't write and is quite slow ; v2.93: 940402 corrected some in/out bugs, so the 'Last Demo' now works. ; patched CAS IN OPEN to speed up the process ; v3.0: 940403 SOUND! quality ranges from very good (TETRIS) to poor ; (everything which uses noise generator). Makes ELITE crash, ; probably too slow. ; v3.01: 940404 corrected bug: huge overscan screens became very small, because ; the VGA card did not get a MSB. Now FULLSCR and Sounddemo work ; better. ; v3.1: 940414 some slight speedups; some obsolete code removed ; more undocumented DDCBs, IM2 implemented for Boulder Dash (works!) ; Also a little RAM-banking (in a very early stage: incorrect ; screen refresh, slow) ; v3.11: 940415 faster scrolling by moving VGA screenstart, emulation is slowed ; down a bit though. New also: INI, OUTI, OUTD, IND ; v3.12: 940416 added feature to CAS IN OPEN, spaces in names are now deleted ; when necessary. Also corrected CAS IN OPEN patch in 6128 ROM ; increased scrolling speed by faster offset table generation ; v3.2: 940420 new in this version: multimode. It works... sometimes. There ; is still a lot of room for improvements. Better joystick ; emulation for Devil's Crown, which crashes when the emulated ; joystick is simultaneously pushed left and right. ; v3.3: 940422 improved SetPCsCRTC, which now no longer interferes with the ; timer interrupt, so that the picture is restored without ; trouble in displaymode 2. CPE can now load snapshot files ; in Marco Vieth's format. Corrected a huge bug in RethinkRAMState ; (ES was not saved, I wonder why it worked at all until now!) ; There was an error in my hardware documentation concerning the ; 8255 control register; this is now fixed. Caps and Num Lock ; LEDs are controlled by the keyboard interrupt. Speed has been ; increased quite a bit by replacing the JMP simz80l at the end ; of each instruction by a short sequence which either jumps to ; the next opcode or to the ¯interrupt and other stuff® handler ; v3.31: 940423 better port emulation; as on a real CPC you can now address ; several chips with one OUT. I hardly think that anyone ever ; used that feature, though. Corrected a HUGE bug in LDD: it ; did not set the flag register, it changed the accumulator. ; Oooops! Wonderboy now works. Also improved FDC emulation, ; ¯@® now works. ; v4.0: 940426 Yes, that's version FOUR, although there have only been two ; bug corrections since version 3.31, but these were *HUGE* bugs, ; which had been in CPE since the beginning. ; Rule No.1: Never be sure that the stack segment is always the ; same in your interrupts. DOS functions may modify SS, so you ; get nice crashes when your interrupt is called while DOS is ; active and you try to reach your data via the BP register ; (ASSUMEd: SS=DS=DATA). This bug caused lots of trouble and ; was incredibly hard to find. ; The second bug only crashed the CPC: I never knew that when ; an interrupt occurred, all further interrupts were disabled. ; Hardly any program depends on this, since they do a DI command ; anyway at the start of the interrupt routine, but Hardball and ; Overlander crashed in the old version. ; So much for bug hunting! ; v4.1: 940501 corrected bugs in multimodes, almost all programs now work ; EMS can be used to emulate RAM banking. CP/M Plus does not ; work very well, though. ; v4.11: 940507 printer support ; v4.2: 940514 new diskfile format, diskfiles can now be crunched. Minor ; bugs removed ; v4.3: 940522 corrected bugs in PIO: Antiriad and Barbarian now work. ; multimodes are a little more stable when there are changes in ; one frame caused by timing problems. Corrected R emulation, ; Mission Elevator now works ; v4.4: 940605 new: packed tape archives ; v4.5: 940707 realtime cpc (more or less), compatibility to other graphics ; cards than OAK. ; v4.6: 950223 enhanced compatibility to CPCEMU: CPE can now read V2 ; snapshots, .DSK files and CPCEMU style ROM files. ; .DSK file support is currently write protected. ; made a second version that uses 256 color 320x256 mode, runs ; realtime and has almost perfect color/multimode emulation. ; fixed the 'clear interrupt' feature of the Gate Array ; v4.7: 950308 Bug fixes. Enhanced joystick support. Refresh rate for CPE2 ; can now be configured in CPESETUP