From 7daa2da00908dc31be1bca3c2c552ee00057d806 Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Mon, 2 Mar 2020 12:12:12 +0000 Subject: [PATCH] First push --- CIRCUITS/286PAL.PLD | 71 +++ CIRCUITS/CPU | Bin 0 -> 10812 bytes CIRCUITS/CPU.JED | 49 ++ CIRCUITS/CPU286 | Bin 0 -> 8023 bytes CIRCUITS/CPUPAL.ABS | Bin 0 -> 2463 bytes CIRCUITS/CPUPAL.PLD | 55 ++ CIRCUITS/CPUPAL.SI | 88 ++++ CIRCUITS/LINK.JED | 71 +++ CIRCUITS/LINKPAL.ABS | Bin 0 -> 6192 bytes CIRCUITS/LINKPAL.PLD | 85 ++++ CIRCUITS/LINKPAL.SI | 54 ++ CIRCUITS/MEM | Bin 0 -> 6804 bytes CIRCUITS/MEM286 | Bin 0 -> 4922 bytes CIRCUITS/MEMEVEN | Bin 0 -> 5815 bytes CIRCUITS/MEMODD | Bin 0 -> 5927 bytes CIRCUITS/MEMORY.JED | 45 ++ CIRCUITS/MEMPAL.ABS | Bin 0 -> 2372 bytes CIRCUITS/MEMPAL.PIN | 19 + CIRCUITS/MEMPAL.PLD | 63 +++ CIRCUITS/MEMPAL.SI | 55 ++ CIRCUITS/PAL.SRC | 105 ++++ CIRCUITS/PARTS | 77 +++ CIRCUITS/PC | Bin 0 -> 4589 bytes CIRCUITS/PC.JED | 41 ++ CIRCUITS/PC286 | Bin 0 -> 7748 bytes CIRCUITS/PCPAL.ABS | Bin 0 -> 2388 bytes CIRCUITS/PCPAL.PLD | 46 ++ CIRCUITS/PCPAL.SI | 60 +++ CIRCUITS/PUFFTA | 86 ++++ CIRCUITS/SHIFTER | Bin 0 -> 2968 bytes CIRCUITS/TURBOR | Bin 0 -> 4181 bytes SOURCE/ACCEL.C | 229 +++++++++ SOURCE/ACCEL.EXE | Bin 0 -> 33708 bytes SOURCE/ACCL.ASM | 870 +++++++++++++++++++++++++++++++ SOURCE/BACKUP.BAT | 38 ++ SOURCE/BIOS.ASM | 1153 ++++++++++++++++++++++++++++++++++++++++++ SOURCE/CHKLIST.MS | Bin 0 -> 81 bytes SOURCE/EDACC.BAT | 5 + SOURCE/EDTURBO.BAT | 6 + SOURCE/LINK.ASM | 47 ++ SOURCE/MEM.ASM | 651 ++++++++++++++++++++++++ SOURCE/MEMASM.ASM | 113 +++++ SOURCE/MEMTEST.C | 450 +++++++++++++++++ SOURCE/MEMTEST.EXE | Bin 0 -> 22244 bytes SOURCE/MKACC.BAT | 18 + SOURCE/PRNTHEX.ASM | 45 ++ SOURCE/RESTORE.BAT | 30 ++ SOURCE/SPLIT.C | 113 +++++ SOURCE/SPLIT.EXE | Bin 0 -> 15750 bytes SOURCE/STARTUP.ASM | 309 +++++++++++ SOURCE/TABLES.ASM | 219 ++++++++ SOURCE/TURBO.BAT | 7 + SOURCE/TURBOROM.ASM | 50 ++ SOURCE/VIDEO | 86 ++++ 54 files changed, 5509 insertions(+) create mode 100755 CIRCUITS/286PAL.PLD create mode 100755 CIRCUITS/CPU create mode 100755 CIRCUITS/CPU.JED create mode 100755 CIRCUITS/CPU286 create mode 100755 CIRCUITS/CPUPAL.ABS create mode 100755 CIRCUITS/CPUPAL.PLD create mode 100755 CIRCUITS/CPUPAL.SI create mode 100755 CIRCUITS/LINK.JED create mode 100755 CIRCUITS/LINKPAL.ABS create mode 100755 CIRCUITS/LINKPAL.PLD create mode 100755 CIRCUITS/LINKPAL.SI create mode 100755 CIRCUITS/MEM create mode 100755 CIRCUITS/MEM286 create mode 100755 CIRCUITS/MEMEVEN create mode 100755 CIRCUITS/MEMODD create mode 100755 CIRCUITS/MEMORY.JED create mode 100755 CIRCUITS/MEMPAL.ABS create mode 100755 CIRCUITS/MEMPAL.PIN create mode 100755 CIRCUITS/MEMPAL.PLD create mode 100755 CIRCUITS/MEMPAL.SI create mode 100755 CIRCUITS/PAL.SRC create mode 100755 CIRCUITS/PARTS create mode 100755 CIRCUITS/PC create mode 100755 CIRCUITS/PC.JED create mode 100755 CIRCUITS/PC286 create mode 100755 CIRCUITS/PCPAL.ABS create mode 100755 CIRCUITS/PCPAL.PLD create mode 100755 CIRCUITS/PCPAL.SI create mode 100755 CIRCUITS/PUFFTA create mode 100755 CIRCUITS/SHIFTER create mode 100755 CIRCUITS/TURBOR create mode 100755 SOURCE/ACCEL.C create mode 100755 SOURCE/ACCEL.EXE create mode 100755 SOURCE/ACCL.ASM create mode 100755 SOURCE/BACKUP.BAT create mode 100755 SOURCE/BIOS.ASM create mode 100755 SOURCE/CHKLIST.MS create mode 100755 SOURCE/EDACC.BAT create mode 100755 SOURCE/EDTURBO.BAT create mode 100755 SOURCE/LINK.ASM create mode 100755 SOURCE/MEM.ASM create mode 100755 SOURCE/MEMASM.ASM create mode 100755 SOURCE/MEMTEST.C create mode 100755 SOURCE/MEMTEST.EXE create mode 100755 SOURCE/MKACC.BAT create mode 100755 SOURCE/PRNTHEX.ASM create mode 100755 SOURCE/RESTORE.BAT create mode 100755 SOURCE/SPLIT.C create mode 100755 SOURCE/SPLIT.EXE create mode 100755 SOURCE/STARTUP.ASM create mode 100755 SOURCE/TABLES.ASM create mode 100755 SOURCE/TURBO.BAT create mode 100755 SOURCE/TURBOROM.ASM create mode 100755 SOURCE/VIDEO diff --git a/CIRCUITS/286PAL.PLD b/CIRCUITS/286PAL.PLD new file mode 100755 index 0000000..e7b5d6d --- /dev/null +++ b/CIRCUITS/286PAL.PLD @@ -0,0 +1,71 @@ +Name 286 GLUE LOGIC; +Partno 286PAL; +Date 14/02/88; +Revision 01; +Designer P.D. SMART; +Company SMART EXPERIENCE; +Assembly XXXXX; +Location XXXXX; + +/******************************************************************/ +/* Glue logic for controlling the 286 CPU on board the TurboRacer */ +/* 286 Multi-purpose Multiprocessor PC expansion card. */ +/* */ +/******************************************************************/ +/* Allowable Target Device Types: */ +/******************************************************************/ + +/** Inputs **/ + +Pin 1 = A0 ; /* Addr A0 used for DRAM Write */ +Pin 2 = A19 ; /* Addr A19 used for ROM select */ +Pin 3 = BHE ; /* BHE signal used for DRAM write */ +Pin 4 = WE ; /* WE signal used for DRAM write */ +Pin 5 = PSEN ; /* PSEN used for DRAM write clock */ +Pin 6 = DTR ; /* DT/-R signal from 82288 */ +Pin 7 = DEN ; /* DEN signal from 82288 */ +Pin 8 = MIO ; /* M/-IO signal from 82288 */ +Pin 9 = !RESET ; /* Reset input from 286 */ +Pin 11 = !ROMOUT ; /* Page ROMS out signal */ + +/** Outputs **/ + +Pin 12 = !ROMSEL ; /* Enable rom signal */ +Pin 13 = !READRAM ; /* Enable RAM read latch outputs */ +Pin 14 = !PE ; /* Enable 8207 port A */ +Pin 15 = !EVENWR ; /* Write enable to even bytes */ +Pin 16 = !ODDWR ; /* Write enable to odd bytes */ + +/** Declarations and Intermediate Variable Definitions **/ + +Z14 = RESET & !Z15; +Z15 = ROMOUT & !Z14; +Z16 = A19 & !Z14; +Z17 = !DTR & DEN; +Z18 = A19 & !Z14; +Z19 = !Z22 & !Z20; +Z20 = !Z19 & !PSEN; +Z21 = !Z20 & !PSEN & !Z22; +Z22 = A0 & !Z21; +Z23 = !Z20 & !Z24; +Z24 = !Z21 & !Z23; +Z25 = WE & !Z24; +Z26 = !Z29 & !Z27; +Z27 = !Z26 & !PSEN; +Z28 = !Z27 & !PSEN & !Z29; +Z29 = BHE & !Z28; +Z30 = !Z27 & !Z31; +Z31 = !Z30 & !Z28; +Z32 = !Z31 & WE; + + +/** Logic Equations **/ + +ROMSEL = !Z16; +READRAM = !Z17; +PE = !MIO # Z18; +EVENWR = !Z25; +ODDWR = !Z32; + + + \ No newline at end of file diff --git a/CIRCUITS/CPU b/CIRCUITS/CPU new file mode 100755 index 0000000000000000000000000000000000000000..668e085e758777d1f9f5170e711a828a621215a3 GIT binary patch literal 10812 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 literal 0 HcmV?d00001 diff --git a/CIRCUITS/CPU.JED b/CIRCUITS/CPU.JED new file mode 100755 index 0000000..b7024ca --- /dev/null +++ b/CIRCUITS/CPU.JED @@ -0,0 +1,49 @@ + +CUPL 2.15b Serial# 6-00002-120 +Device p16l8 Library DLIB-h-24-8 +Created Tue Jan 01 00:11:12 1980 +Name CPU decoder PAL +Partno CPUDEC 1 +Revision 01 +Date 24/02/88 +Designer P.D. Smart +Company Feduptronics +Assembly XXXXX +Location XXXXX +*QP20 +*QF2048 +*G0 +*F0 +*L0000 11111111111111111111111111111111 +*L0032 11011111111111111111111111111111 +*L0064 10111111111111111111111111111111 +*L0096 11110111111111111111111111111111 +*L0128 11111111011111111111111111111111 +*L0160 11111111111110111111111111111111 +*L0192 11111111111111111011111111111111 +*L0256 11111111111111111111111111111111 +*L0288 10011011101101110111111111111111 +*L0512 11111111111111111111111111111111 +*L0544 11011111111111111111111111111111 +*L0576 10111111111111111111111111111111 +*L0608 11111011111111111111111111111111 +*L0640 11111111011111111111111111111111 +*L0672 11111111111110111111111111111111 +*L0704 11111111111111111011111111111111 +*L0768 11111111111111111111111111111111 +*L0800 10010111101101110111111111111111 +*L1024 11111111111111111111111111111111 +*L1056 11111111111111111111110101111111 +*L1280 11111111111111111111111111111111 +*L1312 11011111111111111101111111111111 +*L1344 10111111111111111101111111111111 +*L1376 11110111111111111101111111111111 +*L1408 11111111101111111101111111111111 +*L1440 11111111111110111101111111111111 +*L1472 11111111111111111001111111111111 +*L1536 11111111111111111111111111111111 +*L1568 11111111111111111101011111111111 +*L1792 11111111111111111111111111111111 +*L1824 11111111111111111111111111110111 +*C79E9 +*4312 \ No newline at end of file diff --git a/CIRCUITS/CPU286 b/CIRCUITS/CPU286 new file mode 100755 index 0000000000000000000000000000000000000000..5288adc51c27fa12d4c3b66bc705a74d98f32436 GIT binary patch literal 8023 zcmeI1ZD>?y7RR5LdnaRjskLHVH)O}u%?3A>naLQVgfuZPO{OskW3)CKvaJM>B0)kc zX$X>rB8vo(;$}sLVGxn*AXx}fWC>CN8$v0&p|t%VSyzg#Ez+B!O0HAXf>ol>f!26rB{EWo*!APwaTPo-u_rLh4&}apqfMy>=6|>sCv{860iz+ zlSqO+q6SzG1G7`L;or)tQdWJp+Js8V)Z@rvt*6Yfm>-KDY9BQ_R2-${e;PKwQkN8i zzFRFe@nI4d6EuE8-A0#gyFTYcmE0V1bF7U9$eGu*dR{l`&`YXR{h->$!|}S>RO{i^ zUOenW&LooHGH}^p7Ec6A6*0@)QZ$@ufHOKyq?plD4yRC?;59u7oMi4bU5_NV6(c|u zxx}qXY$=8uQVglDXh1QEgpROyh@g;+8P?NCu*sM)J&PoGPS2Th4ln8jbJ5`yy=1O9 zyr%D%YYu1heKX_mmcC(cIs8(8ZohQ+t^UG(>+qib+TL>*HqUI>gx0I9Kdh_9y+bV> zQPIW%EhgHzK#PlZG0ymP)54SzX+6( zuJW${Wu&Y8Yd{(4Dt`tjBVFa+0?J5N`OksRUAbYC^}|N0*kafh!7^Z(!%ASK!zeK7 z@Br|D!xmtRo0apXsu8o&?Pldtpt)Je1e%+b=|FR{G8<@aR^|fD&B{Wcxmj5XG&d{T ztgFw>N+i(Stn9Y&M$AfgFe{0?>Sm=Ouew=j&#P`$QhC+QN`GE;vvM9ocHZ^<67Z74 z3^3zx8aVB67C7s04mjs<0l46B3Ap5No6Y*$tc-sI7;(7UPWihXCV&Zt4ZsG6?Z9@2 zDPYQBKd|57eG~WZvkHp1zv60J$s=>(zHzpvZQMWoU&x%eKk9Nv1#uiOSH!3jD@HV_ zh&RlB& zM+tH>6PJwK%o&IRX4M@dm;W8pR*X5njTPTFJt#qT6!E^vF*gHIz?*QlZ!&kq^c7>y z7boxuMkeRW=n$V6abGeJ1zc3dF0uq;hl-I46uBGh2uhHFB5ttaNo34dYq+eoS#fN( z*@Fb;@pMZpz+9Dqzl+G3&=5<$M_^V!y3$ zB~<7Dr%iR@Ipm(kcyY@Gc-q#|cGlGDA`HB+In$W;!ib}`k+!24 z#UkXMMeZjUMQ+&uKe0*LE|{b)!oZJPGQD{}j(EZL()I$zwg|cBk$V{f$}JDPilO6< z2j0LSal->Y!*FoF13yQ{x!r+ZpkLhWz^~D4?sec@w2C_&_z;zHpW`?VJVw@Z*$(jG z9WzjjfunifoXk6##H;osZP}^-*{Yy03f>+t;AI%xf^1;ml(K<=Q_2PgPAMCB*M6UG z;6wYE_z10fWW~cG@bx?XN!Ju)V3R{2!e2ynuF~eW>Tk&-Zy4Cb{knL(E@3LvpS_d%538Q~)9M6l zyzn2@-v>sMn_;szv@g*XPdKB;a^se%vqeTP!>G2{Xxx0H2Gpl&dG+H$Nn2pFuh?jV zJ&Pv&9wn_Ay#k}UzzE%B95$h3H`YTGVLjp-cmQ#T{EzXViz~My3lAsMrk`*ReujrA zdQv?_k_A4ZZUW`hAdcV(3`P*IO}dzkh~rTqfWSN`1Q1QBmUm!-lV2Vn_#Qzd?jiV= zH=jb?t`Uq5sfr&p!3E$u5P-+Mny3We^LhY5rYtQY+IE&;umY(}(@A zj3mvvDjxLPz0IQC5G~cxERDQsX)1UFC@){poU zT*hg^s*t-J97;f*O>7I6ZXl#N8&J$A7A|~iSE}g{?Ao9XBAM4PC#Nm@R;B*B+BEKk z*Qt?pqscPm9f`%8e5|u*9bU+o@AF$TV;<{ZYi7*z{MO`7q4x<}?j3rcK<*}bpFr*} zdY?eE=K<-LI9>q*!` zk#_ijHw}~shTW$MTXz3_Pl6eWw8MA3IiSQf92Bas<)9q(B*dXeJM8q9fD-NSsHKVy z6CwBt1Pg&+We}_$g3W|r!y$q>CPl9HOw8PC_6e#iY zX7914iW0aisRDT^gj~}pLY@TJ6lsUgYzwf3ukk|&RUmtO(38NCBJHrwivT5tWXGw( zmVMjfNjOQ7cDTz+041_y7pcOQP2b^3kV%ntxY=t5O1#M)P=zfU8S*6bq)0n_X8VB> zg|e;B>>18C5rVHkun-7V2Epnf*h~mE93q%mzRsP493pDn1b=E1+?CKq92WhyemvCN z+0oS-$Dq=OCjAR|RMOLoM=3s|PnfV$QQ#i3JT?{&s}ZmEBB7QbR;8GCVe5?M zF)Nq(j9$ctu>#IR#r=0nC-pb0yVWZ$odKssG0q3DgBOjmyapS5Xshy|bkWCB@ZAeBPA?)T?2jR8^0XSQ>8qo2pWdnpf2aa_hgVj=pu|jbGr3 zt&v-wCv7c0F9u%+iM3iz&q;h?F2YGA>z!iC;e^6hBqWqDp~?^~6>thFa;Na+pa>ha z9L0^uE5hL8XHw@dB;vpmlUmN|EGDrCvr2aO2t*N%DA`98Qx1pJF`yj4Ln@3&uz)$J zXju;ZEy7+c*8$fJ5o?DCy8*150WBBAO<67lys6~48iXjqK_y2$#Z(^80A;xkLJTT7 zw<)F^_CW->#6H|axFLEVUc4b9$U@_24sT;hoj3f{FPIU;6279{gm3$iceWD~o>=p# zk~)eTQzkU24*+HAlDY*bgPGJ_z%GteQXd1#2qyJ$pmdR#)Te0B3o*8ay?WfeHjYpu z!1M6$O6k~bZf?O$~S`%d*aI;XwkOW((%N)lzNCRgf z=8)iT+%d;wFn7V<(C|0tSdAuMqrVY#{zep5r%adm7yg8?F|hL0-Oy;Vf>tqSl|WO^ zn=>d@T1`A}q=&~L3U~^&2Dzuu8X2Q7ny>{4B~WZJfg5!dE{7m}r!pg6Ss5Abd@F3Q3nqnxT#A$xFM^`d z2vSrUSq&6nhhcNTM3L|sMbyYtQS@6uihjF91BwQR4R+47BO#Zf-8GUTXfF@+6G$+i zIAP^8Cq;w92KxlBJ#i%vr9%`AYuIi#SnQq#h!=OyFWv58As8~giS2R+C6%bxRf+ni ztc?b>vU4<9sqB&cGU@v`>2qeqOd|m)rqMjX6X=TIoQz+}Vk>5V+?6nRf~l=^(@Rll zF7q{tO^9}Z6ubcO+7k?fa<3(9%HBnS0mWT=!QlnVs}Q*i2p?K0f#RWaTPf(l%7ULY z|He{&MWrRKdSBIaj3#%XQ?VKz0{%chguJHr`~xVIER_oTN zVCQ0A7u^Pj-%pC7@(S-3s$YBPLX$Optx9*5u008Akr$%!e`4(+^?h;}V;=qkE}ftv literal 0 HcmV?d00001 diff --git a/CIRCUITS/CPUPAL.ABS b/CIRCUITS/CPUPAL.ABS new file mode 100755 index 0000000000000000000000000000000000000000..c29ba663270d2f2f7ad0dc46b781a7fe0ebd2109 GIT binary patch literal 2463 zcma)-J8u&~5Xa~Cd_Ft&`4RIDk89E(lz6QO1qmTru`MiY9N9rcq6tb|AOVR&=$%i1 z_y#FyDWJuOv`A1;&`?lN0HUBkN|WP1yY}g>xSZFz-MyLl?ab`Xt>+(DG)E(8(yx+r z%ceBxer5F@5zQw*m3QRz$IEnd?Ij&uJv{ba92)EP+lvPMK5h}L+^xap_SRt6U9GkG zz1~=HC6y&rmKMvE#pPvMU8pa({U;B1_ozA8dcL!_yZ!Xh<}+I7HtykTs+Lq%o@!G8 zzL8A^=0UP1edP%glf=G&UMN-@)+#3ezA6FI#9Jar%CfJIo>(9gP$xs=G~p&eS|C#) z@}S;KTt(VVyLIcC{53=2@)%&+w%{9D7w=BpU)Sh>RE@O1)qwF*~y+)s6 z$TafIgUAJT2v`IDV#pN80?2HT>~{K%b{y#-+M4FOBa-poYGxx@B2Z(`4Q!iv<6u_;0FiqbQbZGUt=0=@dwt zzN<<&sfIK;>ys946oGH%M{EsgvgDI|0}6aIKVxf1lUbjECi^hfsec}AwHNyjJ8 z(>aiN`a3z#7_#7#4(dqYl>Xu3Gw>(H(epzz#KT{M?(tnh%ik5>LgXqdTq~IHmni97B2?uI2+gs=3^AH^Rfs3`JFiL`7wAZ(wB|vxi literal 0 HcmV?d00001 diff --git a/CIRCUITS/CPUPAL.PLD b/CIRCUITS/CPUPAL.PLD new file mode 100755 index 0000000..1bfd856 --- /dev/null +++ b/CIRCUITS/CPUPAL.PLD @@ -0,0 +1,55 @@ +Name CPU decoder PAL; +Partno CPUDEC 1; +Date 24/02/88; +Revision 01; +Designer P.D. Smart; +Company Feduptronics; +Assembly XXXXX; +Location XXXXX; + +/******************************************************************/ +/* A PAL to decode the 286 I/O ports to generate the 5 select */ +/* signals required. */ +/* */ +/******************************************************************/ +/* Allowable Target Device Types: 16L8 */ +/******************************************************************/ + +/** Inputs **/ + +Pin 1 = IOWR ; /* IOWR signal from 286 */ +Pin 2 = IORD ; /* IORD signal from 286 */ +Pin 3 = A1 ; /* Address signals from 286 */ +Pin 4 = A2 ; /* */ +Pin 5 = A10 ; /* */ +Pin 6 = A11 ; /* */ +Pin 7 = A19 ; /* */ +Pin 8 = RESET ; /* Reset signal from CPU */ +Pin 9 = MEMRES ; /* Memory reset pin */ + +/** Outputs **/ + +Pin 19 = LINKWR ; /* Signal to initiate a link write*/ +Pin 18 = LINKRD ; /* Signal to initiate a link read */ +Pin 17 = COMWR ; /* Write to command port */ +Pin 16 = STATRD ; /* Read from status port */ +Pin 15 = FF1 ; /* Flip flop output 1 */ +Pin 14 = FF2 ; /* Flip flop output 2 */ +Pin 13 = ROMSEL ; /* Select ROM */ +Pin 12 = LOADSHIFT ; /* Load shift register signal */ + +/** Declarations and Intermediate Variable Definitions **/ + +/** Logic Equations **/ + +LINKWR = !(IOWR # !IORD # A1 # A2 # !A10 # !A11); +LINKRD = !IOWR # IORD # A1 # A2 # !A10 # !A11; +COMWR = !(IOWR # !IORD # !A1 # A2 # !A10 # !A11); +STATRD = !IOWR # IORD # !A1 # A2 # !A10 # !A11; +FF1 = !(FF2 & RESET); +FF2 = !(FF1 & (IOWR # !IORD # A1 # !A2 # !A10 # !A11)); +ROMSEL = !(FF1 & A19); +LOADSHIFT= !MEMRES; + + + \ No newline at end of file diff --git a/CIRCUITS/CPUPAL.SI b/CIRCUITS/CPUPAL.SI new file mode 100755 index 0000000..97546b3 --- /dev/null +++ b/CIRCUITS/CPUPAL.SI @@ -0,0 +1,88 @@ +Name CPU decoder PAL; +Partno CPUDEC 1; +Date 24/02/88; +Revision 01; +Designer P.D. Smart; +Company Feduptronics; +Assembly XXXXX; +Location XXXXX; + +/******************************************************************/ +/* A PAL to decode the 286 I/O ports to generate the 5 select */ +/* signals required. */ +/* */ +/******************************************************************/ +/* Allowable Target Device Types: 16L8 */ +/******************************************************************/ + +ORDER: IOWR, %1, IORD, %1, A1, %1, A2, %1, A10, %1, A11, %1, A19, %1, + RESET, %1, MEMRES, %2, + + LINKWR, %1, LINKRD, %1, COMWR, %1, STATRD, %2, FF1, %1, FF2, %1, + ROMSEL, %2, LOADSHIFT; + +VECTORS: +$msg " L "; +$msg " O "; +$msg " A "; +$msg " M L L S R D "; +$msg " R E I I C T O S "; +$msg " I I E M N N O A M H "; +$msg " O O A A A S R K K M T F F S I "; +$msg " W R A A 1 1 1 E E W R W R F F E F "; +$msg " R D 1 2 0 1 9 T S R D R D 1 2 L T "; +$msg " -------------------------------------"; +1 1 0 0 0 0 1 0 0 L H L H H L L H /* Check basic inactive states */ +1 1 0 0 0 1 1 0 0 L H L H H L L H +1 1 0 0 1 0 1 0 0 L H L H H L L H +1 1 0 0 1 1 1 0 0 L H L H H L L H +1 1 0 1 0 0 1 0 0 L H L H H L L H +1 1 0 1 0 1 1 0 0 L H L H H L L H +1 1 0 1 1 0 1 0 0 L H L H H L L H +1 1 0 1 1 1 1 0 0 L H L H H L L H +1 1 1 0 0 0 1 0 0 L H L H H L L H +1 1 1 0 0 1 1 0 0 L H L H H L L H +1 1 1 0 1 0 1 0 0 L H L H H L L H +1 1 1 0 1 1 1 0 0 L H L H H L L H +1 1 1 1 0 0 1 0 0 L H L H H L L H +1 1 1 1 0 1 1 0 0 L H L H H L L H +1 1 1 1 1 0 1 0 0 L H L H H L L H +1 1 1 1 1 1 1 0 0 L H L H H L L H +0 1 0 0 0 0 1 0 0 L H L H H L L H /* Check basic I/O write states */ +0 1 0 0 0 1 1 0 0 L H L H H L L H +0 1 0 0 1 0 1 0 0 L H L H H L L H +0 1 0 0 1 1 1 0 0 H H L H H L L H +0 1 0 1 0 0 1 0 0 L H L H H L L H +0 1 0 1 0 1 1 0 0 L H L H H L L H +0 1 0 1 1 0 1 0 0 L H L H H L L H +0 1 0 1 1 1 1 0 0 L H L H H H L H +0 1 1 0 0 0 1 0 0 L H L H H L L H +0 1 1 0 0 1 1 0 0 L H L H H L L H +0 1 1 0 1 0 1 0 0 L H L H H L L H +0 1 1 0 1 1 1 0 0 L H H H H L L H +0 1 1 1 0 0 1 0 0 L H L H H L L H +0 1 1 1 0 1 1 0 0 L H L H H L L H +0 1 1 1 1 0 1 0 0 L H L H H L L H +0 1 1 1 1 1 1 0 0 L H L H H L L H +1 0 0 0 0 0 1 0 0 L H L H H L L H /* Check basic i/o read states */ +1 0 0 0 0 1 1 0 0 L H L H H L L H +1 0 0 0 1 0 1 0 0 L H L H H L L H +1 0 0 0 1 1 1 0 0 L L L H H L L H +1 0 0 1 0 0 1 0 0 L H L H H L L H +1 0 0 1 0 1 1 0 0 L H L H H L L H +1 0 0 1 1 0 1 0 0 L H L H H L L H +1 0 0 1 1 1 1 0 0 L H L H H L L H +1 0 1 0 0 0 1 0 0 L H L H H L L H +1 0 1 0 0 1 1 0 0 L H L H H L L H +1 0 1 0 1 0 1 0 0 L H L H H L L H +1 0 1 0 1 1 1 0 0 L H L L H L L H +1 0 1 1 0 0 1 0 0 L H L H H L L H +1 0 1 1 0 1 1 0 0 L H L H H L L H +1 0 1 1 1 0 1 0 0 L H L H H L L H +1 0 1 1 1 1 1 0 0 L H L H H L L H +1 1 0 0 0 0 0 1 0 L H L H H L H H +1 1 0 0 0 0 0 0 0 L H L H H L H H +1 1 0 0 0 0 1 0 0 L H L H H L L H +1 1 0 0 0 0 1 1 0 L H L H H L L H +1 1 0 0 0 0 1 1 1 L H L H H L L L + \ No newline at end of file diff --git a/CIRCUITS/LINK.JED b/CIRCUITS/LINK.JED new file mode 100755 index 0000000..cd21367 --- /dev/null +++ b/CIRCUITS/LINK.JED @@ -0,0 +1,71 @@ + +CUPL 2.15b Serial# 6-00002-120 +Device p20ra10 Library DLIB-h-24-14 +Created Tue Jan 01 00:04:24 1980 +Name LINK PAL & COMMAND CONTROL +Partno LINK 1 +Revision 01 +Date 24/02/88 +Designer P.D. Smart +Company Feduptronics +Assembly XXXXX +Location XXXXX +*QP24 +*QF3210 +*G0 +*F0 +*L0000 11111111111111111111111111111111 +*L0032 11111111000000000000000000000000 +*L0064 00000000000000001111111110111111 +*L0096 11111111111111111111111111110111 +*L0128 11111111111111111111111111111111 +*L0320 11111111111111111111111111111111 +*L0352 11111111000000000000000000000000 +*L0384 00000000000000001011111111111111 +*L0416 11111111111111111111111111111111 +*L0448 11110111111111111111111111111111 +*L0640 11111111111111111111111111111111 +*L0672 11111111000000000000000000000000 +*L0704 00000000000000001111111111111111 +*L0736 11111111111111111111111111111111 +*L0768 11111111111111111111111111111111 +*L0800 11111101111111111111111111111101 +*L0832 11111111000000000000000000000000 +*L0960 11111111111111111111111111111111 +*L0992 11111111000000000000000000000000 +*L1024 00000000000000001111111111111111 +*L1056 11111111111111111111111111111111 +*L1088 11111111111111111111111111111111 +*L1120 11011111111111111111111111011111 +*L1152 11111111000000000000000000000000 +*L1280 11111111111111111111111111111111 +*L1312 11111111111111111111111111111111 +*L1344 11110111111111110000000000000000 +*L1440 11111111111111110111111111111111 +*L1472 11111111000000000000000000000000 +*L1600 11111111111111111111111111111111 +*L1632 11111111111111111111111111111111 +*L1664 11110111111111110000000000000000 +*L1760 11111111111111111111011111111111 +*L1792 11111111000000000000000000000000 +*L1920 11111111111111111111111111111111 +*L1952 11111111111111111111111111111111 +*L1984 11110111111111110000000000000000 +*L2080 11111111111111111111111101111111 +*L2112 11111111000000000000000000000000 +*L2240 11111111111111111111111111111111 +*L2272 11111111111111111111111111111111 +*L2304 11111111111111010000000000000000 +*L2400 11111111111111111111111111111111 +*L2432 01111111000000000000000000000000 +*L2560 11111111111111111111111111111111 +*L2592 11111111111111111111111111111111 +*L2624 11111111111111010000000000000000 +*L2720 11111111111111111111111111111111 +*L2752 11110111000000000000000000000000 +*L2944 00000000000000001111111111111111 +*L2976 11111111111111111111111111111111 +*L3008 11111111111111111111111111111111 +*L3200 1111111110 +*C99E6 +*E697 \ No newline at end of file diff --git a/CIRCUITS/LINKPAL.ABS b/CIRCUITS/LINKPAL.ABS new file mode 100755 index 0000000000000000000000000000000000000000..352774703db56588778f873e704f8cd619ba5a03 GIT binary patch literal 6192 zcma)=OK=oL7{|X!vYBKTvXg8cyd;AJ2(PfoMvTweB?*!;32_sJ0#U-F01-k(P!zNl z%PKEc2`4We@M3xJ;>DuM3v%${B_}UlxL9S$#fw$wf${%+-80>jRMP3H%=FIue_wx( zPEXHlJD#Bfv~aAR9u+b#`_xS8I6gM{Dp7rYp?GDWI6vE8q&xKQt_M$|FCTcHbq(BT zpue6}iB;iLWjx#-4j-PFs7#LFJULT6Jg#o_Q?Z{02KN;Q_6-fuRNqKnIDKh${wf_j zd*<4etMhZ0FPwglj&jpST4ie#T_kOlh?e=}p=Xl=L;I_v)1xyh+i9aZuMUzmG(lrp z>LO>au&|9Xm3o|`=pc*ie#U*!!TBz=p53-#;p^w=V+VI@9tK`gW0I~_{fX>lr;oPLkZGhZ1 zgNUM&^tR-7qU0KLR&vW^R>)H{E4i&YNtIhBb3(pFCnUE=outYwlWT#h48scZ1AWSrn4veJi)Fz2@9m0LW=mna@#lfGU`OKK7kpHsu=Pn-GHwJ`a|u(mKzY)mA63>=bLm~ z;(Vm{3Cp93>`cfOtVJB>-+G_mB0CatBW(bgr+=KJ%8((uX)`iZp#R*YWXO)w)m?Rz2kDe` z#S8cw0*@^?-_ed3f9}SYglk-6pQt9+O^juE*OrSQ{ggf##j<(cGh=yJk8Jh zk5l@VrFwDA=oc)#7v!~G`Oj}^y4{L9VLc^%elK6*k3h!${d&{qXUP(M$d-*}sKNAk zZ@)xePU{0p?*;8C|IM@m6R2oTa%j3wc!DmmFGaI_$e6xIooT&Qd;O@RUjDeE3-3`^ zN?*n;)eLw&WBMMgOX+K|+?vl*wmw*|^{QT08bK<*@3KG1jSVULd`FQc#&VQ)GqFST+Y0$wT=7sPjSH zmVK?P@!7;!^G)BQFs&CY>(O*L-|>g6B;GA)eaJ#?CdS9U>3jGVkeY905vTMEwm#UZ z^>IALR_sJ5zQnoiN!y2IHH3-rev|2Yw9VGXMnKi@r`n%QwYZC@w%dAR$clHU+4$(; zS#QM~2LXFV6WIEoSL;P;Plzyf;$$-=eWIPVeJx?PEZ4H8@6oQs`kI3D2|s$Xrte|L zVfoL}kPo*1*Rv)TkM=Cqmql*HJ7w#Gy;^TlqpfL<=q`T9h;fuzjpnwc4=nxvt3cze literal 0 HcmV?d00001 diff --git a/CIRCUITS/LINKPAL.PLD b/CIRCUITS/LINKPAL.PLD new file mode 100755 index 0000000..5960e15 --- /dev/null +++ b/CIRCUITS/LINKPAL.PLD @@ -0,0 +1,85 @@ +Name LINK PAL & COMMAND CONTROL; +Partno LINK 1; +Date 24/02/88; +Revision 01; +Designer P.D. Smart; +Company Feduptronics; +Assembly XXXXX; +Location XXXXX; + +/******************************************************************/ +/* A PAL to implement basic link handshaking and interupt gen- */ +/* eration. Also implements PC-286 reset, and PC-8207 reset. */ +/* */ +/******************************************************************/ +/* Allowable Target Device Types: 20RA10 */ +/******************************************************************/ + +/** Inputs **/ + +Pin 2 = PCRDLNK ; /* PC requests a read of LINK */ +Pin 3 = PCWRLNK ; /* PC requests to write to LINK */ +Pin 4 = READLNK ; /* 286 requests a read of LINK */ +Pin 5 = WRITELNK ; /* 286 requests to write to LINK */ +Pin 6 = PCD0 ; /* PC data bus D0 */ +Pin 7 = PCD1 ; /* PC data bus D1 */ +Pin 8 = PCD2 ; /* PC data bus D2 */ +Pin 9 = PCCOM ; /* PC write command signal */ +Pin 10 = D0 ; /* 286 data bus D0 */ +Pin 11 = D1 ; /* 286 data bus D1 */ +Pin 14 = COM ; /* 286 write command signal */ + +/** Outputs **/ + +Pin 23 = PCDATAR ; /* Data available output to PC */ +Pin 22 = DATAR ; /* Data available output to 286 */ +Pin 21 = INTR2 ; /* Interupt level 2 to PC */ +Pin 20 = NMI ; /* NMI to 286 */ +Pin 19 = MEMRESET ; /* Reset 8207 */ +Pin 18 = 286RESET ; /* Reset 286 */ +Pin 17 = PCCout ; /* Intermediate output */ +Pin 16 = Cout ; /* Intermediate output */ +Pin 15 = TEST ; /* A test/general purpose output */ + +/** Declarations and Intermediate Variable Definitions **/ + +PCDATAR.AP = PCWRLNK; +PCDATAR.AR = !READLNK; +PCDATAR.D = 'b'0; +PCDATAR.CK = 'b'0; +DATAR.AP = WRITELNK; +DATAR.AR = !PCRDLNK; +DATAR.D = 'b'0; +DATAR.CK = 'b'0; +MEMRESET.AP = 'b'0; +MEMRESET.AR = 'b'0; +MEMRESET.D = PCD0; +MEMRESET.CK = PCCOM; +286RESET.AP = 'b'0; +286RESET.AR = 'b'0; +286RESET.D = PCD1; +286RESET.CK = PCCOM; +PCCout.AP = 'b'0; +PCCout.AR = 'b'0; +PCCout.D = PCD2; +PCCout.CK = PCCOM; +Cout.AP = 'b'0; +Cout.AR = 'b'0; +Cout.D = D0; +Cout.CK = COM; +TEST.AP = 'b'0; +TEST.AR = 'b'0; +TEST.D = D1; +TEST.CK = COM; + + +/** Logic Equations **/ + +INTR2 = DATAR & Cout; +NMI = PCDATAR & PCCout; + + + + + + \ No newline at end of file diff --git a/CIRCUITS/LINKPAL.SI b/CIRCUITS/LINKPAL.SI new file mode 100755 index 0000000..1088bb9 --- /dev/null +++ b/CIRCUITS/LINKPAL.SI @@ -0,0 +1,54 @@ +Name LINK PAL & COMMAND CONTROL; +Partno LINK 1; +Date 24/02/88; +Revision 01; +Designer P.D. Smart; +Company Feduptronics; +Assembly XXXXX; +Location XXXXX; + +/******************************************************************/ +/* A PAL to implement basic link handshaking and interupt gen- */ +/* eration. Also implements PC-286 reset, and PC-8207 reset. */ +/* */ +/******************************************************************/ +/* Allowable Target Device Types: 20RA10 */ +/******************************************************************/ + + +ORDER: PCRDLNK, %1, PCWRLNK, %1, READLNK, %1, WRITELNK, %1, PCD0, %1, + PCD1, %1, PCD2, %1, PCCOM, %1, D0, %1, D1, %1, COM, %2, + + PCDATAR, %1, DATAR, %1, INTR2, %1, NMI, %1, MEMRESET, %1, + 286RESET, %1, PCCout, %1, Cout, %1, TEST; + +VECTORS: +$msg " **INPUTS** *OUTPUT* "; +$msg " "; +$msg " W M 2 "; +$msg " P P R R P E 8 "; +$msg " C C A I C M 6 P "; +$msg " R W E T P D D I R R C "; +$msg " D R D E P P P C A A N E E C C T"; +$msg " L L L L C C C C C T T T N S S o o E"; +$msg " N N N N D D D O D D O A A R M E E u u S"; +$msg " K K K K 0 1 2 M 0 1 M R R 2 I T T t t T"; +$msg " ----------------------------------------"; + 1 0 1 0 0 0 0 1 0 0 1 X X X X X X X X X /* Test PC command reg */ + 1 0 1 0 0 0 1 C 0 0 1 X X X X L L H X X + 1 0 1 0 0 1 0 C 0 0 1 X X X L L H L X X + 1 0 1 0 0 1 1 C 0 0 1 X X X X L H H X X + 1 0 1 0 1 0 0 C 0 0 1 X X X L H L L X X + 1 0 1 0 1 0 1 C 0 0 1 X X X X H L H X X + 1 0 1 0 1 1 0 C 0 0 1 X X X L H H L X X + 1 0 1 0 1 1 1 C 0 0 1 X X X X H H H X X + 1 0 1 0 0 0 0 1 0 0 C X X L L L L L L L /* Test 286 command reg*/ + 1 0 1 0 0 0 0 1 0 1 C X X L L L L L L H + 1 0 1 0 0 0 0 1 1 0 C X X X L L L L H L + 1 0 1 0 0 0 0 1 1 1 C X X X L L L L H H + 1 0 1 1 0 0 0 1 0 0 1 X L L L L L L L L /* Test S R flip flops */ + 1 0 0 0 0 0 0 1 0 0 1 H L L L L L L L L + 1 1 1 0 0 0 0 1 0 0 1 L L L L L L L L L + 0 0 1 0 0 0 0 1 0 0 1 H L L L L L L L L + 1 1 1 0 0 0 1 C 0 0 1 L H L L L L H L L + \ No newline at end of file diff --git a/CIRCUITS/MEM b/CIRCUITS/MEM new file mode 100755 index 0000000000000000000000000000000000000000..a6a771af38191f9ebd41bd7e78883ec17fc90f76 GIT binary patch literal 6804 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 literal 0 HcmV?d00001 diff --git a/CIRCUITS/MEMEVEN b/CIRCUITS/MEMEVEN new file mode 100755 index 0000000000000000000000000000000000000000..bf55b3972aae67cc8ad01ad1edf5ff07ef3f3658 GIT binary patch literal 5815 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 literal 0 HcmV?d00001 diff --git a/CIRCUITS/MEMORY.JED b/CIRCUITS/MEMORY.JED new file mode 100755 index 0000000..7a16e87 --- /dev/null +++ b/CIRCUITS/MEMORY.JED @@ -0,0 +1,45 @@ + +CUPL 2.15b Serial# 6-00002-120 +Device p20rs4 Library DLIB-h-24-21 +Created Tue Jan 01 00:05:45 1980 +Name Memory system control PAL +Partno MEM 1 +Revision 01 +Date 23/02/88 +Designer P.D. Smart +Company Feduptronics +Assembly XXXXX +Location XXXXX +*QP24 +*QF3330 +*G0 +*F0 +*L0000 11111111111111111111111111111111 +*L0032 11111111011111111111111111111111 +*L0064 11111111111111110000000000000000 +*L0320 11111111111111111111111111111111 +*L0352 11111111111111111111111011110111 +*L0384 11111111111111111111111111111111 +*L0416 11100111111111111111111100000000 +*L0896 00000000000000000000000011111111 +*L0928 11111111111111111111111111111111 +*L0960 11111111111111110111111111111111 +*L0992 11111111111111111111011111111111 +*L1024 11111111111111110000000000000000 +*L2240 11111111111111111111111111111111 +*L2272 11111111111111111111111111111111 +*L2304 10111111111111111111111111111111 +*L2336 11111111111101110111111111111011 +*L2368 01111111111111111111111111111111 +*L2816 00000000000000000000000011111111 +*L2848 11111111111111111111111111111111 +*L2880 11111111111111111111111111111011 +*L2912 11110111111111111111111111111111 +*L2944 11111111101101110000000000000000 +*L3136 00000000000000000000000011111111 +*L3168 11111111111111111111111111111111 +*L3200 00011000110110000000000000000000 +*L3232 00000001100000000000000000000000 +*L3296 00000010100100000000000000000000 +*C4F7D +*2862 \ No newline at end of file diff --git a/CIRCUITS/MEMPAL.ABS b/CIRCUITS/MEMPAL.ABS new file mode 100755 index 0000000000000000000000000000000000000000..487f1cf1b661b1ecf0743898f5b0ee2170e3a849 GIT binary patch literal 2372 zcma);-)j>=5Xa{(x!mPfb7_*cg0)AbR#e(#D_ALLVsp}>X+kPC;!|mY6>L(HSm>Mn z1?roBPKEvfzW4|DR?r7ueQEs8ZHyO?>;|3$M22Q2 zX;}HmQa;ED5z^o5FpPSvBua(*0njMO5bRPu^3j$XfHXjcVQ2ct&3gHT8l57&WWX#- zH)$DjhD=d*chn$-;ghp#_nH^ literal 0 HcmV?d00001 diff --git a/CIRCUITS/MEMPAL.PIN b/CIRCUITS/MEMPAL.PIN new file mode 100755 index 0000000..7915aae --- /dev/null +++ b/CIRCUITS/MEMPAL.PIN @@ -0,0 +1,19 @@ + ______________ + | Memory | + NotPSEN x---|1 24|---x Vcc + PSEN x---|2 23|---x PSENInv + DTR x---|3 22|---x !EvenWR + DEN x---|4 21|---x !OddWR + BHE x---|5 20|---x EVEN + A0 x---|6 19|---x ODD + WE x---|7 18|---x + MIO x---|8 17|---x + A19 x---|9 16|---x !ReadMem + ROME x---|10 15|---x !PE + x---|11 14|---x + GND x---|12 13|---x + |______________| + + + + \ No newline at end of file diff --git a/CIRCUITS/MEMPAL.PLD b/CIRCUITS/MEMPAL.PLD new file mode 100755 index 0000000..24134f7 --- /dev/null +++ b/CIRCUITS/MEMPAL.PLD @@ -0,0 +1,63 @@ +Name Memory system control PAL; +Partno MEM 1; +Date 23/02/88; +Revision 01; +Designer P.D. Smart; +Company Feduptronics; +Assembly XXXXX; +Location XXXXX; + +/******************************************************************/ +/* A PAL to glue the memory system to the 286 CPU. */ +/* */ +/******************************************************************/ +/* Allowable Target Device Types: 20RS4 */ +/******************************************************************/ + +/** Inputs **/ + +Pin 1 = NotPSEN ; /* Inverted PSEN for clocking */ +Pin 2 = PSEN ; /* PSEN before inversion */ +Pin 3 = DTR ; /* DT/NOT R signal */ +Pin 4 = DEN ; /* Data enable signal */ +Pin 5 = BHE ; /* Bus High ENABLE */ +Pin 6 = A0 ; /* Address bus A0 signal */ +Pin 7 = WE ; /* Memory write enable */ +Pin 8 = MIO ; /* Memory / Not IO signal */ +Pin 9 = A19 ; /* Address bus A19 signal */ +Pin 10 = ROME ; /* Rom enabled signal */ +Pin 11 = EAACK ; /* Early DRAM acknowledge signal */ + + +/** Outputs **/ + +Pin 23 = PSENInv ; /* Inverted PSEN output */ +Pin 22 = EvenWR ; /* Evenbyte write signal */ +Pin 21 = OddWR ; /* Oddbyte write signal */ +Pin 20 = EVEN ; /* Intermediate even write output */ +Pin 19 = ODD ; /* Intermediate odd write output */ +Pin 16 = ReadMem ; /* Enable 374 gates for read */ +Pin 15 = PE ; /* Enable 8207 PORT A */ +Pin 14 = CRDY ; /* Composite READY enable signal */ + + +/** Declarations and Intermediate Variable Definitions **/ + +EVEN.D = A0; +ODD.D = BHE; + +X1 = !DTR & DEN; +X2 = A19 & ROME; + +/** Logic Equations **/ + +PSENInv = !PSEN; +ReadMem = !X1; +PE = !MIO # X2; +EvenWR = !(WE & !EVEN); +OddWR = !(WE & !ODD); +CRDY = !X2 & EAACK; + + + + \ No newline at end of file diff --git a/CIRCUITS/MEMPAL.SI b/CIRCUITS/MEMPAL.SI new file mode 100755 index 0000000..775cb84 --- /dev/null +++ b/CIRCUITS/MEMPAL.SI @@ -0,0 +1,55 @@ +Name Memory system control PAL; +Partno MEM 1; +Date 23/02/88; +Revision 01; +Designer P.D. Smart; +Company Feduptronics; +Assembly XXXXX; +Location XXXXX; + +/******************************************************************/ +/* A PAL to glue the memory system to the 286 CPU. */ +/* */ +/******************************************************************/ +/* Allowable Target Device Types: 20RS4 */ +/******************************************************************/ + +ORDER: PSEN, %2, DTR, %1, DEN, %2, BHE, %1, A0, %1, NotPSEN, %1, WE, %2, + MIO, %1, A19, %1, ROME, %1, EAACK, %3, + + PSENInv, %1, ReadMem, %1, EvenWR, %1, OddWR, %1, PE, %1, CRDY; + +VECTORS: +$msg " **INPUTS** *OUTPUT* "; +$msg " "; +$msg " N P R "; +$msg " o S e E "; +$msg " t E E a v O "; +$msg " P P R A N d e d C "; +$msg " E D D B S M A O A I M n d R "; +$msg " S T E H A E W I 1 M C n e W W P D "; +$msg " N R N E 0 N E O 9 E K v m R R E Y "; +$msg " ----------------------------------------"; +0 X X X X X X X X X X H X X X X X /* Test invertor */ +1 X X X X X X X X X X L X X X X X +X 1 1 X X X X X X X X X H X X X X /* Testing memory read latch enabling */ +X 1 0 X X X X X X X X X H X X X X +X 0 1 X X X X X X X X X L X X X X +X 0 0 X X X X X X X X X H X X X X +X X X X X X X 0 0 0 0 X X X X H L /* Testing 8207 enabling. Should only */ +X X X X X X X 0 0 1 0 X X X X H L /* be enabled if a Memory access, and */ +X X X X X X X 0 1 0 0 X X X X H L /* the ROM is disabled, or if ROM */ +X X X X X X X 0 1 1 1 X X X X H L /* enabled, should only be enabled if */ +X X X X X X X 1 0 0 1 X X X X L H /* A19 = 0 */ +X X X X X X X 1 0 1 1 X X X X L H +X X X X X X X 1 1 0 1 X X X X L H +X X X X X X X 1 1 1 0 X X X X H L +X X X 1 1 C 0 X X X X X X H H X X /* Test WRITE output strobes. */ +X X X 1 0 C 0 X X X X X X H H X X +X X X 0 1 C 0 X X X X X X H H X X +X X X 0 0 C 0 X X X X X X H H X X +X X X 1 1 C 1 X X X X X X H H X X +X X X 1 0 C 1 X X X X X X L H X X +X X X 0 1 C 1 X X X X X X H L X X +X X X 0 0 C 1 X X X X X X L L X X + \ No newline at end of file diff --git a/CIRCUITS/PAL.SRC b/CIRCUITS/PAL.SRC new file mode 100755 index 0000000..956cf47 --- /dev/null +++ b/CIRCUITS/PAL.SRC @@ -0,0 +1,105 @@ +{De-Compiled Library} + +PREFIX +END + +'MEMPAL' +REFERENCE '20RS4' +{X Size =} 12 {Y Size =} 12 {Parts per Package =} 1 +L1 1 IN 'N\o\t\P\S\E\N\' +L2 2 IN 'PSEN' +L3 3 IN 'DT/R\' +L4 4 IN 'DEN' +L5 5 IN 'BHE' +L6 6 IN 'A0' +L7 7 IN 'WE' +L8 8 IN 'M/I\O\' +L9 9 IN 'A19' +L10 10 IN 'ROME' +L11 11 IN 'E\A\A\C\K\' +R2 23 OUT 'PSENInv' +R4 22 OUT 'E\v\e\n\W\R\' +R5 21 OUT 'O\d\d\W\R\' +R7 16 OUT 'R\e\a\d\M\e\m\' +R9 15 OUT 'P\E\' +R11 14 OUT 'C\R\D\Y\' +T4 24 PWR 'VCC' +B4 12 PWR 'GND' + +'PCPAL' +REFERENCE '16L8' +{X Size =} 12 {Y Size =} 13 {Parts per Package =} 1 +L1 1 IN 'A0' +L2 2 IN 'A1' +L3 3 IN 'A3' +L4 4 IN 'A4' +L5 5 IN 'A5' +L6 6 IN 'A6' +L7 7 IN 'A7' +L8 8 IN 'A8' +L9 9 IN 'A9' +L10 11 IN 'C\P\U\A\E\N\' +L11 13 IN 'I\O\W\R\' +L12 14 IN 'I\O\R\D\' +R2 19 OUT 'R\D\S\T\A\T\' +R3 18 OUT 'WRCOM' +R5 17 OUT 'R\D\P\C\L\' +R6 16 OUT 'WRPCL' +R8 15 OUT 'A\D\D\R\' +R10 12 OUT 'S\E\L\2\4\5\' +T4 20 PWR 'VCC' +B4 10 PWR 'GND' + +'CPUPAL' +REFERENCE '16L8' +{X Size =} 14 {Y Size =} 10 {Parts per Package =} 1 +L1 1 IN 'I\O\W\R\' +L2 2 IN 'I\O\R\D\' +L3 3 IN 'A1' +L4 4 IN 'A2' +L5 5 IN 'A10' +L6 6 IN 'A11' +L7 7 IN 'A19' +L8 8 IN 'R\E\S\E\T\' +L9 9 IN 'MEMRES' +R1 19 OUT 'LINKWR' +R2 18 OUT 'L\I\N\K\R\D\' +R3 17 OUT 'COMWR' +R4 16 OUT 'S\T\A\T\R\D\' +R5 15 OUT 'FF1' +R6 14 OUT 'FF2' +R7 13 OUT 'R\O\M\S\E\L\' +R8 12 OUT 'LOADSHIFT' +T4 20 PWR 'VCC' +B4 10 PWR 'GND' + +'LINKPAL' +REFERENCE '20RA10' +{X Size =} 16 {Y Size =} 14 {Parts per Package =} 1 +L1 1 IN 'P\L\' +L2 2 IN 'P\C\R\D\L\N\K\' +L3 3 IN 'PCWRLNK' +L4 4 IN 'R\E\A\D\L\N\K\' +L5 5 IN 'WRITELNK' +L6 6 IN 'PCD0' +L7 7 IN 'PCD1' +L8 8 IN 'PCD2' +L9 9 IN 'P\C\C\O\M\' +L10 10 IN 'D0' +L11 11 IN 'D1' +L12 14 IN 'C\O\M\' +L13 13 IN 'O\E\' +R1 23 OUT 'P\C\D\A\T\A\R\' +R2 22 OUT 'D\A\T\A\R\' +R4 21 OUT 'INTR2' +R5 20 OUT 'NMI' +R7 19 OUT 'MEMRESET' +R8 18 OUT '2\8\6\R\E\S\E\T\' +R10 17 OUT 'PCCout' +R11 16 OUT 'Cout' +R13 15 OUT 'TEST' +T4 24 PWR 'VCC' +B4 12 PWR 'GND' + + + \ No newline at end of file diff --git a/CIRCUITS/PARTS b/CIRCUITS/PARTS new file mode 100755 index 0000000..0887b2c --- /dev/null +++ b/CIRCUITS/PARTS @@ -0,0 +1,77 @@ + Revised: January 24, 1988 +TurboRacer 286 Revision: A +Bill Of Materials January 24, 1988 18:45:44 Page 1 + + Item Quantity Reference Part +_____________________________________________________ + + 1 9 R4,R5,R6,R7,R8,R9,R10, 33R + R11,R12 + + 2 1 U14 8207 + + 3 1 U10 74F00 + + 4 1 U11 74F04 + + 5 2 U15,U9 74F74 + + 6 32 UM1,UM2,UM3,UM4,UM5,UM6, 41256 + UM7,UM8,UM9,UM10,UM11, + UM12,UM13,UM14,UM15,UM16, + UM17,UM18,UM19,UM20,UM21, + UM22,UM23,UM24,UM25,UM26, + UM27,UM28,UM29,UM30,UM31, + UM32 + + 7 4 RP1,RP2,R13,R14 1K + + 8 2 SW1,SW2 DIPSW-8 + + 9 2 U28,U29 74LS165 + + 10 8 U16,U4,U5,U6,U7,U8,U17, 74F244 + U18 + + 11 2 U19,U20 74F245 + + 12 1 U27 74F32 + + 13 1 U21 74F85 + + 14 1 U22 74ALS133 + + 15 1 SW3 DIPSW-4 + + 16 2 U25,U13 74F138 + + 17 1 U23 74HCT75 + + 18 1 U26 74F273 + + 19 1 U24 74HCT243 + + 20 1 R1 910R + + 21 1 X1 12MHz + + 22 2 C1,C2 10pF + + 23 1 U1 80286 + Revised: January 24, 1988 +TurboRacer 286 Revision: A +Bill Of Materials January 24, 1988 18:45:44 Page 2 + + Item Quantity Reference Part +_____________________________________________________ + + 24 1 U2 82284 + + 25 1 R2 300R + + 26 1 U12 74F08 + + 27 1 C3 .047uF + + 28 1 U3 82288 + diff --git a/CIRCUITS/PC b/CIRCUITS/PC new file mode 100755 index 0000000000000000000000000000000000000000..b1f2e3d3f58db71a0d5a64a55649795d139944ec GIT binary patch literal 4589 zcmeI0Pe@!@7RK+r?^#tzOnRmXA|Zq#Gh{@9XjxiDYB5@Wrk!Z{c$VqlqNh95qG^Im z7a4ItrfnB4LKw1;ESyai*-S57gju*~q;V0X$RbGLqOprC8fmg-#;yl*z zz~omGQDJH}F2Z>PdmqjH#+;ff=HG9PxoH0O)|xQ&m8t*f^-XJn`Js_SE?drINALhU zAEL>O_e|d^VltsI+4q*l1hbcW8igZoX%vpVrBOKbmPR48`dm&%xZtfZv3k9ABk>+q za@CesQ&FK1%}w?#s*F~?(#)h1D25k-5BGMBGQhI_dE;0^wOd3sa4=CY}gMFZcKMoFo68<cj^@-OlzIzhBo?zQ1&&gDR zuBb3s925%?6l+K<1W~MvScs!o!(t(nVr9ibG{qVb3jq~tR4l|)tejW~t5`Z7A}f}T zhv15(;~~Cc>39gSSUMh}ES8RkK#Qg0AveV0c+73JI3CkmEsn2V@(v$OZNTvq%zpeS&K(4km zUmM8Pw&rUCx!TrzZ6H_Mny(GyYFqQQfn05CzBZ7nZOzv#^5Uuc2k0C&CL} z>t0v9u6upxb<^t;uUlTXEein0PlVexaRvo>%U=1$;eaG>3l9nJ3TK3$3l9q)2xo;~ z3XcfC5*`&k5$2JYhyO)1!ENBS;x2Gk@j39h;sNkL@g?x3;w#`Q#S`EOL$M4;s=HpF zdp+>_((5a)CtlxJo8(cAIbqp?n3F3G31UvJm=VOBTyaTJsNbHTcg{amo_V?P(H``FI~b05#4FBUBIg*B_6lM;(H ztDo}{i#4ksQ&Wrk-(+dgF`6tbI!2SFMaO8ev}mq0Sz0t#nk+4vD@~Rb&6Org3vxyL zqGoseqF{IYqFQ(SqEvVMqE2`GqDXiAqC$84N<#CUYX$e+4`@Kj55ZH#r|yvvq&zZ` z9+XJ2ZuiY58Xlu;+OPQ-<)=W9@>8(EtCSX6vKxE;)H$DpVtx%XE;23AF%BYR18P2T z0f>T6tO09!=0^SuUhrBodY1C%$b!Lc$n)>^O(Wjid64>Y9v}#^rSIm;+P%vvqrH?mO&aO60!7nMdry0tDkAV>TSlzLdy@!!{F7 z@sm-oZV%0>lOIZyRfjVzB@zdMaqtMv9vgSbd;sbES!3V+&TL$p8cX8RSw`%NNx6|* z-u;G?U!#;bxN5sX85B1gcvG5aK+gPoojv7yCpDDP3Li6BXik3bC+!ZUN{`@DUlcM8v9ZrBUna_`qoJiqI`=yLkCJ0D+N-r!2`ty@GJPj^Bo?#1H0qQFAnJ7mDrGbWi>>xJ>-DD^OQYJ&$7|MX+KzPMWqoFTlI+UtMX=#OO zp>Es?}fN;7e3uB2CLyn@3=u3)VFmXqPG(*CdDiH`Tka}8hVbLu|5ZPxIYJuWxptTV_zYWwP1#jPak*XZ}#Z?@pfCI_u7~ KIu3uKc=A8!iPq=< literal 0 HcmV?d00001 diff --git a/CIRCUITS/PC.JED b/CIRCUITS/PC.JED new file mode 100755 index 0000000..0cc933f --- /dev/null +++ b/CIRCUITS/PC.JED @@ -0,0 +1,41 @@ + +CUPL 2.15b Serial# 6-00002-120 +Device p16l8 Library DLIB-h-24-8 +Created Tue Jan 01 00:12:57 1980 +Name PC I/O decoder PAL +Partno PC 1 +Revision 01 +Date 25/02/88 +Designer P.D. Smart +Company Feduptronics +Assembly XXXXX +Location XXXXX +*QP20 +*QF2048 +*G0 +*F0 +*L0000 11111111111111111111111111111111 +*L0032 10011111111111111110111011011110 +*L0256 11111111111111111111111111111111 +*L0288 11111111111111111111111111111101 +*L0320 11111111111111111111111111011111 +*L0352 11111111111111111111111011111111 +*L0384 11111111111111111101111111111111 +*L0416 11101111111111111111111111111111 +*L0448 01111111111111111111111111111111 +*L0512 11111111111111111111111111111111 +*L0544 10101111111111111110111011011110 +*L0768 11111111111111111111111111111111 +*L0800 11111111111111111111111111111101 +*L0832 11111111111111111111111111011111 +*L0864 11111111111111111111111011111111 +*L0896 11111111111111111101111111111111 +*L0928 11011111111111111111111111111111 +*L0960 01111111111111111111111111111111 +*L1024 11111111111111111111111111111111 +*L1056 11111011011110111011101110110111 +*L1792 11111111111111111111111111111111 +*L1824 11111111111111111110111011111110 +*L1856 11111111111111111110111111101110 +*C55D1 +*05CF \ No newline at end of file diff --git a/CIRCUITS/PC286 b/CIRCUITS/PC286 new file mode 100755 index 0000000000000000000000000000000000000000..66c3eda1ad7358b61cbc7d3ff35eecb410978722 GIT binary patch literal 7748 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 KD}E+ZQ25`=j5rVg literal 0 HcmV?d00001 diff --git a/CIRCUITS/PCPAL.ABS b/CIRCUITS/PCPAL.ABS new file mode 100755 index 0000000000000000000000000000000000000000..5a2af6b998222f7d4249b558ff7c286636858a2a GIT binary patch literal 2388 zcma)-zi-n(6vv;>b{yCF+3=eJURV%n0Ba+A* zGVr96Q9a8F28owK3Yk?z6l5U!J{4ITkz6|k;{K6(pNcGu$P4(o2&&T0)caKAyTC$n6?l&0{4$R{i0|K>Q0k}O$6u@+`I;}mPL2PD65aLXn~ zLZZ+hv}|(3Cwh==?=QN)6ZkH=2fPE77i@a)-ayJgEdbc#^vkYF9ZuBAz4} zkx+YZ##mlfvZiA5V-e-q14m>IBa$N_A~Mx#yf0{cM8qFDX>x=kGKUfIh>XbOmW|`! z->%6m*9ko$K0diCOYLexk4OUlaOA$_%jLW=)(0!k#g;8{U0*pI&gRr?d2E)QO23Zs eTfro9mL;+gl7Gwe{ zk_W3u9jXpRvN~jl-rzYy)uB^|ObnhnbYh6;)~PL?U@+fzj`N;@iKP;@UcT>s?|bLm zckemZDb1Xl{U~29%mj0Vh1ml`M;C@f9?H5nkwxbK^^qVrzk2oi)#{HykUbt`-^)!L z$xTj71;y$&UsYGH1na9CtHF1dE`Pc4MOBiI%Yz@Ad6!R29mk(sP&^r)3`$p4s~d?e zVWa=WoILjbVW~lB_zRMD7ewhg=(^FXpjVAv1HESSI_Pzyw?Jsubv~1yKQH9^B)wG3=6!Y^miK!sKDP9$5DD<)G}+9&8~&h?T;-(YMC=jwZ}3LTlTBvtXaEzSEfHb}Lk5tswrIOeyq~HqKnn{4L(^@8s9FQm+yH9wcS;h5q_i9 zsmEy~TAGn)X-1-@8DZ_!qNN#$mS!Ycnh`bxWi*_MWE>YLVLVl)N~ohEKnZnUHCn~5 zg3^XB%1vA_5N`TuqtiH_l@iwcoS>ps0DGUL>5o`NZTSbXh5kk$LbvfrF>&6+jfTG` zqwXFlVbndMozU<~8~zDSs3%kjW9}Dv2@S7w3st*?5`{`&6KeP_?7IH_G9-ikSUp{u zS>SOxhOTEU*t*b@cGL|r6k!@qfexp3+&HfOVfhv?S??=_`Enk2IOHABUu6O@C+H_I z1t@nel8bJL^r91g`Uh263DctLv{3bL$pb0wtt9?2bDhib@NyxSl2mCqI}jF%rR5Vj zwN?Li%$hAt+hmXJZg*qekgq#V((;o$`{d90*CqAoWOiWc)IuqH<}{++^_Mi-n`ZN7 z^R!Lw+4>J-{U&^|zHebMAC}G)=E``9bx3^aLm~&4W=n-qd2uPo74tLmFKoE)?8jkH jTwI=AO4tia{*Oe-3d)0|1~A%`GC4ugaovNGflJme6uyj(_~`4~gi=4bKow8bfVlx&r(a zFE9RmKFDQzgY3}Y;P0nC3qK306UC?&{IM401`B`5;<8`=nIchV?O%%*{ty!TUCTd*c7=ck@qEr_;1eZ>h&ll{%(M!C0kMj!qX#WuLmq zOHGx+j88qPtWUkFoKFQ+pHCyIyiaFT{XW%H1)t8V27Fp1i+DxEyQ)IG>ncRKsX~<7 zDnz-fLX-z8M0und^y!Ie$fuZW`&6kkb*@;h`1FG8(W%nd4s1E}|LFKw414pI zCxrDP599eebU8p7l*Xdcxv^R_Bhv!ID3b!iC{qH%C=&w1DANJMD3bxhC{qE$C=&t0 z$kV{IhLI7WW@0>3Q8va?73E?)S5aS# zCo9Uwc($Vc7*AJJi1B{6kZCsgR=Nn_B7 zG45riMfCDii|A$8B6?YA5xtylvA^Nwjq%2dSRPl5u|+J8Yg}S^e9tA8$1N_gJnnFb z<#CToERTm=4m90kE(e=#i_4*gdxn6;Y^LF!3$hLOvmn=SuLOM!_ePL!IBWT2bfZI1 zXt<9A0}U4l1{>~E!BFh-)}+RZS!kFw`gytGB2<>f&o| z3t*Wx+;@y9jNJ`f&l^STeh@|Bru)&_wy0bTqvAyDHmpre7fWY1+)wuXa*kaC$E#5| z({#UBW2+dpgv%_JRpQN39v|TxC`&u>7C>3riMIsG(oVc(P?mP$t$?z$6K@rirJZv~xelm(x7d*GfPO_{uxGSc5p zuv6I$b}M_p9%V1st1N&80(_x-3BFXm245@Rf$x;fiDNleW zlqbQH$_$uMo&rxPLoifUz>0DjoK{`{FDU21dF2)Git-wGjhT42Y#tx!&MO>!rF;Xv z(Gxnnyw~B$34xb*0W-ld{ud4d!+OFUTy{qz+yn0^AA%2+kHN>vEpSWu41A`14nDW$ zKPXPqCXz+yA=CXKJ25&_D+l0YG!swekd~4BopYC25ExZHOdsh$MB0BzcG= zeTXE1h>$`qX*|3GAeqQMEvZEJY0V_EPfI4zeVSh@c#E9Oq8+4WAsRwn7NRA7pWuDk zr>83P5^olK486o#1q)Z>oq~mnU#oEKI~97_Zlo5y>{6kZCscS-IcYd8V4wCW(;`|q z)gqb+TSPmR7SYgji)d-ySl*|7x?(K$X`ilfi7UV75|`cL64%_}5*OU#5*>TUCA#&P zOLS_BOLXZO0%D)`>A3(Ae-^5#RYhaJaEaD`v}S+X^=SjUF>kv*{bcPy!uP3x<0WjnK7GlJj3eMh z0NcDzml?Ilr*8pl^FDpY;8%+qXkOn3e-K5X{g{r^)WLf@epk3-M1Q*Y4Sr^jRL&hz zY4m!=g^(p;KWK}mCI zS_37`)oC5ECAZbFx1{kw6Lq|krtuN(f|A?nIG)Bwjy6HbZFSlMCAZb_%O;JFoRBhU zk~Ej5Zv5_%+?J*uP;y(Edcj`P_5r3wj#6#-H8gsz8nk_g?|-G#vC?FvQZCgdqhma> zpWrS(A&`p&8Zp8V4A_WiYe#@tN@0Bo=a_@S1?GToiCGXXGy8=r%)D@w*(Y3M=Gu-S z?mDHsVqaFgDb9$u*||aSu6RIP7Z=1$ald#^oEN_p_lZ-6<7ivm?5wuc1CM6)oL+Gr SKg~PK;or)^!O;9~e*G_w@;C_q literal 0 HcmV?d00001 diff --git a/SOURCE/ACCEL.C b/SOURCE/ACCEL.C new file mode 100755 index 0000000..213ebb7 --- /dev/null +++ b/SOURCE/ACCEL.C @@ -0,0 +1,229 @@ +/**************************************************************************** + * TurboRacer 286 ACCELerator software * + * ----------------------------------- * + * * + * (C) 1987,1988 P.D. Smart. * + * * + * * + * This file contains startup and initialisation code for the accelerator. * + * * + * Basically, it resets the ADRAM controller and the 286 processor, and * + * awaits the return of a self test validation code. If the accelerator * + * does not pass it's self test, then this programs terminates back to the * + * DOS enviroment being run on the PC. It also processes user option flags, * + * and passes the necessary information to the accelerator. Whilst the * + * accelerator is running, the server code, which is written in assembly * + * language and bonded to this C program, services the accelerator. If an * + * error occurs, or the user abandons the accelerator, then control returns * + * to this program, and a termination message is printed. The program then * + * terminates back to the DOS enviroment being run on the PC. * + * * + * HISTORY * + * ------- * + * * + * V1.0 - Basic program structure prepared and implemented. * + * * + * * + ****************************************************************************/ +#include +#include +#include +#include + +#define BOOTDOS 0x01 +#define COPYBOOT 0x02 +#define LOADBIOS 0x03 +#define LOADTEST 0x04 +#define MEMTEST 0x05 +#define VERSION "1.00" +#define DATEREL "6th April 1988" + +int BOOTflag; +char BIOSFILE[80]; + +main(argc,argv) +int argc; +char *argv[]; +{ + FILE *fp1; + int result; + unsigned char data,intno; + char tempbuf[80]; + + /* Sign on message. */ + printf("TurboRacer 286 Accelerator\n"); + printf("Version %s, Released %s\n",VERSION,DATEREL); + printf("(C) 1987,1988 P.D. Smart. All rights reserved.\n\n"); + + /* Process flags. */ + BOOTflag=0; + strcpy(BIOSFILE,"TURBOROM.OBJ"); + while(argc>1) + { + strcpy(tempbuf,*++argv); + flags(tempbuf); + argc--; + } + + /* Reset ADRAM controller, then 286 processor. */ + outp(0x211,0x01); + outp(0x211,0x00); + if(readstat()) readlink(); /* Clear link. */ + outp(0x211,0x02); + + /* Once 286 reset, a self test is performed. A value is returned + on the link indicating status of accelerator board. */ + printf("286 performing memory test....."); + if(data=readlink()) + error(data,""); + else + printf("Memory OK.\n"); + + /* If the bootflag is set, then the BIOS contained on the + accelerator will not be used, instead, a new BIOS, contained + within the file named by BIOSFILE, will be loaded into the + accelerator. */ + if(BOOTflag) + { + printf("Loading new BIOS....."); + if((fp1=fopen(BIOSFILE,"rb"))==NULL) + error(3,BIOSFILE); + writelink(LOADBIOS); /* Send command to accelerator to load + a new BIOS. */ + while(!feof(fp1)) + { + data=fgetc(fp1); + writelink(data); + } + fclose(fp1); + /* Once the new BIOS is loaded, it re-performs the self-test, + returning a result code over the link. */ + if(data=readlink()) + error(4,""); + else + printf("BIOS loaded OK.\n"); + writelink(BOOTDOS); /* Send command to accelerator to boot DOS.*/ + } else + writelink(COPYBOOT); /* Use internal BIOS and boot DOS. */ + + /* Execute the server software, which is written in assembler. + If the accelerator is terminated by user, or error, a result is + returned. If the high byte of the result is not zero, then the + low byte contains an error code. If the high byte of the result + is zero, then the user terminated the accelerator. */ + result=setup(); + if((result>>8)&0x00ff) + { + printf("\n\nAccelerator terminated, "); + switch(result&0x00ff) + { + case 0: + printf("Divide error exception occurred.\n"); + break; + case 1: + printf("Single step interrupt occurred.\n"); + break; + case 3: + printf("Breakpoint intercepted.\n"); + break; + case 4: + printf("Overflow exception occurred.\n"); + break; + case 5: + printf("Range exceeded exception occurred.\n"); + break; + case 6: + printf("Invalid opcode exception occurred.\n"); + break; + case 7: + printf("No math unit available exception occurred.\n"); + break; + case 8: + printf("IDT too small exception occurred.\n"); + break; + case 10: + case 11: + case 12: + case 14: + case 15: + case 24: + case 29: + case 30: + case 31: + printf("Reserved interrupt - %02X occurred.\n",result&0x00ff); + break; + case 13: + printf("Segment overrun exception occurred.\n"); + break; + default: + printf("Illegal interrupt - %02X occurred.\n",result&0x00ff); + break; + } + } else + printf("\n\nAccelerator terminated by user.\n"); +} + + +/* This subroutine processes flags present on the input line. A flag begins + with a '-' sign, followed by a letter. */ +flags(tempbuf) +char *tempbuf; +{ + int cnt=0; + int index=0; + + while(tempbuf[cnt]!=0) + { + if(tempbuf[cnt++]!='-') + error(5,tempbuf); + switch(tempbuf[cnt++]) + { + case 'B': + case 'b': + BOOTflag=1; + break; + case 'F': + case 'f': + while(tempbuf[cnt]!=0) + BIOSFILE[index++]=tempbuf[cnt++]; + BIOSFILE[index]=0; + break; + default: + error(5,tempbuf); + break; + } + } +} + +/* This subroutine processes errors, indicating on the standard output, an + internal processing error, or a hardware error on the accelerator. */ +error(errno,tempbuf) +int errno; +char *tempbuf; +{ + printf("\nACCEL: "); + switch(errno) + { + case 1: + printf("286 processor failure...\n"); + exit(-1); + break; + case 2: + printf("286 memory failure...\n"); + exit(-2); + break; + case 3: + printf("Can't open '%s'\n",tempbuf); + exit(-3); + break; + case 4: + printf("BIOS loading failed...\n"); + exit(-4); + break; + case 5: + printf("Illegal flag '%s'.\n",tempbuf); + exit(-5); + break; + } +} + \ No newline at end of file diff --git a/SOURCE/ACCEL.EXE b/SOURCE/ACCEL.EXE new file mode 100755 index 0000000000000000000000000000000000000000..63dbf86e1328dcf7055537d1dc528cf1b6c687ac GIT binary patch literal 33708 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 DqkLO; literal 0 HcmV?d00001 diff --git a/SOURCE/ACCL.ASM b/SOURCE/ACCL.ASM new file mode 100755 index 0000000..241225d --- /dev/null +++ b/SOURCE/ACCL.ASM @@ -0,0 +1,870 @@ +;**************************************************************************** +;* TurboRacer 286 ACCELerator software * +;* ----------------------------------- * +;* * +;* (C) 1987,1988 P.D. Smart. * +;* * +;* * +;* This file contains assembly language routines to implement I/O server * +;* functions, under the control of the Accelerator board. Also contained * +;* within this file are assembly language routines to bind to the main C * +;* program to implement link communications. * +;* * +;* HISTORY * +;* ------- * +;* * +;* V1.0 - Basic program structure prepared and implemented. * +;* * +;* * +;**************************************************************************** + TITLE Routines to do link communications, and serving. + +;* Necessary declarations to enable these assembly language routines to be +;* linked into the main C program. +_TEXT SEGMENT BYTE PUBLIC 'CODE' +_TEXT ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS + +DGROUP GROUP CONST, _BSS, _DATA + ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES:DGROUP + + +;* Global data segment. Any Global data variables must be declared here. +_DATA SEGMENT +_DATA ENDS + + +;* All assembly coding must be included within a TEXT segment, a peculiarity +;* of the Microsoft assembler. +_TEXT SEGMENT + +;**************************************************************************** +; SETUP() - Routine to initialise the PC I/O server. Keyboard and Timer tick* +; interrupts are revectored, stack pointers altered to a new * +; storage space, and the I/O server is activated. Should the * +; accelerator require termination, through user request, or un- * +; recoverable error, then the keyboard and Timer tick vectors are * +; changed back to there original values, along with the stack * +; pointers. Then control is returned back to the calling C * +; program, along with a reason code for termination. * +; * +; INPUT: None. * +; * +; OUTPUT: Termination code in AX. * +;**************************************************************************** + PUBLIC _setup +_setup PROC NEAR + cli + push bp ;Save all used registers. + push bx + push cx + push dx + push si + push di + push ds + push es + mov ax,0000h ;Revector necessary interrupts. + mov ds,ax + mov word ptr cs:segsave,ss + mov word ptr cs:stksave,sp + mov ax,word ptr ds:[0024h] + mov word ptr cs:keyip,ax + mov ax,word ptr ds:[0026h] + mov word ptr cs:keycs,ax + mov ax,word ptr ds:[0070h] + mov word ptr cs:tickip,ax + mov ax,word ptr ds:[0072h] + mov word ptr cs:tickcs,ax + mov bx,OFFSET _keybi + mov word ptr ds:[0024h],bx + mov word ptr ds:[0026h],cs + mov bx,OFFSET _ticki + mov word ptr ds:[0070h],bx + mov word ptr ds:[0072h],cs + push cs + push cs + push cs + pop ds + pop es + pop ss + mov sp,OFFSET tos ;Change to new TOP OF STACK. + sti + jmp _control ;Execute I/O server. +_set1: cli + mov ss,word ptr cs:segsave ;Restore old stack. + mov sp,word ptr cs:stksave + push ax + mov ax,0000h ;Restore old vectors. + mov ds,ax + mov ax,word ptr cs:keyip + mov word ptr ds:[0024h],ax + mov ax,word ptr cs:keycs + mov word ptr ds:[0026h],ax + mov ax,word ptr cs:tickip + mov word ptr ds:[0070h],ax + mov ax,word ptr cs:tickcs + mov word ptr ds:[0072h],ax + sti + pop ax ;Restore old registers. + pop es + pop ds + pop di + pop si + pop dx + pop cx + pop bx + pop bp + ret +_setup ENDP + +;**************************************************************************** +; CONTROL - Routine to perform I/O server functions for the TurboRacer 286 * +; multiprocessor board. Routine polls the LINK status port until * +; a command becomes available, then, via means of a function * +; table, jumps to the necessary code to perform the service * +; request. * +; * +; INPUT: None. * +; * +; OUTPUT: Termination code in AH. * +;**************************************************************************** +_control PROC NEAR + mov si,OFFSET lodmes + push cs + pop ds +cont_1: lodsb ;Get byte addressed by SI. SI+1. + cmp al,0ffh ;End of message. + je cont_2 + mov ah,0eh ;Do a write teletype. + mov bx,7 + mov cx,1 + push si + int 10h + pop si + jmp cont_1 +cont_2: mov dx,0211h +cont_3: in al,dx ;Await a command. + test al,8 + jnz cont_3 + dec dx + in al,dx ;Get command. + cmp al,(COM_TAE-COM_TAB)/2 ;Get address of service routine. + jb cont_4 + mov al,00h +cont_4: mov cl,al + xor ch,ch + shl cx,1 + mov bx,OFFSET COM_TAB + add bx,cx + call word ptr cs:[bx] ;And execute service routine. + jmp cont_2 +;* +;* I/O service routine table. Contains addresses for all service routines. +;* +COM_TAB dw bad_com ;00h + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw _intr5 + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw _intr10 ;10h + dw _intr11 + dw bad_com + dw bad_com + dw _intr14 + dw bad_com + dw bad_com + dw _intr17 + dw bad_com + dw bad_com + dw _intr1a + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com ;20h + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw disk_reset ;30h + dw disk_status + dw disk_read + dw disk_write + dw disk_verf + dw disk_parms + dw disk_type + dw disk_change + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw bad_com + dw end_com ;3Fh +COM_TAE equ $ + +;* +;* If this routine is executed, then an unrecoverable error occurred on the +;* TurboRacer 286. Reason code contained in AL. +;* +bad_com:mov ah,1 ;Indicate error in AH. + jmp _set1 +;* +;* This routine is executed if the user requests a termination. +;* +end_com:mov ah,0 ;Indicate termination in AH. + jmp _set1 + +;* +;* Message to indicate that the TurboRacer has control over the PC +;* +lodmes: db 'Accelerator running.......',0DH,0AH,0FFH +_control ENDP + +;**************************************************************************** +; KEYBI - This routine replaces the standard IBM PC interrupt handler. * +; Routine passes keyboard code directly to the TurboRacer via * +; interrupting the 80286 processor. * +; * +; INPUT: None. * +; * +; OUTPUT: None. * +;**************************************************************************** +_keybi PROC NEAR + sti ;Interrupts back on. + push ax ;Save all registers used. + push bx + push cx + push dx + push si + push di + push ds + push es + cli + mov dx,0211h ;Wait until LINK is clear. +keyb1: in al,dx + test al,1 + jz keyb1 + mov al,06h + out dx,al + nop + nop + nop + nop + mov al,02h + out dx,al + dec dx + mov al,09h + out dx,al + mov dx,0211h +keyb2: in al,dx + test al,1 + jz keyb2 + in al,60h + push ax + in al,61h + mov ah,al + or al,80h + out 061h,al + xchg ah,al + out 061h,al + pop ax + dec dx + out dx,al + mov al,20h + out 20h,al + pop es + pop ds + pop di + pop si + pop dx + pop cx + pop bx + pop ax + iret +_keybi ENDP + +_ticki PROC NEAR + sti + push ax + push dx + push ds + mov ax,DGROUP + mov ds,ax + mov dx,0211h +tick1: in al,dx + test al,1 + jz tick1 + cli + mov al,06h + out dx,al + nop + nop + nop + mov al,02h + out dx,al + dec dx + mov al,01ch + out dx,al + sti +ticke: pop ds + pop dx + pop ax + sti + iret +_ticki ENDP + + +_intr5 PROC NEAR + int 05h + mov bx,0 + mov ax,50h + mov ds,ax + mov al,ds:[bx] + call txbyte + ret +_intr5 ENDP + + +_intr10 PROC NEAR + mov di,sp ;Save stack pointer. + mov ax,8000h + mov ds,ax + mov es,ax + call rxword ;Get AX from link. + push ax ;And save on stack. + call rxword ;Next BX. + push ax + call rxword ;Next CX. + push ax + call rxword ;Next DX. + push ax + mov bp,sp ;BP addresses stack. + mov ax,[bp+6] ;Get AX. + mov bx,OFFSET tbs + cmp ah,13h ;Write string? + jne i10_2 + mov cx,[bp+2] ;Get count. +i10_1: call rxbyte ;Read in string. + mov es:[bx],al + inc bx ;Next byte. + loop i10_1 +i10_2: mov ax,[bp+6] ;Restore AX,BX,CX,DX. + mov bx,[bp+4] + mov cx,[bp+2] + mov dx,[bp] + mov bp,OFFSET tbs + int 10h + call txword ;Return AX. + mov ax,bx + call txword ;Return BX. + mov ax,cx + call txword ;Return CX. + mov ax,dx + call txword ;Return DX. + mov sp,di + ret +_intr10 ENDP + +_intr11 PROC NEAR + int 11h + call txword ;Return AX. + ret +_intr11 ENDP + + +disk_reset PROC NEAR + mov ax,0000h + mov ds,ax + mov bx,ds:[0078h] ;Get parameters pointers. + mov ax,ds:[007ah] + mov ds,ax + mov cx,0bh +dsk_res:call rxbyte + mov ds:[bx],al + inc bx + loop dsk_res + mov ax,0000h ;Get back AX. + int 13h + pushf + call txword ;Send AX. + popf + lahf + mov al,ah + call txbyte ;Send flags. + ret +disk_reset ENDP + +disk_status PROC NEAR + mov ax,0100h + int 13h + pushf + call txword ;Send AX. + popf + lahf + mov al,ah + call txbyte ;Send flags. + ret +disk_status ENDP + +disk_read PROC NEAR + push cs + pop es + mov dx,0211h +diskr1: in al,dx ;Read in AL. + test al,8 + jnz diskr1 + dec dx + in al,dx + mov ah,02h + push ax + push ax ;Two copies. + inc dx +diskr2: in al,dx ;Read in CL. + test al,8 + jnz diskr2 + dec dx + in al,dx + mov bl,al + inc dx +diskr3: in al,dx ;Read in CH. + test al,8 + jnz diskr3 + dec dx + in al,dx + mov bh,al + push bx + inc dx +diskr4: in al,dx ;Read in DL. + test al,8 + jnz diskr4 + dec dx + in al,dx + mov bl,al + inc dx +diskr5: in al,dx ;Read in DH. + test al,8 + jnz diskr5 + dec dx + in al,dx + mov bh,al + mov dx,bx + pop cx + pop ax + mov bx,OFFSET tbs + int 13h + pop dx ;Get AX copy int DX. + pushf + push ax + mov ax,dx ;Work out size to transfer. + xor ah,ah + mov cx,0200h + mul cx + mov cx,ax +diskr6: mov dx,0211h +diskr7: in al,dx + test al,1 ;Check link status. + jz diskr7 + dec dx + mov al,es:[bx] + out dx,al + inc bx + loop diskr6 + pop ax + call txword ;Send AX. + popf + lahf + mov al,ah + call txbyte ;Send flags. + ret +disk_read ENDP + +disk_write PROC NEAR + push cs + pop es + mov dx,0211h +diskw1: in al,dx ;Read in AL. + test al,8 + jnz diskw1 + dec dx + in al,dx + mov ah,03h + mov cx,ax + push ax ;Two copies. + inc dx +diskw2: in al,dx ;Read in CL. + test al,8 + jnz diskw2 + dec dx + in al,dx + mov bl,al + inc dx +diskw3: in al,dx ;Read in CH. + test al,8 + jnz diskw3 + dec dx + in al,dx + mov bh,al + push bx + inc dx +diskw4: in al,dx ;Read in DL. + test al,8 + jnz diskw4 + dec dx + in al,dx + mov bl,al + inc dx +diskw5: in al,dx ;Read in DH. + test al,8 + jnz diskw5 + dec dx + in al,dx + mov bh,al + push bx + mov bx,OFFSET tbs ;Write a sector. + mov ax,cx + xor ah,ah + mov cx,0200h + mul cx + mov cx,ax +diskw6: mov dx,0211h +diskw7: in al,dx + test al,8 + jnz diskw7 + dec dx + in al,dx + mov es:[bx],al + inc bx + loop diskw6 + pop dx + pop cx + pop ax + mov bx,OFFSET tbs + int 13h + pushf + call txword ;Send AX. + popf + lahf + mov al,ah + call txbyte ;Send flags. + ret +disk_write ENDP + +disk_verf PROC NEAR + push cs + pop es + mov bx,OFFSET tbs + call rxword + push ax + call rxword + push ax + call rxword + mov dx,ax + pop cx + pop ax + int 13h + pushf + call txword ;Send AX. + popf + lahf + mov al,ah + call txbyte ;Send flags. + ret +disk_verf ENDP + + +disk_parms PROC NEAR + call rxword + push ax + call rxword + mov dx,ax + pop ax + int 13h + pushf + call txword ;Send AX. + mov ax,cx + call txword ;Send CX. + mov ax,dx + call txword ;Send DX. + popf + lahf + mov al,ah + call txbyte ;Send flags. + ret +disk_parms ENDP + + +disk_type PROC NEAR +disk_change: + call rxword + int 13h + pushf + call txword ;Send AX. + mov ax,dx + call txword ;Send DX. + popf + lahf + mov al,ah + call txbyte ;Send flags. + ret +disk_type ENDP + + +_intr14 PROC NEAR + call rxword ;Read AX. + push ax + call rxword ;Read DX. + mov dx,ax + pop ax + int 14h + call txword ;Return AX. + ret +_intr14 ENDP + + +_intr17 PROC NEAR + call rxword ;Read AX. + push ax + call rxword ;Read DX. + mov dx,ax + pop ax + int 17h + call txword ;Return AX. + ret +_intr17 ENDP + +_intr1a PROC NEAR + call rxword + push ax ;Save AX. + call rxword + mov cx,ax ;Get CX. + call rxword + mov dx,ax ;Get DX. + pop ax ;Restore AX. + int 1ah + pushf + call txword ;Return AX. + mov ax,cx + call txword ;Return CX. + mov ax,dx + call txword ;Return DX. + popf + lahf + mov al,ah + call txbyte ;Return flags. + ret +_intr1a ENDP + + +;*************************************** +; Read a byte from link. * +;*************************************** +rxbyte PROC NEAR + cli + push dx + mov dx,0211h +rxb1: in al,dx + test al,8 + jnz rxb1 + dec dx + in al,dx + xor ah,ah + pop dx + sti + ret +rxbyte ENDP + + +;*************************************** +; Read a word from link. * +;*************************************** +rxword PROC NEAR + cli + push dx + mov dx,0211h +rxw1: in al,dx + test al,8 + jnz rxw1 + dec dx + in al,dx ;Read in LOW byte. + mov ah,al + inc dx +rxw2: in al,dx + test al,8 + jnz rxw2 + dec dx + in al,dx ;Read in HIGH byte. + xchg al,ah ;Right order. + pop dx + sti + ret +rxword ENDP + + +;*************************************** +; Write a byte to link. * +;*************************************** +txbyte PROC NEAR + cli + push ax + push dx + mov ah,al + mov dx,0211h +txb1: in al,dx + test al,1 ;Check link status. + jz txb1 + dec dx + mov al,ah + out dx,al ;Transfer. + pop dx + pop ax + sti + ret +txbyte ENDP + + +;*************************************** +; Write a word to link. * +;*************************************** +txword PROC NEAR + cli + push ax + push dx + push ax + mov dx,0211h +txw1: in al,dx + test al,1 + jz txw1 + dec dx + pop ax + out dx,al ;Transfer LOW byte. + inc dx +txw2: in al,dx + test al,1 + jz txw2 + dec dx + mov al,ah + out dx,al ;Transfer HIGH byte. + pop dx + pop ax + sti + ret +txword ENDP + +CODEEND equ $ ;End of reusable code. + + PUBLIC _readlink +_readlink PROC NEAR + push bp + mov bp,sp + mov dx,0211h +rd1: in al,dx + test al,00001000b + jnz rd1 + dec dx + in al,dx + xor ah,ah + mov sp,bp + pop bp + ret +_readlink ENDP + + PUBLIC _readstat +_readstat PROC NEAR + push bp + mov bp,sp + mov dx,0211h + in al,dx + test al,00001000b + mov al,1 + jz rds + mov al,0 +rds: xor ah,ah + mov sp,bp + pop bp + ret +_readstat ENDP + + PUBLIC _intstat +_intstat PROC NEAR + push bp + mov dx,0211h + in al,dx + test al,00000010b + mov al,1 + jz ints + mov al,0 +ints: xor ah,ah + pop bp + ret +_intstat ENDP + + PUBLIC _writelink +_writelink PROC NEAR + push bp + mov bp,sp + mov dx,0211h +wr1: in al,dx + test al,00000001b + jz wr1 + mov ax,[bp+4] + dec dx + out dx,al + mov sp,bp + pop bp + ret +_writelink ENDP + +_locald PROC NEAR +dataseg equ $ +tbs db 02000h dup(?) ;8192 byte temporary buffer. +dskt db 0ch dup(?) ;11 byte Disk parameter buffer. + db 02000h dup(?) +tos equ $ ;8192 byte stack. +segsave dw 00000H +stksave dw 00000H +keyip dw 00000H +keycs dw 00000H +tickip dw 00000H +tickcs dw 00000H +_locald ENDP + + +_TEXT ENDS + END + + + + + + + \ No newline at end of file diff --git a/SOURCE/BACKUP.BAT b/SOURCE/BACKUP.BAT new file mode 100755 index 0000000..e507132 --- /dev/null +++ b/SOURCE/BACKUP.BAT @@ -0,0 +1,38 @@ +ECHO OFF +ECHO Copying TURBOROM files from C:\PROJECT to A:\ +PAUSE +COPY C:\PROJECT\TURBOROM.ASM A:\ >NUL +COPY C:\PROJECT\STARTUP.ASM A:\ >NUL +COPY C:\PROJECT\TABLES.ASM A:\ >NUL +COPY C:\PROJECT\BIOS.ASM A:\ >NUL +COPY C:\PROJECT\MEM.ASM A:\ >NUL +COPY C:\PROJECT\EDTURBO.BAT A:\ >NUL +COPY C:\PROJECT\TURBO.BAT A:\ >NUL +COPY C:\PROJECT\BACKUP.BAT A:\ >NUL +COPY C:\PROJECT\RESTORE.BAT A:\ >NUL +ECHO Copying ACCELERATOR files from C:\PROJECT to A:\ +COPY C:\PROJECT\ACCEL.C A:\ >NUL +COPY C:\PROJECT\ACCL.ASM A:\ >NUL +COPY C:\PROJECT\ACCEL.EXE A:\ >NUL +COPY C:\PROJECT\EDACC.BAT A:\ >NUL +COPY C:\PROJECT\MKACC.BAT A:\ >NUL +ECHO Copying MEMTEST files from C:\PROJECT to A:\ +COPY C:\PROJECT\MEMTEST.C A:\ >NUL +COPY C:\PROJECT\MEMASM.ASM A:\ >NUL +ECHO Copying SUPPORT files from C:\PROJECT to A:\ +COPY C:\PROJECT\SPLIT.C A:\ >NUL +COPY C:\PROJECT\VIDEO A:\ >NUL +COPY C:\PROJECT\LINK.ASM A:\>NUL +ECHO Copying now complete. + + + + + + + + + + + + \ No newline at end of file diff --git a/SOURCE/BIOS.ASM b/SOURCE/BIOS.ASM new file mode 100755 index 0000000..3e22521 --- /dev/null +++ b/SOURCE/BIOS.ASM @@ -0,0 +1,1153 @@ +;**************************************************************************** +;** BIOS.ASM ** +;** -------- ** +;** ** +;** (C) 1987, 1988 P.D. Smart ** +;** ** +;** This file is part of the TURBOROM.ASM source code. It contains code ** +;** to perform:- ** +;** ** +;** All PC compatible ROM bios functions, making the 286 + 1Mbyte RAM ** +;** appear as a fast PC compatible. ** +;** Reset boot jump. ** +;** ** +;** These routines reside at ROM location FC00:2000 - FC00:3FFF ** +;** ** +;**************************************************************************** + + ORG 02000H ;Beginning of BIOS code. + +;*************************************** +; NMI interrupt. * +; * +; FUNCTION: NMI service routine to * +; process requests from the * +; PC. * +; TYPE: 286 service required. * +;*************************************** +NMI: PUSH AX ;Save used registers. + PUSH DX + STI ;Interrupts back on. + MOV DX,0C02H +NMI1: IN AL,DX ;Wait for descriptor byte. + TEST AL,8 + JNZ NMI1 + DEC DX + DEC DX ;Get descriptor byte. + IN AL,DX ;What action does the PC request? + CMP AL,09H ;Keyboard? + JNZ NMI2 + INC DX + INC DX +NMIK: IN AL,DX ;If keyboard, get scan code from PC. + TEST AL,8 + JNZ NMIK + DEC DX + DEC DX + IN AL,DX + INT 09H ;And perform a keyboard interrupt. + JMP NMIEXIT +NMI2: CMP AL,01CH ;Timer tick? + JNZ NMI3 + INT 01CH ;If timer tick, perform a timer + JMP NMIEXIT ;tick interrupt. +NMI3: +NMIEXIT:POP DX ;Restore used registers. + POP AX + STI + IRET +;******************************* +; End of NMI servicing. * +;******************************* + + +;*************************************** +; Interrupt number 5. PRINT_SCREEN. * +; * +; FUNCTION: Initiates a dump of the * +; screen to printer. * +; TYPE: PC service required. * +;*************************************** +INTR5: CLI ;Disable further interrupts. + PUSH AX + PUSH BX + PUSH DX + PUSH DS + MOV AL,05H + CALL TXCOM ;Send command. + CALL RXBYTE + SUB BX,BX + MOV DS,BX + MOV BX,500 ;Address of Print screen variable. + MOV [BX],AL ;Store. + POP DS + POP DX + POP BX + POP AX + STI ;Re-enable interrupts. + IRET +;******************************* +; End of Interrupt 5. * +;******************************* + +;*************************************** +; Interrupt number 10H. VIDEO_IO * +; * +; FUNCTION: Processes video input & * +; output. * +; TYPE: PC service required. * +;*************************************** +INTR10: CLI ;Disable further interrupts. + PUSH AX + PUSH AX + MOV AL,10H + CALL TXCOM + POP AX + CALL TXWORD ;Send AX. + MOV AX,BX + CALL TXWORD ;Send BX. + MOV AX,CX + CALL TXWORD ;Send CX. + MOV AX,DX + CALL TXWORD ;Send DX. + POP AX + CMP AH,13H ;Write string?. + JNE I10_2 ;No, go on. + PUSH BP ;If write string, transfer all +I10_1: MOV AL,ES:[BP] ;bytes found at ES:BP. + INC BP + CALL TXBYTE ;Send byte. + LOOP I10_1 + POP BP +I10_2: CALL RXWORD ;Receive AX. + PUSH AX + CALL RXWORD + MOV BX,AX ;Receive BX. + CALL RXWORD + MOV CX,AX ;Receive CX. + CALL RXWORD + MOV DX,AX ;Receive DX. + POP AX + STI ;Re-enable interrupts. + IRET +;******************************* +; End of VIDEO I/O. * +;******************************* + +;*************************************** +; Interrupt number 11. EQUIPMENT CHECK * +; * +; FUNCTION: Checks to see what equip- * +; ment is present. * +; TYPE: PC service required. * +;*************************************** +INTR11: CLI ;Disable further interrupts. + MOV AL,11H + CALL TXCOM + CALL RXWORD ;Receive AX. + STI ;Re-enable interrupts. + IRET +;******************************* +; End of Equipment check. * +;******************************* + +;*************************************** +; Interrupt number 12H.MEMORY CHECK * +; * +; FUNCTION: Indicates how much memory * +; is present. * +; TYPE: Fixed value returned. * +;*************************************** +INTR12: CLI ;Disable further interrupts. + MOV AX,0280H ;Full complement of memory. + STI ;Re-enable interrupts. + IRET +;******************************* +; End of Memory check. * +;******************************* + +;*************************************** +; Interrupt number 13.DISK DRIVE I/O. * +; * +; FUNCTION: Disk drive input & output * +; processing. * +; TYPE: PC service required. * +;*************************************** +INTR13: STI ;Enable interrupts. + PUSH BP + PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH DS + MOV BP,SP ;BP to point to parameter base. + ; + CMP AH,31 + JB I131 ;> Max parameter, point to bad. + MOV AH,14H +I131: MOV CL,AH + XOR CH,CH ;Index into function table for + SHL CX,1 ;subroutine address. + MOV BX,OFFSET DSK_TAB + ADD BX,CX + CALL CS:[BX] ;Call subroutine. + POP DS + POP DX + POP CX + POP BX + POP AX + POP BP + STI ;Re-enable interrupts. + RETF 0002H ;Throw old flags away. +;*************************************** +; Table of subroutine addresses. * +;*************************************** +DSK_TAB:DW D_RESET + DW D_STATUS + DW D_READ + DW D_WRITE + DW D_VERF + DW D_ERR ;Any format operation is error. + DW D_ERR + DW D_ERR + DW D_PARMS + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_TYPE + DW D_CHANGE + DW D_ERR ;Any format operation is error. + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR + DW D_ERR +DSK_TAE: +;*************************************** +; Disk reset. * +;*************************************** +D_RESET:MOV AL,30H + CALL TXCOM ;Pass command to PC server. + MOV AX,0000H ;Send across table. + MOV DS,AX + MOV BX,DS:[0078H] + MOV AX,DS:[007AH] + MOV DS,AX ;DS:BX point to disk table. + MOV CX,0BH ;Eleven bytes to transfer. +D_RES1: MOV AL,DS:[BX] + CALL TXBYTE + INC BX + LOOP D_RES1 ;Transer table. + JMP D_V1 +;*************************************** +; Disk status. * +;*************************************** +D_STATUS: + MOV AL,31H ;Pass command to PC server. + CALL TXCOM + JMP D_V1 ;Use dupilicate code. +;*************************************** +; Disk read. * +;*************************************** +D_READ: MOV AL,32H ;Pass command to PC server. + CALL TXCOM + MOV AX,[BP+8] + CALL TXBYTE ;Transmit AL. + MOV AX,[BP+4] + CALL TXWORD ;Transmit CX. + MOV AX,[BP+2] + CALL TXWORD ;Transmit DX. + MOV AX,[BP+8] + MOV CX,0200H ;Calculate transfer size. + XOR AH,AH + MUL CX + MOV CX,AX + MOV BX,[BP+6] ;Address for load. +D_READ1:CALL RXBYTE ;Read in bytes, into memory. + MOV ES:[BX],AL + INC BX + LOOP D_READ1 + JMP D_V1 +;*************************************** +; Disk write. * +;*************************************** +D_WRITE:MOV AL,33H ;Pass command to PC server. + CALL TXCOM + MOV AX,[BP+8] + CALL TXBYTE ;Transmit AL. + MOV AX,[BP+4] + CALL TXWORD ;Transmit CX. + MOV AX,[BP+2] + CALL TXWORD ;Transmit DX. + MOV AX,[BP+8] + MOV CX,0200H ;Calculate transfer size. + XOR AH,AH + MUL CX + MOV CX,AX ;Number of bytes to transfer. + MOV BX,[BP+6] ;Address for write. +D_WRIT1:MOV AL,ES:[BX] ;Get byte. + CALL TXBYTE + INC BX + LOOP D_WRIT1 ;Loop until all transfered. + JMP D_V1 +;*************************************** +; Disk verify. * +;*************************************** +D_VERF: MOV AL,34H ;Pass command to PC server. + CALL TXCOM + MOV AX,[BP+8] + CALL TXWORD ;Transmit AX. + MOV AX,[BP+4] + CALL TXWORD ;Transmit CX. + MOV AX,[BP+2] + CALL TXWORD ;Transmit DX. +D_V1: CALL RXWORD ;Get AX. + MOV [BP+8],AX +D_V2: CALL RXBYTE ;Get flags. + MOV AH,AL + SAHF ;Store flags. + RET +;*************************************** +; Disk parameters read. * +;*************************************** +D_PARMS:MOV AL,35H ;Pass command to PC server. + CALL TXCOM + MOV AX,[BP+8] ;Transmit AX. + CALL TXWORD + MOV AX,[BP+2] + CALL TXWORD ;Transmit DX. + CALL RXWORD + MOV [BP+8],AX ;Read in AX. + CALL RXWORD + MOV [BP+4],AX ;Read in CX. + CALL RXWORD + MOV [BP+2],AX ;Read in DX. + JMP D_V2 +;*************************************** +; Disk type read. * +;*************************************** +D_TYPE: MOV AL,36H ;Pass command to PC server. +D_T1: CALL TXCOM + MOV AX,[BP+8] + CALL TXWORD ;Transmit AX. + CALL RXWORD + MOV [BP+8],AX ;New AX. + CALL RXWORD + MOV [BP+2],AX ;New DX. + JMP D_V2 +;*************************************** +; Disk change. * +;*************************************** +D_CHANGE: ;Pass command to PC server. + MOV AL,37H + JMP D_T1 +;*************************************** +; Error due to bad parameters. * +;*************************************** +D_ERR: MOV AX,[BP+8] ;Return error code in AH & CARRY. + MOV AH,1 + MOV [BP+8],AX + STC + RET +;******************************* +; End of DISK I/O. * +;******************************* + +;*************************************** +; Interrupt number 14H.RS232 I/O. * +; * +; FUNCTION: RS-232 input & output * +; processing. * +; TYPE: PC service required. * +;*************************************** +INTR14: CLI ;Disable further interrupts. + PUSH AX + MOV AL,14H ;Pass command to PC server. + CALL TXCOM + POP AX + CALL TXWORD ;Transmit AX. + MOV AX,DX + CALL TXWORD ;Transmit DX. + CALL RXWORD ;Receive AX. + STI ;Re-enable interrupts. + IRET +;******************************* +; End of RS-232 I/O. * +;******************************* + +;*************************************** +; Interrupt number 15H.CASSETTE I/O. * +; * +; FUNCTION: Cassette input & output * +; processing. * +; TYPE: Unimplemented. * +;*************************************** +INTR15: STI ;Re-enable interrupts. + IRET +;******************************* +; End of CASSETTE I/O. * +;******************************* + +;*************************************** +; Interrupt number 16H.KEYBOARD I/O. * +; * +; NB. The following code is a diss- * +; assembly of a standard keyboard * +; handler present under DOS. It has * +; been suitably modified to work on the* +; accelerator board. * +; * +; FUNCTION: Keyboard input & output * +; processing. * +; TYPE: Internal servicing. * +;*************************************** +INTR16: STI + PUSH DS ;Save registers. + PUSH BX + PUSH AX + MOV AX,0040H ;Test for accelerator termination + MOV DS,AX ;code. + POP AX + CMP WORD PTR RESET_FLAG,1234H + JNE INT16_1 + MOV AL,03FH ;Terminate accelerator. + CALL TXCOM +INT16_1:OR AH,AH + JZ K1 ;Read next character? + DEC AH + JZ K2 ;Status? + DEC AH + JZ K3 ;Shift status? +INTEND: POP BX + POP DS + IRET +K1: MOV BX,WORD PTR BUFFER_HEAD + CMP BX,WORD PTR BUFFER_TAIL + JZ K1 + MOV AX,[BX] + CALL K4 + MOV WORD PTR BUFFER_HEAD,BX + JMP SHORT INTEND +K2: CLI + MOV BX,WORD PTR BUFFER_HEAD + CMP BX,WORD PTR BUFFER_TAIL + MOV AX,[BX] + STI + POP BX + POP DS + RETF 0002H +K3: MOV AL,BYTE PTR KB_FLAG + JMP SHORT INTEND +K4: INC BX + INC BX + CMP BX,WORD PTR BUFFER_END + JNE K5 + MOV BX,WORD PTR BUFFER_START +K5: RET +; +K6: DB INS_KEY + DB CAPS_KEY,NUM_KEY,SCROLL_KEY,ALT_KEY,CTL_KEY + DB LEFT_KEY,RIGHT_KEY +K6B: +K6L EQU K6B-K6 +; +K7: DB INS_SHIFT + DB CAPS_SHIFT,NUM_SHIFT,SCROLL_SHIFT,ALT_SHIFT,CTL_SHIFT + DB LEFT_SHIFT,RIGHT_SHIFT +; +K8: DB 27,-1,0,-1,-1,-1,30,-1 + DB -1,-1,-1,31,-1,127,-1,17 + DB 23,5,18,20,25,21,9,15 + DB 16,27,29,10,-1,1,19 + DB 4,6,7,8,10,11,12,-1,-1 + DB -1,-1,28,26,24,3,22,2 + DB 14,13,-1,-1,-1,-1,-1,-1 + DB ' ',-1 +K9: DB 94,95,96,97,98,99,100,101 + DB 102,103,-1,-1,119,-1,132,-1 + DB 115,-1,116,-1,117,-1,118,-1 + DB -1 +K10: DB 01BH,'1234567890-=',08H,09H + DB 'qwertyuiop[]',0DH,-1,'asdfghjkl;',027H + DB '#',-1,5CH,'zxcvbnm,./',-1,'*',-1,' ' + DB -1 +K11: DB 27,'!"œ$',37,05EH,'&*()_+',08H,0 + DB 'QWERTYUIOP{}',0DH,-1,'ASDFGHJKL:@' + DB 07EH,-1,'|ZXCVBNM<>?',-1,0,-1,' ',-1 +K12: DB 84,85,86,87,88,89,90 + DB 91,92,93 +K13: DB 104,105,106,107,108 + DB 109,110,111,112,113 +K14: DB '789-456+1230.' +K15: DB 71,72,73,-1,75,-1,77 + DB -1,79,80,81,82,83 +; +KB_INT: STI + PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH SI + PUSH DI + PUSH DS + PUSH ES + CLD + PUSH AX + MOV AX,0040H + MOV DS,AX + POP AX + MOV AH,AL + CMP AL,0FFH + JNZ K16 + JMP K62 +K16: AND AL,07FH + PUSH CS + POP ES + MOV DI,OFFSET K6 + MOV CX,K6L + REPNE SCASB + MOV AL,AH + JE K17 + JMP K25 +K17: SUB DI,OFFSET K6+1 + MOV AH,CS:K7[DI] + TEST AL,80H + JNZ K23 + CMP AH,SCROLL_SHIFT + JAE K18 + OR BYTE PTR KB_FLAG,AH + JMP K26 +K18: TEST BYTE PTR KB_FLAG,CTL_SHIFT + JNZ K25 + CMP AL,INS_KEY + JNZ K22 + TEST BYTE PTR KB_FLAG,ALT_SHIFT + JNZ K25 +K19: TEST BYTE PTR KB_FLAG,NUM_STATE + JNZ K21 + TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT + JZ K22 +K20: MOV AX,5230H + JMP K57 +K21: TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT + JZ K20 +K22: TEST AH,BYTE PTR KB_FLAG_1 + JNZ K26 + OR BYTE PTR KB_FLAG_1,AH + XOR BYTE PTR KB_FLAG,AH + CMP AL,INS_KEY + JNE K26 + MOV AX,INS_KEY*256 + JMP K57 +K23: CMP AH,SCROLL_SHIFT + JAE K24 + NOT AH + AND BYTE PTR KB_FLAG,AH + CMP AL,ALT_KEY+80H + JNE K26 + MOV AL,BYTE PTR ALT_INPUT + MOV AH,0 + MOV BYTE PTR ALT_INPUT,AH + CMP AL,0 + JE K26 + JMP K58 +K24: NOT AH + AND BYTE PTR KB_FLAG_1,AH + JMP SHORT K26 +K25: CMP AL,80H + JAE K26 + TEST BYTE PTR KB_FLAG_1,HOLD_STATE + JZ K28 + CMP AL,NUM_KEY + JE K26 + AND BYTE PTR KB_FLAG_1,NOT HOLD_STATE +K26: CLI +K27: POP ES + POP DS + POP DI + POP SI + POP DX + POP CX + POP BX + POP AX + IRET +K28: TEST BYTE PTR KB_FLAG,ALT_SHIFT + JNZ K29 + JMP K38 +K29: TEST BYTE PTR KB_FLAG,CTL_SHIFT + JZ K31 + CMP AL,DEL_KEY + JNE K31 + MOV WORD PTR RESET_FLAG,1234H + JMP K26 +K30: DB 82,79,80,81,75,76,77 + DB 71,72,73 + DB 16,17,18,19,20,21,22,23 + DB 24,25,30,31,32,33,34,35 + DB 36,37,38,44,45,46,47,48 + DB 49,50 +K31: CMP AL,57 + JNE K32 + MOV AL,' ' + JMP K57 +K32: MOV DI,OFFSET K30 + MOV CX,10 + REPNE SCASB + JNE K33 + SUB DI,OFFSET K30+1 + MOV AL,BYTE PTR ALT_INPUT + MOV AH,10 + MUL AH + ADD AX,DI + MOV BYTE PTR ALT_INPUT,AL + JMP K26 +K33: MOV BYTE PTR ALT_INPUT,0 + MOV CX,26 + REPNE SCASB + JNE K34 + MOV AL,0 + JMP K57 +K34: CMP AL,2 + JB K35 + CMP AL,14 + JAE K35 + ADD AH,118 + MOV AL,0 + JMP K57 +K35: CMP AL,59 + JAE K37 +K36: JMP K26 +K37: CMP AL,71 + JAE K36 + MOV BX,OFFSET K13 + JMP K63 +K38: TEST BYTE PTR KB_FLAG,CTL_SHIFT + JZ K44 + CMP AL,SCROLL_KEY + JNE K39 + MOV BX,WORD PTR BUFFER_START + MOV WORD PTR BUFFER_HEAD,BX + MOV WORD PTR BUFFER_TAIL,BX + MOV BYTE PTR BIOS_BREAK,80H + INT 1BH + SUB AX,AX + JMP K57 +K39: CMP AL,NUM_KEY + JNE K41 + OR BYTE PTR KB_FLAG_1,HOLD_STATE +K40: TEST BYTE PTR KB_FLAG_1,HOLD_STATE + JNZ K40 + JMP K27 +K41: CMP AL,55 + JNE K42 + MOV AX,114*256 + JMP K57 +K42: MOV BX,OFFSET K8 + CMP AL,59 + JB K56 +K43: MOV BX,OFFSET K9 + JMP K63 +K44: CMP AL,71 + JAE K48 + TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT + JZ K54 + CMP AL,15 + JNE K45 + MOV AX,15*256 + JMP SHORT K57 +K45: CMP AL,55 + JNE K46 + INT 05H + JMP K27 +K46: CMP AL,59 + JB K47 + MOV BX,OFFSET K12 + JMP K63 +K47: MOV BX,OFFSET K11 + JMP SHORT K56 +K48: TEST BYTE PTR KB_FLAG,NUM_STATE + JNZ K52 + TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT + JNZ K53 +K49: CMP AL,74 + JE K50 + CMP AL,78 + JE K51 + SUB AL,71 + MOV BX,OFFSET K15 + JMP SHORT K64 +K50: MOV AX,74*256+'-' + JMP SHORT K57 +K51: MOV AX,78*256+'+' + JMP SHORT K57 +K52: TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT + JNZ K49 +K53: SUB AL,70 + MOV BX,OFFSET K14 + JMP SHORT K56 +K54: CMP AL,59 + JB K55 + MOV AL,0 + JMP SHORT K57 +K55: MOV BX,OFFSET K10 +K56: DEC AL + XLAT CS:K11 +K57: CMP AL,-1 + JE K59 + CMP AH,-1 + JE K59 +K58: TEST BYTE PTR KB_FLAG,CAPS_STATE + JZ K61 + TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT + JZ K60 + CMP AL,'A' + JB K61 + CMP AL,'Z' + JA K61 + ADD AL,'a'-'A' + JMP SHORT K61 +K59: JMP K26 +K60: CMP AL,'a' + JB K61 + CMP AL,'z' + JA K61 + ADD AL,'a'-'A' +K61: MOV BX,WORD PTR BUFFER_TAIL + MOV SI,BX + CALL K4 + CMP BX,WORD PTR BUFFER_HEAD + JE K62 + MOV [SI],AX + MOV WORD PTR BUFFER_TAIL,BX + JMP K26 +K63: SUB AL,59 +K64: XLAT CS:K9 + MOV AH,AL + MOV AL,0 + JMP K57 +K62: JMP K27 ;Bell sounded here. +;******************************* +; End of KEYBOARD I/O. * +;******************************* + +;*************************************** +; Interrupt number 17.PRINTER I/O. * +; * +; FUNCTION: Printer input & output * +; processing. * +; TYPE: PC service required. * +;*************************************** +INTR17: CLI ;Disable further interrupts. + PUSH AX + MOV AL,17H + CALL TXCOM + POP AX + CALL TXWORD ;Transmit AX. + MOV AX,DX + CALL TXWORD ;Transmit DX. + CALL RXWORD ;Receive AX. + STI ;Re-enable interrupts. + IRET +;******************************* +; End of PRINTER I/O. * +;******************************* + +;*************************************** +; Interrupt number 1AH.CLOCK I/O. * +; * +; FUNCTION: Clock input & output * +; processing. * +; TYPE: PC service required. * +;*************************************** +INTR1A: CLI ;Disable further interrupts. + PUSH AX + MOV AL,1AH + CALL TXCOM + POP AX + CALL TXWORD ;Send AX. + MOV AX,CX + CALL TXWORD ;Send CX. + MOV AX,DX + CALL TXWORD ;Send DX. + CALL RXWORD ;Get AX. + PUSH AX + CALL RXWORD ;Get CX. + MOV CX,AX + CALL RXWORD ;Get DX. + MOV DX,AX + CALL RXBYTE + MOV AH,AL + SAHF + POP AX + STI ;Re-enable interrupts. + RETF 0002H ;Throw away old flags. +;******************************* +; End of CLOCK I/O. * +;******************************* + +;*************************************** +; Bootstrap loader. * +;*************************************** +BOOTSTRAP: + STI ;Interrupts back on. + MOV AX,0040H + MOV DS,AX + MOV BYTE PTR INTR_FLAG,00H + MOV WORD PTR RS232_BASE,03F8H + MOV WORD PTR RS232_BASE+2,0000H + MOV WORD PTR PRINTER_BASE,03BCH + MOV WORD PTR EQUIP_FLAG,4260H + MOV BYTE PTR MFG_TST,00H + MOV WORD PTR MEMORY_SIZE,0280H + MOV WORD PTR MFG_ERR_FLAG,0000H + MOV BYTE PTR KB_FLAG,00H + MOV WORD PTR PRINT_TIM_OUT,01E1EH + MOV WORD PTR PRINT_TIM_OUT+2,01E1EH + MOV WORD PTR RS232_TIM_OUT,0101H + MOV WORD PTR RS232_TIM_OUT+2,0101H + MOV WORD PTR BUFFER_START,001EH + MOV WORD PTR BUFFER_END,003EH + MOV WORD PTR BUFFER_HEAD,001EH + MOV WORD PTR BUFFER_TAIL,001EH + MOV WORD PTR RESET_FLAG,00000H +H0: SUB AX,AX + MOV DS,AX + MOV WORD PTR 0078H,DISK_BASE + MOV WORD PTR 007AH,CS + MOV DX,0000H + MOV CX,3 +H1: PUSH CX + MOV AH,0 + INT 13H + JC H2 + MOV AX,0000H + MOV ES,AX + MOV AX,201H + MOV BX,07C00H + MOV CX,1 + INT 13H +H2: POP CX + JNC H4 + LOOP H1 + MOV DX,0080H + MOV CX,4 + JMP H1 +H3: PUSH DS + MOV AX,0FC00H + MOV DS,AX + MOV SI,BADMES + CALL PRNTS + MOV AH,0 + INT 16H ;Wait until a key is struck. + POP DS + JMP H0 +H4: PUSH DS + MOV AX,0003H + INT 10H + MOV AX,0FC00H + MOV DS,AX + MOV SI,ACCEL ;Tell user accelerating. + CALL PRNTS + POP DS + JMP 0000:7C00 +;******************************* +; End of BOOTSTRAP. * +;******************************* + +;*************************************** +; Read a byte from link. * +;*************************************** +RXBYTE: PUSH DX + MOV DX,0C02H +RXB1: IN AL,DX + TEST AL,8 + JNZ RXB1 + DEC DX + DEC DX + IN AL,DX + XOR AH,AH + POP DX + RET +;******************************* +; End of READ BYTE. * +;******************************* + +;*************************************** +; Read a word from link. * +;*************************************** +RXWORD: PUSH DX + MOV DX,0C02H +RXW1: IN AL,DX + TEST AL,8 + JNZ RXW1 + DEC DX + DEC DX + IN AL,DX ;Read in LOW byte. + MOV AH,AL + INC DX + INC DX +RXW2: IN AL,DX + TEST AL,8 + JNZ RXW2 + DEC DX + DEC DX + IN AL,DX ;Read in HIGH byte. + XCHG AL,AH ;Right order. + POP DX + RET +;******************************* +; End of READ WORD. * +;******************************* + +;*************************************** +; Write a command to link. * +;*************************************** +TXCOM: PUSH DX + MOV AH,AL + MOV DX,0C02H + MOV AL,1 + OUT DX,AL ;Enable PC interrupts for command. +TXC1: IN AL,DX + TEST AL,1 ;Check link status. + JZ TXC1 + DEC DX + DEC DX + MOV AL,AH ;Command to send. + OUT DX,AL ;Send. + NOP + NOP + NOP + NOP + MOV DX,0C02H + MOV AL,0 + OUT DX,AL ;Disable PC interrupts. + POP DX + RET +;******************************* +; End of WRITE command. * +;******************************* + +;*************************************** +; Write a byte to link. * +;*************************************** +TXBYTE: PUSH AX + PUSH DX + MOV AH,AL + MOV DX,0C02H +TXB1: IN AL,DX + TEST AL,1 ;Check link status. + JZ TXB1 + DEC DX + DEC DX + MOV AL,AH + OUT DX,AL ;Transfer. + POP DX + POP AX + RET +;******************************* +; End of WRITE BYTE. * +;******************************* + +;*************************************** +; Write a word to link. * +;*************************************** +TXWORD: PUSH AX + PUSH DX + PUSH AX + MOV DX,0C02H +TXW1: IN AL,DX + TEST AL,1 + JZ TXW1 + DEC DX + DEC DX + POP AX + OUT DX,AL ;Transfer LOW byte. + INC DX + INC DX +TXW2: IN AL,DX + TEST AL,1 + JZ TXW2 + DEC DX + DEC DX + MOV AL,AH + OUT DX,AL ;Transfer HIGH byte. + POP DX + POP AX + RET +;******************************* +; End of WRITE WORD. * +;******************************* + +;*************************************** +; Illegal or unimplemented interrupts * +; are serviced by the following group * +; of subroutines. Basically, unimplem- * +; ented interrupts return immediately, * +; Illegal interrupts pass a code back * +; to the PC server. * +;*************************************** +INTRAP0:PUSH AX + MOV AL,00h +INTRG: CALL TXCOM + POP AX +INTRAP: STI + IRET + +INTRAP1:PUSH AX + MOV AL,01h + JMP SHORT INTRG + +INTRAP3:PUSH AX + MOV AL,03h + JMP SHORT INTRG + +INTRAP4:PUSH AX + MOV AL,04h + JMP SHORT INTRG + +INTRAP5:PUSH AX + MOV AL,05h + JMP SHORT INTRG + +INTRAP6:PUSH AX + MOV AL,06h + JMP SHORT INTRG + +INTRAP7:PUSH AX + MOV AL,07h + JMP SHORT INTRG + +INTRAP8:PUSH AX + MOV AL,08h + JMP SHORT INTRG + +INTRAPA:PUSH AX + MOV AL,0Ah + JMP SHORT INTRG + +INTRAPB:PUSH AX + MOV AL,0Bh + JMP SHORT INTRG + +INTRAPC:PUSH AX + MOV AL,0Ch + JMP SHORT INTRG + +INTRAPD:PUSH AX + MOV AL,0Dh + JMP SHORT INTRG + +INTRAPE:PUSH AX + MOV AL,0Eh + JMP SHORT INTRG + +INTRAPF:PUSH AX + MOV AL,0Fh + JMP SHORT INTRG + +INTRAP18:PUSH AX + MOV AL,18h + JMP SHORT INTRG + +INTRAP1D:PUSH AX + MOV AL,1Dh + JMP SHORT INTRG + +INTRAP1E:PUSH AX + MOV AL,1Eh + JMP SHORT INTRG + +INTRAP1F:PUSH AX + MOV AL,1Fh + JMP SHORT INTRG +;******************************* +; End of ILLEGAL & UNIMPLEMEN- * +; TED interrupts. * +;******************************* + + +;*************************************** +; BIOS data storage. * +;*************************************** + ORG 03F00H + +;*************************************** +; Storage for DISKETTE parameters. * +;*************************************** +DISK_BASE: ;Initial disk drive parameters. + DB 0DFH + DB 2 + DB 25H + DB 02H + DB 9 + DB 02AH + DB 0FFH + DB 050H + DB 0F6H + DB 00fH + DB 02H +;******************************* +; End of DISKETTE parameters. * +;******************************* + +;*************************************** +; Storage for HARD DISK parameters. * +;*************************************** +HARD_BASE: + DB 032H,001H,002H,032H,001H,000H,000H,00BH + DB 000H,00CH,0B4H,028H,000H,000H,000H,000H + DB 032H,001H,004H,032H,001H,000H,000H,00BH + DB 005H,00CH,0B4H,028H,000H,000H,000H,000H + DB 032H,001H,006H,080H,000H,000H,001H,00BH + DB 005H,00CH,0B4H,028H,000H,000H,000H,000H + DB 064H,002H,002H,000H,000H,080H,000H,00BH + DB 005H,018H,0F0H,040H,000H,000H,000H,000H +;******************************* +; End of HARD DISK parameters. * +;******************************* + +;*************************************** +; Storage for BIOS messages. * +;*************************************** +FORMES: DB 'Format operations cannot be executed whilst in ACCELERATOR ' + DB 'mode.',0DH,0AH + DB 'Rebooting of PC necessary.',0DH,0AH,0FFH +;******************************* +; End of BIOS messages. * +;******************************* + +;*************************************** +; RESET vector upon power up or reset. * +;*************************************** + ORG 03FF0H ;Reset boot up start. + + JMP 0FC00:0000 ;Go to startup code. +;*************************************** +; Release date information. * +;*************************************** + DB '04/04/88' + DB 0AAH,00FEH,05DH + + ORG 03FFFH ;Required to get object file to +;**************************************************************************** +;** End of the TurboRacer 286 coding. An object file of 16384 bytes should ** +;** be generated. ** +;**************************************************************************** + + + + + + \ No newline at end of file diff --git a/SOURCE/CHKLIST.MS b/SOURCE/CHKLIST.MS new file mode 100755 index 0000000000000000000000000000000000000000..9a9f8aab388de1a2cde4131de20f223ebb4a3045 GIT binary patch literal 81 zcmZ>Cc6RmAbB%CiIMdI}sF2Q}$grlFfngy71B0)tZ-{Gf2v`y*)ee+;62`#r_y7O@ b!2v#=5Qz{5pp;IvB14-k1H+Yn|NjF3X=E4P literal 0 HcmV?d00001 diff --git a/SOURCE/EDACC.BAT b/SOURCE/EDACC.BAT new file mode 100755 index 0000000..e30af51 --- /dev/null +++ b/SOURCE/EDACC.BAT @@ -0,0 +1,5 @@ +ECHO OFF +EDIT -i120 ACCEL.C ACCL.ASM BIOS.ASM +PAUSE +MKACC.BAT + \ No newline at end of file diff --git a/SOURCE/EDTURBO.BAT b/SOURCE/EDTURBO.BAT new file mode 100755 index 0000000..4de9242 --- /dev/null +++ b/SOURCE/EDTURBO.BAT @@ -0,0 +1,6 @@ +ECHO OFF +EDIT -i120 TURBOROM.ASM STARTUP.ASM MEM.ASM TABLES.ASM BIOS.ASM +PAUSE +TURBO + + \ No newline at end of file diff --git a/SOURCE/LINK.ASM b/SOURCE/LINK.ASM new file mode 100755 index 0000000..ff9b472 --- /dev/null +++ b/SOURCE/LINK.ASM @@ -0,0 +1,47 @@ + ORG 0000H + +MAIN: MOV AX,0FC00H + MOV DS,AX +X3: MOV DX,0C02H +X4: IN AL,DX + TEST AL,8 + JNZ X4 + MOV DX,0C00H + IN AL,DX + CMP AL,1 + JE Z0 + CMP AL,2 + JE Z1 + CMP AL,3 + JE Z2 + JMP X3 +Z0: MOV AX,0000 + MOV DS,AX + MOV BX,0000 +ZD1: MOV AL,DS:[BX] + MOV DX,0C00H + OUT DX,AL + JMP ZD1 +Z1: MOV AX,0000 + MOV DS,AX + MOV BX,0000 +ZD2: MOV AL,DS:[BX] + MOV DX,0C00H + OUT DX,AL + JMP ZD2 +Z2: MOV AX,0000 + MOV DS,AX + MOV BX,0000 +ZD3: MOV AL,55H + MOV DS:[BX],AL + JMP ZD3 + + ORG 3FF0H + + JMP MAIN + + ORG 3FFFH + + + + \ No newline at end of file diff --git a/SOURCE/MEM.ASM b/SOURCE/MEM.ASM new file mode 100755 index 0000000..699d87d --- /dev/null +++ b/SOURCE/MEM.ASM @@ -0,0 +1,651 @@ +;**************************************************************************** +;** MEM.ASM ** +;** ------- ** +;** ** +;** (C) 1987, 1988 P.D. Smart ** +;** ** +;** This file is part of the TURBOROM.ASM source code. It contains code ** +;** to perform interactive memory testing. As the code is stored in low ** +;** memory, it will normally be written over during normal DOS operations. ** +;** ** +;** ** +;**************************************************************************** + +;*************************************** +; Memory exerciser code. * +; * +; FUNCTION: Interactively tests 80286 * +; 1M RAM system. * +;*************************************** +MEMTEST:MOV AX,0FC00H ;Print out message indicating + MOV DS,AX ;interactive memory test code on line. + MOV SI,MESBOOT +X1: LODSB ;NB. All code has to be written with + CMP AL,0FFH ;out using stack or memory storage. + JE X3 + MOV AH,AL + MOV DX,0C02H +X2: IN AL,DX + TEST AL,1 + JZ X2 + MOV DX,0C00H + MOV AL,AH + OUT DX,AL + JMP X1 +X3: MOV DX,0C02H ;Once message printed out, await a +X4: IN AL,DX ;command from the IBM PC. + TEST AL,8 ;Poll status port. Data available? + JNZ X4 + MOV DX,0C00H + IN AL,DX ;Get data. + CMP AL,1 ;Read memory? + JE MEM1 + CMP AL,2 ;Write memory? + JE MEM2 + CMP AL,3 ;Partial memory test? + JE MEM3 + CMP AL,4 ;Full memory test? + JE MEM4 + CMP AL,5 ;Memory search? + JE MEM5 + MOV SI,MESILC ;If illegal command, print out illegal +X5: LODSB ;command message. + CMP AL,0FFH + JE X7 + MOV AH,AL + MOV DX,0C02H +X6: IN AL,DX + TEST AL,1 + JZ X6 + MOV DX,0C00H + MOV AL,AH + OUT DX,AL + JMP X5 +X7: JMP X3 + +MEM2: JMP N0 ;At conditional jump only has a +MEM3: JMP MTEST ;limited range, thus these jumps +MEM4: JMP FULL ;are needed to jump to routines +MEM5: JMP SRCH ;located over 128 bytes away. + +;*************************************** +; Read memory. * +; * +; FUNCTION: Dump memory to PC in HEX * +; form. PC supplies the * +; addresses to dump between. * +;*************************************** +MEM1: MOV DX,0C02H ;First of all, get parameters from +M1: IN AL,DX ;IBM PC. + TEST AL,8 ;Wait until a byte appears in link + JNZ M1 ;data register. + MOV DX,0C00H + IN AL,DX ;Get byte. + MOV BL,AL ;Store as low byte, getting a word. + MOV DX,0C02H +M2: IN AL,DX ;Wait until a byte appears in link + TEST AL,8 ;data register. + JNZ M2 + MOV DX,0C00H + IN AL,DX ;Get byte. + MOV BH,AL ;Get DS first (start segment). + MOV AX,BX + MOV DS,AX + MOV DX,0C02H +M3: IN AL,DX + TEST AL,8 + JNZ M3 + MOV DX,0C00H + IN AL,DX + MOV BL,AL + MOV DX,0C02H +M4: IN AL,DX + TEST AL,8 + JNZ M4 + MOV DX,0C00H + IN AL,DX + MOV BH,AL ;Get BX next (start address). + MOV DX,0C02H +M5: IN AL,DX + TEST AL,8 + JNZ M5 + MOV DX,0C00H + IN AL,DX + MOV CL,AL + MOV DX,0C02H +M6: IN AL,DX + TEST AL,8 + JNZ M6 + MOV DX,0C00H + IN AL,DX + MOV CH,AL + MOV AX,CX + MOV SS,AX ;Get SS next (end segment). + MOV DX,0C02H +M7: IN AL,DX + TEST AL,8 + JNZ M7 + MOV DX,0C00H + IN AL,DX + MOV CL,AL + MOV DX,0C02H +M8: IN AL,DX + TEST AL,8 + JNZ M8 + MOV DX,0C00H + IN AL,DX + MOV CH,AL + MOV BP,CX ;Get BP next (end address). +M10: MOV DX,0C02H +M11: IN AL,DX + TEST AL,1 + JZ M11 + MOV DX,0C00H + MOV AL,DS:[BX] ;Get a byte from memory, + OUT DX,AL ;Send data. + MOV AX,DS + MOV DX,SS + CMP AX,DX ;End of dump? + JNE M12 + MOV AX,BP + CMP AX,BX + JNE M12 + JMP X3 +M12: INC BX + CMP BX,00000H + JNE M10 + MOV AX,DS + ADD AX,1000H + MOV DS,AX + JMP M10 + + +;*************************************** +; Write memory. * +; * +; FUNCTION: Write XX to memory. PC * +; supplies the start address,* +; end address, and XX. * +;*************************************** +N0: MOV DX,0C02H ;First of all, get parameters from +N1: IN AL,DX ;IBM PC. + TEST AL,8 + JNZ N1 + MOV DX,0C00H + IN AL,DX + MOV BL,AL + MOV DX,0C02H +N2: IN AL,DX + TEST AL,8 + JNZ N2 + MOV DX,0C00H + IN AL,DX + MOV BH,AL ;Get DS first (start segment). + MOV AX,BX + MOV DS,AX + MOV DX,0C02H +N3: IN AL,DX + TEST AL,8 + JNZ N3 + MOV DX,0C00H + IN AL,DX + MOV BL,AL + MOV DX,0C02H +N4: IN AL,DX + TEST AL,8 + JNZ N4 + MOV DX,0C00H + IN AL,DX + MOV BH,AL ;Get BX next (start address). + MOV DX,0C02H +N5: IN AL,DX + TEST AL,8 + JNZ N5 + MOV DX,0C00H + IN AL,DX + MOV CL,AL + MOV DX,0C02H +N6: IN AL,DX + TEST AL,8 + JNZ N6 + MOV DX,0C00H + IN AL,DX + MOV CH,AL + MOV AX,CX + MOV SS,AX ;Get SS next (end segment). + MOV DX,0C02H +N7: IN AL,DX + TEST AL,8 + JNZ N7 + MOV DX,0C00H + IN AL,DX + MOV CL,AL + MOV DX,0C02H +N8: IN AL,DX + TEST AL,8 + JNZ N8 + MOV DX,0C00H + IN AL,DX + MOV CH,AL + MOV BP,CX ;Get BP next (end address). + MOV DX,0C02H +N9: IN AL,DX + TEST AL,8 + JNZ N9 + MOV DX,0C00H + IN AL,DX + MOV CL,AL ;Get data to write into memory. +N10: MOV DS:[BX],CL ;Write data to memory. + MOV AX,DS + MOV DX,SS + CMP AX,DX + JNE N11 + MOV AX,BP + CMP AX,BX + JNE N11 + JMP X3 +N11: INC BX ;End of block write? + CMP BX,00000H + JNE N10 + MOV AX,DS + ADD AX,1000H + MOV DS,AX + JMP N10 + +;*************************************** +; Partial memory test. * +; * +; FUNCTION: Performs a byte/word read/ * +; write to lower 512K memory * +; block. Writes different * +; values into memory to catch* +; out any faulty bit. * +;*************************************** +MTEST: MOV AX,0 ;Prepare to test memory. + MOV DS,AX +ST0: MOV BX,0 ;Have to do the job in 8*64K segments + MOV CX,0FFFFH +ST1: MOV AX,55AAH ;Write a word 55AAH firstly. + MOV [BX],AX + NOP + NOP + MOV AX,[BX] ;Check to see if memory store it + CMP AX,55AAH ;correctly. + JNE ERR1 + MOV AX,0AA55H ;Try the same word but bytes reversed + MOV [BX],AX + NOP + NOP + MOV AX,[BX] ;Memory stored it correctly? + CMP AX,0AA55H + JNE ERR2 + MOV AX,00FFH ;Now try 00FFH. + MOV [BX],AX + NOP + NOP + MOV AX,[BX] ;Memory stored it correctly? + CMP AX,00FFH + JNE ERR3 + MOV AX,0FF00H ;Reverse of above word. + MOV [BX],AX + NOP + NOP + MOV AX,[BX] ;Memory stored it correctly? + CMP AX,0FF00H + JNE ERR4 + MOV AL,00H ;Now try a byte write. + MOV [BX],AL + NOP + NOP + MOV AL,[BX] ;Was the byte stored? + CMP AL,00H + JNE ERR5 + MOV AL,0FFH ;Now try the complement of above byte + MOV [BX],AL + NOP + NOP + MOV AL,[BX] ;Was the byte stored? + CMP AL,0FFH + JNE ERR6 + INC BX ;Move onto next byte. + MOV AL,00H ;And try the byte writes on the + MOV [BX],AL ;other byte in word pair. + NOP + NOP + MOV AL,[BX] + CMP AL,00H + JNE ERR7 + MOV AL,0FFH + MOV [BX],AL + NOP + NOP + MOV AL,[BX] + CMP AL,0FFH + JNE ERR8 + MOV ES,AX + LOOP ST1 ;Loop until 64K segment tested. + MOV AX,DS + ADD AX,1000H ;All 8 segments tested? + MOV DS,AX + CMP AX,8000H + JNE ST0 + MOV AL,0 + JMP ERR +ERR1: MOV ES,AX ;If an error occurred, inform the PC. + MOV AL,1 + JMP ERR +ERR2: MOV ES,AX + MOV AL,2 + JMP ERR +ERR3: MOV ES,AX + MOV AL,3 + JMP ERR +ERR4: MOV ES,AX + MOV AL,4 + JMP ERR +ERR5: MOV ES,AX + MOV AL,5 + JMP ERR +ERR6: MOV ES,AX + MOV AL,6 + JMP ERR +ERR7: MOV ES,AX + MOV AL,7 + JMP ERR +ERR8: MOV ES,AX + MOV AL,8 +ERR: MOV AH,AL + MOV DX,0C02H +ER1: IN AL,DX + TEST AL,1 + JZ ER1 + MOV DX,0C00H + MOV AL,AH ;Send error code. + OUT DX,AL + MOV DX,0C02H +ER2: IN AL,DX + TEST AL,1 + JZ ER2 + MOV DX,0C00H + MOV AX,ES + OUT DX,AL ;Send AL. + MOV DX,0C02H +ER3: IN AL,DX + TEST AL,1 + JZ ER3 + MOV DX,0C00H + MOV AX,ES + MOV AL,AH ;Send AH. + OUT DX,AL + MOV DX,0C02H +ER4: IN AL,DX + TEST AL,1 + JZ ER4 + MOV DX,0C00H + MOV AL,BL ;Send BL. + OUT DX,AL + MOV DX,0C02H +ER5: IN AL,DX + TEST AL,1 + JZ ER5 + MOV DX,0C00H + MOV AL,BH ;Send BH. + OUT DX,AL + MOV DX,0C02H +ER6: IN AL,DX + TEST AL,1 + JZ ER6 + MOV DX,0C00H + MOV AX,DS ;Send low DS. + OUT DX,AL + MOV DX,0C02H +ER7: IN AL,DX + TEST AL,1 + JZ ER7 + MOV DX,0C00H + MOV AX,DS + MOV AL,AH ;Send high DS. + OUT DX,AL + JMP MEMTEST + + +;*************************************** +; Full memory test code. * +; * +; FUNCTION: Tests memory in probably * +; the best memory test * +; possible. Writes zero's to * +; all memory, writes a 1 to * +; 1 byte in the memory array * +; and then scans the entire * +; memory array for errors. * +;*************************************** +FULL: MOV SI,0000H ;Prepare for memory test. + MOV SS,SI + MOV BP,SI +MF1: MOV DS,SI +MF2: MOV BX,SI + MOV CX,7FFFH ;Zero fill entire memory bank. +MF3: MOV [BX],SI + INC BX + INC BX + LOOP MF3 + MOV AX,DS + ADD AX,1000H + MOV DS,AX + CMP AX,8000H + JNE MF2 +; ;Write a byte of 1's to address +MF4: MOV AL,0FFH ;pointed to by DS:BP. + MOV [BP],AL +; +SEARCH: MOV DS,SI ;Now search entire memory for any byte +SR0: MOV BX,SI ;which has any bit set. + MOV CX,07FFFH +SR1: CMP [BX],SI + JE SR3 +SR2: MOV AX,SS + MOV DX,DS + CMP AX,DX + JNE SRP + MOV AX,BP ;If address = DS:BP, jump over. + AND AX,0FFFEH + CMP BX,AX + JNE SRP + JMP SR3 +SRP: MOV ES,AX + JMP FLP +SR3: INC BX ;Continue search for entire memory. + INC BX + LOOP SR1 + MOV AX,DS + ADD AX,1000H + MOV DS,AX + CMP AX,8000H + JNE SR0 + MOV AX,SI + MOV ES,AX +; +FLP: MOV DX,0C02H ;Send to IBM PC, current position +FL1: IN AL,DX ;of test. + TEST AL,1 + JZ FL1 + MOV DX,0C00H + MOV AX,SS ;Send SS. + OUT DX,AL + MOV DX,0C02H +FL2: IN AL,DX + TEST AL,1 + JZ FL2 + MOV DX,0C00H + MOV AX,SS + MOV AL,AH + OUT DX,AL + MOV DX,0C02H +FL3: IN AL,DX + TEST AL,1 + JZ FL3 + MOV DX,0C00H + MOV AX,BP ;Send BP. + OUT DX,AL + MOV DX,0C02H +FL4: IN AL,DX + TEST AL,1 + JZ FL4 + MOV DX,0C00H + MOV AX,BP + MOV AL,AH + OUT DX,AL + MOV DX,0C02H +FL5: IN AL,DX + TEST AL,1 + JZ FL5 + MOV DX,0C00H + MOV AX,DS ;Send DS. + OUT DX,AL + MOV DX,0C02H +FL6: IN AL,DX + TEST AL,1 + JZ FL6 + MOV DX,0C00H + MOV AX,DS + MOV AL,AH + OUT DX,AL + MOV DX,0C02H +FL7: IN AL,DX + TEST AL,1 + JZ FL7 + MOV DX,0C00H + MOV AX,BX ;Send BX. + OUT DX,AL + MOV DX,0C02H +FL8: IN AL,DX + TEST AL,1 + JZ FL8 + MOV DX,0C00H + MOV AX,BX + MOV AL,AH + OUT DX,AL + MOV DX,0C02H +FL9: IN AL,DX + TEST AL,1 + JZ FL9 + MOV DX,0C00H + MOV AX,ES ;Send AL. + OUT DX,AL +; + MOV AL,0 ;Zero fill memory, and check to see + MOV [BP],AL ;if it is end of test. + INC BP + CMP BP,SI + JNE MQ1 + MOV AX,SS + ADD AX,1000H + MOV SS,AX + CMP AX,8000H + JNE MQ1 ;If not, repeat search. + JMP MEMTEST +MQ1: JMP MF4 + + +;*************************************** +; Memory search code. * +; * +; FUNCTION: Search memory to check * +; that memory is set to a * +; particular byte, reporting * +; to the PC any byte which * +; is not correct. * +;*************************************** +SRCH: MOV DX,0C02H ;Get byte from PC to search for. +SRC1: IN AL,DX + TEST AL,8 + JNZ SRC1 + MOV DX,0C00H + IN AL,DX + MOV AH,AL + MOV DI,AX + MOV SI,0000H + MOV DS,SI +SRC2: MOV BX,0000H + MOV CX,0FFFFH +SRC3: MOV AL,[BX] + CMP AL,AH ;If byte is not the same as that + JNE SRC4 ;searched for, report to IBM PC. + INC BX + LOOP SRC3 + MOV AX,DS + ADD AX,1000H + MOV DS,AX + CMP AX,8000H + MOV AX,DI + JNE SRC2 + MOV CX,6 + MOV DX,0C02H +SRCE: IN AL,DX ;End of search? + TEST AL,1 + JZ SRCE + DEC DX + DEC DX + MOV AL,0FFH ;If so, send end of search byte. + OUT DX,AL + INC DX + INC DX + LOOP SRCE + JMP MEMTEST +SRC4: MOV SI,AX ;Send details to PC of memory location + MOV DX,0C02H ;that was not the same as the search +SRC5: IN AL,DX ;value. + TEST AL,1 + JZ SRC5 + MOV DX,0C00H + MOV AX,SI ;Send AX. + OUT DX,AL + MOV DX,0C02H +SRC6: IN AL,DX + TEST AL,1 + JZ SRC6 + MOV DX,0C00H + MOV AX,SI + MOV AL,AH + OUT DX,AL + MOV DX,0C02H +SRC7: IN AL,DX + TEST AL,1 + JZ SRC7 + MOV DX,0C00H + MOV AX,DS ;Send DS. + OUT DX,AL + MOV DX,0C02H +SRC8: IN AL,DX + TEST AL,1 + JZ SRC8 + MOV DX,0C00H + MOV AX,DS + MOV AL,AH + OUT DX,AL + MOV DX,0C02H +SRC9: IN AL,DX + TEST AL,1 + JZ SRC9 + MOV DX,0C00H + MOV AX,BX ;Send BX. + OUT DX,AL + MOV DX,0C02H +SRC10: IN AL,DX + TEST AL,1 + JZ SRC10 + MOV DX,0C00H + MOV AX,BX + MOV AL,AH + OUT DX,AL + MOV AX,DI ;Get back AX. + JMP SRC3 +;*************************************** +; End of interactive memory test code. * +;*************************************** + + + + + \ No newline at end of file diff --git a/SOURCE/MEMASM.ASM b/SOURCE/MEMASM.ASM new file mode 100755 index 0000000..4968a91 --- /dev/null +++ b/SOURCE/MEMASM.ASM @@ -0,0 +1,113 @@ + PAGE 60,80 + TITLE Routines to do link communications. + +_TEXT SEGMENT BYTE PUBLIC 'CODE' +_TEXT ENDS +CONST SEGMENT WORD PUBLIC 'CONST' +CONST ENDS +_BSS SEGMENT WORD PUBLIC 'BSS' +_BSS ENDS +_DATA SEGMENT WORD PUBLIC 'DATA' +_DATA ENDS + +DGROUP GROUP CONST, _BSS, _DATA + ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES:DGROUP + +_DATA SEGMENT +_DATA ENDS + +_TEXT SEGMENT + + PUBLIC _readbyte +_readbyte PROC NEAR + mov dx,0211h +rdbyte1:in al,dx + test al,00001000b + jnz rdbyte1 + dec dx + in al,dx + xor ah,ah + ret +_readbyte ENDP + + PUBLIC _readword +_readword PROC NEAR + mov dx,0211h +rdword1:in al,dx + test al,00001000b + jnz rdword1 + dec dx + in al,dx + xchg al,ah + inc dx +rdword2:in al,dx + test al,00001000b + jnz rdword2 + dec dx + in al,dx + xchg al,ah + ret +_readword ENDP + + PUBLIC _readstat +_readstat PROC NEAR + push bp + mov bp,sp + mov dx,0211h + in al,dx + test al,00001000b + mov al,1 + jz rds + mov al,0 +rds: xor ah,ah + mov sp,bp + pop bp + ret +_readstat ENDP + + PUBLIC _writebyte +_writebyte PROC NEAR + push bp + mov bp,sp + mov dx,0211h +wrbyte1:in al,dx + test al,00000001b + jz wrbyte1 + mov ax,[bp+4] + dec dx + out dx,al + pop bp + ret +_writebyte ENDP + + PUBLIC _writeword +_writeword PROC NEAR + push bp + mov bp,sp + mov dx,0211h +wrword1:in al,dx + test al,00000001b + jz wrword1 + dec dx + mov ax,[bp+4] + out dx,al + inc dx +wrword2:in al,dx + test al,00000001b + jz wrword2 + dec dx + mov ax,[bp+4] + xchg al,ah + out dx,al + pop bp + ret +_writeword ENDP + +_TEXT ENDS + END + + + + + + \ No newline at end of file diff --git a/SOURCE/MEMTEST.C b/SOURCE/MEMTEST.C new file mode 100755 index 0000000..65e49bf --- /dev/null +++ b/SOURCE/MEMTEST.C @@ -0,0 +1,450 @@ +#include +#include +#include +#include + +WINDOWPTR w0, w1, w2; + +main(argc,argv) +int argc; +char *argv[]; +{ + int key,flag; + unsigned char databyte; + + v_smode(C8025); + + w0 = wn_open(0,12,0,78,10,(BLUE<<4|WHITE),GREEN); + wn_puts(w0,2,20," TurboRacer 286 "); + wn_puts(w0,4,20," Memory Read/Write testing aid "); + wn_puts(w0,6,20," (C) March 1988, P.D. Smart "); + pause(2); + wn_close(w0); + + w0 = wn_open(0,1,0,78,18,YELLOW,RED); + wn_wrap(w0,TRUE); + wn_scroll(w0,BIOS); + w1 = wn_open(1000,0,0,78,1,BOLD|YELLOW,BLACK); + w2 = wn_open(1000,21,0,80,4,CYAN,BLACK); + wn_wrap(w2,TRUE); + wn_scroll(w2,BIOS); + + reset(); + wn_clr(w1); + wn_puts(w1,0,25,"MEMORY READ/WRITE TESTER MENU"); + while(1) + { + wn_clr(w0); + wn_puts(w0,2,30, "[A] - Read memory"); + wn_puts(w0,4,30, "[B] - Write memory"); + wn_puts(w0,6,30, "[C] - Partial memory test"); + wn_puts(w0,8,30, "[D] - Full memory Test"); + wn_puts(w0,10,30,"[E] - Search for value"); + wn_puts(w0,12,30,"[F] - Reset accelerator"); + wn_puts(w0,14,30,"[G] - Quit"); + wn_puts(w0,17,14," Select option by pressing a bracketed key "); + wn_clr(w2); + key=' '; + while(key!='A'&&key!='a'&&key!='B'&&key!='b'&&key!='C'&&key!='c' + &&key!='D'&&key!='d'&&key!='E'&&key!='e'&&key!='f' + &&key!='F'&&key!='g'&&key!='G') + { + while(!kbhit()) + { + if(readstat()) + { + databyte=readbyte(); + wn_printf(w2,"%c",databyte); + } + } + key=v_getch()&0xff; + } + switch(key) + { + case 'A': + case 'a': + readmem(); + break; + case 'B': + case 'b': + writemem(); + break; + case 'C': + case 'c': + parttest(); + break; + case 'D': + case 'd': + fulltest(); + break; + case 'E': + case 'e': + search(); + break; + case 'F': + case 'f': + reset(); + break; + case 'G': + case 'g': + W_exit(0); + break; + } + } +} + +fulltest() +{ + unsigned ss,bp,ds,bx,error; + unsigned char databyte; + FILE *fp1; + + error=0; + if((fp1=fopen("FULLTEST.DAT","wb"))==NULL) + { + wn_printf(w0,"Can't open FULLTEST.DAT\n"); + pause(2); + return(1); + } + wn_clr(w0); + wn_clr(w2); + if(readstat()) readbyte(); + wn_printf(w2,"\nSending command to 286..."); + writebyte(0x04); + wn_clr(w2); + wn_printf(w2,"Performing full test..."); + + while(1) + { + while(!readstat()) + { + if(kbhit()) + { + databyte=v_getch()&0xff; + if(databyte=='q' || databyte=='Q') + { + reset(); + fclose(fp1); + return(1); + } + if(databyte==' ') + while(!kbhit()); + } + } + ss=readword(); + bp=readword(); + ds=readword(); + bx=readword(); + databyte=readbyte(); + wn_puts(w0,1,1,"SS:BP = "); + wn_printf(w0,"%04X:%04X",ss,bp); + if(databyte!=0) + { + error++; + fprintf(fp1,"SS=%04X, BP=%04X, DS=%04X, BX=%04X, AL=%02X - **ERROR**%c%c" + ,ss,bp,ds,bx,databyte,0x0d,0x0a); + } + wn_puts(w0,2,1,"Errors = "); + wn_printf(w0,"%04X",error); + if(ss==0x8000 && bp==0xffff) + { + reset(); + fclose(fp1); + return(1); + } + } +} + + +reset() +{ + unsigned char databyte; + + wn_clr(w2); + wn_clr(w0); + wn_putsa(w2,0,1,"RESETTING 8207 MEMORY CONTROLLER",YELLOW|BLINK); + outp(0x211,0x01); + pause(1); + outp(0x211,0x00); + wn_clr(w2); + wn_putsa(w2,0,1,"RESETTING 286 PROCESSOR",YELLOW|BLINK); + pause(1); + if(readstat()) readbyte(); + outp(0x211,0x02); + + wn_clr(w2); + wn_printf(w2,"Awaiting test result....."); + databyte=readbyte(); + if(databyte!=0) + wn_printf(w2,"Failed, Error code=%02X\n",databyte); + else + { + wn_printf(w2,"PASSED.\n"); + writebyte(0x05); + } +} + +search() +{ + unsigned ax,bx,ds; + unsigned char databyte; + char bufin[80]; + + if(readstat()) readbyte(); + wn_printf(w2,"\nSending command to 286..."); + writebyte(0x05); + + wn_clr(w2); + wn_putsa(w0,10,36,"SEARCH FOR VALUE",YELLOW|BLINK); + wn_printf(w2,"\nEnter search value <00>: "); + wn_sync(w2,TRUE); + wn_fixcsr(w2); + wn_gets(w2,bufin,6,"0123456789AaBbCcDdEeFf"); + if(bufin[0]==0x00) databyte=0x00; + else + { + sscanf(bufin,"%x",&databyte); + } + writebyte(databyte); + + while(1) + { + ax=readword(); + ds=readword(); + bx=readword(); + if(ax==0xffff) + return(1); + wn_printf(w2,"Failure at %04X:%04X, Byte read=%02X\n" + ,ds,bx,ax&0x00ff); + if(kbhit()) + { + databyte=v_getch()&0xff; + if(databyte=='q' || databyte=='Q' ) + { + reset(); + return(1); + } + if(databyte==' ') + while(!kbhit()); + } + } +} + +parttest() +{ + unsigned ax,bx,ds; + unsigned char ercode; + + if(readstat()) readbyte(); + wn_printf(w2,"\nSending command to 286..."); + writebyte(0x03); + + wn_clr(w2); + wn_putsa(w0,6,36,"PARTIAL MEMORY TEST",YELLOW|BLINK); + wn_printf(w2,"286 running memory test...waiting\n"); + ercode=readbyte(); + ax=readword(); + bx=readword(); + ds=readword(); + wn_printf(w2,"AX=%04X, BX=%04X, DS=%04X: ",ax,bx,ds); + switch(ercode) + { + case 0: + wn_printf(w2,"Memory test successful\n"); + break; + case 1: + wn_printf(w2,"Failure writing 55AAH\n"); + break; + case 2: + wn_printf(w2,"Failure writing AA55H\n"); + break; + case 3: + wn_printf(w2,"Failure writing 00FFH\n"); + break; + case 4: + wn_printf(w2,"Failure writing FF00H\n"); + break; + case 5: + wn_printf(w2,"Failure writing byte 00 (1)\n"); + break; + case 6: + wn_printf(w2,"Failure writing byte FF (1)\n"); + break; + case 7: + wn_printf(w2,"Failure writing byte 00 (2)\n"); + break; + case 8: + wn_printf(w2,"Failure writing byte FF (2)\n"); + break; + } + pause(4); +} + +readmem() +{ + long start,end,i; + char bufin[80]; + unsigned char cnt, databyte; + unsigned dataword; + + wn_clr(w2); + + wn_putsa(w0,2,36,"READ MEMORY",YELLOW|BLINK); + wn_printf(w2,"\nEnter start address <00000>: "); + wn_sync(w2,TRUE); + wn_fixcsr(w2); + wn_gets(w2,bufin,6,"0123456789AaBbCcDdEeFf"); + if(bufin[0]==0x00) start=0x00000; + else + { + sscanf(bufin,"%lx",&start); + if(start>0xfffff) start=0xfffff; + } + wn_clr(w2); + wn_printf(w2,"\nEnter end address <00100>: "); + wn_sync(w2,TRUE); + wn_fixcsr(w2); + wn_gets(w2,bufin,6,"0123456789AaBbCcDdEeFf"); + if(bufin[0]==0x00) end=0x00100; + else + { + sscanf(bufin,"%lx",&end); + if(end>0xfffff) end=0xfffff; + } + wn_clr(w2); + + wn_printf(w2,"\nSending command to 286..."); + if(readstat()) readbyte(); + writebyte(0x01); /* Send command. */ + dataword=(start>>4)&0xf000; /* Start segment. */ + writeword(dataword); + dataword=start&0xffff; /* Start address. */ + writeword(dataword); + dataword=(end>>4)&0xf000; /* End segment. */ + writeword(dataword); + dataword=end&0xffff; /* End address. */ + writeword(dataword); + + wn_clr(w2); + wn_clr(w0); + cnt=16; + for(i=start;i<=end;i++) + { + if(cnt++>=15) + { + cnt=0; + wn_printf(w0,"\n%05lX ",i); + } + databyte=readbyte(); + wn_printf(w0," %02X ",databyte); + if(kbhit()) + { + databyte=v_getch()&0xff; + if(databyte=='q' || databyte=='Q') + { + reset(); + break; + } + if(databyte==' ') + while(!kbhit()); + } + } +} + + +writemem() +{ + long start,end,i; + char bufin[80]; + unsigned char cnt; + unsigned dataword,temp; + + wn_clr(w2); + + wn_putsa(w0,4,36,"WRITE MEMORY",YELLOW|BLINK); + wn_printf(w2,"\nEnter start address <00000>: "); + wn_sync(w2,TRUE); + wn_fixcsr(w2); + wn_gets(w2,bufin,6,"0123456789AaBbCcDdEeFf"); + if(bufin[0]==0x00) start=0x00000; + else + { + sscanf(bufin,"%lx",&start); + if(start>0xfffff) start=0xfffff; + } + wn_clr(w2); + wn_printf(w2,"\nEnter end address <7FFFF>: "); + wn_sync(w2,TRUE); + wn_fixcsr(w2); + wn_gets(w2,bufin,6,"0123456789AaBbCcDdEeFf"); + if(bufin[0]==0x00) end=0x7ffff; + else + { + sscanf(bufin,"%lx",&end); + if(end>0xfffff) end=0xfffff; + } + wn_clr(w2); + wn_printf(w2,"\nEnter data <00>: "); + wn_sync(w2,TRUE); + wn_fixcsr(w2); + wn_gets(w2,bufin,6,"0123456789AaBbCcDdEeFf"); + if(bufin[0]==0x00) temp=0x00; + else + { + sscanf(bufin,"%x",&temp); + if(temp>0xff) temp=0x00ff; + } + + wn_clr(w2); + + wn_printf(w2,"\nSending command to 286..."); + if(readstat()) readbyte(); + writebyte(0x02); /* Send command. */ + dataword=(start>>4)&0xf000; /* Start segment. */ + writeword(dataword); + dataword=start&0xffff; /* Start address. */ + writeword(dataword); + dataword=(end>>4)&0xf000; /* End segment. */ + writeword(dataword); + dataword=end&0xffff; /* End address. */ + writeword(dataword); + writebyte(temp); /* Data. */ + +} + +pause(seconds) +int seconds; +{ + unsigned cnt,cnt2; + for(cnt=0;cntgrCX6T(wO2#o?N;SmW00!a*zQ~)8gfE|3n1PFqI3DcbbDUwBNbIHs;l;CI*jK!&c@EUxz;z{z{lPquv{K^PBdsqk~6M>mExD zXQQeQ{s3xZKbERRZwnrAh8M+3g;=S^OE<+z#aQWaUW%65!^!B5w@*QtHH>y3#vAU1 zzgWi>v*VHRj`7YLS6pGegj#}TP7qUH4*2``LhV*H%2UA+1oRHx%F z&YwS1efZN@X`DYtdFiECX`DYV@zPX_iNP5g@YB3>SgaIN!+YDvOLJqTm?d7iikHrh zm4YX{^d4Ti2&KfOp0UzGDmAh(%JW$mSfkY8VZoY?GI>3&Q{}a|E|#lsohCno>k|0^ zTnptgT$jrC;#wr%g=@Jy2iIlt3|u978mdAJtK6ZCZLI#+VNe4TbKX_M4B;*2-E z%>t6pWiF;&)UHoK?MK?N>=9=|Qb*ntCfg$aV5m~Zs3|OOIIFfro{QS*w~aRb?SfUi zBt)K!YNH&H$D&%BEm9lRRaw@9*lWSDB8`T}L26ijnTQvsm^a@Y0n#vhhieu0^VD1dx0Vv|vD4-QL)U>bwBw(Hq ztce!5IFB`WMTlPFo2<;Ep8`%2v)noU&Y$Kfw!3P1dVB6pUHq*I3wLQZiTl)`mV)aGngiF}!J0jW zVh88-X|>WGE+V^)>KDSpZDt4AM4Z+;2}3-j9Ui+$+7%OHyOtc)8v`}FJj$=MizK<1 z^=IOYaWYL5wcp!0W1g^wXT`8-BWZBt&Gy^ljOh)*GH3Py42~ERH@0&D?F#=xtnD6Z zs}TBv_=gkO!-FCt|6 zr0{W@em)$r>5(uK^fTe>1pSlnXhA<2zC+Oe7+x;u?}mRW=x;4{_#LYq>l_;#8y%|S zF~`px-W<-ef;pVHN(D1$I4=k$WB(IxUGsbk*$dvjfU~0s zZNY{u(jF7q0eUgddzj+Ns1HfchNNfo5nH5Zyx}tfhtgE&jTo$Xw#T|&>v4a^sCG3< z&lpCd^lT5tG4IAyTEkkb|NF1%e-}wChpOlF+wE8P|0tl%{@r9-Esau?F`}T;8y;vk zDM&IYh{h=B

