diff --git a/Tools/cpm/bin80/ZMAC.COM b/Tools/cpm/bin80/ZMAC.COM index ffbbc1db..f5dde94e 100644 Binary files a/Tools/cpm/bin80/ZMAC.COM and b/Tools/cpm/bin80/ZMAC.COM differ diff --git a/Tools/unix/zxcc/ReadMe.txt b/Tools/unix/zxcc/ReadMe.txt index a0b0a63e..8fde0ac6 100644 --- a/Tools/unix/zxcc/ReadMe.txt +++ b/Tools/unix/zxcc/ReadMe.txt @@ -62,7 +62,7 @@ wwarthen@gmail.com January 9, 2022 -- Running zxcc under WSL (Windows Subsystem for Linux) was gererating output +- Running zxcc under WSL (Windows Subsystem for Linux) was generating output that was correct but did not match standard Windows or Linux runs. This turned out to be an assumption in a few places in the code that reading into a buffer would not modify the area of the buffer that was beyond @@ -78,7 +78,7 @@ January 9, 2022 Nicholson's GitHub repo at https://github.com/agn453/ZXCC. The most significant difference in my code is that I am using the WIN32 API for all disk I/O. Although the file tracking code is retained, I have - found this mechanism to fail insome scenarios. By using the WIN32 API + found this mechanism to fail in some scenarios. By using the WIN32 API I can achieve the same file sharing attributes as Unix which makes the file tracking mechanism optional. @@ -91,3 +91,8 @@ January 9, 2022 --WBW 3:58 PM 3/2/2022 +The CP/M BIOS was updated to sync with the latest from Tony +Nicholson and to remove the ZMAC workaround that I had put there +previously. ZMAC was patched instead. + +--WBW 1:41 PM 11/17/2025 \ No newline at end of file diff --git a/Tools/unix/zxcc/cpm/bios.bin b/Tools/unix/zxcc/cpm/bios.bin index b20e62d9..f2480b4c 100644 Binary files a/Tools/unix/zxcc/cpm/bios.bin and b/Tools/unix/zxcc/cpm/bios.bin differ diff --git a/Tools/unix/zxcc/cpm/bios.com b/Tools/unix/zxcc/cpm/bios.com index b20e62d9..f2480b4c 100644 Binary files a/Tools/unix/zxcc/cpm/bios.com and b/Tools/unix/zxcc/cpm/bios.com differ diff --git a/Tools/unix/zxcc/cpm/bios.lst b/Tools/unix/zxcc/cpm/bios.lst index d3e97405..eaa01542 100644 --- a/Tools/unix/zxcc/cpm/bios.lst +++ b/Tools/unix/zxcc/cpm/bios.lst @@ -1,4 +1,4 @@ -Z80ASM SuperFast Relocating Macro Assembler Z80ASM 1.30 Page 1 +Z80ASM SuperFast Relocating Macro Assembler Z80ASM 1.32 Page 1 BIOS Z80 1 ; BIOS / BDOS for the ZXCC environment. @@ -14,93 +14,146 @@ BIOS Z80 11 FE0B ED FE DEFB 0EDh,0FEh 12 FE0D C9 RET 13 ; - 14 ; Hack for ZMAC. ZMAC is using contents of 0FE22H to establish a memory pointer. - 15 ; It makes no sense. We stuff 04F4CH here because it is known to work... - 16 ; - 17 FE22 org 0FE22H - 18 FE22 4F4C DEFW 04F4CH - 19 ; - 20 ;This is not a real BIOS, so let its code live below the BIOS jumpblock. - 21 ; - 22 FE24 DD 22 FE33 UBIOS: LD (XIX),IX - 23 FE28 DD E1 POP IX ;IX = address of UBIOS function - 24 FE2A 3E C3 LD A,0C3h ;C3h = BIOS call - 25 FE2C ED FE DEFB 0EDh,0FEh - 26 FE2E DD 2A FE33 LD IX,(XIX) - 27 FE32 C9 RET - 28 ; - 29 FE33 0000 XIX: DEFW 0 - 30 - 31 FE35 21 FF03 CBOOT: LD HL,WBOOT0 - 32 FE38 22 0001 LD (1),HL - 33 FE3B 21 FE06 LD HL,BDOS0 - 34 FE3E 22 0006 LD (6),HL - 35 FE41 3E C3 LD A,0C3h - 36 FE43 32 0000 LD (0),A - 37 FE46 32 0005 LD (5),A - 38 FE49 3E C9 LD A,0C9h - 39 FE4B 32 0038 LD (038h),A - 40 FE4E 3E C1 LD A,0C1h ;C1h = program load - 41 FE50 ED FE DEFB 0EDh,0FEh - 42 FE52 21 0000 LD HL,0 - 43 FE55 E5 PUSH HL ;In case called program tries to RET - 44 FE56 C3 0100 JP 0100h - 45 ; - 46 FE59 3E C3 WBOOT: LD A,0C3h ;Program termination - 47 FE5B DD 21 0006 LD IX,6 ;BIOS call 1 - 48 FE5F ED FE DEFB 0EDh,0FEh - 49 FE61 76 HALT - 50 FE62 C3 FE62 JP $ - 51 ; - 52 FEEC org 0FEECh - 53 FEEC FF tmpdrv: defb 0FFh ;Temp drive = current - 54 - 55 - 56 ; - 57 ;TODO: SCB at FE9Ch + 14 ;This is not a real BIOS, so let its code live below the BIOS jumpblock. + 15 ; + 16 FE0E DD 22 FE24 UBIOS: LD (XIX),IX + 17 FE12 DD E1 POP IX ;IX = address of UBIOS function + 18 ; + 19 ; ZXCC was written on the assumption that the BIOS jumpblock was a series + 20 ; of CALL UBIOS instructions; in which case, IX would be the return address, + 21 ; or the address of the jumpblock entry plus 3. + 22 ; + 23 ; Now that the BIOS jumpblock is a true jumpblock and the CALL instructions + 24 ; are elsewhere, the offset is relative to BIOS2 rather than CONST0. So + 25 ; adjust the offset. + 26 ; + 27 FE14 D5 PUSH DE + 28 FE15 11 00B0 LD DE,CONST0 - BIOS2 + 29 FE18 DD 19 ADD IX,DE + 30 FE1A D1 POP DE + 31 FE1B 3E C3 LD A,0C3h ;C3h = BIOS call + 32 FE1D ED FE DEFB 0EDh,0FEh ;ZXCC trap; IX = BIOS function + 33 FE1F DD 2A FE24 LD IX,(XIX) + 34 FE23 C9 RET + 35 ; + 36 FE24 0000 XIX: DEFW 0 + 37 + 38 FE26 21 FF03 CBOOT: LD HL,WBOOT0 ;ZXCC cold boot: Initialise the Zero Page. + 39 FE29 22 0001 LD (1),HL + 40 FE2C 21 FE06 LD HL,BDOS0 + 41 FE2F 22 0006 LD (6),HL + 42 FE32 3E C3 LD A,0C3h + 43 FE34 32 0000 LD (0),A + 44 FE37 32 0005 LD (5),A + 45 FE3A 3E C9 LD A,0C9h + 46 FE3C 32 0038 LD (038h),A + 47 FE3F 3E C1 LD A,0C1h ;C1h = program load + 48 FE41 ED FE DEFB 0EDh,0FEh + 49 FE43 21 0000 LD HL,0 + 50 FE46 E5 PUSH HL ;In case called program tries to RET + 51 FE47 C3 0100 JP 0100h + 52 ; + 53 FE4A 3E C3 WBOOT: LD A,0C3h ;Program termination + 54 FE4C DD 21 0006 LD IX,6 ;BIOS call 1 + 55 FE50 ED FE DEFB 0EDh,0FEh + 56 FE52 76 HALT + 57 FE53 C3 FE53 JP $ 58 ; - Z80ASM SuperFast Relocating Macro Assembler Z80ASM 1.30 Page 2 + Z80ASM SuperFast Relocating Macro Assembler Z80ASM 1.32 Page 2 BIOS Z80 - 59 FF00 org 0FF00h - 60 FF00 C3 FE35 JP CBOOT ;FF00 - 61 FF03 C3 FE59 WBOOT0: JP WBOOT ;03 - 62 FF06 CD FE24 CALL UBIOS ;06 - 63 FF09 CD FE24 CALL UBIOS ;09 - 64 FF0C CD FE24 CALL UBIOS ;0C - 65 FF0F CD FE24 CALL UBIOS ;0F - 66 FF12 CD FE24 CALL UBIOS ;12 - 67 FF15 CD FE24 CALL UBIOS ;15 - 68 FF18 CD FE24 CALL UBIOS ;18 - 69 FF1B CD FE24 CALL UBIOS ;1B - 70 FF1E CD FE24 CALL UBIOS ;1E - 71 FF21 CD FE24 CALL UBIOS ;21 - 72 FF24 CD FE24 CALL UBIOS ;24 - 73 FF27 CD FE24 CALL UBIOS ;27 - 74 FF2A CD FE24 CALL UBIOS ;2A - 75 FF2D CD FE24 CALL UBIOS ;2D - 76 FF30 CD FE24 CALL UBIOS ;30 - 77 FF33 CD FE24 CALL UBIOS ;33 - 78 FF36 CD FE24 CALL UBIOS ;36 - 79 FF39 CD FE24 CALL UBIOS ;39 - 80 FF3C CD FE24 CALL UBIOS ;42 - 81 FF3F CD FE24 CALL UBIOS ;45 - 82 FF42 CD FE24 CALL UBIOS ;48 - 83 FF45 CD FE24 CALL UBIOS ;4B - 84 FF48 CD FE24 CALL UBIOS ;4E - 85 FF4B CD FE24 CALL UBIOS ;51 - 86 FF4E CD FE24 CALL UBIOS ;54 - 87 FF51 CD FE24 CALL UBIOS ;57 - 88 FF54 CD FE24 CALL UBIOS ;5A, USERF - 89 FF57 CD FE24 CALL UBIOS ;5D, RESERV1 - 90 FF5A CD FE24 CALL UBIOS ;60, RESERV2 - 91 ; - 92 FFC0 org 0FFC0h ;Space for DPB - 93 FFC0 0020 dpb: defs 20h - 94 - 95 END + 59 ; Implementation of all other BIOS functions + 60 ; + 61 FE56 CD FE0E BIOS2: CALL UBIOS + 62 FE59 CD FE0E BIOS3: CALL UBIOS + 63 FE5C CD FE0E BIOS4: CALL UBIOS + 64 FE5F CD FE0E BIOS5: CALL UBIOS + 65 FE62 CD FE0E BIOS6: CALL UBIOS + 66 FE65 CD FE0E BIOS7: CALL UBIOS + 67 FE68 CD FE0E BIOS8: CALL UBIOS + 68 FE6B CD FE0E BIOS9: CALL UBIOS + 69 FE6E CD FE0E BIOS10: CALL UBIOS + 70 FE71 CD FE0E BIOS11: CALL UBIOS + 71 FE74 CD FE0E BIOS12: CALL UBIOS + 72 FE77 CD FE0E BIOS13: CALL UBIOS + 73 FE7A CD FE0E BIOS14: CALL UBIOS + 74 FE7D CD FE0E BIOS15: CALL UBIOS + 75 FE80 CD FE0E BIOS16: CALL UBIOS + 76 FE83 CD FE0E BIOS17: CALL UBIOS + 77 FE86 CD FE0E BIOS18: CALL UBIOS + 78 FE89 CD FE0E BIOS19: CALL UBIOS + 79 FE8C CD FE0E BIOS20: CALL UBIOS + 80 FE8F CD FE0E BIOS21: CALL UBIOS + 81 FE92 CD FE0E BIOS22: CALL UBIOS + 82 FE95 CD FE0E BIOS23: CALL UBIOS + 83 FE98 CD FE0E BIOS24: CALL UBIOS + 84 FE9B CD FE0E BIOS25: CALL UBIOS + 85 FE9E CD FE0E BIOS26: CALL UBIOS + 86 FEA1 CD FE0E BIOS27: CALL UBIOS + 87 FEA4 CD FE0E BIOS28: CALL UBIOS + 88 FEA7 CD FE0E BIOS29: CALL UBIOS + 89 FEAA CD FE0E BIOS30: CALL UBIOS + 90 FEAD CD FE0E BIOS31: CALL UBIOS + 91 FEB0 CD FE0E BIOS32: CALL UBIOS + 92 ; + 93 ; + 94 FEEC org 0FEECh + 95 FEEC FF tmpdrv: defb 0FFh ;Temp drive = current + 96 + 97 + 98 ; + 99 ;TODO: SCB at FE9Ch + 100 ; + 101 + 102 ; + 103 ; Mallard BASIC (and maybe other programs) assumes that the BIOS + 104 ; jumpblock is a list of jumps, not calls. So rather than composing the + 105 ; BIOS jumpblock of a sequence of CALL UBIOS, it's now a sequence + 106 ; of jumps to CALL UBIOS. + 107 ; + 108 FF00 org 0FF00h + 109 FF00 C3 FE26 JP CBOOT ;FF00 + 110 FF03 C3 FE4A WBOOT0: JP WBOOT ;03 + 111 FF06 C3 FE56 CONST0: JP BIOS2 + 112 FF09 C3 FE59 JP BIOS3 + 113 FF0C C3 FE5C JP BIOS4 + 114 FF0F C3 FE5F JP BIOS5 + 115 FF12 C3 FE62 JP BIOS6 + 116 FF15 C3 FE65 JP BIOS7 + Z80ASM SuperFast Relocating Macro Assembler Z80ASM 1.32 Page 3 +BIOS Z80 + + 117 FF18 C3 FE68 JP BIOS8 + 118 FF1B C3 FE6B JP BIOS9 + 119 FF1E C3 FE6E JP BIOS10 + 120 FF21 C3 FE71 JP BIOS11 + 121 FF24 C3 FE74 JP BIOS12 + 122 FF27 C3 FE77 JP BIOS13 + 123 FF2A C3 FE7A JP BIOS14 + 124 FF2D C3 FE7D JP BIOS15 + 125 FF30 C3 FE80 JP BIOS16 + 126 FF33 C3 FE83 JP BIOS17 + 127 FF36 C3 FE86 JP BIOS18 + 128 FF39 C3 FE89 JP BIOS19 + 129 FF3C C3 FE8C JP BIOS20 + 130 FF3F C3 FE8F JP BIOS21 + 131 FF42 C3 FE92 JP BIOS22 + 132 FF45 C3 FE95 JP BIOS23 + 133 FF48 C3 FE98 JP BIOS24 + 134 FF4B C3 FE9B JP BIOS25 + 135 FF4E C3 FE9E JP BIOS26 + 136 FF51 C3 FEA1 JP BIOS27 + 137 FF54 C3 FEA4 JP BIOS28 + 138 FF57 C3 FEA7 JP BIOS29 + 139 FF5A C3 FEAA JP BIOS30 + 140 FF5D C3 FEAD JP BIOS31 + 141 FF60 C3 FEB0 JP BIOS32 + 142 ; + 143 FFC0 org 0FFC0h ;Space for DPB + 144 FFC0 0020 dpb: defs 20h + 145 + 146 END 0 Error(s) Detected. - 480 Absolute Bytes. 9 Symbols Detected. -  UBIOS ;27 - 74 FF2A CD FE24 CALL UBIOS ;2A - 75 FF2D CD FE24 \ No newline at end of file + 480 Absolute Bytes. 41 Symbols Detected. +  JP BIOS10 + 120 FF21 C3 FE71 JP B \ No newline at end of file diff --git a/Tools/unix/zxcc/cpm/bios.z80 b/Tools/unix/zxcc/cpm/bios.z80 index fb64e891..12107a4b 100644 --- a/Tools/unix/zxcc/cpm/bios.z80 +++ b/Tools/unix/zxcc/cpm/bios.z80 @@ -11,24 +11,31 @@ BDOS1: LD A,0C0h DEFB 0EDh,0FEh RET ; -; Hack for ZMAC. ZMAC is using contents of 0FE22H to establish a memory pointer. -; It makes no sense. We stuff 04F4CH here because it is known to work... -; - org 0FE22H - DEFW 04F4CH -; ;This is not a real BIOS, so let its code live below the BIOS jumpblock. ; UBIOS: LD (XIX),IX POP IX ;IX = address of UBIOS function +; +; ZXCC was written on the assumption that the BIOS jumpblock was a series +; of CALL UBIOS instructions; in which case, IX would be the return address, +; or the address of the jumpblock entry plus 3. +; +; Now that the BIOS jumpblock is a true jumpblock and the CALL instructions +; are elsewhere, the offset is relative to BIOS2 rather than CONST0. So +; adjust the offset. +; + PUSH DE + LD DE,CONST0 - BIOS2 + ADD IX,DE + POP DE LD A,0C3h ;C3h = BIOS call - DEFB 0EDh,0FEh + DEFB 0EDh,0FEh ;ZXCC trap; IX = BIOS function LD IX,(XIX) RET ; XIX: DEFW 0 -CBOOT: LD HL,WBOOT0 +CBOOT: LD HL,WBOOT0 ;ZXCC cold boot: Initialise the Zero Page. LD (1),HL LD HL,BDOS0 LD (6),HL @@ -48,6 +55,41 @@ WBOOT: LD A,0C3h ;Program termination DEFB 0EDh,0FEh HALT JP $ +; +; Implementation of all other BIOS functions +; +BIOS2: CALL UBIOS +BIOS3: CALL UBIOS +BIOS4: CALL UBIOS +BIOS5: CALL UBIOS +BIOS6: CALL UBIOS +BIOS7: CALL UBIOS +BIOS8: CALL UBIOS +BIOS9: CALL UBIOS +BIOS10: CALL UBIOS +BIOS11: CALL UBIOS +BIOS12: CALL UBIOS +BIOS13: CALL UBIOS +BIOS14: CALL UBIOS +BIOS15: CALL UBIOS +BIOS16: CALL UBIOS +BIOS17: CALL UBIOS +BIOS18: CALL UBIOS +BIOS19: CALL UBIOS +BIOS20: CALL UBIOS +BIOS21: CALL UBIOS +BIOS22: CALL UBIOS +BIOS23: CALL UBIOS +BIOS24: CALL UBIOS +BIOS25: CALL UBIOS +BIOS26: CALL UBIOS +BIOS27: CALL UBIOS +BIOS28: CALL UBIOS +BIOS29: CALL UBIOS +BIOS30: CALL UBIOS +BIOS31: CALL UBIOS +BIOS32: CALL UBIOS +; ; org 0FEECh tmpdrv: defb 0FFh ;Temp drive = current @@ -55,39 +97,48 @@ tmpdrv: defb 0FFh ;Temp drive = current ; ;TODO: SCB at FE9Ch +; + +; +; Mallard BASIC (and maybe other programs) assumes that the BIOS +; jumpblock is a list of jumps, not calls. So rather than composing the +; BIOS jumpblock of a sequence of CALL UBIOS, it's now a sequence +; of jumps to CALL UBIOS. ; org 0FF00h JP CBOOT ;FF00 WBOOT0: JP WBOOT ;03 - CALL UBIOS ;06 - CALL UBIOS ;09 - CALL UBIOS ;0C - CALL UBIOS ;0F - CALL UBIOS ;12 - CALL UBIOS ;15 - CALL UBIOS ;18 - CALL UBIOS ;1B - CALL UBIOS ;1E - CALL UBIOS ;21 - CALL UBIOS ;24 - CALL UBIOS ;27 - CALL UBIOS ;2A - CALL UBIOS ;2D - CALL UBIOS ;30 - CALL UBIOS ;33 - CALL UBIOS ;36 - CALL UBIOS ;39 - CALL UBIOS ;42 - CALL UBIOS ;45 - CALL UBIOS ;48 - CALL UBIOS ;4B - CALL UBIOS ;4E - CALL UBIOS ;51 - CALL UBIOS ;54 - CALL UBIOS ;57 - CALL UBIOS ;5A, USERF - CALL UBIOS ;5D, RESERV1 - CALL UBIOS ;60, RESERV2 +CONST0: JP BIOS2 + JP BIOS3 + JP BIOS4 + JP BIOS5 + JP BIOS6 + JP BIOS7 + JP BIOS8 + JP BIOS9 + JP BIOS10 + JP BIOS11 + JP BIOS12 + JP BIOS13 + JP BIOS14 + JP BIOS15 + JP BIOS16 + JP BIOS17 + JP BIOS18 + JP BIOS19 + JP BIOS20 + JP BIOS21 + JP BIOS22 + JP BIOS23 + JP BIOS24 + JP BIOS25 + JP BIOS26 + JP BIOS27 + JP BIOS28 + JP BIOS29 + JP BIOS30 + JP BIOS31 + JP BIOS32 ; org 0FFC0h ;Space for DPB dpb: defs 20h diff --git a/Tools/zxcc/ReadMe.txt b/Tools/zxcc/ReadMe.txt index ba94bf5d..8fde0ac6 100644 --- a/Tools/zxcc/ReadMe.txt +++ b/Tools/zxcc/ReadMe.txt @@ -62,7 +62,7 @@ wwarthen@gmail.com January 9, 2022 -- Running zxcc under WSL (Windows Subsystem for Linux) was gererating output +- Running zxcc under WSL (Windows Subsystem for Linux) was generating output that was correct but did not match standard Windows or Linux runs. This turned out to be an assumption in a few places in the code that reading into a buffer would not modify the area of the buffer that was beyond @@ -78,9 +78,21 @@ January 9, 2022 Nicholson's GitHub repo at https://github.com/agn453/ZXCC. The most significant difference in my code is that I am using the WIN32 API for all disk I/O. Although the file tracking code is retained, I have - found this mechanism to fail insome scenarios. By using the WIN32 API + found this mechanism to fail in some scenarios. By using the WIN32 API I can achieve the same file sharing attributes as Unix which makes the file tracking mechanism optional. --WBW 9:34 AM 2/10/2022 +- Added a call to trackFile in fcb_close. I think it was always + supposed to be there. Was not causing any real problems other + than superfluous attempts by releaseFile to close files that + were already closed. + +--WBW 3:58 PM 3/2/2022 + +The CP/M BIOS was updated to sync with the latest from Tony +Nicholson and to remove the ZMAC workaround that I had put there +previously. ZMAC was patched instead. + +--WBW 1:41 PM 11/17/2025 \ No newline at end of file diff --git a/Tools/zxcc/bios.bin b/Tools/zxcc/bios.bin index b20e62d9..f2480b4c 100644 Binary files a/Tools/zxcc/bios.bin and b/Tools/zxcc/bios.bin differ diff --git a/Tools/zxcc/zxcc-src.zip b/Tools/zxcc/zxcc-src.zip index 9f6a04cf..f276e7dd 100644 Binary files a/Tools/zxcc/zxcc-src.zip and b/Tools/zxcc/zxcc-src.zip differ diff --git a/Tools/zxcc/zxcc.exe b/Tools/zxcc/zxcc.exe index fa4df35f..3432db54 100644 Binary files a/Tools/zxcc/zxcc.exe and b/Tools/zxcc/zxcc.exe differ diff --git a/Tools/zxcc/zxcc_ft.exe b/Tools/zxcc/zxcc_ft.exe index 9f8c9838..38aee7f3 100644 Binary files a/Tools/zxcc/zxcc_ft.exe and b/Tools/zxcc/zxcc_ft.exe differ diff --git a/Tools/zxcc/zxccdbg.exe b/Tools/zxcc/zxccdbg.exe index 7a8a7388..fc04749a 100644 Binary files a/Tools/zxcc/zxccdbg.exe and b/Tools/zxcc/zxccdbg.exe differ diff --git a/Tools/zxcc/zxccdbg_ft.exe b/Tools/zxcc/zxccdbg_ft.exe index aa6a6c0f..d7224669 100644 Binary files a/Tools/zxcc/zxccdbg_ft.exe and b/Tools/zxcc/zxccdbg_ft.exe differ