From d9bed4563ea1a04a3e5b1fcf3fbb40c8aaaaf8bd Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 5 Apr 2020 16:01:04 -0700 Subject: [PATCH] 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 zcmai43$)E;7Vn;t5Uxae>9POme;qo+#IL#1ebC-*K^#; z?LQ9Qe9(y0;_tuxc;=&bvq3v%KtpV>?z& zn^RmhVr<3Mv%mP{=MOjSmcQITed;yEJ^QtO`PD{k|ImBb#O-aXCmhzU`tj2~O0Sw- zYPt+LV)^rZe#cVs#~ie`;WY5+OPfZKD6(no7%+51G~L`^(C9u zY%V@&!wXw>J@cPK9Nm0NlJiBKt zY}4+E0e5fvyk_TZf7sb^%HA9-syuIP|kO5QnY*(2lB?nxULcCLKmhlgj}Ue@}}DVv{!g^u(ky}NYX^J8(J zK}RM%zZiJkgzAm;S2RkGsy=7-(jS(zJ9XO6MXOdk()!zZt?pWB9_V-2+xL!m>GrWoz0z@yzo@51#N-&$X*{wg;*E4E*7>h}8w{<+4yyyg8>;}@NFVEePbJE{502VZ$_ z;}@$2|GmTR9rcI3w&j*>U+nkJvbAeERj-%JPkUhEu*OY?_V4!f#WULs@4DgUUFpW7 z=Wn|9-K$rvdGW^HO^>PUI&)3mblX0wzhB*A#GT!5Du3emibX?jXm#uEt=nI{YwgA3 z-|=s3t=X~s)zZmx`yKgo`|202t#tQ2)ai`BZuzEJquB#)nm)h5jj2Vux>c>bbw#81 zrVJXe2J1Ud>~wogRrAT|jyI$`7R^t0Oxey>S}TR`BK)yJ9NVekiM=krsC#+E@RE+* zyDFiCFrrpu>4L$jmZ_AnN%fFahtA%Xh|GT_qe~iQ{x6L&(iE-BxSv ziiPOCug>9mgYJx*K6-oqMg7&dcx4sZTM-h{0!&BqZrtnAn1`WEg6qXqoxu>Zvf|iA{l>Aas8nM?w zLvm>-q;z~k=u%Hg83Q|5!M-Haq|n|Zn@6NNq*>Y^y;+J#1^?1LlyU5QWto+wa*@e- zU2FODK9BU4g{Cx-<&!jyxD7z10$(#hQ1Fl@IO;(m1N=o_=aunv&BUk@IkJvCk;p10 z9ub^$i)aONP>_}xC_3)k=zOiN%H|0G+A69H)MQ>&NwX_c%|{_V1bwPPK_GB~gbWNj zA;;dR48VZAQRxr>C!^}94@yUtnTR$PTflf0TY&g16lPy9lv9zqSh-xy$is;;Ml&-x zrK!(U@C?&cFm)WF1Fa(}09*@fkro1rj@}SOC>9C|p(SFtKslouSVCxt3P$9x#{8|d zi#{p3v<@d|nN7ZY?rF^v7h6!@BHSErD@fQ>6@PD~h`l}Ve?spcoscrwxR2gTs2oCVtZ zWDK@o1lS_b=o4Tj#t^WDq__#5$f%6fC}PAURsv}DuH|#fA`58*S?w%Sw$ZZpfWgp+ zv^wxhTdxYk9=T<$4@?<|zz+72RTLX6YXd9*nCXH^vNMoIlI9kw7ONYe(2SD+Oc*C| zBC_;w;7K$+Y(N0jx};4ux12D6niZ)kbTapEb>$I>moE+*5J6J2mYSAAM0*NpIe`PLot`23?jjVNZ#?_7y z4`(AQ-dJOpg4B}?f?Y6Gv@(fDbaV4hLaJ9*({hRjJSzSd+o{qz{^clW903 z&=|)AUJ>liY!RbK=3)yr8_6`vG(LdCIpEBuHo9#F*uh~&MNAiLWc?8QmNip8won?` z+yHBg)&&n1Ob9*|-Rd++wuIU5Dv2dyf=~qEkdl6FG?}VlWH2OdA16 z+NW`hn8LA`@tzTiOj_`R(K!}+5C?+>7p{qj)jYuH-#;K=(a{@bl(WE{%P`0Vo5-tq zq(NK|lI^Wnogsx2cF3Xx7EKRxyI{viNks6?*GT zXU*0u`*sD^Nokdc9*udSZt}q-w2Il=WVs_45w!x8F=#JT#u|7CT|U;q zwGZAW2!kWD1jGlZ2YYeEH)(n>CS8Tln$ZRSE|in_dPH;q!I>!|IRtBr0AP(xjWUyb zg6Y@~o@4t-N7EAlgSkHmLM$pu=dp${Eq#e%-8;VY35tDK%QcuefCc@^VP7@~AsA`V z!LUeKW6GAQdM#!z_atLd2ih)e#t&^ia+Ws*YBjJRIK^Inmero|q8OsUysTsqfzX@OOk`}jg%raTJKz>tMa$3EBJE}2)ZhD} zecK|e0SW1TIE5i_<{J(>M6w1?BEV>`f;BeX!5R-Ibo#lE4cUPT1lfcH87Q1d=1!|4 zxA47)xgVc_=u8G%@UVyf=%+SBJ(8Om2s5MFu*>5IKHYK8WWE+NW%lPXI0XEY$su%- z8C9vWp{HnlDn7z>FEeF5P6^#HP%u5UEmNku(xyk~QCiaN|B4JQDJ^X{wxaxsit$$r UAJH)L_ir(jh3b4i=ScaOsW9a>g%V+;l-or$ij=nuiYOtENSRbZ zKJrndxN{NiDy=>gvQqa-`N+L)B`b}4e^1T(zVq%qYu)~_oH_fPefGz1|Mq^~<&QUh z?eWI1u54Q%;_5L4XQo$PUfOSqX!h>T{=0^)-FV?69nTwgQ|t4GpHcW^gC|m5{j?V6 z`Z24%y$>AiE;s*_H5@x`q(YX%?aK5N|P`^KN%yV0ntPdTdWnI^9kkE-Zhe0`U* zk50ezN%7@VXFfi)`^u@MRh4~8I!yDo-0d5@)4b<(le=#2Kcmy`hX>4CyuMBUf~$Lp znOiTqYD2Ta)@S}uK4b0RE$uc{x=lylH*(fj9cDD|anjh2R~4*y-w*w==I_5uS#WT4 z)#{lqywU2{jbq!yFSk0sY0JWj=@0IGv-0MXert8y8N0i6>_76!?dkagZ0q}me7NP^ z8y>1|y5x_;npOU7;a6YoxU%`$xxX#lHLv;5i7UEq?l^eGj=ibNI=5N))V5OwRKD>- z)kPQ0{&Yl-#l34T`t^?Y&u{bQ{-67<7&vXP=-P4E*{{8I{OH0pGmq}XYs93h{gYS=6R{r$;0~hsc*ME|Eu=H6uHTBKCyZgS_{;J=*Oj$Jlr8Nh? z9eDShXMTUwf_vZCwt33f4|_e5Ue{#L5l!}2jobC;^#dCGFjZdO>&^-L)^?tK<<+wq zT~Tz_Z4>+MeCmUPeZP3DN$E4|2RD4Cd{=>5R&vGSb{qOO9kICWs@`)pJ-?{i(&bC% z9;_L6;HBzjw_Uk+;(#7ivtBs%x^%zyJJtNw@ADh)8TZQM2|b%GSX@2htj7la;JSQT zFz(Xsoi;Z8IDJ|5F&DoxWygfgyD!<(cFXDyyDZxD@VJq8b$)8ZIi0HRpLz0znrHhp zy6vll_kXgbsKX_D(&ru9afLp5&bOu7T)uq#Qn~fV89f?pIe1Oab)|!b9P#RoQ%nB& z)4wYpzhUHQqtBT%e9((KA8T>_@ZDc*8&FzP_<76e2mI#wy&6s~d#`$T$*@-+n4aEt z;;*lL_I}Sfoxa(#u~q3~{T964Zg!u!qyKTk^EVwoY*E86p5D9m!S)jl+&E~$?AZ@( z?fy%bogHk7F{%6^eL8;?YDILY1T$?(*uZxOA@~`OT zqQ=R8r7=dh{52t!@_fw*$@W?4;tQ@z6?Wx+iVQo#3*pHTN=X^TGjPNZdW146GIYC- zBwf=|X+`#F8+lFFA|KSUM&+ryQfWcVAdJvf5CLOVM3pkZOM0-?5e%AGGiz31t=E>W zc~xt|Q|fH=T2e#Vc-@#(;czFcruK5eS$e+{k>mS3Gl0WQR8OZ>WaFwEQiW;$CoAX^ zoD+tx)pM+u%*2t16ul!7Su$^#d8#ul_E$QM-t)8WTg&={c~;3?@~H`p!6(3qzn&;qD$mzU6qv=0 zw|O3Hkic48Re_L}kV0a(1##iC9}rrn3>GobuG;$|1>^uu<$lrxZ01PGgv^ydihMamwk4Ru$!K;0HQO zl|e;fp3zbWW^hC}RayfKthCk1DMruC#TOfuQh4ipa)a|2cJJpv6La;iw69#FI+Lr;bV$#$rUO0V`_I zDPkrES0D<2Ml#oYsM7jDYQEj_Bs9v^0gJ;}0qkLp1P@|}Z6YmeZI(+`gK|!D!C1VAzB`gEj|_r<$N~u? z%j^>Zd0b~CR&WerOk@}TuY?WKtqi(k!5Xz6UIr5eA$mnXE=V zJZy`c(X7VPiGff6*uyRIjs}p`&M;ZaYnip+hy~`1DB?2 zQD7y-ddu1X9Oo59I4GFOnJo4vC5kEN6)PN|+6>KLD@IYA2quFmr)K==z?*1pS&wjv zC*4|4n1GYBoPlj+=G@$|P&D5_2xrei3?wk321m(rwZ_eb391ZBOki_nW7cR+Sw?wW z(ii3{Bb*k7h7$^a$oDG31RVmawoYqCD4j;S(o0-Dve21&)q#XFE7+hyGkRdWy&PU~ zcu~Hh(9;8I==R8S>*AGsUkEf=od>MY^Sn$dP(H779!!XB1Vv|SnzwW4O$h%J08y4( z5wb9MUOZ=9s^M@4-bM>0AP6nD~V9%@p@+3nz8-`FoZiY}m=}cnfaN2vtU;{%2QhqTA!!(L0 zDB)Aq*L!a%=|l%>2!w$HVI#vo^cRx28p1&Nc*)p$Qrdgg6k@x|wgs8uhJ8-O1-Em% zW4mO`1#K#KT@bW6fGmnD4eG%8wGT4W8)W%4`faq*Ojt3*^+D6Q3uKW`OjbuG{<+>a zBDhFx2W0c69U4)@z*QWeVIIYj8AFQNgv`bkge}8M^kS?H3_{R%Ll)*GZ^S;v*D)$1 z6TUQ7km4j*1vat_4`}8{l0sIo30puX#m_@z<|_zU>0R6WMO=)Qg096?QxJ{D3wj2& zqbSntg3Xa|R|2}p#3l#5z$->ygMhp8_o3axEtD4oa1`p+AlY0L!k)n__GLPSEL0&A zXlg;$)!`56!<8BHHCF#X%_$y27*q26mtdl4SQ-V4D#^Y?mf?0tOP2w}I$DEQLgf&MK%))3r2pS}mSqoFb{59Z@Wo=Nv2cnGIbE7pU>r$@6p@RVdF)I#aZ8ekz zr)L)jt_)x{-~1vCc;^Ff5DJ>&XqFXy31m@x>BUCX!Jt|QGMZK@$R-2z!G|82^RY2( z*d5Tw5%WXX@oIyYF!LL*^tgIreTjxj#B~pJppUC8Pd-eJ*i{xLqPEC=rpi(i5o{j0 zKJ005VTL*mAByOKXtkNAF>P}3l1ZF?iQoc_(xhDR!WO}~^eT)}`5H(&-G|1wHWTWA z31}}vEbwUdMvr*{J1}r|fhix81#INYCSZcrka!i7cF>0WOOok3ojhZWQ3I^yhD5b| zS7OG?5FMn*MHEcXfYBU;Fq%oK4C)36Cy)ii7~98McXS9KS+)D(@%N>UK2h*y9=n{h z@%Bod2U1`l%PeM4q3Gqw1eLB?HvPocQr@u()TP=xvUz}wfdPuZHyR47$tP}RF^A5R zDifg=#Ovt2detv+pK;c3rpP!l05l}38&>^tv(dyLNCz}WOB+MBwvXa&|?DMR0 zBUCbpmBB~QMN~KPZoGtWxy}M#jksqdK%Iseh@}c~^ZV)v45yfY$qlFT5G?NvXw8iwE;05kaen3HW zcL3-j(INrnoK6_IiMVWXeRjfEdYVAsl`L7nN-0MMGsj?>+z(2_iM`J1nF}u1f=(4- zAH`q;AAopsjhadW$poY>Q3fDHf-C9&0MK+JkbqenADL(sK#n*%5WyOTP~>7%Q$iI5 zoQgK658a5kqAvk?WFVV-m0_2_PcD}C*W*P!&PMn!UYF=Z;Wl9tG+Hs=mZj^ 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