xg1<@D^yO1}G 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 literal 0 HcmV?d00001 diff --git a/SOURCE/MKACC.BAT b/SOURCE/MKACC.BAT new file mode 100755 index 0000000..d9fa92c --- /dev/null +++ b/SOURCE/MKACC.BAT @@ -0,0 +1,18 @@ +ECHO OFF +ECHO Compiling ACCEL.C -> ACCEL.OBJ +MSC ACCEL.C /Zi; +IF ERRORLEVEL 1 GOTO ERXIT +ECHO Assembling ACCL.ASM -> ACCL.OBJ +MASM ACCL.ASM; +IF ERRORLEVEL 1 GOTO ERXIT +LINK ACCEL+ACCL /CO; +DEL *.MAP >NUL +DEL *.SYM >NUL +GOTO EXIT +:ERXIT +ECHO Errors have occurred. +:EXIT + + + + \ No newline at end of file diff --git a/SOURCE/PRNTHEX.ASM b/SOURCE/PRNTHEX.ASM new file mode 100755 index 0000000..08d031e --- /dev/null +++ b/SOURCE/PRNTHEX.ASM @@ -0,0 +1,45 @@ +;*************************************** +; Display AX as a hex value on VIDEO * +;*************************************** +DHEX: PUSH AX ;Store AX, print AH. + MOV AL,AH + CALL HEX + POP AX + CALL HEX ;Print AL. + RET + +;*************************************** +; Display AL as a hex value on VIDEO * +;*************************************** +HEX: PUSH BX ;Store registers used. + PUSH CX + PUSH DX + PUSH AX + AND AL,0F0H ;High nibble first. + SHR AL,1 + SHR AL,1 + SHR AL,1 + SHR AL,1 + CALL HEX1 ;Print + POP AX + AND AL,0FH ;Now low nibble. + CALL HEX1 + MOV AL,20H + MOV AH,0EH + MOV BL,7 + INT 10H + POP DX + POP CX + POP BX + RET +HEX1: CMP AL,0AH + JL HEX2 + ADD AL,07H +HEX2: ADD AL,30H + MOV AH,0EH + MOV BL,7 + INT 10H + RET + + + \ No newline at end of file diff --git a/SOURCE/RESTORE.BAT b/SOURCE/RESTORE.BAT new file mode 100755 index 0000000..2321aea --- /dev/null +++ b/SOURCE/RESTORE.BAT @@ -0,0 +1,30 @@ +ECHO OFF +ECHO Copying TURBOROM files from A:\ to C:\PROJECT +PAUSE +COPY A:\TURBOROM.ASM C:\PROJECT >NUL +COPY A:\STARTUP.ASM C:\PROJECT >NUL +COPY A:\TABLES.ASM C:\PROJECT >NUL +COPY A:\BIOS.ASM C:\PROJECT >NUL +COPY A:\MEM.ASM C:\PROJECT >NUL +COPY A:\EDTURBO.BAT C:\PROJECT >NUL +COPY A:\TURBO.BAT C:\PROJECT >NUL +COPY A:\BACKUP.BAT C:\PROJECT >NUL +COPY A:\RESTORE.BAT C:\PROJECT >NUL +ECHO Copying ACCELERATOR files from A:\ to C:\PROJECT +COPY A:\ACCEL.C C:\PROJECT >NUL +COPY A:\ACCL.ASM C:\PROJECT >NUL +COPY A:\ACCEL.EXE C:\PROJECT >NUL +COPY A:\EDACC.BAT C:\PROJECT >NUL +COPY A:\MKACC.BAT C:\PROJECT >NUL +ECHO Copying MEMTEST files from A:\ to C:\PROJECT +COPY A:\MEMTEST.C C:\PROJECT >NUL +COPY A:\MEMASM.ASM C:\PROJECT >NUL +ECHO Copying SUPPORT files from A:\ to C:\PROJECT +COPY A:\ C:\PROJECT\SPLIT.C >NUL +COPY A:\ C:\PROJECT\VIDEO >NUL +COPY A:\ C:\PROJECT\LINK.ASM >NUL +ECHO Copying now complete. + + + + \ No newline at end of file diff --git a/SOURCE/SPLIT.C b/SOURCE/SPLIT.C new file mode 100755 index 0000000..06bead4 --- /dev/null +++ b/SOURCE/SPLIT.C @@ -0,0 +1,113 @@ +#include +#include +#include +#include + +WINDOWPTR w0, w1, w2, w3, w4; +FILE *fp1,*fp2,*fp3; +int count,cntlo,cnthi,debug,dot,flag,i,printer; +unsigned st,st2; +char filein[80],filelo[80],filehi[80],store[80]; +unsigned char data; + +main(argc,argv) +int argc; +char *argv[]; +{ + v_smode(C8025); + + w0 = wn_open(0,12,0,78,10,(BLUE<<4|WHITE),GREEN); + wn_puts(w0,2,20," TurboRacer 286 "); + wn_puts(w0,4,20," 8086 16bit - 8bit splitter aid "); + wn_puts(w0,6,20," (C) March 1988, P.D. Smart "); + pause(1); + wn_close(w0); + + count=dot=0; + if(argc==1 || argc>2) + { + printf("SPLIT: Invalid arguments\n"); + exit(-1); + } + strcpy(store,*++argv); + while(store[count]!=0) + { + filein[count]=store[count]; + if(filein[count]=='.') dot=count; + count++; + } + if(dot) store[dot]=0; + filein[count]=0; + strcpy(filelo,store); + strcpy(filehi,store); + strcat(filelo,".LO"); + strcat(filehi,".HI"); + + if((fp1=fopen(filein,"rb"))==NULL) + { + printf("SPLIT: File '%s' does not exist\n",filein); + exit(-1); + } + if((fp2=fopen(filelo,"wb"))==NULL) + { + printf("SPLIT: Can't create '%s'... Directory or Disk full\n",filelo); + exit(-1); + } + if((fp3=fopen(filehi,"wb"))==NULL) + { + printf("SPLIT: Can't create '%s'... Directory or Disk full\n",filehi); + exit(-1); + } + + w0 = wn_open(0,1,0,78,22,YELLOW,RED); + wn_wrap(w0,TRUE); + wn_scroll(w0,BIOS); + + wn_clr(w0); + wn_printf(w0,"Splitting file: %s -> %s, %s\n",filein,filelo,filehi); + + count=cntlo=cnthi=flag=i=0; + wn_printf(w0,"Splitting word: 0000"); + while(1) + { + if(feof(fp1)) break; + data=fgetc(fp1); + count++; + if(!flag) + { + fputc(data,fp2); + cntlo++; + flag=1; + } else + { + fputc(data,fp3); + cnthi++; + flag=0; + } + if(i++>255) + { + wn_printf(w0,"%cSplitting word: %04X",0x0d,count/2); + i=0; + } + } + wn_printf(w0,"\nBytes written to file: %s = %04X\n",filelo,cntlo); + wn_printf(w0,"Bytes written to file: %s = %04X\n",filehi,cnthi); + pause(1); + fclose(fp1); + fclose(fp2); + fclose(fp3); + wn_close(w0); +} + +pause(seconds) +int seconds; +{ + unsigned cnt,cnt2; + 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

