From 79793b78a412fc08815e4b2417fc79d8e6757a20 Mon Sep 17 00:00:00 2001 From: apple2geek Date: Thu, 6 Oct 2022 21:09:29 -0600 Subject: [PATCH 1/8] Complete "SYSTEM"-ification of Applecorn. Now runs as APLCORN.SYSTEM, without the need for BASIC.SYSTEM as a support for .BIN. --- applecorn.po | Bin 819200 -> 819200 bytes applecorn.s | 4 ++-- auxmem.init.s | 2 +- auxmem.misc.s | 2 +- m32build | 6 ++--- mainmem.ldr.s | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 67 insertions(+), 7 deletions(-) diff --git a/applecorn.po b/applecorn.po index 4755c0dbb731b80aa7a475a869556bb5fe3874bb..913c992933c1d866aaaf8d358ae57ebe683e5a99 100644 GIT binary patch delta 103 zcmZo@FluNp+Mvq9C_Gt>MTe1LaxjY;Bg5t@mTq=-`~Uyz|Ns9mnUN`Yay*Y0E0F*H sfAcz?_H{grK+FWh%s|Wn#H>Kf2E^<@%mKulK+FZi+}qdj@B|eD0CIvPz5oCK delta 103 zcmZo@FluNp+Mvq9C^}h Date: Fri, 7 Oct 2022 15:51:53 -0400 Subject: [PATCH 2/8] Update date to 2022-10-07 --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.init.s | 2 +- freq_table | 19 ++ mainmem.freq.s | 522 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 542 insertions(+), 1 deletion(-) create mode 100755 freq_table create mode 100644 mainmem.freq.s diff --git a/applecorn.po b/applecorn.po index 4755c0dbb731b80aa7a475a869556bb5fe3874bb..2084fc83a4525d61aebcfc58d18b66be424295d2 100644 GIT binary patch delta 3098 zcmZt|ZB!Fic4iU+ye?~~U)T?Qx*iLP6=_x0T9uF3L$7OR|c3Z7ldu1i{+`^|OQJj}rtsw6nQvdCcng(D1Q~(N{0H6U# z1V{o%b{tZp=DnKk+OWzt>|pnygY@G&6e3z1QRQUrD`%&iO?v&lYDeq)PUtqqq1um9 zY0V}@rjKknj3$$X2T(P=$#LQU`iF|nb`&Vn$lRyvhtb@v6h_jnz9&KJr6xXr;{Bvv=QX4*-#!#(>_Mo^gf5-W3(hW z(G)vQ?LA;}SdXH$bV|^=Lddf|E10Y+g?#eWVzhSo=g|g=>C*n#vecQu)#P2pKMdn{ zBiQk8oOV@6#1R?$<)+cJB-}Y%Tg?cR^`5|4@AJvHnwVSB^x2)mnHo;3!79!!B{Yq6 zX~UKqb`T!hV-_;_tN1M0-->1?EY4b(wajs{6=l+N3kiIRK7GU}&6TrexF?HgHCks2 z<ec+HgtrhH#^EcL;qCKMn~*lD4?QOkekQR(mA|$r%3PLIc9dN>uB?h zjryb=HEL(=-&NIhs+t66I_@A(pFpqBJgGl{vS7M=0$sqo*CJ4$1oCOG(r(mNSmoT+ z`I*zs)9ub?yn-A%iLxtsubxjm9%1%6cWZyLfOx*Xz);Kyefb42OrQnDh7CHduWwDU zPRFI(%FWN$m6UKF-7*Fr0PO9(-J`U< zacoMTJEd)!^^9T(vY$HJqtc%`L$-g3rlHi{ifO&iDkG`;5@l}Xy|^P_`!nBzhXuV!S^$-L6_NdD}yKQtgJ{W+Nsw=y`wiw2lxUAS*H+Q03Z5J0;yJ-K3Fc4Th9qG>vf)*Pb8b&v zl90-K@L4GbKTcjdh1kl?p1EhTH0&i0>zDc2HkCl(q&{H*+#G&7R`+3TAHL+7>&<$I zM}WJW+Pa_2{A~P|hfjk6loSbVU;8i!<7z*LEc4;Xm;@AX-9^HTHb%hME?d^( zFFeXiKnO5lIedgHIgK8szaW=$(XXD8JyPPSF%Pg^UD_dbv!}Q$k1e1X?4)ce(D6&V zyTl*O0%qY}ukcEb;qBzmX{1XAuUAcwgQrn0y^1{f6-sYXUg)>jG&pUL;C?;T&Y?<1hwedm1FeIegHU*@9ELgY>Vr=)ZVE)9krkuO( zHx`-R@9{rhYA|sbLA{PGl1~Tna!U;PTvu?Nu7Yz1b@_TD*BxAwTVmqep%T_u#(6`P zrivmRHySJ`EiB?T|4>q7G_u?)AzisHpF0rBXN@H~ZZIep8cVnz0(xVKX-x^&ACRjC zcKK}-Pc;r?EqXqh(JN|jh2JGga41hoseo(8VVLOJ@68}4#hES<#YMW^xoy|+3cpZE znIRq<2lTLP4Z$#`KN8aK(IZI(L25DI84#H}{>A|~G6-NeakUGsCNJXy0rz}q6c|zW zpQMO;k)#EACHiyt0f>GPnL$Jv6BsdBP~+R8G$g3>$}2M}ac0CWd8qq&Tee|xPLJl~ zP6}`;(6tUh=9a9(_=A8n1y2fCB?UtYHVjsZZHI@Oq$5LkMBaWxF&i%nvUim3)c2WxJ?i4|&Z^qfp%9C9g|+ zoBiC+UK4Zh85y6K+q_^Kdn+hV&G?F3vw^88W6W?aH#REvKnR>T#dSe?UaKBjURQ^F`4C4EtI!(~K|6b`>e@(LZ+1kHye8feA87o4?CbC8NKW{}aDBKw8HR?i7`_uGTe?tg zPWGU6{P^NQ>)4SYC8*jGpm0L9ToQgQeZHl`d;{MRnDN^A@5u2QD$y^d9 zwG6xv-yI^WE}>H9k3+;>h!&8}ODJvXClUMpEDcZ9G5n)u4{f8` zrsB;catXdYK13E@MsLuqgujgTE94?0DoXK7d*amt3i60Vs*R|SK1gmDQ2|V|iqPE2 zOTyb#LS=_5!Ix$}GNRuPzkg)Q*XR)4xlcqZEA4z#iT*uNNC42;PogQh;$ma*a!l=u zlIVNTUi5!Ecye%Sq%kt5r>r}@o9=GBS$^|o&%WsYYmh@d4E!Zwl%B3hX6Ui6cw)-fugMEV0Qli74vjjN)l JDf&?De*xnu1r-1Q delta 3199 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:.0f}".format(v * 10)) + +print("\nFREQLOW"); +for i in range(0,256): + v = 2**(i/48)*base + print(" DB <{:.0f}".format(v * 10)) diff --git a/mainmem.freq.s b/mainmem.freq.s new file mode 100644 index 0000000..a5b1b81 --- /dev/null +++ b/mainmem.freq.s @@ -0,0 +1,522 @@ +* MAINMEM.FREQ.S +* (c) Bobbi 2022 GPLv3 +* +* Table of frequency values for Ensoniq +* Generated by freq_table script +* + +FREQHIGH + DB >1235 + DB >1253 + DB >1271 + DB >1289 + DB >1308 + DB >1327 + DB >1346 + DB >1366 + DB >1386 + DB >1406 + DB >1427 + DB >1447 + DB >1468 + DB >1490 + DB >1511 + DB >1533 + DB >1556 + DB >1578 + DB >1601 + DB >1624 + DB >1648 + DB >1672 + DB >1696 + DB >1721 + DB >1746 + DB >1772 + DB >1797 + DB >1823 + DB >1850 + DB >1877 + DB >1904 + DB >1932 + DB >1960 + DB >1988 + DB >2017 + DB >2047 + DB >2077 + DB >2107 + DB >2137 + DB >2168 + DB >2200 + DB >2232 + DB >2264 + DB >2297 + DB >2331 + DB >2365 + DB >2399 + DB >2434 + DB >2469 + DB >2505 + DB >2542 + DB >2579 + DB >2616 + DB >2654 + DB >2693 + DB >2732 + DB >2772 + DB >2812 + DB >2853 + DB >2895 + DB >2937 + DB >2979 + DB >3023 + DB >3067 + DB >3111 + DB >3157 + DB >3202 + DB >3249 + DB >3296 + DB >3344 + DB >3393 + DB >3442 + DB >3492 + DB >3543 + DB >3595 + DB >3647 + DB >3700 + DB >3754 + DB >3808 + DB >3864 + DB >3920 + DB >3977 + DB >4035 + DB >4093 + DB >4153 + DB >4213 + DB >4275 + DB >4337 + DB >4400 + DB >4464 + DB >4529 + DB >4595 + DB >4662 + DB >4729 + DB >4798 + DB >4868 + DB >4939 + DB >5011 + DB >5084 + DB >5157 + DB >5232 + DB >5309 + DB >5386 + DB >5464 + DB >5544 + DB >5624 + DB >5706 + DB >5789 + DB >5873 + DB >5959 + DB >6045 + DB >6133 + DB >6222 + DB >6313 + DB >6405 + DB >6498 + DB >6593 + DB >6688 + DB >6786 + DB >6884 + DB >6985 + DB >7086 + DB >7189 + DB >7294 + DB >7400 + DB >7507 + DB >7617 + DB >7727 + DB >7840 + DB >7954 + DB >8070 + DB >8187 + DB >8306 + DB >8427 + DB >8549 + DB >8674 + DB >8800 + DB >8928 + DB >9058 + DB >9190 + DB >9323 + DB >9459 + DB >9596 + DB >9736 + DB >9878 + DB >10021 + DB >10167 + DB >10315 + DB >10465 + DB >10617 + DB >10772 + DB >10928 + DB >11087 + DB >11248 + DB >11412 + DB >11578 + DB >11747 + DB >11917 + DB >12091 + DB >12267 + DB >12445 + DB >12626 + DB >12810 + DB >12996 + DB >13185 + DB >13377 + DB >13571 + DB >13769 + DB >13969 + DB >14172 + DB >14378 + DB >14587 + DB >14800 + DB >15015 + DB >15233 + DB >15455 + DB >15680 + DB >15908 + DB >16139 + DB >16374 + DB >16612 + DB >16854 + DB >17099 + DB >17348 + DB >17600 + DB >17856 + DB >18116 + DB >18379 + DB >18646 + DB >18918 + DB >19193 + DB >19472 + DB >19755 + DB >20043 + DB >20334 + DB >20630 + DB >20930 + DB >21234 + DB >21543 + DB >21857 + DB >22174 + DB >22497 + DB >22824 + DB >23156 + DB >23493 + DB >23835 + DB >24181 + DB >24533 + DB >24890 + DB >25252 + DB >25619 + DB >25992 + DB >26370 + DB >26754 + DB >27143 + DB >27538 + DB >27938 + DB >28344 + DB >28757 + DB >29175 + DB >29599 + DB >30030 + DB >30467 + DB >30910 + DB >31359 + DB >31816 + DB >32278 + DB >32748 + DB >33224 + DB >33707 + DB >34198 + DB >34695 + DB >35200 + DB >35712 + DB >36231 + DB >36758 + DB >37293 + DB >37835 + DB >38386 + DB >38944 + DB >39510 + DB >40085 + DB >40668 + DB >41260 + DB >41860 + DB >42469 + DB >43086 + DB >43713 + DB >44349 + DB >44994 + DB >45648 + DB >46312 + DB >46986 + DB >47669 + DB >48363 + DB >49066 + +FREQLOW + DB <1235 + DB <1253 + DB <1271 + DB <1289 + DB <1308 + DB <1327 + DB <1346 + DB <1366 + DB <1386 + DB <1406 + DB <1427 + DB <1447 + DB <1468 + DB <1490 + DB <1511 + DB <1533 + DB <1556 + DB <1578 + DB <1601 + DB <1624 + DB <1648 + DB <1672 + DB <1696 + DB <1721 + DB <1746 + DB <1772 + DB <1797 + DB <1823 + DB <1850 + DB <1877 + DB <1904 + DB <1932 + DB <1960 + DB <1988 + DB <2017 + DB <2047 + DB <2077 + DB <2107 + DB <2137 + DB <2168 + DB <2200 + DB <2232 + DB <2264 + DB <2297 + DB <2331 + DB <2365 + DB <2399 + DB <2434 + DB <2469 + DB <2505 + DB <2542 + DB <2579 + DB <2616 + DB <2654 + DB <2693 + DB <2732 + DB <2772 + DB <2812 + DB <2853 + DB <2895 + DB <2937 + DB <2979 + DB <3023 + DB <3067 + DB <3111 + DB <3157 + DB <3202 + DB <3249 + DB <3296 + DB <3344 + DB <3393 + DB <3442 + DB <3492 + DB <3543 + DB <3595 + DB <3647 + DB <3700 + DB <3754 + DB <3808 + DB <3864 + DB <3920 + DB <3977 + DB <4035 + DB <4093 + DB <4153 + DB <4213 + DB <4275 + DB <4337 + DB <4400 + DB <4464 + DB <4529 + DB <4595 + DB <4662 + DB <4729 + DB <4798 + DB <4868 + DB <4939 + DB <5011 + DB <5084 + DB <5157 + DB <5232 + DB <5309 + DB <5386 + DB <5464 + DB <5544 + DB <5624 + DB <5706 + DB <5789 + DB <5873 + DB <5959 + DB <6045 + DB <6133 + DB <6222 + DB <6313 + DB <6405 + DB <6498 + DB <6593 + DB <6688 + DB <6786 + DB <6884 + DB <6985 + DB <7086 + DB <7189 + DB <7294 + DB <7400 + DB <7507 + DB <7617 + DB <7727 + DB <7840 + DB <7954 + DB <8070 + DB <8187 + DB <8306 + DB <8427 + DB <8549 + DB <8674 + DB <8800 + DB <8928 + DB <9058 + DB <9190 + DB <9323 + DB <9459 + DB <9596 + DB <9736 + DB <9878 + DB <10021 + DB <10167 + DB <10315 + DB <10465 + DB <10617 + DB <10772 + DB <10928 + DB <11087 + DB <11248 + DB <11412 + DB <11578 + DB <11747 + DB <11917 + DB <12091 + DB <12267 + DB <12445 + DB <12626 + DB <12810 + DB <12996 + DB <13185 + DB <13377 + DB <13571 + DB <13769 + DB <13969 + DB <14172 + DB <14378 + DB <14587 + DB <14800 + DB <15015 + DB <15233 + DB <15455 + DB <15680 + DB <15908 + DB <16139 + DB <16374 + DB <16612 + DB <16854 + DB <17099 + DB <17348 + DB <17600 + DB <17856 + DB <18116 + DB <18379 + DB <18646 + DB <18918 + DB <19193 + DB <19472 + DB <19755 + DB <20043 + DB <20334 + DB <20630 + DB <20930 + DB <21234 + DB <21543 + DB <21857 + DB <22174 + DB <22497 + DB <22824 + DB <23156 + DB <23493 + DB <23835 + DB <24181 + DB <24533 + DB <24890 + DB <25252 + DB <25619 + DB <25992 + DB <26370 + DB <26754 + DB <27143 + DB <27538 + DB <27938 + DB <28344 + DB <28757 + DB <29175 + DB <29599 + DB <30030 + DB <30467 + DB <30910 + DB <31359 + DB <31816 + DB <32278 + DB <32748 + DB <33224 + DB <33707 + DB <34198 + DB <34695 + DB <35200 + DB <35712 + DB <36231 + DB <36758 + DB <37293 + DB <37835 + DB <38386 + DB <38944 + DB <39510 + DB <40085 + DB <40668 + DB <41260 + DB <41860 + DB <42469 + DB <43086 + DB <43713 + DB <44349 + DB <44994 + DB <45648 + DB <46312 + DB <46986 + DB <47669 + DB <48363 + DB <49066 From ce5af98d3c419fbbc9ff40ba55dcb80d7c9fcd0b Mon Sep 17 00:00:00 2001 From: apple2geek Date: Sat, 8 Oct 2022 03:17:19 -0600 Subject: [PATCH 3/8] Switch to labels instead of absolute addresses for ProDOS globals --- applecorn.po | Bin 818773 -> 819200 bytes applecorn.s | 13 +++++++++++++ mainmem.init.s | 2 +- mainmem.ldr.s | 20 ++++++++++---------- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/applecorn.po b/applecorn.po index d5c8188fa363f0fc2bc9534ff79b040b861d26e7..913c992933c1d866aaaf8d358ae57ebe683e5a99 100644 GIT binary patch delta 27670 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

uXABR}d*{n^n`VxvkE;b8e#>Wbb}Q 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Π+d@XqD-P+ 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 WTc0T1_wUi^urFh=ZPnec_&)%lr6p$o diff --git a/applecorn.s b/applecorn.s index e1fcac1..6f71099 100644 --- a/applecorn.s +++ b/applecorn.s @@ -40,8 +40,21 @@ RSTV EQU $3F2 * IRQ vector A2IRQV EQU $3FE +* ProDOS Global Page equates * MLI entry point MLI EQU $BF00 +* Machine ID byte +MACHID EQU $BF98 +* Versioning bytes +IBAKVER EQU $BFFC +IVERSION EQU $BFFD +* System BitMap locations +P8BMAP0007 EQU $BF58 +P8BMAP080F EQU $BF59 +P8BMAP2027 EQU $BF5C +P8BMAP282F EQU $BF5D +P8BMAP3037 EQU $BF5E +P8BMAP383F EQU $BF5F * IO Buffer for reading file (1024 bytes) IOBUF0 EQU $0C00 ; For loading/saving, OSFILE, *. diff --git a/mainmem.init.s b/mainmem.init.s index 93d2ca2..6ea06df 100644 --- a/mainmem.init.s +++ b/mainmem.init.s @@ -55,7 +55,7 @@ RTSINST LDA CMDPATH * Disconnect /RAM ramdrive to avoid aux corruption * Stolen from Beagle Bros Extra K -DISCONN LDA $BF98 +DISCONN LDA MACHID AND #$30 CMP #$30 BNE :S1 diff --git a/mainmem.ldr.s b/mainmem.ldr.s index 7e17d1b..051e0cb 100644 --- a/mainmem.ldr.s +++ b/mainmem.ldr.s @@ -15,9 +15,9 @@ SYSTEM LDX #$FF ; Init stack pointer TXS LDA #$00 - STA $BFFC ; IBAKVER (minimum P8 version) + STA IBAKVER ; Minimum compatible P8 version LDA #$01 - STA $BFFD ; IVERSION (version of me) + STA IVERSION ; Version of .SYSTEM program SED ; Check for 65C02 LDA #$99 @@ -27,21 +27,21 @@ SYSTEM LDX #$FF ; Init stack pointer BPL GOODCPU JMP UNSUPPORTED -GOODCPU LDA $BF98 ; MACHID +GOODCPU LDA MACHID AND #$F2 ; Clear bits 0,2,3 CMP #$B2 ; Are we on a //e or //c w/ 80col and 128K or a IIgs? BEQ SUPPORTED ; Supported machine JMP UNSUPPORTED ; Unsupported machine SUPPORTED LDA #$DF ; Protect pages $0,$1,and $3-$7 - STA $BF58 + STA P8BMAP0007 LDA #$F0 ; Protect pages $8-$B - STA $BF59 + STA P8BMAP080F LDA #$FF ; Protect HGR1 - STA $BF5C - STA $BF5D - STA $BF5E - STA $BF5F + STA P8BMAP2027 + STA P8BMAP282F + STA P8BMAP3037 + STA P8BMAP383F JMP START UNSUPPORTED JSR HOME @@ -61,7 +61,7 @@ UNSUPKEY LDA $C000 DW UNSUPQPARM UNSUPQPARM DB $04,$00,$00,$00,$00,$00,$00 -UNSUPMSG ASC "APPLECORN REQUIRES AN APPLE IIGS, APPLE" +UNSUPMSG ASC "APPLECORN REQUIRES AN APPLE IIGS, APPLE", 8D ASC "//C, OR ENHANCED APPLE //E WITH AN", 8D ASC "80-COLUMN CARD AND AT LEAST 128K", 8D, 8D ASC "PRESS ANY KEY TO QUIT TO PRODOS", 00 From b5a1b7019be2431a7b50d1987fd3516260ffea52 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sat, 8 Oct 2022 17:37:45 -0400 Subject: [PATCH 4/8] Revert merge of JGH's PR. --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.init.s | 2 +- auxmem.misc.s | 580 ++++++++++++++++++++++++++++++++----------------- auxmem.oscli.s | 370 ++++++++++++++++++------------- freq_table | 2 +- 5 files changed, 600 insertions(+), 354 deletions(-) diff --git a/applecorn.po b/applecorn.po index 2084fc83a4525d61aebcfc58d18b66be424295d2..dfaaaaf6589835ae802db871724c055e096ac9ee 100644 GIT binary patch delta 80 zcmZo@FluNp+AxuY*F#rTkfGr*g9C`sJddS)9t$H7GXXI(5QF%vK+Fcj>_E%`#GKpb Vv2e+(Vzg-Ay^d@9?seR*7Xj&l8V~>g delta 80 zcmZo@FluNp+AxuY*In0`pP}I~g9C`sJddS)9t$H7GXXI(5QF%vK+Fcj>_E%`#GKpb Vv2e+(Vl;2xy^d@9?seR*7Xj|<8YKV# diff --git a/auxmem.init.s b/auxmem.init.s index 1ba01a3..36548c7 100644 --- a/auxmem.init.s +++ b/auxmem.init.s @@ -209,7 +209,7 @@ BYTE00 BEQ BYTE00A ; OSBYTE 0,0 - generate error RTS ; %000x1xxx host type, 'A'pple BYTE00A BRK DB $F7 -HELLO ASC 'Applecorn MOS 2022-10-07' +HELLO ASC 'Applecorn MOS 2022-10-08' DB $00 ; Unify MOS messages GSSPEED DB $00 ; $80 if GS is fast, $00 for slow diff --git a/auxmem.misc.s b/auxmem.misc.s index 4be2df3..01c3529 100644 --- a/auxmem.misc.s +++ b/auxmem.misc.s @@ -9,35 +9,34 @@ * 26-Oct-2021 Corrected entry parameters to OSRDRM. * 03-Nov-2021 Temp'y fix, if can't find SROM, ignores it. * 13-Nov-2021 ROMSELECT calls mainmem to load ROM. -* 08-Oct-2022 ROMSEL doesn't call loder if already paged in. * OSBYTE $80 - ADVAL ************************************ * Read input device or buffer status -BYTE80 LDY #$00 ; Prepare return=&00xx - TXA ; X<0 - info about buffers - BMI ADVALBUF ; X>=0 - read input devices +BYTE80 LDY #$00 ; Prepare return=&00xx + TXA ; X<0 - info about buffers + BMI ADVALBUF ; X>=0 - read input devices CPX #$7F BNE ADVALNONE ADVALWAIT JSR KBDREAD BCS ADVALWAIT TAX - BPL ADVALOK1 ; &00xx for normal keys - INY ; &01xx for function/edit keys + BPL ADVALOK1 ; &00xx for normal keys + INY ; &01xx for function/edit keys ADVALOK1 RTS -ADVALNONE LDX #$00 ; Input, just return 0 +ADVALNONE LDX #$00 ; Input, just return 0 RTS ADVALBUF INX - BEQ :ADVALKBD ; Fake keyboard buffer + BEQ :ADVALKBD ; Fake keyboard buffer INX - BEQ :ADVALOK ; Serial input, return 0 - LDX #$01 ; For outputs, return 1 char free + BEQ :ADVALOK ; Serial input, return 0 + LDX #$01 ; For outputs, return 1 char free RTS -:ADVALKBD BIT $C000 ; Test keyboard data/strobe - BPL :ADVALOK ; No Strobe, return 0 - INX ; Strobe, return 1 +:ADVALKBD BIT $C000 ; Test keyboard data/strobe + BPL :ADVALOK ; No Strobe, return 0 + INX ; Strobe, return 1 :ADVALOK RTS @@ -62,21 +61,21 @@ ADVALBUF INX * (8 * frequency ) * BEEPX EQU #57 ; note=C5 -BEEPX EQU #116 ; note=C4 +BEEPX EQU #116 ; note=C4 BEEP PHA PHX PHY - LDY #$00 ; duration -:L1 LDX #BEEPX ; 2cy pitch 2cy + LDY #$00 ; duration +:L1 LDX #BEEPX ; 2cy pitch 2cy *------------------------------------------------------ -:L2 DEX ; 2cy BEEPX * 2cy - BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy +:L2 DEX ; 2cy BEEPX * 2cy + BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy *------------------------------------------------------ * BEEPX*5-1cy - LDA $C030 ; 4cy BEEPX*5+5 - DEY ; 2cy BEEPX*5+7 - BNE :L1 ; 3cy/2cy BEEPX*5+10 - PLY ; + LDA $C030 ; 4cy BEEPX*5+5 + DEY ; 2cy BEEPX*5+7 + BNE :L1 ; 3cy/2cy BEEPX*5+10 + PLY ; PLX PLA RTS @@ -86,9 +85,9 @@ BEEP PHA OUTSTR TXA * Print string pointed to by A,Y to the screen -PRSTR STA OSTEXT+0 ; String in A,Y +PRSTR STA OSTEXT+0 ; String in A,Y STY OSTEXT+1 -:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT +:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT BEQ PRSTROK JSR OSASCI INC OSTEXT @@ -107,7 +106,7 @@ FORCENL LDA #$86 * Print XY in hex OUT2HEX TYA JSR OUTHEX - TXA ; Continue into OUTHEX + TXA ; Continue into OUTHEX * Print hex byte in A OUTHEX PHA @@ -118,16 +117,16 @@ OUTHEX PHA AND #$0F JSR PRNIB PLA - AND #$0F ; Continue into PRNIB + AND #$0F ; Continue into PRNIB * Print hex nibble in A PRNIB CMP #$0A BCC :S1 - CLC ; >= $0A + CLC ; >= $0A ADC #'A'-$0A JSR OSWRCH RTS -:S1 ADC #'0' ; < $0A +:S1 ADC #'0' ; < $0A JMP OSWRCH * TEMP ENTRY * @@ -149,35 +148,35 @@ OSPAD EQU OSTEXT+4 * X=>four byte zero page locations * Y= number of digits to pad to, 0 for no padding * -PRINTDEC sty OSPAD ; Number of padding+digits - ldy #0 ; Digit counter -PRDECDIGIT lda #32 ; 32-bit divide +PRINTDEC sty OSPAD ; Number of padding+digits + ldy #0 ; Digit counter +PRDECDIGIT lda #32 ; 32-bit divide sta OSTEMP - lda #0 ; Remainder=0 - clv ; V=0 means div result = 0 -PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10 + lda #0 ; Remainder=0 + clv ; V=0 means div result = 0 +PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10 bcc PRDEC10 - sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0 - sec ; Shift 1 into div result -PRDEC10 rol 0,x ; Shift /10 result into OSNUM + sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0 + sec ; Shift 1 into div result +PRDEC10 rol 0,x ; Shift /10 result into OSNUM rol 1,x rol 2,x rol 3,x - rol a ; Shift bits of input into acc (input mod 10) + rol a ; Shift bits of input into acc (input mod 10) dec OSTEMP - bne PRDECDIV10 ; Continue 32-bit divide + bne PRDECDIV10 ; Continue 32-bit divide ora #48 - pha ; Push low digit 0-9 to print + pha ; Push low digit 0-9 to print iny - bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit + bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit lda #32 PRDECLP1 cpy OSPAD - bcs PRDECLP2 ; Enough padding pushed - pha ; Push leading space characters + bcs PRDECLP2 ; Enough padding pushed + pha ; Push leading space characters iny bne PRDECLP1 -PRDECLP2 pla ; Pop character left to right - jsr OSWRCH ; Print it +PRDECLP2 pla ; Pop character left to right + jsr OSWRCH ; Print it dey bne PRDECLP2 rts @@ -198,16 +197,16 @@ PRDECLP2 pla ; Pop character left to right * Very difficult to write this without it being a direct clone * from the BBC MOS. ;) * -GSINTGO ROR GSFLAG ; CY initially into bit 7 - JSR SKIPSPC ; Skip any spaces - INY ; Step past in case it's a quote - CMP #$22 ; Is it a quote? +GSINTGO ROR GSFLAG ; CY initially into bit 7 + JSR SKIPSPC ; Skip any spaces + INY ; Step past in case it's a quote + CMP #$22 ; Is it a quote? BEQ GSINTGO1 - DEY ; Wasn't a quote, step back - CLC ; Prepare CC=no leading quote -GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags + DEY ; Wasn't a quote, step back + CLC ; Prepare CC=no leading quote +GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags CMP #$0D - RTS ; Return EQ if end of line + RTS ; Return EQ if end of line * GSFLAG set to: * bit7: leading quote found * bit6: CC=filename CS=*KEY @@ -250,13 +249,13 @@ GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags * INX:BNE loop * done * -GSRDGO LDA #$00 ; Prepare to clear accumulator -GSREADLP STA GSCHAR ; Update accumulator - LDA (OSLPTR),Y ; Get current character - CMP #$0D ; End of line? - BNE GSREAD2 ; No, check character +GSRDGO LDA #$00 ; Prepare to clear accumulator +GSREADLP STA GSCHAR ; Update accumulator + LDA (OSLPTR),Y ; Get current character + CMP #$0D ; End of line? + BNE GSREAD2 ; No, check character BIT GSFLAG - BPL GSREADEND ; We aren't waiting for a closing quote + BPL GSREADEND ; We aren't waiting for a closing quote * ; End of line before closing quote ERRBADSTR BRK DB $FD @@ -264,54 +263,54 @@ ERRBADSTR BRK BRK GSREAD2 CMP #' ' - BCC ERRBADSTR ; Embedded control char - BNE GSREAD3 ; Not a space, process it - BIT GSFLAG ; Can space terminate string? - BMI GSREADCHAR ; We're waiting for a terminating quote + BCC ERRBADSTR ; Embedded control char + BNE GSREAD3 ; Not a space, process it + BIT GSFLAG ; Can space terminate string? + BMI GSREADCHAR ; We're waiting for a terminating quote * ; so return the space character - BVC GSREADEND ; Space is a terminator, finish -GSREAD3 CMP #$22 ; Is it a quote? - BNE GSREADESC ; Not quote, check for escapes - BIT GSFLAG ; Was there an opening quote? - BPL GSREADCHAR ; Not waiting for a closing quote - INY ; Waiting for quote, check next character + BVC GSREADEND ; Space is a terminator, finish +GSREAD3 CMP #$22 ; Is it a quote? + BNE GSREADESC ; Not quote, check for escapes + BIT GSFLAG ; Was there an opening quote? + BPL GSREADCHAR ; Not waiting for a closing quote + INY ; Waiting for quote, check next character LDA (OSLPTR),Y - CMP #$22 ; Is it another quote? - BEQ GSREADCHAR ; Quote-Quote, expand to single quote + CMP #$22 ; Is it another quote? + BEQ GSREADCHAR ; Quote-Quote, expand to single quote * End of string * Either closing quote, or a space seperator, or end of line -GSREADEND JSR SKIPSPC ; Skip any spaces to next word - SEC ; SEC=end of string - RTS ; and (OSLPTR),Y=>next word or end of line +GSREADEND JSR SKIPSPC ; Skip any spaces to next word + SEC ; SEC=end of string + RTS ; and (OSLPTR),Y=>next word or end of line * CS=end of string * EQ=end of line * NE=not end of line, more words follow -GSREADESC CMP #$7C ; Is it '|' escape character - BNE GSREADCHAR ; No, return as character - INY ; Step to next character +GSREADESC CMP #$7C ; Is it '|' escape character + BNE GSREADCHAR ; No, return as character + INY ; Step to next character LDA (OSLPTR),Y CMP #$7C - BEQ GSREADCHAR ; bar-bar expands to bar + BEQ GSREADCHAR ; bar-bar expands to bar CMP #$22 - BEQ GSREADCHAR ; bar-quote expands to quote - CMP #'!' ; Is it bar-pling? - BNE GSREAD5 ; No, check for bar-letter - INY ; Step past it - LDA #$80 ; Set bit 7 in accumulator - BNE GSREADLP ; Loop back to check next character(s) + BEQ GSREADCHAR ; bar-quote expands to quote + CMP #'!' ; Is it bar-pling? + BNE GSREAD5 ; No, check for bar-letter + INY ; Step past it + LDA #$80 ; Set bit 7 in accumulator + BNE GSREADLP ; Loop back to check next character(s) -GSREAD5 CMP #'?' ; Check for '?' - BCC ERRBADSTR ; <'?', bad character - BEQ GSREADDEL ; bar-query -> DEL - AND #$1F ; Convert bar-letter to control code - BIT SETV ; SEV=control character +GSREAD5 CMP #'?' ; Check for '?' + BCC ERRBADSTR ; <'?', bad character + BEQ GSREADDEL ; bar-query -> DEL + AND #$1F ; Convert bar-letter to control code + BIT SETV ; SEV=control character BVS GSREADOK GSREADDEL LDA #$7F -GSREADCHAR CLV ; CLV=not control character -GSREADOK INY ; Step to next character - ORA GSCHAR ; Add in any bit 7 from |! prefix - CLC ; CLC=not end of string +GSREADCHAR CLV ; CLV=not control character +GSREADOK INY ; Step to next character + ORA GSCHAR ; Add in any bit 7 from |! prefix + CLC ; CLC=not end of string RTS * CC=not end of string * VS=control character @@ -321,13 +320,13 @@ GSREADOK INY ; Step to next character * Read a byte from sideways ROM * On entry, Y=ROM to read from * On exit, A=byte read, X=current ROM, Y=$00 -RDROM LDA ROMID - PHA ; Save current ROM +RDROM LDA $F4 + PHA ; Save current ROM TYA - TAX ; X=ROM to read from - JSR ROMSELECT ; Page in the required ROM + TAX ; X=ROM to read from + JSR ROMSELECT ; Page in the required ROM LDY #$00 - LDA (ROMPTR),Y ; Read the byte + LDA ($F6),Y ; Read the byte PLX * Select a sideways ROM @@ -336,33 +335,106 @@ RDROM LDA ROMID ROMSELECT * Insert code here for faking sideways ROMs by loading or otherwise * fetching code to $8000. All registers must be preserved. - PHP - CPX ROMID ; Speed up by checking if - BEQ ROMSELOK ; already paged in +:ROMSEL PHP PHA PHX PHY - SEI - TXA ; A=ROM to select + TXA ; A=ROM to select >>> XF2MAIN,SELECTROM ROMSELDONE >>> ENTAUX PLY PLX PLA - STX ROMID ; Set Current ROM number -ROMSELOK PLP + PLP +:ROMSELOK STX $F4 ; Set Current ROM number RTS - +ROMXX +* CPX $F8 +* BEQ :ROMSELOK ; Already selected +* +** Insert code here for faking sideways ROMs by loading or otherwise +** fetching code to $8000. All registers must be preserved. +* CPX MAXROM +* BEQ :ROMSEL +* BCS :ROMSELOK ; Out of range, ignore +*:ROMSEL PHA +* PHX +* PHY +* +* LDA OSLPTR+0 +* PHA +* LDA OSLPTR+1 +* PHA +* +* TXA +* ASL A +* TAX +* LDA ROMTAB+0,X ; LSB of pointer to name +* STA OSFILECB+0 +* LDA ROMTAB+1,X ; MSB of pointer to name +* STA OSFILECB+1 +* +* LDX #OSFILECB +* LDA #$05 ; Means 'INFO' +* JSR OSFILE +* CMP #$01 +* BNE :ROMNOTFND ; File not found +* +* STZ OSFILECB+2 ; Dest address $8000 +* LDA #$80 +* STA OSFILECB+3 +* STZ OSFILECB+4 +* STZ OSFILECB+5 +* STZ OSFILECB+6 ; Load to specified address +* LDX #OSFILECB +* LDA #$FF ; Means 'LOAD' +* JSR OSFILE +*:ROMNOTFND +* PLA +* STA OSLPTR+1 +* PLA +* STA OSLPTR+0 +* PLY +* PLX +* PLA +* STX $F8 ; Set ROM loaded +*:ROMSELOK STX $F4 ; Set Current ROM number EVENT RTS +*BASICROM ASC 'BASIC2.ROM' +* DB $0D,$00 +* +*COMALROM ASC 'COMAL.ROM' +* DB $0D,$00 +* +*LISPROM ASC 'LISP501.ROM' +* DB $0D,$00 +* +*FORTHROM ASC 'FORTH103.ROM' +* DB $0D,$00 +* +*PROLOGROM ASC 'MPROLOG310.ROM' +* DB $0D,$00 +* +*BCPLROM ASC 'BCPL7.0.ROM' +* DB $0D,$00 +* +*PASCROM1 ASC 'PASC.1.10.1.ROM' +* DB $0D,$00 +* +*PASCROM2 ASC 'PASC.1.10.2.ROM' +* DB $0D,$00 +* * Initialize ROMTAB according to user selection in menu -ROMINIT STZ MAXROM ; One sideways ROM only - STA $C002 ; Read main mem - LDA USERSEL ; *TO DO* Should be actual number of ROMs - STA $C003 ; Read aux mem +ROMINIT STZ MAXROM ; One sideways ROM only + STA $C002 ; Read main mem + LDA USERSEL + STA $C003 ; Read aux mem CMP #6 BNE :X1 @@ -372,13 +444,112 @@ ROMINIT STZ MAXROM ; One sideways ROM only STA MAXROM :X2 RTS +* ASL ; x2 +* CLC +* ADC #ROMS +* ADC #$00 +* STA OSLPTR+1 +* LDY #$00 +* LDA (OSLPTR),Y +* STA ROMTAB+0 +* INY +* LDA (OSLPTR),Y +* STA ROMTAB+1 +* STA $C002 ; Read main mem +* LDA USERSEL +* STA $C003 ; Read aux mem +* CMP #6 ; Menu entry 7 has two ROMs +* BNE :S1 +* LDA #PASCROM2 +* STA ROMTAB+3 +* INC MAXROM ; Two ROMs +* BRA :DONE +*:S1 CMP #7 ; Menu entry 8 +* BNE :DONE +* LDA #PASCROM1 +* STA ROMTAB+1 +* LDA #PASCROM2 +* STA ROMTAB+3 +* LDA #LISPROM +* STA ROMTAB+5 +* LDA #FORTHROM +* STA ROMTAB+7 +* LDA #PROLOGROM +* STA ROMTAB+9 +* LDA #BCPLROM +* STA ROMTAB+11 +* LDA #COMALROM +* STA ROMTAB+13 +* LDA #BASICROM +* STA ROMTAB+15 +* LDA #7 ; 8 sideways ROMs +* STA MAXROM +*:DONE LDA #$FF +* STA $F8 ; Force ROM to load +* RTS +* +** Active sideways ROMs +*ROMTAB DW $0000 ; ROM0 +* DW $0000 ; ROM1 +* DW $0000 ; ROM2 +* DW $0000 ; ROM3 +* DW $0000 ; ROM4 +* DW $0000 ; ROM5 +* DW $0000 ; ROM6 +* DW $0000 ; ROM7 +* DW $0000 ; ROM8 +* DW $0000 ; ROM9 +* DW $0000 ; ROMA +* DW $0000 ; ROMB +* DW $0000 ; ROMC +* DW $0000 ; ROMD +* DW $0000 ; ROME +* DW $0000 ; ROMF +* +** ROM filenames in same order as in the menu +** ROMMENU copies these to ROMTAB upon user selection +*ROMS DW BASICROM +* DW COMALROM +* DW LISPROM +* DW FORTHROM +* DW PROLOGROM +* DW BCPLROM +* DW PASCROM1 +* DW PASCROM2 + +*EVENT LDA #OSEVENM +* JMP PRSTR +*OSEVENM ASC 'OSEVEN.' +* DB $00 + ********************************************************** * Interrupt Handlers, MOS redirection vectors etc. ********************************************************** * Invoked from GSBRK in main memory. On IIgs only. -GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI +GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI * Continue into IRQBRKHDLR * TO DO: Check, IENTAUX modifies X @@ -386,43 +557,56 @@ GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI IRQBRKHDLR PHA * Mustn't enable IRQs within the IRQ handler * Do not use WRTMAIN/WRTAUX macros - STA $C004 ; Write to main memory - STA $45 ; $45=A for ProDOS IRQ handlers - STA $C005 ; Write to aux memory + BIT $C014 ; Set N if aux write active + STA $C004 ; Write to main memory + STA $45 ; $45=A for ProDOS IRQ handlers + BPL :S1 ; If aux write wasn't active, skip + STA $C005 ; Write to aux memory + +:S1 LDA GSSPEED ; See if GS was set to 2.8MHz + CMP #$80 + BNE :S2 ; Nope, continue slow + TSB $C036 ; GS: Enable 'fast' speed - TXA +:S2 TXA PHA CLD TSX - LDA $103,X ; Get PSW from stack + PHX + INX + INX + INX + LDA $100,X ; Get PSW from stack AND #$10 - BEQ :IRQ ; IRQ + BEQ :IRQ ; IRQ SEC - LDA $0104,X + INX + LDA $0100,X SBC #$01 - STA FAULT+0 ; FAULT=>error block after BRK - LDA $0105,X + STA FAULT+0 ; FAULT=>error block after BRK + INX + LDA $0100,X SBC #$00 STA FAULT+1 - LDA $F4 ; Get current ROM - STA BYTEVARBASE+$BA ; Set ROM at last BRK - STX OSXREG ; Pass stack pointer - LDA #$06 ; Service Call 6 = BRK occured + LDA $F4 ; Get current ROM + STA BYTEVARBASE+$BA ; Set ROM at last BRK + PLX + STX OSXREG ; Pass stack pointer + LDA #$06 ; Service Call 6 = BRK occured JSR SERVICE - LDX BYTEVARBASE+$FC ; Get current language - JSR ROMSELECT ; Bring it into memory + LDX BYTEVARBASE+$FC ; Get current language + JSR ROMSELECT ; Bring it into memory PLA TAX PLA - CLI - JMP (BRKV) ; Pass on to BRK handler + JMP (BRKV) ; Pass on to BRK handler -:IRQ >>> XF2MAIN,A2IRQ ; Bounce to Apple IRQ handler +:IRQ >>> XF2MAIN,A2IRQ ; Bounce to Apple IRQ handler IRQBRKRET - >>> IENTAUX ; IENTAUX does not do CLI - PLA ; TODO: Pass on to IRQ1V + >>> IENTAUX ; IENTAUX does not do CLI + PLA ; TODO: Pass on to IRQ1V TAX PLA NULLRTI RTI @@ -442,7 +626,7 @@ MOSBRKHDLR LDA #parameters -* if b6=0 XY=>parameters * fsc commands CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' DB $85 @@ -83,19 +79,19 @@ CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' * filing utilities ASC 'TYPE' DB $80 - DW CMDTYPE-1 ; TYPE -> (LPTR)=>params + DW TYPE-1 ; TYPE -> (LPTR)=>params ASC 'DUMP' DB $80 - DW CMDDUMP-1 ; DUMP -> (LPTR)=>params + DW DUMP-1 ; DUMP -> (LPTR)=>params ASC 'SPOOL' DB $80 - DW CMDSPOOL-1 ; SPOOL -> (LPTR)=>params + DW SPOOL-1 ; SPOOL -> (LPTR)=>params ASC 'EXEC' DB $80 - DW CMDEXEC-1 ; EXEC -> (LPTR)=>params + DW EXEC-1 ; EXEC -> (LPTR)=>params ASC 'CLOSE' DB $80 - DW CMDCLOSE-1 ; CLOSE -> (LPTR)=>params + DW STARCLOSE-1 ; CLOSE -> (LPTR)=>params * BUILD * terminator DB $FF @@ -170,8 +166,8 @@ CLIMATCH3 JSR SKIPSPC ; (OSLPTR),Y=>parameters PHA ; Push address low TXA ; Command byte PHA - ASL A ; Move bit 6 into bit 7 - BEQ CLICALL ; If $80-&BF don't convert LPTR + ASL A ; Drop bit 7 + BEQ CLICALL ; If $80 don't convert LPTR JSR LPTRtoXY ; XY=>parameters CLICALL PLA ; A=command parameter RTS ; Call command routine @@ -375,7 +371,7 @@ LPTRtoXY CLC XYtoLPTR STX OSLPTR+0 STY OSLPTR+1 LDY #0 -STARHELP9 RTS + RTS * Print *HELP text STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters @@ -383,9 +379,8 @@ STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters LDX #command table LDY #>HLPTABLE JSR CLILOOKUP ; Look for *HELP subject - BEQ STARHELP9 ; Matched LDA $8006 ; Does ROM have service entry? - BMI STARHELP6 ; Yes, skip to send service call + BMI STARHELP6 ; Yes, send service call JSR OSNEWL LDA #$09 ; Language name LDY #$80 ; *TO DO* make this and BYTE8E @@ -538,179 +533,236 @@ ECHOLP1 JSR GSREAD JMP ECHOLP1 * FILING UTILITIES -* ================ +****************** * *CLOSE ******** -CMDCLOSE LDA #$00 +STARCLOSE LDA #$00 TAY JSR OSFIND ; Close all files - STA FXEXEC ; Ensure Spool/Exec handles cleared + STA FXEXEC ; Clear Spool/Exec handles STA FXSPOOL RTS -* *TYPE -************** +* Handle *TYPE command * LPTR=>parameters string * -CMDTYPE - LDA (OSLPTR),Y ; TEMP - CMP #$0D ; TEMP - BEQ ERRTYPE ; No filename - JSR LPTRtoXY ; TEMP -* - JSR OPENINFILE ; Try to open file -:LOOP JSR OSBGET ; Read a byte - BCS TYPDMPEND ; EOF - CMP #$0A - BEQ :LOOP ; Ignore - TAX ; Remember last character - JSR OSASCI ; Print the character - BIT ESCFLAG - BPL :LOOP ; No Escape, keep going -TYPEESC JSR TYPCLOSE -ERRESCAPE BRK +TYPE JSR LPTRtoXY + PHX + PHY + JSR XYtoLPTR + JSR PARSLPTR ; Just for error handling + BEQ :SYNTAX ; No filename + PLY + PLX + LDA #$40 ; Open for input + JSR OSFIND ; Try to open file + CMP #$00 ; Was file opened? + BEQ :NOTFOUND + TAY ; File handle in Y +:L1 JSR BGETHND ; Read a byte + BCS :CLOSE ; EOF + CMP #$0A ; Don't print LF + BEQ :S1 + JSR OSASCI ; Print the character +:S1 LDA ESCFLAG + BMI :ESC + BRA :L1 +:CLOSE LDA #$00 + JSR OSFIND ; Close file +:DONE RTS +:SYNTAX BRK + DB $DC + ASC 'Syntax: TYPE <*objspec*>' + BRK +:NOTFOUND BRK + DB $D6 + ASC 'Not found' + BRK +:ESC LDA #$00 ; Close file + JSR OSFIND + BRK DB $11 ASC 'Escape' BRK -TYPDMPEND CPX #$0D - BEQ TYPCLOSE - JSR OSNEWL -TYPCLOSE LDA #$00 - JMP OSFIND ; Close file -ERRTYPE BRK - DB $DC - ASC 'Syntax: TYPE ' - BRK + * Handle *DUMP command * LPTR=>parameters string * -CMDDUMP - LDA (OSLPTR),Y ; TEMP - CMP #$0D ; TEMP - BEQ :ERRDUMP ; No filename - JSR LPTRtoXY ; TEMP -* - JSR OPENINFILE ; Try to open file - STZ OSNUM+0 ; Offset = zero - STZ OSNUM+1 -:LOOP1 BIT ESCFLAG - BMI TYPEESC ; Escape pressed - PHY ; Save handle - LDX OSNUM+0 ; Print file offset - LDY OSNUM+1 - JSR PR2HEX - JSR PRSPACE - PLY ; Get handle back - LDA #8 ; 8 bytes to dump - STA OSNUM+2 - TSX ; Reserve bytes on stack - TXA - SEC - SBC OSNUM+2 - TAX - TXS ; X=>space on stack -:LOOP2 JSR OSBGET ; Read a byte - BCS :DUMPEOF - STA $0101,X ; Store on stack - JSR PRHEX ; Print as hex - JSR PRSPACE - INX - DEC OSNUM+2 - BNE :LOOP2 ; Loop to do 8 bytes - CLC ; CLC=Not EOF - BCC :DUMPCHRS ; Jump to display characters -:DUMPEOF LDA #$2A ; EOF met, pad with '**' - JSR OSWRCH - JSR OSWRCH - JSR PRSPACE - LDA #$00 - STA $0101,X - INX - DEC OSNUM+2 - BNE :DUMPEOF ; Loop to do 8 bytes - SEC ; SEC=EOF -:DUMPCHRS LDX #8 ; 8 bytes to print -:LOOP4 PLA ; Get character - PHP ; Save EOF flag - CMP #$7F - BEQ :DUMPDOT - CMP #$20 - BCS :DUMPCHR -:DUMPDOT LDA #$2E -:DUMPCHR JSR OSWRCH ; Print character - INC OSNUM+0 ; Increment offset - BNE :DUMPNXT - INC OSNUM+1 -:DUMPNXT PLP ; Get EOF flag back +DUMP JSR LPTRtoXY + PHX + PHY + JSR XYtoLPTR + JSR PARSLPTR ; Just for error handling + BEQ :SYNTAX ; No filename + PLY + PLX + LDA #$40 ; Open for input + JSR OSFIND ; Try to open file + CMP #$00 ; Was file opened? + BEQ :NOTFOUND + TAY ; File handle in Y + STZ DUMPOFF + STZ DUMPOFF+1 +:L1 JSR BGETHND ; Read a byte + BCS :CLOSE ; EOF + PHA + LDA DUMPOFF+0 + AND #$07 + BNE :INC + LDA DUMPOFF+1 ; Print file offset + JSR PRHEXBYTE + LDA DUMPOFF+0 + JSR PRHEXBYTE + LDA #' ' + JSR OSASCI + LDX #$07 + LDA #' ' ; Clear ASCII buffer +:L2 STA DUMPASCI,X DEX - BNE :LOOP4 ; Loop to do 8 bytes - PHP - JSR OSNEWL - PLP - BCC :LOOP1 - JMP TYPCLOSE ; Close and finish -:ERRDUMP BRK + BNE :L2 +:INC INC DUMPOFF+0 ; Increment file offset + BNE :S1 + INC DUMPOFF+1 +:S1 PLA + STA DUMPASCI,X + JSR PRHEXBYTE + INX + LDA #' ' + JSR OSASCI + CPX #$08 ; If EOL .. + BNE :S2 + JSR PRCHARS ; Print ASCII representation +:S2 LDA ESCFLAG + BMI :ESC + BRA :L1 +:CLOSE JSR PRCHARS ; Print ASCII representation + LDA #$00 + JSR OSFIND ; Close file +:DONE RTS +:SYNTAX BRK DB $DC - ASC 'Syntax: DUMP ' + ASC 'Syntax: DUMP <*objspec*>' BRK +:NOTFOUND BRK + DB $D6 + ASC 'Not found' + BRK +:ESC LDA #$00 ; Close file + JSR OSFIND + BRK + DB $11 + ASC 'Escape' + BRK +DUMPOFF DW $0000 +DUMPASCI DS 8 +* Print byte in A in hex format +PRHEXBYTE PHA + LSR A + LSR A + LSR A + LSR A + JSR PRHEXNIB + PLA + JSR PRHEXNIB + RTS + +* Print nibble in A in hex format +PRHEXNIB AND #$0F + CMP #10 + BPL :LETTER + CLC + ADC #'0' + BRA :PRINT +:LETTER CLC + ADC #'A'-10 +:PRINT JSR OSASCI + RTS + +* Print ASCII char buffer +* with non-printing chars shown as '.' +PRCHARS CPX #$00 + BEQ :DONE + CPX #$08 ; Pad final line + BEQ :S0 + LDA #' ' + JSR OSASCI + JSR OSASCI + JSR OSASCI + INX + BRA PRCHARS +:S0 LDX #$00 +:L2 LDA DUMPASCI,X + CMP #$20 + BMI :NOTPRINT + CMP #$7F + BPL :NOTPRINT + JSR OSASCI +:S1 INX + CPX #$08 + BNE :L2 + JSR OSNEWL + LDX #$00 +:DONE RTS +:NOTPRINT LDA #'.' + JSR OSASCI + BRA :S1 * Handle *SPOOL command * LPTR=>parameters string * -CMDSPOOL - LDA (OSLPTR),Y ; TEMP - CMP #$0D ; TEMP - PHP ; TEMP - JSR LPTRtoXY ; TEMP -* - PHY ; Save Y - LDY FXSPOOL ; Get SPOOL handle - BEQ :SPOOL1 ; Wasn't open, skip closing - LDA #$00 ; A=CLOSE - STA FXSPOOL ; Clear SPOOL handle - JSR OSFIND ; Close SPOOL file -:SPOOL1 PLY ; Get Y back, XY=>filename - PLP ; Get NE=filename, EQ=no filename - BEQ :DONE ; No filename, all done - LDA #$80 ; A=OPENOUT, for writing - JSR OUTPUTFILE ; Try to open file - STA FXSPOOL ; Store SPOOL handle +SPOOL JSR LPTRtoXY + PHX + PHY + JSR XYtoLPTR + JSR PARSLPTR ; Just for error handling + BEQ :CLOSE ; No filename - stop spooling + LDY FXSPOOL ; Already spooling? + BEQ :OPEN + LDA #$00 ; If so, close file + JSR OSFIND +:OPEN PLY + PLX + LDA #$80 ; Open for writing + JSR OSFIND ; Try to open file + STA FXSPOOL ; Store SPOOL file handle + RTS +:CLOSE PLY ; Clean up stack + PLX + LDY FXSPOOL + BEQ :DONE + LDA #$00 + JSR OSFIND ; Close file + STZ FXSPOOL :DONE RTS * Handle *EXEC command * LPTR=>parameters string * -CMDEXEC - LDA (OSLPTR),Y ; TEMP - CMP #$0D ; TEMP - PHP ; TEMP - JSR LPTRtoXY ; TEMP -* - PHY ; Save Y - LDY FXEXEC ; Get EXEC handle - BEQ :EXEC1 ; Wasn't open, skip closing it - LDA #$00 ; A=CLOSE - STA FXEXEC ; Clear EXEC handle - JSR OSFIND ; Close EXEC file -:EXEC1 PLY ; Get Y back, XY=>filename - PLP ; Get NE=filename, EQ=no filename - BEQ EXECDONE ; No filename, all done - JSR OPENINFILE ; Try to open file - STA FXEXEC ; Store EXEC file handle -EXECDONE RTS - -OPENINFILE LDA #$40 ; Open for input -OUTPUTFILE JSR OSFIND ; Try to open file - TAY ; Was file opened? - BNE EXECDONE ; File opened -EXECNOTFND LDA #$46 - JMP MKERROR ; File not found - - +EXEC PHY + LDY FXEXEC + BEQ :EXEC1 + LDA #$00 + STA FXEXEC + JSR OSFIND ; If Exec open, close it +:EXEC1 PLY + LDA (OSLPTR),Y + CMP #$0D + BEQ :DONE ; No filename, all done + JSR LPTRtoXY ; XY=>filename + LDA #$40 ; Open for input + JSR OSFIND ; Try to open file + TAY ; Was file opened? + BEQ :NOTFOUND + STA FXEXEC ; Store EXEC file handle +:DONE RTS +:NOTFOUND BRK + DB $D6 + ASC 'Not found' + BRK * * Handle *FAST command @@ -772,3 +824,9 @@ LOCKZIP LDA #$A5 STA $C05A RTS + + + + + + diff --git a/freq_table b/freq_table index 4e95e70..c118515 100755 --- a/freq_table +++ b/freq_table @@ -6,7 +6,7 @@ # SOUND statements. # -base=123.47 +base=123.47 / 10.0 print("\nFREQHIGH"); for i in range(0,256): From 17eb31efc86a829f7ffd3a5263dca15a1cd1222f Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sat, 8 Oct 2022 17:38:34 -0400 Subject: [PATCH 5/8] Revert "Updated DUMP, TYPE, SPOOL" From c5b889529f7213334b2e984611c049c9237e827d Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sat, 8 Oct 2022 18:54:32 -0400 Subject: [PATCH 6/8] JGH's improvements to auxmem.oscli.s (TYPE/DUMP/SPOOL) --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.oscli.s | 476 ++++++++++++++++++++++--------------------------- 2 files changed, 215 insertions(+), 261 deletions(-) diff --git a/applecorn.po b/applecorn.po index 913c992933c1d866aaaf8d358ae57ebe683e5a99..c47b4a447c7cc72071e3d614eb0b0f8f9e1ed688 100644 GIT binary patch delta 4710 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 delta 4997 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 diff --git a/auxmem.oscli.s b/auxmem.oscli.s index a70aec0..5a9e633 100644 --- a/auxmem.oscli.s +++ b/auxmem.oscli.s @@ -10,97 +10,103 @@ * 12-Sep-2021 *HELP uses subject lookup, *HELP MOS, *HELP HOSTFS. * 25-Oct-2021 Implemented *BASIC. * 07-Oct-2022 *CLOSE is a host command, fixed *EXEC. +* 08-Oct-2022 Rewrote *TYPE, *DUMP, *SPOOL, shares code with *EXEC. +* Sorted command table, added *HELP FILE. * COMMAND TABLE *************** * Table structure is: { string, byte OR $80, destword-1 } $00 -* fsc commands -CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' +* Commands are entered with A=command byte with b7=1 +* +* Ok, let's get around to sorting these +CMDTABLE +CMDFILE ASC 'CAT' ; Must be first command so matches '*.' DB $85 DW STARFSC-1 ; CAT -> FSC 5, XY=>params - ASC 'RUN' - DB $84 - DW STARFSC-1 ; RUN -> FSC 4, XY=>params + ASC 'CDIR' + DB $88 + DW STARFILE-1 ; CDIR -> OSFILE 08, CBLK=>filename + ASC 'CLOSE' + DB $80 + DW CMDCLOSE-1 ; CLOSE -> (LPTR)=>params + ASC 'DELETE' + DB $86 + DW STARFILE-1 ; DELETE -> OSFILE 06, CBLK=>filename + ASC 'DUMP' + DB $80 + DW CMDDUMP-1 ; DUMP -> (LPTR)=>params + ASC 'EXEC' + DB $80 + DW CMDEXEC-1 ; EXEC -> (LPTR)=>params ASC 'EX' DB $89 DW STARFSC-1 ; EX -> FSC 9, XY=>params ASC 'INFO' DB $8A DW STARFSC-1 ; INFO -> FSC 10, XY=>params - ASC 'RENAME' - DB $8C - DW STARFSC-1 ; RENAME -> FSC 12, XY=>params -* osfile commands ASC 'LOAD' DB $FF DW STARLOAD-1 ; LOAD -> OSFILE FF, CBLK=>filename - ASC 'SAVE' - DB $FF - DW STARSAVE-1 ; SAVE -> OSFILE 00, CBLK=>filename - ASC 'DELETE' - DB $86 - DW STARFILE-1 ; DELETE -> OSFILE 06, CBLK=>filename ASC 'MKDIR' DB $88 DW STARFILE-1 ; MKDIR -> OSFILE 08, CBLK=>filename - ASC 'CDIR' - DB $88 - DW STARFILE-1 ; CDIR -> OSFILE 08, CBLK=>filename -* osbyte commands - ASC 'FX' - DB $80 - DW STARFX-1 ; FX -> OSBYTE A,X,Y (LPTR)=>params ASC 'OPT' DB $8B DW STARBYTE-1 ; OPT -> OSBYTE &8B,X,Y XY=>params -* others - ASC 'QUIT' - DB $80 - DW STARQUIT-1 ; QUIT -> (LPTR)=>params - ASC 'HELP' + ASC 'RUN' + DB $84 + DW STARFSC-1 ; RUN -> FSC 4, XY=>params + ASC 'RENAME' + DB $8C + DW STARFSC-1 ; RENAME -> FSC 12, XY=>params + ASC 'SAVE' DB $FF - DW STARHELP-1 ; HELP -> XY=>params - ASC 'BASIC' + DW STARSAVE-1 ; SAVE -> OSFILE 00, CBLK=>filename + ASC 'SPOOL' + DB $80 + DW CMDSPOOL-1 ; SPOOL -> (LPTR)=>params + ASC 'TYPE' + DB $80 + DW CMDTYPE-1 ; TYPE -> (LPTR)=>params + DB $00 ; Split between HELP lists +* +CMDMOS ASC 'BASIC' DB $80 DW STARBASIC-1 ; BASIC -> (LPTR)=>params - ASC 'KEY' - DB $80 - DW STARKEY-1 ; KEY -> (LPTR)=>params ASC 'ECHO' DB $80 DW ECHO-1 ; ECHO -> (LPTR)=>params + ASC 'FX' + DB $80 + DW STARFX-1 ; FX -> OSBYTE A,X,Y (LPTR)=>params ASC 'FAST' DB $80 DW FAST-1 ; FAST -> (LPTR)=>params + ASC 'HELP' + DB $FF + DW STARHELP-1 ; HELP -> XY=>params + ASC 'KEY' + DB $80 + DW STARKEY-1 ; KEY -> (LPTR)=>params + ASC 'QUIT' + DB $80 + DW STARQUIT-1 ; QUIT -> (LPTR)=>params ASC 'SLOW' DB $80 DW SLOW-1 ; SLOW -> (LPTR)=>params -* filing utilities - ASC 'TYPE' - DB $80 - DW TYPE-1 ; TYPE -> (LPTR)=>params - ASC 'DUMP' - DB $80 - DW DUMP-1 ; DUMP -> (LPTR)=>params - ASC 'SPOOL' - DB $80 - DW SPOOL-1 ; SPOOL -> (LPTR)=>params - ASC 'EXEC' - DB $80 - DW EXEC-1 ; EXEC -> (LPTR)=>params - ASC 'CLOSE' - DB $80 - DW STARCLOSE-1 ; CLOSE -> (LPTR)=>params -* BUILD * terminator DB $FF + * *HELP TABLE ************* HLPTABLE ASC 'MOS' DB $80 DW HELPMOS-1 ; *HELP MOS + ASC 'FILE' + DB $80 + DW HELPFILE-1 ; *HELP FILE ASC 'HOSTFS' DB $80 DW HELPHOSTFS-1 ; *HELP HOSTFS @@ -135,7 +141,9 @@ CLINEXT JSR CLISTEP ; No match, step to next entry CLINEXT2 JSR CLISTEP ; Step past byte, address JSR CLISTEP JSR CLISTEP - BPL CLILP4 ; Loop to check next + BNE CLINEXT3 + JSR CLISTEP +CLINEXT3 BPL CLILP4 ; Loop to check next RTS ; Exit, A>$7F CLIDOT LDA (OSTEXT,X) @@ -166,8 +174,8 @@ CLIMATCH3 JSR SKIPSPC ; (OSLPTR),Y=>parameters PHA ; Push address low TXA ; Command byte PHA - ASL A ; Drop bit 7 - BEQ CLICALL ; If $80 don't convert LPTR + ASL A ; Move bit 6 into bit 7 + BEQ CLICALL ; If $80-&BF don't convert LPTR JSR LPTRtoXY ; XY=>parameters CLICALL PLA ; A=command parameter RTS ; Call command routine @@ -371,7 +379,7 @@ LPTRtoXY CLC XYtoLPTR STX OSLPTR+0 STY OSLPTR+1 LDY #0 - RTS +STARHELP9 RTS * Print *HELP text STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters @@ -379,8 +387,9 @@ STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters LDX #command table LDY #>HLPTABLE JSR CLILOOKUP ; Look for *HELP subject + BEQ STARHELP9 ; Matched LDA $8006 ; Does ROM have service entry? - BMI STARHELP6 ; Yes, send service call + BMI STARHELP6 ; Yes, skip to send service call JSR OSNEWL LDA #$09 ; Language name LDY #$80 ; *TO DO* make this and BYTE8E @@ -390,13 +399,15 @@ STARHELP6 LDY #0 ; (OSLPTR),Y=>parameters LDA #9 JMP SERVICE ; Pass to sideways ROM(s) - HELPHOSTFS LDX #FSCCOMMAND BNE HELPLIST -HELPMOS LDX #CMDTABLE - +HELPFILE LDX #CMDFILE + BNE HELPLIST +HELPMOS LDX #CMDMOS +* HELPLIST STX OSTEXT+0 ; Start of command table STY OSTEXT+1 LDX #0 @@ -417,6 +428,7 @@ HELPLP4 LDA #32 JSR CLISTEP JSR CLISTEP JSR CLISTEP + BEQ STARHELP4 BPL HELPLP2 STARHELP4 LDA #$08 JSR OSWRCH @@ -533,236 +545,184 @@ ECHOLP1 JSR GSREAD JMP ECHOLP1 * FILING UTILITIES -****************** +* ================ * *CLOSE ******** -STARCLOSE LDA #$00 +CMDCLOSE LDA #$00 TAY JSR OSFIND ; Close all files - STA FXEXEC ; Clear Spool/Exec handles + STA FXEXEC ; Ensure Spool/Exec handles cleared STA FXSPOOL RTS -* Handle *TYPE command +* *TYPE +************** * LPTR=>parameters string * -TYPE JSR LPTRtoXY - PHX - PHY - JSR XYtoLPTR - JSR PARSLPTR ; Just for error handling - BEQ :SYNTAX ; No filename - PLY - PLX - LDA #$40 ; Open for input - JSR OSFIND ; Try to open file - CMP #$00 ; Was file opened? - BEQ :NOTFOUND - TAY ; File handle in Y -:L1 JSR BGETHND ; Read a byte - BCS :CLOSE ; EOF - CMP #$0A ; Don't print LF - BEQ :S1 - JSR OSASCI ; Print the character -:S1 LDA ESCFLAG - BMI :ESC - BRA :L1 -:CLOSE LDA #$00 - JSR OSFIND ; Close file -:DONE RTS -:SYNTAX BRK - DB $DC - ASC 'Syntax: TYPE <*objspec*>' - BRK -:NOTFOUND BRK - DB $D6 - ASC 'Not found' - BRK -:ESC LDA #$00 ; Close file - JSR OSFIND - BRK +CMDTYPE + LDA (OSLPTR),Y ; TEMP + CMP #$0D ; TEMP + BEQ ERRTYPE ; No filename + JSR LPTRtoXY ; TEMP +* + JSR OPENINFILE ; Try to open file +:LOOP JSR OSBGET ; Read a byte + BCS TYPDMPEND ; EOF + CMP #$0A + BEQ :LOOP ; Ignore + TAX ; Remember last character + JSR OSASCI ; Print the character + BIT ESCFLAG + BPL :LOOP ; No Escape, keep going +TYPEESC JSR TYPCLOSE +ERRESCAPE BRK DB $11 ASC 'Escape' BRK +TYPDMPEND CPX #$0D + BEQ TYPCLOSE + JSR OSNEWL +TYPCLOSE LDA #$00 + JMP OSFIND ; Close file +ERRTYPE BRK + DB $DC + ASC 'Syntax: TYPE ' +ERRDUMP BRK + DB $DC + ASC 'Syntax: DUMP ' + BRK * Handle *DUMP command * LPTR=>parameters string * -DUMP JSR LPTRtoXY - PHX - PHY - JSR XYtoLPTR - JSR PARSLPTR ; Just for error handling - BEQ :SYNTAX ; No filename - PLY - PLX - LDA #$40 ; Open for input - JSR OSFIND ; Try to open file - CMP #$00 ; Was file opened? - BEQ :NOTFOUND - TAY ; File handle in Y - STZ DUMPOFF - STZ DUMPOFF+1 -:L1 JSR BGETHND ; Read a byte - BCS :CLOSE ; EOF - PHA - LDA DUMPOFF+0 - AND #$07 - BNE :INC - LDA DUMPOFF+1 ; Print file offset - JSR PRHEXBYTE - LDA DUMPOFF+0 - JSR PRHEXBYTE - LDA #' ' - JSR OSASCI - LDX #$07 - LDA #' ' ; Clear ASCII buffer -:L2 STA DUMPASCI,X - DEX - BNE :L2 -:INC INC DUMPOFF+0 ; Increment file offset - BNE :S1 - INC DUMPOFF+1 -:S1 PLA - STA DUMPASCI,X - JSR PRHEXBYTE +CMDDUMP + LDA (OSLPTR),Y ; TEMP + CMP #$0D ; TEMP + BEQ ERRDUMP ; No filename + JSR LPTRtoXY ; TEMP +* + JSR OPENINFILE ; Try to open file + STZ OSNUM+0 ; Offset = zero + STZ OSNUM+1 +:LOOP1 BIT ESCFLAG + BMI TYPEESC ; Escape pressed + PHY ; Save handle + TYA + TAX ; X=handle + LDA #$7F + JSR OSBYTE ; Read EOF + PLY ; Get handle back + TXA + BNE TYPCLOSE ; At EOF + LDA OSNUM+1 ; Print file offset + JSR PRHEX + LDA OSNUM+0 + JSR PRHEX + JSR PRSPACE + LDA #8 ; 8 bytes to dump + STA OSNUM+2 + TSX ; Reserve bytes on stack + TXA + SEC + SBC OSNUM+2 + TAX + TXS ; X=>space on stack +:LOOP2 JSR OSBGET ; Read a byte + BCS :DUMPEOF + STA $0101,X ; Store on stack + JSR PRHEX ; Print as hex + JSR PRSPACE INX - LDA #' ' - JSR OSASCI - CPX #$08 ; If EOL .. - BNE :S2 - JSR PRCHARS ; Print ASCII representation -:S2 LDA ESCFLAG - BMI :ESC - BRA :L1 -:CLOSE JSR PRCHARS ; Print ASCII representation + DEC OSNUM+2 + BNE :LOOP2 ; Loop to do 8 bytes + CLC ; CLC=Not EOF + BCC :DUMPCHRS ; Jump to display characters +:DUMPEOF LDA #'*' ; EOF met, pad with '**' + JSR OSWRCH + JSR OSWRCH + JSR PRSPACE LDA #$00 - JSR OSFIND ; Close file -:DONE RTS -:SYNTAX BRK - DB $DC - ASC 'Syntax: DUMP <*objspec*>' - BRK -:NOTFOUND BRK - DB $D6 - ASC 'Not found' - BRK -:ESC LDA #$00 ; Close file - JSR OSFIND - BRK - DB $11 - ASC 'Escape' - BRK -DUMPOFF DW $0000 -DUMPASCI DS 8 - -* Print byte in A in hex format -PRHEXBYTE PHA - LSR A - LSR A - LSR A - LSR A - JSR PRHEXNIB - PLA - JSR PRHEXNIB - RTS - -* Print nibble in A in hex format -PRHEXNIB AND #$0F - CMP #10 - BPL :LETTER - CLC - ADC #'0' - BRA :PRINT -:LETTER CLC - ADC #'A'-10 -:PRINT JSR OSASCI - RTS - -* Print ASCII char buffer -* with non-printing chars shown as '.' -PRCHARS CPX #$00 - BEQ :DONE - CPX #$08 ; Pad final line - BEQ :S0 - LDA #' ' - JSR OSASCI - JSR OSASCI - JSR OSASCI + STA $0101,X INX - BRA PRCHARS -:S0 LDX #$00 -:L2 LDA DUMPASCI,X - CMP #$20 - BMI :NOTPRINT + DEC OSNUM+2 + BNE :DUMPEOF ; Loop to do 8 bytes + SEC ; SEC=EOF +:DUMPCHRS LDX #8 ; 8 bytes to print +:LOOP4 PLA ; Get character + PHP ; Save EOF flag CMP #$7F - BPL :NOTPRINT - JSR OSASCI -:S1 INX - CPX #$08 - BNE :L2 + BEQ :DUMPDOT + CMP #' ' + BCS :DUMPCHR +:DUMPDOT LDA #'.' +:DUMPCHR JSR OSWRCH ; Print character + INC OSNUM+0 ; Increment offset + BNE :DUMPNXT + INC OSNUM+1 +:DUMPNXT PLP ; Get EOF flag back + DEX + BNE :LOOP4 ; Loop to do 8 bytes + PHP JSR OSNEWL - LDX #$00 -:DONE RTS -:NOTPRINT LDA #'.' - JSR OSASCI - BRA :S1 + PLP + BCC :LOOP1 + JMP TYPCLOSE ; Close and finish + * Handle *SPOOL command * LPTR=>parameters string * -SPOOL JSR LPTRtoXY - PHX - PHY - JSR XYtoLPTR - JSR PARSLPTR ; Just for error handling - BEQ :CLOSE ; No filename - stop spooling - LDY FXSPOOL ; Already spooling? - BEQ :OPEN - LDA #$00 ; If so, close file - JSR OSFIND -:OPEN PLY - PLX - LDA #$80 ; Open for writing - JSR OSFIND ; Try to open file - STA FXSPOOL ; Store SPOOL file handle - RTS -:CLOSE PLY ; Clean up stack - PLX - LDY FXSPOOL - BEQ :DONE - LDA #$00 - JSR OSFIND ; Close file - STZ FXSPOOL +CMDSPOOL + LDA (OSLPTR),Y ; TEMP + CMP #$0D ; TEMP + PHP ; TEMP + JSR LPTRtoXY ; TEMP +* + PHY ; Save Y + LDY FXSPOOL ; Get SPOOL handle + BEQ :SPOOL1 ; Wasn't open, skip closing + LDA #$00 ; A=CLOSE + STA FXSPOOL ; Clear SPOOL handle + JSR OSFIND ; Close SPOOL file +:SPOOL1 PLY ; Get Y back, XY=>filename + PLP ; Get NE=filename, EQ=no filename + BEQ :DONE ; No filename, all done + LDA #$80 ; A=OPENOUT, for writing + JSR OUTPUTFILE ; Try to open file + STA FXSPOOL ; Store SPOOL handle :DONE RTS * Handle *EXEC command * LPTR=>parameters string * -EXEC PHY - LDY FXEXEC - BEQ :EXEC1 - LDA #$00 - STA FXEXEC - JSR OSFIND ; If Exec open, close it -:EXEC1 PLY - LDA (OSLPTR),Y - CMP #$0D - BEQ :DONE ; No filename, all done - JSR LPTRtoXY ; XY=>filename - LDA #$40 ; Open for input - JSR OSFIND ; Try to open file - TAY ; Was file opened? - BEQ :NOTFOUND - STA FXEXEC ; Store EXEC file handle -:DONE RTS -:NOTFOUND BRK - DB $D6 - ASC 'Not found' - BRK +CMDEXEC + LDA (OSLPTR),Y ; TEMP + CMP #$0D ; TEMP + PHP ; TEMP + JSR LPTRtoXY ; TEMP +* + PHY ; Save Y + LDY FXEXEC ; Get EXEC handle + BEQ :EXEC1 ; Wasn't open, skip closing it + LDA #$00 ; A=CLOSE + STA FXEXEC ; Clear EXEC handle + JSR OSFIND ; Close EXEC file +:EXEC1 PLY ; Get Y back, XY=>filename + PLP ; Get NE=filename, EQ=no filename + BEQ EXECDONE ; No filename, all done + JSR OPENINFILE ; Try to open file + STA FXEXEC ; Store EXEC file handle +EXECDONE RTS + +OPENINFILE LDA #$40 ; Open for input +OUTPUTFILE JSR OSFIND ; Try to open file + TAY ; Was file opened? + BNE EXECDONE ; File opened +EXECNOTFND JMP ERRNOTFND ; File not found + * * Handle *FAST command @@ -824,9 +784,3 @@ LOCKZIP LDA #$A5 STA $C05A RTS - - - - - - From 7c34850f773c75014fc915215906515265122a10 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sat, 8 Oct 2022 18:58:17 -0400 Subject: [PATCH 7/8] JGH changes to auxmem.misc.s (ROMSEL). --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.misc.s | 583 +++++++++++++++++--------------------------------- 2 files changed, 198 insertions(+), 385 deletions(-) diff --git a/applecorn.po b/applecorn.po index c47b4a447c7cc72071e3d614eb0b0f8f9e1ed688..851fdc3b689d1f1ce729d577a5bcb8585ee6b2d2 100644 GIT binary patch delta 518 zcmZwCZ)g%>90%}w?oQ7=p@|rbqVc?tHDSGI&^%VHkTjDA3SS*t1S2XLK|x@nHyy;e zSe+Du-3p>1IdY`Z*?0x6Bw#!ZA@0V!O_jK+F3`4I$a>pdKOmYE9T_QPAQkRK#su%9pZas%pAn0c^ z@MxD{kk`zk$A+%tVH7w=l;hc;aw2Oe!`Yy=cmzg0KJt`dKe&J821|Zf4Oh_(O)S7e z?2e_66=2;3-s{mtc!lj*B29xVFCeBbSb}lxA7=buQ+iF`k zH>Azs%^ywQR`1$qt-ofgWmYe&epwU9{|;|gut0Fg#HfzP>zz(BZsN-(o-}D6^bs7e m@Xso~Zeh*40t2?T)lFvf^DD3brroS({tw@iBygVWN&N%A((Zl$ delta 484 zcmZwBKWGzS7zXhB7u&qarBdpUg5?CMSkl3wmrylGFtH6E7&0AN#13jHaT217cpzs% zO;8GcRS-+C#gtyic6DmSNe8*>a%tKWsbDiS_3}b-P}DEGJkJlFcYAexMAt{Ex1^qH z6WrMF>0VC%#wlz(%u6$QiDv{xWIDHxImC1^-HhMLOJL9P*R4x)@PhO|pc&H&b)**tp`YG;3l1N)#uwm> zzstq<-1C>NWmF)|%Q@p*IbobHyGFd6psS}K-K*kjPWXKIr>U-;)C(y`xlLnLI3e_) zHCcsbh~Ko*t8h~o*ua*HOJ*HgHGEg*l*yga-29G`^eQec*Q_repdAW~)vr7*$({ET z^w|m=q4zToqMi-M=yC>RznOAA>9!bD=}HD7fdjkpR8TIqrFAt9^0ylB-$oF9Fl7jDy&1)7sMf)wc_hg=0 - read input devices +BYTE80 LDY #$00 ; Prepare return=&00xx + TXA ; X<0 - info about buffers + BMI ADVALBUF ; X>=0 - read input devices CPX #$7F BNE ADVALNONE ADVALWAIT JSR KBDREAD BCS ADVALWAIT TAX - BPL ADVALOK1 ; &00xx for normal keys - INY ; &01xx for function/edit keys + BPL ADVALOK1 ; &00xx for normal keys + INY ; &01xx for function/edit keys ADVALOK1 RTS -ADVALNONE LDX #$00 ; Input, just return 0 +ADVALNONE LDX #$00 ; Input, just return 0 RTS ADVALBUF INX - BEQ :ADVALKBD ; Fake keyboard buffer + BEQ :ADVALKBD ; Fake keyboard buffer INX - BEQ :ADVALOK ; Serial input, return 0 - LDX #$01 ; For outputs, return 1 char free + BEQ :ADVALOK ; Serial input, return 0 + LDX #$01 ; For outputs, return 1 char free RTS -:ADVALKBD BIT $C000 ; Test keyboard data/strobe - BPL :ADVALOK ; No Strobe, return 0 - INX ; Strobe, return 1 +:ADVALKBD BIT $C000 ; Test keyboard data/strobe + BPL :ADVALOK ; No Strobe, return 0 + INX ; Strobe, return 1 :ADVALOK RTS @@ -61,21 +62,21 @@ ADVALBUF INX * (8 * frequency ) * BEEPX EQU #57 ; note=C5 -BEEPX EQU #116 ; note=C4 +BEEPX EQU #116 ; note=C4 BEEP PHA PHX PHY - LDY #$00 ; duration -:L1 LDX #BEEPX ; 2cy pitch 2cy + LDY #$00 ; duration +:L1 LDX #BEEPX ; 2cy pitch 2cy *------------------------------------------------------ -:L2 DEX ; 2cy BEEPX * 2cy - BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy +:L2 DEX ; 2cy BEEPX * 2cy + BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy *------------------------------------------------------ * BEEPX*5-1cy - LDA $C030 ; 4cy BEEPX*5+5 - DEY ; 2cy BEEPX*5+7 - BNE :L1 ; 3cy/2cy BEEPX*5+10 - PLY ; + LDA $C030 ; 4cy BEEPX*5+5 + DEY ; 2cy BEEPX*5+7 + BNE :L1 ; 3cy/2cy BEEPX*5+10 + PLY ; PLX PLA RTS @@ -85,9 +86,9 @@ BEEP PHA OUTSTR TXA * Print string pointed to by A,Y to the screen -PRSTR STA OSTEXT+0 ; String in A,Y +PRSTR STA OSTEXT+0 ; String in A,Y STY OSTEXT+1 -:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT +:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT BEQ PRSTROK JSR OSASCI INC OSTEXT @@ -106,7 +107,7 @@ FORCENL LDA #$86 * Print XY in hex OUT2HEX TYA JSR OUTHEX - TXA ; Continue into OUTHEX + TXA ; Continue into OUTHEX * Print hex byte in A OUTHEX PHA @@ -117,16 +118,16 @@ OUTHEX PHA AND #$0F JSR PRNIB PLA - AND #$0F ; Continue into PRNIB + AND #$0F ; Continue into PRNIB * Print hex nibble in A PRNIB CMP #$0A BCC :S1 - CLC ; >= $0A + CLC ; >= $0A ADC #'A'-$0A JSR OSWRCH RTS -:S1 ADC #'0' ; < $0A +:S1 ADC #'0' ; < $0A JMP OSWRCH * TEMP ENTRY * @@ -148,35 +149,35 @@ OSPAD EQU OSTEXT+4 * X=>four byte zero page locations * Y= number of digits to pad to, 0 for no padding * -PRINTDEC sty OSPAD ; Number of padding+digits - ldy #0 ; Digit counter -PRDECDIGIT lda #32 ; 32-bit divide +PRINTDEC sty OSPAD ; Number of padding+digits + ldy #0 ; Digit counter +PRDECDIGIT lda #32 ; 32-bit divide sta OSTEMP - lda #0 ; Remainder=0 - clv ; V=0 means div result = 0 -PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10 + lda #0 ; Remainder=0 + clv ; V=0 means div result = 0 +PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10 bcc PRDEC10 - sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0 - sec ; Shift 1 into div result -PRDEC10 rol 0,x ; Shift /10 result into OSNUM + sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0 + sec ; Shift 1 into div result +PRDEC10 rol 0,x ; Shift /10 result into OSNUM rol 1,x rol 2,x rol 3,x - rol a ; Shift bits of input into acc (input mod 10) + rol a ; Shift bits of input into acc (input mod 10) dec OSTEMP - bne PRDECDIV10 ; Continue 32-bit divide + bne PRDECDIV10 ; Continue 32-bit divide ora #48 - pha ; Push low digit 0-9 to print + pha ; Push low digit 0-9 to print iny - bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit + bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit lda #32 PRDECLP1 cpy OSPAD - bcs PRDECLP2 ; Enough padding pushed - pha ; Push leading space characters + bcs PRDECLP2 ; Enough padding pushed + pha ; Push leading space characters iny bne PRDECLP1 -PRDECLP2 pla ; Pop character left to right - jsr OSWRCH ; Print it +PRDECLP2 pla ; Pop character left to right + jsr OSWRCH ; Print it dey bne PRDECLP2 rts @@ -197,16 +198,16 @@ PRDECLP2 pla ; Pop character left to right * Very difficult to write this without it being a direct clone * from the BBC MOS. ;) * -GSINTGO ROR GSFLAG ; CY initially into bit 7 - JSR SKIPSPC ; Skip any spaces - INY ; Step past in case it's a quote - CMP #$22 ; Is it a quote? +GSINTGO ROR GSFLAG ; CY initially into bit 7 + JSR SKIPSPC ; Skip any spaces + INY ; Step past in case it's a quote + CMP #$22 ; Is it a quote? BEQ GSINTGO1 - DEY ; Wasn't a quote, step back - CLC ; Prepare CC=no leading quote -GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags + DEY ; Wasn't a quote, step back + CLC ; Prepare CC=no leading quote +GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags CMP #$0D - RTS ; Return EQ if end of line + RTS ; Return EQ if end of line * GSFLAG set to: * bit7: leading quote found * bit6: CC=filename CS=*KEY @@ -249,13 +250,13 @@ GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags * INX:BNE loop * done * -GSRDGO LDA #$00 ; Prepare to clear accumulator -GSREADLP STA GSCHAR ; Update accumulator - LDA (OSLPTR),Y ; Get current character - CMP #$0D ; End of line? - BNE GSREAD2 ; No, check character +GSRDGO LDA #$00 ; Prepare to clear accumulator +GSREADLP STA GSCHAR ; Update accumulator + LDA (OSLPTR),Y ; Get current character + CMP #$0D ; End of line? + BNE GSREAD2 ; No, check character BIT GSFLAG - BPL GSREADEND ; We aren't waiting for a closing quote + BPL GSREADEND ; We aren't waiting for a closing quote * ; End of line before closing quote ERRBADSTR BRK DB $FD @@ -263,54 +264,54 @@ ERRBADSTR BRK BRK GSREAD2 CMP #' ' - BCC ERRBADSTR ; Embedded control char - BNE GSREAD3 ; Not a space, process it - BIT GSFLAG ; Can space terminate string? - BMI GSREADCHAR ; We're waiting for a terminating quote + BCC ERRBADSTR ; Embedded control char + BNE GSREAD3 ; Not a space, process it + BIT GSFLAG ; Can space terminate string? + BMI GSREADCHAR ; We're waiting for a terminating quote * ; so return the space character - BVC GSREADEND ; Space is a terminator, finish -GSREAD3 CMP #$22 ; Is it a quote? - BNE GSREADESC ; Not quote, check for escapes - BIT GSFLAG ; Was there an opening quote? - BPL GSREADCHAR ; Not waiting for a closing quote - INY ; Waiting for quote, check next character + BVC GSREADEND ; Space is a terminator, finish +GSREAD3 CMP #$22 ; Is it a quote? + BNE GSREADESC ; Not quote, check for escapes + BIT GSFLAG ; Was there an opening quote? + BPL GSREADCHAR ; Not waiting for a closing quote + INY ; Waiting for quote, check next character LDA (OSLPTR),Y - CMP #$22 ; Is it another quote? - BEQ GSREADCHAR ; Quote-Quote, expand to single quote + CMP #$22 ; Is it another quote? + BEQ GSREADCHAR ; Quote-Quote, expand to single quote * End of string * Either closing quote, or a space seperator, or end of line -GSREADEND JSR SKIPSPC ; Skip any spaces to next word - SEC ; SEC=end of string - RTS ; and (OSLPTR),Y=>next word or end of line +GSREADEND JSR SKIPSPC ; Skip any spaces to next word + SEC ; SEC=end of string + RTS ; and (OSLPTR),Y=>next word or end of line * CS=end of string * EQ=end of line * NE=not end of line, more words follow -GSREADESC CMP #$7C ; Is it '|' escape character - BNE GSREADCHAR ; No, return as character - INY ; Step to next character +GSREADESC CMP #$7C ; Is it '|' escape character + BNE GSREADCHAR ; No, return as character + INY ; Step to next character LDA (OSLPTR),Y CMP #$7C - BEQ GSREADCHAR ; bar-bar expands to bar + BEQ GSREADCHAR ; bar-bar expands to bar CMP #$22 - BEQ GSREADCHAR ; bar-quote expands to quote - CMP #'!' ; Is it bar-pling? - BNE GSREAD5 ; No, check for bar-letter - INY ; Step past it - LDA #$80 ; Set bit 7 in accumulator - BNE GSREADLP ; Loop back to check next character(s) + BEQ GSREADCHAR ; bar-quote expands to quote + CMP #'!' ; Is it bar-pling? + BNE GSREAD5 ; No, check for bar-letter + INY ; Step past it + LDA #$80 ; Set bit 7 in accumulator + BNE GSREADLP ; Loop back to check next character(s) -GSREAD5 CMP #'?' ; Check for '?' - BCC ERRBADSTR ; <'?', bad character - BEQ GSREADDEL ; bar-query -> DEL - AND #$1F ; Convert bar-letter to control code - BIT SETV ; SEV=control character +GSREAD5 CMP #'?' ; Check for '?' + BCC ERRBADSTR ; <'?', bad character + BEQ GSREADDEL ; bar-query -> DEL + AND #$1F ; Convert bar-letter to control code + BIT SETV ; SEV=control character BVS GSREADOK GSREADDEL LDA #$7F -GSREADCHAR CLV ; CLV=not control character -GSREADOK INY ; Step to next character - ORA GSCHAR ; Add in any bit 7 from |! prefix - CLC ; CLC=not end of string +GSREADCHAR CLV ; CLV=not control character +GSREADOK INY ; Step to next character + ORA GSCHAR ; Add in any bit 7 from |! prefix + CLC ; CLC=not end of string RTS * CC=not end of string * VS=control character @@ -320,13 +321,13 @@ GSREADOK INY ; Step to next character * Read a byte from sideways ROM * On entry, Y=ROM to read from * On exit, A=byte read, X=current ROM, Y=$00 -RDROM LDA $F4 - PHA ; Save current ROM +RDROM LDA ROMID + PHA ; Save current ROM TYA - TAX ; X=ROM to read from - JSR ROMSELECT ; Page in the required ROM + TAX ; X=ROM to read from + JSR ROMSELECT ; Page in the required ROM LDY #$00 - LDA ($F6),Y ; Read the byte + LDA (ROMPTR),Y ; Read the byte PLX * Select a sideways ROM @@ -335,106 +336,34 @@ RDROM LDA $F4 ROMSELECT * Insert code here for faking sideways ROMs by loading or otherwise * fetching code to $8000. All registers must be preserved. -:ROMSEL PHP + PHP + CPX ROMID ; Speed up by checking if +* BEQ ROMSELOK ; already paged in +* BUG: This needs ROMID an invalid value on startup so first access works PHA PHX PHY - TXA ; A=ROM to select + SEI + TXA ; A=ROM to select >>> XF2MAIN,SELECTROM ROMSELDONE >>> ENTAUX PLY PLX PLA - PLP -:ROMSELOK STX $F4 ; Set Current ROM number + STX ROMID ; Set Current ROM number +ROMSELOK PLP RTS -ROMXX -* CPX $F8 -* BEQ :ROMSELOK ; Already selected -* -** Insert code here for faking sideways ROMs by loading or otherwise -** fetching code to $8000. All registers must be preserved. -* CPX MAXROM -* BEQ :ROMSEL -* BCS :ROMSELOK ; Out of range, ignore -*:ROMSEL PHA -* PHX -* PHY -* -* LDA OSLPTR+0 -* PHA -* LDA OSLPTR+1 -* PHA -* -* TXA -* ASL A -* TAX -* LDA ROMTAB+0,X ; LSB of pointer to name -* STA OSFILECB+0 -* LDA ROMTAB+1,X ; MSB of pointer to name -* STA OSFILECB+1 -* -* LDX #OSFILECB -* LDA #$05 ; Means 'INFO' -* JSR OSFILE -* CMP #$01 -* BNE :ROMNOTFND ; File not found -* -* STZ OSFILECB+2 ; Dest address $8000 -* LDA #$80 -* STA OSFILECB+3 -* STZ OSFILECB+4 -* STZ OSFILECB+5 -* STZ OSFILECB+6 ; Load to specified address -* LDX #OSFILECB -* LDA #$FF ; Means 'LOAD' -* JSR OSFILE -*:ROMNOTFND -* PLA -* STA OSLPTR+1 -* PLA -* STA OSLPTR+0 -* PLY -* PLX -* PLA -* STX $F8 ; Set ROM loaded -*:ROMSELOK STX $F4 ; Set Current ROM number + EVENT RTS -*BASICROM ASC 'BASIC2.ROM' -* DB $0D,$00 -* -*COMALROM ASC 'COMAL.ROM' -* DB $0D,$00 -* -*LISPROM ASC 'LISP501.ROM' -* DB $0D,$00 -* -*FORTHROM ASC 'FORTH103.ROM' -* DB $0D,$00 -* -*PROLOGROM ASC 'MPROLOG310.ROM' -* DB $0D,$00 -* -*BCPLROM ASC 'BCPL7.0.ROM' -* DB $0D,$00 -* -*PASCROM1 ASC 'PASC.1.10.1.ROM' -* DB $0D,$00 -* -*PASCROM2 ASC 'PASC.1.10.2.ROM' -* DB $0D,$00 -* * Initialize ROMTAB according to user selection in menu -ROMINIT STZ MAXROM ; One sideways ROM only - STA $C002 ; Read main mem - LDA USERSEL - STA $C003 ; Read aux mem +ROMINIT STZ MAXROM ; One sideways ROM only + STA $C002 ; Read main mem + LDA USERSEL ; *TO DO* Should be actual number of ROMs + STA $C003 ; Read aux mem CMP #6 BNE :X1 @@ -444,112 +373,13 @@ ROMINIT STZ MAXROM ; One sideways ROM only STA MAXROM :X2 RTS -* ASL ; x2 -* CLC -* ADC #ROMS -* ADC #$00 -* STA OSLPTR+1 -* LDY #$00 -* LDA (OSLPTR),Y -* STA ROMTAB+0 -* INY -* LDA (OSLPTR),Y -* STA ROMTAB+1 -* STA $C002 ; Read main mem -* LDA USERSEL -* STA $C003 ; Read aux mem -* CMP #6 ; Menu entry 7 has two ROMs -* BNE :S1 -* LDA #PASCROM2 -* STA ROMTAB+3 -* INC MAXROM ; Two ROMs -* BRA :DONE -*:S1 CMP #7 ; Menu entry 8 -* BNE :DONE -* LDA #PASCROM1 -* STA ROMTAB+1 -* LDA #PASCROM2 -* STA ROMTAB+3 -* LDA #LISPROM -* STA ROMTAB+5 -* LDA #FORTHROM -* STA ROMTAB+7 -* LDA #PROLOGROM -* STA ROMTAB+9 -* LDA #BCPLROM -* STA ROMTAB+11 -* LDA #COMALROM -* STA ROMTAB+13 -* LDA #BASICROM -* STA ROMTAB+15 -* LDA #7 ; 8 sideways ROMs -* STA MAXROM -*:DONE LDA #$FF -* STA $F8 ; Force ROM to load -* RTS -* -** Active sideways ROMs -*ROMTAB DW $0000 ; ROM0 -* DW $0000 ; ROM1 -* DW $0000 ; ROM2 -* DW $0000 ; ROM3 -* DW $0000 ; ROM4 -* DW $0000 ; ROM5 -* DW $0000 ; ROM6 -* DW $0000 ; ROM7 -* DW $0000 ; ROM8 -* DW $0000 ; ROM9 -* DW $0000 ; ROMA -* DW $0000 ; ROMB -* DW $0000 ; ROMC -* DW $0000 ; ROMD -* DW $0000 ; ROME -* DW $0000 ; ROMF -* -** ROM filenames in same order as in the menu -** ROMMENU copies these to ROMTAB upon user selection -*ROMS DW BASICROM -* DW COMALROM -* DW LISPROM -* DW FORTHROM -* DW PROLOGROM -* DW BCPLROM -* DW PASCROM1 -* DW PASCROM2 - -*EVENT LDA #OSEVENM -* JMP PRSTR -*OSEVENM ASC 'OSEVEN.' -* DB $00 - ********************************************************** * Interrupt Handlers, MOS redirection vectors etc. ********************************************************** * Invoked from GSBRK in main memory. On IIgs only. -GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI +GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI * Continue into IRQBRKHDLR * TO DO: Check, IENTAUX modifies X @@ -557,56 +387,43 @@ GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI IRQBRKHDLR PHA * Mustn't enable IRQs within the IRQ handler * Do not use WRTMAIN/WRTAUX macros - BIT $C014 ; Set N if aux write active - STA $C004 ; Write to main memory - STA $45 ; $45=A for ProDOS IRQ handlers - BPL :S1 ; If aux write wasn't active, skip - STA $C005 ; Write to aux memory - -:S1 LDA GSSPEED ; See if GS was set to 2.8MHz - CMP #$80 - BNE :S2 ; Nope, continue slow - TSB $C036 ; GS: Enable 'fast' speed + STA $C004 ; Write to main memory + STA $45 ; $45=A for ProDOS IRQ handlers + STA $C005 ; Write to aux memory -:S2 TXA + TXA PHA CLD TSX - PHX - INX - INX - INX - LDA $100,X ; Get PSW from stack + LDA $103,X ; Get PSW from stack AND #$10 - BEQ :IRQ ; IRQ + BEQ :IRQ ; IRQ SEC - INX - LDA $0100,X + LDA $0104,X SBC #$01 - STA FAULT+0 ; FAULT=>error block after BRK - INX - LDA $0100,X + STA FAULT+0 ; FAULT=>error block after BRK + LDA $0105,X SBC #$00 STA FAULT+1 - LDA $F4 ; Get current ROM - STA BYTEVARBASE+$BA ; Set ROM at last BRK - PLX - STX OSXREG ; Pass stack pointer - LDA #$06 ; Service Call 6 = BRK occured + LDA $F4 ; Get current ROM + STA BYTEVARBASE+$BA ; Set ROM at last BRK + STX OSXREG ; Pass stack pointer + LDA #$06 ; Service Call 6 = BRK occured JSR SERVICE - LDX BYTEVARBASE+$FC ; Get current language - JSR ROMSELECT ; Bring it into memory + LDX BYTEVARBASE+$FC ; Get current language + JSR ROMSELECT ; Bring it into memory PLA TAX PLA - JMP (BRKV) ; Pass on to BRK handler + CLI + JMP (BRKV) ; Pass on to BRK handler -:IRQ >>> XF2MAIN,A2IRQ ; Bounce to Apple IRQ handler +:IRQ >>> XF2MAIN,A2IRQ ; Bounce to Apple IRQ handler IRQBRKRET - >>> IENTAUX ; IENTAUX does not do CLI - PLA ; TODO: Pass on to IRQ1V + >>> IENTAUX ; IENTAUX does not do CLI + PLA ; TODO: Pass on to IRQ1V TAX PLA NULLRTI RTI @@ -626,7 +443,7 @@ MOSBRKHDLR LDA # Date: Sat, 8 Oct 2022 19:38:12 -0600 Subject: [PATCH 8/8] Update ProDOS globals to use labels instead of absolutes --- applecorn.s | 10 ++++++++++ mainmem.init.s | 34 +++++++++++++++++----------------- mainmem.misc.s | 8 ++++---- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/applecorn.s b/applecorn.s index 6f71099..1b4800f 100644 --- a/applecorn.s +++ b/applecorn.s @@ -43,6 +43,16 @@ A2IRQV EQU $3FE * ProDOS Global Page equates * MLI entry point MLI EQU $BF00 +* Device Addresses +DEVADR01 EQU $BF10 +DEVADR32 EQU $BF26 +* Device List +DEVNUM EQU $BF30 +DEVCNT EQU $BF31 +DEVLST EQU $BF32 +* Date & time +PRODOSDATE EQU $BF90 +PRODOSTIME EQU $BF92 * Machine ID byte MACHID EQU $BF98 * Versioning bytes diff --git a/mainmem.init.s b/mainmem.init.s index 6ea06df..efaab4e 100644 --- a/mainmem.init.s +++ b/mainmem.init.s @@ -26,7 +26,7 @@ SETPRFX LDA #GPFXCMD DW GSPFXPL LDX DRVBUF1 ; was $0300 BNE RTSINST - LDA $BF30 + LDA DEVNUM STA ONLNPL+1 ; Device number JSR MLI DB ONLNCMD @@ -59,36 +59,36 @@ DISCONN LDA MACHID AND #$30 CMP #$30 BNE :S1 - LDA $BF26 - CMP $BF10 + LDA DEVADR32 + CMP DEVADR01 BNE :S2 - LDA $BF27 - CMP $BF11 + LDA DEVADR32+1 + CMP DEVADR01+1 BEQ :S1 -:S2 LDY $BF31 -:L1 LDA $BF32,Y +:S2 LDY DEVCNT +:L1 LDA DEVLST,Y AND #$F3 CMP #$B3 BEQ :S3 DEY BPL :L1 BMI :S1 -:S3 LDA $BF32,Y +:S3 LDA DEVLST,Y STA DRVBUF2+1 ; was $0302 -:L2 LDA $BF33,Y - STA $BF32,Y +:L2 LDA DEVLST+1,Y + STA DEVLST,Y BEQ :S4 INY BNE :L2 -:S4 LDA $BF26 +:S4 LDA DEVADR32 STA DRVBUF1 ; was $0300 - LDA $BF27 + LDA DEVADR32+1 STA DRVBUF2 ; was $0301 - LDA $BF10 - STA $BF26 - LDA $BF11 - STA $BF27 - DEC $BF31 + LDA DEVADR01 + STA DEVADR32 + LDA DEVADR01+1 + STA DEVADR32+1 + DEC DEVCNT :S1 RTS * Reset handler - invoked on Ctrl-Reset diff --git a/mainmem.misc.s b/mainmem.misc.s index 2a49cc3..0f64219 100644 --- a/mainmem.misc.s +++ b/mainmem.misc.s @@ -133,13 +133,13 @@ CRTFILE JSR MLI ; GET_TIME STA CREATEPL+2 LDA #$C3 ; Open permissions STA CREATEPL+3 - LDA $BF90 ; Current date + LDA PRODOSDATE ; Current date STA CREATEPL+8 - LDA $BF91 + LDA PRODOSDATE+1 STA CREATEPL+9 - LDA $BF92 ; Current time + LDA PRODOSTIME ; Current time STA CREATEPL+10 - LDA $BF93 + LDA PRODOSTIME+1 STA CREATEPL+11 JSR MLI DB CREATCMD