From a94fa2917ed616e2950f138fb4f4df9993e48f1f Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 29 Mar 2020 12:52:15 -0700 Subject: [PATCH 01/16] Improve XModem Startup - Extended startup timeout for XM.COM so that it doesn't timeout so quickly while host is selecing a file to send. - Updated SD Card How-To from David Reese. --- Doc/ChangeLog.txt | 4 ++++ ..._an_SD_Card_for_Use_with_SC126_v1.5.3.pdf} | Bin 125235 -> 125674 bytes Source/Apps/XM/xmdm125.asm | 8 ++++++++ 3 files changed, 12 insertions(+) rename Doc/Contrib/{SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_v1.5.2.pdf => SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_v1.5.3.pdf} (63%) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index d93d7871..c53feceb 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -1,3 +1,7 @@ +Version 3.0.1 +------------- +- WBW: Increase XModem timeout waiting for host to start sending + Version 3.0.0 ------------- - WBW: v2.9.2 -> 3.0 version upgrade due to scope of changes diff --git a/Doc/Contrib/SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_v1.5.2.pdf b/Doc/Contrib/SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_v1.5.3.pdf similarity index 63% rename from Doc/Contrib/SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_v1.5.2.pdf rename to Doc/Contrib/SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_v1.5.3.pdf index 4c975809ff76887eef0fb4d5ac955ef5f9e36a99..94f75b634fb648a7edaa78c34a627e85a4e042e4 100644 GIT binary patch delta 46061 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 delta 45595 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 U<`w{ijyw<`fPq0$Neb})0X7;;V*mgE diff --git a/Source/Apps/XM/xmdm125.asm b/Source/Apps/XM/xmdm125.asm index 01ab3052..af648a08 100644 --- a/Source/Apps/XM/xmdm125.asm +++ b/Source/Apps/XM/xmdm125.asm @@ -2213,6 +2213,14 @@ ILLDU: CALL ERXIT ; RCVRECD:XRA A ; Initialize error count to zero STA ERRCT +; +;WBW BEGIN: Be more patient waiting for host to start sending file + LDA FRSTIM ; WBW: Get first time flag + ORA A ; WBW: Set CPU flags + JNZ RCVRPT ; WBW: If not first time, bypass + MVI A,-10 ; WBW: Else increase error limit + STA ERRCT ; WBW: Save error new limit +;WBW END ; RCVRPT: IF CONFUN ; Check for function key? CALL FUNCHK ; Yeah, why not? From 6156c4c7657680303ac75b67f69c2a5463b34553 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 29 Mar 2020 15:42:46 -0700 Subject: [PATCH 02/16] XModem Timing Refinements --- Source/Apps/XM/xmdm125.asm | 3 ++- Source/Apps/XM/xmhb.180 | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Source/Apps/XM/xmdm125.asm b/Source/Apps/XM/xmdm125.asm index af648a08..ac881800 100644 --- a/Source/Apps/XM/xmdm125.asm +++ b/Source/Apps/XM/xmdm125.asm @@ -2232,7 +2232,8 @@ RCVRPT: IF CONFUN ; Check for function key? JNZ RCVSABT ; If so, bail out now... ENDIF ; - MVI B,10-1 ; 10-second timeout + ;MVI B,10-1 ; 10-second timeout + MVI B,5-1 ; WBW: 5-second timeout CALL RECV ; Get any character received JC RCVSTOT ; Timeout ; diff --git a/Source/Apps/XM/xmhb.180 b/Source/Apps/XM/xmhb.180 index 2abd3a2e..8f926794 100644 --- a/Source/Apps/XM/xmhb.180 +++ b/Source/Apps/XM/xmhb.180 @@ -243,7 +243,7 @@ EXTRA3: ; BIOID DB 0 ; BIOS ID, 1=HBIOS, 2=UBIOS CPUSPD DB 10 ; CPU speed in MHz -RCVSCL DW 2800 ; RECV loop timeout scalar +RCVSCL DW 6600 ; RECV loop timeout scalar ; RBC DB "RBC, 28-Aug-2019$" ; @@ -302,6 +302,9 @@ U_JPTBL: ; UART initialization ; U_INIT: + LD HL,13000 ; Receive loop timeout scalar + LD (RCVSCL),HL ; ... for UART RCVRDY timing +; LD HL,U_JPTBL LD DE,U_LBL JP MINIT_RET @@ -429,6 +432,9 @@ A_JPTBL: ; ASCI initialization ; A_INIT: + LD HL,7500 ; Receive loop timeout scalar + LD (RCVSCL),HL ; ... for ASCI RCVRDY timing +; ; Test for location of Z180 internal registers ; and use appropriate I/O address. LD B,0 ; set MSB for 16 bit I/O @@ -601,6 +607,9 @@ S_JPTBL: ; SIO initialization ; S_INIT: + LD HL,12000 ; Receive loop timeout scalar + LD (RCVSCL),HL ; ... for UART RCVRDY timing +; ; Suppress interrupts LD A,01H ; WR1 OUT (S_CTLP),A ; Select WR1 @@ -841,6 +850,9 @@ UF_JPTBL: ; USB-FIFO initialization ; UF_INIT: + LD HL,12000 ; Receive loop timeout scalar + LD (RCVSCL),HL ; ... for UART RCVRDY timing +; LD HL,UF_JPTBL LD DE,UF_LBL JP MINIT_RET From a8b29e44f3b9b930a3f466273622c569af345730 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 29 Mar 2020 18:02:07 -0700 Subject: [PATCH 03/16] TMS Driver Z180 Improvements - TMS driver udpated to insert Z180 I/O waitstates internally so other code can run at full speed. - Updated How-To documents from David. - Fixed TUNE app to properly restore Z180 I/O waitstates after manipulating them. --- Doc/ChangeLog.txt | 1 + ...No_1_Serial_Comms_Using_Minicom_v.1.1.pdf} | Bin 343062 -> 420699 bytes Source/Apps/Tune/Tune.asm | 7 +- Source/HBIOS/Config/N8_std.asm | 4 +- Source/HBIOS/cfg_n8.asm | 4 +- Source/HBIOS/tms.asm | 68 ++++++++++++++++-- 6 files changed, 74 insertions(+), 10 deletions(-) rename Doc/Contrib/{SC126_How-To_No_1_Serial_Comms_Using_Minicom.pdf => SC126_How-To_No_1_Serial_Comms_Using_Minicom_v.1.1.pdf} (70%) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index c53feceb..dd2d09be 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -1,6 +1,7 @@ Version 3.0.1 ------------- - WBW: Increase XModem timeout waiting for host to start sending +- WBW: Update TMS driver to dynamically increase Z180 I/O W/S inside driver Version 3.0.0 ------------- diff --git a/Doc/Contrib/SC126_How-To_No_1_Serial_Comms_Using_Minicom.pdf b/Doc/Contrib/SC126_How-To_No_1_Serial_Comms_Using_Minicom_v.1.1.pdf similarity index 70% rename from Doc/Contrib/SC126_How-To_No_1_Serial_Comms_Using_Minicom.pdf rename to Doc/Contrib/SC126_How-To_No_1_Serial_Comms_Using_Minicom_v.1.1.pdf index eb4d5b4876aea7b63bbba9de7db05762120866c8..8a215aa13b277ebc56d6edbe813ddef3397f85be 100644 GIT binary patch delta 123135 zcmZsiQ*h@`u=c}^t&Q!?#Dr^q!FYB~UGwP6uL4#>U}B9ol`h7-W?W* ziC@pSmB@RfZ3s+!LQokE<@)6`n4F0C8#A1EJAOYK<`ddFzcn)gAf4`xk7tXf)E5>` zYd_DzpBVUnbRZSW1wD*Gyb~VjpI*i>5g_d$PNLG7RWICY*oC+3V>1d-3pC;8I z9xZ{vXUWbae~);p)pj>rC3(DA$(K zoAUR=U0IOw-yV64`lPJu#v~H*g}Owd2t+6z5Sa?QZ;}tE3&q0}Z&=pPxN(28EKH?!f)>w2>{!*ZLzIi_jRObZ{WWvsIZrEhqf99LBmIu#;OlzE z5VKy&;HC(S`ThuL|G|5~9xfP9y0$6kq4=W$#P{lH(~=j2@XaScRVFb)1Q)Fu(jao1 z$q#85&sspcEk+2R{Nk@jKlalwlo0tbQtLf+Cg!wD+qsigb#;ucNh+6I&Li{W8&pL zfQYMwnWEu$AQ_E|tUe+S>(dCo>NgmrX*Hj}xEnt7D`DZ!Ht$)Yt63bws&Z^wO5Ccq zqbSQ+QA>7l#AJW5Ya|8Bz3O-EFm7d0F1f!!LnQHq(*n2`$b0A3>{|pkNE-olLpy-o zH)kyU&&9K|jzJ&(YBQs4CP|8j^gmT90Qcl^q#p_DcN68x1P_aV>r`t;%zE9G@Du6> zO?qq$dn=(bd7-d1h5R7@%SXtMdSn1!;h!ZanSidgN)2>0zwZZSCH&)o_M613a1{10 zJ@`hrFTNngbjpEMX}#rQfjLp=B#Ue*#8F>DnL5nOOzVZQRPN+xavd7Qh~45a!0bfK zt^@HE(_}jMK@DAwbiAT>+Sf3sDiBSy_E#JV3@&eg*W@dBlzf?QNIPK=AD1}w?rI4Y z6hW;dQl2(Ek&ObX-ZmyOLVHA@Q1ZN1(WzUl41P33`|56l?l%~gaf{&>3ifmfi~d)DALN71pG9$5FjX)oHES(@3=rD6Vvj) zq>bb7iYz3Iiu`YS(`;}U_=1&2nMr6S{U2QJB(9D!>2aKkB;-1a_ai*|Q5? zTtf2}ru223%Q4DZ*Ez*y;8Pks4Rgfkn3fls1j1Y7vxpk@(;mXJmz2q1)W=fTlm&Td zZ+*~VX-y9_4Y0+njo6CBjV8?w_QpldKI!xj(mGulRQj4SJ(7IeA0EhnKgVudO{5TJ zs+Xx2@5{N}g4pUpf30Hr~izc3&d-ZK88^zb6heF+B`XG?kGgOH}+-UTXRHvYG4 zu}QAwwox0nXLHkzoDe*uq(e-hKH-Q^>0EVChYPeXO+xNr&+B~l!?GsNI!&JgTDAn&iwWM=*q@elJ> z|DWD87}F!=GH4;%Mu+k&`MF{u=C}JgZz0(c6G(y=;vnYK{8_~w3;#l$-bhoHdaVhh zgz9#W)J4AD?fDEXuxm?ZR?QCm9={N9h{zk0z|$mQDIp2AfMQFJcEDbx_zcP11Rh}OEYXzJ&@F4d>zC3 z2utWW7$F7eVnmYAxO@0i_^aoYoZsu$dm%6gb+$){bmUE|a*S$L-3Ki7kcXfQ;jsw^ z%*_f>2!kLwlc9&+u}xUzQ*QR4*Bn&UxE5|3V$DFZ@T@~7#b$1WZWB#Ck)fTEdr_0= zL`CB95tSK&KsSvT;_nc``L!PX^V$3!TbB3ZL<8#&spoFL2zWOrCfZaL_QSvuD~#@v z>|HuavOQQilQ-@?psr1|@9?VqB^a^MAcpt;v)I06w*y;_~`LDcX?DtlRe;vUdSh z`P6l`%+_)qB73aN;df)sC(0yT<8?(->Y>s~h-KNLbhSD9lm4|t46+cXtQp~wN1QY~ zqtW7luF^1}BLw7XB@PS`>PJD|{`tBGnbyr;tkA7axp(4?oRT+aDa$fe+72`??g{4T z{%ZLAK)61XqB^09aE#@#HQZckwn$)GgpKZ60=almREY|&8a`>!*oD*V;FH6!hgfid z`?$w8MTvo|v~VkC971oNe?1SAA{LcGsJf+rdwYhP#i{VvP@aL4>Ktd0Ug&tPp4_;M8_Sr6S01SyOei=Tr@WP%}UNC*p=Ju0eUca_P zp028C+gOOsjD|`(*6XsGy859S*1nz-iugj1yIorI0U0Ul_l?AQ5dMJz>o#ADlgYN-4wdk@&w1 zgQ1eVsy#GCa5aCVK>FMWhdJqvY9nKk$dRtCF133C1yiuMCc&;w9hgsRDlWm*mkSK0 zYU5a*MB*+6s+bq*Pl>-7f`wOn-*6F=@%-ExSY0Rv4h z#@w-2Gu^TRBUNg7_3yGxzls%}1{k@~<{$T8)8wwgCXx|SdV2`C7~zO+9L6I{Q{?@u z<{9tPj#-nPS-x*nC>Y*u^TeH)g|K6h8^|mah?w}HN2WsgIOh(IiH^P7on}u_LKm4J z!|!54*N^dxaWi{<1kP&1(?vy(0FXPKu`9#@-mqN)*yrE1nyE=rJ6EydPhaw4D>IlW zx28ErZIdsQ#A{Ma#-65aivGU);p-WUBn^ z4E=os{Wpmg&6Qokn@!y2fs(86w;1@{S%$$Nhj{eKC78Z0-yoJZ+yW)d_%07+1KCgs5eI(r$$!tIFec@t*{&|i|em= zf1Admt2}iP108JMCY@~655}FUPa#3fZmkL<@q;rNy}ZzvZjFvsq#6_3X{kVtC1PZF zR>6_`ODR?p3xhHrv60e$mn^DU6;+yzMSI*_zABqiBW368j=H>Z9hfv9L+k$00^veT zJ^4ve;J5vgM&{nIinjQ4`*R8ga&(pUC(YZ|t=U=OO6Wn)JDHU-X~=gG?)Z^wytB*? z$eg&!KnyrNH~J{3Cn63wU1dEux*b-*DE5|vwHqwqXx)YoZP$+%y>Pt?%`&5+-yq!f z_lodu@fvVy7e%j0YygLGd3}-AhfJF?GGwDq0qP?c6v@?IYg=|H2elubomP!La}d3l zUfEPvQEd6j3<5QPqu%PGX433qdygKiaz7buS^%$$16h4+l1%wbHlBFq0HmedWXz{9 zB(m)3&($a<+{d{Rj$xg1gnni1gRVx{Jv%58(_~cAwBhHwfDqAe9C%gLps53;?8p8V z?=W@uuXYyFf`ZIx3$3q6(A7HGr;rT6+a4ar=ElA^?QH!d@^c8~(5X>marSAn%b#rI z$0ph(Tu-Ws078d9^NoJbW19lVKV2I^Fgt>cDKjZmr5TurdgJ#7jw$wiQVw@6N8~0X zFS+>p3Bg|ffZmgYut!{!oZF+42F}Y?;aB^W*fwE-qUTauzlJLb1MruG*@g92dO$pb zI^QdzK6fsxi^CIj?ItBZR{%~Sr%b?u!i;XSq(1AHh!bXB?e*~d7uam1+#K0ZFj z$G3p*pB1S0U(14>$Ky|1dbU@LuI^t7yo5W~hMB?U8&XbRcs^ch;KvusIa?&ZwBPEmrTnG8O2a@P0b!tD(|kE0F#Cg&UY zLi(&y4@9la9|E#t6uoz;ltJzJ1YJm} zbH^^%IXia#+vIQ5vOT0P%mgdlMu+6T4Upqrrh-Q3=+6=y$0)+TU18nQg9`Yk8M@Qt zdzde7moh;ILZ_=TzvMRg6eDx^yMqFDIMIXNhlrm`xzr*sJVX@*EH)#%*$7dQ0c8~V zIV(vg?DSpFr_*2T{u2Vq+b+0G-=BpNnA8(64gJc9OL43T_E4!@JCja=CM7bBo%ABl zA_qYDRr{``2&zevO*H3uWEwh@2cb}~W3aqflGc?g#PYP9YIp75#NoQ6BJ6HuwF)w9D7$H&+c`Ez=HP3 z=W`KXdZ^P*!;b!|DtIPYL%;sQs>zQ_vjSKC5OLmef&)Kg|D#TrjA%%F@{Zx9-Wpyr zJo=1OT=sD&`=wIYhitBDDMzisJSFZ@{X8o(>mmsv35M9IEW{Aq$#B#jP_h>kr&gSj z+;`k9kMCOjGvU`+@%%yxtI0fa`^-7;7b3M2fwd6hMtHn#G9jA*ULuz(PCKv0Q%g`{ zTvSPZ-o335f;iBo?`+w8v_EzbA{ZDXBQ+BqtD@MRhv;}o>T>iT5n#|uATjIz@CcvFlf&5nnsZJO;=NopYQ1|e8HGPWR z-!RZ*iR9Yv_3Ow{JSGOO#2bPpt=vRax0NxN8jT)zN%Z@kijtKzz@nHdXe9qvgB9N{ z(<2@CN9Tq-i-u>t!Ig1KK76ceJkvTYstQ3b%JJ|%4CpCa0ja-6u=1^#w$`zUAhWdX zXhR-@)}!o~v0I~GXK25e4*$e(fJ;t3rO4lg!c=&98Mz1_JyLEe`5>+R7XuuD#f2Tj z(PJu3g+!vs&=Po3z+gRMF%8Osd1hYqa#aIfE2_g$&FPO7_cs$m z(awa~vSI;xpUvR67!PUH{Tmz_d-(-Rkajsk@w9FTr8apR@N%XH!K)y;q^Oqlr0G`7 z@e>&tg^P4{NO$y&Tv*zGuBK{ts~pk=X*O{@W&A?>qzZX=>gYBOpZKv$GU(!OXTAlN zp*IyHzr|SFFM8VK)0PQuT0F#|c%%l$kk;hO-WJ`k*rJJFDhz!*VZBDlx!h@G9@{I_|D%NE^ z3ybT28oBWP6ZzhMjL!r&7k}UkrAZhb(3ATm#J8=rG_#MUY$8qNtZ*vjv=>y-d1Wi5 z^>s_J`Yyx+bqHh*PaV!OD&^M)nO=?$PDd+9=%{OgfGxWiJxZ8`%6}etRDG?sU5f`g z@>IHa3%A0pkf#<^HE6tV&6Unx8wp4TURARa>DX*>GS^s_Jq+{K#0zx%rBPuEQ@?k> z&CQ&Op3HL=G`Z8e@hCKH8_47q)VRxUG}2q=d9>5>Jc1hn&w9H{E>Nk?LBDpwu4xt9 z7j|s<0A*39`sAg`*1S9qy!rRQ252;0-2!gQFWZLxv_P=9Uub+a2~g1_BK^@q^|RlC zxsO195A=?lemgWiHF$f zN&^EYRKAU}b2rF$;2KtFG&W(+43)e^{5zd+1I({eWQJGDAwa&o(Ej2~LRYFK8mqzk z_fhhKZ}Ca{R!T}e67p(khtZL9=WkfmO(t4W5zU*AhmBpLNp2+wO~(HE{`0j2miMUV z)d8zYE^n*5f%M?OKgOE4*q|(qEXTPA3Clyy_&t&jabLgSAwZn_eB@2fE{7Yuxo&(d z8!*GL~T4Hx+}w_#R%2`TT^O|l<@j6=QEiH<`&CS}yAHK_ry z4q+c{vetWB-%#xMYs0C=b~()R=3z3W3qd3vY;&(zH+D+PsuTy~WmElirbP2458%(H zKWn~Cv-aR6XlI_l@}99})c3p={%vO{swnl7OSL^T2}_4p>VUk|&S*9J%Kk3=xBcm$ z>s&JxS)4>zluWtgXaf?+nN>Ur6CGG9rljcUWEmm)ixS$Gm}m&B7e$zJHVE(nm-aI1Ipvgn*Ky_I4fHja zUta!EG@I&QP_vY^E7NYY+;AKHeD~NNPf-q>&XJUm3_**4y1)#f@w~d~It^d=xnHQ;0`p9d9IZ_AV zle9mAbC9ARumPfwKloRcx3+khW;nT46b;SI4a}816BRCr&(H9WFD|Zxh5R|t&Y*cP zn4@KYpw!111)dNE(R78}2)8F!Qf!>WP0YNK8hpP;CA>T!7r>e3o7q}kUJk%9%!}zn z=CD9PCcQknxI8&Iy%>Dq_kJHEo4K3Wa1d^bbEgY$2l4Q>^A@@-%bF9H5ofrAx$6HT zY%b7*0@3kFySbTZXu$k&Kz98vDQ3K`bINOl^T*WAi9f|l>Nt0w@-dDH2j%OeJ!xjr z5@n^Nz<&(Z0zFMDiW#sfQfJqEw=d(zTmHY`75cK-qM)wjsOL%jbmFL><`n8ibI0An zHP09P?S&95L>@Hx7Gmz;JVDQxvDi0X4f?Y;Uo$eG+0dJJ+k0booF`sGINkt z%1{&cXSGpGJrLk!%`pMtfZA9MnI4DrjBaZz8$Sf8a*_ zOGAW<`U6%lmA?Ao-f@+NUw|Oy-lXFvyBk`rdpM4wh;4YLOMq4^q zWb(l`pwW)*7}_&fBBW68KlcOi$AK|83OI*941Y(W0d4VIi73b#QQ-X8Qqn*A4+i)V z#^)f`vBxnrWdFyZ#lG`5fI+&{e_SAUP&@Zp+^x+v9@7_F;)&1CL3-Jz=YlL&qRYtg$4~KogAqZt09Eem}B^X z{V=Gc7AedSG2J$lIxL6YtWNSHu+qfV=N6dAM7ltIjCq7<5OQ$f@qJ4`|)`zBnibA#c1!9-_2OZXp$|4BvNm24} zfA1KQA`-lUgHAId|v2K^5qkzO+em3~Cak^wy%$m2mh zleXotNikP#ij#NR7b^StMZf1_y3 zX_AP^EbPir*b|mXeCU|N1s-epZy^xnISp`&9GqIfSwvw>7i*vuvS>CissxcQVnJD~ zVWN;|w&4ek8u6PZLr8}khr`(cDoa>zaHS&JvJ5idvSsmc@F))C{Ek#URG0B8)jh0X zmSy4CrArXco)M1DV%OztQj0;^b4&HO4-1XX-HFsiLn%UoPmv+mX;vr92oYt`U3$eF zFrN@>S07+11TtkRARPbvZMm`tQFywtQdFV%PcfOR-TfB#>k>h|80W*H5+8O5b}hOHdMSc&fi zTFBaYJW#R-rLr3&yT*nTWRq&WN2L5rXNH=JM8MSns*m7KZvn|elJvT5*^`_>HWp1Y z-YccMDP=ti7`Snr6cM015#^M6w({q7| zi{j96OOl=I9}Kb)8rYuSYdw8)rZ&6pxI;UV;>#1YgNQ|^12MM~=Nd7aA=-d;{qoL1 z_7lUx+IOPStpbfx$QKb3;sdTPzCNK5Om=ik*)X?fJCA2i0UW?IcR{odjknkoTJ>bM zpy~K6w5Yu?TStLhn@YIu$-#rKG>Q10zMMrRJMnKO5!gK{y(JX72*=qf$XSXhFFTE@ zGonT0O1~3zYrRTkPvKQ+?vqApVoR$ibMu281zO;X z+8=At?^=#$-wwe2wDZVbK-f^G8?nH!*ojU6WrRq6gBz8CHDE;q4oc9@yCc1b`UOe& z*%1ADd$`$NO`dDM5zhWKFuEX$C+iy|jTGjOh=eRoX{g9%6sf7gsiL57>9Xzg@go|d z;Btxt6R(r`&{j!Lnk#Gh3%kWyGJ~~+QF**DQ~z8@f&)A)RzP$D%kl-(%7siz0d1xF zb18FH0bOPmAW4ul@(FWuuy4gN(kw4Uk$zrX$_9R!*+ylU_(&&sKQHccXVx!nI)D$X`D2BZZ7w8B${=QC8ijdl@Ti7d zY&_5_6X0M9>=XZVdq5&NQl|OQ`{ev|{~$F>W+TzfIKb@G6@#HbOg-II*SE-eCteqB zigQjOqu*j#Wbmmo9qe0*S*`Mz-1Gnf1y5m4emq%9#)O=(@gK`r(E8+5o!3VXvEjP1}q@_wshn`PjglUMGTESd1@7? zfO{b#<3}E5Dd;ex!RLh5m{$4h4T^-phN_T1cwlZq6~>kb_pBUy3ch!doF`>td8?b` zm_zcjX)mJ!wkJu9WmkA3Tlh7vdN}Yu{@Fm6R^iv8;W1U&MUX zF*pN{(bV>p=~0K*J-IkOa^~eRlM9le3vJMP$@w7$E^A?u*d+XgvzWK6cg)|N81isg zp%Ev}Thythk8?Kv!plyNg|A{HA1=*rx&&FjpjuT@QM4F1^70l(!QYncrd-tpT(KGV z1y~qumOU+3qs|f|6fRWM<#{u&{?2z9(Icr#W+VZ`8dTfyFv1i1XhCi1#%~m+J-kOeWvf1J<&yR z-;LE9j9W4}kqt9T7KpjG%x~KP3`?_R>ZP;`P6)~jX?`xw^GbB9?2sx^ySM0YHi+h` zt$loSHqvCegCGU(TXbd4A%^;{sUb>+NlcSn)6LPQXtkZM;Vwuq8?*7ihaXWOa)i#A zi0}OP!G3DuFnvqJy)qK~Q~08+u$Ebu=HwEKM1!}z(bc)oKORi~9_70LBr~E?M!+N8%A0s(^zVL9y;C(prT<6zP)=rK#Ne=$jPUqc@{gan$|WdiCr^0onK^ zS{DUY4wtI*lAzLW%Bn#rI}FVG=z9l((|1Lpfe=w^YKFlgqCEC^mV*-M63Koa?C zF0d9+2@h?Kg+sZRbBU$#hP4l+RTnSZeR6SiO{xtP#qShrbj|OGQ*3D0S2! z*i!fV?)l`qr<4)O{P+Hk0CLC=QSXH(=AL7`>ta$=^SEJnk(ki?*5>925o$%Z$Jn|8 z@kE-e?jSbGLgp+vGa0)=w{%Pq6$IHDY$>gqH)@=fHzJpnT-`N}?gGnEqTxO?V-dU-QIeu!vTU)E7yRz`1AU&XIpicKgb_M{D8z0`Vx*y(Iof8;qv-2C9la6_vCG}M$ot@1E1vo=Ok~(g@eI?Z# z11kj^VHhBuwf0qu3*8GF!W`Hh6*XB8Id}tF^Du+2vAJ2*g}P`JHpg%fDQbx6{;(GGm&^WP`-e2?r_T?W>ls27bqaA!pTzf(vl*vU}N*?4U^yRaLYb?Xl3YHVs?>m#ZJ5%fYeJ_ zc%U;j_m%PyR!kZ?OfP}LMD~Qp0)xbsPP{Vv_G^7frpEMy9f}_vCA&%2KwBG7YDm^i zd*2I%Xlvt!bBnoY)dOUjjg8BEIip%IG8u~iH`)>C!Xjb&E+uj%6!D|nYlZr(e>mX( z;>Q)-sZotkEH4GWK2Yo*D!ExF877OTCsrEGmeZWfi1|GbXFl(?zFvpBKjG%6C<1cY zwTLAd(S145Mf>}+_;quasy{FNW_$A($qfz_vzX9%-aTc|AbHrLG(Y0FeT2try}{G z{Bt?;L=Ih;br3x&J@XHBw3qZPYMDz_PAsrqDk7!#L|OP+YT&axGcWmmvG7Dg93xMnvcbXdSJyUJnO0`!dAVM3OTSHb*WGh+FHKO{F|HI{8oMVOsa;!rJT;8?2n0H4o877AsbLixCNS#bG$qJ2qIBZZZSD?OwA<6_Ur^DJM$d9i`d6{1nO*|hm@M%f!D2peSBi+1a2#V zFWjd0tvNIBp?-in$Zr!7h|1V5t6F}%3cVcK%Y$5ZFNcU4irJ= zb=%7-$psgI)d|=Bb2F%k$Z%R~DEq{75mV#ZzNmNvkL)M!M+G1tKCooCOV{VtAjY7M z(eKTz?vH!uCVy7GDzb#>*h1ce+Uy*`q4mCo@| z+1z&G=f=|YF9m&`(2O@jIE9T6@g&VHuE1{nHr*IvaW7!)1RFZM*56+@+T9pzsxB@V zanKYhfuX}F8T8XBS#DR>t@6nH>p~l4;jT+*|VVRyw^@{lELhi z8nY<)8*(gCQ05Q+2KKmojhdm8v{Dd!&Y%!g3dSFE7;yD)J-?kVTCW(JJk7!dh6hg! z*{=&kho*#i7XMAJ3*c+G`||xAA$(%^5ODNbUs&0Dx^^4<>%j_opwm5rN zR`H~31$fSfEG=K@Yy$pxCpIU?wzd|YZ=aBf(;>-EfrgaEA#mNa0Kd;(aSLm6nZV(W0 zbQOfr4!af*%=a@-R^~S{Vml&peGW{x_)ME^Sm6WbHE&c6Y!P6hc(CmH)6y*vWn8E(neGDKM*szj;U zkZeV8gDWcD1DjWK^{{^U^wp$ackLyhzp8V}H*58$L9uU5+PuegAQ5}Wz|1TJGePC7 z=8jh+IbU}Tjn>41RMs5B{gd$9zbk#Xl|HHWzO1=|-y-Bnk{lGnUw1iQ<<(XG`Jq_^ zgy`6aAC*hb!ctcL5dNZ&Y`s2yq?Q9d;G3U*0(CcWaHDm?d7q>^>7mE5T28D0_RrA) z+Iu@s!-T3m;56QoT8<_BRf-pEiQ4^DMQ>(q=CqJGb zECSm6oG@h9!-ftYr!M^rm7TDEjE*sOxnC@Kn$P*gq1bHLZ8nn$Swk9uQ5(OnyUD{! zF)`ioUvaGo9?wJvVm60vd4CrL1ggoQzn%)CQZb`RuCKJTN3O0Y;V()Wd_TTAv87to zEazm3x~_}Bd>|@xD~T;D$8};Z9whOo7v&91ZEIbHAF>FI+_42v^Qxg`zix&()BR|U)2$^qEML!H@lyu?QhCge_X8(; zmWiJ05qnq^C~JsyA4_5vUzBSC0&Fm*ig!N0^^^L!ee~EE++L0jx~t`@FzE{sh96Kh0fpce~M)1MQxKRR9Cj&S6!NJ|V^$$YD~x`5^P9d8V_ z$Kj_*Up92&hEg9!!z&a9Ux)f_Cz9?L?}U{C1fy{A@*(l`?W&UXqU{ujPfy&t&Y@(o z-RFt{8SS{d!{xqgy}Lhky}_LUN*`I$S#fzxH$#-w z+1C?Qgqd-zHY5vVsc*8TEqk#F;r7U1_hnTN7$N*wR1FQ-M=h{=v4oaEi)Ai_&Tdka z4Gjn?ZT`dh2gBFLM}E`#!CfEGlX-c0euDpHd*ozC>bkJ zaD##f@4G((RVE7b`6}!8;A?|6`&Q{S7`3|o%$~B3|EkjCGdjd9Dv6LexU6z?)8GQV zw!D-lWeX5x(_tslDe434r(r40IZ*)#5x;4l)K+=hzGvugbG5!%h=6O85V%uSyE7WdRye8HWUS=TH z22;*`3{abcjh!C_m14IPvAvWQ9l=)0fHNNGffM<8oyfiZmh#xyq{wfY z-+HXbigdoa3g)ftlCB?jtr(vuEP(T|S(@WV@UG$F1PoXtFm0^Pu6>?}(svtho*@kJ z?sl%FY9L;%uWby1c3>ZkvEX4~;ZV>J41l-C7vStDueX;d7i3V2!~6A81Ms=u&kRpf zQ~ksyC8J|O42_0IL5913dYXrNg$aTZ5+?_n{>0O_3s(0K%C(cR^m=Vbw7?yWQ|`TV z#1(Cf`IiB%Q;mGB;@;NQ#tQ;@y1#)6{+50~X7&zE*(%t=ds1uYq}3NyLHbXqBe#9~ z4XA$#3xM~|tU#H9txt_2!46Zok{O_^toKZu!ay1!cn+72N~2QGY#!D8_C)gD*!(=* zcsopvQPkrDHvZk0zby8f#ccZcQiQO1NS8`L^c z9D~^~l~;Q;+x2^*ZdSwSliM|j=a6t0PEVazE2{`uW@jF|i4^H4C7-H4w$Sz(V03@h zoX4mi^7Vdqwr#&f{Pj$z4eHH*fiEKXMJgw9&AJ-A6K6O>`iUo)R8!I%6Hjt+c2op+ z9}$X(jDn&DYI}L6L*wiGht{DEk5Uv-l2Vbl@mfnuUh5@|3jlq?Y9c($X3U6ThJ%kRtJURzP~QlZHx%7*KB`4f;3C4R4Ke z_VjAm8jkyzTp_N||G`kT-RNAN-MBknJkzktAnJC1tbW+I<7Cuh>oosdSy*`AmA@Nb zmaoy{>~z0-q-;r_f5<2{r5emghg%n7asO`a^LBV))m0x>%h1RfL_!(}An51E{!NLu1v)T4E&;ynrS31i{DCp2i1lAkfsrwBkz*&NRU16m*A!+ThbeFE>uaj;hDdNHwTB99 zGxuPuaR(3o7Ui=w>cV6LBn(cb>X<1+0!fz6_!lM<2nlgF7gr9xgUmQWhSF*x(i4iETYzV*N%prP}VCwRORs;c=avl1CA+NOb`s zAs62vjf<-&F*Rp%ZIFm&%eUY7L|Evk-@#hZ(Xoqfl|}u*=D_NKxHL*y)U*g*4pN57 zbAr4~KNWgUYA1XcBLw`Ob@d%2us7)7@_;@tJ0Zeyd=;pbA?53)zV&5!IGHCrGXny4 z?$4V$93~>b^Y-~a#8K1}cv)GxEq{5~Gm8P+(~zIm@AkN9J9(+#oQ7Me$?&!Lri*M~ z(2hG8@;x?rS1T7t?|ae{7NJ6im{W-fSF<}iapFJ9Q&W&#Y)S4V!CLdfuIc~}n#(0u zs0H(a(QIqZVSpLZ1{&7+H$u0Xn|gMi!JhLNjtT}1;-&L8=VpcD!CDMW@qN}ehZdKI zV}6Hq4jcLW8HmV2Y`)q;7}%u|1dl%t`1uj1B;OcNEh+_IHwJ&bd%DqdT3dPIsBX*< z_RW%-vik@^3!P;ZoAe5h69sd;O@F;|Y8&RF4e)Xc(9!YypyD8-P{Y71q@oaYgbIGP zg76OTU&QqC;s>_~+>Ql%hiCR*(?2+&lFoZE>e?7T^<;jo5l$k9qt`X>#Pa#d%f+*kY1Gb3%Gi%-#$2IKIH@k*K0n4-VlM7-3 zJmBQ=#7H19+IGQsAI%Z`Dhy+jqucZ0ki9SCkjgi+Rwj1H0o|@aI+7t8J~&4`uEy>pL=s7U8wl;UAWn}bb zHcmNDh+V`WmWS#43NkDrg!2bES->upB(R%Vdrg8;l+o9}m~)0of?F8ndv|k3DU0Lm z?9&1I@Goo4OOe6FCB(u+CrfCBGWX9dnq;tHuqMnc%G%)fwZuTMqSr~oUs)2=tiE?} zd;lw#XRw~EI{(jQ0>iIMswzk;BCNHswha27uZ@8RClyd_L#SJMPT0AKXa68Z4(w6V z|7vn===6BH9L!ioArgcz;_S5YdE6b1&_J9H&FMD28DC~Z)$0_NW@$U@v4yDh_$S7+ zgdny7Wt6qPU$s&g$V5@JR7BL*xGBD&Q06ACJq9B9X=qn$%I(>VpdyY)Uf!HjWe=nN z@z_6%FSt=wS+x!vkCZo_&9fB406{@--^{%hz-5wRc<=K=(3!cUc2279)jTS^J|O+` z^NmX6$3N0Y18QHXd{e(8B!z7OhO2@Z_!rLAy1R1@)$B_g>e6vBeZ`Cr(uvh4G3 zc`3s6u0&pFrQ;@Pk2^#*JP=CG5bZ0+Ap?JWL@pr{dGd=AELRtNr~CE4famw_udOdW zhrgSP^4Pez=-B09QE)NQh-m~kXt-zu=y<4j-=z9E?vW4!Q6J%v9%SXCbn5=>TjTOj6*qlH8vQ!_-$6pEl8Hh2Lx}%c%Hs{0CX9MJ8>i;KTmJgKcz48@ z!|!=>e{x418Ykg?0}qn}xyVNv^h6&nydkzH!~!uRiyrhnL+B>~5Devh$>&jXmmf*_ zi9NyhDH~GERd@yo0UmEV%kup$+94dndDz*)6DIZ>#a;)!Mh)@gSQ@LFu(@Vp`)><# z^T&P^jG-t_CXTw=hQIYq4z>Ob^$qOJwalE&bwbE@Y_7Yg3QVlc94s81Ol<7TjRQXT zu|X9O2bfs=9!uvQ0I%Bxug59DbH@vzs)6wbx*vH!ECR_3)nDlm$}zqY2C;M4L>Pz6-|+HJd{$BC}-dCyvT>29iK|lyz)i!8djf;r?CS99>!PC#gb4yt#dFb4_Wd z@9gk`0J9)hr8m$#z=1V@+=pFqRS5MnqwuwX$}}*9te7EsKQF!)cJbX!ZXHWI8W@}$ zMLNojUb$KW+G~o6E>7xkVu(cj`C#IqQ(Y`B6hzql2rRPjJO*(y3^h~34IFc`e#pR; z50l9A3(Qr^S)@=xLvW924RpvA`R^B?9#JgRg~+D=A~W`ZkV?=BV#*=GQOMzLHr)WN z2>x1f#h}K;`<@P#$&>*u1tm%C#uQeNfX@Q^Vt2I-MEbJ1lFcY&Mq zUHbAE*jbvIm>UZ?#4{UQogT);a+yr7A&CzbH3Mz3P|+|+O=b{_lYIYu9TS`*m2&uF zM`o|Y>6Y{9a*kAPeaHJJR8Rt0DSJP_e*vwM90X8#5%+wIu4f-7GzdXaxBXwd~+ysjy#K^B70d(mCw>7DEk%Cnuw-2}b??z0J~8d3aaHjjJz-Mre#1qp}du*OKWiRb{OZ z@O9{qQ6)KpN*MQH&~wd&@aEF<*2ah?5Ql<+Yp`-!Q#crEPijtT9B2%>f5f3Hy{kyc z#S!i3WH8W)S*j~@YoGV4clyNdkNda-L*qw``mwNHw}?GH3d|(0&nM&t`1a6+%9w?v zqiu%rbO}q7#(Z6%yF(WY1Y?376>~3-ybkjJx_V$*Y%M<`VdkgMI9xa){cT9S1THTi z9op2y{5trbiG9v;D@byk-4)%`G=Ijygtp&u@PGf8U z27`mILv4khmc%Z#Lc}}=$_VWpg8f51C)5Htfh+0zd*`%x0D9veKNgX|r6Z#bFEzPQ z{S5{pHEt?N0`)Mp-A2>dz^GG9PRBE_0&&-f(PTcqj#9JL;rSBo0@q>ltyV|rN{{8{ z*k@dP1Wt)a}&WirrGw_Hp&@gi!@0C4-e4w7+d`s15O!SEK^oZz)i<)CpPKulzUH&%KyTx+z za<%!3f?1ebNa<%8n!{un&^!HYbgOG}3Y@ELh!ZyL5rML3Z}Ehv>)}YnWeP5B+JhhH zgI~xu;Ai1FogkosogwmN`)LK3TAb}8W?e-|7;b&`=W@Wp=Hgg?Z131b*6Z_0BE~|d zDdq^iJ@nQnX7hi`25;pR{8Cd>N!3sFWaB-%o+V#wWaqTodOcY7d?qE?m|cWR6}Et! zUJ)Y{#>4S=@^jIOZ@^YSH&lSn37f$;=7$?jVJa>~H%y3lF_kibh5rMvnw#DdF#)=6 zN3C}_rc>#AB#>=#XqA<#^pFM|O)OAgNj=gu;~0b>UdI=Erd;P^`bM`%y^lVrNDk@SE7!vV9)kUCcD>WUXL) zk)#Ac?-1J1uoA-CRU`mp-d!qAQI-5M^mX(Rq%;->NtA{|sa@tnS5gG3Z<;T|zuCDW znN_HDMp5AX{8s=;`D8zdd*e%kj}eU>gbqkOrQw-MG47(fr8?aR?d+ zFF#+UmnY(|i12CCGnTDbzH86!W5?@3HXuyGGk{0MK^j{qkg;JWf3+fY0{fjXtaLQ> zfqcKhZo+=b$G{v-& zgOFI;o1bBnDajBr-aPan(t2Y7Z4Yg zn%_gHy!-HhS(yZBf5FlS(yv;Kc|1Ok@P5PoZ+{HjzInc)^hiP0t}_iq_imne`QXa8 z!RG(^qx1j#yRWb9*_~^R<%RpVu3s=GBQ`GFOYLpv>1H0Jc9|UGpAZ`uqVZ5EWqv9b z$nVfle}6x3KVMI^pBGF;Po+E{KphyQ0i<0ZZXIA{$U&@Ve-=^Aon7UQj8R?f932^| zWim$>FpN8~2U@`c(k7->6DOIV^#q<~f63F)Ak_zM`EI{Py&%fMz^yD#!8j$9Ae(~Vpg9i`q1J&y{u2Xt>#Kc9b1JppW zCMXa#a}Y#Tf1n2G@W=>k#!il#zi>fTPBwlE3I(vi_7E!2-h^btq{jc&2dD!%kpGSd zN>`4emq+UxXND9v08z9s|5{ty8&8~?Jtq_V05C(nApml~7-cM8oKv(TA&~G17z+TK zm@o{(`a=NlU;`o+3B*5+n*>7=N9ngnFe}o+21mIve`g{bH{uBw+!PAOL#guh3-tBV z0O3dj3IL46_lcL6*936R0G#ADd@WG zH6LHxfBt>&{eSATyDZ+-7|8`03+cAKZWZ6z1W}pYPoT(i%@T%$hTE?z}lmmoHtsbV*EH zY;b5uXm}X#3}8=9Pn$V=79cHiazsG7uKpMx2OK_m_T+WbOEM&d!$crl+7U?zr*0h- zf2;s76(!Qd{L~_&#L*%^a@_spm$mCQxVbAPOq^tEC&QZpbuuR8>;XJvi>aA4G79ew zoq*gkHMKG^wm>j8GB-3ZHJD^FX`=DO2}X!1fnYF^?ZhD?12Y2y25AKFGl2cWj}ws~ z0_Ro0g0Ri%g{dVf4jNM@XPA&m(j-2UgzoSA`26WlS1;Dyz20!=a?Sl~b&u~He|W3@_W6>ljd_jb2g-A|)|Vf=e|e$m z<>RYE-7mimHGdvx`uO(e+gFbjWN%-xa7t2qP)HCer<1qRN#n2d5Aas0=sySaIKD7{msq^;kusl1}< z?$7sLynOZa#WQg1!^e+*zV|cC!^ck_zIgSVyBa?5{w?&#>Qq7m`)xq5H92j$e$!SfDJr{ghoX~#zjTPBSc0`CTs)b zIE1pm^ML1*Q_{|yJx_iQe>9gw)NBmd>oJR)Pz^K#(r-DWxre)%5+9fvc{lc|MEb#nhZbYc8KD{_y(Fm!ak_L+`sfph0h+JYITu|JH?>8F4Yee=4X0g(DPoWMpVy zphltaaB-89DyT2@{OQkDoMQ0)oNBNd^-q8cdpGXkcJuU}$7uV2JdjNqmo?k)fe65>{3=5a-C5 zq~z3 zUG4<{gN;*Cf2SpE#DtyURVvH@W7b>erjt+wm$gn(aTq_ zU%W(xM^?Ok`I==5@&q}vKwa#FVtsUI+1_tQsvdNe1wa&l5&U@+@h^!5QmLSnhP zc>;9^j?Qwf7F=a8(p`aVz|z&(MFAcr-x0`}5Kbb57o62315<1w0|9C9yv*6%-qFQQ z<_u;ge-|tEBM`B>x_dI(w{ZkTyE=O~I=Z1w0n+Yr4^J-@;Njxx9vT)=SXA=1`5ibG znF$C1#`o_3`t~de01wp-mj3m@gJ198|K-c(nx@%fpFvrU<|+@hINKq0&*rzGMO;WVB&;H1ZExs z%mA>7kr9F^5`5Db2@@mJ@#7}`@WVJB=x?02$~S%5^sKDh3l}fnx_#%$)$0X?#mknj ze~gTZRd{%zXi#f@#4RS7APu%b@j-+@ZvfaC)8|Z|!9wP|MKfk*hDXGb6$#pbw!t|? z#pP}7T`&(HLyo*^LROP=6^-W0*TDA6rl!|SmvKB3q!B>T*rT_wKN}`JN`s~QzkTcf z`lb8fgBzz$R$RMWf9-PJrL$$%&R1N&e^hbfLdC616*n)H-?&h6=~UjihMW_%M+&nx zZ{IL~>HO4L=`rz9{{G%h9?sT&p3bR>Q5)ATJziIS|CbwG9nJszW9X+_7gAH>gM)*^ zBcejWB2dRQfqX!oZvdIe4BoCDF5IP$*JMt9M|U?4LSzmqJ`#X2Q93CQsizeCe-VIT z>M}rrS^?r}9^9xa0n7}3Z~>(=L85STR}!mGBO4qNv0~-gm#>;`-M+hFS=%`2(`o1%mUK3y0+$1 zM;mGcbTw!egagDP@$BUb7?0!$e-nTq|{q}up`_K0u zu2{3q!`sKg#-5qIj?Si5wiZ@)48z>k6HW}W;9!VNGBAcPK!RenXA+YWkRQ;}6q}h^ zL4#SqS~0aUH?u}Sg737kvaqwXw51F34n!MV_Jn8xO!tNHf?wkRo9FfQZQGgv6BeX)`kCEm*p2)wGORp<$6= zY{)_)tL;1XHot3q_4*z1AKDMRfhO$v%V%H%G;Ob5y?9G?z3KH^&e#YH=kMOq%vlLh zvtf9nUq-%u9s1*s;r_nXeZ|C-n3zy8BGH*uWj4826F+uT>fpOs)f0aVvV(;c`t5GXwW+d&}zIOT2 z*=n^{ctiwfkOEAskkE*r;BX3R{~%ObU>om?;FM#a_ zzdiiz;p6)c9{zOa=X<|C0Fgd<`iv6TIe)<-nEIh%;UN4U$4#7@ISp-KqV2v>srM;t-l^uENs4tJYt%2V06ATH=)i%9!`0Lo7O?zJto5W8!Acnhlw^VBylq@hK>Gs1y`5WYWr2>tP!rKzo3WpFV#A z`G@xE`Ku?;BLFb!eG_wvye5_=Z0mh;2$0s9heMyg^be18j*fPZjC6E%zJ31u?k{)G z-TCR%om;1Fe_W}(e6IBTse*H-@-LjuyL`6jTw{Jw_O=}x7X#9nGZLn!#KcEy!h?N- z)Lwypp3z~N=!n2Te@{<^EIh<_N=i&X01ORZwSS-{FbFISR7XU@f{2ZbibEU{8VO)) z0z(5dp}u~B0JhT87nZVz(g)Zk;Q?AEIZZex;}JVae^>C}L=;VQjTl%(#v+YF04??a z%&0gBXdOTu$WJ724jJ+&L{4!g_z5^1hk)v>+jhNp+4T6ybD;Om-Cw}WuwuZ{XncWW zBtYOTt!<@c6>5JCnjtjMKmIr#LiFspi_i?$uHPhc9x)gh3=htSjnCb%D86Q>5GF@n zH9dLpfBNCm=RkF9M|bnbPxU8Gr=(@zk%43b6LVv8D}uC%g|(TLttDW_M`!?YczAM6 z2pA*ab%c`{P&70&BX5RqcQDU}p&0=iX#*XN(;g#W-ozZgMRgz_AgLN$7Mr}Yzy*i} zvXQr--+lWJmzCF)SJa+5eF4}8b=TA$-?n{se^_`lgrbS5g_$`X#@x!xjg{RLSp}N0*!vzR$%?Q;btr6>e!IOjs zTNdx@;Lu2KUw`|zZ-f8%2X=N354DdBwYIlCfA##%)5q8D-97!&_4*r^tFK-tyK=t# zf5Ms4+VUg&cdlNxAbsZ4*eMC&lcPgo!UAI=0;5AU0e(u2+A}FWa_+3O#S5lSPft`R z+`xm-t8#@BZ{(*A2+#xr#%SwB2n~yZX^apQ3<8g!G(b++Mj+k>!gUyCs3u7Bgd<64 z8lpg)jDS5jL_7>g6PPLZ`f2>sfnahVe}UR)lp1Ip0jS2w;Sn*gUw*y+sJiA@P;h8M zVsd^#(e0n^{`||YFlT^g=n#-Lu!=Z2WeR_UqT-@zbAT!ZUKO? z=LzrVdB)2O@aEdO>EW}NFPq+dZ0o%7)6dIRt#wy=1I7s8XX-oxo{6iCEv!vAf6Rbb z0cIqKkP!&XO znbam?4@5hFjfa65c;skab{!;I6=~_yt*r61W;V7Ud~5Ip zN(X44J!k&B`AZxpTG2c{n|4!+W!0RJzq!L1_$1Ewmp0O>JG4d z`C`?n#-fVSBZu~HUbAxE+?mN~DN%{Bp;6(Q&>-JnjbE_FH^9#;G}u2re?Dr)j45ep zi7qZMUM#I`pa4O$&LA;YHw7AfHU-fOgbXVfUGgyRsEAj%73 zUg_zB{m>*tO`te5C1K%Ff8)kaG&8q!kU7OCB$bqw1EPe|`wxBtVxPZwxpmui;5jlX z21GP|!lcRZiC3@PAO+4(cm)`vA^^kK#7-ohadQziAXM}FPaVJf_IStM1D-x=LsJWD zK0*M5i~tw|%xLx*s_kUvHg=|bfE=EgGzQ^W56L(Lydf~h@(&Y#fBa!0U_4>GA!14h zr?fydrJ0+WOiLZ}Q|AjaGkKbPcZgZ%FB(UgGaumhBihhevljr;6_vGl`NaTsL*wal z=P%#9^;6@CQ!{7H;UiCA;M%y$mDFgaPMH=Pmk8DZDZ!}WZLuw^nD-w)!V)L<{D={vGmBu=n(aZ4-EGXjrKuQ4-WP8^tKNUb@lePw6?y42l(ou0oRBT&<61ljI8UHQ~^*be^)R^J+z0~KUfnO22=ym zh(X$jfojAEz&6Ze?hEqbvcy?*mXYwY)agvRI7vZdJ`E=Wn1N(aG%693dh6VT!TDfp<^+8D9Hj+3Goz7pE;Rl2=xJVINo34qAQ`x2 zGa#((7?^DxEUfK}%q$V(5QOw3V>4qjOCwVYB4-2w8)C8qDF{VP96O2AFLW~GGy)QW zv8C810%x!vZ#Zs(A*zE^nbW1H!x5WYfw&^0xD{y+e@sF-j2mx=a$K@>CCC}rE+{Mo zu*=G;E?m5f7Okwj5>+0VV_;~4A0qRWp3EykQq$1L91SjVJ0ddX{(YE-&A&dl#~QR3 zY&_1hXNaE&R1;kz{>xXiBnzjHjIv=%?28gZJ-q{+jIKv|MnCrtk9H4^bo33hboadP z>}>Ane{AaLc-`Lq8gXCm$KIZg9iN(By?S`_`i1=bBa0Sh#>RvP`1=O<`ve85LxKYm z;$xOBSuk@(x~-j+rKJ_{3_O7ApsWy^!pb(c5`vAJBzDxFf^4B)C-5`DnD9($gm8|m zz-c6~3CsvI0)hNmKV@Z&@(FDMYGdf2KsO;9&-9^gk^ zKmtt(Vle!{L)niWKmX<4Z_p&SZvPCk2zvX<)tghMW=x+kXXdO-s7K&GI3ygE7wQ_Q zhTaDLp-({3G^i4Z>o;yyR95fVyFVcz8Bao^l<_X~*jB&^A9Q3vmKuK%fn)(Qp)R=N zf6hpx5hG0?w6?OB!IXwUZRdnE3_yZ30>m@fhAON%K#!XusWX`-3-vMF+8IGJs0?jU2 zF#rkd$EVMqKX~}t{on3Aeg^YH3u%Psf6t#1unF6GU#Asc@Eit95B2enVf7>KAL#Ds z@9gbs@9k^r>H(fxx_Vo?`&xRD?*7o(`L3k}`ur&j`u87RwY4?(_I~Q=ZvFV7>DPOA zN=ph>uUZyAIR>Z>4-1-?Icr*anysCUxg|htBZV}X)dWIaPb=$eMP&!tsY{o-e@he| zDmGNfFAxX^MFZYIHCP($6wc?}i}p19hAx5xS?F{N5`hpQ&^h2|;2GHn^a9dA5g^U* zV{Pvr0DC+hM*&*yiDLYW9EQjzqY~^5;Gt6F<`sQxX@?PX`=?*-KX{B7cKU^jSE0QV zlcp?Qvcf~@Epv2IczD8g7&mSLf6QT&CQuC|Lus5ncL6Y-H-BMD>Qo$pfnjIw$hxh$ z*9$e#)Ld(nk#R?M8I9gF;;0trr8Hgvv4A?xq+V>qNHb3eSeFYAB4I$+#Mpuu+se`o zI7hItcCfUtMX&{{P#eeV7fllo{6Jcr9#z-;F-I$TSwS**5g5qE#^%W6f7NR?+EUm=mMBO zc65F0?E2W=@%~d=bL*$(fA{ZSzkc)d)$6Bkn$V6udHv?ur?wBRpFaHd@Igc4@m;%i z%%7hb6BFa?g^$pKvr9;2Kg$dPT1I*!)I07kbFxCJ1G`C~Q_#<-C=b+$rj zpe|GA6mZT58`#pB)c6u95t79iGh%5_2lenG0H44!h}y)&0_Bbqe}Gj05|9QbBYSZj z?8gOhCcux10B%R6zr`r<-vpB@cQpF=Pd%vVD-#jup~AvfepQK z2UcaE>xq*L=Py`Pf4p(wq9qZL(GcWL&aUARQBWoj-l*xQ;KH{oM#_mQPiCMXWYQJH z!-Q>;2SO(hKMM_ve_(3LBnRLM0E4B0UIZk7UVz!o))4^-(72<_)ydIKrt7Y9@}My101w|8*WSv{-^Y}f8RFg1RA^ziO4zx?*-!J|jNe?57^=$c|eHCUSb()!;$ zlOSfZ+-krZR{&oJ$;aY9bLU`9o?TgyIVWET01&h+S)&~w}0s9YW>vl;p4}q z=6A2&z2_^vynXTT(Y^b>{oMSnskXK{WBRm3ix$tDH!mnS#L0=3ucH%8IaqM0`)o{t zU{PVD1DTTye@wM~xXkWmonHdsG+crD#KGR61)M;zr`C`tnu=Z&C~Z=IF>;$&ntHFW zNu`g+0NNuWV?ivyFiMKNA2cHg?2SAJIisYoa~!j_e!%rnvN$0vea6;pyU@tuvg5~3 zL;+G43ricIe>y2S)z{A-NH#DuW_GhJ4Ys$J zj{KyChK72QPezJo8YU+Nv(UYQz{fN&GLXBVMaK&Dtq5l|F}65lZEbJQJ)h(|;$5+< z(+ZUxnFhNa0ck$!z?J&8$O{MQh)weOlZlO2h)+n~xBp;vPTrBD*$`TF$Li~j9lvz> z%AvzYe^I0HnnA%~C>N5B+%YSYIXW+1vh4cJo4-C_y|fP?Kz_RqR6l^=XeUX#W=F%21W^k- z(;k4Fck%+L=7eN|J;h`w5v0dUOdE>HoB;`-6o5J!WlH1K$qfa#0@BD>KoIij2;(^KG@Z*mYsmmB;hl@L~Il>{yDQWl#xySLEWZeVvNy%x@+h`r2 ze>}-{BTJUIxwd~9`N>TT;ieNWBCJ2LDeWjEzqH;kQKo^RjkzNlz^3tdTK}`IKT#ye zO>G2X*SR&wBTa@jAsl%{d5A!LRXlj{Ndc_i3U5IJsL(iCw$*<`)zlK9U7~ zE-ERhs;&Oz-mkEx!O1k@8W-WJgYM!Kf1jA#(0KCxg9mqi`T5?xU+&+(_u#>=0QSR& z4+z_&Lx5hv(j+{Fh6YG}2$mk?9~fdEB^>CZrQjv&p?&<+{_#`W$4_j@sZZ}deQ5gl z_U(r^&F|m5X@2$m<&$SGo-{STDJ?HaNK8sfN^y5rqG^L+;>0?g9l=H9$D>g=O499g(E#$U99l6Y;Vn=Ttr#l7)nD)NY&uh(e7(HiN_tBFP zbWLA~6NVx1JUH0T zecSS(x%E9l(}%Y&nqIzn*YxPg!=1Z#rKC=Yk56)R0&BTCI=EX~IdIXX4G zyvGD->fNRxb~FZ0pqeBHe{B-%3EMP&i8r!i+(o4zZHuL9go*}b%?vSa=FoU`HVcw_ z8-DmQ3j&aXs#CQca={7jCYU#q#Aet znZ~6WYkH{ALqfwhZQgqD(2?TO(z1&3oV;9!kkl#ZU=sWU*@D{<%i)@uz+mPix%bPp z8`p2#y#CWqx9*;13u~bpNqF!Ej*W^Wpn`$9(Pt?Ve_|(f8VYGmlL8D3O{9)2 zVfYJo)+C)Cu2!Sj%wKCyO zAw4`xXQ@aNeB{A+*RI^SaqZTv8+SQf|MJUS0ygMcf7pYxBF*sd0BLFV71_bw5m5AC z@8BTObw8)*?*9I3h*9Y4e%ffkysj=lMIlb zrZhZ{f5bMh4O~&-3b(D)6+k{N2nmQ@@`DM-2;G|8UjQ2(l5_~Tlr0XxNtLuWzz;~{ z*>G#_ZL_Aa!LWwJ{2DwA)i01J99un9&LbgE6Wfum!ie>+44kq%ozFax~#NIXk(TMPbF)RZ6- zge#BCJ*qoQ;7#JvZjuqdJM&f{i}1>zTxzGFzG7k%VGb)jp|oL9%2Dp9;0mR3!J>s( zIXM+o6_L>~a)k#(8ZJvC(|GwhM@Ge#l$Kw)dgJ`XiPXr>FIjg^rpG_?Wa#Iot+)My?v0^gZvYR!1|{y z_C?0_&aSqu&i9{Mz|RmQcYeOJar367%a^TOwRYC*`2m_xXBQ7MGdn{g;K!0!8Wtji zEQ~~O8VmJe=DrWX-O^-9CdP*BMrdQBrHCqLfgGUy@BJ# zYpo}8&rY0ZI8kR+kr$U8;zK1Ndq4|lB~cdi3^;@YI10C>Ax~7f*o2NBCQRZ(g89SS zkqeO=GGy4|zNlrq%U&T2CB%R<9uKHSVTl>38KrsYV4Eq#re+q_t zoMvQdr0f2WVpuqN#`HE!MMD-0!2FUCN~D|({yJ<4sv9-M)RaFSj5Rw)d;75^K1lqF z`ME?Rd_=1;`C7@4$J^oc(Yi%O#R1r{aR~{D$swT;5X?TlFatdd4B3z;sOvd%=LH3a zIyt)n31nQ@J2=5Y#Gd4o)VgEGe=c9Sa`ycB3m1Xw^H;B4=3IUK_U)Sj*dwDOU%t^= zOZ+ohUp^1>FMz`~>;pNE4uAdjWq4?Sebwd5=jJzW7tUJ%r5hC)nUaz+bLQ;jD^~5^ zv+rnDPH{>3snh4~{(ArBt)FPofR<0KFJHXewR6{u8MBrwTDElYs(JGke@Dk8xVR}z zEgg(aMgO3U@V-*5*N%SV-YOvi4UJe|9>9iTLR}a?!GNZ3ut84~#XUhE~f8)3VjdiBu6{rb7)qrgF4+x^MPegHeDKago3mz}UtBD2m zz9B=5xO;q}fwr@cWr8WU#dI0+{SXfF@JRg|v`5luH8xMy$e5YZ!68}tWa~IB@Id|sNnNt@pT{wT?%*9J* zFJC!-_1eW7H?Q2feeL#7*YDoFH8L^`7>^*Zufly9<#+~1k9-;JA06l&?EU)t7pP@$ zI5hVDef#Fjo~=}Pe@vP<$<)+*;>1al3_yD0Crre@$b4fYC=LP8Xa{&sExfV2?No0AY8B1iV49cu#K{F;ETzS7Ymr7`~k+u zJfRUv*iS@?Kn0C+(BuI&pi^8*?H@E{YR0VD^JdSPzi`pAf7NR?tXR2r&DxDim#zfD zk=66&FW$Lp->NkmpnE4wn1o+}Av5PK0?0YZ8&d6~yDVG2x~lrvrY$?BrcEbs5;BSN zaT)|9u1W0<8ed{*YJ=!exv=y?xud2K#ZmJl#!iTYa7fYs{)rQf#efa&!7!IjcNKjr zxtf^|#f0PrnAmkmI#N`~hLkZqeR2%4gdP2{$*@z~V)J+2z%iTRy-fC|zKfoI} zcji-s@R~ICgC3G3H|~zt0sjEEFeOkB(`PWJy`MTr?H>$yyUV=+WsS6j+e_XkG;rflsH*Z}9s_)#n$utHV z^Z%Iw(kzUQ4g$hohDX1BZtraCAME@8{=ffISy5(fWsxy0J$-6As+>ZuaCLQ+%jFIZ zFmatdJeAOi7M7MWnatGG)Y#C_&|u=k2|vml>}ib>wt`+j5Dka6lern2YH>?qOc+OE zAg;9kf11jg`+wx1N-9bk#tg&~36QN#8Hh9}o%%;`6!!VW%-IV!1?AaJLb$?01#SnZE)b=(LH+)qUmJr=5dn@_?R>=Z$IoTE3eKk zC}})#=F;UGHMPfg?A#0TL4l&wXyy^005TDqf2d7(Lcy-&Eq9lD0@b8O2m>Ta#n2{7 zf2fX)OH%nDyX4#qu_m7?9&C~UNXbd=;SmuXnVX+`{^Gd{m(DkyY-l`LfBFo7eFCTk zSA(bt)j$1o16q2RVR%FfW*!((e;yh5JUIM?eO~#GfBgR8!#hCP#Mm%4CTj7*MJ7f@ zuFftFcJ?-Cdu?q{Q5~I~tgNl9Y^+^ef1G79J10j6N12_>-quqo_x4n(ef>g0LOeaa z0imdv$u91mrjqVyJ+7ug5%QAGA-*E*L5(T!Kx@lTvEob|qB;IF5`z&nX9k#ol*2l~ zJb`93Gs>D^ND3CEjO<0};|W3F$Y=6w010z57XqkIBiP9v)!f>^z!*{-m@luWe>rqG z`)GFl_8of`E?OEL6OUg3Gu)5LCV!D*s*iBMbTFIa*Y4~(`ZWBTm$X){x&OiM~mOGre+ zl!PCKghpus!(izkmw+o8)k!nTf4T3-Z2Wjb8jMQAO@U`JB()AkND&KL@H5eMfI287 zBm#{ij6oW$fi_6+6<(i80WX3wLXL%nNBjCA6C6;REUg@<90>;2P}8uJTwIo~TygsB z>652V)Hl?fI&<>WnZ{G68vto=_4x~@Nq$_re(Bb&tL!sFKr|#YM>QoNe>@nZM+bTa zdOEv1M!$@-w|`o`e5sYCx!lcl^SZTaA8$`jh1$=@%S-9)?P*~FVm7k3w{>%Maez&1 zV}amchZY*vvYA5e;_Isl3k~)3@>2QuMMlS})PdG^GGmD=RREjfzh!CaaprwbtXoa2 zD2O!aG;;M50n(Hf13u;%e@Bs}IE0-@kV$Cg;LJxT{m8|+6&Zf@i{hef(iHR zfkpu7ZQFORTfZ6Dh~fi3uoHR%n8zd08d+%HsTB~EOMMWuHW6tIG3x|30;F*Qu{YI3 zL1KcCrT%0ws-J2xYs5L%QSUq+gBaM6&vBp%GU=})^r)JU)E^sdf6GQ0Q8%{>jqs%Y zO$Qn8CScRwoUN@LEcqBzS}lRbppq4dJ;c@I+_tlIl)EW|gTv$ElhI%$B&O210$i3B zv7z^(HkW#`xN(7+Zbi$H;mK*l0(WycdU^Y#q^6ctlr^3_apKg;(`V1t9j^mRpE=tI zqCR_0OVmI$Qy|wbf3v}*qkrM&p^;$(4(Xw;{%+v;KmY4LAf)s2bDfL6}@{qgxsyxF&gXHcmc6OHT?k>S0{wi-k-P_k!sq%97l)Kqko68(*ygcP0!9i-Z zztYn?C?q@}B-~EsOpq4ctWvHPerZA7I0t1x>m!kifH;cge-e_&q%j-VNkxXdqSB`| zuV_F56)50J^AG_=oKGc)li8v!yvK^}MGLzDcqkE29|#aS95hZ|>mPW>_e4%OrsmeT zAV5WBM7BQx8xMvn;Q4U~S0nx*n2{p|JcbLB_gk-5j=(JNEWDB0FmB?HKTe=Vhx=Z} zNn+-rghoO@f8s~(u_RXyiE926I+LHQ)7wIFlPOJ27@HsDfWil3DcoE=oSoc(TQUQ| z*o18mwRE5e&Q~Z^urFW$qVA)mgFQ(8d}I`5EX^?DMuZhPiy(e@AA}_@3rF4;;1!?= znl*cN-7%2!nZ^?*8csAeG&Y_(brLLn>NJV!Q`}TMe|PEf`Kwni@wJtpqP37_U>+SA z7#bWJ9r^Od?*jn%=b<}yZ|~l{bN}8wsfh{ZCWdJ#iHqjVL224so4YvL0mJ@kl_o$H z9v&DN;A3ZPYGY|^Yh~gjvx*4Sga!M1$en#uoUEBz|0=Hy# zQ6T4=e;BJnL`@Z(u@E2sMrI@4TEG}TLCa19n^7D%6Gu@}R9^r>fS;{@#hnTGEiKW8 zGPU67<>35*{2}-WNEi17wPFvE1_KZKn}9;6*3*(L7wJxo1#hz5sX-C%MV*gC{(v;@ zLQN96zR7%pAVFQg3HX)hYnF~imipz0Y^jS=f6Q^9Hd?ppojo;k(v_mkI46jCTiUT< zqO1L{em@b!@F(`P6OF*e;9-E78Gugi5YIrkqs*0tTaznW^w$^|u;vD^L<me#sE{(|R`;je#u8~i-_;`OVYyLb4h z{ajs~7R<|Bm^sH_{13if%1!H5n;A`Xb+mPs*_fM5lG)=S%&e_V?Cs3#tc_h9tsS5m zOeVG!(i&Qb2%u$9v5mEZ zLhc3ej2IvXZ&POt_LB%C4?nH_NNacs$2-kd7SBoDYP5a@RZp^ExzU8YGO)6?TeW&! zZC(A@a~Erm)z#M3F~UC407#!Xe{%{Lzj*QdrArsCT)s$<9_1c9fSGjlmv3LYdV7xK zWQRsZXaWPhRo<}pQj-(6Z{FZwW9cfh-LQIjLQJ@WwTZWfi>;NBi=(BDrJ-oBli5@NzKro_*g zkuqyqVpO<)OhiC#GwI6Y{UA9_ zUQ^;0%554vCdTYhxsWwVKc^~5eJC`mQH%l=t03YQNTUhHT?p-BI4CLCX@+9 zp<8HFn~-A6;kyC(0^0)i1aC1%Ub?D3&J?|Vd@v-N^2xIlfAvu-_H%=$XC$R0 z$HvBMG(nDze~z}ccoB13D~tJaW=@U_vosvPe&wR9{o9jcLl(@QnwgQfXztWiOXsXy zG-uV4Ija}XS+#i1viUO>%$zbaEj~RZK4VH!Qhan!pnp_kL|oit|A3&F*u<%6)4^I| zwJU-#Rcf&~A-S3bhIPJ5M=?E?S}}r_IEM<04oQ^^e-eae%BAr-_Z`_vREdaJ>9^EB zLPk2t08#~11h^MXHYYF(q7%KJf~bY?@KCA%Jn2v$Tn+64b*KrgA`D~!0I7RZ+7&29 ziW2)t*;uzCuCwT`6skkFya`+Vk76EBG11&0|Ltjv9L1Edwzajk)TGlPp)&uN}((5G8Ua^+}mS8<$@D{UX%#+hEwB9kfuJG#H6VOg(b(2AFr;i ztgWpEs!4tT)nM!k7tRh14+6%2{NvA#uFn7cfBqZ%ym0ZN#FV6@

j}k4ok1>FMd} z>SAkciRzb@oUm~247rodw)HEI?A@|sH;u3h<5&_KOHqg{YNb0bWtT zehE=QQ{p4i5@V;OCQeO?4+{>`1O$YHgarh!)rQg3qQMn3D-z`65(6Qm0)vLbVLxRH zfuFo{f-ptdi6ELL@2|Lq0|^_K%sIyf#6}Q@5k2bYcYq>Pi-)zC~J0(h=T2=~OHMc(LGy7?&md zqNZkSzNfi`6(0l1X6REaz)Umg*qkFfdpkQB1FEHVViyfbC6*>f2W=9t*@9y_!6UjD zq>mx`^!56Z@Uo;K*~l5*GK%5Z46I z^XJb2($p1>_(RLbjhi>6PMtD)?wkZLYeJHjx5~@Q%fZ3H!qnKzaFWK?d()Z~i{@nP z-m+%l%qeS^%vrT)=DKCGS1ibg4))e~y7(!alukA-Hm3Hb6D=nF0EuGw;}52We-kW> z4UiF5mX;P4Rx+708Wgm)010I>QKHCjdTXLPL3+e&H1Lv2jdl{iDBp;M1T#o;Qgjn@ zkJd!dl}s5c+B-dSOrV-}QnvF|-Q1}y5K75hx3seGxsguRdd&EwMOqk#*jo(epsBmC z5K%h>lF272)~^#|`w7*0ix}_{e;->bhHxSVdx*(d610;G1!-i0v7r%eXKHMMdW0*O z(^oK%pgn*+0uq*%OmdL$5S&bV#F#+r)DEdKVS{6hOw2_+63-^}jq6RxAqF6I#Nmzo zpdcek;2mk~rJcQVXjs&??K>+gtBxHzR$E(#xRL$APCRqr?D^mS_%=8^e*}sKQRfxp z1I+UmE=WvHN=#0Uj+q=08KqLGjE#&eO^mEeVewhaNK4+jZuzcFD}CJU1HD}WeOxAo z`(`AEr6q*VpPn)=BX$1t)H!L18Hv&H5rN?vAAc{olbw~hk%5h+r4w2@dncL9jTUSq zP!X+BCxURm5@KmCm1t+lf0IThP+sYV>e+}P=)}fS$CT8a%a9B>>87!e{H9i$vR&Gt zNqY#ZR2^_ZY?3;X3SD9Bh!OHsgV?wuzQ_Q*4j&lrh0~-?Y0!}gUu};ZfMS4$)TK5y zAeOJ>OaKr*WF8xcP3bfTegz}xvKt)grZkwGLmDv)lh`u6I0t9qf49geLkieKI}Pyj zN!rn;!dXX?$^m0B5r+E8jcJ<|p37n50|7O8T7Qb%+E|F4UW*TWVE1^OP^RYDr!Z zgsB%tE+2jY8v?8>C>knsK0W<@Y^51zyJ7Q%eJjh9kb@l22oF&o{=$q zR&q+JlanL()z?dDe=u=82rfA;GJD_7t!tK~Cq&Ge5|@!2krb^?jPg%U2%kDRA~h~7 zB_@Id?`nghxmq`=+u6dc)nzhA-VOrDbAZF~XVr{M6|t`q6}+ zR-_Gd6J`bGNgI$-)gScEAtxM11VzEdQd$<0m2O892gvy^f1F^XHyA%#GOsUta@|kJ zn?Z})kQ0My4H_nzDMKiwI>IbRQ%jf?)Yqf!EEfGBeAKI$Dl4XFF)#=`jGx3NZAqq8 z3c!fLOX7~SX~Z59r%hrjOG}_T$-s~(ns}QS8-T}drq(7Ji2>W%A+Nk!T&%t>#x=1S zHwLDL673|Nf9)$KMN)Z*b0!)X(^oUt)O%+)ekL29I*t#lqEUi4-uniGUn>H4+)4S*v2O-vnJ*kQ;>hZfFLsqoW&Hk!(7NiEacejX>57R3=G7 z)&VY#e_ts)yvh6_j8O%gWME8FP>G`1TpLty-W*Uz8-3!0*6U-F7WsN3NCX9kBM#7n z_y+{5{b8X5&}1m~5q934L2evdI~kvEZp+uU;*!kLn$5W|L)&3yYL14|+{^+2d4h@$ zNSmN_G%+(ZGG*e#(8vfi6Ob}CF)=}_%1*U1e>OHXFc2$4n({tzTDXav9%jb6wvvL7 zbCj`C;YWg5TlFR~qb4XQOsP~&V9d<&^M@Zn4#vo5nl5c_Vavv!yL-%>IV(3ex0wAE zRaaHj)K=HkRi9{V82vo(`OEO1e}21p<9cRh=Iq&X5)+d{LP8@VBH|~Jy}Kq(shwv5BI^P)wmY zh0|C#j-(wo!uv;-qd@YQ?}*nLvLb0Me;4F45xaB|RA!}G+B37r)LM+mH#TG(HEx{2 z59211M4?-d(!iCeyTO2e#D@*=7{^Dh;*AUqY2haJz7q_6eFJ8()eaXgT(oS_;^m8% ztXQ&iCF1!Dmhe>&*%+i*v**n~>o;@m%vqT<5^2WF*)wO&nLcCI^cgdeMnF1!f7ti5E&gE6cQ2;s8I)~ebs&{UzMlIQ|{sJ?CR{`=m5JA2BI~r zKx<2LO8^_-HHIC@aBgC3W(G)`F~9@$_+y)FzQ2Vf>?A&FjsF<*1dE9(6nFsjE+H{B zDta<03TpUhg&e{&VDh_=f2*~j`r5ipNEEr`u_am%fJ5l`yao5{_=Tve`u($x3{;g zt^K!056_%Cdo(+1$+D$W)6-(&Vq;=sr>0E{&;&tPu$4;PyGj~aRuor8PaO&f(bw(X>` zt;V(*+qRPi8#`%i+l}2cw(U1|(ztQI-}e{nb?waV%sl6u`+Q>^5RoQHY6*e3uUQ*s zV!pD;EYm@OLRhJ@GGPKUDeb)$68M^F;JBONXS>NZ3;&&KIBmGGA*_OIgeZrRq%7Gt zfrfyE=VM5BE2Az#r&LleFgw5mFe0=xWi%Cv5E0gZ{A>TTweHU0X?mSI)tOa^h=ez# z&nDvD?{70nJqaKaTFsWT(*Ssos7|BZOB0R)Mmmde$V0MaEEw1hS@}unJSZ-i$%*J> zganwxn3%-GwevRbA3(*=JMe7z_3IbTrOMgfUUZ+ZN!7zZc}~vOJVxta_*a-4BOi?= zr6tuKc;nQabxB^!XiVenQHMcpnB z`B>B1rx1>uV$UsX94^VwqZAY3W6@AzLDl^Wl}jz)r#u%v^u918ahE0+ZrRZaIg;jY zD!naGhL;$JOa|TGB9lFQLdmU*6E%zs%k8*;&(uRtC|q9~S7D8?BR#s827)vzq<)T+Sow!K}6@v3giQky3)8 z@$zg7h727Xpe!ji$HGhj0Do{p!6*OMk&U{oj?Oh@3*&&bL#6s@)NQvN(MkjeA057f zD_8nnf3`huZXigX$fkvp)7-IxshfPiT%7iYMtWUub@~GAn~Rk?gHE^p5ExGDnOqKP zW(o>=1_s#7+rO(mes3LJT_tjy?Q?`Q8eqjSp|R4`B@Ycvd{i?oB+pp=;vlBrz!lcB z3oLX@VpDq{O1~)Svv4J=8qs{KR=!d@pW#PETXDJGOv}oOm&n2}Q&Y`SSH}z|h4$m& z-^G96Uf+8=poAF_$d7&z1-p#ouQYRwRtB+`BlO$ zyCLj~g{0u#tCJg#tgB>?kr`Y+T?{6stx#NG<|ng(BKvE6(=C{qS>j7c!3Fh}c5 zsZ@l&0k{vn5X>e5x9oI*P^)yt9verNPaGlwRmn*!an8-P4T*!!PI_!o(jDRI-MPeZ zgj?Iig_D^{=zLy>ji?6O$#O$KuWOMGGSk^!A=y7`t>&}6+mQ*xg2|rvx8R)*KMar? z+k?bK9mL4H02OjWq?>HnlWOv$mCOut0%|D zslYn}`&dH*S6e$R@Ph{uT>N?GSz1!UEFfV2blF)|r7j^pzy%RZK|z5K9gTp1FyGh+ zYB8Yj_8PV{U}k3K77LD+liS1Cv+>C_%r!JHxFo)uUh9I z0gM+GiUknk5J=gp|26VALoRT6h4+cB6bD<_I-L)vpzcz{8_tnZOP#dGH_0QwHBljar$LSwHH+a9cWO1cA06HO6DISx7{C$p#jorq>VQR~B zSn6pe^eMWMNz?=w?zjjKnv{74R#@zlQ(%C`x0dr_Bp5M0<`%bsSC`wXG%S$Vr1yZ#sfmGPv;@{`s+Y`xJr#mkfv*gtN zumUINNm<3LY@AAbyppK9n1rM4*N9V@LbGBPKQjb%cMWkc0r?ej^Q@8_fkH_s`~o_W z*?aX95(n-|A}>Q4S_>R$MF*7#t4K|0OJP&7k4t5{bD{mi{oJ4bdW8dC0aA_vrRYbs ze?ZBBne}uY;6kzD(vhp8@8b!G&_p%T`o0TY3Y0;JLCOM*%2XpZE^K8M7F7~0o;Eh9 zej?b2ksUCDaZ6}roI^r!bXJvx={NK33S31Gg!32=~OK#ybDh8oA!;vrDuo;vQls)UXb-i(EE6nt8M0q zclWty!oL5KQ%?MdWq?{iK}ChT-55#Vf>j15M8&}bY1iwud#p2zsSUwfFj&p# zOWwfFsKJ;}K^_9u=JGOY#jNc7%v8uL3~b^U^g@KEhbLG(e!dA+786%^ajwDxT4fMY zaJgzZz4|wx3869IB;j%^7jVH%oLApX#1tp*CpUd7{r})~X-Pv9e!VxdL{0~jH$?xM;DHe}8htp5^P$-}!QGEn8!ef5 zMe8Yuoq=x}rUamHMn~vu3=B;4_hZDXN=uI<4Mrl~V*BcbOLZO{g$H^36XlH?a{di| zd3{uHbo_`TP$VB7rTt#zFVv%%l9GIo0#;vjSnII=?{k@mXC|LlggZb_(O=xc!NA2Q zEaNAcyy)@19j&{Ei$}}hByM+CNn?6Z7qfUdiDI$uZxST(&0z6YAb+%IiH$Tr@-Y?+g!t>jcI{a^BltAouO2l=3dmYVgaP znBQ5k{(u{VLaZ&Hg~K;}@)6~flPuW1phWKAqF^!8C^>~i#yS2LDse>zNMupjxzo(& z(nH{%qMQO)m!$NBkPresu+y=4_LTs$Ij)&oL{Ojlx5eaS^%C=aaq&T@Q1N%DkasA^ zzF8C7OpoiHX_$d{#W)COXbE#laA}@FE>Of^J)76;dy!75E2A(u$xzMEzhil1nTCTi zJWM@2>|k2DuyEJY14-_?S}#<1io>`98X1>U9~3VkCkj$5hI~~eL5VJ!H!f~o(`c$C zFm4}$U4t;Qbzs0ecsYa-%}!J_8|KJ~@FX z0wxG~!Y91`b9ME3@Z&!j84)sJe=d4@m{LSWiL(RRzYmD9F$q!8d7R+>jrbgNt)Krj zKqK1i?Z@dhS19I?7UV*PMaqmm!`W!`3XidSheL{^azOR1p!{&9(3L%4SJjbSJQX;L z;;0_uvPy;xPWdm6XIRvD4=hK6iJPmES$eif62-y(CUIw14Qy!#YX?#q~^E6H} zXLQkPo;BXczE~+Q45n7B*&Hh@16)9ML{YldjcG#JYV7{lyv0UT=j%lyQHLlfeUvIq z8zS(ht;hfUhpnLcMTsn`C>(sI&cTQEjCRcV2D zD->bw7EOl>>CDY&Bg182V49utYJf}NlAUwf#NguM;wBRN1d^rY$*zfIC=)lSNK&jc zr@A(8`_0%`m96?BCwUqcC1pvW6qG9K`}_R>v5R z!nv^2s%8$nsjS~NpZk_sNExL{1>6B%R=_bpPrwOes3Hx((JHc#%!MrIoHmf5?@NS$ zwN~jHEXI6=P9>|T4sT0gjm|?d{vntm3IDuTGJU4!ZGRW85RB?wdH##8X;Woam<`fl$=~Vl*V6e@%6&e zHQ?f5hYrA5cV&8&)y0LkD`Q`JII36)Td7BuqSKs*y@@=@^j8D7rO(cwT0*bp=R#-u z&u<;ll9z@`>B-L}l~o&EZ}~xW@plrm)|+p{VB@SeNz!k4y*JT|7q>FE zK7)E0Tq}*5lbM;RucxQ4Pg(LTubOyVK1JyW8x6MPXj4w`A`o)Ff=nx36r*E@a5E)p zGHY$g;!EP^qC>NNKOc%75&2|u9q^IRGYrP&Mi4}Gv)9-6!^2x08yoxO_cy4l*&P)x zxJ&_QZ9iT@sNgs9|BDVpySf3Y)xYP}o3WD;-A;P-^0HEuA91m0@o^COns)I&z$T(D zI$#S2e>1y{sZLe$MOQjs2ECrn6fE^`{1oIDU%r%tN(_9gM+vlMw6g{%MzyN_L!z@|L#E9#(UGGgEZi8?zB)Ui z)b{D>qTkvQ!j@-cbv7VtIe^Kfoc>LCd9;7-WX;;#?j7c3NkT{Nq0Q^<9Ud83F#+CO zU0&#j6c&umG2RVX9THW7MwC$`+=i zW`;6#`^HdMgMgs@VvlVk+~;Lt0}d;o;bXz5EP#-uRmw}}@YK`WXgN%!cTK_iQUYZA z8+t#M`VU=;UnV8T0F-4XWJE)_G(F3b{fl| zg3y^&SGZBuhHH8^-?(iY0ZKA9k`Lq_DWbDzo>n{-l&4L(2=mvlk{~W?FzpUw_1i>f z=Ti-}^3qo3Ic^lsUNg-LZ8|ozpWXo;zv$wKEn&#RV!TQR#kXWV_RguUK-VB7`MX)nHvXby4 zbp(m75X&Zk`5!LqLqlB_xT=*M-NwP{d7Bnb$phh>Z?R5gY|RJLJ1jYY)VR}wpnk_XW}_YPZ*qvNcdX(R;$@PUcbu-{kANgJCm792$OJ4xql9cvg-hLj zucMAyv$%qxOIr!+8>N)UIf2Cfw5Vaj(HC6_VTEVSpMY7zHazf#J8Ufh!$FS~Rwh^P z{H4bAU_FyA%7V@UycF)9w+x|sNvR&&)GPI9owytwV>}8tCxoBQ|%V%?fAid-a4o3=+4gw$YpP^?rDk!MB zZHSe*iTWiaCpUrr^+MX54dm`Oz27y7>y2Ryn7cHP9q(1BT*)L@lvSvNvPCec*MyQU z+=NJ9npZy2k-I&nteZ`zkGEpXaM9xRL0N>r;x!5cG^RGi;z#2#E|oN=wT8Ah>wQIe zcNTI^@rd;VD@3j${vG}+#+Oy5(2Z`Mr~m*F%w!qV&v$8LQv_j=AnM__UU@(wSlV-{ z&~r`1&wCIjCRi}%RPHI`Eos_cX~TuLhqZPNevVtkoW1IflyDR9&Zo}q!BpE;HeeWQ z=++{WTfLG)^$!Nsz*C(FrtYFUe`;bwvvTO1(jg*&Glqx9b181)Km$eI6(^;-;tTxw zxXC|l8=_+zO0$^b_Zz|uoiAh;TN7~xXq`<_zj}f^H`n z+uO(V6}n*9pR7m=(7{(&*-uBs&o6xY7U~iu=gRmv zCfEIMh#bXsP$pNp=IqY%Ev-c-zO4WQ&B{s%d|^gm-alo6kjNGw6c78Y>Csl{Hrb(( zNt`1_^J~%IP!wA4{=xJ!A_7*W0!(}1HEb8&pF2`s(zJw*?4MXt#u!rWXv6@W32=K2 zN>UWuA3j@T1{RsB$&ITw$|;|9W+6#MPNr57RH<_$t1p-zBo9!URTU(ycvc+!^%R!^ z)6b9hQo)aFR8UA4(;y}j5S7@NIhmP7WX2nCtg>XtKV?6cBJpn3nlfkO>kbIEECkw0 z(Ok(Cs&uIy$U=?Xf-YnEjRJ)kz-5t$fO7mIuO- z(8z>yb28G56AcZL;nGP-&xk&di?9EIpROkRc14|>0)Yan@2?M;nH@JbW4pWP#>U+E zJLBWSS)Q0(W#!8BW32v<=O`N9&dy*dDFFDhcU>ODueeASr!@5(2Cu+5&X8ar-}nQ6 zfz~!o3CMjc8;_{gl2cq&hdSi;6(N->eS6%E-ZPi>Mlt2skmLrZa_!ZeXi15@o}u>tkK5whl`xPsb}EFa63t z`*(Ie5z%ni+fteh_#$6+zX^baF>}FAU);aJ&!8Z(k|^?NSVB8^$E1cUqyuQ4&3Z z0T8z5(5n|h76qW@MmRz!NJy-UW7QvO8N7^7pFNsk++TPd_cJw~? zpgLKMh|sa|v@cCfE)@?7MCM^+8qgs|;%9c=n=PoS9xfmckD^MjHj zmkJ-ETSIGFXD8&jyv!+_`?erz?+u55Ogr}PtgMw>JfyL?U9f04A=41F4+s_pu~WgG zZK3@RdK(UoRp>nfIBFcBsN#iF0EJ(jI+y^ zF)xeGN$O0zH~H3Vcr8~Pz7;_&w0S9;F+f+S!kiKB>4rxDtdRLFi6}e!^5P<)HE#wb zCFV638(6kEj^^i%i89MdQ}yOQcx-Dq@%&XonbPyW%&PUv!X8oe1=bohakeS6Z9t@V zi?iAiOiDA~z~@4x2xe_4=}EO zf4Sc7o=j)X;ddWNrKe9yQX^DCrz5;su?Yzc{W4R~{r)&vkazX#M?tUu!?V;yMSas9 zq2P~&Nj$nTVOF3GZY_#jEbW2Xsf|1W00CT`yPNNWg9&XY;{JWDv2lA1yukwoT! z8BDDEuoqWnd#254HSXkQhf!$O#V;@4rCcG${P~4^bnWjOu|aL8erPu5ywjHv1e?!7 z5UmmyM1Jcw9Sz$T2a^c8G$Xf8I6?u3JJGKbT0j4)Gv)O&Gi5n>Lh|atMh=}1$tgO+ zJ2&50funGcL2O>|N{9~XykoF%& zNY#^fllJS@d$|2ARO+mdzdkys*XR^4cHg#ST_lVsx9ZCb{}oDUxMes4EAaCA;#;F} zjo4Yz92-iRBa7-Ip`Q>Cv@HGx17}yrud23h1>RWyX|?h##n|pKHV{{w4=+sFil)JA z3I%047*0UH0`w1^QNi&9>E+*a)}fV=>!~jtY}q$JMAq}V#t3@3ng4)3yNfASYoppZ z$tSfrn=b%=`VPn7ESC54C}s)r3sX@cADu!;-=Iz9cJHqGp}l>N(9{2_rzi0G8fpA1 z5X{RjJiOCCJgGnZTWz1gLH}$adjTSSYpLuvf`45b!hz?1Y3LVFs#0_J4(QtV(Qf4r z^P=uZ5vGJb(*ODIsmCauLGut!CwH#ekT_#B$oL1PoeTS><>hXHtW?U-yp;DDEgSg> ziBA#|SV&3po$B4Jf%09-T{r<~0Y81K8StVT;vs>{QeEbrqQg`xihgf?x;p4Fx{+?{ z)g89`&Q#5b>jQd>YL&ou8CxDLyaJ9a^fEe3yed&*m%X%q|2`D|N&W2r?3`9mKnQEn zpodlZtp+FG=yI^0q9~ZcbnW1R44)X60G;@FzrLlREp*=8%GS}$$h0+>r23)2k z(h&X_I20=>DGfxw{YUGCWD=}SaIh_oEdH#wd%wiss4tYmhKKE!*E=-`TRhl`ynYJ6 zh_@zaPSGlI6(*&RB$sWEPg1RXP5f#LxG5oL^$FMofAI3O!QY^vE`^z5xg~thEmlURDTquYFk%xUgTe%33?oC#i?*J0cUPCRv~=Ld<0`d6`c$3( zFEH~J7N%fh!_P$z%Rq=1)h8C=@9b!J?++cFHSRe(y%h5PzC{@cvb=zKr`sQi#gd{k5A&0*N3SpD5%*Nh#iSZDe>n{O44)n-rsiwe@6<;}Z<3 zADo}x)3)>+Aq*RSDMiOp66Js6!^?(y5MPFWi#A8n5_*h5Jw1N&%c3N7bzxjUB)-w2 z7iy)+X-9O?d=uArg{$^A1=Nby=c;$^J}Xfdcu_(`9DHKJ{ppqBn|Wy4cW!iwz}~=5 zgDgo{81|*TY!-*1CQ4}2AR0P`Z01uE!U^1A&y)R84FR7%dH>9VQCHZ9&O|u}PlM5h zhMN~8+^daWthB5@i>sTSbPO#$H3P-=b^_pla=D!Jd<;^Ivb)$iEyjSW;hVzZC4a;y=ecrs`B`ULnNCO2TDzB*%?$66)60&vYqz~zR3LYaLH>Bcz(dL0i)sJ@sp!42g8-ui{75m5w5_% z!tO2y1_O`2<8t$Yh5RABwuUCQW{-vxh^hWyF*}jgEv1Af@D2{TtE;Q`V1xkX)YyZ@ zcRHXn0r>VJxsZ%@-qED4E1vEF4QZ~@AHv#kqHly>fF=AEu|M_|}vM5#3wTVrr=+j)3z-S*ZXbmV-$U(F>(x zY-MJBU?Cq(fPF7EPkER8UohBVbJ906H0j4OFR?RUu%wpPb=MYR--+(dP#zza_EX{W-91Y6W#Wa}|*{Q|n3SjZjM zwl`n`r*(2BBhGal0#A(!O(nh+Jon>1-(Tp30+JLgR{Pu{ zZ^7buyGzb=x?anADoW8s-ew7~DEePA%5}!Z#NS>X8|6m7vgIVXlxa@1Lhy8_bdzKd z92$o_%2dZ8p&gfmy4F3Yu5WU(($!lzSXhOo16P`v5$Qb^Gz3KDOhI3Hc{jwHw9Lf+ zrz3OusJU(B?e3Q7$D=Arsme;J%BgN2!4%1Bdcsxjhj9R`twKdXB`2HRapNJ*mb2V? zXn2GTqe$cR^|_7HqjU31Ed&6xB1tV}`J7zV`_+yr zUV(kN&Kr;_BuR*K=MZBK;0&S5BtA8HG&Z-S z|Kc#PHN!9nSin9nt5cb5$b`AXf-HL;cQ?qA2E>aq5V=hI9LK$xs|iN3Q>FN zxygU`7q|0~WC|z^TEU}EI6_5aWV`CPO@WU>pUThQnP+cYw4T!Iw3~h+=|&|ML>9!$ zNCiRw%|DgE#Ll(V^~}sQYu$h5Hav5Ht(|Zl`W+h|Tl!vi3@<);U*SVwj?k4(tR>Aq z=mCvu4TKwChjRZyL?Gs;b9bwT+t&<;@7Z5kEH~Sn=*MPZO2w8yoX-T6^)+?1B3j&n zT(Sk)*XQT>1O!g@_5v=ups4RFwd?HcDT4!Fmd?STaB+mLe0KAdrz@ZeYNOkA@kuGi z8_=ZEV9RE6e)~);A-`%t`pVxT_6d5YOV6#bm0~0UF=c6-!VJh@B(@*ZJuA#Cc62Xy z-810>!jMu0k)hvDi~}^k@OAs#;G1|IC>Y-@^B4B%I*37yB)TRdvppnI0GH#ZI3nKQ z0C4io0OCSMyiP;&{kQKyub_=icRmiB zvy=GkUwhUUPiC{&!823gSx_CWE=D{Vfz8xyc9xD}&s%HM2;qPXM*gYS=5*BLS(EN;&~10$wXDxmyWZq_^~8Ju z?2s1glk{KRZI_$BK6dl-BA>2=JG}A4XZAjPb!G0G5-!(TTleBDXbX;75ea4~0E?!<~{JYrRD$c*>*htzcEU2iIr9f@qk0m-v z?g05{rFV-1^voP=>5(4?G*O*CbNHfsOgcdpZvOjmS+6}% zPb0c>zrTUHEjAQ~T$uzaNZh9vNRJi4kaBWa|4-ZlCn%1+0UcPci=!0UAB^vWF4`*f&AU9M@Y&`BGJm# zq&^()>jq`OStb$@qj@E=mAU@rM#B$%Mxi-#U0c$8MAFUc>H;0z|6P6vvC>Z4dK7X22Fy)Dg2+&cYV{)?}g7h0_Po&NK$+>^Xe zH90HwhOHj=5zA}81GzV$;(*=aHn@={>#)&x)8mPC)1w@Fvc36qy@4ppsR7t?eE#KA z!u_QXZgEz*o*yiOc^M9W$>FJwyhDIj?e6H{yA?sT^RpTO4`jP~gfJue{tVWvLb$VD zdvf!#O2JLa0=cNVNGdv*iHqBPTUdI2#=cPrq8VDvcnqS$-r35tl)8vcQVF$a#@;Js zEbL>htL^-e)TQSC>zPk+i-0Y0Qb?B(xv|0!{3&CDW^PWN?)|&T^~X}ExoQ7*FQ#}v ze~njid?_RVXDOB^PMUhv>NFNtR)S<_CWRo!A#hNrpcV>ksL-2}d?*K@paM!t28DzS z(Uu;iVXM8?k{fr2TFKh4HVH% z)gLXy#+LKB-if-Kpx3RmU6eW~Lw3_GzCk(IDJUCTx&N3V(NU1+rn1@1r>ixAGe2Zl z%=BoYtVWAPxB2_}1~)+K*Xwc{-anee{Zb3k(q_`@blb~bjs*;3OZSo3{6M+JvVf+iJhR3Eqx;f*S8eBU|%yAq(}GNebncLA4~=03Y_{*M`2i zC6LzAG19X#Za2F7NlSPA{!P|wm1jyTfz$;K+Uj$&sc~>{$jv1-m4;jv3oe5A6l)k3 zOcQ3AaeIQ1&@P)$Ai>7R#URDP!63pSA;TfSBgDkmCEGtCieeB&(wbAG?&T|8iH@nI z`7!#8kTMdF1xpjJ^r|Ls88h2xHIVCV(in)f!z?R7rppU~?2pCSG(D|2)o45O9hV8L z8f$XjT@=yL5gr*)XZWj}oRydM&Blo3;A9~g@-*I#rig;SnuzE;VO9G_AnEJVTgHwN ztQCmJARfOb;O})_tNp5#mDPZ9TtY&0OiV=O(>|qhSW6Rv@<@F~(mV&w-J@AW7d*n;f7t#y#5Ry9bFiOS>pl0S#nX`|Ep?O2Iu zrB1igbi4Y|UYnv3SKfrVwmA*>*{%1uPDgk$CQ0|WepD+FX#uuUvqk9$i3IQhjwmbK zxx7j8K-)BOeH4A8`{pZ&{;C=w!p2rBNwHZde7Cnlsn6_;QdAKa>g9GYNKk$3EA%Pp zn6Ml9#ZB;5N#tD{fzrbqlyKtMu2}(dzsu$>tRIf8rEd_JCG0hXQCt;_4_NltxI+R zA&p4O7YAz96rzj2dnsO~ejDt!Rw~y5z*)|-fHu;LqF=F^Fp6z5S$Mt6f{M!GPgNaC z{f8XrgKTMPXl!eNC~d9e;cnkGc5!WJjvPNc-AznR?Xe$C$gQodrHlmM-@D1j+$qG| zkI$=VtGmAI0RGwyER<2;ev10z0S)=_;mH#f1qIbrDjozhg}klK%+$ZWzFJPEQ&Up| zj`(U*@#dLz^g_Zv;j6)>lke5SwVW9S#9Ywf5k5(?@$dL%!&VdwvT9NMyJp{b;v*}> zE;0WhtnJ|OTK3Wl^MDsHY1oYU(|Mz;xE9HB+PqN5Ts(tdX+T^tS&e7UWTRPxSwW3S zoRt8J_lZqj0y32IWNN!L;G|c`uibII%l2TzF^BhhtI2mX9Yui0d9By>qfO}o$VoQ1 z6ZN$rn2xTXB(}oKn$Y&Up~3CdJ2HX7kmCh-{ExQ~cPk?e#UZHVyb`u&cYZ(6Lvo@kUmJaSTk2Z$WvD;_<%8pD(>6 zq92e?{-{klHhH;f*bcRqOjEVbqaI2&wkAXhmn~kY{6J;jbT)s$=E}4TD%m0C*Y-;C z-?bfuO{EQ8wH@`~lv+D25 z{R!}xNYBV{-tOY&bSL%BDj%Yy3J;6$t9b|6?qKpq!@QS;zKjc4m%pVKn3y;2#(8|@ zQHqVYi3pQW49*QUu@bgJC4?F&VXkJK2w^s~G?hakLm3vc`u_h?Sx8q3fh;KHJ*X0; z`F(KHaMIO!Dsq`P1Wv0>e+bmuQ%Uci4d7R}QYZS@`^)d?a-$KvI`h%(eYx2h@Mp#m z{>{trK(N#OU;dS!x8ng1VP9LozkJ6xZ)c$f@3-K9O|;AHHZZI5rk4xZreFtnG&sN? zO~H9|=3_tXL!jYgE|??|^>Qdso>;iy9v%FK@J6u^wLTNtjZVhjLVGdxSrYk|gumtQ zX;Hws%+rY#*~~1zUTTJ+L85+QPPi(36T=uQ{S>QN*_58?+GiQ{3ovsDhhfW}AWR?= zFfxXNEhxw$sGRTUW*6Frl!6>S+K0SrYm1mS4HHQXD=BFfFG5B{jE;&zTnY=y!T}?) zS~pv_(7^BQZBf6DgM%en=ozX(I2pI>3 zB~=mpdrnOEzq~wjazYnn)MkRpY)&8r=7oQYLf>K#?-dkc8RTQDCl%}%C(rE}RF+mD zXRVcqMf{rfwyGkM<{`#xLEYUIzrYpk?mj-~mDg8S*B2L8KwR+hvb5LDlZw9nYcBRyE%O)EqdfpE~ zx%Qh|6B8?Y^(ZC{b55FOlWnnSiXW!W6h3d&hop!O*<#?VP;eo;!{wDJ_+!1J^Q%4A zIlX%F>Q8<5=ec0O2urf|+xt(xAz+5(cRSpjFL7}HkJM%E-wcru%p6>mUN!UN}LnYgp-lyzN67_#LH43Y(4FLWJ zPWmMT&`7s@Pv=;^k_n80_nEvn0;T+hoPStdP0k3z(^*Lv9ukjF3L!2Ei;zL5X=-F@ z8))=>Xm|EG%DI}#$x$e{Xhy4QX@wnk6o-_}b7f>?ERoeX+VE+q8FiVzt(*~@K|lnK zq1*3{ObpD=_b&q&S2Zhha}--3on>ckj`W5pdG!Yv3S$xy1O3u z{-nWB5IJ2K!)s_O{7z1e{j~6^qXqC>TMDaUCX_2jCg$&b>g5i@Lb9lzd9P8!vACD( zzp$jdPIo^kBhe^$TWCyu)jXwa4K3Fj&tnd3k`q?XZnk``Jt+H-HPDcs<`&>WL!n4W z9HGyCkcmLf0__z6-~V14dVBv}uF=k5F(kymIE%89TAkP}yFujYHQO(3{38{kR=9?3 zNb%rm`Y#9&kSb5{H4;+CZ^sWGumBA}_pB

  • %9Qu=yeuWK2Z&y{NSpWS{N5X9o- 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�M7eqp#EwPbiP;lJ4d&0_- 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 diff --git a/Doc/RomWBW Architecture.pdf b/Doc/RomWBW Architecture.pdf index 7853996aff06745838e9b8294b0603c1d852b508..17f32e5104228c0c6796bbf9da7eea35b65542a3 100644 GIT binary patch delta 12670 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 WU$uVi*hqb78`8*e$1PsAWaNKe90D8w delta 12673 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 VoVIcrWW!6jX)|Ze``G+x{{vCU`tJY$ diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index 6012434c299df648234613d2bb46cc47ef6bc320..f89297fb65d3ff3eba012c47081fb40c6cfa3359 100644 GIT binary patch delta 11209 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 ZVC3j0Miv$&<5?9$>E!hE?tjWj{vVAre?I^K delta 9942 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 XwKJ!W8()HDA%eD~cke517+UgQ5;(!> diff --git a/ReadMe.md b/ReadMe.md index 68ccfc70..aeb09db1 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -2,7 +2,7 @@ ## Z80/Z180 System Software -Version 3.0 +Version 3.0.1 Monday 30 March 2020 Wayne Warthen diff --git a/ReadMe.txt b/ReadMe.txt index fed41156..95e32039 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -2,7 +2,7 @@ RomWBW Z80/Z180 System Software -Version 3.0 +Version 3.0.1 Monday 30 March 2020 Wayne Warthen wwarthen@gmail.com diff --git a/Source/CPM22/loader.asm b/Source/CPM22/loader.asm index d60c0b16..bdebc314 100644 --- a/Source/CPM22/loader.asm +++ b/Source/CPM22/loader.asm @@ -207,7 +207,7 @@ PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE PR_WP .DB 0 ; (1) WRITE PROTECT BOOLEAN PR_UPDSEQ .DW 0 ; (2) PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?) PR_VER .DB RMJ,RMN,RUP,RTP ; (4) OS BUILD VERSION -PR_LABEL .DB "Unlabeled Drive ","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!) +PR_LABEL .DB "Unlabeled$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!) .DW 0 ; (2) DEPRECATED PR_LDLOC .DW SYS_LOC ; (2) ADDRESS TO START LOADING SYSTEM PR_LDEND .DW SYS_END ; (2) ADDRESS TO STOP LOADING SYSTEM diff --git a/Source/CPM3/loader.asm b/Source/CPM3/loader.asm index 0a417849..ef80711d 100644 --- a/Source/CPM3/loader.asm +++ b/Source/CPM3/loader.asm @@ -207,7 +207,7 @@ PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE PR_WP .DB 0 ; (1) WRITE PROTECT BOOLEAN PR_UPDSEQ .DW 0 ; (2) PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?) PR_VER .DB RMJ,RMN,RUP,RTP ; (4) OS BUILD VERSION -PR_LABEL .DB "Unlabeled Drive ","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!) +PR_LABEL .DB "Unlabeled$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!) .DW 0 ; (2) DEPRECATED PR_LDLOC .DW SYS_LOC ; (2) ADDRESS TO START LOADING SYSTEM PR_LDEND .DW SYS_END ; (2) ADDRESS TO STOP LOADING SYSTEM diff --git a/Source/Doc/Common.inc b/Source/Doc/Common.inc index 6615a110..71a252d8 100644 --- a/Source/Doc/Common.inc +++ b/Source/Doc/Common.inc @@ -1,4 +1,4 @@ -!def(ver)(3.0) +!def(ver)(3.0.1) !def(date)(!mdate) !def(product)(RomWBW) !def(author)(Wayne Warthen) diff --git a/Source/ZPM3/loader.asm b/Source/ZPM3/loader.asm index 0a417849..ef80711d 100644 --- a/Source/ZPM3/loader.asm +++ b/Source/ZPM3/loader.asm @@ -207,7 +207,7 @@ PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE PR_WP .DB 0 ; (1) WRITE PROTECT BOOLEAN PR_UPDSEQ .DW 0 ; (2) PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?) PR_VER .DB RMJ,RMN,RUP,RTP ; (4) OS BUILD VERSION -PR_LABEL .DB "Unlabeled Drive ","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!) +PR_LABEL .DB "Unlabeled$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!) .DW 0 ; (2) DEPRECATED PR_LDLOC .DW SYS_LOC ; (2) ADDRESS TO START LOADING SYSTEM PR_LDEND .DW SYS_END ; (2) ADDRESS TO STOP LOADING SYSTEM diff --git a/Source/ZSDOS/loader.asm b/Source/ZSDOS/loader.asm index d60c0b16..bdebc314 100644 --- a/Source/ZSDOS/loader.asm +++ b/Source/ZSDOS/loader.asm @@ -207,7 +207,7 @@ PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE PR_WP .DB 0 ; (1) WRITE PROTECT BOOLEAN PR_UPDSEQ .DW 0 ; (2) PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?) PR_VER .DB RMJ,RMN,RUP,RTP ; (4) OS BUILD VERSION -PR_LABEL .DB "Unlabeled Drive ","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!) +PR_LABEL .DB "Unlabeled$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!) .DW 0 ; (2) DEPRECATED PR_LDLOC .DW SYS_LOC ; (2) ADDRESS TO START LOADING SYSTEM PR_LDEND .DW SYS_END ; (2) ADDRESS TO STOP LOADING SYSTEM diff --git a/Source/ver.inc b/Source/ver.inc index 5e41f2bd..4dc55e56 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -1,5 +1,5 @@ #DEFINE RMJ 3 #DEFINE RMN 0 -#DEFINE RUP 0 +#DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.0" +#DEFINE BIOSVER "3.0.1" diff --git a/Source/ver.lib b/Source/ver.lib index 2a2af104..9c5594c5 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -1,7 +1,7 @@ rmj equ 3 rmn equ 0 -rup equ 0 +rup equ 1 rtp equ 0 biosver macro - db "3.0" + db "3.0.1" endm From d9bed4563ea1a04a3e5b1fcf3fbb40c8aaaaf8bd Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 5 Apr 2020 16:01:04 -0700 Subject: [PATCH 09/16] New ROMLDR and INTRTC driver - Refactored romldr.asm - Added new periodic timer based RTC driver --- Doc/ChangeLog.txt | 5 + Doc/RomWBW Applications.pdf | Bin 140215 -> 140215 bytes Doc/RomWBW Architecture.pdf | Bin 371099 -> 371105 bytes Doc/RomWBW Getting Started.pdf | Bin 166706 -> 166714 bytes ReadMe.md | 2 +- ReadMe.txt | 2 +- Source/Apps/RTC.asm | 1 + Source/CBIOS/cbios.asm | 12 +- Source/Doc/Common.inc | 2 +- Source/Forth/camel80h.azm | 3 +- Source/HBIOS/Config/DYNO_std.asm | 2 + Source/HBIOS/Config/EZZ80_std.asm | 2 + Source/HBIOS/Config/MK4_std.asm | 2 + Source/HBIOS/Config/N8_std.asm | 2 + Source/HBIOS/Config/RCZ180_ext.asm | 2 + Source/HBIOS/Config/RCZ180_nat.asm | 2 + Source/HBIOS/Config/RCZ80_kio.asm | 4 +- Source/HBIOS/Config/RCZ80_mt.asm | 4 +- Source/HBIOS/Config/RCZ80_std.asm | 2 + Source/HBIOS/Config/SBC_simh.asm | 2 + Source/HBIOS/Config/SBC_std.asm | 2 + Source/HBIOS/Config/SCZ180_126.asm | 4 +- Source/HBIOS/Config/SCZ180_130.asm | 5 +- Source/HBIOS/Config/SCZ180_131.asm | 5 +- Source/HBIOS/Config/UNA_std.asm | 3 +- Source/HBIOS/Config/ZETA2_std.asm | 2 + Source/HBIOS/Config/ZETA_std.asm | 2 + Source/HBIOS/cfg_dyno.asm | 8 +- Source/HBIOS/cfg_ezz80.asm | 6 +- Source/HBIOS/cfg_master.asm | 6 +- Source/HBIOS/cfg_mk4.asm | 6 +- Source/HBIOS/cfg_n8.asm | 6 +- Source/HBIOS/cfg_rcz180.asm | 6 +- Source/HBIOS/cfg_rcz80.asm | 6 +- Source/HBIOS/cfg_sbc.asm | 6 +- Source/HBIOS/cfg_scz180.asm | 6 +- Source/HBIOS/cfg_una.asm | 4 +- Source/HBIOS/cfg_zeta.asm | 6 +- Source/HBIOS/cfg_zeta2.asm | 6 +- Source/HBIOS/dbgmon.asm | 10 +- Source/HBIOS/hbios.asm | 92 +- Source/HBIOS/romldr.asm | 2828 ++++++++++++++++------------ Source/HBIOS/simrtc.asm | 12 - Source/HBIOS/timrtc.asm | 230 +++ Source/HBIOS/usrrom.asm | 5 +- Source/HBIOS/util.asm | 50 +- Source/ver.inc | 6 +- Source/ver.lib | 6 +- 48 files changed, 2021 insertions(+), 1364 deletions(-) create mode 100644 Source/HBIOS/timrtc.asm diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 5ddd4e80..65569da0 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -1,3 +1,8 @@ +Version 3.1 +----------- +- WBW: Refactored ROM Loader +- WBW: INTRTC periodic timer based clock + Version 3.0.1 ------------- - WBW: Increase XModem timeout waiting for host to start sending diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 82a473c659ce0cdbfa2ab5f9748e7021770724c6..d15a52753cc8c7168abef2be57f1108859ed2808 100644 GIT binary patch delta 111 zcmdmfoMZcOj)pCa8o$_04NXlA4Na!&|6-JZakdBjVr12HHZ?Z3aCA1cuyA%XFmZM^ fvotk!voJ6+cQP?FGj%pHv{SGlq-6RmWhPkw>9HKW delta 111 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 X#VePeJ&|qjZQR7^)8`#Gf8zfDMwA3} delta 12687 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 diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index f89297fb65d3ff3eba012c47081fb40c6cfa3359..5e39d55a98f30f843bb51a44beebe60bc9e4ea29 100644 GIT binary patch delta 10979 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 z diff --git a/ReadMe.txt b/ReadMe.txt index 95e32039..c9b01d5c 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -2,7 +2,7 @@ RomWBW Z80/Z180 System Software -Version 3.0.1 +Version 3.1 Pre-release Monday 30 March 2020 Wayne Warthen wwarthen@gmail.com diff --git a/Source/Apps/RTC.asm b/Source/Apps/RTC.asm index 07b5c447..5d731612 100644 --- a/Source/Apps/RTC.asm +++ b/Source/Apps/RTC.asm @@ -1319,6 +1319,7 @@ DELAY_LOOP: ; LOOP IS 26TS LD A,H ; 4TS OR L ; 4TS JR NZ,DELAY_LOOP ; 12TS + ; RESTART SYSTEM FROM ROM BANK 0, ADDRESS $0000 LD A,BID_BOOT ; BOOT BANK LD HL,0 ; ADDRESS ZERO CALL HB_BNKCALL ; DOES NOT RETURN diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index a822887f..5f627426 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -2296,8 +2296,16 @@ DRV_INIT: ; GET BOOT UNIT/SLICE INFO LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY RST 08 ; CALL UNA - LD D,L ; SAVE L AS UNIT - LD E,0 ; SLICE IS ZERO + LD A,L ; PUT IN ACCUM + AND $0F ; UNIT IN LOW NIBBLE + LD D,A ; UNIT NUM TO D + LD A,L ; GET ORIGINAL VALUE BACK + RLCA ; MOVE SLICE TO LOW NIBBLE + RLCA ; ... + RLCA ; ... + RLCA ; ... + AND $0F ; SLICE NOW IN LOW NIBBLE + LD E,A ; SLICE TO E LD (BOOTVOL),DE ; D -> UNIT, E -> SLICE ; ; INIT DEFAULT diff --git a/Source/Doc/Common.inc b/Source/Doc/Common.inc index 71a252d8..542c53ff 100644 --- a/Source/Doc/Common.inc +++ b/Source/Doc/Common.inc @@ -1,4 +1,4 @@ -!def(ver)(3.0.1) +!def(ver)(3.1 Pre-release) !def(date)(!mdate) !def(product)(RomWBW) !def(author)(Wayne Warthen) diff --git a/Source/Forth/camel80h.azm b/Source/Forth/camel80h.azm index 85990346..b3b6f079 100644 --- a/Source/Forth/camel80h.azm +++ b/Source/Forth/camel80h.azm @@ -1020,7 +1020,8 @@ DOTS2: DW EXIT DW UINIT,U0,NINIT,CMOVE ; DW LIT,80h,COUNT,INTERPRET DW XSQUOTE - DB 55,'Z80 CamelForth v1.02 25 Jan 1995, ROMWBW 19 Oct 2019' + DB 59,0dh,0ah,0dh,0ah + DB 'Z80 CamelForth v1.02 25 Jan 1995, RomWBW 19 Oct 2019' DB 0dh,0ah DW TYPE,ABORT ; ABORT never returns ; DON'T FORGET TO UPDATE THE BYTE COUNT IF YOU CHANGE THE SIZE OF THE BOOT MSG diff --git a/Source/HBIOS/Config/DYNO_std.asm b/Source/HBIOS/Config/DYNO_std.asm index f5019f0e..dccbf5a9 100644 --- a/Source/HBIOS/Config/DYNO_std.asm +++ b/Source/HBIOS/Config/DYNO_std.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #include "cfg_dyno.asm" ; CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/Config/EZZ80_std.asm b/Source/HBIOS/Config/EZZ80_std.asm index ae480bcd..54f8aaf4 100644 --- a/Source/HBIOS/Config/EZZ80_std.asm +++ b/Source/HBIOS/Config/EZZ80_std.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #include "cfg_ezz80.asm" ; CPUOSC .SET 10000000 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/Config/MK4_std.asm b/Source/HBIOS/Config/MK4_std.asm index 4909dc00..c838d873 100644 --- a/Source/HBIOS/Config/MK4_std.asm +++ b/Source/HBIOS/Config/MK4_std.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #include "cfg_mk4.asm" ; Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 diff --git a/Source/HBIOS/Config/N8_std.asm b/Source/HBIOS/Config/N8_std.asm index d8654771..04b4b92e 100644 --- a/Source/HBIOS/Config/N8_std.asm +++ b/Source/HBIOS/Config/N8_std.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #include "cfg_n8.asm" ; Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 diff --git a/Source/HBIOS/Config/RCZ180_ext.asm b/Source/HBIOS/Config/RCZ180_ext.asm index a1dbad03..79c4ce6b 100644 --- a/Source/HBIOS/Config/RCZ180_ext.asm +++ b/Source/HBIOS/Config/RCZ180_ext.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #include "cfg_rcz180.asm" ; CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/Config/RCZ180_nat.asm b/Source/HBIOS/Config/RCZ180_nat.asm index 46f9c43f..7bfad4cd 100644 --- a/Source/HBIOS/Config/RCZ180_nat.asm +++ b/Source/HBIOS/Config/RCZ180_nat.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #include "cfg_rcz180.asm" ; CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/Config/RCZ80_kio.asm b/Source/HBIOS/Config/RCZ80_kio.asm index e88df73d..a83052f4 100644 --- a/Source/HBIOS/Config/RCZ80_kio.asm +++ b/Source/HBIOS/Config/RCZ80_kio.asm @@ -22,7 +22,9 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#DEFINE PLATFORM_NAME "RC2014 (KIO)" +#define PLATFORM_NAME "RC2014 (KIO)" +; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT ; #include "Config/RCZ80_std.asm" ; diff --git a/Source/HBIOS/Config/RCZ80_mt.asm b/Source/HBIOS/Config/RCZ80_mt.asm index 8806bedd..1e49c5d3 100644 --- a/Source/HBIOS/Config/RCZ80_mt.asm +++ b/Source/HBIOS/Config/RCZ80_mt.asm @@ -22,7 +22,9 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#DEFINE PLATFORM_NAME "RC2014 (MT)" +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#define PLATFORM_NAME "RC2014 (MT)" ; #include "Config/RCZ80_std.asm" ; diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index f9e0f1fa..447b0952 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #include "cfg_rcz80.asm" ; CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/Config/SBC_simh.asm b/Source/HBIOS/Config/SBC_simh.asm index 85600427..b2088dfe 100644 --- a/Source/HBIOS/Config/SBC_simh.asm +++ b/Source/HBIOS/Config/SBC_simh.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #DEFINE PLATFORM_NAME "SBC (simh)" ; #include "cfg_sbc.asm" diff --git a/Source/HBIOS/Config/SBC_std.asm b/Source/HBIOS/Config/SBC_std.asm index d5cb313a..16acc300 100644 --- a/Source/HBIOS/Config/SBC_std.asm +++ b/Source/HBIOS/Config/SBC_std.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #include "cfg_sbc.asm" ; CRTACT .SET TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/Config/SCZ180_126.asm b/Source/HBIOS/Config/SCZ180_126.asm index d1f1cd1d..b63ccf95 100644 --- a/Source/HBIOS/Config/SCZ180_126.asm +++ b/Source/HBIOS/Config/SCZ180_126.asm @@ -22,7 +22,9 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#DEFINE PLATFORM_NAME "SC126" +#define PLATFORM_NAME "SC126" +; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT ; #include "cfg_scz180.asm" ; diff --git a/Source/HBIOS/Config/SCZ180_130.asm b/Source/HBIOS/Config/SCZ180_130.asm index 9b838598..20685e84 100644 --- a/Source/HBIOS/Config/SCZ180_130.asm +++ b/Source/HBIOS/Config/SCZ180_130.asm @@ -22,7 +22,9 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#DEFINE PLATFORM_NAME "SC130" +#define PLATFORM_NAME "SC130" +; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT ; #include "cfg_scz180.asm" ; @@ -38,6 +40,7 @@ LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED) ; DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT ; +TIMRTCENABLE .SET TRUE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) ; ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) diff --git a/Source/HBIOS/Config/SCZ180_131.asm b/Source/HBIOS/Config/SCZ180_131.asm index 9bdcbb99..322b528d 100644 --- a/Source/HBIOS/Config/SCZ180_131.asm +++ b/Source/HBIOS/Config/SCZ180_131.asm @@ -22,7 +22,9 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#DEFINE PLATFORM_NAME "SC131" +#define PLATFORM_NAME "SC131" +; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT ; #include "cfg_scz180.asm" ; @@ -38,6 +40,7 @@ LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED) ; DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT ; +TIMRTCENABLE .SET TRUE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) ; ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) diff --git a/Source/HBIOS/Config/UNA_std.asm b/Source/HBIOS/Config/UNA_std.asm index 9ddd4fc9..c722c7af 100644 --- a/Source/HBIOS/Config/UNA_std.asm +++ b/Source/HBIOS/Config/UNA_std.asm @@ -22,5 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#include "cfg_una.asm" +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT ; +#include "cfg_una.asm" diff --git a/Source/HBIOS/Config/ZETA2_std.asm b/Source/HBIOS/Config/ZETA2_std.asm index 7128d885..0c434c57 100644 --- a/Source/HBIOS/Config/ZETA2_std.asm +++ b/Source/HBIOS/Config/ZETA2_std.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #include "cfg_zeta2.asm" ; UARTCFG .SET UARTCFG | SER_RTS diff --git a/Source/HBIOS/Config/ZETA_std.asm b/Source/HBIOS/Config/ZETA_std.asm index fe720ac7..cfc82665 100644 --- a/Source/HBIOS/Config/ZETA_std.asm +++ b/Source/HBIOS/Config/ZETA_std.asm @@ -22,6 +22,8 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; +#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; #include "cfg_zeta.asm" ; CRTACT .SET TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 3a073290..2663b22d 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -3,7 +3,7 @@ ; ROMWBW 2.X CONFIGURATION DEFAULTS FOR DYNO ;================================================================================================== ; -; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM +; THIS FILE CONTAINS THE FULL EQU OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM ; INDICATED ABOVE. THIS FILE SHOULD *NOT* NORMALLY BE CHANGED. INSTEAD, YOU SHOULD ; OVERRIDE ANY SETTINGS YOU WANT USING A CONFIGURATION FILE IN THE CONFIG DIRECTORY ; UNDER THIS DIRECTORY. @@ -20,9 +20,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -63,6 +61,8 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index 9036a113..f9c3d218 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -20,9 +20,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 10000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -60,6 +58,8 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 53f062fd..1aee1b03 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -17,9 +17,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -82,6 +80,8 @@ KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 630b47f1..f31d6af7 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -20,9 +20,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -67,6 +65,8 @@ KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 65db812a..a7928f07 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -20,9 +20,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -70,6 +68,8 @@ KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index a221334a..af9ed953 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -20,9 +20,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -63,6 +61,8 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 9a078f5c..1e2bb9ed 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -20,9 +20,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 7372800 ; CPU OSC FREQ IN MHZ INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -59,6 +57,8 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 482fe08c..e79e2c25 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -20,9 +20,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -61,6 +59,8 @@ KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 0450a6a6..c4e677d9 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -20,9 +20,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -58,6 +56,8 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_una.asm b/Source/HBIOS/cfg_una.asm index 622f53ab..058eca9e 100644 --- a/Source/HBIOS/cfg_una.asm +++ b/Source/HBIOS/cfg_una.asm @@ -16,9 +16,7 @@ PLATFORM .EQU PLT_UNA ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO] BIOS .EQU BIOS_UNA ; HARDWARE BIOS: BIOS_[WBW|UNA] ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 75ddc039..f9c50fb2 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -20,9 +20,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO] IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPT MODE: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -55,6 +53,8 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 1582373c..0e3027c7 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -20,9 +20,7 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT -BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT -BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT +BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE ; CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -60,6 +58,8 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; +TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index ddfe411e..c97923eb 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -31,7 +31,7 @@ BUFLEN .EQU 40 ; INPUT LINE LENGTH JP DSKY_ENTRY JP UART_ENTRY ; -#DEFINE USEDELAY +;#DEFINE USEDELAY #INCLUDE "util.asm" ; ;__UART_ENTRY_________________________________________________________________ @@ -125,9 +125,9 @@ INITIALIZE: LD (9),HL ; STORE AT 0x0009 #ENDIF -#IF (BIOS == BIOS_WBW) - CALL DELAY_INIT -#ENDIF +;#IF (BIOS == BIOS_WBW) +; CALL DELAY_INIT +;#ENDIF RET ; @@ -890,7 +890,7 @@ KEYBUF: .FILL BUFLEN,0 ;_____________________________________________________________________________ ; TXT_PROMPT .TEXT "\r\n>$" -TXT_READY .TEXT "\r\nMonitor Ready$" +TXT_READY .TEXT "\r\n\r\nMonitor Ready$" TXT_COMMAND .TEXT "\r\nUnknown Command$" TXT_ERR .TEXT "\r\nSyntax Error$" TXT_CKSUMERR .TEXT "\r\nChecksum Error$" diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 6e696cb6..e2aef567 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -896,6 +896,21 @@ HB_START: INC A ; 1 MEANS BAT OK LD (HBX_LOC - 1),A ; OVERWRITE IF NVC ALLOWS IT ; +; IF APPBOOT, SAVE CURRENT BANKID +; +; THIS IS NOT GOING TO WORK IF THE APP BOOT IMAGE IS LOADED +; USING THE UNA FAT32 LOADER. SHOULD PROBABLY CHECK THAT THERE +; IS A VALID ROMWBW PROXY IN MEMORY BEFORE DOING THIS. HOWEVER, +; THIS USE CASE IS PROBABLY NON-EXISTENT. THE IMG BOOT IMAGE +; SHOULD WORK FINE WITH THE UNA FAT32 LOADER. +; +#IFDEF APPBOOT + LD A,(HB_CURBNK) + DEC SP ; RESERVE A STACK BYTE + LD (HBX_LOC - 2),A ; SAVE BANK + PUSH AF ; ALSO ON STACK +#ENDIF +; ; INSTALL PROXY IN UPPER MEMORY ; LD DE,HBX_LOC ; AS PER ABOVE @@ -903,6 +918,13 @@ HB_START: LD BC,HBX_SIZ LDIR ; +; IF APPBOOT, RESTORE CURRENT BANK ID +; +#IFDEF APPBOOT + POP AF + LD (HB_CURBNK),A +#ENDIF +; ; IF ALREADY EXECUTING IN RAM, BYPASS RAM BANK INSTALLATION ; LD A,(HB_RAMFLAG) @@ -945,6 +967,11 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK ; IF APPBOOT, WE NEED TO FIX UP A FEW THINGS IN PAGE ZERO ; #IFDEF APPBOOT +; + ; GET AND SAVE APP BOOT BANK ID + LD A,(HBX_LOC - 2) + LD (HB_APPBNK),A + ; MAKE SURE RST 08 VECTOR IS RIGHT LD A,$C3 LD ($0008),A @@ -1520,7 +1547,9 @@ INITSYS3: ;CALL HBX_BNKCPY LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY LD D,BID_USR ; D = DEST BANK = USER BANK - LD E,BID_USR ; E = SRC BANK = USER BANK + ;LD E,BID_USR ; E = SRC BANK = USER BANK + LD A,(HB_APPBNK) ; GET APP LOAD BANK + LD E,A ; USE AS SOURCE LD HL,$8000 ; HL = COPY LEN = ENTIRE BANK RST 08 ; DO IT LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY @@ -1633,6 +1662,9 @@ HB_INITTBL: #IF (ACIAENABLE) .DW ACIA_INIT #ENDIF +#IF (TIMRTCENABLE) + .DW TIMRTC_INIT +#ENDIF #IF (SIMRTCENABLE) .DW SIMRTC_INIT #ENDIF @@ -2115,6 +2147,9 @@ HB_IOBNK .DB 0 ; CURRENT IO BUFFER BANK ID ; B: FUNCTION ; RTC_DISPATCH: +#IF (TIMRTCENABLE) + JP TIMRTC_DISPATCH +#ENDIF #IF (SIMRTCENABLE) JP SIMRTC_DISPATCH #ENDIF @@ -2672,42 +2707,29 @@ HB_IM1PTR .DW HB_IVT ; POINTER FOR NEXT IM1 ENTRY ; #ENDIF ; -; TIMER INTERRUPT +; TIMER HANDLER VECTORS +; THESE CAN BE HOOKED AS DESIRED BY DRIVERS ; HB_TIMINT: +VEC_TICK: + JP HB_TICK ; TICK PROCESSING VECTOR +VEC_SECOND: + JP HB_SECOND ; SECOND PROCESSING VECTOR +; +; TIMER HANDLERS +; +HB_TICK: ; INCREMENT TICK COUNTER (32 BIT) LD HL,HB_TICKS ; POINT TO TICK COUNTER CALL INC32HL -; -HB_TIMINT1: -; -#IF 0 -; - LD HL,TEMPCNT - DEC (HL) - JR NZ,HB_TIMINT2 - LD (HL),250 -; - LD A,'*' - CALL COUT - JR HB_TIMINT2 -; -TEMPCNT .DB 250 -; -#ENDIF -; -HB_TIMINT2: LD HL,HB_SECTCK ; POINT TO SECONDS TICK COUNTER DEC (HL) ; COUNTDOWN 50 TICKS - JR NZ,HB_TIMINT3 ; NOT ZERO YET, DONE FOR THIS CYCLE - ; 50 TICKS HAVE ELAPSED + JR NZ,HB_TICK1 ; NOT DONE, SKIP AHEAD LD A,TICKSPERSEC ; 50 TICKS PER SECOND LD (HL),A ; RESET COUNTDOWN REGISTER - ; INCREMENT SECONDS COUNTER - LD HL,HB_SECS ; POINT TO SECONDS COUNTER - CALL INC32HL + CALL VEC_SECOND ; DO SECONDS PROCESSING VIA VECTOR ; -HB_TIMINT3: +HB_TICK1: ; #IF (CPUFAM == CPU_Z180) ; ACK/RESET Z180 TIMER INTERRUPT @@ -2723,6 +2745,12 @@ HB_TIMINT3: OR $FF ; NZ SET TO INDICATE INT HANDLED RET ; +HB_SECOND: + ; INCREMENT SECONDS COUNTER + LD HL,HB_SECS ; POINT TO SECONDS COUNTER + JP INC32HL ; INCREMENT AND RETURN + +; ; BAD INTERRUPT HANDLER ; HB_BADINT: @@ -2899,6 +2927,14 @@ HB_TMPREF .DW 0 ; DEVICE DRIVERS ;================================================================================================== ; +#IF (TIMRTCENABLE) +ORG_TIMRTC .EQU $ + #INCLUDE "timrtc.asm" +SIZ_TIMRTC .EQU $ - ORG_TIMRTC + .ECHO "TIMRTC occupies " + .ECHO SIZ_TIMRTC + .ECHO " bytes.\n" +#ENDIF #IF (SIMRTCENABLE) ORG_SIMRTC .EQU $ #INCLUDE "simrtc.asm" @@ -4082,6 +4118,8 @@ STR_LOWBAT .DB "\r\n\r\n+++ LOW BATTERY +++$" MSG_HBVER .DB $BE,$FF,$8A,$FB,$80,$80,$80,$80 ; "HBIO " #ENDIF ; +HB_APPBNK .DB 0 ; START BANK WHEN RUN IN APP MODE +; HB_CURSEC .DB 0 ; CURRENT SECOND (TEMP) ; HB_BCDTMP .FILL 5,0 ; BCD NUMBER STORAGE (TEMP) diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 22294698..c4c111e0 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -1,1247 +1,1595 @@ ; -;================================================================================================== -; ROMWBW LOADER -;================================================================================================== -; -; THE LOADER CODE IS INVOKED IMMEDIATELY AFTER HBIOS COMPLETES SYSTEM INITIALIZATION. -; IT IS RESPONSIBLE FOR LOADING A RUNNABLE IMAGE (OPERATING SYSTEM, ETC.) INTO MEMORY -; AND TRANSFERRING CONTROL TO THAT IMAGE. THE IMAGE MAY COME FROM ROM (ROMBOOT), -; RAM (APPBOOT/IMGBOOT) OR FROM DISK (DISK BOOT). -; -; IN THE CASE OF A ROM BOOT, THE SELECTED EXECUTABLE IMAGE IS COPIED FROM ROM -; INTO A THE DEFAULT RAM AND THEN CONTROL IS PASSED TO THE STARTING ADDRESS -; IN RAM. IN THE CASE OF AN APPBOOT OR IMGBOOT STARTUP (SEE HBIOS.ASM) -; THE SOURCE OF THE IMAGE MAY BE RAM. -; -; IN THE CASE OF A DISK BOOT, SECTOR 2 (THE THIRD SECTOR) OF THE DISK DEVICE WILL -; BE READ -- THIS IS REFERRED TO AS THE BOOT INFO SECTOR AND IS EXPECTED TO HAVE -; THE FORMAT DEFINED AT BL_INFOSEC BELOW. THE LAST THREE WORDS OF DATA IN THIS -; SECTOR DETERMINE THE FINAL DESTINATION STARTING AND ENDING ADDRESS FOR THE DISK -; LOAD OPERATION AS WELL AS THE ENTRY POINT TO TRANSFER CONTROL TO. THE ACTUAL -; IMAGE TO BE LOADED *MUST* BE ON THE DISK IN THE SECTORS IMMEDIATELY FOLLOWING -; THE BOOT INFO SECTOR. THIS MEANS THE IMAGE TO BE LOADED MUST BEGIN IN SECTOR -; 3 (THE FOURTH SECTOR) AND OCCUPY SECTORS CONTIGUOUSLY AFTER THAT. -; -; THE CODE BELOW RELOCATES ITSELF AT STARTUP TO THE START OF COMMON RAM -; AT $8000. THIS MEANS THAT THE CODE, DATA, AND STACK WILL ALL STAY -; WITHIN $8000-$8FFF. SINCE ALL CODE IMAGES LIKE TO BE LOADED EITHER -; HIGH OR LOW (NEVER IN THE MIDDLE), THE $8000-$8FFF LOCATION TENDS -; TO AVOID THE PROBLEM WHERE THE CODE IS OVERLAID DURING THE LOADING -; OF THE DESIRED EXECUTABLE IMAGE. -; -; INCLUDE GENERIC STUFF -; -#INCLUDE "std.asm" -; -INT_IM1 .EQU $FF00 -; -BID_CUR .EQU -1 ; SPECIAL BANK ID VALUE INDICATES CURRENT BANK -; - .ORG 0 -; -;================================================================================================== -; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE -;================================================================================================== -; - JP $100 ; RST 0: JUMP TO BOOT CODE - .FILL (008H - $),0FFH -#IF (BIOS == BIOS_UNA) - JP $FFFD ; RST 8: INVOKE UBIOS FUNCTION -#ELSE - JP HB_INVOKE ; RST 8: INVOKE HBIOS FUNCTION -#ENDIF - .FILL (010H - $),0FFH - RET ; RST 10 - .FILL (018H - $),0FFH - RET ; RST 18 - .FILL (020H - $),0FFH - RET ; RST 20 - .FILL (028H - $),0FFH - RET ; RST 28 - .FILL (030H - $),0FFH - RET ; RST 30 - .FILL (038H - $),0FFH -#IF (BIOS == BIOS_UNA) - RETI ; RETURN W/ INTS DISABLED -#ELSE - #IF (INTMODE == 1) - JP INT_IM1 ; JP TO INTERRUPT HANDLER IN HI MEM - #ELSE - RETI ; RETURN W/ INTS DISABLED - #ENDIF -#ENDIF - .FILL (066H - $),0FFH - RETN ; NMI -; - .FILL (100H - $),0FFH ; PAD REMAINDER OF PAGE ZERO -; -;================================================================================================== -; STARTUP AND LOADER INITIALIZATION -;================================================================================================== -; - DI ; NO INTERRUPTS FOR NOW -; - ; RELOCATE TO START OF COMMON RAM AT $8000 - LD HL,0 - LD DE,$8000 - LD BC,LDR_SIZ - LDIR - JP START +;======================================================================= +; RomWBW Loader +;======================================================================= +; +; The loader code is invoked immediately after HBIOS completes system +; initialization. it is responsible for loading a runnable image +; (operating system, etc.) into memory and transferring control to that +; image. The image may come from ROM (romboot), RAM (appboot/imgboot) +; or from disk (disk boot). +; +; In the case of a ROM boot, the selected executable image is copied +; from ROM into the default RAM and then control is passed to the +; starting address in RAM. In the case of an appboot or imgboot +; startup (see hbios.asm) the source of the image may be RAM. +; +; In the case of a disk boot, sector 2 (the third sector) of the disk +; device will be read -- this is the boot info sector and is expected +; to have the format defined at bl_infosec below. the last three words +; of data in this sector determine the final destination starting and +; ending address for the disk load operation as well as the entry point +; to transfer control to. The actual image to be loaded *must* be on +; the disk in the sectors immediately following the boot info sector. +; This means the image to be loaded must begin in sector 3 (the fourth +; sector) and occupy sectors contiguously after that. +; +; The code below relocates itself at startup to the start of common RAM +; at $8000. This means that the code, data, and stack will all stay +; within $8000-$8FFF. Since all code images like to be loaded either +; high or low (never in the middle), the $8000-$8FFF location tends to +; avoid the problem where the code is overlaid during the loading of +; the desired executable image. +; +#INCLUDE "std.asm" ; standard RomWBW constants +; +#ifndef BOOT_DEFAULT +#define BOOT_DEFAULT "H" +#endif +; +bel .equ 7 ; ASCII bell +bs .equ 8 ; ASCII backspace +lf .equ 10 ; ASCII linefeed +cr .equ 13 ; ASCII carriage return +; +cmdbuf .equ $80 ; cmd buf is in second half of page zero +cmdmax .equ 60 ; max cmd len (arbitrary), must be < bufsiz +bufsiz .equ $80 ; size of cmd buf +; +int_im1 .equ $FF00 ; IM1 vector target for RomWBW HBIOS proxy +; +bid_cur .equ -1 ; used below to indicate current bank +; + .org 0 ; we expect to be loaded at $0000 +; +;======================================================================= +; Normal page zero setup, ret/reti/retn as appropriate +;======================================================================= +; + jp $100 ; rst 0: jump to boot code + .fill ($08 - $) +#if (BIOS == BIOS_WBW) + jp HB_INVOKE ; rst 8: invoke HBIOS function +#else + jp $FFFD ; rst 8: invoke UBIOS function +#endif + .fill ($10 - $) + ret ; rst 10 + .fill ($18 - $) + ret ; rst 18 + .fill ($20 - $) + ret ; rst 20 + .fill ($28 - $) + ret ; rst 28 + .fill ($30 - $) + ret ; rst 30 + .fill ($38 - $) +#if (BIOS == BIOS_WBW) + #if (INTMODE == 1) + jp int_im1 ; go to handler in hi mem + #else + ret ; return w/ ints left disabled + #endif +#else + ret ; return w/ ints disabled +#endif + .fill ($66 - $) + retn ; nmi +; + .fill ($100 - $) ; pad remainder of page zero +; +;======================================================================= +; Startup and loader initialization +;======================================================================= +; +; Note: at startup, we should not assume which bank we are operating in. +; + ; Relocate to start of common ram at $8000 + ld hl,0 + ld de,$8000 + ld bc,LDR_SIZ + ldir +; + jp start ; .ORG $8000 + $ ; -START: LD SP,BL_STACK ; SETUP STACK -; -#IF (BIOS == BIOS_WBW) - CALL DELAY_INIT ; INIT DELAY FUNCTIONS -#ENDIF -; -#IF (BIOS == BIOS_UNA) -; ; COPY UNA BIOS PAGE ZERO TO USER BANK, LEAVE USER BANK ACTIVE -; LD BC,$01FB ; UNA FUNC = SET BANK -; LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC) -; CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) -; PUSH DE ; SAVE PREVIOUS BANK -;; -; LD HL,0 ; FROM ADDRESS 0 (PAGE ZERO) -; LD DE,$9000 ; USE $9000 AS BOUNCE BUFFER -; LD BC,256 ; ONE PAGE IS 256 BYTES -; LDIR ; DO IT -;; -; LD BC,$01FB ; UNA FUNC = SET BANK -; ;POP DE ; RECOVER OPERATING BANK -; LD DE,BID_USR ; TO USER BANK -; CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) -;; -; LD HL,$9000 ; USE $9000 AS BOUNCE BUFFER -; LD DE,0 ; TO PAGE ZERO OF OPERATING BANK -; LD BC,256 ; ONE PAGE IS 256 BYTES -; LDIR ; DO IT -;; -;; ; INSTALL UNA INVOCATION VECTOR FOR RST 08 -;; ; *** IS THIS REDUNDANT? *** -;; LD A,$C3 ; JP INSTRUCTION -;; LD (8),A ; STORE AT 0x0008 -;; LD HL,($FFFE) ; UNA ENTRY VECTOR -;; LD (9),HL ; STORE AT 0x0009 -;; -; LD BC,$01FB ; UNA FUNC = SET BANK -; POP DE ; RECOVER OPERATING BANK -; CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) -#ELSE - ; PREP THE USER BANK (SETUP PAGE ZERO) - LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY - LD D,BID_USR ; D = DEST BANK = USER BANK - LD E,BID_BIOS ; E = SRC BANK = BIOS BANK - LD HL,256 ; HL = COPY LEN = 1 PAGE = 256 BYTES - RST 08 ; DO IT - LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY - LD HL,0 ; COPY FROM BIOS ADDRESS 0 - LD DE,0 ; TO USER ADDRESS 0 - RST 08 ; DO IT -#ENDIF - EI -; -;================================================================================================== -; BOOT LOADER MENU DISPLAY -;================================================================================================== -; - LD DE,STR_BANNER ; DISPLAY BOOT BANNER -; -MENU: - CALL WRITESTR ; DISPLAY MESSAGE OR ERROR - CALL NEWLINE2 -; -#IF (DSKYENABLE) - CALL DSKY_RESET - ; DISPLAY DSKY BOOT MESSAGE - LD HL,MSG_SEL ; POINT TO BOOT MESSAGE - CALL DSKY_SHOWSEG ; DISPLAY MESSAGE -#ENDIF -; -#IF (BOOTTYPE == BT_AUTO) - ; INITIALIZE BOOT TIMEOUT DOWNCOUNTER - LD BC,100 * BOOT_TIMEOUT - LD (BL_TIMEOUT),BC -#ENDIF -; - ; DISPLAY ROM MENU ENTRIES - PRTS("ROM: $") - LD B,MENU_N ; B IS LOOP COUNTER, # OF ENTRIES - LD HL,MENU_S ; HL POINTS TO START OF ENTRY -MENU1: - ; PROCESS A TABLE ENTRY - PUSH HL ; COPY HL TO - POP DE ; ... DE FOR USE AS CHAR PTR -MENU2: - LD A,(DE) ; GET NEXT CHAR - INC DE ; BUMP CHAR PTR FOR FUTURE - CP '$' ; TERMINATOR? - JR Z,MENU4 ; IF YES, DONE WITH THIS ENTRY - CP '~' ; HOT KEY PREFIX? - JR NZ,MENU3 ; IF NOT, JUST SKIP AHEAD - CALL PC_LPAREN ; L PAREN BEFORE HOT KEY - LD A,(DE) ; GET THE ACTUAL HOT KEY - INC DE ; BUMP CHAR PTR FOR FUTURE - CALL COUT ; OUTPUT HOT KEY - LD A,')' ; R PAREN WILL PRINT BELOW -MENU3: - CALL COUT ; OUTPUT CHAR - JR MENU2 ; AND LOOP -MENU4: - ; END OF AN ENTRY - CALL PC_SPACE ; PRINT SEPARATOR - LD A,MENU_V ; LOAD ENTRY LENGTH - CALL ADDHLA ; BUMP HL TO NEXT ENTRY - DJNZ MENU1 ; LOOP UNTIL COUNT EXPIRES -; - ; DISPLAY AVAILABLE DISK DRIVES - PRTS("\r\nDisk: $") - CALL PRTALL ; PRINT DRIVE LIST -; - LD DE,STR_BOOTSEL - CALL WRITESTR -; -;================================================================================================== -; BOOT SELECTION PROCESSING -;================================================================================================== -; -SEL: ; HANDLE SERIAL CONSOLE INPUT - CALL CST ; CHECK CONSOLE INPUT - OR A ; ZERO? - JR Z,SEL1 ; IF NOT, CONTINUE -#IF (BIOS == BIOS_WBW) - #IF (DIAGENABLE) - XOR A ; ZERO ACCUM - OUT (DIAGPORT),A ; CLEAR DIAG LEDS - #ENDIF - #IF (LEDENABLE) - OR $FF ; LED IS INVERTED - OUT (LEDPORT),A ; CLEAR LED - #ENDIF -#ENDIF - CALL CINUC ; GET THE KEY - CALL COUT ; ECHO KEY - CP 'R' ; CHECK FOR - JP Z,REBOOT ; REBOOT REQUEST - LD DE,MENU_S+10-MENU_V ; POINT TO SERIAL MENU COLUMN - LD C,2 ; SET SERIAL FLAG - JR MATS ; GO CHECK MENU SELECTION -; -SEL1: -#IF (DSKYENABLE) - ; HANDLE DSKY KEY INPUT - CALL DSKY_STAT ; CHECK DSKY INPUT - OR A ; TEST FOR ZERO - JR Z,SEL2 ; IF ZERO, NO KEY PRESSED -#IF (BIOS == BIOS_WBW) - #IF (DIAGENABLE) - XOR A ; ZERO ACCUM - OUT (DIAGPORT),A ; CLEAR DIAG LEDS - #ENDIF - #IF (LEDENABLE) - OR $FF ; LED IS INVERTED - OUT (LEDPORT),A ; CLEAR LED - #ENDIF -#ENDIF - CALL DSKY_GETKEY ; GET PENDING KEY PRESS ; NOTE DESKY_GETKEY - CP $FF ; CHECK FOR ERROR - JR Z,SEL2 ; IF SO, IGNORE KEY, AND CONT LOOPING - CP KY_BO ; CHECK FOR REBOOT ; CAN RETURN AN INVALID - JP Z,REBOOT ; REBOOT REQUEST ; KEYSCAN AS FFH WHICH - LD DE,MENU_S+11-MENU_V ; POINT TO DSKY MENU COLUMN ; MAY BE MATCHED WITH - LD C,1 ; SET DSKY FLAG ; DUMMY MENU ENTRIES - JR MATS ; GO CHECK MENU SELECTION -#ENDIF -; -SEL2: -#IF (BOOTTYPE == BT_AUTO) - ; CHECK FOR AUTOBOOT TIMEOUT - LD DE,625 ; DELAY FOR 10MS TO MAKE TIMEOUT CALC EASY - CALL VDELAY ; 16US * 625 = 10MS - LD BC,(BL_TIMEOUT) ; CHECK/INCREMENT TIMEOUT - DEC BC - LD (BL_TIMEOUT),BC - LD A,B - OR C - JP NZ,SEL3 -; -#IF (BIOS == BIOS_WBW) - #IF (DIAGENABLE) - XOR A ; ZERO ACCUM - OUT (DIAGPORT),A ; CLEAR DIAG LEDS - #ENDIF - #IF (LEDENABLE) - OR $FF ; LED IS INVERTED - OUT (LEDPORT),A ; CLEAR LED - #ENDIF -#ENDIF - LD A,BOOT_DEFAULT ; TIMEOUT EXPIRED, - LD DE,MENU_S+10-MENU_V ; POINT TO SERIAL MENU COLUMN - LD C,2 ; SET SERIAL FLAG - JR MATS ; PERFORM DEFAULT BOOT ACTION -#ENDIF -; -SEL3: - ; NO USER SELECTION YET - JR SEL ; LOOP -; -;================================================================================================== -; ROM MENU TABLE MATCHING -;================================================================================================== -; -MATS: LD B,MENU_N ; LOOP THROUGH THE ; ON ENTRY DE POINTS TO - LD HL,MENU_V ; MENU TABLE AND ; THE MENU COLUMN WE ARE -MATS1: EX DE,HL ; CHECK IF THE ; CHECKING AND C CONTAINS - ADD HL,DE ; KEYPRESS MATCHES ; A FLAG TELLING US IF WE - CP (HL) ; ANY OF ; HAVE DSKY OR SERIAL INPUT - EX DE,HL ; THE MENU ITEMS. - JR Z,MATS2 - DJNZ MATS1 ; IF WE REACH THE TABLE END AND DON'T HAVE - JR MATD ; A MATCH GO AND CHECK FOR A DISK SELECTION -; -MATS2: LD B,0 ; WE GOT A MATCH FROM THE MENU TABLE. POINT - EX DE,HL ; TO THE ROM ADDRESS TO EXECUTE. ADJUST THE - ADD HL,BC ; POINTER TO THE ROM ENTRY BASED ON WHETHER WE - EX DE,HL ; GOT A MATCH IN THE DSKY OR SERIAL MENU COLUMN - JP GOROM ; JUMP TO THE ROM HANDLER. -; -MATD: LD B,A - LD A,C ; IF INPUT WAS SERIAL - LD (BL_INPFLG),A ; SAVE INPUT FLAG - DEC C ; CONVERT TO FROM. - LD A,B ; ASCII TO DECIMAL. - JR Z,MATD1 ; DSKY NUMBERS ARE - SUB '0' ; ALREADY DECIMAL -MATD1: CP 10 ; DO A RANGE CHECK - JR NC,MATX ; NOT VALID, HANDLE IT BELOW -; -#IF (BIOS == BIOS_WBW) - PUSH BC - PUSH AF ; HOW MANY DISK - LD B,BF_SYSGET ; DEVICES DO WE - LD C,BF_SYSGET_DIOCNT ; HAVE IN THE - RST 08 ; SYSTEM ? - POP AF - POP BC -#ELSE - LD E,9 ; HACK TO HANDLE UNA, NEED TO FIX -#ENDIF -; JR MATD2 ; IF MORE THEN 9 ; UNCOMMENT TO TEST DOUBLE CHAR ENTRY - CP 10 ; THEN WE NEED TO GET - JR NC,MATD2 ; ANOTHER CHARACTER -; - CP E ; WE DON'T HAVE MORE THAN 10 DEVICES SO ; A = REQUESTED UNIT - JP C,GOBOOTDISK ; CHECK IT IS IN RANGE. BOOT IF IT IS ; E = AVAILABLE UNITS - JR MATX ; IT IF NOT VALID, HANDLE IT BELOW - -MATD2: LD B,A ; PROCESS FURTHER INPUT ; B = REQUESTED UNIT - LD A,C ; CHECK WHERE TO GET ; C = DSKY/SERIAL FLAG - DEC C ; THE INPUT FROM AND GO - JR NZ,MATD3 ; GET ANOTHER CHARACTER -; -#IF (DSKYENABLE) ; INPUT DSKY -; -MATD4: ;CALL DSKY_STAT ; WAIT FOR - ;OR A ; ANOTHER - ;JR Z,MATD4 ; KEY FROM - ;CALL DSKY_GETKEY ; DSKY - CALL DSKY_KEY - - CP KY_EN ; IF NEXT KEY IS ENTER - JR Z,MATD6 ; OR GO, PROCESS AS A - CP KY_GO ; SINGLE DIGIT NUMBER - JR Z,MATD6 ; OTHERWISE JOIN TWO - JR MATD5 ; CHARCTERS IN ONE DECIMAL -#ENDIF -; -; ; INPUT SERIAL -; -MATD3: ;CALL CST ; WAIT FOR - ;OR A ; ANOTHER - ;JR Z,MATD3 ; KEY FROM - CALL CINUC ; SERIAL - CALL COUT -; - CP CHR_CR ; IF NEXT KEY IS RETURN PROCESS - JR Z,MATD6 ; AS A SINGLE DIGIT NUMBER -; - SUB '0' ; CONVERT THE SERIAL NUMBER TO DECIMAL - CP 10 ; DO A RANGE CHECK - JR NC,MATX ; NOT VALID, HANDLE IT BELOW - -MATD5: LD C,A ; C CONTAINS SECOND CHARACTER INPUT 0..9 - LD A,B ; A CONTAINS FIRST NUMBER INPUT 0..9 - ADD A,A - LD B,A ; MULTIPLY FIRST DIGIT BY 10 - ADD A,A ; AND ADD SECOND DIGIT - ADD A,A - ADD A,B ; CONVERT TWO INPUTTED - ADD A,C ; CHARACTERS TO DECIMAL. - LD B,A -; -MATD6: LD A,B ; PUT THE DEVICE NUMBER TO BOOT - JP GOBOOTDISK ; IN A AND GO BOOT DEVICE -; -MATX: LD DE,STR_INVALID ; SET ERROR STRING MESSAGE - JP MENU ; AND RESTART MENU LOOP -; -;================================================================================================== -; ROM MENU TABLE -;================================================================================================== -; -#DEFINE MENU_L(M1,M2,M3,M4,M5,M6,M7,M8,M9,M10) \ -#DEFCONT \ .DB M1 -#DEFCONT \ .DB M2 -#IF (DSKYENABLE) -#DEFCONT \ .DB M3 -#ELSE -#DEFCONT \ .DB $FF -#ENDIF -#DEFCONT \ .DW M4 -#DEFCONT \ .DW M5 -#DEFCONT \ .DW M6 -#DEFCONT \ .DW M7 -#DEFCONT \ .DB M8 -#DEFCONT \ .DB M9 -#DEFCONT \ .DB M10 -; -; NOTE: THE FORMATTING OF THE FOLLOWING IS CRITICAL. TASM DOES NOT PASS MACRO ARGUMENTS WELL. -; ENSURE STD.ASM HOLDS THE DEFINITIONS FOR *_LOC, *_SIZ *_END AND ANY CODE GENERATED WHICH DOES NOT -; INCLUDE STD.ASM IS SYNCED. -; -; NOTE: THE LOADABLE ROM IMAGES ARE PLACED IN ROM BANKS BID_IMG0 AND BID_IMG1. HOWEVER, ROMWBW -; SUPPORTS A MECHANISM TO LOAD A COMPLETE NEW SYSTEM DYNAMICALLY AS A RUNNABLE APPLICATION -; (SEE APPBOOT AND IMGBOOT IN HBIOS.ASM). IN THIS CASE, THE CONTENTS OF BID_IMG0 WILL -; PRE-LOADED INTO THE CURRENTLY EXECUTING RAM BANK THEREBY ALLOWING THOSE IMAGES TO BE -; DYNAMICALLY LOADED AS WELL. TO SUPPORT THIS CONCEPT, A PSEUDO-BANK CALLED BID_CUR -; IS USED TO SPECIFY THE IMAGES NORMALLY FOUND IN BID_IMG0. IN GOROM, THIS SPECIAL -; VALUE WILL CAUSE THE ASSOCIATED IMAGE TO BE LOADED FROM THE CURRENTLY EXECUTING BANK -; WHICH WILL BE CORRECT REGARDLESS OF THE LOAD MODE. IMAGES IN OTHER BANKS (BID_IMG1) -; WILL ALWAYS BE LOADED DIRECTLY FROM ROM. -; -; name menu dsky dest-exec source dest-addr img-size source-bank dest desc -; DB DB DB DW DW DW DW DB DB DB -MENU_S: MENU_L("~Monitor$ ", "M", KY_CL, MON_SERIAL, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "Monitor$ ") -MENU_1: MENU_L("~CP/M$ ", "C", KY_BK, CPM_ENT, 2000h, CPM_LOC, CPM_SIZ, BID_CUR, BID_USR, "CP/M 80 v2.2$") - MENU_L("~Z-System$", "Z", KY_FW, CPM_ENT, 5000h, CPM_LOC, CPM_SIZ, BID_CUR, BID_USR, "ZSDOS v1.1$ ") -#IF (BIOS == BIOS_WBW) - MENU_L("~Forth$ ", "F", KY_EX, FTH_LOC, 0000h, FTH_LOC, FTH_SIZ, BID_IMG1, BID_USR, "Camel Forth$ ") - MENU_L("~BASIC$ ", "B", KY_DE, BAS_LOC, 1700h, BAS_LOC, BAS_SIZ, BID_IMG1, BID_USR, "Nascom BASIC$") - MENU_L("~T-BASIC$ ", "T", KY_EN, TBC_LOC, 3700h, TBC_LOC, TBC_SIZ, BID_IMG1, BID_USR, "Tasty BASIC$ ") - MENU_L("~PLAY$ ", "P", $FF, GAM_LOC, 4000h, GAM_LOC, GAM_SIZ, BID_IMG1, BID_USR, "Game$ ") - MENU_L("~USER ROM$", "U", $FF, USR_LOC, 7000h, USR_LOC, USR_SIZ, BID_IMG1, BID_USR, "User ROM$ ") -#ENDIF -#IF (DSKYENABLE) - MENU_L("~DSKY$ ", "D", KY_GO, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "DSKY Monitor$") -#ENDIF - MENU_L("$ ", "E", $FF, EGG_LOC, 0E00h, EGG_LOC, EGG_SIZ, BID_CUR, BID_USR, "Easter Egg$ ") -; -MENU_E .EQU $ ; END OF TABLE -MENU_V .EQU MENU_1 - MENU_S ; LENGTH OF EACH MENU RECORD -MENU_N .EQU ((MENU_E - MENU_S) / MENU_V) ; NUMBER OF MENU ITEMS -; -;================================================================================================== -; SYSTEM REBOOT HANDLER -;================================================================================================== -; -REBOOT: -; - LD DE,STR_REBOOT ; POINT TO MESSAGE - CALL WRITESTR ; PRINT IT -; - ; WAIT FOR MESSAGE TO BE DISPLAYED - LD HL,10000 -REBOOT1: ; LOOP IS 26TS - DEC HL ; 6TS - LD A,H ; 4TS - OR L ; 4TS - JR NZ,REBOOT1 ; 12TS -; -#IF (BIOS == BIOS_WBW) -; -#IF (DSKYENABLE) - LD HL,MSG_BOOT ; POINT TO BOOT MESSAGE - CALL DSKY_SHOWSEG ; DISPLAY MESSAGE -#ENDIF -; - ; SWITCH TO ROM BANK 0 AND JUMP TO ADDRESS 0 - LD A,BID_BOOT ; BOOT BANK - LD HL,0 ; ADDRESS ZERO - CALL HB_BNKCALL ; DOES NOT RETURN -#ENDIF -; -#IF (BIOS == BIOS_UNA) - ; SWITCH TO ROM BANK 0 AND JUMP TO ADDRESS 0 - LD BC,$01FB ; UNA FUNC = SET BANK - LD DE,0 ; ROM BANK 0 - RST 08 ; DO IT - JP 0 ; JUMP TO RESTART ADDRESS -#ENDIF -; -;================================================================================================== -; ROM IMAGE LOAD HANDLER -;================================================================================================== -; -; AT ENTRY, DE POINTS TO THE EXEC ADR FIELD OF THE ACTIVE ROM -; TABLE ENTRY -; -; ROM IMAGES MUST NOT OVERLAY THE SPACE OCCUPIED BY THE LOADER WHICH -; IS $8000-$8FFF. -; -GOROM: PUSH DE ; SAVE ROM TABLE ENTRY EXEC ADR PTR - LD DE,STR_BOOTROM ; ROM LOADING MSG PREFIX - CALL WRITESTR ; PRINT IT -#IF (DSKYENABLE) - LD HL,MSG_LOAD ; POINT TO LOAD MESSAGE - CALL DSKY_SHOWSEG ; DISPLAY MESSAGE -#ENDIF - POP HL ; EXEC ADR TO HL - PUSH HL ; AND RESAVE IT - LD A,10 ; OFFSET TO IMAGE DESC - CALL ADDHLA ; APPLY IT - EX DE,HL ; MOVE TO DE, ORIG VALUE TO HL - CALL WRITESTR ; AND PRINT IT - PRTS("...$") ; ADD SOME DOTS - POP HL ; RESTORE EXEC ADR TO HL -; - LD B,5 ; PUT NEXT FIVE WORDS ON STACK -GOROM1: LD E,(HL) ; (1) EXEC ADR - INC HL ; (2) SOURCE ADR - LD D,(HL) ; (3) DEST ADR - INC HL ; (4) IMAGE SIZE - PUSH DE ; (5) SRC/DEST BANKS - DJNZ GOROM1 ; LOOP TILL DONE -; -#IF (BIOS == BIOS_UNA) -; -; NOTE: UNA HAS NO INTERBANK MEMORY COPY, SO WE CAN ONLY LOAD -; IMAGES FROM THE CURRENT BANK. A SIMPLE LDIR IS USED TO -; RELOCATE THE IMAGES. AT SOME POINT AN UNA INTERBANK COPY -; SHOULD BE IMPLEMENTED HERE. -; - ; COPY IMAGE TO IT'S RUNNING LOCATION - POP HL ; POP AND DISCARD BANKS - POP BC ; GET IMAGE SIZE TO BC - POP DE ; GET DESTINATION ADR TO DE - POP HL ; GET SOURCE ADR TO HL - LDIR ; MOVE IT -; - ; RECORD BOOT INFO - LD BC,$00FB ; GET LOWER PAGE ID - RST 08 ; DE := LOWER PAGE ID == BOOT ROM PAGE - LD L,1 ; BOOT DISK UNIT IS ROM (UNIT ID = 1) - LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY - RST 08 ; CALL UNA -; - ; LAUNCH IMAGE W/ USER BANK ACTIVE - ; NOTE: UNA EXEC CHAIN CALL USES ADDRESS ON TOS - CALL NEWLINE2 - LD DE,BID_USR ; TARGET BANK ID - PUSH DE ; ... ON STACK - ;DI ; ENTER WITH INTS DISABLED - JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN -#ELSE -; -; NOTE: CHECK FOR SPECIAL CASE WHERE SOURCE BANK IS BID_CUR. IN THIS CASE -; WE COPY THE IMAGE FROM THE BANK THAT WE ARE CURRENTLY RUNNING IN. THIS -; IS DONE TO SUPPORT THE APPBOOT AND IMGBOOT MODES AS DEFINED IN HBIOS. -; IN THE CASE OF THESE MODES IT IS INTENDED THAT THE IMAGES BE LOADED -; FROM THE CURRENT RAM BANK AND NOT FROM THEIR NORMAL ROM LOCATIONS. -; - ; COPY IMAGE TO IT'S RUNNING LOCATION - POP DE ; GET BANKS (E=SRC, D=DEST) - POP HL ; GET IMAGE SIZE - LD A,E ; SOURCE BANK TO A - CP BID_CUR ; SPECIAL CASE, BID_CUR? - JR NZ,GOROM2 ; IF NOT, GO RIGHT TO COPY - LD A,(HB_CURBNK) ; GET CURRENT BANK - LD E,A ; AND SUBSTITUE THE VALUE -GOROM2: LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY - RST 08 ; DO IT - POP DE ; GET DEST ADR - POP HL ; GER SOURCE ADR - LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY - RST 08 ; DO IT -; - ; RECORD BOOT INFO - LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA - LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER - LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO - LD L,A ; ... AND SAVE AS BOOT BANK - LD DE,$0100 ; BOOT VOLUME (UNIT, SLICE) - RST 08 -; -#IF (DSKYENABLE) - LD HL,MSG_GO ; POINT TO BOOT MESSAGE - CALL DSKY_SHOWSEG ; DISPLAY MESSAGE -#ENDIF -; - ; LAUNCH IMAGE W/ USER BANK ACTIVE - CALL NEWLINE2 - LD A,BID_USR ; ACTIVATE USER BANK - POP HL ; RECOVER EXEC ADDRESS - ;DI ; ENTER WITH INTS DISABLED - CALL HB_BNKCALL ; AND GO - HALT ; WE SHOULD NEVER RETURN!!! -#ENDIF -; -;================================================================================================== -; DISK BOOT HANDLER -;================================================================================================== -; -GOBOOTDISK: - LD (BL_BOOTID),A ; SAVE INCOMING BOOTID -; - ; SET THE INITIAL BOOT UNIT AND SLICE - ;LD A,(BL_BOOTID) ; GET BOOTID - LD (BL_DEVICE),A ; STORE IT - XOR A ; LU DEFAULTS TO 0 - LD (BL_LU),A ; STORE IT -; -#IF (BIOS == BIOS_WBW) -; - LD A,(BL_INPFLG) ; GET INPUT FLAG - CP 1 ; DSKY? - JR Z,GOBOOTDISK1 ; IF SO, SLICE 0 IS ASSUMED -; - LD A,(BL_DEVICE) ; GET BOOT DEVICE - LD C,A ; PUT IN C - LD B,BF_DIODEVICE ; HBIOS: DIO DEVICE FUNC - RST 08 - LD A,D ; DEVICE TYPE TO A - CP DIODEV_IDE ; HARD DISK DEVICE? - JR C,GOBOOTDISK1 ; NOT SLICE WORTHY, SKIP AHEAD -; - LD DE,STR_SLICESEL ; SLICE SELECTION STRING - CALL WRITESTR ; DISPLAY IT - CALL CINUC ; GET THE KEY - CALL COUT ; ECHO KEY -; - LD DE,STR_INVALID ; SETUP IN CASE OF INVALID - CP 13 ; ENTER? - JR Z,GOBOOTDISK1 ; IF SO, DONE - CP '0' ; START OF RANGE? - JP C,MENU ; BACK TO MENU IF TOO LOW - CP '9' + 1 ; END OF RANGE - JP NC,MENU ; BACK TO MENU IF TOO HIGH - SUB '0' ; CONVERT TO BINARY - LD (BL_LU),A ; AND SAVE IT -GOBOOTDISK1: -; -#ENDIF -; - LD DE,STR_BOOTDISK - CALL WRITESTR - LD A,(BL_DEVICE) - CALL PRTDECB - LD DE,STR_BOOTDISK1 - CALL WRITESTR - LD A,(BL_LU) - CALL PRTDECB - PRTS("...$") -#IF (DSKYENABLE) - LD HL,MSG_LOAD ; POINT TO LOAD MESSAGE - CALL DSKY_SHOWSEG ; DISPLAY MESSAGE -#ENDIF -; - LD DE,STR_BOOTREAD ; DISK BOOT MESSAGE - CALL WRITESTR ; PRINT IT -; -#IF (BIOS == BIOS_UNA) - LD A,(BL_BOOTID) ; GET BOOT DEVICE ID - LD B,A ; MOVE TO B -; - ; LOAD SECTOR 2 (BOOT INFO) - LD C,$41 ; UNA FUNC: SET LBA - LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO - LD HL,2 ; LOAD STARTING INFO SECTOR 2 - RST 08 ; SET LBA - JP NZ,DB_ERR ; HANDLE ERROR -; - LD C,$42 ; UNA FUNC: READ SECTORS - LD DE,BL_INFOSEC ; DEST OF CPM IMAGE - LD L,1 ; SECTORS TO READ - RST 08 ; DO READ - JP NZ,DB_ERR ; HANDLE ERROR -#ELSE - ; CHECK FOR VALID DRIVE LETTER - LD A,(BL_BOOTID) ; BOOT DEVICE TO A - PUSH AF ; SAVE BOOT DEVICE - LD B,BF_SYSGET - LD C,BF_SYSGET_DIOCNT - RST 08 ; E := DISK UNIT COUNT - POP AF ; RESTORE BOOT DEVICE - CP E ; CHECK MAX (INDEX - COUNT) - JP NC,DB_NODISK ; HANDLE INVALID SELECTION -; - ; SENSE MEDIA - LD A,(BL_DEVICE) ; GET DEVICE/UNIT - LD C,A ; STORE IN C - LD B,BF_DIOMEDIA ; DRIVER FUNCTION = DISK MEDIA - LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY - RST 08 ; CALL HBIOS - JP NZ,DB_ERR ; HANDLE ERROR -; - ; SEEK TO SECTOR 2 OF LU - LD A,(BL_LU) ; GET LU SPECIFIED - LD E,A ; LU INDEX - LD H,65 ; 65 TRACKS PER LU - CALL MULT8 ; HL := H * E - LD DE,$02 ; HEAD 0, SECTOR 2 - LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL - LD A,(BL_DEVICE) ; GET BOOT DISK UNIT - LD C,A ; PUT IN C - RST 08 ; DO IT - JP NZ,DB_ERR ; HANDLE ERROR -; - ; READ - LD B,BF_DIOREAD ; FUNCTION IN B - LD A,(BL_DEVICE) ; GET BOOT DISK UNIT - LD C,A ; PUT IN C - LD HL,BL_INFOSEC ; READ INTO INFO SEC BUFFER - LD D,BID_USR ; USER BANK ; - LD E,1 ; TRANSFER ONE SECTOR - RST 08 ; DO IT - JP NZ,DB_ERR ; HANDLE ERROR -; -#ENDIF -; - ; CHECK SIGNATURE - LD DE,(BB_SIG) ; GET THE SIGNATURE - LD A,$A5 ; FIRST BYTE SHOULD BE $A5 - CP D ; COMPARE - JP NZ,DB_NOBOOT ; ERROR IF NOT EQUAL - LD A,$5A ; SECOND BYTE SHOULD BE $5A - CP E ; COMPARE - JP NZ,DB_NOBOOT ; ERROR IS NOT EQUAL -; - ; PRINT CPMLOC VALUE - PRTS("\r\nLoc=$") - LD BC,(BB_CPMLOC) - CALL PRTHEXWORD -; - ; PRINT CPMEND VALUE - PRTS(" End=$") - LD BC,(BB_CPMEND) - CALL PRTHEXWORD -; - ; PRINT CPMENT VALUE - PRTS(" Ent=$") - LD BC,(BB_CPMENT) - CALL PRTHEXWORD -; - ; PRINT DISK LABEL - PRTS(" Label=$") - LD DE,BB_LABEL ; if it is there, then a printable - LD A,(BB_TERM) ; Display Disk Label if Present - CP '$' ; (dwg 2/7/2012) - CALL Z,WRITESTR ; label is there as well even if spaces. -; - LD DE,STR_LOADING ; LOADING MESSAGE - CALL WRITESTR ; PRINT IT -; - ; COMPUTE NUMBER OF SECTORS TO LOAD - LD HL,(BB_CPMEND) ; HL := END - LD DE,(BB_CPMLOC) ; DE := START - OR A ; CLEAR CARRY - SBC HL,DE ; HL := LENGTH TO LOAD - LD A,H ; DETERMINE 512 BYTE SECTOR COUNT - RRA ; ... BY DIVIDING MSB BY TWO - LD (BL_COUNT),A ; ... AND SAVE IT -; -#IF (BIOS == BIOS_UNA) -; - ; START OS LOAD AT SECTOR 3 - LD C,$41 ; UNA FUNC: SET LBA - LD A,(BL_BOOTID) ; GET BOOT DEVICE ID - LD B,A ; MOVE TO B - LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO - LD HL,3 ; LOAD STARTING INFO SECTOR 2 - RST 08 ; SET LBA - JP NZ,DB_ERR ; HANDLE ERROR -; - ; READ OS IMAGE INTO MEMORY - LD C,$42 ; UNA FUNC: READ SECTORS - LD A,(BL_BOOTID) ; GET BOOT DEVICE ID - LD B,A ; MOVE TO B - LD DE,(BB_CPMLOC) ; DEST OF CPM IMAGE - LD A,(BL_COUNT) ; GET SECTORS TO READ - LD L,A ; SECTORS TO READ - RST 08 ; DO READ - JP NZ,DB_ERR ; HANDLE ERROR -; - ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT - LD DE,-1 ; BOOT ROM PAGE, -1 FOR N/A - LD A,(BL_BOOTID) ; GET BOOT DISK UNIT ID - LD L,A ; PUT IN L - LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY - RST 08 ; CALL UNA - JP NZ,DB_ERR ; HANDLE ERROR -; - ; JUMP TO COLD BOOT ENTRY - LD HL,(BB_CPMENT) ; GET THE ENTRY POINT - PUSH HL ; PUT ON STACK FOR UNA CHAIN FUNC - LD DE,BID_USR ; TARGET BANK ID IS USER BANK - PUSH DE ; PUT ON STACK FOR UNA CHAIN FUNC - ;DI ; ENTER WITH INTS DISABLED - JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN -; -#ELSE -; - ; READ OS IMAGE INTO MEMORY - LD B,BF_DIOREAD ; FUNCTION IN B - LD A,(BL_DEVICE) ; GET BOOT DISK UNIT - LD C,A ; PUT IN C - LD HL,(BB_CPMLOC) ; LOAD ADDRESS - LD D,BID_USR ; USER BANK - LD A,(BL_COUNT) ; GET SECTORS TO READ - LD E,A ; NUMBER OF SECTORS TO LOAD - RST 08 - JP NZ,DB_ERR ; HANDLE ERRORS -; - ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT - LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER - LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO - LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA - LD L,A ; ... AND SAVE AS BOOT BANK - LD A,(BL_DEVICE) ; LOAD BOOT DEVICE/UNIT - LD D,A ; SAVE IN D - LD A,(BL_LU) ; LOAD BOOT LU - LD E,A ; SAVE IN E - RST 08 - JP NZ,DB_ERR ; HANDLE ERRORS -; -#IF (DSKYENABLE) - LD HL,MSG_GO ; POINT TO BOOT MESSAGE - CALL DSKY_SHOWSEG ; DISPLAY MESSAGE -#ENDIF -; - ; JUMP TO COLD BOOT ENTRY - LD A,BID_USR ; ACTIVATE USER BANK - LD HL,(BB_CPMENT) ; OS ENTRY ADDRESS - ;DI ; ENTER WITH INTS DISABLED - CALL HB_BNKCALL ; AND GO - HALT ; WE SHOULD NEVER RETURN!!! -; -#ENDIF -; -DB_NODISK: - ; SELDSK DID NOT LIKE DRIVE SELECTION - LD DE,STR_NODISK - JP MENU -; -DB_NOBOOT: - ; DISK IS NOT BOOTABLE - LD DE,STR_NOBOOT - JP MENU -; -DB_ERR: - ; I/O ERROR DURING BOOT ATTEMPT - LD DE,STR_BOOTERR - JP MENU -; -#IF (BIOS == BIOS_UNA) -; -; PRINT LIST OF ALL DRIVES UNDER UNA -; -PRTALL: - LD B,0 ; START WITH UNIT 0 -; -PRTALL1: ; LOOP THRU ALL UNITS AVAILABLE - LD C,$48 ; UNA FUNC: GET DISK TYPE - LD L,0 ; PRESET UNIT COUNT TO ZERO - RST 08 ; CALL UNA, B IS ASSUMED TO BE UNTOUCHED!!! - LD A,L ; UNIT COUNT TO A - OR A ; PAST END? - RET Z ; WE ARE DONE - PUSH BC ; SAVE UNIT - CALL PRTDRV ; PROCESS THE UNIT - POP BC ; RESTORE UNIT - INC B ; NEXT UNIT - JR PRTALL1 ; LOOP -; -; PRINT THE UNA UNIT INFO -; ON INPUT B HAS UNIT -; -PRTDRV: - PUSH BC ; SAVE UNIT - PUSH DE ; SAVE DISK TYPE - LD A,'(' ; NEWLINE AND SPACING - CALL COUT ; PRINT IT - LD A,B ; DRIVE LETTER TO A - CALL PRTDECB - LD A,')' ; DRIVE LETTER COLON - CALL COUT ; PRINT IT - POP DE ; RECOVER DISK TYPE - LD A,D ; DISK TYPE TO A - CP $40 ; RAM/ROM? - JR Z,PRTDRV1 ; HANDLE RAM/ROM - LD DE,DEVIDE ; ASSUME IDE - CP $41 ; IDE? - JR Z,PRTDRV2 ; PRINT IT - LD DE,DEVPPIDE ; ASSUME PPIDE - CP $42 ; PPIDE? - JR Z,PRTDRV2 ; PRINT IT - LD DE,DEVSD ; ASSUME SD - CP $43 ; SD? - JR Z,PRTDRV2 ; PRINT IT - LD DE,DEVDSD ; ASSUME DSD - CP $44 ; DSD? - JR Z,PRTDRV2 ; PRINT IT - LD DE,DEVUNK ; OTHERWISE UNKNOWN - JR PRTDRV2 -; -PRTDRV1: ; HANDLE RAM/ROM - LD C,$45 ; UNA FUNC: GET DISK INFO - LD DE,BL_INFOSEC ; 512 BYTE BUFFER - RST 08 ; CALL UNA - BIT 7,B ; TEST RAM DRIVE BIT - LD DE,DEVROM ; ASSUME ROM - JR Z,PRTDRV2 ; IF SO, PRINT IT - LD DE,DEVRAM ; OTHERWISE RAM - JR PRTDRV2 ; PRINT IT -; -PRTDRV2: ; PRINT DEVICE - POP BC ; RECOVER UNIT - CALL WRITESTR ; PRINT DEVICE NAME - LD A,B ; UNIT TO A - ADD A,'0' ; MAKE IT PRINTABLE NUMERIC - CALL COUT ; PRINT IT - LD A,',' ; DEVICE NAME SEPARATOR - CALL COUT ; PRINT IT - RET ; DONE -; -DEVRAM .DB "RAM$" -DEVROM .DB "ROM$" -DEVIDE .DB "IDE$" -DEVPPIDE .DB "PPIDE$" -DEVSD .DB "SD$" -DEVDSD .DB "DSD$" -DEVUNK .DB "UNK$" -; -#ELSE -; -; PRINT LIST OF ALL DRIVES -; -PRTALL: -; - LD B,BF_SYSGET - LD C,BF_SYSGET_DIOCNT - RST 08 ; E := DISK UNIT COUNT - LD B,E ; COUNT TO B - LD A,B ; COUNT TO A - OR A ; SET FLAGS - RET Z ; BAIL OUT IF ZERO - LD C,0 ; INIT DEVICE INDEX -; -PRTALL1: - LD A,'(' ; FORMATTING - CALL COUT ; PRINT IT - LD A,C ; INDEX TO A - CALL PRTDECB - LD A,')' ; FORMATTING - CALL COUT ; PRINT IT - PUSH BC ; SAVE LOOP CONTROL - LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO - RST 08 ; CALL HBIOS - CALL PRTDRV ; PRINT IT - POP BC ; RESTORE LOOP CONTROL - INC C ; BUMP INDEX - DJNZ PRTALL1 ; LOOP AS NEEDED - RET ; DONE -; -; PRINT THE DRIVER DEVICE/UNIT INFO -; ON INPUT D HAS DRIVER ID, E HAS DRIVER MODE/UNIT -; DESTROY NO REGISTERS OTHER THAN A -; -PRTDRV: - PUSH DE ; PRESERVE DE - PUSH HL ; PRESERVE HL - LD A,D ; LOAD DEVICE/UNIT - RRCA ; ROTATE DEVICE - RRCA ; ... BITS - RRCA ; ... INTO - RRCA ; ... LOWEST 4 BITS - AND $0F ; ISOLATE DEVICE BITS - ADD A,A ; MULTIPLE BY TWO FOR WORD TABLE - LD HL,DEVTBL ; POINT TO START OF DEVICE NAME TABLE - CALL ADDHLA ; ADD A TO HL TO POINT TO TABLE ENTRY - LD A,(HL) ; DEREFERENCE HL TO LOC OF DEVICE NAME STRING - INC HL ; ... - LD D,(HL) ; ... - LD E,A ; ... - CALL WRITESTR ; PRINT THE DEVICE NMEMONIC - POP HL ; RECOVER HL - POP DE ; RECOVER DE - LD A,E ; LOAD DRIVER MODE/UNIT - AND $0F ; ISOLATE UNIT - CALL PRTDECB ; PRINT IT - CALL PC_SPACE ; FORMATTING - ;LD A,E ; LOAD LU - ;CALL PRTDECB ; PRINT IT - RET -; -DEVTBL: ; DEVICE TABLE - .DW DEV00, DEV01, DEV02, DEV03 - .DW DEV04, DEV05, DEV06, DEV07 - .DW DEV08, DEV09, DEV10, DEV11 - .DW DEV12, DEV13, DEV14, DEV15 -; -DEVUNK .DB "???$" -DEV00 .DB "MD$" -DEV01 .DB "FD$" -DEV02 .DB "RAMF$" -DEV03 .DB "IDE$" -DEV04 .DB "ATAPI$" -DEV05 .DB "PPIDE$" -DEV06 .DB "SD$" -DEV07 .DB "PRPSD$" -DEV08 .DB "PPPSD$" -DEV09 .DB "HDSK$" -DEV10 .EQU DEVUNK -DEV11 .EQU DEVUNK -DEV12 .EQU DEVUNK -DEV13 .EQU DEVUNK -DEV14 .EQU DEVUNK -DEV15 .EQU DEVUNK -; -#ENDIF -; -;================================================================================================== -; STRINGS -;================================================================================================== -; -STR_BANNER .DB "\r\n\r\n", PLATFORM_NAME, " Boot Loader$" -STR_BOOTSEL .DB "\r\n\r\nBoot Selection? $" -STR_SLICESEL .DB " Slice(0-9)[0]? $" -STR_BOOTDISK .DB "\r\n\r\nBooting Disk Unit $" -STR_BOOTDISK1 .DB ", Slice $" -STR_BOOTROM .DB "\r\n\r\nLoading $" -STR_REBOOT .DB "\r\n\r\nRestarting System...$" -STR_INVALID .DB "\r\n\r\n*** Invalid Selection ***$" -STR_NODISK .DB "\r\n\r\nNo disk!$" -STR_NOBOOT .DB "\r\n\r\nDisk not bootable!$" -STR_BOOTERR .DB "\r\n\r\nBoot failure!$" -STR_BOOTREAD .DB "\r\n\r\nReading disk information...$" -STR_LOADING .DB "\r\n\r\nLoading...$" -; -#IF (DSKYENABLE) -MSG_SEL .DB $FF,$9D,$9D,$8F,$EC,$80,$80,$80 ; "Boot? " -MSG_BOOT .DB $FF,$9D,$9D,$8F,$00,$00,$00,$80 ; "Boot... " -MSG_LOAD .DB $8B,$9D,$FD,$BD,$00,$00,$00,$80 ; "Load... " -MSG_GO .DB $DB,$9D,$00,$00,$00,$80,$80,$80 ; "Go... " -#ENDIF +start: + ld sp,bl_stack ; setup private stack + call DELAY_INIT ; init delay functions +; +; Disable interrupts if IM1 is active because we are switching to page +; zero in user bank and it has not been prepared with IM1 vector yet. +; +#if (INTMODE == 1) + di +#endif +; +; Switch banked memory to user RAM bank and setup page zero. +; +#if (BIOS == BIOS_WBW) + ld b,BF_SYSSETBNK ; HBIOS func: set bank + ld c,BID_USR ; select user bank + rst 08 ; do it + ld a,c ; previous bank to A + ld (bid_ldr),a ; save previous bank for later +#endif +; +#if (BIOS == BIOS_UNA) + ld bc,$01FB ; UNA func: set bank + ld de,BID_USR ; select user bank + rst 08 ; do it + ld a,c ; save previous bank + ld (bid_ldr),de ; ... for later +#endif +; +; Copy original page zero into user page zero +; + ld hl,$8000 ; page zero was copied here + ld de,0 ; put it in user page zero + ld bc,$100 ; full page + ldir ; do it +; +; Page zero in user bank is ready for interrupts now. +; +#if (INTMODE == 1) + ei +#endif +; +;======================================================================= +; Loader prompt +;======================================================================= +; + call nl2 ; formatting + ld hl,str_banner ; display boot banner + call pstr ; do it + call clrbuf ; zero fill the cmd buffer +; +#if (BOOT_TIMEOUT > 0) + ; Initialize auto command timeout downcounter + or $FF ; auto cmd active value + ld (acmd_act),a ; set flag + ld bc,BOOT_TIMEOUT * 100 ; hundredths of seconds + ld (acmd_to),bc ; save auto cmd timeout + ;ld a,b ; check for + ;or c ; ... zero + ;jr nz,prompt ; not zero, prompt w/ timeout + ;call nl2 ; formatting + ;ld hl,str_boot ; command string prefix + ;call pstr ; show it + ;call autocmd ; else, handle w/o prompt + ;jr reprompt ; restart w/ autocmd disable +#endif +; +prompt: + ld hl,reprompt ; adr of prompt restart routine + push hl ; put it on stack + call nl2 ; formatting + ld hl,str_prompt ; display boot prompt + call pstr ; do it + call clrbuf ; zero fill the cmd buffer +; +#if (DSKYENABLE) + call DSKY_RESET ; clear DSKY + ld hl,msg_sel ; boot select msg + call DSKY_SHOWSEG ; show on DSKY +#endif +; +wtkey: + ; wait for a key or timeout + call cst ; check for keyboard key + jr nz,concmd ; if pending, do console command +; +#if (DSKYENABLE) + call DSKY_STAT ; check DSKY for keypress + or a ; set flags + jp nz,dskycmd ; if pending, do DSKY command +#endif +; +#if (BOOT_TIMEOUT > 0) + ; check for timeout and handle auto boot here + ld a,(acmd_act) ; get auto cmd active flag + or a ; set flags + jr z,wtkey ; if not active, just loop + ld bc,(acmd_to) ; load timeout value + ld a,b ; test for + or c ; ... zero + jr z,autocmd ; if so, handle it + dec bc ; decrement + ld (acmd_to),bc ; resave it + ld de,625 ; 16us * 625 = 10ms + call VDELAY ; 10ms delay +#endif +; + jr wtkey ; loop +; +reprompt: + xor a ; zero accum + ld (acmd_act),a ; set auto cmd inactive + jr prompt ; back to loader prompt +; +clrbuf: + ld hl,cmdbuf + ld b,bufsiz + xor a +clrbuf1: + ld (hl),a + djnz clrbuf1 + ret +; +;======================================================================= +; Process a command line from buffer +;======================================================================= +; +concmd: + call clrled ; clear LEDs +; + ; Get a command line from console and handle it + call rdln ; get a line from the user + ld de,cmdbuf ; point to buffer + call skipws ; skip whitespace + or a ; set flags to check for null + jr nz,runcmd ; got a cmd, process it + ; if no cmd entered, fall thru to process default cmd +; +autocmd: + ; Copy autocmd string to buffer and process it + ld hl,acmd ; auto cmd string + call pstr ; display it + ld hl,acmd ; auto cmd string + ld de,cmdbuf ; cmd buffer adr + ld bc,acmd_len ; auto cmd length + ldir ; copy to command line buffer +; +runcmd: + ; Process command line +; + ld de,cmdbuf ; point to start of buf + call skipws ; skip whitespace + or a ; check for null terminator + ret z ; if empty line, just bail out + ld a,(de) ; get character + call upcase ; make upper case +; + ; Attempt built-in commands + cp 'H' ; H = display help + jp z,help ; if so, do it + cp '?' ; '?' alias for help + jp z,help ; if so, do it + cp 'L' ; L = List ROM applications + jp z,applst ; if so, do it + cp 'D' ; D = device inventory + jp z,devlst ; if so, do it + cp 'R' ; R = reboot system + jp z,reboot ; if so, do it +; + ; Attempt ROM application launch + ld ix,ra_tbl ; point to start of ROM app tbl + ld c,a ; save command in C +runcmd1: + ld a,(ix+ra_conkey) ; get match char + and ~$80 ; clear "hidden entry" bit + cp c ; compare + jp z,romload ; if match, load it + ld de,ra_entsiz ; table entry size + add ix,de ; bump IX to next entry + ld a,(ix) ; check for end + or (ix+1) ; ... of table + jr nz,runcmd1 ; loop till done +; + ; Attempt disk boot + ld de,cmdbuf ; start of buffer + call skipws ; skip whitespace + call isnum ; do we have a number? + jp nz,err_invcmd ; invalid format if empty + call getnum ; parse a number + jp c,err_invcmd ; handle overflow error + ld (bootunit),a ; save boot unit + xor a ; zero accum + ld (bootslice),a ; save default slice + call skipws ; skip possible whitespace + ld a,(de) ; get separator char + or a ; test for terminator + jp z,diskboot ; if so, boot the disk unit + cp '.' ; otherwise, is '.'? + jr z,runcmd2 ; yes, handle slice spec + cp ':' ; or ':'? + jr z,runcmd2 ; alt sep for slice spec + jp err_invcmd ; if not, format error +runcmd2: + inc de ; bump past separator + call skipws ; skip possible whitespace + call isnum ; do we have a number? + jp nz,err_invcmd ; if not, format error + call getnum ; get number + jp c,err_invcmd ; handle overflow error + ld (bootslice),a ; save boot slice + jp diskboot ; boot the disk unit/slice +; +;======================================================================= +; Process a DSKY command from key in A +;======================================================================= +; +#if (DSKYENABLE) +; +dskycmd: + call clrled ; clear LEDs +; + call DSKY_GETKEY ; get DSKY key + cp $FF ; check for error + ret z ; abort if so +; + ; Attempt built-in commands + cp KY_BO ; reboot system + jp z,reboot ; if so, do it +; + ; Attempt ROM application launch + ld ix,ra_tbl ; point to start of ROM app tbl + ld c,a ; save DSKY key in C +dskycmd1: + ld a,(ix+ra_dskykey) ; get match char + cp c ; compare + jp z,romload ; if match, load it + ld de,ra_entsiz ; table entry size + add ix,de ; bump IX to next entry + ld a,(ix) ; check for end + or (ix+1) ; ... of table + jr nz,dskycmd1 ; loop till done +; + ; Attempt disk boot + ld a,c ; copy key to A + cp KY_F + 1 ; over max? + ret nc ; abort if so + ld (bootunit),a ; set as boot unit + xor a ; zero A + ld (bootslice),a ; boot slice always zero here + jp diskboot ; go do it +; +#endif +; +;======================================================================= +; Special command processing +;======================================================================= +; +; Display Help +; +help: + ld hl,str_help ; point to help string + call pstr ; display it + ret +; +; List ROM apps +; +applst: + ld hl,str_applst + call pstr + call nl + ld ix,ra_tbl +applst1: + ; check for end of table + ld a,(ix) + or (ix+1) + ret z +; + ld a,(ix+ra_conkey) + bit 7,a + jr nz,applst2 + push af + call nl + ld a,' ' + call cout + call cout + pop af + call cout + ld a,':' + call cout + ld a,' ' + call cout + ld l,(ix+ra_name) + ld h,(ix+ra_name+1) + call pstr +; +applst2: + ld bc,ra_entsiz + add ix,bc + jr applst1 + ret +; +; Device list +; +devlst: + ld hl,str_devlst ; device list header string + call pstr ; display it + jp prtall ; do it +; +; Restart system +; +reboot: + ld hl,str_reboot ; point to message + call pstr ; print it + call LDELAY ; wait for message to display +; +#if (BIOS == BIOS_WBW) +; +#if (DSKYENABLE) + ld hl,msg_boot ; point to boot message + call DSKY_SHOWSEG ; display message +#endif +; + ; switch to rom bank 0 and jump to address 0 + ld a,BID_BOOT ; boot bank + ld hl,0 ; address zero + call HB_BNKCALL ; does not return +#endif +; +#if (BIOS == BIOS_UNA) + ; switch to rom bank 0 and jump to address 0 + ld bc,$01FB ; UNA func = set bank + ld de,0 ; ROM bank 0 + rst 08 ; do it + jp 0 ; jump to restart address +#endif +; +;======================================================================= +; Load and run a ROM application, IX=ROM app table entry +;======================================================================= +; +romload: +; + ; Notify user + ld hl,str_load + call pstr + ld l,(ix+ra_name) + ld h,(ix+ra_name+1) + call pstr +; +#if (DSKYENABLE) + ld hl,msg_load ; point to load message + call DSKY_SHOWSEG ; display message +#endif +; +#if (BIOS == BIOS_WBW) +; + ; Copy image to it's running location + ld a,(ix+ra_bnk) ; get image source bank id + cp bid_cur ; special value? + jr nz,romload1 ; if not, continue + ld a,(bid_ldr) ; else substitute +romload1: + push af ; save source bank + ld e,a ; source bank to E + ld d,BID_USR ; dest is user bank + ld l,(ix+ra_siz) ; HL := image size + ld h,(ix+ra_siz+1) ; ... + ld b,BF_SYSSETCPY ; HBIOS func: setup bank copy + rst 08 ; do it + ld a,'.' ; dot character + call cout ; show progress + ld e,(ix+ra_dest) ; DE := run dest adr + ld d,(ix+ra_dest+1) ; ... + ld l,(ix+ra_src) ; HL := image source adr + ld h,(ix+ra_src+1) ; ... + ld b,BF_SYSBNKCPY ; HBIOS func: bank copy + rst 08 ; do it + ld a,'.' ; dot character + call cout ; show progress +; + ; Record boot information + pop af ; recover source bank + ld l,a ; L := source bank + ld de,$0100 ; boot volume/slice + ld b,BF_SYSSET ; HBIOS func: system set + ld c,BF_SYSSET_BOOTINFO ; BBIOS subfunc: boot info + rst 08 ; do it + ld a,'.' ; dot character + call cout ; show progress +; +#endif +; +#if (BIOS == BIOS_UNA) +; +; Note: UNA has no interbank memory copy, so we can only load +; images from the current bank. We switch to the original bank +; use a simple ldir to relocate the image, then switch back to the +; user bank to launch. This will only work if the images are in +; the lower 32K and the relocation adr is in the upper 32K. +; + ; Switch to original bank + ld bc,$01FB ; UNA func: set bank + ld de,(bid_ldr) ; select user bank + rst 08 ; do it + ld a,'.' ; dot character + call cout ; show progress +; + ; Copy image to running location + ld l,(ix+ra_src) ; HL := image source adr + ld h,(ix+ra_src+1) ; ... + ld e,(ix+ra_dest) ; DE := run dest adr + ld d,(ix+ra_dest+1) ; ... + ld c,(ix+ra_siz) ; BC := image size + ld b,(ix+ra_siz+1) ; ... + ldir ; copy image + ld a,'.' ; dot character + call cout ; show progress +; + ; Switch back to user bank + ld bc,$01FB ; UNA func: set bank + ld de,(bid_ldr) ; select user bank + rst 08 ; do it + ld a,'.' ; dot character + call cout ; show progress +; + ; Record boot information + ld de,(bid_ldr) ; original bank + ld l,$01 ; encoded boot slice/unit + ld bc,$01FC ; UNA func: set bootstrap hist + rst 08 ; call una +; +#endif +; +#if (DSKYENABLE) + ld hl,msg_go ; point to go message + call DSKY_SHOWSEG ; display message +#endif +; + ld l,(ix+ra_ent) ; HL := app entry address + ld h,(ix+ra_ent+1) ; ... + jp (hl) ; go +; +;======================================================================= +; Boot disk unit/slice +;======================================================================= +; +diskboot: +; + ; Notify user + ld hl,str_boot1 + call pstr + ld a,(bootunit) + call PRTDECB + ld hl,str_boot2 + call pstr + ld a,(bootslice) + call PRTDECB +; +#if (DSKYENABLE) + ld hl,msg_load ; point to load message + call DSKY_SHOWSEG ; display message +#endif +; +#if (BIOS == BIOS_WBW) +; + ; Check that drive actually exists + ld c,a ; put in C for func call + ld b,BF_SYSGET ; HBIOS func: sys get + ld c,BF_SYSGET_DIOCNT ; HBIOS sub-func: disk count + rst 08 ; do it, E=disk count + ld a,(bootunit) ; get boot disk unit + cp e ; compare to count + jp nc,err_nodisk ; handle no disk err +; + ; If non-zero slice requested, confirm device can handle it + ld a,(bootslice) ; get slice + or a ; set flags + jr z,diskboot1 ; slice 0, skip slice check + ld a,(bootunit) ; get disk unit + ld c,a ; put in C for func call + ld b,BF_DIODEVICE ; HBIOS func: device info + rst 08 ; do it + ld a,d ; device type to A + cp DIODEV_IDE ; IDE is max slice device type + jp c,err_noslice ; no such slice, handle err +; +diskboot1: + ; Sense media + ld a,(bootunit) ; get boot disk unit + ld c,a ; put in C for func call + ld b,BF_DIOMEDIA ; HBIOS func: media + ld e,1 ; enable media check/discovery + rst 08 ; do it + jp nz,err_diskio ; handle error + call pdot ; show progress +; + ; Seek to boot info sector, third sector + ld a,(bootslice) ; get boot slice + ld e,a ; move to E for mult + ld h,65 ; 65 tracks per slice + call MULT8 ; hl := h * e + ld de,$0002 ; head 0, sector 2 + ld b,BF_DIOSEEK ; HBIOS func: seek + ld a,(bootunit) ; get boot disk unit + ld c,a ; put in C + rst 08 ; do it + jp nz,err_diskio ; handle error + call pdot ; show progress +; + ; Read sector into local buffer + ld b,BF_DIOREAD ; HBIOS func: disk read + ld a,(bootunit) ; get boot disk unit + ld c,a ; put in C for func call + ld hl,bl_infosec ; read into info sec buffer + ld d,BID_USR ; user bank + ld e,1 ; transfer one sector + rst 08 ; do it + jp nz,err_diskio ; handle error + call pdot ; show progress +; +#endif +; +#if (BIOS == BIOS_UNA) +; + ; Check that drive actually exists + ld a,(bootunit) ; get disk unit to boot + ld b,a ; put in B for func call + ld c,$48 ; UNA func: get disk type + rst 08 ; call UNA, B preserved + jp nz,err_nodisk ; handle error if no such disk +; + ; If non-zero slice requested, confirm device can handle it + ld a,(bootslice) ; get slice + or a ; set flags + jr z,diskboot1 ; slice 0, skip slice check + ld a,d ; disk type to A + cp $41 ; IDE? + jr z,diskboot1 ; if so, OK + cp $42 ; PPIDE? + jr z,diskboot1 ; if so, OK + cp $43 ; SD? + jr z,diskboot1 ; if so, OK + cp $44 ; DSD? + jr z,diskboot1 ; if so, OK + jp err_noslice ; no such slice, handle err +; +diskboot1: + ; Add slice offset + ld a,(bootslice) ; get boot slice, A is loop cnt + ld hl,0 ; DE:HL is LBA + ld de,0 ; ... initialize to zero + ld bc,16640 ; sectors per slice +diskboot2: + or a ; set flags to check loop ctr + jr z,diskboot4 ; done if counter exhausted + add hl,bc ; add one slice to low word + jr nc,diskboot3 ; check for carry + inc de ; if so, bump high word +diskboot3: + dec a ; dec loop downcounter + jr diskboot2 ; and loop +; +diskboot4: + ld (loadlba),hl ; save lba, low word + ld (loadlba+2),de ; save lba, high word +; + ; Seek to boot info sector, third sector + ld bc,2 ; sector offset + add hl,bc ; add to LBA value low word + jr nc,diskboot5 ; check for carry + inc de ; if so, bump high word +diskboot5: + ld a,(bootunit) ; get disk unit to boot + ld b,a ; put in B for func call + ld c,$41 ; UNA func: set lba + rst 08 ; set lba + jp nz,err_api ; handle error + call pdot ; show progress +; + ; Read sector into local buffer + ld c,$42 ; UNA func: read sectors + ld de,bl_infosec ; dest of cpm image + ld l,1 ; sectors to read + rst 08 ; do read + jp nz,err_diskio ; handle error +; +#endif +; + ; Check signature + ld de,(bb_sig) ; get signature read + ld a,$A5 ; expected value of first byte + cp d ; compare + jp nz,err_sig ; handle error + ld a,$5A ; expected value of second byte + cp e ; compare + jp nz,err_sig ; handle error +; + ; Print disk boot info + ; Volume "xxxxxxx" (0xXXXX-0xXXXX, entry @ 0xXXXX) + ld hl,str_binfo1 ; load string + call pstr ; print + push hl ; save string ptr + ld hl,bb_label ; point to label + call pvol ; print it + pop hl ; restore string ptr + call pstr ; print + push hl ; save string ptr + ld bc,(bb_cpmloc) ; get load loc + call PRTHEXWORD ; print it + pop hl ; restore string ptr + call pstr ; print + push hl ; save string ptr + ld bc,(bb_cpmend) ; get load end + call PRTHEXWORD ; print it + pop hl ; restore string ptr + call pstr ; print + push hl ; save string ptr + ld bc,(bb_cpment) ; get load end + call PRTHEXWORD ; print it + pop hl ; restore string ptr + call pstr ; print +; + ; Compute number of sectors to load + ld hl,(bb_cpmend) ; hl := end + ld de,(bb_cpmloc) ; de := start + or a ; clear carry + sbc hl,de ; hl := length to load + ld a,h ; determine 512 byte sector count + rra ; ... by dividing msb by two + ld (loadcnt),a ; ... and save it + call pdot ; show progress +; +#if (BIOS == BIOS_WBW) +; + ; Load image into memory + ld b,BF_DIOREAD ; HBIOS func: read sectors + ld a,(bootunit) ; get boot disk unit + ld c,a ; put in C + ld hl,(bb_cpmloc) ; load address + ld d,BID_USR ; user bank + ld a,(loadcnt) ; get sectors to read + ld e,a ; number of sectors to load + rst 08 ; do it + jp nz,err_diskio ; handle errors + call pdot ; show progress +; + ; Record boot unit/slice + ld b,BF_SYSSET ; hb func: set hbios parameter + ld c,BF_SYSSET_BOOTINFO ; hb subfunc: set boot info + ld a,(bid_ldr) ; original bank is boot bank + ld l,a ; ... and save as boot bank + ld a,(bootunit) ; load boot unit + ld d,a ; save in D + ld a,(bootslice) ; load boot slice + ld e,a ; save in E + rst 08 + jp nz,err_api ; handle errors + call pdot ; show progress +; +#endif +; +#if (BIOS == BIOS_UNA) +; + ; Start os load at sector 3 + ld hl,(loadlba) ; low word of saved LBA + ld de,(loadlba+2) ; high word of saved LBA + ld bc,3 ; offset for sector 3 + add hl,bc ; apply it + jr nc,diskboot6 ; check for carry + inc de ; bump high word if so +diskboot6: + ld c,$41 ; UNA func: set lba + ld a,(bootunit) ; get boot disk unit + ld b,a ; move to B + rst 08 ; set lba + jp nz,err_api ; handle error +; + ; Read OS image into memory + ld c,$42 ; UNA func: read sectors + ld a,(bootunit) ; get boot disk unit + ld b,a ; move to B + ld de,(bb_cpmloc) ; dest of cpm image + ld a,(loadcnt) ; get sectors to read + ld l,a ; sectors to read + rst 08 ; do read + jp nz,err_diskio ; handle error + call pdot ; show progress +; + ; Record boot unit/slice + ; UNA provides only a single byte to record the boot unit + ; so we encode the unit/slice into one byte by using the + ; high nibble for unit and low nibble for slice. + ld de,-1 ; boot rom page, -1 for n/a + ld a,(bootslice) ; get boot slice + and $0F ; 4 bits only + rlca ; rotate to high bits + rlca ; ... + rlca ; ... + rlca ; ... + ld l,a ; put in L + ld a,(bootunit) ; get boot disk unit + and $0F ; 4 bits only + or l ; combine + ld l,a ; back to L + ld bc,$01FC ; UNA func: set bootstrap hist + rst 08 ; call UNA + jp nz,err_api ; handle error + call pdot ; show progress +; +#endif +; +#if (DSKYENABLE) + ld hl,msg_go ; point to go message + call DSKY_SHOWSEG ; display message +#endif +; + ; Jump to entry vector + ld hl,(bb_cpment) ; get entry vector + jp (hl) ; and go there +; +;======================================================================= +; Utility functions +;======================================================================= +; +; Clear LEDs +; +clrled: +#if (BIOS == BIOS_WBW) + #if (DIAGENABLE) + xor a ; zero accum + out (DIAGPORT),a ; clear diag leds + #endif + #if (LEDENABLE) + or $FF ; led is inverted + out (LEDPORT),a ; clear led + #endif +#endif + ret +; +; Print string at HL on console, null terminated +; +pstr: + ld a,(hl) ; get next character + or a ; set flags + inc hl ; bump pointer regardless + ret z ; done if null + call cout ; display character + jr pstr ; loop till done +; +; Print volume label string at HL, '$' terminated, 16 chars max +; +pvol: + ld b,16 ; init max char downcounter +pvol1: + ld a,(hl) ; get next character + cp '$' ; set flags + inc hl ; bump pointer regardless + ret z ; done if null + call cout ; display character + djnz pvol1 ; loop till done + ret ; hit max of 16 chars +; +; Start a newline on console (cr/lf) +; +nl2: + call nl ; double newline +nl: + ld a,cr ; cr + call cout ; send it + ld a,lf ; lf + jp cout ; send it and return +; +; Print a dot on console +; +pdot: + push af + ld a,'.' + call cout + pop af + ret +; +; Read a string on the console +; +; Uses address $0080 in page zero for buffer +; Input is zero terminated +; +rdln: + ld de,cmdbuf ; init buffer address ptr +rdln_nxt: + call cin ; get a character + cp bs ; backspace? + jr z,rdln_bs ; handle it if so + cp cr ; return? + jr z,rdln_cr ; handle it if so +; + ; check for non-printing characters + cp ' ' ; first printable is space char + jr c,rdln_bel ; too low, beep and loop + cp '~'+1 ; last printable char + jr nc,rdln_bel ; too high, beep and loop +; + ; need to check for buffer overflow here!!! + ld hl,cmdbuf+cmdmax ; max cmd length + or a ; clear carry + sbc hl,de ; test for max + jr z,rdln_bel ; at max, beep and loop +; + ; good to go, echo and store character + call cout ; echo character input + ld (de),a ; save in buffer + inc de ; inc buffer ptr + jr rdln_nxt ; loop till done +; +rdln_bs: + ld hl,cmdbuf ; start of buffer + or a ; clear carry + sbc hl,de ; subtract from cur buf ptr + jr z,rdln_bel ; at buf start, just beep + ld hl,str_bs ; backspace sequence + call pstr ; send it + dec de ; backup buffer pointer + jr rdln_nxt ; and loop +; +rdln_bel: + ld a,bel ; Bell characters + call cout ; send it + jr rdln_nxt ; and loop +; +rdln_cr: + xor a ; null to A + ld (de),a ; store terminator + ret ; and return +; +; Skip whitespace at buffer adr in DE, returns with first +; non-whitespace character in A. +; +skipws: + ld a,(de) ; get next char + cp ' ' ; blank? + ret nz ; nope, done + inc de ; bump buffer pointer + jr skipws ; and loop ; -;================================================================================================== -; INCLUDES -;================================================================================================== -; -#DEFINE USEDELAY -#INCLUDE "util.asm" -; -#IF (DSKYENABLE) -#DEFINE DSKY_KBD -#INCLUDE "dsky.asm" -#ENDIF -; -;================================================================================================== -; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED) -;================================================================================================== -; -#IF (BIOS == BIOS_WBW) -; -; OUTPUT CHARACTER FROM A -; -COUT: - ; SAVE ALL INCOMING REGISTERS - PUSH AF - PUSH BC - PUSH DE - PUSH HL -; - ; OUTPUT CHARACTER TO CONSOLE VIA HBIOS - LD E,A ; OUTPUT CHAR TO E - LD C,CIO_CONSOLE ; CONSOLE UNIT TO C - LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR - RST 08 ; HBIOS OUTPUTS CHARACTDR -; - ; RESTORE ALL REGISTERS - POP HL - POP DE - POP BC - POP AF - RET -; -; INPUT CHARACTER TO A -; -CIN: - ; SAVE INCOMING REGISTERS (AF IS OUTPUT) - PUSH BC - PUSH DE - PUSH HL -; - ; INPUT CHARACTER FROM CONSOLE VIA HBIOS - LD C,CIO_CONSOLE ; CONSOLE UNIT TO C - LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR - RST 08 ; HBIOS READS CHARACTDR - LD A,E ; MOVE CHARACTER TO A FOR RETURN -; - ; RESTORE REGISTERS (AF IS OUTPUT) - POP HL - POP DE - POP BC - RET -; -; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) -; -CST: - ; SAVE INCOMING REGISTERS (AF IS OUTPUT) - PUSH BC - PUSH DE - PUSH HL -; - ; GET CONSOLE INPUT STATUS VIA HBIOS - LD C,CIO_CONSOLE ; CONSOLE UNIT TO C - LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS - RST 08 ; HBIOS RETURNS STATUS IN A -; - ; RESTORE REGISTERS (AF IS OUTPUT) - POP HL - POP DE - POP BC - RET -; -#ENDIF -; -#IF (BIOS == BIOS_UNA) -; -; OUTPUT CHARACTER FROM A -; -COUT: - ; SAVE ALL INCOMING REGISTERS - PUSH AF - PUSH BC - PUSH DE - PUSH HL -; - ; OUTPUT CHARACTER TO CONSOLE VIA UBIOS - LD E,A - LD BC,$12 - RST 08 -; - ; RESTORE ALL REGISTERS - POP HL - POP DE - POP BC - POP AF - RET -; -; INPUT CHARACTER TO A -; -CIN: - ; SAVE INCOMING REGISTERS (AF IS OUTPUT) - PUSH BC - PUSH DE - PUSH HL -; - ; INPUT CHARACTER FROM CONSOLE VIA UBIOS - LD BC,$11 - RST 08 - LD A,E -; - ; RESTORE REGISTERS (AF IS OUTPUT) - POP HL - POP DE - POP BC - RET -; -; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) -; -CST: - ; SAVE INCOMING REGISTERS (AF IS OUTPUT) - PUSH BC - PUSH DE - PUSH HL -; - ; GET CONSOLE INPUT STATUS VIA UBIOS - LD BC,$13 - RST 08 - LD A,E -; - ; RESTORE REGISTERS (AF IS OUTPUT) - POP HL - POP DE - POP BC - RET -; -#ENDIF -; -; READ A CONSOLE CHARACTER AND CONVERT TO UPPER CASE -; -CINUC: - CALL CIN - AND 7FH ; STRIP HI BIT - CP 'A' ; KEEP NUMBERS, CONTROLS - RET C ; AND UPPER CASE - CP 7BH ; SEE IF NOT LOWER CASE - RET NC - AND 5FH ; MAKE UPPER CASE - RET -; -;================================================================================================== -; FILL REMAINDER OF BANK -;================================================================================================== -; -SLACK: .EQU ($8000 + LDR_SIZ - $) - .FILL SLACK -; - .ECHO "LOADER space remaining: " - .ECHO SLACK - .ECHO " bytes.\n" -; -;================================================================================================== -; WORKING DATA STORAGE -;================================================================================================== - .ORG $8000 + LDR_SIZ -; - .DS 64 ; 32 LEVEL STACK -BL_STACK .EQU $ ; ... TOP IS HERE -; -BL_INPFLG .DS 1 ; INPUT FLAG, 1=DSKY, 2=SERIAL -BL_COUNT .DS 1 ; LOAD COUNTER -BL_TIMEOUT .DS 2 ; AUTOBOOT TIMEOUT COUNTDOWN COUNTER -BL_BOOTID .DS 1 ; BOOT DEVICE ID CHOSEN BY USER -BL_DEVICE .DS 1 ; DEVICE TO LOAD FROM -BL_LU .DS 1 ; LU TO LOAD FROM -; -; BOOT INFO SECTOR IS READ INTO AREA BELOW -; THE THIRD SECTOR OF A DISK DEVICE IS RESERVED FOR BOOT INFO -; -BL_INFOSEC .EQU $ - .DS (512 - 128) -BB_METABUF .EQU $ -BB_SIG .DS 2 ; SIGNATURE (WILL BE 0A55AH IF SET) -BB_PLATFORM .DS 1 ; FORMATTING PLATFORM -BB_DEVICE .DS 1 ; FORMATTING DEVICE -BB_FORMATTER .DS 8 ; FORMATTING PROGRAM -BB_DRIVE .DS 1 ; PHYSICAL DISK DRIVE # -BB_LU .DS 1 ; LOGICAL UNIT (LU) - .DS 1 ; MSB OF LU, NOW DEPRECATED - .DS (BB_METABUF + 128) - $ - 32 -BB_PROTECT .DS 1 ; WRITE PROTECT BOOLEAN -BB_UPDATES .DS 2 ; UPDATE COUNTER -BB_RMJ .DS 1 ; RMJ MAJOR VERSION NUMBER -BB_RMN .DS 1 ; RMN MINOR VERSION NUMBER -BB_RUP .DS 1 ; RUP UPDATE NUMBER -BB_RTP .DS 1 ; RTP PATCH LEVEL -BB_LABEL .DS 16 ; 16 CHARACTER DRIVE LABEL -BB_TERM .DS 1 ; LABEL TERMINATOR ('$') -BB_BILOC .DS 2 ; LOC TO PATCH BOOT DRIVE INFO TO (IF NOT ZERO) -BB_CPMLOC .DS 2 ; FINAL RAM DESTINATION FOR CPM/CBIOS -BB_CPMEND .DS 2 ; END ADDRESS FOR LOAD -BB_CPMENT .DS 2 ; CP/M ENTRY POINT (CBIOS COLD BOOT) -; - .END +; Uppercase character in A +; +upcase: + cp 'a' ; below 'a'? + ret c ; if so, nothing to do + cp 'z'+1 ; above 'z'? + ret nc ; if so, nothing to do + and ~$20 ; convert character to lower + ret ; done +; +; Get numeric chars at DE and convert to number returned in A +; Carry flag set on overflow +; +getnum: + ld c,0 ; C is working register +getnum1: + ld a,(de) ; get the active char + cp '0' ; compare to ascii '0' + jr c,getnum2 ; abort if below + cp '9' + 1 ; compare to ascii '9' + jr nc,getnum2 ; abort if above +; + ; valid digit, add new digit to C + ld a,c ; get working value to A + rlca ; multiply by 10 + ret c ; overflow, return with carry set + rlca ; ... + ret c ; overflow, return with carry set + add a,c ; ... + ret c ; overflow, return with carry set + rlca ; ... + ret c ; overflow, return with carry set + ld c,a ; back to C + ld a,(de) ; get new digit + sub '0' ; make binary + add a,c ; add in working value + ret c ; overflow, return with carry set + ld c,a ; back to C +; + inc de ; bump to next char + jr getnum1 ; loop +; +getnum2: ; return result + ld a,c ; return result in A + or a ; with flags set, CF is cleared + ret +; +; Is character in A numberic? NZ if not +; +isnum: + cp '0' ; compare to ascii '0' + jr c,isnum1 ; abort if below + cp '9' + 1 ; compare to ascii '9' + jr nc,isnum1 ; abort if above + cp a ; set Z + ret +isnum1: + or $FF ; set NZ + ret ; and done +; +;======================================================================= +; Console character I/O helper routines (registers preserved) +;======================================================================= +; +#if (BIOS == BIOS_WBW) +; +; Output character from A +; +cout: + ; Save all incoming registers + push af + push bc + push de + push hl +; + ; Output character to console via HBIOS + ld e,a ; output char to E + ld c,CIO_CONSOLE ; console unit to C + ld b,BF_CIOOUT ; HBIOS func: output char + rst 08 ; HBIOS outputs character +; + ; Restore all registers + pop hl + pop de + pop bc + pop af + ret +; +; Input character to A +; +cin: + ; Save incoming registers (AF is output) + push bc + push de + push hl +; + ; Input character from console via hbios + ld c,CIO_CONSOLE ; console unit to c + ld b,BF_CIOIN ; HBIOS func: input char + rst 08 ; HBIOS reads charactdr + ld a,e ; move character to A for return +; + ; Restore registers (AF is output) + pop hl + pop de + pop bc + ret +; +; Return input status in A (0 = no char, != 0 char waiting) +; +cst: + ; Save incoming registers (AF is output) + push bc + push de + push hl +; + ; Get console input status via HBIOS + ld c,CIO_CONSOLE ; console unit to C + ld b,BF_CIOIST ; HBIOS func: input status + rst 08 ; HBIOS returns status in A +; + ; Restore registers (AF is output) + pop hl + pop de + pop bc + ret +; +#endif +; +#if (BIOS == BIOS_UNA) +; +; Output character from A +; +cout: + ; Save all incoming registers + push af + push bc + push de + push hl +; + ; Output character to console via UBIOS + ld e,a + ld bc,$12 + rst 08 +; + ; Restore all registers + pop hl + pop de + pop bc + pop af + ret +; +; Input character to A +; +cin: + ; Save incoming registers (AF is output) + push bc + push de + push hl +; + ; Input character from console via UBIOS + ld bc,$11 + rst 08 + ld a,e +; + ; Restore registers (AF is output) + pop hl + pop de + pop bc + ret +; +; Return input status in A (0 = no char, != 0 char waiting) +; +cst: + ; Save incoming registers (AF is output) + push bc + push de + push hl +; + ; Get console input status via UBIOS + ld bc,$13 + rst 08 + ld a,e + or a +; + ; Restore registers (AF is output) + pop hl + pop de + pop bc + ret +; +#endif +; +; Generic console I/O +; +CIN .equ cin +COUT .equ cout +CST .equ cst +; +;======================================================================= +; Device inventory display +;======================================================================= +; +; Print list of all drives (WBW) +; +#if (BIOS == BIOS_WBW) +; +prtall: + call nl ; formatting + ld b,BF_SYSGET + ld c,BF_SYSGET_DIOCNT + rst 08 ; E := disk unit count + ld b,e ; count to B + ld a,b ; count to A + or a ; set flags + ret z ; bail out if zero + ld c,0 ; init device index +; +prtall1: + ld hl,str_disk ; prefix string + call pstr ; display it + ld a,c ; index + call PRTDECB ; print it + ld hl,str_on ; separator string + call pstr + push bc ; save loop control + ld b,BF_DIODEVICE ; HBIOS func: report device info + rst 08 ; call HBIOS + call prtdrv ; print it + pop bc ; restore loop control + inc c ; bump index + djnz prtall1 ; loop as needed + ret ; done +; +; Print the device info +; On input D has device type, E has device number +; Destroy no registers other than A +; +prtdrv: + push de ; preserve de + push hl ; preserve HL + ld a,d ; load device/unit + rrca ; rotate device + rrca ; ... bits + rrca ; ... into + rrca ; ... lowest 4 bits + and $0F ; isolate device bits + add a,a ; multiple by two for word table + ld hl,devtbl ; point to start of table + call ADDHLA ; add A to HL for table entry + ld a,(hl) ; deref HL for string adr + inc hl ; ... + ld h,(hl) ; ... + ld l,a ; ... + call pstr ; print the device nmemonic + pop hl ; recover HL + pop de ; recover DE + ld a,e ; device number + call PRTDECB ; print it + ld a,':' ; suffix + call cout ; print it + ret +; +devtbl: ; device table + .dw dev00, dev01, dev02, dev03 + .dw dev04, dev05, dev06, dev07 + .dw dev08, dev09, dev10, dev11 + .dw dev12, dev13, dev14, dev15 +; +devunk .db "???",0 +dev00 .db "MD",0 +dev01 .db "FD",0 +dev02 .db "RAMF",0 +dev03 .db "IDE",0 +dev04 .db "ATAPI",0 +dev05 .db "PPIDE",0 +dev06 .db "SD",0 +dev07 .db "PRPSD",0 +dev08 .db "PPPSD",0 +dev09 .db "HDSK",0 +dev10 .equ devunk +dev11 .equ devunk +dev12 .equ devunk +dev13 .equ devunk +dev14 .equ devunk +dev15 .equ devunk +; +#endif +; +; +; +#if (BIOS == BIOS_UNA) +; +; Print list of all drives (UNA) +; +prtall: + call nl ; formatting + ld b,0 ; start with unit 0 +; +prtall1: ; loop thru all units available + ld c,$48 ; UNA func: get disk type + ld l,0 ; preset unit count to zero + rst 08 ; call UNA, B preserved + ld a,l ; unit count to a + or a ; past end? + ret z ; we are done + push bc ; save unit + call prtdrv ; process the unit + pop bc ; restore unit + inc b ; next unit + jr prtall1 ; loop +; +; print the una unit info +; on input b has unit +; +prtdrv: + push bc ; save unit + push de ; save disk type + ld hl,str_disk ; prefix string + call pstr ; display it + ld a,b ; index + call PRTDECB ; print it + ld a,' ' ; formatting + call cout ; do it + ld a,'=' ; formatting + call cout ; do it + ld a,' ' ; formatting + call cout ; do it + pop de ; recover disk type + ld a,d ; disk type to a + cp $40 ; ram/rom? + jr z,prtdrv1 ; handle ram/rom + ld hl,devide ; assume ide + cp $41 ; ide? + jr z,prtdrv2 ; print it + ld hl,devppide ; assume ppide + cp $42 ; ppide? + jr z,prtdrv2 ; print it + ld hl,devsd ; assume sd + cp $43 ; sd? + jr z,prtdrv2 ; print it + ld hl,devdsd ; assume dsd + cp $44 ; dsd? + jr z,prtdrv2 ; print it + ld hl,devunk ; otherwise unknown + jr prtdrv2 +; +prtdrv1: ; handle ram/rom + ld c,$45 ; una func: get disk info + ld de,bl_infosec ; 512 byte buffer + rst 08 ; call una + bit 7,b ; test ram drive bit + ld hl,devrom ; assume rom + jr z,prtdrv2 ; if so, print it + ld hl,devram ; otherwise ram + jr prtdrv2 ; print it +; +prtdrv2: ; print device + pop bc ; recover unit + call pstr ; print device name + ld a,b ; unit to a + call PRTDECB ; print it + ld a,':' ; device name suffix + call cout ; print it + ret ; done +; +devram .db "RAM",0 +devrom .db "ROM",0 +devide .db "IDE",0 +devppide .db "PPIDE",0 +devsd .db "SD",0 +devdsd .db "DSD",0 +devunk .db "UNK",0 +; +#endif +; +;======================================================================= +; Error handlers +;======================================================================= +; +err_invcmd: + ld hl,str_err_invcmd + jr err +err_nodisk: + ld hl,str_err_nodisk + jr err +; +err_noslice: + ld hl,str_err_noslice + jr err +; +err_diskio: + ld hl,str_err_diskio + jr err +; +err_sig: + ld hl,str_err_sig + jr err +; +err_api: + ld hl,str_err_api + jr err +; +err: + push hl +; ld a,(acmd_act) ; get auto cmd active flag +; or a ; set flags +; call nz,showcmd ; if auto cmd act, show cmd +; ld a,bel ; bel character +; call cout ; beep + ld hl,str_err_prefix + call pstr + pop hl + jp pstr +; +str_err_prefix .db bel,"\r\n\r\n*** ",0 +str_err_invcmd .db "Invalid command",0 +str_err_nodisk .db "Disk unit not available",0 +str_err_noslice .db "Disk unit does not support slices",0 +str_err_diskio .db "Disk I/O failure",0 +str_err_sig .db "No system image on disk",0 +str_err_api .db "Unexpected hardware BIOS API failure",0 +; +;======================================================================= +; Includes +;======================================================================= +; +#define USEDELAY +#include "util.asm" +; +#if (DSKYENABLE) +#define DSKY_KBD +#include "dsky.asm" +#endif +; +;======================================================================= +; Working data storage (initialized) +;======================================================================= +; +acmd .db BOOT_DEFAULT,0 ; auto cmd string +acmd_len .equ $ - acmd ; len of auto cmd +acmd_act .db $FF ; auto cmd active +acmd_to .dw BOOT_TIMEOUT ; auto cmd timeout +; +;======================================================================= +; Strings +;======================================================================= +; +str_banner .db PLATFORM_NAME," Boot Loader",0 +;str_prompt .db "Boot [(H)elp]: ",0 +str_prompt .db "Boot [H=Help]: ",0 +str_bs .db bs,' ',bs,0 +str_reboot .db "\r\n\r\nRestarting System...",0 +str_applst .db "\r\n\r\nROM Applications:",0 +str_devlst .db "\r\n\r\nDevices:",0 +str_invcmd .db "\r\n\r\n*** Invalid Command ***",bel,0 +str_load .db "\r\n\r\nLoading ",0 +str_disk .db "\r\n Disk Unit ",0 +str_on .db " on ",0 +str_boot1 .db "\r\n\r\nBooting Disk Unit ",0 +str_boot2 .db ", Slice ",0 +str_binfo1 .db "\r\n\r\nVolume ",$22,0 +str_binfo2 .db $22," [0x",0 +str_binfo3 .db "-0x",0 +str_binfo4 .db ", entry @ 0x",0 +str_binfo5 .db "]",0 +; +str_help .db "\r\n" + .db "\r\n L: List ROM Applications" + .db "\r\n D: Device Inventory" + .db "\r\n R: Reboot System" + .db "\r\n [.]: Boot Disk Unit/Slice" + .db 0 +; +#if (DSKYENABLE) +msg_sel .db $ff,$9d,$9d,$8f,$ec,$80,$80,$80 ; "boot? " +msg_boot .db $ff,$9d,$9d,$8f,$00,$00,$00,$80 ; "boot... " +msg_load .db $8b,$9d,$fd,$bd,$00,$00,$00,$80 ; "load... " +msg_go .db $db,$9d,$00,$00,$00,$80,$80,$80 ; "go... " +#endif +; +;======================================================================= +; ROM Application Table +;======================================================================= +; +; Macro ra_ent: +; +; WBW UNA +; p1: Application name string adr word (+0) word (+0) +; p2: Console keyboard selection key byte (+2) byte (+2) +; p3: DSKY selection key byte (+3) byte (+3) +; p4: Application image bank byte (+4) word (+4) +; p5: Application image source address word (+5) word (+6) +; p6: Application image dest load address word (+7) word (+8) +; p7: Application image size word (+9) word (+10) +; p8: Application entry address word (+11) word (+12) +; +#if (BIOS == BIOS_WBW) +ra_name .equ 0 +ra_conkey .equ 2 +ra_dskykey .equ 3 +ra_bnk .equ 4 +ra_src .equ 5 +ra_dest .equ 7 +ra_siz .equ 9 +ra_ent .equ 11 +#endif +; +#if (BIOS == BIOS_UNA) +ra_name .equ 0 +ra_conkey .equ 2 +ra_dskykey .equ 3 +ra_bnk .equ 4 +ra_src .equ 6 +ra_dest .equ 8 +ra_siz .equ 10 +ra_ent .equ 12 +#endif +; +#define ra_ent(p1,p2,p3,p4,p5,p6,p7,p8) \ +#defcont .dw p1 \ +#defcont .db p2 \ +#if (DSKYENABLE) +#defcont .db p3 \ +#else +#defcont .db $FF \ +#endif +#if (BIOS == BIOS_WBW) +#defcont .db p4 \ +#endif +#if (BIOS == BIOS_UNA) +#defcont .dw p4 \ +#endif +#defcont .dw p5 \ +#defcont .dw p6 \ +#defcont .dw p7 \ +#defcont .dw p8 +; +; Note: The formatting of the following is critical. TASM does not pass +; macro arguments well. Ensure std.asm holds the definitions for *_LOC, +; *_SIZ *_END and any code generated which does not include std.asm is +; synced. +; +; Note: The loadable ROM images are placed in ROM banks bid_img0 and +; bid_img1. However, RomWBW supports a mechanism to load a complete +; new system dynamically as a runnable application (see appboot and +; imgboot in hbios.asm). In this case, the contents of bid_img0 will +; be pre-loaded into the currently executing ram bank thereby allowing +; those images to be dynamically loaded as well. To support this +; concept, a pseudo-bank called bid_cur is used to specify the images +; normally found in bid_img0. In romload, this special value will cause +; the associated image to be loaded from the currently executing bank +; which will be correct regardless of the load mode. Images in other +; banks (bid_img1) will always be loaded directly from ROM. +; +ra_tbl: +; Name Key Dsky Bank Src Dest Size Entry +; --------- ------- ----- -------- ----- ------- ------- ---------- +ra_ent(str_mon, 'M', KY_CL, bid_cur, $1000, MON_LOC, MON_SIZ, MON_SERIAL) +ra_entsiz .equ $ - ra_tbl +ra_ent(str_cpm22, 'C', KY_BK, bid_cur, $2000, CPM_LOC, CPM_SIZ, CPM_ENT) +ra_ent(str_zsys, 'Z', KY_FW, bid_cur, $5000, CPM_LOC, CPM_SIZ, CPM_ENT) +#if (BIOS == BIOS_WBW) +ra_ent(str_fth, 'F', KY_EX, BID_IMG1, $0000, FTH_LOC, FTH_SIZ, FTH_LOC) +ra_ent(str_bas, 'B', KY_DE, BID_IMG1, $1700, BAS_LOC, BAS_SIZ, BAS_LOC) +ra_ent(str_tbas, 'T', KY_EN, BID_IMG1, $3700, TBC_LOC, TBC_SIZ, TBC_LOC) +ra_ent(str_play, 'P', $FF, BID_IMG1, $4000, GAM_LOC, GAM_SIZ, GAM_LOC) +ra_ent(str_user, 'U', $FF, BID_IMG1, $7000, USR_LOC, USR_SIZ, USR_LOC) +#endif +#if (DSKYENABLE) +ra_ent(str_dsky, 'Y'+$80, KY_GO, bid_cur, $1000, MON_LOC, MON_SIZ, MON_DSKY) +#endif +ra_ent(str_egg, 'E'+$80, $FF , bid_cur, $0E00, EGG_LOC, EGG_SIZ, EGG_LOC) + .dw 0 ; table terminator +; +str_mon .db "Monitor",0 +str_cpm22 .db "CP/M 2.2",0 +str_zsys .db "Z-System",0 +str_dsky .db "DSKY Monitor",0 +str_fth .db "Forth",0 +str_bas .db "BASIC",0 +str_tbas .db "Tasty BASIC",0 +str_play .db "Play a Game",0 +str_user .db "User App",0 +str_egg .db "",0 +; +;======================================================================= +; Pad remainder of ROM Loader +;======================================================================= +; +slack .equ ($8000 + LDR_SIZ - $) + .fill slack +; + .echo "LOADER space remaining: " + .echo slack + .echo " bytes.\n" +; +;======================================================================= +; Working data storage (uninitialized) +;======================================================================= +; + .ds 64 ; 32 level stack +bl_stack .equ $ ; ... top is here +; +#if (BIOS == BIOS_WBW) +bid_ldr .ds 1 ; bank at startup +#endif +#if (BIOS == BIOS_UNA) +bid_ldr .ds 2 ; bank at startup +loadlba .ds 4 ; lba for load, dword +#endif +; +bootunit .ds 1 ; boot disk unit +bootslice .ds 1 ; boot disk slice +loadcnt .ds 1 ; num disk sectors to load +; +; Boot info sector is read into area below. +; The third sector of a disk device is reserved for boot info. +; +bl_infosec .equ $ + .ds (512 - 128) +bb_metabuf .equ $ +bb_sig .ds 2 ; signature (0xA55A if set) +bb_platform .ds 1 ; formatting platform +bb_device .ds 1 ; formatting device +bb_formatter .ds 8 ; formatting program +bb_drive .ds 1 ; physical disk drive # +bb_lu .ds 1 ; logical unit (lu) + .ds 1 ; msb of lu, now deprecated + .ds (bb_metabuf + 128) - $ - 32 +bb_protect .ds 1 ; write protect boolean +bb_updates .ds 2 ; update counter +bb_rmj .ds 1 ; rmj major version number +bb_rmn .ds 1 ; rmn minor version number +bb_rup .ds 1 ; rup update number +bb_rtp .ds 1 ; rtp patch level +bb_label .ds 16 ; 16 character drive label +bb_term .ds 1 ; label terminator ('$') +bb_biloc .ds 2 ; loc to patch boot drive info +bb_cpmloc .ds 2 ; final ram dest for cpm/cbios +bb_cpmend .ds 2 ; end address for load +bb_cpment .ds 2 ; CP/M entry point (cbios boot) +; + .end diff --git a/Source/HBIOS/simrtc.asm b/Source/HBIOS/simrtc.asm index 2962f098..33c79590 100644 --- a/Source/HBIOS/simrtc.asm +++ b/Source/HBIOS/simrtc.asm @@ -71,13 +71,7 @@ SIMRTC_GETTIM: LD HL,SIMRTC_BUF ; SOURCE ADR POP DE ; DEST ADR LD BC,SIMRTC_BUFSIZ ; LENGTH -#IF (INTMODE == 1) - DI -#ENDIF CALL HB_BNKCPY ; COPY THE CLOCK DATA -#IF (INTMODE == 1) - EI -#ENDIF ; LD DE,60 ; DELAY 60 * 16US = ~1MS CALL VDELAY ; SLOW DOWN SIMH FOR CLOCK TICKING TEST @@ -107,13 +101,7 @@ SIMRTC_SETTIM: LD (HB_DSTBNK),A ; SET IT LD DE,SIMRTC_BUF ; DEST ADR LD BC,SIMRTC_BUFSIZ ; LENGTH -#IF (INTMODE == 1) - DI -#ENDIF CALL HB_BNKCPY ; COPY THE CLOCK DATA -#IF (INTMODE == 1) - EI -#ENDIF ; LD HL,SIMRTC_BUF ; POINT TO TEMP BUF LD A,SIMRTC_CLKWRITE ; WRITE CLOCK COMMAND diff --git a/Source/HBIOS/timrtc.asm b/Source/HBIOS/timrtc.asm new file mode 100644 index 00000000..70733edd --- /dev/null +++ b/Source/HBIOS/timrtc.asm @@ -0,0 +1,230 @@ +; +;================================================================================================== +; SYSTEM TIMER BASED CLOCK DRIVER +;================================================================================================== +; +TIMRTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) +; +; RTC DEVICE INITIALIZATION ENTRY +; +TIMRTC_INIT: + CALL NEWLINE ; FORMATTING + PRTS("TIMRTC: $") +; + ; HOOK THE HBIOS SECONDS VECTOR + LD HL,(VEC_SECOND+1) ; GET CUR SECONDS VECTOR + LD (TIMRTC_VEC),HL ; SAVE IT INTERNALLY + LD HL,TIMRTC_INT ; OUR SECONDS INT ENTRY + LD (VEC_SECOND+1),HL ; REPLACE IT +; + ; DISPLAY CURRENT TIME + CALL TIMRTC_GETTIM0 + LD HL,TIMRTC_BCDBUF ; POINT TO BCD BUF + CALL PRTDT +; + XOR A ; SIGNAL SUCCESS + RET +; +; RTC DEVICE FUNCTION DISPATCH ENTRY +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; B: FUNCTION (IN) +; +TIMRTC_DISPATCH: + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,TIMRTC_GETTIM ; GET TIME + DEC A + JP Z,TIMRTC_SETTIM ; SET TIME + DEC A + JP Z,TIMRTC_GETBYT ; GET NVRAM BYTE VALUE + DEC A + JP Z,TIMRTC_SETBYT ; SET NVRAM BYTE VALUE + DEC A + JP Z,TIMRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES + DEC A + JP Z,TIMRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES + CALL PANIC +; +; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR +; +TIMRTC_GETBYT: +TIMRTC_SETBYT: +TIMRTC_GETBLK: +TIMRTC_SETBLK: + CALL PANIC +; +; RTC GET TIME +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; HL: DATE/TIME BUFFER (OUT) +; BUFFER FORMAT IS BCD: YYMMDDHHMMSS +; 24 HOUR TIME FORMAT IS ASSUMED +; +TIMRTC_GETTIM: + ; GET THE TIME INTO TEMP BUF + PUSH HL ; SAVE PTR TO CALLERS BUFFER + CALL TIMRTC_GETTIM0 ; GET TIME TO WORK BUFFER +; + ; NOW COPY TO REAL DESTINATION (INTERBANK SAFE) + LD A,BID_BIOS ; COPY FROM BIOS BANK + LD (HB_SRCBNK),A ; SET IT + LD A,(HB_INVBNK) ; COPY TO CURRENT USER BANK + LD (HB_DSTBNK),A ; SET IT + LD HL,TIMRTC_BCDBUF ; SOURCE ADR + POP DE ; DEST ADR + LD BC,TIMRTC_BUFSIZ ; LENGTH + CALL HB_BNKCPY ; COPY THE CLOCK DATA +; + LD DE,60 ; DELAY 60 * 16US = ~1MS + CALL VDELAY ; SLOW DOWN SIMH FOR CLOCK TICKING TEST + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +TIMRTC_GETTIM0: + LD HL,TIMRTC_BINBUF ; FROM BINARY BUFFER + LD DE,TIMRTC_BCDBUF ; TO BCD BUFFER + HB_DI + CALL TIMRTC_BIN2BCD ; COPY AND CONVERT + HB_EI + RET +; +; RTC SET TIME +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; HL: DATE/TIME BUFFER (IN) +; BUFFER FORMAT IS BCD: YYMMDDHHMMSSWW +; 24 HOUR TIME FORMAT IS ASSUMED +; +TIMRTC_SETTIM: + ; COPY TO BCD BUF + LD A,(HB_INVBNK) ; COPY FROM CURRENT USER BANK + LD (HB_SRCBNK),A ; SET IT + LD A,BID_BIOS ; COPY TO BIOS BANK + LD (HB_DSTBNK),A ; SET IT + LD DE,TIMRTC_BCDBUF ; DEST ADR + LD BC,TIMRTC_BUFSIZ ; LENGTH + CALL HB_BNKCPY ; COPY THE CLOCK DATA +; + LD HL,TIMRTC_BCDBUF ; FROM BCD BUF + LD DE,TIMRTC_BINBUF ; TO BIN BUF + HB_DI + CALL TIMRTC_BCD2BIN ; COPY AND CONVERT + HB_EI +; + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; HANDLER FOR TIMER SECONDS INTERRUPT +; +TIMRTC_INT: + LD HL,TIMRTC_BINBUF + TIMRTC_BUFSIZ - 1 + INC (HL) ; INC SECONDS + LD A,59 ; MAX VALUE + CP (HL) ; OVERFLOW? + JR NC,TIMRTC_INTX ; NOPE, DONE + LD (HL),0 ; BACK TO ZERO + + DEC HL ; POINT TO MINUTES + INC (HL) ; INCREMENT MINUTE + CP (HL) ; OVERFLOW? + JR NC,TIMRTC_INTX ; NOPE, DONE + LD (HL),0 ; BACK TO ZERO + + DEC HL ; POINT TO HOURS + INC (HL) ; INCREMENT HOURS + LD A,23 ; MAX VALUE + CP (HL) ; OVERFLOW? + JR NC,TIMRTC_INTX ; NOPE, DONE + LD (HL),0 ; BACK TO ZERO + + DEC HL ; POINT TO DATE + LD A,(TIMRTC_MO) ; GET CURRENT MONTH + DEC A ; ZERO OFFSET + LD DE,TIMRTC_MONTBL ; POINT TO DAYS IN MON TBL + ADD A,E ; ADD OFFSET + LD E,A ; BACK TO E + JR NC,TIMRTC_INT1 ; NO CARRY, SKIP + INC D ; HANDLE CARRY +TIMRTC_INT1: + LD A,(DE) ; A := DAYS IN MONTH + LD C,A ; COPY TO C FOR LATER + LD A,(TIMRTC_MO) ; GET CURRENT MONTH + CP 2 ; FEBRUARY? + JR NZ,TIMRTC_INT2 ; IF NOT, NOT LEAY, SKIP + LD A,(TIMRTC_YR) ; GET CURRENT YEAR + AND $03 ; CHECK FOR LEAP + JR NZ,TIMRTC_INT2 ; IF NOT LEAP, SKIP AHEAD + INC C ; BUMP DAYS IN FEB FOR LEAP +TIMRTC_INT2: + INC (HL) ; INCREMENT DATE + LD A,C ; A := TRUE DAYS IN MONTH + 1 + CP (HL) ; OVERFLOW? + JR NZ,TIMRTC_INTX ; NOPE, DONE + LD (HL),1 ; BACK TO DAY ONE + + DEC HL ; POINT TO MONTH + INC (HL) ; INCREMENT MONTH + LD A,13 ; PAST MAX? + CP (HL) ; OVERFLOW? + JR NZ,TIMRTC_INTX ; NOPE, DONE + LD (HL),1 ; BACK TO MONTH ONE + + DEC HL ; POINT TO YEAR + INC (HL) ; INCREMENT YEAR + LD A,100 ; PAST MAX? + CP (HL) ; OVERFLOW? + JR NZ,TIMRTC_INTX ; NOPE, DONE + LD (HL),0 ; BACK TO YEAR ZERO +TIMRTC_INTX: + JP PANIC +TIMRTC_VEC .EQU $-2 +; +; CONVERT FROM BINARY BUF (HL) TO BCD BUF (DE) +; +TIMRTC_BIN2BCD: + LD B,TIMRTC_BUFSIZ +TIMRTC_BIN2BCD1: + LD A,(HL) + CALL BYTE2BCD + LD (DE),A + INC HL + INC DE + DJNZ TIMRTC_BIN2BCD1 + RET +; +; CONVERT FROM BCD BUF (HL) TO BINARY BUF (DE) +; +TIMRTC_BCD2BIN + LD B,TIMRTC_BUFSIZ +TIMRTC_BCD2BIN1: + LD A,(HL) + CALL BCD2BYTE + LD (DE),A + INC HL + INC DE + DJNZ TIMRTC_BCD2BIN1 + RET +; +; WORKING VARIABLES +; +TIMRTC_BINBUF: ; ALL IN BINARY +TIMRTC_YR .DB 20 +TIMRTC_MO .DB 01 +TIMRTC_DT .DB 01 +TIMRTC_HH .DB 00 +TIMRTC_MM .DB 00 +TIMRTC_SS .DB 00 +; +TIMRTC_BCDBUF .FILL TIMRTC_BUFSIZ +; +TIMRTC_MONTBL: ; DAYS IN MONTH + 1 + .DB 32 ; JANUARY + .DB 29 ; FEBRUARY (NON-LEAP) + .DB 32 ; MARCH + .DB 31 ; APRIL + .DB 32 ; MAY + .DB 31 ; JUNE + .DB 32 ; JULY + .DB 32 ; AUGUST + .DB 31 ; SEPTEMBER + .DB 32 ; OCTOBER + .DB 31 ; NOVEMBER + .DB 32 ; DECEMBER diff --git a/Source/HBIOS/usrrom.asm b/Source/HBIOS/usrrom.asm index 5d4ff8e7..9a03a38d 100644 --- a/Source/HBIOS/usrrom.asm +++ b/Source/HBIOS/usrrom.asm @@ -67,8 +67,9 @@ CIN: PUSH BC POP BC RET ; -BOOTMSG:.DB "No User ROM Installed." - .DB CR,LF +BOOTMSG:.DB CR,LF,CR,LF + .DB "No User ROM Installed." + .DB CR,LF,CR,LF .DB "Press a key to return to Boot Loader.$" ; SLACK .EQU (USR_END - $) diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 253ec8fb..3d9ee4d5 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -566,8 +566,6 @@ BYTE2BCD1: POP BC RET -#IF (BIOS == BIOS_WBW) - #IFDEF USEDELAY ; @@ -592,9 +590,11 @@ DELAY: ; 17TS (FROM INVOKING CALL) | DELAY1: ; | ; --- LOOP = ((CPUSCL * 16) - 5) TS ------------+ | DEC A ; 4TS | | -#IF (CPUFAM == CPU_Z180) ; | | + #IF (BIOS == BIOS_WBW) ; | | + #IF (CPUFAM == CPU_Z180) ; | | OR A ; +4TS FOR Z180 | | -#ENDIF ; | | + #ENDIF ; | | + #ENDIF ; | | JR NZ,DELAY1 ; 12TS (NZ) / 7TS (Z) | | ; ----------------------------------------------+ | ; | @@ -623,17 +623,21 @@ VDELAY: ; 17TS (FROM INVOKING CALL) | ; | | VDELAY1: ; | | ; --- INNER LOOP = ((CPUSCL * 16) - 5) TS ------+ | | -#IF (CPUFAM == CPU_Z180) ; | | | + #IF (BIOS == BIOS_WBW) ; | | | + #IF (CPUFAM == CPU_Z180) ; | | | OR A ; +4TS FOR Z180 | | | -#ENDIF ; | | | + #ENDIF ; | | | + #ENDIF ; | | | DEC A ; 4TS | | | JR NZ,VDELAY1 ; 12TS (NZ) / 7TS (Z) | | | ; ----------------------------------------------+ | | ; | | DEC DE ; 6TS | | -#IF (CPUFAM == CPU_Z180) ; | | + #IF (BIOS == BIOS_WBW) ; | | | + #IF (CPUFAM == CPU_Z180) ; | | OR A ; +4TS FOR Z180 | | -#ENDIF ; | | + #ENDIF ; | | + #ENDIF ; | | LD A,D ; 4TS | | OR E ; 4TS | | JP NZ,VDELAY ; 10TS | | @@ -659,7 +663,7 @@ LDELAY: ; CPU SCALER := MAX(1, (PHIMHZ - 2)) ; DELAY_INIT: -#IF (BIOS == BIOS_UNA) + #IF (BIOS == BIOS_UNA) LD C,$F8 ; UNA BIOS GET PHI FUNCTION RST 08 ; RETURNS SPEED IN HZ IN DE:HL LD B,4 ; DIVIDE MHZ IN DE:HL BY 100000H @@ -669,12 +673,12 @@ DELAY_INIT0: DJNZ DELAY_INIT0 ; ...RIGHT SHIFT DE BY 4. INC E ; FIX UP FOR VALUE TRUNCATION LD A,E ; PUT IN A -#ELSE + #ELSE LD B,BF_SYSGET ; HBIOS FUNC=GET SYS INFO LD C,BF_SYSGET_CPUINFO ; HBIOS SUBFUNC=GET CPU INFO RST 08 ; CALL HBIOS, RST 08 NOT YET INSTALLED LD A,L ; PUT SPEED IN MHZ IN ACCUM -#ENDIF + #ENDIF CP 3 ; TEST FOR <= 2 (SPECIAL HANDLING) JR C,DELAY_INIT1 ; IF <= 2, SPECIAL PROCESSING SUB 2 ; ADJUST AS REQUIRED BY DELAY FUNCTIONS @@ -685,13 +689,11 @@ DELAY_INIT2: LD (CPUSCL),A ; UPDATE CPU SCALER VALUE RET -#IF (CPUMHZ < 3) + #IF (CPUMHZ < 3) CPUSCL .DB 1 ; CPU SCALER MUST BE > 0 -#ELSE + #ELSE CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ -#ENDIF -; -#ENDIF + #ENDIF ; #ENDIF ; @@ -700,13 +702,15 @@ CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ ; NUMBER OF CALL/RET INVOCATIONS. A SINGLE CALL/RET IS ; 27 T-STATES ON A Z80, 25 T-STATES ON A Z180 ; -DLY64: CALL DLY32 -DLY32: CALL DLY16 -DLY16: CALL DLY8 -DLY8: CALL DLY4 -DLY4: CALL DLY2 -DLY2: CALL DLY1 -DLY1: RET +; ; Z80 Z180 +; ; ---- ---- +DLY64: CALL DLY32 ; 1728 1600 +DLY32: CALL DLY16 ; 864 800 +DLY16: CALL DLY8 ; 432 400 +DLY8: CALL DLY4 ; 216 200 +DLY4: CALL DLY2 ; 108 100 +DLY2: CALL DLY1 ; 54 50 +DLY1: RET ; 27 25 ; ; MULTIPLY 8-BIT VALUES ; IN: MULTIPLY H BY E diff --git a/Source/ver.inc b/Source/ver.inc index 4dc55e56..ab92465f 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -1,5 +1,5 @@ #DEFINE RMJ 3 -#DEFINE RMN 0 -#DEFINE RUP 1 +#DEFINE RMN 1 +#DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.0.1" +#DEFINE BIOSVER "3.1-pre.0" diff --git a/Source/ver.lib b/Source/ver.lib index 9c5594c5..ff995b90 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -1,7 +1,7 @@ rmj equ 3 -rmn equ 0 -rup equ 1 +rmn equ 1 +rup equ 0 rtp equ 0 biosver macro - db "3.0.1" + db "3.1-pre.0" endm From 153b494e6124153fef5c87501cd0c6d90ad86d81 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 5 Apr 2020 17:03:17 -0700 Subject: [PATCH 10/16] CP/M 3 Date Hack - Hack to allow INTRTC to increment time without destroying the date --- Source/CPM3/boot.z80 | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index b80d7631..53e36f47 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -490,16 +490,21 @@ time$ret: time$get: ; RTC -> cpm date/time in SCB - + ; read time from RTC ld b,020h ; HBIOS func: get time ld hl,tim$buf ; time buffer rst 08 ; do it ret nz ; bail out on error + ld a,(datehack) + or a + jr nz,time$get1 + ; convert yymmss in time buffer -> cpm3 epoch date offset call date2cpm ; time buf (yr, mon, day) -> SCB (@date) +time$get1: ; set time fields in SCB ld a,(tim$hr) ; get hour from time buf ld (@hour),a ; ... and put in SCB @@ -514,7 +519,23 @@ time$set: ; CPM date/time in SCB -> RTC ; convert CPM3 epoch date offset in SCB -> yymmss in time buffer - call cpm2date ; SCB (@date) -> time buf (yr, mon, day) + ;call cpm2date ; SCB (@date) -> time buf (yr, mon, day) + + ; this is a temporary hack!!! + ; since we cannot actually set the date on the RTC, we + ; just read the current RTC date and use that so that we + ; don't clobber a potentially good date. + ; read time from RTC + ld b,020h ; HBIOS func: get time + ld hl,tim$buf ; time buffer + rst 08 ; do it + ret nz ; bail out on error + ; + ; now we set a hack active flag so that future time$get + ; calls do not update the date field in the SCB + ; + ld a,0FFh ; true value + ld (datehack),a ; save it ; copy CPM3 time values from SCB -> time buffer ld a,(@hour) ; get hour from SCB @@ -629,6 +650,8 @@ tim$hr db 01h tim$min db 02h tim$sec db 03h +datehack db 00h + open: ld c,15 jp bdos From 4a9825cd57c63f8216821e6eaa385d8624e10c16 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 5 Apr 2020 17:47:04 -0700 Subject: [PATCH 11/16] Update romldr.asm Work around minor Linux build inconsistency --- Source/HBIOS/romldr.asm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index c4c111e0..c2f1af35 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -1388,7 +1388,8 @@ str_err_api .db "Unexpected hardware BIOS API failure",0 ; Working data storage (initialized) ;======================================================================= ; -acmd .db BOOT_DEFAULT,0 ; auto cmd string +acmd .db BOOT_DEFAULT ; auto cmd string + .db 0 acmd_len .equ $ - acmd ; len of auto cmd acmd_act .db $FF ; auto cmd active acmd_to .dw BOOT_TIMEOUT ; auto cmd timeout From ad80432252cbe46055d3bcf6ae7444e37df56d7a Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 5 Apr 2020 19:45:19 -0700 Subject: [PATCH 12/16] Update Apps for New Version --- Source/Apps/Assign.asm | 2 +- Source/Apps/Mode.asm | 2 +- Source/Apps/Timer.asm | 2 +- Source/Apps/Tune/Tune.asm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Apps/Assign.asm b/Source/Apps/Assign.asm index 86498fb8..0bbf038e 100644 --- a/Source/Apps/Assign.asm +++ b/Source/Apps/Assign.asm @@ -42,7 +42,7 @@ bdos .equ $0005 ; BDOS invocation vector stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp ; rmj .equ 3 ; CBIOS version - major -rmn .equ 0 ; CBIOS version - minor +rmn .equ 1 ; CBIOS version - minor ; ;=============================================================================== ; Code Section diff --git a/Source/Apps/Mode.asm b/Source/Apps/Mode.asm index 957bba69..08f00ba7 100644 --- a/Source/Apps/Mode.asm +++ b/Source/Apps/Mode.asm @@ -49,7 +49,7 @@ bdos .equ $0005 ; BDOS invocation vector ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr ; rmj .equ 3 ; intended CBIOS version - major -rmn .equ 0 ; intended CBIOS version - minor +rmn .equ 1 ; intended CBIOS version - minor ; bf_cioinit .equ $04 ; HBIOS: CIOINIT function bf_cioquery .equ $05 ; HBIOS: CIOQUERY function diff --git a/Source/Apps/Timer.asm b/Source/Apps/Timer.asm index 867f2e24..0d049a06 100644 --- a/Source/Apps/Timer.asm +++ b/Source/Apps/Timer.asm @@ -37,7 +37,7 @@ bdos .equ $0005 ; BDOS invocation vector ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr ; rmj .equ 3 ; intended CBIOS version - major -rmn .equ 0 ; intended CBIOS version - minor +rmn .equ 1 ; intended CBIOS version - minor ; bf_sysver .equ $F1 ; BIOS: VER function bf_sysget .equ $F8 ; HBIOS: SYSGET function diff --git a/Source/Apps/Tune/Tune.asm b/Source/Apps/Tune/Tune.asm index 73fe5b0e..046b83ac 100644 --- a/Source/Apps/Tune/Tune.asm +++ b/Source/Apps/Tune/Tune.asm @@ -55,7 +55,7 @@ BDOS .EQU $0005 ; BDOS invocation vector IDENT .EQU $FFFE ; loc of RomWBW HBIOS ident ptr ; RMJ .EQU 3 ; intended CBIOS version - major -RMN .EQU 0 ; intended CBIOS version - minor +RMN .EQU 1 ; intended CBIOS version - minor ; BF_SYSVER .EQU $F1 ; BIOS: VER function BF_SYSGET .EQU $F8 ; HBIOS: SYSGET function From 982b6c08d91065a7612fd5a4e7d2f535d7b1b7a2 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 6 Apr 2020 12:43:55 -0700 Subject: [PATCH 13/16] Revert "Update Apps for New Version" This reverts commit ad80432252cbe46055d3bcf6ae7444e37df56d7a. --- Source/Apps/Assign.asm | 2 +- Source/Apps/Mode.asm | 2 +- Source/Apps/Timer.asm | 2 +- Source/Apps/Tune/Tune.asm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Apps/Assign.asm b/Source/Apps/Assign.asm index 0bbf038e..86498fb8 100644 --- a/Source/Apps/Assign.asm +++ b/Source/Apps/Assign.asm @@ -42,7 +42,7 @@ bdos .equ $0005 ; BDOS invocation vector stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp ; rmj .equ 3 ; CBIOS version - major -rmn .equ 1 ; CBIOS version - minor +rmn .equ 0 ; CBIOS version - minor ; ;=============================================================================== ; Code Section diff --git a/Source/Apps/Mode.asm b/Source/Apps/Mode.asm index 08f00ba7..957bba69 100644 --- a/Source/Apps/Mode.asm +++ b/Source/Apps/Mode.asm @@ -49,7 +49,7 @@ bdos .equ $0005 ; BDOS invocation vector ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr ; rmj .equ 3 ; intended CBIOS version - major -rmn .equ 1 ; intended CBIOS version - minor +rmn .equ 0 ; intended CBIOS version - minor ; bf_cioinit .equ $04 ; HBIOS: CIOINIT function bf_cioquery .equ $05 ; HBIOS: CIOQUERY function diff --git a/Source/Apps/Timer.asm b/Source/Apps/Timer.asm index 0d049a06..867f2e24 100644 --- a/Source/Apps/Timer.asm +++ b/Source/Apps/Timer.asm @@ -37,7 +37,7 @@ bdos .equ $0005 ; BDOS invocation vector ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr ; rmj .equ 3 ; intended CBIOS version - major -rmn .equ 1 ; intended CBIOS version - minor +rmn .equ 0 ; intended CBIOS version - minor ; bf_sysver .equ $F1 ; BIOS: VER function bf_sysget .equ $F8 ; HBIOS: SYSGET function diff --git a/Source/Apps/Tune/Tune.asm b/Source/Apps/Tune/Tune.asm index 046b83ac..73fe5b0e 100644 --- a/Source/Apps/Tune/Tune.asm +++ b/Source/Apps/Tune/Tune.asm @@ -55,7 +55,7 @@ BDOS .EQU $0005 ; BDOS invocation vector IDENT .EQU $FFFE ; loc of RomWBW HBIOS ident ptr ; RMJ .EQU 3 ; intended CBIOS version - major -RMN .EQU 1 ; intended CBIOS version - minor +RMN .EQU 0 ; intended CBIOS version - minor ; BF_SYSVER .EQU $F1 ; BIOS: VER function BF_SYSGET .EQU $F8 ; HBIOS: SYSGET function From 077fd2bf21e59d2fe509d1ad476ecf3208292a32 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 6 Apr 2020 12:44:14 -0700 Subject: [PATCH 14/16] Revert "Update romldr.asm" This reverts commit 4a9825cd57c63f8216821e6eaa385d8624e10c16. --- Source/HBIOS/romldr.asm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index c2f1af35..c4c111e0 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -1388,8 +1388,7 @@ str_err_api .db "Unexpected hardware BIOS API failure",0 ; Working data storage (initialized) ;======================================================================= ; -acmd .db BOOT_DEFAULT ; auto cmd string - .db 0 +acmd .db BOOT_DEFAULT,0 ; auto cmd string acmd_len .equ $ - acmd ; len of auto cmd acmd_act .db $FF ; auto cmd active acmd_to .dw BOOT_TIMEOUT ; auto cmd timeout From ee628477810acf8ca1f1c651e11df9a059fc655e Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 6 Apr 2020 12:44:43 -0700 Subject: [PATCH 15/16] Revert "CP/M 3 Date Hack" This reverts commit 153b494e6124153fef5c87501cd0c6d90ad86d81. --- Source/CPM3/boot.z80 | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index 53e36f47..b80d7631 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -490,21 +490,16 @@ time$ret: time$get: ; RTC -> cpm date/time in SCB - + ; read time from RTC ld b,020h ; HBIOS func: get time ld hl,tim$buf ; time buffer rst 08 ; do it ret nz ; bail out on error - ld a,(datehack) - or a - jr nz,time$get1 - ; convert yymmss in time buffer -> cpm3 epoch date offset call date2cpm ; time buf (yr, mon, day) -> SCB (@date) -time$get1: ; set time fields in SCB ld a,(tim$hr) ; get hour from time buf ld (@hour),a ; ... and put in SCB @@ -519,23 +514,7 @@ time$set: ; CPM date/time in SCB -> RTC ; convert CPM3 epoch date offset in SCB -> yymmss in time buffer - ;call cpm2date ; SCB (@date) -> time buf (yr, mon, day) - - ; this is a temporary hack!!! - ; since we cannot actually set the date on the RTC, we - ; just read the current RTC date and use that so that we - ; don't clobber a potentially good date. - ; read time from RTC - ld b,020h ; HBIOS func: get time - ld hl,tim$buf ; time buffer - rst 08 ; do it - ret nz ; bail out on error - ; - ; now we set a hack active flag so that future time$get - ; calls do not update the date field in the SCB - ; - ld a,0FFh ; true value - ld (datehack),a ; save it + call cpm2date ; SCB (@date) -> time buf (yr, mon, day) ; copy CPM3 time values from SCB -> time buffer ld a,(@hour) ; get hour from SCB @@ -650,8 +629,6 @@ tim$hr db 01h tim$min db 02h tim$sec db 03h -datehack db 00h - open: ld c,15 jp bdos From 9d5e792b34d824dd8fd7211149574fbc1bb928c7 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 6 Apr 2020 12:44:52 -0700 Subject: [PATCH 16/16] Revert "New ROMLDR and INTRTC driver" This reverts commit d9bed4563ea1a04a3e5b1fcf3fbb40c8aaaaf8bd. --- Doc/ChangeLog.txt | 5 - Doc/RomWBW Applications.pdf | Bin 140215 -> 140215 bytes Doc/RomWBW Architecture.pdf | Bin 371105 -> 371099 bytes Doc/RomWBW Getting Started.pdf | Bin 166714 -> 166706 bytes ReadMe.md | 2 +- ReadMe.txt | 2 +- Source/Apps/RTC.asm | 1 - Source/CBIOS/cbios.asm | 12 +- Source/Doc/Common.inc | 2 +- Source/Forth/camel80h.azm | 3 +- Source/HBIOS/Config/DYNO_std.asm | 2 - Source/HBIOS/Config/EZZ80_std.asm | 2 - Source/HBIOS/Config/MK4_std.asm | 2 - Source/HBIOS/Config/N8_std.asm | 2 - Source/HBIOS/Config/RCZ180_ext.asm | 2 - Source/HBIOS/Config/RCZ180_nat.asm | 2 - Source/HBIOS/Config/RCZ80_kio.asm | 4 +- Source/HBIOS/Config/RCZ80_mt.asm | 4 +- Source/HBIOS/Config/RCZ80_std.asm | 2 - Source/HBIOS/Config/SBC_simh.asm | 2 - Source/HBIOS/Config/SBC_std.asm | 2 - Source/HBIOS/Config/SCZ180_126.asm | 4 +- Source/HBIOS/Config/SCZ180_130.asm | 5 +- Source/HBIOS/Config/SCZ180_131.asm | 5 +- Source/HBIOS/Config/UNA_std.asm | 3 +- Source/HBIOS/Config/ZETA2_std.asm | 2 - Source/HBIOS/Config/ZETA_std.asm | 2 - Source/HBIOS/cfg_dyno.asm | 8 +- Source/HBIOS/cfg_ezz80.asm | 6 +- Source/HBIOS/cfg_master.asm | 6 +- Source/HBIOS/cfg_mk4.asm | 6 +- Source/HBIOS/cfg_n8.asm | 6 +- Source/HBIOS/cfg_rcz180.asm | 6 +- Source/HBIOS/cfg_rcz80.asm | 6 +- Source/HBIOS/cfg_sbc.asm | 6 +- Source/HBIOS/cfg_scz180.asm | 6 +- Source/HBIOS/cfg_una.asm | 4 +- Source/HBIOS/cfg_zeta.asm | 6 +- Source/HBIOS/cfg_zeta2.asm | 6 +- Source/HBIOS/dbgmon.asm | 10 +- Source/HBIOS/hbios.asm | 92 +- Source/HBIOS/romldr.asm | 2828 ++++++++++++---------------- Source/HBIOS/simrtc.asm | 12 + Source/HBIOS/timrtc.asm | 230 --- Source/HBIOS/usrrom.asm | 5 +- Source/HBIOS/util.asm | 50 +- Source/ver.inc | 6 +- Source/ver.lib | 6 +- 48 files changed, 1364 insertions(+), 2021 deletions(-) delete mode 100644 Source/HBIOS/timrtc.asm diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 65569da0..5ddd4e80 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -1,8 +1,3 @@ -Version 3.1 ------------ -- WBW: Refactored ROM Loader -- WBW: INTRTC periodic timer based clock - Version 3.0.1 ------------- - WBW: Increase XModem timeout waiting for host to start sending diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index d15a52753cc8c7168abef2be57f1108859ed2808..82a473c659ce0cdbfa2ab5f9748e7021770724c6 100644 GIT binary patch delta 111 zcmdmfoMZcOj)pCa8o$_03=NFUO^m1O|6-JZakdBjVr12Hb~Z4vG<7mJba6ItGc_|X fG9HKW diff --git a/Doc/RomWBW Architecture.pdf b/Doc/RomWBW Architecture.pdf index e12f8ade34a2f838633060740bd9c508c97bc2d5..17f32e5104228c0c6796bbf9da7eea35b65542a3 100644 GIT binary patch delta 12687 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 delta 12683 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 X#VePeJ&|qjZQR7^)8`#Gf8zfDMwA3} diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index 5e39d55a98f30f843bb51a44beebe60bc9e4ea29..f89297fb65d3ff3eba012c47081fb40c6cfa3359 100644 GIT binary patch delta 10874 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 UAJH)L_i diff --git a/ReadMe.txt b/ReadMe.txt index c9b01d5c..95e32039 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -2,7 +2,7 @@ RomWBW Z80/Z180 System Software -Version 3.1 Pre-release +Version 3.0.1 Monday 30 March 2020 Wayne Warthen wwarthen@gmail.com diff --git a/Source/Apps/RTC.asm b/Source/Apps/RTC.asm index 5d731612..07b5c447 100644 --- a/Source/Apps/RTC.asm +++ b/Source/Apps/RTC.asm @@ -1319,7 +1319,6 @@ DELAY_LOOP: ; LOOP IS 26TS LD A,H ; 4TS OR L ; 4TS JR NZ,DELAY_LOOP ; 12TS - ; RESTART SYSTEM FROM ROM BANK 0, ADDRESS $0000 LD A,BID_BOOT ; BOOT BANK LD HL,0 ; ADDRESS ZERO CALL HB_BNKCALL ; DOES NOT RETURN diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 5f627426..a822887f 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -2296,16 +2296,8 @@ DRV_INIT: ; GET BOOT UNIT/SLICE INFO LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY RST 08 ; CALL UNA - LD A,L ; PUT IN ACCUM - AND $0F ; UNIT IN LOW NIBBLE - LD D,A ; UNIT NUM TO D - LD A,L ; GET ORIGINAL VALUE BACK - RLCA ; MOVE SLICE TO LOW NIBBLE - RLCA ; ... - RLCA ; ... - RLCA ; ... - AND $0F ; SLICE NOW IN LOW NIBBLE - LD E,A ; SLICE TO E + LD D,L ; SAVE L AS UNIT + LD E,0 ; SLICE IS ZERO LD (BOOTVOL),DE ; D -> UNIT, E -> SLICE ; ; INIT DEFAULT diff --git a/Source/Doc/Common.inc b/Source/Doc/Common.inc index 542c53ff..71a252d8 100644 --- a/Source/Doc/Common.inc +++ b/Source/Doc/Common.inc @@ -1,4 +1,4 @@ -!def(ver)(3.1 Pre-release) +!def(ver)(3.0.1) !def(date)(!mdate) !def(product)(RomWBW) !def(author)(Wayne Warthen) diff --git a/Source/Forth/camel80h.azm b/Source/Forth/camel80h.azm index b3b6f079..85990346 100644 --- a/Source/Forth/camel80h.azm +++ b/Source/Forth/camel80h.azm @@ -1020,8 +1020,7 @@ DOTS2: DW EXIT DW UINIT,U0,NINIT,CMOVE ; DW LIT,80h,COUNT,INTERPRET DW XSQUOTE - DB 59,0dh,0ah,0dh,0ah - DB 'Z80 CamelForth v1.02 25 Jan 1995, RomWBW 19 Oct 2019' + DB 55,'Z80 CamelForth v1.02 25 Jan 1995, ROMWBW 19 Oct 2019' DB 0dh,0ah DW TYPE,ABORT ; ABORT never returns ; DON'T FORGET TO UPDATE THE BYTE COUNT IF YOU CHANGE THE SIZE OF THE BOOT MSG diff --git a/Source/HBIOS/Config/DYNO_std.asm b/Source/HBIOS/Config/DYNO_std.asm index dccbf5a9..f5019f0e 100644 --- a/Source/HBIOS/Config/DYNO_std.asm +++ b/Source/HBIOS/Config/DYNO_std.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_dyno.asm" ; CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/Config/EZZ80_std.asm b/Source/HBIOS/Config/EZZ80_std.asm index 54f8aaf4..ae480bcd 100644 --- a/Source/HBIOS/Config/EZZ80_std.asm +++ b/Source/HBIOS/Config/EZZ80_std.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_ezz80.asm" ; CPUOSC .SET 10000000 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/Config/MK4_std.asm b/Source/HBIOS/Config/MK4_std.asm index c838d873..4909dc00 100644 --- a/Source/HBIOS/Config/MK4_std.asm +++ b/Source/HBIOS/Config/MK4_std.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_mk4.asm" ; Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 diff --git a/Source/HBIOS/Config/N8_std.asm b/Source/HBIOS/Config/N8_std.asm index 04b4b92e..d8654771 100644 --- a/Source/HBIOS/Config/N8_std.asm +++ b/Source/HBIOS/Config/N8_std.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_n8.asm" ; Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 diff --git a/Source/HBIOS/Config/RCZ180_ext.asm b/Source/HBIOS/Config/RCZ180_ext.asm index 79c4ce6b..a1dbad03 100644 --- a/Source/HBIOS/Config/RCZ180_ext.asm +++ b/Source/HBIOS/Config/RCZ180_ext.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_rcz180.asm" ; CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/Config/RCZ180_nat.asm b/Source/HBIOS/Config/RCZ180_nat.asm index 7bfad4cd..46f9c43f 100644 --- a/Source/HBIOS/Config/RCZ180_nat.asm +++ b/Source/HBIOS/Config/RCZ180_nat.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_rcz180.asm" ; CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/Config/RCZ80_kio.asm b/Source/HBIOS/Config/RCZ80_kio.asm index a83052f4..e88df73d 100644 --- a/Source/HBIOS/Config/RCZ80_kio.asm +++ b/Source/HBIOS/Config/RCZ80_kio.asm @@ -22,9 +22,7 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define PLATFORM_NAME "RC2014 (KIO)" -; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +#DEFINE PLATFORM_NAME "RC2014 (KIO)" ; #include "Config/RCZ80_std.asm" ; diff --git a/Source/HBIOS/Config/RCZ80_mt.asm b/Source/HBIOS/Config/RCZ80_mt.asm index 1e49c5d3..8806bedd 100644 --- a/Source/HBIOS/Config/RCZ80_mt.asm +++ b/Source/HBIOS/Config/RCZ80_mt.asm @@ -22,9 +22,7 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; -#define PLATFORM_NAME "RC2014 (MT)" +#DEFINE PLATFORM_NAME "RC2014 (MT)" ; #include "Config/RCZ80_std.asm" ; diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index 447b0952..f9e0f1fa 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_rcz80.asm" ; CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/Config/SBC_simh.asm b/Source/HBIOS/Config/SBC_simh.asm index b2088dfe..85600427 100644 --- a/Source/HBIOS/Config/SBC_simh.asm +++ b/Source/HBIOS/Config/SBC_simh.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #DEFINE PLATFORM_NAME "SBC (simh)" ; #include "cfg_sbc.asm" diff --git a/Source/HBIOS/Config/SBC_std.asm b/Source/HBIOS/Config/SBC_std.asm index 16acc300..d5cb313a 100644 --- a/Source/HBIOS/Config/SBC_std.asm +++ b/Source/HBIOS/Config/SBC_std.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_sbc.asm" ; CRTACT .SET TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/Config/SCZ180_126.asm b/Source/HBIOS/Config/SCZ180_126.asm index b63ccf95..d1f1cd1d 100644 --- a/Source/HBIOS/Config/SCZ180_126.asm +++ b/Source/HBIOS/Config/SCZ180_126.asm @@ -22,9 +22,7 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define PLATFORM_NAME "SC126" -; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +#DEFINE PLATFORM_NAME "SC126" ; #include "cfg_scz180.asm" ; diff --git a/Source/HBIOS/Config/SCZ180_130.asm b/Source/HBIOS/Config/SCZ180_130.asm index 20685e84..9b838598 100644 --- a/Source/HBIOS/Config/SCZ180_130.asm +++ b/Source/HBIOS/Config/SCZ180_130.asm @@ -22,9 +22,7 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define PLATFORM_NAME "SC130" -; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +#DEFINE PLATFORM_NAME "SC130" ; #include "cfg_scz180.asm" ; @@ -40,7 +38,6 @@ LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED) ; DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT ; -TIMRTCENABLE .SET TRUE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) ; ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) diff --git a/Source/HBIOS/Config/SCZ180_131.asm b/Source/HBIOS/Config/SCZ180_131.asm index 322b528d..9bdcbb99 100644 --- a/Source/HBIOS/Config/SCZ180_131.asm +++ b/Source/HBIOS/Config/SCZ180_131.asm @@ -22,9 +22,7 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define PLATFORM_NAME "SC131" -; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +#DEFINE PLATFORM_NAME "SC131" ; #include "cfg_scz180.asm" ; @@ -40,7 +38,6 @@ LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED) ; DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT ; -TIMRTCENABLE .SET TRUE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) ; ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) diff --git a/Source/HBIOS/Config/UNA_std.asm b/Source/HBIOS/Config/UNA_std.asm index c722c7af..9ddd4fc9 100644 --- a/Source/HBIOS/Config/UNA_std.asm +++ b/Source/HBIOS/Config/UNA_std.asm @@ -22,6 +22,5 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_una.asm" +; diff --git a/Source/HBIOS/Config/ZETA2_std.asm b/Source/HBIOS/Config/ZETA2_std.asm index 0c434c57..7128d885 100644 --- a/Source/HBIOS/Config/ZETA2_std.asm +++ b/Source/HBIOS/Config/ZETA2_std.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_zeta2.asm" ; UARTCFG .SET UARTCFG | SER_RTS diff --git a/Source/HBIOS/Config/ZETA_std.asm b/Source/HBIOS/Config/ZETA_std.asm index cfc82665..fe720ac7 100644 --- a/Source/HBIOS/Config/ZETA_std.asm +++ b/Source/HBIOS/Config/ZETA_std.asm @@ -22,8 +22,6 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#define BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT -; #include "cfg_zeta.asm" ; CRTACT .SET TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 2663b22d..3a073290 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -3,7 +3,7 @@ ; ROMWBW 2.X CONFIGURATION DEFAULTS FOR DYNO ;================================================================================================== ; -; THIS FILE CONTAINS THE FULL EQU OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM +; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM ; INDICATED ABOVE. THIS FILE SHOULD *NOT* NORMALLY BE CHANGED. INSTEAD, YOU SHOULD ; OVERRIDE ANY SETTINGS YOU WANT USING A CONFIGURATION FILE IN THE CONFIG DIRECTORY ; UNDER THIS DIRECTORY. @@ -20,7 +20,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -61,8 +63,6 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index f9c3d218..9036a113 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -20,7 +20,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 10000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -58,8 +60,6 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 1aee1b03..53f062fd 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -17,7 +17,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -80,8 +82,6 @@ KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index f31d6af7..630b47f1 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -20,7 +20,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -65,8 +67,6 @@ KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index a7928f07..65db812a 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -20,7 +20,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -68,8 +70,6 @@ KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index af9ed953..a221334a 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -20,7 +20,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -61,8 +63,6 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 1e2bb9ed..9a078f5c 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -20,7 +20,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 7372800 ; CPU OSC FREQ IN MHZ INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -57,8 +59,6 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index e79e2c25..482fe08c 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -20,7 +20,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -59,8 +61,6 @@ KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index c4e677d9..0450a6a6 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -20,7 +20,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -56,8 +58,6 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_una.asm b/Source/HBIOS/cfg_una.asm index 058eca9e..622f53ab 100644 --- a/Source/HBIOS/cfg_una.asm +++ b/Source/HBIOS/cfg_una.asm @@ -16,7 +16,9 @@ PLATFORM .EQU PLT_UNA ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO] BIOS .EQU BIOS_UNA ; HARDWARE BIOS: BIOS_[WBW|UNA] ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index f9c50fb2..75ddc039 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -20,7 +20,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO] IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPT MODE: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -53,8 +55,6 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 0e3027c7..1582373c 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -20,7 +20,9 @@ BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION ; -BOOT_TIMEOUT .EQU 0 ; AUTO BOOT TIMEOUT IN SECONDS, 0 TO DISABLE +BOOTTYPE .EQU BT_MENU ; BT_[MENU|AUTO], IF AUTO, BOOT DEFAULT AFTER TIMEOUT +BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT +BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 @@ -58,8 +60,6 @@ CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; -TIMRTCENABLE .EQU FALSE ; ENABLE PERIODIC TIMER CLOCK DRIVER (TIMRTC.ASM) -; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index c97923eb..ddfe411e 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -31,7 +31,7 @@ BUFLEN .EQU 40 ; INPUT LINE LENGTH JP DSKY_ENTRY JP UART_ENTRY ; -;#DEFINE USEDELAY +#DEFINE USEDELAY #INCLUDE "util.asm" ; ;__UART_ENTRY_________________________________________________________________ @@ -125,9 +125,9 @@ INITIALIZE: LD (9),HL ; STORE AT 0x0009 #ENDIF -;#IF (BIOS == BIOS_WBW) -; CALL DELAY_INIT -;#ENDIF +#IF (BIOS == BIOS_WBW) + CALL DELAY_INIT +#ENDIF RET ; @@ -890,7 +890,7 @@ KEYBUF: .FILL BUFLEN,0 ;_____________________________________________________________________________ ; TXT_PROMPT .TEXT "\r\n>$" -TXT_READY .TEXT "\r\n\r\nMonitor Ready$" +TXT_READY .TEXT "\r\nMonitor Ready$" TXT_COMMAND .TEXT "\r\nUnknown Command$" TXT_ERR .TEXT "\r\nSyntax Error$" TXT_CKSUMERR .TEXT "\r\nChecksum Error$" diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index e2aef567..6e696cb6 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -896,21 +896,6 @@ HB_START: INC A ; 1 MEANS BAT OK LD (HBX_LOC - 1),A ; OVERWRITE IF NVC ALLOWS IT ; -; IF APPBOOT, SAVE CURRENT BANKID -; -; THIS IS NOT GOING TO WORK IF THE APP BOOT IMAGE IS LOADED -; USING THE UNA FAT32 LOADER. SHOULD PROBABLY CHECK THAT THERE -; IS A VALID ROMWBW PROXY IN MEMORY BEFORE DOING THIS. HOWEVER, -; THIS USE CASE IS PROBABLY NON-EXISTENT. THE IMG BOOT IMAGE -; SHOULD WORK FINE WITH THE UNA FAT32 LOADER. -; -#IFDEF APPBOOT - LD A,(HB_CURBNK) - DEC SP ; RESERVE A STACK BYTE - LD (HBX_LOC - 2),A ; SAVE BANK - PUSH AF ; ALSO ON STACK -#ENDIF -; ; INSTALL PROXY IN UPPER MEMORY ; LD DE,HBX_LOC ; AS PER ABOVE @@ -918,13 +903,6 @@ HB_START: LD BC,HBX_SIZ LDIR ; -; IF APPBOOT, RESTORE CURRENT BANK ID -; -#IFDEF APPBOOT - POP AF - LD (HB_CURBNK),A -#ENDIF -; ; IF ALREADY EXECUTING IN RAM, BYPASS RAM BANK INSTALLATION ; LD A,(HB_RAMFLAG) @@ -967,11 +945,6 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK ; IF APPBOOT, WE NEED TO FIX UP A FEW THINGS IN PAGE ZERO ; #IFDEF APPBOOT -; - ; GET AND SAVE APP BOOT BANK ID - LD A,(HBX_LOC - 2) - LD (HB_APPBNK),A - ; MAKE SURE RST 08 VECTOR IS RIGHT LD A,$C3 LD ($0008),A @@ -1547,9 +1520,7 @@ INITSYS3: ;CALL HBX_BNKCPY LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY LD D,BID_USR ; D = DEST BANK = USER BANK - ;LD E,BID_USR ; E = SRC BANK = USER BANK - LD A,(HB_APPBNK) ; GET APP LOAD BANK - LD E,A ; USE AS SOURCE + LD E,BID_USR ; E = SRC BANK = USER BANK LD HL,$8000 ; HL = COPY LEN = ENTIRE BANK RST 08 ; DO IT LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY @@ -1662,9 +1633,6 @@ HB_INITTBL: #IF (ACIAENABLE) .DW ACIA_INIT #ENDIF -#IF (TIMRTCENABLE) - .DW TIMRTC_INIT -#ENDIF #IF (SIMRTCENABLE) .DW SIMRTC_INIT #ENDIF @@ -2147,9 +2115,6 @@ HB_IOBNK .DB 0 ; CURRENT IO BUFFER BANK ID ; B: FUNCTION ; RTC_DISPATCH: -#IF (TIMRTCENABLE) - JP TIMRTC_DISPATCH -#ENDIF #IF (SIMRTCENABLE) JP SIMRTC_DISPATCH #ENDIF @@ -2707,29 +2672,42 @@ HB_IM1PTR .DW HB_IVT ; POINTER FOR NEXT IM1 ENTRY ; #ENDIF ; -; TIMER HANDLER VECTORS -; THESE CAN BE HOOKED AS DESIRED BY DRIVERS +; TIMER INTERRUPT ; HB_TIMINT: -VEC_TICK: - JP HB_TICK ; TICK PROCESSING VECTOR -VEC_SECOND: - JP HB_SECOND ; SECOND PROCESSING VECTOR -; -; TIMER HANDLERS -; -HB_TICK: ; INCREMENT TICK COUNTER (32 BIT) LD HL,HB_TICKS ; POINT TO TICK COUNTER CALL INC32HL +; +HB_TIMINT1: +; +#IF 0 +; + LD HL,TEMPCNT + DEC (HL) + JR NZ,HB_TIMINT2 + LD (HL),250 +; + LD A,'*' + CALL COUT + JR HB_TIMINT2 +; +TEMPCNT .DB 250 +; +#ENDIF +; +HB_TIMINT2: LD HL,HB_SECTCK ; POINT TO SECONDS TICK COUNTER DEC (HL) ; COUNTDOWN 50 TICKS - JR NZ,HB_TICK1 ; NOT DONE, SKIP AHEAD + JR NZ,HB_TIMINT3 ; NOT ZERO YET, DONE FOR THIS CYCLE + ; 50 TICKS HAVE ELAPSED LD A,TICKSPERSEC ; 50 TICKS PER SECOND LD (HL),A ; RESET COUNTDOWN REGISTER - CALL VEC_SECOND ; DO SECONDS PROCESSING VIA VECTOR + ; INCREMENT SECONDS COUNTER + LD HL,HB_SECS ; POINT TO SECONDS COUNTER + CALL INC32HL ; -HB_TICK1: +HB_TIMINT3: ; #IF (CPUFAM == CPU_Z180) ; ACK/RESET Z180 TIMER INTERRUPT @@ -2745,12 +2723,6 @@ HB_TICK1: OR $FF ; NZ SET TO INDICATE INT HANDLED RET ; -HB_SECOND: - ; INCREMENT SECONDS COUNTER - LD HL,HB_SECS ; POINT TO SECONDS COUNTER - JP INC32HL ; INCREMENT AND RETURN - -; ; BAD INTERRUPT HANDLER ; HB_BADINT: @@ -2927,14 +2899,6 @@ HB_TMPREF .DW 0 ; DEVICE DRIVERS ;================================================================================================== ; -#IF (TIMRTCENABLE) -ORG_TIMRTC .EQU $ - #INCLUDE "timrtc.asm" -SIZ_TIMRTC .EQU $ - ORG_TIMRTC - .ECHO "TIMRTC occupies " - .ECHO SIZ_TIMRTC - .ECHO " bytes.\n" -#ENDIF #IF (SIMRTCENABLE) ORG_SIMRTC .EQU $ #INCLUDE "simrtc.asm" @@ -4118,8 +4082,6 @@ STR_LOWBAT .DB "\r\n\r\n+++ LOW BATTERY +++$" MSG_HBVER .DB $BE,$FF,$8A,$FB,$80,$80,$80,$80 ; "HBIO " #ENDIF ; -HB_APPBNK .DB 0 ; START BANK WHEN RUN IN APP MODE -; HB_CURSEC .DB 0 ; CURRENT SECOND (TEMP) ; HB_BCDTMP .FILL 5,0 ; BCD NUMBER STORAGE (TEMP) diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index c4c111e0..22294698 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -1,1595 +1,1247 @@ ; -;======================================================================= -; RomWBW Loader -;======================================================================= -; -; The loader code is invoked immediately after HBIOS completes system -; initialization. it is responsible for loading a runnable image -; (operating system, etc.) into memory and transferring control to that -; image. The image may come from ROM (romboot), RAM (appboot/imgboot) -; or from disk (disk boot). -; -; In the case of a ROM boot, the selected executable image is copied -; from ROM into the default RAM and then control is passed to the -; starting address in RAM. In the case of an appboot or imgboot -; startup (see hbios.asm) the source of the image may be RAM. -; -; In the case of a disk boot, sector 2 (the third sector) of the disk -; device will be read -- this is the boot info sector and is expected -; to have the format defined at bl_infosec below. the last three words -; of data in this sector determine the final destination starting and -; ending address for the disk load operation as well as the entry point -; to transfer control to. The actual image to be loaded *must* be on -; the disk in the sectors immediately following the boot info sector. -; This means the image to be loaded must begin in sector 3 (the fourth -; sector) and occupy sectors contiguously after that. -; -; The code below relocates itself at startup to the start of common RAM -; at $8000. This means that the code, data, and stack will all stay -; within $8000-$8FFF. Since all code images like to be loaded either -; high or low (never in the middle), the $8000-$8FFF location tends to -; avoid the problem where the code is overlaid during the loading of -; the desired executable image. -; -#INCLUDE "std.asm" ; standard RomWBW constants -; -#ifndef BOOT_DEFAULT -#define BOOT_DEFAULT "H" -#endif -; -bel .equ 7 ; ASCII bell -bs .equ 8 ; ASCII backspace -lf .equ 10 ; ASCII linefeed -cr .equ 13 ; ASCII carriage return -; -cmdbuf .equ $80 ; cmd buf is in second half of page zero -cmdmax .equ 60 ; max cmd len (arbitrary), must be < bufsiz -bufsiz .equ $80 ; size of cmd buf -; -int_im1 .equ $FF00 ; IM1 vector target for RomWBW HBIOS proxy -; -bid_cur .equ -1 ; used below to indicate current bank -; - .org 0 ; we expect to be loaded at $0000 -; -;======================================================================= -; Normal page zero setup, ret/reti/retn as appropriate -;======================================================================= -; - jp $100 ; rst 0: jump to boot code - .fill ($08 - $) -#if (BIOS == BIOS_WBW) - jp HB_INVOKE ; rst 8: invoke HBIOS function -#else - jp $FFFD ; rst 8: invoke UBIOS function -#endif - .fill ($10 - $) - ret ; rst 10 - .fill ($18 - $) - ret ; rst 18 - .fill ($20 - $) - ret ; rst 20 - .fill ($28 - $) - ret ; rst 28 - .fill ($30 - $) - ret ; rst 30 - .fill ($38 - $) -#if (BIOS == BIOS_WBW) - #if (INTMODE == 1) - jp int_im1 ; go to handler in hi mem - #else - ret ; return w/ ints left disabled - #endif -#else - ret ; return w/ ints disabled -#endif - .fill ($66 - $) - retn ; nmi -; - .fill ($100 - $) ; pad remainder of page zero -; -;======================================================================= -; Startup and loader initialization -;======================================================================= -; -; Note: at startup, we should not assume which bank we are operating in. -; - ; Relocate to start of common ram at $8000 - ld hl,0 - ld de,$8000 - ld bc,LDR_SIZ - ldir -; - jp start +;================================================================================================== +; ROMWBW LOADER +;================================================================================================== +; +; THE LOADER CODE IS INVOKED IMMEDIATELY AFTER HBIOS COMPLETES SYSTEM INITIALIZATION. +; IT IS RESPONSIBLE FOR LOADING A RUNNABLE IMAGE (OPERATING SYSTEM, ETC.) INTO MEMORY +; AND TRANSFERRING CONTROL TO THAT IMAGE. THE IMAGE MAY COME FROM ROM (ROMBOOT), +; RAM (APPBOOT/IMGBOOT) OR FROM DISK (DISK BOOT). +; +; IN THE CASE OF A ROM BOOT, THE SELECTED EXECUTABLE IMAGE IS COPIED FROM ROM +; INTO A THE DEFAULT RAM AND THEN CONTROL IS PASSED TO THE STARTING ADDRESS +; IN RAM. IN THE CASE OF AN APPBOOT OR IMGBOOT STARTUP (SEE HBIOS.ASM) +; THE SOURCE OF THE IMAGE MAY BE RAM. +; +; IN THE CASE OF A DISK BOOT, SECTOR 2 (THE THIRD SECTOR) OF THE DISK DEVICE WILL +; BE READ -- THIS IS REFERRED TO AS THE BOOT INFO SECTOR AND IS EXPECTED TO HAVE +; THE FORMAT DEFINED AT BL_INFOSEC BELOW. THE LAST THREE WORDS OF DATA IN THIS +; SECTOR DETERMINE THE FINAL DESTINATION STARTING AND ENDING ADDRESS FOR THE DISK +; LOAD OPERATION AS WELL AS THE ENTRY POINT TO TRANSFER CONTROL TO. THE ACTUAL +; IMAGE TO BE LOADED *MUST* BE ON THE DISK IN THE SECTORS IMMEDIATELY FOLLOWING +; THE BOOT INFO SECTOR. THIS MEANS THE IMAGE TO BE LOADED MUST BEGIN IN SECTOR +; 3 (THE FOURTH SECTOR) AND OCCUPY SECTORS CONTIGUOUSLY AFTER THAT. +; +; THE CODE BELOW RELOCATES ITSELF AT STARTUP TO THE START OF COMMON RAM +; AT $8000. THIS MEANS THAT THE CODE, DATA, AND STACK WILL ALL STAY +; WITHIN $8000-$8FFF. SINCE ALL CODE IMAGES LIKE TO BE LOADED EITHER +; HIGH OR LOW (NEVER IN THE MIDDLE), THE $8000-$8FFF LOCATION TENDS +; TO AVOID THE PROBLEM WHERE THE CODE IS OVERLAID DURING THE LOADING +; OF THE DESIRED EXECUTABLE IMAGE. +; +; INCLUDE GENERIC STUFF +; +#INCLUDE "std.asm" +; +INT_IM1 .EQU $FF00 +; +BID_CUR .EQU -1 ; SPECIAL BANK ID VALUE INDICATES CURRENT BANK +; + .ORG 0 +; +;================================================================================================== +; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE +;================================================================================================== +; + JP $100 ; RST 0: JUMP TO BOOT CODE + .FILL (008H - $),0FFH +#IF (BIOS == BIOS_UNA) + JP $FFFD ; RST 8: INVOKE UBIOS FUNCTION +#ELSE + JP HB_INVOKE ; RST 8: INVOKE HBIOS FUNCTION +#ENDIF + .FILL (010H - $),0FFH + RET ; RST 10 + .FILL (018H - $),0FFH + RET ; RST 18 + .FILL (020H - $),0FFH + RET ; RST 20 + .FILL (028H - $),0FFH + RET ; RST 28 + .FILL (030H - $),0FFH + RET ; RST 30 + .FILL (038H - $),0FFH +#IF (BIOS == BIOS_UNA) + RETI ; RETURN W/ INTS DISABLED +#ELSE + #IF (INTMODE == 1) + JP INT_IM1 ; JP TO INTERRUPT HANDLER IN HI MEM + #ELSE + RETI ; RETURN W/ INTS DISABLED + #ENDIF +#ENDIF + .FILL (066H - $),0FFH + RETN ; NMI +; + .FILL (100H - $),0FFH ; PAD REMAINDER OF PAGE ZERO +; +;================================================================================================== +; STARTUP AND LOADER INITIALIZATION +;================================================================================================== +; + DI ; NO INTERRUPTS FOR NOW +; + ; RELOCATE TO START OF COMMON RAM AT $8000 + LD HL,0 + LD DE,$8000 + LD BC,LDR_SIZ + LDIR + JP START ; .ORG $8000 + $ ; -start: - ld sp,bl_stack ; setup private stack - call DELAY_INIT ; init delay functions -; -; Disable interrupts if IM1 is active because we are switching to page -; zero in user bank and it has not been prepared with IM1 vector yet. -; -#if (INTMODE == 1) - di -#endif -; -; Switch banked memory to user RAM bank and setup page zero. -; -#if (BIOS == BIOS_WBW) - ld b,BF_SYSSETBNK ; HBIOS func: set bank - ld c,BID_USR ; select user bank - rst 08 ; do it - ld a,c ; previous bank to A - ld (bid_ldr),a ; save previous bank for later -#endif -; -#if (BIOS == BIOS_UNA) - ld bc,$01FB ; UNA func: set bank - ld de,BID_USR ; select user bank - rst 08 ; do it - ld a,c ; save previous bank - ld (bid_ldr),de ; ... for later -#endif -; -; Copy original page zero into user page zero -; - ld hl,$8000 ; page zero was copied here - ld de,0 ; put it in user page zero - ld bc,$100 ; full page - ldir ; do it -; -; Page zero in user bank is ready for interrupts now. -; -#if (INTMODE == 1) - ei -#endif -; -;======================================================================= -; Loader prompt -;======================================================================= -; - call nl2 ; formatting - ld hl,str_banner ; display boot banner - call pstr ; do it - call clrbuf ; zero fill the cmd buffer -; -#if (BOOT_TIMEOUT > 0) - ; Initialize auto command timeout downcounter - or $FF ; auto cmd active value - ld (acmd_act),a ; set flag - ld bc,BOOT_TIMEOUT * 100 ; hundredths of seconds - ld (acmd_to),bc ; save auto cmd timeout - ;ld a,b ; check for - ;or c ; ... zero - ;jr nz,prompt ; not zero, prompt w/ timeout - ;call nl2 ; formatting - ;ld hl,str_boot ; command string prefix - ;call pstr ; show it - ;call autocmd ; else, handle w/o prompt - ;jr reprompt ; restart w/ autocmd disable -#endif -; -prompt: - ld hl,reprompt ; adr of prompt restart routine - push hl ; put it on stack - call nl2 ; formatting - ld hl,str_prompt ; display boot prompt - call pstr ; do it - call clrbuf ; zero fill the cmd buffer -; -#if (DSKYENABLE) - call DSKY_RESET ; clear DSKY - ld hl,msg_sel ; boot select msg - call DSKY_SHOWSEG ; show on DSKY -#endif -; -wtkey: - ; wait for a key or timeout - call cst ; check for keyboard key - jr nz,concmd ; if pending, do console command -; -#if (DSKYENABLE) - call DSKY_STAT ; check DSKY for keypress - or a ; set flags - jp nz,dskycmd ; if pending, do DSKY command -#endif -; -#if (BOOT_TIMEOUT > 0) - ; check for timeout and handle auto boot here - ld a,(acmd_act) ; get auto cmd active flag - or a ; set flags - jr z,wtkey ; if not active, just loop - ld bc,(acmd_to) ; load timeout value - ld a,b ; test for - or c ; ... zero - jr z,autocmd ; if so, handle it - dec bc ; decrement - ld (acmd_to),bc ; resave it - ld de,625 ; 16us * 625 = 10ms - call VDELAY ; 10ms delay -#endif -; - jr wtkey ; loop -; -reprompt: - xor a ; zero accum - ld (acmd_act),a ; set auto cmd inactive - jr prompt ; back to loader prompt -; -clrbuf: - ld hl,cmdbuf - ld b,bufsiz - xor a -clrbuf1: - ld (hl),a - djnz clrbuf1 - ret -; -;======================================================================= -; Process a command line from buffer -;======================================================================= -; -concmd: - call clrled ; clear LEDs -; - ; Get a command line from console and handle it - call rdln ; get a line from the user - ld de,cmdbuf ; point to buffer - call skipws ; skip whitespace - or a ; set flags to check for null - jr nz,runcmd ; got a cmd, process it - ; if no cmd entered, fall thru to process default cmd -; -autocmd: - ; Copy autocmd string to buffer and process it - ld hl,acmd ; auto cmd string - call pstr ; display it - ld hl,acmd ; auto cmd string - ld de,cmdbuf ; cmd buffer adr - ld bc,acmd_len ; auto cmd length - ldir ; copy to command line buffer -; -runcmd: - ; Process command line -; - ld de,cmdbuf ; point to start of buf - call skipws ; skip whitespace - or a ; check for null terminator - ret z ; if empty line, just bail out - ld a,(de) ; get character - call upcase ; make upper case -; - ; Attempt built-in commands - cp 'H' ; H = display help - jp z,help ; if so, do it - cp '?' ; '?' alias for help - jp z,help ; if so, do it - cp 'L' ; L = List ROM applications - jp z,applst ; if so, do it - cp 'D' ; D = device inventory - jp z,devlst ; if so, do it - cp 'R' ; R = reboot system - jp z,reboot ; if so, do it -; - ; Attempt ROM application launch - ld ix,ra_tbl ; point to start of ROM app tbl - ld c,a ; save command in C -runcmd1: - ld a,(ix+ra_conkey) ; get match char - and ~$80 ; clear "hidden entry" bit - cp c ; compare - jp z,romload ; if match, load it - ld de,ra_entsiz ; table entry size - add ix,de ; bump IX to next entry - ld a,(ix) ; check for end - or (ix+1) ; ... of table - jr nz,runcmd1 ; loop till done -; - ; Attempt disk boot - ld de,cmdbuf ; start of buffer - call skipws ; skip whitespace - call isnum ; do we have a number? - jp nz,err_invcmd ; invalid format if empty - call getnum ; parse a number - jp c,err_invcmd ; handle overflow error - ld (bootunit),a ; save boot unit - xor a ; zero accum - ld (bootslice),a ; save default slice - call skipws ; skip possible whitespace - ld a,(de) ; get separator char - or a ; test for terminator - jp z,diskboot ; if so, boot the disk unit - cp '.' ; otherwise, is '.'? - jr z,runcmd2 ; yes, handle slice spec - cp ':' ; or ':'? - jr z,runcmd2 ; alt sep for slice spec - jp err_invcmd ; if not, format error -runcmd2: - inc de ; bump past separator - call skipws ; skip possible whitespace - call isnum ; do we have a number? - jp nz,err_invcmd ; if not, format error - call getnum ; get number - jp c,err_invcmd ; handle overflow error - ld (bootslice),a ; save boot slice - jp diskboot ; boot the disk unit/slice -; -;======================================================================= -; Process a DSKY command from key in A -;======================================================================= -; -#if (DSKYENABLE) -; -dskycmd: - call clrled ; clear LEDs -; - call DSKY_GETKEY ; get DSKY key - cp $FF ; check for error - ret z ; abort if so -; - ; Attempt built-in commands - cp KY_BO ; reboot system - jp z,reboot ; if so, do it -; - ; Attempt ROM application launch - ld ix,ra_tbl ; point to start of ROM app tbl - ld c,a ; save DSKY key in C -dskycmd1: - ld a,(ix+ra_dskykey) ; get match char - cp c ; compare - jp z,romload ; if match, load it - ld de,ra_entsiz ; table entry size - add ix,de ; bump IX to next entry - ld a,(ix) ; check for end - or (ix+1) ; ... of table - jr nz,dskycmd1 ; loop till done -; - ; Attempt disk boot - ld a,c ; copy key to A - cp KY_F + 1 ; over max? - ret nc ; abort if so - ld (bootunit),a ; set as boot unit - xor a ; zero A - ld (bootslice),a ; boot slice always zero here - jp diskboot ; go do it -; -#endif -; -;======================================================================= -; Special command processing -;======================================================================= -; -; Display Help -; -help: - ld hl,str_help ; point to help string - call pstr ; display it - ret -; -; List ROM apps -; -applst: - ld hl,str_applst - call pstr - call nl - ld ix,ra_tbl -applst1: - ; check for end of table - ld a,(ix) - or (ix+1) - ret z -; - ld a,(ix+ra_conkey) - bit 7,a - jr nz,applst2 - push af - call nl - ld a,' ' - call cout - call cout - pop af - call cout - ld a,':' - call cout - ld a,' ' - call cout - ld l,(ix+ra_name) - ld h,(ix+ra_name+1) - call pstr -; -applst2: - ld bc,ra_entsiz - add ix,bc - jr applst1 +START: LD SP,BL_STACK ; SETUP STACK +; +#IF (BIOS == BIOS_WBW) + CALL DELAY_INIT ; INIT DELAY FUNCTIONS +#ENDIF +; +#IF (BIOS == BIOS_UNA) +; ; COPY UNA BIOS PAGE ZERO TO USER BANK, LEAVE USER BANK ACTIVE +; LD BC,$01FB ; UNA FUNC = SET BANK +; LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC) +; CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) +; PUSH DE ; SAVE PREVIOUS BANK +;; +; LD HL,0 ; FROM ADDRESS 0 (PAGE ZERO) +; LD DE,$9000 ; USE $9000 AS BOUNCE BUFFER +; LD BC,256 ; ONE PAGE IS 256 BYTES +; LDIR ; DO IT +;; +; LD BC,$01FB ; UNA FUNC = SET BANK +; ;POP DE ; RECOVER OPERATING BANK +; LD DE,BID_USR ; TO USER BANK +; CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) +;; +; LD HL,$9000 ; USE $9000 AS BOUNCE BUFFER +; LD DE,0 ; TO PAGE ZERO OF OPERATING BANK +; LD BC,256 ; ONE PAGE IS 256 BYTES +; LDIR ; DO IT +;; +;; ; INSTALL UNA INVOCATION VECTOR FOR RST 08 +;; ; *** IS THIS REDUNDANT? *** +;; LD A,$C3 ; JP INSTRUCTION +;; LD (8),A ; STORE AT 0x0008 +;; LD HL,($FFFE) ; UNA ENTRY VECTOR +;; LD (9),HL ; STORE AT 0x0009 +;; +; LD BC,$01FB ; UNA FUNC = SET BANK +; POP DE ; RECOVER OPERATING BANK +; CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) +#ELSE + ; PREP THE USER BANK (SETUP PAGE ZERO) + LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY + LD D,BID_USR ; D = DEST BANK = USER BANK + LD E,BID_BIOS ; E = SRC BANK = BIOS BANK + LD HL,256 ; HL = COPY LEN = 1 PAGE = 256 BYTES + RST 08 ; DO IT + LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY + LD HL,0 ; COPY FROM BIOS ADDRESS 0 + LD DE,0 ; TO USER ADDRESS 0 + RST 08 ; DO IT +#ENDIF + EI +; +;================================================================================================== +; BOOT LOADER MENU DISPLAY +;================================================================================================== +; + LD DE,STR_BANNER ; DISPLAY BOOT BANNER +; +MENU: + CALL WRITESTR ; DISPLAY MESSAGE OR ERROR + CALL NEWLINE2 +; +#IF (DSKYENABLE) + CALL DSKY_RESET + ; DISPLAY DSKY BOOT MESSAGE + LD HL,MSG_SEL ; POINT TO BOOT MESSAGE + CALL DSKY_SHOWSEG ; DISPLAY MESSAGE +#ENDIF +; +#IF (BOOTTYPE == BT_AUTO) + ; INITIALIZE BOOT TIMEOUT DOWNCOUNTER + LD BC,100 * BOOT_TIMEOUT + LD (BL_TIMEOUT),BC +#ENDIF +; + ; DISPLAY ROM MENU ENTRIES + PRTS("ROM: $") + LD B,MENU_N ; B IS LOOP COUNTER, # OF ENTRIES + LD HL,MENU_S ; HL POINTS TO START OF ENTRY +MENU1: + ; PROCESS A TABLE ENTRY + PUSH HL ; COPY HL TO + POP DE ; ... DE FOR USE AS CHAR PTR +MENU2: + LD A,(DE) ; GET NEXT CHAR + INC DE ; BUMP CHAR PTR FOR FUTURE + CP '$' ; TERMINATOR? + JR Z,MENU4 ; IF YES, DONE WITH THIS ENTRY + CP '~' ; HOT KEY PREFIX? + JR NZ,MENU3 ; IF NOT, JUST SKIP AHEAD + CALL PC_LPAREN ; L PAREN BEFORE HOT KEY + LD A,(DE) ; GET THE ACTUAL HOT KEY + INC DE ; BUMP CHAR PTR FOR FUTURE + CALL COUT ; OUTPUT HOT KEY + LD A,')' ; R PAREN WILL PRINT BELOW +MENU3: + CALL COUT ; OUTPUT CHAR + JR MENU2 ; AND LOOP +MENU4: + ; END OF AN ENTRY + CALL PC_SPACE ; PRINT SEPARATOR + LD A,MENU_V ; LOAD ENTRY LENGTH + CALL ADDHLA ; BUMP HL TO NEXT ENTRY + DJNZ MENU1 ; LOOP UNTIL COUNT EXPIRES +; + ; DISPLAY AVAILABLE DISK DRIVES + PRTS("\r\nDisk: $") + CALL PRTALL ; PRINT DRIVE LIST +; + LD DE,STR_BOOTSEL + CALL WRITESTR +; +;================================================================================================== +; BOOT SELECTION PROCESSING +;================================================================================================== +; +SEL: ; HANDLE SERIAL CONSOLE INPUT + CALL CST ; CHECK CONSOLE INPUT + OR A ; ZERO? + JR Z,SEL1 ; IF NOT, CONTINUE +#IF (BIOS == BIOS_WBW) + #IF (DIAGENABLE) + XOR A ; ZERO ACCUM + OUT (DIAGPORT),A ; CLEAR DIAG LEDS + #ENDIF + #IF (LEDENABLE) + OR $FF ; LED IS INVERTED + OUT (LEDPORT),A ; CLEAR LED + #ENDIF +#ENDIF + CALL CINUC ; GET THE KEY + CALL COUT ; ECHO KEY + CP 'R' ; CHECK FOR + JP Z,REBOOT ; REBOOT REQUEST + LD DE,MENU_S+10-MENU_V ; POINT TO SERIAL MENU COLUMN + LD C,2 ; SET SERIAL FLAG + JR MATS ; GO CHECK MENU SELECTION +; +SEL1: +#IF (DSKYENABLE) + ; HANDLE DSKY KEY INPUT + CALL DSKY_STAT ; CHECK DSKY INPUT + OR A ; TEST FOR ZERO + JR Z,SEL2 ; IF ZERO, NO KEY PRESSED +#IF (BIOS == BIOS_WBW) + #IF (DIAGENABLE) + XOR A ; ZERO ACCUM + OUT (DIAGPORT),A ; CLEAR DIAG LEDS + #ENDIF + #IF (LEDENABLE) + OR $FF ; LED IS INVERTED + OUT (LEDPORT),A ; CLEAR LED + #ENDIF +#ENDIF + CALL DSKY_GETKEY ; GET PENDING KEY PRESS ; NOTE DESKY_GETKEY + CP $FF ; CHECK FOR ERROR + JR Z,SEL2 ; IF SO, IGNORE KEY, AND CONT LOOPING + CP KY_BO ; CHECK FOR REBOOT ; CAN RETURN AN INVALID + JP Z,REBOOT ; REBOOT REQUEST ; KEYSCAN AS FFH WHICH + LD DE,MENU_S+11-MENU_V ; POINT TO DSKY MENU COLUMN ; MAY BE MATCHED WITH + LD C,1 ; SET DSKY FLAG ; DUMMY MENU ENTRIES + JR MATS ; GO CHECK MENU SELECTION +#ENDIF +; +SEL2: +#IF (BOOTTYPE == BT_AUTO) + ; CHECK FOR AUTOBOOT TIMEOUT + LD DE,625 ; DELAY FOR 10MS TO MAKE TIMEOUT CALC EASY + CALL VDELAY ; 16US * 625 = 10MS + LD BC,(BL_TIMEOUT) ; CHECK/INCREMENT TIMEOUT + DEC BC + LD (BL_TIMEOUT),BC + LD A,B + OR C + JP NZ,SEL3 +; +#IF (BIOS == BIOS_WBW) + #IF (DIAGENABLE) + XOR A ; ZERO ACCUM + OUT (DIAGPORT),A ; CLEAR DIAG LEDS + #ENDIF + #IF (LEDENABLE) + OR $FF ; LED IS INVERTED + OUT (LEDPORT),A ; CLEAR LED + #ENDIF +#ENDIF + LD A,BOOT_DEFAULT ; TIMEOUT EXPIRED, + LD DE,MENU_S+10-MENU_V ; POINT TO SERIAL MENU COLUMN + LD C,2 ; SET SERIAL FLAG + JR MATS ; PERFORM DEFAULT BOOT ACTION +#ENDIF +; +SEL3: + ; NO USER SELECTION YET + JR SEL ; LOOP +; +;================================================================================================== +; ROM MENU TABLE MATCHING +;================================================================================================== +; +MATS: LD B,MENU_N ; LOOP THROUGH THE ; ON ENTRY DE POINTS TO + LD HL,MENU_V ; MENU TABLE AND ; THE MENU COLUMN WE ARE +MATS1: EX DE,HL ; CHECK IF THE ; CHECKING AND C CONTAINS + ADD HL,DE ; KEYPRESS MATCHES ; A FLAG TELLING US IF WE + CP (HL) ; ANY OF ; HAVE DSKY OR SERIAL INPUT + EX DE,HL ; THE MENU ITEMS. + JR Z,MATS2 + DJNZ MATS1 ; IF WE REACH THE TABLE END AND DON'T HAVE + JR MATD ; A MATCH GO AND CHECK FOR A DISK SELECTION +; +MATS2: LD B,0 ; WE GOT A MATCH FROM THE MENU TABLE. POINT + EX DE,HL ; TO THE ROM ADDRESS TO EXECUTE. ADJUST THE + ADD HL,BC ; POINTER TO THE ROM ENTRY BASED ON WHETHER WE + EX DE,HL ; GOT A MATCH IN THE DSKY OR SERIAL MENU COLUMN + JP GOROM ; JUMP TO THE ROM HANDLER. +; +MATD: LD B,A + LD A,C ; IF INPUT WAS SERIAL + LD (BL_INPFLG),A ; SAVE INPUT FLAG + DEC C ; CONVERT TO FROM. + LD A,B ; ASCII TO DECIMAL. + JR Z,MATD1 ; DSKY NUMBERS ARE + SUB '0' ; ALREADY DECIMAL +MATD1: CP 10 ; DO A RANGE CHECK + JR NC,MATX ; NOT VALID, HANDLE IT BELOW +; +#IF (BIOS == BIOS_WBW) + PUSH BC + PUSH AF ; HOW MANY DISK + LD B,BF_SYSGET ; DEVICES DO WE + LD C,BF_SYSGET_DIOCNT ; HAVE IN THE + RST 08 ; SYSTEM ? + POP AF + POP BC +#ELSE + LD E,9 ; HACK TO HANDLE UNA, NEED TO FIX +#ENDIF +; JR MATD2 ; IF MORE THEN 9 ; UNCOMMENT TO TEST DOUBLE CHAR ENTRY + CP 10 ; THEN WE NEED TO GET + JR NC,MATD2 ; ANOTHER CHARACTER +; + CP E ; WE DON'T HAVE MORE THAN 10 DEVICES SO ; A = REQUESTED UNIT + JP C,GOBOOTDISK ; CHECK IT IS IN RANGE. BOOT IF IT IS ; E = AVAILABLE UNITS + JR MATX ; IT IF NOT VALID, HANDLE IT BELOW + +MATD2: LD B,A ; PROCESS FURTHER INPUT ; B = REQUESTED UNIT + LD A,C ; CHECK WHERE TO GET ; C = DSKY/SERIAL FLAG + DEC C ; THE INPUT FROM AND GO + JR NZ,MATD3 ; GET ANOTHER CHARACTER +; +#IF (DSKYENABLE) ; INPUT DSKY +; +MATD4: ;CALL DSKY_STAT ; WAIT FOR + ;OR A ; ANOTHER + ;JR Z,MATD4 ; KEY FROM + ;CALL DSKY_GETKEY ; DSKY + CALL DSKY_KEY + + CP KY_EN ; IF NEXT KEY IS ENTER + JR Z,MATD6 ; OR GO, PROCESS AS A + CP KY_GO ; SINGLE DIGIT NUMBER + JR Z,MATD6 ; OTHERWISE JOIN TWO + JR MATD5 ; CHARCTERS IN ONE DECIMAL +#ENDIF +; +; ; INPUT SERIAL +; +MATD3: ;CALL CST ; WAIT FOR + ;OR A ; ANOTHER + ;JR Z,MATD3 ; KEY FROM + CALL CINUC ; SERIAL + CALL COUT +; + CP CHR_CR ; IF NEXT KEY IS RETURN PROCESS + JR Z,MATD6 ; AS A SINGLE DIGIT NUMBER +; + SUB '0' ; CONVERT THE SERIAL NUMBER TO DECIMAL + CP 10 ; DO A RANGE CHECK + JR NC,MATX ; NOT VALID, HANDLE IT BELOW + +MATD5: LD C,A ; C CONTAINS SECOND CHARACTER INPUT 0..9 + LD A,B ; A CONTAINS FIRST NUMBER INPUT 0..9 + ADD A,A + LD B,A ; MULTIPLY FIRST DIGIT BY 10 + ADD A,A ; AND ADD SECOND DIGIT + ADD A,A + ADD A,B ; CONVERT TWO INPUTTED + ADD A,C ; CHARACTERS TO DECIMAL. + LD B,A +; +MATD6: LD A,B ; PUT THE DEVICE NUMBER TO BOOT + JP GOBOOTDISK ; IN A AND GO BOOT DEVICE +; +MATX: LD DE,STR_INVALID ; SET ERROR STRING MESSAGE + JP MENU ; AND RESTART MENU LOOP +; +;================================================================================================== +; ROM MENU TABLE +;================================================================================================== +; +#DEFINE MENU_L(M1,M2,M3,M4,M5,M6,M7,M8,M9,M10) \ +#DEFCONT \ .DB M1 +#DEFCONT \ .DB M2 +#IF (DSKYENABLE) +#DEFCONT \ .DB M3 +#ELSE +#DEFCONT \ .DB $FF +#ENDIF +#DEFCONT \ .DW M4 +#DEFCONT \ .DW M5 +#DEFCONT \ .DW M6 +#DEFCONT \ .DW M7 +#DEFCONT \ .DB M8 +#DEFCONT \ .DB M9 +#DEFCONT \ .DB M10 +; +; NOTE: THE FORMATTING OF THE FOLLOWING IS CRITICAL. TASM DOES NOT PASS MACRO ARGUMENTS WELL. +; ENSURE STD.ASM HOLDS THE DEFINITIONS FOR *_LOC, *_SIZ *_END AND ANY CODE GENERATED WHICH DOES NOT +; INCLUDE STD.ASM IS SYNCED. +; +; NOTE: THE LOADABLE ROM IMAGES ARE PLACED IN ROM BANKS BID_IMG0 AND BID_IMG1. HOWEVER, ROMWBW +; SUPPORTS A MECHANISM TO LOAD A COMPLETE NEW SYSTEM DYNAMICALLY AS A RUNNABLE APPLICATION +; (SEE APPBOOT AND IMGBOOT IN HBIOS.ASM). IN THIS CASE, THE CONTENTS OF BID_IMG0 WILL +; PRE-LOADED INTO THE CURRENTLY EXECUTING RAM BANK THEREBY ALLOWING THOSE IMAGES TO BE +; DYNAMICALLY LOADED AS WELL. TO SUPPORT THIS CONCEPT, A PSEUDO-BANK CALLED BID_CUR +; IS USED TO SPECIFY THE IMAGES NORMALLY FOUND IN BID_IMG0. IN GOROM, THIS SPECIAL +; VALUE WILL CAUSE THE ASSOCIATED IMAGE TO BE LOADED FROM THE CURRENTLY EXECUTING BANK +; WHICH WILL BE CORRECT REGARDLESS OF THE LOAD MODE. IMAGES IN OTHER BANKS (BID_IMG1) +; WILL ALWAYS BE LOADED DIRECTLY FROM ROM. +; +; name menu dsky dest-exec source dest-addr img-size source-bank dest desc +; DB DB DB DW DW DW DW DB DB DB +MENU_S: MENU_L("~Monitor$ ", "M", KY_CL, MON_SERIAL, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "Monitor$ ") +MENU_1: MENU_L("~CP/M$ ", "C", KY_BK, CPM_ENT, 2000h, CPM_LOC, CPM_SIZ, BID_CUR, BID_USR, "CP/M 80 v2.2$") + MENU_L("~Z-System$", "Z", KY_FW, CPM_ENT, 5000h, CPM_LOC, CPM_SIZ, BID_CUR, BID_USR, "ZSDOS v1.1$ ") +#IF (BIOS == BIOS_WBW) + MENU_L("~Forth$ ", "F", KY_EX, FTH_LOC, 0000h, FTH_LOC, FTH_SIZ, BID_IMG1, BID_USR, "Camel Forth$ ") + MENU_L("~BASIC$ ", "B", KY_DE, BAS_LOC, 1700h, BAS_LOC, BAS_SIZ, BID_IMG1, BID_USR, "Nascom BASIC$") + MENU_L("~T-BASIC$ ", "T", KY_EN, TBC_LOC, 3700h, TBC_LOC, TBC_SIZ, BID_IMG1, BID_USR, "Tasty BASIC$ ") + MENU_L("~PLAY$ ", "P", $FF, GAM_LOC, 4000h, GAM_LOC, GAM_SIZ, BID_IMG1, BID_USR, "Game$ ") + MENU_L("~USER ROM$", "U", $FF, USR_LOC, 7000h, USR_LOC, USR_SIZ, BID_IMG1, BID_USR, "User ROM$ ") +#ENDIF +#IF (DSKYENABLE) + MENU_L("~DSKY$ ", "D", KY_GO, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "DSKY Monitor$") +#ENDIF + MENU_L("$ ", "E", $FF, EGG_LOC, 0E00h, EGG_LOC, EGG_SIZ, BID_CUR, BID_USR, "Easter Egg$ ") +; +MENU_E .EQU $ ; END OF TABLE +MENU_V .EQU MENU_1 - MENU_S ; LENGTH OF EACH MENU RECORD +MENU_N .EQU ((MENU_E - MENU_S) / MENU_V) ; NUMBER OF MENU ITEMS +; +;================================================================================================== +; SYSTEM REBOOT HANDLER +;================================================================================================== +; +REBOOT: +; + LD DE,STR_REBOOT ; POINT TO MESSAGE + CALL WRITESTR ; PRINT IT +; + ; WAIT FOR MESSAGE TO BE DISPLAYED + LD HL,10000 +REBOOT1: ; LOOP IS 26TS + DEC HL ; 6TS + LD A,H ; 4TS + OR L ; 4TS + JR NZ,REBOOT1 ; 12TS +; +#IF (BIOS == BIOS_WBW) +; +#IF (DSKYENABLE) + LD HL,MSG_BOOT ; POINT TO BOOT MESSAGE + CALL DSKY_SHOWSEG ; DISPLAY MESSAGE +#ENDIF +; + ; SWITCH TO ROM BANK 0 AND JUMP TO ADDRESS 0 + LD A,BID_BOOT ; BOOT BANK + LD HL,0 ; ADDRESS ZERO + CALL HB_BNKCALL ; DOES NOT RETURN +#ENDIF +; +#IF (BIOS == BIOS_UNA) + ; SWITCH TO ROM BANK 0 AND JUMP TO ADDRESS 0 + LD BC,$01FB ; UNA FUNC = SET BANK + LD DE,0 ; ROM BANK 0 + RST 08 ; DO IT + JP 0 ; JUMP TO RESTART ADDRESS +#ENDIF +; +;================================================================================================== +; ROM IMAGE LOAD HANDLER +;================================================================================================== +; +; AT ENTRY, DE POINTS TO THE EXEC ADR FIELD OF THE ACTIVE ROM +; TABLE ENTRY +; +; ROM IMAGES MUST NOT OVERLAY THE SPACE OCCUPIED BY THE LOADER WHICH +; IS $8000-$8FFF. +; +GOROM: PUSH DE ; SAVE ROM TABLE ENTRY EXEC ADR PTR + LD DE,STR_BOOTROM ; ROM LOADING MSG PREFIX + CALL WRITESTR ; PRINT IT +#IF (DSKYENABLE) + LD HL,MSG_LOAD ; POINT TO LOAD MESSAGE + CALL DSKY_SHOWSEG ; DISPLAY MESSAGE +#ENDIF + POP HL ; EXEC ADR TO HL + PUSH HL ; AND RESAVE IT + LD A,10 ; OFFSET TO IMAGE DESC + CALL ADDHLA ; APPLY IT + EX DE,HL ; MOVE TO DE, ORIG VALUE TO HL + CALL WRITESTR ; AND PRINT IT + PRTS("...$") ; ADD SOME DOTS + POP HL ; RESTORE EXEC ADR TO HL +; + LD B,5 ; PUT NEXT FIVE WORDS ON STACK +GOROM1: LD E,(HL) ; (1) EXEC ADR + INC HL ; (2) SOURCE ADR + LD D,(HL) ; (3) DEST ADR + INC HL ; (4) IMAGE SIZE + PUSH DE ; (5) SRC/DEST BANKS + DJNZ GOROM1 ; LOOP TILL DONE +; +#IF (BIOS == BIOS_UNA) +; +; NOTE: UNA HAS NO INTERBANK MEMORY COPY, SO WE CAN ONLY LOAD +; IMAGES FROM THE CURRENT BANK. A SIMPLE LDIR IS USED TO +; RELOCATE THE IMAGES. AT SOME POINT AN UNA INTERBANK COPY +; SHOULD BE IMPLEMENTED HERE. +; + ; COPY IMAGE TO IT'S RUNNING LOCATION + POP HL ; POP AND DISCARD BANKS + POP BC ; GET IMAGE SIZE TO BC + POP DE ; GET DESTINATION ADR TO DE + POP HL ; GET SOURCE ADR TO HL + LDIR ; MOVE IT +; + ; RECORD BOOT INFO + LD BC,$00FB ; GET LOWER PAGE ID + RST 08 ; DE := LOWER PAGE ID == BOOT ROM PAGE + LD L,1 ; BOOT DISK UNIT IS ROM (UNIT ID = 1) + LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY + RST 08 ; CALL UNA +; + ; LAUNCH IMAGE W/ USER BANK ACTIVE + ; NOTE: UNA EXEC CHAIN CALL USES ADDRESS ON TOS + CALL NEWLINE2 + LD DE,BID_USR ; TARGET BANK ID + PUSH DE ; ... ON STACK + ;DI ; ENTER WITH INTS DISABLED + JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN +#ELSE +; +; NOTE: CHECK FOR SPECIAL CASE WHERE SOURCE BANK IS BID_CUR. IN THIS CASE +; WE COPY THE IMAGE FROM THE BANK THAT WE ARE CURRENTLY RUNNING IN. THIS +; IS DONE TO SUPPORT THE APPBOOT AND IMGBOOT MODES AS DEFINED IN HBIOS. +; IN THE CASE OF THESE MODES IT IS INTENDED THAT THE IMAGES BE LOADED +; FROM THE CURRENT RAM BANK AND NOT FROM THEIR NORMAL ROM LOCATIONS. +; + ; COPY IMAGE TO IT'S RUNNING LOCATION + POP DE ; GET BANKS (E=SRC, D=DEST) + POP HL ; GET IMAGE SIZE + LD A,E ; SOURCE BANK TO A + CP BID_CUR ; SPECIAL CASE, BID_CUR? + JR NZ,GOROM2 ; IF NOT, GO RIGHT TO COPY + LD A,(HB_CURBNK) ; GET CURRENT BANK + LD E,A ; AND SUBSTITUE THE VALUE +GOROM2: LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY + RST 08 ; DO IT + POP DE ; GET DEST ADR + POP HL ; GER SOURCE ADR + LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY + RST 08 ; DO IT +; + ; RECORD BOOT INFO + LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA + LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER + LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO + LD L,A ; ... AND SAVE AS BOOT BANK + LD DE,$0100 ; BOOT VOLUME (UNIT, SLICE) + RST 08 +; +#IF (DSKYENABLE) + LD HL,MSG_GO ; POINT TO BOOT MESSAGE + CALL DSKY_SHOWSEG ; DISPLAY MESSAGE +#ENDIF +; + ; LAUNCH IMAGE W/ USER BANK ACTIVE + CALL NEWLINE2 + LD A,BID_USR ; ACTIVATE USER BANK + POP HL ; RECOVER EXEC ADDRESS + ;DI ; ENTER WITH INTS DISABLED + CALL HB_BNKCALL ; AND GO + HALT ; WE SHOULD NEVER RETURN!!! +#ENDIF +; +;================================================================================================== +; DISK BOOT HANDLER +;================================================================================================== +; +GOBOOTDISK: + LD (BL_BOOTID),A ; SAVE INCOMING BOOTID +; + ; SET THE INITIAL BOOT UNIT AND SLICE + ;LD A,(BL_BOOTID) ; GET BOOTID + LD (BL_DEVICE),A ; STORE IT + XOR A ; LU DEFAULTS TO 0 + LD (BL_LU),A ; STORE IT +; +#IF (BIOS == BIOS_WBW) +; + LD A,(BL_INPFLG) ; GET INPUT FLAG + CP 1 ; DSKY? + JR Z,GOBOOTDISK1 ; IF SO, SLICE 0 IS ASSUMED +; + LD A,(BL_DEVICE) ; GET BOOT DEVICE + LD C,A ; PUT IN C + LD B,BF_DIODEVICE ; HBIOS: DIO DEVICE FUNC + RST 08 + LD A,D ; DEVICE TYPE TO A + CP DIODEV_IDE ; HARD DISK DEVICE? + JR C,GOBOOTDISK1 ; NOT SLICE WORTHY, SKIP AHEAD +; + LD DE,STR_SLICESEL ; SLICE SELECTION STRING + CALL WRITESTR ; DISPLAY IT + CALL CINUC ; GET THE KEY + CALL COUT ; ECHO KEY +; + LD DE,STR_INVALID ; SETUP IN CASE OF INVALID + CP 13 ; ENTER? + JR Z,GOBOOTDISK1 ; IF SO, DONE + CP '0' ; START OF RANGE? + JP C,MENU ; BACK TO MENU IF TOO LOW + CP '9' + 1 ; END OF RANGE + JP NC,MENU ; BACK TO MENU IF TOO HIGH + SUB '0' ; CONVERT TO BINARY + LD (BL_LU),A ; AND SAVE IT +GOBOOTDISK1: +; +#ENDIF +; + LD DE,STR_BOOTDISK + CALL WRITESTR + LD A,(BL_DEVICE) + CALL PRTDECB + LD DE,STR_BOOTDISK1 + CALL WRITESTR + LD A,(BL_LU) + CALL PRTDECB + PRTS("...$") +#IF (DSKYENABLE) + LD HL,MSG_LOAD ; POINT TO LOAD MESSAGE + CALL DSKY_SHOWSEG ; DISPLAY MESSAGE +#ENDIF +; + LD DE,STR_BOOTREAD ; DISK BOOT MESSAGE + CALL WRITESTR ; PRINT IT +; +#IF (BIOS == BIOS_UNA) + LD A,(BL_BOOTID) ; GET BOOT DEVICE ID + LD B,A ; MOVE TO B +; + ; LOAD SECTOR 2 (BOOT INFO) + LD C,$41 ; UNA FUNC: SET LBA + LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO + LD HL,2 ; LOAD STARTING INFO SECTOR 2 + RST 08 ; SET LBA + JP NZ,DB_ERR ; HANDLE ERROR +; + LD C,$42 ; UNA FUNC: READ SECTORS + LD DE,BL_INFOSEC ; DEST OF CPM IMAGE + LD L,1 ; SECTORS TO READ + RST 08 ; DO READ + JP NZ,DB_ERR ; HANDLE ERROR +#ELSE + ; CHECK FOR VALID DRIVE LETTER + LD A,(BL_BOOTID) ; BOOT DEVICE TO A + PUSH AF ; SAVE BOOT DEVICE + LD B,BF_SYSGET + LD C,BF_SYSGET_DIOCNT + RST 08 ; E := DISK UNIT COUNT + POP AF ; RESTORE BOOT DEVICE + CP E ; CHECK MAX (INDEX - COUNT) + JP NC,DB_NODISK ; HANDLE INVALID SELECTION +; + ; SENSE MEDIA + LD A,(BL_DEVICE) ; GET DEVICE/UNIT + LD C,A ; STORE IN C + LD B,BF_DIOMEDIA ; DRIVER FUNCTION = DISK MEDIA + LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY + RST 08 ; CALL HBIOS + JP NZ,DB_ERR ; HANDLE ERROR +; + ; SEEK TO SECTOR 2 OF LU + LD A,(BL_LU) ; GET LU SPECIFIED + LD E,A ; LU INDEX + LD H,65 ; 65 TRACKS PER LU + CALL MULT8 ; HL := H * E + LD DE,$02 ; HEAD 0, SECTOR 2 + LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL + LD A,(BL_DEVICE) ; GET BOOT DISK UNIT + LD C,A ; PUT IN C + RST 08 ; DO IT + JP NZ,DB_ERR ; HANDLE ERROR +; + ; READ + LD B,BF_DIOREAD ; FUNCTION IN B + LD A,(BL_DEVICE) ; GET BOOT DISK UNIT + LD C,A ; PUT IN C + LD HL,BL_INFOSEC ; READ INTO INFO SEC BUFFER + LD D,BID_USR ; USER BANK ; + LD E,1 ; TRANSFER ONE SECTOR + RST 08 ; DO IT + JP NZ,DB_ERR ; HANDLE ERROR +; +#ENDIF +; + ; CHECK SIGNATURE + LD DE,(BB_SIG) ; GET THE SIGNATURE + LD A,$A5 ; FIRST BYTE SHOULD BE $A5 + CP D ; COMPARE + JP NZ,DB_NOBOOT ; ERROR IF NOT EQUAL + LD A,$5A ; SECOND BYTE SHOULD BE $5A + CP E ; COMPARE + JP NZ,DB_NOBOOT ; ERROR IS NOT EQUAL +; + ; PRINT CPMLOC VALUE + PRTS("\r\nLoc=$") + LD BC,(BB_CPMLOC) + CALL PRTHEXWORD +; + ; PRINT CPMEND VALUE + PRTS(" End=$") + LD BC,(BB_CPMEND) + CALL PRTHEXWORD +; + ; PRINT CPMENT VALUE + PRTS(" Ent=$") + LD BC,(BB_CPMENT) + CALL PRTHEXWORD +; + ; PRINT DISK LABEL + PRTS(" Label=$") + LD DE,BB_LABEL ; if it is there, then a printable + LD A,(BB_TERM) ; Display Disk Label if Present + CP '$' ; (dwg 2/7/2012) + CALL Z,WRITESTR ; label is there as well even if spaces. +; + LD DE,STR_LOADING ; LOADING MESSAGE + CALL WRITESTR ; PRINT IT +; + ; COMPUTE NUMBER OF SECTORS TO LOAD + LD HL,(BB_CPMEND) ; HL := END + LD DE,(BB_CPMLOC) ; DE := START + OR A ; CLEAR CARRY + SBC HL,DE ; HL := LENGTH TO LOAD + LD A,H ; DETERMINE 512 BYTE SECTOR COUNT + RRA ; ... BY DIVIDING MSB BY TWO + LD (BL_COUNT),A ; ... AND SAVE IT +; +#IF (BIOS == BIOS_UNA) +; + ; START OS LOAD AT SECTOR 3 + LD C,$41 ; UNA FUNC: SET LBA + LD A,(BL_BOOTID) ; GET BOOT DEVICE ID + LD B,A ; MOVE TO B + LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO + LD HL,3 ; LOAD STARTING INFO SECTOR 2 + RST 08 ; SET LBA + JP NZ,DB_ERR ; HANDLE ERROR +; + ; READ OS IMAGE INTO MEMORY + LD C,$42 ; UNA FUNC: READ SECTORS + LD A,(BL_BOOTID) ; GET BOOT DEVICE ID + LD B,A ; MOVE TO B + LD DE,(BB_CPMLOC) ; DEST OF CPM IMAGE + LD A,(BL_COUNT) ; GET SECTORS TO READ + LD L,A ; SECTORS TO READ + RST 08 ; DO READ + JP NZ,DB_ERR ; HANDLE ERROR +; + ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT + LD DE,-1 ; BOOT ROM PAGE, -1 FOR N/A + LD A,(BL_BOOTID) ; GET BOOT DISK UNIT ID + LD L,A ; PUT IN L + LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY + RST 08 ; CALL UNA + JP NZ,DB_ERR ; HANDLE ERROR +; + ; JUMP TO COLD BOOT ENTRY + LD HL,(BB_CPMENT) ; GET THE ENTRY POINT + PUSH HL ; PUT ON STACK FOR UNA CHAIN FUNC + LD DE,BID_USR ; TARGET BANK ID IS USER BANK + PUSH DE ; PUT ON STACK FOR UNA CHAIN FUNC + ;DI ; ENTER WITH INTS DISABLED + JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN +; +#ELSE +; + ; READ OS IMAGE INTO MEMORY + LD B,BF_DIOREAD ; FUNCTION IN B + LD A,(BL_DEVICE) ; GET BOOT DISK UNIT + LD C,A ; PUT IN C + LD HL,(BB_CPMLOC) ; LOAD ADDRESS + LD D,BID_USR ; USER BANK + LD A,(BL_COUNT) ; GET SECTORS TO READ + LD E,A ; NUMBER OF SECTORS TO LOAD + RST 08 + JP NZ,DB_ERR ; HANDLE ERRORS +; + ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT + LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER + LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO + LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA + LD L,A ; ... AND SAVE AS BOOT BANK + LD A,(BL_DEVICE) ; LOAD BOOT DEVICE/UNIT + LD D,A ; SAVE IN D + LD A,(BL_LU) ; LOAD BOOT LU + LD E,A ; SAVE IN E + RST 08 + JP NZ,DB_ERR ; HANDLE ERRORS +; +#IF (DSKYENABLE) + LD HL,MSG_GO ; POINT TO BOOT MESSAGE + CALL DSKY_SHOWSEG ; DISPLAY MESSAGE +#ENDIF +; + ; JUMP TO COLD BOOT ENTRY + LD A,BID_USR ; ACTIVATE USER BANK + LD HL,(BB_CPMENT) ; OS ENTRY ADDRESS + ;DI ; ENTER WITH INTS DISABLED + CALL HB_BNKCALL ; AND GO + HALT ; WE SHOULD NEVER RETURN!!! +; +#ENDIF +; +DB_NODISK: + ; SELDSK DID NOT LIKE DRIVE SELECTION + LD DE,STR_NODISK + JP MENU +; +DB_NOBOOT: + ; DISK IS NOT BOOTABLE + LD DE,STR_NOBOOT + JP MENU +; +DB_ERR: + ; I/O ERROR DURING BOOT ATTEMPT + LD DE,STR_BOOTERR + JP MENU +; +#IF (BIOS == BIOS_UNA) +; +; PRINT LIST OF ALL DRIVES UNDER UNA +; +PRTALL: + LD B,0 ; START WITH UNIT 0 +; +PRTALL1: ; LOOP THRU ALL UNITS AVAILABLE + LD C,$48 ; UNA FUNC: GET DISK TYPE + LD L,0 ; PRESET UNIT COUNT TO ZERO + RST 08 ; CALL UNA, B IS ASSUMED TO BE UNTOUCHED!!! + LD A,L ; UNIT COUNT TO A + OR A ; PAST END? + RET Z ; WE ARE DONE + PUSH BC ; SAVE UNIT + CALL PRTDRV ; PROCESS THE UNIT + POP BC ; RESTORE UNIT + INC B ; NEXT UNIT + JR PRTALL1 ; LOOP +; +; PRINT THE UNA UNIT INFO +; ON INPUT B HAS UNIT +; +PRTDRV: + PUSH BC ; SAVE UNIT + PUSH DE ; SAVE DISK TYPE + LD A,'(' ; NEWLINE AND SPACING + CALL COUT ; PRINT IT + LD A,B ; DRIVE LETTER TO A + CALL PRTDECB + LD A,')' ; DRIVE LETTER COLON + CALL COUT ; PRINT IT + POP DE ; RECOVER DISK TYPE + LD A,D ; DISK TYPE TO A + CP $40 ; RAM/ROM? + JR Z,PRTDRV1 ; HANDLE RAM/ROM + LD DE,DEVIDE ; ASSUME IDE + CP $41 ; IDE? + JR Z,PRTDRV2 ; PRINT IT + LD DE,DEVPPIDE ; ASSUME PPIDE + CP $42 ; PPIDE? + JR Z,PRTDRV2 ; PRINT IT + LD DE,DEVSD ; ASSUME SD + CP $43 ; SD? + JR Z,PRTDRV2 ; PRINT IT + LD DE,DEVDSD ; ASSUME DSD + CP $44 ; DSD? + JR Z,PRTDRV2 ; PRINT IT + LD DE,DEVUNK ; OTHERWISE UNKNOWN + JR PRTDRV2 +; +PRTDRV1: ; HANDLE RAM/ROM + LD C,$45 ; UNA FUNC: GET DISK INFO + LD DE,BL_INFOSEC ; 512 BYTE BUFFER + RST 08 ; CALL UNA + BIT 7,B ; TEST RAM DRIVE BIT + LD DE,DEVROM ; ASSUME ROM + JR Z,PRTDRV2 ; IF SO, PRINT IT + LD DE,DEVRAM ; OTHERWISE RAM + JR PRTDRV2 ; PRINT IT +; +PRTDRV2: ; PRINT DEVICE + POP BC ; RECOVER UNIT + CALL WRITESTR ; PRINT DEVICE NAME + LD A,B ; UNIT TO A + ADD A,'0' ; MAKE IT PRINTABLE NUMERIC + CALL COUT ; PRINT IT + LD A,',' ; DEVICE NAME SEPARATOR + CALL COUT ; PRINT IT + RET ; DONE +; +DEVRAM .DB "RAM$" +DEVROM .DB "ROM$" +DEVIDE .DB "IDE$" +DEVPPIDE .DB "PPIDE$" +DEVSD .DB "SD$" +DEVDSD .DB "DSD$" +DEVUNK .DB "UNK$" +; +#ELSE +; +; PRINT LIST OF ALL DRIVES +; +PRTALL: +; + LD B,BF_SYSGET + LD C,BF_SYSGET_DIOCNT + RST 08 ; E := DISK UNIT COUNT + LD B,E ; COUNT TO B + LD A,B ; COUNT TO A + OR A ; SET FLAGS + RET Z ; BAIL OUT IF ZERO + LD C,0 ; INIT DEVICE INDEX +; +PRTALL1: + LD A,'(' ; FORMATTING + CALL COUT ; PRINT IT + LD A,C ; INDEX TO A + CALL PRTDECB + LD A,')' ; FORMATTING + CALL COUT ; PRINT IT + PUSH BC ; SAVE LOOP CONTROL + LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO + RST 08 ; CALL HBIOS + CALL PRTDRV ; PRINT IT + POP BC ; RESTORE LOOP CONTROL + INC C ; BUMP INDEX + DJNZ PRTALL1 ; LOOP AS NEEDED + RET ; DONE +; +; PRINT THE DRIVER DEVICE/UNIT INFO +; ON INPUT D HAS DRIVER ID, E HAS DRIVER MODE/UNIT +; DESTROY NO REGISTERS OTHER THAN A +; +PRTDRV: + PUSH DE ; PRESERVE DE + PUSH HL ; PRESERVE HL + LD A,D ; LOAD DEVICE/UNIT + RRCA ; ROTATE DEVICE + RRCA ; ... BITS + RRCA ; ... INTO + RRCA ; ... LOWEST 4 BITS + AND $0F ; ISOLATE DEVICE BITS + ADD A,A ; MULTIPLE BY TWO FOR WORD TABLE + LD HL,DEVTBL ; POINT TO START OF DEVICE NAME TABLE + CALL ADDHLA ; ADD A TO HL TO POINT TO TABLE ENTRY + LD A,(HL) ; DEREFERENCE HL TO LOC OF DEVICE NAME STRING + INC HL ; ... + LD D,(HL) ; ... + LD E,A ; ... + CALL WRITESTR ; PRINT THE DEVICE NMEMONIC + POP HL ; RECOVER HL + POP DE ; RECOVER DE + LD A,E ; LOAD DRIVER MODE/UNIT + AND $0F ; ISOLATE UNIT + CALL PRTDECB ; PRINT IT + CALL PC_SPACE ; FORMATTING + ;LD A,E ; LOAD LU + ;CALL PRTDECB ; PRINT IT + RET +; +DEVTBL: ; DEVICE TABLE + .DW DEV00, DEV01, DEV02, DEV03 + .DW DEV04, DEV05, DEV06, DEV07 + .DW DEV08, DEV09, DEV10, DEV11 + .DW DEV12, DEV13, DEV14, DEV15 +; +DEVUNK .DB "???$" +DEV00 .DB "MD$" +DEV01 .DB "FD$" +DEV02 .DB "RAMF$" +DEV03 .DB "IDE$" +DEV04 .DB "ATAPI$" +DEV05 .DB "PPIDE$" +DEV06 .DB "SD$" +DEV07 .DB "PRPSD$" +DEV08 .DB "PPPSD$" +DEV09 .DB "HDSK$" +DEV10 .EQU DEVUNK +DEV11 .EQU DEVUNK +DEV12 .EQU DEVUNK +DEV13 .EQU DEVUNK +DEV14 .EQU DEVUNK +DEV15 .EQU DEVUNK +; +#ENDIF +; +;================================================================================================== +; STRINGS +;================================================================================================== +; +STR_BANNER .DB "\r\n\r\n", PLATFORM_NAME, " Boot Loader$" +STR_BOOTSEL .DB "\r\n\r\nBoot Selection? $" +STR_SLICESEL .DB " Slice(0-9)[0]? $" +STR_BOOTDISK .DB "\r\n\r\nBooting Disk Unit $" +STR_BOOTDISK1 .DB ", Slice $" +STR_BOOTROM .DB "\r\n\r\nLoading $" +STR_REBOOT .DB "\r\n\r\nRestarting System...$" +STR_INVALID .DB "\r\n\r\n*** Invalid Selection ***$" +STR_NODISK .DB "\r\n\r\nNo disk!$" +STR_NOBOOT .DB "\r\n\r\nDisk not bootable!$" +STR_BOOTERR .DB "\r\n\r\nBoot failure!$" +STR_BOOTREAD .DB "\r\n\r\nReading disk information...$" +STR_LOADING .DB "\r\n\r\nLoading...$" +; +#IF (DSKYENABLE) +MSG_SEL .DB $FF,$9D,$9D,$8F,$EC,$80,$80,$80 ; "Boot? " +MSG_BOOT .DB $FF,$9D,$9D,$8F,$00,$00,$00,$80 ; "Boot... " +MSG_LOAD .DB $8B,$9D,$FD,$BD,$00,$00,$00,$80 ; "Load... " +MSG_GO .DB $DB,$9D,$00,$00,$00,$80,$80,$80 ; "Go... " +#ENDIF - ret -; -; Device list -; -devlst: - ld hl,str_devlst ; device list header string - call pstr ; display it - jp prtall ; do it -; -; Restart system -; -reboot: - ld hl,str_reboot ; point to message - call pstr ; print it - call LDELAY ; wait for message to display -; -#if (BIOS == BIOS_WBW) -; -#if (DSKYENABLE) - ld hl,msg_boot ; point to boot message - call DSKY_SHOWSEG ; display message -#endif -; - ; switch to rom bank 0 and jump to address 0 - ld a,BID_BOOT ; boot bank - ld hl,0 ; address zero - call HB_BNKCALL ; does not return -#endif -; -#if (BIOS == BIOS_UNA) - ; switch to rom bank 0 and jump to address 0 - ld bc,$01FB ; UNA func = set bank - ld de,0 ; ROM bank 0 - rst 08 ; do it - jp 0 ; jump to restart address -#endif -; -;======================================================================= -; Load and run a ROM application, IX=ROM app table entry -;======================================================================= -; -romload: -; - ; Notify user - ld hl,str_load - call pstr - ld l,(ix+ra_name) - ld h,(ix+ra_name+1) - call pstr -; -#if (DSKYENABLE) - ld hl,msg_load ; point to load message - call DSKY_SHOWSEG ; display message -#endif -; -#if (BIOS == BIOS_WBW) -; - ; Copy image to it's running location - ld a,(ix+ra_bnk) ; get image source bank id - cp bid_cur ; special value? - jr nz,romload1 ; if not, continue - ld a,(bid_ldr) ; else substitute -romload1: - push af ; save source bank - ld e,a ; source bank to E - ld d,BID_USR ; dest is user bank - ld l,(ix+ra_siz) ; HL := image size - ld h,(ix+ra_siz+1) ; ... - ld b,BF_SYSSETCPY ; HBIOS func: setup bank copy - rst 08 ; do it - ld a,'.' ; dot character - call cout ; show progress - ld e,(ix+ra_dest) ; DE := run dest adr - ld d,(ix+ra_dest+1) ; ... - ld l,(ix+ra_src) ; HL := image source adr - ld h,(ix+ra_src+1) ; ... - ld b,BF_SYSBNKCPY ; HBIOS func: bank copy - rst 08 ; do it - ld a,'.' ; dot character - call cout ; show progress -; - ; Record boot information - pop af ; recover source bank - ld l,a ; L := source bank - ld de,$0100 ; boot volume/slice - ld b,BF_SYSSET ; HBIOS func: system set - ld c,BF_SYSSET_BOOTINFO ; BBIOS subfunc: boot info - rst 08 ; do it - ld a,'.' ; dot character - call cout ; show progress -; -#endif -; -#if (BIOS == BIOS_UNA) -; -; Note: UNA has no interbank memory copy, so we can only load -; images from the current bank. We switch to the original bank -; use a simple ldir to relocate the image, then switch back to the -; user bank to launch. This will only work if the images are in -; the lower 32K and the relocation adr is in the upper 32K. -; - ; Switch to original bank - ld bc,$01FB ; UNA func: set bank - ld de,(bid_ldr) ; select user bank - rst 08 ; do it - ld a,'.' ; dot character - call cout ; show progress -; - ; Copy image to running location - ld l,(ix+ra_src) ; HL := image source adr - ld h,(ix+ra_src+1) ; ... - ld e,(ix+ra_dest) ; DE := run dest adr - ld d,(ix+ra_dest+1) ; ... - ld c,(ix+ra_siz) ; BC := image size - ld b,(ix+ra_siz+1) ; ... - ldir ; copy image - ld a,'.' ; dot character - call cout ; show progress -; - ; Switch back to user bank - ld bc,$01FB ; UNA func: set bank - ld de,(bid_ldr) ; select user bank - rst 08 ; do it - ld a,'.' ; dot character - call cout ; show progress -; - ; Record boot information - ld de,(bid_ldr) ; original bank - ld l,$01 ; encoded boot slice/unit - ld bc,$01FC ; UNA func: set bootstrap hist - rst 08 ; call una -; -#endif -; -#if (DSKYENABLE) - ld hl,msg_go ; point to go message - call DSKY_SHOWSEG ; display message -#endif -; - ld l,(ix+ra_ent) ; HL := app entry address - ld h,(ix+ra_ent+1) ; ... - jp (hl) ; go -; -;======================================================================= -; Boot disk unit/slice -;======================================================================= -; -diskboot: -; - ; Notify user - ld hl,str_boot1 - call pstr - ld a,(bootunit) - call PRTDECB - ld hl,str_boot2 - call pstr - ld a,(bootslice) - call PRTDECB -; -#if (DSKYENABLE) - ld hl,msg_load ; point to load message - call DSKY_SHOWSEG ; display message -#endif -; -#if (BIOS == BIOS_WBW) -; - ; Check that drive actually exists - ld c,a ; put in C for func call - ld b,BF_SYSGET ; HBIOS func: sys get - ld c,BF_SYSGET_DIOCNT ; HBIOS sub-func: disk count - rst 08 ; do it, E=disk count - ld a,(bootunit) ; get boot disk unit - cp e ; compare to count - jp nc,err_nodisk ; handle no disk err -; - ; If non-zero slice requested, confirm device can handle it - ld a,(bootslice) ; get slice - or a ; set flags - jr z,diskboot1 ; slice 0, skip slice check - ld a,(bootunit) ; get disk unit - ld c,a ; put in C for func call - ld b,BF_DIODEVICE ; HBIOS func: device info - rst 08 ; do it - ld a,d ; device type to A - cp DIODEV_IDE ; IDE is max slice device type - jp c,err_noslice ; no such slice, handle err -; -diskboot1: - ; Sense media - ld a,(bootunit) ; get boot disk unit - ld c,a ; put in C for func call - ld b,BF_DIOMEDIA ; HBIOS func: media - ld e,1 ; enable media check/discovery - rst 08 ; do it - jp nz,err_diskio ; handle error - call pdot ; show progress -; - ; Seek to boot info sector, third sector - ld a,(bootslice) ; get boot slice - ld e,a ; move to E for mult - ld h,65 ; 65 tracks per slice - call MULT8 ; hl := h * e - ld de,$0002 ; head 0, sector 2 - ld b,BF_DIOSEEK ; HBIOS func: seek - ld a,(bootunit) ; get boot disk unit - ld c,a ; put in C - rst 08 ; do it - jp nz,err_diskio ; handle error - call pdot ; show progress -; - ; Read sector into local buffer - ld b,BF_DIOREAD ; HBIOS func: disk read - ld a,(bootunit) ; get boot disk unit - ld c,a ; put in C for func call - ld hl,bl_infosec ; read into info sec buffer - ld d,BID_USR ; user bank - ld e,1 ; transfer one sector - rst 08 ; do it - jp nz,err_diskio ; handle error - call pdot ; show progress -; -#endif -; -#if (BIOS == BIOS_UNA) -; - ; Check that drive actually exists - ld a,(bootunit) ; get disk unit to boot - ld b,a ; put in B for func call - ld c,$48 ; UNA func: get disk type - rst 08 ; call UNA, B preserved - jp nz,err_nodisk ; handle error if no such disk -; - ; If non-zero slice requested, confirm device can handle it - ld a,(bootslice) ; get slice - or a ; set flags - jr z,diskboot1 ; slice 0, skip slice check - ld a,d ; disk type to A - cp $41 ; IDE? - jr z,diskboot1 ; if so, OK - cp $42 ; PPIDE? - jr z,diskboot1 ; if so, OK - cp $43 ; SD? - jr z,diskboot1 ; if so, OK - cp $44 ; DSD? - jr z,diskboot1 ; if so, OK - jp err_noslice ; no such slice, handle err -; -diskboot1: - ; Add slice offset - ld a,(bootslice) ; get boot slice, A is loop cnt - ld hl,0 ; DE:HL is LBA - ld de,0 ; ... initialize to zero - ld bc,16640 ; sectors per slice -diskboot2: - or a ; set flags to check loop ctr - jr z,diskboot4 ; done if counter exhausted - add hl,bc ; add one slice to low word - jr nc,diskboot3 ; check for carry - inc de ; if so, bump high word -diskboot3: - dec a ; dec loop downcounter - jr diskboot2 ; and loop -; -diskboot4: - ld (loadlba),hl ; save lba, low word - ld (loadlba+2),de ; save lba, high word -; - ; Seek to boot info sector, third sector - ld bc,2 ; sector offset - add hl,bc ; add to LBA value low word - jr nc,diskboot5 ; check for carry - inc de ; if so, bump high word -diskboot5: - ld a,(bootunit) ; get disk unit to boot - ld b,a ; put in B for func call - ld c,$41 ; UNA func: set lba - rst 08 ; set lba - jp nz,err_api ; handle error - call pdot ; show progress -; - ; Read sector into local buffer - ld c,$42 ; UNA func: read sectors - ld de,bl_infosec ; dest of cpm image - ld l,1 ; sectors to read - rst 08 ; do read - jp nz,err_diskio ; handle error -; -#endif -; - ; Check signature - ld de,(bb_sig) ; get signature read - ld a,$A5 ; expected value of first byte - cp d ; compare - jp nz,err_sig ; handle error - ld a,$5A ; expected value of second byte - cp e ; compare - jp nz,err_sig ; handle error -; - ; Print disk boot info - ; Volume "xxxxxxx" (0xXXXX-0xXXXX, entry @ 0xXXXX) - ld hl,str_binfo1 ; load string - call pstr ; print - push hl ; save string ptr - ld hl,bb_label ; point to label - call pvol ; print it - pop hl ; restore string ptr - call pstr ; print - push hl ; save string ptr - ld bc,(bb_cpmloc) ; get load loc - call PRTHEXWORD ; print it - pop hl ; restore string ptr - call pstr ; print - push hl ; save string ptr - ld bc,(bb_cpmend) ; get load end - call PRTHEXWORD ; print it - pop hl ; restore string ptr - call pstr ; print - push hl ; save string ptr - ld bc,(bb_cpment) ; get load end - call PRTHEXWORD ; print it - pop hl ; restore string ptr - call pstr ; print -; - ; Compute number of sectors to load - ld hl,(bb_cpmend) ; hl := end - ld de,(bb_cpmloc) ; de := start - or a ; clear carry - sbc hl,de ; hl := length to load - ld a,h ; determine 512 byte sector count - rra ; ... by dividing msb by two - ld (loadcnt),a ; ... and save it - call pdot ; show progress -; -#if (BIOS == BIOS_WBW) -; - ; Load image into memory - ld b,BF_DIOREAD ; HBIOS func: read sectors - ld a,(bootunit) ; get boot disk unit - ld c,a ; put in C - ld hl,(bb_cpmloc) ; load address - ld d,BID_USR ; user bank - ld a,(loadcnt) ; get sectors to read - ld e,a ; number of sectors to load - rst 08 ; do it - jp nz,err_diskio ; handle errors - call pdot ; show progress -; - ; Record boot unit/slice - ld b,BF_SYSSET ; hb func: set hbios parameter - ld c,BF_SYSSET_BOOTINFO ; hb subfunc: set boot info - ld a,(bid_ldr) ; original bank is boot bank - ld l,a ; ... and save as boot bank - ld a,(bootunit) ; load boot unit - ld d,a ; save in D - ld a,(bootslice) ; load boot slice - ld e,a ; save in E - rst 08 - jp nz,err_api ; handle errors - call pdot ; show progress -; -#endif -; -#if (BIOS == BIOS_UNA) -; - ; Start os load at sector 3 - ld hl,(loadlba) ; low word of saved LBA - ld de,(loadlba+2) ; high word of saved LBA - ld bc,3 ; offset for sector 3 - add hl,bc ; apply it - jr nc,diskboot6 ; check for carry - inc de ; bump high word if so -diskboot6: - ld c,$41 ; UNA func: set lba - ld a,(bootunit) ; get boot disk unit - ld b,a ; move to B - rst 08 ; set lba - jp nz,err_api ; handle error -; - ; Read OS image into memory - ld c,$42 ; UNA func: read sectors - ld a,(bootunit) ; get boot disk unit - ld b,a ; move to B - ld de,(bb_cpmloc) ; dest of cpm image - ld a,(loadcnt) ; get sectors to read - ld l,a ; sectors to read - rst 08 ; do read - jp nz,err_diskio ; handle error - call pdot ; show progress -; - ; Record boot unit/slice - ; UNA provides only a single byte to record the boot unit - ; so we encode the unit/slice into one byte by using the - ; high nibble for unit and low nibble for slice. - ld de,-1 ; boot rom page, -1 for n/a - ld a,(bootslice) ; get boot slice - and $0F ; 4 bits only - rlca ; rotate to high bits - rlca ; ... - rlca ; ... - rlca ; ... - ld l,a ; put in L - ld a,(bootunit) ; get boot disk unit - and $0F ; 4 bits only - or l ; combine - ld l,a ; back to L - ld bc,$01FC ; UNA func: set bootstrap hist - rst 08 ; call UNA - jp nz,err_api ; handle error - call pdot ; show progress -; -#endif -; -#if (DSKYENABLE) - ld hl,msg_go ; point to go message - call DSKY_SHOWSEG ; display message -#endif -; - ; Jump to entry vector - ld hl,(bb_cpment) ; get entry vector - jp (hl) ; and go there -; -;======================================================================= -; Utility functions -;======================================================================= -; -; Clear LEDs -; -clrled: -#if (BIOS == BIOS_WBW) - #if (DIAGENABLE) - xor a ; zero accum - out (DIAGPORT),a ; clear diag leds - #endif - #if (LEDENABLE) - or $FF ; led is inverted - out (LEDPORT),a ; clear led - #endif -#endif - ret -; -; Print string at HL on console, null terminated -; -pstr: - ld a,(hl) ; get next character - or a ; set flags - inc hl ; bump pointer regardless - ret z ; done if null - call cout ; display character - jr pstr ; loop till done -; -; Print volume label string at HL, '$' terminated, 16 chars max -; -pvol: - ld b,16 ; init max char downcounter -pvol1: - ld a,(hl) ; get next character - cp '$' ; set flags - inc hl ; bump pointer regardless - ret z ; done if null - call cout ; display character - djnz pvol1 ; loop till done - ret ; hit max of 16 chars -; -; Start a newline on console (cr/lf) -; -nl2: - call nl ; double newline -nl: - ld a,cr ; cr - call cout ; send it - ld a,lf ; lf - jp cout ; send it and return -; -; Print a dot on console -; -pdot: - push af - ld a,'.' - call cout - pop af - ret -; -; Read a string on the console -; -; Uses address $0080 in page zero for buffer -; Input is zero terminated -; -rdln: - ld de,cmdbuf ; init buffer address ptr -rdln_nxt: - call cin ; get a character - cp bs ; backspace? - jr z,rdln_bs ; handle it if so - cp cr ; return? - jr z,rdln_cr ; handle it if so -; - ; check for non-printing characters - cp ' ' ; first printable is space char - jr c,rdln_bel ; too low, beep and loop - cp '~'+1 ; last printable char - jr nc,rdln_bel ; too high, beep and loop -; - ; need to check for buffer overflow here!!! - ld hl,cmdbuf+cmdmax ; max cmd length - or a ; clear carry - sbc hl,de ; test for max - jr z,rdln_bel ; at max, beep and loop -; - ; good to go, echo and store character - call cout ; echo character input - ld (de),a ; save in buffer - inc de ; inc buffer ptr - jr rdln_nxt ; loop till done -; -rdln_bs: - ld hl,cmdbuf ; start of buffer - or a ; clear carry - sbc hl,de ; subtract from cur buf ptr - jr z,rdln_bel ; at buf start, just beep - ld hl,str_bs ; backspace sequence - call pstr ; send it - dec de ; backup buffer pointer - jr rdln_nxt ; and loop -; -rdln_bel: - ld a,bel ; Bell characters - call cout ; send it - jr rdln_nxt ; and loop -; -rdln_cr: - xor a ; null to A - ld (de),a ; store terminator - ret ; and return -; -; Skip whitespace at buffer adr in DE, returns with first -; non-whitespace character in A. -; -skipws: - ld a,(de) ; get next char - cp ' ' ; blank? - ret nz ; nope, done - inc de ; bump buffer pointer - jr skipws ; and loop ; -; Uppercase character in A -; -upcase: - cp 'a' ; below 'a'? - ret c ; if so, nothing to do - cp 'z'+1 ; above 'z'? - ret nc ; if so, nothing to do - and ~$20 ; convert character to lower - ret ; done -; -; Get numeric chars at DE and convert to number returned in A -; Carry flag set on overflow -; -getnum: - ld c,0 ; C is working register -getnum1: - ld a,(de) ; get the active char - cp '0' ; compare to ascii '0' - jr c,getnum2 ; abort if below - cp '9' + 1 ; compare to ascii '9' - jr nc,getnum2 ; abort if above -; - ; valid digit, add new digit to C - ld a,c ; get working value to A - rlca ; multiply by 10 - ret c ; overflow, return with carry set - rlca ; ... - ret c ; overflow, return with carry set - add a,c ; ... - ret c ; overflow, return with carry set - rlca ; ... - ret c ; overflow, return with carry set - ld c,a ; back to C - ld a,(de) ; get new digit - sub '0' ; make binary - add a,c ; add in working value - ret c ; overflow, return with carry set - ld c,a ; back to C -; - inc de ; bump to next char - jr getnum1 ; loop -; -getnum2: ; return result - ld a,c ; return result in A - or a ; with flags set, CF is cleared - ret -; -; Is character in A numberic? NZ if not -; -isnum: - cp '0' ; compare to ascii '0' - jr c,isnum1 ; abort if below - cp '9' + 1 ; compare to ascii '9' - jr nc,isnum1 ; abort if above - cp a ; set Z - ret -isnum1: - or $FF ; set NZ - ret ; and done -; -;======================================================================= -; Console character I/O helper routines (registers preserved) -;======================================================================= -; -#if (BIOS == BIOS_WBW) -; -; Output character from A -; -cout: - ; Save all incoming registers - push af - push bc - push de - push hl -; - ; Output character to console via HBIOS - ld e,a ; output char to E - ld c,CIO_CONSOLE ; console unit to C - ld b,BF_CIOOUT ; HBIOS func: output char - rst 08 ; HBIOS outputs character -; - ; Restore all registers - pop hl - pop de - pop bc - pop af - ret -; -; Input character to A -; -cin: - ; Save incoming registers (AF is output) - push bc - push de - push hl -; - ; Input character from console via hbios - ld c,CIO_CONSOLE ; console unit to c - ld b,BF_CIOIN ; HBIOS func: input char - rst 08 ; HBIOS reads charactdr - ld a,e ; move character to A for return -; - ; Restore registers (AF is output) - pop hl - pop de - pop bc - ret -; -; Return input status in A (0 = no char, != 0 char waiting) -; -cst: - ; Save incoming registers (AF is output) - push bc - push de - push hl -; - ; Get console input status via HBIOS - ld c,CIO_CONSOLE ; console unit to C - ld b,BF_CIOIST ; HBIOS func: input status - rst 08 ; HBIOS returns status in A -; - ; Restore registers (AF is output) - pop hl - pop de - pop bc - ret -; -#endif -; -#if (BIOS == BIOS_UNA) -; -; Output character from A -; -cout: - ; Save all incoming registers - push af - push bc - push de - push hl -; - ; Output character to console via UBIOS - ld e,a - ld bc,$12 - rst 08 -; - ; Restore all registers - pop hl - pop de - pop bc - pop af - ret -; -; Input character to A -; -cin: - ; Save incoming registers (AF is output) - push bc - push de - push hl -; - ; Input character from console via UBIOS - ld bc,$11 - rst 08 - ld a,e -; - ; Restore registers (AF is output) - pop hl - pop de - pop bc - ret -; -; Return input status in A (0 = no char, != 0 char waiting) -; -cst: - ; Save incoming registers (AF is output) - push bc - push de - push hl -; - ; Get console input status via UBIOS - ld bc,$13 - rst 08 - ld a,e - or a -; - ; Restore registers (AF is output) - pop hl - pop de - pop bc - ret -; -#endif -; -; Generic console I/O -; -CIN .equ cin -COUT .equ cout -CST .equ cst -; -;======================================================================= -; Device inventory display -;======================================================================= -; -; Print list of all drives (WBW) -; -#if (BIOS == BIOS_WBW) -; -prtall: - call nl ; formatting - ld b,BF_SYSGET - ld c,BF_SYSGET_DIOCNT - rst 08 ; E := disk unit count - ld b,e ; count to B - ld a,b ; count to A - or a ; set flags - ret z ; bail out if zero - ld c,0 ; init device index -; -prtall1: - ld hl,str_disk ; prefix string - call pstr ; display it - ld a,c ; index - call PRTDECB ; print it - ld hl,str_on ; separator string - call pstr - push bc ; save loop control - ld b,BF_DIODEVICE ; HBIOS func: report device info - rst 08 ; call HBIOS - call prtdrv ; print it - pop bc ; restore loop control - inc c ; bump index - djnz prtall1 ; loop as needed - ret ; done -; -; Print the device info -; On input D has device type, E has device number -; Destroy no registers other than A -; -prtdrv: - push de ; preserve de - push hl ; preserve HL - ld a,d ; load device/unit - rrca ; rotate device - rrca ; ... bits - rrca ; ... into - rrca ; ... lowest 4 bits - and $0F ; isolate device bits - add a,a ; multiple by two for word table - ld hl,devtbl ; point to start of table - call ADDHLA ; add A to HL for table entry - ld a,(hl) ; deref HL for string adr - inc hl ; ... - ld h,(hl) ; ... - ld l,a ; ... - call pstr ; print the device nmemonic - pop hl ; recover HL - pop de ; recover DE - ld a,e ; device number - call PRTDECB ; print it - ld a,':' ; suffix - call cout ; print it - ret -; -devtbl: ; device table - .dw dev00, dev01, dev02, dev03 - .dw dev04, dev05, dev06, dev07 - .dw dev08, dev09, dev10, dev11 - .dw dev12, dev13, dev14, dev15 -; -devunk .db "???",0 -dev00 .db "MD",0 -dev01 .db "FD",0 -dev02 .db "RAMF",0 -dev03 .db "IDE",0 -dev04 .db "ATAPI",0 -dev05 .db "PPIDE",0 -dev06 .db "SD",0 -dev07 .db "PRPSD",0 -dev08 .db "PPPSD",0 -dev09 .db "HDSK",0 -dev10 .equ devunk -dev11 .equ devunk -dev12 .equ devunk -dev13 .equ devunk -dev14 .equ devunk -dev15 .equ devunk -; -#endif -; -; -; -#if (BIOS == BIOS_UNA) -; -; Print list of all drives (UNA) -; -prtall: - call nl ; formatting - ld b,0 ; start with unit 0 -; -prtall1: ; loop thru all units available - ld c,$48 ; UNA func: get disk type - ld l,0 ; preset unit count to zero - rst 08 ; call UNA, B preserved - ld a,l ; unit count to a - or a ; past end? - ret z ; we are done - push bc ; save unit - call prtdrv ; process the unit - pop bc ; restore unit - inc b ; next unit - jr prtall1 ; loop -; -; print the una unit info -; on input b has unit -; -prtdrv: - push bc ; save unit - push de ; save disk type - ld hl,str_disk ; prefix string - call pstr ; display it - ld a,b ; index - call PRTDECB ; print it - ld a,' ' ; formatting - call cout ; do it - ld a,'=' ; formatting - call cout ; do it - ld a,' ' ; formatting - call cout ; do it - pop de ; recover disk type - ld a,d ; disk type to a - cp $40 ; ram/rom? - jr z,prtdrv1 ; handle ram/rom - ld hl,devide ; assume ide - cp $41 ; ide? - jr z,prtdrv2 ; print it - ld hl,devppide ; assume ppide - cp $42 ; ppide? - jr z,prtdrv2 ; print it - ld hl,devsd ; assume sd - cp $43 ; sd? - jr z,prtdrv2 ; print it - ld hl,devdsd ; assume dsd - cp $44 ; dsd? - jr z,prtdrv2 ; print it - ld hl,devunk ; otherwise unknown - jr prtdrv2 -; -prtdrv1: ; handle ram/rom - ld c,$45 ; una func: get disk info - ld de,bl_infosec ; 512 byte buffer - rst 08 ; call una - bit 7,b ; test ram drive bit - ld hl,devrom ; assume rom - jr z,prtdrv2 ; if so, print it - ld hl,devram ; otherwise ram - jr prtdrv2 ; print it -; -prtdrv2: ; print device - pop bc ; recover unit - call pstr ; print device name - ld a,b ; unit to a - call PRTDECB ; print it - ld a,':' ; device name suffix - call cout ; print it - ret ; done -; -devram .db "RAM",0 -devrom .db "ROM",0 -devide .db "IDE",0 -devppide .db "PPIDE",0 -devsd .db "SD",0 -devdsd .db "DSD",0 -devunk .db "UNK",0 -; -#endif -; -;======================================================================= -; Error handlers -;======================================================================= -; -err_invcmd: - ld hl,str_err_invcmd - jr err -err_nodisk: - ld hl,str_err_nodisk - jr err -; -err_noslice: - ld hl,str_err_noslice - jr err -; -err_diskio: - ld hl,str_err_diskio - jr err -; -err_sig: - ld hl,str_err_sig - jr err -; -err_api: - ld hl,str_err_api - jr err -; -err: - push hl -; ld a,(acmd_act) ; get auto cmd active flag -; or a ; set flags -; call nz,showcmd ; if auto cmd act, show cmd -; ld a,bel ; bel character -; call cout ; beep - ld hl,str_err_prefix - call pstr - pop hl - jp pstr -; -str_err_prefix .db bel,"\r\n\r\n*** ",0 -str_err_invcmd .db "Invalid command",0 -str_err_nodisk .db "Disk unit not available",0 -str_err_noslice .db "Disk unit does not support slices",0 -str_err_diskio .db "Disk I/O failure",0 -str_err_sig .db "No system image on disk",0 -str_err_api .db "Unexpected hardware BIOS API failure",0 -; -;======================================================================= -; Includes -;======================================================================= -; -#define USEDELAY -#include "util.asm" -; -#if (DSKYENABLE) -#define DSKY_KBD -#include "dsky.asm" -#endif -; -;======================================================================= -; Working data storage (initialized) -;======================================================================= -; -acmd .db BOOT_DEFAULT,0 ; auto cmd string -acmd_len .equ $ - acmd ; len of auto cmd -acmd_act .db $FF ; auto cmd active -acmd_to .dw BOOT_TIMEOUT ; auto cmd timeout -; -;======================================================================= -; Strings -;======================================================================= -; -str_banner .db PLATFORM_NAME," Boot Loader",0 -;str_prompt .db "Boot [(H)elp]: ",0 -str_prompt .db "Boot [H=Help]: ",0 -str_bs .db bs,' ',bs,0 -str_reboot .db "\r\n\r\nRestarting System...",0 -str_applst .db "\r\n\r\nROM Applications:",0 -str_devlst .db "\r\n\r\nDevices:",0 -str_invcmd .db "\r\n\r\n*** Invalid Command ***",bel,0 -str_load .db "\r\n\r\nLoading ",0 -str_disk .db "\r\n Disk Unit ",0 -str_on .db " on ",0 -str_boot1 .db "\r\n\r\nBooting Disk Unit ",0 -str_boot2 .db ", Slice ",0 -str_binfo1 .db "\r\n\r\nVolume ",$22,0 -str_binfo2 .db $22," [0x",0 -str_binfo3 .db "-0x",0 -str_binfo4 .db ", entry @ 0x",0 -str_binfo5 .db "]",0 -; -str_help .db "\r\n" - .db "\r\n L: List ROM Applications" - .db "\r\n D: Device Inventory" - .db "\r\n R: Reboot System" - .db "\r\n [.]: Boot Disk Unit/Slice" - .db 0 -; -#if (DSKYENABLE) -msg_sel .db $ff,$9d,$9d,$8f,$ec,$80,$80,$80 ; "boot? " -msg_boot .db $ff,$9d,$9d,$8f,$00,$00,$00,$80 ; "boot... " -msg_load .db $8b,$9d,$fd,$bd,$00,$00,$00,$80 ; "load... " -msg_go .db $db,$9d,$00,$00,$00,$80,$80,$80 ; "go... " -#endif -; -;======================================================================= -; ROM Application Table -;======================================================================= -; -; Macro ra_ent: -; -; WBW UNA -; p1: Application name string adr word (+0) word (+0) -; p2: Console keyboard selection key byte (+2) byte (+2) -; p3: DSKY selection key byte (+3) byte (+3) -; p4: Application image bank byte (+4) word (+4) -; p5: Application image source address word (+5) word (+6) -; p6: Application image dest load address word (+7) word (+8) -; p7: Application image size word (+9) word (+10) -; p8: Application entry address word (+11) word (+12) -; -#if (BIOS == BIOS_WBW) -ra_name .equ 0 -ra_conkey .equ 2 -ra_dskykey .equ 3 -ra_bnk .equ 4 -ra_src .equ 5 -ra_dest .equ 7 -ra_siz .equ 9 -ra_ent .equ 11 -#endif -; -#if (BIOS == BIOS_UNA) -ra_name .equ 0 -ra_conkey .equ 2 -ra_dskykey .equ 3 -ra_bnk .equ 4 -ra_src .equ 6 -ra_dest .equ 8 -ra_siz .equ 10 -ra_ent .equ 12 -#endif -; -#define ra_ent(p1,p2,p3,p4,p5,p6,p7,p8) \ -#defcont .dw p1 \ -#defcont .db p2 \ -#if (DSKYENABLE) -#defcont .db p3 \ -#else -#defcont .db $FF \ -#endif -#if (BIOS == BIOS_WBW) -#defcont .db p4 \ -#endif -#if (BIOS == BIOS_UNA) -#defcont .dw p4 \ -#endif -#defcont .dw p5 \ -#defcont .dw p6 \ -#defcont .dw p7 \ -#defcont .dw p8 -; -; Note: The formatting of the following is critical. TASM does not pass -; macro arguments well. Ensure std.asm holds the definitions for *_LOC, -; *_SIZ *_END and any code generated which does not include std.asm is -; synced. -; -; Note: The loadable ROM images are placed in ROM banks bid_img0 and -; bid_img1. However, RomWBW supports a mechanism to load a complete -; new system dynamically as a runnable application (see appboot and -; imgboot in hbios.asm). In this case, the contents of bid_img0 will -; be pre-loaded into the currently executing ram bank thereby allowing -; those images to be dynamically loaded as well. To support this -; concept, a pseudo-bank called bid_cur is used to specify the images -; normally found in bid_img0. In romload, this special value will cause -; the associated image to be loaded from the currently executing bank -; which will be correct regardless of the load mode. Images in other -; banks (bid_img1) will always be loaded directly from ROM. -; -ra_tbl: -; Name Key Dsky Bank Src Dest Size Entry -; --------- ------- ----- -------- ----- ------- ------- ---------- -ra_ent(str_mon, 'M', KY_CL, bid_cur, $1000, MON_LOC, MON_SIZ, MON_SERIAL) -ra_entsiz .equ $ - ra_tbl -ra_ent(str_cpm22, 'C', KY_BK, bid_cur, $2000, CPM_LOC, CPM_SIZ, CPM_ENT) -ra_ent(str_zsys, 'Z', KY_FW, bid_cur, $5000, CPM_LOC, CPM_SIZ, CPM_ENT) -#if (BIOS == BIOS_WBW) -ra_ent(str_fth, 'F', KY_EX, BID_IMG1, $0000, FTH_LOC, FTH_SIZ, FTH_LOC) -ra_ent(str_bas, 'B', KY_DE, BID_IMG1, $1700, BAS_LOC, BAS_SIZ, BAS_LOC) -ra_ent(str_tbas, 'T', KY_EN, BID_IMG1, $3700, TBC_LOC, TBC_SIZ, TBC_LOC) -ra_ent(str_play, 'P', $FF, BID_IMG1, $4000, GAM_LOC, GAM_SIZ, GAM_LOC) -ra_ent(str_user, 'U', $FF, BID_IMG1, $7000, USR_LOC, USR_SIZ, USR_LOC) -#endif -#if (DSKYENABLE) -ra_ent(str_dsky, 'Y'+$80, KY_GO, bid_cur, $1000, MON_LOC, MON_SIZ, MON_DSKY) -#endif -ra_ent(str_egg, 'E'+$80, $FF , bid_cur, $0E00, EGG_LOC, EGG_SIZ, EGG_LOC) - .dw 0 ; table terminator -; -str_mon .db "Monitor",0 -str_cpm22 .db "CP/M 2.2",0 -str_zsys .db "Z-System",0 -str_dsky .db "DSKY Monitor",0 -str_fth .db "Forth",0 -str_bas .db "BASIC",0 -str_tbas .db "Tasty BASIC",0 -str_play .db "Play a Game",0 -str_user .db "User App",0 -str_egg .db "",0 -; -;======================================================================= -; Pad remainder of ROM Loader -;======================================================================= -; -slack .equ ($8000 + LDR_SIZ - $) - .fill slack -; - .echo "LOADER space remaining: " - .echo slack - .echo " bytes.\n" -; -;======================================================================= -; Working data storage (uninitialized) -;======================================================================= -; - .ds 64 ; 32 level stack -bl_stack .equ $ ; ... top is here -; -#if (BIOS == BIOS_WBW) -bid_ldr .ds 1 ; bank at startup -#endif -#if (BIOS == BIOS_UNA) -bid_ldr .ds 2 ; bank at startup -loadlba .ds 4 ; lba for load, dword -#endif -; -bootunit .ds 1 ; boot disk unit -bootslice .ds 1 ; boot disk slice -loadcnt .ds 1 ; num disk sectors to load -; -; Boot info sector is read into area below. -; The third sector of a disk device is reserved for boot info. -; -bl_infosec .equ $ - .ds (512 - 128) -bb_metabuf .equ $ -bb_sig .ds 2 ; signature (0xA55A if set) -bb_platform .ds 1 ; formatting platform -bb_device .ds 1 ; formatting device -bb_formatter .ds 8 ; formatting program -bb_drive .ds 1 ; physical disk drive # -bb_lu .ds 1 ; logical unit (lu) - .ds 1 ; msb of lu, now deprecated - .ds (bb_metabuf + 128) - $ - 32 -bb_protect .ds 1 ; write protect boolean -bb_updates .ds 2 ; update counter -bb_rmj .ds 1 ; rmj major version number -bb_rmn .ds 1 ; rmn minor version number -bb_rup .ds 1 ; rup update number -bb_rtp .ds 1 ; rtp patch level -bb_label .ds 16 ; 16 character drive label -bb_term .ds 1 ; label terminator ('$') -bb_biloc .ds 2 ; loc to patch boot drive info -bb_cpmloc .ds 2 ; final ram dest for cpm/cbios -bb_cpmend .ds 2 ; end address for load -bb_cpment .ds 2 ; CP/M entry point (cbios boot) -; - .end +;================================================================================================== +; INCLUDES +;================================================================================================== +; +#DEFINE USEDELAY +#INCLUDE "util.asm" +; +#IF (DSKYENABLE) +#DEFINE DSKY_KBD +#INCLUDE "dsky.asm" +#ENDIF +; +;================================================================================================== +; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED) +;================================================================================================== +; +#IF (BIOS == BIOS_WBW) +; +; OUTPUT CHARACTER FROM A +; +COUT: + ; SAVE ALL INCOMING REGISTERS + PUSH AF + PUSH BC + PUSH DE + PUSH HL +; + ; OUTPUT CHARACTER TO CONSOLE VIA HBIOS + LD E,A ; OUTPUT CHAR TO E + LD C,CIO_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR + RST 08 ; HBIOS OUTPUTS CHARACTDR +; + ; RESTORE ALL REGISTERS + POP HL + POP DE + POP BC + POP AF + RET +; +; INPUT CHARACTER TO A +; +CIN: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + ; INPUT CHARACTER FROM CONSOLE VIA HBIOS + LD C,CIO_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR + RST 08 ; HBIOS READS CHARACTDR + LD A,E ; MOVE CHARACTER TO A FOR RETURN +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; +; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) +; +CST: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + ; GET CONSOLE INPUT STATUS VIA HBIOS + LD C,CIO_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS + RST 08 ; HBIOS RETURNS STATUS IN A +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; +#ENDIF +; +#IF (BIOS == BIOS_UNA) +; +; OUTPUT CHARACTER FROM A +; +COUT: + ; SAVE ALL INCOMING REGISTERS + PUSH AF + PUSH BC + PUSH DE + PUSH HL +; + ; OUTPUT CHARACTER TO CONSOLE VIA UBIOS + LD E,A + LD BC,$12 + RST 08 +; + ; RESTORE ALL REGISTERS + POP HL + POP DE + POP BC + POP AF + RET +; +; INPUT CHARACTER TO A +; +CIN: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + ; INPUT CHARACTER FROM CONSOLE VIA UBIOS + LD BC,$11 + RST 08 + LD A,E +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; +; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) +; +CST: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + ; GET CONSOLE INPUT STATUS VIA UBIOS + LD BC,$13 + RST 08 + LD A,E +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; +#ENDIF +; +; READ A CONSOLE CHARACTER AND CONVERT TO UPPER CASE +; +CINUC: + CALL CIN + AND 7FH ; STRIP HI BIT + CP 'A' ; KEEP NUMBERS, CONTROLS + RET C ; AND UPPER CASE + CP 7BH ; SEE IF NOT LOWER CASE + RET NC + AND 5FH ; MAKE UPPER CASE + RET +; +;================================================================================================== +; FILL REMAINDER OF BANK +;================================================================================================== +; +SLACK: .EQU ($8000 + LDR_SIZ - $) + .FILL SLACK +; + .ECHO "LOADER space remaining: " + .ECHO SLACK + .ECHO " bytes.\n" +; +;================================================================================================== +; WORKING DATA STORAGE +;================================================================================================== + .ORG $8000 + LDR_SIZ +; + .DS 64 ; 32 LEVEL STACK +BL_STACK .EQU $ ; ... TOP IS HERE +; +BL_INPFLG .DS 1 ; INPUT FLAG, 1=DSKY, 2=SERIAL +BL_COUNT .DS 1 ; LOAD COUNTER +BL_TIMEOUT .DS 2 ; AUTOBOOT TIMEOUT COUNTDOWN COUNTER +BL_BOOTID .DS 1 ; BOOT DEVICE ID CHOSEN BY USER +BL_DEVICE .DS 1 ; DEVICE TO LOAD FROM +BL_LU .DS 1 ; LU TO LOAD FROM +; +; BOOT INFO SECTOR IS READ INTO AREA BELOW +; THE THIRD SECTOR OF A DISK DEVICE IS RESERVED FOR BOOT INFO +; +BL_INFOSEC .EQU $ + .DS (512 - 128) +BB_METABUF .EQU $ +BB_SIG .DS 2 ; SIGNATURE (WILL BE 0A55AH IF SET) +BB_PLATFORM .DS 1 ; FORMATTING PLATFORM +BB_DEVICE .DS 1 ; FORMATTING DEVICE +BB_FORMATTER .DS 8 ; FORMATTING PROGRAM +BB_DRIVE .DS 1 ; PHYSICAL DISK DRIVE # +BB_LU .DS 1 ; LOGICAL UNIT (LU) + .DS 1 ; MSB OF LU, NOW DEPRECATED + .DS (BB_METABUF + 128) - $ - 32 +BB_PROTECT .DS 1 ; WRITE PROTECT BOOLEAN +BB_UPDATES .DS 2 ; UPDATE COUNTER +BB_RMJ .DS 1 ; RMJ MAJOR VERSION NUMBER +BB_RMN .DS 1 ; RMN MINOR VERSION NUMBER +BB_RUP .DS 1 ; RUP UPDATE NUMBER +BB_RTP .DS 1 ; RTP PATCH LEVEL +BB_LABEL .DS 16 ; 16 CHARACTER DRIVE LABEL +BB_TERM .DS 1 ; LABEL TERMINATOR ('$') +BB_BILOC .DS 2 ; LOC TO PATCH BOOT DRIVE INFO TO (IF NOT ZERO) +BB_CPMLOC .DS 2 ; FINAL RAM DESTINATION FOR CPM/CBIOS +BB_CPMEND .DS 2 ; END ADDRESS FOR LOAD +BB_CPMENT .DS 2 ; CP/M ENTRY POINT (CBIOS COLD BOOT) +; + .END diff --git a/Source/HBIOS/simrtc.asm b/Source/HBIOS/simrtc.asm index 33c79590..2962f098 100644 --- a/Source/HBIOS/simrtc.asm +++ b/Source/HBIOS/simrtc.asm @@ -71,7 +71,13 @@ SIMRTC_GETTIM: LD HL,SIMRTC_BUF ; SOURCE ADR POP DE ; DEST ADR LD BC,SIMRTC_BUFSIZ ; LENGTH +#IF (INTMODE == 1) + DI +#ENDIF CALL HB_BNKCPY ; COPY THE CLOCK DATA +#IF (INTMODE == 1) + EI +#ENDIF ; LD DE,60 ; DELAY 60 * 16US = ~1MS CALL VDELAY ; SLOW DOWN SIMH FOR CLOCK TICKING TEST @@ -101,7 +107,13 @@ SIMRTC_SETTIM: LD (HB_DSTBNK),A ; SET IT LD DE,SIMRTC_BUF ; DEST ADR LD BC,SIMRTC_BUFSIZ ; LENGTH +#IF (INTMODE == 1) + DI +#ENDIF CALL HB_BNKCPY ; COPY THE CLOCK DATA +#IF (INTMODE == 1) + EI +#ENDIF ; LD HL,SIMRTC_BUF ; POINT TO TEMP BUF LD A,SIMRTC_CLKWRITE ; WRITE CLOCK COMMAND diff --git a/Source/HBIOS/timrtc.asm b/Source/HBIOS/timrtc.asm deleted file mode 100644 index 70733edd..00000000 --- a/Source/HBIOS/timrtc.asm +++ /dev/null @@ -1,230 +0,0 @@ -; -;================================================================================================== -; SYSTEM TIMER BASED CLOCK DRIVER -;================================================================================================== -; -TIMRTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) -; -; RTC DEVICE INITIALIZATION ENTRY -; -TIMRTC_INIT: - CALL NEWLINE ; FORMATTING - PRTS("TIMRTC: $") -; - ; HOOK THE HBIOS SECONDS VECTOR - LD HL,(VEC_SECOND+1) ; GET CUR SECONDS VECTOR - LD (TIMRTC_VEC),HL ; SAVE IT INTERNALLY - LD HL,TIMRTC_INT ; OUR SECONDS INT ENTRY - LD (VEC_SECOND+1),HL ; REPLACE IT -; - ; DISPLAY CURRENT TIME - CALL TIMRTC_GETTIM0 - LD HL,TIMRTC_BCDBUF ; POINT TO BCD BUF - CALL PRTDT -; - XOR A ; SIGNAL SUCCESS - RET -; -; RTC DEVICE FUNCTION DISPATCH ENTRY -; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR -; B: FUNCTION (IN) -; -TIMRTC_DISPATCH: - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JP Z,TIMRTC_GETTIM ; GET TIME - DEC A - JP Z,TIMRTC_SETTIM ; SET TIME - DEC A - JP Z,TIMRTC_GETBYT ; GET NVRAM BYTE VALUE - DEC A - JP Z,TIMRTC_SETBYT ; SET NVRAM BYTE VALUE - DEC A - JP Z,TIMRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES - DEC A - JP Z,TIMRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES - CALL PANIC -; -; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR -; -TIMRTC_GETBYT: -TIMRTC_SETBYT: -TIMRTC_GETBLK: -TIMRTC_SETBLK: - CALL PANIC -; -; RTC GET TIME -; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR -; HL: DATE/TIME BUFFER (OUT) -; BUFFER FORMAT IS BCD: YYMMDDHHMMSS -; 24 HOUR TIME FORMAT IS ASSUMED -; -TIMRTC_GETTIM: - ; GET THE TIME INTO TEMP BUF - PUSH HL ; SAVE PTR TO CALLERS BUFFER - CALL TIMRTC_GETTIM0 ; GET TIME TO WORK BUFFER -; - ; NOW COPY TO REAL DESTINATION (INTERBANK SAFE) - LD A,BID_BIOS ; COPY FROM BIOS BANK - LD (HB_SRCBNK),A ; SET IT - LD A,(HB_INVBNK) ; COPY TO CURRENT USER BANK - LD (HB_DSTBNK),A ; SET IT - LD HL,TIMRTC_BCDBUF ; SOURCE ADR - POP DE ; DEST ADR - LD BC,TIMRTC_BUFSIZ ; LENGTH - CALL HB_BNKCPY ; COPY THE CLOCK DATA -; - LD DE,60 ; DELAY 60 * 16US = ~1MS - CALL VDELAY ; SLOW DOWN SIMH FOR CLOCK TICKING TEST - XOR A ; SIGNAL SUCCESS - RET ; AND RETURN -; -TIMRTC_GETTIM0: - LD HL,TIMRTC_BINBUF ; FROM BINARY BUFFER - LD DE,TIMRTC_BCDBUF ; TO BCD BUFFER - HB_DI - CALL TIMRTC_BIN2BCD ; COPY AND CONVERT - HB_EI - RET -; -; RTC SET TIME -; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR -; HL: DATE/TIME BUFFER (IN) -; BUFFER FORMAT IS BCD: YYMMDDHHMMSSWW -; 24 HOUR TIME FORMAT IS ASSUMED -; -TIMRTC_SETTIM: - ; COPY TO BCD BUF - LD A,(HB_INVBNK) ; COPY FROM CURRENT USER BANK - LD (HB_SRCBNK),A ; SET IT - LD A,BID_BIOS ; COPY TO BIOS BANK - LD (HB_DSTBNK),A ; SET IT - LD DE,TIMRTC_BCDBUF ; DEST ADR - LD BC,TIMRTC_BUFSIZ ; LENGTH - CALL HB_BNKCPY ; COPY THE CLOCK DATA -; - LD HL,TIMRTC_BCDBUF ; FROM BCD BUF - LD DE,TIMRTC_BINBUF ; TO BIN BUF - HB_DI - CALL TIMRTC_BCD2BIN ; COPY AND CONVERT - HB_EI -; - XOR A ; SIGNAL SUCCESS - RET ; AND RETURN -; -; HANDLER FOR TIMER SECONDS INTERRUPT -; -TIMRTC_INT: - LD HL,TIMRTC_BINBUF + TIMRTC_BUFSIZ - 1 - INC (HL) ; INC SECONDS - LD A,59 ; MAX VALUE - CP (HL) ; OVERFLOW? - JR NC,TIMRTC_INTX ; NOPE, DONE - LD (HL),0 ; BACK TO ZERO - - DEC HL ; POINT TO MINUTES - INC (HL) ; INCREMENT MINUTE - CP (HL) ; OVERFLOW? - JR NC,TIMRTC_INTX ; NOPE, DONE - LD (HL),0 ; BACK TO ZERO - - DEC HL ; POINT TO HOURS - INC (HL) ; INCREMENT HOURS - LD A,23 ; MAX VALUE - CP (HL) ; OVERFLOW? - JR NC,TIMRTC_INTX ; NOPE, DONE - LD (HL),0 ; BACK TO ZERO - - DEC HL ; POINT TO DATE - LD A,(TIMRTC_MO) ; GET CURRENT MONTH - DEC A ; ZERO OFFSET - LD DE,TIMRTC_MONTBL ; POINT TO DAYS IN MON TBL - ADD A,E ; ADD OFFSET - LD E,A ; BACK TO E - JR NC,TIMRTC_INT1 ; NO CARRY, SKIP - INC D ; HANDLE CARRY -TIMRTC_INT1: - LD A,(DE) ; A := DAYS IN MONTH - LD C,A ; COPY TO C FOR LATER - LD A,(TIMRTC_MO) ; GET CURRENT MONTH - CP 2 ; FEBRUARY? - JR NZ,TIMRTC_INT2 ; IF NOT, NOT LEAY, SKIP - LD A,(TIMRTC_YR) ; GET CURRENT YEAR - AND $03 ; CHECK FOR LEAP - JR NZ,TIMRTC_INT2 ; IF NOT LEAP, SKIP AHEAD - INC C ; BUMP DAYS IN FEB FOR LEAP -TIMRTC_INT2: - INC (HL) ; INCREMENT DATE - LD A,C ; A := TRUE DAYS IN MONTH + 1 - CP (HL) ; OVERFLOW? - JR NZ,TIMRTC_INTX ; NOPE, DONE - LD (HL),1 ; BACK TO DAY ONE - - DEC HL ; POINT TO MONTH - INC (HL) ; INCREMENT MONTH - LD A,13 ; PAST MAX? - CP (HL) ; OVERFLOW? - JR NZ,TIMRTC_INTX ; NOPE, DONE - LD (HL),1 ; BACK TO MONTH ONE - - DEC HL ; POINT TO YEAR - INC (HL) ; INCREMENT YEAR - LD A,100 ; PAST MAX? - CP (HL) ; OVERFLOW? - JR NZ,TIMRTC_INTX ; NOPE, DONE - LD (HL),0 ; BACK TO YEAR ZERO -TIMRTC_INTX: - JP PANIC -TIMRTC_VEC .EQU $-2 -; -; CONVERT FROM BINARY BUF (HL) TO BCD BUF (DE) -; -TIMRTC_BIN2BCD: - LD B,TIMRTC_BUFSIZ -TIMRTC_BIN2BCD1: - LD A,(HL) - CALL BYTE2BCD - LD (DE),A - INC HL - INC DE - DJNZ TIMRTC_BIN2BCD1 - RET -; -; CONVERT FROM BCD BUF (HL) TO BINARY BUF (DE) -; -TIMRTC_BCD2BIN - LD B,TIMRTC_BUFSIZ -TIMRTC_BCD2BIN1: - LD A,(HL) - CALL BCD2BYTE - LD (DE),A - INC HL - INC DE - DJNZ TIMRTC_BCD2BIN1 - RET -; -; WORKING VARIABLES -; -TIMRTC_BINBUF: ; ALL IN BINARY -TIMRTC_YR .DB 20 -TIMRTC_MO .DB 01 -TIMRTC_DT .DB 01 -TIMRTC_HH .DB 00 -TIMRTC_MM .DB 00 -TIMRTC_SS .DB 00 -; -TIMRTC_BCDBUF .FILL TIMRTC_BUFSIZ -; -TIMRTC_MONTBL: ; DAYS IN MONTH + 1 - .DB 32 ; JANUARY - .DB 29 ; FEBRUARY (NON-LEAP) - .DB 32 ; MARCH - .DB 31 ; APRIL - .DB 32 ; MAY - .DB 31 ; JUNE - .DB 32 ; JULY - .DB 32 ; AUGUST - .DB 31 ; SEPTEMBER - .DB 32 ; OCTOBER - .DB 31 ; NOVEMBER - .DB 32 ; DECEMBER diff --git a/Source/HBIOS/usrrom.asm b/Source/HBIOS/usrrom.asm index 9a03a38d..5d4ff8e7 100644 --- a/Source/HBIOS/usrrom.asm +++ b/Source/HBIOS/usrrom.asm @@ -67,9 +67,8 @@ CIN: PUSH BC POP BC RET ; -BOOTMSG:.DB CR,LF,CR,LF - .DB "No User ROM Installed." - .DB CR,LF,CR,LF +BOOTMSG:.DB "No User ROM Installed." + .DB CR,LF .DB "Press a key to return to Boot Loader.$" ; SLACK .EQU (USR_END - $) diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 3d9ee4d5..253ec8fb 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -566,6 +566,8 @@ BYTE2BCD1: POP BC RET +#IF (BIOS == BIOS_WBW) + #IFDEF USEDELAY ; @@ -590,11 +592,9 @@ DELAY: ; 17TS (FROM INVOKING CALL) | DELAY1: ; | ; --- LOOP = ((CPUSCL * 16) - 5) TS ------------+ | DEC A ; 4TS | | - #IF (BIOS == BIOS_WBW) ; | | - #IF (CPUFAM == CPU_Z180) ; | | +#IF (CPUFAM == CPU_Z180) ; | | OR A ; +4TS FOR Z180 | | - #ENDIF ; | | - #ENDIF ; | | +#ENDIF ; | | JR NZ,DELAY1 ; 12TS (NZ) / 7TS (Z) | | ; ----------------------------------------------+ | ; | @@ -623,21 +623,17 @@ VDELAY: ; 17TS (FROM INVOKING CALL) | ; | | VDELAY1: ; | | ; --- INNER LOOP = ((CPUSCL * 16) - 5) TS ------+ | | - #IF (BIOS == BIOS_WBW) ; | | | - #IF (CPUFAM == CPU_Z180) ; | | | +#IF (CPUFAM == CPU_Z180) ; | | | OR A ; +4TS FOR Z180 | | | - #ENDIF ; | | | - #ENDIF ; | | | +#ENDIF ; | | | DEC A ; 4TS | | | JR NZ,VDELAY1 ; 12TS (NZ) / 7TS (Z) | | | ; ----------------------------------------------+ | | ; | | DEC DE ; 6TS | | - #IF (BIOS == BIOS_WBW) ; | | | - #IF (CPUFAM == CPU_Z180) ; | | +#IF (CPUFAM == CPU_Z180) ; | | OR A ; +4TS FOR Z180 | | - #ENDIF ; | | - #ENDIF ; | | +#ENDIF ; | | LD A,D ; 4TS | | OR E ; 4TS | | JP NZ,VDELAY ; 10TS | | @@ -663,7 +659,7 @@ LDELAY: ; CPU SCALER := MAX(1, (PHIMHZ - 2)) ; DELAY_INIT: - #IF (BIOS == BIOS_UNA) +#IF (BIOS == BIOS_UNA) LD C,$F8 ; UNA BIOS GET PHI FUNCTION RST 08 ; RETURNS SPEED IN HZ IN DE:HL LD B,4 ; DIVIDE MHZ IN DE:HL BY 100000H @@ -673,12 +669,12 @@ DELAY_INIT0: DJNZ DELAY_INIT0 ; ...RIGHT SHIFT DE BY 4. INC E ; FIX UP FOR VALUE TRUNCATION LD A,E ; PUT IN A - #ELSE +#ELSE LD B,BF_SYSGET ; HBIOS FUNC=GET SYS INFO LD C,BF_SYSGET_CPUINFO ; HBIOS SUBFUNC=GET CPU INFO RST 08 ; CALL HBIOS, RST 08 NOT YET INSTALLED LD A,L ; PUT SPEED IN MHZ IN ACCUM - #ENDIF +#ENDIF CP 3 ; TEST FOR <= 2 (SPECIAL HANDLING) JR C,DELAY_INIT1 ; IF <= 2, SPECIAL PROCESSING SUB 2 ; ADJUST AS REQUIRED BY DELAY FUNCTIONS @@ -689,11 +685,13 @@ DELAY_INIT2: LD (CPUSCL),A ; UPDATE CPU SCALER VALUE RET - #IF (CPUMHZ < 3) +#IF (CPUMHZ < 3) CPUSCL .DB 1 ; CPU SCALER MUST BE > 0 - #ELSE +#ELSE CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ - #ENDIF +#ENDIF +; +#ENDIF ; #ENDIF ; @@ -702,15 +700,13 @@ CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ ; NUMBER OF CALL/RET INVOCATIONS. A SINGLE CALL/RET IS ; 27 T-STATES ON A Z80, 25 T-STATES ON A Z180 ; -; ; Z80 Z180 -; ; ---- ---- -DLY64: CALL DLY32 ; 1728 1600 -DLY32: CALL DLY16 ; 864 800 -DLY16: CALL DLY8 ; 432 400 -DLY8: CALL DLY4 ; 216 200 -DLY4: CALL DLY2 ; 108 100 -DLY2: CALL DLY1 ; 54 50 -DLY1: RET ; 27 25 +DLY64: CALL DLY32 +DLY32: CALL DLY16 +DLY16: CALL DLY8 +DLY8: CALL DLY4 +DLY4: CALL DLY2 +DLY2: CALL DLY1 +DLY1: RET ; ; MULTIPLY 8-BIT VALUES ; IN: MULTIPLY H BY E diff --git a/Source/ver.inc b/Source/ver.inc index ab92465f..4dc55e56 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -1,5 +1,5 @@ #DEFINE RMJ 3 -#DEFINE RMN 1 -#DEFINE RUP 0 +#DEFINE RMN 0 +#DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1-pre.0" +#DEFINE BIOSVER "3.0.1" diff --git a/Source/ver.lib b/Source/ver.lib index ff995b90..9c5594c5 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -1,7 +1,7 @@ rmj equ 3 -rmn equ 1 -rup equ 0 +rmn equ 0 +rup equ 1 rtp equ 0 biosver macro - db "3.1-pre.0" + db "3.0.1" endm
  • (RshQD>mi`~qdbr=dmEsH>|RXzUGG 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 diff --git a/Source/Apps/Tune/Tune.asm b/Source/Apps/Tune/Tune.asm index 69374e39..73fe5b0e 100644 --- a/Source/Apps/Tune/Tune.asm +++ b/Source/Apps/Tune/Tune.asm @@ -38,6 +38,7 @@ ; 2018-01-28 [WBW] Added support for MYM sound files ; 2019-11-21 [WBW] Added table-driven configuration ; 2020-02-11 [WBW] Made hardware config & detection more flexible +; 2020-03-29 [WBW] Fix error in Z180 I/O W/S bracketing ;_______________________________________________________________________________ ; ; ToDo: @@ -124,8 +125,10 @@ PROBE: LD C,A ; ... to C IN A,(C) ; Read back value in register 2 CP $AA ; Value as written? - JR Z,MAT ; Hardware matched! + PUSH AF ; Save AF CALL NORMIO ; Back to normal I/O speeds + POP AF ; Recover AF + JR Z,MAT ; Hardware matched! JR CFGSEL ; And keep trying ; MAT: @@ -766,7 +769,7 @@ FILTYP .DB 0 ; Sound file type (TYPPT2, TYPPT3, TYPMYM) TMP .DB 0 ; work around use of undocumented Z80 ; -MSGBAN .DB "Tune Player for RomWBW v2.4, 23-Mar-2020",0 +MSGBAN .DB "Tune Player for RomWBW v2.5, 29-Mar-2020",0 MSGUSE .DB "Copyright (C) 2020, Wayne Warthen, GNU GPL v3",13,10 .DB "PTxPlayer Copyright (C) 2004-2007 S.V.Bulba",13,10 .DB "MYMPlay by Marq/Lieves!Tuore",13,10,13,10 diff --git a/Source/HBIOS/Config/N8_std.asm b/Source/HBIOS/Config/N8_std.asm index f66b2692..d8654771 100644 --- a/Source/HBIOS/Config/N8_std.asm +++ b/Source/HBIOS/Config/N8_std.asm @@ -25,8 +25,8 @@ #include "cfg_n8.asm" ; Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 -Z180_MEMWAIT .SET 1 ; Z180: MEMORY WAIT STATES (0-3) -Z180_IOWAIT .SET 3 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) +Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) ; CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 1d046bce..65db812a 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -34,8 +34,8 @@ RAMBIAS .EQU 0 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; Z180_BASE .EQU $40 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 -Z180_MEMWAIT .EQU 1 ; Z180: MEMORY WAIT STATES (0-3) -Z180_IOWAIT .EQU 3 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +Z180_MEMWAIT .EQU 0 ; Z180: MEMORY WAIT STATES (0-3) +Z180_IOWAIT .EQU 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) ; N8_PPI0 .EQU $80 ; N8: FIRST PARALLEL PORT REGISTERS BASE ADR N8_PPI1 .EQU $84 ; N8: SECOND PARALLEL PORT REGISTERS BASE ADR diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 2fb8b48a..4759cf61 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -51,11 +51,11 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! ; #IF (TMSMODE == TMSMODE_N8) -; BELOW WAS TUNED FOR N8 AT 18MHZ WITH 3 IO WAIT STATES -#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP +; BELOW WAS TUNED FOR N8 AT 18MHZ +#DEFINE TMS_IODELAY EX (SP),HL \ EX (SP),HL ; 38 W/S #ELSE ; BELOW WAS TUNED FOR SBC AT 8MHZ -#DEFINE TMS_IODELAY NOP \ NOP +#DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S #ENDIF ; ;====================================================================== @@ -63,6 +63,10 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ;====================================================================== ; TMS_INIT: +#IF (CPUFAM == CPU_Z180) + CALL TMS_Z180IO +#ENDIF +; #IF (TMSMODE == TMSMODE_SCG) LD A,$FF OUT (TMS_ACR),A ; INIT AUX CONTROL REG @@ -85,7 +89,7 @@ TMS_INIT: TMS_INIT1: CALL TMS_CRTINIT ; SETUP THE TMS CHIP REGISTERS CALL TMS_LOADFONT ; LOAD FONT DATA FROM ROM TO TMS STRORAGE - CALL TMS_VDARES + CALL TMS_VDARES1 #IF (TMSMODE == TMSMODE_N8) CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER #ENDIF @@ -150,6 +154,10 @@ TMS_VDAQRY: RET TMS_VDARES: +#IF (CPUFAM == CPU_Z180) + CALL TMS_Z180IO +#ENDIF +TMS_VDARES1: ; ENTRY POINT TO AVOID TMS_Z180IO RECURSION LD DE,0 ; ROW = 0, COL = 0 CALL TMS_XY ; SEND CURSOR TO TOP LEFT LD A,' ' ; BLANK THE SCREEN @@ -175,6 +183,9 @@ TMS_VDASCS: CALL PANIC ; NOT IMPLEMENTED (YET) TMS_VDASCP: +#IF (CPUFAM == CPU_Z180) + CALL TMS_Z180IO +#ENDIF CALL TMS_CLRCUR CALL TMS_XY ; SET CURSOR POSITION CALL TMS_SETCUR @@ -190,6 +201,9 @@ TMS_VDASCO: RET TMS_VDAWRC: +#IF (CPUFAM == CPU_Z180) + CALL TMS_Z180IO +#ENDIF CALL TMS_CLRCUR ; CURSOR OFF LD A,E ; CHARACTER TO WRITE GOES IN A CALL TMS_PUTCHAR ; PUT IT ON THE SCREEN @@ -198,6 +212,9 @@ TMS_VDAWRC: RET TMS_VDAFIL: +#IF (CPUFAM == CPU_Z180) + CALL TMS_Z180IO +#ENDIF CALL TMS_CLRCUR LD A,E ; FILL CHARACTER GOES IN A EX DE,HL ; FILL LENGTH GOES IN DE @@ -207,6 +224,9 @@ TMS_VDAFIL: RET TMS_VDACPY: +#IF (CPUFAM == CPU_Z180) + CALL TMS_Z180IO +#ENDIF CALL TMS_CLRCUR ; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS TMS_POS ; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT @@ -220,6 +240,9 @@ TMS_VDACPY: RET TMS_VDASCR: +#IF (CPUFAM == CPU_Z180) + CALL TMS_Z180IO +#ENDIF CALL TMS_CLRCUR TMS_VDASCR0: LD A,E ; LOAD E INTO A @@ -689,6 +712,39 @@ TMS_BLKCPY3: ; RET ; +;---------------------------------------------------------------------- +; Z180 LOW SPEED I/O CODE BRACKETING +;---------------------------------------------------------------------- +; +#IF (CPUFAM == CPU_Z180) +; +TMS_Z180IO: + ; HOOK CALLERS RETURN TO RESTORE DCNTL + EX (SP),HL ; SAVE HL & HL := RET ADR + LD (TMS_Z180IOR),HL ; SET RET ADR + LD HL,TMS_Z180IOX ; HL := SPECIAL RETURN ADR + EX (SP),HL ; RESTORE HL, INS NEW RET ADR + ; SET Z180 MAX I/O WAIT STATES + PUSH AF ; SAVE AF + IN0 A,(Z180_DCNTL) ; GET CURRENT Z180 DCNTL + LD (TMS_DCNTL),A ; SAVE IT + OR %00110000 ; NEW DCNTL VALUE (MAX I/O W/S) + OUT0 (Z180_DCNTL),A ; IMPLEMENT IT + POP AF ; RESTORE AF + ; BACK TO CALLER +TMS_Z180IOR .EQU $+1 + JP $0000 ; BACK TO CALLER +; +TMS_Z180IOX: + ; RESTORE ORIGINAL DCNTL + PUSH AF ; SAVE AF + LD A,(TMS_DCNTL) ; ORIG DCNTL + OUT0 (Z180_DCNTL),A ; IMPLEMENT IT + POP AF ; RESTORE AF + RET ; DONE +; +#ENDIF +; ;================================================================================================== ; TMS DRIVER - DATA ;================================================================================================== @@ -751,6 +807,10 @@ TMS_INIT9918: ; TMS_INIT9918LEN .EQU $ - TMS_INIT9918 ; +#IF (CPUFAM == CPU_Z180) +TMS_DCNTL .DB $00 ; SAVE Z180 DCNTL AS NEEDED +#ENDIF +; ;================================================================================================== ; TMS DRIVER - INSTANCE DATA ;================================================================================================== From c615fd239bc55dced30629caf0eb76f31d589ad8 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 30 Mar 2020 11:19:06 -0700 Subject: [PATCH 04/16] CLRDIR and ZDE updates - CLRDIR has been updated by Max Scane for CP/M 3 compatibility. - A minor issue in the preconfigured ZDE VT100 terminal escape sequences was corrected. --- Doc/ChangeLog.txt | 2 ++ Doc/RomWBW Applications.pdf | Bin 140215 -> 140215 bytes Doc/RomWBW Architecture.pdf | Bin 371095 -> 371095 bytes Doc/RomWBW Getting Started.pdf | Bin 166882 -> 166704 bytes ReadMe.md | 14 ++------------ ReadMe.txt | 12 +----------- Source/Doc/GettingStarted.md | 12 +----------- Source/Images/Common/CLRDIR.COM | Bin 1619 -> 1681 bytes Source/Images/Common/ZDE.COM | Bin 17408 -> 17408 bytes Source/RomDsk/ROM_1024KB/CLRDIR.COM | Bin 1619 -> 1681 bytes Source/RomDsk/ROM_1024KB/ZDE.COM | Bin 17408 -> 17408 bytes Source/RomDsk/ROM_512KB/CLRDIR.COM | Bin 1619 -> 1681 bytes Source/RomDsk/ROM_512KB/ZDE.COM | Bin 17408 -> 17408 bytes 13 files changed, 6 insertions(+), 34 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index dd2d09be..8ac107ff 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -2,6 +2,8 @@ Version 3.0.1 ------------- - WBW: Increase XModem timeout waiting for host to start sending - WBW: Update TMS driver to dynamically increase Z180 I/O W/S inside driver +- MJS: Update CLRDIR for CP/M 3 compatibility +- WBW: Corrected cursor on/off esc sequence in pre-configured ZDE. Version 3.0.0 ------------- diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index eb8f4de31688038eab2f1fc4b13611ed654f1f11..e86d3328ccb7500e4d852efeec3952820b469b03 100644 GIT binary patch delta 113 zcmdmfoMZcOj)pCa>c2RQ4GaxTO-wDP>;GbuhV!-u{bFR*bT+hfHaE3!Gca_rbg^`F gb~ZF}H8gQHaJ6tVb~bf0aI{mfA*5vbEM+EH05JC*zW@LL delta 113 zcmdmfoMZcOj)pCa>c2RQ%neOV%nS{t>;GbuhV!-u{bFR*baruaF*i0abaQodGjeru gH8*xMH8M80G%;{=F?6PL0x1Sb7RkoOrl}T|=7uSjCe4Z|+Z9t7V>>Zq+WX!z0x=U1GjH#E z%d)mx+t|R+z|_>hSl7T@-M~OylS|(>KgA`nBvnDf#mdOQ$iToDreu3sCF@0fXID34 qLsutbQxiu+3qwm|BOu4w)xgEj(a6Zr&BfKxPQiwdlIc||S!DrkMK=8a delta 193 zcmbP!S#0`cu?>PL0w$Izrm3mM2B{{-#wMxeDb0#0+Z9t7V>>Zq+WX!z0x=U1GjH#E z%d)mx+sNF|)WpotMAyJv-M~OylS|(>KgA`nBvnDf#mdOQ$iToDreu3sCF@0fXJ;o% sBS%LQS4VSmQzv6{XE$>TQzuJva~Ee5LlaX&6FUVPLQ1Artz?x20IW+lHvj+t diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index e67339cc9ee58588c098aa7a9015488687449f46..6012434c299df648234613d2bb46cc47ef6bc320 100644 GIT binary patch delta 46604 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Ξ%|!qY)Sdv%$OY>6dD)ZHf&B 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 S#2cM!QIWixG>Poo&ilW|c#S&% delta 47034 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 diff --git a/ReadMe.md b/ReadMe.md index d8e83a5c..68ccfc70 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ ## Z80/Z180 System Software Version 3.0 -Friday 27 March 2020 +Monday 30 March 2020 Wayne Warthen @@ -771,12 +771,7 @@ tracks. `CPMLDR.SYS` chain loads `CPM3.SYS`. ### Notes - - `CLRDIR` is not working right under CP/M 3. It only partially clears - the disk sectors of the directory area. The extent of this issue has - not been evaluated, but it is not a RomWBW issue. To use CLRDIR, you - can temporarily boot back into Z-System. - - - The `DATE` command cannot yet be used to set the RTC. The RTC is + - The `DATE` command cannot yet be used to **set** the RTC. The RTC is used to read the current date/time for file stamping, etc. You can use the `RTC` app to set the RTC clock. @@ -790,11 +785,6 @@ tracks of the disk. ### Notes - - `CLRDIR` is not working right under ZPM3. It only partially clears - the disk sectors of the directory area. The extent of this issue has - not been evaluated, but it is not a RomWBW issue. To use CLRDIR, you - can temporarily boot back into Z-System. - - `ZPMLDR` is included with ZPM3, but it is not working correctly. - The ZPM operating system is contained in the file called CPM3.SYS diff --git a/ReadMe.txt b/ReadMe.txt index 0f2c57d8..fed41156 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -3,7 +3,7 @@ RomWBW Z80/Z180 System Software Version 3.0 -Friday 27 March 2020 +Monday 30 March 2020 Wayne Warthen wwarthen@gmail.com @@ -800,11 +800,6 @@ tracks. CPMLDR.SYS chain loads CPM3.SYS. Notes -- CLRDIR is not working right under CP/M 3. It only partially clears - the disk sectors of the directory area. The extent of this issue has - not been evaluated, but it is not a RomWBW issue. To use CLRDIR, you - can temporarily boot back into Z-System. - - The DATE command cannot yet be used to set the RTC. The RTC is used to read the current date/time for file stamping, etc. You can use the RTC app to set the RTC clock. @@ -819,11 +814,6 @@ tracks of the disk. Notes -- CLRDIR is not working right under ZPM3. It only partially clears the - disk sectors of the directory area. The extent of this issue has not - been evaluated, but it is not a RomWBW issue. To use CLRDIR, you can - temporarily boot back into Z-System. - - ZPMLDR is included with ZPM3, but it is not working correctly. - The ZPM operating system is contained in the file called CPM3.SYS diff --git a/Source/Doc/GettingStarted.md b/Source/Doc/GettingStarted.md index e9981ee8..ba84859b 100644 --- a/Source/Doc/GettingStarted.md +++ b/Source/Doc/GettingStarted.md @@ -819,12 +819,7 @@ system tracks. `CPMLDR.SYS` chain loads `CPM3.SYS`. ### Notes -- `CLRDIR` is not working right under CP/M 3. It only partially clears -the disk sectors of the directory area. The extent of this issue -has not been evaluated, but it is not a RomWBW issue. To use CLRDIR, -you can temporarily boot back into Z-System. - -- The `DATE` command cannot yet be used to set the RTC. The RTC is +- The `DATE` command cannot yet be used to **set** the RTC. The RTC is used to read the current date/time for file stamping, etc. You can use the `RTC` app to set the RTC clock. @@ -839,11 +834,6 @@ tracks of the disk. ### Notes -- `CLRDIR` is not working right under ZPM3. It only partially clears -the disk sectors of the directory area. The extent of this issue -has not been evaluated, but it is not a RomWBW issue. To use CLRDIR, -you can temporarily boot back into Z-System. - - `ZPMLDR` is included with ZPM3, but it is not working correctly. - The ZPM operating system is contained in the file called CPM3.SYS diff --git a/Source/Images/Common/CLRDIR.COM b/Source/Images/Common/CLRDIR.COM index d1f2a7d638df0bd80130b95c717218e485636bbe..c6b05cc9de2a72ba763f63fe0b8eb2b605cd5ec8 100644 GIT binary patch literal 1681 zcmZ`(OKclO7@l3PXB4+<>QjXf&BV4qGIdB6p^6nUDlvyjB&ixx6e=E$Jx*6~z1Hs9 ziL1m4X_`hM^l{^iKt{a8qoSg42woIrgH}S3sH&dGAsq0jLXjvB!#}%rQWdeX|DE~& zZ~poAf4OyO=*3g%6Q}5DW|*2@qJ#Z|bU16|&QfJS8K4t2*v-(fT(-pIP$=%cC8_hM zjW%xtBO*~3(5>Tls#5#VR#j3i5%mIUtIeth32bf&kw=Mo5w(+CwS?N~=6N9{D3^)7 zCA2fm4S%CtCA)52$}rQSdfDP6Ojcw$i{<<2h)(mGIYp-p&0;2<)`~?s!DyKo1>HEu z@>CARxwmn+0$g7q>J`#x?g;K~t$yC#^^i@-C~1kpt*qu7!WB6`d!o7=QfT zg1_?)Es_>Lu@S2)OT{8m2jqRu9w%zTRWzsPz5A9r7$>np zVi1Q`VxG+2T$}r5trM4JP%jfFwId+0?;4qo$<3bwLHIkuHR9&6m)2tv93M_6ASv!U zI6dr^u)BaCKr92oox%S_u3{&Z>4q<{Om=1=K-+U5VB?)hQEndF!>rtgfk-;x9w%K_rdDQjoI*L24L!$L{wU3sYIKU#s1EK7Zv|F1qgnmn=P#)}&I!F_ zW+$N}I@9afJg@B(J(ElyrOEME<^KI0dKc*^&l4(j` zC}k&#@I`E*GD-D{Rjyb7N{&;S)@cb6kcG(va|p__RM3obSw6e~5r^FJDsJAu_Pf|y ztz-KmfAt-)3t-*+-DwhwM1AA4hfq*#jum zW8cB45EloyILL*}MVO02Ae4JJ`VW3Xi~flxrlNo2uoAh4y|nXb=%DU%qEyWmwN423 zL&CqJYw8Z=Zn(Hj4($(vk;a=aGG)12tROs_HKD>Fv%xPiP}m7=KBo@6l{CZV(D0ZeNq&YBaSwD++^Vtx30S%%3)il_0B3)0a9ln+Y?M zwvkpAi+T`mo;-M4dhjH8Qjn6_ElzPL>|q5@uFxXJUGY%x6#d>zvk`+1%=fIH%kQJRGe3$#@BAH6kQRu%i+XZLbRmJmBVRa3&Gd=5RvrSM0)kre4h`RDCsy`8t2BV9W_M5J@+l zBHLf@?|id=7FhH0|@6x{X07JG@i_higWtwKD+o{loygWHB&1)u2wRD{|%zB%aTFs`W zLo>UriqPo>>7M-O0kPi}{cx2n`Z!I7xSK&Bw(LjJ6)e4qrCBV^ zW9c<4<*~Gc`JHbldP8lj(F8T$Q4QKM)w*i7y{DpWFntqV4yYJBq<-@nXRV^uXbdd; zPg9lKO-3seD&5qzDuXDLMw_m)Hr2qS?sA}HTdFw)wmubl74FmPhO!3Dbv9UDTIF4v zq;DqD&(cKYS}2&}ujjv=;@%ofR#j^%+~}U3g6UImr-LDff{8SxvkhgX4pFg{)*97X zX0v4iC{dv_tdKlKZ~U-}hCe#6!e zI2jxkof{U74U0mVFH34W+K0C3TQwo|nF=KZN@Q;JQ$7 RFgWss^26~5s=npH`Zq8hC}98q diff --git a/Source/Images/Common/ZDE.COM b/Source/Images/Common/ZDE.COM index 7f901bb6389de855bbd891e31efc573d15ffecde..c332ff51af604f562019719a28b80528975593d4 100644 GIT binary patch delta 16 XcmZqZU~K4MoN#rrD5Lbo4+72rHO&Sv delta 24 ecmZqZU~K4MoN$$!S=!o>fq?-?d2W25;0yp)%LcOm diff --git a/Source/RomDsk/ROM_1024KB/CLRDIR.COM b/Source/RomDsk/ROM_1024KB/CLRDIR.COM index d1f2a7d638df0bd80130b95c717218e485636bbe..c6b05cc9de2a72ba763f63fe0b8eb2b605cd5ec8 100644 GIT binary patch literal 1681 zcmZ`(OKclO7@l3PXB4+<>QjXf&BV4qGIdB6p^6nUDlvyjB&ixx6e=E$Jx*6~z1Hs9 ziL1m4X_`hM^l{^iKt{a8qoSg42woIrgH}S3sH&dGAsq0jLXjvB!#}%rQWdeX|DE~& zZ~poAf4OyO=*3g%6Q}5DW|*2@qJ#Z|bU16|&QfJS8K4t2*v-(fT(-pIP$=%cC8_hM zjW%xtBO*~3(5>Tls#5#VR#j3i5%mIUtIeth32bf&kw=Mo5w(+CwS?N~=6N9{D3^)7 zCA2fm4S%CtCA)52$}rQSdfDP6Ojcw$i{<<2h)(mGIYp-p&0;2<)`~?s!DyKo1>HEu z@>CARxwmn+0$g7q>J`#x?g;K~t$yC#^^i@-C~1kpt*qu7!WB6`d!o7=QfT zg1_?)Es_>Lu@S2)OT{8m2jqRu9w%zTRWzsPz5A9r7$>np zVi1Q`VxG+2T$}r5trM4JP%jfFwId+0?;4qo$<3bwLHIkuHR9&6m)2tv93M_6ASv!U zI6dr^u)BaCKr92oox%S_u3{&Z>4q<{Om=1=K-+U5VB?)hQEndF!>rtgfk-;x9w%K_rdDQjoI*L24L!$L{wU3sYIKU#s1EK7Zv|F1qgnmn=P#)}&I!F_ zW+$N}I@9afJg@B(J(ElyrOEME<^KI0dKc*^&l4(j` zC}k&#@I`E*GD-D{Rjyb7N{&;S)@cb6kcG(va|p__RM3obSw6e~5r^FJDsJAu_Pf|y ztz-KmfAt-)3t-*+-DwhwM1AA4hfq*#jum zW8cB45EloyILL*}MVO02Ae4JJ`VW3Xi~flxrlNo2uoAh4y|nXb=%DU%qEyWmwN423 zL&CqJYw8Z=Zn(Hj4($(vk;a=aGG)12tROs_HKD>Fv%xPiP}m7=KBo@6l{CZV(D0ZeNq&YBaSwD++^Vtx30S%%3)il_0B3)0a9ln+Y?M zwvkpAi+T`mo;-M4dhjH8Qjn6_ElzPL>|q5@uFxXJUGY%x6#d>zvk`+1%=fIH%kQJRGe3$#@BAH6kQRu%i+XZLbRmJmBVRa3&Gd=5RvrSM0)kre4h`RDCsy`8t2BV9W_M5J@+l zBHLf@?|id=7FhH0|@6x{X07JG@i_higWtwKD+o{loygWHB&1)u2wRD{|%zB%aTFs`W zLo>UriqPo>>7M-O0kPi}{cx2n`Z!I7xSK&Bw(LjJ6)e4qrCBV^ zW9c<4<*~Gc`JHbldP8lj(F8T$Q4QKM)w*i7y{DpWFntqV4yYJBq<-@nXRV^uXbdd; zPg9lKO-3seD&5qzDuXDLMw_m)Hr2qS?sA}HTdFw)wmubl74FmPhO!3Dbv9UDTIF4v zq;DqD&(cKYS}2&}ujjv=;@%ofR#j^%+~}U3g6UImr-LDff{8SxvkhgX4pFg{)*97X zX0v4iC{dv_tdKlKZ~U-}hCe#6!e zI2jxkof{U74U0mVFH34W+K0C3TQwo|nF=KZN@Q;JQ$7 RFgWss^26~5s=npH`Zq8hC}98q diff --git a/Source/RomDsk/ROM_1024KB/ZDE.COM b/Source/RomDsk/ROM_1024KB/ZDE.COM index 7f901bb6389de855bbd891e31efc573d15ffecde..c332ff51af604f562019719a28b80528975593d4 100644 GIT binary patch delta 16 XcmZqZU~K4MoN#rrD5Lbo4+72rHO&Sv delta 24 ecmZqZU~K4MoN$$!S=!o>fq?-?d2W25;0yp)%LcOm diff --git a/Source/RomDsk/ROM_512KB/CLRDIR.COM b/Source/RomDsk/ROM_512KB/CLRDIR.COM index d1f2a7d638df0bd80130b95c717218e485636bbe..c6b05cc9de2a72ba763f63fe0b8eb2b605cd5ec8 100644 GIT binary patch literal 1681 zcmZ`(OKclO7@l3PXB4+<>QjXf&BV4qGIdB6p^6nUDlvyjB&ixx6e=E$Jx*6~z1Hs9 ziL1m4X_`hM^l{^iKt{a8qoSg42woIrgH}S3sH&dGAsq0jLXjvB!#}%rQWdeX|DE~& zZ~poAf4OyO=*3g%6Q}5DW|*2@qJ#Z|bU16|&QfJS8K4t2*v-(fT(-pIP$=%cC8_hM zjW%xtBO*~3(5>Tls#5#VR#j3i5%mIUtIeth32bf&kw=Mo5w(+CwS?N~=6N9{D3^)7 zCA2fm4S%CtCA)52$}rQSdfDP6Ojcw$i{<<2h)(mGIYp-p&0;2<)`~?s!DyKo1>HEu z@>CARxwmn+0$g7q>J`#x?g;K~t$yC#^^i@-C~1kpt*qu7!WB6`d!o7=QfT zg1_?)Es_>Lu@S2)OT{8m2jqRu9w%zTRWzsPz5A9r7$>np zVi1Q`VxG+2T$}r5trM4JP%jfFwId+0?;4qo$<3bwLHIkuHR9&6m)2tv93M_6ASv!U zI6dr^u)BaCKr92oox%S_u3{&Z>4q<{Om=1=K-+U5VB?)hQEndF!>rtgfk-;x9w%K_rdDQjoI*L24L!$L{wU3sYIKU#s1EK7Zv|F1qgnmn=P#)}&I!F_ zW+$N}I@9afJg@B(J(ElyrOEME<^KI0dKc*^&l4(j` zC}k&#@I`E*GD-D{Rjyb7N{&;S)@cb6kcG(va|p__RM3obSw6e~5r^FJDsJAu_Pf|y ztz-KmfAt-)3t-*+-DwhwM1AA4hfq*#jum zW8cB45EloyILL*}MVO02Ae4JJ`VW3Xi~flxrlNo2uoAh4y|nXb=%DU%qEyWmwN423 zL&CqJYw8Z=Zn(Hj4($(vk;a=aGG)12tROs_HKD>Fv%xPiP}m7=KBo@6l{CZV(D0ZeNq&YBaSwD++^Vtx30S%%3)il_0B3)0a9ln+Y?M zwvkpAi+T`mo;-M4dhjH8Qjn6_ElzPL>|q5@uFxXJUGY%x6#d>zvk`+1%=fIH%kQJRGe3$#@BAH6kQRu%i+XZLbRmJmBVRa3&Gd=5RvrSM0)kre4h`RDCsy`8t2BV9W_M5J@+l zBHLf@?|id=7FhH0|@6x{X07JG@i_higWtwKD+o{loygWHB&1)u2wRD{|%zB%aTFs`W zLo>UriqPo>>7M-O0kPi}{cx2n`Z!I7xSK&Bw(LjJ6)e4qrCBV^ zW9c<4<*~Gc`JHbldP8lj(F8T$Q4QKM)w*i7y{DpWFntqV4yYJBq<-@nXRV^uXbdd; zPg9lKO-3seD&5qzDuXDLMw_m)Hr2qS?sA}HTdFw)wmubl74FmPhO!3Dbv9UDTIF4v zq;DqD&(cKYS}2&}ujjv=;@%ofR#j^%+~}U3g6UImr-LDff{8SxvkhgX4pFg{)*97X zX0v4iC{dv_tdKlKZ~U-}hCe#6!e zI2jxkof{U74U0mVFH34W+K0C3TQwo|nF=KZN@Q;JQ$7 RFgWss^26~5s=npH`Zq8hC}98q diff --git a/Source/RomDsk/ROM_512KB/ZDE.COM b/Source/RomDsk/ROM_512KB/ZDE.COM index 7f901bb6389de855bbd891e31efc573d15ffecde..c332ff51af604f562019719a28b80528975593d4 100644 GIT binary patch delta 16 XcmZqZU~K4MoN#rrD5Lbo4+72rHO&Sv delta 24 ecmZqZU~K4MoN$$!S=!o>fq?-?d2W25;0yp)%LcOm From 663a53296700f77f6ea7a8bab6e9bf7a51c8753e Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 30 Mar 2020 14:54:53 -0700 Subject: [PATCH 05/16] Fix Auto CRT Console Switch on CP/M 3 --- Source/CPM3/biosldr.z80 | 8 ++++---- Source/CPM3/boot.z80 | 9 +++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Source/CPM3/biosldr.z80 b/Source/CPM3/biosldr.z80 index de97bb36..9fc960d3 100644 --- a/Source/CPM3/biosldr.z80 +++ b/Source/CPM3/biosldr.z80 @@ -162,12 +162,12 @@ const: ld a,82H halt conin: - ld bc,0000H ; unit 0, func 0 = CIN + ld bc,0080H ; unit 80h (console), func 0 = CIN call 0FFF0H conout: ld e,c ; output character in E - ld bc,0100H ; unit 0, func 1 = COUT + ld bc,0180H ; unit 80h (console), func 1 = COUT ;rst 08 ; do it call 0FFF0H ret ; return @@ -310,7 +310,7 @@ xmove: cin: ; input character from console via hbios - ld c,0D0H ; console unit to c + ld c,080H ; console unit to c ld b,00H ; hbios func: input char call 0FFF0H ; hbios reads character ld a,e ; move character to a for return @@ -319,7 +319,7 @@ cin: cout: ; output character to console via hbios ld e,a ; output char to e - ld c,0D0H ; console unit to c + ld c,080H ; console unit to c ld b,01H ; hbios func: output char call 0FFF0H ; hbios outputs character ret diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index 9c423f68..1468883a 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -13,6 +13,7 @@ extrn @dtbl,@ctbl extrn @date,@hour,@min,@sec extrn @srch1 + extrn @hbbio extrn addhla, bcd2bin, bin2bcd extrn cout, phex8, phex16, crlf, crlf2 @@ -73,7 +74,8 @@ init$2: cinit: ; Setup CON: I/O vector based on HBIOS console device ld b,0FAh ; HBIOS Peek Function - ld d,0 ; Bank 0 has HCB + ld a,(@hbbio) ; HBIOS bank id + ld d,a ; ... goes in D ld hl,112h ; Offset 112h is current console device rst 08 ; Call HBIOS, value in E push de ; save console unit value @@ -94,16 +96,19 @@ cinit$1: rst 08 ; do it, count in E ld a,e ; device count to accum pop de ; recover console unit num to E + push af ; save device count cp 2 ; check for 2+ char devices jr c,cinit$3 ; if not, skip aux assignment + ld a,e ; console unit num to A or a ; check for zero ld hl,4000h ; assume aux on second char device - jr nz,cinit$2 ; if console on unit 0, assumption good + jr z,cinit$2 ; if console on unit 0, assumption good ld hl,8000h ; otherwise, aux goes to first char device cinit$2: ld (@aivec),hl ; assign to aux input ld (@aovec),hl ; assign to aux output cinit$3: + pop af ; recover device count ; Truncate char table based on actual num of char devices rlca ; A still has char device count rlca ; * 8 for ctbl entry size From 99dadbc17c73c853e483db7a7bd9c8ea226514ed Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 31 Mar 2020 11:30:11 -0700 Subject: [PATCH 06/16] Handle lack of RTC better DSRTC driver now correctly returns an error if there is no RTC present. --- Doc/ChangeLog.txt | 4 ++- Source/CPM3/boot.z80 | 1 + Source/HBIOS/dsrtc.asm | 12 ++++++++ Source/Images/Common/ZDE.COM | Bin 17408 -> 17408 bytes Source/Images/d_cpm3/u0/ROMWBW.TXT | 28 ++++++++---------- Source/Images/d_zpm3/u0/ROMWBW.TXT | 46 +++++++++++++---------------- Source/RomDsk/ROM_1024KB/ZDE.COM | Bin 17408 -> 17408 bytes Source/RomDsk/ROM_512KB/ZDE.COM | Bin 17408 -> 17408 bytes 8 files changed, 50 insertions(+), 41 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 8ac107ff..5ddd4e80 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -3,7 +3,9 @@ Version 3.0.1 - WBW: Increase XModem timeout waiting for host to start sending - WBW: Update TMS driver to dynamically increase Z180 I/O W/S inside driver - MJS: Update CLRDIR for CP/M 3 compatibility -- WBW: Corrected cursor on/off esc sequence in pre-configured ZDE. +- WBW: Corrected cursor on/off esc sequence in pre-configured ZDE +- WBW: Fix automatic CRT console switching under CP/M 3 and ZPM3 +- WBW: DSRTC driver now correctly returns an error if there is no RTC present Version 3.0.0 ------------- diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index 1468883a..b80d7631 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -495,6 +495,7 @@ time$get: ld b,020h ; HBIOS func: get time ld hl,tim$buf ; time buffer rst 08 ; do it + ret nz ; bail out on error ; convert yymmss in time buffer -> cpm3 epoch date offset call date2cpm ; time buf (yr, mon, day) -> SCB (@date) diff --git a/Source/HBIOS/dsrtc.asm b/Source/HBIOS/dsrtc.asm index 34a6a4e8..7fa819db 100644 --- a/Source/HBIOS/dsrtc.asm +++ b/Source/HBIOS/dsrtc.asm @@ -236,6 +236,9 @@ DSRTC_SETBLK: ; 24 HOUR TIME FORMAT IS ASSUMED ; DSRTC_GETTIM: + LD A,(DSRTC_STAT) ; GET DEVICE STATUS + OR A ; SET FLAGS + RET NZ ; BAIL OUT ON ERROR ; PUSH HL ; SAVE ADR OF OUTPUT BUF ; @@ -272,6 +275,9 @@ DSRTC_GETTIM: ; 24 HOUR TIME FORMAT IS ASSUMED ; DSRTC_SETTIM: + LD A,(DSRTC_STAT) ; GET DEVICE STATUS + OR A ; SET FLAGS + RET NZ ; BAIL OUT ON ERROR ; ; COPY INCOMING TIME DATA TO OUR TIME BUFFER LD A,(HB_INVBNK) ; COPY FROM CURRENT USER BANK @@ -303,6 +309,9 @@ DSRTC_SETTIM: ; E: VALUE (OUTPUT) ; DSRTC_GETBYT: + LD A,(DSRTC_STAT) ; GET DEVICE STATUS + OR A ; SET FLAGS + RET NZ ; BAIL OUT ON ERROR LD A,C ; INDEX SLA A ; SHIFT TO INDEX BITS ADD A,$C1 ; CMD OFFSET @@ -316,6 +325,9 @@ DSRTC_GETBYT: ; E: VALUE ; DSRTC_SETBYT: + LD A,(DSRTC_STAT) ; GET DEVICE STATUS + OR A ; SET FLAGS + RET NZ ; BAIL OUT ON ERROR LD A,C ; INDEX SLA A ; SHIFT TO INDEX BITS ADD A,$C0 ; CMD OFFSET diff --git a/Source/Images/Common/ZDE.COM b/Source/Images/Common/ZDE.COM index c332ff51af604f562019719a28b80528975593d4..f58310ba1bea46e12b278a3e1e50c8e42b48a037 100644 GIT binary patch delta 20 ccmZqZU~K4M+%U(S_3PO+CLcF1G>_*20A5cCBme*a delta 20 bcmZqZU~K4M+%U(SmE-Ih6OPRb&Et6hPnQQy diff --git a/Source/Images/d_cpm3/u0/ROMWBW.TXT b/Source/Images/d_cpm3/u0/ROMWBW.TXT index 95717ee4..3e6be3be 100644 --- a/Source/Images/d_cpm3/u0/ROMWBW.TXT +++ b/Source/Images/d_cpm3/u0/ROMWBW.TXT @@ -1,23 +1,21 @@ This is a generic CP/M 3 adaptation for RomWBW. -To start CP/M 3, first boot into CP/M 2.2 or ZSystem. Then -switch to the drive that contains the CP/M 3 hard disk image -and run CPMLDR. You will be prompted for the disk unit -of the CP/M 3 image. +There are two ways to launch CP/M 3. First, you can run the command +CPMLDR from a CP/M 2.2 or Z-System command line. Alternatively, you +boot directly into CP/M 3 by choosing the CP/M 3 disk from the RomWBW +loader prompt. The CP/M 3 disk must be bootable in this case. -With the following exceptions, the files in this directory -came from the CP/M 3 binary distribution on "The Unofficial -CP/M Web site" at http://www.cpm.z80.de/binary.html. +With the following exceptions, the files in this directory came from +the CP/M 3 binary distribution on "The Unofficial CP/M Web site" at +http://www.cpm.z80.de/binary.html. -As documented in the "README.1ST" file, the included -files have been patched with all applicable DRI patches -per CPM3FIX.PAT. +As documented in the "README.1ST" file, the included files have been +patched with all applicable DRI patches per CPM3FIX.PAT. In addition, the following have been added: -- INITDIR.COM was not included. The copy included is the - original DRI distribution, with both patches installed. +- INITDIR.COM was not included. The copy included is the original + DRI distribution, with both patches installed. -- ZSID.COM is the original DRI ZSID distribution, but - patched to use RST 6 instead of RST 7 to avoid conflicting - with mode 1 interrupts. +- ZSID.COM is the original DRI ZSID distribution, but patched to use + RST 6 instead of RST 7 to avoid conflicting with mode 1 interrupts. \ No newline at end of file diff --git a/Source/Images/d_zpm3/u0/ROMWBW.TXT b/Source/Images/d_zpm3/u0/ROMWBW.TXT index 3d2181d5..45528bd5 100644 --- a/Source/Images/d_zpm3/u0/ROMWBW.TXT +++ b/Source/Images/d_zpm3/u0/ROMWBW.TXT @@ -1,32 +1,28 @@ This is a generic ZPM3 adaptation for RomWBW. -To start ZPM3, first boot into CP/M 2.2 or ZSystem. Then -switch to the drive that contains the ZPM3 hard disk image -and run CPMLDR. You will be prompted for the disk unit -of the ZPM3 image. +There are two ways to launch ZPM3. First, you can run the command +CPMLDR from a CP/M 2.2 or Z-System command line. Alternatively, you +boot directly into ZPM3 by choosing the ZPM3 disk from the RomWBW +loader prompt. The ZPM3 disk must be bootable in this case. -You may notice that there is a ZPMLDR application on the -hard disk image. This application is equivalent to CPMLDR, -but it has some issues with the number of drives that -RomWBW supports. So, as indicated above, use CPMLDR to -launch ZPM3. +You may notice that there is a ZPMLDR application on the hard disk +image. This application is equivalent to CPMLDR, but it has some +issues with the number of drives that RomWBW supports. So, as +indicated above, use CPMLDR to launch ZPM3. -I have not found a way to make ZPM3 start up with any drive -other than A: as the system drive. So, during the load -process, the boot drive and drive A: are "swapped" so that -the boot drive is always drive A:. Use the ASSIGN -command after starting ZPM3 to see how the drives get -mapped. +I have not found a way to make ZPM3 start up with any drive other +than A: as the system drive. So, during the load process, the boot +drive and drive A: are "swapped" so that the boot drive is always +drive A:. Use the ASSIGN command after starting ZPM3 to see how the +drives get mapped. -Per ZPM3 standard, files are distributed across different -user areas depending on their usage. Normal applications -are in user 15. Help files in user 10. Configuration -files in user 14. +Per ZPM3 standard, files are distributed across different user areas +depending on their usage. Normal applications are in user 15. Help +files in user 10. Configuration files in user 14. -In addition to the applications provided in the ZPM3 -distributio, the normal CP/M 3 files are included in user -area 15. A few typical ZCPR utility programs are also included -in user area 15: +In addition to the applications provided in the ZPM3 distributio, the +normal CP/M 3 files are included in user area 15. A few typical ZCPR +utility programs are also included in user area 15: - ALIAS - ARUNZ @@ -47,5 +43,5 @@ in user area 15: It is a bit confusing, but the ZPM3 system file is called CPM3.SYS. This is the ZPM3 default configuration and I guess it is done this -way to maximize compatibility with CP/M 3. You will notice that -the startup banner will indicate ZPM3. \ No newline at end of file +way to maximize compatibility with CP/M 3. You will notice that the +startup banner will indicate ZPM3. \ No newline at end of file diff --git a/Source/RomDsk/ROM_1024KB/ZDE.COM b/Source/RomDsk/ROM_1024KB/ZDE.COM index c332ff51af604f562019719a28b80528975593d4..f58310ba1bea46e12b278a3e1e50c8e42b48a037 100644 GIT binary patch delta 20 ccmZqZU~K4M+%U(S_3PO+CLcF1G>_*20A5cCBme*a delta 20 bcmZqZU~K4M+%U(SmE-Ih6OPRb&Et6hPnQQy diff --git a/Source/RomDsk/ROM_512KB/ZDE.COM b/Source/RomDsk/ROM_512KB/ZDE.COM index c332ff51af604f562019719a28b80528975593d4..f58310ba1bea46e12b278a3e1e50c8e42b48a037 100644 GIT binary patch delta 20 ccmZqZU~K4M+%U(S_3PO+CLcF1G>_*20A5cCBme*a delta 20 bcmZqZU~K4M+%U(SmE-Ih6OPRb&Et6hPnQQy From 77cc5d14a98b576651213fc2a583385f413f6cc2 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 31 Mar 2020 15:22:02 -0700 Subject: [PATCH 07/16] Minor RTC Updates --- Source/Images/d_bp/u0/LDDS.COM | Bin 3200 -> 3328 bytes Source/Images/d_bp/u0/LDNZT.COM | Bin 3200 -> 3328 bytes Source/Images/d_bp/u0/LDP2D.COM | Bin 3200 -> 3456 bytes Source/Images/d_bp/u0/SUBMIT.COM | Bin 1280 -> 1280 bytes Source/Images/d_zsdos/u0/CLOCKS.DAT | Bin 26240 -> 26240 bytes Source/Images/d_zsdos/u0/LDDS.COM | Bin 3328 -> 3328 bytes Source/Images/d_zsdos/u0/LDNZT.COM | Bin 3328 -> 3328 bytes Source/Images/d_zsdos/u0/LDP2D.COM | Bin 3456 -> 3456 bytes Source/RomDsk/ROM_1024KB/CLOCKS.DAT | Bin 26240 -> 26240 bytes Source/RomDsk/ROM_1024KB/LDDS.COM | Bin 3328 -> 3328 bytes Source/RomDsk/ROM_1024KB/LDNZT.COM | Bin 3328 -> 3328 bytes Source/RomDsk/ROM_1024KB/LDP2D.COM | Bin 3456 -> 3456 bytes Source/RomDsk/ROM_512KB/LDDS.COM | Bin 3328 -> 3328 bytes Source/RomDsk/ROM_512KB/LDP2D.COM | Bin 3456 -> 3456 bytes Source/ZSDOS/Clock/Build.cmd | 2 +- Source/ZSDOS/Clock/CLOCKS.DAT | Bin 26240 -> 26240 bytes Source/ZSDOS/Clock/LDDS.COM | Bin 3328 -> 3328 bytes Source/ZSDOS/Clock/LDNZT.COM | Bin 3328 -> 3328 bytes Source/ZSDOS/Clock/LDP2D.COM | Bin 3456 -> 3456 bytes Source/ZSDOS/Clock/ReadMe.txt | 24 +++++++++++++++---- Source/ZSDOS/Clock/preclock.lib | 2 ++ Source/ZSDOS/Clock/{hbclk.z80 => wbwclk.z80} | 20 ++++++++-------- 22 files changed, 32 insertions(+), 16 deletions(-) rename Source/ZSDOS/Clock/{hbclk.z80 => wbwclk.z80} (88%) diff --git a/Source/Images/d_bp/u0/LDDS.COM b/Source/Images/d_bp/u0/LDDS.COM index f4b235fc2fcf6195f335172ec4ceb1987873e206..357f1360b5d5a24296c6dc454acb61e9f02459c9 100644 GIT binary patch delta 1717 zcmZuxZA?>F7=F*Wx2J$udhx4;P|xkfQQF9tK?q{)@C)67jxG{qQ#)nKhJZjsBeZo{ zO!jL^x5W8lQxikBWho2{P7)UzP&GF1<9LUL z;f68Xttv5^nVpF-wVQ%%|ARSWkB3(U_VSk2j>eW|Kv_XSBt{)%ut&(xLaZJSAUyqO zz^qC$GnQqV32cuL=UO4Z@^8T{kgf|QC1#%OE;H-(47wv-r^`t~uZOg#Uh5RdNV5rz zl&%ZcnoWBB3bUL7_S?Z*-pF|&-}I4b0z>^SRHaO^Zf%m`AxF#>^O0kuQY>^J@~v~o zluoKaW!KP6bhJH-OJ=a|RJJAdq9Ufo9rID_NQ=cS6mu9;pJw3D zrr6{A8P`wb{p!oxWxMAtHA}g3UfqLg*ZE4dw&g%wRUNOc+O)<03dXv&#zPHlV3hgw zh!nH&(*H4@wJ0tqhF3a&LtA4*`+wu1r@G!op-}f%7HX>sSMz1T z1SBOcbS3@cJXc;qg1tPaRC^EP#enbWJdkwI`x1&GeF^PKn>GdGSJfx-FW`)Tn}PEL z$e)ArG&mW!2{=!IQlo5$%U{FF5#^xL8Y4Z>>N)sA9RV=Dg@_!WA3|H#R*%uo;RX$m z?c{xOm~@jJ>->Bhrh|jj1MXAcB%lP9$dzD^stp5Y?%7)^&Vc+CTrR&{A;Okzo}Ds0 zv_BwYqSQz=k&qlFbM3YR?*9Rd9-e$1Kj6`-IAf#OSIx5?d780XOr$y zS9U`0L#s}QJ6-crFCpHUr*ro`R_iK$qPy(zA#P?FD?zco*eqS56WR?L8($sbe-Qj@ zjIa;}jviO6FVzI;WJcn!GaPwZl=j|yZ2M7~o{us+7FRu*T&I0Vuk4Y=sOp_5>7rU2 zZeYljUx^0->G9zG(6KFwbvk*HFGNR7MO@mnmbe_bFmFK! z5=VwyLewV0$Xz<}4~@%d0^?&iV^1PHy)R3^CiETd9Rs>5MI;op1XbK8S|KG& aAmvjCTR-tx0el=MG<_3&DJ(ViugAXvKP(*p delta 1546 zcmX|BZ%kWN6hHU9*IQsv`q-bmLg;RJOiBxnmIXID#Evn?Hf2a1%Rt>KD;twh0*$x~ zTHJ>vGckd@Z+>znhD;N{2_bQD88l4ZwyVK}%|sWitVC>{35iqG*?L=y=fgYip7T5B z{?57Q-jTu)OK~(GjjpwD1R#sYqE8=aH@e%6^;$I`Ix$u(kL^F~m_iG2B!KuaF4V7) zZCig)k+_kvBy2@s3Ew2V9R55uN0xM7#n`mFR59v4m(ex?VOgHNtMf^IUgyJdvMR0E zx0a_9pJgKpvQA*~%DL_V(mmiIVB?K+8q@n&5|S^Hb~>SYIXSY9?Kw1s?c3=sEalM& zTuBaI=nGvWl@P5GGVA7Gi1Y_81mE(%(Gy^HX*JnODw!)UhcIbPySjVN61E3r>29)g zclQgE1w{ocC;gI_&aG{Noler=KSP3jq3&QWFq@*NKXFzxp(4J#kdbvdf$`HXwHq}t zl``$329SPbL>u|?+V6P>kA`MQk;7%wJ1`8ZL+|fJ3B3byCiT`59!1X^7(yPJnLlsP zJ1UH}EU?@Q-}R{1`Eo;-VVUK5$Tws?!o&0tW(%88B-mMns#mD8GTtqlyyJ|QkyYko zY$3)fUBlfiuJ(B9KNg7HKBdCc2zH6}Bxo&=c%@lbu$&l{PMG^SIKr=tmKlK-+z= zxow46SG2HvYIczYO25ZNBUoOS+Y)rzk7HWgn#au6oLJn%vG&EZC;3e1DqdgBzcX6) zmACAa^w^;o#nR2F;c0E?qdKk89}4(F{tJD9e$w4bjt?;H>+^R8Du}y=yyWjE?%LYj zpt|rksu$zBhN>3QaQK*yv;{gt!T$6dWW=qwfRMwzp+J8ZizZ#n_dhmMUS5vs#`8xd z4iw$jpwRtFICAT>_hNZconZ-5q zwIC)C{SZ(w7XQrr?7^awbJTFzm~So|yjUP_HUFV4EZ4)hy?C;E2AE6S1(reQptDW= zBxg&6rP~71bqo^5ITD8r)m^AWMJDbUxWfn82-l}>OD5JIiAM-Fo%#U}r~66~eS{Xo zLzwR7=7v5vJA7^0-ot>jiW6Ib{)i^;?Y(E&Y3o8)b`CCx2h*kn@%gmMojiF0n`7lJ zKC)t2F>l1^BBEcQTcmRG#33sS5MiUdI*)a^vCE z$UDbm^G0%vY-53}6>;$hKHbflv6Sd{4#em`NUg{%j3h43+IdNUXd4$j$(cYjp#+;A z_LgL&$E~^KH7+w#!sYG9z3IU*3qTN%QA9?Y0I~su5k%OJNW5?vfp-K7z&i?AX7*;Y bhuzEBfCyw%V3Aqu15gT3mev_jJ-GH?D@pnP diff --git a/Source/Images/d_bp/u0/LDNZT.COM b/Source/Images/d_bp/u0/LDNZT.COM index 521fc3aa23d4d1d625098aca84b0901cfff24208..87cf0b47f15c4fd34f46fb0b3221f939debada58 100644 GIT binary patch delta 1596 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 delta 1427 zcmX|BO>7fa5T3WY-p#McCUv@wi}johjbp>c4nidmq7Xnp(uou*-haO7R9ulf1iV9LIVnH$GRf<~E9?HQrMheze;?N)U$LZLqI)@$2 z%=hMf-^2**n9^hKZ6$eQ7%JwBfkvJrPni&*#uk=N znT+9$lA{c)-^A~3(?8)`Ovg=W?DGTPUG_knVh=@=pz?1M*pj~L3T(2} zqi~=ZzHW`})Z&E^kCOmYp8f2Oi-0DwZQ3nS$YyK)#_G+u-t2tn;ct&L-{+ctTuiM% z$s7PVGdQ+uDeSkvUE$Eh+mZmu&5(Sj1Zjl+UHh(Z03ogb3-ASe2M+pF9d!^!#O=!e}{jMh&U2vJZ$ZSGmoayb4dmArurP&IvTMl-W23R8iB|sB^Ar)xijYM}>4ZfrR7eEjY gg0lr$`htKUd_u~8N3#36bfMGc6AK#&~@_k4_2t0+{-M_SUY(wkZhQI7DzTv zehVbqCiAk$Gj>hZ1(JP}eSzfU$+?LeaxyQgJmcEQ zxmVD)WK`1SbDal&$w* zcq(vt0fRx~JjLY>yn+l9m{=LC!x$GxZ%ueD+S1RE0r z2Ll7QjZP#_fI;iA#~k*Od)_cM)p>Tx9_2gOz}u4`ytTop?9koG`qm5r4Geq%1q{w- Q9V91junO2*pTx)l0Fh6UKL7v# delta 387 zcmZoT%h+(1QHVhS0T>u~8CE>nC=|e~?d0s^4Uwp1U}pHq#efPtTpdF^be%l?gB5Bf z=Q7JPHcajXlFgIX0?D??XMtqrL5glBS7+hoX?@Q$t3c8~KK_jxaGYG&m>-@VFjkV6-R*Q=06; zy70gOhhU>Qy=uWT8YVcYOg@#wB)Q>UvT1|D)2}R|Dp!A2Ks@Q~z#vf~!PxG}AhSrS zh=EPO_y|)YuO&l9gTn&$tOF*@Wou-UHf&(nXUDL~$>a%xJQEv(br=&^>ElzG)!A=O z{>#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~An2orY z*%Zzzaxq_2P+??cc)LN0`R#_++F}gxc8n(lxtJN*fMP&tHpTM_%s`=U|4&Zt;z<;B NWME)oVvuJ*0RTRTGb{iA delta 212 zcmZpWYLME%$;Rqu5$5VUnV(H*vH{yARWMJ%!^zV>Siw0bKRH_g0u1#G7$9;{76y}5 z*l$kaV6(B*KWm|1_b#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~Sn2l~R zu_>Hayv1};L4}c(;q3+~=C>POYl|_&+cBOLyv4-G1{4EIvnifeUAu-}}-!DeHrf7U|3?q7m|0wV(hcg4mNN7)n~KNk1{6g^lsSzY6e0rRm0^=nM( zH@2T-00Tt^hNpZCibnb;CmXWu+r+8CY;==}P2s$PhT=`8i;S!cZ#PIWzuoX!TZ|#z pj`5`6O(sS*pcqh+P4T<}Gf-&#NruT$Jkjh94h&384E8`{TmV8RLTLa1 diff --git a/Source/Images/d_zsdos/u0/LDP2D.COM b/Source/Images/d_zsdos/u0/LDP2D.COM index 40220f1733ff886d939c04b823edb5b71ef3d585..a89e03d8ce6902e7f0644f3a015bcf40892d9803 100644 GIT binary patch delta 191 zcmZpWZjj!<$tD?;pBwHJuHfP1=^w1%oRgoN&7c4Vla<&WC}GM%Bn|Zp86a|#)!A=O z{>#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~2n2n5> z*%Zzz8Zlo~P+??cc)LN0`R#_++F}gxc8n(ljhGqPfMP&tHpTM_%s`=U|4&Zd#FNJE P$iTqF#2`P}kS!4aA38Ye delta 218 zcmZpWZjj!<$tLM%5$5Wv;Nj%yAFSYAu-}}-!DeHrf7U|3?q7m|0wV(hcg4mNN7)n~KNk1{6g^lsSzY6e0rRm0^=nM( zH@2T-00Tt^hNpZCibnb;CmXWu+r-(xY-GsHrf^~Hn$jrzF6az}KDV|qg1`4e|$uM~nPa3;}0|OHigFVogL;&SpK&Joz diff --git a/Source/RomDsk/ROM_1024KB/CLOCKS.DAT b/Source/RomDsk/ROM_1024KB/CLOCKS.DAT index a78c2d6c8e63fd79ee91657c92b217018686367e..e64c7e059b1d82f274f0c977c3f2ed53a0751130 100644 GIT binary patch delta 456 zcmZoT%h+(1QHVhS0T>u~8N3#36bfMGc6AK#&~@_k4_2t0+{-M_SUY(wkZhQI7DzTv zehVbqCiAk$Gj>hZ1(JP}eSzfU$+?LeaxyQgJmcEQ zxmVD)WK`1SbDal&$w* zcq(vt0fRx~JjLY>yn+l9m{=LC!x$GxZ%ueD+S1RE0r z2Ll7QjZP#_fI;iA#~k*Od)_cM)p>Tx9_2gOz}u4`ytTop?9koG`qm5r4Geq%1q{w- Q9V91junO2*pTx)l0Fh6UKL7v# delta 387 zcmZoT%h+(1QHVhS0T>u~8CE>nC=|e~?d0s^4Uwp1U}pHq#efPtTpdF^be%l?gB5Bf z=Q7JPHcajXlFgIX0?D??XMtqrL5glBS7+hoX?@Q$t3c8~KK_jxaGYG&m>-@VFjkV6-R*Q=06; zy70gOhhU>Qy=uWT8YVcYOg@#wB)Q>UvT1|D)2}R|Dp!A2Ks@Q~z#vf~!PxG}AhSrS zh=EPO_y|)YuO&l9gTn&$tOF*@Wou-UHf&(nXUDL~$>a%xJQEv(br=&^>ElzG)!A=O z{>#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~An2orY z*%Zzzaxq_2P+??cc)LN0`R#_++F}gxc8n(lxtJN*fMP&tHpTM_%s`=U|4&Zt;z<;B NWME)oVvuJ*0RTRTGb{iA delta 212 zcmZpWYLME%$;Rqu5$5VUnV(H*vH{yARWMJ%!^zV>Siw0bKRH_g0u1#G7$9;{76y}5 z*l$kaV6(B*KWm|1_b#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~Sn2l~R zu_>Hayv1};L4}c(;q3+~=C>POYl|_&+cBOLyv4-G1{4EIvnifeUAu-}}-!DeHrf7U|3?q7m|0wV(hcg4mNN7)n~KNk1{6g^lsSzY6e0rRm0^=nM( zH@2T-00Tt^hNpZCibnb;CmXWu+r+8CY;==}P2s$PhT=`8i;S!cZ#PIWzuoX!TZ|#z pj`5`6O(sS*pcqh+P4T<}Gf-&#NruT$Jkjh94h&384E8`{TmV8RLTLa1 diff --git a/Source/RomDsk/ROM_1024KB/LDP2D.COM b/Source/RomDsk/ROM_1024KB/LDP2D.COM index 40220f1733ff886d939c04b823edb5b71ef3d585..a89e03d8ce6902e7f0644f3a015bcf40892d9803 100644 GIT binary patch delta 191 zcmZpWZjj!<$tD?;pBwHJuHfP1=^w1%oRgoN&7c4Vla<&WC}GM%Bn|Zp86a|#)!A=O z{>#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~2n2n5> z*%Zzz8Zlo~P+??cc)LN0`R#_++F}gxc8n(ljhGqPfMP&tHpTM_%s`=U|4&Zd#FNJE P$iTqF#2`P}kS!4aA38Ye delta 218 zcmZpWZjj!<$tLM%5$5Wv;Nj%yAFSYAu-}}-!DeHrf7U|3?q7m|0wV(hcg4mNN7)n~KNk1{6g^lsSzY6e0rRm0^=nM( zH@2T-00Tt^hNpZCibnb;CmXWu+r-(xY-GsHrf^~Hn$jrzF6az}KDV|qg1`4e|$uM~nPa3;}0|OHigFVogL;&SpK&Joz diff --git a/Source/RomDsk/ROM_512KB/LDDS.COM b/Source/RomDsk/ROM_512KB/LDDS.COM index 9be1d4a45139333d65f58e61ba2cc62f11ed55fd..357f1360b5d5a24296c6dc454acb61e9f02459c9 100644 GIT binary patch delta 186 zcmZpWYLME%$;K9xpBwHJKADeAX|f^PMI{JV!NbYZKUl#zCqFq`0SpZF3>lzG)!A=O z{>#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~An2orY z*%Zzzaxq_2P+??cc)LN0`R#_++F}gxc8n(lxtJN*fMP&tHpTM_%s`=U|4&Zt;z<;B NWME)oVvuJ*0RTRTGb{iA delta 212 zcmZpWYLME%$;Rqu5$5VUnV(H*vH{yARWMJ%!^zV>Siw0bKRH_g0u1#G7$9;{76y}5 z*l$kaV6(B*KWm|1_b#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~2n2n5> z*%Zzz8Zlo~P+??cc)LN0`R#_++F}gxc8n(ljhGqPfMP&tHpTM_%s`=U|4&Zd#FNJE P$iTqF#2`P}kS!4aA38Ye delta 218 zcmZpWZjj!<$tLM%5$5Wv;Nj%yAFSYAu-}}-!DeHrf7U|3?q7m|0wV(hcg4mNN7)n~KNk1{6g^lsSzY6e0rRm0^=nM( zH@2T-00Tt^hNpZCibnb;CmXWu+r-(xY-GsHrf^~Hn$jrzF6az}KDV|qg1`4e|$uM~nPa3;}0|OHigFVogL;&SpK&Joz diff --git a/Source/ZSDOS/Clock/Build.cmd b/Source/ZSDOS/Clock/Build.cmd index 55bcd8db..8b14f5c5 100644 --- a/Source/ZSDOS/Clock/Build.cmd +++ b/Source/ZSDOS/Clock/Build.cmd @@ -11,4 +11,4 @@ set ZXBINDIR=%TOOLS%/cpm/bin/ set ZXLIBDIR=%TOOLS%/cpm/lib/ set ZXINCDIR=%TOOLS%/cpm/include/ -zx ZMAC -HBCLK -/P +zx ZMAC -WBWCLK -/P diff --git a/Source/ZSDOS/Clock/CLOCKS.DAT b/Source/ZSDOS/Clock/CLOCKS.DAT index a78c2d6c8e63fd79ee91657c92b217018686367e..e64c7e059b1d82f274f0c977c3f2ed53a0751130 100644 GIT binary patch delta 456 zcmZoT%h+(1QHVhS0T>u~8N3#36bfMGc6AK#&~@_k4_2t0+{-M_SUY(wkZhQI7DzTv zehVbqCiAk$Gj>hZ1(JP}eSzfU$+?LeaxyQgJmcEQ zxmVD)WK`1SbDal&$w* zcq(vt0fRx~JjLY>yn+l9m{=LC!x$GxZ%ueD+S1RE0r z2Ll7QjZP#_fI;iA#~k*Od)_cM)p>Tx9_2gOz}u4`ytTop?9koG`qm5r4Geq%1q{w- Q9V91junO2*pTx)l0Fh6UKL7v# delta 387 zcmZoT%h+(1QHVhS0T>u~8CE>nC=|e~?d0s^4Uwp1U}pHq#efPtTpdF^be%l?gB5Bf z=Q7JPHcajXlFgIX0?D??XMtqrL5glBS7+hoX?@Q$t3c8~KK_jxaGYG&m>-@VFjkV6-R*Q=06; zy70gOhhU>Qy=uWT8YVcYOg@#wB)Q>UvT1|D)2}R|Dp!A2Ks@Q~z#vf~!PxG}AhSrS zh=EPO_y|)YuO&l9gTn&$tOF*@Wou-UHf&(nXUDL~$>a%xJQEv(br=&^>ElzG)!A=O z{>#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~An2orY z*%Zzzaxq_2P+??cc)LN0`R#_++F}gxc8n(lxtJN*fMP&tHpTM_%s`=U|4&Zt;z<;B NWME)oVvuJ*0RTRTGb{iA delta 212 zcmZpWYLME%$;Rqu5$5VUnV(H*vH{yARWMJ%!^zV>Siw0bKRH_g0u1#G7$9;{76y}5 z*l$kaV6(B*KWm|1_b#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~Sn2l~R zu_>Hayv1};L4}c(;q3+~=C>POYl|_&+cBOLyv4-G1{4EIvnifeUAu-}}-!DeHrf7U|3?q7m|0wV(hcg4mNN7)n~KNk1{6g^lsSzY6e0rRm0^=nM( zH@2T-00Tt^hNpZCibnb;CmXWu+r+8CY;==}P2s$PhT=`8i;S!cZ#PIWzuoX!TZ|#z pj`5`6O(sS*pcqh+P4T<}Gf-&#NruT$Jkjh94h&384E8`{TmV8RLTLa1 diff --git a/Source/ZSDOS/Clock/LDP2D.COM b/Source/ZSDOS/Clock/LDP2D.COM index 40220f1733ff886d939c04b823edb5b71ef3d585..a89e03d8ce6902e7f0644f3a015bcf40892d9803 100644 GIT binary patch delta 191 zcmZpWZjj!<$tD?;pBwHJuHfP1=^w1%oRgoN&7c4Vla<&WC}GM%Bn|Zp86a|#)!A=O z{>#oOYomYGTHjVdweDYnfdV4~19!#76Gzz;A3qlObJlvY0*5@K>0}3vy_+~2n2n5> z*%Zzz8Zlo~P+??cc)LN0`R#_++F}gxc8n(ljhGqPfMP&tHpTM_%s`=U|4&Zd#FNJE P$iTqF#2`P}kS!4aA38Ye delta 218 zcmZpWZjj!<$tLM%5$5Wv;Nj%yAFSYAu-}}-!DeHrf7U|3?q7m|0wV(hcg4mNN7)n~KNk1{6g^lsSzY6e0rRm0^=nM( zH@2T-00Tt^hNpZCibnb;CmXWu+r-(xY-GsHrf^~Hn$jrzF6az}KDV|qg1`4e|$uM~nPa3;}0|OHigFVogL;&SpK&Joz diff --git a/Source/ZSDOS/Clock/ReadMe.txt b/Source/ZSDOS/Clock/ReadMe.txt index 05aaa67a..0fc634f7 100644 --- a/Source/ZSDOS/Clock/ReadMe.txt +++ b/Source/ZSDOS/Clock/ReadMe.txt @@ -1,9 +1,23 @@ -This directory contains the source and assembled versions of the ZSystem Clock Drivers for N8VEM HBIOS. +This directory contains the source and assembled versions of the +ZSystem Clock Drivers for RomWBW HBIOS. -The hbclk.z80 source file can be compiled using Build.cmd which will produce a relocatable binary (hbclk.rel). +The wbwclk.z80 source file can be compiled using Build.cmd which will +produce a relocatable binary (hbclk.rel). -The relocatable binary should be added/updated in the stamps.dat libary. The stamps.dat file is just a standard LU type library and is easily updated using NULU. The members are the relocatable binaries, but with the .REL extension removed. +The relocatable binary should be added/updated in the STAMPS.DAT +library. The STAMPS.DAT file is just a standard LU type library and +is easily updated using NULU. The members are the relocatable +binaries, but with the .REL extension removed. -SETUPZST is used to create runnable executable (.COM) files. An executable has been created for DateStamper (LDDS.COM) and P2DOS (LDP2D.COM). The executables are all configured for operation as an RSX (resident system extension). +SETUPZST is used to create runnable executable (.COM) files. An +executable has been created for DateStamper (LDDS.COM), P2DOS +(LDP2D.COM), and NZTime (LDNZT.COM) . The executables are all +configured for operation as an RSX (resident system extension). -The STAMPS.DAT file here is a version that I cobbled together. Using the STAMPS.DAT file included in the ZSDOS distribution results in a load file that does not work. It claims to load, but is not present. I found a "fixed" version of STAMPS.DAT on the Walnut Creek CD-ROM which works, but was missing the NZ and NZP2 stamp variants. So, I added those variants to the working version of STAMPS.DAT which is included here. +The STAMPS.DAT file here is a version that I cobbled together. Using +the STAMPS.DAT file included in the ZSDOS distribution results in a +load file that does not work. It claims to load, but is not +present. I found a "fixed" version of STAMPS.DAT on the Walnut Creek +CD-ROM which works, but was missing the NZ and NZP2 stamp variants. +So, I added those variants to the working version of STAMPS.DAT which +is included here. diff --git a/Source/ZSDOS/Clock/preclock.lib b/Source/ZSDOS/Clock/preclock.lib index fd7d711e..8c539963 100644 --- a/Source/ZSDOS/Clock/preclock.lib +++ b/Source/ZSDOS/Clock/preclock.lib @@ -10,6 +10,8 @@ TSTRD: JR TSTRD0 ; Jump around address store TSTRD0: LD (CKCLK+1),DE ; Patch GETTIM address in CALL CKCLK ; Get time to start with + DEC A ; WBW: 1 -> 0 + JR NZ,BAD ; WBW: NO GOOD LD A,(HL) ; Get seconds CP 60H ; Check for valid digit JR NC,BAD ; >= 60h diff --git a/Source/ZSDOS/Clock/hbclk.z80 b/Source/ZSDOS/Clock/wbwclk.z80 similarity index 88% rename from Source/ZSDOS/Clock/hbclk.z80 rename to Source/ZSDOS/Clock/wbwclk.z80 index f28c6af1..05c43b9c 100644 --- a/Source/ZSDOS/Clock/hbclk.z80 +++ b/Source/ZSDOS/Clock/wbwclk.z80 @@ -1,15 +1,15 @@ - TITLE "N8VEM HBIOS Clock Interface" + TITLE "ROMWBW HBIOS Clock Interface" SUBTTL "Description of Clock Module" ;=================================================================== -; HBCLK.Z80 -; HBIOS Clock driver for N8VEM Z80 Series Computer +; WBWCLK.Z80 +; HBIOS Clock driver for RomWBW System Software ; Wayne Warthen -; Version: 18 Apr 2014 +; Version: 31 Mar 2020 ;=================================================================== -VERS EQU 10 +VERS EQU 11 .Z80 - NAME HBIOS + NAME WBWCLK MACLIB CLOCK.LIB @@ -17,10 +17,10 @@ VERS EQU 10 DESCST: DEFW 0 ; Pointer to static year value if required -CLKNAM: DEFB 'N8VEM HBIOS Clock ' ; Exactly 24 chars in name +CLKNAM: DEFB 'RomWBW HBIOS Clock ' ; Exactly 24 chars in name DEFB VERS/10+'0','.',VERS MOD 10 +'0',0 -DESCR: DEFB 'N8VEM Z80 Series HBIOS Clock',0 +DESCR: DEFB 'RomWBW Series HBIOS Clock',0 IF [$-DESCST] > 256 OVER2 @@ -55,9 +55,9 @@ GETTIM: PUSH HL ; Save final buffer pointer LD HL,TIMBUF ; Point to temp buf for HBIOS read LD B,20H ; HBIOS Read Clock function = $20 RST 08 ; Call HBIOS to get time - JR NZ,ERRRET ; Error return LD HL,TIMBUF ; Source is start of temp buf POP DE ; Destination is buffer provided originally + JR NZ,ERRRET ; Error return LD BC,5 ; Copy just the first 5 bytes LDIR ; Do it LD A,(DE) ; Save the original seconds value @@ -80,7 +80,7 @@ WRCLK: LD DE,TIMBUF ; Copy to temp buf LD A,1 ; Signal success RET ; Done ; -ERRRET: XOR A ; Error +ERRRET: OR 0FFH ; Error RET ; Done ; TIMBUF DEFS 6 ; Temp date/time buffer From 2e2d2bebd75a98160898e270a3f63fa766a74afe Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sat, 4 Apr 2020 10:48:34 -0700 Subject: [PATCH 08/16] Finalize v3.0.1 Cleanup release for v3.0 --- ...ing_RomWBW_Using_a_Hybrid_SD_Card_v1.1.pdf | Bin 0 -> 234390 bytes Doc/RomWBW Applications.pdf | Bin 140215 -> 140215 bytes Doc/RomWBW Architecture.pdf | Bin 371095 -> 371099 bytes Doc/RomWBW Getting Started.pdf | Bin 166704 -> 166706 bytes ReadMe.md | 2 +- ReadMe.txt | 2 +- Source/CPM22/loader.asm | 2 +- Source/CPM3/loader.asm | 2 +- Source/Doc/Common.inc | 2 +- Source/ZPM3/loader.asm | 2 +- Source/ZSDOS/loader.asm | 2 +- Source/ver.inc | 4 ++-- Source/ver.lib | 4 ++-- 13 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 Doc/Contrib/SC126_How-To_No_3_Updating_RomWBW_Using_a_Hybrid_SD_Card_v1.1.pdf diff --git a/Doc/Contrib/SC126_How-To_No_3_Updating_RomWBW_Using_a_Hybrid_SD_Card_v1.1.pdf b/Doc/Contrib/SC126_How-To_No_3_Updating_RomWBW_Using_a_Hybrid_SD_Card_v1.1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0a7d2ab1308bc76d74b718496b5e1c997e1600dd GIT binary patch literal 234390 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