oa 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 literal 0 HcmV?d00001 diff --git a/SOURCE/STARTUP.ASM b/SOURCE/STARTUP.ASM new file mode 100755 index 0000000..a4285b7 --- /dev/null +++ b/SOURCE/STARTUP.ASM @@ -0,0 +1,309 @@ +;**************************************************************************** +;** STARTUP.ASM ** +;** ----------- ** +;** ** +;** (C) 1987, 1988 P.D. Smart ** +;** ** +;** This file is part of the TURBOROM.ASM source code. It contains code ** +;** to perform:- ** +;** ** +;** FC00:0000 -> CPU test code, ** +;** Memory test code, ** +;** Basic initiator code, ** +;** :- Load in new BIOS. ** +;** :- Load in test code. ** +;** :- Execute memory exercise code. ** +;** :- Boot up DOS using BIOS in rom. ** +;** ** +;** These routines reside at ROM location FC00:0000 ** +;** ** +;**************************************************************************** + + +STARTUP:MOV DX,0C00H ;Read scrap data out of link. + IN AL,DX +;******************************* +; Test 80286 processor. * +;******************************* + ;Test 80286 flags. + CLI ;Disable interrupts. + MOV AH,0D5H ;Set SF, CF, ZF, and AF flags on. + SAHF + JNC E1 ;Error if CF not set. + JNZ E1 ;Error if ZF not set. + JNP E1 ;Error if PF not set. + JNS E1 ;Error if SF not set. + LAHF ;Load flag image to AH. + MOV CL,5 + SHR AH,CL ;Shift AF into carry. + JNC E1 ;Error if AF not set. + MOV AL,40H + SHL AL,1 + JNO E1 ;Error if OF not set. + XOR AH,AH + SAHF ;Clear SF, CF, ZF and PF. + JBE E1 ;Error if CF, ZF set. + JS E1 ;Error if SF set. + JP E1 ;Error if PF set. + LAHF + SHR AH,CL + JC E1 ;Error if AF set. + SHL AH,1 + JO E1 ;Error if OF set. + ;Test 80286 registers + MOV AX,0FFFFH + STC +PT1: MOV DS,AX ;Write all registers. + MOV BX,DS + MOV ES,BX + MOV CX,ES + MOV SS,CX + MOV DX,SS + MOV SP,DX + MOV BP,SP + MOV SI,BP + MOV DI,SI + JNC PT2 + XOR AX,DI ;Pattern make it through registers. + JNZ E1 ;Error if it didnt. + CLC + JMP PT1 +PT2: OR AX,DI + JZ MT +E1: MOV AL,1 ;Processor error code. + JMP ESEND +;******************************* +; End of 80286 testing. * +;******************************* + +;******************************* +; Test lower 512K of memory. * +;******************************* +MT: MOV AX,0 + MOV DS,AX ;DS points to 64K segment. +MT0: MOV BX,0 ;BX points to offset within segment. + MOV CX,07FFFH ;CX = number of writes per segment. +MT1: MOV AX,0FFFFH ;First load FF's into memory. + MOV [BX],AX + MOV AX,[BX] + CMP AX,0FFFFH ;Check to see if memory retained FF's. + JNE MT2 + MOV AX,0000H ;Load 00's into memory. + MOV [BX],AX + MOV AX,[BX] ;Check to see if memory retained 00's. + CMP AX,0000H + JNE MT2 + MOV AX,05555H ;Load 55's into memory. + MOV [BX],AX + MOV AX,[BX] + CMP AX,05555H ;Check to see if memory retained 55's. + JNE MT2 + MOV AX,0AAAAH ;Load AA's into memory. + MOV [BX],AX + MOV AX,[BX] + CMP AX,0AAAAH ;Check to see if memory retained AA's. + JNE MT2 + MOV AX,055AAH ;Now try a mixed combination. + MOV [BX],AX + MOV AX,[BX] + CMP AX,055AAH ;Check to see if retained. + JNE MT2 + MOV AX,00000H ;Load in 0000's to clear memory. + MOV [BX],AX + INC BX + INC BX + LOOP MT1 ;Loop until count exhausted. + MOV AX,DS + ADD AX,1000H ;Move to next data segment. + MOV DS,AX + CMP AX,8000H ;If DS>=8000H, then 512K checked, exit. + JNE MT0 + MOV AL,0 ;AL = Memory test pass code. + JMP ESEND +MT2: MOV AL,2 ;AL = Memory test fail code. +ESEND: MOV AH,AL + MOV DX,0C02H +ES1: IN AL,DX ;Determine if link is clear to send data. + TEST AL,1 + JZ ES1 ;If not, wait until clear. + MOV DX,0C00H + MOV AL,AH ;Send error code. + OUT DX,AL + CMP AL,0 + JE LDT ;Jump to load tables if no errors. + CMP AL,2 + JNE ES2 + JMP MEMTEST +ES2: HLT ;Halt if error. +;******************************* +; End of memory testing. * +;******************************* + +;******************************* +; Setup H/W interrupt tables. * +;******************************* +LDT: MOV AX,0FC00H + MOV DS,AX + MOV AX,00000H + MOV ES,AX + MOV SI,INTTAB ;Address of table in ROM. + MOV DI,0 ;Base of memory. + MOV CX,0200H ;Transfer 32 vectors. + REP MOVSW ;Transfer. +;******************************* +; End of table setup. * +;******************************* + +;******************************* +; Command mode. * +;******************************* +CM: MOV AX,0FC00H + MOV DS,AX ;Setup data segment and extra segment. + MOV ES,AX + MOV AX,00000H + MOV SS,AX ;Setup stack segment. + MOV SP,0500H ;Setup Top Of Stack. + ; +CM1: CALL RXBYTE ;Get a command from PC. + CMP AL,1 + JE BOOT ;If command is 1, BOOT up DOS. + CMP AL,2 + JNE CM2 ;If command is 2, Copy resident BIOS into + JMP CBIOS ;memory then BOOT up DOS. +CM2: CMP AL,3 + JE LBIOS ;If command is 3, load BIOS code from PC. + CMP AL,4 + JE LOADT ;If command is 4, load TEST code from PC. + CMP AL,5 + JE LMEMT ;If command is 5, execute interactive memory + JMP CM1 ;testing code. +;******************************* +; End of command mode. * +;******************************* + +BOOT: JMP BOOTSTRAP +LMEMT: JMP MEMTEST + +;*************************************** +; Load a new BIOS in from the PC over * +; the link. * +;*************************************** +LBIOS: MOV CX,4000H ;BIOS must be 16K long. + MOV BX,0000H ;Start loading at segment FC00:0000. +LBS1: CALL RXBYTE ;Get byte. + MOV DS:[BX],AL + INC BX ;Store in memory, then back for next byte. + LOOP LBS1 + MOV AX,0 ;In order to execute the new BIOS, the ROM + MOV ES,AX ;has to be paged out. As the ROM, and high + MOV SI,LTAB1 ;memory reside in the same space, a special + MOV DI,0 ;piece of code has to be executed in low + MOV CX,10 ;memory. Thus transfer the necessary code + REP MOVSB ;into low memory. + JMP 0000:0000 ;And execute. +;******************************* +; End of new BIOS load. * +;******************************* + + +;*************************************** +; Load a test program in from the PC. * +;*************************************** +LOADT: MOV AX,1000H ;Segment to load code in = 1000:0000. + MOV DS,AX + MOV BX,0000H + CALL RXBYTE ;Get code size. Can't be >64Kbyte. + MOV CL,AL + CALL RXBYTE + MOV CH,AL ;Load count from link. +LDT1: CALL RXBYTE + MOV DS:[BX],AL ;Load test code into memory. + INC BX + LOOP LDT1 ;Continue for code size. + JMP 1000:0000 +;******************************* +; End of test code loader. * +;******************************* + +;*************************************** +; Copy resident BIOS into RAM, then * +; boot up DOS. * +;*************************************** +CBIOS: MOV BX,00000H ;Start at segment FC00:0000 + MOV CX,1FFFH ;8k words to transfer. +CB1: MOV AX,[BX] ;Transfer by doing a read/write to the + MOV [BX],AX ;same location. + INC BX + INC BX + LOOP CB1 + MOV DX,0C04H ;Page out ROM. Due to RAM occupying same + OUT DX,AL ;address space as ROM, and RAM containing + ;a copy of ROM, execution will continue in + ;RAM. + JMP BOOTSTRAP + +;*************************************** +; Print string. * +;*************************************** +PRNTS: PUSH DS ;Store all registers used. + PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH CS + POP DS +PRNTS1: LODSB ;Get byte addressed by SI. SI+1. + CMP AL,0FFH ;End of message. + JE PRNE + MOV AH,0EH ;Do a write teletype. + MOV BX,7 + MOV CX,1 + PUSH SI + INT 10H + POP SI + JMP PRNTS1 +PRNE: POP DX ;Recover all registers. + POP CX + POP BX + POP AX + POP DS + RET +;******************************* +; End of print string. * +;******************************* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SOURCE/TABLES.ASM b/SOURCE/TABLES.ASM new file mode 100755 index 0000000..c8efd36 --- /dev/null +++ b/SOURCE/TABLES.ASM @@ -0,0 +1,219 @@ +;**************************************************************************** +;** TABLES.ASM ** +;** ---------- ** +;** ** +;** (C) 1987, 1988 P.D. Smart ** +;** ** +;** This file is part of the TURBOROM.ASM source code. Once the system has ** +;** initialised itself, these tables can be overwritten for extra storage ** +;** space. The tables stored are:- ** +;** ** +;** Interrupt vector table, ** +;** Memory Read/Write messages, ** +;** Boot up messages, ** +;** Bios ROM - RAM code. ** +;** ** +;** These tables reside at ROM location FC00:1000 ** +;** ** +;**************************************************************************** + + ORG 01000H ;Tables at FC00:1000 + +;*************************************** +; Interrupt Table. * +; * +; Contains pointers to all the int's * +; used on the accelerator board. * +;*************************************** +INTTAB: DW INTRAP0 ;IP 0 + DW 0FC00H ;CS + DW INTRAP1 ;IP 1 + DW 0FC00H ;CS + DW NMI ;IP 2 + DW 0FC00H ;CS + DW INTRAP3 ;IP 3 + DW 0FC00H ;CS + DW INTRAP4 ;IP 4 + DW 0FC00H ;CS + DW INTRAP5 ;IP 5 + DW 0FC00H ;CS + DW INTRAP6 ;IP 6 + DW 0FC00H ;CS + DW INTRAP7 ;IP 7 + DW 0FC00H ;CS + DW INTRAP8 ;IP 8 + DW 0FC00H ;CS + DW KB_INT ;IP 9 + DW 0FC00H ;CS + DW INTRAPA ;IP A + DW 0FC00H ;CS + DW INTRAPB ;IP B + DW 0FC00H ;CS + DW INTRAPC ;IP C + DW 0FC00H ;CS + DW INTRAPD ;IP D + DW 0FC00H ;CS + DW INTRAPE ;IP E + DW 0FC00H ;CS + DW INTRAPF ;IP F + DW 0FC00H ;CS + DW INTR10 ;IP 10 + DW 0FC00H ;CS + DW INTR11 ;IP 11 + DW 0FC00H ;CS + DW INTR12 ;IP 12 + DW 0FC00H ;CS + DW INTR13 ;IP 13 + DW 0FC00H ;CS + DW INTR14 ;IP 14 + DW 0FC00H ;CS + DW INTRAP ;IP 15 + DW 0FC00H ;CS + DW INTR16 ;IP 16 + DW 0FC00H ;CS + DW INTR17 ;IP 17 + DW 0FC00H ;CS + DW INTRAP18 ;IP 18 + DW 0FC00H ;CS + DW BOOTSTRAP ;IP 19 + DW 0FC00H ;CS + DW INTR1A ;IP 1A + DW 0FC00H ;CS + DW INTRAP ;IP 1B + DW 0FC00H ;CS + DW INTRAP ;IP 1C + DW 0FC00H ;CS + DW INTRAP1D ;IP 1D + DW 0FC00H ;CS + DW INTRAP1E ;IP 1E + DW 0FC00H ;CS + DW INTRAP1F ;IP 1F + DW 0FC00H ;CS + DW 00000H ;IP 20 + DW 00000H ;CS + DW 00000H ;IP 21 + DW 00000H ;CS + DW 00000H ;IP 22 + DW 00000H ;CS + DW 00000H ;IP 23 + DW 00000H ;CS + DW 00000H ;IP 24 + DW 00000H ;CS + DW 00000H ;IP 25 + DW 00000H ;CS + DW 00000H ;IP 26 + DW 00000H ;CS + DW 00000H ;IP 27 + DW 00000H ;CS + DW 00000H ;IP 28 + DW 00000H ;CS + DW 00000H ;IP 29 + DW 00000H ;CS + DW 00000H ;IP 2A + DW 00000H ;CS + DW 00000H ;IP 2B + DW 00000H ;CS + DW 00000H ;IP 2C + DW 00000H ;CS + DW 00000H ;IP 2D + DW 00000H ;CS + DW 00000H ;IP 2E + DW 00000H ;CS + DW 00000H ;IP 2F + DW 00000H ;CS + DW 00000H ;IP 30 + DW 00000H ;CS + DW 00000H ;IP 31 + DW 00000H ;CS + DW 00000H ;IP 32 + DW 00000H ;CS + DW 00000H ;IP 33 + DW 00000H ;CS + DW 00000H ;IP 34 + DW 00000H ;CS + DW 00000H ;IP 35 + DW 00000H ;CS + DW 00000H ;IP 36 + DW 00000H ;CS + DW 00000H ;IP 37 + DW 00000H ;CS + DW 00000H ;IP 38 + DW 00000H ;CS + DW 00000H ;IP 39 + DW 00000H ;CS + DW 00000H ;IP 3A + DW 00000H ;CS + DW 00000H ;IP 3B + DW 00000H ;CS + DW 00000H ;IP 3C + DW 00000H ;CS + DW 00000H ;IP 3D + DW 00000H ;CS + DW 00000H ;IP 3E + DW 00000H ;CS + DW 00000H ;IP 3F + DW 00000H ;CS + DW HARD_BASE ;IP 40 + DW 0FC00H ;CS + DW HARD_BASE ;IP 41 + DW 0FC00H ;CS + DB 0780H DUP(0) +;******************************* +; End of Interrupt table. * +;******************************* + + +BADMES: DB 'Non system disk or NO disk in DRIVE A:',0DH,0AH + DB 'Place system disk in drive A:, press ANY key when ready' + DB 0DH,0AH,0AH,0FFH +ACCEL: DB 'Booting DOS...........',0DH,0AH,0FFH +MESBOOT:DB '286 CPU MEMORY READ/WRITE SOFTWARE, (C) 1987,1988 P.D. Smart',0DH,0AH,0FFH +MESILC: DB 'COMMAND PASSED IS NOT RECOGNISED',0DH,0AH,0FFH + +LTAB1: DB 0BAH,04H,0CH,0EEH,0EAH,0F0H,03FH,00H,0FCH,00H + +RS232_BASE EQU 0000H +PRINTER_BASE EQU 0008H +EQUIP_FLAG EQU 0010H +MFG_TST EQU 0012H +MEMORY_SIZE EQU 0013H +MFG_ERR_FLAG EQU 0015H +KB_FLAG EQU 0017H +KB_FLAG_1 EQU 0018H +ALT_INPUT EQU 0019H +BUFFER_HEAD EQU 001AH +BUFFER_TAIL EQU 001CH +KB_BUFFER EQU 001EH +INTR_FLAG EQU 006BH +BIOS_BREAK EQU 0071H +RESET_FLAG EQU 0072H +PRINT_TIM_OUT EQU 0078H +RS232_TIM_OUT EQU 007CH +BUFFER_START EQU 0080H +BUFFER_END EQU 0082H +; +INS_STATE EQU 80H +CAPS_STATE EQU 40H +NUM_STATE EQU 20H +SCROLL_STATE EQU 10H +ALT_SHIFT EQU 08H +CTL_SHIFT EQU 04H +LEFT_SHIFT EQU 02H +RIGHT_SHIFT EQU 01H +INS_SHIFT EQU 80H +CAPS_SHIFT EQU 40H +NUM_SHIFT EQU 20H +SCROLL_SHIFT EQU 10H +HOLD_STATE EQU 08H +NUM_KEY EQU 69 +SCROLL_KEY EQU 70 +ALT_KEY EQU 56 +CTL_KEY EQU 29 +CAPS_KEY EQU 58 +LEFT_KEY EQU 42 +RIGHT_KEY EQU 54 +INS_KEY EQU 82 +DEL_KEY EQU 83 + + + \ No newline at end of file diff --git a/SOURCE/TURBO.BAT b/SOURCE/TURBO.BAT new file mode 100755 index 0000000..1862adf --- /dev/null +++ b/SOURCE/TURBO.BAT @@ -0,0 +1,7 @@ +ECHO OFF +ECHO Assembling TURBOROM. +A86 TURBOROM.ASM STARTUP.ASM MEM.ASM TABLES.ASM BIOS.ASM +DEL *.SYM >NUL + + + \ No newline at end of file diff --git a/SOURCE/TURBOROM.ASM b/SOURCE/TURBOROM.ASM new file mode 100755 index 0000000..8847b6b --- /dev/null +++ b/SOURCE/TURBOROM.ASM @@ -0,0 +1,50 @@ +;**************************************************************************** +;** TurboRacer 286 control ROM routines. ** +;** ------------------------------------ ** +;** ** +;** (C) 1987, 1988 P.D. Smart ** +;** ** +;** This source file contains the coding used to control the TurboRacer ** +;** 286. It's basic structure is as follows:- ** +;** ** +;** 16k ROM (8K * 16bit) mapped into addresses 8000:0000 - FFFF:FFFF, ** +;** which is 512K in size. The rom is only used for initialization, and ** +;** is paged out after startup. ** +;** ** +;** Addresses considered within this ROM are FC00:0000 - FC00:3FFF which ** +;** is 16K. Within this 16K allocation, it is subdivided into 4 main ** +;** areas, namely:- ** +;** ** +;** FC00:0000 -> CPU test code, ** +;** Memory test code, ** +;** Basic initiator code, ** +;** :- Load in new BIOS. ** +;** :- Load in test code. ** +;** :- Execute memory exercise code. ** +;** :- Boot up DOS using BIOS in rom. ** +;** ** +;** FC00:1000 -> Interrupt vector tables, ** +;** Read/Write messages. ** +;** ** +;** FC00:2000 -> BIOS ** +;** ** +;** FC00:3FF0 -> RESET boot up code. ** +;** ** +;** This file is assembled using the A86 assembler. To assemble correctly, ** +;** invoke A86 at the DOS prompt as follows:- ** +;** ** +;** C:\> A86 TURBOROM.ASM STARTUP.ASM MEM.ASM TABLES.ASM BIOS.ASM ** +;** ** +;** ** +;**************************************************************************** + + ORG 00000H ;FC00:0000 + + + + + + + + + \ No newline at end of file diff --git a/SOURCE/VIDEO b/SOURCE/VIDEO new file mode 100755 index 0000000..5aab4c8 --- /dev/null +++ b/SOURCE/VIDEO @@ -0,0 +1,86 @@ +M1: DW OFFSET SET_MODE + DW OFFSET SET_CTYPE + DW OFFSET SET_CPOS + DW OFFSET READ_CURSOR + DW OFFSET READ_LPEN + DW OFFSET ACT_DISP_PAGE + DW OFFSET SCROLL_UP + DW OFFSET SCROLL_DOWN + DW OFFSET READ_AC_CURRENT + DW OFFSET WRITE_AC_CURRENT + DW OFFSET WRITE_C_CURRENT + DW OFFSET SET_COLOR + DW OFFSET WRITE_DOT + DW OFFSET READ_DOT + DW OFFSET WRITE_TTY + DW OFFSET VIDEO_STATE + DW OFFSET VIDEO_RETURN + DW OFFSET VIDEO_RETURN + DW OFFSET VIDEO_RETURN + DW OFFSET WRITE_STRING +M1N: +M1L EQU M1N-M1 +VIDEO: STI + CLD + CMP AH,MIL/2 + JNB M4 + PUSH ES + PUSH DS + PUSH DX + PUSH CX + PUSH BX + PUSH SI + PUSH DI + PUSH BP + MOV SI,DATA + MOV DS,SI + MOV SI,AX + MOV AL,BYTE PTR EQUIP_FLAG + AND AL,30H + CMP AL,30H + MOV DI,0B800H + JNE M2 + MOV DI,0B000H +M2: MOV ES,DI + MOV AL,AH + CBW + SAL AX,1 + XCHG SI,AX + MOV AH,BYTE PTR CRT_MODE + JMP WORD PTR CS:[SI+OFFSET M1] +M4: IRET + +SET_MODE: + MOV DX,03D4H + MOV DI,WORD PTR EQUIP_FLAG + AND DI,30H + CMP DI,30H + JNE M8C + MOV AL,7 + MOV DL,0B4H + JMP SHORT M8 +M8C: CMP AL,7 + JB M8 + MOV AL,0 + CMP DI,20H + JE M8 + MOV AL,2 +M8: MOV BYTE PTR CRT_MODE,AL + MOV WORD PTR ADDR_6845,DX + MOV BYTE PTR ROWS,25-1 + PUSH DS + PUSH AX + CBW + MOV SI,AX + MOV AL,CS:[SI+OFFSET M7] + MOV BYTE PTR CRT_MODE_SET,AL + AND AL,037H + PUSH DX + ADD DX,4 + OUT DX,AL + POP DX + SUB BX,BX + MOV DS,BX + + + \ No newline at end of file