From 849ce52592bb1c05d2561a9551bebbd3369a630f Mon Sep 17 00:00:00 2001 From: Ivo van Poorten Date: Wed, 3 Apr 2024 02:50:05 +0200 Subject: [PATCH 01/16] Atari 130XE: Add Intel 8080 Emulator Overlay Loader. --- src/arch/atari800/build.py | 2 + src/arch/atari800/utils/8080_ovl_loader.S | 359 ++++++++++++++++++++++ src/arch/atari800/utils/build.py | 9 + third_party/atari8080/8080.ovl | Bin 0 -> 16692 bytes 4 files changed, 370 insertions(+) create mode 100644 src/arch/atari800/utils/8080_ovl_loader.S create mode 100644 third_party/atari8080/8080.ovl diff --git a/src/arch/atari800/build.py b/src/arch/atari800/build.py index dbed0b7a..964ac813 100644 --- a/src/arch/atari800/build.py +++ b/src/arch/atari800/build.py @@ -122,6 +122,8 @@ "1:olivetti.fnt": "third_party/fonts/atari/olivetti.fnt", "1:phoenix.fnt": "third_party/fonts/atari/phoenix.fnt", "1:toshiba.fnt": "third_party/fonts/atari/toshiba.fnt", + "0:8080.com": "src/arch/atari800/utils+8080_ovl_loader", + "0:8080.ovl": "third_party/atari8080/8080.ovl", } | MINIMAL_APPS | MINIMAL_APPS_SRCS diff --git a/src/arch/atari800/utils/8080_ovl_loader.S b/src/arch/atari800/utils/8080_ovl_loader.S new file mode 100644 index 00000000..552f3bee --- /dev/null +++ b/src/arch/atari800/utils/8080_ovl_loader.S @@ -0,0 +1,359 @@ +; ------------------------------------------------------------------------- +; +; 8080 Overlay Loader +; +; Copyright © 2024 Ivo van poorten +; This file is licensed under the terms of the 2-clause BSD license. Please +; see the COPYING file in the root project directory for the full text. +; +; ------------------------------------------------------------------------- + +; This program is intended for Atari's equiped with at least 128kB of RAM. +; It first checks if the required memory is free, i.e. not too many resident +; drivers in either low or high memory, and then proceeds to load the file +; 8080.OVL. The structure of the file is similar to regular binary executables +; used by Atari DOS, with a few restrictions. +; +; 8080.OVL file consists of several blocks. Each block looks like this: +; +; FF FF Header marker (optional, except for the first block) +; lb hb Start address $hblb +; lb hb End address $hblb +; xx ... End-Start+1 bytes of data +; +; Two special blocks are recognized. +; +; e2 02 e3 02 lb hb Init. JSR to $hhll, continue loading after RTS. +; e0 02 e1 02 lb hb Run. JMP to $hhll. +; +; The loader does no sanity checks on loaded blocks, so be sure it only +; defines blocks between the end of the loader and the end of TPA memory. +; The file _MUST_ end with a Run block. A "Run" is executed immediately, +; unlike Atari DOS which waits until EOF. + +; ------------------------------------------------------------------------- + +#include "zif.inc" +#include "cpm65.inc" +#include "atari800.inc" + +ZEROPAGE + +ZP_START: + +ptr: .fill 2 +end: .fill 2 +tmp: .fill 1 +bufidx: .fill 1 + +ZP_END: + +; Add this to GETZP's low to see if we extend into $e0-$ff +; ZP and TPA are not automatically adjusted before the (this) program is called. + +ZP_WE_USE = ZP_END-ZP_START + +; ------------------------------------------------------------------------- + +zproc main + ldy #BDOS_WRITE_STRING + lda #title + jsr BDOS + +; check end of TPA + + ldy #BIOS_GETTPA + jsr BIOS + cpx #$b0 ; $b000 or higher, adjust if 8080.OVL grows + bcs top_ok + + lda #<top_error + ldx #>top_error +error_out: + ldy #BDOS_WRITE_STRING + jmp BDOS + +top_ok: + +; check end of loader program + + lda #>bottom_check + clc + adc #1 + cmp #$40 ; $4000 or lower, adjust if 8080.OVL starts using + ; memory below the banked memory window. + bcc bottom_ok + + lda #<bottom_error + ldx #>bottom_error + jmp error_out + +bottom_ok: + +; check if $e0-$ff is free + + ldy #BIOS_GETZP + jsr BIOS + + cmp #$e0-ZP_WE_USE + bcc bottom_zp_ok + +print_zp_error: + lda #<zp_error + ldx #>zp_error + jmp error_out + +bottom_zp_ok: + cpx #$ff + bne print_zp_error + +; check if we have banked memory + + lda PORTB + sta $4000 ; "random" value to $4000 + eor #$10 ; enable CPU banking + sta PORTB + eor #$10 + cmp $4000 + bne bank_found + + sta PORTB + + lda #<extmem_error + ldx #>extmem_error + jmp error_out + +bank_found: + sta PORTB + +; setup FCB + + ldx #$24 + lda #0 +clear_fcb: + sta my_fcb,x + dex + bpl clear_fcb + + ldx #10 +copy_filename: + lda filename,x + sta my_fcb+1,x + dex + bpl copy_filename + +; open '8080.OVL' + + ldy #BDOS_OPEN_FILE + lda #<my_fcb + ldx #>my_fcb + jsr BDOS + bcc open_ok + + lda #<open_error + ldx #>open_error + jmp error_out + +open_ok: + lda #$80 + sta bufidx + + jsr getbyte + sta tmp + jsr getbyte + cmp #$ff + beq FF_almost_ok + +invalid_file: + lda #<FF_error + ldx #>FF_error + jmp error_out + +FF_almost_ok: + lda tmp + cmp #$ff + bne invalid_file + +read_blocks_loop: + +skip_FF: + jsr getbyte + sta ptr + jsr getbyte + sta ptr+1 + lda ptr + cmp #$ff + bne read_end_addr + lda ptr+1 + cmp #$ff + beq skip_FF + +read_end_addr: + jsr getbyte + sta end + jsr getbyte + sta end+1 + + lda #'.' + ldy #BIOS_CONOUT + jsr BIOS + +next_byte: + jsr getbyte + ldy #0 + sta (ptr),y + + lda ptr + cmp end + beq almost_end + +not_end: + inc ptr + zif_eq + inc ptr+1 + zendif + jmp next_byte + +almost_end: + lda ptr+1 + cmp end+1 + bne not_end + + lda ptr + cmp #$e3 + bne skip_init + lda ptr+1 + cmp #$02 + bne skip_init + + lda $d301 + sta $ff + + jsr jsr_init + +skip_init: + lda ptr + cmp #$e1 + bne skip_run + lda ptr+1 + cmp #$02 + bne skip_run + + lda #13 + ldy #BIOS_CONOUT + jsr BIOS + lda #10 + ldy #BIOS_CONOUT + jsr BIOS + + lda #<BIOS ; pass along pointer to BIOS + ldx #>BIOS + jsr jsr_run + + rts + +skip_run: + jmp read_blocks_loop +zendproc + +zproc jsr_init + jmp ($02e2) +zendproc + +zproc jsr_run + jmp ($02e0) +zendproc + +zproc getbyte + ldx bufidx + bpl still_data_available + + jsr read_next_sector + ldx bufidx + +still_data_available: + lda sector_buffer,x + inc bufidx + rts +zendproc + +zproc read_next_sector + lda #<sector_buffer + ldx #>sector_buffer + ldy #BDOS_SET_DMA_ADDRESS + jsr BDOS + + lda #<my_fcb + ldx #>my_fcb + ldy #BDOS_READ_SEQUENTIAL + jsr BDOS + + bcs unexpected_eof + + lda #0 + sta bufidx + rts + +unexpected_eof: + lda #<eof_error + ldx #>eof_error + ldy #BDOS_WRITE_STRING + jsr BDOS + + ldy #BDOS_EXIT_PROGRAM + jmp BDOS +zendproc + +; ------------------------------------------------------------------------- + + .data + +title: + .ascii "Atari 130XE 8080 Overlay Loader" + .byte 13,10,0 + +top_error: + .ascii "Error: top of TPA is too low" + .byte 13,10,0 + +bottom_error: + .ascii "Error: bottom of TPA is too high" + .byte 13,10,0 + +zp_error: + .ascii "Error: ZP $E0-$FF must be free" + .byte 13,10,0 + +extmem_error: + .ascii "Error: no extended memory detected" + .byte 13,10,0 + +open_error: + .ascii "Error: unable to open 8080.OVL" + .byte 13,10,0 + +eof_error: + .ascii "Error: premature EOF encountered" + .byte 13,10,0 + +FF_error: + .ascii "Error: invalid OVL file" + .byte 13,10,0 + +filename: + .ascii "8080 OVL" + +; ------------------------------------------------------------------------- + + .bss + +my_fcb: .fill 37 + +sector_buffer: .fill 128 + +bottom_check: + +; ------------------------------------------------------------------------- + +; vim: filetype=asm sw=4 ts=4 et diff --git a/src/arch/atari800/utils/build.py b/src/arch/atari800/utils/build.py index 610441cc..f78e2bb2 100644 --- a/src/arch/atari800/utils/build.py +++ b/src/arch/atari800/utils/build.py @@ -11,3 +11,12 @@ "third_party/fonts/atari+ivo3x6", ], ) + +llvmprogram( + name="8080_ovl_loader", + srcs=["./8080_ovl_loader.S"], + deps=[ + "include", + "src/arch/atari800+headers", + ], +) diff --git a/third_party/atari8080/8080.ovl b/third_party/atari8080/8080.ovl new file mode 100644 index 0000000000000000000000000000000000000000..c028791c5c76a6f16bf68d5732c02d1c2adc05ba GIT binary patch literal 16692 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 ZIdkR+SK-a~ulOSIUxcxS*g~GE{%;x``U3y} literal 0 HcmV?d00001 From 422942bf959ba7ce689805ce6ca7e773f9c0e7da Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Wed, 3 Apr 2024 04:45:28 +0200 Subject: [PATCH 02/16] Support proper ^H BS (BackSpace) handling. --- src/arch/atari800/atari800.S | 6 +++++- src/arch/atari800/utils/tty80drv.S | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/arch/atari800/atari800.S b/src/arch/atari800/atari800.S index 48053608..8004a171 100644 --- a/src/arch/atari800/atari800.S +++ b/src/arch/atari800/atari800.S @@ -753,7 +753,11 @@ zproc tty_conout sta cursorx rts zendif - cmp #127 + cmp #127 ; DEL + zif_eq + lda #8 ; DEL is BS + zendif + cmp #8 ; proper ^H BS zif_eq dec cursorx zif_mi diff --git a/src/arch/atari800/utils/tty80drv.S b/src/arch/atari800/utils/tty80drv.S index 08a9dc24..1ebe9488 100644 --- a/src/arch/atari800/utils/tty80drv.S +++ b/src/arch/atari800/utils/tty80drv.S @@ -680,7 +680,11 @@ zproc tty80_conout sta cursorx rts zendif - cmp #127 ; Backspace + cmp #127 ; DEL + zif_eq + lda #8 ; DEL = BS + zendif + cmp #8 ; ^H BS zif_eq dec cursorx zif_mi From 1931ac23f40eb17bbefddbbe918a2a6794f42669 Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Wed, 3 Apr 2024 06:25:43 +0200 Subject: [PATCH 03/16] First working version. Read-only. Disk writes are not implemented yet. --- src/arch/atari800/build.py | 10 ++++++++-- third_party/atari8080/8080.ovl | Bin 16692 -> 16879 bytes third_party/atari8080/DUMP.COM | Bin 0 -> 512 bytes third_party/atari8080/HALT.COM | 1 + third_party/atari8080/PIP.COM | Bin 0 -> 7424 bytes third_party/atari8080/STAT.COM | Bin 0 -> 5121 bytes third_party/atari8080/ZORK1.COM | Bin 0 -> 8704 bytes third_party/atari8080/ZORK1.DAT | Bin 0 -> 84992 bytes 8 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 third_party/atari8080/DUMP.COM create mode 100644 third_party/atari8080/HALT.COM create mode 100644 third_party/atari8080/PIP.COM create mode 100644 third_party/atari8080/STAT.COM create mode 100644 third_party/atari8080/ZORK1.COM create mode 100644 third_party/atari8080/ZORK1.DAT diff --git a/src/arch/atari800/build.py b/src/arch/atari800/build.py index 964ac813..50f6b388 100644 --- a/src/arch/atari800/build.py +++ b/src/arch/atari800/build.py @@ -122,8 +122,14 @@ "1:olivetti.fnt": "third_party/fonts/atari/olivetti.fnt", "1:phoenix.fnt": "third_party/fonts/atari/phoenix.fnt", "1:toshiba.fnt": "third_party/fonts/atari/toshiba.fnt", - "0:8080.com": "src/arch/atari800/utils+8080_ovl_loader", - "0:8080.ovl": "third_party/atari8080/8080.ovl", + "2:8080.com": "src/arch/atari800/utils+8080_ovl_loader", + "2:8080.ovl": "third_party/atari8080/8080.ovl", + "2:halt.com": "third_party/atari8080/HALT.COM", + "2:stat.com": "third_party/atari8080/STAT.COM", + "2:dump.com": "third_party/atari8080/DUMP.COM", + "2:pip.com": "third_party/atari8080/PIP.COM", + "2:zork1.com": "third_party/atari8080/ZORK1.COM", + "2:zork1.dat": "third_party/atari8080/ZORK1.DAT", } | MINIMAL_APPS | MINIMAL_APPS_SRCS diff --git a/third_party/atari8080/8080.ovl b/third_party/atari8080/8080.ovl index c028791c5c76a6f16bf68d5732c02d1c2adc05ba..f98d64f7aca1f361bd53dc08280653cb72bf61d6 100644 GIT binary patch delta 2995 zcmb7GZ)_7~7=K&Vg>4Zktn44%x^8s;aFcC;;TTMi2nf-{7>yd!52DO}QKN}5F)ix5 z51OL$l^8jSN8t`{*ukPPYCL01Xn;i0=trZuwe-A`x)v(4gAe$;*WO)wbRTTeC-41! zzkA-_d(ZQ}cVE42%e-SdJ6zx2e{?o8UHjp(y>$meH3vm>Jp0rITXsy i{doOQ0` z=SB1xz8bRqDk7G&yXtGqt3Z82$rW%L3=U^sK;h8)|2Lz}Wy!drEaNe<!!>k(#h1Yo zIO3$KBuB074F>rX_``o1glrJkDDh8`P^WToE^e2v@nx_wmAhR}{&0;2PPkD7&%p$8 zl23ATJ$-IuLMc9Fg=Ai~LJF@~A(dAx5U)_1e-&)bs`$Emoxje_1<VQGn^JX;vcyZ4 z`(p_{QGibBj$?*n6EYl|km1;b496!QF_IaU4cTp$W13~^xS%O<95WnKioDb?R9#pt zIn{8?tmteKOZp<qDmp8d5T&J?&0)1dMFCcfM24P38>9NX{-$w#$eY8oIUH;@1aFwb zADWv3MxD5XS(CD-!6la>QcDr?QiNh9T8mx6sV3t$rzfwsjOi=;re&-K+ILcd25uy0 z-MzL5=~+7n@kuRypv9lo4zAKwC3&jdn?ShLP35n+havJ>{7s9_R*LM@;+w6*l@k2e zx)~%lG|52Qpy6bMc-pCx!)-M6c`e@5V!x-NlUF^|$+U;cfA?&JSl>?L1MM5{(2a9* zyKQ?&yp1OQR%5g68!NdQ@s5JzH7`wY+UtdQNsCvtSl>aBO<H`s!&@oAp^h$)eBI#< z7;{TI6IhxS?D}ruq@B>o<v_{`Kueb^6f2;X0cL67$fHLDd9>3>JwS0`La9v5Ne-(e zht-n9YRO@><gi+DSS>Brk1aCa*+8F`X2xNdAr0$j)%IxdEiIm1H&~|&M^Xwo-nRN9 zpQ{8?DMW^RE@wezE}T5(+gu`)G~pSa3uZXy+rEO!RteR30nS028}Y=|McZay*V>0! z{CDwWP2;4Th8MsU{t9(&!U^rTC~&X_D=k~^BHwp4mE~2f3R<Of@fcb%@0|56(%s$D zW*CDLCe4B0*p*n?v_xL+Zh<XM&6BC_)%tL{yQR~-Q>k<(eQT=ZO!u0SDWpn5(%SRH zJw`HEN5*Qju)O(_$40*uSeyk{nD}}gypzk}41aC19KHYc<xo@el}u0~0|b4?Tayu? z7ejRi`i6}oV1$!WIjtqW>st-nCw+8}U+VJ?Kp$ymAZ(MIb(>g$kz$U)^{#!z{<E~o zf>{Y_Oa+Gv@D{4rRwY{U@%j-c6@5PBm-W5%z05ALiP`0kAaU7I);_u5VHx7QYeV2v z7(Feb&%<cHh=eeDMnuzL^sI<ZhtUBMeGx_zB8rC5b0V4vqvw_Q&ygkp9hNRSZwhui zCm@`OTrPR)^yx)M8JuL1pG7bUmgvX^qYHt!U0AMNb4k_?2rvP^(2OO&fI?fC&=}kY zL#$wxOUCO$ql_?wRpAC!{9F<QTmmF?xK)eW8PFv{I~d?S=Z*;5A`DvvX=k=Gllhq) z3~i9b!dB$+{37e1Q&vOZ@{JQgoaYuNPyjDp2*%fd8or6>cOIX=D578(jbC*BtMvkl z-j&MIn`m?kQybdG;Cyt9=?#rDc(FR~GyaXyZOr~W@X>K*|02*7cyTLJKqe3%ej#uR zR?pEdkp%4CBv$?V4yH1<YHDg%Hs3vZ??W@yb)VAT5#z@&NdJY7GlwFKz=mS>(0MzQ v_5@QbEx({hyW<(HJU1-mfwBaHAWl<pmDUK8{oJzft(h<T2dY-t?_>T08LRqE delta 2806 zcmb7GZA@EL7(Oj@5s4E=Yd4@!3M=Kq5el--1>;A^7=svNj7E+2hadAJW_~5c#1u9U zex*}9F2=ic6z09NOfrbZsIkVF*h~|bMt>U3ZM)vxE0uOsNMt|edv1I0Z4c##_s5&l z=Y7t5p7*@(Ij7lUrZ0|~76+_*UOKsyoxlG5s<GP1V9jI{g>#SoWXcUm*|<$wk#co6 z3M)}`8ea*Tev6_R(rUBT7{3Bmd&w{G_31vGdk&onzWaY8nruwO?PU=|<ZfI4;Te1h zG=U;soKEpn+StT|kOqDDvhI*{$0~LFQ*<cPc_|+^ORGW|EKlb*^U0sKp}?F2&Ef<s zAf<#9pXls%AOlJZX%><MiG^fAW+6pT7)X$*%)bgUmlV7vtqE&<B48}|&a|Rwlte*f z=EsskvH+dY6vuSM2Ba%CAYHKm>59+XuLsj5>$FXhW2$7TxWFk<9Mct37kS>^zpaoh zIcq;{RCFnYMJ>s)iY`edj?&UC<*`zsq5#W!Ae~PZb}ne^`gh%-4FzMEF^1j-o$#tL z{H~!Ppx22{8Z{}~4L-G%BfXVF+R7obj^<*Q@QUH_8_Sbd8i%yZzG@t*f%csep@Daj zMMsxumUK3G!9Jqe_f-2slXr*4Dv7hru@{K9J1G4H#{gJCwZE&ju9+gks(r0_pi+SE zoA&`_L#6b#cy%Q{;%uc#PPEX_7gT#ywR@ZumAvSrO6HxE{)clAthJTeL#=~1Xu|o# zLDMLSx6r^}tKMAeU?o*P*M6Y9?4kkAxm;i`s`iR%t!)(9tJ;U!T$KVGZ|eZcmu;?q zzP31=#NvF!teqBK9EMIV2huD6EnUu#SwJZRjMBiBN3RI-Kzkk40L6s`#WFH4T3AUI zR+5F4WML&)SV<OE(skOkMONDFbhlJ77F`Un@1|87RqgAlUEJ-h)rh{dOlDi^KXBVh zAcaDt-)*Za(2T^%gYJDLL{TN4ciUivAKiCt|0Gu(*@oBQ9yB=+Pi!5uZN@vA?wi4X z7jM=KPDvSf0G5Sis@#B+>UB}@K@O~2VrP+WJ9d@DRageCQl@wfZ5cPg&LSR9XNxWj zZkP-YdSlD6j3J2}@if8_r{c-9r(PS*dm7t~nR2C>^wm_zdC$!yONf<-q`C9q+w@?N zN0t>@NN=TN+vtCV8Jq)En7BLdxrxu?tgt#&jvm;Y4i&XhNd$Fd!9m}6HW-O?VW@6z z_kex{_;@j$S6kwn?t1Wj)J@O$#co$G^pSc8!ZFFS$AkrZ#Tecm+jz16m{wUgDnW%Q zpl}^tp^9x)!X+Q}_@GpDf5@*rUDhMqNc1so#6O3kBPYY=sdZ<XBXzg*1%wcKJc`bS z&=XPgX$U<TMUfDCDvIVq=x`LB3!$f@=(7-dCW;n9=vg`b%bY!ePKZC(U5%J=B7$&s z?o!FF)7@K`<ZvpC{9y!(V3CeY+K5ku%`gVcA8Ej%KM+B|qg?P9%<w}n87q7$UK^a` zBK=s2Y+%{Xr+~mGfkKCGsP;_`c*)>f9QYy7H3-Dh*E|U)AcYnG_+&c!Z&g)wjkW96 z{iBD*?){j4T*-%u-+`dS9ly*)!oiq1c)<+YBXh;=5!Pk#U_7g)xWS|dsZC4(xliBA UJA3)6Q`Z(gS9+^=nBV691G6rldH?_b diff --git a/third_party/atari8080/DUMP.COM b/third_party/atari8080/DUMP.COM new file mode 100644 index 0000000000000000000000000000000000000000..03a77c3ca8b8bebcda6664c086872b01db043691 GIT binary patch literal 512 zcmXX@L2DC16n<~bu4H9*8)6LA%cPr&iAY)`)lveLL<!Y2ZPH3Xs0g0C^<uS6&BcT4 zLA-nN4=D7|TOhME>@18>AyNbnIV6HP70IEO(YK`!-p4oZ`##<blL5FllhS6NXtImy zAHRW#zbHSUzlx>yTvE#b4CQAW{9MI{t&zjaD7R5=qC<l{`2kzhZi&ekxI@f$BRQAS z&cv{PWM7dwbdLw;T-&-hlq@orOad`-l==NV_6oj-z4>S|aj0YqPpO3+r-)ccYO2i- zP=3S1@Brt<)-_m+Zq|nB{X_9(ZVwVq!FD1qEsglqi&YP*k1DLZ{<zLIDr=4EN{!9l zzLT}g+6t@I>g!E*Zm6$S8kJg;kzB4ema~5{lcWA{)7GRhH8}2`3dI5y57ezdS%G>R zF6zRzWD0DPK*;!IWraCiW+7YxJC^Z`B6BU?1Y0Nmiu6d@1~+o~&tSnb6caxR$~@_v zsi_m6vP(c(0ssLh6W>=X{0edhUOvA`MGu}HUwW-#{3G07-qmA5z5|}qMMj6BU-apZ xW(*MNbb53*!t|&h#yQUz?{@faaNl%-d_HgSUtkF%)=zlG^$yq2P3n9C{{b^Cz8e4l literal 0 HcmV?d00001 diff --git a/third_party/atari8080/HALT.COM b/third_party/atari8080/HALT.COM new file mode 100644 index 00000000..37ccf793 --- /dev/null +++ b/third_party/atari8080/HALT.COM @@ -0,0 +1 @@ +vÉ \ No newline at end of file diff --git a/third_party/atari8080/PIP.COM b/third_party/atari8080/PIP.COM new file mode 100644 index 0000000000000000000000000000000000000000..4b2ce4b689b9be798eec94cd4275aee957c8bd07 GIT binary patch literal 7424 zcmds6eRNdSwZAu$kD1AQWHR}jWbT=pq#zdrGKQ#kk<pk8kdn-V$wWm&{GerN1w>by z76jrKwAK$0M6Eyw1Q4nyC{R!bxEIiya<z^%Z*_d{wJsN|g{gggDpnDb_uFS?fUeg+ z-(PQ5);)Wlv(NrI`|NY}iT+-$Aqe>M3H*0OTclH+6zz_yU7gJ>;c@@p@jxKZ678HF zYnwhJ9=M`qT%i8itFN69Xl<L`7H@73#KK+S=2**&34uUoTW8?LaI7m(KXHmh%ol~a zx;o4b1iHF!fa?NH6V(Y*L(X|~=E8+-vDVIbtUFfU9Sg=<WAJBtXS}<;zB3kS?}~TE zJG(pUyE}uO-H~{Fc1tYY-BRBYjYPWJ!_jF%Yg^Y$NN#Qogk!O2td8S1#oFTGOb66x zn>IUxM56IPbD(8LbF8@~9*zaN+9EUSXg0y|XlG|zWV+K{_rJ)Z-LaN%UGojmSUlWX zcLSt#f<;FdJnGsaH#WDowFbJoz$DV$aRd5d;g)EuH4u+R1MShs^oumyRdwM=Yalu; zFs-dUJR#5$Z@==E>*`u&gj;5Ib$4VG#dPq9r?Clv`0UOwtc-WZB7tZuJ?A3RY0+3m zbG&Xw_-1$+x?@3TZZtMKz~hp-NLF1-w4<&o-W-bu$iQjQ?nrChtnRkU(U#^2jkUB# zyTXCia96x7(j0G#M$!x}?`Z1^#3n_t`r&rCA#la)Ns)2a)hP;1PxrMd3Mqu&C2<r# z@NwWuxCo*VGJ%%PNgaXU#K~k>BzzN`2!jIA&Tx!No><o%A$LxXwA~VJy<DfdjIw;S zFM5MQFXNHSIIZu+;jS>P9Gp{E|Ak-d6;4RK;wj0ju&bw}Az?`D3vQRpcI$8`U_R<k zexECL<eJx7O+hfrY{8?FM-W_<W}Xnd;KzLPdY^h!3LcZ>#jH^n&;R5dQlnVgD9B&> z8-?1&5p}!7lGF2Cidk(n7u(E<Ryo2NM<H%R&~D39F8Djl+em;sQ^G6@eFpFWH*u_F z28z{P(uhTSC{M4;Coosj^VIdMDL7Ly9ey!COOi7<kZ0anp`P=z<iR}gR>AyRwfXZZ z{b(Ms0ld$re_Q|#Lpdi$`{Z-}11vd2Gt8~k|HLR)%gZ-^S#6%I#>5knOd=}m=ASQd z7|GG<@=Z^%`jRx_9IVQRW;B5d;Kp54d?+U)sU=_R$u(cK$$2o1%*fGh%O}ZqRmd+% zjidUqd~h4`_Dwn$%0thFzDdVs>}APi`QjRyhry}AZPJKadpzHKzx1NnLn4ehM^l>s z@F{!p#Z6q)PSz-@I~hwR3eu~To+am|RT#>_YM+C@AgP}vKj$_iGU|A_r!2%gWKZh@ z#Wp}fKNsRH5MSeZ-NwN0Ko8e%KteO()g~7}MSXbzVI|u21umZ%cBS#5ygs;K2TOJp z$TyLGu*t41Es*CDau-8PEG&@kVvSaH9w8W+hY|B$pIKb_FRY%BHQ&k2Pb>FYf%sO& zX+zW>+{yIU^GTFjdoQgG6eL{GJ}z(xW_=~1G<ZtVOY*+^nf!%+iTp*uY2})nvxfW~ zfX1A&s!cRP=gl2{{xN79Sg;K^AQB+|R$8L|RywnCUYX#^p&pkL5%03&W5};a_l;kI z&{tlThF!MoL`N2Iat^ObOO#ioF~YFR#qqr~NqG%3+`xl-Btw3kckM%0QMPM8?|K7W zo=g`hSDYO_$cGPL*o!VhKE(0g0WabBn;bt3yp-c_bNnsfWmy(Scvk{l<(x$4xCUGz z+%qb;0({^&3^>jW;J9*B>M)tjP>!Wr`6Qos0uyCU|1QVh0baxLL5>^1>p1><sj=7d zdkH=yF|ewTcmITuU+!VUh${?)93P4y>xbgUVnIOxOYOGln{6Lk&a5=#B}8aWvMKkm z)(&Jbmr5%Vz(?(1!TXsSVe<Vfk^06apORES$^W(~_p>pAXiByS$S~TV{eec2jMN-+ zy;a>Kjf@U@?1a5;#fs{#JVWkb4~&PX@gE$+_an6j*{O$tE@D?6V5gOzvSaohK(#dw zFd(%xKV|w@yCDlg%_d2)z&l8QSKH*DBZ;ct`Ozj)3A?gM8dgN95~{DVQRwT|;4iQz z24AtOXvM+j?Be<y<OUGd^rdMVeV8BoInxi?J-q@3Dj@;<8npTLv^coKa23e?l6jAR zc~kH~sHuIN)}>!kW^!F9ea*AUOG%vv8QMguzEJ6x#6f1OS<aN@<WA@WvJb6LC{QR4 zkRl|qA0qoD%xTcRw5vZt_Av@cGG_M*nDkFvj}{V->ul+RXC+f+NVPRHBzYN0UdD!c z`{b1j$zp4vvW%9cSFoYm(=VMi8~mirG5ZEOvQ{!oY0wuIUeZ8a$yn-8p}3zE<Lb0= zVINwFnk!_;y=;lv%SHmJuL^NoHG~AY3qkNzq1wfO6J)3sA@~qewn-iNg8Uy2o9(vR z8;8$|qkd>%KIKnUI?Q+N8Q*|c55QU&tLHiOCdcJ}qDGpaU+HBX=9vOOvPEd@)t5Lj z;L%H9rWd4?4)PG@8JZ$}OO`xv37nh;Gvv9K$OZlVEV+0Iw4}idIVCG_w>u^}>KzS^ zs~xJN$uZ5*>6qjAv15s2rQ>nOvyLr}J&r?;<Bs<o>O(AOK_Yn=zI&LB*amBy%EPee z4~6<7XF7v7T;B7gKllhkMpqv}7|n8~p$+KMRj2$2!;B3*a6Cqni>PA?HYj+_b`p1| zw#>;d5{CRJ<UPuGq{#QO9X%}hf)k_;r@qyRfs>P?fDQREkUhrEe8cdInh!b&aT8$3 ztLTWC%Z5Y>nR}VKn5`NcT+Gx(>^)&@a1m1%a$q4-7Q&uwPGwQLS<D;E91*o*7m|o0 zBe>j!Tn?dF^W|q&27kpoy`yHUzh*U~m{`pyLQgBdV#ByUpczBEz>pt@hTYf~vt8=r zY{a3>b{Xmp+>v&r@j<lnSn$`h)1P;#Xhp5pCI6Z=PF271PYr(M2b@Sf?~=d51<U1t z0&w44xNpE^CY*Hr64Y7Xe~S1GdHEr~Eq%A+2mL9RSpkt;_Mg&Rl*eJB!%2O1?Q<8u z!Wr@tQ1l5lbO+r@mIC8<65JF#ZgiiS7kq-DHRLBj_9Po>CbC<AWy!8_qx<VX@JWW& zPzR)@XejScYN1=biOI9rfpg|^8&_zd+w@vTeA;|>$Y+TEmV-<k@*46QS}yFqr<gLp zcVD<DyZgTPdp7ai_ng~|UQCoLf=@G~yjr9@ePNOLWdU#kHrUbtZMR(gFK+Y^XuSkF z(qQ&f$6E54y0z$E{)uP#R!*}K^k7kjqj(9lWIz}p5L>z<q?!KG{fhg5`-pqc{gL}G z?!UXgbbsys)_uV}>dq<3E3y`OimHpo76pscr)Zz4ajfJsMYyZL5Arst(W^X-wF<jv zc$=iI!SKHqskw-seMRa{ToQL?uJLP_{&tc2G#j#0xUXRuQaGJvq&+@VL>?C`NKES8 z;51AVxb^CMpy!LYu)iT%<^Z*MI9lp9KxH84&Lc%$;Ze`~n}X;42-6>ULUscjG4u_F zrg_jz86QF7#Cf_RxR%NP@HZIdR5w7ZcifYvy%Vv!+@stHyI%3I<Wi4%Cky_=FW*V0 zz_$qbZ~Xc$518H#!tEaA_6*@>4|-57ocA~8gq()DmKmVq%@rO)eg<**tsl**o@iEu zbtLys9_5+LArIo7kZ8zjnYxZ8w9h>9xBdqGzo=;xLV|%C!qgyc38$n)%2Es=N+dHg zV!|!v7oH&QxB-n7>z-mm-ar=)lon8G7q;Q}#(=z=w&QNlB)f{KEz~-S>BcXZ3rh5B zim8f-uwVyMUc%9PO$kfhS8N_DrRh*>J(>3$KA}o9iPW>j%5x;YliBz{gSNC-{+h&n zgAa->s=G*HmRl;tg<4aIVuNnuiuPWy%WAGJ(LX4L0%`sA-Mo@fwIf~>R!BR;Acm@< zHo=R)?JpT>o*G=wq9Na*WWLvc%31cwabDs&M`K=dZwX4DDWrI=q3`t)1IyqP?Bjmc zI10T&CGu97@S0cNLhHH(j@<&DmbJ(mz(BT&mMNZtl(_{f++Xquo$WkBtnlhHy&yvI z*Y70}7HAH!8?s{6tqcocsQv7uCD_j(sX=S<a+Bw1ZxNN=P(msR+PhE*F0zv16SbU- z52EDzR1T*pO#L-IRnabZap#1$M!mFLA7!j{mRx3S4)>Y%gA(-uLUlb;o`rd0KtPK{ zGW6|;i{G#%@{6>Lb~K69{1W9wTE?~<oBA7s-P{t2!55)(a|s3AZfxV-61+h?peI#V zBiCuGN+`5Ixe@FTLe~KRZ6dj)gtS{zV#u4=5@i!u4`XKK3WH)pOxJ$tr3RxRCqEGY z%;oOg%Tk9+slPe68S7DbC}|-SL47_OA3~{Ur5vFj<b+*W2D35@l5M4Yqx7+~lp$Z1 zf@D#>n7Y1HuPM!h+mjh!XmYR*5^aZ)ca_S0$oBeWBQNlg)RU!3AM7!s{?p0}0FK#) zLHdAxSE;g@T!@{Z_OTvyGaJd*4wi-(Mia@srD7RRYJCik6S|f$gvY}??Y&a+UXvkj zqa_)OCXqT@iZU?l0^FeevDA=v@fzbLc3QHCld1kk4ae>u&#(E)%WTC+-Qd+_075Hw zD7)D?G{<Hf8XQxG<pW+@vzuYCw&rD~7nEUfO(!J^o~C1E;wH({N5@wmDa4&+$gjeF zc_Zb8rt;u^Hlhx`P{wf;h)-KrCeE<XLkvGDpCX=V>MP6jAC<}bVTt)>dGHOYncpcR z9sqrVhs#V5>?%`VMgBfcvqCwBdAz*lAS3bvOnn1aDwN2Ok9+pt%j7rM6dHM*=^vJv zFPDS!DrAJ5a`9G+SzHcooRzyAhJuy6m;A)LCX|y6g7R9r)-u#R5IMD6-b1R<g@aUB zT27wW$M8sS6CV=w)^cSdYDTeLvZ?#9k{c2H8>NwG>SyJmLNd`yhYHzrhz(7qfJr@5 zt`cm}x0$XL$$@fQ7Koa9PTCD~dHHJmaLFh~02&!ndJGtcjdlCo$b$3zr-6N9-sm^X zIc34ah&b_3Dp;W&PTvvbo8gmGb%p#U-9$D@XcIuyH(3*9DkvPGka-g!bD<p7e%OUd z6({pyy0T5GF!WS8mHb)j8tY&qmQef&U&x7>wY-@V8sgIwutuf=^K9l}_kC$FPeS~i zKokxzdZe3-7lz<uNv)^0UJ|!j%+E@xh<e>h-%ry8s<y8}+)n)D>4>OowKF=3G7)uV zrsAZMa*-AFpn3;G3NDfgc&`0xg}et3QoPXB&R2-P<9x<|kLRdGbW0|b%9WJw{kUe) zNl&M@TqzzWvdkGhxl;Tiw?=*oXYgBC_i&}^m4XeD{=-VSfzBs>V@6=zL3l&@f#`>o zc;lg)^Q9{Ep^QBbSBjq!NAkjFrSer^LFO*X)Z=F>;g|xJ{IpX2G0MJ=Dn*gMT6(Qf z9MdDS2a}azE$^9V6|c&@=rRNAlXWTa%jY#McjXDGNW7XhzSx+h|Jq8G^Qa${b7<6T z_KzQyzw<v}$b+m#ltkfr4~EwHQ}sT%cV*3}U!UrOmxh&5e<d(82RE%j=E)a8;}TDs zi+BNxnI2*E6I2a2X&3ox;MO!P?#t<oIg9NGz6}>X>@&-J>dg$#W_Y<==QC5~`hd?= z%UEi_#}8z@v90r|M7!6A9f!wRgC1z3biKekqlve@1R|Nv;!61lVtHJZawL;PS70q_ zs?;NFD4*wU0IqcIK1ZFN%iz+>;IcH#QZ-e?TL9Yz&G4xSC^4@J3Y+&-vDEA;+|mh3 zc2p^S5|zhYRqzV{EVq7D71Y%4timIolEBGdUulS=qm&}o`S&9?@rRP5tmZhoEO_~2 z0=@FCw^Dp-3;{bd3Tp8v^JwfGrB@!$$Ey?#nOI}yPOHADisGH#aJ17^A;ANdFZ%au zpHzw0(t{zw!Qj+KiQO3sWsueL$^^Mrs635;K!{Y><*|sqYzR`A@b_Wt$bw1o9ke## zYUMa29%muZTng^jRf{b=_}cgz@k3P<cJfIqMW_%>BDK0&IZ5j<mTt-K;5}lnw^}`k z+FJWXwQC~Yp_F&v7Cc9tgm-6E)2>^OUH4)&e+RcndVe)8A3+N)Kwsna`{io9YG-JU zq-kbK`Uy@m69wo|Nj)Yd20y4a@Y=4<loHy1(hR!T(ZTN={G6k*!Jp6Yu>I$1*my#D z7nxm>;Q>628)P+qo9E?p`URQ?LqAJh>8FQyTx+Au7>4_XeUB~n`kq)|0A99z@zQ|> z2EC$;J3VgPF&ppPzj)~znNFuR-_M61JjfO-XN#TMB0r~jcJb1U3k+o5Wos8NeSU#) m_wA9|X}-1K3}o>b!S^gcP~<yiIJI5=Cha9Z{#E&Z`THN^ug+lr literal 0 HcmV?d00001 diff --git a/third_party/atari8080/STAT.COM b/third_party/atari8080/STAT.COM new file mode 100644 index 0000000000000000000000000000000000000000..60c548495e1f72c03bd60a7794a3dd827dda8c5b GIT binary patch literal 5121 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 b2vvuMEHu)^KLQ9kas2q+2jb6eDp~&v^m4gU literal 0 HcmV?d00001 diff --git a/third_party/atari8080/ZORK1.COM b/third_party/atari8080/ZORK1.COM new file mode 100644 index 0000000000000000000000000000000000000000..8a7bec1cc6002e4fa5ec55ac633be1ff25324249 GIT binary patch literal 8704 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 O6`a-o!We(@(EkJ+CiOf3 literal 0 HcmV?d00001 diff --git a/third_party/atari8080/ZORK1.DAT b/third_party/atari8080/ZORK1.DAT new file mode 100644 index 0000000000000000000000000000000000000000..b2eb461fb7112e03f8673c1443ad902ea020c955 GIT binary patch literal 84992 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 LrmXA#>;L|L*_f`( literal 0 HcmV?d00001 From 17a2d2f30357101c358b75837a7ae3ecc8a2d864 Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Wed, 3 Apr 2024 18:45:12 +0200 Subject: [PATCH 04/16] New OVL with bank overflow handling on READ. Add 8080 CPU testers. CPUTEST and especially 8080EXM take very long! But all four pass succesfully. --- src/arch/atari800/build.py | 4 ++++ third_party/atari8080/8080.ovl | Bin 16879 -> 16887 bytes third_party/atari8080/8080EXM.COM | Bin 0 -> 4608 bytes third_party/atari8080/8080PRE.COM | Bin 0 -> 1024 bytes third_party/atari8080/CPUTEST.COM | Bin 0 -> 19200 bytes third_party/atari8080/TST8080.COM | Bin 0 -> 1536 bytes 6 files changed, 4 insertions(+) create mode 100644 third_party/atari8080/8080EXM.COM create mode 100644 third_party/atari8080/8080PRE.COM create mode 100644 third_party/atari8080/CPUTEST.COM create mode 100644 third_party/atari8080/TST8080.COM diff --git a/src/arch/atari800/build.py b/src/arch/atari800/build.py index 50f6b388..e7ff3bde 100644 --- a/src/arch/atari800/build.py +++ b/src/arch/atari800/build.py @@ -130,6 +130,10 @@ "2:pip.com": "third_party/atari8080/PIP.COM", "2:zork1.com": "third_party/atari8080/ZORK1.COM", "2:zork1.dat": "third_party/atari8080/ZORK1.DAT", + "2:tst8080.com": "third_party/atari8080/TST8080.COM", + "2:8080pre.com": "third_party/atari8080/8080PRE.COM", + "2:8080exm.com": "third_party/atari8080/8080EXM.COM", + "2:cputest.com": "third_party/atari8080/CPUTEST.COM", } | MINIMAL_APPS | MINIMAL_APPS_SRCS diff --git a/third_party/atari8080/8080.ovl b/third_party/atari8080/8080.ovl index f98d64f7aca1f361bd53dc08280653cb72bf61d6..baf2d437f5b1342ea5b4828dae8ea025f96fccd0 100644 GIT binary patch delta 123 zcmaFg%=o>Taf68nquFLtkxLSMoO2d1wS7}qFnigz7Z3P1i|R5nG5SoF)R*UbKO0F# zYO<TY2_x_1Dt$E_UM>i9%`MGIEXglYC{HX_$Vkj7Nlnq?<#G<t_f;rMEh<(p(lg?n Pd`w@Ck$3YGeQqHDCBiCq delta 113 zcmey~%=o^Uaf68nquypykxLSM%ySknwS7}qFnigz7Z3P0i|R5nF?vpx)R*UbGaE@p ze6pLq$>eH%H8n0EaLp~vNi4}PQYcR>R>(-qDM?My<8ltr_f;rMEh<(p(leTTR$p%O I8+~pe0Mdmi{{R30 diff --git a/third_party/atari8080/8080EXM.COM b/third_party/atari8080/8080EXM.COM new file mode 100644 index 0000000000000000000000000000000000000000..76c1a3470bbb443aba17850a41179187d5bf02a5 GIT binary patch literal 4608 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 HzmxyJOaG_( literal 0 HcmV?d00001 diff --git a/third_party/atari8080/8080PRE.COM b/third_party/atari8080/8080PRE.COM new file mode 100644 index 0000000000000000000000000000000000000000..a1803cebbbb98c23c23a12250b1f4694444254f6 GIT binary patch literal 1024 zcmdUtPiqrV6vf|rcP6c&&7?)tWrm6iHzqaJSmK~tR}v7R8?AMO+SW=NGyz*gaN|-C zaUu9G+Pd`vXeKS#;DA*tQoCrRQ>(aW#Gt6$dheSEet>SA#XY}!&YU}o#F40~LZI}7 zsC38+8~%1#5u$bpWz}Yyz^&EY45?dCFVELf(-17oHhS*@D(dv!12kCg14dXM0JgH0 z0HdrA0ozy~0mfLT0OO?gG)!WN;W0s$ASF!uh79KDQ_jY!g%){E9|51S(A4vao`?0k zL(@)o2IT^F5*9Jdh7>`4>AkGvpk}`%e)BQph75G}&d-6ZRG`C`yl`W&T`_Xu)eemY z;g>F@@4O~n*%R_Xs&cl*?;oLs!)0FB{d`Q9+52!(;~~NqLt*zO@yx}LuTqt>=Ulx` z3y05mVYhl)m)Y~CG+rkB{Uq!jC;s*{WS^>>{ov{%EgY`%!tT#Nm)ZNeuJOD2M4?lP z7?$b%QrI_>gGfAUdM$uwnT0Jxm+5T-`U}uLfr4g7H^jF1rl21ulguO&N5|aZ!I8mp z{bR*M-W|`6Ck94G&JVkJcV~H*QLyM)wMHlXYfxxv@gJ|)^qh8j!HLqKyN%g}Af`^x uM{4us`kXQ%t<knvTr{6j_AhO!CR5#e(>?q4XAbnA8aVBq+0^6z!LdJl`4ve3 literal 0 HcmV?d00001 diff --git a/third_party/atari8080/CPUTEST.COM b/third_party/atari8080/CPUTEST.COM new file mode 100644 index 0000000000000000000000000000000000000000..dd535a4790557bd66431bdf2a7347453c4d21c14 GIT binary patch literal 19200 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 literal 0 HcmV?d00001 diff --git a/third_party/atari8080/TST8080.COM b/third_party/atari8080/TST8080.COM new file mode 100644 index 0000000000000000000000000000000000000000..d16eeb835547b58a0f5a5c99ce7a211af1196dfc GIT binary patch literal 1536 zcmbu9dr(wW9LMjy3kN~i1<Yl7!Cgg2tmSDS=)q-oSvP^DeV8#Ny&u$=J#>xKuBD>( zz{+0s+TOKRTV~k{7g)L@JFKE3j56i`EoA8^I8a1%w%_jpGxc|O=AQF8-{1Fl?(h8W z-VN;IE3HPm&1iE}iUx<nX0#fdW`|gmQ<Rep!$Q$m?GjB^gQd#ma9WKCapDTI-C?y= ziMje5QM}4HU(8)pl#>vb-gQ<T8;a(RwyOo0+DAimd~L|d4~JIswE-uufoo91;>O*) z93$tn!%n!h)gjud&31zmwlq|vPpQic4zb)|tuUK(B3x#>-DVffE3M8Y>A6iYIu##U z&JS|I03Y&@W9>Npb_B<ZT{yOe`JOP}ALhryeBc*UWYT&8=bkaXe~iEQm!hrdR|%kv z#|y!D;g|+l-aMXyb5Im|M4^AKqOqO@idG=>7YO5p$c*c;2|=5{MqzG+IRc9wJBAL& z9gbr&gR79c<GVF%C|HMldib;&cpdVfi&Y0Dq~D8KeQ+nzc@0||+^s~pQyvobkO>cI z!$$?ZsCK)Ld&oHt8S#(~P<I5I6>lUQ64=RLmI^Fq<iv9)1zG3??v=%f0YQ#B13V;4 zBg29$jRB9zOOO98$V-QSPsoj@VpZKjCvd0yN84<b%uWCwlKBpuO73h1Zk8>~atMIB z7h9s1C0t)~`~4f2*lxVfTz%Vy8!oA<jK9?sz4EczD~z|KSKRBGU4QpHXW2bh-+blr zM<2N6&YK+98P+p59K%O=wMrY4s>w*xmr9$Tcyi0u1~vqNUC%xL!tNK@dcc?Arcwhq z1+6MIDkEA?wi8K`c1Y4rNqS0>o|dF%B&m@VP8(k#5$RQFkMx@Ky7UI?os{2V5rha~ z>Iv<I)W<VM^nTCV@4Wlo`yaA&h+rv#HY#;SMxtK){EK~G?*HllE5#Hpqfu}B=wt8R zPd;Tw&<Qs&sm<E*R7(cY`_~YzoSMD?^+7dPMa|y=J*4GU(DLtq9!}*}QOoy0kD&Q3 zN`3%di@cipn}88%p8Fu+Hg*S$zD+D|O5gMn0G$3=mOlw^vJk)rxS02~a^%lgG_0<5 z6)fDwYJm7ia#AE&7fDvlnoDP4Sy%=>lyX=amV%F+dHDjG{GV{--{Cwz@fG`t(zUE6 zGRIGfn}`JzOesDH*sLJ+g40y#i(_60EEX_lFA#Nu4v9$|ch+~=<lEk|6$2f~=$RTp z(7E07>3J*=%hI`Ad?XS}UGT$Jigqfh*PE1|e<}TG+ExhRQurdMH=DU2?Lek7(d`YH zY#pq9)SC$wmZ<O^WS~M?76VB!7>R|o20+8gfKpOWn*o%T1`Z|w@de3AUN02n`>|_a zl;=1&i;m-Hvph81ceDj;U<xar<YXsl0d|mjvEkTe>Y6SW(iY8WBe?-mQj%XnU3o1e zJFk_rU^BBZNf#i0>hj$sB|jIp5~W+kEoAbgyRZS-xKmaenD&!jb-VDdu5VyNsD|&` R2txo0t49sMPq_bk{R4HVdRqVh literal 0 HcmV?d00001 From 46bb07449068b4a00080d491edb67ce42823122f Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Thu, 4 Apr 2024 00:11:31 +0200 Subject: [PATCH 05/16] Update 8080.ovl to latest version with WRITE sector implemented. --- third_party/atari8080/8080.ovl | Bin 16887 -> 16966 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/third_party/atari8080/8080.ovl b/third_party/atari8080/8080.ovl index baf2d437f5b1342ea5b4828dae8ea025f96fccd0..d786f8a37094e952f89f332921265f08702568f6 100644 GIT binary patch delta 447 zcmZWmF-t;G7`^XNCN&f(Avq+34M93sYq;ef2%_mNLJs|aCWX8X=6#}X{E9BZ72fb9 zkfwO6rIXMfc=#5b%m%%$sqd*o)Nnt}J>U7x8P4oh=@gZx<FG>8C*jvf=ms+O6=bvq zu`lkqTAIej#^zBeUk2)OqHz)%19g0)AnNA(su`UBh09fBaHE;K)X_}B?toSB3?UuT zk#PGPtPEy~j?6DQ)P#!yF+hnA*?iUjbpuuh+{eOT>J8v4=-Nuvpd?#$unDK0O&*!@ zE@ac=tA1nvhmet6flA@!2=%&!{!XiIoF(@1zfJyo(CLrMUxO&74HrpG*|SOdffRaM zGcm<zzUC)Rd_;<lX5GO$(}7B>0*9;$)C<Ui#fu||SUO}S3alz*J>2`mHG>6{Bdlt? qB=*(wOT$S-BOjnoz~ro>vNsi5_=IH(p=3OGx~!y~PCjp|27Chp59$K| delta 367 zcmYjNy-EW?5Z+rf#H0{3$f<<^(ITK%L~Zg*BA6GjKZF!1e1-(frdutpa|G9u6}Gq_ z1j{RprVIE2A=f08*yx^>b1{g;4Bvb|Gcf(O@pWN59;A$;-eKy+T+KkuUx%9Q5`XDN z(9UOCILmvTW)4^&h%HE302@WfKs0C$sfy2L83>9DDz@5SBU=%k2VTG!LN;Mj84Qy= z2P(^^>YGh$8K6Oq(GtPptXBYiV_pT+)6dtc<bqhht=((|I=Wj0p9mKE<dz$6Qa^-Z zF*+H;CbijUF)hOeVd0=PT<cbyll`sJe@o;CrUYq^Y%dQ9UIM1Q0%Uj@SQyj0e`R_l zsB6@{GSowqBjUUWzf6PhvXij3X)Nhj)~0y}mo6y5`;@;@{MtRtzjkKr#NX#b@5*{w Hp~vt8Z>F!j From 52155ae6c81a065552c62c8b1ed25c0408d61aff Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Thu, 4 Apr 2024 00:36:03 +0200 Subject: [PATCH 06/16] Exit with WBOOT because the 8080 CP/M might have written to disk. --- src/arch/atari800/utils/8080_ovl_loader.S | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/arch/atari800/utils/8080_ovl_loader.S b/src/arch/atari800/utils/8080_ovl_loader.S index 552f3bee..9f683fc4 100644 --- a/src/arch/atari800/utils/8080_ovl_loader.S +++ b/src/arch/atari800/utils/8080_ovl_loader.S @@ -251,7 +251,12 @@ skip_init: ldx #>BIOS jsr jsr_run - rts + lda #0 ; be sure we can read CCP.SYS + ldy #BDOS_GET_SET_USER_NUMBER + jsr BDOS + + ldy #BDOS_EXIT_PROGRAM ; warmboot, i8080 CP/M might have written to disk + jmp BDOS skip_run: jmp read_blocks_loop From 8b69656ab7f1856aea2050ca5ec26f81cf708030 Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Sat, 6 Apr 2024 22:05:29 +0200 Subject: [PATCH 07/16] Update to latest 8080 emulator core. Emulation is 10-15% faster than before. --- src/arch/atari800/utils/8080_ovl_loader.S | 2 +- third_party/atari8080/8080.ovl | Bin 16966 -> 18620 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/arch/atari800/utils/8080_ovl_loader.S b/src/arch/atari800/utils/8080_ovl_loader.S index 9f683fc4..55da4376 100644 --- a/src/arch/atari800/utils/8080_ovl_loader.S +++ b/src/arch/atari800/utils/8080_ovl_loader.S @@ -65,7 +65,7 @@ zproc main ldy #BIOS_GETTPA jsr BIOS - cpx #$b0 ; $b000 or higher, adjust if 8080.OVL grows + cpx #$b5 ; $b500 or higher, adjust if 8080.OVL grows bcs top_ok lda #<top_error diff --git a/third_party/atari8080/8080.ovl b/third_party/atari8080/8080.ovl index d786f8a37094e952f89f332921265f08702568f6..b58895f5fc075b47fa6219ebedbc01eadf9801eb 100644 GIT binary patch delta 5986 zcmb_ge^gWV6@Nj()Sj-`iXsR^un1L)4XC&tJKM_9S?g)n(=+?)EVELfvz<D7wspD} zNM7Cx8X$T6P$7my->X4UqISow#&zAAiO2S2y0bslwZ4!MlSvH{MX;;xe%~W`<dGL! z97nE~`}6a?-+RB`Z{pD_PMa0oWz+FHCtcyGjg!{Cr!_I!K-ilRxEdHpe}KK}#u(z7 zNpaDQvBbb;?11Sn$<zneYPGH~;g^j7%H9M@T!=4t2ND<vdhqU(RSM1_Sv@!h<&^k< z;N350FaX|HWR>8|_M!^?8_EU6VmPy(K~+PFKBTxDQv{+4h!}}R#K)Byw1ZLYI3+uX zVqPDO88Sx#5pPOhFkT!qM-rtP7Yt=8_!g<?FEf_o&K&Fz;e%xb{H&kx70=JXL{T5x zClv+QfK(J@gHln54M{|75Uub(!U|m>;zr;GdxP=eV!}FeD7w4=$8r*XPcPdmh&rQ) zJu$?hD27-R#Sn|47~)Pm7AyuiW;PD8hlh+13pQgAdt!)V?ywDsCS&Yi_yf4yWD4zj zx8abVEWuxPK1RnQgv<7c5Fpmj<GL)aI!r{|JXklEEGiSqtn?EhCRo`^1nF}#e~ZV) z%;hJzXb;4VnJXYFAig{*)cdl@<HpGqAwt5Gy(X0hqZs}lspziEt~8<ZY0az^QI-|i zevwsY#SDHevS+fgphly!!}N-!j^6{noT5)o5s*^^rHb5W_K>L2i0SEfvX@6!b}D=M z6gW~09CT17-JSD@;t*XtTMhJ8o;L9G<Jsy5qgG?$q~$CH!zXf(`PQ5=pe#>6=V^K_ zl2q{Y-Q2Q70Y1uI1}3+7laf4j3`seynuCxu=b_MNdHOX^A5|qpvQ34MbgGc~7pf&d zr_Vw3nK?`Dj{;|WKT@ory?H3`2fTJ*&XPo^%JUxwlkNE^z~TISpr7&d8c(MeAjwjm zzFd%>C_sI|JTUovK|UVK%~kXgT&FW7dV(=r1&mL;pie4*If}OkN(G@ffw(nr`JrQ* z{>j{QgaI}e5^{0I45ySrQc58yrI3_TNJ=Rrr4-WS=v6{rojVg%iwC2OfuUzUjCO4e zPj~XP`(gEcQN!}SAZ^ck$WoXwMifFKy0kDOT`&_DPOmRqHpY<S4UZLOK!#5WpZfmc zfmCN2F$8y$A_qG{XUs!w^X$CYFR;W{qqki@yr25vKEJ|VLC8gMFMrSoI#`2L9gup_ zr{~RziyM+!pk3-Ggab@Au21Sk7Znxf#el&H)6W22&lOL<2#MZOlno<}z|-cUhoWp} zQTANXGnmK|y`Mt#v7#AcQgDe3>D=O1;Gh%h6P5xMmUneb+0cU)9<qRn7=53?POR`w zT6<ux>^&f>fIYyG`@n?VQ5#G=Ie6oWdrF>qPsvjUCgBq;9AMWDY>_RktOCt0xOx{0 z7I=bBDam{%enm48BFqjNB>jW)a8LtXYLm??s}L50`e&lvxX?fobqDWzNbW06#qVk5 z&_EMjxzInd58}JjJk~(>*gtsmB;k*hq|eFmXCyl5t|mI!kRl8UbVMcYJFV7<5raeo zhx#GTIhlw=*>sW36j_zX7K!X4kuB%hOorPU?rcnBd{Y$OR2a3}gs-lGdp=y8K7fSj zyf9q+IRB0?;K|?azBS)1T+(Re40kQu*&PQBAI0WPfGue-{w<au;CGBCesRHYkA*uK zZd$l_G6GW^MunP^Ui<^0P|3kSeZ{9y($<9pV=YT%zNtYc3s*j_T>R>2Md5VxCQFt_ zyvT(+bSO^1grGTx-~&;@XNtrYUGjV*55YrY^qsJl?plxscX!-H93uLeAaMntCq1QA z$8C2r0ln}~!$!Di-ILw@_SNps?W;8o%zeSpkzyE9ZE&#kw1tc2cUiHGZtSQPt8`<> ztk@fFtlNrha$_zlR^`TyTd`_4cEXCi>Bdgdn-}Jc#oYCco$z;Hnhp%25gg(a!1dtX z6c|VJH{<U}0SRy#XBNR}oS5mh-E;@sfF*+Psn+kk&-9JmSxSVQw}>D(fC1ABCWyrx zh^9KguGge=fL^tdv^y0JM@K4zJ(}t;3?EfG(9ts@yd9ZgcBDgzQl<f6hBK?R#4s~b zjS(X~TJH=nhVNAvdhMfGc=AB-LXC!!M#&zH0*%2ApL1g?teEy(`b}mC1RdW)Y0++X zV0uo|b=yAGq;L?!U3ct{m{J_XNZN3r@QVYJ*`;t)4ue5gilcG_^hod)<`5*+7)UhE zJ5V<Ueb9%G|L}iE^U?M78@BD(v9s26;ONOe&pG?4&DJsI$8NV{(I3<6j{1!bXNSp? zVmg}wn_n5*`~^cn?geicwju1eCArmML$zA4J{7g58%xSmPj3I&wrbU5rHj^A+&}f{ zUu^l!w(3n)+g0jC>e2;3%IGgjeu{gvJz96oky>wUjZUraX>!?C6X%H!4gT6D-H-K` z4K7<+%|B}1uN|s=Pq$6~CFrY(KEh*|qWgo+qE97Vwx?^tHD_vP>ps;T*Ix&H9dVoZ zo1sL<=`QGVK(DQNsrIk6Pw67MLH#SuF56+E%J474+qyh`5mAVfC8U~MMy?=Nk?Y78 z$+yXO$Q>k38b}k_M7EJ9$q&ho$sY1Nd6E1l=_7BE3TiU-05yY}MX9KH)Cy`9wT^m` zdX;*edV_k4GEgR}iE5)9l#}YFPEhBmi&Q_QH0BzY8lN*(8{ahQjCDq{agWhvWQ|=$ z++*x9{?}Mix1p}N?rh!Hbt`xMYS)onzFjkRKeJoA`~BURX|buw)Mon3q^K{e-&EgS z@2}5lc)o#Z_+!IR!@|aQ8(ocmZ@k%<WnOO9n04mU=1b-Qv%>PArNB~VsjzIe?6lNd zY?f}zpDY(Fe#=xkn_frP&?o83bXL=|cvDN$g4T`AAG99Wdt>j)mNV^D?TcHtx87`Z z*-H0aYMW}^+WtiAzUIYys%%^L{jO!bbw~Ru(EW1HF59tvF55vX+5TLsx7oGFyZ@_w zr&_LCE$uJ0R@lOO)VBF;F59C0*7gmpX)O!)9=27t4Ys_z|4{qSTVJzP?LBHc2>Mk0 U{uAx=lj<Lyz}25Tkdo&3ADsu?ZvX%Q delta 4118 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 EZ<G#k(f|Me From a32b867c321262abcdb2e23a8a21d0b721d132aa Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Mon, 8 Apr 2024 04:16:11 +0200 Subject: [PATCH 08/16] New version with proper message when an undefined opcode is encountered. For example, if you try to run Z80 code or STAT.COM from CP/M-65 instead of the 8080 version. --- third_party/atari8080/8080.ovl | Bin 18620 -> 18643 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/third_party/atari8080/8080.ovl b/third_party/atari8080/8080.ovl index b58895f5fc075b47fa6219ebedbc01eadf9801eb..6c94d0574e1b63ad9c180197870a525ff3fac902 100644 GIT binary patch delta 4549 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 delta 4549 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 From 8c19bfa95872f58910dc9d8726034e9f103078c5 Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Mon, 8 Apr 2024 05:33:05 +0200 Subject: [PATCH 09/16] New core. Fix RST instructions. --- third_party/atari8080/8080.ovl | Bin 18643 -> 18643 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/third_party/atari8080/8080.ovl b/third_party/atari8080/8080.ovl index 6c94d0574e1b63ad9c180197870a525ff3fac902..b8adb89ea3e7acd247b1ed3aee9c5889e5fd067e 100644 GIT binary patch delta 94 zcmcaSk@50G#to_l{*rT6GPHhL$<g}R2g(#cFeMO71q4$A!8AZHEx^ppB?j>l04s(p APyhe` delta 94 zcmcaSk@50G#to_l{`Y6EWN7`glB4yr50oi@U`imE3J9hKf@y$YT7a3GOAO*A07JPl AcmMzZ From 1688ef1e0eb2e6316572c30bc1aa212675b77a0b Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Thu, 11 Apr 2024 17:07:00 +0200 Subject: [PATCH 10/16] 8080.ovl core, slightly smaller. 8080 zero page vectors are set in main program. No need to set them during load. --- third_party/atari8080/8080.ovl | Bin 18643 -> 18615 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/third_party/atari8080/8080.ovl b/third_party/atari8080/8080.ovl index b8adb89ea3e7acd247b1ed3aee9c5889e5fd067e..3f7c65ed353b188b90e361bf0c97db3612b97eaa 100644 GIT binary patch delta 13 VcmcaSk#YM(MyCJ&H_C1G001qu273Si delta 41 wcmdl!k@50GM!En085&p{RzB)wyqxfe=`j;S1A_y*Lm2}Q9A<m7k!h<30Bpt&#{d8T From bb82a703a27dfbd2e502d9ae768f5432c5be13ee Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Fri, 12 Apr 2024 00:50:14 +0200 Subject: [PATCH 11/16] Port OVL loader and 8080 emulator core to the BBC Master 128/512. --- .gitignore | 1 + build.py | 1 + src/arch/atari800/utils/8080_ovl_loader.S | 144 +++++++++++++++++----- src/arch/bbcmicro/build.py | 34 +++++ src/arch/bbcmicro/utils/8080_ovl_loader.S | 1 + src/arch/bbcmicro/utils/build.py | 10 ++ third_party/atari8080/8080-bbc.ovl | Bin 0 -> 19306 bytes 7 files changed, 163 insertions(+), 28 deletions(-) create mode 120000 src/arch/bbcmicro/utils/8080_ovl_loader.S create mode 100644 src/arch/bbcmicro/utils/build.py create mode 100644 third_party/atari8080/8080-bbc.ovl diff --git a/.gitignore b/.gitignore index bdeb394e..dd909040 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ atari800.atr atari800hd.atr atari800xlhd.atr bbcmicro.ssd +bbcmicro2.ssd bin c64.d64 pet.d64 diff --git a/build.py b/build.py index 45e69528..a539517d 100644 --- a/build.py +++ b/build.py @@ -17,6 +17,7 @@ "bin/pint.com": "third_party/pascal-m+pint", "bin/loader.com": "third_party/pascal-m+loader", "bbcmicro.ssd": "src/arch/bbcmicro+diskimage", + "bbcmicro2.ssd": "src/arch/bbcmicro+diskimage2", "oric.dsk": "src/arch/oric+diskimage", "apple2e.po": "src/arch/apple2e+diskimage", "atari800.atr": "src/arch/atari800+atari800_diskimage", diff --git a/src/arch/atari800/utils/8080_ovl_loader.S b/src/arch/atari800/utils/8080_ovl_loader.S index 55da4376..dbce405d 100644 --- a/src/arch/atari800/utils/8080_ovl_loader.S +++ b/src/arch/atari800/utils/8080_ovl_loader.S @@ -23,8 +23,8 @@ ; ; Two special blocks are recognized. ; -; e2 02 e3 02 lb hb Init. JSR to $hhll, continue loading after RTS. -; e0 02 e1 02 lb hb Run. JMP to $hhll. +; e2 02 e3 02 lb hb Init. JSR to $hblb, continue loading after RTS. +; e0 02 e1 02 lb hb Run. JMP to $hblb. ; ; The loader does no sanity checks on loaded blocks, so be sure it only ; defines blocks between the end of the loader and the end of TPA memory. @@ -35,7 +35,11 @@ #include "zif.inc" #include "cpm65.inc" +#ifdef MASTER128 + +#else #include "atari800.inc" +#endif ZEROPAGE @@ -44,7 +48,7 @@ ZP_START: ptr: .fill 2 end: .fill 2 tmp: .fill 1 -bufidx: .fill 1 +bufidx: .fill 1 ZP_END: @@ -53,6 +57,18 @@ ZP_END: ZP_WE_USE = ZP_END-ZP_START +#ifdef MASTER128 + TEST_TPA_TOP = $68 + TEST_TPA_BOTTOM = $30 + TEST_ZP_BOTTOM = $70 + TEST_ZP_TOP = $8f +#else + TEST_TPA_TOP = $b6 + TEST_TPA_BOTTOM = $40 + TEST_ZP_BOTTOM = $e0 + TEST_ZP_TOP = $ff +#endif + ; ------------------------------------------------------------------------- zproc main @@ -65,7 +81,7 @@ zproc main ldy #BIOS_GETTPA jsr BIOS - cpx #$b5 ; $b500 or higher, adjust if 8080.OVL grows + cpx #TEST_TPA_TOP bcs top_ok lda #<top_error @@ -81,8 +97,7 @@ top_ok: lda #>bottom_check clc adc #1 - cmp #$40 ; $4000 or lower, adjust if 8080.OVL starts using - ; memory below the banked memory window. + cmp #TEST_TPA_BOTTOM bcc bottom_ok lda #<bottom_error @@ -96,7 +111,7 @@ bottom_ok: ldy #BIOS_GETZP jsr BIOS - cmp #$e0-ZP_WE_USE + cmp #TEST_ZP_BOTTOM-ZP_WE_USE bcc bottom_zp_ok print_zp_error: @@ -105,11 +120,31 @@ print_zp_error: jmp error_out bottom_zp_ok: - cpx #$ff - bne print_zp_error + cpx #TEST_ZP_TOP + bcc print_zp_error ; check if we have banked memory +#ifdef MASTER128 + ldx $f4 + lda #4 + sta $f4 + sta $fe30 + sta $8000 + cmp $8000 + beq bank_found + + stx $f4 + + lda #<extmem_error + ldx #>extmem_error + jmp error_out + +bank_found: + stx $f4 + stx $fe30 + +#else lda PORTB sta $4000 ; "random" value to $4000 eor #$10 ; enable CPU banking @@ -126,6 +161,7 @@ bottom_zp_ok: bank_found: sta PORTB +#endif ; setup FCB @@ -199,6 +235,13 @@ read_end_addr: ldy #BIOS_CONOUT jsr BIOS + lda #0 + sta do_init + sta do_run + + jsr check_02e0 + jsr check_02e2 + next_byte: jsr getbyte ldy #0 @@ -220,25 +263,14 @@ almost_end: cmp end+1 bne not_end - lda ptr - cmp #$e3 - bne skip_init - lda ptr+1 - cmp #$02 - bne skip_init - - lda $d301 - sta $ff + lda do_init + beq skip_init jsr jsr_init skip_init: - lda ptr - cmp #$e1 - bne skip_run - lda ptr+1 - cmp #$02 - bne skip_run + lda do_run + beq skip_run lda #13 ldy #BIOS_CONOUT @@ -262,12 +294,52 @@ skip_run: jmp read_blocks_loop zendproc +zproc check_02e0 + lda ptr+1 + cmp #$02 + zif_eq + lda ptr + cmp #$e0 + zif_eq + inc do_run + lda #>run_address + sta ptr+1 + sta end+1 + ldx #<run_address + stx ptr + inx + stx end + zendif + zendif + rts +zendproc + +zproc check_02e2 + lda ptr+1 + cmp #$02 + zif_eq + lda ptr + cmp #$e2 + zif_eq + inc do_init + lda #>init_address + sta ptr+1 + sta end+1 + ldx #<init_address + stx ptr + inx + stx end + zendif + zendif + rts +zendproc + zproc jsr_init - jmp ($02e2) + jmp (init_address) zendproc zproc jsr_run - jmp ($02e0) + jmp (run_address) zendproc zproc getbyte @@ -315,7 +387,11 @@ zendproc .data title: - .ascii "Atari 130XE 8080 Overlay Loader" +#ifdef MASTER128 + .ascii "BBC Master 128 - 8080 Overlay Loader" +#else + .ascii "Atari 130XE - 8080 Overlay Loader" +#endif .byte 13,10,0 top_error: @@ -327,7 +403,11 @@ bottom_error: .byte 13,10,0 zp_error: - .ascii "Error: ZP $E0-$FF must be free" +#ifdef MASTER128 + .ascii "Error: ZP 70-8F must be free" +#else + .ascii "Error: ZP E0-FF must be free" +#endif .byte 13,10,0 extmem_error: @@ -357,6 +437,14 @@ my_fcb: .fill 37 sector_buffer: .fill 128 +do_init: .fill 1 +do_run: .fill 1 + + .align 2 ; avoid page crossing jmp (abs) + +init_address: .fill 2 +run_address: .fill 2 + bottom_check: ; ------------------------------------------------------------------------- diff --git a/src/arch/bbcmicro/build.py b/src/arch/bbcmicro/build.py index 9638bbd6..1cf675a4 100644 --- a/src/arch/bbcmicro/build.py +++ b/src/arch/bbcmicro/build.py @@ -31,6 +31,28 @@ | PASCAL_APPS, ) +mkcpmfs( + name="cpmfs2", + format="bbc192", + items={ + "0:ccp.sys@sr": "src+ccp", + "2:8080.com": "src/arch/bbcmicro/utils+8080_ovl_loader", + "2:8080.ovl": "third_party/atari8080/8080-bbc.ovl", + "2:halt.com": "third_party/atari8080/HALT.COM", + "2:stat.com": "third_party/atari8080/STAT.COM", + "2:dump.com": "third_party/atari8080/DUMP.COM", + "2:pip.com": "third_party/atari8080/PIP.COM", + "2:zork1.com": "third_party/atari8080/ZORK1.COM", + "2:zork1.dat": "third_party/atari8080/ZORK1.DAT", + "2:tst8080.com": "third_party/atari8080/TST8080.COM", + "2:8080pre.com": "third_party/atari8080/8080PRE.COM", + "2:8080exm.com": "third_party/atari8080/8080EXM.COM", + "2:cputest.com": "third_party/atari8080/CPUTEST.COM", + + } + | SCREEN_APPS +) + mkdfs( name="diskimage", out="bbcmicro.ssd", @@ -43,6 +65,18 @@ }, ) +mkdfs( + name="diskimage2", + out="bbcmicro2.ssd", + title="CP/M-65", + opt=2, + items={ + "!boot@0x0400": ".+bios", + "bdos": "src/bdos", + "cpmfs": ".+cpmfs2", + }, +) + mametest( name="mametest", target="bbcm", diff --git a/src/arch/bbcmicro/utils/8080_ovl_loader.S b/src/arch/bbcmicro/utils/8080_ovl_loader.S new file mode 120000 index 00000000..ddb55c8f --- /dev/null +++ b/src/arch/bbcmicro/utils/8080_ovl_loader.S @@ -0,0 +1 @@ +../../atari800/utils/8080_ovl_loader.S \ No newline at end of file diff --git a/src/arch/bbcmicro/utils/build.py b/src/arch/bbcmicro/utils/build.py new file mode 100644 index 00000000..1b50ae61 --- /dev/null +++ b/src/arch/bbcmicro/utils/build.py @@ -0,0 +1,10 @@ +from build.llvm import llvmprogram + +llvmprogram( + name="8080_ovl_loader", + srcs=["./8080_ovl_loader.S"], + deps=[ + "include", + ], + cflags=["-DMASTER128"], +) diff --git a/third_party/atari8080/8080-bbc.ovl b/third_party/atari8080/8080-bbc.ovl new file mode 100644 index 0000000000000000000000000000000000000000..a52ca99866f99545134930a6bff3b64f69ae1ce0 GIT binary patch literal 19306 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 literal 0 HcmV?d00001 From 452c764d28a5200c126afa02f91c3396bffdedb5 Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Fri, 12 Apr 2024 01:23:38 +0200 Subject: [PATCH 12/16] Use more structured programming macros (zif, etc...) --- src/arch/atari800/utils/8080_ovl_loader.S | 179 +++++++++++----------- 1 file changed, 87 insertions(+), 92 deletions(-) diff --git a/src/arch/atari800/utils/8080_ovl_loader.S b/src/arch/atari800/utils/8080_ovl_loader.S index dbce405d..57a718d0 100644 --- a/src/arch/atari800/utils/8080_ovl_loader.S +++ b/src/arch/atari800/utils/8080_ovl_loader.S @@ -8,7 +8,8 @@ ; ; ------------------------------------------------------------------------- -; This program is intended for Atari's equiped with at least 128kB of RAM. +; This program is intended for Atari's equiped with at least 128kB of RAM, +; or a BBC Master 128 or 512 with 128kB of sideways RAM at banks 4-7. ; It first checks if the required memory is free, i.e. not too many resident ; drivers in either low or high memory, and then proceeds to load the file ; 8080.OVL. The structure of the file is similar to regular binary executables @@ -36,7 +37,6 @@ #include "zif.inc" #include "cpm65.inc" #ifdef MASTER128 - #else #include "atari800.inc" #endif @@ -82,29 +82,27 @@ zproc main ldy #BIOS_GETTPA jsr BIOS cpx #TEST_TPA_TOP - bcs top_ok - lda #<top_error - ldx #>top_error + zif_cc + lda #<top_error + ldx #>top_error error_out: - ldy #BDOS_WRITE_STRING - jmp BDOS - -top_ok: + ldy #BDOS_WRITE_STRING + jmp BDOS + zendif -; check end of loader program +; check end of loader program, i.e. bottom of TPA lda #>bottom_check clc adc #1 cmp #TEST_TPA_BOTTOM - bcc bottom_ok - lda #<bottom_error - ldx #>bottom_error - jmp error_out - -bottom_ok: + zif_cs + lda #<bottom_error + ldx #>bottom_error + jmp error_out + zendif ; check if $e0-$ff is free @@ -112,14 +110,14 @@ bottom_ok: jsr BIOS cmp #TEST_ZP_BOTTOM-ZP_WE_USE - bcc bottom_zp_ok + zif_cs print_zp_error: - lda #<zp_error - ldx #>zp_error - jmp error_out + lda #<zp_error + ldx #>zp_error + jmp error_out + zendif -bottom_zp_ok: cpx #TEST_ZP_TOP bcc print_zp_error @@ -132,15 +130,15 @@ bottom_zp_ok: sta $fe30 sta $8000 cmp $8000 - beq bank_found - stx $f4 + zif_ne + stx $f4 - lda #<extmem_error - ldx #>extmem_error - jmp error_out + lda #<extmem_error + ldx #>extmem_error + jmp error_out + zendif -bank_found: stx $f4 stx $fe30 @@ -151,15 +149,15 @@ bank_found: sta PORTB eor #$10 cmp $4000 - bne bank_found - sta PORTB + zif_eq + sta PORTB - lda #<extmem_error - ldx #>extmem_error - jmp error_out + lda #<extmem_error + ldx #>extmem_error + jmp error_out + zendif -bank_found: sta PORTB #endif @@ -167,17 +165,17 @@ bank_found: ldx #$24 lda #0 -clear_fcb: - sta my_fcb,x - dex - bpl clear_fcb + zrepeat + sta my_fcb,x + dex + zuntil_mi ldx #10 -copy_filename: - lda filename,x - sta my_fcb+1,x - dex - bpl copy_filename + zrepeat + lda filename,x + sta my_fcb+1,x + dex + zuntil_mi ; open '8080.OVL' @@ -185,13 +183,13 @@ copy_filename: lda #<my_fcb ldx #>my_fcb jsr BDOS - bcc open_ok - lda #<open_error - ldx #>open_error - jmp error_out + zif_cs + lda #<open_error + ldx #>open_error + jmp error_out + zendif -open_ok: lda #$80 sta bufidx @@ -199,14 +197,14 @@ open_ok: sta tmp jsr getbyte cmp #$ff - beq FF_almost_ok + zif_ne invalid_file: - lda #<FF_error - ldx #>FF_error - jmp error_out + lda #<FF_error + ldx #>FF_error + jmp error_out + zendif -FF_almost_ok: lda tmp cmp #$ff bne invalid_file @@ -249,48 +247,46 @@ next_byte: lda ptr cmp end - beq almost_end + zif_ne not_end: - inc ptr - zif_eq - inc ptr+1 + inc ptr + zif_eq + inc ptr+1 + zendif + jmp next_byte zendif - jmp next_byte -almost_end: lda ptr+1 cmp end+1 bne not_end lda do_init - beq skip_init - - jsr jsr_init + zif_ne + jsr jsr_init + zendif -skip_init: lda do_run - beq skip_run - - lda #13 - ldy #BIOS_CONOUT - jsr BIOS - lda #10 - ldy #BIOS_CONOUT - jsr BIOS - - lda #<BIOS ; pass along pointer to BIOS - ldx #>BIOS - jsr jsr_run - - lda #0 ; be sure we can read CCP.SYS - ldy #BDOS_GET_SET_USER_NUMBER - jsr BDOS - - ldy #BDOS_EXIT_PROGRAM ; warmboot, i8080 CP/M might have written to disk - jmp BDOS + zif_ne + lda #13 + ldy #BIOS_CONOUT + jsr BIOS + lda #10 + ldy #BIOS_CONOUT + jsr BIOS + + lda #<BIOS ; pass along pointer to BIOS + ldx #>BIOS + jsr jsr_run + + lda #0 ; be sure we can read CCP.SYS + ldy #BDOS_GET_SET_USER_NUMBER + jsr BDOS + + ldy #BDOS_EXIT_PROGRAM ; wboot, i8080 CP/M might have written to disk + jmp BDOS + zendif -skip_run: jmp read_blocks_loop zendproc @@ -344,12 +340,12 @@ zendproc zproc getbyte ldx bufidx - bpl still_data_available - jsr read_next_sector - ldx bufidx + zif_mi + jsr read_next_sector + ldx bufidx + zendif -still_data_available: lda sector_buffer,x inc bufidx rts @@ -366,13 +362,12 @@ zproc read_next_sector ldy #BDOS_READ_SEQUENTIAL jsr BDOS - bcs unexpected_eof - - lda #0 - sta bufidx - rts + zif_cc + lda #0 + sta bufidx + rts + zendif -unexpected_eof: lda #<eof_error ldx #>eof_error ldy #BDOS_WRITE_STRING From 0194ba50209d1e5f1e609b23c66d9cbcb496e3ce Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Fri, 12 Apr 2024 05:16:44 +0200 Subject: [PATCH 13/16] New 8080 core for the Master 128/512 which eliminates all writes to $f4 for MOS because it restores 'curbank' after each syscall. --- src/arch/atari800/utils/8080_ovl_loader.S | 2 +- third_party/atari8080/8080-bbc.ovl | Bin 19306 -> 18933 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/arch/atari800/utils/8080_ovl_loader.S b/src/arch/atari800/utils/8080_ovl_loader.S index 57a718d0..4609117f 100644 --- a/src/arch/atari800/utils/8080_ovl_loader.S +++ b/src/arch/atari800/utils/8080_ovl_loader.S @@ -58,7 +58,7 @@ ZP_END: ZP_WE_USE = ZP_END-ZP_START #ifdef MASTER128 - TEST_TPA_TOP = $68 + TEST_TPA_TOP = $66 TEST_TPA_BOTTOM = $30 TEST_ZP_BOTTOM = $70 TEST_ZP_TOP = $8f diff --git a/third_party/atari8080/8080-bbc.ovl b/third_party/atari8080/8080-bbc.ovl index a52ca99866f99545134930a6bff3b64f69ae1ce0..ae8923fa00610795216a44e49cd15c5ff3bf9b12 100644 GIT binary patch delta 6286 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 delta 6683 zcmcIo3vd(H6<r$(Odtlwf|`#l+nCyhLS#wy?h50d3<%o@D_&^BS4|+4HcZ!2>`1Z0 z8jBUspbqMGLi%y5Az1~HsEvnaCS|I$3>}9QPvZ0oO<SN-G)$%~WCq+Rlj7dDYpvF6 z?aFDW#`E-i?|Jv0ci+A5qq|(zM=xgS#>X+^;UV1&eKvcC%hexaTDJ@_51p9N{+clu zH71zRMTvun{__5g{K&yL_9gZZdnahTAIBbN`=7?P21hbMzS!Px9Aa3HrX>KlCjd-( zU!s+sOjf!z0iqF~CWZknUQL8(rB4$BMtU^?U?k#3QG5mk6@`?iLmvJR%b-5eb|dYx zGHnlNCzN2`uW23t1Db%y05X4AGVcrd6aLZc!~mnzctigGr(;@fKH(YV{<3f-v!e*x z&UQf*5}t^M@2Xl^gr!8?k#41^C(@%7c_Ut>$QSV`L=i8F!gI+e4Eb0#!A4j{4*N#P zmzsZqj?i)?P#ktg+@fe_lJ&5}Iwg`=r$iF#lt^UFz<g6OiMAw4Lwgu#%UMifJuI=7 zOhAGpD{gARF%Xn~m>Phz>sG`}r|7gRSF|IQ9g}vu5kcD3D`K>3LlHgRFJEAoGM!kg zzUy%Vi-L@-YKJ^5ok|Zy(GK;<m0((%7yzbKw2YLme%2>et)gg${H!;{>VY|)@H_iH z*cWEaeX{tKg2@HsMt->;FToXZw71>i?oN?+3-UEfm3U#d;|@)c3-jXMS&G9d$O~6i zq&&^~AQ6=7?3S;yQt8oBcBfM^$$h&goi?fTYAJnkrAtYPmTP%8OT(OaNH_G=&C=YT zik2#3EUw9{VoTO`uCCYw?bnM<vtcI<ph1P4t7HYpekW*h4W^2uM&TK4gA>_P$kTgS z?s{<nM;i(rPU4Z27Njp53g#rGd{--%UyMBb-GCUBmY{a4(7qtFzbLU7l4up5+`LjF zjA|^kNW2N|(PhZ$=~6VK4}~_b4E3AJOcE!8r*HVUL!|}W<K+bzy__#w4dZVMR+cTR zh5k074GHZ<p&b|6+Va|r){c}THs{KbosY}Qpw%x&EiSa%g!Xx%4KFXtXzkC-i(%|1 z%gdN#tay4IEdQBkcJhD$0VKj?0i?ua0c<{#1zx4VH%TyMMHnd!z#lsa3j$gp&?zbE zloWMJiaI4l-6V<|jXbT(z)?m~r=+NpC~`Y1&<dTX5UK$c5KVADT(*$AUZF?%D@tzk z2>DY`xd5<Lm1x9{O4Bk?KP5Uc&jc4LU&vjk)We9&!niqA&3U_S=R{|+0XUVjim=_> z_9|RlP!QbL9TA;&&CU`!kzRBWd0yJs`{3a1gX>uDRE4m?!W~i61M{hn9+j~SE9|z~ zgMBK4r4vQNahKXy@r>lWD-5u0OVi}tp*|j_Iovzkr<eur0hM&$RReXakMB_#KU<13 zm%p;0Q_jYxGDI37-qKYmcZuV<11les&vK}bWz^zwaAJ-VdU#>M%?o8gYU*88jiWQ# z^V&48^GYR?v>+Hn=?!LXe`+&ntYl4#45R*P6v<>g5HdMxWSG<|RT-KzbIN%jWcp=f z7?mgUG|2RiuGK_oDj~SyZBP9M%l2oyXYzg)o`C`NY&^M1lSP8ja-Yh^jAk@`e3(ch zh<Q3Ij95QH_G?m2Wn(%spUw)(#tAEo+HWS)AcL~;vyx%Ds!%$9Rx`-T|CEi4_zRJg zjv5P@IU7|@h=b~zKf_2{xq2=~F?N9Uw_n+WI?>!zcYdl{nCh0Kx|OM}G1Vo6F5Hc~ zm@`~w_3}#L`j&aYTRBJdiqB6AOmOw46(yOVoW*3x3<{V^#QR7_hO`qN#mTE=W_13v z(VW5jDB_UGrs8e@2Wmhe;?db1fY-3frD+P@n@kYyym=Lz)`~;d$M*4Fws$)DTXNnx z9T;H5zf)NJ3tPh3fk4R_DiXMP%`kea!WHpf%YP#`KHh1M|FhHX0!)z{GjH@(GzXr~ z$1SB6;ba2<<{HFaiDO?L#P~S^-lV^0oZug0-GgV^afws#PV#<8acu`_XOA9vMK zG<lM-`4sC3W3Dg;G*}w-vY_`aGnx&hfd1z_;cSpV&lO$F(yk~L%%_5nz%b~tUe?EZ zM&|_QQ&BVPi{4|sFaQ9&8z87#Ahe&O0Ot-CQmmJ8mGGTW{V6J(17@SxDPvfN?9YTI z2Dqa?Dx}bUeJpti4r6GR#?aBk(a|M|W97#>76bwSx;Y62A)J3@;uaOg4%6wqfCDDI zhoPf`m@%`5@GPJycN2qP=&9HvRB!>6r>9n@YYSs~>Og^jTR=JXV*qtU$03&J84oXd zFMRu4@9Pdcdn6S4*2z<EU3m9${fF0_kI6rsot;?n6MT*O=Ia!HC-^eOU92r7Vw5bA zwnCC%EOYAKl!F@<x!(xEoRQ2a&VW~--}~3&5oYW7zW0nD7;jXMnHHPhHy^hAbY0B( zc1?3_C%(%3SMzBLgU6f;tFukxrbhE!^N8g=&|j_DUAqhKH0N4wTfPta?bQZTuK6kR z5{tg(Z=lC&`)c>&KJ#h|QS&C~!__BE`R3#1Cd-bRw)HV*Y3-fbXYikyyDZFiYu?7+ z!GDE+fM3S1;tBj8_(McKQAjKy%7`k$NZ<rTY$u)|_7hJN9^yIT5b*<oCtfGc66c6G z@k`<oag(@3j1m7Ka>zMk9=U)tktEqjZXg}x7IFu<o9rX~WSESTe<c4!>aEpQlXbIo zt97S!kM(O-H)Hi#U$lP5I$|BSn%3-H^U|72YYOYy>iX;6tox|Wu$EeTZ0+T>57#%= zd+H<gSL)|BG&CG<_<6%v!>YzTjo)khb>r-&ZB3!3pEUiU>0VP&b7S+9&Ee(?&A)BF z(LB~X%T{QsvQf6ZwjSFN+e@~n?VRnBZOk^S#oBV9CEW6x7G~x;a$R6uyPaBp-JaL> z)wcEx0f*7C#r|!3#m1QPjkc4Ue(xY1yX+^{AK19VIo5W3L*?cc$3A<^d3K}US=SzO zdN*%&(Dsq_|K9jk$3XkYhLO$N96melY-lZaUIhKzj=hcnd+r9d^;Kuyrnz=&2km&l g?sQ&iJ>#TiZHhU+($VYSJ|^qWuCfl#%U(qN7kr=ePXGV_ From 43e962a07ee53ae899931ae9ea8f0cb498b1b645 Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Sun, 28 Apr 2024 21:07:08 +0200 Subject: [PATCH 14/16] Update sectran table to 0-25 instead of 1-26, turning it into a no-op in case some program decides to use it. --- third_party/atari8080/8080-bbc.ovl | Bin 18933 -> 18933 bytes third_party/atari8080/8080.ovl | Bin 18615 -> 18615 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/third_party/atari8080/8080-bbc.ovl b/third_party/atari8080/8080-bbc.ovl index ae8923fa00610795216a44e49cd15c5ff3bf9b12..a37b10917e926bc99f9f003345a3faf528160bac 100644 GIT binary patch delta 67 zcmV-J0KEV8lL7UU0kA<1FKzl>`tADt`Tzj}0|W&I2M7rY3k(en4i69!5)%{^78e*9 Z5C8)Q0KWh~0KfncvvCfU1+xVd@HNUm5!C<y delta 66 zcmV-I0KNb9lL7UU0kA<1E^PW;`t17r`T+t11O)~M2nh-c3=Iws5D^j+6crX17#SK6 Y00RdAzW_e~zyJ`laSoLQvji0JHNVRd-2eap diff --git a/third_party/atari8080/8080.ovl b/third_party/atari8080/8080.ovl index 3f7c65ed353b188b90e361bf0c97db3612b97eaa..b140d389850ead7f840af6576b140cb3d4607b22 100644 GIT binary patch delta 55 zcmdl!k#YM(#tngd%DKPde!cz0`<sE0iJ66!jh%y&i<^g+mycgSP)JxrR7_k#a&s}? LBG%1fA`49b+`|r1 delta 54 zcmdl!k#YM(#tngdN;$t`f4%v|^P7>0nT3^&or9B$n}?T=UqDbuSVUAzTtZT6a|z!f K*3F_Ki%bC1V-8yY From 5201867f1a40f184426e2d9f89a0fb9c89a82bbd Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Tue, 30 Apr 2024 08:14:37 +0200 Subject: [PATCH 15/16] Properly fix sectran table to 0-25. Committed the wrongly corrected version by mistake. --- third_party/atari8080/8080-bbc.ovl | Bin 18933 -> 18933 bytes third_party/atari8080/8080.ovl | Bin 18615 -> 18615 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/third_party/atari8080/8080-bbc.ovl b/third_party/atari8080/8080-bbc.ovl index a37b10917e926bc99f9f003345a3faf528160bac..f5c0e2f90617048c0e3479d5a3aa98007fc2b5f1 100644 GIT binary patch delta 41 zcmV+^0M`HYlL7UU0kA<16>R!l`t17r`Tzj}0|W&I2M7rY3k<VY4zC5X1r+c#Y03`E delta 42 zcmV+_0M-BXlL7UU0kA<17H#@o`tADt`Tzj}0|W&I2M7rY3k(gjRt~QPvj!CJHFfn4 A+yDRo diff --git a/third_party/atari8080/8080.ovl b/third_party/atari8080/8080.ovl index b140d389850ead7f840af6576b140cb3d4607b22..84d64083dbc925bf3e4821b9c7c40d37ddea3275 100644 GIT binary patch delta 41 xcmdl!k#YM(#tngdqB*}}f4%v|^P7Q@iJ66!jh%y&i<@V2I^TNM&7vZUOaMU%4Ltw= delta 42 ycmdl!k#YM(#tngdV!6NKe!cz0`<sE0iJ66!jh%y&i<^gca~j`z*3Duf3rzq^)eTMn From 2b97f137fa225c85ab3e58593b2fe6044e09516c Mon Sep 17 00:00:00 2001 From: Ivo van Poorten <ivopvp@gmail.com> Date: Mon, 2 Sep 2024 06:16:05 +0200 Subject: [PATCH 16/16] fix build for new ab --- src/arch/bbcmicro/build.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/arch/bbcmicro/build.py b/src/arch/bbcmicro/build.py index 89b0cba5..02b4198a 100644 --- a/src/arch/bbcmicro/build.py +++ b/src/arch/bbcmicro/build.py @@ -65,7 +65,6 @@ mkdfs( name="diskimage2", - out="bbcmicro2.ssd", title="CP/M-65", opt=2, items={