From d0ac04045a4a9988a6cda80c6bade76adb9652d6 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 29 Oct 2025 13:40:24 -0700 Subject: [PATCH] Preliminary Zilog SCC Support - Interrupts and flow control not yet implemented. --- Doc/RomWBW Applications.pdf | Bin 406386 -> 406386 bytes Doc/RomWBW Disk Catalog.pdf | Bin 257670 -> 257670 bytes Doc/RomWBW Hardware.pdf | Bin 377981 -> 380605 bytes Doc/RomWBW Introduction.pdf | Bin 96448 -> 96447 bytes Doc/RomWBW System Guide.pdf | Bin 632906 -> 632906 bytes Doc/RomWBW User Guide.pdf | Bin 572569 -> 572569 bytes ReadMe.md | 2 +- ReadMe.txt | 2 +- Source/Doc/Hardware.md | 37 +- Source/HBIOS/Config/SZ80_std.asm | 2 +- Source/HBIOS/cfg_MASTER.asm | 22 + Source/HBIOS/cfg_SZ80.asm | 24 +- Source/HBIOS/hbios.asm | 15 + Source/HBIOS/hbios.inc | 1 + Source/HBIOS/invntdev.asm | 1 + Source/HBIOS/scc.asm | 1076 ++++++++++++++++++++++++++++++ Source/HBIOS/std.asm | 6 + Source/ver.inc | 2 +- Source/ver.lib | 2 +- 19 files changed, 1174 insertions(+), 18 deletions(-) create mode 100644 Source/HBIOS/scc.asm diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 99763853e123561d614fed2274c7ffc25243fdd0..dcc0a2947db109caebe7bc883cd0ab4d30bf210a 100644 GIT binary patch delta 457 zcmezLOybisi3!sg%_q)q(feb$_r-d7*)@+7Gj^`Ie7HZvq05<5Cb9N@m+O(rE`>Om zz_zbU`};eD0#8jowsfMmS%ySE>ZQ5!$0<2XVd&JGQ_i&5yxdnjW|Ime%y!)2@5fr$%bl)|=$5KhNx2CMP_h;%k<)M?}?`i)_i; z`oFxp@w@ul*`5DC<;AA%-(|9CyZrnkPl7%Mm^`hWb!C}^@BhLI&zmvtmOWUx{)pTE z8SDaTRmAbb7m6a6x67|=5NQ{(IP`0uXm`hF5yw3i zi+EnM*2xR1E}Ej=yLmDfqjG(qa^?%QC%gEobT_!o;(yb9H{?!0)Yj0cZSy51WV;Kb zKH6^5R%M#)r!#xX3>U;OXx7LTmMLQv7mzJ?%$!S zc4?nqcWTFTUWbJ*@02TDZ7isM7kzKaulmUxH#@bK9MI$DcV4ZvS#vIDf9O(P|J3hG zXK#>5GiVRq+;}VJ)VV!CyY;r~uAlnv)TW?c|1$2x&1awW#zsxylGrRcz)4RJ))s<$ZK51ZjSCosn{AoeZJ8K>7(_DzG0S#aCe~HY*)0q$O-xOVroVg1Dg)yz z7ktI)nds}cd@Zt7<0Wa?_-YG&wc;pS@YY+$EgLs&_yf}I^#aY%ingFe?ohG*IfgiyU(@%FkfHX9^a%`aQO_++jXkDFI{y=FV%eeUtcTsc4x7s zszsOT&lfLFFn)h{V6X3oguwd`E+~qKudEO#e82tW_ZB-9ucdA6@1=5<&wBjwGwl#lu zYz%|tvRM@LC&@(WD_Gxs?X$wH?JHW9( zzbGT=fn($81F<>##V=gi@l7_`{$~9rzmFHzln6b%uafj}jck%i{EW7PSM<6|t(0x9 z>*YG^nyz;!$uv3mmmYK2w?MvUp{s0*EuHTfAD)}K^vm2>Me7p zcYN`tgEQVJ?`8k?aAIxnyZw8lwdCEWyM6o9T-Y@)sAN*D-f@$SzJ_0`Go=bLUR-*n zBlnjnQe<8Ayp2(Bm)yO3*Sf&c+vd}&Z>h8YFJ!PCPpA;+HT6k z{AoM8rJ=Erg^|g0y%ingFe?ohG-W>y;J-@ZTFt7fwP`vTL0jt?8FLfL9UHw^SU0#&&|9?P{>dj9| z8ay+_JbBxlCGRX}{%&<}u4`?xb9+F{l1Gk5{_gRsSNozEsAXzXb3MWOstkXAc**qp zmv`IQmKYtm%&>FK<-^`$#~(E+t8V{yYtqb{>^^_H%pg$ zDSl#6!M#sCSC9JLx_fsI^Yq0>l-K9Yzy4DGT-ud_=?gO$g_}*8+D(}lftYE#DHHRj z?d%qYmL_I~hST+SG0VU>+XHtoUomzzvoJCQ?MbVWO~LsW;p-=V(!xb diff --git a/Doc/RomWBW Hardware.pdf b/Doc/RomWBW Hardware.pdf index 867a73d5a5a5cc6626c40b0126233095f35efd79..949234ecc49189f9918f31894e70cbd405ebc0a2 100644 GIT binary patch delta 60525 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 diff --git a/Doc/RomWBW Introduction.pdf b/Doc/RomWBW Introduction.pdf index 0fd2b7f32d3f8f64d062de6ecb1a7e29e5f35629..2ea71c204ba2c9df97634ab8b95c548f901badd5 100644 GIT binary patch delta 4935 zcmai2dra146c&|bi0Nddvv5eDGym|tUrbRxl`UIZVy(6`)WDfT2PkUIe%_`s!@Q)Q zN*T_LX?KfY4iRcgOA{*BmXXVAmNwDUD0A8QxPIR`Zt)j8ocBHNdCqgrd4AMii?6#D zzcIhN^qUq82#!tuoh7bmS(Z>&Kd`A_{&#!(=XOgjF2B-mMB1~Z-}vUb`W^oyP!{T!|uXv1Nu*zw!QJ{%V|O3isuhiFPhVs zv}yIMBh`QJtJu6et>OC6r*jhd%B0ud3{6QNmO8R(^ZTsu<1x+aDi6;2WdE%j(^_gP z#be`oec?+ki%Bc}J>#D||53l6H+-I_!=mc!&emBLp0%|vP8`x> z5ZM` zxmkbis_B)z@3&(;XKh(AqPDU3(yf;U`TXn|sW(H-S~*rjcIvR9pYb@n4KRsYmu{i)>XhkfZoM~9EycJi;{ zY`xfw*|z-g_@*&tbQ@xNCAy8A|Q^A z(;(iEAWBo4P?kJe8ISMd+`5jkhfC(h^$tjdxK<9o7q~_864D3^ykx*Qlor?weugw$ zwxtCm>|iw*J+7|w+IPIS)6W}1H7%9K`D<$!E(X|4j9-KV%o~FPGfy+-j1jhQ$e5tT zq{a7frVaJ8I>2yo<`w2W=Uif_!Nkc~u3<_kBM7W8voPTVyaks;2*)IDLLoe1 zzmOb_4#tGE9tRde5vaNI9wR8E?i_7F2djmY7S|nG>~4YETc@kWLTH2eA*`3=fj|Wm zBVfX5GRK5-0y#3_nIac@VM%tLl2CX{$|RWtZngGbR3?@ZPDm&yBBq3<#r%+rD^g>} zDKb8aTS5Cu71ojLU==%jp%j|5on(q(!ogWV&cgb_i3CzhviqdgWD`i}I^6FPh9ia_ zrn1ImlFE}YFNL*$U@QJnBbZUBHPa*$ZyB{IP68XLNSVBrUACZ2(I}}EX0Vcy>^bQ{ zd>}3;sT@8FT8I!+!LG-TR)OVYSSY{{Lk)*X#>#Ut0~AyQKSo))oZxJ0dq(i@gdZj* zne$pWj$07`BufWqAg_{L>igZ0p!`Lx04*=5MTHN9q zq!cc-_Ku7U1F`{g7PbOuH1M-wUIc)XH#twIlVOy(Ab5!KaNZKy8<@SgS3%-ZP3F8I zTL~QRlA~dmea>t0>0p@A7)QfEltq&-(i0AffM=y)v=t2VME=8BLRkYs4OicQu8IlV z8dul=PYG}&Tf}fdAaq`E%n0zaI7meO;uy|Dc5NthX)?nV(NzZY5=I6NlSKf2v`pL( zHR9mav5yA)4X0n2prCZDBb3QGQg@K?M1_Kl^pA6vEC(ZCd}2*z1Sef@U>g!5frcVA z22Do%ATFLFAhcLVlXhw{<6zK6GZP469k2%3jI%TdtRP%>>m;?oYDV`3u!Lbhpdb$P zInE9~&IvIsj27(YtRMr{Irv`#jsaSbV@>9qAwi(RL=<>Nhcl3xh)WOORu~yjWTLZ7 ziS3%qgIx0A!As&oIZ|haOeR+oL}=ppESoja@$n(AC&&qzN@ZrTjFi#;?=n3lBO{?` Y;mpE?OA2%I5 delta 4278 zcmai1X>3(h5cUz8NK=)i7~+Bji-sU@_Jy66A}C-Ah(QHQ*b!Pv%OVK10ve^FMfA`J ziM6eWvQ<%#y@(WJ5Qv)66e1NU#)LGL$R2R6VKFl=@x4Dc=gj@ioNs2nnY*VcVQ*8y zdo!9T7CJl|Yg@4N{X^MxEUCJ2QR41??N)rU`?Y=j*5p^suRHm|(Gi7zCnue|`pCeH z;nxaFGd@0Yf9Jod`%Zj)ZpyZ#EniK)(L8BLi=CrzwRI=^#p+ji+iC-*gk7jcI?_% zJAHkh-ZcxmZy3_LWm@jA-?ta7$oi?OWwL)_|GQP)aeZ~g z-E!bJmxgv9oq6!C)Q*=c1`Xc$!I*`oy7ew!5bIKKXzlfe7aMa<)lABJ^T>_#OG}oE znMJEcJb&oZIkn9z9-C59yz6YYeIut`5rxMloP4VBeA?KG?N1J?Te)@6uFO&8hc6zu zaP`Z5$s^y+>RK{t_xLO8Hu05J$+b1}dd@%bvpuu>boS^Iv+}2HuFDycaqhzfS(Q7= zespV#)BTxh@!)US{_}>7)vafKk+tK#d+L8-r+elOKQLkZ*R>sa%$f4W;I&Yn9cz=ow6H4lp8^MCpP1H;TwhyB?VJ~(ID#O|7y;ZN1`RMn z)--dWK7ycIj#F4~39QnV1wIuZh||h=48gf|I51o*$wFZS;gEw-)Ujtm8ljM#WP;gn z6d(%liPCU|orX1!<1M}R*fZ%3$pI~u#y8d0u$yk)dpl)e(TI>c4X%aHVxC@$Ge$zp z;aVnTP&xse-DHjR>q5!img(e9unPNmD zAOp#}nhWBsmK@(yYJE#5@07mOmfO%F2Ye#-MrfQlQhCx=q_7rWRT@Sa)JzlKL8fo6 z{l_P-IA{s@MCu2mPvWzb)C$wDqy(*RH4`9k#VV;BHg`^uJc1PiS`tCvC@9c%tS?}G z>n68#ReA1Rs04^k_(Wx?Hmgtxy*U9?Mye3Yg@bW}A0C<_2+SZ131r^TP>I-E=-7}7{bvCLW>8yb#z@d1 znHAy3d*wqhK#+#3EtOIYN{X`-G)ZE9KrTs!gPo=C-gYTGogHhD;C!S4JTHzvh6(b% z^VU#INjipMiiofC#^TffyIc3WQ*nmDKO6<0h(5xG#?dp(l5y4n%kagM4-oW7Z*la% zoam#0Awq`S2m)6Z%#VZ_!>Q~V4(%~iMG*Kz*s>Vba7m^s=Na_PR1m-`iv|xT~ zpt@c6hHD4X5kcS#h2$b5q2X5H^fKIO(1ZA1c+%itO0+mi&RNAnY)(8b1Sh3tEH@a! z2r1zkC4wMZ(Ccxv8V3wpd%3k-LjIvMpBF*tdq)yrg#t*vJS&KnDj91@bMIl zA#>wJ1V#hwg>zhD2$=7qkC+Gorxv6D>1>`+HS-KCLp?xr#&`6<9QMLPUuWUrd9k!C zC^(ZgK=n^g^WO3_E0jvt&`;C*58wkW&*+oV>;Fy0r1a^Nn3q3pR{p$M6DK8l?vzgK L)G6bcfr_qert$7ZKTxX2J^!aD!P3B^htvBENNO)q}XPY>e&8|le?47$JHKX^NlBWa5QOnNX zN?uKt?8*yHBtHIa!4+>^k#Ur3NqJgOmuvT?xtnI#=DE%=-1Jm_N{XwZvV!2rd{?d= zW%KHS7ia1wEd9A{kEQmy(65T??ymRxdS9i+$z9UI?TqGIwaX#P7L}yzGMk#}^le_& zbTyx)%k*XY_VV7j@q5o~=iIBaEM*n5mxWF1y>vYK`M1ZZ?!f_?O`e67_;-o4Jf^KO1WS9@yr;$3fFT{$VY-#~P$?DqpnyBFWKSU%Bt=hNdxvv(~HGT-n$ z*?WcPn=iLCZ6*saX|T-y^}@E}2BP;_PB%Y+z_??q+6SWM*t)XyD>zZenTa>gHsp NU_(gBbe$EPasUV{x{v?> delta 451 zcmX?gLG9E9wF%RizTcQQ(@EdIzU}?DXs78-6*nFIK7aV2npPlrvXax_f86A`#VceE zw6+L|KC}L_M`)*mp8f2*lerjW>;2P?sw z-x*%M@m4a`(mOVOuQYGJwaT>E%ITWVS{>=7{oBvIJ$|}x*@7UJ$tin3ar@fqnzb3t zxb)3-uW+^P=J#`dPbqgVy?u4%WZSw#tt{(zjYrGew-@>;w-=r6PcQ>@*}l<&(<0y5+059~$i&>($k@f$*wVz!z|_&u!qLdY)Y!nn&CJ==PQiwd KlIc1tIOPCmMYuZv diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index 4ba906e899d94b81f2d348749d20c0736b74f3f6..8ed3860edcff9610a739c061df4c426887a2face 100644 GIT binary patch delta 179 zcmbRFQ)%W;r44nAjL#?6Gj3xk`ul8Avn5lzB@-hMgJ@ 0)) + .ECHO "*** ERROR: SCC DRIVER DOES NOT YET SUPPORT IONTERRUPTS!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR +#ENDIF +; +SCC_BUFSZ .EQU 32 ; RECEIVE RING BUFFER SIZE +; +SCC_NONE .EQU 0 +SCC_SCC .EQU 1 +; +SCC_DEFBAUD .EQU 38400 ; FAILSAFE BAUD RATE +SCC_DEFCLK .EQU 4915200 ; FAILSAVE BAUD CLOCK +SCC_DEFDIV .EQU (SCC_DEFCLK / (2 * 16 * SCC_DEFBAUD)) - 2 +; +SCC_RTSON .EQU $EA +SCC_RTSOFF .EQU $E8 +; +#IF ((SCCINTS) & (INTMODE > 0)) +SCC_WR1VAL .EQU $18 ; WR1 VALUE FOR INT ON RECEIVED CHARS +#ELSE +SCC_WR1VAL .EQU $00 ; WR1 VALUE FOR NO INTS +#ENDIF +; +#IF ((SCCINTS) & (INTMODE >= 2)) +; +SCC0_IVT .EQU IVT(INT_SCC0) +SCC1_IVT .EQU IVT(INT_SCC1) +SCC0_VEC .EQU VEC(INT_SCC0) +SCC1_VEC .EQU VEC(INT_SCC1) +; +#ENDIF +; +#IF (SCC0MODE == SCCMODE_STD) +SCC0A_CMD .EQU SCC0BASE + $01 +SCC0A_DAT .EQU SCC0BASE + $00 +SCC0B_CMD .EQU SCC0BASE + $03 +SCC0B_DAT .EQU SCC0BASE + $02 +#ENDIF +; +#IF (SCC0MODE == SCCMODE_SZ80) +SCC0A_CMD .EQU SCC0BASE + $01 +SCC0A_DAT .EQU SCC0BASE + $03 +SCC0B_CMD .EQU SCC0BASE + $00 +SCC0B_DAT .EQU SCC0BASE + $02 +#ENDIF +; +#IF (SCCCNT >= 2) +; + #IF (SCC1MODE == SCCMODE_STD) +SCC1A_CMD .EQU SCC1BASE + $01 +SCC1A_DAT .EQU SCC1BASE + $00 +SCC1B_CMD .EQU SCC1BASE + $03 +SCC1B_DAT .EQU SCC1BASE + $02 + #ENDIF +; + #IF (SCC0MODE == SCCMODE_SZ80) +SCC1A_CMD .EQU SCC1BASE + $01 +SCC1A_DAT .EQU SCC1BASE + $03 +SCC1B_CMD .EQU SCC1BASE + $00 +SCC1B_DAT .EQU SCC1BASE + $02 + #ENDIF +; +#ENDIF +; +SCC_PREINIT: +; +; SETUP THE DISPATCH TABLE ENTRIES +; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST REMIAIN +; DISABLED. +; + CALL SCC_PROBE ; PROBE FOR CHIPS +; + LD B,SCC_CFGCNT ; LOOP CONTROL + XOR A ; ZERO TO ACCUM + LD (SCC_DEV),A ; CURRENT DEVICE NUMBER + LD IY,SCC_CFG ; POINT TO START OF CFG TABLE +SCC_PREINIT0: + PUSH BC ; SAVE LOOP CONTROL + CALL SCC_INITUNIT ; HAND OFF TO GENERIC INIT CODE + POP BC ; RESTORE LOOP CONTROL +; + LD A,(IY+1) ; GET THE SCC TYPE DETECTED + OR A ; SET FLAGS + JR Z,SCC_PREINIT2 ; SKIP IT IF NOTHING FOUND +; + PUSH BC ; SAVE LOOP CONTROL + PUSH IY ; CFG ENTRY ADDRESS + POP DE ; ... TO DE + LD BC,SCC_FNTBL ; BC := FUNCTION TABLE ADDRESS + CALL NZ,CIO_ADDENT ; ADD ENTRY IF SCC FOUND, BC:DE + POP BC ; RESTORE LOOP CONTROL +; +SCC_PREINIT2: + LD DE,SCC_CFGSIZ ; SIZE OF CFG ENTRY + ADD IY,DE ; BUMP IY TO NEXT ENTRY + DJNZ SCC_PREINIT0 ; LOOP UNTIL DONE +; +#IF ((SCCINTS) & (INTMODE > 0)) + ; SETUP INT VECTORS AS APPROPRIATE + LD A,(SCC_DEV) ; GET DEVICE COUNT + OR A ; SET FLAGS + JR Z,SCC_PREINIT3 ; IF ZERO, NO SCC DEVICES, ABORT +; + #IF (INTMODE == 1) + ; ADD IM1 INT CALL LIST ENTRY + LD HL,SCC_INT ; GET INT VECTOR + CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST + #ENDIF +; + #IF ((INTMODE == 2) | (INTMODE == 3)) + ; SETUP IM2/3 VECTORS + LD HL,SCC_INT0 + LD (SCC0_IVT),HL ; IVT INDEX +; + #IF (SCCCNT >= 2) + LD HL,SCC_INT1 + LD (SCC1_IVT),HL ; IVT INDEX + #ENDIF +; + #ENDIF +; +#ENDIF +; +SCC_PREINIT3: + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; SCC INITIALIZATION ROUTINE +; +SCC_INITUNIT: + CALL SCC_DETECT ; DETERMINE SCC TYPE + LD (IY+1),A ; SAVE IN CONFIG TABLE + OR A ; SET FLAGS + RET Z ; ABORT IF NOTHING THERE + + ; UPDATE WORKING SCC DEVICE NUM + LD HL,SCC_DEV ; POINT TO CURRENT UART DEVICE NUM + LD A,(HL) ; PUT IN ACCUM + INC (HL) ; INCREMENT IT (FOR NEXT LOOP) + LD (IY),A ; UPDATE UNIT NUM + + ; IT IS EASY TO SPECIFY A SERIAL CONFIG THAT CANNOT BE IMPLEMENTED + ; DUE TO THE CONSTRAINTS OF THE SCC. HERE WE FORCE A GENERIC + ; FAILSAFE CONFIG ONTO THE CHANNEL. IF THE SUBSEQUENT "REAL" + ; CONFIG FAILS, AT LEAST THE CHIP WILL BE ABLE TO SPIT DATA OUT + ; AT A RATIONAL BAUD/DATA/PARITY/STOP CONFIG. + CALL SCC_INITSAFE +; + ; SET DEFAULT CONFIG + LD DE,-1 ; LEAVE CONFIG ALONE + JP SCC_INITDEV ; IMPLEMENT IT AND RETURN +; +; +; +SCC_INIT: + LD B,SCC_CFGCNT ; COUNT OF POSSIBLE SCC UNITS + LD IY,SCC_CFG ; POINT TO START OF CFG TABLE +SCC_INIT1: + PUSH BC ; SAVE LOOP CONTROL + LD A,(IY+1) ; GET SCC TYPE + OR A ; SET FLAGS + CALL NZ,SCC_PRTCFG ; PRINT IF NOT ZERO + POP BC ; RESTORE LOOP CONTROL + LD DE,SCC_CFGSIZ ; SIZE OF CFG ENTRY + ADD IY,DE ; BUMP IY TO NEXT ENTRY + DJNZ SCC_INIT1 ; LOOP TILL DONE +; + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +; RECEIVE INTERRUPT HANDLER +; +#IF ((SCCINTS) & (INTMODE > 0)) +; +; IM1 ENTRY POINT +; +SCC_INT: + ; CHECK/HANDLE FIRST CARD (SCC0) IF IT EXISTS + LD A,(SCC0A_CFG + 1) ; GET SCC TYPE FOR FIRST CHANNEL OF FIRST SCC + OR A ; SET FLAGS + CALL NZ,SCC_INT0 ; CALL IF CARD EXISTS + RET NZ ; DONE IF INT HANDLED +; + #IF (SCCCNT >= 2) + ; CHECK/HANDLE SECOND CARD (SCC1) IF IT EXISTS + LD A,(SCC1A_CFG + 1) ; GET SCC TYPE FOR FIRST CHANNEL OF SECOND SCC + OR A ; SET FLAGS + CALL NZ,SCC_INT1 ; CALL IF CARD EXISTS + #ENDIF +; + RET ; DONE +; +; IM2 ENTRY POINTS +; +SCC_INT0: + ; INTERRUPT HANDLER FOR FIRST SCC (SCC0) + LD IY,SCC0A_CFG ; POINT TO SCC0A CFG + CALL SCC_INTRCV ; TRY TO RECEIVE FROM IT + RET NZ ; DONE IF INT HANDLED + LD IY,SCC0B_CFG ; POINT TO SCC0B CFG + JR SCC_INTRCV ; TRY TO RECEIVE FROM IT AND RETURN +; + #IF (SCCCNT >= 2) +; +SCC_INT1: + ; INTERRUPT HANDLER FOR SECOND SCC (SCC1) + LD IY,SCC1A_CFG ; POINT TO SCC1A CFG + CALL SCC_INTRCV ; TRY TO RECEIVE FROM IT + RET NZ ; DONE IF INT HANDLED + LD IY,SCC1B_CFG ; POINT TO SCC1B CFG + JR SCC_INTRCV ; TRY TO RECEIVE FROM IT AND RETURN +; + #ENDIF +; +; HANDLE INT FOR A SPECIFIC CHANNEL +; BASED ON UNIT CFG POINTED TO BY IY +; +SCC_INTRCV: + ; CHECK TO SEE IF SOMETHING IS ACTUALLY THERE + LD C,(IY+3) ; CMD/STAT PORT TO C + XOR A ; A := 0 + OUT (C),A ; ADDRESS RD0 + IN A,(C) ; GET RD0 + AND $01 ; ISOLATE RECEIVE READY BIT + RET Z ; NOTHING AVAILABLE ON CURRENT CHANNEL +; +SCC_INTRCV1: + ; RECEIVE CHARACTER INTO BUFFER + LD C,(IY+4) ; DATA PORT TO C + IN A,(C) ; READ PORT + #IF (SCCBOOT != 0) + CP SCCBOOT ; REBOOT REQUEST? + JP Z,SYS_RESCOLD ; IF SO, DO IT, NO RETURN + #ENDIF + LD B,A ; SAVE BYTE READ + LD L,(IY+7) ; SET HL TO + LD H,(IY+8) ; ... START OF BUFFER STRUCT + LD A,(HL) ; GET COUNT + CP SCC_BUFSZ ; COMPARE TO BUFFER SIZE + JR Z,SCC_INTRCV4 ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED + INC A ; INCREMENT THE COUNT + LD (HL),A ; AND SAVE IT + CP SCC_BUFSZ / 2 ; BUFFER GETTING FULL? + JR NZ,SCC_INTRCV2 ; IF NOT, BYPASS CLEARING RTS + LD C,(IY+3) ; CMD/STAT PORT TO C + LD A,5 ; RTS IS IN WR5 + OUT (C),A ; ADDRESS WR5 + LD A,SCC_RTSOFF ; VALUE TO CLEAR RTS + OUT (C),A ; DO IT +SCC_INTRCV2: + INC HL ; HL NOW HAS ADR OF HEAD PTR + PUSH HL ; SAVE ADR OF HEAD PTR + LD A,(HL) ; DEREFERENCE HL + INC HL + LD H,(HL) + LD L,A ; HL IS NOW ACTUAL HEAD PTR + LD (HL),B ; SAVE CHARACTER RECEIVED IN BUFFER AT HEAD + INC HL ; BUMP HEAD POINTER + POP DE ; RECOVER ADR OF HEAD PTR + LD A,L ; GET LOW BYTE OF HEAD PTR + SUB SCC_BUFSZ+4 ; SUBTRACT SIZE OF BUFFER AND POINTER + CP E ; IF EQUAL TO START, HEAD PTR IS PAST BUF END + JR NZ,SCC_INTRCV3 ; IF NOT, BYPASS + LD H,D ; SET HL TO + LD L,E ; ... HEAD PTR ADR + INC HL ; BUMP PAST HEAD PTR + INC HL + INC HL + INC HL ; ... SO HL NOW HAS ADR OF ACTUAL BUFFER START +SCC_INTRCV3: + EX DE,HL ; DE := HEAD PTR VAL, HL := ADR OF HEAD PTR + LD (HL),E ; SAVE UPDATED HEAD PTR + INC HL + LD (HL),D + ; CHECK FOR MORE PENDING... + LD C,(IY+3) ; CMD/STAT PORT TO C + XOR A ; A := 0 + OUT (C),A ; ADDRESS RD0 + IN A,(C) ; GET RD0 + RRA ; READY BIT TO CF + JR C,SCC_INTRCV1 ; IF SET, DO SOME MORE +SCC_INTRCV4: + OR $FF ; NZ SET TO INDICATE INT HANDLED + RET ; AND RETURN +; +#ENDIF +; +; DRIVER FUNCTION TABLE +; +SCC_FNTBL: + .DW SCC_IN + .DW SCC_OUT + .DW SCC_IST + .DW SCC_OST + .DW SCC_INITDEV + .DW SCC_QUERY + .DW SCC_DEVICE +#IF (($ - SCC_FNTBL) != (CIO_FNCNT * 2)) + .ECHO "*** INVALID SCC FUNCTION TABLE ***\n" +#ENDIF +; +; +; +#IF ((SCCINTS) & (INTMODE > 0)) +; +SCC_IN: + CALL SCC_IST ; SEE IF CHAR AVAILABLE + JR Z,SCC_IN ; LOOP UNTIL SO + HB_DI ; AVOID COLLISCCN WITH INT HANDLER + LD L,(IY+7) ; SET HL TO + LD H,(IY+8) ; ... START OF BUFFER STRUCT + LD A,(HL) ; GET COUNT + DEC A ; DECREMENT COUNT + LD (HL),A ; SAVE UPDATED COUNT + CP SCC_BUFSZ / 4 ; BUFFER LOW THRESHOLD + JR NZ,SCC_IN1 ; IF NOT, BYPASS SETTING RTS + LD C,(IY+3) ; C IS CMD/STATUS PORT ADR + LD A,5 ; RTS IS IN WR5 + OUT (C),A ; ADDRESS WR5 + LD A,SCC_RTSON ; VALUE TO SET RTS + OUT (C),A ; DO IT +SCC_IN1: + INC HL + INC HL + INC HL ; HL NOW HAS ADR OF TAIL PTR + PUSH HL ; SAVE ADR OF TAIL PTR + LD A,(HL) ; DEREFERENCE HL + INC HL + LD H,(HL) + LD L,A ; HL IS NOW ACTUAL TAIL PTR + LD C,(HL) ; C := CHAR TO BE RETURNED + INC HL ; BUMP TAIL PTR + POP DE ; RECOVER ADR OF TAIL PTR + LD A,L ; GET LOW BYTE OF TAIL PTR + SUB SCC_BUFSZ+2 ; SUBTRACT SIZE OF BUFFER AND POINTER + CP E ; IF EQUAL TO START, TAIL PTR IS PAST BUF END + JR NZ,SCC_IN2 ; IF NOT, BYPASS + LD H,D ; SET HL TO + LD L,E ; ... TAIL PTR ADR + INC HL ; BUMP PAST TAIL PTR + INC HL ; ... SO HL NOW HAS ADR OF ACTUAL BUFFER START +SCC_IN2: + EX DE,HL ; DE := TAIL PTR VAL, HL := ADR OF TAIL PTR + LD (HL),E ; SAVE UPDATED TAIL PTR + INC HL + LD (HL),D + LD E,C ; MOVE CHAR TO RETURN TO E + HB_EI ; INTERRUPTS OK AGAIN + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +#ELSE +; +SCC_IN: + CALL SCC_IST ; CHAR WAITING? + JR Z,SCC_IN ; LOOP IF NOT + LD C,(IY+4) ; DATA PORT + IN E,(C) ; GET CHAR + XOR A ; SIGNAL SUCCESS + RET +; +#ENDIF +; +; +; +SCC_OUT: + CALL SCC_OST ; READY FOR CHAR? + JR Z,SCC_OUT ; LOOP IF NOT + LD C,(IY+4) ; DATA PORT + OUT (C),E ; SEND CHAR FROM E + XOR A ; SIGNAL SUCCESS + RET +; +; +; +#IF ((SCCINTS) & (INTMODE > 0)) +; +SCC_IST: + LD L,(IY+7) ; GET ADDRESS + LD H,(IY+8) ; ... OF RECEIVE BUFFER + LD A,(HL) ; BUFFER UTILIZATION COUNT + OR A ; SET FLAGS + JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING + RET +; +#ELSE +; +SCC_IST: + LD C,(IY+3) ; CMD PORT + XOR A ; WR0 + OUT (C),A ; DO IT + IN A,(C) ; GET STATUS + AND $01 ; ISOLATE BIT 0 (RX READY) + JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING + XOR A ; ZERO ACCUM + INC A ; ASCCUM := 1 TO SIGNAL 1 CHAR WAITING + RET ; DONE +; +#ENDIF +; +; +; +SCC_OST: + LD C,(IY+3) ; CMD PORT + XOR A ; WR0 + OUT (C),A ; DO IT + IN A,(C) ; GET STATUS + AND $04 ; ISOLATE BIT 2 (TX EMPTY) + JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING + XOR A ; ZERO ACCUM + INC A ; ACCUM := 1 TO SIGNAL 1 BUFFER POSITION + RET ; DONE +; +; AT INITIALIZATION THE SETUP PARAMETER WORD IS TRANSLATED TO THE FORMAT +; REQUIRED BY THE SCC AND STORED IN A PORT/REGISTER INITIALIZATION TABLE, +; WHICH IS THEN LOADED INTO THE SCC. +; +; RTS, DTR AND XON SETTING IS NOT CURRENTLY SUPPORTED. +; MARK & SPACE PARITY AND 1.5 STOP BITS IS NOT SUPPORTED BY THE SCC. +; INITIALIZATION WILL NOT BE COMPLETED IF AN INVALID SETTING IS DETECTED. +; +SCC_INITDEV: + ; INITDEV CAN BE CALLED PRIOR TO INTERRUPTS BEING ENABLED. WE + ; NEED TO LEAVE INTERRUPTS ALONE IN THIS SCENARIO + LD A,(INTSENAB) ; INTS ENABLED? + OR A ; TEST VALUE + JR Z,SCC_INITDEV0 ; BYPASS DI/EI IF NOT ENABLED +; + ; INTERRUPTS DISABLED DURING INIT + HB_DI ; DISABLE INTS + CALL SCC_INITDEV0 ; DO THE WORK + HB_EI ; INTS BACK ON + RET ; DONE +; +SCC_INITDEV0: +; +; THIS ENTRY POINT BYPASSES DISABLING/ENABLING INTS WHICH IS REQUIRED BY +; PREINIT ABOVE. PREINIT IS NOT ALLOWED TO ENABLE INTS! +; +#IF (SCCDEBUG) + CALL NEWLINE + PRTS("SCC$") + LD A,(IY+2) + SRL A + CALL PRTDECB + LD A,(IY+2) + AND $01 + ADD A,'A' + CALL COUT + CALL PC_COLON +#ENDIF +; + ; TEST FOR -1 WHICH MEANS USE CURRENT CONFIG (JUST REINIT) + LD A,D ; TEST DE FOR + AND E ; ... VALUE OF -1 + INC A ; ... SO Z SET IF -1 + JR NZ,SCC_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG +; + ; LOAD EXISTING CONFIG TO REINIT + LD E,(IY+5) ; LOW BYTE + LD D,(IY+6) ; HIGH BYTE +; +SCC_INITDEV1: +; +#IF (SCCDEBUG) + PUSH DE + POP BC + PRTS(" CFG=$") + CALL PRTHEXWORD +#ENDIF +; + ; SETUP DEFAULT VALUES FOR SCC REGISTERS + PUSH DE + LD HL,SCC_INITDEFS + LD DE,SCC_INITVALS + LD BC,SCC_INITLEN + LDIR + POP DE + +; + ; BUILD WR4 + LD A,(SCC_WR4) + AND %11110000 ; CLEAR BITS WE ARE GOING TO CHG + SET 2,A ; ASSUME 1 STOP BIT + BIT 2,E ; WANT 2 STOP BITS? + JR Z,SCC_INITDEV_WR4A ; SKIP IF NOT + SET 3,A ; SET CONFIG BIT FOR 2 STOP BITS +SCC_INITDEV_WR4A: + BIT 3,E ; PARITY ENABLE? + JR Z,SCC_INITDEV_WR4B ; SKIP IF NOT + SET 0,A ; SET CONFIG BIT FOR PARITY ENABLE +SCC_INITDEV_WR4B: + BIT 4,E ; PARITY EVEN? + JR Z,SCC_INITDEV_WR4C ; SKIP IF NOT + SET 1,A ; SET CONFIG BIT FOR EVEN PARITY +SCC_INITDEV_WR4C: + LD (SCC_WR4),A ; SAVE WR4 VALUE +; + ; CREATE BITS PER CHAR VALUE + ; WARNING: SCC USES NON-SEQUENTIAL VALUES: + ; %00 = 5 BITS + ; %01 = 7 BITS + ; %10 = 6 BITS + ; %11 = 8 BITS + LD B,0 ; INIT B FOR WORKING VALUE + BIT 0,E ; BIT 0 OF E SET? + JR Z,SCC_INITDEV_BPCA ; SKIP IF NOT + SET 1,B ; SET BIT 1 OF B +SCC_INITDEV_BPCA: + BIT 1,E ; BIT 1 OF E SET? + JR Z,SCC_INITDEV_BPCB ; SKIP IF NOT + SET 0,B ; SET BIT 0 OF B +SCC_INITDEV_BPCB: +; + ; BUILD WR3 + LD A,(SCC_WR3) ; GET CUR WR3 VAL + AND %00111111 ; CLEAR BPC BITS + RRC B ; MOVE BPC BITS + RRC B ; ... INTO POSITION + OR B ; APPLY NEW BPC BITS + LD (SCC_WR3),A ; SAVE IT IN WR3 + SET 0,A ; ADD RX ENABLE + LD (SCC_WR3A),A ; AND SAVE IT IN WR3A +; + ; BUILD WR5 + LD A,(SCC_WR5) ; GET CUR WR5 VAL + AND %10011111 ; CLEAR BPC BITS + RRC B ; MOVE BPC BITS INTO POSITION + OR B ; APPLY NEW BPC BITS + LD (SCC_WR5),A ; SAVE IT IN WR5 + SET 3,A ; ADD TX ENABLE + LD (SCC_WR5A),A ; AND SAVE IT IN WR3A +; + ; DETERMINE BAUD DIVISOR + PUSH DE ; SAVE CONFIG + CALL SCC_COMPDIV ; COMPUTE DIVISOR TO BC + POP DE ; RESTORE CONFIG + RET NZ ; ABORT IF COMPDIV FAILS! +; + ; SCC BRG MUST BE PROGRAMMED WITH THE DIVISOR - 2 + DEC BC ; SUBTRACT 2 + DEC BC ; ... FROM DIVISOR + BIT 7,B ; DID WE UNDERFLOW? + JR NZ,SCC_INITERR ; ERROR IF SO +; + ; BUILD WR12/13 + LD A,C ; LSB OF BRG DIVISOR + LD (SCC_WR12),A ; SAVE IT + LD A,B ; MSB OF BRG DIVISOR + LD (SCC_WR13),A ; SAVE IT +; +; SAVE CONFIG PERMANENTLY NOW +; + LD (IY+5),E ; SAVE LOW WORD + LD (IY+6),D ; SAVE HI WORD +; + JR SCC_INITGO ; GO TO SEND INIT +; +SCC_INITERR: + OR $FF ; SIGNAL ERROR + RET +; +; ENTER HERE TO PERFORM A "SAFE" INITIALIZTION. I.E., INIT THE +; CHANNEL USING THE DEFAULT, GENERIC REGISTER VALUES. THIS CAN BE +; USED TO ENSURE INITIALIZATION IF THE FULL CONFIGURATION ABOVE +; FAILS. +; +SCC_INITSAFE: + ; SETUP DEFAULT VALUES FOR SCC REGISTERS + LD HL,SCC_INITDEFS + LD DE,SCC_INITVALS + LD BC,SCC_INITLEN + LDIR +; +SCC_INITGO: +; +; SET INTERRUPT VECTOR OFFSET WR2 +; +#IF ((SCCINTS) & (INTMODE >= 2)) + LD A,(IY+2) ; CHIP / CHANNEL + SRL A ; SHIFT AWAY CHANNEL BIT + LD L,SCC0_VEC ; ASSUME CHIP 0 + JR Z,SCC_INITIVT ; IF SO, DO IT + LD L,SCC1_VEC ; ASSUME CHIP 1 + DEC A ; CHIP 1? + JR Z,SCC_INITIVT ; IF SO, DO IT + SYSCHKERR(ERR_NOUNIT) ; IMPOSSIBLE SITUATION + RET +SCC_INITIVT: + LD A,L ; VALUE TO A + LD (SCC_WR2),A ; SAVE IT +; +#ENDIF +; +#IF (SCCDEBUG) + LD HL,SCC_INITVALS + LD B,SCC_INITLEN/2 +SCC_INITPRT: + PRTS(" WR$") + LD A,(HL) + CALL PRTHEXBYTE + INC HL + LD A,'=' + CALL COUT + LD A,(HL) + CALL PRTHEXBYTE + INC HL + DJNZ SCC_INITPRT + LD DE,65 + CALL VDELAY ; WAIT FOR FINAL CHAR TO SEND +#ENDIF +; + ; RESET THE CHANNEL + LD C,(IY+3) + XOR A + OUT (C),A ; SELECT WR0 + LD A,%10000000 ; CHANNEL A RESET CMD + BIT 0,(IY+2) ; TEST CHANNEL NUM + JR Z,SCC_INITGO1 ; SKIP AHEAD IF CHANNEL 0 + RRCA ; ADJUST FOR CHANNEL 1 +SCC_INITGO1: + OUT (C),A ; SEND IT + NOP ; SMALL DELAY REQUIRED +; + ; PROGRAM THE SCC CHIP CHANNEL + LD C,(IY+3) ; COMMAND PORT + LD HL,SCC_INITVALS ; POINT TO INIT VALUES + LD B,SCC_INITLEN ; COUNT OF BYTES TO WRITE + OTIR ; WRITE ALL VALUES +; +#IF ((SCCINTS) & (INTMODE > 0)) +; + ; RESET THE RECEIVE BUFFER + LD E,(IY+7) + LD D,(IY+8) ; DE := _CNT + XOR A ; A := 0 + LD (DE),A ; _CNT = 0 + INC DE ; DE := ADR OF _HD + PUSH DE ; SAVE IT + INC DE + INC DE + INC DE + INC DE ; DE := ADR OF _BUF + POP HL ; HL := ADR OF _HD + LD (HL),E + INC HL + LD (HL),D ; _HD := _BUF + INC HL + LD (HL),E + INC HL + LD (HL),D ; _TL := _BUF +; +#ENDIF +; + XOR A ; SIGNAL SUCCESS + RET ; RETURN +; +; THE FOLLOWING TABLE IS A GENERIC, STATIC SET OF CONFIG VALUES THAT CAN +; BE USED TO INITIALIZE THE CHIP. THESE ARE THE STARTING VALUES USED FOR +; CHIP CONFIGURATION. +; +; THE SCC IS A LITTLE PRICKLY ABOUT THE ORDER IN WHICH REGISTERS ARE +; WRITTEN DURING CONFIGURATION. THE FOLLOWING TABLE ESTABLISHES THE +; ORDER THE REGISTERS WILL BE PROGRAMMED AND SETS UP THE DEFAULT +; VALUES COPIED TO SCC_INITVALS. INITVALS IS ADJUSTED AS NEEDED, +; THEN INITVALS IS WRITTEN TO THE CHIP. +; +; *** UPDATE SCC_WR... EQUATES BELOW IF TABLE CHANGES!!! +; +SCC_INITDEFS: + .DB 4, $44 ; ASYNC MODE, X16, 1 STOP, NO PARITY ; 0100 0100 + .DB 3, $C0 ; RX 8 BITS PER CHAR ; 1100 0000 + .DB 5, $E2 ; TX 8 BITS PER CHAR ; 1110 0010 + .DB 11, $56 ; RTxC VIA BRG ; 0101 0110 + .DB 12, SCC_DEFDIV & $FF ; BAUD RATE DIVISOR LO BYTE + .DB 13, SCC_DEFDIV >> 8 ; BAUD RATE DIVISOR HI BYTE + .DB 14, $00 ; BRG SOURCE RTxC ; 0000 0000 + .DB 14, $01 ; ENABLE BRG ; 0000 0001 + .DB 3, $C1 ; ENABLE RECEIVER ; 1100 0001 + .DB 5, $EA ; ENABLE TRANSMITTER ; 1110 1010 +; +SCC_INITLEN .EQU $ - SCC_INITDEFS +; +SCC_INITVALS .FILL SCC_INITLEN,0 +; +; BELOW ADDRESSES USED TO ADDRESS CONFIGURATION VALUE REGISTERS +; *** MUST SYNC WITH SCC_INITDEFS !!! +; +SCC_WR4 .EQU SCC_INITVALS + 1 +SCC_WR3 .EQU SCC_WR4 + 2 +SCC_WR5 .EQU SCC_WR3 + 2 +SCC_WR11 .EQU SCC_WR5 + 2 +SCC_WR12 .EQU SCC_WR11 + 2 +SCC_WR13 .EQU SCC_WR12 + 2 +SCC_WR14 .EQU SCC_WR13 + 2 +SCC_WR14A .EQU SCC_WR14 + 2 +SCC_WR3A .EQU SCC_WR14A + 2 +SCC_WR5A .EQU SCC_WR3A + 2 +; +; +; +SCC_QUERY: + LD E,(IY+5) ; FIRST CONFIG BYTE TO E + LD D,(IY+6) ; SECOND CONFIG BYTE TO D + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +; +; +SCC_DEVICE: + LD D,CIODEV_SCC ; D := DEVICE TYPE + LD E,(IY) ; E := PHYSICAL UNIT + LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 + LD H,(IY+14) ; H := MODE + LD L,(IY+3) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; SCC CHIP PROBE +; CHECK FOR PRESENCE OF SCC CHIPS AND POPULATE THE +; SCC_MAP BITMAP (ONE BIT PER CHIP). THIS DETECTS +; CHIPS, NOT CHANNELS. EACH CHIP HAS 2 CHANNELS. +; MAX OF TWO CHIPS CURRENTLY. INT VEC VALUE IS TRASHED! +; +SCC_PROBE: + ; CLEAR THE PRESENCE BITMAP + LD HL,SCC_MAP ; HL POINTS TO BITMAP + XOR A ; ZERO + LD (SCC_MAP),A ; CLEAR CHIP PRESENT BITMAP + ; INIT THE INT VEC REGISTER OF ALL POSSIBLE CHIPS + ; TO ZERO. A IS STILL ZERO. + LD B,2 ; WR2 REGISTER (INT VEC) + LD C,SCC0B_CMD ; FIRST CHIP + CALL SCC_WR ; WRITE ZERO TO CHIP REG +#IF (SCCCNT >= 2) + LD C,SCC1B_CMD ; SECOND CHIP + CALL SCC_WR ; WRITE ZERO TO CHIP REG +#ENDIF + ; FIRST POSSIBLE CHIP + LD C,SCC0B_CMD ; FIRST CHIP CMD/STAT PORT + CALL SCC_PROBECHIP ; PROBE IT + JR NZ,SCC_PROBE1 ; IF NOT ZERO, NOT FOUND + SET 0,(HL) ; SET BIT FOR FIRST CARD +SCC_PROBE1: +; +#IF (SCCCNT >= 2) + LD C,SCC1B_CMD ; SECOND CHIP CMD/STAT PORT + CALL SCC_PROBECHIP ; PROBE IT + JR NZ,SCC_PROBE2 ; IF NOT ZERO, NOT FOUND + SET 1,(HL) ; SET BIT FOR SECOND CARD +SCC_PROBE2: +#ENDIF +; + RET +; +SCC_PROBECHIP: + ; READ WR2 TO ENSURE IT IS ZERO (AVOID PHANTOM PORTS) + CALL SCC_RD ; GET VALUE + AND $F0 ; ONLY TOP NIBBLE + RET NZ ; ABORT IF NOT ZERO + ; WRITE INT VEC VALUE TO WR2 + LD A,$FF ; TEST VALUE + CALL SCC_WR ; WRITE IT + ; READ WR2 TO CONFIRM VALUE WRITTEN + CALL SCC_RD ; REREAD VALUE + AND $F0 ; ONLY TOP NIBBLE + CP $F0 ; COMPARE + RET ; DONE, Z IF FOUND, NZ IF MISCOMPARE +; +; READ/WRITE CHIP REGISTER. ENTER CHIP CMD/STAT PORT ADR IN C +; AND CHIP REGISTER NUMBER IN B. VALUE TO WRITE IN A OR VALUE +; RETURNED IN A. +; +SCC_WR: + OUT (C),B ; SELECT CHIP REGISTER + OUT (C),A ; WRITE VALUE + RET +; +SCC_RD: + OUT (C),B ; SELECT CHIP REGISTER + IN A,(C) ; GET VALUE + RET +; +; SCC DETECTION ROUTINE +; THERE IS ONLY ONE VARIATION OF SCC CHIP, SO HERE WE JUST CHECK THE +; CHIP PRESENCE BITMAP TO SET THE CHIP TYPE OF EITHER NONE OR SCC. +; +SCC_DETECT: + LD B,(IY+2) ; GET CHIP/CHANNEL + SRL B ; SHIFT AWAY THE CHANNEL BIT + INC B ; NUMBER OF TIMES TO ROTATE BITS + LD A,(SCC_MAP) ; BIT MAP IN A +SCC_DETECT1: + ; ROTATE DESIRED CHIP BIT INTO CF + RRA ; ROTATE NEXT BIT INTO CF + DJNZ SCC_DETECT1 ; DO THIS UNTIL WE HAVE DESIRED BIT + ; RETURN CHIP TYPE + LD A,SCC_NONE ; ASSUME NOTHING HERE + RET NC ; IF CF NOT SET, RETURN + LD A,SCC_SCC ; CHIP TYPE IS SCC + RET ; DONE +; +; COMPUTE DIVISOR TO BC +; +SCC_COMPDIV: + ; WE WANT TO DETERMINE A DIVISOR FOR THE BAUD CLOCK + ; THAT RESULTS IN THE DESIRED BAUD RATE. + ; BAUD RATE = BAUD CLK / DIVISOR, OR TO SOLVE FOR DIVISOR + ; DIVISOR = BAUD CLK / BAUDRATE. + ; THE BAUD CLOCK IS THE SCC OSC PRESCALED BY 32. WE CAN + ; TAKE ADVANTAGE OF ENCODED BAUD RATES ALWAYS BEING A FACTOR OF 75. + ; SO, WE CAN USE (BAUD CLK / 32 / 75) / (BAUDRATE / 75) +; + ; FIRST WE DECODE THE BAUDRATE, BUT WE USE A CONSTANT OF 1 INSTEAD + ; OF THE NORMAL 75. THIS PRODUCES (BAUDRATE / 75). + LD A,D ; GET CONFIG MSB + AND $1F ; ISOLATE ENCODED BAUD RATE + LD L,A ; PUT IN L + LD H,0 ; H IS ALWAYS ZERO + LD DE,1 ; USE 1 FOR ENCODING CONSTANT + CALL DECODE ; DE:HL := BAUD RATE, ERRORS IGNORED + EX DE,HL ; DE := (BAUDRATE / 75), DISCARD HL + PUSH DE ; SAVE FOR NOW +; + ; GET THE BAUD CLOCK FROM CONFIG + LD A,9 + CALL LDHLIYA ; HL = ADR OF BAUD CLOCK DWORD + CALL LD32 ; GET THE BAUD CLOCK SPEED +; + ; DIVIDE BY 32, THEN 75 TO PRODUCE (BAUD CLK / 32 / 75) + LD C,32 ; DIVIDE BY 32 + CALL DIV32X8 ; DO IT + LD C,75 ; DIVIDE BY 75 + CALL DIV32X8 ; DO IT +; + ; RECOVER THE BAUDRATE AND RETURN VIA FINAL DIVISION + POP DE ; RECOVER DE (DECODED BAUD RATE) + JP DIV16 ; BC := HL/DE == DIVISOR AND RETURN +; +; +; +SCC_PRTCFG: + ; ANNOUNCE PORT + CALL NEWLINE ; FORMATTING + PRTS("SCC$") ; FORMATTING + LD A,(IY) ; DEVICE NUM + CALL PRTDECB ; PRINT DEVICE NUM + PRTS(": IO=0x$") ; FORMATTING + LD A,(IY+3) ; GET BASE PORT + CALL PRTHEXBYTE ; PRINT BASE PORT + + ; PRINT THE SCC TYPE + CALL PC_SPACE ; FORMATTING + LD A,(IY+1) ; GET SCC TYPE BYTE + RLCA ; MAKE IT A WORD OFFSET + LD HL,SCC_TYPE_MAP ; POINT HL TO TYPE MAP TABLE + CALL ADDHLA ; HL := ENTRY + LD E,(HL) ; DEREFERENCE + INC HL ; ... + LD D,(HL) ; ... TO GET STRING POINTER + CALL WRITESTR ; PRINT IT +; + ; ALL DONE IF NO SCC WAS DETECTED + LD A,(IY+1) ; GET SCC TYPE BYTE + OR A ; SET FLAGS + RET Z ; IF ZERO, NOT PRESENT +; + PRTS(" MODE=$") ; FORMATTING + LD E,(IY+5) ; LOAD CONFIG + LD D,(IY+6) ; ... WORD TO DE + CALL PS_PRTSC0 ; PRINT CONFIG +; + XOR A + RET +; +; +; +SCC_TYPE_MAP: + .DW SCC_STR_NONE + .DW SCC_STR_SCC + +SCC_STR_NONE .DB "$" +SCC_STR_SCC .DB "SCC$" +; +; WORKING VARIABLES +; +SCC_DEV .DB 0 ; DEVICE NUM USED DURING INIT +SCC_MAP .DB 0 ; CHIP PRESENCE BITMAP +; +#IF ((SCCINTS) & (INTMODE > 0)) +; +; SCC0 CHANNEL A RECEIVE BUFFER +SCC0A_RCVBUF: +SCC0A_CNT .DB 0 ; CHARACTERS IN RING BUFFER +SCC0A_HD .DW SCC0A_BUF ; BUFFER HEAD POINTER +SCC0A_TL .DW SCC0A_BUF ; BUFFER TAIL POINTER +SCC0A_BUF .FILL SCC_BUFSZ,0 ; RECEIVE RING BUFFER +; +; SCC0 CHANNEL B RECEIVE BUFFER +SCC0B_RCVBUF: +SCC0B_CNT .DB 0 ; CHARACTERS IN RING BUFFER +SCC0B_HD .DW SCC0B_BUF ; BUFFER HEAD POINTER +SCC0B_TL .DW SCC0B_BUF ; BUFFER TAIL POINTER +SCC0B_BUF .FILL SCC_BUFSZ,0 ; RECEIVE RING BUFFER +; + #IF (SCCCNT >= 2) +; +; SCC1 CHANNEL A RECEIVE BUFFER +SCC1A_RCVBUF: +SCC1A_CNT .DB 0 ; CHARACTERS IN RING BUFFER +SCC1A_HD .DW SCC1A_BUF ; BUFFER HEAD POINTER +SCC1A_TL .DW SCC1A_BUF ; BUFFER TAIL POINTER +SCC1A_BUF .FILL SCC_BUFSZ,0 ; RECEIVE RING BUFFER +; +; SCC1 CHANNEL B RECEIVE BUFFER +SCC1B_RCVBUF: +SCC1B_CNT .DB 0 ; CHARACTERS IN RING BUFFER +SCC1B_HD .DW SCC1B_BUF ; BUFFER HEAD POINTER +SCC1B_TL .DW SCC1B_BUF ; BUFFER TAIL POINTER +SCC1B_BUF .FILL SCC_BUFSZ,0 ; RECEIVE RING BUFFER +; + #ENDIF +; +#ELSE +; +SCC0A_RCVBUF .EQU 0 +SCC0B_RCVBUF .EQU 0 +; + #IF (SCCCNT >= 2) +SCC1A_RCVBUF .EQU 0 +SCC1B_RCVBUF .EQU 0 + #ENDIF +; +#ENDIF +; +; SCC PORT TABLE +; +SCC_CFG: + ; SCC0 CHANNEL A +SCC0A_CFG: + .DB 0 ; DEVICE NUMBER (SET DURING INIT) + .DB 0 ; SCC TYPE (SET DURING INIT) + .DB $00 ; CHIP 0 / CHANNEL A (LOW BIT IS CHANNEL) + .DB SCC0A_CMD ; CMD/STATUS PORT + .DB SCC0A_DAT ; DATA PORT + .DW SCC0ACFG ; LINE CONFIGURATION + .DW SCC0A_RCVBUF ; POINTER TO RCV BUFFER STRUCT + .DW SCC0ACLK & $FFFF ; CLOCK FREQ AS + .DW SCC0ACLK >> 16 ; ... DWORD VALUE + .DB SCC0ACTCC ; CTC CHANNEL + .DB SCC0MODE ; MODE +; + DEVECHO "SCC MODE=" +#IF (SCC0MODE == SCCMODE_STD) + DEVECHO "STD" +#ENDIF +#IF (SCC0MODE == SCCMODE_SZ80) + DEVECHO "SZ80" +#ENDIF + DEVECHO ", IO=" + DEVECHO SCC0BASE + DEVECHO ", CHANNEL A" +#IF ((SCCINTS) & (INTMODE > 0)) + DEVECHO ", INTERRUPTS ENABLED" +#ENDIF + DEVECHO "\n" +; +SCC_CFGSIZ .EQU $ - SCC_CFG ; SIZE OF ONE CFG TABLE ENTRY +; + ; SCC0 CHANNEL B +SCC0B_CFG: + .DB 0 ; DEVICE NUMBER (SET DURING INIT) + .DB 0 ; SCC TYPE (SET DURING INIT) + .DB $01 ; CHIP 0 / CHANNEL B (LOW BIT IS CHANNEL) + .DB SCC0B_CMD ; CMD/STATUS PORT + .DB SCC0B_DAT ; DATA PORT + .DW SCC0BCFG ; LINE CONFIGURATION + .DW SCC0B_RCVBUF ; POINTER TO RCV BUFFER STRUCT + .DW SCC0BCLK & $FFFF ; CLOCK FREQ AS + .DW SCC0BCLK >> 16 ; ... DWORD VALUE + .DB SCC0BCTCC ; CTC CHANNEL + .DB SCC0MODE ; MODE +; + DEVECHO "SCC MODE=" +#IF (SCC0MODE == SCCMODE_STD) + DEVECHO "STD" +#ENDIF +#IF (SCC0MODE == SCCMODE_SZ80) + DEVECHO "SZ80" +#ENDIF + DEVECHO ", IO=" + DEVECHO SCC0BASE + DEVECHO ", CHANNEL B" +#IF ((SCCINTS) & (INTMODE > 0)) + DEVECHO ", INTERRUPTS ENABLED" +#ENDIF + DEVECHO "\n" +; +#IF (SCCCNT >= 2) +; + ; SCC1 CHANNEL A +SCC1A_CFG: + .DB 0 ; DEVICE NUMBER (SET DURING INIT) + .DB 0 ; SCC TYPE (SET DURING INIT) + .DB $02 ; CHIP 1 / CHANNEL A (LOW BIT IS CHANNEL) + .DB SCC1A_CMD ; CMD/STATUS PORT + .DB SCC1A_DAT ; DATA PORT + .DW SCC1ACFG ; LINE CONFIGURATION + .DW SCC1A_RCVBUF ; POINTER TO RCV BUFFER STRUCT + .DW SCC1ACLK & $FFFF ; CLOCK FREQ AS + .DW SCC1ACLK >> 16 ; ... DWORD VALUE + .DB SCC1ACTCC ; CTC CHANNEL + .DB SCC1MODE ; MODE +; + DEVECHO "SCC MODE=" + #IF (SCC1MODE == SCCMODE_STD) + DEVECHO "STD" + #ENDIF + #IF (SCC1MODE == SCCMODE_SZ80) + DEVECHO "SZ80" + #ENDIF + DEVECHO ", IO=" + DEVECHO SCC1BASE + DEVECHO ", CHANNEL A" + #IF ((SCCINTS) & (INTMODE > 0)) + DEVECHO ", INTERRUPTS ENABLED" + #ENDIF + DEVECHO "\n" +; + ; SCC1 CHANNEL B +SCC1B_CFG: + .DB 0 ; DEVICE NUMBER (SET DURING INIT) + .DB 0 ; SCC TYPE (SET DURING INIT) + .DB $03 ; CHIP 1 / CHANNEL B (LOW BIT IS CHANNEL) + .DB SCC1B_CMD ; CMD/STATUS PORT + .DB SCC1B_DAT ; DATA PORT + .DW SCC1BCFG ; LINE CONFIGURATION + .DW SCC1B_RCVBUF ; POINTER TO RCV BUFFER STRUCT + .DW SCC1BCLK & $FFFF ; CLOCK FREQ AS + .DW SCC1BCLK >> 16 ; ... DWORD VALUE + .DB SCC1BCTCC ; CTC CHANNEL + .DB SCC1MODE ; MODE +; + DEVECHO "SCC MODE=" + #IF (SCC1MODE == SCCMODE_STD) + DEVECHO "STD" + #ENDIF + #IF (SCC1MODE == SCCMODE_SZ80) + DEVECHO "SZ80" + #ENDIF + DEVECHO ", IO=" + DEVECHO SCC1BASE + DEVECHO ", CHANNEL B" + #IF ((SCCINTS) & (INTMODE > 0)) + DEVECHO ", INTERRUPTS ENABLED" + #ENDIF + DEVECHO "\n" +; +#ENDIF +; +SCC_CFGCNT .EQU ($ - SCC_CFG) / SCC_CFGSIZ diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index a06977df..d7c32872 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -161,6 +161,12 @@ SIOMODE_SMB .EQU 3 ; RCBUS SIO MODULE (SCOTT BAKER) SIOMODE_ZP .EQU 4 ; ECB-ZILOG PERIPHERALS BOARD SIOMODE_Z80R .EQU 5 ; SIO A/B SWAPPED ; +; SIO MODE SELECTIONS +; +SCCMODE_NONE .EQU 0 +SCCMODE_STD .EQU 1 ; STD REG CFG (KIO) +SCCMODE_SZ80 .EQU 2 ; S100 SERIAL I/O +; ; TYPE OF CONSOLE BELL TO USE ; CONBELL_NONE .EQU 0 diff --git a/Source/ver.inc b/Source/ver.inc index ef52cc31..d9fcfede 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 6 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.6.0-dev.37" +#DEFINE BIOSVER "3.6.0-dev.38" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 404271b9..7c14b45e 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 6 rup equ 0 rtp equ 0 biosver macro - db "3.6.0-dev.37" + db "3.6.0-dev.38" endm