From f05d3d49af14ed3228b7fa9ab4602f9b63d808b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sun, 10 Dec 2000 21:48:09 +0100 Subject: [PATCH 01/17] =?UTF-8?q?feat:=20premi=C3=A8re=20version=20de=20CO?= =?UTF-8?q?S2000.=20Affichage=20d'un=20texte=20en=203D=20au=20d=C3=A9marra?= =?UTF-8?q?ge.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Graphisme/logo.png | Bin 0 -> 65941 bytes LICENSE.md | 675 +++++++++++++++++++++++++++++++++++++++++++++ README.md | 51 ++++ asm.bat | 9 + boot.asm | 164 +++++++++++ cosinit.asm | 217 +++++++++++++++ exe2boot.asm | 67 +++++ id.asm | 367 ++++++++++++++++++++++++ 8 files changed, 1550 insertions(+) create mode 100644 Graphisme/logo.png create mode 100755 LICENSE.md create mode 100644 README.md create mode 100755 asm.bat create mode 100755 boot.asm create mode 100755 cosinit.asm create mode 100755 exe2boot.asm create mode 100755 id.asm diff --git a/Graphisme/logo.png b/Graphisme/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..029ae7cd265c7e4976ce54745c85e70137ae026b GIT binary patch literal 65941 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 W5f~jyt_OE>;l84V!dE#n|NjDa1d+i2 literal 0 HcmV?d00001 diff --git a/LICENSE.md b/LICENSE.md new file mode 100755 index 0000000..01a7a80 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,675 @@ +### GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +### Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom +to share and change all versions of a program--to make sure it remains +free software for all its users. We, the Free Software Foundation, use +the GNU General Public License for most of our software; it applies +also to any other work released this way by its authors. You can apply +it to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you +have certain responsibilities if you distribute copies of the +software, or if you modify it: responsibilities to respect the freedom +of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the +aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for +individuals to use, which is precisely where it is most unacceptable. +Therefore, we have designed this version of the GPL to prohibit the +practice for those products. If such problems arise substantially in +other domains, we stand ready to extend this provision to those +domains in future versions of the GPL, as needed to protect the +freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish +to avoid the special danger that patents applied to a free program +could make it effectively proprietary. To prevent this, the GPL +assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +#### 0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +#### 1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +#### 2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +#### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +#### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +#### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +#### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +#### 8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +#### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +#### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +#### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +#### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +#### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +#### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that numbered version or +of any later version published by the Free Software Foundation. If the +Program does not specify a version number of the GNU General Public +License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy's public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +#### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +#### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +#### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands \`show w' and \`show c' should show the +appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an "about box". + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see . + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read . \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..444dfb7 --- /dev/null +++ b/README.md @@ -0,0 +1,51 @@ +![logo](https://github.com/dahut87/cos2000v1/raw/master/Graphisme/logo.png) + +## Présentation du projet + +### Qu'est ce que COS2000 ? + +COS2000 est un système d'exploitation minimaliste qui vise essentiellement un objectif pédagogique. +Il s'agit avant tout du travail d'un passionné de programmation système. + +Le système est développé intégralement en langage assembleur X86. Le "real mode" et "flat unreal mode" sont les modes de fonctionnement du microprocesseur lors de l'execution de COS2000 (comme MsDOS). + +#### Qu'est ce qu'un système d'exploitation ? + +Il s'agit du logiciel principal qui anime votre ordinateur. Il a pour fonctions principales : + +* Piloter des périphériques tels que souris, clavier, écran, imprimante...etc; +* Gérer des fichiers qui sont produit et exploités par des applications; +* Coordonner l'accès aux ressources par plusieurs utilisateurs; +* Détection et récupération des dysfonctionnements; +* Surveiller les performances et assurer une gestion optimale des ressources systèmes. + +Sans système d'exploitation votre ordinateur est inopérant: c'est une boite vide ! + +#### Comment utiliser COS2000 ? + +COS2000 n'a pas pour but d'être utilisé en production. Il s'agit d'un système en cours de +développement que vous pouvez néanmoins tester sur un ordinateur physique ou de préférence sur une machine virtuelle. +Il est nécessaire de compiler le système avant de démarrer celui-ci à partir d'un périphérique amovible (clé usb). + +#### Sur quel ordinateur fonctionne t'il ? + +COS2000 est compatible avec tout ordinateur compatible PC comprenant un processeur compatible 80x86. + +#### Ai-je le droit de le copier, de le modifier, de le réutiliser, de le vendre ? + +COS2000 est sous licence GPL v3.0, en simplifiant un peu : + +* COPIER - OUI +* MODIFIER - OUI +* REUTILISER - OUI en citant l'auteur +* VENDRE - NON + +![logo](https://www.gnu.org/graphics/gplv3-127x51.png) + +Les détails se trouvent dans le fichier `LICENSE.md` + +> “La connaissance s'acquiert par l'expérience, +> tout le reste n'est que de l'information.. +> +> ― Albert Einstein +> ― Mathématicien, Physicien diff --git a/asm.bat b/asm.bat new file mode 100755 index 0000000..0653196 --- /dev/null +++ b/asm.bat @@ -0,0 +1,9 @@ +@echo off +del system.bin +ren id.com system.bin +tasm boot.asm /t/x/m4 +tlink boot.obj /x +del boot.obj +exe2boot.com +del boot.exe +cosinit.com diff --git a/boot.asm b/boot.asm new file mode 100755 index 0000000..32bd54c --- /dev/null +++ b/boot.asm @@ -0,0 +1,164 @@ +boots segment +.386 +org 000h +assume cs:boots,ds:boots + +start: +jmp boot + + +bootdb db 'COS2000A' ;ID Formatage + dw 512 ;octet/secteur + db 1 ;secteur/cluster + dw 1 ;secteur reserv‚ + db 2 ;nb de FAT + dw 224 ;nb secteur rep racine + dw 2880 ;nb secteur du volume + db 0F0h ;ID support + dw 9 ;secteur/FAT + dw 18 ;secteur/piste + dw 2 ;nb de tˆte + dw 0 ;distance 1er sect et sect masse + db 0,0,0,0,0,0,0,0,29h ;? + db 01,02,03,04 ;no de serie + db 'COS2000 ' ;nom de volume + db 'FAT16 ' ;FAT +specialboot: + db 0 ;Secteur Systeme +errorloading db 'The disk inserted in the floppy drive is not a system disk !!',0dh,0 +okloading db 'COS is loading',0dh,0 + + +errorboot: + mov si,offset errorloading + call showstr + mov ah,0 + int 16h + int 19h +boot: + cli + mov ax,07C0h + mov ds,ax + mov ax,09000h + mov ss,ax + mov sp,0FFFFh + mov ax,1000h + mov es,ax + sti + xor ax,ax + xor dx,dx + int 13h + jc errorboot + mov si,offset okloading + call showstr + mov cx,13 + mov bx,100h + call readsector + jc errorboot + mov cx,es:[bx+26] + call readsector + jc errorboot + add bx,512 + inc cx + call readsector + jc errorboot + db 2eh,0ffh,1eh + dw offsets + Offsets dw 100h + dw 1000h + ret + + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 + +;===================================Afficher un int EDX a l'‚cran================ +ShowInt: + push eax edx esi di es + mov di,xy + mov ax,0B800h + mov es,ax + mov eax,edx + mov esi,10 +decint2: + xor edx,edx + div esi + add dl,'0' + mov dh,colors + mov es:[di],dx + sub di,2 + cmp ax,0 + jne decint2 + sub di,2 + mov xy,di + pop es di esi edx eax +ret + +xy dw 20 +colors db 4 + +ReadSector: +push cx dx si + mov AX, CX + xor DX, DX + div DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor dX, DX + div DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +Done: + pop si dx cx +ret + +showcrlf: + push ax bx + mov ax, 0E0Dh + xor bx, bx + int 10h + mov al, 0Ah + int 10h + pop bx ax +ret + +showstr: + push ax bx si +again: + lodsb + or al,al + jz fin + cmp al,0Dh + jne noret + call showcrlf + jmp again +noret: + mov ah,0Eh + mov bx,07h + int 10h + jmp again + fin: + pop si bx ax + ret + + +end start + diff --git a/cosinit.asm b/cosinit.asm new file mode 100755 index 0000000..6b68e87 --- /dev/null +++ b/cosinit.asm @@ -0,0 +1,217 @@ +.model tiny +.486 +smart +.code + +org 0100h + + +start: +jmp CopyCOS + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 +NameBoot db 'Boot.bin',0 +Namesystem db 'System.bin',0 +Message db 0Ah,0Dh,'Installation of the COS (Celyn Operating System) !!',0Ah,0Dh,'Written By Horde Nicolas',0Ah,0Dh,'Copyright 2000',0Ah,0Dh + db 0Ah,0Dh,'Create boot sector$' +systfile db 0Ah,0Dh,'Creating file allocation table 16 bits$' +systfile2 db 0Ah,0Dh,'Creating file information table 32 bytes$' +systfile3 db 0Ah,0Dh,'Creating operating system files$' +Errormsg db 0Ah,0Dh,0Ah,0Dh,'An error has stopped the copying process !',0Ah,0Dh,'$' +Ok db 0Ah,0Dh,0Ah,0Dh,'The boot sector and the system files had been succefully copied.',0Ah,0Dh, 'To try COS reboot with this system disk',0Ah,0Dh,0Ah,0Dh,'$' + +entrie db 'System file',0 + db 'sys',0,0 + dw 1234h + dw 1234h + dw 1234h + dw 1234h + db 0h + dw 32 + dw 512 + dw 0h + dw 0 + + +CopyCOS: +mov ah,09 +mov dx,offset message +int 21h +jc error +mov ax,3D00h +mov dx,offset nameboot +int 21h +jc error +mov bx,ax +mov ax,4202h +xor cx,cx +xor dx,dx +int 21h +jc error +cmp dx,0 +jne error +cmp ax,512 +jne error +mov ax,4200h +xor cx,cx +xor dx,dx +int 21h +jc error +mov ah,3fh +mov cx,512 +mov dx,offset buffer +int 21h +jc error +mov ah,3eh +int 21h +jc error +mov cx,0 +mov bx,dx +call writesector +jne error +mov ah,09 +mov dx,offset systfile +int 21h +jc error + +mov cx,512/4 +mov di,bx +mov eax,0 +rep stosd +mov cx,13 +fatanymore: +call writesector +jne error +dec cx +cmp cx,1 +ja fatanymore +mov di,bx +mov ax,0FFF0h +mov cx,13 +rep stosw +mov ax,0FFFFh +stosw +mov word ptr [bx+32*2],33 +mov word ptr [bx+33*2],0FFFFh +mov cx,1 +call writesector +jne error + +mov ah,09 +mov dx,offset systfile2 +int 21h +jc error +mov cx,13 +mov bx,offset entrie +call writesector +jne error + +mov ah,09 +mov dx,offset systfile3 +int 21h +jc error + +mov ax,3D00h +mov dx,offset namesystem +int 21h +jc error +mov bx,ax +mov ax,4202h +xor cx,cx +xor dx,dx +int 21h +jc error +cmp dx,0 +jne error +sub ax,1 ;+512 +cmp ax,0 +jl error +shr ax,9 +inc ax +mov bp,ax +mov ax,4200h +xor cx,cx +xor dx,dx +int 21h +jc error +mov ah,3fh +mov cx,0FFFFh +mov dx,offset buffer +int 21h +jc error +mov bx,dx +mov cx,32 +syst: +call writesector +jne error +add bx,512 +inc cx +dec bp +jnz syst + + + + + + + +mov ah,09 +mov dx,offset ok +int 21h +jc error +ret +error: +mov ah,09 +mov dx,offset errormsg +int 21h +ret + + + + + + + +WriteSector: +push cx dx si + mov AX, CX + xor DX, DX + div DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor DX, DX + div DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 3 + int 13h + jnc Done + dec SI + jnz TryAgain +Done: + mov cl, AH + mov ah,9 + mov dx,offset sign + int 21h + cmp cl,0 + pop si dx cx +ret + +sign db '.$' +buffer db 512 dup (0) + +end start diff --git a/exe2boot.asm b/exe2boot.asm new file mode 100755 index 0000000..37c3399 --- /dev/null +++ b/exe2boot.asm @@ -0,0 +1,67 @@ +.model tiny +.486 +smart +.code + +org 0100h + + +start: +jmp transform +NameBoot db 'Boot.exe',0 +nameboot2 db 'Boot.bin',0 +buffer db 510 dup (0) + dw 0AA55h +message db 0ah,0dh,'Transformation of boot.com to boot.bin...',0ah,0dh,'By Horde Nicolas',0ah,0dh,'Copyright 2000',0ah,0dh,'$' +ok db 0ah,0dh,'The transformation was done succefully !',0ah,0dh,'$' +errormsg db 0ah,0dh,'Some errors has been detected !',0ah,0dh,'$' +transform: +mov ah,09 +mov dx,offset message +int 21h +mov ax,3D00h +mov dx,offset nameboot +int 21h +jc error +mov bx,ax +mov ax,4202h +xor cx,cx +xor dx,dx +int 21h +jc error +cmp dx,0 +jne error +mov ax,4200h +xor cx,cx +mov dx,512 +int 21h +jc error +mov ah,3fh +mov cx,512 +mov dx,offset buffer +int 21h +jc error +mov ah,3eh +int 21h +jc error +mov ah,3ch +xor cx,cx +mov dx,offset nameboot2 +int 21h +jc error +mov ah,40h +mov cx,512 +mov dx,offset buffer +int 21h +jc error +mov ah,09 +mov dx,offset ok +int 21h +ret +error: +mov ah,09 +mov dx,offset errormsg +int 21h +ret + +end start diff --git a/id.asm b/id.asm new file mode 100755 index 0000000..b748b79 --- /dev/null +++ b/id.asm @@ -0,0 +1,367 @@ +.model tiny +.386c +.code +org 0100h + + colores equ 7 + + +logoY equ 064h +logo2X equ 0A0h +logo2Y equ 064h +ecartlogo2 equ 13Eh +logocoordsize equ 0B40h +logo2coordsize equ 26Ch +zoomout equ 43h + + + +start: + ;mov ax,cs + + mov ax,01000h + mov ds,ax + mov es,ax + mov gs,ax + mov ax,13h + int 10h + + mov dx,3C8h + mov al,7 + out dx,al + inc dx + xor al,al + out dx,al + out dx,al + out dx,al + mov si,offset logo2text + call showstr + mov ax,0A000h + mov ds,ax + push ds + push es + push gs + mov di,logo2coord + mov cx,logo2coordsize + xor si,si + xor dx,dx + xor bx,bx + +loopcoord2: + lodsb + or al,al + jz nothingcoord2 + mov ax,dx + sub ax,5Ah + stosw + mov ax,bx + sub ax,14h + stosw + inc gs:nblogo2 +nothingcoord2: + add dx,3 + cmp dx,0BAh + jne short loc_3 + xor dx,dx + add si,102h + add bx,4 +loc_3: + loop loopcoord2 + + pop ds + call zerocurs + mov si,offset data6 + call showstr + + pop es + pop ds + mov cx,logocoordsize + xor si,si + xor dx,dx + xor bx,bx + +loopcoord: + lodsb + or al,al + jz nothingcoord + mov ax,dx + sub ax,32h + stosw + mov ax,bx + shl ax,1 + sub ax,1Eh + stosw + inc gs:nblogo +nothingcoord: + inc dx + inc dx + cmp dx,60h + jne short loc_6 + xor dx,dx + add si,110h + inc bx +loc_6: + loop loopcoord + + push ds + pop es + push gs + pop ds +masterloop: + inc logox ;++++ + inc data_10 + mov bl,data_10 + xor bh,bh + mov al,data_1[bx] + cbw + mov data_11,ax + add bl,zoomout + mov al,data_1[bx] + cbw + mov data_12,ax + mov cx,nblogo2 + push cx + push cx + mov si,logo2coord + +showlogo2: + lodsw + mov data_7,ax + lodsw + mov data_8,ax + mov data_9,0FFCEh + push cx + push si + mov si,offset data_8 + push si + mov di,offset data_9 + call sub_1 + mov si,offset data_7 + call sub_1 + pop di + call sub_1 + pop si + mov ax,100h + imul data_7 + mov bx,data_9 + add bx,140h + idiv bx + add ax,logo2X + mov bp,ax + mov ax,100h + imul data_8 + mov bx,data_9 + add bx,140h + idiv bx + add ax,logo2Y + mov bx,140h + imul bx + add ax,bp + mov di,ax + push si + sub si,logo2coord + shr si,1 + mov ds:data_16e[si],di + pop si + mov bx,data_9 + mov cl,4 + shr bx,cl + pop cx + mov al,17h + sub al,bl + mov ah,al + stosw + add di,ecartlogo2 + stosw + loop showlogo2 + + pop si + shl si,1 + shl si,1 + add si,logo2coord + mov cx,nblogo + +showlogo: + push cx + lodsw + imul data_12 + mov di,ax + lodsw + imul data_11 + sub di,ax + mov cl,7 + sar di,cl + add di,logoX + mov bx,di + sub si,4 + lodsw + imul data_11 + mov di,ax + lodsw + imul data_12 + add di,ax + sar di,cl + add di,logoy + mov ax,140h + imul di + add ax,bx + mov di,ax + pop cx + mov ax,cx + shl ax,1 + mov bx,data_17e + add bx,ax + mov [bx],di + mov al,28h + stosb + loop showlogo + + mov dx,3DAh + +synchro: + in al,dx + test al,8 + jnz synchro +synchroagain: + in al,dx + test al,8 + jz synchroagain + mov si,data_16e + pop cx + add cx,nblogo + add cx,14h + +showlogo2effect: + lodsw + mov di,ax + xor ax,ax + stosw + add di,ecartlogo2 + stosw + loop showlogo2effect + + in al,60h + cmp al,1 + je endofprog + jmp masterloop +endofprog: + mov ax,3 + int 10h + int 20h + ret + + +sub_1 proc near + mov ax,[si] + imul data_12 + mov bp,ax + mov ax,[di] + imul data_11 + sub bp,ax + mov cl,7 + sar bp,cl + push bp + mov ax,[si] + imul data_11 + mov bp,ax + mov ax,[di] + imul data_12 + add bp,ax + sar bp,cl + mov [di],bp + pop ax + mov [si],ax + retn +sub_1 endp + +showcrlf: + push ax bx + mov ax, 0E0Dh + xor bx, bx + int 10h + mov al, 0Ah + int 10h + pop bx ax +ret + +zerocurs: +push ax bx dx +mov ah,02h +mov bh,0 +mov dx,0 +int 10h +pop dx bx ax +ret + +showstr: + push ax bx si +again: + lodsb + or al,al + jz fin + cmp al,0Dh + jne noret + call showcrlf + jmp again +noret: + mov ah,0Eh + mov bx,colores + int 10h + jmp again + fin: + pop si bx ax + ret +logoX dw 0A0h ;++++ + + +data_1 db 0 + db 03h, 06h, 09h, 0Ch, 10h, 13h + db 16h, 19h, 1Ch, 1Fh + db '"%(+.1369 Date: Sat, 3 Feb 2001 21:48:09 +0100 Subject: [PATCH 02/17] =?UTF-8?q?feat:=20ajout=20d'un=20menu=20permettant?= =?UTF-8?q?=20de=20lancer=202=20applications:=20visualisateur=20de=20m?= =?UTF-8?q?=C3=A9moire=20et=20visualisateur=20de=20m=C3=A9moire=20de=20mas?= =?UTF-8?q?se=20(disquette)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asm.bat | 2 +- boot.asm | 235 ++++++++++------- choice.asm | 600 ++++++++++++++++++++++++++++++++++++++++++++ cosinit.asm | 217 ---------------- exe2boot.asm | 2 +- id.asm | 24 +- mem.asm | 694 +++++++++++++++++++++++++++++++++++++++++++++++++++ sect.asm | 660 ++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 2113 insertions(+), 321 deletions(-) create mode 100755 choice.asm delete mode 100755 cosinit.asm create mode 100755 mem.asm create mode 100755 sect.asm diff --git a/asm.bat b/asm.bat index 0653196..c8bb1bc 100755 --- a/asm.bat +++ b/asm.bat @@ -1,6 +1,6 @@ @echo off del system.bin -ren id.com system.bin +copy id.com system.bin tasm boot.asm /t/x/m4 tlink boot.obj /x del boot.obj diff --git a/boot.asm b/boot.asm index 32bd54c..a38e088 100755 --- a/boot.asm +++ b/boot.asm @@ -1,6 +1,7 @@ boots segment .386 -org 000h +org 7C00h +;org 100h assume cs:boots,ds:boots start: @@ -8,26 +9,33 @@ jmp boot bootdb db 'COS2000A' ;ID Formatage - dw 512 ;octet/secteur +sizec dw 512 ;octet/secteur db 1 ;secteur/cluster - dw 1 ;secteur reserv‚ - db 2 ;nb de FAT - dw 224 ;nb secteur rep racine - dw 2880 ;nb secteur du volume +reserv dw 1 ;secteur reserv‚ +nbfat db 1 ;nb de FAT +nbfit dw 25 ;nb secteur rep racine +allclu dw 2880 ;nb secteur du volume db 0F0h ;ID support - dw 9 ;secteur/FAT - dw 18 ;secteur/piste - dw 2 ;nb de tˆte - dw 0 ;distance 1er sect et sect masse - db 0,0,0,0,0,0,0,0,29h ;? - db 01,02,03,04 ;no de serie - db 'COS2000 ' ;nom de volume +fatsize dw 12 ;secteur/FAT +nbtrack dw 18 ;secteur/piste +head dw 2 ;nb de tˆte +hidden dd 0 ;nombre de secteur cach‚s + dd 0 ;si nbsecteur = 0 nbsect ; the number of sectors +bootdrv db 0 ;Lecteur de d‚marrage + db 0 ;NA +bootsig db 29h ;boot signature 29h + dd 01020304h ;no de serie +pope db 'COS2000 ' ;nom de volume db 'FAT16 ' ;FAT specialboot: - db 0 ;Secteur Systeme -errorloading db 'The disk inserted in the floppy drive is not a system disk !!',0dh,0 -okloading db 'COS is loading',0dh,0 +errorloading db 'It''s not a COS disk!',0dh,0ah,0 +okloading db 'COS search system',0Dh,0ah,0 +syst db 'Ok',0dh,0ah,0 +dot db '.',0 +carry db 0dh,0ah,0 +Sys db 'System file',0 +sys2 db 'sys',0 errorboot: mov si,offset errorloading @@ -36,77 +44,138 @@ errorboot: int 16h int 19h boot: - cli - mov ax,07C0h - mov ds,ax + mov Bootdrv,dl + cli mov ax,09000h mov ss,ax mov sp,0FFFFh - mov ax,1000h - mov es,ax - sti + sti + p: + push cs + pop ds xor ax,ax - xor dx,dx int 13h jc errorboot mov si,offset okloading call showstr - mov cx,13 - mov bx,100h - call readsector - jc errorboot - mov cx,es:[bx+26] - call readsector - jc errorboot - add bx,512 - inc cx - call readsector - jc errorboot - db 2eh,0ffh,1eh - dw offsets - Offsets dw 100h - dw 1000h - ret + mov cx,nbtrack + les si,ds:[1Eh*4] + mov byte ptr es:[si+4], cl + mov byte ptr es:[si+9], 0Fh + xor ax,ax + mov al,NbFat + mov bx,FatSize + mul bx + mov cx,ax + add cx,word ptr [offset Hidden] + adc cx,word ptr [offset Hidden+2] + add cx,Reserv + mov word ptr [offset BootSig],cx + xor dx,dx + mov ax,allclu + div nbtrack + xor dx,dx + div head + mov word ptr [offset pope],ax + push cs + pop es + mov bx,offset buffer + mov si,bx + xor dx,dx +CheckRoot: +call readsector +jc errorboot +xor di,di +findnext: +cmp byte ptr [bx+di],0 +je errorboot +push si di cx +mov si,di +add si,bx +call showstr +mov ax,si +mov si,offset dot +call showstr +mov si,ax +add si,12 +call showstr +mov si,offset carry +call showstr +mov si,ax +mov di,offset sys +mov cx,12+4 +rep cmpsb +pop cx di si +je oksystem +add di,32 +inc dx +cmp dx,nbfit +ja errorboot +cmp di,sizec +jb findnext +inc cx +jmp Checkroot +oksystem: +mov si,offset syst +call showstr +mov cx,[di+BX+26] +mov bx,1000h +mov es,bx +push bx +mov bx,0100h +push bx +mov si,offset dot +fatagain: +cmp cx,0FFF0h +jae finishload +call readsector +jc errorboot +call showstr +add bx,sizec +call getfat +jnc fatagain +finishload: +push es +push es +push es +pop ds +pop fs +pop gs +push 7202h +popf +db 0CBh -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 - -;===================================Afficher un int EDX a l'‚cran================ -ShowInt: - push eax edx esi di es - mov di,xy - mov ax,0B800h - mov es,ax - mov eax,edx - mov esi,10 -decint2: - xor edx,edx - div esi - add dl,'0' - mov dh,colors - mov es:[di],dx - sub di,2 - cmp ax,0 - jne decint2 - sub di,2 - mov xy,di - pop es di esi edx eax + +;<-cx nøsecteur ->cx code FAT +getfat: +push es bx +mov ax,cx +xor dx,dx +div sizec +mov cx,ax +add cx,reserv +mov bx,offset buffer +push cs +pop es +call readsector +jc errorgetfat +shl dx,1 +add bx,dx +mov cx,[bx] +errorgetfat: +pop bx es ret -xy dw 20 -colors db 4 - ReadSector: -push cx dx si +push ax cx dx si mov AX, CX xor DX, DX - div DiskSectorsPerTrack + div nbtrack mov CL, DL ;{ Set the sector } and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } xor DX, DX - div DiskTracksPerHead + div head mov CH, DL ;{ Set the track bits 0-7 } mov AL, DH ror AL, 1 @@ -114,51 +183,37 @@ push cx dx si and AL, 11000000b or CL, AL ;{ Set bits 8&9 of track } xor dX, DX - div DiskHeads + div pope mov DH, DL ;{ Set the head } inc CL mov SI, 4 TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 2 + mov AX,0201h + mov DL, bootdrv int 13h jnc Done dec SI jnz TryAgain Done: - pop si dx cx + pop si dx cx ax ret -showcrlf: - push ax bx - mov ax, 0E0Dh - xor bx, bx - int 10h - mov al, 0Ah - int 10h - pop bx ax -ret - showstr: push ax bx si again: lodsb or al,al jz fin - cmp al,0Dh - jne noret - call showcrlf - jmp again -noret: mov ah,0Eh mov bx,07h int 10h jmp again fin: pop si bx ax - ret + ret +Buffer equ $ + end start diff --git a/choice.asm b/choice.asm new file mode 100755 index 0000000..d766dce --- /dev/null +++ b/choice.asm @@ -0,0 +1,600 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: +push cs +push cs +pop ds +pop es +call clear +mov ax,0 +call setxy +mov si,offset msg +call showstring0 +mov di,0 +mov al,112 +call changeattrib +call line +call line +mov si,offset mssg +call showstring0 +call line +mov si,offset msg2 +call showstring0 +call line +xor di,di +mov bx,offset buffer +mov cx,13 +call readsector +jc fin2 +xor bp,bp +showall: +cmp byte ptr [bx+di],0 +je endof2 +mov al,[bx+di+12] +mov byte ptr [bx+di+12],0 +mov si,bx +add si,di +call showstring0 +mov si,offset spaces +call showstring0 +mov [bx+di+12],al +mov byte ptr [bx+di+12+5],0 +mov si,bx +add si,di +add si,12 +call showstring0 +call line +add di,32 +inc bp +jmp showall +endof2: +call Select +endof: +mov ax,0 +int 16h + cmp ah,50h + jne tre1 + cmp xxx,bp + je endof + inc xxx + call select + jmp endof +tre1: + cmp ah,48h + jne tre2 + cmp xxx,1 + je endof + dec xxx + call select + jmp endof +tre2: + cmp al,0Dh + je fin2 + jne tre3 + mov di,xxx + dec di + shl di,5 + mov cx,[di+bx+26] + call line + call line + mov si,offset msgg + call showstring0 + call executefat +tre3: + cmp ah,3bh + jne endof +mov di,0 +mov cx,1 +mov al,7 +call changeattribword + mov si,offset popup + mov ax,0200h + call popupmenu +mov di,0 +mov cx,1 +mov al,112 +call changeattribword + jmp endof +fin2: +ret + + +popup db 4,'&New' + db 5,'&Open' + db 1,'-' + db 7,'&Delete' + db 7,'R&ename' + db 5,'&Copy' + db 5,'&Link' + db 1,'-' + db 8,'&Restart' + db 10,'&Shut down' + db 1,'-' + db 12,'&About me...' + db 0 + db 070h ;couleur normale + db 07Fh ;couleur speciale + db 07h ;couleur select + +executefat: +push cs +mov bx,offset start +push bx +mov bx,6000h +mov es,bx +push bx +mov bx,0100h +push bx +mov si,offset dot +fatagain: +cmp cx,0FFF0h +jae finishload +call readsector +jc fin2 +call showstring0 +add bx,sizec +call getfat +jnc fatagain +finishload: +push es +push es +push es +pop ds +pop fs +pop gs +push 7202h +popf +db 0CBh + +sizec dw 512 +reserv dw 1 + +;<-cx nøsecteur ->cx code FAT +getfat: +push es ax bx dx +mov ax,cx +xor dx,dx +div sizec +mov cx,ax +add cx,reserv +mov bx,offset buffer +push cs +pop es +call readsector +jc errorgetfat +shl dx,1 +add bx,dx +mov cx,[bx] +errorgetfat: +pop dx bx ax es +ret + +;selectionne la ligne xx +Select: +push ax di +mov di,xxold +mov al,7 +add di,3 +call changeattrib +mov ax,xxx +mov xxold,ax +mov di,xxx +mov al,112 +add di,3 +call changeattrib +pop di ax +ret + +;couleur al pour ligne di mot cx +Changeattribword: +push bp bx dx di es +mov dx,0B800h +mov es,dx +mov dx,di +shl dx,5 +shl di,7 +add di,dx +mov dx,80 +xor bp,bp +xor bx,bx +popp: +cmp byte ptr es:[di],' ' +je noway +cmp bx,1 +je noway2 +mov bx,1 +inc bp +cmp cx,bp +ja fint +jmp noway2 +noway: +xor bx,bx +noway2: +cmp bp,cx +jne noway3 +mov es:[di-1],al +noway3: +add di,2 +dec dx +jnz popp +fint: +pop es di dx bx bp +ret + + +;couleur al pour ligne di +changeattrib: +push dx di es +mov dx,0B800h +mov es,dx +mov dx,di +shl dx,5 +shl di,7 +add di,dx +mov cx,80 +inc di +popep: +mov es:[di],al +add di,2 +dec cx +jnz popep +pop es di dx +ret + +colors db 7 +xy dw 0 +x db 0 +y db 0 +xxx dw 1 +xxold dw 0 +msg db ' File Edition',0 +mssg db 'Cos 2000 menu loader release 1.0',0 +msg2 db '>',0 +spaces db ' ',0 +dot db '.',0 +msgg db 'Chargement du programme',0 + +;==========SHOWCHAR=========== +;met un caractŠre apr‚s le curseur +;-> dl +;<- +;============================= +showchar: +push dx bx es +mov bx,0B800h +mov es,bx +mov bx,cs:xy +mov dh,cs:colors +mov es:[bx],dx +add cs:xy,2 +pop es bx dx +ret + + + +;==========SPACE=========== +;met un espace apr‚s le curseur +;-> +;<- +;============================= +space: +push bx es +add cs:xy,2 +mov bx,0B800h +mov es,bx +mov bx,cs:xy +mov byte ptr es:[bx],' ' +pop es bx +ret + +;==============================Affiche le nombre nb binaire en EDX============== +ShowbinRow: + push es ax bx cx di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors +binaize: + rol edx,1 + mov cl,'0' + adc cl,0 + mov es:[di],cx + add di,2 + dec al + jnz binaize + mov cs:xy,di + pop di cx bx ax es + ret + +;==========SETCOLOR========= +;Change les attributs du texte a CL +;-> CL +;<- +;============================= +setcolor: +mov cs:colors,CL +ret + +;=============CLEAR========= +;Efface l'ecran texte +;-> +;<- +;============================= +clear: +push es eax cx di +xor di,di +mov ax,0b800h +mov es,ax +mov eax,07200720h +mov cx,1000 +cld +rep stosd +pop di cx eax es +ret + +;==========SCROLLDOWN========= +;defile de cx lines vers le bas +;-> CX +;<- +;============================= +scrolldown: +push cx si di ds es +mov si,0B800h +mov es,si +mov ds,si +mov si,cx +shl si,5 +shl cx,7 +add si,cx +mov cx,4000 +sub cx,si +xor di,di +cld +rep movsb +pop es ds di si cx +ret + +;==========LINE========= +;remet le curseur a la ligne +;-> +;<- +;============================= +line: +push ax cx di es +mov ah,cs:x +mov al,cs:y +xor ah,ah +cmp al,24 +jne scro +dec al +mov cl,1 +call scrolldown +scro: +inc al +call setxy +pop es di cx ax +ret + +;==========SETXY========= +;Change les coordonnées du curseur a X:AL,Y:AH +;-> AX +;<- es di +;============================= +setxy: +push ax bx di +mov cs:x,ah +mov cs:y,al +mov bl,ah +xor bh,bh +xor ah,ah +mov di,ax +shl di,5 +shl ax,7 +shl bx,1 +add di,ax +add di,bx +mov cs:xy,di +pop di bx ax +ret + +;================Affiche la chaine 0 de caractŠre contenue dans ds:si +showstring0: + push es cx si di + mov di,cs:xy + mov cx,0B800h + mov es,cx + mov ch,cs:colors +strinaize0: + mov cl,[si] + cmp cl,0 + je no0 + mov es:[di],cx + add di,2 + inc si + jmp strinaize0 + no0: + mov cs:xy,di + pop di si cx es + ret + +;==============================Affiche le nombre nb hexa en EDX============== +ShowHexRow: + push es ax bx cx di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors + shr ax,2 +Hexaize: + rol edx,4 + mov bx,dx + and bx,0fh + mov cl,cs:[bx+offset Tab] + mov es:[di],cx + add di,2 + dec al + jnz Hexaize + mov cs:xy,di + pop di cx bx ax es + ret +Tab db '0123456789ABCDEF' +ret + +;===================================sauve l'ecran rapidement================ +SaveScreen: + push cx si di ds es + mov cx,0B800H + mov ds,cx + push cs + pop es + mov cx,(80*25*2)/4 + xor si,si + mov di,offset Copy2 + cld + rep movsd + pop es ds di si cx + ret + + +;===================================sauve l'ecran rapidement================ +RestoreScreen: + push cx si di ds es + mov cx,0B800H + mov es,cx + push cs + pop ds + mov cx,(80*25*2)/4 + mov si,offset Copy2 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + +;===================================Afficher un int EDX a l'‚cran en ah,al================ +ShowInt: + push eax bx cx edx esi di es ds + mov di,cs:xy + mov cx,0B800h + mov es,cx + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint3: + xor edx,edx + div esi + add dl,'0' + mov dh,cs:colors + sub bx,2 + add cx,2 + mov cs:[bx],dx + cmp ax,0 + jne decint3 + mov si,bx + push cs + pop ds + cld + rep movsb + mov cs:xy,di + pop ds es di esi edx cx bx eax +ret + +showbuffer db 35 dup (0FFh) +Lastread dw 0FFFFh + +ReadSector: +push ax cx dx si + cmp cx,cs:lastread + je done + mov cs:LastRead,cx + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor dX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +mov word ptr cs:lastread,0ffffh +Done: + pop si dx cx ax +ret + +WriteSector: +push ax cx dx si + cmp cs:Lastread,cx + jne nodestruct + mov cs:Lastread,0ffffh + nodestruct: + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor DX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain2: + mov AL, 1 + mov DL, 0 + mov AH, 3 + int 13h + jnc Done2 + dec SI + jnz TryAgain2 +Done2: + pop si dx cx ax +ret + +include menu.Asm + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 + +copy2 equ $ +buffer equ $ + +end start diff --git a/cosinit.asm b/cosinit.asm deleted file mode 100755 index 6b68e87..0000000 --- a/cosinit.asm +++ /dev/null @@ -1,217 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - - -start: -jmp CopyCOS - -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 -NameBoot db 'Boot.bin',0 -Namesystem db 'System.bin',0 -Message db 0Ah,0Dh,'Installation of the COS (Celyn Operating System) !!',0Ah,0Dh,'Written By Horde Nicolas',0Ah,0Dh,'Copyright 2000',0Ah,0Dh - db 0Ah,0Dh,'Create boot sector$' -systfile db 0Ah,0Dh,'Creating file allocation table 16 bits$' -systfile2 db 0Ah,0Dh,'Creating file information table 32 bytes$' -systfile3 db 0Ah,0Dh,'Creating operating system files$' -Errormsg db 0Ah,0Dh,0Ah,0Dh,'An error has stopped the copying process !',0Ah,0Dh,'$' -Ok db 0Ah,0Dh,0Ah,0Dh,'The boot sector and the system files had been succefully copied.',0Ah,0Dh, 'To try COS reboot with this system disk',0Ah,0Dh,0Ah,0Dh,'$' - -entrie db 'System file',0 - db 'sys',0,0 - dw 1234h - dw 1234h - dw 1234h - dw 1234h - db 0h - dw 32 - dw 512 - dw 0h - dw 0 - - -CopyCOS: -mov ah,09 -mov dx,offset message -int 21h -jc error -mov ax,3D00h -mov dx,offset nameboot -int 21h -jc error -mov bx,ax -mov ax,4202h -xor cx,cx -xor dx,dx -int 21h -jc error -cmp dx,0 -jne error -cmp ax,512 -jne error -mov ax,4200h -xor cx,cx -xor dx,dx -int 21h -jc error -mov ah,3fh -mov cx,512 -mov dx,offset buffer -int 21h -jc error -mov ah,3eh -int 21h -jc error -mov cx,0 -mov bx,dx -call writesector -jne error -mov ah,09 -mov dx,offset systfile -int 21h -jc error - -mov cx,512/4 -mov di,bx -mov eax,0 -rep stosd -mov cx,13 -fatanymore: -call writesector -jne error -dec cx -cmp cx,1 -ja fatanymore -mov di,bx -mov ax,0FFF0h -mov cx,13 -rep stosw -mov ax,0FFFFh -stosw -mov word ptr [bx+32*2],33 -mov word ptr [bx+33*2],0FFFFh -mov cx,1 -call writesector -jne error - -mov ah,09 -mov dx,offset systfile2 -int 21h -jc error -mov cx,13 -mov bx,offset entrie -call writesector -jne error - -mov ah,09 -mov dx,offset systfile3 -int 21h -jc error - -mov ax,3D00h -mov dx,offset namesystem -int 21h -jc error -mov bx,ax -mov ax,4202h -xor cx,cx -xor dx,dx -int 21h -jc error -cmp dx,0 -jne error -sub ax,1 ;+512 -cmp ax,0 -jl error -shr ax,9 -inc ax -mov bp,ax -mov ax,4200h -xor cx,cx -xor dx,dx -int 21h -jc error -mov ah,3fh -mov cx,0FFFFh -mov dx,offset buffer -int 21h -jc error -mov bx,dx -mov cx,32 -syst: -call writesector -jne error -add bx,512 -inc cx -dec bp -jnz syst - - - - - - - -mov ah,09 -mov dx,offset ok -int 21h -jc error -ret -error: -mov ah,09 -mov dx,offset errormsg -int 21h -ret - - - - - - - -WriteSector: -push cx dx si - mov AX, CX - xor DX, DX - div DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor DX, DX - div DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 3 - int 13h - jnc Done - dec SI - jnz TryAgain -Done: - mov cl, AH - mov ah,9 - mov dx,offset sign - int 21h - cmp cl,0 - pop si dx cx -ret - -sign db '.$' -buffer db 512 dup (0) - -end start diff --git a/exe2boot.asm b/exe2boot.asm index 37c3399..2849930 100755 --- a/exe2boot.asm +++ b/exe2boot.asm @@ -33,7 +33,7 @@ cmp dx,0 jne error mov ax,4200h xor cx,cx -mov dx,512 +mov dx,7E00h int 21h jc error mov ah,3fh diff --git a/id.asm b/id.asm index b748b79..1f568f3 100755 --- a/id.asm +++ b/id.asm @@ -17,15 +17,15 @@ zoomout equ 43h start: - ;mov ax,cs - - mov ax,01000h - mov ds,ax - mov es,ax - mov gs,ax + xor eax,eax + xor ebx,ebx + xor ecx,ecx + xor edx,edx + xor esi,esi + xor edi,edi mov ax,13h - int 10h - + int 10h + mov dx,3C8h mov al,7 out dx,al @@ -40,7 +40,7 @@ start: mov ds,ax push ds push es - push gs + push cs mov di,logo2coord mov cx,logo2coordsize xor si,si @@ -57,7 +57,7 @@ loopcoord2: mov ax,bx sub ax,14h stosw - inc gs:nblogo2 + inc cs:nblogo2 nothingcoord2: add dx,3 cmp dx,0BAh @@ -91,7 +91,7 @@ loopcoord: shl ax,1 sub ax,1Eh stosw - inc gs:nblogo + inc cs:nblogo nothingcoord: inc dx inc dx @@ -105,7 +105,7 @@ loc_6: push ds pop es - push gs + push cs pop ds masterloop: inc logox ;++++ diff --git a/mem.asm b/mem.asm new file mode 100755 index 0000000..75eceef --- /dev/null +++ b/mem.asm @@ -0,0 +1,694 @@ +.model tiny +.386c +.code +org 0100h + + +start: + push ss + push gs + push fs + push es + push ds + push cs + pushad + pushfd + ;cli + ;mov dx,21h + ;mov al,0FFh + ;out dx,al + ;mov dx,0A1h + ;mov al,0FFh + ;out dx,al + push cs + pop es + mov ax,3 + int 10h +;mov ax,1100h +;mov bx,2000h ;1000H +;mov cx,0080h ;100h +;xor dx,dx +;mov bp,offset buffer +;int 10h + call savescreen + call clear + mov colors,4 + mov si,offset reg + call showstring0 + call line + mov colors,7 + mov si,offset fla + call showstring0 + pop edx + mov cx,32 + call showbinrow + call space + call showhexrow + mov si,offset regs + mov ax,8+6 + mov colors,6 +showall: + call line + cmp ax,7 + jb nodr + pop edx + jmp popo + nodr: + mov colors,8 + xor edx,edx + pop dx + popo: + call showstring0 + call showhexrow + call space + push si + mov si,offset gr + call showstring0 + call showint + mov si,offset dr + call showstring0 + pop si + add si,5 + dec ax + jnz showall + ;mov dx,21h + ;mov al,0 + ;out dx,al + ;mov dx,0A1h + ;mov al,0 + ;out dx,al + ;sti + mov ax,0 + int 16h + mov ax,0305h + mov bx,0008h + int 16h + xor ax,ax + mov fs,ax + xor edx,edx + mov ax,0B800h + mov es,ax + xor ebp,ebp +Adres: + call clear + mov xy,0 + mov x,0 + mov y,0 + mov ah,24 + mov ebx,ebp +lines: + mov colors,7 + mov edx,ebx + shr edx,4*4 + shl edx,4*3 + mov cx,16 + call showhexrow + mov si,offset dep + call showstring0 + mov dx,bx + mov cx,16 + call showhexrow + mov si,offset spaces + call showstring0 + mov al,16 + mov edi,ebx + mov cx,8 + mov colors,7 +doaline: + mov edx,ebx + shr edx,4*4 + shl edx,4*3 + mov fs,dx + mov dl,fs:[bx] + call showhexrow + call space + inc ebx + dec al + jnz doaline + mov si,offset spaces + call showstring0 + mov al,16 + mov colors,7 +doaline2: + mov edx,edi + shr edx,4*4 + shl edx,4*3 + mov fs,dx + mov dl,fs:[di] + call showchar + inc edi + dec al + jnz doaline2 + call line + dec ah + jnz lines + mov colors,112 + mov si,offset menu + call showstring0 + mov bx,bp + waitkey: + mov ax,0 + int 16h + cmp ax,3B00h + jne suit + inc ebp + jmp adres + suit: + cmp ax,3C00h + jne suit2 + dec ebp + jmp adres + suit2: + cmp ax,3D00h + jne suit3 + add ebp,24*16 + jmp adres + suit3: + cmp ax,3E00h + jne suit4 + sub ebp,24*16 + jmp adres + suit4: + cmp ax,3F00h + jne suit5 + add ebp,010000h + jmp adres + suit5: + cmp ax,4000h + jne suit6 + sub ebp,010000h + jmp adres + suit6: + cmp ax,4100h + jne suit7 + mov dword ptr [pope],'TIDE' + mov ax,24 + call setxy + mov colors,116 + mov si,offset menu + call showstring0 + mov colors,7 + mov xxyy2,1 + mov xxyy,1 + call calc1 + call calc2 +waitst: + mov ax,0 + int 16h + cmp ah,41h + jne tre + mov dword ptr [pope],' EUV' + jmp adres +tre: + cmp al,0 + jne write + cmp ah,48h + jne tre1 + cmp yy,0 + je waitst + dec yy + jmp cursor +tre1: + cmp ah,50h + jne tre2 + cmp yy,23 + je waitst + inc yy + jmp cursor +tre2: + cmp ah,4Dh + jne tre4 + cmp xx,15 + je waitst + inc xx + jmp cursor +tre4: + cmp ah,4Bh + jne waitst + cmp xx,0 + je waitst + dec xx + jmp cursor +write: + call AsciiHex2dec + cmp cl,15 + ja waitst + call calc1 + call calc2 + mov edi,es:[bx-1] + mov dx,es:[si-1] + mov byte ptr es:[bx],0112 + mov es:[bx-1],al +writs: + mov ax,0 + int 16H + mov ch,cl + call AsciiHex2dec + cmp cl,15 + ja writs + shl ch,4 + add ch,cl + mov es:[bx+1],al + mov es:[si-1],ch + mov ax,bx + call calc3 + mov gs:[bx],ch + pusha + popa + mov cl,gs:[bx] + cmp ch,cl + je no + push si ax + mov ax,24 + call setxy + mov colors,117 + mov si,offset msg + call showstring0 + mov ax,0 + int 16h + mov ax,24 + call setxy + mov colors,116 + mov si,offset menu + call showstring0 + pop bx si + mov es:[bx-1],edi + mov es:[si-1],dx + no: + inc xx + cmp xx,16 + jne pasde + inc yy + mov xx,0h + pasde: + call calc1 + call calc2 + jmp waitst + +cursor: + call calc1 + call calc2 + jmp waitst + suit7: + cmp ax,4200h + jne waitkey + call restorescreen + db 0CBH + +calc1: + push ax dx si + mov ax,xx + mov dx,xx + shl ax,2 + shl dx,1 + add ax,dx + add ax,25 + mov bx,YY + mov dx,yy + shl bx,5 + shl dx,7 + add bx,dx + add bx,ax + mov byte ptr es:[bx],112 + mov byte ptr es:[bx+2],112 + mov si,xxyy + mov byte ptr es:[si],07 + mov byte ptr es:[si+2],07 + mov xxyy,bx + pop si dx ax + ret + +calc2: + push ax bx dx + mov si,YY + mov dx,yy + shl si,5 + shl dx,7 + add si,dx + mov dx,xx + shl dx,1 + add si,dx + add si,127 + mov byte ptr es:[si],112 + mov bx,xxyy2 + mov byte ptr es:[bx],07 + mov xxyy2,si + pop dx bx ax + ret + +calc3: + push dx + xor ebx,ebx + mov bx,xx + mov dx,yy + shl dx,4 + add bx,dx + add ebx,ebp + mov edx,ebx + shr edx,4*4 + shl edx,4*3 + mov gs,dx + pop dx + ret + + asciihex2dec: + cmp al,'a' + jb nomin + cmp al,'f' + ja nomin + sub al,'a'-'A' + jmp ismaj + nomin: + cmp al,'A' + jb nomaj + cmp al,'F' + ja nomaj + ismaj: + mov cl,al + sub cl,'A'-10 + jmp endt + nomaj: + mov cl,al + sub cl,'0' + endt: + ret + +xx dw 0 +yy dw 0 +xxyy dw 0 +xxyy2 dw 0 +msg db 'Erreur : zone imodifiable (ROM) appuyer sur une touche ',0 +menu db 'Haut F1, Bas F2, Pages F3&F4, Segment F5&F6, Edit F7, Quitter F8 MODE ' +pope db 'VUE ',0 +spaces db ' ³ ',0 +dep db ':',0 +reg db 'Etats des registre apr‚s boot',0 +fla db 'Flags:',0 +regs db 'EDI:',0 + db 'ESI:',0 + db 'EBP:',0 + db 'ESP:',0 + db 'EBX:',0 + db 'EDX:',0 + db 'ECX:',0 + db 'EAX:',0 + db ' CS:',0 + db ' DS:',0 + db ' ES:',0 + db ' FS:',0 + db ' GS:',0 + db ' SS:',0 +cxk dw 0 +edxk dd 0 +dsk dw 0 +sik dw 0 +gr db '(',0 +dr db ')',0 + + + + +xy dw 0 +colors db 7 +x db 1 +y Db 1 + +;==========SHOWCHAR=========== +;met un caractŠre apr‚s le curseur +;-> dl +;<- +;============================= +showchar: +push dx bx es +mov bx,0B800h +mov es,bx +mov bx,cs:xy +mov dh,cs:colors +mov es:[bx],dx +add cs:xy,2 +pop es bx dx +ret + + + +;==========SPACE=========== +;met un espace apr‚s le curseur +;-> +;<- +;============================= +space: +push bx es +add cs:xy,2 +mov bx,0B800h +mov es,bx +mov bx,cs:xy +mov byte ptr es:[bx],' ' +pop es bx +ret + +;==============================Affiche le nombre nb binaire en EDX============== +ShowbinRow: + push es ax bx cx di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors +binaize: + rol edx,1 + mov cl,'0' + adc cl,0 + mov es:[di],cx + add di,2 + dec al + jnz binaize + mov cs:xy,di + pop di cx bx ax es + ret + +;==========SETCOLOR========= +;Change les attributs du texte a CL +;-> CL +;<- +;============================= +setcolor: +mov cs:colors,CL +ret + + + +;=============CLEAR========= +;Efface l'ecran texte +;-> +;<- +;============================= +clear: +push es eax cx di +xor di,di +mov ax,0b800h +mov es,ax +mov eax,07200720h +mov cx,1000 +cld +rep stosd +pop di cx eax es +ret + + +;==========SCROLLDOWN========= +;defile de cx lines vers le bas +;-> CX +;<- +;============================= +scrolldown: +push cx si di ds es +mov si,0B800h +mov es,si +mov ds,si +mov si,cx +shl si,5 +shl cx,7 +add si,cx +mov cx,4000 +sub cx,si +xor di,di +cld +rep movsb +pop es ds di si cx +ret + +;==========LINE========= +;remet le curseur a la ligne +;-> +;<- +;============================= +line: +push ax cx di es +mov ah,cs:x +mov al,cs:y +xor ah,ah +cmp al,24 +jne scro +dec al +mov cl,1 +call scrolldown +scro: +inc al +call setxy +pop es di cx ax +ret + +;==========SETXY========= +;Change les coordonnées du curseur a X:AL,Y:AH +;-> AX +;<- es di +;============================= +setxy: +push ax bx di +mov cs:x,ah +mov cs:y,al +mov bl,ah +xor bh,bh +xor ah,ah +mov di,ax +shl di,5 +shl ax,7 +shl bx,1 +add di,ax +add di,bx +mov cs:xy,di +mov ax,0B800h +mov es,ax +pop di bx ax +ret + +;================Affiche la chaine 0 de caractŠre contenue dans ds:si +showstring0: + push es cx si di + mov di,cs:xy + mov cx,0B800h + mov es,cx + mov ch,cs:colors +strinaize0: + mov cl,[si] + cmp cl,0 + je no0 + mov es:[di],cx + add di,2 + inc si + jmp strinaize0 + no0: + mov cs:xy,di + pop di si cx es + ret + +;==============================Affiche le nombre nb hexa en EDX============== +ShowHexRow: + push es ax bx cx di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors + shr ax,2 +Hexaize: + rol edx,4 + mov bx,dx + and bx,0fh + mov cl,cs:[bx+offset Tab] + mov es:[di],cx + add di,2 + dec al + jnz Hexaize + mov cs:xy,di + pop di cx bx ax es + ret +Tab db '0123456789ABCDEF' +ret + + +;===================================sauve l'ecran rapidement================ +SaveScreen: + push cx si di ds es + mov cx,0B800H + mov ds,cx + push cs + pop es + mov cx,(80*25*2)/4 + xor si,si + mov di,offset Copy2 + cld + rep movsd + pop es ds di si cx + ret + + +;===================================sauve l'ecran rapidement================ +RestoreScreen: + push cx si di ds es + mov cx,0B800H + mov es,cx + push cs + pop ds + mov cx,(80*25*2)/4 + mov si,offset Copy2 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + +;===================================Afficher un int EDX a l'‚cran en ah,al================ +ShowInt: + push eax bx cx edx esi di es ds + mov di,cs:xy + mov cx,0B800h + mov es,cx + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint3: + xor edx,edx + div esi + add dl,'0' + mov dh,cs:colors + sub bx,2 + add cx,2 + mov cs:[bx],dx + cmp ax,0 + jne decint3 + mov si,bx + push cs + pop ds + cld + rep movsb + mov cs:xy,di + pop ds es di esi edx cx bx eax +ret + + + +showbuffer db 35 dup (0FFh) + +copy2 db 4000 dup (0) + +buffer db 0 + + +end start + + + + + + + + + diff --git a/sect.asm b/sect.asm new file mode 100755 index 0000000..6f55d07 --- /dev/null +++ b/sect.asm @@ -0,0 +1,660 @@ +.model tiny +.386c +.code +org 0100h + + +start: + mov ax,0305h + mov bx,0008h + int 16h +;mov ax,1100h +;mov bx,1000h ;2000H +;mov cx,0100h ;80h +;xor dx,dx +;mov bp,offset copy2 +;int 10h + call savescreen + xor bp,bp +Adres: + push cs + pop es + mov cx,sect + mov bx,offset buffer + call readsector + jnc noerror + errtr: + mov ax,24 + call setxy + mov colors,116 + mov si,offset errordisk + call showstring0 + mov ax,0 + int 16h + noerror: + adres2: + mov bx,offset buffer + call clear + mov ax,0 + call setxy + mov ah,24 + mov di,bp + mov colors,7 +lines: + mov dx,sect + mov cx,16 + call showhexrow + mov si,offset dep + call showstring0 + mov dx,di + call showhexrow + mov si,offset spaces + call showstring0 + mov al,16 + mov cx,8 + mov colors,7 + mov si,di +doaline: + mov dl,[di+bx] + call showhexrow + call space + inc di + dec al + jnz doaline + mov di,si + mov si,offset spaces + call showstring0 + mov al,16 + mov colors,7 +doaline2: + mov dl,[di+bx] + call showchar + inc di + dec al + jnz doaline2 + call line + dec ah + jnz lines + mov colors,112 + mov si,offset menu + call showstring0 + mov bx,bp + waitkey: + mov ax,0 + int 16h + cmp ax,3B00h + jne suit + cmp bx,8*16 + jae waitkey + add bp,16 + jmp adres2 + suit: + cmp ax,3C00h + jne suit2 + cmp bp,0 + je waitkey + sub bp,16 + jmp adres2 + suit2: + cmp ax,3D00h + jne suit3 + cmp sect,2880 + ja waitkey + inc sect + jmp adres + suit3: + cmp ax,3E00h + jne suit4 + cmp sect,0 + je waitkey + dec sect + jmp adres + suit4: + cmp ax,3F00h + jne suit5 + jmp adres2 + suit5: + cmp ax,4000h + jne suit6 + mov cx,sect + mov bx,offset buffer + call writesector + jnc waitkey + jmp errtr + suit6: + cmp ax,4100h + jne suit7 + mov dword ptr [pope],'TIDE' + mov ax,24 + call setxy + mov colors,116 + mov si,offset menu + call showstring0 + mov colors,7 + mov ax,0B800h + mov es,ax + mov xxyy2,3 + mov xxyy,3 + call calc1 + call calc2 +waitst: + mov ax,0 + int 16h + cmp ah,41h + jne tre + mov dword ptr [pope],' EUV' + push cs + pop es + mov cx,sect + mov bx,offset buffer + call writesector + jnc adres + jmp errtr +tre: + cmp al,0 + jne write + cmp ah,48h + jne tre1 + cmp yy,0 + je waitst + dec yy + jmp cursor +tre1: + cmp ah,50h + jne tre2 + cmp yy,23 + je waitst + inc yy + jmp cursor +tre2: + cmp ah,4Dh + jne tre4 + cmp xx,15 + je waitst + inc xx + jmp cursor +tre4: + cmp ah,4Bh + jne waitst + cmp xx,0 + je waitst + dec xx + jmp cursor +write: + call AsciiHex2dec + cmp cl,15 + ja waitst + call calc1 + call calc2 + mov byte ptr es:[bx],0112 + mov es:[bx-1],al +writs: + mov ax,0 + int 16H + mov ch,cl + call AsciiHex2dec + cmp cl,15 + ja writs + shl ch,4 + add ch,cl + mov es:[bx+1],al + mov es:[si-1],ch + mov ax,bx + call calc3 + mov [bx],ch + inc xx + cmp xx,16 + jne pasde + inc yy + mov xx,0h + pasde: + call calc1 + call calc2 + jmp waitst + +cursor: + call calc1 + call calc2 + jmp waitst + suit7: + cmp ax,4200h + jne waitkey + call restorescreen + ret + +calc1: + push ax dx si + mov ax,xx + mov dx,xx + shl ax,2 + shl dx,1 + add ax,dx + add ax,25 + mov bx,YY + mov dx,yy + shl bx,5 + shl dx,7 + add bx,dx + add bx,ax + mov byte ptr es:[bx],112 + mov byte ptr es:[bx+2],112 + mov si,xxyy + mov byte ptr es:[si],07 + mov byte ptr es:[si+2],07 + mov xxyy,bx + pop si dx ax + ret + +calc2: + push ax bx dx + mov si,YY + mov dx,yy + shl si,5 + shl dx,7 + add si,dx + mov dx,xx + shl dx,1 + add si,dx + add si,127 + mov byte ptr es:[si],112 + mov bx,xxyy2 + mov byte ptr es:[bx],07 + mov xxyy2,si + pop dx bx ax + ret + +calc3: + push dx + xor bx,bx + mov bx,xx + mov dx,yy + shl dx,4 + add bx,dx + add bx,bp + add bx,offset buffer + pop dx + ret + + asciihex2dec: + cmp al,'a' + jb nomin + cmp al,'f' + ja nomin + sub al,'a'-'A' + jmp ismaj + nomin: + cmp al,'A' + jb nomaj + cmp al,'F' + ja nomaj + ismaj: + mov cl,al + sub cl,'A'-10 + jmp endt + nomaj: + mov cl,al + sub cl,'0' + endt: + ret + +dep db ':',0 +sect dw 0 +xx dw 0 +yy dw 0 +xxyy dw 3 +xxyy2 dw 3 +errordisk db 'Une erreur est survenu sur le lecteur A:, appuyer sur une touche ',0 +menu db 'Haut F1, Bas F2, Secteurs F3&F4, Load/Save F4&F5, Edit F7, Quitter F8 MODE ' +pope db 'VUE ',0 +spaces db ' ³ ',0 +xy dw 0 +colors db 7 +x db 1 +y Db 1 + +;==========SHOWCHAR=========== +;met un caractŠre apr‚s le curseur +;-> dl +;<- +;============================= +showchar: +push dx bx es +mov bx,0B800h +mov es,bx +mov bx,cs:xy +mov dh,cs:colors +mov es:[bx],dx +add cs:xy,2 +pop es bx dx +ret + + + +;==========SPACE=========== +;met un espace apr‚s le curseur +;-> +;<- +;============================= +space: +push bx es +add cs:xy,2 +mov bx,0B800h +mov es,bx +mov bx,cs:xy +mov byte ptr es:[bx],' ' +pop es bx +ret + +;==============================Affiche le nombre nb binaire en EDX============== +ShowbinRow: + push es ax bx cx di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors +binaize: + rol edx,1 + mov cl,'0' + adc cl,0 + mov es:[di],cx + add di,2 + dec al + jnz binaize + mov cs:xy,di + pop di cx bx ax es + ret + +;==========SETCOLOR========= +;Change les attributs du texte a CL +;-> CL +;<- +;============================= +setcolor: +mov cs:colors,CL +ret + +;=============CLEAR========= +;Efface l'ecran texte +;-> +;<- +;============================= +clear: +push es eax cx di +xor di,di +mov ax,0b800h +mov es,ax +mov eax,07200720h +mov cx,1000 +cld +rep stosd +pop di cx eax es +ret + +;==========SCROLLDOWN========= +;defile de cx lines vers le bas +;-> CX +;<- +;============================= +scrolldown: +push cx si di ds es +mov si,0B800h +mov es,si +mov ds,si +mov si,cx +shl si,5 +shl cx,7 +add si,cx +mov cx,4000 +sub cx,si +xor di,di +cld +rep movsb +pop es ds di si cx +ret + +;==========LINE========= +;remet le curseur a la ligne +;-> +;<- +;============================= +line: +push ax cx di es +mov ah,cs:x +mov al,cs:y +xor ah,ah +cmp al,24 +jne scro +dec al +mov cl,1 +call scrolldown +scro: +inc al +call setxy +pop es di cx ax +ret + +;==========SETXY========= +;Change les coordonnées du curseur a X:AL,Y:AH +;-> AX +;<- es di +;============================= +setxy: +push ax bx di +mov cs:x,ah +mov cs:y,al +mov bl,ah +xor bh,bh +xor ah,ah +mov di,ax +shl di,5 +shl ax,7 +shl bx,1 +add di,ax +add di,bx +mov cs:xy,di +pop di bx ax +ret + +;================Affiche la chaine 0 de caractŠre contenue dans ds:si +showstring0: + push es cx si di + mov di,cs:xy + mov cx,0B800h + mov es,cx + mov ch,cs:colors +strinaize0: + mov cl,[si] + cmp cl,0 + je no0 + mov es:[di],cx + add di,2 + inc si + jmp strinaize0 + no0: + mov cs:xy,di + pop di si cx es + ret + +;==============================Affiche le nombre nb hexa en EDX============== +ShowHexRow: + push es ax bx cx di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors + shr ax,2 +Hexaize: + rol edx,4 + mov bx,dx + and bx,0fh + mov cl,cs:[bx+offset Tab] + mov es:[di],cx + add di,2 + dec al + jnz Hexaize + mov cs:xy,di + pop di cx bx ax es + ret +Tab db '0123456789ABCDEF' +ret + +;===================================sauve l'ecran rapidement================ +SaveScreen: + push cx si di ds es + mov cx,0B800H + mov ds,cx + push cs + pop es + mov cx,(80*25*2)/4 + xor si,si + mov di,offset Copy2 + cld + rep movsd + pop es ds di si cx + ret + + +;===================================sauve l'ecran rapidement================ +RestoreScreen: + push cx si di ds es + mov cx,0B800H + mov es,cx + push cs + pop ds + mov cx,(80*25*2)/4 + mov si,offset Copy2 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + +;===================================Afficher un int EDX a l'‚cran en ah,al================ +ShowInt: + push eax bx cx edx esi di es ds + mov di,cs:xy + mov cx,0B800h + mov es,cx + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint3: + xor edx,edx + div esi + add dl,'0' + mov dh,cs:colors + sub bx,2 + add cx,2 + mov cs:[bx],dx + cmp ax,0 + jne decint3 + mov si,bx + push cs + pop ds + cld + rep movsb + mov cs:xy,di + pop ds es di esi edx cx bx eax +ret + +showbuffer db 35 dup (0FFh) +Lastread dw 0FFFFh + +ReadSector: +push ax cx dx si + cmp cx,cs:lastread + je done + mov cs:LastRead,cx + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor dX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +mov word ptr cs:lastread,0ffffh +Done: + pop si dx cx ax +ret + +WriteSector: +push ax cx dx si + cmp cs:Lastread,cx + jne nodestruct + mov cs:Lastread,0ffffh + nodestruct: + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor DX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain2: + mov AL, 1 + mov DL, 0 + mov AH, 3 + int 13h + jnc Done2 + dec SI + jnz TryAgain2 +Done2: + pop si dx cx ax +ret + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 + +copy2 equ $ +buffer equ $+4000 + + +end start + + + + + + + + From 00571c6cc711b1fb03861bcfe379d38cf55d6a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sun, 4 Feb 2001 21:48:09 +0100 Subject: [PATCH 03/17] =?UTF-8?q?feat:=20ajout=20d'un=20pilote=20VGA=20et?= =?UTF-8?q?=20changement=20de=20police=20d=C3=A9s=20le=20d=C3=A9marrage.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asm.bat | 5 +- boot.asm | 2 +- choice.asm | 767 +++++++++++++++++++------------------------ cosinit.asm | 224 +++++++++++++ exe2boot.asm | 67 ---- id.asm | 367 --------------------- mem.asm | 87 ----- sect.asm | 393 +++++----------------- thin8x8.fnt | Bin 0 -> 2048 bytes vg2.asm | 895 +++++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 1550 insertions(+), 1257 deletions(-) create mode 100755 cosinit.asm delete mode 100755 exe2boot.asm delete mode 100755 id.asm create mode 100755 thin8x8.fnt create mode 100755 vg2.asm diff --git a/asm.bat b/asm.bat index c8bb1bc..9e704ec 100755 --- a/asm.bat +++ b/asm.bat @@ -1,7 +1,10 @@ @echo off del system.bin -copy id.com system.bin tasm boot.asm /t/x/m4 +tasm mem.asm /t/x/m4 +tasm choise.asm /t/x/m4 +tasm vg2.asm /t/x/m4 +tasm sect.asm /t/x/m4 tlink boot.obj /x del boot.obj exe2boot.com diff --git a/boot.asm b/boot.asm index a38e088..1418c6a 100755 --- a/boot.asm +++ b/boot.asm @@ -34,7 +34,7 @@ okloading db 'COS search system',0Dh,0ah,0 syst db 'Ok',0dh,0ah,0 dot db '.',0 carry db 0dh,0ah,0 -Sys db 'System file',0 +Sys db 'system ',0 sys2 db 'sys',0 errorboot: diff --git a/choice.asm b/choice.asm index d766dce..3034e24 100755 --- a/choice.asm +++ b/choice.asm @@ -5,32 +5,56 @@ smart org 0100h -start: + + +start: +mov cx,23 +mov bx,8400h +mov es,bx +mov bx,100h +call loadfatway +mov di,bx +mov bx,47h +call setint +ret +mov bx,9 +call getint +mov cs:int9seg,ds +mov cs:int9off,si +push cs +pop es +mov di,offset int9 +call setint +start2: push cs push cs pop ds pop es -call clear -mov ax,0 -call setxy -mov si,offset msg -call showstring0 -mov di,0 -mov al,112 -call changeattrib -call line -call line -mov si,offset mssg -call showstring0 -call line -mov si,offset msg2 -call showstring0 -call line +mov ah,21 +mov cl,7 +int 47h +mov ax,0002 +int 47h +mov ah,2 +int 47h +mov ah,25 +mov bx,0 +int 47h +mov ah,13 +mov si,offset msg1 +int 47h +mov ah,6 +int 47h +int 47h +mov ah,13 +mov si,offset prompt +int 47h +mov ah,6 +int 47h xor di,di mov bx,offset buffer mov cx,13 call readsector -jc fin2 xor bp,bp showall: cmp byte ptr [bx+di],0 @@ -39,117 +63,118 @@ mov al,[bx+di+12] mov byte ptr [bx+di+12],0 mov si,bx add si,di -call showstring0 +mov ah,13 +int 47h mov si,offset spaces -call showstring0 +int 47h mov [bx+di+12],al mov byte ptr [bx+di+12+5],0 mov si,bx add si,di add si,12 -call showstring0 -call line +int 47h +mov ah,6 +int 47h add di,32 inc bp jmp showall endof2: +mov xx,1 +mov xxold,2 call Select endof: mov ax,0 int 16h cmp ah,50h jne tre1 - cmp xxx,bp + cmp xx,bp je endof - inc xxx + inc xx call select jmp endof tre1: cmp ah,48h jne tre2 - cmp xxx,1 + cmp xx,1 je endof - dec xxx + dec xx call select jmp endof tre2: cmp al,0Dh - je fin2 jne tre3 - mov di,xxx + mov di,xx dec di shl di,5 mov cx,[di+bx+26] - call line - call line - mov si,offset msgg - call showstring0 - call executefat + mov ah,6 + int 47h + int 47h + mov ah,13 + mov si,offset msg2 + int 47h + call executefatway tre3: - cmp ah,3bh + cmp ah,59 jne endof -mov di,0 -mov cx,1 -mov al,7 -call changeattribword - mov si,offset popup - mov ax,0200h - call popupmenu -mov di,0 -mov cx,1 -mov al,112 -call changeattribword - jmp endof -fin2: -ret + mov lastread,0FFFFh + jmp start2 - -popup db 4,'&New' - db 5,'&Open' - db 1,'-' - db 7,'&Delete' - db 7,'R&ename' - db 5,'&Copy' - db 5,'&Link' - db 1,'-' - db 8,'&Restart' - db 10,'&Shut down' - db 1,'-' - db 12,'&About me...' - db 0 - db 070h ;couleur normale - db 07Fh ;couleur speciale - db 07h ;couleur select - -executefat: -push cs -mov bx,offset start -push bx -mov bx,6000h -mov es,bx -push bx -mov bx,0100h -push bx -mov si,offset dot +executefatway: + push cs + mov bx,offset start2 + push bx + mov bx,03000h + mov es,bx + push bx + mov bx,0100h + push bx + call loadfatway + push es + push es + push es + pop ds + pop fs + pop gs + push 7202h + popf + db 0CBh + +;cx entr‚e -> fatway chemin +getfatway: +push bx cx es +mov bx,offset fatway fatagain: +mov cs:[bx],cx +add bx,2 cmp cx,0FFF0h jae finishload -call readsector -jc fin2 -call showstring0 -add bx,sizec call getfat jnc fatagain -finishload: -push es -push es -push es -pop ds -pop fs -pop gs -push 7202h -popf -db 0CBh +finishload: +pop es cx bx +ret + +loadfatway: +push bx cx di +call getfatway +jc endload +mov di,offset fatway +mov si,offset dot +mov ah,13 +loadagain: +mov cx,cs:[di] +cmp cx,0FFF0h +jae endload +add di,2 +call readsector +jc endload +int 47h +add bx,cs:sizec +jmp loadagain +endload: +pop di cx bx +ret sizec dw 512 reserv dw 1 @@ -159,9 +184,9 @@ getfat: push es ax bx dx mov ax,cx xor dx,dx -div sizec +div cs:sizec mov cx,ax -add cx,reserv +add cx,cs:reserv mov bx,offset buffer push cs pop es @@ -169,7 +194,7 @@ call readsector jc errorgetfat shl dx,1 add bx,dx -mov cx,[bx] +mov cx,cs:[bx] errorgetfat: pop dx bx ax es ret @@ -179,342 +204,27 @@ Select: push ax di mov di,xxold mov al,7 -add di,3 -call changeattrib -mov ax,xxx +add di,2 +mov ah,32 +int 47h +mov ax,xx mov xxold,ax -mov di,xxx +mov di,xx +mov ah,32 mov al,112 -add di,3 -call changeattrib +add di,2 +int 47h pop di ax -ret - -;couleur al pour ligne di mot cx -Changeattribword: -push bp bx dx di es -mov dx,0B800h -mov es,dx -mov dx,di -shl dx,5 -shl di,7 -add di,dx -mov dx,80 -xor bp,bp -xor bx,bx -popp: -cmp byte ptr es:[di],' ' -je noway -cmp bx,1 -je noway2 -mov bx,1 -inc bp -cmp cx,bp -ja fint -jmp noway2 -noway: -xor bx,bx -noway2: -cmp bp,cx -jne noway3 -mov es:[di-1],al -noway3: -add di,2 -dec dx -jnz popp -fint: -pop es di dx bx bp -ret - - -;couleur al pour ligne di -changeattrib: -push dx di es -mov dx,0B800h -mov es,dx -mov dx,di -shl dx,5 -shl di,7 -add di,dx -mov cx,80 -inc di -popep: -mov es:[di],al -add di,2 -dec cx -jnz popep -pop es di dx -ret - -colors db 7 -xy dw 0 -x db 0 -y db 0 -xxx dw 1 -xxold dw 0 -msg db ' File Edition',0 -mssg db 'Cos 2000 menu loader release 1.0',0 -msg2 db '>',0 -spaces db ' ',0 -dot db '.',0 -msgg db 'Chargement du programme',0 - -;==========SHOWCHAR=========== -;met un caractŠre apr‚s le curseur -;-> dl -;<- -;============================= -showchar: -push dx bx es -mov bx,0B800h -mov es,bx -mov bx,cs:xy -mov dh,cs:colors -mov es:[bx],dx -add cs:xy,2 -pop es bx dx -ret - - - -;==========SPACE=========== -;met un espace apr‚s le curseur -;-> -;<- -;============================= -space: -push bx es -add cs:xy,2 -mov bx,0B800h -mov es,bx -mov bx,cs:xy -mov byte ptr es:[bx],' ' -pop es bx -ret - -;==============================Affiche le nombre nb binaire en EDX============== -ShowbinRow: - push es ax bx cx di - mov di,cs:xy - mov bx,0B800h - mov es,bx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors -binaize: - rol edx,1 - mov cl,'0' - adc cl,0 - mov es:[di],cx - add di,2 - dec al - jnz binaize - mov cs:xy,di - pop di cx bx ax es - ret - -;==========SETCOLOR========= -;Change les attributs du texte a CL -;-> CL -;<- -;============================= -setcolor: -mov cs:colors,CL -ret - -;=============CLEAR========= -;Efface l'ecran texte -;-> -;<- -;============================= -clear: -push es eax cx di -xor di,di -mov ax,0b800h -mov es,ax -mov eax,07200720h -mov cx,1000 -cld -rep stosd -pop di cx eax es -ret - -;==========SCROLLDOWN========= -;defile de cx lines vers le bas -;-> CX -;<- -;============================= -scrolldown: -push cx si di ds es -mov si,0B800h -mov es,si -mov ds,si -mov si,cx -shl si,5 -shl cx,7 -add si,cx -mov cx,4000 -sub cx,si -xor di,di -cld -rep movsb -pop es ds di si cx -ret - -;==========LINE========= -;remet le curseur a la ligne -;-> -;<- -;============================= -line: -push ax cx di es -mov ah,cs:x -mov al,cs:y -xor ah,ah -cmp al,24 -jne scro -dec al -mov cl,1 -call scrolldown -scro: -inc al -call setxy -pop es di cx ax -ret - -;==========SETXY========= -;Change les coordonnées du curseur a X:AL,Y:AH -;-> AX -;<- es di -;============================= -setxy: -push ax bx di -mov cs:x,ah -mov cs:y,al -mov bl,ah -xor bh,bh -xor ah,ah -mov di,ax -shl di,5 -shl ax,7 -shl bx,1 -add di,ax -add di,bx -mov cs:xy,di -pop di bx ax -ret - -;================Affiche la chaine 0 de caractŠre contenue dans ds:si -showstring0: - push es cx si di - mov di,cs:xy - mov cx,0B800h - mov es,cx - mov ch,cs:colors -strinaize0: - mov cl,[si] - cmp cl,0 - je no0 - mov es:[di],cx - add di,2 - inc si - jmp strinaize0 - no0: - mov cs:xy,di - pop di si cx es - ret - -;==============================Affiche le nombre nb hexa en EDX============== -ShowHexRow: - push es ax bx cx di - mov di,cs:xy - mov bx,0B800h - mov es,bx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors - shr ax,2 -Hexaize: - rol edx,4 - mov bx,dx - and bx,0fh - mov cl,cs:[bx+offset Tab] - mov es:[di],cx - add di,2 - dec al - jnz Hexaize - mov cs:xy,di - pop di cx bx ax es - ret -Tab db '0123456789ABCDEF' -ret - -;===================================sauve l'ecran rapidement================ -SaveScreen: - push cx si di ds es - mov cx,0B800H - mov ds,cx - push cs - pop es - mov cx,(80*25*2)/4 - xor si,si - mov di,offset Copy2 - cld - rep movsd - pop es ds di si cx - ret - - -;===================================sauve l'ecran rapidement================ -RestoreScreen: - push cx si di ds es - mov cx,0B800H - mov es,cx - push cs - pop ds - mov cx,(80*25*2)/4 - mov si,offset Copy2 - xor di,di - cld - rep movsd - pop es ds di si cx - ret - -;===================================Afficher un int EDX a l'‚cran en ah,al================ -ShowInt: - push eax bx cx edx esi di es ds - mov di,cs:xy - mov cx,0B800h - mov es,cx - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint3: - xor edx,edx - div esi - add dl,'0' - mov dh,cs:colors - sub bx,2 - add cx,2 - mov cs:[bx],dx - cmp ax,0 - jne decint3 - mov si,bx - push cs - pop ds - cld - rep movsb - mov cs:xy,di - pop ds es di esi edx cx bx eax ret -showbuffer db 35 dup (0FFh) -Lastread dw 0FFFFh +xx dw 1 +xxold dw 0 +msg1 db 'Cos 2000 menu loader release 1.0',0 +msg2 db 'Program loading',0 +prompt db '>',0 +spaces db ' ',0 +dot db '.',0 + ReadSector: push ax cx dx si @@ -550,9 +260,8 @@ TryAgain: mov word ptr cs:lastread,0ffffh Done: pop si dx cx ax -ret +ret -WriteSector: push ax cx dx si cmp cs:Lastread,cx jne nodestruct @@ -588,13 +297,213 @@ Done2: pop si dx cx ax ret -include menu.Asm +Lastread dw 0FFFFh +WriteSector: + + +;met es:di le handle de l'int bx +setint: +push ax bx ds +cli +shl bx,2 +xor ax,ax +mov ds,ax +mov ds:[bx],di +mov ds:[bx+2],es +pop ds bx ax +sti +ret + +;met ds:si le handle de l'int bx +getint: +push ax bx es +cli +shl bx,2 +xor ax,ax +mov es,ax +mov si,es:[bx] +mov ds,es:[bx+2] +pop es bx ax +sti +ret + +int9off dw 0 +int9seg dw 0 + +int9: + pushf + db 2eh,0ffh,1eh + dw int9off + cli + pusha + in al,60h + cmp cs:isstate,1 + jne nostate + cmp al,57 + jne nof12 + mov cs:isstate,0 + jmp noF12 + nostate: + cmp al,87 + jne NoF11 + push es + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov al,cs:infos+7 + inc al + and ax,11b + int 47h + pop es + + nof11: + cmp al,88 + jne NoF12 + mov ah,26 + int 47h + call showstate + mov cs:isstate,1 + sti + waitt: + cmp cs:isstate,0 + jne waitt + mov ah,27 + int 47h + noF12: + popa + sti + iret + isstate db 0 + infos db 10 dup (0) + + showstate: + push ds es + push ss + push gs + push fs + push es + push ds + push cs + pushad + pushfd + + push cs + push cs + pop es + pop ds + mov ah,2 + int 47h + mov ah,21 + mov cl,4 + int 47h + mov ah,13 + mov si,offset reg + int 47h + mov ah,6 + int 47h + mov ah,21 + mov cl,7 + int 47h + mov ah,13 + mov si,offset fla + int 47h + pop edx + mov cx,32 + mov ah,11 + int 47h + mov ah,5 + int 47h + mov ah,10 + int 47h + mov si,offset regs + mov bx,8+6 + mov ah,21 + mov cl,6 + int 47h +showallREG: + mov ah,6 + int 47h + cmp bx,7 + jb nodr + pop edx + jmp popo + nodr: + mov ah,21 + mov cl,1 + int 47h + xor edx,edx + pop dx + popo: + mov ah,13 + int 47h + mov ah,10 + mov cx,32 + int 47h + mov ah,5 + int 47h + push si + mov si,offset gr + mov ah,13 + int 47h + mov ah,8 + int 47h + mov si,offset dr + mov ah,13 + int 47h + pop si + add si,5 + dec bx + jnz showallreg + mov ah,34 + mov di,offset infos + int 47h + mov ah,25 + mov bl,cs:infos + xor bh,bh + dec bl + int 47h + mov si,offset app + mov ah,13 + int 47h + mov ah,32 + mov bl,cs:infos + xor bh,bh + mov di,ax + dec di + mov cl,116 + int 47h + pop es ds + ret + +reg db 'State of registers',0 +fla db 'Flags:',0 +regs db 'EDI:',0 + db 'ESI:',0 + db 'EBP:',0 + db 'ESP:',0 + db 'EBX:',0 + db 'EDX:',0 + db 'ECX:',0 + db 'EAX:',0 + db ' CS:',0 + db ' DS:',0 + db ' ES:',0 + db ' FS:',0 + db ' GS:',0 + db ' SS:',0 +gr db '(',0 +dr db ')',0 +app db 'Press enter to quit...',0 + + DiskSectorsPerTrack dw 18 DiskTracksPerHead dw 80 DiskHeads dw 2 -copy2 equ $ -buffer equ $ +fatway equ $ +buffer equ $+3000 end start diff --git a/cosinit.asm b/cosinit.asm new file mode 100755 index 0000000..998bc4f --- /dev/null +++ b/cosinit.asm @@ -0,0 +1,224 @@ +.model tiny +.486 +smart +.code + +org 0100h + +ent equ 32h + +start: +jmp CopyCOS + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 +NameBoot db 'Boot.bin',0 +Namesystem db 'System.bin',0 +Message db 0Ah,0Dh,'Installation of the COS (Celyn Operating System) !!',0Ah,0Dh,'Written By Nico',0Ah,0Dh,'Copyright 2000',0Ah,0Dh,'Please insert a floppy disk and press a key...',0Ah,0Dh,'Be careful! All the disk is going to be deleted',0Ah,0dh,'$' +Message2 db 0Ah,0Dh,'Create boot sector$' +systfile db 0Ah,0Dh,'Creating file allocation table 16 bits$' +systfile2 db 0Ah,0Dh,'Creating file information table 32 bytes$' +systfile3 db 0Ah,0Dh,'Creating operating system files$' +Errormsg db 0Ah,0Dh,0Ah,0Dh,'An error has stopped the copying process !',0Ah,0Dh,'$' +Ok db 0Ah,0Dh,0Ah,0Dh,'The boot sector and the system files had been succefully copied.',0Ah,0Dh, 'To try COS reboot with this system disk',0Ah,0Dh,0Ah,0Dh,'$' + +entrie db 'System file',0 + db 'sys',0,0 + dw 1234h + dw 1234h + dw 1234h + dw 1234h + db 0h + dw ent + dw 512 + dw 0h + dw 0 + + +CopyCOS: +mov ah,09 +mov dx,offset message +int 21h +jc error +mov ax,0 +int 16h +mov ah,09 +mov dx,offset message2 +int 21h +mov ax,3D00h +mov dx,offset nameboot +int 21h +jc error +mov bx,ax +mov ax,4202h +xor cx,cx +xor dx,dx +int 21h +jc error +cmp dx,0 +jne error +cmp ax,512 +jne error +mov ax,4200h +xor cx,cx +xor dx,dx +int 21h +jc error +mov ah,3fh +mov cx,512 +mov dx,offset buffer +int 21h +jc error +mov ah,3eh +int 21h +jc error +mov cx,0 +mov bx,dx +call writesector +jne error +jc error +mov ah,09 +mov dx,offset systfile3 +int 21h +jc error +mov ax,3D00h +mov dx,offset namesystem +int 21h +jc error +mov bx,ax +mov ax,4202h +xor cx,cx +xor dx,dx +int 21h +jc error +cmp dx,0 +jne error +sub ax,1 ;+512 +cmp ax,0 +jl error +shr ax,9 +inc ax +mov bp,ax +mov ax,4200h +xor cx,cx +xor dx,dx +int 21h +jc error +mov ah,3fh +mov cx,0FFFFh +mov dx,offset buffer +int 21h +jc error +mov bx,dx +mov cx,ent +mov dx,bp +syst: +call writesector +jne error +add bx,512 +inc cx +dec dx +jnz syst +ret ;++++++++++++++++++= +mov ah,09 +mov dx,offset systfile +int 21h +mov cx,512/4 +mov di,bx +mov eax,0 +rep stosd +mov cx,13 +fatanymore: +call writesector +jne error +dec cx +cmp cx,1 +ja fatanymore +mov di,bx +mov ax,0FFF0h +mov cx,13 +rep stosw +mov ax,0FFFFh +stosw +mov si,ent +dec bp +makefat: +mov ax,si +inc ax +shl si,1 +mov [bx+si],ax +mov si,ax +dec bp +jnz makefat +shl si,1 +mov word ptr [bx+si],0ffffh +mov cx,1 +call writesector +jne error +mov ah,09 +mov dx,offset systfile2 +int 21h +jc error +mov cx,13 +mov bx,offset entrie +call writesector +jne error +mov ah,09 +mov dx,offset ok +int 21h +jc error +ret +error: +mov ah,09 +mov dx,offset errormsg +int 21h +ret + + + + + + + +WriteSector: +push cx dx si + mov AX, CX + xor DX, DX + div DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor DX, DX + div DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 3 + int 13h + jnc Done + dec SI + jnz TryAgain +Done: + mov cl, AH + mov ah,9 + mov dx,offset sign + int 21h + cmp cl,0 + pop si dx cx +ret + +sign db '.$' +buffer db 512 dup (0) + +end start diff --git a/exe2boot.asm b/exe2boot.asm deleted file mode 100755 index 2849930..0000000 --- a/exe2boot.asm +++ /dev/null @@ -1,67 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - - -start: -jmp transform -NameBoot db 'Boot.exe',0 -nameboot2 db 'Boot.bin',0 -buffer db 510 dup (0) - dw 0AA55h -message db 0ah,0dh,'Transformation of boot.com to boot.bin...',0ah,0dh,'By Horde Nicolas',0ah,0dh,'Copyright 2000',0ah,0dh,'$' -ok db 0ah,0dh,'The transformation was done succefully !',0ah,0dh,'$' -errormsg db 0ah,0dh,'Some errors has been detected !',0ah,0dh,'$' -transform: -mov ah,09 -mov dx,offset message -int 21h -mov ax,3D00h -mov dx,offset nameboot -int 21h -jc error -mov bx,ax -mov ax,4202h -xor cx,cx -xor dx,dx -int 21h -jc error -cmp dx,0 -jne error -mov ax,4200h -xor cx,cx -mov dx,7E00h -int 21h -jc error -mov ah,3fh -mov cx,512 -mov dx,offset buffer -int 21h -jc error -mov ah,3eh -int 21h -jc error -mov ah,3ch -xor cx,cx -mov dx,offset nameboot2 -int 21h -jc error -mov ah,40h -mov cx,512 -mov dx,offset buffer -int 21h -jc error -mov ah,09 -mov dx,offset ok -int 21h -ret -error: -mov ah,09 -mov dx,offset errormsg -int 21h -ret - -end start diff --git a/id.asm b/id.asm deleted file mode 100755 index 1f568f3..0000000 --- a/id.asm +++ /dev/null @@ -1,367 +0,0 @@ -.model tiny -.386c -.code -org 0100h - - colores equ 7 - - -logoY equ 064h -logo2X equ 0A0h -logo2Y equ 064h -ecartlogo2 equ 13Eh -logocoordsize equ 0B40h -logo2coordsize equ 26Ch -zoomout equ 43h - - - -start: - xor eax,eax - xor ebx,ebx - xor ecx,ecx - xor edx,edx - xor esi,esi - xor edi,edi - mov ax,13h - int 10h - - mov dx,3C8h - mov al,7 - out dx,al - inc dx - xor al,al - out dx,al - out dx,al - out dx,al - mov si,offset logo2text - call showstr - mov ax,0A000h - mov ds,ax - push ds - push es - push cs - mov di,logo2coord - mov cx,logo2coordsize - xor si,si - xor dx,dx - xor bx,bx - -loopcoord2: - lodsb - or al,al - jz nothingcoord2 - mov ax,dx - sub ax,5Ah - stosw - mov ax,bx - sub ax,14h - stosw - inc cs:nblogo2 -nothingcoord2: - add dx,3 - cmp dx,0BAh - jne short loc_3 - xor dx,dx - add si,102h - add bx,4 -loc_3: - loop loopcoord2 - - pop ds - call zerocurs - mov si,offset data6 - call showstr - - pop es - pop ds - mov cx,logocoordsize - xor si,si - xor dx,dx - xor bx,bx - -loopcoord: - lodsb - or al,al - jz nothingcoord - mov ax,dx - sub ax,32h - stosw - mov ax,bx - shl ax,1 - sub ax,1Eh - stosw - inc cs:nblogo -nothingcoord: - inc dx - inc dx - cmp dx,60h - jne short loc_6 - xor dx,dx - add si,110h - inc bx -loc_6: - loop loopcoord - - push ds - pop es - push cs - pop ds -masterloop: - inc logox ;++++ - inc data_10 - mov bl,data_10 - xor bh,bh - mov al,data_1[bx] - cbw - mov data_11,ax - add bl,zoomout - mov al,data_1[bx] - cbw - mov data_12,ax - mov cx,nblogo2 - push cx - push cx - mov si,logo2coord - -showlogo2: - lodsw - mov data_7,ax - lodsw - mov data_8,ax - mov data_9,0FFCEh - push cx - push si - mov si,offset data_8 - push si - mov di,offset data_9 - call sub_1 - mov si,offset data_7 - call sub_1 - pop di - call sub_1 - pop si - mov ax,100h - imul data_7 - mov bx,data_9 - add bx,140h - idiv bx - add ax,logo2X - mov bp,ax - mov ax,100h - imul data_8 - mov bx,data_9 - add bx,140h - idiv bx - add ax,logo2Y - mov bx,140h - imul bx - add ax,bp - mov di,ax - push si - sub si,logo2coord - shr si,1 - mov ds:data_16e[si],di - pop si - mov bx,data_9 - mov cl,4 - shr bx,cl - pop cx - mov al,17h - sub al,bl - mov ah,al - stosw - add di,ecartlogo2 - stosw - loop showlogo2 - - pop si - shl si,1 - shl si,1 - add si,logo2coord - mov cx,nblogo - -showlogo: - push cx - lodsw - imul data_12 - mov di,ax - lodsw - imul data_11 - sub di,ax - mov cl,7 - sar di,cl - add di,logoX - mov bx,di - sub si,4 - lodsw - imul data_11 - mov di,ax - lodsw - imul data_12 - add di,ax - sar di,cl - add di,logoy - mov ax,140h - imul di - add ax,bx - mov di,ax - pop cx - mov ax,cx - shl ax,1 - mov bx,data_17e - add bx,ax - mov [bx],di - mov al,28h - stosb - loop showlogo - - mov dx,3DAh - -synchro: - in al,dx - test al,8 - jnz synchro -synchroagain: - in al,dx - test al,8 - jz synchroagain - mov si,data_16e - pop cx - add cx,nblogo - add cx,14h - -showlogo2effect: - lodsw - mov di,ax - xor ax,ax - stosw - add di,ecartlogo2 - stosw - loop showlogo2effect - - in al,60h - cmp al,1 - je endofprog - jmp masterloop -endofprog: - mov ax,3 - int 10h - int 20h - ret - - -sub_1 proc near - mov ax,[si] - imul data_12 - mov bp,ax - mov ax,[di] - imul data_11 - sub bp,ax - mov cl,7 - sar bp,cl - push bp - mov ax,[si] - imul data_11 - mov bp,ax - mov ax,[di] - imul data_12 - add bp,ax - sar bp,cl - mov [di],bp - pop ax - mov [si],ax - retn -sub_1 endp - -showcrlf: - push ax bx - mov ax, 0E0Dh - xor bx, bx - int 10h - mov al, 0Ah - int 10h - pop bx ax -ret - -zerocurs: -push ax bx dx -mov ah,02h -mov bh,0 -mov dx,0 -int 10h -pop dx bx ax -ret - -showstr: - push ax bx si -again: - lodsb - or al,al - jz fin - cmp al,0Dh - jne noret - call showcrlf - jmp again -noret: - mov ah,0Eh - mov bx,colores - int 10h - jmp again - fin: - pop si bx ax - ret -logoX dw 0A0h ;++++ - - -data_1 db 0 - db 03h, 06h, 09h, 0Ch, 10h, 13h - db 16h, 19h, 1Ch, 1Fh - db '"%(+.1369 dl -;<- -;============================= -showchar: -push dx bx es -mov bx,0B800h -mov es,bx -mov bx,cs:xy -mov dh,cs:colors -mov es:[bx],dx -add cs:xy,2 -pop es bx dx -ret - - - -;==========SPACE=========== -;met un espace apr‚s le curseur -;-> -;<- -;============================= -space: -push bx es -add cs:xy,2 -mov bx,0B800h -mov es,bx -mov bx,cs:xy -mov byte ptr es:[bx],' ' -pop es bx -ret - -;==============================Affiche le nombre nb binaire en EDX============== -ShowbinRow: - push es ax bx cx di - mov di,cs:xy - mov bx,0B800h - mov es,bx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors -binaize: - rol edx,1 - mov cl,'0' - adc cl,0 - mov es:[di],cx - add di,2 - dec al - jnz binaize - mov cs:xy,di - pop di cx bx ax es - ret - -;==========SETCOLOR========= -;Change les attributs du texte a CL -;-> CL -;<- -;============================= -setcolor: -mov cs:colors,CL -ret - -;=============CLEAR========= -;Efface l'ecran texte -;-> -;<- -;============================= -clear: -push es eax cx di -xor di,di -mov ax,0b800h -mov es,ax -mov eax,07200720h -mov cx,1000 -cld -rep stosd -pop di cx eax es -ret - -;==========SCROLLDOWN========= -;defile de cx lines vers le bas -;-> CX -;<- -;============================= -scrolldown: -push cx si di ds es -mov si,0B800h -mov es,si -mov ds,si -mov si,cx -shl si,5 -shl cx,7 -add si,cx -mov cx,4000 -sub cx,si -xor di,di -cld -rep movsb -pop es ds di si cx -ret - -;==========LINE========= -;remet le curseur a la ligne -;-> -;<- -;============================= -line: -push ax cx di es -mov ah,cs:x -mov al,cs:y -xor ah,ah -cmp al,24 -jne scro -dec al -mov cl,1 -call scrolldown -scro: -inc al -call setxy -pop es di cx ax -ret - -;==========SETXY========= -;Change les coordonnées du curseur a X:AL,Y:AH -;-> AX -;<- es di -;============================= -setxy: -push ax bx di -mov cs:x,ah -mov cs:y,al -mov bl,ah -xor bh,bh -xor ah,ah -mov di,ax -shl di,5 -shl ax,7 -shl bx,1 -add di,ax -add di,bx -mov cs:xy,di -pop di bx ax -ret - -;================Affiche la chaine 0 de caractŠre contenue dans ds:si -showstring0: - push es cx si di - mov di,cs:xy - mov cx,0B800h - mov es,cx - mov ch,cs:colors -strinaize0: - mov cl,[si] - cmp cl,0 - je no0 - mov es:[di],cx - add di,2 - inc si - jmp strinaize0 - no0: - mov cs:xy,di - pop di si cx es - ret - -;==============================Affiche le nombre nb hexa en EDX============== -ShowHexRow: - push es ax bx cx di - mov di,cs:xy - mov bx,0B800h - mov es,bx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors - shr ax,2 -Hexaize: - rol edx,4 - mov bx,dx - and bx,0fh - mov cl,cs:[bx+offset Tab] - mov es:[di],cx - add di,2 - dec al - jnz Hexaize - mov cs:xy,di - pop di cx bx ax es - ret -Tab db '0123456789ABCDEF' -ret - -;===================================sauve l'ecran rapidement================ -SaveScreen: - push cx si di ds es - mov cx,0B800H - mov ds,cx - push cs - pop es - mov cx,(80*25*2)/4 - xor si,si - mov di,offset Copy2 - cld - rep movsd - pop es ds di si cx - ret - - -;===================================sauve l'ecran rapidement================ -RestoreScreen: - push cx si di ds es - mov cx,0B800H - mov es,cx - push cs - pop ds - mov cx,(80*25*2)/4 - mov si,offset Copy2 - xor di,di - cld - rep movsd - pop es ds di si cx - ret - -;===================================Afficher un int EDX a l'‚cran en ah,al================ -ShowInt: - push eax bx cx edx esi di es ds - mov di,cs:xy - mov cx,0B800h - mov es,cx - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint3: - xor edx,edx - div esi - add dl,'0' - mov dh,cs:colors - sub bx,2 - add cx,2 - mov cs:[bx],dx - cmp ax,0 - jne decint3 - mov si,bx - push cs - pop ds - cld - rep movsb - mov cs:xy,di - pop ds es di esi edx cx bx eax -ret showbuffer db 35 dup (0FFh) Lastread dw 0FFFFh @@ -644,8 +426,9 @@ ret DiskSectorsPerTrack dw 18 DiskTracksPerHead dw 80 DiskHeads dw 2 + +infos db 10 dup (0) -copy2 equ $ buffer equ $+4000 diff --git a/thin8x8.fnt b/thin8x8.fnt new file mode 100755 index 0000000000000000000000000000000000000000..9fd96cd50002a389cf5bb0856fb69fda77e5ac1c GIT binary patch literal 2048 zcmXw4KWO7t82{p$%L|x`I6A0JAP-{>Q3@xnH+T?=5JGnSLiK61Fm|quBZ?#(W+Zt)@zS8Y}n+<)fH1vsd%hHL8;(88#L6*P2?^{&N zPcJS`=f&pw=67kDhL-R9mLBQ5pX{1ukS&i7jt>sLd^bCNX@_MfO3v*K4OCR~to<;(=BuzOIuF0Y+JkRRfAlZ{?ZH zp3P<}sFq*&EoeBPS}t7C(Np5EkVB(UiM!n#PnTqP78seN#X^(LWI{pGm7gVFlP4WT zlujJSjwGoGAv8%Or$I1F=<0VnhLS82&f9H{~4c!(Hq-f)NlNMpb0A8|;sn9aXd*v!XVrdTA~=PzpX(=9wno*+1V%|M1kZqxO_7n z3ZFw1gX zkZ;Lpo{Er47#cVTH$j3u=4__arh%(uKquol#ax{BYF7(z(hy?fXbq^dzY6h zvb~vSi@HuO;kc$px}-3@n}wP|VWXcO!LGC^O6{7Z4%1m0YQi+#q2e=-{g}rZ*i=$! z4-3Nr7^dl6YP#^e8xD~#k27o-k^jN#`*!CC6&Lr1iVF>Y_@yE2T<8(7s#lfW zZ{!`~`SjW?Qa6W1V%spb1#LHFAe*nKW8mh(lO;d?HyC_R4}`EZ%_E*K&l6hJr{<45 z&?mVWhLvC z@Gy@-YR_K0cuKFDO{>!hqy2px89v~({?sr!6n$ap>S7ni)q!nxI^V?b!?zIiZVP*F zZ_g%bcRKw}$MWa%x!>{|n%HhOo7><~k1wjV4DFb?65h8~Cyy3R)MZkC+7PjT`uphr6~CGsGy1mw2AEumR# KC$b@B5AFXQ(OoS7 literal 0 HcmV?d00001 diff --git a/vg2.asm b/vg2.asm new file mode 100755 index 0000000..2e218b4 --- /dev/null +++ b/vg2.asm @@ -0,0 +1,895 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: + +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +sti +iret +current dw 0 +tables dw setvideomode + dw getvideomode + dw cleartext + dw changefont + dw loadfont + dw space + dw line + dw showchar + dw showint + dw showsigned + dw showhex + dw showbin + dw showstring + dw showstring0 + dw showcharat + dw showintat + dw showsignedat + dw showhexat + dw showbinat + dw showstringat + dw showstring0at + dw setcolor + dw getcolor + dw scrolldown + dw getxy + dw setxy2 + dw savescreen + dw restorescreen + dw page2to1 + dw page1to2 + dw xchgPages + dw savepage1 + dw changelineattr + dw waitretrace + dw getinfos + +;Change la police a CL +changefont: +push ax cx dx +mov ah,cl +and cl,11b +and ah,0100b +shl ah,2 +add ah,cl +mov dx,3C4h +mov al,3 +out dx,ax +pop dx cx ax +ret + +;met la police BL … ds:si taille dans CL +loadfont: +push ax bx cx dx si di es +xor di,di +mov dx,3C4h +cli +doseq: +mov ax,cs:[di+offset reg1] +out dx,ax +inc di +inc di +cmp di,6 +jbe doseq +mov dx,3CEh +doseq2: +mov ax,cs:[di+offset reg1] +out dx,ax +inc di +inc di +cmp di,6+6 +jbe doseq2 +sti +mov ax,0A000h +mov es,ax +mov dx,255 +mov al,0 +xor bh,bh +cmp bl,4 +jb isless +sub bl,4 +shl bl,1 +inc bl +jmp okmake +isless: +shl bl,1 +okmake: +mov di,bx +shl di,13 +mov bh,cl +mov bl,cl +sub bl,32 +neg bl +xor cx,cx +cld +popz: +mov cl,bh +rep movsb +mov cl,bl +rep stosb +dec dx +jnz popz +xor di,di +mov dx,3C4h +doseqs: +mov ax,cs:[di+offset reg2] +out dx,ax +inc di +inc di +cmp di,6 +jbe doseqs +mov dx,3CEh +doseqs2: +mov ax,cs:[di+offset reg2] +out dx,ax +inc di +inc di +cmp di,6+6 +jbe doseqs2 +pop es di si dx cx bx ax +ret +reg2 dw 0100h, 0302h, 0304h, 0300h + dw 0004h, 1005h, 0E06h +reg1 dw 0100h, 0402h, 0704h, 0300h + dw 0204h, 0005h, 0406h + +;40*25 16 couleurs +mode0 DB 63H,00H, 03H,09H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,01FH,00H,4FH,0DH,0EH,00H,00H,00H,00H + DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H + db 40,25 + +;80*25 16 couleurs +mode1 DB 67H,00H, 03H,00H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0DH,0EH,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H + db 80,25 + +;80*50 16 couleurs +mode2 DB 63H, 00H, 03H,01H,03H,01H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + db 80,50 + +;640*480 16 couleurs +mode3 DB 63H, 00H, 03H,01H,0FH,00H,0EH + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + db 00,00 + +;320*240 256 couleurs +mode4 DB 63H, 00H, 03H,01H,0FH,00H,0EH + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + db 00,00 + +;=============CLEAR========= +;Efface l'ecran texte +;-> +;<- +;============================= +cleartext: +push es eax cx di +xor di,di +mov ax,0b800h +mov es,ax +mov eax,07200720h +mov cx,cs:pagesize +shr cx,2 +cld +rep stosd +mov cs:xy,0 +mov cs:x,0 +mov cs:y,0 +pop di cx eax es +ret + +;=============CLEAR========= +;Efface l'ecran texte +;-> +;<- +;============================= +clearpixel: +push es eax cx di +xor di,di +mov ax,0A000h +mov es,ax +mov eax,0h +mov cx,cs:pagesize +shr cx,2 +cld +rep stosd +pop di cx eax es +ret + +Sequencer equ 03C4h +misc equ 03C2h +CCRT equ 03D4h +Attribs equ 03C0h +graphic equ 03CEh +statut equ 3DAh + +initmode: +push bx cx si ds +mov bl,1 +mov cl,8 +push cs +pop ds +mov si,offset special +call loadfont +pop ds si cx bx +ret + +;Renvoie le mode video dans al +getvideomode: +mov al,cs:mode +ret + +;====Met le mode video a al +setvideomode: +push ax dx di +cmp cs:mode,0FFh +jne noinit +call initmode +mov cs:pagesize,4000 +call cleartext +noinit: +mov cs:mode,al +xor ah,ah +mov di,ax +shl di,6 +add di,offset mode0 +mov dx,misc +mov al,cs:[di] +out dx,al +inc di +mov dx,statut +mov al,cs:[di] +out dx,al +inc di +mov dx,sequencer +xor ax,ax +initsequencer: +mov ah,cs:[di] +out dx,ax +inc al +inc di +cmp al,5 +jb initsequencer +mov ax,0E11h +mov dx,ccrt +out dx,ax +xor ax,ax +initcrt: +mov ah,cs:[di] +out dx,ax +inc al +inc di +cmp al,25 +jb initcrt +mov dx,graphic +xor ax,ax +initgraphic: +mov ah,cs:[di] +out dx,ax +inc al +inc di +cmp al,9 +jb initgraphic +mov dx,statut +in al,dx +mov dx,attribs +xor ax,ax +initattribs: +mov ah,cs:[di] +push ax +in ax,dx +pop ax +out dx,al +xchg ah,al +out dx,al +xchg ah,al +inc al +inc di +cmp al,21 +jb initattribs +mov al,cs:[di] +mov cs:columns,al +mov ah,cs:[di+1] +mov cs:lines,ah +mul ah +shl ax,1 +mov cs:pagesize,ax +mov al,20h +out dx,al +pop di dx ax +ret + +;==========SPACE=========== +;met un espace apr‚s le curseur +;-> +;<- +;============================= +space: +push bx es +add cs:xy,2 +mov bx,0B800h +mov es,bx +mov bx,cs:xy +mov byte ptr es:[bx],' ' +pop es bx +ret + +;==========SHOWCHAR=========== +;met un caractŠre apr‚s le curseur +;-> dl +;<- +;============================= +showchar: +push dx bx es +mov bx,0B800h +mov es,bx +mov bx,cs:xy +mov dh,cs:colors +mov es:[bx],dx +add cs:xy,2 +pop es bx dx +ret + +;==========SHOWCHARAT=========== +;met un caractŠre apr‚s le curseur coord ah,al +;-> dl ah al +;<- +;============================= +showcharat: +push es di +call setxy +call showchar +pop di es +ret + +;==========LINE========= +;remet le curseur a la ligne +;-> +;<- +;============================= +line: +push bx cx di es +mov bh,cs:x +mov bl,cs:y +xor bh,bh +mov cl,cs:lines +dec cl +cmp bl,cl +jne scro +dec bl +mov cl,1 +call scrolldown +scro: +inc bl +call setxy +pop es di cx bx +ret + +;==========SETCOLOR========= +;Change les attributs du texte a CL +;-> CL +;<- +;============================= +setcolor: +mov cs:colors,CL +ret + +;==========GETCOLOR========= +;R‚cupŠre les attributs du texte dans CL +;-> +;<- CL +;============================= +getcolor: +mov cl,cs:colors +ret + +updatecursor: +push ax dx di +mov dx,3D4h +mov al,0Eh +mov di,offset xy +mov ah,cs:[di] +out dx,ax +mov ah,cs:[di+1] +inc al +out dx,ax +pop di dx ax +ret + +;==========SCROLLDOWN========= +;defile de cx lines vers le bas +;-> CX +;<- +;============================= +scrolldown: +push ax cx dx si di ds es +mov si,0B800h +mov es,si +mov ds,si +mov ax,cx +mul cs:columns +shl ax,1 +mov si,ax +mov cx,cs:pagesize +sub cx,si +xor di,di +cld +rep movsb +pop es ds di si dx cx ax +ret + +;==========GETXY========= +;Change les coordonnées du curseur a X:AL,Y:AH +;-> AX +;<- +;============================= +getxy: +mov bh,cs:x +mov bl,cs:y +ret + +;==========SETXY========= +;Change les coordonnées du curseur a X:AH,Y:AL +;-> AX +;<- es di +;============================= +setxy: +push ax bx dx +mov cs:x,bh +mov cs:y,bl +mov al,bl +mov bl,bh +xor bh,bh +mov di,bx +mul cs:columns +shl ax,1 +add di,ax +mov cs:xy,di +mov ax,0B800h +mov es,ax +pop dx bx ax +ret + +setxy2: +push es di +call setxy +pop di es +ret + + +;===================================sauve l'ecran rapidement================ +SaveScreen: + push cx si di ds es + mov cx,0B800H + mov ds,cx + push cs + pop es + mov cx,cs:pagesize + shr cx,2 + xor si,si + mov di,offset Copy2 + cld + rep movsd + pop es ds di si cx + ret + +;===================================sauve l'ecran rapidement================ +Savepage1: + push cx si di ds es + mov cx,0B800H + mov ds,cx + push cs + pop es + mov cx,cs:pagesize + shr cx,2 + xor si,si + mov di,offset Copy + cld + rep movsd + pop es ds di si cx + ret + +;===================================sauve l'ecran rapidement================ +RestoreScreen: + push cx si di ds es + mov cx,0B800H + mov es,cx + push cs + pop ds + mov cx,cs:pagesize + shr cx,2 + mov si,offset Copy2 + xor di,di + cld + rep movsd + pop es ds di si cx + ret +copy2 db 4000 dup (0) +copy db 4000 dup (0) + +;===============================Page2to1============================ +Page2to1: + push cx si di ds es + mov cx,0B800H + mov es,cx + mov ds,cx + mov cx,cs:pagesize + shr cx,2 + mov si,4000 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + +;===============================Page1to2============================ +Page1to2: + push cx si di ds es + mov cx,0B800H + mov es,cx + mov ds,cx + mov cx,cs:pagesize + shr cx,2 + mov di,4000 + xor si,si + cld + rep movsd + pop ds es di si cx + ret + +;===============================xchgPages============================ +xchgPages: + push cx si di ds es + call savepage1 + call page2to1 + mov cx,0B800H + mov es,cx + push cs + pop ds + mov cx,cs:pagesize + shr cx,2 + mov si,offset Copy + mov di,4000 + rep movsd + pop es ds di si cx + ret + +;===================================Afficher un int EDX a l'‚cran en ah,al================ +ShowInt: + push eax bx cx edx esi di es ds + mov di,cs:xy + mov cx,0B800h + mov es,cx + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint3: + xor edx,edx + div esi + add dl,'0' + mov dh,cs:colors + sub bx,2 + add cx,2 + mov cs:[bx],dx + cmp ax,0 + jne decint3 + mov si,bx + push cs + pop ds + cld + rep movsb + mov cs:xy,di + pop ds es di esi edx cx bx eax +ret +showbuffer db 35 dup (0FFh) + +;===================================Afficher un int EDX a l'‚cran en ah,al================ +ShowIntat: +push es di + call setxy + call showint +pop di es +ret + +waitretrace: +push ax dx +mov dx,3DAh +waitr: +in al,dx +test al,8 +jz waitr +pop dx ax +ret + +nbexactbit: +push edx +xor cx,cx +viewnb: +inc cx +shr edx,1 +cmp edx,0 +jnz viewnb +pop edx +ret + +bittobyte: +push dx +adap: +mov dx,cx +and dx,3 +jz adapfin +add cx,1 +jmp adap +adapfin: +pop dx +ret + +Nbbit: +cmp edx,0FFh +jb ok1 +cmp edx,0FFFFh +jb ok2 +mov cx,32 +ret +ok1: +mov cx,8 +ret +ok2: +mov cx,16 +ret + +showhexat: +push es di + call setxy + call showhex +pop di es +ret + +showbinat: +push cx es di +call setxy +call showbin +pop di es cx +ret + +;==============================Affiche le nombre nb binaire en EDX============== +Showbin: + push es ax bx cx di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors +binaize: + rol edx,1 + mov cl,'0' + adc cl,0 + mov es:[di],cx + add di,2 + dec al + jnz binaize + mov cs:xy,di + pop di cx bx ax es + ret + +;==============================Affiche le nombre nb hexa en EDX============== +ShowHex: + push es ax bx cx di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors + shr ax,2 +Hexaize: + rol edx,4 + mov bx,dx + and bx,0fh + mov cl,cs:[bx+offset Tab] + mov es:[di],cx + add di,2 + dec al + jnz Hexaize + mov cs:xy,di + pop di cx bx ax es + ret +Tab db '0123456789ABCDEF' + +;===================================Afficher un int EDX a l'‚cran en ah,al================ +Showsigned: +push ax ebx edx es +xor ebx,ebx +mov bl,cl +bt edx,ebx +jnc pos +neg edx +mov ah,cs:colors +mov al,'-' +mov bx,0B800h +mov es,bx +mov bx,cs:xy +mov word ptr es:[bx],ax +add cs:xy,2 +pos: +call showint +pop es edx ebx ax +ret + +showsignedat: +push es di +call setxy +call showsigned +pop di es +ret + +;================Affiche la chaine de caractŠre contenue dans ds:si +showstring: + push es bx cx si di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov bl,[si] + mov ch,cs:colors +strinaize: + inc si + mov cl,[si] + mov es:[di],cx + add di,2 + dec bl + jnz strinaize + mov cs:xy,di + pop di si cx bx es + ret + +;================Affiche la chaine 0 de caractŠre contenue dans ds:si +showstring0: + push es cx si di + mov di,cs:xy + mov cx,0B800h + mov es,cx + mov ch,cs:colors +strinaize0: + mov cl,[si] + cmp cl,0 + je no0 + mov es:[di],cx + add di,2 + inc si + jmp strinaize0 + no0: + mov cs:xy,di + pop di si cx es + ret + + +showstringat: +push es di +call setxy +call showstring +pop di es +ret + +showstring0at: +push es di +call setxy +call showstring0 +pop di es +ret + +;couleur al pour ligne di +changelineattr: +push ax bx di es +mov bx,ax +mov ax,0B800h +mov es,ax +mov ax,di +mul cs:columns +mov di,ax +shl di,1 +mov al,cs:columns +inc di +popep: +mov es:[di],bl +add di,2 +dec al +jnz popep +pop es di bx ax +ret + +;Retourne en es:di un bloc de donn‚es +Getinfos: +push cx si di ds +push cs +pop ds +mov cx,10 +mov si,offset lines +cld +rep movsb +pop ds di si cx +ret + +lines db 0 +columns db 0 +x db 0 +y db 0 +xy dw 0 +colors db 7 +mode db 0FFh +pagesize dw 0 +special equ $ + + +endofme equ $ +4096 + +end start + + + + + + + + + + From f3db02caa1093323b9f47213adec23cadb6d4d5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sun, 18 Feb 2001 21:48:09 +0100 Subject: [PATCH 04/17] =?UTF-8?q?feat:=20am=C3=A9lioration=20du=20syst?= =?UTF-8?q?=C3=A8me=20d'installation.=20Ajout=20d'une=20application=20qui?= =?UTF-8?q?=20permet=20de=20lancer=20un=20logo=20BMP=20de=20cos2000.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asm.bat | 57 +++- boot.asm | 8 +- cos.bmp | Bin 0 -> 65078 bytes cosinit.asm | 224 --------------- debog.bat | 2 + sect.asm => disk.asm | 8 +- editor.asm | 450 +++++++++++++++++++++++++++++ exe2boot.asm | 67 +++++ logo.asm | 369 ++++++++++++++++++++++++ mem.asm | 607 --------------------------------------- setup.asm | 425 +++++++++++++++++++++++++++ choice.asm => system.asm | 191 +++++++++++- vg2.asm => video.asm | 48 ++-- write.bat | 4 + 14 files changed, 1587 insertions(+), 873 deletions(-) create mode 100755 cos.bmp delete mode 100755 cosinit.asm create mode 100755 debog.bat rename sect.asm => disk.asm (91%) create mode 100755 editor.asm create mode 100755 exe2boot.asm create mode 100755 logo.asm delete mode 100755 mem.asm create mode 100755 setup.asm rename choice.asm => system.asm (69%) rename vg2.asm => video.asm (87%) create mode 100755 write.bat diff --git a/asm.bat b/asm.bat index 9e704ec..27d5cb7 100755 --- a/asm.bat +++ b/asm.bat @@ -1,12 +1,47 @@ @echo off -del system.bin -tasm boot.asm /t/x/m4 -tasm mem.asm /t/x/m4 -tasm choise.asm /t/x/m4 -tasm vg2.asm /t/x/m4 -tasm sect.asm /t/x/m4 -tlink boot.obj /x -del boot.obj -exe2boot.com -del boot.exe -cosinit.com + +echo Assembling file %1... +util\tasm %1.asm /m5/x/t +if errorlevel 1 goto end +if "%1"=="boot" goto boot +echo Linking file %1... +util\tlink %1.obj /x/t +if errorlevel 1 goto end +echo Copying file %1... +if "%1"=="video" goto video +if "%1"=="system" goto system +if "%1"=="setup" goto setup +copy %1.com ..\data\%1.exe>nul +goto end + +:boot +echo Linking file %1... +util\tlink %1.obj /x +if errorlevel 1 goto end +echo Copying file %1... +util\exe2boot %1.exe +copy %1.bin ..\data\%1.bin>nul +goto end + +:video +type thin8x8.fnt>>%1.com +:system +copy %1.com ..\data\%1.sys>nul +goto end +:setup +copy %1.com ..\%1.com>nul +goto end + +:end +if not exist *.bin goto exes +del *.bin +:exes +if not exist *.exe goto coms +del *.exe +:coms +if not exist *.com goto objs +del *.com +:objs +if not exist *.obj goto nobjs +del *.obj +:nobjs diff --git a/boot.asm b/boot.asm index 1418c6a..347a19d 100755 --- a/boot.asm +++ b/boot.asm @@ -34,7 +34,7 @@ okloading db 'COS search system',0Dh,0ah,0 syst db 'Ok',0dh,0ah,0 dot db '.',0 carry db 0dh,0ah,0 -Sys db 'system ',0 +Sys db 'system',0,0,0,0,0,0 sys2 db 'sys',0 errorboot: @@ -175,7 +175,7 @@ push ax cx dx si mov CL, DL ;{ Set the sector } and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } xor DX, DX - div head + div word ptr pope mov CH, DL ;{ Set the track bits 0-7 } mov AL, DH ror AL, 1 @@ -183,7 +183,7 @@ push ax cx dx si and AL, 11000000b or CL, AL ;{ Set bits 8&9 of track } xor dX, DX - div pope + div head mov DH, DL ;{ Set the head } inc CL mov SI, 4 @@ -214,6 +214,6 @@ again: Buffer equ $ - +boots ends end start diff --git a/cos.bmp b/cos.bmp new file mode 100755 index 0000000000000000000000000000000000000000..c5a0890f977e79cf3ab84995a02fb7d6f7327892 GIT binary patch literal 65078 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 ZU=UysU=UysU=UysU=Uys_=iW}{{w8+r9l7y literal 0 HcmV?d00001 diff --git a/cosinit.asm b/cosinit.asm deleted file mode 100755 index 998bc4f..0000000 --- a/cosinit.asm +++ /dev/null @@ -1,224 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - -ent equ 32h - -start: -jmp CopyCOS - -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 -NameBoot db 'Boot.bin',0 -Namesystem db 'System.bin',0 -Message db 0Ah,0Dh,'Installation of the COS (Celyn Operating System) !!',0Ah,0Dh,'Written By Nico',0Ah,0Dh,'Copyright 2000',0Ah,0Dh,'Please insert a floppy disk and press a key...',0Ah,0Dh,'Be careful! All the disk is going to be deleted',0Ah,0dh,'$' -Message2 db 0Ah,0Dh,'Create boot sector$' -systfile db 0Ah,0Dh,'Creating file allocation table 16 bits$' -systfile2 db 0Ah,0Dh,'Creating file information table 32 bytes$' -systfile3 db 0Ah,0Dh,'Creating operating system files$' -Errormsg db 0Ah,0Dh,0Ah,0Dh,'An error has stopped the copying process !',0Ah,0Dh,'$' -Ok db 0Ah,0Dh,0Ah,0Dh,'The boot sector and the system files had been succefully copied.',0Ah,0Dh, 'To try COS reboot with this system disk',0Ah,0Dh,0Ah,0Dh,'$' - -entrie db 'System file',0 - db 'sys',0,0 - dw 1234h - dw 1234h - dw 1234h - dw 1234h - db 0h - dw ent - dw 512 - dw 0h - dw 0 - - -CopyCOS: -mov ah,09 -mov dx,offset message -int 21h -jc error -mov ax,0 -int 16h -mov ah,09 -mov dx,offset message2 -int 21h -mov ax,3D00h -mov dx,offset nameboot -int 21h -jc error -mov bx,ax -mov ax,4202h -xor cx,cx -xor dx,dx -int 21h -jc error -cmp dx,0 -jne error -cmp ax,512 -jne error -mov ax,4200h -xor cx,cx -xor dx,dx -int 21h -jc error -mov ah,3fh -mov cx,512 -mov dx,offset buffer -int 21h -jc error -mov ah,3eh -int 21h -jc error -mov cx,0 -mov bx,dx -call writesector -jne error -jc error -mov ah,09 -mov dx,offset systfile3 -int 21h -jc error -mov ax,3D00h -mov dx,offset namesystem -int 21h -jc error -mov bx,ax -mov ax,4202h -xor cx,cx -xor dx,dx -int 21h -jc error -cmp dx,0 -jne error -sub ax,1 ;+512 -cmp ax,0 -jl error -shr ax,9 -inc ax -mov bp,ax -mov ax,4200h -xor cx,cx -xor dx,dx -int 21h -jc error -mov ah,3fh -mov cx,0FFFFh -mov dx,offset buffer -int 21h -jc error -mov bx,dx -mov cx,ent -mov dx,bp -syst: -call writesector -jne error -add bx,512 -inc cx -dec dx -jnz syst -ret ;++++++++++++++++++= -mov ah,09 -mov dx,offset systfile -int 21h -mov cx,512/4 -mov di,bx -mov eax,0 -rep stosd -mov cx,13 -fatanymore: -call writesector -jne error -dec cx -cmp cx,1 -ja fatanymore -mov di,bx -mov ax,0FFF0h -mov cx,13 -rep stosw -mov ax,0FFFFh -stosw -mov si,ent -dec bp -makefat: -mov ax,si -inc ax -shl si,1 -mov [bx+si],ax -mov si,ax -dec bp -jnz makefat -shl si,1 -mov word ptr [bx+si],0ffffh -mov cx,1 -call writesector -jne error -mov ah,09 -mov dx,offset systfile2 -int 21h -jc error -mov cx,13 -mov bx,offset entrie -call writesector -jne error -mov ah,09 -mov dx,offset ok -int 21h -jc error -ret -error: -mov ah,09 -mov dx,offset errormsg -int 21h -ret - - - - - - - -WriteSector: -push cx dx si - mov AX, CX - xor DX, DX - div DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor DX, DX - div DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 3 - int 13h - jnc Done - dec SI - jnz TryAgain -Done: - mov cl, AH - mov ah,9 - mov dx,offset sign - int 21h - cmp cl,0 - pop si dx cx -ret - -sign db '.$' -buffer db 512 dup (0) - -end start diff --git a/debog.bat b/debog.bat new file mode 100755 index 0000000..3530e81 --- /dev/null +++ b/debog.bat @@ -0,0 +1,2 @@ +@echo off +util\td %1 diff --git a/sect.asm b/disk.asm similarity index 91% rename from sect.asm rename to disk.asm index a0b5ab8..2a55d8b 100755 --- a/sect.asm +++ b/disk.asm @@ -177,7 +177,7 @@ waitst: int 16h cmp ah,41h jne tre - mov dword ptr [pope],' EUV' + mov dword ptr [pope],'WEIV' push cs pop es mov cx,sect @@ -343,9 +343,9 @@ xx dw 0 yy dw 0 xxyy dw 3 xxyy2 dw 3 -errordisk db 'Une erreur est survenu sur le lecteur A:, appuyer sur une touche ',0 -menu db 'Haut F1, Bas F2, Secteurs F3&F4, Load/Save F4&F5, Edit F7, Quitter F8 MODE ' -pope db 'VUE ',0 +errordisk db 'An error has occured on drive A:, press a key to continu ',0 +menu db 'Bottom F1, Top F2, Sectors F3&F4, Load/Save F5&F6, Mode F7, Quit F8 MODE ' +pope db 'VIEW ',0 spaces db ' ³ ',0 showbuffer db 35 dup (0FFh) diff --git a/editor.asm b/editor.asm new file mode 100755 index 0000000..7ac89ce --- /dev/null +++ b/editor.asm @@ -0,0 +1,450 @@ +.model tiny +.386c +.code +org 0100h + + +start: + mov ax,0305h + mov bx,0008h + int 16h + mov ax,0002 + int 47H + mov ah,26 + int 47H + mov ah,2 + int 47h + xor ebp,ebp + xor ax,ax + mov fs,ax +Adres: + mov di,offset infos + mov ah,34 + int 47h + dec infos + mov bx,0 + mov ah,25 + int 47h + mov bh,infos + mov edi,ebp + mov ah,21 + mov cl,7 + int 47h +lines: + mov edx,edi + shr edx,4*4 + shl edx,4*3 + mov cx,16 + mov ah,10 + int 47h + mov si,offset dep + mov ah,13 + int 47h + mov dx,di + mov ah,10 + int 47h + mov ah,13 + mov si,offset spaces + int 47h + mov al,16 + mov cl,7 + mov ah,21 + int 47h + mov esi,edi +doaline: + mov edx,edi + shr edx,4*4 + shl edx,4*3 + mov fs,dx + mov dl,fs:[di] + mov ah,10 + mov cl,8 + int 47h + mov ah,5 + int 47h + inc edi + dec al + jnz doaline + mov edi,esi + mov si,offset spaces + mov ah,13 + int 47h + mov al,16 + mov ah,21 + mov cl,7 + int 47h +doaline2: + mov edx,edi + shr edx,4*4 + shl edx,4*3 + mov fs,dx + mov dl,fs:[di] + mov ah,7 + int 47h + inc edi + dec al + jnz doaline2 + mov ah,6 + int 47h + dec bh + jnz lines + mov ah,21 + mov cl,112 + int 47h + mov si,offset menu + mov ah,13 + int 47h + waitkey: + mov ax,0 + int 16h + cmp ax,3B00h + jne suit + inc ebp + jmp adres + suit: + cmp ax,3C00h + jne suit2 + dec ebp + jmp adres + suit2: + cmp ax,3D00h + jne suit3 + add ebp,24*16 + jmp adres + suit3: + cmp ax,3E00h + jne suit4 + sub ebp,24*16 + jmp adres + suit4: + cmp ax,3F00h + jne suit5 + add ebp,010000h + jmp adres + suit5: + cmp ax,4000h + jne suit6 + sub ebp,010000h + jmp adres + suit6: + cmp ax,4100h + jne suit7 + mov dword ptr [pope],'TIDE' + mov bl,infos + xor bh,bh + mov ah,25 + int 47h + mov ah,21 + mov cl,116 + int 47h + mov si,offset menu + mov ah,13 + int 47h + mov ah,21 + mov cl,7 + int 47h + mov ax,0B800h + mov es,ax + mov xxyy2,3 + mov xxyy,3 + call calc1 + call calc2 +waitst: + mov ax,0 + int 16h + cmp ah,41h + jne tre + mov dword ptr [pope],' EUV' + push cs + pop es + jmp adres +tre: + cmp al,0 + jne write + cmp ah,48h + jne tre1 + cmp yy,0 + je waitst + dec yy + jmp cursor +tre1: + cmp ah,50h + jne tre2 + mov al,infos + dec al + xor ah,ah + cmp yy,ax + je waitst + inc yy + jmp cursor +tre2: + cmp ah,4Dh + jne tre4 + cmp xx,15 + je waitst + inc xx + jmp cursor +tre4: + cmp ah,4Bh + jne waitst + cmp xx,0 + je waitst + dec xx + jmp cursor +write: + call AsciiHex2dec + cmp cl,15 + ja waitst + call calc1 + call calc2 + mov edi,es:[bx-1] + mov dx,es:[si-1] + mov byte ptr es:[bx],0112 + mov es:[bx-1],al +writs: + mov ax,0 + int 16H + mov ch,cl + call AsciiHex2dec + cmp cl,15 + ja writs + shl ch,4 + add ch,cl + mov es:[bx+1],al + mov es:[si-1],ch + mov ax,bx + call calc3 + mov gs:[bx],ch + pusha + popa + mov cl,gs:[bx] + cmp ch,cl + je no + push si ax + mov ah,25 + mov bl,infos + xor bh,bh + int 47h + mov ah,21 + mov cl,117 + int 47h + mov si,offset msg + mov ah,13 + int 47h + mov ax,0 + int 16h + mov bl,infos + xor bh,bh + mov ah,25 + int 47h + mov ah,21 + mov cl,116 + int 47h + mov ah,13 + mov si,offset menu + int 47h + pop bx si + mov es:[bx-1],edi + mov es:[si-1],dx + no: + + inc xx + cmp xx,16 + jne pasde + inc yy + mov xx,0h + pasde: + call calc1 + call calc2 + jmp waitst + +cursor: + call calc1 + call calc2 + jmp waitst + suit7: + cmp ax,4200h + jne waitkey + mov ah,27 + int 47h + db 0CBH ; +++++++ + ret + +calc1: + push ax dx si + mov ax,xx + mov dx,xx + shl ax,2 + shl dx,1 + add ax,dx + add ax,25 + mov bx,YY + mov dx,yy + shl bx,5 + shl dx,7 + add bx,dx + add bx,ax + mov byte ptr es:[bx],112 + mov byte ptr es:[bx+2],112 + mov si,xxyy + mov byte ptr es:[si],07 + mov byte ptr es:[si+2],07 + mov xxyy,bx + pop si dx ax + ret + +calc2: + push ax bx dx + mov si,YY + mov dx,yy + shl si,5 + shl dx,7 + add si,dx + mov dx,xx + shl dx,1 + add si,dx + add si,127 + mov byte ptr es:[si],112 + mov bx,xxyy2 + mov byte ptr es:[bx],07 + mov xxyy2,si + pop dx bx ax + ret + +calc3: + push dx + xor ebx,ebx + mov bx,xx + mov dx,yy + shl dx,4 + add bx,dx + add ebx,ebp + mov edx,ebx + shr edx,4*4 + shl edx,4*3 + mov gs,dx + pop dx + ret + + asciihex2dec: + cmp al,'a' + jb nomin + cmp al,'f' + ja nomin + sub al,'a'-'A' + jmp ismaj + nomin: + cmp al,'A' + jb nomaj + cmp al,'F' + ja nomaj + ismaj: + mov cl,al + sub cl,'A'-10 + jmp endt + nomaj: + mov cl,al + sub cl,'0' + endt: + ret + +dep db ':',0 +sect dw 0 +xx dw 0 +yy dw 0 +xxyy dw 3 +xxyy2 dw 3 +msg db 'Error : Unchangeable area (ROM) press a key to continu ',0 +menu db 'Top F1, Bottom F2, Offset F3&F4, Segment F5&F6, Mode F7, Quit F8 MODE ' +pope db 'VUE ',0 +spaces db ' ³ ',0 + +showbuffer db 35 dup (0FFh) +Lastread dw 0FFFFh + +ReadSector: +push ax cx dx si + cmp cx,cs:lastread + je done + mov cs:LastRead,cx + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor dX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +mov word ptr cs:lastread,0ffffh +Done: + pop si dx cx ax +ret + +WriteSector: +push ax cx dx si + cmp cs:Lastread,cx + jne nodestruct + mov cs:Lastread,0ffffh + nodestruct: + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor DX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain2: + mov AL, 1 + mov DL, 0 + mov AH, 3 + int 13h + jnc Done2 + dec SI + jnz TryAgain2 +Done2: + pop si dx cx ax +ret + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 + +infos db 10 dup (0) +end start + + + + + + + + diff --git a/exe2boot.asm b/exe2boot.asm new file mode 100755 index 0000000..0946581 --- /dev/null +++ b/exe2boot.asm @@ -0,0 +1,67 @@ +.model tiny +.486 +smart +.code + +org 0100h + + +start: +jmp transform +NameBoot db 'Boot.exe',0 +nameboot2 db 'Boot.bin',0 +buffer db 510 dup (0) + dw 0AA55h +message db 0ah,0dh,'Transformation of boot.com to boot.bin...',0ah,0dh,'By Nico',0ah,0dh,'Copyright 2000',0ah,0dh,'$' +ok db 0ah,0dh,'The transformation was done succefully !',0ah,0dh,'$' +errormsg db 0ah,0dh,'Some errors has been detected !',0ah,0dh,'$' +transform: +mov ah,09 +mov dx,offset message +int 21h +mov ax,3D00h +mov dx,offset nameboot +int 21h +jc error +mov bx,ax +mov ax,4202h +xor cx,cx +xor dx,dx +int 21h +jc error +cmp dx,0 +jne error +mov ax,4200h +xor cx,cx +mov dx,7E00h +int 21h +jc error +mov ah,3fh +mov cx,512 +mov dx,offset buffer +int 21h +jc error +mov ah,3eh +int 21h +jc error +mov ah,3ch +xor cx,cx +mov dx,offset nameboot2 +int 21h +jc error +mov ah,40h +mov cx,512 +mov dx,offset buffer +int 21h +jc error +mov ah,09 +mov dx,offset ok +int 21h +ret +error: +mov ah,09 +mov dx,offset errormsg +int 21h +ret + +end start diff --git a/logo.asm b/logo.asm new file mode 100755 index 0000000..1f2a506 --- /dev/null +++ b/logo.asm @@ -0,0 +1,369 @@ +.model tiny +.386c +.code +org 0100h + + +start: +mov si,offset logo +call searchfile +mov bx,7000h +mov es,bx +mov bx,0h +call loadfatway +push es +pop ds +call loadbmp +xor ax,ax +xor bx,bx +call showbmp +mov ax,0 +int 16h +ret +db 0CBH + +loadbmp: +push ax bx cx dx bp ds +mov ax,4 +int 47h +mov ax,ds:[18] +mov si,ax +shr ax,2 +and si,11b +cmp si,0 +je is4x +add ax,1 +is4x: +mov cs:sizeh,ax +mov ax,ds:[22] +mov cs:sizev,ax +mov di,0FFFFh-1024 +mov si,54 +mov cl, 0ffh +paletteload: +lodsb +shr al, 2 +mov [di+2], al +lodsb +shr al, 2 +mov [di+1], al +lodsb +shr al, 2 +mov [di+0], al +inc si +add di, 3 +dec cl +jnz paletteload +mov si,0FFFFh-1024 +mov dx, 3c8h +cld +mov cl, 0ffh +xor bx, bx +palettemake: +mov al, bl +out dx, al +inc dx +lodsb +out dx, al +lodsb +out dx, al +lodsb +out dx, al +dec dx +inc bl +dec cl +jnz palettemake +pop ds bp dx cx bx ax +ret +sizeh dw 0 +sizev dw 0 + +showbmp: +push ax bx cx dx si di ds es +mov cx,cs:sizeh +mov dx,cs:sizev +add bx,dx +mov di,ax +mov ax,bx +shl ax,6 +shl bx,8 +add di,bx +add di,ax +mov bx,di +mov ax,0A000H +mov es,ax +mov si,1024+54 +mov ax,cx +bouclebmp: +cmp di,64000 +jae nopp +cld +rep movsd +no: +mov cx,ax +sub bx,320 +mov di,bx +dec dx +jnz bouclebmp +fin: +pop es ds di si dx cx bx ax +ret +nopp: +shl cx,2 +add si,cx +jmp no + +Searchfile: +push bx dx si di ds es +mov di,offset temp +mov bx,offset buffer +call asciiztofit +mov cx,13 +check: +call readsector +jc errorboot +xor di,di +findnext: +cmp byte ptr [bx+di],0 +je errorboot +push si di cx +mov si,di +add si,bx +mov di,offset temp +mov cx,12+4 +rep cmpsb +pop cx di si +je oksystem +add di,32 +inc dx +cmp dx,nbfit +ja errorboot +cmp di,sizec +jb findnext +inc cx +jmp Check +oksystem: +mov cx,[di+BX+26] +errorboot: +pop es ds di si dx bx +ret + +;->name ds:si ->es:di +AsciiZtoFit: +push ax bx cx dx si di ds es +xor bx,bx +mov dx,di +noextens: +mov al,[si+bx] +cmp al,'.' +je extens +call Issystchar +jc errortranslate +mov es:[di],al +inc di +inc bx +cmp bx,namesize ;(.) +jne noextens +erro: +stc +jmp errortranslate +extens: +add si,bx +inc si +sub bx,namesize +neg bx +mov al,0 +mov cx,bx +cld +rep stosb +xor bx,bx +wasextens: +mov al,[si+bx] +cmp al,0 +je endextens +call Issystchar +jc errortranslate +mov es:[di],al +inc di +inc bx +cmp bx,extsize +jne wasextens +jmp erro +endextens: +sub bx,extsize +neg bx +mov al,0 +mov cx,bx +cld +rep stosb +mov si,dx +mov di,dx +push es +pop ds +mov cx,extsize+namesize +call uppercaseMEM +clc +endtranslate: +pop es ds di si dx cx bx ax +ret +errortranslate: +stc +jmp endtranslate + +;Carry si al = caractŠre systŠme +isSystchar: +push di +mov di,offset exeptchar +isexcept: +cmp al,cs:[di] +je nogood +inc di +cmp byte ptr cs:[di],0 +jne isexcept +endanal: +pop di +ret +exeptchar db '/\<>:|.',01,0,0 +nogood: +stc +jmp endanal + +;Transforme les x caractŠres de la mem en ds:si en maj +uppercaseMEM: +push si di cx ax +mov di,si +uppercaser: +mov al,ds:[si] +inc si +cmp al,'A' +jb nonmaj +cmp al,'Z' +ja nonmaj +add al,'a'-'A' +nonmaj: +mov es:[di],al +inc di +dec cx +jnz uppercaser +enduppercase: +clc +pop ax cx di si +ret + +nbfit equ 255 + + +namesize equ 12 +extsize equ 5 + +;cx entr‚e -> fatway chemin +getfatway: +push bx cx es +mov bx,offset fatway +fatagain: +mov cs:[bx],cx +add bx,2 +cmp cx,0FFF0h +jae finishload +call getfat +jnc fatagain +finishload: +pop es cx bx +ret + +lastread dw 0FFFFh + +ReadSector: +push ax cx dx si + cmp cx,cs:lastread + je done + mov cs:LastRead,cx + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor dX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +mov word ptr cs:lastread,0ffffh +Done: + pop si dx cx ax +ret + + +dot db '.',0 + +loadfatway: +push bx cx di +call getfatway +jc endload +mov di,offset fatway +mov si,offset dot +mov ah,13 +loadagain: +mov cx,cs:[di] +cmp cx,0FFF0h +jae endload +add di,2 +call readsector +jc endload +int 47h +add bx,cs:sizec +jmp loadagain +endload: +pop di cx bx +ret + +sizec dw 512 +reserv dw 1 + +;<-cx nøsecteur ->cx code FAT +getfat: +push es ax bx dx +mov ax,cx +xor dx,dx +div cs:sizec +mov cx,ax +add cx,cs:reserv +mov bx,offset buffer +push cs +pop es +call readsector +jc errorgetfat +shl dx,1 +add bx,dx +mov cx,cs:[bx] +errorgetfat: +pop dx bx ax es +ret + +logo db 'cos.bmp',0 +temp db 12+5+1 dup (0) + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 + +fatway equ $ + +buffer equ $+1000 +end start diff --git a/mem.asm b/mem.asm deleted file mode 100755 index ee62884..0000000 --- a/mem.asm +++ /dev/null @@ -1,607 +0,0 @@ -.model tiny -.386c -.code -org 0100h - - -start: - mov ax,0305h - mov bx,0008h - int 16h - mov ax,0B800h - mov es,ax - xor ebp,ebp -Adres: - call clear - mov xy,0 - mov x,0 - mov y,0 - mov ah,24 - mov ebx,ebp -lines: - mov colors,7 - mov edx,ebx - shr edx,4*4 - shl edx,4*3 - mov cx,16 - call showhexrow - mov si,offset dep - call showstring0 - mov dx,bx - mov cx,16 - call showhexrow - mov si,offset spaces - call showstring0 - mov al,16 - mov edi,ebx - mov cx,8 - mov colors,7 -doaline: - mov edx,ebx - shr edx,4*4 - shl edx,4*3 - mov fs,dx - mov dl,fs:[bx] - call showhexrow - call space - inc ebx - dec al - jnz doaline - mov si,offset spaces - call showstring0 - mov al,16 - mov colors,7 -doaline2: - mov edx,edi - shr edx,4*4 - shl edx,4*3 - mov fs,dx - mov dl,fs:[di] - call showchar - inc edi - dec al - jnz doaline2 - call line - dec ah - jnz lines - mov colors,112 - mov si,offset menu - call showstring0 - mov bx,bp - waitkey: - mov ax,0 - int 16h - cmp ax,3B00h - jne suit - inc ebp - jmp adres - suit: - cmp ax,3C00h - jne suit2 - dec ebp - jmp adres - suit2: - cmp ax,3D00h - jne suit3 - add ebp,24*16 - jmp adres - suit3: - cmp ax,3E00h - jne suit4 - sub ebp,24*16 - jmp adres - suit4: - cmp ax,3F00h - jne suit5 - add ebp,010000h - jmp adres - suit5: - cmp ax,4000h - jne suit6 - sub ebp,010000h - jmp adres - suit6: - cmp ax,4100h - jne suit7 - mov dword ptr [pope],'TIDE' - mov ax,24 - call setxy - mov colors,116 - mov si,offset menu - call showstring0 - mov colors,7 - mov xxyy2,1 - mov xxyy,1 - call calc1 - call calc2 -waitst: - mov ax,0 - int 16h - cmp ah,41h - jne tre - mov dword ptr [pope],' EUV' - jmp adres -tre: - cmp al,0 - jne write - cmp ah,48h - jne tre1 - cmp yy,0 - je waitst - dec yy - jmp cursor -tre1: - cmp ah,50h - jne tre2 - cmp yy,23 - je waitst - inc yy - jmp cursor -tre2: - cmp ah,4Dh - jne tre4 - cmp xx,15 - je waitst - inc xx - jmp cursor -tre4: - cmp ah,4Bh - jne waitst - cmp xx,0 - je waitst - dec xx - jmp cursor -write: - call AsciiHex2dec - cmp cl,15 - ja waitst - call calc1 - call calc2 - mov edi,es:[bx-1] - mov dx,es:[si-1] - mov byte ptr es:[bx],0112 - mov es:[bx-1],al -writs: - mov ax,0 - int 16H - mov ch,cl - call AsciiHex2dec - cmp cl,15 - ja writs - shl ch,4 - add ch,cl - mov es:[bx+1],al - mov es:[si-1],ch - mov ax,bx - call calc3 - mov gs:[bx],ch - pusha - popa - mov cl,gs:[bx] - cmp ch,cl - je no - push si ax - mov ax,24 - call setxy - mov colors,117 - mov si,offset msg - call showstring0 - mov ax,0 - int 16h - mov ax,24 - call setxy - mov colors,116 - mov si,offset menu - call showstring0 - pop bx si - mov es:[bx-1],edi - mov es:[si-1],dx - no: - inc xx - cmp xx,16 - jne pasde - inc yy - mov xx,0h - pasde: - call calc1 - call calc2 - jmp waitst - -cursor: - call calc1 - call calc2 - jmp waitst - suit7: - cmp ax,4200h - jne waitkey - call restorescreen - db 0CBH - -calc1: - push ax dx si - mov ax,xx - mov dx,xx - shl ax,2 - shl dx,1 - add ax,dx - add ax,25 - mov bx,YY - mov dx,yy - shl bx,5 - shl dx,7 - add bx,dx - add bx,ax - mov byte ptr es:[bx],112 - mov byte ptr es:[bx+2],112 - mov si,xxyy - mov byte ptr es:[si],07 - mov byte ptr es:[si+2],07 - mov xxyy,bx - pop si dx ax - ret - -calc2: - push ax bx dx - mov si,YY - mov dx,yy - shl si,5 - shl dx,7 - add si,dx - mov dx,xx - shl dx,1 - add si,dx - add si,127 - mov byte ptr es:[si],112 - mov bx,xxyy2 - mov byte ptr es:[bx],07 - mov xxyy2,si - pop dx bx ax - ret - -calc3: - push dx - xor ebx,ebx - mov bx,xx - mov dx,yy - shl dx,4 - add bx,dx - add ebx,ebp - mov edx,ebx - shr edx,4*4 - shl edx,4*3 - mov gs,dx - pop dx - ret - - asciihex2dec: - cmp al,'a' - jb nomin - cmp al,'f' - ja nomin - sub al,'a'-'A' - jmp ismaj - nomin: - cmp al,'A' - jb nomaj - cmp al,'F' - ja nomaj - ismaj: - mov cl,al - sub cl,'A'-10 - jmp endt - nomaj: - mov cl,al - sub cl,'0' - endt: - ret - -xx dw 0 -yy dw 0 -xxyy dw 0 -xxyy2 dw 0 -msg db 'Erreur : zone imodifiable (ROM) appuyer sur une touche ',0 -menu db 'Haut F1, Bas F2, Pages F3&F4, Segment F5&F6, Edit F7, Quitter F8 MODE ' -pope db 'VUE ',0 -spaces db ' ³ ',0 -dep db ':',0 -reg db 'Etats des registre apr‚s boot',0 -fla db 'Flags:',0 -regs db 'EDI:',0 - db 'ESI:',0 - db 'EBP:',0 - db 'ESP:',0 - db 'EBX:',0 - db 'EDX:',0 - db 'ECX:',0 - db 'EAX:',0 - db ' CS:',0 - db ' DS:',0 - db ' ES:',0 - db ' FS:',0 - db ' GS:',0 - db ' SS:',0 -cxk dw 0 -edxk dd 0 -dsk dw 0 -sik dw 0 -gr db '(',0 -dr db ')',0 - - - - -xy dw 0 -colors db 7 -x db 1 -y Db 1 - -;==========SHOWCHAR=========== -;met un caractŠre apr‚s le curseur -;-> dl -;<- -;============================= -showchar: -push dx bx es -mov bx,0B800h -mov es,bx -mov bx,cs:xy -mov dh,cs:colors -mov es:[bx],dx -add cs:xy,2 -pop es bx dx -ret - - - -;==========SPACE=========== -;met un espace apr‚s le curseur -;-> -;<- -;============================= -space: -push bx es -add cs:xy,2 -mov bx,0B800h -mov es,bx -mov bx,cs:xy -mov byte ptr es:[bx],' ' -pop es bx -ret - -;==============================Affiche le nombre nb binaire en EDX============== -ShowbinRow: - push es ax bx cx di - mov di,cs:xy - mov bx,0B800h - mov es,bx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors -binaize: - rol edx,1 - mov cl,'0' - adc cl,0 - mov es:[di],cx - add di,2 - dec al - jnz binaize - mov cs:xy,di - pop di cx bx ax es - ret - -;==========SETCOLOR========= -;Change les attributs du texte a CL -;-> CL -;<- -;============================= -setcolor: -mov cs:colors,CL -ret - - - -;=============CLEAR========= -;Efface l'ecran texte -;-> -;<- -;============================= -clear: -push es eax cx di -xor di,di -mov ax,0b800h -mov es,ax -mov eax,07200720h -mov cx,1000 -cld -rep stosd -pop di cx eax es -ret - - -;==========SCROLLDOWN========= -;defile de cx lines vers le bas -;-> CX -;<- -;============================= -scrolldown: -push cx si di ds es -mov si,0B800h -mov es,si -mov ds,si -mov si,cx -shl si,5 -shl cx,7 -add si,cx -mov cx,4000 -sub cx,si -xor di,di -cld -rep movsb -pop es ds di si cx -ret - -;==========LINE========= -;remet le curseur a la ligne -;-> -;<- -;============================= -line: -push ax cx di es -mov ah,cs:x -mov al,cs:y -xor ah,ah -cmp al,24 -jne scro -dec al -mov cl,1 -call scrolldown -scro: -inc al -call setxy -pop es di cx ax -ret - -;==========SETXY========= -;Change les coordonnées du curseur a X:AL,Y:AH -;-> AX -;<- es di -;============================= -setxy: -push ax bx di -mov cs:x,ah -mov cs:y,al -mov bl,ah -xor bh,bh -xor ah,ah -mov di,ax -shl di,5 -shl ax,7 -shl bx,1 -add di,ax -add di,bx -mov cs:xy,di -mov ax,0B800h -mov es,ax -pop di bx ax -ret - -;================Affiche la chaine 0 de caractŠre contenue dans ds:si -showstring0: - push es cx si di - mov di,cs:xy - mov cx,0B800h - mov es,cx - mov ch,cs:colors -strinaize0: - mov cl,[si] - cmp cl,0 - je no0 - mov es:[di],cx - add di,2 - inc si - jmp strinaize0 - no0: - mov cs:xy,di - pop di si cx es - ret - -;==============================Affiche le nombre nb hexa en EDX============== -ShowHexRow: - push es ax bx cx di - mov di,cs:xy - mov bx,0B800h - mov es,bx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors - shr ax,2 -Hexaize: - rol edx,4 - mov bx,dx - and bx,0fh - mov cl,cs:[bx+offset Tab] - mov es:[di],cx - add di,2 - dec al - jnz Hexaize - mov cs:xy,di - pop di cx bx ax es - ret -Tab db '0123456789ABCDEF' -ret - - -;===================================sauve l'ecran rapidement================ -SaveScreen: - push cx si di ds es - mov cx,0B800H - mov ds,cx - push cs - pop es - mov cx,(80*25*2)/4 - xor si,si - mov di,offset Copy2 - cld - rep movsd - pop es ds di si cx - ret - - -;===================================sauve l'ecran rapidement================ -RestoreScreen: - push cx si di ds es - mov cx,0B800H - mov es,cx - push cs - pop ds - mov cx,(80*25*2)/4 - mov si,offset Copy2 - xor di,di - cld - rep movsd - pop es ds di si cx - ret - -;===================================Afficher un int EDX a l'‚cran en ah,al================ -ShowInt: - push eax bx cx edx esi di es ds - mov di,cs:xy - mov cx,0B800h - mov es,cx - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint3: - xor edx,edx - div esi - add dl,'0' - mov dh,cs:colors - sub bx,2 - add cx,2 - mov cs:[bx],dx - cmp ax,0 - jne decint3 - mov si,bx - push cs - pop ds - cld - rep movsb - mov cs:xy,di - pop ds es di esi edx cx bx eax -ret - -end start - - - - - - - - - diff --git a/setup.asm b/setup.asm new file mode 100755 index 0000000..0fb317c --- /dev/null +++ b/setup.asm @@ -0,0 +1,425 @@ +.model tiny +.486 +smart +.code + +org 0100h + +ent equ 32h + +start: +jmp CopyCOS + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 + +Message db 0Dh,0Ah,'COS 2000b installation program (Celyn Operating System) !!',0Dh,0Ah,'Written By Nico',0Ah,0Dh,'Site online HTTP://WWW.MULTIMANIA.COM/COS2000',0Dh,0AH,'Copyright 2000',0Dh,0AH,'Please insert a floppy disk and press a key...',0Dh,0AH,'Be careful! All the disk is going to be deleted',0Dh,0AH,'$' +Message2 db 0Dh,0AH,'Create boot sector$' +systfile db 0Dh,0AH,'Creating file allocation table 16 bits$' +systfile2 db 0Dh,0AH,'Creating file information table 32 bytes$' +systfile3 db 0Dh,0AH,'Creating operating system files',0Dh,0Ah,'$' +systfile4 db 0D,0Ah,'Creating system tools',0Dh,0Ah,'$' +Errormsg db 0Dh,0AH,0Dh,0AH,'Installing error, please contact me at COS2000@MULTIMANIA.COM !',0Dh,0AH,'$' +Ok db 0Dh,0AH,0Dh,0AH,'The boot sector and the system files had been succefully copied.',0Dh,0AH, 'To try COS reboot with this system disk',0Dh,0AH,'$' +files db '*.*',0 +tools db '*.exe',0 +allboot db 0dh,0ah +boot db 'boot.bin',0,' $' +retu db 0Dh,0AH,'$' +dat db 'data',0 +dat2 db '..',0 +dta db 43 dup (0) + +copycos: +mov ah,3Bh +mov dx,offset dat +int 21h +mov ah,9 +mov dx,offset message +int 21h +jc error +mov ax,0 +int 16h +mov ah,9 +mov dx,offset systfile +int 21h +jc error +mov cx,12 +mov bx,offset fat +erase: +call writesector +jc error +dec cx +jnz erase +mov ah,9 +mov dx,offset message2 +int 21h +jc error +mov dx,Offset allboot +int 21h +jc error +mov dx,offset boot +call addfile +mov ax,0F0FFh +mov cx,14 +mov di,offset fat +cld +rep stosw +mov bx,offset fat +mov cx,1 +call writesector +jc error +mov ah,9 +mov dx,offset systfile2 +int 21h +jc error +mov eax,0 +mov cx,512/4 +mov di,offset fat +cld +rep stosd +mov bx,offset fat +mov cx,13 +call writesector +jc error +mov ah,1Ah +mov dx,offset dta +int 21h +jc error +mov ah,4eh +xor cx,cx +mov dx,offset files +int 21h +mov ah,9 +mov dx,offset systfile3 +int 21h +jc error +allfile: +mov di,offset dta+43 +mov byte ptr [di],'$' +mov ah,9 +mov si,offset dta+30 +mov cl,13 +call uppercasemem +mov dx,si +int 21h +jc error +call addfile +jc error +call makefit +jc error +mov ah,9 +mov dx,offset retu +int 21h +jc error +mov di,offset dta+30 +mov al,0 +mov cl,13 +cld +rep stosb +mov ah,4fh +int 21h +jnc allfile +mov ah,9 +mov dx,Offset ok +int 21h +mov ah,3Bh +mov dx,offset dat2 +int 21h +ret + +error: +mov ah,3Bh +mov dx,offset dat2 +int 21h +mov ah,9 +mov dx,offset errormsg +int 21h +ret + +addfile: +push ax bx dx si di bp +mov cx,1 +mov bx,offset fat +call readsector +jc error2 +mov ax,3D00h +int 21h +jc error2 +mov bx,ax +mov ax,4202h +xor cx,cx +xor dx,dx +int 21h +jc error2 +cmp dx,0 +jne error2 +cmp ax,0 +je error2 +sub ax,1 +shr ax,9 +inc ax +mov bp,ax +mov ax,4200h +xor cx,cx +xor dx,dx +int 21h +jc error2 +mov ah,3fh +mov cx,07FFFh +mov dx,offset buffer +int 21h +jc error2 +mov si,-2 +mov di,0 +mov bx,offset buffer +fats: +add si,2 +cmp si,512 +jz error2 +cmp WORD PTR [si+offset fat],0h +jne fats +mov ax,si +shr ax,1 +cmp di,0 +jne nonew +mov entrie,ax +jmp new +nonew: +mov [offset fat+di],ax +new: +mov di,si +mov cx,ax +call writesector +jc error2 +add bx,512 +dec bp +jnz fats +mov word ptr [offset fat+di],0FFFFh +mov bx,offset fat +mov cx,1 +call writesector +mov cx,entrie +end1: +pop bp di si dx bx ax +ret +entrie dw 0 +error2: +stc +jmp end1 + + +makefit: +push bx cx si di bp +mov ax,cx +mov bx,offset fat +mov cx,13 +call readsector +jc error3 +xor si,si +findfit: +cmp byte ptr [si+bx],0 +je finishfit +add si,32 +cmp si,512 +jb findfit +jmp error3 +finishfit: +mov di,si +add di,bx +mov si,dx +call asciiztofit +jc error3 +mov [di+26],ax +mov cx,13 +call writesector +jc error3 +end3: +pop bp di si cx bx +ret +error3: +stc +jmp end3 + +WriteSector: +push cx dx si + mov AX, CX + xor DX, DX + div DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor DX, DX + div DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 3 + int 13h + jnc Done + dec SI + jnz TryAgain +Done: + jc enddd + mov cl, AH + mov ah,9 + mov dx,offset sign + int 21h + cmp cl,0 + enddd: + pop si dx cx +ret + +ReadSector: +push ax cx dx si + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor dX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain2: + mov AL, 1 + mov DL, 0 + mov AH, 2 + int 13h + jnc Done2 + dec SI + jnz TryAgain2 +Done2: + pop si dx cx ax +ret + +;->name ds:si ->es:di +AsciiZtoFit: +push ax bx cx dx si di ds es +xor bx,bx +mov dx,di +noextens: +mov al,[si+bx] +cmp al,'.' +je extens +call Issystchar +jc errortranslate +mov es:[di],al +inc di +inc bx +cmp bx,namesize ;(.) +jne noextens +erro: +stc +jmp errortranslate +extens: +add si,bx +inc si +sub bx,namesize +neg bx +mov al,0 +mov cx,bx +cld +rep stosb +xor bx,bx +wasextens: +mov al,[si+bx] +cmp al,0 +je endextens +call Issystchar +jc errortranslate +mov es:[di],al +inc di +inc bx +cmp bx,extsize +jne wasextens +jmp erro +endextens: +sub bx,extsize +neg bx +mov al,0 +mov cx,bx +cld +rep stosb +mov si,dx +mov di,dx +push es +pop ds +mov cx,extsize+namesize +call uppercaseMEM +clc +endtranslate: +pop es ds di si dx cx bx ax +ret +errortranslate: +stc +jmp endtranslate + +;Carry si al = caractŠre systŠme +isSystchar: +push di +mov di,offset exeptchar +isexcept: +cmp al,cs:[di] +je nogood +inc di +cmp byte ptr cs:[di],0 +jne isexcept +endanal: +pop di +ret +exeptchar db '/\<>:|.',01,0,0 +nogood: +stc +jmp endanal + +;Transforme les x caractŠres de la mem en ds:si en maj +uppercaseMEM: +push si di cx ax +mov di,si +uppercaser: +mov al,ds:[si] +inc si +cmp al,'A' +jb nonmaj +cmp al,'Z' +ja nonmaj +add al,'a'-'A' +nonmaj: +mov es:[di],al +inc di +dec cx +jnz uppercaser +enduppercase: +clc +pop ax cx di si +ret + +namesize equ 12 +extsize equ 5 + +sign db '.$' +fat DB 512 dup (0) +buffer db 0 + +end start diff --git a/choice.asm b/system.asm similarity index 69% rename from choice.asm rename to system.asm index 3034e24..f058a8a 100755 --- a/choice.asm +++ b/system.asm @@ -8,7 +8,8 @@ org 0100h start: -mov cx,23 +mov si,offset video +call searchfile mov bx,8400h mov es,bx mov bx,100h @@ -16,7 +17,6 @@ call loadfatway mov di,bx mov bx,47h call setint -ret mov bx,9 call getint mov cs:int9seg,ds @@ -79,6 +79,12 @@ add di,32 inc bp jmp showall endof2: +mov ah,21 +mov cl,112 +int 47h +mov ah,13 +mov si,offset menu +int 47h mov xx,1 mov xxold,2 call Select @@ -106,19 +112,45 @@ tre2: mov di,xx dec di shl di,5 - mov cx,[di+bx+26] + mov dx,[di+bx+26] mov ah,6 int 47h int 47h + mov ah,21 + mov cl,7 + int 47h mov ah,13 mov si,offset msg2 int 47h + mov cx,dx call executefatway tre3: cmp ah,59 - jne endof + jne tre4 mov lastread,0FFFFh jmp start2 +tre4: + cmp ah,67 + jne endof + mov ax,0001 + int 47h + mov ah,2 + int 47h + mov ah,21 + mov cl,4 + int 47h + mov ah,13 + mov si,offset msg3 + int 47h + mov ax,0 + int 16h + mov ax,40h + mov ds,ax + mov bx,1234h + mov ds:[072h],bx + push 0FFFFh + push 0000h + db 0CBh executefatway: push cs @@ -219,8 +251,10 @@ ret xx dw 1 xxold dw 0 +menu db 'F1 Read disk F2 Read file F9 Quit F11 Change video F12 Debug ',0 msg1 db 'Cos 2000 menu loader release 1.0',0 -msg2 db 'Program loading',0 +msg2 db 'The program is loading',0 +msg3 db 'Cos will restart your computer, eject the floppy disk and press a key',0 prompt db '>',0 spaces db ' ',0 dot db '.',0 @@ -354,7 +388,7 @@ int9: int 47h mov al,cs:infos+7 inc al - and ax,11b + and ax,111b int 47h pop es @@ -495,9 +529,152 @@ regs db 'EDI:',0 db ' SS:',0 gr db '(',0 dr db ')',0 -app db 'Press enter to quit...',0 +app db 'Press space to quit...',0 + +Searchfile: +push bx dx si di ds es +mov di,offset temp +mov bx,offset buffer +call asciiztofit +mov cx,13 +check: +call readsector +jc errorboot +xor di,di +findnext: +cmp byte ptr [bx+di],0 +je errorboot +push si di cx +mov si,di +add si,bx +mov di,offset temp +mov cx,12+4 +rep cmpsb +pop cx di si +je oksystem +add di,32 +inc dx +cmp dx,nbfit +ja errorboot +cmp di,sizec +jb findnext +inc cx +jmp Check +oksystem: +mov cx,[di+BX+26] +errorboot: +pop es ds di si dx bx +ret + +;->name ds:si ->es:di +AsciiZtoFit: +push ax bx cx dx si di ds es +xor bx,bx +mov dx,di +noextens: +mov al,[si+bx] +cmp al,'.' +je extens +call Issystchar +jc errortranslate +mov es:[di],al +inc di +inc bx +cmp bx,namesize ;(.) +jne noextens +erro: +stc +jmp errortranslate +extens: +add si,bx +inc si +sub bx,namesize +neg bx +mov al,0 +mov cx,bx +cld +rep stosb +xor bx,bx +wasextens: +mov al,[si+bx] +cmp al,0 +je endextens +call Issystchar +jc errortranslate +mov es:[di],al +inc di +inc bx +cmp bx,extsize +jne wasextens +jmp erro +endextens: +sub bx,extsize +neg bx +mov al,0 +mov cx,bx +cld +rep stosb +mov si,dx +mov di,dx +push es +pop ds +mov cx,extsize+namesize +call uppercaseMEM +clc +endtranslate: +pop es ds di si dx cx bx ax +ret +errortranslate: +stc +jmp endtranslate + +;Carry si al = caractŠre systŠme +isSystchar: +push di +mov di,offset exeptchar +isexcept: +cmp al,cs:[di] +je nogood +inc di +cmp byte ptr cs:[di],0 +jne isexcept +endanal: +pop di +ret +exeptchar db '/\<>:|.',01,0,0 +nogood: +stc +jmp endanal + +;Transforme les x caractŠres de la mem en ds:si en maj +uppercaseMEM: +push si di cx ax +mov di,si +uppercaser: +mov al,ds:[si] +inc si +cmp al,'A' +jb nonmaj +cmp al,'Z' +ja nonmaj +add al,'a'-'A' +nonmaj: +mov es:[di],al +inc di +dec cx +jnz uppercaser +enduppercase: +clc +pop ax cx di si +ret + +namesize equ 12 +extsize equ 5 +nbfit equ 255 +video db 'video.sys',0 +temp db 12+5+1 dup (0) DiskSectorsPerTrack dw 18 DiskTracksPerHead dw 80 diff --git a/vg2.asm b/video.asm similarity index 87% rename from vg2.asm rename to video.asm index 2e218b4..52bb781 100755 --- a/vg2.asm +++ b/video.asm @@ -193,8 +193,17 @@ mode2 DB 63H, 00H, 03H,01H,03H,01H,02H DB 0CH,00H,0FH,00H,00H db 80,50 -;640*480 16 couleurs -mode3 DB 63H, 00H, 03H,01H,0FH,00H,0EH +;320*200 16 couleurs +mode3 DB 63H,00H, 03H,09H,0FH,00H,06H + DB 2DH,27H,28H,90H,2BH,080H,0BFH,01FH,00H,0C0H,00H,00H,00H,00H,00H,00H + DB 9CH,8EH,8FH,14H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + db 40,25 + +;320*200 256 couleurs +mode4 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH @@ -202,8 +211,8 @@ mode3 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 41H,00H,0FH,00H,00H db 00,00 -;320*240 256 couleurs -mode4 DB 63H, 00H, 03H,01H,0FH,00H,0EH +;640*400 16 couleurs +mode5 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,10H,05H,0FH,0FFH @@ -211,6 +220,25 @@ mode4 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 41H,00H,0FH,00H,00H db 00,00 +;640*400 16 couleurs +mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH + DB 2DH,27H,27H,91H,2AH,9FH,0BFH,1FH,00H,0C0H,00H,00H,00H,00H,00H,00H + DB 9CH,0EH,8FH,50H,00H,8FH,0C0H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + db 00,00 + +;640*400 16 couleurs +mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH + DB 2DH,27H,27H,91H,2AH,9FH,0BFH,1FH,00H,0C0H,00H,00H,00H,00H,00H,00H + DB 9CH,0EH,8FH,50H,00H,8FH,0C0H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + db 00,00 + +; ;=============CLEAR========= ;Efface l'ecran texte ;-> @@ -878,18 +906,6 @@ colors db 7 mode db 0FFh pagesize dw 0 special equ $ - - endofme equ $ +4096 end start - - - - - - - - - - diff --git a/write.bat b/write.bat new file mode 100755 index 0000000..808b110 --- /dev/null +++ b/write.bat @@ -0,0 +1,4 @@ +@echo off +cd .. +setup +cd sources From 4c3f72e0ce293815fcaee96aea0f5628e171718f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sun, 25 Feb 2001 21:48:09 +0100 Subject: [PATCH 05/17] =?UTF-8?q?feat:=20compression=20au=20format=20RIP?= =?UTF-8?q?=20du=20logo=20BMP.=20Ajout=20d'un=20logiciel=20de=20v=C3=A9rif?= =?UTF-8?q?ication=20de=20la=20disquette.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cos.rip | Bin 0 -> 15201 bytes disk.asm | 9 +- editor.asm | 9 +- keyboard.asm | 84 ++++++++++++++++ logo.asm | 61 ++++++++++-- rip.asm | 108 ++++++++++++++++++++ setup.asm | 27 ++++- system.asm | 1 + test.asm | 274 +++++++++++++++++++++++++++++++++++++++++++++++++++ unrip.asm | 88 +++++++++++++++++ verif.asm | 262 ++++++++++++++++++++++++++++++++++++++++++++++++ video.asm | 66 ++++++++----- 12 files changed, 951 insertions(+), 38 deletions(-) create mode 100755 cos.rip create mode 100755 keyboard.asm create mode 100755 rip.asm create mode 100755 test.asm create mode 100755 unrip.asm create mode 100755 verif.asm diff --git a/cos.rip b/cos.rip new file mode 100755 index 0000000000000000000000000000000000000000..f9e20763567ed1a2853b8ba1911db6e0c48d55a9 GIT binary patch literal 15201 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 KkABg&QvWxvt|p=Y literal 0 HcmV?d00001 diff --git a/disk.asm b/disk.asm index 2a55d8b..370c46f 100755 --- a/disk.asm +++ b/disk.asm @@ -44,6 +44,13 @@ Adres: mov di,offset infos mov ah,34 int 47h + mov al,[di+7] + cmp al,oldmode + je noinit + mov ah,2 + int 47h + mov oldmode,al + noinit: dec infos mov bx,0 mov ah,25 @@ -422,7 +429,7 @@ TryAgain2: Done2: pop si dx cx ax ret - +oldmode db 0 DiskSectorsPerTrack dw 18 DiskTracksPerHead dw 80 DiskHeads dw 2 diff --git a/editor.asm b/editor.asm index 7ac89ce..aac1b83 100755 --- a/editor.asm +++ b/editor.asm @@ -22,6 +22,13 @@ Adres: mov ah,34 int 47h dec infos + mov al,[di+7] + cmp al,oldmode + je noinit + mov ah,2 + int 47h + mov oldmode,al + noinit: mov bx,0 mov ah,25 int 47h @@ -437,7 +444,7 @@ ret DiskSectorsPerTrack dw 18 DiskTracksPerHead dw 80 DiskHeads dw 2 - +oldmode db 0 infos db 10 dup (0) end start diff --git a/keyboard.asm b/keyboard.asm new file mode 100755 index 0000000..0fd52f0 --- /dev/null +++ b/keyboard.asm @@ -0,0 +1,84 @@ +.model tiny +.486 +smart +.code +org 0100h + +start: +mov al,0D0h +call keybcmd +in al,60h +ret + + +;============= PPI port A (Programmable Peripheral interface) ================ +;8048 (old XT) 8042 (old AT) 8741 8742 (with PS2 mouse) +; R/W +;Port 60h : Scancode & keyboarddata +overrun equ 000h ;Error too many keys pressed +BATend equ 0AAh ;End of the test BAT (basic test assurance) +MF2code equ 0ABh ;Code send by MF2 keyboard +MF2code2 equ 041h ;Code send by MF2 keyboard +echo equ 0EEh ;Send by echo command +Ack equ 0FAh ;Send by every comman exept EEh et FEh (Aknoledge) +BATerror equ 0FCh ;BAT failed +Resend equ 0FEh ;Resend data please +Error equ 0FFh ;Error of keyboard + +;Port 60h : command data +led equ 0EDh ;set the led like you want +echo equ 0EEh ;Echo byte for diagnostic +Set equ 0F0h ;Choose the Set of scancode +Id equ 0F2h ;Identify the keyboard +rate equ 0F3h ;Set the specified typematic rate +enable equ 0F4h ;clear buffer and scan +reset equ 0F5h ;Reset and no scan +reset2 equ 0F6h ;Reset and scan + +;============= PPI port A (Programmable Peripheral interface) ================ +;8048 (old XT) 8042 (old AT) 8741 8742 (with PS2 mouse) +; R/W +;Port 61h + +;==================== Data and control keyboard registers =================== +;8042 (old AT) 8741 8742 (with PS2 mouse) +; R/W +;Port 64h + + + +;Envoie la commande AL aux clavier et si besoin est la donn‚e DL +Keybcmd: +push ax +xchg al,ah +xor cx,cx +clearbuffer: +in al,64h +test al,02h +loopnz clearbuffer +jnz errorkb +xchg al,ah +out 64h,al +clearbuffer2: +in al,64h +test al,02h +loopnz clearbuffer2 +jnz errorkb +cmp dl,0 +je endkeyb +mov al,dl +out 60h,al +endkeyb: +clc +pop ax +ret +errorkb: +stc +pop ax +ret + + + + + +end start diff --git a/logo.asm b/logo.asm index 1f2a506..53b4fce 100755 --- a/logo.asm +++ b/logo.asm @@ -7,24 +7,31 @@ org 0100h start: mov si,offset logo call searchfile -mov bx,7000h +mov bx,6000h mov es,bx mov bx,0h call loadfatway push es pop ds +mov bx,5000h +mov es,bx +xor si,si +xor di,di +xor bx,bx +call DecompressRle +push es +pop ds call loadbmp xor ax,ax xor bx,bx call showbmp mov ax,0 int 16h -ret db 0CBH loadbmp: push ax bx cx dx bp ds -mov ax,4 +mov ax,6 int 47h mov ax,ds:[18] mov si,ax @@ -309,11 +316,50 @@ Done: pop si dx cx ax ret +DecompressRle: +push cx dx si di +mov dx,cx +mov bp,di +decompression: +mov eax,[si] +cmp al,'/' +jne nocomp +cmp si,07FFFh-6 +jae thenen +mov ecx,eax +ror ecx,16 +cmp cl,'*' +jne nocomp +cmp byte ptr [si+4],'/' +jne nocomp +mov al,ch +mov cl,ah +xor ah,ah +xor ch,ch +rep stosb +add si,5 +sub dx,5 +jnz decompression +jmp thenen +nocomp: +mov es:[di],al +inc si +inc di +dec dx +jnz decompression +thenen: +mov ax,dx +sub bp,di +neg bp +pop di si dx cx +ret + + dot db '.',0 loadfatway: -push bx cx di +push bx di call getfatway jc endload mov di,offset fatway @@ -330,7 +376,8 @@ int 47h add bx,cs:sizec jmp loadagain endload: -pop di cx bx +mov cx,bx +pop di bx ret sizec dw 512 @@ -356,7 +403,7 @@ errorgetfat: pop dx bx ax es ret -logo db 'cos.bmp',0 +logo db 'cos.rip',0 temp db 12+5+1 dup (0) DiskSectorsPerTrack dw 18 @@ -365,5 +412,5 @@ DiskHeads dw 2 fatway equ $ -buffer equ $+1000 +buffer equ $+5000 end start diff --git a/rip.asm b/rip.asm new file mode 100755 index 0000000..acefad7 --- /dev/null +++ b/rip.asm @@ -0,0 +1,108 @@ +net segment + +org 0100h +assume cs:net,ds:net + +start: +jmp deb +taille dw 0 +signe db 'rip' +signe2 db 64 dup (0) +p1 db '@' +p2 db '@' +min db 4 +deb: +mov BL,DS:[0080h] +xor BH,BH +or BX,BX +mov byte ptr [0081h+BX],00h +mov AX,3D02h +mov DX,0082H +int 21h +mov bx,ax +mov ah,3fh +mov cx,0ffffh +mov dx,offset data +int 21h +mov taille,ax +mov ah,3eh +int 21h +mov si,82h +mov di,offset signe2 +mov cx,64 +rep movsb +mov di,offset signe2 +mov cx,64 +mov al,2eh +repne scasb +push di +mov si,di +mov di,offset data +add di,taille +mov cx,3 +rep movsb +mov ax,di +pop di +mov cx,3 +mov si,offset signe +rep movsb +mov di,ax +mov cx,taille +mov si,offset data +mov dx,1 +boucle: +lodsb +cmp al,[si] +jne pas +inc dl +loop boucle +jmp fin +pas: +cmp dl,min +jb suite +cmp dl,1 +jne go +suite: +mov bx,cx +mov cx,dx +rep stosb +mov cx,bx +mov dl,1 +loop boucle +jmp fin +go: +mov ah,al +mov al,p1 +stosb +mov al,dl +stosb +mov al,ah +stosb +mov al,p2 +stosb +mov dl,1 +loop boucle +fin: +mov ah,3ch +mov cx,0 +mov dx,offset signe2 +int 21h +mov bx,ax +mov ah,40h +mov cx,di +sub cx,offset data +sub cx,taille +mov dx,offset data +add dx,taille +int 21h +mov ah,3eh +int 21h +mov ah,41h +mov dx,82h +int 21h +ret +data db 0 +net ends +end start + +net \ No newline at end of file diff --git a/setup.asm b/setup.asm index 0fb317c..fc65f35 100755 --- a/setup.asm +++ b/setup.asm @@ -32,6 +32,15 @@ dat2 db '..',0 dta db 43 dup (0) copycos: + mov ah,4ah + mov bx,1000h + int 21h + jc error + mov ah,48h + mov bx,65536/16 + int 21h + jc error + mov fs,ax mov ah,3Bh mov dx,offset dat int 21h @@ -139,7 +148,7 @@ int 21h ret addfile: -push ax bx dx si di bp +push ax bx dx si di bp ds es mov cx,1 mov bx,offset fat call readsector @@ -166,14 +175,20 @@ xor cx,cx xor dx,dx int 21h jc error2 +push fs +pop ds +push fs +pop es mov ah,3fh -mov cx,07FFFh -mov dx,offset buffer +mov cx,0FFFFh +xor dx,dx int 21h +push cs +pop ds jc error2 mov si,-2 mov di,0 -mov bx,offset buffer +xor bx,bx fats: add si,2 cmp si,512 @@ -199,10 +214,12 @@ jnz fats mov word ptr [offset fat+di],0FFFFh mov bx,offset fat mov cx,1 +push cs +pop es call writesector mov cx,entrie end1: -pop bp di si dx bx ax +pop es ds bp di si dx bx ax ret entrie dw 0 error2: diff --git a/system.asm b/system.asm index f058a8a..ef6c91e 100755 --- a/system.asm +++ b/system.asm @@ -17,6 +17,7 @@ call loadfatway mov di,bx mov bx,47h call setint +ret mov bx,9 call getint mov cs:int9seg,ds diff --git a/test.asm b/test.asm new file mode 100755 index 0000000..b102754 --- /dev/null +++ b/test.asm @@ -0,0 +1,274 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: +go: +call calc +jmp go +ret + +calc: +pusha +mov ah,2Ch +int 21h +mov bh,dh +xor ebp,ebp +wait2: +xor bl,bl +waits: +mov dx,3dah +in al,dx +and al,1000b +jz wait2 +cmp bl,1 +je waits +inc ebp +inc bl +cmp ebp,300 +jne waits +mov ah,2Ch +int 21h +sub dh,bh +mov bl,dh +xor bh,bh +mov ax,bp +shr ebp,16 +mov dx,bp +div bx +xor edx,edx +mov dx,ax +call showint +popa +ret + +;===================================Afficher un int EDX a l'‚cran en ah,al================ +ShowInt: + push eax bx cx edx esi di es ds + mov di,0 + mov cx,0B800h + mov es,cx + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint3: + xor edx,edx + div esi + add dl,'0' + mov dh,cs:colors + sub bx,2 + add cx,2 + mov cs:[bx],dx + cmp ax,0 + jne decint3 + mov si,bx + push cs + pop ds + cld + rep movsb + pop ds es di esi edx cx bx eax +ret +showbuffer db 35 dup (0FFh) + +colors equ 1 + + +;40*25 16 couleurs +mode0 DB 67H,00H, 03H,08H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,01FH,00H,4FH,0DH,0EH,00H,00H,00H,00H + DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,01H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H + db 40,25 + +;80*25 16 couleurs +mode1 DB 67H,00H, 03H,00H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0DH,0EH,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,1FH,96H,0B9H,0A3h,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,6H,7H,8H,9H,0AH,0BH,0CH,0DH,0EH,0FH + DB 0CH,00H,0FH,08H,00H + db 80,25 + +;80*50 16 couleurs +mode2 DB 67H, 00H, 03H,00H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + db 80,50 + +;100*50 16 couleurs +mode3 DB 067H , 00H, 03H,01H,03H,00H,02H + DB 70H, 63H , 64H ,85H,68H,84H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,9Ch, 08EH ,8FH, 32H ,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + db 100,50 + + +;100*60 16 couleurs +mode22 DB 067H , 00H, 03H,01H,03H,00H,02H + DB 70H, 63H , 64H ,85H,68H,84H,0FFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,0E7H,8EH,0DFH,32H,1FH,0DFH,0E5H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + db 100,60 + + +Sequencer equ 03C4h +misc equ 03C2h +misc2 equ 03CCh +CCRT equ 03D4h +Attribs equ 03C0h +graphic equ 03CEh +statut equ 3DAh + +;====Met les cl registres cons‚cutif … ds:si du port dx +Setregs: +push ax +xor ax,ax +initreg: +mov ah,[si] +out dx,ax +inc al +inc si +cmp al,cl +jb initreg +pop ax +ret + +;met une serie de registres Cl a partir du port dx +Setlowregs: +push ax bx +xor bx,bx +cmp cl,0 +je only +initreg2: +mov al,bl +out dx,al +only: +mov al,[si] +out dx,al +inc bl +inc si +cmp bl,cl +jb initreg2 +pop bx ax +ret + +Setvideomode: +push ax cx dx si +xor ah,ah +mov si,ax +shl si,6 +add si,offset mode0 +xor cx,cx +mov dx,misc +call setlowregs +mov dx,statut +call setlowregs +mov dx,sequencer +mov cl,5 +call setregs +mov ax,0E11h +mov dx,ccrt +out dx,ax +mov cl,25 +call setregs +mov dx,graphic +mov cl,9 +call setregs +mov dx,attribs +mov cl,20 +call setlowregs +mov al,20h +out dx,al +pop dx cx ax si +ret + +;====Met les cl registres cons‚cutif … en es:DI du port dx TOUT REGISTRES +getregs: +push ax bx dx +xor bx,bx +cmp cl,0 +je only2 +initreg4: +mov al,bl +out dx,al +cmp dx,3C1h +je only2 +inc dx +only2: +in al,dx +mov es:[di],al +dec dx +inc bl +inc di +cmp bl,cl +jb initreg4 +pop dx bx ax +ret + +;====Met le mode video present dans Es:di +getvideomode: +push ax cx dx di +xor cx,cx +mov dx,misc2 +call getregs +mov dx,statut +call getregs +mov dx,sequencer +mov cl,5 +call getregs +mov dx,ccrt +mov cl,25 +call getregs +mov dx,graphic +mov cl,9 +call getregs +mov dx,attribs +mov cl,20 +call getregs +mov al,20h +out dx,al +pop di dx cx ax +ret + +;mode s‚curis‚ al +Safemode: +push cx si di ds es +call setvideomode +mov di,offset buffer +push cs +pop es +push cs +pop ds +call getvideomode +mov byte ptr es:[di+1],0 +mov si,offset mode1 +mov di,offset buffer +mov cx,62 +rep cmpsb +jne errormode +clc +endsafe: +pop ds es di si cx +ret +errormode: +stc +jmp endsafe + + + +buffer db 0 + +end start diff --git a/unrip.asm b/unrip.asm new file mode 100755 index 0000000..02d1f64 --- /dev/null +++ b/unrip.asm @@ -0,0 +1,88 @@ +net segment + +org 0100h +assume cs:net,ds:net + +start: +jmp deb +taille dw 0 +signe2 db 64 dup (0) +p1 db '@' +p2 db '@' +deb: +mov BL,DS:[0080h] +xor BH,BH +or BX,BX +mov byte ptr [0081h+BX],00h +mov AX,3D02h +mov DX,0082H +int 21h +mov bx,ax +mov ah,3fh +mov cx,0ffffh +mov dx,offset data +int 21h +mov taille,ax +mov ah,3eh +int 21h +mov si,82h +mov di,offset signe2 +mov cx,64 +rep movsb +mov di,offset signe2 +mov cx,64 +mov al,2eh +repne scasb +mov si,offset data +mov cx,3 +rep movsb +mov cx,taille +mov di,offset data +add di,taille +mov dx,1 +boucle: +lodsb +cmp al,p1 +je pas +suite: +stosb +loop boucle +jmp fin +pas: +mov al,p2 +cmp [si+2],al +jne suite +lodsb +mov bx,cx +mov cl,al +xor ch,ch +lodsb +rep stosb +mov cx,bx +sub cx,3 +inc si +loop boucle +fin: +mov ah,3ch +mov cx,0 +mov dx,offset signe2 +int 21h +mov bx,ax +mov ah,40h +mov cx,di +sub cx,offset data +sub cx,taille +mov dx,offset data +add dx,taille +int 21h +mov ah,3eh +int 21h +mov ah,41h +mov dx,82h +int 21h +ret +data db 0 +net ends +end start + +net \ No newline at end of file diff --git a/verif.asm b/verif.asm new file mode 100755 index 0000000..c418726 --- /dev/null +++ b/verif.asm @@ -0,0 +1,262 @@ +.model tiny +.386c +.code +org 0100h + + +start: + mov ax,0002 + int 47H + mov ah,26 + int 47H +replay: + mov ah,2 + int 47h +mov ah,21 +mov cl,7 +int 47h + xor di,di + xor cx,cx + mov ah,20 + mov bx,1D00h + mov si,offset Msg + int 47h + mov ah,20 + mov bx,0231h + mov si,offset msgapp + int 47h +VerifAll: + mov ah,1 + int 16h + cmp al,32 + je enend + mov ax,cx + mov si,100 + mul si + mov si,2880 + div si + xor edx,edx + mov dx,ax + mov ah,15 + mov bx,0A14h + int 47h + mov ah,13 + mov si,offset po + int 47h + mov ah,15 + mov dx,cx + mov bx,0A10h + int 47h + mov ah,13 + mov si,offset Msg2 + int 47h + mov ah,8 + mov edx,0 + mov dx,di + int 47h + mov ah,13 + mov si,offset Msg3 + int 47h + call gauge + call verifysector + jc errors + je noprob + inc di + noprob: + inc cx + cmp cx,2880 + jnz verifall + enend: + cmp di,0 + je noatall +mov bx,0E09h +mov ah,20 +mov si,offset error2 +int 47h + jmp someof + noatall: +mov bx,0E09h +mov ah,20 +mov si,offset noerror +int 47h + someof: + mov ah,0 + int 16h + mov ah,27 + int 47h + db 0CBH + errors: +mov ah,21 +mov cl,4 +int 47h +mov bx,0D09h +mov ah,20 +mov si,offset errore +int 47h +mov ah,0 +int 16h +jmp replay + + + +errore db 'Error IO with floppy drive, insert a disk and Press a key',0 +noerror db 'No defectuous Cluster, Press a key to Quit',0 +error2 db 'This disk is bad, Press a key to Quit',0 +po db ' %',0 +msgapp db '',0 +msg db '- Disk Surface Test -',0 +msg2 db ' cluster tested. ',0 +msg3 db ' defectuous cluster.',0 +;->Increment CX +gauge: +push ax bx cx dx si ds +push cs +pop ds +mov ax,cx +mul sizes +div max +mov dx,ax +mov bl,oldvalue +xor bh,bh +mov byte ptr [offset gaugetxt+bx],'Û' +cmp bx,0 +jnz nono2 +mov ah,21 +mov cl,8 +int 47h +mov bx,xy +mov ah,20 +mov si,offset gaugetxt +int 47h +mov ah,21 +mov cl,7 +int 47h +nono2: +mov bx,dx +xor bh,bh +mov byte ptr [offset gaugetxt+bx],0 +mov oldvalue,bl +mov bx,xy +mov ah,20 +mov si,offset gaugetxt +int 47h +pop ds si dx cx bx ax +ret +oldvalue db 0 +max dw 2880 +sizes dw 50 +xy dw 0A12h +gaugetxt db 'ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ',0 + +Inverse: +mov si,512/4 +invert: +shl si,2 +not dword ptr [bx+si-4] +shr si,2 +dec si +jnz invert +ret + +VerifySector: +push bx cx si di ds es +push cs +pop es +push cs +pop ds +mov bx,offset buffer +call ReadSector +jc errorverify +call inverse +call WriteSector +jc errorverify +mov bx,offset buffer2 +call ReadSector +call inverse +jc errorverify +mov bx,offset buffer +call inverse +call WriteSector +jc errorverify +mov cx,512/4 +mov si,offset buffer +mov di,offset buffer2 +cld +rep cmpsd +errorverify: +pop es ds di si cx bx +ret + +ReadSector: +push ax cx dx si + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor dX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +Done: + pop si dx cx ax +ret + +WriteSector: +push ax cx dx si + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor DX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain2: + mov AL, 1 + mov DL, 0 + mov AH, 3 + int 13h + jnc Done2 + dec SI + jnz TryAgain2 +Done2: + pop si dx cx ax +ret + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 + +Buffer equ $ +Buffer2 equ $+512 + + +End Start diff --git a/video.asm b/video.asm index 52bb781..96d17c4 100755 --- a/video.asm +++ b/video.asm @@ -167,7 +167,7 @@ reg1 dw 0100h, 0402h, 0704h, 0300h dw 0204h, 0005h, 0406h ;40*25 16 couleurs -mode0 DB 63H,00H, 03H,09H,03H,00H,02H +mode0 DB 67H,00H, 03H,08H,03H,00H,02H DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,01FH,00H,4FH,0DH,0EH,00H,00H,00H,00H DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH @@ -178,14 +178,14 @@ mode0 DB 63H,00H, 03H,09H,03H,00H,02H ;80*25 16 couleurs mode1 DB 67H,00H, 03H,00H,03H,00H,02H DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0DH,0EH,00H,00H,00H,00H - DB 9CH,0EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH + DB 9CH,0EH,8FH,28H,1FH,96H,0B9H,0A3h,0FFH DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH DB 0CH,00H,0FH,08H,00H db 80,25 ;80*50 16 couleurs -mode2 DB 63H, 00H, 03H,01H,03H,01H,02H +mode2 DB 67H, 00H, 03H,00H,03H,01H,02H DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH @@ -193,8 +193,28 @@ mode2 DB 63H, 00H, 03H,01H,03H,01H,02H DB 0CH,00H,0FH,00H,00H db 80,50 +;100*50 16 couleurs +mode3 DB 067H,00H,03H,01H,03H,01H,02H + DB 70H,63H,64H,85H,68H,84H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,9Ch,08EH,8FH,32H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + db 100,50 + + +;100*60 16 couleurs +mode4b DB 067H,00H,03H,01H,03H,01H,02H + DB 70H,63H,64H,85H,68H,84H,0FFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,0E7H,8EH,0DFH,32H,1FH,0DFH,0E5H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + db 100,60 + + ;320*200 16 couleurs -mode3 DB 63H,00H, 03H,09H,0FH,00H,06H +mode4 DB 63H,00H, 03H,09H,0FH,00H,06H DB 2DH,27H,28H,90H,2BH,080H,0BFH,01FH,00H,0C0H,00H,00H,00H,00H,00H,00H DB 9CH,8EH,8FH,14H,00H,96H,0B9H,0E3H,0FFH DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH @@ -203,7 +223,7 @@ mode3 DB 63H,00H, 03H,09H,0FH,00H,06H db 40,25 ;320*200 256 couleurs -mode4 DB 63H, 00H, 03H,01H,0FH,00H,0EH +mode5 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH @@ -212,7 +232,7 @@ mode4 DB 63H, 00H, 03H,01H,0FH,00H,0EH db 00,00 ;640*400 16 couleurs -mode5 DB 63H, 00H, 03H,01H,0FH,00H,0EH +mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,10H,05H,0FH,0FFH @@ -220,8 +240,8 @@ mode5 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 41H,00H,0FH,00H,00H db 00,00 -;640*400 16 couleurs -mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH +;640*400 256 couleurs +mode7 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 2DH,27H,27H,91H,2AH,9FH,0BFH,1FH,00H,0C0H,00H,00H,00H,00H,00H,00H DB 9CH,0EH,8FH,50H,00H,8FH,0C0H,0E3H,0FFH DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH @@ -229,14 +249,8 @@ mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 41H,00H,0FH,00H,00H db 00,00 -;640*400 16 couleurs -mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH - DB 2DH,27H,27H,91H,2AH,9FH,0BFH,1FH,00H,0C0H,00H,00H,00H,00H,00H,00H - DB 9CH,0EH,8FH,50H,00H,8FH,0C0H,0E3H,0FFH - DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - db 00,00 + + ; ;=============CLEAR========= @@ -287,11 +301,14 @@ statut equ 3DAh initmode: push bx cx si ds -mov bl,1 -mov cl,8 +;xor bx,bx +;mov ds,bx +;lds si,ds:[43h*4] push cs pop ds -mov si,offset special +mov si,offset font +mov cl,8 +mov bl,1 call loadfont pop ds si cx bx ret @@ -524,8 +541,8 @@ mov bl,bh xor bh,bh mov di,bx mul cs:columns -shl ax,1 add di,ax +shl di,1 mov cs:xy,di mov ax,0B800h mov es,ax @@ -586,8 +603,6 @@ RestoreScreen: rep movsd pop es ds di si cx ret -copy2 db 4000 dup (0) -copy db 4000 dup (0) ;===============================Page2to1============================ Page2to1: @@ -905,7 +920,10 @@ xy dw 0 colors db 7 mode db 0FFh pagesize dw 0 -special equ $ -endofme equ $ +4096 +font equ $ +copy equ $+4000 +copy2 equ $+8000 + +endofme equ $ +12000 end start From 163064bbb7e94cec00c367bc0077f741e3bda6e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Fri, 27 Apr 2001 22:48:09 +0200 Subject: [PATCH 06/17] feat: ajout de fonction permettant de communiquer avec le port LPT (imprimante) et fonction timer. --- asm.bat | 4 + disk.asm | 92 +-------- drive.asm | 398 +++++++++++++++++++++++++++++++++++++++ keyboard.asm | 237 +++++++++++++++++------- logo.asm | 262 +------------------------- lpt.asm | 514 +++++++++++++++++++++++++++++++++++++++++++++++++++ system.asm | 268 +++++++-------------------- test.asm | 274 --------------------------- timer.asm | 32 ++++ verif.asm | 115 +----------- video.asm | 12 +- 11 files changed, 1203 insertions(+), 1005 deletions(-) create mode 100755 drive.asm create mode 100755 lpt.asm delete mode 100755 test.asm create mode 100755 timer.asm diff --git a/asm.bat b/asm.bat index 27d5cb7..8223189 100755 --- a/asm.bat +++ b/asm.bat @@ -9,6 +9,10 @@ util\tlink %1.obj /x/t if errorlevel 1 goto end echo Copying file %1... if "%1"=="video" goto video +if "%1"=="lpt" goto system +if "%1"=="keyboard" goto system +if "%1"=="timer" goto system +if "%1"=="drive" goto system if "%1"=="system" goto system if "%1"=="setup" goto setup copy %1.com ..\data\%1.exe>nul diff --git a/disk.asm b/disk.asm index 370c46f..a90d01d 100755 --- a/disk.asm +++ b/disk.asm @@ -24,7 +24,8 @@ Adres: pop es mov cx,sect mov bx,offset buffer - call readsector + mov ax,0001h + int 48h jnc noerror errtr: mov ah,25 @@ -153,7 +154,8 @@ doaline2: jne suit6 mov cx,sect mov bx,offset buffer - call writesector + mov ah,1 + int 48h jnc waitkey jmp errtr suit6: @@ -189,7 +191,8 @@ waitst: pop es mov cx,sect mov bx,offset buffer - call writesector + mov ah,1 + int 48h jnc adres jmp errtr tre: @@ -356,88 +359,9 @@ pope db 'VIEW ',0 spaces db ' ³ ',0 showbuffer db 35 dup (0FFh) -Lastread dw 0FFFFh - -ReadSector: -push ax cx dx si - cmp cx,cs:lastread - je done - mov cs:LastRead,cx - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 2 - int 13h - jnc Done - dec SI - jnz TryAgain -mov word ptr cs:lastread,0ffffh -Done: - pop si dx cx ax -ret - -WriteSector: -push ax cx dx si - cmp cs:Lastread,cx - jne nodestruct - mov cs:Lastread,0ffffh - nodestruct: - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor DX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain2: - mov AL, 1 - mov DL, 0 - mov AH, 3 - int 13h - jnc Done2 - dec SI - jnz TryAgain2 -Done2: - pop si dx cx ax -ret oldmode db 0 -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 - -infos db 10 dup (0) - -buffer equ $+4000 - +infos db 10 dup (0) +buffer equ $ end start diff --git a/drive.asm b/drive.asm new file mode 100755 index 0000000..e2766a4 --- /dev/null +++ b/drive.asm @@ -0,0 +1,398 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: +jmp tsr +db 'DRIVE' +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +sti +iret +current dw 0 +tables dw readsector + dw writesector + dw verifysector2 + dw loadfatway + dw loadfile + +;cx entr‚e -> fatway chemin +getfatway: +push bx cx es +mov bx,offset fatway +fatagain: +mov cs:[bx],cx +add bx,2 +cmp cx,0FFF0h +jae finishload +call getfat +jnc fatagain +finishload: +pop es cx bx +ret + +;Charge le fichier de chemin cx +loadfatway: +push ax bx cx di +call getfatway +jc endload +mov di,offset fatway +loadagain: +mov cx,cs:[di] +cmp cx,0FFF0h +jae endload +add di,2 +xor al,al +call readsector +jc endload +add bx,cs:sizec +jmp loadagain +endload: +pop di cx bx ax +ret + +sizec dw 512 +reserv dw 1 + +;<-cx nøsecteur ->cx code FAT +getfat: +push es ax bx dx +mov ax,cx +xor dx,dx +div cs:sizec +mov cx,ax +add cx,cs:reserv +mov bx,offset buffer +push cs +pop es +call readsector +jc errorgetfat +shl dx,1 +add bx,dx +mov cx,cs:[bx] +errorgetfat: +pop dx bx ax es +ret + +ReadSector: +push ax cx dx si + cmp al,1 + je pr + cmp cx,cs:lastread + je done + pr: + mov cs:LastRead,cx + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor dX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +mov word ptr cs:lastread,0ffffh +Done: + pop si dx cx ax +ret + +WriteSector: +push ax cx dx si + cmp cs:Lastread,cx + jne nodestruct + mov cs:Lastread,0ffffh + nodestruct: + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor DX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain2: + mov AL, 1 + mov DL, 0 + mov AH, 3 + int 13h + jnc Done2 + dec SI + jnz TryAgain2 +Done2: + pop si dx cx ax +ret + +Lastread dw 0FFFFh + +Inverse: +mov si,512/4 +invert: +shl si,2 +not dword ptr [bx+si-4] +shr si,2 +dec si +jnz invert +ret + +VerifySector: +push bx cx si di ds es +push cs +pop es +push cs +pop ds +mov bx,offset buffer +call ReadSector +jc errorverify +call inverse +call WriteSector +jc errorverify +mov bx,offset buffer2 +call ReadSector +call inverse +jc errorverify +mov bx,offset buffer +call inverse +call WriteSector +jc errorverify +mov cx,512/4 +mov si,offset buffer +mov di,offset buffer2 +cld +rep cmpsd +errorverify: +pop es ds di si cx bx +ret + +VerifySector2: +call verifysector +jne nook +or byte ptr [bp+6],10b +nook: +ret + +;Charge le fichier Ds:si en es:di +loadfile: +push bx cx +call searchfile +mov bx,di +call loadfatway +pop cx bx +ret + +;Recherche le fichier et retourne sont path et en cx sont debut +Searchfile: +push bx dx si di ds es +push cs +pop es +mov di,offset temp +call asciiztofit +mov bx,offset buffer +push cs +pop ds +mov cx,13 +check: +call readsector +jc errorboot +xor di,di +findnext: +cmp byte ptr [bx+di],0 +je errorboot +push si di cx +mov si,di +add si,bx +mov di,offset temp +mov cx,12+4 +rep cmpsb +pop cx di si +je oksystem +add di,32 +inc dx +cmp dx,nbfit +ja errorboot +cmp di,sizec +jb findnext +inc cx +jmp Check +oksystem: +mov cx,[di+BX+26] +errorboot: +pop es ds di si dx bx +ret + +;->name ds:si ->es:di +AsciiZtoFit: +push ax bx cx dx si di ds es +xor bx,bx +mov dx,di +noextens: +mov al,[si+bx] +cmp al,'.' +je extens +call Issystchar +jc errortranslate +mov es:[di],al +inc di +inc bx +cmp bx,namesize ;(.) +jne noextens +erro: +stc +jmp errortranslate +extens: +add si,bx +inc si +sub bx,namesize +neg bx +mov al,0 +mov cx,bx +cld +rep stosb +xor bx,bx +wasextens: +mov al,[si+bx] +cmp al,0 +je endextens +call Issystchar +jc errortranslate +mov es:[di],al +inc di +inc bx +cmp bx,extsize +jne wasextens +jmp erro +endextens: +sub bx,extsize +neg bx +mov al,0 +mov cx,bx +cld +rep stosb +mov si,dx +mov di,dx +push es +pop ds +mov cx,extsize+namesize +call uppercaseMEM +clc +endtranslate: +pop es ds di si dx cx bx ax +ret +errortranslate: +stc +jmp endtranslate + +;Carry si al = caractŠre systŠme +isSystchar: +push di +mov di,offset exeptchar +isexcept: +cmp al,[di] +je nogood +inc di +cmp byte ptr [di],0 +jne isexcept +endanal: +pop di +ret +exeptchar db '/\<>:|.',01,0,0 +nogood: +stc +jmp endanal + +;Transforme les x caractŠres de la mem en ds:si en maj +uppercaseMEM: +push si di cx ax +mov di,si +uppercaser: +mov al,ds:[si] +inc si +cmp al,'A' +jb nonmaj +cmp al,'Z' +ja nonmaj +add al,'a'-'A' +nonmaj: +mov es:[di],al +inc di +dec cx +jnz uppercaser +enduppercase: +clc +pop ax cx di si +ret + +nbfit equ 255 +namesize equ 12 +extsize equ 5 + + +temp db 12+5+1 dup (0) + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 + +fatway equ $ + +buffer equ $+3000 +buffer2 equ $+512 +end start diff --git a/keyboard.asm b/keyboard.asm index 0fd52f0..ee09c17 100755 --- a/keyboard.asm +++ b/keyboard.asm @@ -2,83 +2,178 @@ .486 smart .code + org 0100h start: -mov al,0D0h -call keybcmd -in al,60h -ret - - -;============= PPI port A (Programmable Peripheral interface) ================ -;8048 (old XT) 8042 (old AT) 8741 8742 (with PS2 mouse) -; R/W -;Port 60h : Scancode & keyboarddata -overrun equ 000h ;Error too many keys pressed -BATend equ 0AAh ;End of the test BAT (basic test assurance) -MF2code equ 0ABh ;Code send by MF2 keyboard -MF2code2 equ 041h ;Code send by MF2 keyboard -echo equ 0EEh ;Send by echo command -Ack equ 0FAh ;Send by every comman exept EEh et FEh (Aknoledge) -BATerror equ 0FCh ;BAT failed -Resend equ 0FEh ;Resend data please -Error equ 0FFh ;Error of keyboard - -;Port 60h : command data -led equ 0EDh ;set the led like you want -echo equ 0EEh ;Echo byte for diagnostic -Set equ 0F0h ;Choose the Set of scancode -Id equ 0F2h ;Identify the keyboard -rate equ 0F3h ;Set the specified typematic rate -enable equ 0F4h ;clear buffer and scan -reset equ 0F5h ;Reset and no scan -reset2 equ 0F6h ;Reset and scan - -;============= PPI port A (Programmable Peripheral interface) ================ -;8048 (old XT) 8042 (old AT) 8741 8742 (with PS2 mouse) -; R/W -;Port 61h - -;==================== Data and control keyboard registers =================== -;8042 (old AT) 8741 8742 (with PS2 mouse) -; R/W -;Port 64h - - - -;Envoie la commande AL aux clavier et si besoin est la donn‚e DL -Keybcmd: -push ax -xchg al,ah -xor cx,cx -clearbuffer: -in al,64h -test al,02h -loopnz clearbuffer -jnz errorkb -xchg al,ah -out 64h,al -clearbuffer2: -in al,64h -test al,02h -loopnz clearbuffer2 -jnz errorkb -cmp dl,0 -je endkeyb -mov al,dl -out 60h,al -endkeyb: -clc -pop ax -ret -errorkb: -stc -pop ax -ret +jmp tsr +offsets dd 0 +db 'KEYBOARD' +tsr: + pushf + db 2eh,0ffh,1eh + dw offsets + cli + pusha + in al,60h + cmp cs:isstate,1 + jne nostate + cmp al,57 + jne nof12 + mov cs:isstate,0 + jmp noF12 + nostate: + cmp al,87 + jne NoF11 + push es + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov al,cs:infos+7 + inc al + and ax,111b + int 47h + pop es + nof11: + cmp al,88 + jne NoF12 + mov ah,26 + int 47h + call showstate + mov cs:isstate,1 + sti + waitt: + cmp cs:isstate,0 + jne waitt + mov ah,27 + int 47h + noF12: + popa + sti + iret + isstate db 0 + infos db 10 dup (0) + showstate: + push ds es + push ss + push gs + push fs + push es + push ds + push cs + pushad + pushfd + push cs + push cs + pop es + pop ds + mov ah,2 + int 47h + mov ah,21 + mov cl,4 + int 47h + mov ah,13 + mov si,offset reg + int 47h + mov ah,6 + int 47h + mov ah,21 + mov cl,7 + int 47h + mov ah,13 + mov si,offset fla + int 47h + pop edx + mov cx,32 + mov ah,11 + int 47h + mov ah,5 + int 47h + mov ah,10 + int 47h + mov si,offset regs + mov bx,8+6 + mov ah,21 + mov cl,6 + int 47h +showallREG: + mov ah,6 + int 47h + cmp bx,7 + jb nodr + pop edx + jmp popo + nodr: + mov ah,21 + mov cl,1 + int 47h + xor edx,edx + pop dx + popo: + mov ah,13 + int 47h + mov ah,10 + mov cx,32 + int 47h + mov ah,5 + int 47h + push si + mov si,offset gr + mov ah,13 + int 47h + mov ah,8 + int 47h + mov si,offset dr + mov ah,13 + int 47h + pop si + add si,5 + dec bx + jnz showallreg + mov ah,34 + mov di,offset infos + int 47h + mov ah,25 + mov bl,cs:infos + xor bh,bh + dec bl + int 47h + mov si,offset app + mov ah,13 + int 47h + mov ah,32 + mov bl,cs:infos + xor bh,bh + mov di,ax + dec di + mov cl,116 + int 47h + pop es ds + ret +reg db 'State of registers',0 +fla db 'Flags:',0 +regs db 'EDI:',0 + db 'ESI:',0 + db 'EBP:',0 + db 'ESP:',0 + db 'EBX:',0 + db 'EDX:',0 + db 'ECX:',0 + db 'EAX:',0 + db ' CS:',0 + db ' DS:',0 + db ' ES:',0 + db ' FS:',0 + db ' GS:',0 + db ' SS:',0 +gr db '(',0 +dr db ')',0 +app db 'Press space to quit...',0 end start diff --git a/logo.asm b/logo.asm index 53b4fce..842e04e 100755 --- a/logo.asm +++ b/logo.asm @@ -6,11 +6,11 @@ org 0100h start: mov si,offset logo -call searchfile +mov ah,4 +xor di,di mov bx,6000h mov es,bx -mov bx,0h -call loadfatway +int 48h push es pop ds mov bx,5000h @@ -119,203 +119,7 @@ nopp: shl cx,2 add si,cx jmp no - -Searchfile: -push bx dx si di ds es -mov di,offset temp -mov bx,offset buffer -call asciiztofit -mov cx,13 -check: -call readsector -jc errorboot -xor di,di -findnext: -cmp byte ptr [bx+di],0 -je errorboot -push si di cx -mov si,di -add si,bx -mov di,offset temp -mov cx,12+4 -rep cmpsb -pop cx di si -je oksystem -add di,32 -inc dx -cmp dx,nbfit -ja errorboot -cmp di,sizec -jb findnext -inc cx -jmp Check -oksystem: -mov cx,[di+BX+26] -errorboot: -pop es ds di si dx bx -ret - -;->name ds:si ->es:di -AsciiZtoFit: -push ax bx cx dx si di ds es -xor bx,bx -mov dx,di -noextens: -mov al,[si+bx] -cmp al,'.' -je extens -call Issystchar -jc errortranslate -mov es:[di],al -inc di -inc bx -cmp bx,namesize ;(.) -jne noextens -erro: -stc -jmp errortranslate -extens: -add si,bx -inc si -sub bx,namesize -neg bx -mov al,0 -mov cx,bx -cld -rep stosb -xor bx,bx -wasextens: -mov al,[si+bx] -cmp al,0 -je endextens -call Issystchar -jc errortranslate -mov es:[di],al -inc di -inc bx -cmp bx,extsize -jne wasextens -jmp erro -endextens: -sub bx,extsize -neg bx -mov al,0 -mov cx,bx -cld -rep stosb -mov si,dx -mov di,dx -push es -pop ds -mov cx,extsize+namesize -call uppercaseMEM -clc -endtranslate: -pop es ds di si dx cx bx ax -ret -errortranslate: -stc -jmp endtranslate - -;Carry si al = caractŠre systŠme -isSystchar: -push di -mov di,offset exeptchar -isexcept: -cmp al,cs:[di] -je nogood -inc di -cmp byte ptr cs:[di],0 -jne isexcept -endanal: -pop di -ret -exeptchar db '/\<>:|.',01,0,0 -nogood: -stc -jmp endanal - -;Transforme les x caractŠres de la mem en ds:si en maj -uppercaseMEM: -push si di cx ax -mov di,si -uppercaser: -mov al,ds:[si] -inc si -cmp al,'A' -jb nonmaj -cmp al,'Z' -ja nonmaj -add al,'a'-'A' -nonmaj: -mov es:[di],al -inc di -dec cx -jnz uppercaser -enduppercase: -clc -pop ax cx di si -ret - -nbfit equ 255 - - -namesize equ 12 -extsize equ 5 - -;cx entr‚e -> fatway chemin -getfatway: -push bx cx es -mov bx,offset fatway -fatagain: -mov cs:[bx],cx -add bx,2 -cmp cx,0FFF0h -jae finishload -call getfat -jnc fatagain -finishload: -pop es cx bx -ret - -lastread dw 0FFFFh - -ReadSector: -push ax cx dx si - cmp cx,cs:lastread - je done - mov cs:LastRead,cx - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 2 - int 13h - jnc Done - dec SI - jnz TryAgain -mov word ptr cs:lastread,0ffffh -Done: - pop si dx cx ax -ret - + DecompressRle: push cx dx si di mov dx,cx @@ -354,63 +158,5 @@ neg bp pop di si dx cx ret - - -dot db '.',0 - -loadfatway: -push bx di -call getfatway -jc endload -mov di,offset fatway -mov si,offset dot -mov ah,13 -loadagain: -mov cx,cs:[di] -cmp cx,0FFF0h -jae endload -add di,2 -call readsector -jc endload -int 47h -add bx,cs:sizec -jmp loadagain -endload: -mov cx,bx -pop di bx -ret - -sizec dw 512 -reserv dw 1 - -;<-cx nøsecteur ->cx code FAT -getfat: -push es ax bx dx -mov ax,cx -xor dx,dx -div cs:sizec -mov cx,ax -add cx,cs:reserv -mov bx,offset buffer -push cs -pop es -call readsector -jc errorgetfat -shl dx,1 -add bx,dx -mov cx,cs:[bx] -errorgetfat: -pop dx bx ax es -ret - logo db 'cos.rip',0 -temp db 12+5+1 dup (0) - -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 - -fatway equ $ - -buffer equ $+5000 end start diff --git a/lpt.asm b/lpt.asm new file mode 100755 index 0000000..9f07dda --- /dev/null +++ b/lpt.asm @@ -0,0 +1,514 @@ +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +db 'LPT' +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +sti +iret +current dw 0 +tables dw getlptin + dw getlptout + dw getlptinout + dw setlptin + dw setlptout + dw setlptinout + dw getlpt + dw getfirstlpt + dw setemettor + dw setreceptor + dw settimeout + dw gettimeout + dw receivelpt + dw sendlpt + dw receivelptblock + dw sendlptblock + dw receivecommand + dw sendcommand + +;envois une commande al +sendcommand: +push ax bx cx di +mov bl,al +xor bh,bh +shl bx,1 +add bx,offset cmde +call cs:[bx] +pop di cx bx ax +ret +cmde dw nothing + dw getram + +;recupŠre la ram en ds:si de cx distant caractŠres en es:di local +getram: +push ax bx cx ds +mov bx,offset command +mov cs:[bx+2],ds +mov cs:[bx],si +mov cs:[bx+4],cx +push cs +pop ds +mov si,bx +mov cx,6 +call sendlptblock +call receivelptblock +pop ds cx bx ax +ret + +;Re‡ois une commande et l'execute +Receivecommand: +push ax bx cx di es +push cs +pop es +mov di,offset command +call receivelptblock +mov bl,al +xor bh,bh +shl bx,1 +add bx,offset cmd +call cs:[bx] +pop es di cx bx ax +ret +command db 25 dup (0) +cmd dw nothings + dw sendram + +nothings: +ret + +Sendram: +push ax cx si ds +mov si,es:[di] +mov ax,es:[di+2] +mov ds,ax +mov cx,es:[di+4] +call sendlptblock +pop ds si cx ax +ret + + +;---------Segment Adress----------- +Bios equ 040h +;---------Offset Adress------------ +Lptadr equ 008h +Timer equ 06Ch +;---------Constant----------------- +onesec equ 18 +tensec equ 182 +Ack equ 00 +Nack equ 0FFh +maxtry equ 10 +tokenstart equ 0 +tokennext equ 1 +tokenstop equ 2 +tokenbad equ 3 +tokenresend equ 4 + + +Initlpt: +push ax ecx +call StartTimer +cmp emettor,0 +je receptinit +mov al,10000b +call SetLptOut +waitinit1: +call EndTimer +cmp cx,cs:timeout +ja errorinit +call getlptIn +cmp al,00000b +jnz waitinit1 +jmp endinit +receptinit: +call EndTimer +cmp cx,cs:timeout +ja errorinit +call getlptIn +cmp al,00000b +jnz receptinit +mov al,10000b +call SetLptOut +endinit: +clc +pop ecx ax +ret +errorinit: +stc +pop ecx ax +ret + + +;-Envoie DL (dh) JNE si problŠme JNC error timeout +Sendlpt: +push ax bx ecx +call StartTimer +mov dh,dl +mov al,dl +and al,0Fh +call SetLptOut +waitSend: +call EndTimer +cmp cx,cs:timeout +ja errorsend +call getlptIn +bt ax,4 +jnc waitsend +and al,0Fh +mov bl,al +call StartTimer ;///// +mov al,dh +shr al,4 +or al,10000b +call SetLptOut +waitSend2: +call EndTimer +cmp cx,cs:timeout +ja errorsend +call getlptIn +bt ax,4 +jc waitsend2 +and al,0Fh +shl al,4 +add bl,al +cmp dl,bl +pop ecx bx ax +clc +ret +errorsend: +pop ecx bx ax +stc +ret + + +;-Re‡ois DL (dh) +Receivelpt: +push ax bx ecx +call StartTimer +waitreceive: +call EndTimer +cmp cx,cs:timeout +ja errorreceive +call getlptIn +bt ax,4 +jnc waitreceive +and al,0Fh +mov dl,al +call SetLptOut +call StartTimer ;///// +waitreceive2: +call EndTimer +cmp cx,cs:timeout +ja errorreceive +call getlptIn +bt ax,4 +jc waitreceive2 +and al,0Fh +mov dh,al +shl dh,4 +add dl,dh +or al,10000b +call SetlptOut +clc +pop ecx bx ax +ret +errorreceive: +stc +pop ecx bx ax +ret + +;-AX +SetTimeout: +mov cs:Timeout,dx +ret + +timeout dw tensec + +getTimeout: +mov dx,cs:Timeout +ret + +SetEmettor: +mov cs:Emettor,1 +ret + +Emettor db 0 + +SetReceptor: +mov cs:Emettor,0 +ret + +;->bx Nøport->Adresse dx +GetLpt: +push ax bx ds +mov ax,bios +mov ds,ax +dec bx +shl bx,1 +mov dx,ds:[Lptadr+bx] +mov cs:lpt,dx +pop ds bx ax +ret +lpt dw 0 + +;->bx Nøport->Adresse dx +GetFirstLpt: +push ax ds +mov ax,bios +mov ds,ax +xor bx,bx +findlpt: +mov dx,ds:[Lptadr+bx] +cmp dx,0 +jne oklpt +add bx,2 +cmp bx,4 +jbe findlpt +oklpt: +mov cs:lpt,dx +pop ds ax +ret + +;-> +StartTimer: +push ax ecx ds +mov ax,Bios +mov ds,ax +mov ecx,ds:[timer] +mov cs:times,ecx +pop ds ecx ax +ret +times dd 0 + +;->Ecx time elapsed +EndTimer: +push ax ds +mov ax,Bios +mov ds,ax +mov ecx,ds:[timer] +sub ecx,cs:times +mov ecx,0 +pop ds ax +ret + +;-> +GetLptOut: +push dx +mov dx,cs:lpt +in al,dx +pop dx +ret + +GetLptIn: +push dx +mov dx,cs:lpt +inc dx +in al,dx +shr al,3 +pop dx +ret + +GetLptInOut: +push dx +mov dx,cs:lpt +add dx,2 +in al,dx +and al,11111b +pop dx +ret + +SetLptOut: +push dx +mov dx,cs:lpt +out dx,al +pop dx +ret + +SetLptIn: +push dx +mov dx,cs:lpt +inc dx +out dx,al +pop dx +ret + +SetLptInOut: +push dx +mov dx,cs:lpt +add dx,2 +out dx,al +pop dx +ret + +;R‚alise un checksum 8 bits sur donn‚es DS:SI, nb CX r‚sultat dans dl +Checksum8: +push cx si +check: +add dl,[si] +inc si +dec cx +jnz check +pop si cx +ret + +;DS:SI pointeur sur donn‚es, CX nombres de donn‚es, AL token +SendLptBlock: +push ax bx cx edx si edi bp +mov dx,cx +shl edx,16 +mov dh,al +call checksum8 +mov edi,edx +xor dh,dh +mov bp,dx +mov ah,maxtry +retry: +mov bl,4 +xor al,al +header: +mov dx,di +call sendlpt +setne al +jc outt +rol edi,8 +dec bl +jnz header +cmp al,0 +jne notgood +mov dl,ACK +jmp allsend +notgood: +mov dl,NACK +allsend: +call sendlpt +setne al +jc outt +cmp al,0 +je okheader +dec ah +jnz retry +jmp outt +okheader: +cmp cx,0 +je endoftrans +mov di,maxtry +retry2: +mov bx,cx +xor ax,ax +body: +mov dl,[si+bx-1] +add ah,dl +call sendlpt +setne al +jc outt +dec bx +jnz body +cmp al,0 +jne notgood2 +mov dl,ACK +jmp allisend +notgood2: +mov dl,NACK +allisend: +call sendlpt +setne al +jc outt +cmp al,0 +je endoftrans +dec di +jnz retry2 +outt: +stc +endoftrans: +mov al,ah +xor ah,ah +cmp bp,ax +pop bp edi si edx cx bx ax +ret + +;Receptionne en es:di les donn‚es au nombres de CX token AL (AH) (ECX) +receiveLptBlock: +push bx dx si bp +mov ah,maxtry +retrye: +mov bl,4 +headere: +call receivelpt +jc outte +mov cl,dl +rol ecx,8 +dec bl +jnz headere +call receivelpt +jc outte +cmp dl,ACK +je okheadere +dec ah +jnz retrye +jmp outte +okheadere: +mov al,ch +xor ch,ch +mov bp,cx +rol ecx,16 +cmp cx,0 +je endoftranse +mov si,maxtry +retrye2: +mov bx,cx +xor ah,ah +bodye: +call receivelpt +jc outte +mov es:[di+bx-1],dl +add ah,dl +dec bx +jnz bodye +call receivelpt +jc outte +cmp dl,ACK +je endoftranse +dec si +jnz retrye2 +outte: +stc +endoftranse: +mov bl,ah +xor bh,bh +cmp bp,bx +pop bp si dx bx +ret +end start diff --git a/system.asm b/system.asm index ef6c91e..4d26b56 100755 --- a/system.asm +++ b/system.asm @@ -5,27 +5,27 @@ smart org 0100h - - start: mov si,offset video -call searchfile mov bx,8400h -mov es,bx -mov bx,100h -call loadfatway -mov di,bx -mov bx,47h -call setint -ret -mov bx,9 -call getint -mov cs:int9seg,ds -mov cs:int9off,si -push cs -pop es -mov di,offset int9 -call setint +mov ax,47h +call installhandler +mov si,offset lpt +mov bx,7400h +mov ax,49h +call installhandler +mov si,offset keyboard +mov bx,7000h +mov ax,9h +call replacehandler +mov si,offset timer +mov bx,7800h +mov ax,8h +call replacehandler +mov si,offset drive +mov bx,9000h +mov ax,48h +call installhandler start2: push cs push cs @@ -53,9 +53,10 @@ int 47h mov ah,6 int 47h xor di,di +mov ax,0001h mov bx,offset buffer -mov cx,13 -call readsector +mov cx,13 +int 48h xor bp,bp showall: cmp byte ptr [bx+di],0 @@ -189,7 +190,7 @@ pop es cx bx ret loadfatway: -push bx cx di +push ax bx cx di call getfatway jc endload mov di,offset fatway @@ -206,7 +207,7 @@ int 47h add bx,cs:sizec jmp loadagain endload: -pop di cx bx +pop di cx bx ax ret sizec dw 512 @@ -253,9 +254,9 @@ ret xx dw 1 xxold dw 0 menu db 'F1 Read disk F2 Read file F9 Quit F11 Change video F12 Debug ',0 -msg1 db 'Cos 2000 menu loader release 1.0',0 +msg1 db ' Cos 2000 menu loader release 1.0',0 msg2 db 'The program is loading',0 -msg3 db 'Cos will restart your computer, eject the floppy disk and press a key',0 +msg3 db ' Cos will restart your computer, eject the floppy disk and press a key',0 prompt db '>',0 spaces db ' ',0 dot db '.',0 @@ -297,6 +298,7 @@ Done: pop si dx cx ax ret +WriteSector: push ax cx dx si cmp cs:Lastread,cx jne nodestruct @@ -332,10 +334,43 @@ Done2: pop si dx cx ax ret -Lastread dw 0FFFFh -WriteSector: +Lastread dw 0FFFFh + +;remplace le handler pointer par ds:si en bx:100h interruption ax +replacehandler: +push ax bx si di ds es +mov es,bx +mov di,0100h +call loadfile +mov bx,ax +call getint +mov es:[102h],si +mov es:[104h],ds +call setint +pop es ds di si bx ax +ret + +;install le handler pointer par ds:si en bx:100h interruption ax +installhandler: +push bx di es +mov es,bx +mov di,100h +call loadfile +mov bx,ax +call setint +pop es di bx +ret +;Charge le fichier Ds:si en es:di +loadfile: +push bx cx +call searchfile +mov bx,di +call loadfatway +pop cx bx +ret + ;met es:di le handle de l'int bx setint: push ax bx ds @@ -352,188 +387,19 @@ ret ;met ds:si le handle de l'int bx getint: push ax bx es -cli shl bx,2 xor ax,ax mov es,ax mov si,es:[bx] mov ds,es:[bx+2] pop es bx ax -sti -ret - -int9off dw 0 -int9seg dw 0 - -int9: - pushf - db 2eh,0ffh,1eh - dw int9off - cli - pusha - in al,60h - cmp cs:isstate,1 - jne nostate - cmp al,57 - jne nof12 - mov cs:isstate,0 - jmp noF12 - nostate: - cmp al,87 - jne NoF11 - push es - push cs - pop es - mov di,offset infos - mov ah,34 - int 47h - mov al,cs:infos+7 - inc al - and ax,111b - int 47h - pop es - - nof11: - cmp al,88 - jne NoF12 - mov ah,26 - int 47h - call showstate - mov cs:isstate,1 - sti - waitt: - cmp cs:isstate,0 - jne waitt - mov ah,27 - int 47h - noF12: - popa - sti - iret - isstate db 0 - infos db 10 dup (0) - - showstate: - push ds es - push ss - push gs - push fs - push es - push ds - push cs - pushad - pushfd - - push cs - push cs - pop es - pop ds - mov ah,2 - int 47h - mov ah,21 - mov cl,4 - int 47h - mov ah,13 - mov si,offset reg - int 47h - mov ah,6 - int 47h - mov ah,21 - mov cl,7 - int 47h - mov ah,13 - mov si,offset fla - int 47h - pop edx - mov cx,32 - mov ah,11 - int 47h - mov ah,5 - int 47h - mov ah,10 - int 47h - mov si,offset regs - mov bx,8+6 - mov ah,21 - mov cl,6 - int 47h -showallREG: - mov ah,6 - int 47h - cmp bx,7 - jb nodr - pop edx - jmp popo - nodr: - mov ah,21 - mov cl,1 - int 47h - xor edx,edx - pop dx - popo: - mov ah,13 - int 47h - mov ah,10 - mov cx,32 - int 47h - mov ah,5 - int 47h - push si - mov si,offset gr - mov ah,13 - int 47h - mov ah,8 - int 47h - mov si,offset dr - mov ah,13 - int 47h - pop si - add si,5 - dec bx - jnz showallreg - mov ah,34 - mov di,offset infos - int 47h - mov ah,25 - mov bl,cs:infos - xor bh,bh - dec bl - int 47h - mov si,offset app - mov ah,13 - int 47h - mov ah,32 - mov bl,cs:infos - xor bh,bh - mov di,ax - dec di - mov cl,116 - int 47h - pop es ds - ret - -reg db 'State of registers',0 -fla db 'Flags:',0 -regs db 'EDI:',0 - db 'ESI:',0 - db 'EBP:',0 - db 'ESP:',0 - db 'EBX:',0 - db 'EDX:',0 - db 'ECX:',0 - db 'EAX:',0 - db ' CS:',0 - db ' DS:',0 - db ' ES:',0 - db ' FS:',0 - db ' GS:',0 - db ' SS:',0 -gr db '(',0 -dr db ')',0 -app db 'Press space to quit...',0 +ret +;Recherchele fichier et retourne sont path et en cx sont debut Searchfile: push bx dx si di ds es +push cs +pop es mov di,offset temp mov bx,offset buffer call asciiztofit @@ -674,7 +540,11 @@ extsize equ 5 nbfit equ 255 +drive db 'drive.sys',0 +timer db 'timer.sys',0 +lpt db 'lpt.sys',0 video db 'video.sys',0 +keyboard db 'keyboard.sys',0 temp db 12+5+1 dup (0) DiskSectorsPerTrack dw 18 diff --git a/test.asm b/test.asm deleted file mode 100755 index b102754..0000000 --- a/test.asm +++ /dev/null @@ -1,274 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: -go: -call calc -jmp go -ret - -calc: -pusha -mov ah,2Ch -int 21h -mov bh,dh -xor ebp,ebp -wait2: -xor bl,bl -waits: -mov dx,3dah -in al,dx -and al,1000b -jz wait2 -cmp bl,1 -je waits -inc ebp -inc bl -cmp ebp,300 -jne waits -mov ah,2Ch -int 21h -sub dh,bh -mov bl,dh -xor bh,bh -mov ax,bp -shr ebp,16 -mov dx,bp -div bx -xor edx,edx -mov dx,ax -call showint -popa -ret - -;===================================Afficher un int EDX a l'‚cran en ah,al================ -ShowInt: - push eax bx cx edx esi di es ds - mov di,0 - mov cx,0B800h - mov es,cx - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint3: - xor edx,edx - div esi - add dl,'0' - mov dh,cs:colors - sub bx,2 - add cx,2 - mov cs:[bx],dx - cmp ax,0 - jne decint3 - mov si,bx - push cs - pop ds - cld - rep movsb - pop ds es di esi edx cx bx eax -ret -showbuffer db 35 dup (0FFh) - -colors equ 1 - - -;40*25 16 couleurs -mode0 DB 67H,00H, 03H,08H,03H,00H,02H - DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,01FH,00H,4FH,0DH,0EH,00H,00H,00H,00H - DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,01H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,08H,00H - db 40,25 - -;80*25 16 couleurs -mode1 DB 67H,00H, 03H,00H,03H,00H,02H - DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0DH,0EH,00H,00H,00H,00H - DB 9CH,0EH,8FH,28H,1FH,96H,0B9H,0A3h,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,6H,7H,8H,9H,0AH,0BH,0CH,0DH,0EH,0FH - DB 0CH,00H,0FH,08H,00H - db 80,25 - -;80*50 16 couleurs -mode2 DB 67H, 00H, 03H,00H,03H,00H,02H - DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H - DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,00H,00H - db 80,50 - -;100*50 16 couleurs -mode3 DB 067H , 00H, 03H,01H,03H,00H,02H - DB 70H, 63H , 64H ,85H,68H,84H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H - DB 00H,9Ch, 08EH ,8FH, 32H ,1FH,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,00H,00H - db 100,50 - - -;100*60 16 couleurs -mode22 DB 067H , 00H, 03H,01H,03H,00H,02H - DB 70H, 63H , 64H ,85H,68H,84H,0FFH,1FH,00H,47H,06H,07H,00H,00H,00H - DB 00H,0E7H,8EH,0DFH,32H,1FH,0DFH,0E5H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,00H,00H - db 100,60 - - -Sequencer equ 03C4h -misc equ 03C2h -misc2 equ 03CCh -CCRT equ 03D4h -Attribs equ 03C0h -graphic equ 03CEh -statut equ 3DAh - -;====Met les cl registres cons‚cutif … ds:si du port dx -Setregs: -push ax -xor ax,ax -initreg: -mov ah,[si] -out dx,ax -inc al -inc si -cmp al,cl -jb initreg -pop ax -ret - -;met une serie de registres Cl a partir du port dx -Setlowregs: -push ax bx -xor bx,bx -cmp cl,0 -je only -initreg2: -mov al,bl -out dx,al -only: -mov al,[si] -out dx,al -inc bl -inc si -cmp bl,cl -jb initreg2 -pop bx ax -ret - -Setvideomode: -push ax cx dx si -xor ah,ah -mov si,ax -shl si,6 -add si,offset mode0 -xor cx,cx -mov dx,misc -call setlowregs -mov dx,statut -call setlowregs -mov dx,sequencer -mov cl,5 -call setregs -mov ax,0E11h -mov dx,ccrt -out dx,ax -mov cl,25 -call setregs -mov dx,graphic -mov cl,9 -call setregs -mov dx,attribs -mov cl,20 -call setlowregs -mov al,20h -out dx,al -pop dx cx ax si -ret - -;====Met les cl registres cons‚cutif … en es:DI du port dx TOUT REGISTRES -getregs: -push ax bx dx -xor bx,bx -cmp cl,0 -je only2 -initreg4: -mov al,bl -out dx,al -cmp dx,3C1h -je only2 -inc dx -only2: -in al,dx -mov es:[di],al -dec dx -inc bl -inc di -cmp bl,cl -jb initreg4 -pop dx bx ax -ret - -;====Met le mode video present dans Es:di -getvideomode: -push ax cx dx di -xor cx,cx -mov dx,misc2 -call getregs -mov dx,statut -call getregs -mov dx,sequencer -mov cl,5 -call getregs -mov dx,ccrt -mov cl,25 -call getregs -mov dx,graphic -mov cl,9 -call getregs -mov dx,attribs -mov cl,20 -call getregs -mov al,20h -out dx,al -pop di dx cx ax -ret - -;mode s‚curis‚ al -Safemode: -push cx si di ds es -call setvideomode -mov di,offset buffer -push cs -pop es -push cs -pop ds -call getvideomode -mov byte ptr es:[di+1],0 -mov si,offset mode1 -mov di,offset buffer -mov cx,62 -rep cmpsb -jne errormode -clc -endsafe: -pop ds es di si cx -ret -errormode: -stc -jmp endsafe - - - -buffer db 0 - -end start diff --git a/timer.asm b/timer.asm new file mode 100755 index 0000000..a7c11e4 --- /dev/null +++ b/timer.asm @@ -0,0 +1,32 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: + +jmp tsr +offsets dd 0 +db 'TIMER' +tsr: + pushf + db 2eh,0ffh,1eh + dw offsets + cli + push ax bx es + mov bx,cs:compteur + inc bx + and bx,11b + mov cs:compteur,bx + mov bx,cs:[offset fig+bx] + mov ax,0B800h + mov es,ax + mov es:[0],bl + pop es bx ax + sti + iret + compteur dw 0 + fig db 'Ä\³/' +end start diff --git a/verif.asm b/verif.asm index c418726..3250883 100755 --- a/verif.asm +++ b/verif.asm @@ -58,7 +58,8 @@ VerifAll: mov si,offset Msg3 int 47h call gauge - call verifysector + mov ah,2 + int 48h jc errors je noprob inc di @@ -147,116 +148,4 @@ max dw 2880 sizes dw 50 xy dw 0A12h gaugetxt db 'ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ',0 - -Inverse: -mov si,512/4 -invert: -shl si,2 -not dword ptr [bx+si-4] -shr si,2 -dec si -jnz invert -ret - -VerifySector: -push bx cx si di ds es -push cs -pop es -push cs -pop ds -mov bx,offset buffer -call ReadSector -jc errorverify -call inverse -call WriteSector -jc errorverify -mov bx,offset buffer2 -call ReadSector -call inverse -jc errorverify -mov bx,offset buffer -call inverse -call WriteSector -jc errorverify -mov cx,512/4 -mov si,offset buffer -mov di,offset buffer2 -cld -rep cmpsd -errorverify: -pop es ds di si cx bx -ret - -ReadSector: -push ax cx dx si - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 2 - int 13h - jnc Done - dec SI - jnz TryAgain -Done: - pop si dx cx ax -ret - -WriteSector: -push ax cx dx si - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor DX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain2: - mov AL, 1 - mov DL, 0 - mov AH, 3 - int 13h - jnc Done2 - dec SI - jnz TryAgain2 -Done2: - pop si dx cx ax -ret - -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 - -Buffer equ $ -Buffer2 equ $+512 - - End Start diff --git a/video.asm b/video.asm index 96d17c4..775ddc0 100755 --- a/video.asm +++ b/video.asm @@ -6,7 +6,8 @@ smart org 0100h start: - +jmp tsr +db 'VIDEO' Tsr: cli cmp ax,1234h @@ -185,14 +186,14 @@ mode1 DB 67H,00H, 03H,00H,03H,00H,02H db 80,25 ;80*50 16 couleurs -mode2 DB 67H, 00H, 03H,00H,03H,01H,02H +mode1b DB 63H, 00H, 03H,01H,03H,01H,02H DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH DB 0CH,00H,0FH,00H,00H - db 80,50 - + db 80,50 + ;100*50 16 couleurs mode3 DB 067H,00H,03H,01H,03H,01H,02H DB 70H,63H,64H,85H,68H,84H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H @@ -200,8 +201,7 @@ mode3 DB 067H,00H,03H,01H,03H,01H,02H DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH DB 0CH,00H,0FH,00H,00H - db 100,50 - + db 100,50 ;100*60 16 couleurs mode4b DB 067H,00H,03H,01H,03H,01H,02H From 6b08464f517a9246d54dd40260fd913c01e6b4af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Wed, 9 May 2001 22:48:10 +0200 Subject: [PATCH 07/17] =?UTF-8?q?feat:=20ajout=20de=20fonction=20permettan?= =?UTF-8?q?t=20de=20g=C3=A9rer=20les=20interruptions,=20cr=C3=A9ation=20d'?= =?UTF-8?q?une=20ligne=20de=20commande.=20Gestion=20de=20la=20souris.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8253.asm | 53 ++++++ asm.bat | 2 + asmsys.bat | 9 + boot.asm | 16 +- clean.bat | 1 + drive.asm | 174 ++++++++++++++---- editor.asm | 77 -------- keyboard.asm | 121 ++++++++----- logo.asm | 154 ++-------------- lpt.asm | 217 ++++++++++++++++++++-- mm.asm | 52 ++++++ mouse.asm | 257 ++++++++++++++++++++++++++ pic8259a.asm | 237 ++++++++++++++++++++++++ prompt.asm | 233 ++++++++++++++++++++++++ system.asm | 81 +++++++-- test.asm | 330 ++++++++++++++++++++++++++++++++++ timer.asm | 59 ++++++ video.asm | 495 +++++++++++++++++++++++++++++++++++++++++++++++++-- 18 files changed, 2227 insertions(+), 341 deletions(-) create mode 100755 8253.asm create mode 100755 asmsys.bat create mode 100755 clean.bat create mode 100755 mm.asm create mode 100755 mouse.asm create mode 100755 pic8259a.asm create mode 100755 prompt.asm create mode 100755 test.asm diff --git a/8253.asm b/8253.asm new file mode 100755 index 0000000..7189103 --- /dev/null +++ b/8253.asm @@ -0,0 +1,53 @@ +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +db '8253' +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +sti +iret +current dw 0 +tables dw enableirq + dw disableirq + dw readmaskirq + dw readirr + dw readisr + dw installhandler + dw replacehandler + dw getint + dw setint + dw seteoi + diff --git a/asm.bat b/asm.bat index 8223189..daef462 100755 --- a/asm.bat +++ b/asm.bat @@ -11,6 +11,8 @@ echo Copying file %1... if "%1"=="video" goto video if "%1"=="lpt" goto system if "%1"=="keyboard" goto system +if "%1"=="mouse" goto system +if "%1"=="pic8259a" goto system if "%1"=="timer" goto system if "%1"=="drive" goto system if "%1"=="system" goto system diff --git a/asmsys.bat b/asmsys.bat new file mode 100755 index 0000000..e18c01e --- /dev/null +++ b/asmsys.bat @@ -0,0 +1,9 @@ +@echo off +call asm video +call asm system +call asm lpt +call asm keyboard +call asm pic8259a +call asm timer +call asm drive +call asm mouse diff --git a/boot.asm b/boot.asm index 347a19d..438a180 100755 --- a/boot.asm +++ b/boot.asm @@ -8,17 +8,17 @@ start: jmp boot -bootdb db 'COS2000A' ;ID Formatage +bootdb db 'COS2000A' ;Fabricant + n°série Formatage sizec dw 512 ;octet/secteur db 1 ;secteur/cluster reserv dw 1 ;secteur reserv‚ -nbfat db 1 ;nb de FAT -nbfit dw 25 ;nb secteur rep racine -allclu dw 2880 ;nb secteur du volume - db 0F0h ;ID support -fatsize dw 12 ;secteur/FAT +nbfat db 1 ;nb de copie de la FAT +nbfit dw 25 ;taille rep racine +allclu dw 2880 ;nb secteur du volume si < 32 még + db 0F0h ;Descripteur de média +fatsize dw 12 ;secteur/FAT nbtrack dw 18 ;secteur/piste -head dw 2 ;nb de tˆte +head dw 2 ;nb de tˆteb de lecture/écriture hidden dd 0 ;nombre de secteur cach‚s dd 0 ;si nbsecteur = 0 nbsect ; the number of sectors bootdrv db 0 ;Lecteur de d‚marrage @@ -119,7 +119,7 @@ oksystem: mov si,offset syst call showstr mov cx,[di+BX+26] -mov bx,1000h +mov bx,200h mov es,bx push bx mov bx,0100h diff --git a/clean.bat b/clean.bat new file mode 100755 index 0000000..200b0c1 --- /dev/null +++ b/clean.bat @@ -0,0 +1 @@ +del ..\data\*.exe diff --git a/drive.asm b/drive.asm index e2766a4..39204df 100755 --- a/drive.asm +++ b/drive.asm @@ -5,6 +5,7 @@ smart org 0100h + start: jmp tsr db 'DRIVE' @@ -47,10 +48,12 @@ tables dw readsector dw verifysector2 dw loadfatway dw loadfile + dw compressrle + dw decompressrle ;cx entr‚e -> fatway chemin getfatway: -push bx cx es +push bx cx mov bx,offset fatway fatagain: mov cs:[bx],cx @@ -60,48 +63,50 @@ jae finishload call getfat jnc fatagain finishload: -pop es cx bx +pop cx bx ret -;Charge le fichier de chemin cx +;Charge le fichier de chemin cx -> taille dx loadfatway: -push ax bx cx di +push ax bx cx di call getfatway jc endload mov di,offset fatway +xor dx,dx loadagain: mov cx,cs:[di] cmp cx,0FFF0h jae endload add di,2 -xor al,al +mov al,1 call readsector jc endload add bx,cs:sizec +add dx,cs:sizec jmp loadagain endload: pop di cx bx ax ret -sizec dw 512 -reserv dw 1 ;<-cx nøsecteur ->cx code FAT getfat: push es ax bx dx -mov ax,cx -xor dx,dx -div cs:sizec -mov cx,ax -add cx,cs:reserv -mov bx,offset buffer +push cs +pop ds push cs pop es +mov ax,cx +xor dx,dx +div sizec +mov cx,ax +add cx,reserv +mov bx,offset buffer call readsector jc errorgetfat shl dx,1 add bx,dx -mov cx,cs:[bx] +mov cx,[bx] errorgetfat: pop dx bx ax es ret @@ -140,7 +145,7 @@ TryAgain: jnc Done dec SI jnz TryAgain -mov word ptr cs:lastread,0ffffh + mov word ptr cs:lastread,0ffffh Done: pop si dx cx ax ret @@ -176,7 +181,7 @@ TryAgain2: int 13h jnc Done2 dec SI - jnz TryAgain2 + jnz TryAgain2 Done2: pop si dx cx ax ret @@ -229,27 +234,32 @@ or byte ptr [bp+6],10b nook: ret -;Charge le fichier Ds:si en es:di +;Charge le fichier Ds:si en es:di taille-> cx loadfile: -push bx cx +push bx call searchfile +jc errorloadfile mov bx,di call loadfatway -pop cx bx -ret +mov cx,dx +errorloadfile: +pop bx +ret ;Recherche le fichier et retourne sont path et en cx sont debut Searchfile: push bx dx si di ds es push cs pop es +xor dx,dx mov di,offset temp call asciiztofit -mov bx,offset buffer push cs pop ds mov cx,13 check: +mov al,1 +mov bx,offset buffer call readsector jc errorboot xor di,di @@ -261,6 +271,7 @@ mov si,di add si,bx mov di,offset temp mov cx,12+4 +cld rep cmpsb pop cx di si je oksystem @@ -274,7 +285,11 @@ inc cx jmp Check oksystem: mov cx,[di+BX+26] +cld +jmp goodboot errorboot: +stc +goodboot: pop es ds di si dx bx ret @@ -345,15 +360,15 @@ isSystchar: push di mov di,offset exeptchar isexcept: -cmp al,[di] +cmp al,cs:[di] je nogood inc di -cmp byte ptr [di],0 +cmp byte ptr cs:[di],0 jne isexcept endanal: -pop di +clc +pop di ret -exeptchar db '/\<>:|.',01,0,0 nogood: stc jmp endanal @@ -380,19 +395,110 @@ clc pop ax cx di si ret -nbfit equ 255 +;decompress ds:si en es:di taille bp d‚compress‚ cx compress‚ +DecompressRle: +push cx dx si di +mov dx,cx +mov bp,di +decompression: +mov eax,[si] +cmp al,'/' +jne nocomp +cmp si,07FFFh-6 +jae thenen +mov ecx,eax +ror ecx,16 +cmp cl,'*' +jne nocomp +cmp byte ptr [si+4],'/' +jne nocomp +mov al,ch +mov cl,ah +xor ah,ah +xor ch,ch +rep stosb +add si,5 +sub dx,5 +jnz decompression +jmp thenen +nocomp: +mov es:[di],al +inc si +inc di +dec dx +jnz decompression +thenen: +mov ax,dx +sub bp,di +neg bp +pop di si dx cx +ret + +;compress ds:si en es:di taille cx d‚compress‚ BP compress‚ +CompressRle: +push ax bx cx dx si di ds es +mov bp,di +xchg si,di +push es +push ds +pop es +pop ds +mov dx,cx +;mov bp,cx +againcomp: +mov bx,di +mov al,es:[di] +mov cx,dx +cmp ch,0 +je poo +mov cl,0ffh +;mov cx,bp +;sub cx,di +;mov ah,cl +poo: +mov ah,cl +inc di +xor ch,ch +repe scasb +sub cl,ah +neg cl +cmp cl,6 +jbe nocomp2 +mov dword ptr [si],' * /' +mov byte ptr [si+4],'/' +mov [si+1],cl +mov [si+3],al +add si,5 +dec di +xor ch,ch +sub dx,cx +jnz againcomp +jmp fini +nocomp2: +mov [si],al +inc si +inc bx +mov di,bx +dec dx +jnz againcomp +fini: +sub bp,si +neg bp +pop es ds di si dx cx bx ax +ret + +nbfit equ 255 namesize equ 12 extsize equ 5 - - -temp db 12+5+1 dup (0) - +exeptchar db '/\<>:|.',01,0,0 +temp db 12+5+1+90 dup (0) DiskSectorsPerTrack dw 18 DiskTracksPerHead dw 80 DiskHeads dw 2 - -fatway equ $ - -buffer equ $+3000 +sizec dw 512 +reserv dw 1 +buffer equ $ buffer2 equ $+512 +fatway equ $+512 + end start diff --git a/editor.asm b/editor.asm index aac1b83..9760787 100755 --- a/editor.asm +++ b/editor.asm @@ -367,83 +367,6 @@ pope db 'VUE ',0 spaces db ' ³ ',0 showbuffer db 35 dup (0FFh) -Lastread dw 0FFFFh - -ReadSector: -push ax cx dx si - cmp cx,cs:lastread - je done - mov cs:LastRead,cx - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 2 - int 13h - jnc Done - dec SI - jnz TryAgain -mov word ptr cs:lastread,0ffffh -Done: - pop si dx cx ax -ret - -WriteSector: -push ax cx dx si - cmp cs:Lastread,cx - jne nodestruct - mov cs:Lastread,0ffffh - nodestruct: - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor DX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain2: - mov AL, 1 - mov DL, 0 - mov AH, 3 - int 13h - jnc Done2 - dec SI - jnz TryAgain2 -Done2: - pop si dx cx ax -ret - -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 oldmode db 0 infos db 10 dup (0) end start diff --git a/keyboard.asm b/keyboard.asm index ee09c17..2c959d5 100755 --- a/keyboard.asm +++ b/keyboard.asm @@ -15,63 +15,71 @@ tsr: db 2eh,0ffh,1eh dw offsets cli - pusha + mov cs:feax,eax in al,60h cmp cs:isstate,1 jne nostate cmp al,57 - jne nof12 + jne endof mov cs:isstate,0 - jmp noF12 + jmp endof nostate: cmp al,87 - jne NoF11 - push es - push cs - pop es - mov di,offset infos - mov ah,34 - int 47h - mov al,cs:infos+7 - inc al - and ax,111b - int 47h - pop es - nof11: + je F11 cmp al,88 - jne NoF12 - mov ah,26 - int 47h - call showstate - mov cs:isstate,1 - sti - waitt: - cmp cs:isstate,0 - jne waitt - mov ah,27 - int 47h - noF12: - popa + je F12 + endof: + mov eax,cs:feax sti iret isstate db 0 infos db 10 dup (0) - showstate: - push ds es - push ss +F11: + push ax di es + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov al,cs:infos+7 + inc al + and ax,111b + int 47h + pop es di ax + jmp endof + + +f12: + mov cs:isstate,1 + pop word ptr cs:fip + pop word ptr cs:fcs + pop dword ptr cs:ffl + mov cs:fesp,esp + push ds es + pusha + push word ptr cs:fip push gs push fs + push ss push es push ds - push cs - pushad - pushfd - + push word ptr cs:fcs + push dword ptr cs:fesp + push ebp + push edi + push esi + push edx + push ecx + push ebx + push eax + push dword ptr cs:ffl push cs push cs pop es pop ds + mov ah,26 + int 47h mov ah,2 int 47h mov ah,21 @@ -97,16 +105,17 @@ tsr: mov ah,10 int 47h mov si,offset regs - mov bx,8+6 + mov bx,8+7 mov ah,21 mov cl,6 int 47h showallREG: mov ah,6 int 47h - cmp bx,7 + cmp bx,8 jb nodr pop edx + mov cx,32 jmp popo nodr: mov ah,21 @@ -114,11 +123,11 @@ showallREG: int 47h xor edx,edx pop dx + mov cx,16 popo: mov ah,13 int 47h mov ah,10 - mov cx,32 int 47h mov ah,5 int 47h @@ -153,27 +162,43 @@ showallREG: dec di mov cl,116 int 47h + pop es ds + sti + waitt: + cmp cs:isstate,0 + jne waitt + mov ah,27 + int 47h + popa pop es ds - ret + push dword ptr cs:ffl + push word ptr cs:fcs + push word ptr cs:fip + jmp endof -reg db 'State of registers',0 -fla db 'Flags:',0 -regs db 'EDI:',0 +reg db ' State of registers',0 +fla db 'Eflags:',0 +regs db 'EAX:',0 + db 'EBX:',0 + db 'ECX:',0 + db 'EDX:',0 db 'ESI:',0 + db 'EDI:',0 db 'EBP:',0 db 'ESP:',0 - db 'EBX:',0 - db 'EDX:',0 - db 'ECX:',0 - db 'EAX:',0 db ' CS:',0 db ' DS:',0 db ' ES:',0 db ' FS:',0 db ' GS:',0 db ' SS:',0 + db ' IP:',0 gr db '(',0 dr db ')',0 app db 'Press space to quit...',0 - +ffl dd 0 +fcs dw 0 +fip dw 0 +fesp dd 0 +feax dd 0 end start diff --git a/logo.asm b/logo.asm index 842e04e..f20ec8f 100755 --- a/logo.asm +++ b/logo.asm @@ -17,146 +17,28 @@ mov bx,5000h mov es,bx xor si,si xor di,di -xor bx,bx -call DecompressRle +mov ah,6 +int 48h push es pop ds -call loadbmp -xor ax,ax +mov ax,0006h +int 47h +mov ah,38 +int 47h +mov ah,35 +int 47h +mov ah,37 +int 47h +xor cx,cx xor bx,bx -call showbmp +mov ah,36 +int 47h mov ax,0 int 16h -db 0CBH - -loadbmp: -push ax bx cx dx bp ds -mov ax,6 -int 47h -mov ax,ds:[18] -mov si,ax -shr ax,2 -and si,11b -cmp si,0 -je is4x -add ax,1 -is4x: -mov cs:sizeh,ax -mov ax,ds:[22] -mov cs:sizev,ax -mov di,0FFFFh-1024 -mov si,54 -mov cl, 0ffh -paletteload: -lodsb -shr al, 2 -mov [di+2], al -lodsb -shr al, 2 -mov [di+1], al -lodsb -shr al, 2 -mov [di+0], al -inc si -add di, 3 -dec cl -jnz paletteload -mov si,0FFFFh-1024 -mov dx, 3c8h -cld -mov cl, 0ffh -xor bx, bx -palettemake: -mov al, bl -out dx, al -inc dx -lodsb -out dx, al -lodsb -out dx, al -lodsb -out dx, al -dec dx -inc bl -dec cl -jnz palettemake -pop ds bp dx cx bx ax -ret -sizeh dw 0 -sizev dw 0 - -showbmp: -push ax bx cx dx si di ds es -mov cx,cs:sizeh -mov dx,cs:sizev -add bx,dx -mov di,ax -mov ax,bx -shl ax,6 -shl bx,8 -add di,bx -add di,ax -mov bx,di -mov ax,0A000H -mov es,ax -mov si,1024+54 -mov ax,cx -bouclebmp: -cmp di,64000 -jae nopp -cld -rep movsd -no: -mov cx,ax -sub bx,320 -mov di,bx -dec dx -jnz bouclebmp -fin: -pop es ds di si dx cx bx ax -ret -nopp: -shl cx,2 -add si,cx -jmp no - -DecompressRle: -push cx dx si di -mov dx,cx -mov bp,di -decompression: -mov eax,[si] -cmp al,'/' -jne nocomp -cmp si,07FFFh-6 -jae thenen -mov ecx,eax -ror ecx,16 -cmp cl,'*' -jne nocomp -cmp byte ptr [si+4],'/' -jne nocomp -mov al,ch -mov cl,ah -xor ah,ah -xor ch,ch -rep stosb -add si,5 -sub dx,5 -jnz decompression -jmp thenen -nocomp: -mov es:[di],al -inc si -inc di -dec dx -jnz decompression -thenen: -mov ax,dx -sub bp,di -neg bp -pop di si dx cx -ret - +mov ah,39 +int 47h +mov ax,0004 +int 47h +db 0CBH logo db 'cos.rip',0 end start diff --git a/lpt.asm b/lpt.asm index 9f07dda..3ab87ec 100755 --- a/lpt.asm +++ b/lpt.asm @@ -5,7 +5,7 @@ smart org 0100h start: jmp tsr -db 'LPT' +drv db 'LPT ',0 Tsr: cli cmp ax,1234h @@ -13,7 +13,17 @@ jne nomore mov ax,4321h jmp itsok nomore: -push bx +push bx ax +mov ah,4 +mov bh,1 +int 50h +mov bl,al +pop ax +cmp byte ptr cs:isact,1 +je nottest +mov cs:isact,1 +cmp bl,80h +jae react mov bl,ah xor bh,bh shl bx,1 @@ -37,8 +47,12 @@ mov bp,sp and byte ptr [bp+6],0FEh pop bp endofint: +mov cs:isact,0 sti iret +nottest: +pop bx +jmp endofint current dw 0 tables dw getlptin dw getlptout @@ -59,6 +73,127 @@ tables dw getlptin dw receivecommand dw sendcommand +react: +push ds es +mov cs:isact,1 +pushad +push cs +pop ds +push cs +pop es +cmp byte ptr never,1 +je oknever +mov bl,[drv+3] +sub bl,'0' +xor bh,bh +call getlpt +dec bl +shl bl,1 +mov al,7 +sub al,bl +mov ah,40 +mov di,offset video +int 47h +push ax +mov ah,01h +int 50h +mov ah,21 +mov cl,4 +int 47h +sti +mov al,0111b +call setlptout +call setreceptor +call initlpt +jc errorie +mov cx,0 +mov ah,20 +mov bx,1012h +mov si,offset initok +int 47h +cmp byte ptr always,1 +je yes +mov ah,20 +mov bx,1010h +mov si,offset mdd +int 47h +mov ah,13 +mov si,offset drv +int 47h +mov ah,6 +int 47h +mov ah,20 +mov bx,1011h +mov si,offset msg +int 47h +waitkey: +mov ax,0 +int 16h +cmp al,'n' +je no +cmp al,'N' +je no +cmp al,'Y' +je yes +cmp al,'y' +je yes +cmp al,'e' +je nev +cmp al,'E' +je nev +cmp al,'a' +je alw +cmp al,'A' +je alw +jmp waitkey +yes: +call receivecommand +jc errortimeout +no: +mov al,0111b +call setlptout +cli +mov ah,41 +mov si,offset video +int 47h +pop ax +mov ah,00h +int 50h +mov ah,09h +int 50h +oknever: +popad +pop es ds +mov cs:isact,0 +pop bx +jmp endofint +errorie: +mov si,offset inits +jmp show +errortimeout: +mov si,offset timeouts +show: +mov ah,20 +mov bx,1012h +int 47h +mov ax,0 +int 16h +jmp no +nev: +mov byte ptr never,1 +jmp no +alw: +mov byte ptr always,1 +jmp yes +initok db 'Initialisation is realised !',0 +inits db 'Error on initialisation',0 +timeouts db 'Connection lost or timeout complete !!',0 +mdd db 'Connection demand on ',0 +msg db 'Accept connection ? (Y)es (N)o n(E)ver (A)lways',0 +isact db 0 +always db 0 +never db 0 + ;envois une commande al sendcommand: push ax bx cx di @@ -84,31 +219,63 @@ pop ds mov si,bx mov cx,6 call sendlptblock +jc endofget call receivelptblock +endofget: pop ds cx bx ax ret ;Re‡ois une commande et l'execute Receivecommand: -push ax bx cx di es +push ax bx cx di ds es push cs pop es +push cs +pop ds mov di,offset command call receivelptblock +jc endofno mov bl,al xor bh,bh shl bx,1 add bx,offset cmd call cs:[bx] -pop es di cx bx ax +clc +endofno: +pop es ds di cx bx ax ret + command db 25 dup (0) cmd dw nothings dw sendram - + dw receiveram + dw sendreg + dw receivereg + dw sendport + dw receiveport + dw letexecute nothings: ret +letexecute: +push ds es fs gs +pushad +push cs +push offset suite +mov ax,es:[di+2] +mov ds,ax +mov es,ax +mov fs,ax +mov gs,ax +push ax +mov ax,es:[di] +push ax +DB 0CBh +suite: +popad +pop gs fs es ds +ret + Sendram: push ax cx si ds mov si,es:[di] @@ -119,6 +286,30 @@ call sendlptblock pop ds si cx ax ret +receiveram: +sendreg: +receivereg: + +sendport: +push ax cx dx si +mov dx,es:[di] +in ax,dx +mov cx,2 +mov si,offset tempblock +mov ds:[si],ax +call sendlptblock +pop si dx cx ax +ret + +receiveport: +push ax dx +mov dx,es:[di] +mov ax,es:[di+2] +out dx,ax +pop dx ax +ret + +tempblock db 25 dup (0) ;---------Segment Adress----------- Bios equ 040h @@ -130,18 +321,12 @@ onesec equ 18 tensec equ 182 Ack equ 00 Nack equ 0FFh -maxtry equ 10 -tokenstart equ 0 -tokennext equ 1 -tokenstop equ 2 -tokenbad equ 3 -tokenresend equ 4 - +maxtry equ 10 Initlpt: push ax ecx call StartTimer -cmp emettor,0 +cmp cs:emettor,0 je receptinit mov al,10000b call SetLptOut @@ -269,7 +454,7 @@ Emettor db 0 SetReceptor: mov cs:Emettor,0 -ret +ret ;->bx Nøport->Adresse dx GetLpt: @@ -320,7 +505,6 @@ mov ax,Bios mov ds,ax mov ecx,ds:[timer] sub ecx,cs:times -mov ecx,0 pop ds ax ret @@ -510,5 +694,6 @@ mov bl,ah xor bh,bh cmp bp,bx pop bp si dx bx -ret +ret +video db 0 end start diff --git a/mm.asm b/mm.asm new file mode 100755 index 0000000..885d078 --- /dev/null +++ b/mm.asm @@ -0,0 +1,52 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: +mov ah,2 +int 74h +jc error +mov si,offset dnoerror +jmp noerror +error: +mov si,offset derror +noerror: +mov ah,20 +mov bx,1010h +int 47h +mov ax,0 +int 16h +xor edx,edx +popr: +mov ah,3 +int 74h +mov ah,6 +int 47h +mov si,bx +mov di,cx +mov ah,11 +mov cx,8 +int 47H +mov ah,5 +int 47H +mov dx,si +mov ah,10 +mov cx,16 +int 47H +mov ah,5 +int 47h +mov dx,di +mov ah,10 +mov cx,16 +int 47H +jmp popr +db 0CBh + +dnoerror db 'Souris d‚tect‚e en PS/2',0 +derror db 'Souris non d‚tect‚e',0 + + +end start diff --git a/mouse.asm b/mouse.asm new file mode 100755 index 0000000..acee17d --- /dev/null +++ b/mouse.asm @@ -0,0 +1,257 @@ +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +drv db 'MOUSE',0 +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx ax +mov ah,4 +mov bh,0 +int 50h +mov bl,al +pop ax +cmp byte ptr cs:isact,1 +je nottest +mov cs:isact,1 +and bl,10000b +cmp bl,16 +jae react +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +mov cs:isact,0 +sti +iret +nottest: +pop bx +jmp endofint +current dw 0 +tables dw cmdmouse + dw cmdmouse2 + dw detectmouse + dw getmouse + +isact db 0 + +;Envoie une commande AL … la souris via controleur clavier +cmdmouse: + push ax +videbuff1: + in al, 64h + and al, 10b + jne videbuff1 + mov al, 00d4h + out 64h, al +videbuff2: + in al, 64h + and al, 10b + jne videbuff2 + pop ax + out 60h, al + in al, 60h + ret + +;Envoie une commande2 AL … la souris via controleur clavier carry=nomouse +cmdmouse2: + push ax +videbuff21: + in al, 64h + and al, 10b + jne videbuff21 + mov al, 0060h + out 64h, al +videbuff22: + in al, 64h + and al, 10b + jne videbuff22 + pop ax + out 60h, al + in al, 60h + ret + +Detectmouse: + push ax cx + mov al, 0a8h ;AUX enable + out 64h, al + mov al, 0f3h ;Set sample + call cmdmouse + mov al, 100 ;Set sample + call cmdmouse + mov al, 0e8h ;Set resolution + call cmdmouse + mov al, 01 ;Set resolution + call cmdmouse + mov al, 0e7h ;Set scale 2:1 + call cmdmouse + mov al, 0f4h ;Enable device + call cmdmouse + mov al, 47h ;Interruption ON + call cmdmouse2 + mov cx, 1024 +testmouse: + in al, 60h ;Lecture du port de donn‚es + cmp al, 250 ;Test si il y a une souris + je okmouse + dec cx + jnz testmouse + stc + jmp endoftest +okmouse: + clc +endoftest: + pop cx ax + ret + +;envoie en bx,cx les coordonn‚es et en dl les boutons +getmouse: +mov bl,cs:vx +xor bh,bh +mov cl,cs:vy +xor ch,ch +mov dl,cs:button +;sub dl,8 +;and dl,0Fh +clc +ret + +Button db 0 +rx dw 0 +ry dw 0 +VX db 0 +VY db 0 +X dw 0 +Y dw 0 +count db 0 +error db 0 +xy dw 0 +old dw 0 +;Gestionnaire de souris PS/2 +react: + push ax bx cx dx di ds es + push cs + pop ds + in al, 60h + cmp error, 1 + je gest1 + cmp count, 1 + je gest1 + cmp count, 2 + je gest2 + cmp count, 3 + je gest3 + +gest1: + mov count, 2 + mov Button, al + and al, 00001000b + cmp al, 8 + je gest1end + mov error, 1 + jmp gest1end2 +gest1end: + mov error, 0 +gest1end2: + mov count, 2 + jmp endgest +gest2: + mov count, 3 + mov VX, al + jmp endgest +gest3: + mov count, 1 + mov VY, al + jmp endgest +endgest: + mov bl,VY + xor bh,bh + mov al,button + shr al,5 + and al,1 + cmp al,0 + je addy + add y,bx + jmp hadsuby + addy: + sub y,bx + hadsuby: + mov bl,VX + xor bh,bh + mov al,button + shr al,8 + and al,1 + cmp al,0 + je addx + sub x,bx + jmp hadsubx + addx: + add x,bx + hadsubx: + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov ax,x + mov bx,0FFFFh + xor ch,ch + mov cl,[di+1] + mul cx + div bx + mov rx,ax + mov ax,y + mov cl,[di] + mul cx + div bx + mov ry,ax + mul byte ptr [di+1] + add ax,rx + shl ax,1 + mov di,ax + mov ax,0B800h + mov es,ax + mov bx,xy + mov ax,old + mov word ptr es:[bx],ax + mov xy,di + mov ax,es:[di] + mov old,ax + mov word ptr es:[di],0FF70h + mov al, 20h + out 0a0h, al + out 20h, al + pop es ds di dx cx bx ax + mov cs:isact,0 + pop bx + iret + infos db 10 dup (0) + +end start diff --git a/pic8259a.asm b/pic8259a.asm new file mode 100755 index 0000000..a8e5474 --- /dev/null +++ b/pic8259a.asm @@ -0,0 +1,237 @@ +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +db 'PIC8259A' +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +sti +iret +current dw 0 +tables dw enableirq + dw disableirq + dw readmaskirq + dw readirr + dw readisr + dw installhandler + dw replacehandler + dw getint + dw setint + dw seteoi + +;Adresses de port du contr“leur IRQ + MASTERPIC = 020h ;Adresse de base du PIC maŒtre + SLAVEPIC = 0A0h ;Adresse de base du PIC esclave + IRQMASK = 001h ;Offset sur port de masquage + +;Commandes IRQ OCW2 + DISABLEROTATION = 000h ;Desactiver la rotation de priorités en mode EOI automatique + EOI = 020h ;End of Interrupt non sp‚cifi‚ + COMMANDEOI = 060h ;Commande EOI particulière + ENABLEROTATION = 080h ;Activer la rotation de priorités en mode EOI automatique + ROTATIONNOSPEC = 0A0h ;Rotation des priorités en mode EOI automatique + SETPRIORITY = 0C0h ;Definir la priorité + ROTATIONSPEC = 0E0h ;Rotation des priorités en mode EOI spécifié + +;Position des vecteurs d'interruptions + MASTERFIRSTVECTOR = 008h ;Vecteurs logiciels des interruptions + SLAVEFIRSTVECTOR = 070h ;‚lectroniques + +;OCW3 codes registres + IRR = 002h ;Interrupt Request Register + ISR = 003h ;In Service Register +;OCW3 et modes + OCW3 = 008h ;OCW3 + POLLING = 004h ;Polling bit + + +ISR = 0Bh ; Pas d'op‚ration, pas de Poll, lire ISR OCW3 +IRR = 0Ah ; Pas d'op‚ration, pas de Poll, lire IRR + + +;Autorise une interruption ‚lectronique +;Entr‚e : AL - Num‚ro de l'interruption (0-15) … autoriser 0-7 = MASTERPIC , 8-15 = SLAVEPIC +EnableIRQ: +push ax cx dx +mov dx,MASTERPIC+IRQMASK +cmp al,7 +jbe master +mov dx,SLAVEPIC+IRQMASK +master: +mov cl,al +and cl,7 +mov al,1 +shl al,cl +not al +mov ah,al +in al,dx +and al,ah +out dx,al +pop dx cx ax +ret + +;Desactive une interruption ‚lectronique +;Entr‚e : AL - Num‚ro de l'interruption (0-15) … desactiver 0-7 = MASTERPIC , 8-15 = SLAVEPIC +DisableIRQ: +push ax cx dx +mov dx,MASTERPIC+IRQMASK +cmp al,7 +jbe master2 +mov dx,SLAVEPIC+IRQMASK +master2: +mov cl,al +and cl,7 +mov al,1 +shl al,cl +mov ah,al +in al,dx +or al,ah +out dx,al +pop dx cx ax +ret + +;Signale "End Of Interrupt" de l'interruption al +SetEOI: +push ax dx +cmp al,7 +jbe master3 +mov al,EOI +out SLAVEPIC,al +master3: +mov al,EOI +out MASTERPIC,al +pop dx ax +ret + +;Lit les masques d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh +ReadmaskIrq: +push dx +mov dx,MASTERPIC+ IRQMASK +cmp bh,0 +jne Master5 +mov dx,SLAVEPIC+ IRQMASK +master5: +in al,dx +pop dx +ret + +;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh +ReadISR: +push dx +mov dx,MASTERPIC +cmp bh,0 +jne Master6 +mov dx,SLAVEPIC +master6: +mov al,isr +out dx,al +in al,dx +pop dx +ret + +;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh +ReadIRR: +push dx +mov dx,MASTERPIC +cmp bh,0 +jne Master7 +mov dx,SLAVEPIC +master7: +mov al,irr +out dx,al +in al,dx +pop dx +ret + +;remplace le handler pointer par ds:si en bx:100h interruption ax +replacehandler: +push ax bx si di ds es +mov es,bx +mov di,0100h +mov ah,4 +int 48h +mov bx,ax +call getint +mov es:[102h],si +mov es:[104h],ds +call setint +pop es ds di si bx ax +ret + +;install le handler pointer par ds:si en bx:100h interruption ax +installhandler: +push bx di es +mov es,bx +mov di,100h +mov ah,4 +int 48h +mov bx,ax +call setint +pop es di bx +ret + +;met es:di le handle de l'int al +setint: +push ax bx ds +call disableirq +cli +xor ah,ah +mov bx,ax +shl bx,2 +xor ax,ax +mov ds,ax +mov ds:[bx],di +mov ds:[bx+2],es +pop ds bx ax +sti +call enableirq +ret + +;met ds:si le handle de l'int al +getint: +push ax bx es +xor ah,ah +mov bx,ax +shl bx,2 +xor ax,ax +mov es,ax +mov si,es:[bx] +mov ds,es:[bx+2] +pop es bx ax +ret + + +end start + diff --git a/prompt.asm b/prompt.asm new file mode 100755 index 0000000..70abaf6 --- /dev/null +++ b/prompt.asm @@ -0,0 +1,233 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: +mov ah,2 +int 47h +mov ah,6 +int 47h +mov ah,6 +int 47h +mov ah,13 +mov si,offset msg +int 47h +replay: +mov ah,6 +int 47h +mov ah,6 +int 47h +mov ah,13 +mov si,offset prompt +int 47h +mov di,offset buffer +waitchar: +mov ax,0 +int 16h +mov dl,al +mov [di],al +cmp al,0Dh +je entere +inc di +mov ah,7 +int 47h +jmp waitchar +entere: +mov ah,6 +int 47h +mov ah,6 +int 47h +mov byte ptr [di],0 +mov si,offset buffer +call uppercasestr0 +mov bx,offset commands +tre: +mov di,[bx] +add bx,4 +cmp di,0 +je error +push cs +pop es +call cmpstr0 +jne tre +mov bx,[bx-2] +call bx +jmp replay +error: +push cs +pop es +mov dl,'.' +call searchcharstr0 +je noaddext +mov di,offset buffer +mov si,offset extcom +call concatstr0 +noaddext: +mov si,offset buffer +push cs +mov ax,offset arrive +push ax +mov di,offset vga +mov ah,40 +int 47h +mov ax,6000h +mov es,ax +push ax +mov di,0100h +push di +mov ah,4 +int 48h +jc reallyerror + push es + push es + push es + pop ds + pop fs + pop gs + push 7202h + popf +db 0CBh +arrive: +push cs +push cs +push cs +push cs +pop ds +pop es +pop fs +pop gs +mov si,offset vga +mov ah,41 +int 47h +jmp replay +reallyerror: +pop ax +pop ax +pop ax +pop ax +mov ah,13 +mov si,offset Error_Syntax +int 47h +jmp replay + +;met en majuscule la string ds:si +uppercasestr0: +push si ax +uppercaser: +mov al,ds:[si] +inc si +cmp al,0 +je enduppercase +cmp al,'a' +jb uppercaser +cmp al,'z' +ja uppercaser +sub byte ptr [si-1],'a'-'A' +jmp uppercaser +enduppercase: +clc +pop ax si +ret + +;Cherche dl dans la str ds:si -> di +SearchCharStr0: +push ax cx si di es +mov di,si +push ds +pop es +mov cx,0FFh +mov al,0 +cld +repne scasb +neg cx +dec cx +xor ch,ch +mov di,si +mov al,dl +repne scasb +pop es di si cx ax +ret + +;concatŠne la chaine str ds:si avec es:di +concatstr0: +push ax cx dx si di +push es di +mov di,si +push ds +pop es +mov al,0 +mov cx,255 +cld +repne scasb +neg cx +dec cx +xor ch,ch +mov dx,cx +pop di es +mov cx,0FFh +repne scasb +dec di +mov cx,dx +rep movsb +pop di si dx cx ax +ret + +;compare la chaine es:di avec ds:si +cmpstr0: +push cx dx si di +push di +mov al,0 +mov cx,255 +cld +repne scasb +neg cx +mov dx,cx +pop di +push es di +mov di,si +push ds +pop es +mov cx,255 +repne scasb +neg cx +cmp dx,cx +pop di es +jne notequal +dec cx +xor ch,ch +rep cmpsb +notequal: +pop di si dx cx +ret + +Code_Exit: +pop ax +db 0CBh + +Code_Version: +mov ah,13 +mov si,offset Version_Text +int 47h +ret + +Version_Text db 'Cos 2000 version 1.1.1B by Nico',0 +extcom db '.EXE',0 + +commands dw Str_Exit ,Code_Exit + dw Str_Version,Code_Version + dw 0 + + +Str_Exit db 'EXIT',0 +Str_Version db 'VERSION',0 + +Error_Syntax db 'The command doesn''t exit !',0 +prompt db 'COS>',0 +msg db 'Cos command interpretor V1.0',0 +buffer db 255 dup (0) + +vga db 0 +end start diff --git a/system.asm b/system.asm index 4d26b56..dbb0152 100755 --- a/system.asm +++ b/system.asm @@ -7,25 +7,81 @@ org 0100h start: mov si,offset video -mov bx,8400h +mov bx,400h mov ax,47h call installhandler -mov si,offset lpt -mov bx,7400h -mov ax,49h -call installhandler -mov si,offset keyboard -mov bx,7000h -mov ax,9h -call replacehandler mov si,offset timer -mov bx,7800h +mov bx,900h mov ax,8h call replacehandler +mov si,offset pic +mov bx,950h +mov ax,50h +call installhandler mov si,offset drive -mov bx,9000h +mov bx,1020h mov ax,48h call installhandler +mov si,offset keyboard +mov bx,1400h +mov ax,9h +call replacehandler +mov ax,40h +mov es,ax +mov dx,es:[8] +cmp dx,0 +je nolpt1 +mov al,0FFh +add dx,2 +out dx,al +mov si,offset lpt +mov bx,1500h +mov ax,0Fh +call installhandler +mov es,bx +sub al,8 +xor ah,ah +int 50h +mov byte ptr es:[105h],'1' +nolpt1: +push es +mov ax,40h +mov es,ax +mov dx,es:[10] +pop es +cmp dx,0 +je nolpt2 +mov al,0FFh +add dx,2 +out dx,al +mov si,offset lpt +mov bx,1700h +mov ax,0Dh +call installhandler +sub al,8 +xor ah,ah +int 50h +mov es,bx +mov byte ptr es:[105h],'2' +nolpt2: +mov si,offset mouse +mov bx,1900h +mov ax,74h +call installhandler +mov ax,0012 +int 50h +;mov ah, 00010000b +;not ah +;in al, 0a1h +;and al, ah +;out 0a1h, al +mov ah,2 +int 74h + + + + + start2: push cs push cs @@ -398,6 +454,7 @@ ret ;Recherchele fichier et retourne sont path et en cx sont debut Searchfile: push bx dx si di ds es +xor dx,dx push cs pop es mov di,offset temp @@ -540,6 +597,8 @@ extsize equ 5 nbfit equ 255 +mouse db 'mouse.sys',0 +pic db 'pic8259a.sys',0 drive db 'drive.sys',0 timer db 'timer.sys',0 lpt db 'lpt.sys',0 diff --git a/test.asm b/test.asm new file mode 100755 index 0000000..db759cc --- /dev/null +++ b/test.asm @@ -0,0 +1,330 @@ +.model tiny +.486 +smart +.code +org 0100h + + +start: +mov ah,26 +int 47h +mov ax,0001 +int 47h +mov ah,2 +int 47h + +mov si,offset text1 ;titre +mov ah,13 +int 47h +mov ah,6 +int 47h +int 47h + +mov ah,21 +mov cl,3 +int 47h +mov ah,13 +mov si,offset text2 +int 47h +mov ah,6 +int 47h +mov edx,2612182686 +mov ah,8 +int 47h +mov ah,6 +int 47h +mov edx,7576534 +mov ah,8 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,4 +int 47h +mov si,offset text3 +mov ah,13 +int 47h +mov ah,6 +int 47h +mov edx,-6876253 +mov ah,9 +int 47h +mov ah,6 +int 47h +mov edx,-311212323 +mov ah,9 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,5 +int 47h +mov ah,13 +mov si,offset text4 +int 47h +mov ah,6 +int 47h +mov edx,0892325457 +mov cx,16 +mov ah,10 +int 47h +mov ah,6 +int 47h +mov edx,0236514 +mov ah,10 +mov cx,32 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,6 +int 47h +mov ah,13 +mov si,offset text5 +int 47h +mov ah,6 +int 47h +mov edx,3762182686 +mov ah,11 +mov cx,32 +int 47h +mov ah,6 +int 47h +mov edx,2182686 +mov ah,11 +mov cx,16 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,7 +int 47h +mov ah,13 +mov si,offset text6 +int 47h +mov ah,6 +int 47h +mov dl,'h' +mov ah,7 +int 47h +mov ah,6 +int 47h +mov dl,'@' +mov ah,7 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,8 +int 47h +mov ah,13 +mov si,offset text7 +int 47h +mov ah,6 +int 47h +mov si,offset textt +mov ah,13 +int 47h +mov ah,6 +int 47h +mov si,offset texttt +mov ah,13 +int 47h + +mov ax,0 +int 16h + +mov ah,2 +int 47h +mov ah,30 +int 47h +mov ah,2 +int 47h + +mov ah,21 +mov cl,5 +int 47h +mov cx,200 +go1: +mov ah,30 +int 47h +mov ah,33 +int 47 +mov ah,20 +xor bh,bh +inc bl +mov si,offset text8 +int 47h +call put +mov ah,30 +int 47h +mov ah,33 +int 47h +dec cx +jnz go1 + +mov ah,21 +mov cl,7 +int 47h +mov cx,200 +go2: +mov si,offset text9 +mov ah,30 +int 47h +mov ah,33 +int 47h +mov ah,6 +int 47h +mov ah,13 +int 47h +call put +mov ah,30 +int 47h +mov ah,33 +int 47h +dec cx +jnz go2 + +mov ah,21 +mov cl,9 +int 47h +mov cx,200 +go3: +mov si,offset text10 +mov ah,30 +int 47h +mov ah,33 +int 47h +xor bh,bh +inc bl +mov ah,20 +int 47h +call put +mov ah,30 +int 47h +mov ah,33 +int 47h +dec cx +jnz go3 + +mov ah,30 +int 47h +mov ah,2 +int 47h +mov bx,040Dh +mov si,offset texte1 +mov ah,20 +int 47h +mov si,offset texte2 +inc bl +mov ah,20 +int 47h +mov ah,30 +int 47h +mov ah,2 +int 47h +mov ah,30 +int 47h + +mov cl,12 +mov ah,21 +int 47h +mov bp,255 +xor edx,edx +go4: +mov ah,30 +int 47h +mov ah,33 +int 47h +inc edx +mov ah,11 +mov cx,16 +int 47h +mov ah,6 +int 47h +mov ah,30 +int 47h +mov ah,33 +int 47h +dec bp +jnz go4 +mov ah,27 +int 47h +xor bx,bx +mov si,offset texte3 +mov ah,20 +int 47h +mov ax,0 +int 16h +db 0CBh + +put: +call random +mov di,dx +and di,4096-2 +mov si,offset text11 +call showstring2 +ret + +Random: +push ax +MOV AX,cs:[RandSeed] +MOV DX,8405h +MUL DX +INC AX +MOV cs:[RandSeed],AX +pop ax +ret + +randseed dw 1234h + +Randomize: +push ax cx dx +mov ah,0 +int 1ah +mov cs:randseed,dx +pop dx cx ax +ret + +texttt db 'Texte',0 +textt db 'Divers',0 +text1 db ' D‚monstration de l''utilisation de la bibliothŠque VIDEO',0 +text2 db 'Nombre entier :',0 +text3 db 'Nombre sign‚ :',0 +text4 db 'Nombre h‚xad‚cimal :',0 +text5 db 'Nombre binaire :',0 +text6 db 'CaractŠres :',0 +text7 db 'Texte :',0 +text8 db 'Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling',0 +text9 db 'Vertical Vertical Vertical Vertical Vertical Vertical Vertical Vertical',0 +text10 db 'Rapide Rapide Rapide Rapide Rapide Rapide Rapide Rapide',0 +text11 db 'Echange rapide de pages Vid‚o',0 +texte1 db 'Routine d''affichage Ultra Rapide Agissant sur le Mat‚riel',0 +texte2 db 'Possibilit‚ de r‚aliser des effets de superposition',0 +texte3 db 'Sauvegarde et restauration de l''ecran',0 + +showstring2: + push es bx cx si di + add di,4000 + mov bx,0B800h + mov es,bx + mov bl,[si] + mov ch,3 +strinaize4: + inc si + mov cl,[si] + mov es:[di],cx + add di,2 + dec bl + jnz strinaize4 + pop di si cx bx es + ret + + + +end start diff --git a/timer.asm b/timer.asm index a7c11e4..ce6c0b0 100755 --- a/timer.asm +++ b/timer.asm @@ -24,6 +24,65 @@ tsr: mov ax,0B800h mov es,ax mov es:[0],bl +push ds es +pusha +mov ax,40h +mov es,ax +mov ax,0B800h +mov ds,ax +mov word ptr dx,es:[8] + +in al,dx +mov di,158 +decompose: +mov cl,al +and cl,1 +cmp cl,1 +je un +mov byte ptr ds:[di],'0' +jmp errr +un: +mov byte ptr ds:[di],'1' +errr: +shr al,1 +dec di +dec di +cmp di,142 +jne decompose + +inc dx +in al,dx +mov di,318 +decompose2: +mov cl,al +and cl,1 +cmp cl,1 +je un2 +mov byte ptr ds:[di],'0' +jmp errr2 +un2: +mov byte ptr ds:[di],'1' +errr2: +cmp di,314 +jb errrr +mov byte ptr ds:[di],'X' +errrr: +shr al,1 +dec di +dec di +cmp di,302 +jne decompose2 +popa +pop es ds + + + + + + + + + pop es bx ax sti iret diff --git a/video.asm b/video.asm index 775ddc0..52f849b 100755 --- a/video.asm +++ b/video.asm @@ -77,6 +77,58 @@ tables dw setvideomode dw changelineattr dw waitretrace dw getinfos + dw loadbmp + dw showbmp + dw clearscr + dw savedac + dw restoredac + dw savestate + dw restorestate + +;sauve le DAC +savedac: +push ax cx dx di +mov dx,3C7h +xor ax,ax +out dx,al +mov cx,256*3 +inc dx +inc dx +mov di,offset dac +save: +in al,dx +mov cs:[di],al +inc di +dec cx +jne save +pop di dx cx ax +ret + +;restore le DAC +restoredac: +push ax cx dx si +xor ax,ax +cli +mov dx,3DAh +in al,dx +mov dx,0 +out dx,al +mov dx,3C8h +out dx,al +mov cx,256*3 +mov si,offset dac +save2: +mov al,cs:[si] +inc si +out dx,al +dec cx +jne save2 +mov dx,3DAh +in al,dx +mov dx,32 +out dx,al +pop si dx cx ax +ret ;Change la police a CL changefont: @@ -186,7 +238,7 @@ mode1 DB 67H,00H, 03H,00H,03H,00H,02H db 80,25 ;80*50 16 couleurs -mode1b DB 63H, 00H, 03H,01H,03H,01H,02H +mode2 DB 63H, 00H, 03H,01H,03H,01H,02H DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH @@ -204,7 +256,7 @@ mode3 DB 067H,00H,03H,01H,03H,01H,02H db 100,50 ;100*60 16 couleurs -mode4b DB 067H,00H,03H,01H,03H,01H,02H +mode4 DB 0A7H,00H,03H,01H,03H,01H,02H DB 70H,63H,64H,85H,68H,84H,0FFH,1FH,00H,47H,06H,07H,00H,00H,00H DB 00H,0E7H,8EH,0DFH,32H,1FH,0DFH,0E5H,0A3H,0FFH DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH @@ -212,9 +264,8 @@ mode4b DB 067H,00H,03H,01H,03H,01H,02H DB 0CH,00H,0FH,00H,00H db 100,60 - ;320*200 16 couleurs -mode4 DB 63H,00H, 03H,09H,0FH,00H,06H +mode5 DB 63H,00H, 03H,09H,0FH,00H,06H DB 2DH,27H,28H,90H,2BH,080H,0BFH,01FH,00H,0C0H,00H,00H,00H,00H,00H,00H DB 9CH,8EH,8FH,14H,00H,96H,0B9H,0E3H,0FFH DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH @@ -222,8 +273,8 @@ mode4 DB 63H,00H, 03H,09H,0FH,00H,06H DB 41H,00H,0FH,00H,00H db 40,25 -;320*200 256 couleurs -mode5 DB 63H, 00H, 03H,01H,0FH,00H,0EH +;320*200 256 couleurs +mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH @@ -231,8 +282,17 @@ mode5 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 41H,00H,0FH,00H,00H db 00,00 +;320*400 256 couleurs chain4 +mode7 DB 63H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H + DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + db 00,00 + ;640*400 16 couleurs -mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH +mode8 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,10H,05H,0FH,0FFH @@ -241,7 +301,7 @@ mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH db 00,00 ;640*400 256 couleurs -mode7 DB 63H, 00H, 03H,01H,0FH,00H,0EH +mode9 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 2DH,27H,27H,91H,2AH,9FH,0BFH,1FH,00H,0C0H,00H,00H,00H,00H,00H,00H DB 9CH,0EH,8FH,50H,00H,8FH,0C0H,0E3H,0FFH DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH @@ -368,7 +428,7 @@ out dx,ax inc al inc di cmp al,9 -jb initgraphic +jb initgraphic mov dx,statut in al,dx mov dx,attribs @@ -453,6 +513,7 @@ mov bl,cs:y xor bh,bh mov cl,cs:lines dec cl +dec cl cmp bl,cl jne scro dec bl @@ -572,6 +633,19 @@ SaveScreen: pop es ds di si cx ret +;===================================sauve l'ecran rapidement en es:di================ +SaveScreento: + push cx si di ds + mov cx,0B800H + mov ds,cx + mov cx,cs:pagesize + shr cx,2 + xor si,si + cld + rep movsd + pop ds di si cx + ret + ;===================================sauve l'ecran rapidement================ Savepage1: push cx si di ds es @@ -604,6 +678,19 @@ RestoreScreen: pop es ds di si cx ret +;===================================restore l'ecran rapidement de ds:si================ +RestoreScreenfrom: + push cx si di ds es + mov cx,0B800H + mov es,cx + mov cx,cs:pagesize + shr cx,2 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + ;===============================Page2to1============================ Page2to1: push cx si di ds es @@ -912,6 +999,392 @@ rep movsb pop ds di si cx ret + +clearscr: +push eax cx +mov cx,320*200/4 +mov eax,0 +rep movsd +pop cx eax + +loadbmp: +push ax bx cx dx bp ds +mov ax,ds:[18] +mov si,ax +shr ax,2 +and si,11b +cmp si,0 +je is4x +add ax,1 +is4x: +mov cs:sizeh,ax +mov ax,ds:[22] +mov cs:sizev,ax +mov di,0FFFFh-1024 +mov si,54 +mov cl, 0ffh +paletteload: +lodsb +shr al, 2 +mov [di+2], al +lodsb +shr al, 2 +mov [di+1], al +lodsb +shr al, 2 +mov [di+0], al +inc si +add di, 3 +dec cl +jnz paletteload +mov si,0FFFFh-1024 +mov dx, 3c8h +cld +mov cl, 0ffh +xor bx, bx +palettemake: +mov al, bl +out dx, al +inc dx +lodsb +out dx, al +lodsb +out dx, al +lodsb +out dx, al +dec dx +inc bl +dec cl +jnz palettemake +pop ds bp dx cx bx ax +ret +sizeh dw 0 +sizev dw 0 + +showbmp: +push ax bx cx dx si di ds es +mov dx,cs:sizev +add bx,dx +mov di,cx +mov ax,bx +shl ax,6 +shl bx,8 +add di,bx +add di,ax +mov bx,di +mov ax,0A000H +mov es,ax +mov si,1024+54 +mov ax,cs:sizeh +bouclebmp: +cmp di,64000 +jae nopp +cld +rep movsd +no: +mov cx,ax +sub bx,320 +mov di,bx +dec dx +jnz bouclebmp +fin: +pop es ds di si dx cx bx ax +ret +nopp: +shl cx,2 +add si,cx +jmp no + +fire: +push ax cx dx si di +xor si,si +xor di,di +mov cx,64000 +makefire: +xor ax,ax +mov al,[si] +add al,[si+321] +adc ah,0 +add al,[si-321] +adc ah,0 +add al,[si+320] +adc ah,0 +shr ax,2 +cmp al,191 +jb pp +mov al,191 +pp: +cmp al,0 +je p +dec ax +p: +mov es:[di],al +inc si +inc di +dec cx +jnz makefire +pop di si dx cx ax +ret + +fireflamme: +push ax cx dx si di +xor si,si +xor di,di +mov cx,64000 +makefire2: +xor ax,ax +mov al,[si] +add al,[si+1] +adc ah,0 +add al,[si-1] +adc ah,0 +add al,[si+320] +adc ah,0 +shr ax,2 +cmp al,191 +jb ppp +mov al,191 +ppp: +cmp al,0 +je pppp +dec ax +pppp: +mov es:[di],al +inc si +inc di +dec cx +jnz makefire2 +pop di si dx cx ax +ret + +gauss: +push ax cx dx si di +xor si,si +xor di,di +mov cx,64000 +makegauss: +xor ax,ax +mov al,[si+1] +add al,[si-1] +adc ah,0 +add al,[si+321] +adc ah,0 +add al,[si+320] +adc ah,0 +add al,[si+319] +adc ah,0 +add al,[si-321] +adc ah,0 +add al,[si-320] +adc ah,0 +add al,[si-319] +adc ah,0 +shr ax,3 +mov es:[di],al +inc si +inc di +dec cx +jnz makegauss +pop di si dx cx ax +ret + +lowgauss: +push ax cx dx si di +xor si,si +xor di,di +mov cx,64000 +makegausss: +xor ax,ax +mov al,[si+1] +add al,[si-1] +adc ah,0 +add al,[si+320] +adc ah,0 +add al,[si-320] +adc ah,0 +shr ax,2 +mov es:[di],al +inc si +inc di +dec cx +jnz makegausss +pop di si dx cx ax +ret + +firepalett: +push ax cx dx +mov dx,03C8h +xor ax,ax +out dx,al +inc dx +mov cx,64 +rouge1: +out dx,al +push ax +xor al,al +out dx,al +out dx,al +pop ax +inc ax +loop rouge1 +mov cx,64 +jaune1: +push ax +mov al,63 +out dx,al +pop ax +out dx,al +push ax +xor al,al +out dx,al +pop ax +inc ax +loop jaune1 +mov cx,63 +blanc1: +push ax +mov al,63 +out dx,al +out dx,al +pop ax +out dx,al +loop blanc1 +pop dx cx ax +ret + +allfirepalett: +push ax cx dx +mov dx,03C8h +xor ax,ax +out dx,al +inc dx +mov cx,64 +rouge: +push ax +shr ax,1 +out dx,al +xor al,al +out dx,al +out dx,al +pop ax +inc ax +loop rouge +mov cx,64 +rouge2: +push ax +shr ax,1 +out dx,al +xor al,al +out dx,al +out dx,al +pop ax +inc ax +loop rouge2 +mov cx,64 +Jaune: +push ax +mov al,63 +out dx,al +pop ax +out dx,al +push ax +xor al,al +out dx,al +pop ax +inc ax +loop jaune +mov cx,64 +blanc: +push ax +mov al,63 +out dx,al +out dx,al +pop ax +out dx,al +loop blanc +pop dx cx ax +ret + +gaussscreen: +push ax ds es +mov ax,0A000h +mov ds,ax +push fs +pop es +call gauss +push ds +pop es +push fs +pop ds +call Copyscreen +pop es ds ax +ret + +lowgaussscreen: +push ax ds es +mov ax,0A000h +mov ds,ax +push fs +pop es +call lowgauss +push ds +pop es +push fs +pop ds +call Copyscreen +pop es ds ax +ret + +firescreen: +push ax ds es +mov ax,0A000h +mov ds,ax +push fs +pop es +call fire +push ds +pop es +push fs +pop ds +call Copyscreen +pop es ds ax +ret + +copyscreen: +push si di cx +xor si,si +xor di,di +mov cx,64000/4 +rep movsd +pop cx di si +ret + +;Sauve l'‚tat de la carte en es:di +savestate: +push cx si di ds +push cs +pop ds +mov cx,10 +mov si,offset lines +cld +rep movsb +call savescreento +pop ds di si cx +ret + +;R‚cupŠre l'‚tat de la carte en ds:si +restorestate: +push cx si di es +push cs +pop es +mov cx,10 +mov di,offset lines +cld +rep movsb +call restorescreenfrom +pop es di si cx +ret + lines db 0 columns db 0 x db 0 @@ -923,7 +1396,7 @@ pagesize dw 0 font equ $ copy equ $+4000 copy2 equ $+8000 - -endofme equ $ +12000 +dac equ $+12000 +endofme equ $ +12768 end start From 564853e7626709f4525e728988947cfa7faef1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Mon, 14 May 2001 22:48:10 +0200 Subject: [PATCH 08/17] =?UTF-8?q?feat:=20ajout=20d'une=20librairie=20de=20?= =?UTF-8?q?gestion=20de=20chaines=20de=20caract=C3=A8res=20=C3=A0=20z?= =?UTF-8?q?=C3=A9ro=20terminal.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- editor.asm | 12 ++- m2.asm | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++++ mm.asm | 10 +-- mouse.asm | 18 ---- prompt.asm | 240 +++++++++++++++++++++++++++---------------------- str0.asm | 253 ++++++++++++++++++++++++++++++++++++++++++++++++++++ video.asm | 16 +++- 7 files changed, 672 insertions(+), 134 deletions(-) create mode 100755 m2.asm create mode 100755 str0.asm diff --git a/editor.asm b/editor.asm index 9760787..ad2b614 100755 --- a/editor.asm +++ b/editor.asm @@ -53,6 +53,8 @@ lines: mov ah,13 mov si,offset spaces int 47h + mov ah,5 + int 47h mov al,16 mov cl,7 mov ah,21 @@ -91,10 +93,12 @@ doaline2: inc edi dec al jnz doaline2 + dec bh + je outes mov ah,6 int 47h - dec bh - jnz lines + jmp lines +outes: mov ah,21 mov cl,112 int 47h @@ -284,7 +288,7 @@ calc1: shl ax,2 shl dx,1 add ax,dx - add ax,25 + add ax,27 mov bx,YY mov dx,yy shl bx,5 @@ -310,7 +314,7 @@ calc2: mov dx,xx shl dx,1 add si,dx - add si,127 + add si,129 mov byte ptr es:[si],112 mov bx,xxyy2 mov byte ptr es:[bx],07 diff --git a/m2.asm b/m2.asm new file mode 100755 index 0000000..acee17d --- /dev/null +++ b/m2.asm @@ -0,0 +1,257 @@ +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +drv db 'MOUSE',0 +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx ax +mov ah,4 +mov bh,0 +int 50h +mov bl,al +pop ax +cmp byte ptr cs:isact,1 +je nottest +mov cs:isact,1 +and bl,10000b +cmp bl,16 +jae react +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +mov cs:isact,0 +sti +iret +nottest: +pop bx +jmp endofint +current dw 0 +tables dw cmdmouse + dw cmdmouse2 + dw detectmouse + dw getmouse + +isact db 0 + +;Envoie une commande AL … la souris via controleur clavier +cmdmouse: + push ax +videbuff1: + in al, 64h + and al, 10b + jne videbuff1 + mov al, 00d4h + out 64h, al +videbuff2: + in al, 64h + and al, 10b + jne videbuff2 + pop ax + out 60h, al + in al, 60h + ret + +;Envoie une commande2 AL … la souris via controleur clavier carry=nomouse +cmdmouse2: + push ax +videbuff21: + in al, 64h + and al, 10b + jne videbuff21 + mov al, 0060h + out 64h, al +videbuff22: + in al, 64h + and al, 10b + jne videbuff22 + pop ax + out 60h, al + in al, 60h + ret + +Detectmouse: + push ax cx + mov al, 0a8h ;AUX enable + out 64h, al + mov al, 0f3h ;Set sample + call cmdmouse + mov al, 100 ;Set sample + call cmdmouse + mov al, 0e8h ;Set resolution + call cmdmouse + mov al, 01 ;Set resolution + call cmdmouse + mov al, 0e7h ;Set scale 2:1 + call cmdmouse + mov al, 0f4h ;Enable device + call cmdmouse + mov al, 47h ;Interruption ON + call cmdmouse2 + mov cx, 1024 +testmouse: + in al, 60h ;Lecture du port de donn‚es + cmp al, 250 ;Test si il y a une souris + je okmouse + dec cx + jnz testmouse + stc + jmp endoftest +okmouse: + clc +endoftest: + pop cx ax + ret + +;envoie en bx,cx les coordonn‚es et en dl les boutons +getmouse: +mov bl,cs:vx +xor bh,bh +mov cl,cs:vy +xor ch,ch +mov dl,cs:button +;sub dl,8 +;and dl,0Fh +clc +ret + +Button db 0 +rx dw 0 +ry dw 0 +VX db 0 +VY db 0 +X dw 0 +Y dw 0 +count db 0 +error db 0 +xy dw 0 +old dw 0 +;Gestionnaire de souris PS/2 +react: + push ax bx cx dx di ds es + push cs + pop ds + in al, 60h + cmp error, 1 + je gest1 + cmp count, 1 + je gest1 + cmp count, 2 + je gest2 + cmp count, 3 + je gest3 + +gest1: + mov count, 2 + mov Button, al + and al, 00001000b + cmp al, 8 + je gest1end + mov error, 1 + jmp gest1end2 +gest1end: + mov error, 0 +gest1end2: + mov count, 2 + jmp endgest +gest2: + mov count, 3 + mov VX, al + jmp endgest +gest3: + mov count, 1 + mov VY, al + jmp endgest +endgest: + mov bl,VY + xor bh,bh + mov al,button + shr al,5 + and al,1 + cmp al,0 + je addy + add y,bx + jmp hadsuby + addy: + sub y,bx + hadsuby: + mov bl,VX + xor bh,bh + mov al,button + shr al,8 + and al,1 + cmp al,0 + je addx + sub x,bx + jmp hadsubx + addx: + add x,bx + hadsubx: + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov ax,x + mov bx,0FFFFh + xor ch,ch + mov cl,[di+1] + mul cx + div bx + mov rx,ax + mov ax,y + mov cl,[di] + mul cx + div bx + mov ry,ax + mul byte ptr [di+1] + add ax,rx + shl ax,1 + mov di,ax + mov ax,0B800h + mov es,ax + mov bx,xy + mov ax,old + mov word ptr es:[bx],ax + mov xy,di + mov ax,es:[di] + mov old,ax + mov word ptr es:[di],0FF70h + mov al, 20h + out 0a0h, al + out 20h, al + pop es ds di dx cx bx ax + mov cs:isact,0 + pop bx + iret + infos db 10 dup (0) + +end start diff --git a/mm.asm b/mm.asm index 885d078..71446d7 100755 --- a/mm.asm +++ b/mm.asm @@ -27,20 +27,20 @@ mov ah,6 int 47h mov si,bx mov di,cx -mov ah,11 +mov ah,9 mov cx,8 int 47H mov ah,5 int 47H mov dx,si -mov ah,10 -mov cx,16 +mov ah,9 +mov cx,8 int 47H mov ah,5 int 47h mov dx,di -mov ah,10 -mov cx,16 +mov ah,9 +mov cx,8 int 47H jmp popr db 0CBh diff --git a/mouse.asm b/mouse.asm index acee17d..021b203 100755 --- a/mouse.asm +++ b/mouse.asm @@ -193,28 +193,10 @@ gest3: endgest: mov bl,VY xor bh,bh - mov al,button - shr al,5 - and al,1 - cmp al,0 - je addy add y,bx - jmp hadsuby - addy: - sub y,bx - hadsuby: mov bl,VX xor bh,bh - mov al,button - shr al,8 - and al,1 - cmp al,0 - je addx - sub x,bx - jmp hadsubx - addx: add x,bx - hadsubx: push cs pop es mov di,offset infos diff --git a/prompt.asm b/prompt.asm index 70abaf6..cc1a85a 100755 --- a/prompt.asm +++ b/prompt.asm @@ -17,9 +17,10 @@ mov si,offset msg int 47h replay: mov ah,6 -int 47h -mov ah,6 int 47h +noret: +mov ah,6 +int 47h mov ah,13 mov si,offset prompt int 47h @@ -27,22 +28,24 @@ mov di,offset buffer waitchar: mov ax,0 int 16h -mov dl,al -mov [di],al cmp al,0Dh je entere +cmp di,offset buffer+256 +je waitchar +mov [di],al inc di +mov dl,al mov ah,7 int 47h jmp waitchar entere: -mov ah,6 -int 47h -mov ah,6 -int 47h mov byte ptr [di],0 mov si,offset buffer -call uppercasestr0 +cmp si,di +je noret +mov ah,6 +int 47h +call uppercase0 mov bx,offset commands tre: mov di,[bx] @@ -60,11 +63,11 @@ error: push cs pop es mov dl,'.' -call searchcharstr0 +call searchchar0 je noaddext mov di,offset buffer mov si,offset extcom -call concatstr0 +call concat0 noaddext: mov si,offset buffer push cs @@ -113,96 +116,6 @@ mov si,offset Error_Syntax int 47h jmp replay -;met en majuscule la string ds:si -uppercasestr0: -push si ax -uppercaser: -mov al,ds:[si] -inc si -cmp al,0 -je enduppercase -cmp al,'a' -jb uppercaser -cmp al,'z' -ja uppercaser -sub byte ptr [si-1],'a'-'A' -jmp uppercaser -enduppercase: -clc -pop ax si -ret - -;Cherche dl dans la str ds:si -> di -SearchCharStr0: -push ax cx si di es -mov di,si -push ds -pop es -mov cx,0FFh -mov al,0 -cld -repne scasb -neg cx -dec cx -xor ch,ch -mov di,si -mov al,dl -repne scasb -pop es di si cx ax -ret - -;concatŠne la chaine str ds:si avec es:di -concatstr0: -push ax cx dx si di -push es di -mov di,si -push ds -pop es -mov al,0 -mov cx,255 -cld -repne scasb -neg cx -dec cx -xor ch,ch -mov dx,cx -pop di es -mov cx,0FFh -repne scasb -dec di -mov cx,dx -rep movsb -pop di si dx cx ax -ret - -;compare la chaine es:di avec ds:si -cmpstr0: -push cx dx si di -push di -mov al,0 -mov cx,255 -cld -repne scasb -neg cx -mov dx,cx -pop di -push es di -mov di,si -push ds -pop es -mov cx,255 -repne scasb -neg cx -cmp dx,cx -pop di es -jne notequal -dec cx -xor ch,ch -rep cmpsb -notequal: -pop di si dx cx -ret - Code_Exit: pop ax db 0CBh @@ -214,20 +127,139 @@ int 47h ret Version_Text db 'Cos 2000 version 1.1.1B by Nico',0 + +Code_Cls: +mov ah,2 +int 47h +ret + +Code_Reboot: +push 0FFFFh +push 00000h +db 0CBH + +Code_Command: +mov bx,offset commands +showalls: +mov si,[bx] +add bx,4 +cmp si,0 +je endoff +mov ah,13 +int 47h +mov ah,6 +int 47h +jmp showalls +endoff: +ret + extcom db '.EXE',0 -commands dw Str_Exit ,Code_Exit +commands dw Str_Exit ,Code_Exit dw Str_Version,Code_Version + dw Str_Cls ,Code_Cls + dw Str_Reboot ,Code_Reboot + dw Str_Command,Code_Command dw 0 Str_Exit db 'EXIT',0 Str_Version db 'VERSION',0 - -Error_Syntax db 'The command doesn''t exit !',0 +Str_Cls db 'CLS',0 +Str_Reboot db 'REBOOT',0 +Str_Command db 'COMMAND',0 + +Error_Syntax db 'Command or executable doesn''t exist !',0 prompt db 'COS>',0 msg db 'Cos command interpretor V1.0',0 buffer db 255 dup (0) +;Recherche un caractŠre dl dans la chaŒne ds:si +SearchChar0: + push ax cx di es + call GetLength0 + push ds + pop es + mov di,si + mov al,dl + repne scasb + pop es di cx ax + ret + +;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal +cmpstr0: + push cx dx si di + call GetLength0 + mov dx,cx + push ds si + push es + pop ds + mov si,di + call GetLength0 + pop si ds + cmp cx,dx + jne NotEqual + repe cmpsb +NotEqual: + pop di si dx cx + ret + +;met en majuscule la chaine ds:si +UpperCase0: + push si ax +UpperCase: + mov al,ds:[si] + inc si + cmp al,0 + je EndUpperCase + cmp al,'a' + jb UpperCase + cmp al,'z' + ja UpperCase + sub byte ptr [si-1],'a'-'A' + jmp UpperCase +EndUpperCase: + clc + pop ax si + ret + +;ConcatŠne le chaine ds:si avec es:di +Concat0: + push ax cx dx si di + call GetLength0 + mov dx,cx + xchg si,di + push ds + push es + pop ds + call GetLength0 + pop ds + xchg si,di + add di,cx + mov cx,dx + cld + rep movsb + mov al,0 + stosb + pop di si dx cx ax + ret + +;renvoie la taille en octets CX de la chaine point‚e en ds:si +GetLength0: + push ax di es + push ds + pop es + mov di,si + mov al,0 + mov cx,0FFFFh + cld + repne scasb + neg cx + dec cx + dec cx + pop es di ax + ret + + vga db 0 end start diff --git a/str0.asm b/str0.asm new file mode 100755 index 0000000..bc4503a --- /dev/null +++ b/str0.asm @@ -0,0 +1,253 @@ +;Librairie qui prend en charge le format de STR ASCIIZ +.model tiny +.486 +smart +.code + +org 0100h + +start: +mov di,offset set +mov si,offset set +mov bx,7 +mov cx,5 +call delete0 +ret + +set db 'Essai de string',0 +set2 db 'epais',0 +tre db 30 dup (0) + +;Renvoie en es:di la partie de cx caractŠres a partir de la gauche de ds:si +Left0: + push ax cx si di + cld + rep movsb + mov al,0 + stosb + pop di si cx ax + ret + +;Renvoie en es:di la partie de cx caractŠres a partir de la droite de ds:si +Right0: + push ax cx dx si di + mov dx,cx + call getlength0 + add si,cx + sub si,dx + mov cx,dx + cld + rep movsb + mov al,0 + stosb + pop di si dx cx ax + ret + +;Renvoie en es:di la partie de cx caractŠres a partir de la position bx de ds:si +middle0: + push ax cx si di + add si,bx + cld + rep movsb + mov al,0 + stosb + pop di si cx ax + ret + +;Rempli de cx caractŠres dl a partir de la position bx de ds:si +Fill0: + push ax bx cx si di es + push ds + pop es + add si,bx + mov al,dl + mov di,si + cld + rep stosb + pop es di si cx bx ax + ret + +;Recherche un caractŠre dl dans la chaŒne ds:si +SearchChar0: + push ax cx di es + call GetLength0 + push ds + pop es + mov di,si + mov al,dl + repne scasb + pop es di cx ax + ret + +;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal +cmpstr0: + push cx dx si di + call GetLength0 + mov dx,cx + push ds si + push es + pop ds + mov si,di + call GetLength0 + pop si ds + cmp cx,dx + jne NotEqual + repe cmpsb +NotEqual: + pop di si dx cx + ret + +;Detruit CX caractŠres a partir du caractŠre BX de DS:SI +delete0: + push cx dx si di es + push ds + pop es + mov dx,cx + call getlength0 + sub cx,dx + neg cx + mov di,si + add si,bx + cld + rep movsb + pop es di si dx cx + ret + +;Copie une chaine de ds:si en es:di +Copy: + push ax cx si di + call GetLength0 + cld + rep movsb + mov al,0 + stosb + pop di si cx ax + ret + +;ConcatŠne le chaine ds:si avec es:di +Concat0: + push ax cx dx si di + call GetLength0 + mov dx,cx + xchg si,di + push ds + push es + pop ds + call GetLength0 + pop ds + xchg si,di + add di,cx + mov cx,dx + cld + rep movsb + mov al,0 + stosb + pop di si dx cx ax + ret + +;renvoie la taille en octets CX de la chaine point‚e en ds:si +GetLength0: + push ax di es + push ds + pop es + mov di,si + mov al,0 + mov cx,0FFFFh + cld + repne scasb + neg cx + dec cx + dec cx + pop es di ax + ret + +;Met la taille en octets de la chaine point‚e ds:si a CX +SetLength0: + push bx + mov bx,cx + mov byte ptr [si+bx],0 + pop bx + ret + +;met en majuscule la chaine ds:si +UpperCase0: + push si ax +UpperCase: + mov al,ds:[si] + inc si + cmp al,0 + je EndUpperCase + cmp al,'a' + jb UpperCase + cmp al,'z' + ja UpperCase + sub byte ptr [si-1],'a'-'A' + jmp UpperCase +EndUpperCase: + clc + pop ax si + ret + +;met en majuscule la premiŠre lettre chaine ds:si +OneCase0: + push ax +OneUpperCase: + mov al,ds:[si] + cmp al,'a' + jb OneEndUpperCase + cmp al,'z' + ja OneEndUpperCase + sub byte ptr [si],'a'-'A' +OneEndUpperCase: + clc + pop ax + ret + +;met en minuscule la chaine ds:si +LowerCase0: + push si ax +LowerCase: + mov al,ds:[si] + inc si + cmp al,0 + je EndLowerCase + cmp al,'A' + jb LowerCase + cmp al,'Z' + ja LowerCase + add byte ptr [si-1],'a'-'A' + jmp LowerCase +EndLowerCase: + clc + pop ax si + ret + +;Inverse la casse la chaine ds:si +InvertCase0: + push si ax +InvertCase: + mov al,ds:[si] + inc si + cmp al,0 + je EndInvertCase + cmp al,'A' + jb InvertCase + cmp al,'Z' + jbe GoInvertCase + cmp al,'a' + jb InvertCase + cmp al,'z' + ja InvertCase + sub byte ptr [si-1],'a'-'A' + jmp InvertCase +GoInvertCase: + add byte ptr [si-1],'a'-'A' + jmp InvertCase +EndInvertCase: + clc + pop ax si + ret + + + +end start diff --git a/video.asm b/video.asm index 52f849b..edb4a2e 100755 --- a/video.asm +++ b/video.asm @@ -280,12 +280,12 @@ mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH DB 41H,00H,0FH,00H,00H - db 00,00 + db 00,00 ;320*400 256 couleurs chain4 -mode7 DB 63H, 00H, 03H,01H,0FH,00H,06H +mode7 DB 63H, 00H, 03H,01H,0FH,00H,0EH DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H - DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH + DB 9CH,8EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH DB 41H,00H,0FH,00H,00H @@ -311,6 +311,15 @@ mode9 DB 63H, 00H, 03H,01H,0FH,00H,0EH +;==================================================== +;320*400 256 couleurs chain4 +mode7s DB 63H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H + DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + db 00,00 ; ;=============CLEAR========= @@ -891,6 +900,7 @@ Showsigned: push ax ebx edx es xor ebx,ebx mov bl,cl +dec bl bt edx,ebx jnc pos neg edx From 36a6efc33320af9511e8768d5abf2407818f0f95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Tue, 15 May 2001 22:48:10 +0200 Subject: [PATCH 09/17] feat: ajout d'une commande interne mode. Nombreuses nouvelles fonctions dans str0. --- prompt.asm | 494 +++++++++++++++++++++-------------------- str0.asm | 634 +++++++++++++++++++++++++++++++++++++++++++++++++++-- video.asm | 4 +- 3 files changed, 861 insertions(+), 271 deletions(-) diff --git a/prompt.asm b/prompt.asm index cc1a85a..c503c29 100755 --- a/prompt.asm +++ b/prompt.asm @@ -6,260 +6,258 @@ smart org 0100h start: -mov ah,2 -int 47h -mov ah,6 -int 47h -mov ah,6 -int 47h -mov ah,13 -mov si,offset msg -int 47h + mov ah,2 + int 47h + mov ah,6 + int 47h + mov ah,6 + int 47h + mov ah,13 + mov si,offset msg + int 47h + xor bp,bp + mov dl,' ' + call setdelimiter0 replay: -mov ah,6 -int 47h + mov ah,6 + int 47h noret: -mov ah,6 -int 47h -mov ah,13 -mov si,offset prompt -int 47h -mov di,offset buffer + mov ah,6 + int 47h + mov ah,13 + mov si,offset prompt + int 47h + mov di,offset buffer waitchar: -mov ax,0 -int 16h -cmp al,0Dh -je entere -cmp di,offset buffer+256 -je waitchar -mov [di],al -inc di -mov dl,al -mov ah,7 -int 47h -jmp waitchar -entere: -mov byte ptr [di],0 -mov si,offset buffer -cmp si,di -je noret -mov ah,6 -int 47h -call uppercase0 -mov bx,offset commands -tre: -mov di,[bx] -add bx,4 -cmp di,0 -je error -push cs -pop es -call cmpstr0 -jne tre -mov bx,[bx-2] -call bx -jmp replay -error: -push cs -pop es -mov dl,'.' -call searchchar0 -je noaddext -mov di,offset buffer -mov si,offset extcom -call concat0 -noaddext: -mov si,offset buffer -push cs -mov ax,offset arrive -push ax -mov di,offset vga -mov ah,40 -int 47h -mov ax,6000h -mov es,ax -push ax -mov di,0100h -push di -mov ah,4 -int 48h -jc reallyerror - push es - push es - push es - pop ds - pop fs - pop gs - push 7202h - popf -db 0CBh -arrive: -push cs -push cs -push cs -push cs -pop ds -pop es -pop fs -pop gs -mov si,offset vga -mov ah,41 -int 47h -jmp replay -reallyerror: -pop ax -pop ax -pop ax -pop ax -mov ah,13 -mov si,offset Error_Syntax -int 47h -jmp replay - -Code_Exit: -pop ax -db 0CBh - -Code_Version: -mov ah,13 -mov si,offset Version_Text -int 47h -ret - -Version_Text db 'Cos 2000 version 1.1.1B by Nico',0 - -Code_Cls: -mov ah,2 -int 47h -ret - -Code_Reboot: -push 0FFFFh -push 00000h -db 0CBH - -Code_Command: -mov bx,offset commands -showalls: -mov si,[bx] -add bx,4 -cmp si,0 -je endoff -mov ah,13 -int 47h -mov ah,6 -int 47h -jmp showalls -endoff: -ret - -extcom db '.EXE',0 - -commands dw Str_Exit ,Code_Exit - dw Str_Version,Code_Version - dw Str_Cls ,Code_Cls - dw Str_Reboot ,Code_Reboot - dw Str_Command,Code_Command - dw 0 - - -Str_Exit db 'EXIT',0 -Str_Version db 'VERSION',0 -Str_Cls db 'CLS',0 -Str_Reboot db 'REBOOT',0 -Str_Command db 'COMMAND',0 - -Error_Syntax db 'Command or executable doesn''t exist !',0 -prompt db 'COS>',0 -msg db 'Cos command interpretor V1.0',0 -buffer db 255 dup (0) - -;Recherche un caractŠre dl dans la chaŒne ds:si -SearchChar0: - push ax cx di es - call GetLength0 - push ds - pop es - mov di,si - mov al,dl - repne scasb - pop es di cx ax - ret - -;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal -cmpstr0: - push cx dx si di - call GetLength0 - mov dx,cx - push ds si - push es - pop ds - mov si,di - call GetLength0 - pop si ds - cmp cx,dx - jne NotEqual - repe cmpsb -NotEqual: - pop di si dx cx - ret - -;met en majuscule la chaine ds:si -UpperCase0: - push si ax -UpperCase: - mov al,ds:[si] - inc si - cmp al,0 - je EndUpperCase - cmp al,'a' - jb UpperCase - cmp al,'z' - ja UpperCase - sub byte ptr [si-1],'a'-'A' - jmp UpperCase -EndUpperCase: - clc - pop ax si - ret - -;ConcatŠne le chaine ds:si avec es:di -Concat0: - push ax cx dx si di - call GetLength0 - mov dx,cx - xchg si,di - push ds - push es - pop ds - call GetLength0 - pop ds - xchg si,di + mov ax,0 + int 16h + cmp ah,59 + jne norr + cmp bp,0 + je waitchar + mov ah,13 + mov si,cs:[bp-8] + int 47h + push cs + pop es + call copy0 + call getlength0 add di,cx - mov cx,dx - cld - rep movsb - mov al,0 - stosb - pop di si dx cx ax - ret - -;renvoie la taille en octets CX de la chaine point‚e en ds:si -GetLength0: - push ax di es - push ds + jmp waitchar +norr: + cmp al,0Dh + je entere + cmp di,offset buffer+256 + je waitchar + mov [di],al + inc di + mov dl,al + mov ah,7 + int 47h + jmp waitchar +entere: + mov byte ptr [di],0 + mov si,offset buffer + cmp si,di + je noret + mov ah,6 + int 47h + push cs pop es - mov di,si - mov al,0 - mov cx,0FFFFh - cld - repne scasb - neg cx - dec cx - dec cx - pop es di ax + mov di,offset buffer2 + xor cx,cx + call getitem0 + mov si,di + call uppercase0 + mov bx,offset commands + xor bp,bp +tre: + mov di,[bx] + add bx,8 + cmp di,0 + je error + push cs + pop es + call evalue0 + cmp dx,bp + jb noadd + mov bp,dx + mov ax,bx + noadd: + call cmpstr0 + jne tre + mov si,offset buffer + mov di,offset buffer2 + call copy0 + mov si,di + call uppercase0 + xor cx,cx + inc cx + call getpointeritem0 + cmp byte ptr [di-1],0 + jne nopod + mov byte ptr [di],0 +nopod: + mov si,di + mov di,[bx-4] + call checksyntax0 + jc errorprec + mov bx,[bx-6] + call bx + jmp replay +error: + mov bp,ax + push cs + pop es + mov dl,'.' + call searchchar0 + je noaddext + mov di,offset buffer + mov si,offset extcom + call concat0 +noaddext: + mov si,offset buffer + push cs + mov ax,offset arrive + push ax + mov di,offset vga + mov ah,40 + int 47h + mov ax,6000h + mov es,ax + push ax + mov di,0100h + push di + mov ah,4 + int 48h + jc reallyerror + push es + push es + push es + pop ds + pop fs + pop gs + push 7202h + popf + db 0CBh + arrive: + push cs + push cs + push cs + push cs + pop ds + pop es + pop fs + pop gs + mov si,offset vga + mov ah,41 + int 47h + xor bp,bp + jmp replay +reallyerror: + pop ax + pop ax + pop ax + pop ax + mov ah,13 + mov si,offset Error_Syntax + int 47h + mov ah,13 + mov si,cs:[bp-8] + int 47h + jmp replay +errorprec: + mov ah,13 + mov si,offset derror + int 47h + jmp replay + +Code_Exit: + pop ax + db 0CBh + +Code_Version: + mov ah,13 + mov si,offset Version_Text + int 47h + ret + +Version_Text db 'Cos 2000 version 1.1.1B by Nico',0 + +Code_Cls: + mov ah,2 + int 47h + ret + +Code_Reboot: + push 0FFFFh + push 00000h + db 0CBH + +Code_Command: + mov bx,offset commands +showalls: + mov si,[bx] + add bx,8 + cmp si,0 + je endoff + mov ah,13 + int 47h + mov ah,6 + int 47h + jmp showalls + endoff: ret +Code_Mode: + mov cx,0 + call gettypeditem0 + mov ah,0 + mov al,dl + and al,1111b + int 47h + mov ah,2 + int 47h + ret + +extcom db '.EXE',0 + +commands dw Str_Exit ,Code_Exit ,Syn_Exit ,Help_Exit + dw Str_Version,Code_Version,Syn_Version,Help_Version + dw Str_Cls ,Code_Cls ,Syn_Cls ,Help_Cls + dw Str_Reboot ,Code_Reboot ,Syn_Reboot ,Help_Reboot + dw Str_Command,Code_Command,Syn_Command,Help_Command + dw Str_Mode ,Code_Mode ,Syn_Mode ,Help_Mode + dw 0 + +Str_Exit db 'EXIT',0 +Str_Version db 'VERSION',0 +Str_Cls db 'CLS',0 +Str_Reboot db 'REBOOT',0 +Str_Command db 'COMMAND',0 +Str_Mode db 'MODE',0 +Syn_Exit db 0 +Syn_Version db 0 +Syn_Cls db 0 +Syn_Reboot db 0 +Syn_Command db 0 +Syn_Mode db 'FFH',0 +Help_Exit db 0 +Help_Version db 0 +Help_Cls db 0 +Help_Reboot db 0 +Help_Command db 0 +Help_Mode db 0 + +derror db 'Syntax error',0 +Error_Syntax db 'Command or executable doesn''t exist ! F1 for ',0 +prompt db 'COS>',0 +msg db 'Cos command interpretor V1.0',0 + + include str0.asm + +buffer equ $ +buffer2 equ $+256 +vga equ $+512 -vga db 0 end start diff --git a/str0.asm b/str0.asm index bc4503a..f9bf7fd 100755 --- a/str0.asm +++ b/str0.asm @@ -1,22 +1,381 @@ ;Librairie qui prend en charge le format de STR ASCIIZ -.model tiny -.486 -smart -.code +;# nombre 9 +;@ str 8 +;& file 7 -org 0100h +;Renvoie carry si la syntaxe de ds:si n'est pas respect‚ par rapport a es:di +CheckSyntax0: + push ax bx dx bp si di ds es + push es di + push cs + pop es + mov di,offset temp2 + call copy0 + mov si,di + push cs + pop ds + pop di es + call getdelimiter0 + mov bp,dx + mov dl,' ' + call setdelimiter0 + call compressdelimiter0 + call uppercase0 + call getnbitems0 + ;call xch + ;mov ax,cx + ;call getnbitem0 + ;call xch + ;cmp ax,cx + ;call xch + ;jne notequalatall + mov bx,cx + xor cx,cx +itemer: + call whatisitem0 + mov dx,ax + call xch + call whatisitem0 + call xch + cmp ax,dx + jne prob + cmp al,6 + jb equal + call cmpitems0 + je equal +prob: + cmp dl,4 + ja nosize + cmp al,8 + je equal + cmp al,4 + jne notequalatall + cmp dh,ah + ja notequalatall + jmp equal +nosize: + cmp al,7 + jne noname + cmp ah,0 + jne notequalatall + jmp equal +noname: + cmp al,8 + je equal + jmp notequalatall +equal: + inc cx + cmp cx,bx + jne itemer + cld +ackno: + mov dx,bp + call setdelimiter0 + pop es ds di si bp dx bx ax + ret +notequalatall: + stc + jmp ackno +xch: + push ds + push es + pop ds + pop es + xchg si,di + ret -start: -mov di,offset set -mov si,offset set -mov bx,7 -mov cx,5 -call delete0 -ret +temp2 db 256 dup (0) -set db 'Essai de string',0 -set2 db 'epais',0 -tre db 30 dup (0) +;Compare les ‚l‚ments cx de deux chaine ds:si et es:di +Cmpitems0: + push cx dx si di + push cx di + call getpointeritem0 + mov si,di + xor cx,cx + inc cx + call getpointeritem0 + mov dx,di + sub dx,si + dec cx + pop di cx + push ds si + push es + pop ds + mov si,di + call getpointeritem0 + pop si ds + mov cx,dx + rep cmpsb + pop di si dx cx + ret + + + +;Renvoie l'‚l‚ment cx de ds:si dans edx si nb et dans es:di si str ou name +gettypeditem0: + push bx cx si + call getpointeritem0 + mov si,di + xor cx,cx + inc cl + call getpointeritem0 + mov bx,di + dec bx + mov cl,0 + xchg cl,ds:[bx] + call gettyped0 + xchg cl,ds:[bx] + pop si cx bx + ret + +;Renvoie ds:si dans edx si nb et dans es:di si str ou name +gettyped0: + push ax + call whatis0 + cmp al,5 + jb number + cmp al,6 + je pointer + push ds + pop es + call getpointeritem0 + jmp endofGettypeditem0 +number: + mov edx,cs:lastnumber + jmp endofgettypeditem0 +pointer: + call str0toadress +endofgettypeditem0: + pop ax + ret + +;Renvoie dans ax le type de la str0 point‚e par ds:si ‚l‚ment cx +whatisitem0: + push bx cx si di + call getpointeritem0 + mov si,di + xor cx,cx + inc cl + call getpointeritem0 + mov bx,di + dec bx + mov cl,0 + xchg cl,ds:[bx] + call whatis0 + xchg cl,ds:[bx] + pop di si cx bx + ret + +;Renvoie dans ax le type de la str0 point‚e par ds:si +;High Low +;0 variable 4 hex +;1 byte 3 dec +;2 word 2 oct +;3 3 octets 1 bin +;4 dword 5 adresse +;5 5 octets 6 name +;6 ... 7 str +whatis0: + push bx cx edx + mov cl,2 + call str0isbase + jnc finbase + mov cl,8 + call str0isbase + jnc finbase + mov cl,10 + call str0isbase + jnc finbase + mov cl,16 + call str0isbase + jc testadress +finbase: + mov bx,cx + xor ch,ch + mov al,cs:[bx+offset basenn-2] + call str0toint + mov cs:Lastnumber,edx + cmp edx,0000FFFFh + ja bits32 + cmp dx,00FFh + ja bits16 + mov ah,1 + jmp endofwhat +bits16: + mov ah,2 + jmp endofwhat +bits32: + mov ah,3 + jmp endofwhat +testadress: + call str0isadress + jc testname + mov ax,0005h + jmp endofwhat +testname: + call str0isname + jc testvarstr + mov al,07h + call getlength0 + cmp byte ptr [si],'&' + jne real + mov cl,0 +real: + mov ah,cl + jmp endofwhat +testvarstr: + cmp byte ptr [si],'@' + jne testnumber + mov al,08h + call getlength0 + mov ah,cl + jmp endofwhat +testnumber: + cmp byte ptr [si],'#' + jne isstr + call getlength0 + cmp cl,1 + ja isstr + mov ax,0009h + jmp endofwhat +isstr: + mov al,06h + call getlength0 + dec cl + mov ah,cl +endofwhat: + pop edx cx bx + ret + +Lastnumber dd 0 + +;Renvoie non carry si la str ds:si point‚e peut ˆtre une adresse +str0isadress: + ;push + stc + ;pop + ret + +;Renvoie en es:di le pointeur str0 ds:si +Str0toAdress: + ;push + stc + ;pop + ret + +;Renvoie non carry si la str ds:si point‚e peut ˆtre un nom de fichier +str0isname: + push ax si di +isname: + mov al,[si] + inc si + cmp al,0 + je itsok + mov di,offset non +verify: + mov ah,[di] + inc di + cmp ah,0FFh + je isname + cmp ah,al + jne verify + stc + jmp itsdead +itsok: + clc +itsdead: + pop di si ax + ret + +non db '/<>|@#',01,0FFh + +;Renvoie non carry si le texte point‚ par si est de la base cl +str0isbase: + push ax cx si di es + push cs + pop es + mov ah,cl +isstrbase: + mov al,[si] + cmp al,0 + je okbase + mov cl,ah + xor ch,ch + mov di,cx + cmp al,es:[di-2+offset basen] + je verifbase + xor ch,ch + inc cl + mov di,offset base + cld + repne scasb + cmp cx,0 + je nobase + inc si + jmp isstrbase +okbase: + clc +endbase: + pop es di si cx ax + ret +verifbase: + cmp byte ptr [si+1],0 + je okbase +nobase: + stc + jmp endbase + +temp dw 0 + +;Converti un str de base cl en int dans edx +str0toint: + push eax bx ecx si edi ebp es + push cs + pop es + mov ah,cl + mov cs:temp,si +gotos: + cmp byte ptr [si+1], 0 + je oklo + inc si + jmp gotos +oklo: + mov edi,1 + xor ebp,ebp + mov bl,cl +baseto: + cmp si,cs:temp + jb endbaseto + mov al,[si] + xor ecx,ecx + mov cl,bl + inc cl + push di + mov di,offset base + cld + repne scasb + pop di + jne noop + sub cl,bl + neg cl + mov eax,edi + mul ecx + add ebp,eax + mov eax,edi + mov cl,bl + mul ecx + mov edi,eax +noop: + dec si + jmp baseto +endbaseto: + mov edx,ebp + pop es ebp edi si ecx bx eax +ret +base db '0123456789ABCDEF' +basen db 'B O D H' +basenn db 1,0,0,0,0,0,2,0,3,0,0,0,0,0,4 ;Renvoie en es:di la partie de cx caractŠres a partir de la gauche de ds:si Left0: @@ -67,6 +426,24 @@ Fill0: pop es di si cx bx ax ret +;Remplace tout les caractŠres al de ds:si par des caractŠres dl +ReplaceAllchar0: + push ax cx di es + call GetLength0 + push ds + pop es + mov di,si +findandchange: + repne scasb + cmp cx,0 + je endofchange + mov es:[di-1],dl + jmp findandchange +endofchange: + pop es di cx ax + ret + + ;Recherche un caractŠre dl dans la chaŒne ds:si SearchChar0: push ax cx di es @@ -79,6 +456,32 @@ SearchChar0: pop es di cx ax ret +;Inverse la chaine point‚e en ds:si +invert0: + push ax cx si di es + call GetLength0 + push ds + pop es + mov di,si + add di,cx + dec di +revert: + mov al,[si] + xchg al,es:[di] + mov [si],al + inc si + dec di + cmp si,di + je finishinvert + dec di + cmp si,di + je finishinvert + inc di + jmp revert +finishinvert: + pop es di si cx ax + ret + ;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal cmpstr0: push cx dx si di @@ -97,6 +500,42 @@ NotEqual: pop di si dx cx ret +;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal et renvoie le nb de caractŠre egaux dans dx +evalue0: + push cx si di + push ds si + push es + pop ds + mov si,di + call GetLength0 + pop si ds + mov dx,cx + repe cmpsb + pushf + sub dx,cx + popf + pop di si cx + ret + + +;Insert une chaine ds:si en es:di a partir du caractŠre cx +insert0: + push cx di si + add di,cx + call getlength0 + push si di ds + push es + pop ds + mov si,di + add di,cx + call copy20 + pop ds di si + cld + inc di + rep movsb + pop si di cx + ret + ;Detruit CX caractŠres a partir du caractŠre BX de DS:SI delete0: push cx dx si di es @@ -105,16 +544,18 @@ delete0: mov dx,cx call getlength0 sub cx,dx - neg cx - mov di,si + sub cx,bx + inc cx add si,bx + mov di,si + add si,dx cld rep movsb pop es di si dx cx ret ;Copie une chaine de ds:si en es:di -Copy: +Copy0: push ax cx si di call GetLength0 cld @@ -124,6 +565,19 @@ Copy: pop di si cx ax ret +;Copie une chaine de ds:si en es:di +Copy20: + push ax cx si di + call GetLength0 + cld + add si,cx + add di,cx + inc cx + std + rep movsb + pop di si cx ax + ret + ;ConcatŠne le chaine ds:si avec es:di Concat0: push ax cx dx si di @@ -145,6 +599,146 @@ Concat0: pop di si dx cx ax ret +;Met DL comme d‚limiteur par d‚faut +SetDelimiter0: + mov cs:delim,dl + ret + +;Renvoie le d‚limiteur par d‚faut dans dl +GetDelimiter0: + mov dl,cs:delim + ret +delim db 0 + +;D‚truit les d‚limiteur qui sont cons‚cutifs dans ds:si +CompressDelimiter0: + push ax dx si di es + call Getlength0 + push ds + pop es + mov di,si + mov al,cs:delim + xor dx,dx +Compressitems: + repne scasb + inc dx +againcomp: + cmp [di],al + jne nosup + mov si,di + mov bx,0 + push cx + mov cx,1 + call delete0 + pop cx + jmp againcomp +nosup: + cmp cx,0 + jne compressitems + mov cx,dx + pop es di si dx ax + ret + +;Met le nombre d'‚l‚ments … cx +Setnbitems0: + push ax cx dx di es + mov dx,cx + call Getnbitems0 + cmp cx,dx + je noadjust + ja subsome + push ds + pop es + mov di,si + sub cx,dx + neg cx + push cx + call getlength0 + add di,cx + pop cx + mov al,cs:delim + mov ah,'a' + rep stosw + mov al,0 + stosb + jmp noadjust +subsome: + mov cx,dx + call GetPointeritem0 + dec di + mov byte ptr [di],0 +noadjust: + pop es di dx cx + ret + +;Renvoie la taille dx de l'‚l‚ment cx +Getitemsize: + push cx di + call getpointeritem0 + mov dx,di + inc cx + call getpointeritem0 + sub dx,di + neg dx + dec dx + pop di cx + ret + +;Renvoie en es:di l'‚l‚ment cx de ds:si +Getitem0: + push si di cx ax + push di + call getPointeritem0 + call getitemsize + mov si,di + pop di + mov cx,dx + rep movsb + mov al,0 + stosb + pop ax cx di si + ret + +;renvoi un pointeur di sur l'‚l‚ment cx de ds:si +GetPointeritem0: + push ax bx cx dx es + mov bx,cx + call Getlength0 + push ds + pop es + mov di,si + mov al,cs:delim + xor dx,dx +Countnbitems: + cmp bx,dx + je finishpointer + repne scasb + inc dx + cmp cx,0 + jne countnbitems + inc di +finishpointer: + pop es dx cx bx ax + ret + +;Renvoie le nombre d'‚l‚ments cx de ds:si +GetNbitems0: + push ax dx di es + call Getlength0 + push ds + pop es + mov di,si + mov al,cs:delim + xor dx,dx +Countitems: + repne scasb + inc dx + cmp cx,0 + jne countitems + mov cx,dx + pop es di dx ax + ret + ;renvoie la taille en octets CX de la chaine point‚e en ds:si GetLength0: push ax di es @@ -248,6 +842,4 @@ EndInvertCase: pop ax si ret - - -end start + diff --git a/video.asm b/video.asm index edb4a2e..56c48b3 100755 --- a/video.asm +++ b/video.asm @@ -1018,7 +1018,7 @@ rep movsd pop cx eax loadbmp: -push ax bx cx dx bp ds +push ax bx cx dx ds mov ax,ds:[18] mov si,ax shr ax,2 @@ -1066,7 +1066,7 @@ dec dx inc bl dec cl jnz palettemake -pop ds bp dx cx bx ax +pop ds dx cx bx ax ret sizeh dw 0 sizev dw 0 From 336d676da69da395294956a1d69b2b91f99b48e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Fri, 1 Jun 2001 22:48:10 +0200 Subject: [PATCH 10/17] feat: ajout d'une application qui passe en Pmode. Finalisation de la gestion de la souris. --- 8253.asm | 53 ----------- disk.asm | 10 ++- m2.asm | 257 ----------------------------------------------------- mm.asm | 52 ----------- mouse.asm | 103 ++++++++++++++++----- pmode.asm | 15 ++++ setup.asm | 6 +- system.asm | 2 + 8 files changed, 108 insertions(+), 390 deletions(-) delete mode 100755 8253.asm delete mode 100755 m2.asm delete mode 100755 mm.asm create mode 100755 pmode.asm diff --git a/8253.asm b/8253.asm deleted file mode 100755 index 7189103..0000000 --- a/8253.asm +++ /dev/null @@ -1,53 +0,0 @@ -.model tiny -.486 -smart -.code -org 0100h -start: -jmp tsr -db '8253' -Tsr: -cli -cmp ax,1234h -jne nomore -mov ax,4321h -jmp itsok -nomore: -push bx -mov bl,ah -xor bh,bh -shl bx,1 -mov bx,cs:[bx].tables -mov cs:current,bx -pop bx -call cs:current -itsok: -jnc noerror -push bp -mov bp,sp -or byte ptr [bp+6],1b -pop bp -mov ax,cs -shl eax,16 -mov ax,cs:current -jmp endofint -noerror: -push bp -mov bp,sp -and byte ptr [bp+6],0FEh -pop bp -endofint: -sti -iret -current dw 0 -tables dw enableirq - dw disableirq - dw readmaskirq - dw readirr - dw readisr - dw installhandler - dw replacehandler - dw getint - dw setint - dw seteoi - diff --git a/disk.asm b/disk.asm index a90d01d..e0b4ca3 100755 --- a/disk.asm +++ b/disk.asm @@ -75,6 +75,8 @@ lines: mov ah,13 mov si,offset spaces int 47h + mov ah,5 + int 47h mov al,16 mov cl,7 mov ah,21 @@ -105,10 +107,12 @@ doaline2: inc di dec al jnz doaline2 + dec bh + je outes mov ah,6 int 47h - dec bh - jnz lines + jmp lines +outes: mov ah,21 mov cl,112 int 47h @@ -355,7 +359,7 @@ xxyy dw 3 xxyy2 dw 3 errordisk db 'An error has occured on drive A:, press a key to continu ',0 menu db 'Bottom F1, Top F2, Sectors F3&F4, Load/Save F5&F6, Mode F7, Quit F8 MODE ' -pope db 'VIEW ',0 +pope db 'VIEW',0 spaces db ' ³ ',0 showbuffer db 35 dup (0FFh) diff --git a/m2.asm b/m2.asm deleted file mode 100755 index acee17d..0000000 --- a/m2.asm +++ /dev/null @@ -1,257 +0,0 @@ -.model tiny -.486 -smart -.code -org 0100h -start: -jmp tsr -drv db 'MOUSE',0 -Tsr: -cli -cmp ax,1234h -jne nomore -mov ax,4321h -jmp itsok -nomore: -push bx ax -mov ah,4 -mov bh,0 -int 50h -mov bl,al -pop ax -cmp byte ptr cs:isact,1 -je nottest -mov cs:isact,1 -and bl,10000b -cmp bl,16 -jae react -mov bl,ah -xor bh,bh -shl bx,1 -mov bx,cs:[bx].tables -mov cs:current,bx -pop bx -call cs:current -itsok: -jnc noerror -push bp -mov bp,sp -or byte ptr [bp+6],1b -pop bp -mov ax,cs -shl eax,16 -mov ax,cs:current -jmp endofint -noerror: -push bp -mov bp,sp -and byte ptr [bp+6],0FEh -pop bp -endofint: -mov cs:isact,0 -sti -iret -nottest: -pop bx -jmp endofint -current dw 0 -tables dw cmdmouse - dw cmdmouse2 - dw detectmouse - dw getmouse - -isact db 0 - -;Envoie une commande AL … la souris via controleur clavier -cmdmouse: - push ax -videbuff1: - in al, 64h - and al, 10b - jne videbuff1 - mov al, 00d4h - out 64h, al -videbuff2: - in al, 64h - and al, 10b - jne videbuff2 - pop ax - out 60h, al - in al, 60h - ret - -;Envoie une commande2 AL … la souris via controleur clavier carry=nomouse -cmdmouse2: - push ax -videbuff21: - in al, 64h - and al, 10b - jne videbuff21 - mov al, 0060h - out 64h, al -videbuff22: - in al, 64h - and al, 10b - jne videbuff22 - pop ax - out 60h, al - in al, 60h - ret - -Detectmouse: - push ax cx - mov al, 0a8h ;AUX enable - out 64h, al - mov al, 0f3h ;Set sample - call cmdmouse - mov al, 100 ;Set sample - call cmdmouse - mov al, 0e8h ;Set resolution - call cmdmouse - mov al, 01 ;Set resolution - call cmdmouse - mov al, 0e7h ;Set scale 2:1 - call cmdmouse - mov al, 0f4h ;Enable device - call cmdmouse - mov al, 47h ;Interruption ON - call cmdmouse2 - mov cx, 1024 -testmouse: - in al, 60h ;Lecture du port de donn‚es - cmp al, 250 ;Test si il y a une souris - je okmouse - dec cx - jnz testmouse - stc - jmp endoftest -okmouse: - clc -endoftest: - pop cx ax - ret - -;envoie en bx,cx les coordonn‚es et en dl les boutons -getmouse: -mov bl,cs:vx -xor bh,bh -mov cl,cs:vy -xor ch,ch -mov dl,cs:button -;sub dl,8 -;and dl,0Fh -clc -ret - -Button db 0 -rx dw 0 -ry dw 0 -VX db 0 -VY db 0 -X dw 0 -Y dw 0 -count db 0 -error db 0 -xy dw 0 -old dw 0 -;Gestionnaire de souris PS/2 -react: - push ax bx cx dx di ds es - push cs - pop ds - in al, 60h - cmp error, 1 - je gest1 - cmp count, 1 - je gest1 - cmp count, 2 - je gest2 - cmp count, 3 - je gest3 - -gest1: - mov count, 2 - mov Button, al - and al, 00001000b - cmp al, 8 - je gest1end - mov error, 1 - jmp gest1end2 -gest1end: - mov error, 0 -gest1end2: - mov count, 2 - jmp endgest -gest2: - mov count, 3 - mov VX, al - jmp endgest -gest3: - mov count, 1 - mov VY, al - jmp endgest -endgest: - mov bl,VY - xor bh,bh - mov al,button - shr al,5 - and al,1 - cmp al,0 - je addy - add y,bx - jmp hadsuby - addy: - sub y,bx - hadsuby: - mov bl,VX - xor bh,bh - mov al,button - shr al,8 - and al,1 - cmp al,0 - je addx - sub x,bx - jmp hadsubx - addx: - add x,bx - hadsubx: - push cs - pop es - mov di,offset infos - mov ah,34 - int 47h - mov ax,x - mov bx,0FFFFh - xor ch,ch - mov cl,[di+1] - mul cx - div bx - mov rx,ax - mov ax,y - mov cl,[di] - mul cx - div bx - mov ry,ax - mul byte ptr [di+1] - add ax,rx - shl ax,1 - mov di,ax - mov ax,0B800h - mov es,ax - mov bx,xy - mov ax,old - mov word ptr es:[bx],ax - mov xy,di - mov ax,es:[di] - mov old,ax - mov word ptr es:[di],0FF70h - mov al, 20h - out 0a0h, al - out 20h, al - pop es ds di dx cx bx ax - mov cs:isact,0 - pop bx - iret - infos db 10 dup (0) - -end start diff --git a/mm.asm b/mm.asm deleted file mode 100755 index 71446d7..0000000 --- a/mm.asm +++ /dev/null @@ -1,52 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: -mov ah,2 -int 74h -jc error -mov si,offset dnoerror -jmp noerror -error: -mov si,offset derror -noerror: -mov ah,20 -mov bx,1010h -int 47h -mov ax,0 -int 16h -xor edx,edx -popr: -mov ah,3 -int 74h -mov ah,6 -int 47h -mov si,bx -mov di,cx -mov ah,9 -mov cx,8 -int 47H -mov ah,5 -int 47H -mov dx,si -mov ah,9 -mov cx,8 -int 47H -mov ah,5 -int 47h -mov dx,di -mov ah,9 -mov cx,8 -int 47H -jmp popr -db 0CBh - -dnoerror db 'Souris d‚tect‚e en PS/2',0 -derror db 'Souris non d‚tect‚e',0 - - -end start diff --git a/mouse.asm b/mouse.asm index 021b203..67ad649 100755 --- a/mouse.asm +++ b/mouse.asm @@ -59,6 +59,8 @@ tables dw cmdmouse dw cmdmouse2 dw detectmouse dw getmouse + dw getmousescreen + dw configmouse isact db 0 @@ -133,27 +135,46 @@ endoftest: ;envoie en bx,cx les coordonn‚es et en dl les boutons getmouse: -mov bl,cs:vx -xor bh,bh -mov cl,cs:vy -xor ch,ch +mov bx,cs:rx +mov cx,cs:ry mov dl,cs:button -;sub dl,8 -;and dl,0Fh +sub dl,8 +and dl,0Fh clc ret -Button db 0 -rx dw 0 -ry dw 0 -VX db 0 -VY db 0 -X dw 0 -Y dw 0 -count db 0 -error db 0 -xy dw 0 -old dw 0 +;envoie en di les coordonn‚es ecran et en dl les boutons +getmousescreen: +mov di,cs:xy +mov cx,cs:ry +mov dl,cs:button +sub dl,8 +and dl,0Fh +clc +ret + + +;configure la rapidit‚ dans cl et dans ah,al sphŠre x et y +Configmouse: +mov cs:speed,cl +mov cs:spherex,ah +mov cs:spherey,al +ret + +Button db 0 +rx dw 0 +ry dw 0 +VX db 0 +VY db 0 +X dw 0 +Y dw 0 +speed db 6 +spherex db 0 +spherey db 0 +count db 0 +error db 0 +xy dw 0 +old dw 0 ;Gestionnaire de souris PS/2 react: push ax bx cx dx di ds es @@ -191,17 +212,50 @@ gest3: mov VY, al jmp endgest endgest: - mov bl,VY - xor bh,bh - add y,bx - mov bl,VX - xor bh,bh - add x,bx + cmp error,1 + je errormouse push cs pop es mov di,offset infos mov ah,34 - int 47h + int 47h + mov cl,speed + movsx bx,VY + shl bx,cl + cmp spherey,0 + jne nolimity + mov al,[di] + xor ah,ah + dec ax + cmp bx,0 + jg decy + cmp ry,ax + jae noaddy + jmp nolimity +decy: + cmp ry,0 + je noaddy +nolimity: + sub y,bx +noaddy: + movsx bx,VX + shl bx,cl + cmp spherex,0 + jne nolimitx + mov al,[di+1] + xor ah,ah + dec ax + cmp bx,0 + jl decx + cmp rx,ax + jae noaddx + jmp nolimitx +decx: + cmp rx,0 + je noaddx +nolimitx: + add x,bx +noaddx: mov ax,x mov bx,0FFFFh xor ch,ch @@ -230,6 +284,7 @@ endgest: mov al, 20h out 0a0h, al out 20h, al +errormouse: pop es ds di dx cx bx ax mov cs:isact,0 pop bx diff --git a/pmode.asm b/pmode.asm new file mode 100755 index 0000000..fc1625f --- /dev/null +++ b/pmode.asm @@ -0,0 +1,15 @@ +.model tiny +.486p +smart +.code + +org 0100h + +start: +mov eax,cr0 +or al,1 +mov cr0,eax + +db 0CBh + +end start diff --git a/setup.asm b/setup.asm index fc65f35..b44f3d0 100755 --- a/setup.asm +++ b/setup.asm @@ -156,6 +156,7 @@ jc error2 mov ax,3D00h int 21h jc error2 +mov cs:temp,ax mov bx,ax mov ax,4202h xor cx,cx @@ -219,13 +220,16 @@ pop es call writesector mov cx,entrie end1: +mov ah,3eh +mov bx,cs:temp +int 21h pop es ds bp di si dx bx ax ret entrie dw 0 error2: stc jmp end1 - +temp dw 0 makefit: push bx cx si di bp diff --git a/system.asm b/system.asm index dbb0152..48f9285 100755 --- a/system.asm +++ b/system.asm @@ -171,6 +171,8 @@ tre2: dec di shl di,5 mov dx,[di+bx+26] + cmp [di+bx+12],00657865h ;EXE + jne tre3 mov ah,6 int 47h int 47h From 9732d45b9fdd38a1069faf3e5cb0aa4a626f5da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sun, 1 Jul 2001 22:48:10 +0200 Subject: [PATCH 11/17] =?UTF-8?q?refactor:=20rangement=20des=20sources=20d?= =?UTF-8?q?ans=20diff=C3=A9rents=20r=C3=A9pertoires.=20Gestion=20de=20joys?= =?UTF-8?q?tick.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API.md | 97 ++ INFORMATIONS.md | 36 + clean.bat | 1 - asm.bat => commande/asm.bat | 9 +- commande/clean.bat | 3 + commande/debog.bat | 2 + prompt.asm => commande/prompt.asm | 4 +- setup.asm => commande/setup.asm | 16 +- str0.asm => commande/str0.asm | 0 write.bat => commande/write.bat | 0 debog.bat | 2 - noyau/asm.bat | 55 + asmsys.bat => noyau/asmsys.bat | 2 + boot.asm => noyau/boot.asm | 0 noyau/clean.bat | 3 + noyau/debog.bat | 2 + drive.asm => noyau/drive.asm | 5 +- noyau/hours.asm | 81 ++ noyau/joystick.asm | 298 +++++ keyboard.asm => noyau/keyboard.asm | 10 +- lpt.asm => noyau/lpt.asm | 0 mouse.asm => noyau/mouse.asm | 61 +- thin8x8.fnt => noyau/old8x8.fnt | Bin pic8259a.asm => noyau/pic8259a.asm | 12 +- system.asm => noyau/system.asm | 234 ++-- noyau/thin8x8.fnt | Bin 0 -> 2048 bytes noyau/timer.asm | 32 + noyau/video.asm | 1560 +++++++++++++++++++++++++++ noyau/write.bat | 4 + exe2boot.asm => outils/exe2boot.asm | 0 rip.asm => outils/rip.asm | 0 unrip.asm => outils/unrip.asm | 0 programs/asm.bat | 54 + programs/clean.bat | 3 + programs/debog.bat | 2 + disk.asm => programs/disk.asm | 27 +- editor.asm => programs/editor.asm | 39 +- logo.asm => programs/logo.asm | 8 +- programs/mous.asm | 41 + pmode.asm => programs/pmode.asm | 0 test.asm => programs/test.asm | 2 + verif.asm => programs/verif.asm | 0 programs/write.bat | 4 + timer.asm | 91 -- video.asm | 1412 ------------------------ 45 files changed, 2560 insertions(+), 1652 deletions(-) create mode 100755 API.md create mode 100755 INFORMATIONS.md delete mode 100755 clean.bat rename asm.bat => commande/asm.bat (82%) create mode 100755 commande/clean.bat create mode 100755 commande/debog.bat rename prompt.asm => commande/prompt.asm (94%) rename setup.asm => commande/setup.asm (91%) rename str0.asm => commande/str0.asm (100%) rename write.bat => commande/write.bat (100%) delete mode 100755 debog.bat create mode 100755 noyau/asm.bat rename asmsys.bat => noyau/asmsys.bat (76%) rename boot.asm => noyau/boot.asm (100%) create mode 100755 noyau/clean.bat create mode 100755 noyau/debog.bat rename drive.asm => noyau/drive.asm (92%) create mode 100755 noyau/hours.asm create mode 100755 noyau/joystick.asm rename keyboard.asm => noyau/keyboard.asm (90%) rename lpt.asm => noyau/lpt.asm (100%) rename mouse.asm => noyau/mouse.asm (81%) rename thin8x8.fnt => noyau/old8x8.fnt (100%) rename pic8259a.asm => noyau/pic8259a.asm (92%) rename system.asm => noyau/system.asm (81%) create mode 100755 noyau/thin8x8.fnt create mode 100755 noyau/timer.asm create mode 100755 noyau/video.asm create mode 100755 noyau/write.bat rename exe2boot.asm => outils/exe2boot.asm (100%) rename rip.asm => outils/rip.asm (100%) rename unrip.asm => outils/unrip.asm (100%) create mode 100755 programs/asm.bat create mode 100755 programs/clean.bat create mode 100755 programs/debog.bat rename disk.asm => programs/disk.asm (89%) rename editor.asm => programs/editor.asm (88%) rename logo.asm => programs/logo.asm (83%) create mode 100755 programs/mous.asm rename pmode.asm => programs/pmode.asm (100%) rename test.asm => programs/test.asm (91%) rename verif.asm => programs/verif.asm (100%) create mode 100755 programs/write.bat delete mode 100755 timer.asm delete mode 100755 video.asm diff --git a/API.md b/API.md new file mode 100755 index 0000000..63371c4 --- /dev/null +++ b/API.md @@ -0,0 +1,97 @@ +Liste exhaustive des APIs supportée par cos +78 fonctions + +Drive.sys : Gestionnaires FAT,FIT et partition +Interruption 48h (Disquette uniquement) +fonctions 00h readsector + 01h writesector + 02h verifysector + 03h loadfatway + 04h loadfile + 05h compressrle + 06h decompressrle +lpt.sys : Gestionnaires port parallèle +Interruption 0Dh (LPT1) ou 0Fh (LPT2) +fonctions 00h getlptin + 01h getlptout + 02h getlptinout + 03h setlptin + 04h setlptout + 05h setlptinout + 06h getlpt + 07h getfirstlpt + 08h setemettor + 09h setreceptor + 0Ah settimeout + 0Bh gettimeout + 0Ch receivelpt + 0Dh sendlpt + 0Eh receivelptblock + 0Fh sendlptblock + 10h receivecommand + 11h sendcommand +mouse.sys : Gestionnaires souris +Interruption 74h (PS/2) +fonctions 00h cmdmouse + 01h cmdmouse2 + 02h detectmouse + 03h getmouse + 04h getmousescreen + 05h configmouse +pic8259a.sys : Gestionnaires contrôleur d'interruption programmable +Interruption 50h (Maître et esclave) +fonctions 00h enableirq + 01h disableirq + 02h readmaskirq + 03h readirr + 04h readisr + 05h installhandler + 06h replacehandler + 07h getint + 08h setint + 09h seteoi +video.sys : Gestionnaires de la carte video +Interruption 47h (VGA) +fonctions 00h setvideomode + 01h getvideomode + 02h cleartext + 03h changefont + 04h loadfont + 05h space + 06h line + 07h showchar + 08h showint + 09h showsigned + 0Ah showhex + 0Bh showbin + 0Ch showstring + 0Dh showstring0 + 0Eh showcharat + 0Fh showintat + 10h showsignedat + 11h showhexat + 12h showbinat + 13h showstringat + 14h showstring0at + 15h setcolor + 16h getcolor + 17h scrolldown + 18h getxy + 19h setxy + 1Ah savescreen + 1Bh restorescreen + 1Ch page2to1 + 1Dh page1to2 + 1Eh xchgPages + 1Fh savepage1 + 20h changelineattr + 21h waitretrace + 22h getinfos + 23h loadbmp + 24h showbmp + 25h clearscr + 26h savedac + 27h restoredac + 28h savestate + 29h restorestate + \ No newline at end of file diff --git a/INFORMATIONS.md b/INFORMATIONS.md new file mode 100755 index 0000000..505a30f --- /dev/null +++ b/INFORMATIONS.md @@ -0,0 +1,36 @@ + < COS2000 the new operating system > + + +I. Présentation + + COS2000, par définition est système d'exploitation, celui prend la direction des opérations à partir du moment où le PC est mis sous tension (Aprés le BIOS). Celui gére tous les périphériques rattaché au PC et offre aux programmeur les moyens de développer des applications compatibles : les APIs. COS2000 est basé sur un concept particulier qui est d'offrir au programmeur un maximum de fonctions intégrés pour faciliter le travail des programmeurs et réduire la taille des programmes. + + +II. Mode d'emploi + +Pour installer COS2000 : + - Insérez une disquette 1.44 Mo dans votre lecteur. + - Lancez le programme Setup.com. + - Si celui-ci ne détecte pas d'erreur, COS2000 est installé ! + +Pour lancer COS2000 : + - Insérez la disquette où COS2000 est installé. + - Veillez que dans le BIOS vous puissiez démarrer à partir de A:. + - Redémarrer votre ordinateur et vous serez sur COS2000. + +Pour utiliser COS2000 : + + Le COS MENU LOADER est le premier logiciel qui est lancé au démarrage. A partir de celui-ci vous pouvez visionner tout les fichiers présents sur votre disquette et éventuellement s'il possèdent l'extension EXE, ils peuvent être exécutés. +Pour cela il suffit de sélectionner avec la ligne en surbrillance le programme à executer en utilisant les flêches de directions, pour éxecuter le programmer presser la touche "Entrée". +A partir du COS MENU LOADER on peut lancer un interpréteur de commandes . Celui s'appelle PROMPT.EXE. +Une fois dans l'interpréteur de commande vous pouvez tout aussi bien lancer des logiciels en saissisant leurs noms après "COS>". + +En plus des logiciels, l'interpréteur de commande peut exécuter 6 commandes : +EXIT Quitte l'interpréteur +VERSION Donne la version de COS2000 +CLS Efface l'écran +REBOOT Redémarre le PC +COMMAND Donne la liste des commandes disponibles +MODE [mode] Permet de changer de mode vidéo, [mode] doit être un nombre entre 1 et 9. + les modes au delà de 4 sont des modes graphiques à texte émulé, il est + déconseillé de les utiliser car il est parfois impossible de revenir aux modes texte. diff --git a/clean.bat b/clean.bat deleted file mode 100755 index 200b0c1..0000000 --- a/clean.bat +++ /dev/null @@ -1 +0,0 @@ -del ..\data\*.exe diff --git a/asm.bat b/commande/asm.bat similarity index 82% rename from asm.bat rename to commande/asm.bat index daef462..9466a7b 100755 --- a/asm.bat +++ b/commande/asm.bat @@ -1,11 +1,11 @@ @echo off echo Assembling file %1... -util\tasm %1.asm /m5/x/t +..\util\tasm %1.asm /m5/x/t if errorlevel 1 goto end if "%1"=="boot" goto boot echo Linking file %1... -util\tlink %1.obj /x/t +..\util\tlink %1.obj /x/t if errorlevel 1 goto end echo Copying file %1... if "%1"=="video" goto video @@ -15,6 +15,7 @@ if "%1"=="mouse" goto system if "%1"=="pic8259a" goto system if "%1"=="timer" goto system if "%1"=="drive" goto system +if "%1"=="joystick" goto system if "%1"=="system" goto system if "%1"=="setup" goto setup copy %1.com ..\data\%1.exe>nul @@ -22,10 +23,10 @@ goto end :boot echo Linking file %1... -util\tlink %1.obj /x +..\util\tlink %1.obj /x if errorlevel 1 goto end echo Copying file %1... -util\exe2boot %1.exe +..\util\exe2boot %1.exe copy %1.bin ..\data\%1.bin>nul goto end diff --git a/commande/clean.bat b/commande/clean.bat new file mode 100755 index 0000000..687f4b0 --- /dev/null +++ b/commande/clean.bat @@ -0,0 +1,3 @@ +@echo off +echo nettoyage en cours... +del ..\data\*.* >nul diff --git a/commande/debog.bat b/commande/debog.bat new file mode 100755 index 0000000..aedbb4e --- /dev/null +++ b/commande/debog.bat @@ -0,0 +1,2 @@ +@echo off +..\util\td %1 diff --git a/prompt.asm b/commande/prompt.asm similarity index 94% rename from prompt.asm rename to commande/prompt.asm index c503c29..09a3c83 100755 --- a/prompt.asm +++ b/commande/prompt.asm @@ -12,6 +12,8 @@ start: int 47h mov ah,6 int 47h + mov ah,42 + int 47h mov ah,13 mov si,offset msg int 47h @@ -182,7 +184,7 @@ Code_Version: int 47h ret -Version_Text db 'Cos 2000 version 1.1.1B by Nico',0 +Version_Text db 'Cos 2000 version 2.0.1B by Nico',0 Code_Cls: mov ah,2 diff --git a/setup.asm b/commande/setup.asm similarity index 91% rename from setup.asm rename to commande/setup.asm index b44f3d0..8bc1bb8 100755 --- a/setup.asm +++ b/commande/setup.asm @@ -70,6 +70,7 @@ int 21h jc error mov dx,offset boot call addfile +jc error mov ax,0F0FFh mov cx,14 mov di,offset fat @@ -112,6 +113,9 @@ mov si,offset dta+30 mov cl,13 call uppercasemem mov dx,si +cmp dword ptr [si],'toob' +clc +je allfilesend int 21h jc error call addfile @@ -127,6 +131,7 @@ mov al,0 mov cl,13 cld rep stosb +allfilesend: mov ah,4fh int 21h jnc allfile @@ -223,12 +228,16 @@ end1: mov ah,3eh mov bx,cs:temp int 21h +errorend: pop es ds bp di si dx bx ax ret entrie dw 0 error2: +mov ah,3eh +mov bx,cs:temp +int 21h stc -jmp end1 +jmp errorend temp dw 0 makefit: @@ -236,6 +245,7 @@ push bx cx si di bp mov ax,cx mov bx,offset fat mov cx,13 +retry: call readsector jc error3 xor si,si @@ -245,7 +255,8 @@ je finishfit add si,32 cmp si,512 jb findfit -jmp error3 +inc cx +jmp retry finishfit: mov di,si add di,bx @@ -253,7 +264,6 @@ mov si,dx call asciiztofit jc error3 mov [di+26],ax -mov cx,13 call writesector jc error3 end3: diff --git a/str0.asm b/commande/str0.asm similarity index 100% rename from str0.asm rename to commande/str0.asm diff --git a/write.bat b/commande/write.bat similarity index 100% rename from write.bat rename to commande/write.bat diff --git a/debog.bat b/debog.bat deleted file mode 100755 index 3530e81..0000000 --- a/debog.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -util\td %1 diff --git a/noyau/asm.bat b/noyau/asm.bat new file mode 100755 index 0000000..0f3cfb8 --- /dev/null +++ b/noyau/asm.bat @@ -0,0 +1,55 @@ +@echo off + +echo Assembling file %1... +..\util\tasm %1.asm /m5/x/t +if errorlevel 1 goto end +if "%1"=="boot" goto boot +echo Linking file %1... +..\util\tlink %1.obj /x/t +if errorlevel 1 goto end +echo Copying file %1... +if "%1"=="video" goto video +if "%1"=="lpt" goto system +if "%1"=="keyboard" goto system +if "%1"=="mouse" goto system +if "%1"=="pic8259a" goto system +if "%1"=="timer" goto system +if "%1"=="drive" goto system +if "%1"=="joystick" goto system +if "%1"=="system" goto system +if "%1"=="setup" goto setup +if "%1"=="hours" goto system +copy %1.com ..\data\%1.exe>nul +goto end + +:boot +echo Linking file %1... +..\util\tlink %1.obj /x +if errorlevel 1 goto end +echo Copying file %1... +..\util\exe2boot %1.exe +copy %1.bin ..\data\%1.bin>nul +goto end + +:video +type thin8x8.fnt>>%1.com +:system +copy %1.com ..\data\%1.sys>nul +goto end +:setup +copy %1.com ..\%1.com>nul +goto end + +:end +if not exist *.bin goto exes +del *.bin +:exes +if not exist *.exe goto coms +del *.exe +:coms +if not exist *.com goto objs +del *.com +:objs +if not exist *.obj goto nobjs +del *.obj +:nobjs diff --git a/asmsys.bat b/noyau/asmsys.bat similarity index 76% rename from asmsys.bat rename to noyau/asmsys.bat index e18c01e..9bb00a9 100755 --- a/asmsys.bat +++ b/noyau/asmsys.bat @@ -7,3 +7,5 @@ call asm pic8259a call asm timer call asm drive call asm mouse +call asm joystick +call asm boot \ No newline at end of file diff --git a/boot.asm b/noyau/boot.asm similarity index 100% rename from boot.asm rename to noyau/boot.asm diff --git a/noyau/clean.bat b/noyau/clean.bat new file mode 100755 index 0000000..687f4b0 --- /dev/null +++ b/noyau/clean.bat @@ -0,0 +1,3 @@ +@echo off +echo nettoyage en cours... +del ..\data\*.* >nul diff --git a/noyau/debog.bat b/noyau/debog.bat new file mode 100755 index 0000000..aedbb4e --- /dev/null +++ b/noyau/debog.bat @@ -0,0 +1,2 @@ +@echo off +..\util\td %1 diff --git a/drive.asm b/noyau/drive.asm similarity index 92% rename from drive.asm rename to noyau/drive.asm index 39204df..798fb8e 100755 --- a/drive.asm +++ b/noyau/drive.asm @@ -241,6 +241,7 @@ call searchfile jc errorloadfile mov bx,di call loadfatway +jc errorloadfile mov cx,dx errorloadfile: pop bx @@ -248,7 +249,7 @@ ret ;Recherche le fichier et retourne sont path et en cx sont debut Searchfile: -push bx dx si di ds es +push ax bx dx si di ds es push cs pop es xor dx,dx @@ -290,7 +291,7 @@ jmp goodboot errorboot: stc goodboot: -pop es ds di si dx bx +pop es ds di si dx bx ax ret ;->name ds:si ->es:di diff --git a/noyau/hours.asm b/noyau/hours.asm new file mode 100755 index 0000000..b3daa5e --- /dev/null +++ b/noyau/hours.asm @@ -0,0 +1,81 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: + +jmp tsr +offsets dd 0 +db 'HOURS' +tsr: + pushf + db 2eh,0ffh,1eh + dw offsets + cli + pusha + push ds es + push cs + push cs + pop ds + pop es + mov ah,22h + mov di,offset infos + int 47h + mov bl,[infos+1] + xor bh,bh + sub bl,8 + mov di,bx + shl di,1 + mov dx,71h + xor eax,eax + mov cx,0B800h + mov es,cx + mov cl,4 + mov bp,8 +show: + dec dx + mov al,cl + out dx,al + inc dx + in al,dx + call showbcd + cmp cl,0 + je finic + mov byte ptr es:[di],':' + add di,2 + sub cl,2 + jmp show +finic: + pop es ds + popa + sti + iret + + +;==============================Affiche le nombre nb hexa en EDX============== +Showbcd: + push ax bx cx edx + mov edx,eax + mov cx,bp + sub cx,32 + neg cx + shl edx,cl + mov ax,bp + shr ax,2 +bcdaize: + rol edx,4 + mov bx,dx + and bx,0fh + add bl,'0' + mov es:[di],bl + add di,2 + dec al + jnz bcdaize + pop edx cx bx ax + ret +infos db 40 dup (0) + +end start diff --git a/noyau/joystick.asm b/noyau/joystick.asm new file mode 100755 index 0000000..9d96bd2 --- /dev/null +++ b/noyau/joystick.asm @@ -0,0 +1,298 @@ +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +drv db 'JOYSTICK',0 +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +cmp byte ptr cs:isact,1 +je nottest +mov cs:isact,1 +jmp react +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +mov cs:isact,0 +sti +iret +nottest: +pop bx +jmp endofint +current dw 0 +tables dw 0;detectjoystick + ;dw getjoystick + ;dw getjoystickscreen + ;dw configjoystick +isact db 0 + +;envoie en bx,cx les coordonn‚es et en dl les boutons +getjoystick: +push ax cx +mov bx,cs:rx +mov cx,cs:ry +mov al,cs:button +not al +mov cl,4 +shr al,cl +mov dl,al +pop cx ax +ret + +;envoie en di les coordonn‚es ecran et en dl les boutons +getjoystickscreen: +push ax cx +mov di,cs:xy +mov al,cs:button +not al +mov cl,4 +shr al,cl +mov dl,al +pop cx ax +ret +db 'button' +Button db 0 +db 'rx' +rx dw 0 +db 'ry' +ry dw 0 +db 'vx' +VX db 0 +db 'vy' +VY db 0 +db 'x' +X dw 7FFFh +db 'y' +Y dw 7FFFh +speed db 6 +spherex db 0 +spherey db 0 +db 'count' +count db 0 +db 'error' +error db 0 +xy dw 0 +old db 0 + +calibrate db 0 +db 'ticks' +ticks dw 0 +db 'state' +state db 0 +db 'connard' +connard db 1 +connard2 db 1 +;Gestionnaire de joystick +react: + push ax bx cx dx si di bp ds es + push cs + pop ds + mov dx,201h + cmp error, 1 + je gest1 + cmp count,1 + je gest1 + cmp count,2 + je gest2 +gest1: + mov error,0 + mov count,2 + call getticks + mov ticks,ax + out dx,al + in al,dx + and al,00000011b + mov state,al + jmp endgest +gest2: +not connard + call getticks + sub ax,ticks + cmp ax,1FF0h + jb nofinish + mov error,1 + jmp endgest +nofinish: + mov bx,ax + in al,dx + and al,00000011b + cmp state,al + je endgest + xchg state,al + xor al,state + mov cl,4 + or bx,bx + js noadj + shr bx,cl +noadj: + test al,1 + je isy + mov VX,bl + jmp wasx +isy: + test al,2 + je endgest + mov VY,bl +wasx: +mov connard2,0fh + mov count,1 +endgest: + in al,dx + not al + mov cl,4 + shr al,cl + mov button,al + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov cl,speed + movsx bx,VY + shl bx,cl + cmp spherey,0 + jne nolimity + xor ah,ah + mov al,[di] + cmp byte ptr [di+7],4 + jbe text4 + shl ax,3 +text4: + dec ax + cmp bx,0 + jg decy + cmp ry,ax + jae noaddy + jmp nolimity +decy: + cmp ry,0 + je noaddy +nolimity: + sub y,bx +noaddy: + movsx bx,VX + shl bx,cl + cmp spherex,0 + jne nolimitx + xor ah,ah + mov al,[di+1] + cmp byte ptr [di+7],4 + jbe text5 + shl ax,3 +text5: + dec ax + cmp bx,0 + jl decx + cmp rx,ax + jae noaddx + jmp nolimitx +decx: + cmp rx,0 + je noaddx +nolimitx: + add x,bx +noaddx: + mov ax,x + mov bx,0FFFFh + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text1 + shl cx,3 +text1: + mul cx + div bx + mov rx,ax + mov ax,y + xor ch,ch + mov cl,[di] + cmp byte ptr [di+7],4 + jbe text2 + shl cx,3 +text2: + mul cx + div bx + mov ry,ax + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text3 + shl cx,3 +text3: + mul cx + add ax,rx + cmp byte ptr [di+7],4 + mov di,ax + jbe textpoint + mov ax,0A000h + mov es,ax + jmp graphpoint +textpoint: + mov ax,0B800h + mov es,ax + shl di,1 + inc di +graphpoint: + mov bx,xy + cmp byte ptr es:[bx],070h + jne waschanged + mov al,old + mov byte ptr es:[bx],al +waschanged: + mov xy,di + mov al,es:[di] + mov old,al + mov byte ptr es:[di],070h + mov al, 20h + out 0a0h, al + out 20h, al +errormouse: + pop es ds bp di si dx cx bx ax + mov cs:isact,0 + pop bx + iret + infos db 40 dup (0) + + +getticks: +mov al,0 +out 43h,al +jmp wait1 +wait1: +in al,40h +mov ah,al +jmp wait2 +wait2: +in al,40h +xchg ah,al +ret + +end start diff --git a/keyboard.asm b/noyau/keyboard.asm similarity index 90% rename from keyboard.asm rename to noyau/keyboard.asm index 2c959d5..636fb52 100755 --- a/keyboard.asm +++ b/noyau/keyboard.asm @@ -33,7 +33,7 @@ tsr: sti iret isstate db 0 - infos db 10 dup (0) + infos db 40 dup (0) F11: push ax di es @@ -42,9 +42,13 @@ F11: mov di,offset infos mov ah,34 int 47h - mov al,cs:infos+7 + mov al,cs:[di+7] inc al - and ax,111b + cmp al,9 + jbe notabove + mov al,0 +notabove: + mov ah,0 int 47h pop es di ax jmp endof diff --git a/lpt.asm b/noyau/lpt.asm similarity index 100% rename from lpt.asm rename to noyau/lpt.asm diff --git a/mouse.asm b/noyau/mouse.asm similarity index 81% rename from mouse.asm rename to noyau/mouse.asm index 67ad649..b2e8a19 100755 --- a/mouse.asm +++ b/noyau/mouse.asm @@ -146,7 +146,6 @@ ret ;envoie en di les coordonn‚es ecran et en dl les boutons getmousescreen: mov di,cs:xy -mov cx,cs:ry mov dl,cs:button sub dl,8 and dl,0Fh @@ -166,15 +165,15 @@ rx dw 0 ry dw 0 VX db 0 VY db 0 -X dw 0 -Y dw 0 +X dw 7FFFh +Y dw 7FFFh speed db 6 spherex db 0 spherey db 0 count db 0 error db 0 xy dw 0 -old dw 0 +old db 0 ;Gestionnaire de souris PS/2 react: push ax bx cx dx di ds es @@ -224,8 +223,12 @@ endgest: shl bx,cl cmp spherey,0 jne nolimity - mov al,[di] xor ah,ah + mov al,[di] + cmp byte ptr [di+7],4 + jbe text4 + shl ax,3 +text4: dec ax cmp bx,0 jg decy @@ -242,8 +245,12 @@ noaddy: shl bx,cl cmp spherex,0 jne nolimitx + xor ah,ah mov al,[di+1] - xor ah,ah + cmp byte ptr [di+7],4 + jbe text5 + shl ax,3 +text5: dec ax cmp bx,0 jl decx @@ -260,27 +267,53 @@ noaddx: mov bx,0FFFFh xor ch,ch mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text1 + shl cx,3 +text1: mul cx div bx mov rx,ax mov ax,y + xor ch,ch mov cl,[di] + cmp byte ptr [di+7],4 + jbe text2 + shl cx,3 +text2: mul cx div bx mov ry,ax - mul byte ptr [di+1] + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text3 + shl cx,3 +text3: + mul cx add ax,rx - shl ax,1 + cmp byte ptr [di+7],4 mov di,ax + jbe textpoint + mov ax,0A000h + mov es,ax + jmp graphpoint +textpoint: mov ax,0B800h mov es,ax + shl di,1 + inc di +graphpoint: mov bx,xy - mov ax,old - mov word ptr es:[bx],ax + cmp byte ptr es:[bx],070h + jne waschanged + mov al,old + mov byte ptr es:[bx],al +waschanged: mov xy,di - mov ax,es:[di] - mov old,ax - mov word ptr es:[di],0FF70h + mov al,es:[di] + mov old,al + mov byte ptr es:[di],070h mov al, 20h out 0a0h, al out 20h, al @@ -289,6 +322,6 @@ errormouse: mov cs:isact,0 pop bx iret - infos db 10 dup (0) + infos db 40 dup (0) end start diff --git a/thin8x8.fnt b/noyau/old8x8.fnt similarity index 100% rename from thin8x8.fnt rename to noyau/old8x8.fnt diff --git a/pic8259a.asm b/noyau/pic8259a.asm similarity index 92% rename from pic8259a.asm rename to noyau/pic8259a.asm index a8e5474..7fcf64c 100755 --- a/pic8259a.asm +++ b/noyau/pic8259a.asm @@ -177,29 +177,33 @@ ret ;remplace le handler pointer par ds:si en bx:100h interruption ax replacehandler: -push ax bx si di ds es +push ax bx cx si di ds es mov es,bx mov di,0100h mov ah,4 int 48h +jc reph mov bx,ax call getint mov es:[102h],si mov es:[104h],ds call setint -pop es ds di si bx ax +reph: +pop es ds di si cx bx ax ret ;install le handler pointer par ds:si en bx:100h interruption ax installhandler: -push bx di es +push bx cx di es mov es,bx mov di,100h mov ah,4 int 48h +jc inh mov bx,ax call setint -pop es di bx +inh: +pop es di cx bx ret ;met es:di le handle de l'int al diff --git a/system.asm b/noyau/system.asm similarity index 81% rename from system.asm rename to noyau/system.asm index 48f9285..9680cde 100755 --- a/system.asm +++ b/noyau/system.asm @@ -10,22 +10,27 @@ mov si,offset video mov bx,400h mov ax,47h call installhandler +jc erroron mov si,offset timer mov bx,900h mov ax,8h call replacehandler +jc erroron mov si,offset pic mov bx,950h mov ax,50h call installhandler +jc erroron mov si,offset drive mov bx,1020h mov ax,48h call installhandler +jc erroron mov si,offset keyboard mov bx,1400h mov ax,9h call replacehandler +jc erroron mov ax,40h mov es,ax mov dx,es:[8] @@ -38,6 +43,7 @@ mov si,offset lpt mov bx,1500h mov ax,0Fh call installhandler +jc erroron mov es,bx sub al,8 xor ah,ah @@ -58,6 +64,7 @@ mov si,offset lpt mov bx,1700h mov ax,0Dh call installhandler +jc erroron sub al,8 xor ah,ah int 50h @@ -68,19 +75,19 @@ mov si,offset mouse mov bx,1900h mov ax,74h call installhandler +jc erroron mov ax,0012 int 50h -;mov ah, 00010000b -;not ah -;in al, 0a1h -;and al, ah -;out 0a1h, al mov ah,2 int 74h - - - - +;mov si,offset joystick +;mov bx,2700h +;mov ax,08h +;call replacehandler +mov si,offset hours +mov bx,2900h +mov ax,08h +call replacehandler start2: push cs @@ -231,65 +238,6 @@ executefatway: push 7202h popf db 0CBh - -;cx entr‚e -> fatway chemin -getfatway: -push bx cx es -mov bx,offset fatway -fatagain: -mov cs:[bx],cx -add bx,2 -cmp cx,0FFF0h -jae finishload -call getfat -jnc fatagain -finishload: -pop es cx bx -ret - -loadfatway: -push ax bx cx di -call getfatway -jc endload -mov di,offset fatway -mov si,offset dot -mov ah,13 -loadagain: -mov cx,cs:[di] -cmp cx,0FFF0h -jae endload -add di,2 -call readsector -jc endload -int 47h -add bx,cs:sizec -jmp loadagain -endload: -pop di cx bx ax -ret - -sizec dw 512 -reserv dw 1 - -;<-cx nøsecteur ->cx code FAT -getfat: -push es ax bx dx -mov ax,cx -xor dx,dx -div cs:sizec -mov cx,ax -add cx,cs:reserv -mov bx,offset buffer -push cs -pop es -call readsector -jc errorgetfat -shl dx,1 -add bx,dx -mov cx,cs:[bx] -errorgetfat: -pop dx bx ax es -ret ;selectionne la ligne xx Select: @@ -318,7 +266,70 @@ msg3 db ' Cos will restart your computer, eject the floppy disk and press a key' prompt db '>',0 spaces db ' ',0 dot db '.',0 + +;cx entr‚e -> fatway chemin +getfatway: +push bx cx +mov bx,offset fatway +fatagain: +mov cs:[bx],cx +add bx,2 +cmp cx,0FFF0h +jae finishload +call getfat +jnc fatagain +finishload: +pop cx bx +ret +;Charge le fichier de chemin cx -> taille dx +loadfatway: +push ax bx cx di +call getfatway +jc endload +mov di,offset fatway +mov si,offset dot +mov ah,13 +xor dx,dx +loadagain: +mov cx,cs:[di] +cmp cx,0FFF0h +jae endload +add di,2 +call readsector +jc endload +add bx,cs:sizec +add dx,cs:sizec +jmp loadagain +endload: +pop di cx bx ax +ret + + +sizec dw 512 +reserv dw 1 + +;<-cx nøsecteur ->cx code FAT +getfat: +push es ax bx dx +push cs +pop ds +push cs +pop es +mov ax,cx +xor dx,dx +div sizec +mov cx,ax +add cx,reserv +mov bx,offset buffer +call readsector +jc errorgetfat +shl dx,1 +add bx,dx +mov cx,[bx] +errorgetfat: +pop dx bx ax es +ret ReadSector: push ax cx dx si @@ -396,38 +407,45 @@ Lastread dw 0FFFFh ;remplace le handler pointer par ds:si en bx:100h interruption ax replacehandler: -push ax bx si di ds es +push ax bx cx si di ds es mov es,bx mov di,0100h call loadfile +jc reph mov bx,ax call getint mov es:[102h],si mov es:[104h],ds call setint -pop es ds di si bx ax +reph: +pop es ds di si cx bx ax ret ;install le handler pointer par ds:si en bx:100h interruption ax installhandler: -push bx di es +push bx cx di es mov es,bx mov di,100h call loadfile +jc insh mov bx,ax call setint -pop es di bx +insh: +pop es di cx bx ret - -;Charge le fichier Ds:si en es:di +;Charge le fichier Ds:si en es:di taille-> cx loadfile: -push bx cx +push bx call searchfile +jc errorloadfile mov bx,di call loadfatway -pop cx bx -ret +jc errorloadfile +mov cx,dx +errorloadfile: +pop bx +ret ;met es:di le handle de l'int bx setint: @@ -453,17 +471,19 @@ mov ds,es:[bx+2] pop es bx ax ret -;Recherchele fichier et retourne sont path et en cx sont debut +;Recherche le fichier et retourne sont path et en cx sont debut Searchfile: -push bx dx si di ds es -xor dx,dx +push ax bx dx si di ds es push cs pop es +xor dx,dx mov di,offset temp -mov bx,offset buffer call asciiztofit +push cs +pop ds mov cx,13 check: +mov bx,offset buffer call readsector jc errorboot xor di,di @@ -475,6 +495,7 @@ mov si,di add si,bx mov di,offset temp mov cx,12+4 +cld rep cmpsb pop cx di si je oksystem @@ -488,8 +509,12 @@ inc cx jmp Check oksystem: mov cx,[di+BX+26] +cld +jmp goodboot errorboot: -pop es ds di si dx bx +stc +goodboot: +pop es ds di si dx bx ax ret ;->name ds:si ->es:di @@ -565,9 +590,9 @@ inc di cmp byte ptr cs:[di],0 jne isexcept endanal: -pop di +clc +pop di ret -exeptchar db '/\<>:|.',01,0,0 nogood: stc jmp endanal @@ -594,11 +619,43 @@ clc pop ax cx di si ret +erroron: +push cs +pop ds +xor edx,edx +mov dx,ax +mov ax,0001h +int 47h +mov ah,6 +int 47h +mov ah,6 +int 47h +mov ah,13 +mov si,offset errormsg +int 47h +mov ah,10 +mov cx,16 +int 47h +mov ah,6 +int 47h +mov ah,6 +int 47h +mov ah,13 +mov si,offset errormsg2 +int 47h +mov ax,0 +int 16h +push 0FFFFh +push 0 +db 0CBh + +errormsg db 'Error with drivers loading on interrupt nø',0 +errormsg2 db 'Press a key to restart...',0 namesize equ 12 -extsize equ 5 - - +extsize equ 5 nbfit equ 255 +hours db 'hours.sys',0 +joystick db 'joystick.sys',0 mouse db 'mouse.sys',0 pic db 'pic8259a.sys',0 drive db 'drive.sys',0 @@ -607,7 +664,7 @@ lpt db 'lpt.sys',0 video db 'video.sys',0 keyboard db 'keyboard.sys',0 temp db 12+5+1 dup (0) - +exeptchar db '/\<>:|.',01,0,0 DiskSectorsPerTrack dw 18 DiskTracksPerHead dw 80 DiskHeads dw 2 @@ -615,4 +672,5 @@ DiskHeads dw 2 fatway equ $ buffer equ $+3000 + end start diff --git a/noyau/thin8x8.fnt b/noyau/thin8x8.fnt new file mode 100755 index 0000000000000000000000000000000000000000..6d72f9c51ae7f8057770f299f5afe26fe72a2162 GIT binary patch literal 2048 zcmZWqziT5$6n?naG>gup8nE#}xGL3PgS?nQ2G?oRq{+q(lOt^5N?DT0*fQZrks_^& zE3R;Je?hJ=EEuL*T#5rbjsih$LU1Lk5VQH-n~kr?TS?!(w{PC>eIiQaCl`~;^NIJ} zO?P$Q`6|Zfigj8qoM7RK7^mw6^UA@v z$<56V8yg!m`U;lJE634#??n%4o#-n?3IrZu6I(O*ntVH_u7BUwa_}hfEg`D}=IK)*hIbNc1+q!%?E32_Zyow5m zGovia5X-FO0?b9qaS{C;r_(9$7WR2SIAb1X@Qw|Ny)E$LWZyR~Tanf)t%sY?Ll_bV zjv;>xq~s6e0x-`LutJkRQ`?>fN*yaTz!(S-GZ4}E7OG5Kh`@8!AkDmPd;7UcdAhSy zk3b2v>QN_zpQiD7;m(pica-a+`}4N1hdV0}fPtI^h63DTU@&jc2Pz$#rM#g2WFu50dkI(Mf<_4PxEdETqQR=+)! zYp|h=dVdW6DIe?%iI4MVKdQHndU30{Xw#)Qfo-4&`k*P~!^&BWXeptlv z@vX~z@Tf=fKOFAreO97Y)K!$*;mtgS%W^9xq}moac8kv zVIBfD9-~$XQE_-T*tfiC44H$3mJ&j!mJ$aM$KCbBBEE%4lF AH=42 +;<- +;===================================================== + EnableScroll: + mov cs:scrolling,1 + ret + +;=============DISABLESCROLLING (Fonction 2Bh)========= +;D‚sactive le d‚filement +;-> AH=43 +;<- +;==============================================x======= +DisableScroll: + mov cs:scrolling,0 + ret + +;=============SetVideoMode (Fonction 00h)========= +;Fixe le mode vidéo courant a AL +;-> AH=0, AL mode d'écran +;<- Carry if error +;================================================= +setvideomode: + push ax cx dx di + cmp al,maxmode + ja errorsetvideomode + cmp cs:mode,0FFh + jne noinit + call initvideo +noinit: + mov cs:mode,al + xor ah,ah + mov di,ax + shl di,6 + add di,offset mode0 + mov dx,misc + mov al,cs:[di] + out dx,al + inc di + mov dx,statut + mov al,cs:[di] + out dx,al + inc di + mov dx,sequencer + xor ax,ax +initsequencer: + mov ah,cs:[di] + out dx,ax + inc al + inc di + cmp al,4 + jbe initsequencer + mov ax,0E11h + mov dx,ccrt + out dx,ax + xor ax,ax +initcrt: + mov ah,cs:[di] + out dx,ax + inc al + inc di + cmp al,24 + jbe initcrt + mov dx,graphics + xor ax,ax +initgraphic: + mov ah,cs:[di] + out dx,ax + inc al + inc di + cmp al,8 + jbe initgraphic + mov dx,statut + in al,dx + mov dx,attribs + xor ax,ax +initattribs: + mov ah,cs:[di] + push ax + in ax,dx + pop ax + out dx,al + xchg ah,al + out dx,al + xchg ah,al + inc al + inc di + cmp al,20 + jbe initattribs + mov al,20h + out dx,al + mov al,cs:[di] + mov cs:columns,al + mov ah,cs:[di+1] + mov cs:lines,ah + mul ah + shl ax,1 + cmp cs:mode,5 + setae cs:graphics + jb istext + shl ax,3 +istext: + mov cs:pagesize,ax + mov ax,planesize + xor dx,dx + div cs:pagesize + mov cs:nbpage,al + mov al,cs:[di-36] + xor ah,ah + shl ax,2 + mov cl,cs:graphics + shr ax,cl + mov cs:linesize,ax + mov ax,cs:[di-43] + mov cs:adress,ax + mov cs:base,ax + mov cs:pages,0 + pop di dx cx ax + ret +errorsetvideomode: + pop di dx cx ax + ret + +initvideo: + push bx cx si ds +;xor bx,bx +;mov ds,bx +;lds si,ds:[43h*4] + push cs + pop ds + mov si,offset font8x8 + mov cl,8 + mov bl,1 + call loadfont + mov cs:pagesize,64000 + call clearscreen + pop ds si cx bx + ret + +;=============GetVideoMode (Fonction 01h)========= +;Renvoie le mode vidéo courant dans AL +;-> AH=1 +;<- AL mode d'écran +;================================================= +getvideomode: + mov al,cs:mode + ret + +;=============CLEARSCREEN (Fonction 02h)========= +;Efface l'ecran graphique ou texte +;-> AH=2 +;<- +;================================================ +clearscreen: + push eax cx dx di es + mov cx,cs:pagesize + mov di,cs:adress + shr cx,2 + cmp byte ptr cs:graphics,1 + jne erasetext + mov ax,0A000h + mov es,ax +erasegraph: + mov ah,0 +gogot: + push ax cx + mov cl,ah + mov ah,1 + shl ah,cl + mov al,2 + mov dx,sequencer + out dx,ax + pop cx ax + push si di cx eax + mov eax,00000000h + rep stosd + pop eax cx di si + inc ah + cmp ah,3 + jbe gogot + jmp enderase +erasetext: + mov ax,0B800h + mov es,ax + mov eax,07200720h + cld + rep stosd +enderase: + mov cs:x,0 + mov cs:y,0 + mov cs:xg,0 + mov cs:yg,0 + mov cs:xy,0 + mov cs:xyg,0 + mov cs:plane,0 + pop es di dx cx eax + ret + + +;=============SetFont (Fonction 03h)========= +;Active la font cl parmi les 8 +;-> AH=3, CL n° font +;<- Carry if error +;============================================ +setfont: + push ax cx dx + cmp cl,7 + ja errorsetfont + mov cs:font,cl + mov ah,cl + and cl,11b + and ah,0100b + shl ah,2 + add ah,cl + mov dx,sequencer + mov al,3 + out dx,ax + pop dx cx ax + ret +errorsetfont: + pop dx cx ax + ret + +;=============GetFont (Fonction 0xh)========= +;Récupère le n° de la font active +;-> AH=x +;<- CL n° font, Carry if error +;============================================ +Getfont: + push ax cx dx + cmp cl,7 + ja errorgetfont + mov cs:font,cl + mov ah,cl + and cl,11b + and ah,0100b + shl ah,2 + add ah,cl + mov dx,sequencer + mov al,3 + out dx,ax + pop dx cx ax + ret +errorgetfont: + stc + pop dx cx ax + ret + +;=============LoadFont (Fonction 04h)========== +;Charge une police pointée par ds:si dans la carte vidéo sous n°font BL, taille police dans CL +;-> AH=4, BL n°font, DS:SI pointeur vers Font, CL taille police +;<- Carry if error +;=========================================== +loadfont: + push ax bx cx dx si di es + cmp bl,7 + ja errorloadfont + xor di,di + cli + mov dx,sequencer +doseq: + mov ax,cs:[di+offset reg1] + out dx,ax + inc di + inc di + cmp di,6 + jbe doseq + mov dx,graphics +doseq2: + mov ax,cs:[di+offset reg1] + out dx,ax + inc di + inc di + cmp di,6+6 + jbe doseq2 + sti + mov ax,0A000h + mov es,ax + mov dx,256 + mov al,0 + xor bh,bh + cmp bl,4 + jb isless + sub bl,4 + shl bl,1 + inc bl + jmp okmake +isless: + shl bl,1 +okmake: + mov di,bx + shl di,13 + mov bh,cl + mov bl,cl + sub bl,32 + neg bl + xor cx,cx + cld +popz: + mov cl,bh + rep movsb + mov cl,bl + rep stosb + dec dx + jnz popz + xor di,di + mov dx,sequencer +doseqs: + mov ax,cs:[di+offset reg2] + out dx,ax + inc di + inc di + cmp di,6 + jbe doseqs + mov dx,graphics +doseqs2: + mov ax,cs:[di+offset reg2] + out dx,ax + inc di + inc di + cmp di,6+6 + jbe doseqs2 + pop es di si dx cx bx ax + ret +errorloadfont: + stc + pop es di si dx cx bx ax + ret +reg2 dw 0100h, 0302h, 0304h, 0300h + dw 0004h, 1005h, 0E06h +reg1 dw 0100h, 0402h, 0704h, 0300h + dw 0204h, 0005h, 0406h + +;==========SHOWSPACE (Fonction 05h)=========== +;met un espace aprés le curseur +;-> AH=5 +;<- +;============================================= +showspace: + push cx + mov cl,' ' + mov ch,cs:colors + call charout + clc + pop cx + ret + +;==========SHOWLINE (Fonction 06h)=============== +;remet le curseur text a la ligne avec un retour chariot +;-> AH=6 +;<- +;================================================ +showline: + push bx cx + mov bl,cs:y + xor bh,bh + mov cl,cs:lines + sub cl,2 + cmp bl,cl + jne scro + dec bl + mov cx,1 + cmp byte ptr cs:graphics,0 + je okscro + mov cx,8 +okscro: + call scrolldown +scro: + inc bl + call setxy2 + pop cx bx + ret + +;==========SHOWCHAR (Fonction 07h)=========== +;met un caractère de code ASCII DL aprés le curseur +;-> AH=7, DL code ASCII du caractère +;<- +;============================================ +showchar: + push cx + mov cl,dl + mov ch,cs:colors + call charout + pop cx + ret + +;==========SHOWINT (Fonction 08h)=========== +;Affiche un entier EDX aprés le curseur +;-> AH=8, EDX un entier +;<- +;=========================================== +ShowInt: + push eax bx cx edx esi + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint: + xor edx,edx + div esi + add dl,'0' + inc cx + mov cs:[bx],dl + dec bx + cmp ax,0 + jne decint + mov ax,cx + mov ch,cs:colors +showinteger: + inc bx + mov cl,cs:[bx] + call charout + dec ax + jnz showinteger + pop esi edx cx bx eax + ret + +showbuffer db 35 dup (0FFh) + +;==========SHOWSIGNED (Fonction 09h)=========== +;Affiche un entier EDX de taille CX aprés le curseur +;-> AH=9, EDX un entier, CX la taille +;<- +;============================================== +Showsigned: + push ebx edx + mov ebx,edx + xor edx,edx + cmp cx,8 + ja signed16 + mov dl,bl + cmp dl,7Fh + jbe notsigned + neg dl + jmp showminus +signed16: + cmp cx,16 + ja signed32 + mov dx,bx + cmp dx,7FFFh + jbe notsigned + neg dx + jmp showminus +signed32: + mov edx,ebx + cmp edx,7FFFFFFFh + jbe notsigned + neg edx +showminus: + push dx + mov dl,'-' + call showchar + pop dx +notsigned: + call showint + pop edx ebx + ret + +;==========SHOWHEX (Fonction 0Ah)=========== +;Affiche un nombre hexadécimal EDX de taille CX aprés le curseur +;-> AH=10, EDX un entier, CX la taille +;<- +;=========================================== +ShowHex: + push ax bx cx edx + mov ax,cx + shr ax,2 + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors +Hexaize: + rol edx,4 + mov bx,dx + and bx,0fh + mov cl,cs:[bx+offset Tab] + call charout + dec al + jnz Hexaize + pop edx cx bx ax + ret +Tab db '0123456789ABCDEF' + +;==========SHOWBIN (Fonction 0Bh)=========== +;Affiche un nombre binaire EDX de taille CX aprés le curseur +;-> AH=11, EDX un entier, CX la taille +;<- +;=========================================== +Showbin: + push ax cx edx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors +binaize: + rol edx,1 + mov cl,'0' + adc cl,0 + call charout + dec al + jnz binaize + pop edx cx ax + ret + +;==========SHOWBCD (Fonction 0xh)=========== +;Affiche un nombre en BCD EDX de taille CX aprés le curseur +;-> AH=x, EDX un entier, CX la taille +;<- +;=========================================== +ShowBCD: + push ax cx edx + mov ax,cx + shr ax,2 + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors +BCDaize: + rol edx,4 + mov cl,dl + and cl,0fh + add cl,'0' + call charout + dec al + jnz BCDaize + pop edx cx ax + ret + +;==========SHOWSTRING (Fonction 0Ch)=========== +;Affiche une chaine de caractère pointée par DS:SI aprés le curseur +;-> AH=12, DS:SI pointeur chaine type pascal +;<- +;============================================== +showstring: + push bx cx si + mov bl,[si] + mov ch,cs:colors +strinaize: + inc si + mov cl,[si] + call charout + dec bl + jnz strinaize + pop si cx bx + ret + +;==========SHOWSTRING0 (Fonction 0Dh)=========== +;Affiche une chaine de caractère pointée par DS:SI aprés le curseur +;-> AH=13, DS:SI pointeur chaine type zéro terminal +;<- +;=============================================== +showstring0: + push cx si + mov ch,cs:colors +strinaize0: + mov cl,[si] + cmp cl,0 + je no0 + call charout + inc si + jmp strinaize0 +no0: + pop si cx + ret + +;==========SHOWCHARAT (Fonction 0Eh)=========== +;met un caractère de code ASCII DL en (x;y) (BH;BL) +;-> AH=14, DL code ASCII du caractère, BH coordonnées x, BL coordonnées y +;<- +;============================================== +showcharat: + push es di + call setxy + call showchar + pop di es + ret + +;==========SHOWINTAT (Fonction 0Fh)=========== +;Affiche un entier EDX en (x;y) (BH;BL) +;-> AH=15, EDX entier, BH coordonnées x, BL coordonnées y +;<- +;============================================== +showintat: + push es di + call setxy + call showint + pop di es + ret + +;==========SHOWSIGNEDAT (Fonction 10h)=========== +;Affiche un entier EDX de taille CX aprés le curseur en (x;y) (BH;BL) +;-> AH=16, EDX entier, BH coordonnées x, BL coordonnées y +;<- +;============================================== +showsignedat: + push es di + call setxy + call showsigned + pop di es + ret + +;==========SHOWHEXAT (Fonction 11h)=========== +;Affiche un nombre hexadécimal EDX de taille CX en (x;y) (BH;BL) +;-> AH=17, EDX un entier, CX la taille, BH coordonnées x, BL coordonnées y +;<- +;============================================== +showhexat: + push es di + call setxy + call showhex + pop di es + ret + +;==========SHOWBINAT (Fonction 012h)=========== +;Affiche un nombre binaire EDX de taille CX en (x;y) (BH;BL) +;-> AH=18, EDX un entier, CX la taille, BH coordonnées x, BL coordonnées y +;<- +;============================================= +showbinat: + push es di + call setxy + call showbin + pop di es + ret + +;==========SHOWSTRINGAT (Fonction 13h)=========== +;Affiche une chaine de caractère pointée par DS:SI en (x;y) (BH;BL) +;-> AH=19, DS:SI pointeur chaine type pascal, BH coordonnées x, BL coordonnées y +;<- +;================================================ +showstringat: + push es di + call setxy + call showstring + pop di es + ret + +;==========SHOWSTRING0AT (Fonction 14h)=========== +;Affiche une chaine de caractère pointée par DS:SI en (x;y) (BH;BL) +;-> AH=20, DS:SI pointeur chaine type zéro terminal, BH coordonnées x, BL coordonnées y +;<- +;================================================= +showstring0at: + push es di + call setxy + call showstring0 + pop di es + ret + +;==========SETCOLOR (Fonction 15h)========= +;Change les attributs du texte a CL +;-> AH=21 ,CL couleur +;<- +;========================================= +setcolor: + mov cs:colors,CL + ret + +;==========GETCOLOR (Fonction 16h)========= +;Récupère les attributs du texte dans CL +;-> AH=22 +;<- CL couleur +;========================================= +getcolor: + mov cl,cs:colors + ret + +;==========SETSTYLE (Fonction xh)========= +;Change le style du texte a CL +;-> AH=x ,CX style +;<- +;========================================= +setstyle: + mov cs:style,CX + ret + +;==========GETSTYLE (Fonction xh)========= +;Récupère le style du texte dans CL +;-> AH=x +;<- CX style +;========================================= +getstyle: + mov cx,cs:style + ret + +;==========SCROLLDOWN (Fonction 17h)========= +;defile de cx lines vers le bas +;-> AH=23, CX lines à défiler vers le bas +;<- +;============================= +scrolldown: + push ax cx dx si di ds es + cmp cs:scrolling,0 + je graphp + mov ax,cx + mul cs:linesize + mov si,ax + mov cx,cs:pagesize + sub cx,si + mov di,cs:adress + cld + cmp byte ptr cs:graphics,1 + jne textp + mov ax,0A000h + mov es,ax + mov ds,ax + shr cx,2 +transfert: + mov ah,0 +gogo: + push ax cx + mov cl,ah + mov ah,1 + shl ah,cl + mov al,2 + mov dx,sequencer + out dx,ax + pop cx ax + mov al,4 + mov dx,graphics + out dx,ax + push si di cx + rep movsd + pop cx di si + inc ah + cmp ah,3 + jbe gogo + jmp graphp +textp: + mov ax,0B800h + mov es,ax + mov ds,ax + rep movsb +graphp: + pop es ds di si dx cx ax + ret + +;==========GETXY (Fonction 18h)========= +;Change les coordonnées du curseur a X:BH,Y:BL +;-> AH=24 +;<- BH coordonnées x, BL coordonnées y +;============================= +getxy: + mov bh,cs:x + mov bl,cs:y + ret + +;==========SETXY (Fonction 19h)========= +;Change les coordonnées du curseur a X:BH,Y:BL +;-> AH=25, BH coordonnées x, BL coordonnées y +;<- +;===================================== +setxy: + push ax bx cx dx + mov cs:x,bh + mov cs:y,bl + mov al,bl + mov bl,bh + xor bh,bh + mov di,cs:adress + add di,bx + mul cs:columns + add di,ax + shl di,1 + mov cs:xy,di + cmp byte ptr cs:graphics,1 + jne oktext + mov bl,cs:x + mov cl,cs:y + xor bh,bh + xor ch,ch + shl bx,3 + shl cx,3 + call setxyg + jmp endofsetxy +oktext: + mov ax,0B800h + mov es,ax +endofsetxy: + pop dx cx bx ax + ret + +setxy2: + push es di + call setxy + pop di es + ret + +;==========SETXYG (Fonction 0xh)========= +;Change les coordonnées du curseur graphique a X:BX,Y:CX +;-> AH=x, BX coordonnées x, CX coordonnées y +;<- ES:DI pointeur sur pixel avec plan de bit ajusté +;====================================== +setxyg: + push ax bx cx dx + mov cs:xg,bx + mov cs:yg,cx + mov ax,cx + mov cl,bl + mul cs:linesize + shr bx,2 + add ax,bx + mov di,ax + and cl,3 + mov ah,1 + shl ah,cl + mov al,2 + mov dx, 3c4h + out dx,ax + mov cs:plane,cl + mov cs:xyg,di + mov ax,0A000h + mov es,ax + pop dx cx bx ax + ret + +;==========SHOWPIXEL (Fonction 0xh)========= +;Affiche un pixel de couleur AL en X:BX,Y:CX +;-> AH=x, BX coordonnées x, CX coordonnées y, AL couleur +;<- +;========================================= +showpixel: + push ax bx cx dx di bp es + mov bp,ax + mov ax,cx + mov cl,bl + mul cs:linesize + shr bx,2 + add ax,bx + mov di,ax + add di,cs:adress + and cl,3 + mov ah,1 + shl ah,cl + mov al,2 + mov dx,sequencer + out dx,ax + mov bx,0A000h + mov es,bx + mov ax,bp + mov es:[di],al + pop es bp di dx cx bx ax + ret + +;==========SHOWPIXEL (Fonction 0xh)========= +;Récupère en al la couleur du pixel de coordonnées X:BX,Y:CX +;-> AH=x, BX coordonnées x, CX coordonnées y, AL couleur +;<- +;========================================= +getpixel: + push ax bx cx dx di bp es + mov bp,ax + mov ax,cx + mov cl,bl + mul cs:linesize + shr bx,2 + add ax,bx + mov di,ax + add di,cs:adress + and cl,3 + mov ah,cl + mov al,4 + mov dx,graphics + out dx,ax + mov bx,0A000h + mov es,bx + mov ax,bp + + mov al,es:[di] + pop es bp di dx cx bx ax + ret + +;==========LOADBMPPALET (Fonction 0xh)========= +;Charge la palette du BMP pointée par DS:SI +;-> AH=x, DS:SI BMP +;<- +;============================================= +loadbmppalet: + push ax bx cx dx + mov bx,0400h+36h-4 + mov cx,100h + mov dx, 3c8h +paletteload: + mov al, cl + dec al + out dx, al + inc dx + mov al,[bx+si+2] + shr al,2 + out dx, al + mov al,[bx+si+1] + shr al,2 + out dx, al + mov al,[bx+si] + shr al,2 + out dx, al + sub bx,4 + dec dx + dec cl + jnz paletteload + pop dx cx bx ax + ret + +;==========VIEWBMP (Fonction 0xh)========= +;Affiche le BMP pointée par DS:SI en X:BX, Y:CX avec la préparation de la palette +;<- AH=x, DS:SI BMP, BX coordonnées X, CX coordonnées Y +;-> +;========================================= +viewbmp: + call loadbmppalet + call showbmp + ret + +;==========SHOWBMP (Fonction 0xh)========= +;Affiche le BMP pointée par DS:SI en X:BX, Y:CX +;<- AH=x, DS:SI BMP, BX coordonnées X, CX coordonnées Y +;-> +;========================================= +showbmp: + push ax bx cx dx + mov cs:xc,bx + mov cs:yc,cx + xor cx,cx + xor bx,bx + xor dx,dx +bouclette: + mov al,[si+bx+436h] + push bx cx + sub cx,cs:yc + neg cx + mov bx,dx + add bx,cs:xc + call showpixel + pop cx bx + inc bx + inc dx + cmp dx,[si+offset BMP_width] + jb bouclette + xor dx,dx + inc cx + cmp cx,[si+offset BMP_height] + jb bouclette + pop dx cx bx ax + ret +xc dw 0 +yc dw 0 + +;==========GETVGAINFO (Fonction 0xh)========= +;Renvoie un bloc de donnée en ES:DI sur l'état de la carte graphique +;<- AH=x, ES:DI pointeur +;-> +;============================================= +Getvgainfos: + push cx si di ds + push cs + pop ds + mov cx,datablocksize + mov si,offset datablock + cld + rep movsb + pop ds di si cx + ret + +;==========WAITRETRACE (Fonction 0xh)========= +;Synchronisation avec la retrace verticale +;<- AH=x +;-> +;============================================= +waitretrace: + push ax dx + mov dx,3DAh +waitr: + in al,dx + test al,8 + jz waitr + pop dx ax + ret + +;Ecrit le caractère ASCII CL attribut CH aprés le curseur, en le mettant à jours +charout: + push ax bx cx dx di es + cmp byte ptr cs:graphics,1 + jne textaccess + mov dx,cx + mov di,dx + and di,11111111b + shl di,3 + add di,offset font8x8 + xor bx,bx + xor cx,cx + mov ah,cs:[di] +bouclet: + mov al,dh + rol ah,1 + jc colored + shr al,4 + bt word ptr cs:style,0 + jc transparent +colored: + and al,1111b + push bx cx + add cx,cs:yg + add bx,cs:xg + call showpixel + pop cx bx +transparent: + inc bx + cmp bx,8 + jb bouclet + xor bx,bx + inc di + mov ah,cs:[di] + inc cx + cmp cx,8 + jb bouclet + add cs:xg,8 + mov cx,cs:linesize + shl cx,2 + cmp cs:xg,cx + jb adjusttext + mov cs:xg,0 + add cs:yg,8 + jmp adjusttext +textaccess: + mov ax,0B800h + mov es,ax + mov di,cs:xy + mov es:[di],cx + add cs:xy,2 +adjusttext: + inc cs:x + mov cl,cs:columns + cmp cs:x,cl + jb noadjusted + call showline +noadjusted: + ;mov dx,3D4h + ;mov al,0Eh + ;mov di,offset xy + ;mov ah,cs:[di] + ;out dx,ax + ;mov ah,cs:[di+1] + ;dec al + ;out dx,ax + pop es di dx cx bx ax + ret + + + + + + +;===================================sauve l'ecran rapidement================ +SaveScreen: + push cx si di ds es + mov cx,0B800H + mov ds,cx + push cs + pop es + mov cx,cs:pagesize + shr cx,2 + xor si,si + mov di,offset Copy2 + cld + rep movsd + pop es ds di si cx + ret + +;===================================sauve l'ecran rapidement en es:di================ +SaveScreento: + push cx si di ds + mov cx,0B800H + mov ds,cx + mov cx,cs:pagesize + shr cx,2 + xor si,si + cld + rep movsd + pop ds di si cx + ret + +;===================================sauve l'ecran rapidement================ +Savepage1: + push cx si di ds es + mov cx,0B800H + mov ds,cx + push cs + pop es + mov cx,cs:pagesize + shr cx,2 + xor si,si + mov di,offset Copy + cld + rep movsd + pop es ds di si cx + ret + +;===================================sauve l'ecran rapidement================ +RestoreScreen: + push cx si di ds es + mov cx,0B800H + mov es,cx + push cs + pop ds + mov cx,cs:pagesize + shr cx,2 + mov si,offset Copy2 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + +;===================================restore l'ecran rapidement de ds:si================ +RestoreScreenfrom: + push cx si di ds es + mov cx,0B800H + mov es,cx + mov cx,cs:pagesize + shr cx,2 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + +;===============================Page2to1============================ +Page2to1: + push cx si di ds es + mov cx,0B800H + mov es,cx + mov ds,cx + mov cx,cs:pagesize + shr cx,2 + mov si,4000 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + +;===============================Page1to2============================ +Page1to2: + push cx si di ds es + mov cx,0B800H + mov es,cx + mov ds,cx + mov cx,cs:pagesize + shr cx,2 + mov di,4000 + xor si,si + cld + rep movsd + pop ds es di si cx + ret + +;===============================xchgPages============================ +xchgPages: + push cx si di ds es + call savepage1 + call page2to1 + mov cx,0B800H + mov es,cx + push cs + pop ds + mov cx,cs:pagesize + shr cx,2 + mov si,offset Copy + mov di,4000 + rep movsd + pop es ds di si cx + ret + +;Sauve l'‚tat de la carte en es:di +savestate: +push cx si di ds +push cs +pop ds +mov cx,datablocksize +mov si,offset lines +cld +rep movsb +call savescreento +pop ds di si cx +ret + +;R‚cupŠre l'‚tat de la carte en ds:si +restorestate: +push ax cx si di es +mov al,[si+7] +cmp cs:mode,al +je nochangemode +mov ah,0 +call setvideomode +nochangemode: +push cs +pop es +mov cx,datablocksize +mov di,offset lines +cld +rep movsb +call restorescreenfrom +pop es di si cx ax +ret + +;sauve le DAC +savedac: +push ax cx dx di +mov dx,3C7h +xor ax,ax +out dx,al +mov cx,256*3 +inc dx +inc dx +mov di,offset dac +save: +in al,dx +mov cs:[di],al +inc di +dec cx +jne save +pop di dx cx ax +ret + +;restore le DAC +restoredac: +push ax cx dx si +xor ax,ax +cli +mov dx,3DAh +in al,dx +mov dx,0 +out dx,al +mov dx,3C8h +out dx,al +mov cx,256*3 +mov si,offset dac +save2: +mov al,cs:[si] +inc si +out dx,al +dec cx +jne save2 +mov dx,3DAh +in al,dx +mov dx,32 +out dx,al +pop si dx cx ax +ret + +;couleur al pour ligne di +changelineattr: +push ax bx di es +mov bx,ax +mov ax,0B800h +mov es,ax +mov ax,di +mul cs:columns +mov di,ax +shl di,1 +mov al,cs:columns +inc di +popep: +mov es:[di],bl +add di,2 +dec al +jnz popep +pop es di bx ax +ret + + + + + + + + + + + + + + + + +BMP_File struc +BMP_FileType db 'BM' +BMP_FileSize dd ? ; taille du fichier +BMP_Reserved dd 0 ; toujours 0 +BMP_BitMapOffset dd ? ; offset de l'image +BMP_HeaderSize dd ? ; taille de l'entete en octects +BMP_Width dd ? ; largeur en pixels de l'image +BMP_Height dd ? ; hauteur en pixels de l'image +BMP_Planes dw 1 ; nombre de plan utilisés +BMP_BitsPerPixel dw ? ; nombre de bits par pixels +BMP_Compression dd ? ; méthode de compression +BMP_SizeOfBitMap dd ? ; taille de l'image en octects +BMP_HorzResolution dd ? ; resolution horizontale en pixels par mètre +BMP_VertResolution dd ? ; resolution verticale en pixels par mètre +BMP_ColorsUsed dd ? ; nombre de couleur dans la palette si 0: palette entière si BitPerPixel<=8 +BMP_ColorsImportant dd ? ; nombre de couleurs importantes masques pour les modes de plus de 8 bits par pixels +BMP_RedMask dd ? +BMP_GreenMask dd ? +BMP_BlueMask dd ? +BMP_AlphaMask dd ? +BMP_ColorSpaceType dd ? +BMP_RedX dd ? +BMP_RedY dd ? +BMP_RedZ dd ? +BMP_GreenX dd ? +BMP_GreenY dd ? +BMP_GreenZ dd ? +BMP_BlueX dd ? +BMP_BlueY dd ? +BMP_BlueZ dd ? +BMP_GammaRed dd ? +BMP_GammaGreen dd ? +BMP_GammeBlue dd ? +BMP_file ends + +;BMP_Compression peut prendre les valeurs suivantes: +BMP_COMP_UNCOMP equ 0 ; pas de compression +BMP_COMP_RLE8 equ 1 ; 8-bit run length encoding +BMP_COMP_RLE4 equ 2 ; 4-bit tun length encoding +BMP_COMP_BFE equ 3 ; bitfields encoding + + +font8x8 equ $ +copy equ $+3000 +copy2 equ $+8000 +dac equ $+16000 +end start diff --git a/noyau/write.bat b/noyau/write.bat new file mode 100755 index 0000000..808b110 --- /dev/null +++ b/noyau/write.bat @@ -0,0 +1,4 @@ +@echo off +cd .. +setup +cd sources diff --git a/exe2boot.asm b/outils/exe2boot.asm similarity index 100% rename from exe2boot.asm rename to outils/exe2boot.asm diff --git a/rip.asm b/outils/rip.asm similarity index 100% rename from rip.asm rename to outils/rip.asm diff --git a/unrip.asm b/outils/unrip.asm similarity index 100% rename from unrip.asm rename to outils/unrip.asm diff --git a/programs/asm.bat b/programs/asm.bat new file mode 100755 index 0000000..9466a7b --- /dev/null +++ b/programs/asm.bat @@ -0,0 +1,54 @@ +@echo off + +echo Assembling file %1... +..\util\tasm %1.asm /m5/x/t +if errorlevel 1 goto end +if "%1"=="boot" goto boot +echo Linking file %1... +..\util\tlink %1.obj /x/t +if errorlevel 1 goto end +echo Copying file %1... +if "%1"=="video" goto video +if "%1"=="lpt" goto system +if "%1"=="keyboard" goto system +if "%1"=="mouse" goto system +if "%1"=="pic8259a" goto system +if "%1"=="timer" goto system +if "%1"=="drive" goto system +if "%1"=="joystick" goto system +if "%1"=="system" goto system +if "%1"=="setup" goto setup +copy %1.com ..\data\%1.exe>nul +goto end + +:boot +echo Linking file %1... +..\util\tlink %1.obj /x +if errorlevel 1 goto end +echo Copying file %1... +..\util\exe2boot %1.exe +copy %1.bin ..\data\%1.bin>nul +goto end + +:video +type thin8x8.fnt>>%1.com +:system +copy %1.com ..\data\%1.sys>nul +goto end +:setup +copy %1.com ..\%1.com>nul +goto end + +:end +if not exist *.bin goto exes +del *.bin +:exes +if not exist *.exe goto coms +del *.exe +:coms +if not exist *.com goto objs +del *.com +:objs +if not exist *.obj goto nobjs +del *.obj +:nobjs diff --git a/programs/clean.bat b/programs/clean.bat new file mode 100755 index 0000000..687f4b0 --- /dev/null +++ b/programs/clean.bat @@ -0,0 +1,3 @@ +@echo off +echo nettoyage en cours... +del ..\data\*.* >nul diff --git a/programs/debog.bat b/programs/debog.bat new file mode 100755 index 0000000..aedbb4e --- /dev/null +++ b/programs/debog.bat @@ -0,0 +1,2 @@ +@echo off +..\util\td %1 diff --git a/disk.asm b/programs/disk.asm similarity index 89% rename from disk.asm rename to programs/disk.asm index e0b4ca3..291b624 100755 --- a/disk.asm +++ b/programs/disk.asm @@ -10,10 +10,10 @@ start: int 16h mov ax,0002 int 47H - mov ah,26 - int 47H mov ah,2 int 47h + mov ah,43 + int 47h xor bp,bp Adres: mov di,offset infos @@ -45,6 +45,14 @@ Adres: mov di,offset infos mov ah,34 int 47h + dec byte ptr [di] + mov al,[di+1] + sub al,16 + mov bl,al + shr al,2 + mov [di+1],al + and bl,11b + mov [di+2],bl mov al,[di+7] cmp al,oldmode je noinit @@ -52,7 +60,6 @@ Adres: int 47h mov oldmode,al noinit: - dec infos mov bx,0 mov ah,25 int 47h @@ -77,7 +84,7 @@ lines: int 47h mov ah,5 int 47h - mov al,16 + mov al,infos+1 mov cl,7 mov ah,21 int 47h @@ -96,7 +103,7 @@ doaline: mov si,offset spaces mov ah,13 int 47h - mov al,16 + mov al,infos+1 mov ah,21 mov cl,7 int 47h @@ -109,6 +116,8 @@ doaline2: jnz doaline2 dec bh je outes + cmp byte ptr infos+2,0 + je lines mov ah,6 int 47h jmp lines @@ -116,8 +125,10 @@ outes: mov ah,21 mov cl,112 int 47h + mov bh,0 + mov bl,infos mov si,offset menu - mov ah,13 + mov ah,14h int 47h waitkey: mov ax,0 @@ -270,9 +281,7 @@ cursor: jmp waitst suit7: cmp ax,4200h - jne waitkey - mov ah,27 - int 47h + jne adres2 db 0CBH ret diff --git a/editor.asm b/programs/editor.asm similarity index 88% rename from editor.asm rename to programs/editor.asm index ad2b614..9608987 100755 --- a/editor.asm +++ b/programs/editor.asm @@ -10,18 +10,25 @@ start: int 16h mov ax,0002 int 47H - mov ah,26 - int 47H mov ah,2 int 47h xor ebp,ebp xor ax,ax - mov fs,ax + mov fs,ax + mov ah,43 + int 47h Adres: mov di,offset infos mov ah,34 int 47h - dec infos + dec byte ptr [di] + mov al,[di+1] + sub al,16 + mov bl,al + shr al,2 + mov [di+1],al + and bl,11b + mov [di+2],bl mov al,[di+7] cmp al,oldmode je noinit @@ -55,7 +62,7 @@ lines: int 47h mov ah,5 int 47h - mov al,16 + mov al,infos+1 mov cl,7 mov ah,21 int 47h @@ -78,7 +85,7 @@ doaline: mov si,offset spaces mov ah,13 int 47h - mov al,16 + mov al,infos+1 mov ah,21 mov cl,7 int 47h @@ -95,6 +102,8 @@ doaline2: jnz doaline2 dec bh je outes + cmp byte ptr infos+2,0 + je lines mov ah,6 int 47h jmp lines @@ -102,8 +111,10 @@ outes: mov ah,21 mov cl,112 int 47h + mov bh,0 + mov bl,infos mov si,offset menu - mov ah,13 + mov ah,14h int 47h waitkey: mov ax,0 @@ -140,16 +151,14 @@ outes: suit6: cmp ax,4100h jne suit7 - mov dword ptr [pope],'TIDE' - mov bl,infos - xor bh,bh - mov ah,25 - int 47h mov ah,21 mov cl,116 int 47h + mov dword ptr [pope],'TIDE' + mov bl,infos + xor bh,bh mov si,offset menu - mov ah,13 + mov ah,14h int 47h mov ah,21 mov cl,7 @@ -275,7 +284,7 @@ cursor: jmp waitst suit7: cmp ax,4200h - jne waitkey + jne adres mov ah,27 int 47h db 0CBH ; +++++++ @@ -372,7 +381,7 @@ spaces db ' showbuffer db 35 dup (0FFh) oldmode db 0 -infos db 10 dup (0) +infos db 40 dup (0) end start diff --git a/logo.asm b/programs/logo.asm similarity index 83% rename from logo.asm rename to programs/logo.asm index f20ec8f..255295b 100755 --- a/logo.asm +++ b/programs/logo.asm @@ -21,7 +21,7 @@ mov ah,6 int 48h push es pop ds -mov ax,0006h +mov ax,0009h int 47h mov ah,38 int 47h @@ -29,8 +29,10 @@ mov ah,35 int 47h mov ah,37 int 47h -xor cx,cx -xor bx,bx +mov ah,2 +int 47h +mov cx,400 +mov bx,40 mov ah,36 int 47h mov ax,0 diff --git a/programs/mous.asm b/programs/mous.asm new file mode 100755 index 0000000..785a328 --- /dev/null +++ b/programs/mous.asm @@ -0,0 +1,41 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: +mov ax,6 +int 47h +mov ax,0a000h +mov es,ax +mov ds,ax +xor di,di +mov cx,0ffffh/4 +mov eax,0 +rep stosd +mov ax,0c40h +boucle: +mov ah,4 +int 74h +mov byte ptr es:[di],0FFh +mov si,0 +mov di,0 +mov cx,0ffffh +reboucle: +mov al,[si] +inc si +cmp al,0 +je suite +dec al +suite: +mov es:[di],al +inc di +dec cx +jnz reboucle +cmp dl,2 +jne boucle +db 0CBh + +end start diff --git a/pmode.asm b/programs/pmode.asm similarity index 100% rename from pmode.asm rename to programs/pmode.asm diff --git a/test.asm b/programs/test.asm similarity index 91% rename from test.asm rename to programs/test.asm index db759cc..33ea3ee 100755 --- a/test.asm +++ b/programs/test.asm @@ -48,11 +48,13 @@ int 47h mov ah,6 int 47h mov edx,-6876253 +mov cx,32 mov ah,9 int 47h mov ah,6 int 47h mov edx,-311212323 +mov cx,32 mov ah,9 int 47h mov ah,6 diff --git a/verif.asm b/programs/verif.asm similarity index 100% rename from verif.asm rename to programs/verif.asm diff --git a/programs/write.bat b/programs/write.bat new file mode 100755 index 0000000..808b110 --- /dev/null +++ b/programs/write.bat @@ -0,0 +1,4 @@ +@echo off +cd .. +setup +cd sources diff --git a/timer.asm b/timer.asm deleted file mode 100755 index ce6c0b0..0000000 --- a/timer.asm +++ /dev/null @@ -1,91 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: - -jmp tsr -offsets dd 0 -db 'TIMER' -tsr: - pushf - db 2eh,0ffh,1eh - dw offsets - cli - push ax bx es - mov bx,cs:compteur - inc bx - and bx,11b - mov cs:compteur,bx - mov bx,cs:[offset fig+bx] - mov ax,0B800h - mov es,ax - mov es:[0],bl -push ds es -pusha -mov ax,40h -mov es,ax -mov ax,0B800h -mov ds,ax -mov word ptr dx,es:[8] - -in al,dx -mov di,158 -decompose: -mov cl,al -and cl,1 -cmp cl,1 -je un -mov byte ptr ds:[di],'0' -jmp errr -un: -mov byte ptr ds:[di],'1' -errr: -shr al,1 -dec di -dec di -cmp di,142 -jne decompose - -inc dx -in al,dx -mov di,318 -decompose2: -mov cl,al -and cl,1 -cmp cl,1 -je un2 -mov byte ptr ds:[di],'0' -jmp errr2 -un2: -mov byte ptr ds:[di],'1' -errr2: -cmp di,314 -jb errrr -mov byte ptr ds:[di],'X' -errrr: -shr al,1 -dec di -dec di -cmp di,302 -jne decompose2 -popa -pop es ds - - - - - - - - - - pop es bx ax - sti - iret - compteur dw 0 - fig db 'Ä\³/' -end start diff --git a/video.asm b/video.asm deleted file mode 100755 index 56c48b3..0000000 --- a/video.asm +++ /dev/null @@ -1,1412 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: -jmp tsr -db 'VIDEO' -Tsr: -cli -cmp ax,1234h -jne nomore -mov ax,4321h -jmp itsok -nomore: -push bx -mov bl,ah -xor bh,bh -shl bx,1 -mov bx,cs:[bx].tables -mov cs:current,bx -pop bx -call cs:current -itsok: -jnc noerror -push bp -mov bp,sp -or byte ptr [bp+6],1b -pop bp -mov ax,cs -shl eax,16 -mov ax,cs:current -jmp endofint -noerror: -push bp -mov bp,sp -and byte ptr [bp+6],0FEh -pop bp -endofint: -sti -iret -current dw 0 -tables dw setvideomode - dw getvideomode - dw cleartext - dw changefont - dw loadfont - dw space - dw line - dw showchar - dw showint - dw showsigned - dw showhex - dw showbin - dw showstring - dw showstring0 - dw showcharat - dw showintat - dw showsignedat - dw showhexat - dw showbinat - dw showstringat - dw showstring0at - dw setcolor - dw getcolor - dw scrolldown - dw getxy - dw setxy2 - dw savescreen - dw restorescreen - dw page2to1 - dw page1to2 - dw xchgPages - dw savepage1 - dw changelineattr - dw waitretrace - dw getinfos - dw loadbmp - dw showbmp - dw clearscr - dw savedac - dw restoredac - dw savestate - dw restorestate - -;sauve le DAC -savedac: -push ax cx dx di -mov dx,3C7h -xor ax,ax -out dx,al -mov cx,256*3 -inc dx -inc dx -mov di,offset dac -save: -in al,dx -mov cs:[di],al -inc di -dec cx -jne save -pop di dx cx ax -ret - -;restore le DAC -restoredac: -push ax cx dx si -xor ax,ax -cli -mov dx,3DAh -in al,dx -mov dx,0 -out dx,al -mov dx,3C8h -out dx,al -mov cx,256*3 -mov si,offset dac -save2: -mov al,cs:[si] -inc si -out dx,al -dec cx -jne save2 -mov dx,3DAh -in al,dx -mov dx,32 -out dx,al -pop si dx cx ax -ret - -;Change la police a CL -changefont: -push ax cx dx -mov ah,cl -and cl,11b -and ah,0100b -shl ah,2 -add ah,cl -mov dx,3C4h -mov al,3 -out dx,ax -pop dx cx ax -ret - -;met la police BL … ds:si taille dans CL -loadfont: -push ax bx cx dx si di es -xor di,di -mov dx,3C4h -cli -doseq: -mov ax,cs:[di+offset reg1] -out dx,ax -inc di -inc di -cmp di,6 -jbe doseq -mov dx,3CEh -doseq2: -mov ax,cs:[di+offset reg1] -out dx,ax -inc di -inc di -cmp di,6+6 -jbe doseq2 -sti -mov ax,0A000h -mov es,ax -mov dx,255 -mov al,0 -xor bh,bh -cmp bl,4 -jb isless -sub bl,4 -shl bl,1 -inc bl -jmp okmake -isless: -shl bl,1 -okmake: -mov di,bx -shl di,13 -mov bh,cl -mov bl,cl -sub bl,32 -neg bl -xor cx,cx -cld -popz: -mov cl,bh -rep movsb -mov cl,bl -rep stosb -dec dx -jnz popz -xor di,di -mov dx,3C4h -doseqs: -mov ax,cs:[di+offset reg2] -out dx,ax -inc di -inc di -cmp di,6 -jbe doseqs -mov dx,3CEh -doseqs2: -mov ax,cs:[di+offset reg2] -out dx,ax -inc di -inc di -cmp di,6+6 -jbe doseqs2 -pop es di si dx cx bx ax -ret -reg2 dw 0100h, 0302h, 0304h, 0300h - dw 0004h, 1005h, 0E06h -reg1 dw 0100h, 0402h, 0704h, 0300h - dw 0204h, 0005h, 0406h - -;40*25 16 couleurs -mode0 DB 67H,00H, 03H,08H,03H,00H,02H - DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,01FH,00H,4FH,0DH,0EH,00H,00H,00H,00H - DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,08H,00H - db 40,25 - -;80*25 16 couleurs -mode1 DB 67H,00H, 03H,00H,03H,00H,02H - DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0DH,0EH,00H,00H,00H,00H - DB 9CH,0EH,8FH,28H,1FH,96H,0B9H,0A3h,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,08H,00H - db 80,25 - -;80*50 16 couleurs -mode2 DB 63H, 00H, 03H,01H,03H,01H,02H - DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H - DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,00H,00H - db 80,50 - -;100*50 16 couleurs -mode3 DB 067H,00H,03H,01H,03H,01H,02H - DB 70H,63H,64H,85H,68H,84H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H - DB 00H,9Ch,08EH,8FH,32H,1FH,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,00H,00H - db 100,50 - -;100*60 16 couleurs -mode4 DB 0A7H,00H,03H,01H,03H,01H,02H - DB 70H,63H,64H,85H,68H,84H,0FFH,1FH,00H,47H,06H,07H,00H,00H,00H - DB 00H,0E7H,8EH,0DFH,32H,1FH,0DFH,0E5H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,00H,00H - db 100,60 - -;320*200 16 couleurs -mode5 DB 63H,00H, 03H,09H,0FH,00H,06H - DB 2DH,27H,28H,90H,2BH,080H,0BFH,01FH,00H,0C0H,00H,00H,00H,00H,00H,00H - DB 9CH,8EH,8FH,14H,00H,96H,0B9H,0E3H,0FFH - DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - db 40,25 - -;320*200 256 couleurs -mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH - DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H - DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - db 00,00 - -;320*400 256 couleurs chain4 -mode7 DB 63H, 00H, 03H,01H,0FH,00H,0EH - DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H - DB 9CH,8EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - db 00,00 - -;640*400 16 couleurs -mode8 DB 63H, 00H, 03H,01H,0FH,00H,0EH - DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H - DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - db 00,00 - -;640*400 256 couleurs -mode9 DB 63H, 00H, 03H,01H,0FH,00H,0EH - DB 2DH,27H,27H,91H,2AH,9FH,0BFH,1FH,00H,0C0H,00H,00H,00H,00H,00H,00H - DB 9CH,0EH,8FH,50H,00H,8FH,0C0H,0E3H,0FFH - DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - db 00,00 - - - -;==================================================== -;320*400 256 couleurs chain4 -mode7s DB 63H, 00H, 03H,01H,0FH,00H,06H - DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H - DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH - DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - db 00,00 - -; -;=============CLEAR========= -;Efface l'ecran texte -;-> -;<- -;============================= -cleartext: -push es eax cx di -xor di,di -mov ax,0b800h -mov es,ax -mov eax,07200720h -mov cx,cs:pagesize -shr cx,2 -cld -rep stosd -mov cs:xy,0 -mov cs:x,0 -mov cs:y,0 -pop di cx eax es -ret - -;=============CLEAR========= -;Efface l'ecran texte -;-> -;<- -;============================= -clearpixel: -push es eax cx di -xor di,di -mov ax,0A000h -mov es,ax -mov eax,0h -mov cx,cs:pagesize -shr cx,2 -cld -rep stosd -pop di cx eax es -ret - -Sequencer equ 03C4h -misc equ 03C2h -CCRT equ 03D4h -Attribs equ 03C0h -graphic equ 03CEh -statut equ 3DAh - -initmode: -push bx cx si ds -;xor bx,bx -;mov ds,bx -;lds si,ds:[43h*4] -push cs -pop ds -mov si,offset font -mov cl,8 -mov bl,1 -call loadfont -pop ds si cx bx -ret - -;Renvoie le mode video dans al -getvideomode: -mov al,cs:mode -ret - -;====Met le mode video a al -setvideomode: -push ax dx di -cmp cs:mode,0FFh -jne noinit -call initmode -mov cs:pagesize,4000 -call cleartext -noinit: -mov cs:mode,al -xor ah,ah -mov di,ax -shl di,6 -add di,offset mode0 -mov dx,misc -mov al,cs:[di] -out dx,al -inc di -mov dx,statut -mov al,cs:[di] -out dx,al -inc di -mov dx,sequencer -xor ax,ax -initsequencer: -mov ah,cs:[di] -out dx,ax -inc al -inc di -cmp al,5 -jb initsequencer -mov ax,0E11h -mov dx,ccrt -out dx,ax -xor ax,ax -initcrt: -mov ah,cs:[di] -out dx,ax -inc al -inc di -cmp al,25 -jb initcrt -mov dx,graphic -xor ax,ax -initgraphic: -mov ah,cs:[di] -out dx,ax -inc al -inc di -cmp al,9 -jb initgraphic -mov dx,statut -in al,dx -mov dx,attribs -xor ax,ax -initattribs: -mov ah,cs:[di] -push ax -in ax,dx -pop ax -out dx,al -xchg ah,al -out dx,al -xchg ah,al -inc al -inc di -cmp al,21 -jb initattribs -mov al,cs:[di] -mov cs:columns,al -mov ah,cs:[di+1] -mov cs:lines,ah -mul ah -shl ax,1 -mov cs:pagesize,ax -mov al,20h -out dx,al -pop di dx ax -ret - -;==========SPACE=========== -;met un espace apr‚s le curseur -;-> -;<- -;============================= -space: -push bx es -add cs:xy,2 -mov bx,0B800h -mov es,bx -mov bx,cs:xy -mov byte ptr es:[bx],' ' -pop es bx -ret - -;==========SHOWCHAR=========== -;met un caractŠre apr‚s le curseur -;-> dl -;<- -;============================= -showchar: -push dx bx es -mov bx,0B800h -mov es,bx -mov bx,cs:xy -mov dh,cs:colors -mov es:[bx],dx -add cs:xy,2 -pop es bx dx -ret - -;==========SHOWCHARAT=========== -;met un caractŠre apr‚s le curseur coord ah,al -;-> dl ah al -;<- -;============================= -showcharat: -push es di -call setxy -call showchar -pop di es -ret - -;==========LINE========= -;remet le curseur a la ligne -;-> -;<- -;============================= -line: -push bx cx di es -mov bh,cs:x -mov bl,cs:y -xor bh,bh -mov cl,cs:lines -dec cl -dec cl -cmp bl,cl -jne scro -dec bl -mov cl,1 -call scrolldown -scro: -inc bl -call setxy -pop es di cx bx -ret - -;==========SETCOLOR========= -;Change les attributs du texte a CL -;-> CL -;<- -;============================= -setcolor: -mov cs:colors,CL -ret - -;==========GETCOLOR========= -;R‚cupŠre les attributs du texte dans CL -;-> -;<- CL -;============================= -getcolor: -mov cl,cs:colors -ret - -updatecursor: -push ax dx di -mov dx,3D4h -mov al,0Eh -mov di,offset xy -mov ah,cs:[di] -out dx,ax -mov ah,cs:[di+1] -inc al -out dx,ax -pop di dx ax -ret - -;==========SCROLLDOWN========= -;defile de cx lines vers le bas -;-> CX -;<- -;============================= -scrolldown: -push ax cx dx si di ds es -mov si,0B800h -mov es,si -mov ds,si -mov ax,cx -mul cs:columns -shl ax,1 -mov si,ax -mov cx,cs:pagesize -sub cx,si -xor di,di -cld -rep movsb -pop es ds di si dx cx ax -ret - -;==========GETXY========= -;Change les coordonnées du curseur a X:AL,Y:AH -;-> AX -;<- -;============================= -getxy: -mov bh,cs:x -mov bl,cs:y -ret - -;==========SETXY========= -;Change les coordonnées du curseur a X:AH,Y:AL -;-> AX -;<- es di -;============================= -setxy: -push ax bx dx -mov cs:x,bh -mov cs:y,bl -mov al,bl -mov bl,bh -xor bh,bh -mov di,bx -mul cs:columns -add di,ax -shl di,1 -mov cs:xy,di -mov ax,0B800h -mov es,ax -pop dx bx ax -ret - -setxy2: -push es di -call setxy -pop di es -ret - - -;===================================sauve l'ecran rapidement================ -SaveScreen: - push cx si di ds es - mov cx,0B800H - mov ds,cx - push cs - pop es - mov cx,cs:pagesize - shr cx,2 - xor si,si - mov di,offset Copy2 - cld - rep movsd - pop es ds di si cx - ret - -;===================================sauve l'ecran rapidement en es:di================ -SaveScreento: - push cx si di ds - mov cx,0B800H - mov ds,cx - mov cx,cs:pagesize - shr cx,2 - xor si,si - cld - rep movsd - pop ds di si cx - ret - -;===================================sauve l'ecran rapidement================ -Savepage1: - push cx si di ds es - mov cx,0B800H - mov ds,cx - push cs - pop es - mov cx,cs:pagesize - shr cx,2 - xor si,si - mov di,offset Copy - cld - rep movsd - pop es ds di si cx - ret - -;===================================sauve l'ecran rapidement================ -RestoreScreen: - push cx si di ds es - mov cx,0B800H - mov es,cx - push cs - pop ds - mov cx,cs:pagesize - shr cx,2 - mov si,offset Copy2 - xor di,di - cld - rep movsd - pop es ds di si cx - ret - -;===================================restore l'ecran rapidement de ds:si================ -RestoreScreenfrom: - push cx si di ds es - mov cx,0B800H - mov es,cx - mov cx,cs:pagesize - shr cx,2 - xor di,di - cld - rep movsd - pop es ds di si cx - ret - -;===============================Page2to1============================ -Page2to1: - push cx si di ds es - mov cx,0B800H - mov es,cx - mov ds,cx - mov cx,cs:pagesize - shr cx,2 - mov si,4000 - xor di,di - cld - rep movsd - pop es ds di si cx - ret - -;===============================Page1to2============================ -Page1to2: - push cx si di ds es - mov cx,0B800H - mov es,cx - mov ds,cx - mov cx,cs:pagesize - shr cx,2 - mov di,4000 - xor si,si - cld - rep movsd - pop ds es di si cx - ret - -;===============================xchgPages============================ -xchgPages: - push cx si di ds es - call savepage1 - call page2to1 - mov cx,0B800H - mov es,cx - push cs - pop ds - mov cx,cs:pagesize - shr cx,2 - mov si,offset Copy - mov di,4000 - rep movsd - pop es ds di si cx - ret - -;===================================Afficher un int EDX a l'‚cran en ah,al================ -ShowInt: - push eax bx cx edx esi di es ds - mov di,cs:xy - mov cx,0B800h - mov es,cx - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint3: - xor edx,edx - div esi - add dl,'0' - mov dh,cs:colors - sub bx,2 - add cx,2 - mov cs:[bx],dx - cmp ax,0 - jne decint3 - mov si,bx - push cs - pop ds - cld - rep movsb - mov cs:xy,di - pop ds es di esi edx cx bx eax -ret -showbuffer db 35 dup (0FFh) - -;===================================Afficher un int EDX a l'‚cran en ah,al================ -ShowIntat: -push es di - call setxy - call showint -pop di es -ret - -waitretrace: -push ax dx -mov dx,3DAh -waitr: -in al,dx -test al,8 -jz waitr -pop dx ax -ret - -nbexactbit: -push edx -xor cx,cx -viewnb: -inc cx -shr edx,1 -cmp edx,0 -jnz viewnb -pop edx -ret - -bittobyte: -push dx -adap: -mov dx,cx -and dx,3 -jz adapfin -add cx,1 -jmp adap -adapfin: -pop dx -ret - -Nbbit: -cmp edx,0FFh -jb ok1 -cmp edx,0FFFFh -jb ok2 -mov cx,32 -ret -ok1: -mov cx,8 -ret -ok2: -mov cx,16 -ret - -showhexat: -push es di - call setxy - call showhex -pop di es -ret - -showbinat: -push cx es di -call setxy -call showbin -pop di es cx -ret - -;==============================Affiche le nombre nb binaire en EDX============== -Showbin: - push es ax bx cx di - mov di,cs:xy - mov bx,0B800h - mov es,bx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors -binaize: - rol edx,1 - mov cl,'0' - adc cl,0 - mov es:[di],cx - add di,2 - dec al - jnz binaize - mov cs:xy,di - pop di cx bx ax es - ret - -;==============================Affiche le nombre nb hexa en EDX============== -ShowHex: - push es ax bx cx di - mov di,cs:xy - mov bx,0B800h - mov es,bx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors - shr ax,2 -Hexaize: - rol edx,4 - mov bx,dx - and bx,0fh - mov cl,cs:[bx+offset Tab] - mov es:[di],cx - add di,2 - dec al - jnz Hexaize - mov cs:xy,di - pop di cx bx ax es - ret -Tab db '0123456789ABCDEF' - -;===================================Afficher un int EDX a l'‚cran en ah,al================ -Showsigned: -push ax ebx edx es -xor ebx,ebx -mov bl,cl -dec bl -bt edx,ebx -jnc pos -neg edx -mov ah,cs:colors -mov al,'-' -mov bx,0B800h -mov es,bx -mov bx,cs:xy -mov word ptr es:[bx],ax -add cs:xy,2 -pos: -call showint -pop es edx ebx ax -ret - -showsignedat: -push es di -call setxy -call showsigned -pop di es -ret - -;================Affiche la chaine de caractŠre contenue dans ds:si -showstring: - push es bx cx si di - mov di,cs:xy - mov bx,0B800h - mov es,bx - mov bl,[si] - mov ch,cs:colors -strinaize: - inc si - mov cl,[si] - mov es:[di],cx - add di,2 - dec bl - jnz strinaize - mov cs:xy,di - pop di si cx bx es - ret - -;================Affiche la chaine 0 de caractŠre contenue dans ds:si -showstring0: - push es cx si di - mov di,cs:xy - mov cx,0B800h - mov es,cx - mov ch,cs:colors -strinaize0: - mov cl,[si] - cmp cl,0 - je no0 - mov es:[di],cx - add di,2 - inc si - jmp strinaize0 - no0: - mov cs:xy,di - pop di si cx es - ret - - -showstringat: -push es di -call setxy -call showstring -pop di es -ret - -showstring0at: -push es di -call setxy -call showstring0 -pop di es -ret - -;couleur al pour ligne di -changelineattr: -push ax bx di es -mov bx,ax -mov ax,0B800h -mov es,ax -mov ax,di -mul cs:columns -mov di,ax -shl di,1 -mov al,cs:columns -inc di -popep: -mov es:[di],bl -add di,2 -dec al -jnz popep -pop es di bx ax -ret - -;Retourne en es:di un bloc de donn‚es -Getinfos: -push cx si di ds -push cs -pop ds -mov cx,10 -mov si,offset lines -cld -rep movsb -pop ds di si cx -ret - - -clearscr: -push eax cx -mov cx,320*200/4 -mov eax,0 -rep movsd -pop cx eax - -loadbmp: -push ax bx cx dx ds -mov ax,ds:[18] -mov si,ax -shr ax,2 -and si,11b -cmp si,0 -je is4x -add ax,1 -is4x: -mov cs:sizeh,ax -mov ax,ds:[22] -mov cs:sizev,ax -mov di,0FFFFh-1024 -mov si,54 -mov cl, 0ffh -paletteload: -lodsb -shr al, 2 -mov [di+2], al -lodsb -shr al, 2 -mov [di+1], al -lodsb -shr al, 2 -mov [di+0], al -inc si -add di, 3 -dec cl -jnz paletteload -mov si,0FFFFh-1024 -mov dx, 3c8h -cld -mov cl, 0ffh -xor bx, bx -palettemake: -mov al, bl -out dx, al -inc dx -lodsb -out dx, al -lodsb -out dx, al -lodsb -out dx, al -dec dx -inc bl -dec cl -jnz palettemake -pop ds dx cx bx ax -ret -sizeh dw 0 -sizev dw 0 - -showbmp: -push ax bx cx dx si di ds es -mov dx,cs:sizev -add bx,dx -mov di,cx -mov ax,bx -shl ax,6 -shl bx,8 -add di,bx -add di,ax -mov bx,di -mov ax,0A000H -mov es,ax -mov si,1024+54 -mov ax,cs:sizeh -bouclebmp: -cmp di,64000 -jae nopp -cld -rep movsd -no: -mov cx,ax -sub bx,320 -mov di,bx -dec dx -jnz bouclebmp -fin: -pop es ds di si dx cx bx ax -ret -nopp: -shl cx,2 -add si,cx -jmp no - -fire: -push ax cx dx si di -xor si,si -xor di,di -mov cx,64000 -makefire: -xor ax,ax -mov al,[si] -add al,[si+321] -adc ah,0 -add al,[si-321] -adc ah,0 -add al,[si+320] -adc ah,0 -shr ax,2 -cmp al,191 -jb pp -mov al,191 -pp: -cmp al,0 -je p -dec ax -p: -mov es:[di],al -inc si -inc di -dec cx -jnz makefire -pop di si dx cx ax -ret - -fireflamme: -push ax cx dx si di -xor si,si -xor di,di -mov cx,64000 -makefire2: -xor ax,ax -mov al,[si] -add al,[si+1] -adc ah,0 -add al,[si-1] -adc ah,0 -add al,[si+320] -adc ah,0 -shr ax,2 -cmp al,191 -jb ppp -mov al,191 -ppp: -cmp al,0 -je pppp -dec ax -pppp: -mov es:[di],al -inc si -inc di -dec cx -jnz makefire2 -pop di si dx cx ax -ret - -gauss: -push ax cx dx si di -xor si,si -xor di,di -mov cx,64000 -makegauss: -xor ax,ax -mov al,[si+1] -add al,[si-1] -adc ah,0 -add al,[si+321] -adc ah,0 -add al,[si+320] -adc ah,0 -add al,[si+319] -adc ah,0 -add al,[si-321] -adc ah,0 -add al,[si-320] -adc ah,0 -add al,[si-319] -adc ah,0 -shr ax,3 -mov es:[di],al -inc si -inc di -dec cx -jnz makegauss -pop di si dx cx ax -ret - -lowgauss: -push ax cx dx si di -xor si,si -xor di,di -mov cx,64000 -makegausss: -xor ax,ax -mov al,[si+1] -add al,[si-1] -adc ah,0 -add al,[si+320] -adc ah,0 -add al,[si-320] -adc ah,0 -shr ax,2 -mov es:[di],al -inc si -inc di -dec cx -jnz makegausss -pop di si dx cx ax -ret - -firepalett: -push ax cx dx -mov dx,03C8h -xor ax,ax -out dx,al -inc dx -mov cx,64 -rouge1: -out dx,al -push ax -xor al,al -out dx,al -out dx,al -pop ax -inc ax -loop rouge1 -mov cx,64 -jaune1: -push ax -mov al,63 -out dx,al -pop ax -out dx,al -push ax -xor al,al -out dx,al -pop ax -inc ax -loop jaune1 -mov cx,63 -blanc1: -push ax -mov al,63 -out dx,al -out dx,al -pop ax -out dx,al -loop blanc1 -pop dx cx ax -ret - -allfirepalett: -push ax cx dx -mov dx,03C8h -xor ax,ax -out dx,al -inc dx -mov cx,64 -rouge: -push ax -shr ax,1 -out dx,al -xor al,al -out dx,al -out dx,al -pop ax -inc ax -loop rouge -mov cx,64 -rouge2: -push ax -shr ax,1 -out dx,al -xor al,al -out dx,al -out dx,al -pop ax -inc ax -loop rouge2 -mov cx,64 -Jaune: -push ax -mov al,63 -out dx,al -pop ax -out dx,al -push ax -xor al,al -out dx,al -pop ax -inc ax -loop jaune -mov cx,64 -blanc: -push ax -mov al,63 -out dx,al -out dx,al -pop ax -out dx,al -loop blanc -pop dx cx ax -ret - -gaussscreen: -push ax ds es -mov ax,0A000h -mov ds,ax -push fs -pop es -call gauss -push ds -pop es -push fs -pop ds -call Copyscreen -pop es ds ax -ret - -lowgaussscreen: -push ax ds es -mov ax,0A000h -mov ds,ax -push fs -pop es -call lowgauss -push ds -pop es -push fs -pop ds -call Copyscreen -pop es ds ax -ret - -firescreen: -push ax ds es -mov ax,0A000h -mov ds,ax -push fs -pop es -call fire -push ds -pop es -push fs -pop ds -call Copyscreen -pop es ds ax -ret - -copyscreen: -push si di cx -xor si,si -xor di,di -mov cx,64000/4 -rep movsd -pop cx di si -ret - -;Sauve l'‚tat de la carte en es:di -savestate: -push cx si di ds -push cs -pop ds -mov cx,10 -mov si,offset lines -cld -rep movsb -call savescreento -pop ds di si cx -ret - -;R‚cupŠre l'‚tat de la carte en ds:si -restorestate: -push cx si di es -push cs -pop es -mov cx,10 -mov di,offset lines -cld -rep movsb -call restorescreenfrom -pop es di si cx -ret - -lines db 0 -columns db 0 -x db 0 -y db 0 -xy dw 0 -colors db 7 -mode db 0FFh -pagesize dw 0 -font equ $ -copy equ $+4000 -copy2 equ $+8000 -dac equ $+12000 -endofme equ $ +12768 - -end start From 4fad0d98a32d08b6baa31076820a11c245d3ddd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Mon, 9 Jul 2001 22:48:10 +0200 Subject: [PATCH 12/17] feat: ajout licence GPL V2.0 et informations sous forme de fichiers. Logiciel communication LPT. Gestion de l'heure. --- INFORMATIONS.md | 67 +- LICENSE.md | 1017 +++++++++++-------------------- {commande => install}/setup.asm | 0 cos.bmp => programs/cos.bmp | Bin cos.rip => programs/cos.rip | Bin programs/lpt/com.asm | 471 ++++++++++++++ programs/lpt/project1.dpr | 12 + programs/lpt/project1.opt | 34 ++ programs/lpt/project1.res | Bin 0 -> 794 bytes programs/lpt/unit1.dcu | Bin 0 -> 18160 bytes programs/lpt/unit1.dfm | Bin 0 -> 6125 bytes programs/lpt/unit1.pas | 517 ++++++++++++++++ 12 files changed, 1418 insertions(+), 700 deletions(-) rename {commande => install}/setup.asm (100%) rename cos.bmp => programs/cos.bmp (100%) rename cos.rip => programs/cos.rip (100%) create mode 100755 programs/lpt/com.asm create mode 100755 programs/lpt/project1.dpr create mode 100755 programs/lpt/project1.opt create mode 100755 programs/lpt/project1.res create mode 100755 programs/lpt/unit1.dcu create mode 100755 programs/lpt/unit1.dfm create mode 100755 programs/lpt/unit1.pas diff --git a/INFORMATIONS.md b/INFORMATIONS.md index 505a30f..67732ea 100755 --- a/INFORMATIONS.md +++ b/INFORMATIONS.md @@ -1,36 +1,53 @@ - < COS2000 the new operating system > + < COS2000 the new operating system > I. Présentation - COS2000, par définition est système d'exploitation, celui prend la direction des opérations à partir du moment où le PC est mis sous tension (Aprés le BIOS). Celui gére tous les périphériques rattaché au PC et offre aux programmeur les moyens de développer des applications compatibles : les APIs. COS2000 est basé sur un concept particulier qui est d'offrir au programmeur un maximum de fonctions intégrés pour faciliter le travail des programmeurs et réduire la taille des programmes. + COS2000, par définition, est système d'exploitation. Celui-ci prend la direction des opérations à partir + du moment où le PC est mis sous tension (Après le BIOS). Il gère tous les périphériques rattachés au PC et +offre aux programmeurs les moyens de développer des applications compatibles en fournissant des APIs +(Application Programming Interface). COS2000 est basé sur un concept particulier qui est d'offrir aux +programmeurs un maximum de fonctions intégrées pour faciliter le travail des programmeurs et réduire la +taille des programmes. +II. Comment l'installer ? -II. Mode d'emploi + Pour installer COS2000 : -Pour installer COS2000 : - - Insérez une disquette 1.44 Mo dans votre lecteur. - - Lancez le programme Setup.com. - - Si celui-ci ne détecte pas d'erreur, COS2000 est installé ! + - Insérez une disquette 1.44 Mo vierge ou inutile dans votre lecteur. + - Lancez le programme SETUP.COM situé dans le dossier de COS2000. + - Si celui-ci ne détecte pas d'erreur, COS2000 est installé ! -Pour lancer COS2000 : - - Insérez la disquette où COS2000 est installé. - - Veillez que dans le BIOS vous puissiez démarrer à partir de A:. - - Redémarrer votre ordinateur et vous serez sur COS2000. + Pour lancer COS2000 : -Pour utiliser COS2000 : + - Insérez la disquette où COS2000 est installé. + - Veillez que dans le BIOS vous puissiez démarrer à partir de A:. + - Redémarrer votre ordinateur et vous serez sur COS2000. - Le COS MENU LOADER est le premier logiciel qui est lancé au démarrage. A partir de celui-ci vous pouvez visionner tout les fichiers présents sur votre disquette et éventuellement s'il possèdent l'extension EXE, ils peuvent être exécutés. -Pour cela il suffit de sélectionner avec la ligne en surbrillance le programme à executer en utilisant les flêches de directions, pour éxecuter le programmer presser la touche "Entrée". -A partir du COS MENU LOADER on peut lancer un interpréteur de commandes . Celui s'appelle PROMPT.EXE. -Une fois dans l'interpréteur de commande vous pouvez tout aussi bien lancer des logiciels en saissisant leurs noms après "COS>". + Il est possible de télécharger une version plus récente de COS2000 à : -En plus des logiciels, l'interpréteur de commande peut exécuter 6 commandes : -EXIT Quitte l'interpréteur -VERSION Donne la version de COS2000 -CLS Efface l'écran -REBOOT Redémarre le PC -COMMAND Donne la liste des commandes disponibles -MODE [mode] Permet de changer de mode vidéo, [mode] doit être un nombre entre 1 et 9. - les modes au delà de 4 sont des modes graphiques à texte émulé, il est - déconseillé de les utiliser car il est parfois impossible de revenir aux modes texte. + https://github.com/dahut87/cos2000v1 + +III. Mode d'emploi + + Le COS MENU LOADER est le premier logiciel qui est lancé au démarrage. A partir de celui-ci, vous pouvez +visionner tout les fichiers présents sur votre disquette et éventuellement les exécuter s'ils possèdent +l'extension EXE . Pour cela, il suffit de sélectionner avec la ligne en surbrillance le programme à exécuter +en utilisant les flèches de direction. Pour exécuter le programmer, pressez la touche "Entrée". + + A partir du COS MENU LOADER on peut lancer un interpréteur de commandes . Celui-ci s'appelle PROMPT.EXE. +Une fois dans l'interpréteur de commande, vous pouvez tout aussi bien lancer des logiciels en saisissant leurs +noms après "COS>". + +En plus des logiciels, l'interpréteur de commandes peut exécuter 6 commandes : + + EXIT Quitte l'interpréteur + VERSION Donne la version de COS2000 + CLS Efface l'écran + REBOOT Redémarre le PC + COMMAND Donne la liste des commandes disponibles + MODE [mode] Permet de changer de mode vidéo. [mode] doit être un entier compris entre 1 et 9. les + modes au delà de 4 sont des modes graphiques à texte émulé. Il est déconseillé de les + utiliser car il est parfois impossible de revenir aux modes texte. + +Les possibilités de COS2000 sont aujourd'hui très limitées car il est en cours de développement. diff --git a/LICENSE.md b/LICENSE.md index 01a7a80..7d1f860 100755 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,675 +1,342 @@ -### GNU GENERAL PUBLIC LICENSE - -Version 3, 29 June 2007 - -Copyright (C) 2007 Free Software Foundation, Inc. - - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - -### Preamble - -The GNU General Public License is a free, copyleft license for -software and other kinds of works. - -The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom -to share and change all versions of a program--to make sure it remains -free software for all its users. We, the Free Software Foundation, use -the GNU General Public License for most of our software; it applies -also to any other work released this way by its authors. You can apply -it to your programs, too. - -When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you -have certain responsibilities if you distribute copies of the -software, or if you modify it: responsibilities to respect the freedom -of others. - -For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - -Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - -Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the -manufacturer can do so. This is fundamentally incompatible with the -aim of protecting users' freedom to change the software. The -systematic pattern of such abuse occurs in the area of products for -individuals to use, which is precisely where it is most unacceptable. -Therefore, we have designed this version of the GPL to prohibit the -practice for those products. If such problems arise substantially in -other domains, we stand ready to extend this provision to those -domains in future versions of the GPL, as needed to protect the -freedom of users. - -Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish -to avoid the special danger that patents applied to a free program -could make it effectively proprietary. To prevent this, the GPL -assures that patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and -modification follow. - -### TERMS AND CONDITIONS - -#### 0. Definitions. - -"This License" refers to version 3 of the GNU General Public License. - -"Copyright" also means copyright-like laws that apply to other kinds -of works, such as semiconductor masks. - -"The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - -To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of -an exact copy. The resulting work is called a "modified version" of -the earlier work or a work "based on" the earlier work. - -A "covered work" means either the unmodified Program or a work based -on the Program. - -To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - -To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user -through a computer network, with no transfer of a copy, is not -conveying. - -An interactive user interface displays "Appropriate Legal Notices" to -the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - -#### 1. Source Code. - -The "source code" for a work means the preferred form of the work for -making modifications to it. "Object code" means any non-source form of -a work. - -A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - -The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - -The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can -regenerate automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same -work. - -#### 2. Basic Permissions. - -All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, -without conditions so long as your license otherwise remains in force. -You may convey covered works to others for the sole purpose of having -them make modifications exclusively for you, or provide you with -facilities for running those works, provided that you comply with the -terms of this License in conveying all material for which you do not -control copyright. Those thus making or running the covered works for -you must do so exclusively on your behalf, under your direction and -control, on terms that prohibit them from making any copies of your -copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the -conditions stated below. Sublicensing is not allowed; section 10 makes -it unnecessary. - -#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - -No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - -When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such -circumvention is effected by exercising rights under this License with -respect to the covered work, and you disclaim any intention to limit -operation or modification of the work as a means of enforcing, against -the work's users, your or third parties' legal rights to forbid -circumvention of technological measures. - -#### 4. Conveying Verbatim Copies. - -You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - -#### 5. Conveying Modified Source Versions. - -You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these -conditions: - -- a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. -- b) The work must carry prominent notices stating that it is - released under this License and any conditions added under - section 7. This requirement modifies the requirement in section 4 - to "keep intact all notices". -- c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. -- d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - -A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - -#### 6. Conveying Non-Source Forms. - -You may convey a covered work in object code form under the terms of -sections 4 and 5, provided that you also convey the machine-readable -Corresponding Source under the terms of this License, in one of these -ways: - -- a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. -- b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the Corresponding - Source from a network server at no charge. -- c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. -- d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. -- e) Convey the object code using peer-to-peer transmission, - provided you inform other peers where the object code and - Corresponding Source of the work are being offered to the general - public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - -A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, -family, or household purposes, or (2) anything designed or sold for -incorporation into a dwelling. In determining whether a product is a -consumer product, doubtful cases shall be resolved in favor of -coverage. For a particular product received by a particular user, -"normally used" refers to a typical or common use of that class of -product, regardless of the status of the particular user or of the way -in which the particular user actually uses, or expects or is expected -to use, the product. A product is a consumer product regardless of -whether the product has substantial commercial, industrial or -non-consumer uses, unless such uses represent the only significant -mode of use of the product. - -"Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to -install and execute modified versions of a covered work in that User -Product from a modified version of its Corresponding Source. The -information must suffice to ensure that the continued functioning of -the modified object code is in no case prevented or interfered with -solely because modification has been made. - -If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - -The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or -updates for a work that has been modified or installed by the -recipient, or for the User Product in which it has been modified or -installed. Access to a network may be denied when the modification -itself materially and adversely affects the operation of the network -or violates the rules and protocols for communication across the -network. - -Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - -#### 7. Additional Terms. - -"Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders -of that material) supplement the terms of this License with terms: - -- a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or -- b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or -- c) Prohibiting misrepresentation of the origin of that material, - or requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or -- d) Limiting the use for publicity purposes of names of licensors - or authors of the material; or -- e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or -- f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions - of it) with contractual assumptions of liability to the recipient, - for any liability that these contractual assumptions directly - impose on those licensors and authors. - -All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; the -above requirements apply either way. - -#### 8. Termination. - -You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - -However, if you cease all violation of this License, then your license -from a particular copyright holder is reinstated (a) provisionally, -unless and until the copyright holder explicitly and finally -terminates your license, and (b) permanently, if the copyright holder -fails to notify you of the violation by some reasonable means prior to -60 days after the cessation. - -Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - -Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - -#### 9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or run -a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - -#### 10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - -An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - -#### 11. Patents. - -A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - -A contributor's "essential patent claims" are all patent claims owned -or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - -In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - -If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - -A patent license is "discriminatory" if it does not include within the -scope of its coverage, prohibits the exercise of, or is conditioned on -the non-exercise of one or more of the rights that are specifically -granted under this License. You may not convey a covered work if you -are a party to an arrangement with a third party that is in the -business of distributing software, under which you make payment to the -third party based on the extent of your activity of conveying the -work, and under which the third party grants, to any of the parties -who would receive the covered work from you, a discriminatory patent -license (a) in connection with copies of the covered work conveyed by -you (or copies made from those copies), or (b) primarily for and in -connection with specific products or compilations that contain the -covered work, unless you entered into that arrangement, or that patent -license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - -#### 12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under -this License and any other pertinent obligations, then as a -consequence you may not convey it at all. For example, if you agree to -terms that obligate you to collect a royalty for further conveying -from those to whom you convey the Program, the only way you could -satisfy both those terms and this License would be to refrain entirely -from conveying the Program. - -#### 13. Use with the GNU Affero General Public License. - -Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - -#### 14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions -of the GNU General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in -detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies that a certain numbered version of the GNU General Public -License "or any later version" applies to it, you have the option of -following the terms and conditions either of that numbered version or -of any later version published by the Free Software Foundation. If the -Program does not specify a version number of the GNU General Public -License, you may choose any version ever published by the Free -Software Foundation. - -If the Program specifies that a proxy can decide which future versions -of the GNU General Public License can be used, that proxy's public -statement of acceptance of a version permanently authorizes you to -choose that version for the Program. - -Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - -#### 15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT -WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE -DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR -CORRECTION. - -#### 16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR -CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT -NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR -LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM -TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER -PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -#### 17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -### How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - -To do so, attach the following notices to the program. It is safest to -attach them to the start of each source file to most effectively state -the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper -mail. - -If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands \`show w' and \`show c' should show the -appropriate parts of the General Public License. Of course, your -program's commands might be different; for a GUI interface, you would -use an "about box". - -You should also get your employer (if you work as a programmer) or -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. For more information on this, and how to apply and follow -the GNU GPL, see . - -The GNU General Public License does not permit incorporating your -program into proprietary programs. If your program is a subroutine -library, you may consider it more useful to permit linking proprietary -applications with the library. If this is what you want to do, use the -GNU Lesser General Public License instead of this License. But first, -please read . \ No newline at end of file + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + diff --git a/commande/setup.asm b/install/setup.asm similarity index 100% rename from commande/setup.asm rename to install/setup.asm diff --git a/cos.bmp b/programs/cos.bmp similarity index 100% rename from cos.bmp rename to programs/cos.bmp diff --git a/cos.rip b/programs/cos.rip similarity index 100% rename from cos.rip rename to programs/cos.rip diff --git a/programs/lpt/com.asm b/programs/lpt/com.asm new file mode 100755 index 0000000..d9b7f42 --- /dev/null +++ b/programs/lpt/com.asm @@ -0,0 +1,471 @@ +.model tiny +.486 +smart +.code +org 0100h +start: +;call setemettor +call getfirstlpt +call initlpt +call receivecommand +ret + + + +gogo db 'Salut' +gotoz db 23 dup (0) + +;Re‡ois une commande et l'execute +Receivecommand: +push ax bx cx di es +push cs +pop es +mov di,offset command +call receivelptblock +mov bl,al +xor bh,bh +shl bx,1 +add bx,offset cmd +call [bx] +pop es di cx ax +ret +command db 25 dup (0) +cmd dw nothings + dw sendram + +nothings: +ret + +Sendram: +push ax cx si ds +mov ax,es:[di] +mov si,ax +mov ax,es:[di+2] +mov ds,ax +mov cx,es:[di+2] +call sendlptblock +pop ds si cx ax +ret + + +;---------Segment Adress----------- +Bios equ 040h +;---------Offset Adress------------ +Lptadr equ 008h +Timer equ 06Ch +;---------Constant----------------- +onesec equ 18 +tensec equ 182 +Ack equ 00 +Nack equ 0FFh +maxtry equ 10 +tokenstart equ 0 +tokennext equ 1 +tokenstop equ 2 +tokenbad equ 3 +tokenresend equ 4 + + +Initlpt: +push ax ecx +call StartTimer +cmp emettor,0 +je receptinit +mov al,10000b +call SetLptOut +waitinit1: +call EndTimer +cmp cx,cs:timeout +ja errorinit +call getlptIn +cmp al,00000b +jnz waitinit1 +jmp endinit +receptinit: +call EndTimer +cmp cx,cs:timeout +ja errorinit +call getlptIn +cmp al,00000b +jnz receptinit +mov al,10000b +call SetLptOut +endinit: +clc +pop ecx ax +ret +errorinit: +stc +pop ecx ax +ret + + +;-Envoie DL (dh) JNE si problŠme JNC error timeout +Sendlpt: +push ax bx ecx +call StartTimer +mov dh,dl +mov al,dl +and al,0Fh +call SetLptOut +waitSend: +call EndTimer +cmp cx,cs:timeout +ja errorsend +call getlptIn +bt ax,4 +jnc waitsend +and al,0Fh +mov bl,al +call StartTimer ;///// +mov al,dh +shr al,4 +or al,10000b +call SetLptOut +waitSend2: +call EndTimer +cmp cx,cs:timeout +ja errorsend +call getlptIn +bt ax,4 +jc waitsend2 +and al,0Fh +shl al,4 +add bl,al +cmp dl,bl +pop ecx bx ax +clc +ret +errorsend: +pop ecx bx ax +stc +ret + + +;-Re‡ois DL (dh) +Receivelpt: +push ax bx ecx +call StartTimer +waitreceive: +call EndTimer +cmp cx,cs:timeout +ja errorreceive +call getlptIn +bt ax,4 +jnc waitreceive +and al,0Fh +mov dl,al +call SetLptOut +call StartTimer ;///// +waitreceive2: +call EndTimer +cmp cx,cs:timeout +ja errorreceive +call getlptIn +bt ax,4 +jc waitreceive2 +and al,0Fh +mov dh,al +shl dh,4 +add dl,dh +or al,10000b +call SetlptOut +clc +pop ecx bx ax +ret +errorreceive: +stc +pop ecx bx ax +ret + +;-AX +SetTimeout: +mov cs:Timeout,ax +ret + +timeout dw tensec + +getTimeout: +mov ax,cs:Timeout +ret + +SetEmettor: +mov cs:Emettor,1 +ret + +Emettor db 0 + +SetReceptor: +mov cs:Emettor,0 +ret + +;->bx Nøport->Adresse dx +GetLpt: +push ax bx ds +mov ax,bios +mov ds,ax +dec bx +shl bx,1 +mov dx,ds:[Lptadr+bx] +mov cs:lpt,dx +pop ds bx ax +ret +lpt dw 0 + +;->bx Nøport->Adresse dx +GetFirstLpt: +push ax ds +mov ax,bios +mov ds,ax +xor bx,bx +findlpt: +mov dx,ds:[Lptadr+bx] +cmp dx,0 +jne oklpt +add bx,2 +cmp bx,4 +jbe findlpt +oklpt: +mov cs:lpt,dx +pop ds ax +ret + +;-> +StartTimer: +push ax ecx ds +mov ax,Bios +mov ds,ax +mov ecx,ds:[timer] +mov times,ecx +pop ds ecx ax +ret +times dd 0 + +;->Ecx time elapsed +EndTimer: +push ax ds +mov ax,Bios +mov ds,ax +mov ecx,ds:[timer] +sub ecx,times +mov ecx,0 +pop ds ax +ret + +;-> +GetLptOut: +push dx +mov dx,lpt +in al,dx +pop dx +ret + +GetLptIn: +push dx +mov dx,lpt +inc dx +in al,dx +shr al,3 +pop dx +ret + +GetLptInOut: +push dx +mov dx,lpt +add dx,2 +in al,dx +and al,11111b +pop dx +ret + +SetLptOut: +push dx +mov dx,lpt +out dx,al +pop dx +ret + +SetLptIn: +push dx +mov dx,lpt +inc dx +out dx,al +pop dx +ret + +SetLptInOut: +push dx +mov dx,lpt +add dx,2 +out dx,al +pop dx +ret + +;R‚alise un checksum 8 bits sur donn‚es DS:SI, nb CX r‚sultat dans dl +Checksum8: +push cx si +check: +add dl,[si] +inc si +dec cx +jnz check +pop si cx +ret + +;DS:SI pointeur sur donn‚es, CX nombres de donn‚es, AL token +SendLptBlock: +push ax bx cx edx si edi bp +mov dx,cx +shl edx,16 +mov dh,al +call checksum8 +mov edi,edx +xor dh,dh +mov bp,dx +mov ah,maxtry +retry: +mov bl,4 +xor al,al +header: +mov dx,di +call sendlpt +setne al +jc outt +rol edi,8 +dec bl +jnz header +cmp al,0 +jne notgood +mov dl,ACK +jmp allsend +notgood: +mov dl,NACK +allsend: +call sendlpt +setne al +jc outt +cmp al,0 +je okheader +dec ah +jnz retry +jmp outt +okheader: +cmp cx,0 +je endoftrans +mov di,maxtry +retry2: +mov bx,cx +xor ax,ax +body: +mov dl,[si+bx-1] +add ah,dl +call sendlpt +setne al +jc outt +dec bx +jnz body +cmp al,0 +jne notgood2 +mov dl,ACK +jmp allisend +notgood2: +mov dl,NACK +allisend: +call sendlpt +setne al +jc outt +cmp al,0 +je endoftrans +dec di +jnz retry2 +outt: +stc +endoftrans: +mov al,ah +xor ah,ah +cmp bp,ax +pop bp edi si edx cx bx ax +ret + +;Receptionne en es:di les donn‚es au nombres de CX token AL (AH) (ECX) +receiveLptBlock: +push ax bx dx si bp +mov ah,maxtry +retrye: +mov bl,4 +headere: +call receivelpt +jc outte +mov cl,dl +rol ecx,8 +dec bl +jnz headere +call receivelpt +jc outte +cmp dl,ACK +je okheadere +dec ah +jnz retrye +jmp outte +okheadere: +mov al,ch +xor ch,ch +mov bp,cx +rol ecx,16 +cmp cx,0 +je endoftranse +mov si,maxtry +retrye2: +mov bx,cx +xor ah,ah +bodye: +call receivelpt +jc outte +mov es:[di+bx-1],dl +add ah,dl +dec bx +jnz bodye +call receivelpt +jc outte +cmp dl,ACK +je endoftranse +dec si +jnz retrye2 +outte: +stc +endoftranse: +mov bl,ah +xor bh,bh +cmp bp,bx +pop bp si dx bx ax +ret + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +end start; diff --git a/programs/lpt/project1.dpr b/programs/lpt/project1.dpr new file mode 100755 index 0000000..e4396d5 --- /dev/null +++ b/programs/lpt/project1.dpr @@ -0,0 +1,12 @@ +program Project1; + +uses + Forms, + Unit1 in 'UNIT1.PAS' {Form1}; + +{$R *.RES} + +begin + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/programs/lpt/project1.opt b/programs/lpt/project1.opt new file mode 100755 index 0000000..8aea239 --- /dev/null +++ b/programs/lpt/project1.opt @@ -0,0 +1,34 @@ +[Compiler] +A=1 +B=0 +D=1 +F=0 +I=1 +K=1 +L=1 +P=1 +Q=0 +R=0 +S=1 +T=0 +U=1 +V=1 +W=0 +X=1 +Y=1 + +[Linker] +MapFile=0 +LinkBuffer=0 +DebugInfo=0 +OptimizeExe=0 +StackSize=16384 +HeapSize=8192 + +[Directories] +OutputDir= +SearchPath= +Conditionals= + +[Parameters] +RunParams= diff --git a/programs/lpt/project1.res b/programs/lpt/project1.res new file mode 100755 index 0000000000000000000000000000000000000000..ab74376341da27109e2591593a13aa146d4417ea GIT binary patch literal 794 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 literal 0 HcmV?d00001 diff --git a/programs/lpt/unit1.pas b/programs/lpt/unit1.pas new file mode 100755 index 0000000..9546011 --- /dev/null +++ b/programs/lpt/unit1.pas @@ -0,0 +1,517 @@ +unit Unit1; + +interface + +uses + SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, + Forms, Dialogs, StdCtrls, Grids, Outline, DirOutln, FileCtrl, Buttons, + Gauges, ExtCtrls, Spin, Mask; + +type + TForm1 = class(TForm) + DriveComboBox1: TDriveComboBox; + FilterComboBox1: TFilterComboBox; + FileListBox1: TFileListBox; + DirectoryListBox1: TDirectoryListBox; + SpeedButton1: TSpeedButton; + SpeedButton2: TSpeedButton; + Memo1: TMemo; + Memo2: TMemo; + Memo3: TMemo; + SpeedButton3: TSpeedButton; + SpeedButton4: TSpeedButton; + Gauge1: TGauge; + SpeedButton5: TSpeedButton; + SpeedButton6: TSpeedButton; + SpinButton1: TSpinButton; + MaskEdit1: TMaskEdit; + SpeedButton8: TSpeedButton; + SpinButton2: TSpinButton; + okm: TCheckBox; + Label1: TLabel; + procedure FormActivate(Sender: TObject); + procedure SpinButton1DownClick(Sender: TObject); + procedure SpinButton1UpClick(Sender: TObject); + procedure showadress(Sender: TObject); + procedure SpeedButton6Click(Sender: TObject); + procedure SpeedButton8Click(Sender: TObject); + procedure MaskEdit1Change(Sender: TObject); + procedure SpinButton2DownClick(Sender: TObject); + procedure SpinButton2UpClick(Sender: TObject); + procedure SpeedButton3Click(Sender: TObject); + procedure Memo2Click(Sender: TObject); + + private + { Private-déclarations } + public + { Public-déclarations } + end; + +const UNESEC = 1000; + DIXSEC = 4000; + ACK = $00; + NAK = $FF; + MAXTRY = 5; + +type DBloc = array[ 1..15534 ] of byte; +type BHEADER = record + case boolean of + true : ( Checksum:byte; + Lenb : byte; + Lenh : byte; + Token : byte; + + ); + false : ( Champ : array[ 0..3 ] of byte ); + end; + +var + Form1: TForm1; + Inlpt : word; + Outlpt : word; + times : longint; + Block : DBLOC; + adress :longint; + errors: boolean; + reste:integer; + pop:boolean; + +implementation + +{$R *.DFM} + +function Getlpt( Number : integer ) : boolean; +begin + Outlpt := MemW[ $0040: 6 + Number * 2 ]; + if ( Outlpt <> 0 ) then + begin + Inlpt := Outlpt + 1; + Getlpt := TRUE; + end + else + Getlpt := FALSE; +end; + +function getfirstlpt:byte; +var i:integer; +begin +i:=1; + while (not(getlpt(i)) or (i>4)) do inc(i); + if (getlpt(i)=false) then i:=0; + getfirstlpt:= i; +end; + +function getb:byte; +begin + getb:=port[inlpt] and $F8 +end; + +procedure putb(what:byte); +begin + port[outlpt]:=what; +end; + +procedure starttimer; +begin + times:=GetTickCount; +end; + +function endtimer:longint; +begin + endtimer:=getTickCount-times; +end; + +function Initlpt( Emetteur : boolean ) : boolean; +begin + errors:=false; + putb($10); + putb($18); + putb($10); + starttimer; + if ( Emetteur ) then + begin + while ( ( GetB <> $00 ) and ( Endtimer <= DIXSEC ) ) do; + end + else + begin + while ( ( GetB <> $00 ) and ( Endtimer <= DIXSEC ) ) do; + PutB( $10 ); + end; + Initlpt := ( Endtimer <= DIXSEC ); +end; + +function sendlpt( Wert : byte ) : boolean; +var Retour : byte; +label fin; +begin +if errors then goto fin; + Starttimer; + PutB( Wert and $0F ); + while ( ( ( GetB and 128 ) = 0 ) and ( Endtimer <= DIXSEC )) do; + if ( Endtimer > DIXSEC ) then + begin + errors:=true; + goto fin; + end; + Retour := ( GetB shr 3 ) and $0F; + Starttimer; + PutB( ( Wert shr 4 ) or $10 ); + while ( ( ( GetB and 128 ) <> 0 ) and ( Endtimer <= DIXSEC ) ) do + if ( Endtimer > DIXSEC ) then + begin + errors:=true; + goto fin; + end; + Retour := Retour or ( ( GetB shl 1 ) and $F0 ); + fin: + sendlpt := ( Wert = Retour ); +end; + +function receivelpt : byte; +var LoNib, + HiNib : byte; +label fin; +begin + if errors then goto fin; + Starttimer; + while ( ( ( GetB and 128 ) = 0 ) and ( Endtimer <= DIXSEC )) do; + if ( Endtimer > DIXSEC ) then + begin + errors:=true; + goto fin; + end; + LoNib := ( GetB shr 3 ) and $0F; + PutB( LoNib ); + Starttimer; + while ( ( ( GetB and 128 ) <> 0 ) and ( Endtimer <= DIXSEC ) ) do; + if ( Endtimer > DIXSEC ) then + begin + errors:=true; + goto fin; + end; + HiNib := ( GetB shl 1 ) and $F0; + PutB( ( HiNib shr 4 ) or $10 ); + fin: + receivelpt := ( LoNib or HiNib ); +end; + +function checksum8(Nombre:word;Dptr : pointer):byte ; +var donnees : ^DBloc ; + i:word; + ch:byte; +begin +ch:=0; +donnees:=dptr; + for i:=1 to Nombre do ch:=ch + Donnees^[ i ]; + checksum8:=ch; + end; + +function SendlptBlock( Token : byte; + Nombre : word; + Dptr : pointer ):boolean; +var header : BHEADER; + ok : boolean; + i : word; + trys : word; + Donnees : ^DBloc; + label fin; +begin + form1.gauge1.visible:=true; + header.Token := Token; + header.Lenb := (Nombre and $FF00) shr 8; + header.Lenh := Nombre and $FF; + header.Checksum:=checksum8(nombre,Dptr); + trys := MAXTRY; + repeat + ok := TRUE; + for i := 0 to 3 do + ok := ok and sendlpt( Header.Champ[ i ] ); + if ( ok ) then + ok := ok and sendlpt( ACK ) + else + ok := ok and sendlpt( NAK ); + if ( not ok ) then + dec( trys ); + until ( ( ok ) or ( trys = 0 ) or (errors)); + if ( (trys = 0) or (errors)) then + begin + goto fin; + SendlptBlock:=false; + end; + if ( Nombre > 0 ) then + begin + Donnees := DPTR; + trys := MAXTRY; + repeat + ok := TRUE; + for i := Nombre downto 1 do + begin + ok := ok and sendlpt( Donnees^[ i ] ); + reste:=trunc(100-i/nombre*100); + form1.gauge1.progress:=reste + end; + if ( ok ) then + ok := ok and sendlpt( ACK ) + else + ok := ok and sendlpt( NAK ); + if ( not ok ) then + dec( trys ); + until ( ( ok ) or ( trys = 0 ) or (errors)); + if ( (trys = 0) or (errors)) then + begin + goto fin; + SendlptBlock:=false; + end; + end; + SendlptBlock:=true; + fin: + form1.gauge1.visible:=false; +end; + +function ReceivelptBlock( var Token : byte; + var Len : word; + Dptr : pointer ):boolean; +var header : BHEADER; + ok : boolean; + i : word; + trys : word; + EscapeStatus : boolean; + ByteBuffer : byte; + Donnees : ^DBloc; + label fin,good; +begin + form1.gauge1.visible:=true; + trys := MAXTRY; + repeat + for i:= 0 to 3 do + Header.Champ[ i ] := receivelpt; + ByteBuffer := receivelpt; + if ( ByteBuffer <> ACK ) then + dec( trys ); + until ( ( trys = 0 ) or ( ByteBuffer = ACK ) or (errors)); + if ( (trys = 0) or (errors)) then + begin + goto fin; + receivelptblock:=false; + end; + Token := Header.Token; + Len := Header.Lenh+(Header.Lenb shl 8); + if ( Len > 0 ) then + begin + Donnees := Dptr; + trys := MAXTRY; + repeat + for i := len downto 1 do + begin + Donnees^[ i ] := receivelpt; + reste:=trunc(100-i/len*100); + form1.gauge1.progress:=reste + end; + ByteBuffer := receivelpt; + if ( ByteBuffer <> ACK ) then + dec( trys ); + until ( ( trys = 0 ) or ( ByteBuffer = ACK ) ); + if ( trys = 0 ) then + begin + goto fin; + receivelptblock:=false; + end; + end; + receivelptblock:=true; + fin: + form1.gauge1.visible:=false; +end; + + +function Sendfile(name:string):boolean; +var lus:word; +Fichier:file; +begin +assign( Fichier, Name ); +reset( Fichier, 1 ); +Blockread( Fichier, Block, 15000, Lus ); +if lus>0 then +Sendfile:=SendlptBlock( 1, Lus, @Block ) +else +Sendfile:=false; +end; + +procedure TForm1.FormActivate(Sender: TObject); +begin +adress:=0; +showadress(sender); +Memo2Click(Sender); +SpeedButton8Click(Sender); +pop:=true; +end; + +procedure TForm1.SpinButton1DownClick(Sender: TObject); +begin +if (adress>0) and okm.checked then +begin +dec(adress); +SpeedButton6Click(Sender); +end; +end; + +procedure TForm1.SpinButton1UpClick(Sender: TObject); +begin +if (adress<65536*16) and okm.checked then +begin +inc(adress); +SpeedButton6Click(Sender); +end; +end; + +function hextoint(hex:string;n:word):longint; +var +resu,exp:longint; +i:word; +begin + hex :=UpperCase(hex); + resu:=0; + exp:=1; + for i:=n downto 1 do + begin + resu:=resu+(Pos(hex[i],'0123456789ABCDEF')-1)*(exp); + exp:=exp*16 + end; + hextoint:=resu; + end ; + + function adresstoint(hex:string):longint; +begin +adresstoint:=hextoint(Copy(hex, 1, 4),4)shl 4 + hextoint(Copy(hex, length(hex)-3, 4),4) +end; + +procedure TForm1.showadress(Sender: TObject); +var i,j,adh,adl:word; +adress2:longint; +old,old2:string; +begin +memo1.clear; +memo2.clear; +memo3.clear; +for i:=0 to 29 do +begin +adress2:=adress+i*16; +adl:=adress2 and $FFFF; +adh:=(adress2 and $F0000) shr 4; +memo1.lines.add(IntToHex(adh,4)+':'+IntToHex(adl,4)) ; +old:=''; +old2:=''; +for j:=1 to 16 do +begin +old:=old+inttohex(block[i*16+j],2); +if block[i*16+j]=0 then +old2:=old2+'.' +else +old2:=old2+char(block[i*16+j]) ; +if j mod 2=0 then old:=old+' '; +end; +memo2.lines.add(old) ; +memo3.lines.add(old2) ; +end +end; + +procedure TForm1.SpeedButton8Click(Sender: TObject); +begin +if getfirstlpt=0 then showmessage('Pas de port parallèle détecté'); +errors:=false; +end; + +procedure TForm1.SpeedButton6Click(Sender: TObject); +var adl,adh,good:word; +tok:byte; +ok:boolean; +begin +if (inlpt=0) then SpeedButton8Click(sender); +if ((inlpt<>0) and (initlpt(true))) then +begin + adl:=adress and $FFFF; + adh:=(adress and $F0000) shr 4; +Block[1]:=lo(adl); +Block[2]:= hi(adl); +Block[3]:= lo(adh); +Block[4]:= hi(adh); +Block[5]:= lo(512); +Block[6]:= hi(512) ; +ok:=false; +if SendlptBlock( 1,6,@Block) then ok:=receivelptBlock(tok,good ,@Block); {demande de RAM} +if not(ok) or errors then Showmessage('Erreur de transmission !!!!!!!!!!'); +showadress(sender); +end +else +Showmessage('Pas de PC distant'); +putb($08); +errors:=false; +end; + +procedure TForm1.MaskEdit1Change(Sender: TObject); +begin +if pop then +begin +adress:=adresstoint(maskedit1.text); +if okm.checked=true then SpeedButton6Click(sender); +showadress(sender); +end; +end; + +procedure TForm1.SpinButton2DownClick(Sender: TObject); +begin + if (adress+16*30<=65536*16) and okm.checked then + begin + adress:=adress+16*30; +SpeedButton6Click(Sender); +end; +end; + +procedure TForm1.SpinButton2UpClick(Sender: TObject); +begin + if (adress-16*30>=0) and okm.checked then + begin + adress:=adress-16*30; +SpeedButton6Click(Sender); +end; +end; +procedure TForm1.SpeedButton3Click(Sender: TObject); +var adl,adh,good:word; +adress2:longint; +tok:byte; +ok:boolean; +begin +if (inlpt=0) then SpeedButton8Click(sender); +if ((inlpt<>0) and (initlpt(true))) then +begin + adress2 :=adresstoint(maskedit1.text); + adl:=adress2 and $FFFF; + adh:=(adress2 and $F0000) shr 4; +Block[1]:=lo(adl); +Block[2]:= hi(adl); +Block[3]:= lo(adh); +Block[4]:= hi(adh); +ok:=SendlptBlock( 7,4,@Block); +if not(ok) or errors then Showmessage('Erreur de transmission !!!!!!!!!!'); +end +else +Showmessage('Pas de PC distant'); +putb($18); +errors:=false; +end; +procedure TForm1.Memo2Click(Sender: TObject); +var ligne,col,pos,adl,adh:word; +adress2:longint; +begin + ligne:=memo2.selstart div 42; + col:= (trunc((memo2.selstart mod 42+1) / 2.5)); + pos:=16*ligne+col; + label1.caption:=inttostr(ligne)+':'+inttostr(col)+':'+inttostr(pos); + adress2:=pos+adress; + adl:=adress2 and $FFFF; + adh:=(adress2 and $F0000) shr 4; + pop:=false; + maskedit1.text:=inttohex(adh,4)+':'+inttohex(adl,4); + pop:=true; +end; + +end. From 5a236568242400e487c58a2132cf569562743fd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sat, 12 Jun 2004 21:34:04 +0000 Subject: [PATCH 13/17] refactor: Passage aux outils GNU (Cygwin, make) BREAKING CHANGE: attention modification majeure du code --- API.md | 97 - INFORMATIONS.md | 321 ++- LICENSE.md | 1017 ++++--- MAKEFILE | 52 + commande/MAKEFILE | 17 + commande/asm.bat | 54 - commande/clean.bat | 3 - commande/{prompt.asm => commande.asm} | 714 +++-- commande/debog.bat | 2 - commande/str0.asm | 1702 ++++++------ commande/test.asm | 25 + commande/write.bat | 4 - contribs/MAKEFILE | 20 + contribs/ex-nasm.asm | 14 + contribs/ex-tasm.asm | 19 + include/bmp.h | 40 + include/fat.h | 58 + include/pci.h | 19 + include/pol8x16.inc | 256 ++ include/pol8x8.inc | 128 + install/MAKEFILE | 16 + install/setup.asm | 620 ++--- noyau/8237.asm | 266 ++ noyau/{pic8259a.asm => 8259a.asm} | 482 ++-- noyau/MAKEFILE | 67 + noyau/asm.bat | 55 - noyau/asmsys.bat | 11 - noyau/boot.asm | 440 +-- noyau/{keyboard.asm => clavier.asm} | 426 +-- noyau/clean.bat | 3 - noyau/debog.bat | 2 - noyau/disque.asm | 964 +++++++ noyau/drive.asm | 505 ---- noyau/font/2_hebrew.fnt | Bin 0 -> 4096 bytes noyau/font/8x11snsf.fnt | Bin 0 -> 4096 bytes noyau/font/ad&d.fnt | Bin 0 -> 8192 bytes noyau/font/antique.fnt | Bin 0 -> 8192 bytes noyau/font/applicat.fnt | Bin 0 -> 3584 bytes noyau/font/backward.fnt | Bin 0 -> 4096 bytes noyau/font/bigserif.fnt | Bin 0 -> 4096 bytes noyau/font/blcksnsf.fnt | Bin 0 -> 4096 bytes noyau/font/block.fnt | Bin 0 -> 4096 bytes noyau/font/bold.fnt | Bin 0 -> 4096 bytes noyau/font/breeze.fnt | Bin 0 -> 4096 bytes noyau/font/broadway.fnt | Bin 0 -> 4096 bytes noyau/font/comp.fnt | Bin 0 -> 4096 bytes noyau/font/computer.fnt | Bin 0 -> 8192 bytes noyau/font/courier.fnt | Bin 0 -> 4096 bytes noyau/font/cyrillic.fnt | Bin 0 -> 4096 bytes noyau/font/dblmtx14.fnt | Bin 0 -> 3584 bytes noyau/font/dblmtx16.fnt | Bin 0 -> 4096 bytes noyau/font/finnish.fnt | Bin 0 -> 4096 bytes noyau/font/font1!!!.dat | Bin 0 -> 4096 bytes noyau/font/font2!!!.dat | Bin 0 -> 4096 bytes noyau/font/font3!!!.dat | Bin 0 -> 4096 bytes noyau/font/font4!!!.dat | Bin 0 -> 4096 bytes noyau/font/frankfrt.fnt | Bin 0 -> 8192 bytes noyau/font/fresno.fnt | Bin 0 -> 8192 bytes noyau/font/future.fnt | Bin 0 -> 4096 bytes noyau/font/greek.fnt | Bin 0 -> 4096 bytes noyau/font/hebrew.fnt | Bin 0 -> 4096 bytes noyau/font/hollow.fnt | Bin 0 -> 4096 bytes noyau/font/hylas.fnt | Bin 0 -> 4096 bytes noyau/font/inverted.fnt | Bin 0 -> 4096 bytes noyau/font/italic.fnt | Bin 0 -> 8192 bytes noyau/font/italics.fnt | Bin 0 -> 4096 bytes noyau/font/itt.fnt | Bin 0 -> 4096 bytes noyau/font/lcd.fnt | Bin 0 -> 8192 bytes noyau/font/mechanix.fnt | Bin 0 -> 4096 bytes noyau/font/medieval.fnt | Bin 0 -> 8192 bytes noyau/font/modern-1.fnt | Bin 0 -> 4096 bytes noyau/font/norway.fnt | Bin 0 -> 4096 bytes noyau/font/norway2.fnt | Bin 0 -> 4096 bytes noyau/{thin8x8.fnt => font/old8x8.fnt} | Bin noyau/font/oldeng.fnt | Bin 0 -> 8192 bytes noyau/font/roman.fnt | Bin 0 -> 4096 bytes noyau/font/sanserif.fnt | Bin 0 -> 4096 bytes noyau/font/script.fnt | Bin 0 -> 8192 bytes noyau/font/standard.fnt | Bin 0 -> 8192 bytes noyau/font/stretch.fnt | Bin 0 -> 4096 bytes noyau/font/thai.fnt | Bin 0 -> 4096 bytes noyau/font/thin.fnt | Bin 0 -> 4096 bytes noyau/format.asm | 911 +++++++ noyau/{hours.asm => heure.asm} | 162 +- noyau/{timer.asm => horloge.asm} | 64 +- noyau/{joystick.asm => manette.asm} | 596 ++--- noyau/mcb.asm | 119 + noyau/old8x8.fnt | Bin 2048 -> 0 bytes noyau/{lpt.asm => port.asm} | 1398 +++++----- noyau/{mouse.asm => souris.asm} | 654 ++--- noyau/system.asm | 676 ----- noyau/systeme.asm | 897 +++++++ noyau/systeme.ini | 7 + noyau/video.asm | 3381 +++++++++++++----------- noyau/write.bat | 4 - outils/exe2boot.asm | 67 - outils/rip.asm | 108 - outils/unrip.asm | 88 - programs/MAKEFILE | 57 + programs/asm.bat | 54 - programs/clean.bat | 3 - programs/cos.bmp | Bin 65078 -> 0 bytes programs/cos.rip | Bin programs/debog.bat | 2 - programs/detect.asm | 606 +++++ programs/{editor.asm => editeur.asm} | 787 +++--- programs/gestion.asm | 194 ++ programs/logo.asm | 128 +- programs/lpt/com.asm | 942 +++---- programs/lpt/project1.dpr | 24 +- programs/lpt/project1.opt | 68 +- programs/lpt/project1.res | Bin programs/lpt/unit1.dcu | Bin programs/lpt/unit1.dfm | Bin programs/lpt/unit1.pas | 1034 ++++---- programs/mous.asm | 41 - programs/pmode.asm | 30 +- programs/souris.asm | 13 + programs/test.asm | 705 ++--- programs/{verif.asm => verifier.asm} | 302 +-- programs/{disk.asm => volume.asm} | 774 +++--- programs/write.bat | 4 - 122 files changed, 13552 insertions(+), 9767 deletions(-) delete mode 100755 API.md mode change 100755 => 100644 INFORMATIONS.md mode change 100755 => 100644 LICENSE.md create mode 100644 MAKEFILE create mode 100644 commande/MAKEFILE delete mode 100755 commande/asm.bat delete mode 100755 commande/clean.bat rename commande/{prompt.asm => commande.asm} (62%) mode change 100755 => 100644 delete mode 100755 commande/debog.bat mode change 100755 => 100644 commande/str0.asm create mode 100644 commande/test.asm delete mode 100755 commande/write.bat create mode 100644 contribs/MAKEFILE create mode 100644 contribs/ex-nasm.asm create mode 100644 contribs/ex-tasm.asm create mode 100644 include/bmp.h create mode 100644 include/fat.h create mode 100644 include/pci.h create mode 100644 include/pol8x16.inc create mode 100644 include/pol8x8.inc create mode 100644 install/MAKEFILE mode change 100755 => 100644 install/setup.asm create mode 100644 noyau/8237.asm rename noyau/{pic8259a.asm => 8259a.asm} (94%) mode change 100755 => 100644 create mode 100644 noyau/MAKEFILE delete mode 100755 noyau/asm.bat delete mode 100755 noyau/asmsys.bat mode change 100755 => 100644 noyau/boot.asm rename noyau/{keyboard.asm => clavier.asm} (91%) mode change 100755 => 100644 delete mode 100755 noyau/clean.bat delete mode 100755 noyau/debog.bat create mode 100644 noyau/disque.asm delete mode 100755 noyau/drive.asm create mode 100644 noyau/font/2_hebrew.fnt create mode 100644 noyau/font/8x11snsf.fnt create mode 100644 noyau/font/ad&d.fnt create mode 100644 noyau/font/antique.fnt create mode 100644 noyau/font/applicat.fnt create mode 100644 noyau/font/backward.fnt create mode 100644 noyau/font/bigserif.fnt create mode 100644 noyau/font/blcksnsf.fnt create mode 100644 noyau/font/block.fnt create mode 100644 noyau/font/bold.fnt create mode 100644 noyau/font/breeze.fnt create mode 100644 noyau/font/broadway.fnt create mode 100644 noyau/font/comp.fnt create mode 100644 noyau/font/computer.fnt create mode 100644 noyau/font/courier.fnt create mode 100644 noyau/font/cyrillic.fnt create mode 100644 noyau/font/dblmtx14.fnt create mode 100644 noyau/font/dblmtx16.fnt create mode 100644 noyau/font/finnish.fnt create mode 100644 noyau/font/font1!!!.dat create mode 100644 noyau/font/font2!!!.dat create mode 100644 noyau/font/font3!!!.dat create mode 100644 noyau/font/font4!!!.dat create mode 100644 noyau/font/frankfrt.fnt create mode 100644 noyau/font/fresno.fnt create mode 100644 noyau/font/future.fnt create mode 100644 noyau/font/greek.fnt create mode 100644 noyau/font/hebrew.fnt create mode 100644 noyau/font/hollow.fnt create mode 100644 noyau/font/hylas.fnt create mode 100644 noyau/font/inverted.fnt create mode 100644 noyau/font/italic.fnt create mode 100644 noyau/font/italics.fnt create mode 100644 noyau/font/itt.fnt create mode 100644 noyau/font/lcd.fnt create mode 100644 noyau/font/mechanix.fnt create mode 100644 noyau/font/medieval.fnt create mode 100644 noyau/font/modern-1.fnt create mode 100644 noyau/font/norway.fnt create mode 100644 noyau/font/norway2.fnt rename noyau/{thin8x8.fnt => font/old8x8.fnt} (100%) mode change 100755 => 100644 create mode 100644 noyau/font/oldeng.fnt create mode 100644 noyau/font/roman.fnt create mode 100644 noyau/font/sanserif.fnt create mode 100644 noyau/font/script.fnt create mode 100644 noyau/font/standard.fnt create mode 100644 noyau/font/stretch.fnt create mode 100644 noyau/font/thai.fnt create mode 100644 noyau/font/thin.fnt create mode 100644 noyau/format.asm rename noyau/{hours.asm => heure.asm} (94%) mode change 100755 => 100644 rename noyau/{timer.asm => horloge.asm} (93%) mode change 100755 => 100644 rename noyau/{joystick.asm => manette.asm} (94%) mode change 100755 => 100644 create mode 100644 noyau/mcb.asm delete mode 100755 noyau/old8x8.fnt rename noyau/{lpt.asm => port.asm} (92%) mode change 100755 => 100644 rename noyau/{mouse.asm => souris.asm} (95%) mode change 100755 => 100644 delete mode 100755 noyau/system.asm create mode 100644 noyau/systeme.asm create mode 100644 noyau/systeme.ini mode change 100755 => 100644 noyau/video.asm delete mode 100755 noyau/write.bat delete mode 100755 outils/exe2boot.asm delete mode 100755 outils/rip.asm delete mode 100755 outils/unrip.asm create mode 100644 programs/MAKEFILE delete mode 100755 programs/asm.bat delete mode 100755 programs/clean.bat delete mode 100755 programs/cos.bmp mode change 100755 => 100644 programs/cos.rip delete mode 100755 programs/debog.bat create mode 100644 programs/detect.asm rename programs/{editor.asm => editeur.asm} (91%) mode change 100755 => 100644 create mode 100644 programs/gestion.asm mode change 100755 => 100644 programs/logo.asm mode change 100755 => 100644 programs/lpt/com.asm mode change 100755 => 100644 programs/lpt/project1.dpr mode change 100755 => 100644 programs/lpt/project1.opt mode change 100755 => 100644 programs/lpt/project1.res mode change 100755 => 100644 programs/lpt/unit1.dcu mode change 100755 => 100644 programs/lpt/unit1.dfm mode change 100755 => 100644 programs/lpt/unit1.pas delete mode 100755 programs/mous.asm mode change 100755 => 100644 programs/pmode.asm create mode 100644 programs/souris.asm mode change 100755 => 100644 programs/test.asm rename programs/{verif.asm => verifier.asm} (82%) mode change 100755 => 100644 rename programs/{disk.asm => volume.asm} (89%) mode change 100755 => 100644 delete mode 100755 programs/write.bat diff --git a/API.md b/API.md deleted file mode 100755 index 63371c4..0000000 --- a/API.md +++ /dev/null @@ -1,97 +0,0 @@ -Liste exhaustive des APIs supportée par cos -78 fonctions - -Drive.sys : Gestionnaires FAT,FIT et partition -Interruption 48h (Disquette uniquement) -fonctions 00h readsector - 01h writesector - 02h verifysector - 03h loadfatway - 04h loadfile - 05h compressrle - 06h decompressrle -lpt.sys : Gestionnaires port parallèle -Interruption 0Dh (LPT1) ou 0Fh (LPT2) -fonctions 00h getlptin - 01h getlptout - 02h getlptinout - 03h setlptin - 04h setlptout - 05h setlptinout - 06h getlpt - 07h getfirstlpt - 08h setemettor - 09h setreceptor - 0Ah settimeout - 0Bh gettimeout - 0Ch receivelpt - 0Dh sendlpt - 0Eh receivelptblock - 0Fh sendlptblock - 10h receivecommand - 11h sendcommand -mouse.sys : Gestionnaires souris -Interruption 74h (PS/2) -fonctions 00h cmdmouse - 01h cmdmouse2 - 02h detectmouse - 03h getmouse - 04h getmousescreen - 05h configmouse -pic8259a.sys : Gestionnaires contrôleur d'interruption programmable -Interruption 50h (Maître et esclave) -fonctions 00h enableirq - 01h disableirq - 02h readmaskirq - 03h readirr - 04h readisr - 05h installhandler - 06h replacehandler - 07h getint - 08h setint - 09h seteoi -video.sys : Gestionnaires de la carte video -Interruption 47h (VGA) -fonctions 00h setvideomode - 01h getvideomode - 02h cleartext - 03h changefont - 04h loadfont - 05h space - 06h line - 07h showchar - 08h showint - 09h showsigned - 0Ah showhex - 0Bh showbin - 0Ch showstring - 0Dh showstring0 - 0Eh showcharat - 0Fh showintat - 10h showsignedat - 11h showhexat - 12h showbinat - 13h showstringat - 14h showstring0at - 15h setcolor - 16h getcolor - 17h scrolldown - 18h getxy - 19h setxy - 1Ah savescreen - 1Bh restorescreen - 1Ch page2to1 - 1Dh page1to2 - 1Eh xchgPages - 1Fh savepage1 - 20h changelineattr - 21h waitretrace - 22h getinfos - 23h loadbmp - 24h showbmp - 25h clearscr - 26h savedac - 27h restoredac - 28h savestate - 29h restorestate - \ No newline at end of file diff --git a/INFORMATIONS.md b/INFORMATIONS.md old mode 100755 new mode 100644 index 67732ea..b6af644 --- a/INFORMATIONS.md +++ b/INFORMATIONS.md @@ -1,53 +1,268 @@ - < COS2000 the new operating system > - - -I. Présentation - - COS2000, par définition, est système d'exploitation. Celui-ci prend la direction des opérations à partir - du moment où le PC est mis sous tension (Après le BIOS). Il gère tous les périphériques rattachés au PC et -offre aux programmeurs les moyens de développer des applications compatibles en fournissant des APIs -(Application Programming Interface). COS2000 est basé sur un concept particulier qui est d'offrir aux -programmeurs un maximum de fonctions intégrées pour faciliter le travail des programmeurs et réduire la -taille des programmes. - -II. Comment l'installer ? - - Pour installer COS2000 : - - - Insérez une disquette 1.44 Mo vierge ou inutile dans votre lecteur. - - Lancez le programme SETUP.COM situé dans le dossier de COS2000. - - Si celui-ci ne détecte pas d'erreur, COS2000 est installé ! - - Pour lancer COS2000 : - - - Insérez la disquette où COS2000 est installé. - - Veillez que dans le BIOS vous puissiez démarrer à partir de A:. - - Redémarrer votre ordinateur et vous serez sur COS2000. - - Il est possible de télécharger une version plus récente de COS2000 à : - - https://github.com/dahut87/cos2000v1 - -III. Mode d'emploi - - Le COS MENU LOADER est le premier logiciel qui est lancé au démarrage. A partir de celui-ci, vous pouvez -visionner tout les fichiers présents sur votre disquette et éventuellement les exécuter s'ils possèdent -l'extension EXE . Pour cela, il suffit de sélectionner avec la ligne en surbrillance le programme à exécuter -en utilisant les flèches de direction. Pour exécuter le programmer, pressez la touche "Entrée". - - A partir du COS MENU LOADER on peut lancer un interpréteur de commandes . Celui-ci s'appelle PROMPT.EXE. -Une fois dans l'interpréteur de commande, vous pouvez tout aussi bien lancer des logiciels en saisissant leurs -noms après "COS>". - -En plus des logiciels, l'interpréteur de commandes peut exécuter 6 commandes : - - EXIT Quitte l'interpréteur - VERSION Donne la version de COS2000 - CLS Efface l'écran - REBOOT Redémarre le PC - COMMAND Donne la liste des commandes disponibles - MODE [mode] Permet de changer de mode vidéo. [mode] doit être un entier compris entre 1 et 9. les - modes au delà de 4 sont des modes graphiques à texte émulé. Il est déconseillé de les - utiliser car il est parfois impossible de revenir aux modes texte. - -Les possibilités de COS2000 sont aujourd'hui très limitées car il est en cours de développement. +![logo](https://github.com/dahut87/cos2000v1/raw/master/graphisme/logo.png) +## Documentation d'origine (importée) + +COS 2000 +Compatible Operating System + + + + Présentation + Comment l’installer + Mode d’emploi + Faire un programme pour COS + Liste des APIs + En cas de problème + + mailto:nicolas@palon.fr + + +Présentation + + COS2000, par définition, est système d'exploitation. Celui-ci prend la direction des opérations à partir du moment où le PC est mis sous tension (Après le BIOS). Il gère tous les périphériques rattachés au PC et offre aux programmeurs les moyens de développer des applications compatibles en fournissant des APIs (Application Programming Interface). COS2000 est basé sur un concept particulier qui est d'offrir aux programmeurs un maximum de fonctions intégrées pour faciliter le travail des programmeurs et réduire la taille des programmes. + +Comment l'installer ? + + Pour installer COS2000 : + + Sous dos/windows + + Insérez une disquette 1.44 Mo vierge ou inutile dans votre lecteur. + Lancez le programme SETUP.COM situé dans le dossier de COS2000. +- Si celui ci ne détecte pas d'erreur, COS2000 est installé ! + + Sous Linux + + Insérez une disquette 1.44 Mo vierge ou inutile dans votre lecteur. + Lancez le programme SETUP.SH situé dans le dossier de COS2000. +- Si celui ci ne détecte pas d'erreur, COS2000 est installé ! + + Pour lancer COS2000 : + + Insérez la disquette où COS2000 est installé. + Veillez que dans le BIOS vous puissiez démarrer à partir de A:. + Redémarrer votre ordinateur et vous serez sur COS2000. + + + +Mode d'emploi + + L’interpréteur de commande COS est le premier logiciel qui est lancé au démarrage. A partir de celui-ci vous pouvez exécuter quelques commandes ou logiciels. + +En plus des logiciels, l'interpréteur de commandes peut exécuter 6 commandes : + + QUIT + Quitte l'interpréteur. + + VERS + Donne la version de COS2000. + + EFFAC + Efface l'écran. + + REDEM + Redémarre le PC. + + CMDS + Donne la liste des commandes disponibles. + + MODE [mode] +Permet de changer de mode vidéo. [mode] doit être un entier compris entre 1 et 9. les modes au delà de 4 sont des modes graphiques à texte émulé. Il est déconseillé de les utiliser car il est parfois impossible de revenir aux modes texte. + + LIRE + Permet de lire un support disquette 1.44 Mo au format FAT12. + + CH + Change le dossier actuel vers celui spécifié. + + VOIR + Permet de lister le contenu du dossier actuel. + + +Faire un programme pour COS + + Toute contribution à COS 2000 en terme de programme est la bienvenue, un répertoire « contribs » contiendra les programmes des différents contributeurs. Aucune modification a ceux-ci ne sera faire sans l’accord explicite de l’auteur. Pour une contribution écrivez moi a l’adresse mailto:nicolas@palon.fr. + +Pour l’instant il n’y a aucun formatage particulier du code à respecter pour faire un programme pour COS 2000. Il faut pour l’instant seulement un point d’entrée en 0100h comme un .COM de dos, 64 Ko sont donc disponible au programme, la pile utilisé est celle du système d’exploitation, c’est donc le seul segment qui ne sera pas initialisé comme les autres. + + + + + + + + + +Pour clore le programme il suffit de faire un retour far. +Exemple avec un Hello Word. + + Avec tasm + +.model tiny ;model tiny (.com) +.486 ;Pour processeur 80486 +Smart ;Optimisations +.code ;Segment de code + +org 0100h ;Point d’entré en 0100h + +start: + mov ah,0Dh + mov si,offset msg + int 47h ;Afficher le texte pointé par DS:SI (Showstring0) + xor ax,ax + int 16h ;Attendre l’appuie sur une touche + db 0CBH ;retour far + +msg db ‘Hello World’,0 +end start + + Avec nasm + +[bits 16] ;16 bits +[org 0x0100] ;Point d’entré en 0100h +section .text ;Segment de code + +start: + mov ah,0x0D + mov si,msg + int 0x47 ;Afficher le texte pointé par DS:SI (Showstring0) + xor ax,ax + int 0x16 ;Attendre l’appuie sur une touche + retf ;retour far + +msg db ‘Hello World’,0 + + + Comme vous pouvez le constater l’appel des APIs de Cos se réalise par le biais d’interruptions logiciels dont voici la liste. + +Liste des APIs + +disque.sys : Gestionnaires FAT12 et Disquette +Interruption 48h (Disquette uniquement) + +00h readsector + 01h writesector + 02h verifysector + 03h initdrive + 04h loadfile + 05h compressrle + 06h decompressrle + 07h findfirstfile + 08h getfreespace + 09h searchfile + 0Ah getname + 0Bh getserial + 0Ch changedir + 0Dh readcluster + 0Eh writecluster + 0Fh getdir + +port.sys : Gestionnaires port parallèle +Interruption 0Dh (LPT1) ou 0Fh (LPT2) + +00h getlptin + 01h getlptout + 02h getlptinout + 03h setlptin + 04h setlptout + 05h setlptinout + 06h getlpt + 07h getfirstlpt + 08h setemettor + 09h setreceptor + 0Ah settimeout + 0Bh gettimeout + 0Ch receivelpt + 0Dh sendlpt + 0Eh receivelptblock + 0Fh sendlptblock + 10h receivecommand + 11h sendcommand + +souris.sys : Gestionnaires souris +Interruption 74h (PS/2) + +00h cmdmouse + 01h cmdmouse2 + 02h detectmouse + 03h getmouse + 04h getmousescreen + 05h configmouse + +8259a.sys : Gestionnaires contrôleur d'interruption programmable +Interruption 50h (Maître et esclave) + +00h enableirq + 01h disableirq + 02h readmaskirq + 03h readirr + 04h readisr + 05h installhandler + 06h replacehandler + 07h getint + 08h setint + 09h seteoi + +video.sys : Gestionnaires de la carte vidéo +Interruption 47h (VGA) + +00h setvideomode + 01h getvideomode + 02h cleartext + 03h changefont + 04h loadfont + 05h space + 06h line + 07h showchar + 08h showint + 09h showsigned + 0Ah showhex + 0Bh showbin + 0Ch showstring + 0Dh showstring0 + 0Eh showcharat + 0Fh showintat + 10h showsignedat + 11h showhexat + 12h showbinat + 13h showstringat + 14h showstring0at + 15h setcolor + 16h getcolor + 17h scrolldown + 18h getxy + 19h setxy + 1Ah savescreen + 1Bh restorescreen + 1Ch page2to1 + 1Dh page1to2 + 1Eh xchgPages + 1Fh savepage1 + 20h changelineattr + 21h waitretrace + 22h getinfos + 23h loadbmp + 24h showbmp + 25h clearscr + 26h savedac + 27h restoredac + 28h savestate + 29h restorestate + 30h enablescroll + 31h disablescroll + 32h showdate + 33h showtime + 34h showname + 35h showattr + 36h showsize + +Pour l’instant je n’ai pas fait de guide détaillé de l’utilisation des fonctions de COS… A venir + +Les possibilités de COS2000 sont aujourd'hui très limitées car il est en cours de développement. + +En cas de problèmes + + Si des bugs surviennent ou si COS2000 ne veut pas s'installer, veuillez s'il vous plaît m'envoyer un E Mail à : + + mailto:nicolas@palon.fr + +COS2000 n'exploite pas les disques durs, il est donc impossible qu'il altère de quelque manière que ce soit vos données !!!!!!!!!!!!! diff --git a/LICENSE.md b/LICENSE.md old mode 100755 new mode 100644 index 7d1f860..01a7a80 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,342 +1,675 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - - +### GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +### Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom +to share and change all versions of a program--to make sure it remains +free software for all its users. We, the Free Software Foundation, use +the GNU General Public License for most of our software; it applies +also to any other work released this way by its authors. You can apply +it to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you +have certain responsibilities if you distribute copies of the +software, or if you modify it: responsibilities to respect the freedom +of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the +aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for +individuals to use, which is precisely where it is most unacceptable. +Therefore, we have designed this version of the GPL to prohibit the +practice for those products. If such problems arise substantially in +other domains, we stand ready to extend this provision to those +domains in future versions of the GPL, as needed to protect the +freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish +to avoid the special danger that patents applied to a free program +could make it effectively proprietary. To prevent this, the GPL +assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +#### 0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +#### 1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +#### 2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +#### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +#### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +#### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +#### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +#### 8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +#### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +#### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +#### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +#### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +#### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +#### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that numbered version or +of any later version published by the Free Software Foundation. If the +Program does not specify a version number of the GNU General Public +License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy's public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +#### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +#### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +#### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands \`show w' and \`show c' should show the +appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an "about box". + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see . + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read . \ No newline at end of file diff --git a/MAKEFILE b/MAKEFILE new file mode 100644 index 0000000..590d8df --- /dev/null +++ b/MAKEFILE @@ -0,0 +1,52 @@ +all: + cd commande + make + cd .. + + cd programs + make + cd .. + + cd noyau + make + cd .. + + cd contribs + make + cd .. + + cd install + make + cd .. + +copy: + make all + copy commande\*.exe ..\data + copy programs\*.exe ..\data + copy programs\*.rip ..\data + copy noyau\*.sys ..\data + rem copy noyau\*.bin ..\data + copy contribs\*.exe ..\data + copy install\*.com ..\ + make clean + +clean: + cd commande + make clean + cd .. + + cd programs + make clean + cd .. + + cd noyau + make clean + cd .. + + cd contribs + make clean + cd .. + + cd install + make clean + cd .. diff --git a/commande/MAKEFILE b/commande/MAKEFILE new file mode 100644 index 0000000..cb18b34 --- /dev/null +++ b/commande/MAKEFILE @@ -0,0 +1,17 @@ +lnk_boot = tlink /x +asm= tasm /t/m5/zi +lnk= tlink /x/t + +all: commande.exe + +commande.exe: commande.asm str0.asm + $(asm) commande + $(lnk) commande + ren commande.com commande.exe + +clean: + del *.obj + del *.exe + del *.com + del *.sys + del *.err diff --git a/commande/asm.bat b/commande/asm.bat deleted file mode 100755 index 9466a7b..0000000 --- a/commande/asm.bat +++ /dev/null @@ -1,54 +0,0 @@ -@echo off - -echo Assembling file %1... -..\util\tasm %1.asm /m5/x/t -if errorlevel 1 goto end -if "%1"=="boot" goto boot -echo Linking file %1... -..\util\tlink %1.obj /x/t -if errorlevel 1 goto end -echo Copying file %1... -if "%1"=="video" goto video -if "%1"=="lpt" goto system -if "%1"=="keyboard" goto system -if "%1"=="mouse" goto system -if "%1"=="pic8259a" goto system -if "%1"=="timer" goto system -if "%1"=="drive" goto system -if "%1"=="joystick" goto system -if "%1"=="system" goto system -if "%1"=="setup" goto setup -copy %1.com ..\data\%1.exe>nul -goto end - -:boot -echo Linking file %1... -..\util\tlink %1.obj /x -if errorlevel 1 goto end -echo Copying file %1... -..\util\exe2boot %1.exe -copy %1.bin ..\data\%1.bin>nul -goto end - -:video -type thin8x8.fnt>>%1.com -:system -copy %1.com ..\data\%1.sys>nul -goto end -:setup -copy %1.com ..\%1.com>nul -goto end - -:end -if not exist *.bin goto exes -del *.bin -:exes -if not exist *.exe goto coms -del *.exe -:coms -if not exist *.com goto objs -del *.com -:objs -if not exist *.obj goto nobjs -del *.obj -:nobjs diff --git a/commande/clean.bat b/commande/clean.bat deleted file mode 100755 index 687f4b0..0000000 --- a/commande/clean.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -echo nettoyage en cours... -del ..\data\*.* >nul diff --git a/commande/prompt.asm b/commande/commande.asm old mode 100755 new mode 100644 similarity index 62% rename from commande/prompt.asm rename to commande/commande.asm index 09a3c83..fc49c52 --- a/commande/prompt.asm +++ b/commande/commande.asm @@ -1,265 +1,449 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: - mov ah,2 - int 47h - mov ah,6 - int 47h - mov ah,6 - int 47h - mov ah,42 - int 47h - mov ah,13 - mov si,offset msg - int 47h - xor bp,bp - mov dl,' ' - call setdelimiter0 -replay: - mov ah,6 - int 47h -noret: - mov ah,6 - int 47h - mov ah,13 - mov si,offset prompt - int 47h - mov di,offset buffer -waitchar: - mov ax,0 - int 16h - cmp ah,59 - jne norr - cmp bp,0 - je waitchar - mov ah,13 - mov si,cs:[bp-8] - int 47h - push cs - pop es - call copy0 - call getlength0 - add di,cx - jmp waitchar -norr: - cmp al,0Dh - je entere - cmp di,offset buffer+256 - je waitchar - mov [di],al - inc di - mov dl,al - mov ah,7 - int 47h - jmp waitchar -entere: - mov byte ptr [di],0 - mov si,offset buffer - cmp si,di - je noret - mov ah,6 - int 47h - push cs - pop es - mov di,offset buffer2 - xor cx,cx - call getitem0 - mov si,di - call uppercase0 - mov bx,offset commands - xor bp,bp -tre: - mov di,[bx] - add bx,8 - cmp di,0 - je error - push cs - pop es - call evalue0 - cmp dx,bp - jb noadd - mov bp,dx - mov ax,bx - noadd: - call cmpstr0 - jne tre - mov si,offset buffer - mov di,offset buffer2 - call copy0 - mov si,di - call uppercase0 - xor cx,cx - inc cx - call getpointeritem0 - cmp byte ptr [di-1],0 - jne nopod - mov byte ptr [di],0 -nopod: - mov si,di - mov di,[bx-4] - call checksyntax0 - jc errorprec - mov bx,[bx-6] - call bx - jmp replay -error: - mov bp,ax - push cs - pop es - mov dl,'.' - call searchchar0 - je noaddext - mov di,offset buffer - mov si,offset extcom - call concat0 -noaddext: - mov si,offset buffer - push cs - mov ax,offset arrive - push ax - mov di,offset vga - mov ah,40 - int 47h - mov ax,6000h - mov es,ax - push ax - mov di,0100h - push di - mov ah,4 - int 48h - jc reallyerror - push es - push es - push es - pop ds - pop fs - pop gs - push 7202h - popf - db 0CBh - arrive: - push cs - push cs - push cs - push cs - pop ds - pop es - pop fs - pop gs - mov si,offset vga - mov ah,41 - int 47h - xor bp,bp - jmp replay -reallyerror: - pop ax - pop ax - pop ax - pop ax - mov ah,13 - mov si,offset Error_Syntax - int 47h - mov ah,13 - mov si,cs:[bp-8] - int 47h - jmp replay -errorprec: - mov ah,13 - mov si,offset derror - int 47h - jmp replay - -Code_Exit: - pop ax - db 0CBh - -Code_Version: - mov ah,13 - mov si,offset Version_Text - int 47h - ret - -Version_Text db 'Cos 2000 version 2.0.1B by Nico',0 - -Code_Cls: - mov ah,2 - int 47h - ret - -Code_Reboot: - push 0FFFFh - push 00000h - db 0CBH - -Code_Command: - mov bx,offset commands -showalls: - mov si,[bx] - add bx,8 - cmp si,0 - je endoff - mov ah,13 - int 47h - mov ah,6 - int 47h - jmp showalls - endoff: - ret - -Code_Mode: - mov cx,0 - call gettypeditem0 - mov ah,0 - mov al,dl - and al,1111b - int 47h - mov ah,2 - int 47h - ret - -extcom db '.EXE',0 - -commands dw Str_Exit ,Code_Exit ,Syn_Exit ,Help_Exit - dw Str_Version,Code_Version,Syn_Version,Help_Version - dw Str_Cls ,Code_Cls ,Syn_Cls ,Help_Cls - dw Str_Reboot ,Code_Reboot ,Syn_Reboot ,Help_Reboot - dw Str_Command,Code_Command,Syn_Command,Help_Command - dw Str_Mode ,Code_Mode ,Syn_Mode ,Help_Mode - dw 0 - -Str_Exit db 'EXIT',0 -Str_Version db 'VERSION',0 -Str_Cls db 'CLS',0 -Str_Reboot db 'REBOOT',0 -Str_Command db 'COMMAND',0 -Str_Mode db 'MODE',0 -Syn_Exit db 0 -Syn_Version db 0 -Syn_Cls db 0 -Syn_Reboot db 0 -Syn_Command db 0 -Syn_Mode db 'FFH',0 -Help_Exit db 0 -Help_Version db 0 -Help_Cls db 0 -Help_Reboot db 0 -Help_Command db 0 -Help_Mode db 0 - -derror db 'Syntax error',0 -Error_Syntax db 'Command or executable doesn''t exist ! F1 for ',0 -prompt db 'COS>',0 -msg db 'Cos command interpretor V1.0',0 - - include str0.asm - -buffer equ $ -buffer2 equ $+256 -vga equ $+512 - -end start +.model tiny +.486 +smart +.code + +org 0100h + +include ..\include\fat.h + +start: + push cs + push cs + push cs + push cs + pop ds + pop es + pop fs + pop gs + mov ah,21 + mov cl,7 + int 47h + mov ah,3 + int 48h + mov ax,0002 + int 47h + mov ah,2 + int 47h + mov ah,6 + int 47h + mov ah,6 + int 47h + mov ah,42 + int 47h + mov ah,13 + mov si,offset msg + int 47h + xor bp,bp + mov dl,' ' + call setdelimiter0 +replay: + mov ah,6 + int 47h +noret: + mov ah,6 + int 47h + mov ah,16 + mov di,offset dir + int 48h + mov si,di + mov ah,13 + int 47h + mov si,offset prompt + int 47h + mov di,offset buffer +waitchar: + mov ax,0 + int 16h + cmp ah,59 + jne norr + cmp bp,0 + je waitchar + mov ah,13 + mov si,cs:[bp-8] + int 47h + push cs + pop es + call copy0 + call getlength0 + add di,cx + jmp waitchar +norr: + cmp al,0Dh + je entere + cmp di,offset buffer+256 + je waitchar + mov [di],al + inc di + mov dl,al + mov ah,7 + int 47h + jmp waitchar +entere: + mov byte ptr [di],0 + mov si,offset buffer + cmp si,di + je noret + mov ah,6 + int 47h + push cs + pop es + mov di,offset buffer2 + xor cx,cx + call getitem0 + mov si,di + call uppercase0 + mov bx,offset commands + xor bp,bp +tre: + mov di,[bx] + add bx,8 + cmp di,0 + je error + push cs + pop es + call evalue0 + cmp dx,bp + jb noadd + mov bp,dx + mov ax,bx + noadd: + call cmpstr0 + jne tre + mov si,offset buffer + mov di,offset buffer2 + call copy0 + mov si,di + call uppercase0 + xor cx,cx + inc cx + call getpointeritem0 + cmp byte ptr [di-1],0 + jne nopod + mov byte ptr [di],0 +nopod: + mov si,di + mov di,[bx-4] + call checksyntax0 + jc errorprec + mov bx,[bx-6] + call bx + jmp replay +error: + mov bp,ax + push cs + pop es + mov dl,'.' + call searchchar0 + je noaddext + mov di,offset buffer + mov si,offset extcom + call concat0 +noaddext: + mov si,offset buffer + push cs + mov ax,offset arrive + push ax + mov di,offset vga + mov ah,40 + int 47h + mov ax,9000h + mov es,ax + push ax + mov di,0100h + push di + mov ah,4 + int 48h + jc reallyerror + push es + push es + push es + pop ds + pop fs + pop gs + push 7202h + popf + db 0CBh + arrive: + push cs + push cs + push cs + push cs + pop ds + pop es + pop fs + pop gs + mov si,offset vga + mov ah,41 + int 47h + xor bp,bp + jmp replay +reallyerror: + pop ax + pop ax + pop ax + pop ax + mov ah,13 + mov si,offset Error_Syntax + int 47h + mov ah,13 + mov si,cs:[bp-8] + int 47h + jmp replay +errorprec: + mov ah,13 + mov si,offset derror + int 47h + jmp replay + +Code_Exit: + pop ax + db 0CBh + +Code_Version: + mov ah,13 + mov si,offset Version_Text + int 47h + ret + +Version_Text db 'Cos 2000 version 3.0.2Fr par Nico',0 + +Code_Cls: + mov ah,2 + int 47h + ret + +Code_Reboot: + push 0FFFFh + push 00000h + db 0CBH + +Code_Command: + mov bx,offset commands +showalls: + mov si,[bx] + add bx,8 + cmp si,0 + je endoff + mov ah,13 + int 47h + mov ah,6 + int 47h + jmp showalls + endoff: + ret + +Code_Mode: + mov cx,0 + call gettypeditem0 + mov ah,0 + mov al,dl + and al,1111b + int 47h + mov ah,2 + int 47h + ret + +present db 'Le volume insere est nomme ',0 +present2 db ', Numero de serie : ',0 +nomdisque db 13 dup (0) +Code_Dir: +mov si,offset present +mov ah,13 +int 47h +mov ah,11 +mov di,offset nomdisque +int 48h +mov si,di +mov ah,13 +int 47h +mov si,offset present2 +mov ah,13 +int 47h +mov ah,12 +int 48h +mov ah,10 +mov cx,32 +int 47h +mov ah,6 +int 47h +mov ah,6 +int 47h +xor ebp,ebp +mov di,offset bufferentry +mov si,di +mov ah,7 +int 48h +jc nofiles +go: +mov ah,46 +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,44 +mov dx,[si+Entries.FileDateCrea] +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,45 +mov dx,[si+Entries.FileTimeCrea] +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,44 +mov dx,[si+Entries.FileDate] +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,45 +mov dx,[si+Entries.FileTime] +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,48 +mov edx,[si+Entries.FileSize] +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,47 +mov dl,[si+Entries.FileAttr] +int 47h +mov ah,6 +int 47h +inc bp +mov ah,8 +int 48h +jnc go +nofiles: +mov edx,ebp +mov ah,6 +int 47h +mov ah,8 +int 47h +mov si,offset filess +mov ah,13 +int 47h +ret +bufferentry db 32 dup (0) +filess db ' Fichier(s) au total',0 + +changing db 'Changement de repertoire vers ',0 +code_cd: + mov cx,0 + call gettypeditem0 + push si + mov si,offset changing + mov ah,13 + int 47h + pop si + int 47h + mov ah,6 + int 47h + mov si,di + mov ah,13 + int 48h + jnc okchange + mov si,offset errorchanging + mov ah,13 + int 47h +okchange: + ret +errorchanging db 'Impossible d''atteindre ce dossier',0 + +code_refresh: + mov ah,3 + int 48h + jnc okrefresh + mov si,offset errorrefreshing + mov ah,13 + int 47h +ret +okrefresh: +mov si,offset present +mov ah,13 +int 47h +mov ah,11 +mov di,offset nomdisque +int 48h +mov si,di +mov ah,13 +int 47h +mov si,offset present2 +mov ah,13 +int 47h +mov ah,12 +int 48h +mov ah,10 +mov cx,32 +int 47h +mov ah,6 +int 47h + ret +errorrefreshing db 'Impossible de lire le support',0 + +extcom db '.EXE',0 + +commands dw Str_Exit ,Code_Exit ,Syn_Exit ,Help_Exit + dw Str_Version,Code_Version,Syn_Version,Help_Version + dw Str_Cls ,Code_Cls ,Syn_Cls ,Help_Cls + dw Str_Reboot ,Code_Reboot ,Syn_Reboot ,Help_Reboot + dw Str_Command,Code_Command,Syn_Command,Help_Command + dw Str_Mode ,Code_Mode ,Syn_Mode ,Help_Mode + dw Str_Dir ,Code_Dir ,Syn_Dir ,Help_Dir + dw Str_refresh ,Code_refresh ,Syn_refresh ,Help_refresh + dw Str_cd ,Code_cd ,Syn_cd ,Help_cd + dw 0 + +Str_Exit db 'QUIT',0 +Str_Version db 'VERS',0 +Str_Cls db 'EFFAC',0 +Str_Reboot db 'REDEM',0 +Str_Command db 'CMDS',0 +Str_Mode db 'MODE',0 +Str_Dir db 'VOIR',0 +Str_refresh db 'LIRE',0 +Str_cd db 'CH',0 +Syn_Exit db 0 +Syn_Version db 0 +Syn_Cls db 0 +Syn_Reboot db 0 +Syn_Command db 0 +Syn_Mode db 'FFH',0 +Syn_Dir db 0 +Syn_refresh db 0 +Syn_cd db '@',0 +Help_Exit db 0 +Help_Version db 0 +Help_Cls db 0 +Help_Reboot db 0 +Help_Command db 0 +Help_Mode db 0 +Help_Dir db 0 +Help_refresh db 0 +Help_cd db 0 +derror db 'Erreur de Syntaxe !',0 +Error_Syntax db 'La commande ou l''executable n''existe pas ! F1 pour ',0 +prompt db '>',0 +msg db 'Interpreteur de commande COS V1.1',0 + + include str0.asm + +dir equ $ +buffer equ $+128 +buffer2 equ $+128+512 +vga equ $+128+512+512 + + +end start diff --git a/commande/debog.bat b/commande/debog.bat deleted file mode 100755 index aedbb4e..0000000 --- a/commande/debog.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -..\util\td %1 diff --git a/commande/str0.asm b/commande/str0.asm old mode 100755 new mode 100644 index f9bf7fd..ddbc0c8 --- a/commande/str0.asm +++ b/commande/str0.asm @@ -1,845 +1,857 @@ -;Librairie qui prend en charge le format de STR ASCIIZ -;# nombre 9 -;@ str 8 -;& file 7 - -;Renvoie carry si la syntaxe de ds:si n'est pas respect‚ par rapport a es:di -CheckSyntax0: - push ax bx dx bp si di ds es - push es di - push cs - pop es - mov di,offset temp2 - call copy0 - mov si,di - push cs - pop ds - pop di es - call getdelimiter0 - mov bp,dx - mov dl,' ' - call setdelimiter0 - call compressdelimiter0 - call uppercase0 - call getnbitems0 - ;call xch - ;mov ax,cx - ;call getnbitem0 - ;call xch - ;cmp ax,cx - ;call xch - ;jne notequalatall - mov bx,cx - xor cx,cx -itemer: - call whatisitem0 - mov dx,ax - call xch - call whatisitem0 - call xch - cmp ax,dx - jne prob - cmp al,6 - jb equal - call cmpitems0 - je equal -prob: - cmp dl,4 - ja nosize - cmp al,8 - je equal - cmp al,4 - jne notequalatall - cmp dh,ah - ja notequalatall - jmp equal -nosize: - cmp al,7 - jne noname - cmp ah,0 - jne notequalatall - jmp equal -noname: - cmp al,8 - je equal - jmp notequalatall -equal: - inc cx - cmp cx,bx - jne itemer - cld -ackno: - mov dx,bp - call setdelimiter0 - pop es ds di si bp dx bx ax - ret -notequalatall: - stc - jmp ackno -xch: - push ds - push es - pop ds - pop es - xchg si,di - ret - -temp2 db 256 dup (0) - -;Compare les ‚l‚ments cx de deux chaine ds:si et es:di -Cmpitems0: - push cx dx si di - push cx di - call getpointeritem0 - mov si,di - xor cx,cx - inc cx - call getpointeritem0 - mov dx,di - sub dx,si - dec cx - pop di cx - push ds si - push es - pop ds - mov si,di - call getpointeritem0 - pop si ds - mov cx,dx - rep cmpsb - pop di si dx cx - ret - - - -;Renvoie l'‚l‚ment cx de ds:si dans edx si nb et dans es:di si str ou name -gettypeditem0: - push bx cx si - call getpointeritem0 - mov si,di - xor cx,cx - inc cl - call getpointeritem0 - mov bx,di - dec bx - mov cl,0 - xchg cl,ds:[bx] - call gettyped0 - xchg cl,ds:[bx] - pop si cx bx - ret - -;Renvoie ds:si dans edx si nb et dans es:di si str ou name -gettyped0: - push ax - call whatis0 - cmp al,5 - jb number - cmp al,6 - je pointer - push ds - pop es - call getpointeritem0 - jmp endofGettypeditem0 -number: - mov edx,cs:lastnumber - jmp endofgettypeditem0 -pointer: - call str0toadress -endofgettypeditem0: - pop ax - ret - -;Renvoie dans ax le type de la str0 point‚e par ds:si ‚l‚ment cx -whatisitem0: - push bx cx si di - call getpointeritem0 - mov si,di - xor cx,cx - inc cl - call getpointeritem0 - mov bx,di - dec bx - mov cl,0 - xchg cl,ds:[bx] - call whatis0 - xchg cl,ds:[bx] - pop di si cx bx - ret - -;Renvoie dans ax le type de la str0 point‚e par ds:si -;High Low -;0 variable 4 hex -;1 byte 3 dec -;2 word 2 oct -;3 3 octets 1 bin -;4 dword 5 adresse -;5 5 octets 6 name -;6 ... 7 str -whatis0: - push bx cx edx - mov cl,2 - call str0isbase - jnc finbase - mov cl,8 - call str0isbase - jnc finbase - mov cl,10 - call str0isbase - jnc finbase - mov cl,16 - call str0isbase - jc testadress -finbase: - mov bx,cx - xor ch,ch - mov al,cs:[bx+offset basenn-2] - call str0toint - mov cs:Lastnumber,edx - cmp edx,0000FFFFh - ja bits32 - cmp dx,00FFh - ja bits16 - mov ah,1 - jmp endofwhat -bits16: - mov ah,2 - jmp endofwhat -bits32: - mov ah,3 - jmp endofwhat -testadress: - call str0isadress - jc testname - mov ax,0005h - jmp endofwhat -testname: - call str0isname - jc testvarstr - mov al,07h - call getlength0 - cmp byte ptr [si],'&' - jne real - mov cl,0 -real: - mov ah,cl - jmp endofwhat -testvarstr: - cmp byte ptr [si],'@' - jne testnumber - mov al,08h - call getlength0 - mov ah,cl - jmp endofwhat -testnumber: - cmp byte ptr [si],'#' - jne isstr - call getlength0 - cmp cl,1 - ja isstr - mov ax,0009h - jmp endofwhat -isstr: - mov al,06h - call getlength0 - dec cl - mov ah,cl -endofwhat: - pop edx cx bx - ret - -Lastnumber dd 0 - -;Renvoie non carry si la str ds:si point‚e peut ˆtre une adresse -str0isadress: - ;push - stc - ;pop - ret - -;Renvoie en es:di le pointeur str0 ds:si -Str0toAdress: - ;push - stc - ;pop - ret - -;Renvoie non carry si la str ds:si point‚e peut ˆtre un nom de fichier -str0isname: - push ax si di -isname: - mov al,[si] - inc si - cmp al,0 - je itsok - mov di,offset non -verify: - mov ah,[di] - inc di - cmp ah,0FFh - je isname - cmp ah,al - jne verify - stc - jmp itsdead -itsok: - clc -itsdead: - pop di si ax - ret - -non db '/<>|@#',01,0FFh - -;Renvoie non carry si le texte point‚ par si est de la base cl -str0isbase: - push ax cx si di es - push cs - pop es - mov ah,cl -isstrbase: - mov al,[si] - cmp al,0 - je okbase - mov cl,ah - xor ch,ch - mov di,cx - cmp al,es:[di-2+offset basen] - je verifbase - xor ch,ch - inc cl - mov di,offset base - cld - repne scasb - cmp cx,0 - je nobase - inc si - jmp isstrbase -okbase: - clc -endbase: - pop es di si cx ax - ret -verifbase: - cmp byte ptr [si+1],0 - je okbase -nobase: - stc - jmp endbase - -temp dw 0 - -;Converti un str de base cl en int dans edx -str0toint: - push eax bx ecx si edi ebp es - push cs - pop es - mov ah,cl - mov cs:temp,si -gotos: - cmp byte ptr [si+1], 0 - je oklo - inc si - jmp gotos -oklo: - mov edi,1 - xor ebp,ebp - mov bl,cl -baseto: - cmp si,cs:temp - jb endbaseto - mov al,[si] - xor ecx,ecx - mov cl,bl - inc cl - push di - mov di,offset base - cld - repne scasb - pop di - jne noop - sub cl,bl - neg cl - mov eax,edi - mul ecx - add ebp,eax - mov eax,edi - mov cl,bl - mul ecx - mov edi,eax -noop: - dec si - jmp baseto -endbaseto: - mov edx,ebp - pop es ebp edi si ecx bx eax -ret -base db '0123456789ABCDEF' -basen db 'B O D H' -basenn db 1,0,0,0,0,0,2,0,3,0,0,0,0,0,4 - -;Renvoie en es:di la partie de cx caractŠres a partir de la gauche de ds:si -Left0: - push ax cx si di - cld - rep movsb - mov al,0 - stosb - pop di si cx ax - ret - -;Renvoie en es:di la partie de cx caractŠres a partir de la droite de ds:si -Right0: - push ax cx dx si di - mov dx,cx - call getlength0 - add si,cx - sub si,dx - mov cx,dx - cld - rep movsb - mov al,0 - stosb - pop di si dx cx ax - ret - -;Renvoie en es:di la partie de cx caractŠres a partir de la position bx de ds:si -middle0: - push ax cx si di - add si,bx - cld - rep movsb - mov al,0 - stosb - pop di si cx ax - ret - -;Rempli de cx caractŠres dl a partir de la position bx de ds:si -Fill0: - push ax bx cx si di es - push ds - pop es - add si,bx - mov al,dl - mov di,si - cld - rep stosb - pop es di si cx bx ax - ret - -;Remplace tout les caractŠres al de ds:si par des caractŠres dl -ReplaceAllchar0: - push ax cx di es - call GetLength0 - push ds - pop es - mov di,si -findandchange: - repne scasb - cmp cx,0 - je endofchange - mov es:[di-1],dl - jmp findandchange -endofchange: - pop es di cx ax - ret - - -;Recherche un caractŠre dl dans la chaŒne ds:si -SearchChar0: - push ax cx di es - call GetLength0 - push ds - pop es - mov di,si - mov al,dl - repne scasb - pop es di cx ax - ret - -;Inverse la chaine point‚e en ds:si -invert0: - push ax cx si di es - call GetLength0 - push ds - pop es - mov di,si - add di,cx - dec di -revert: - mov al,[si] - xchg al,es:[di] - mov [si],al - inc si - dec di - cmp si,di - je finishinvert - dec di - cmp si,di - je finishinvert - inc di - jmp revert -finishinvert: - pop es di si cx ax - ret - -;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal -cmpstr0: - push cx dx si di - call GetLength0 - mov dx,cx - push ds si - push es - pop ds - mov si,di - call GetLength0 - pop si ds - cmp cx,dx - jne NotEqual - repe cmpsb -NotEqual: - pop di si dx cx - ret - -;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal et renvoie le nb de caractŠre egaux dans dx -evalue0: - push cx si di - push ds si - push es - pop ds - mov si,di - call GetLength0 - pop si ds - mov dx,cx - repe cmpsb - pushf - sub dx,cx - popf - pop di si cx - ret - - -;Insert une chaine ds:si en es:di a partir du caractŠre cx -insert0: - push cx di si - add di,cx - call getlength0 - push si di ds - push es - pop ds - mov si,di - add di,cx - call copy20 - pop ds di si - cld - inc di - rep movsb - pop si di cx - ret - -;Detruit CX caractŠres a partir du caractŠre BX de DS:SI -delete0: - push cx dx si di es - push ds - pop es - mov dx,cx - call getlength0 - sub cx,dx - sub cx,bx - inc cx - add si,bx - mov di,si - add si,dx - cld - rep movsb - pop es di si dx cx - ret - -;Copie une chaine de ds:si en es:di -Copy0: - push ax cx si di - call GetLength0 - cld - rep movsb - mov al,0 - stosb - pop di si cx ax - ret - -;Copie une chaine de ds:si en es:di -Copy20: - push ax cx si di - call GetLength0 - cld - add si,cx - add di,cx - inc cx - std - rep movsb - pop di si cx ax - ret - -;ConcatŠne le chaine ds:si avec es:di -Concat0: - push ax cx dx si di - call GetLength0 - mov dx,cx - xchg si,di - push ds - push es - pop ds - call GetLength0 - pop ds - xchg si,di - add di,cx - mov cx,dx - cld - rep movsb - mov al,0 - stosb - pop di si dx cx ax - ret - -;Met DL comme d‚limiteur par d‚faut -SetDelimiter0: - mov cs:delim,dl - ret - -;Renvoie le d‚limiteur par d‚faut dans dl -GetDelimiter0: - mov dl,cs:delim - ret -delim db 0 - -;D‚truit les d‚limiteur qui sont cons‚cutifs dans ds:si -CompressDelimiter0: - push ax dx si di es - call Getlength0 - push ds - pop es - mov di,si - mov al,cs:delim - xor dx,dx -Compressitems: - repne scasb - inc dx -againcomp: - cmp [di],al - jne nosup - mov si,di - mov bx,0 - push cx - mov cx,1 - call delete0 - pop cx - jmp againcomp -nosup: - cmp cx,0 - jne compressitems - mov cx,dx - pop es di si dx ax - ret - -;Met le nombre d'‚l‚ments … cx -Setnbitems0: - push ax cx dx di es - mov dx,cx - call Getnbitems0 - cmp cx,dx - je noadjust - ja subsome - push ds - pop es - mov di,si - sub cx,dx - neg cx - push cx - call getlength0 - add di,cx - pop cx - mov al,cs:delim - mov ah,'a' - rep stosw - mov al,0 - stosb - jmp noadjust -subsome: - mov cx,dx - call GetPointeritem0 - dec di - mov byte ptr [di],0 -noadjust: - pop es di dx cx - ret - -;Renvoie la taille dx de l'‚l‚ment cx -Getitemsize: - push cx di - call getpointeritem0 - mov dx,di - inc cx - call getpointeritem0 - sub dx,di - neg dx - dec dx - pop di cx - ret - -;Renvoie en es:di l'‚l‚ment cx de ds:si -Getitem0: - push si di cx ax - push di - call getPointeritem0 - call getitemsize - mov si,di - pop di - mov cx,dx - rep movsb - mov al,0 - stosb - pop ax cx di si - ret - -;renvoi un pointeur di sur l'‚l‚ment cx de ds:si -GetPointeritem0: - push ax bx cx dx es - mov bx,cx - call Getlength0 - push ds - pop es - mov di,si - mov al,cs:delim - xor dx,dx -Countnbitems: - cmp bx,dx - je finishpointer - repne scasb - inc dx - cmp cx,0 - jne countnbitems - inc di -finishpointer: - pop es dx cx bx ax - ret - -;Renvoie le nombre d'‚l‚ments cx de ds:si -GetNbitems0: - push ax dx di es - call Getlength0 - push ds - pop es - mov di,si - mov al,cs:delim - xor dx,dx -Countitems: - repne scasb - inc dx - cmp cx,0 - jne countitems - mov cx,dx - pop es di dx ax - ret - -;renvoie la taille en octets CX de la chaine point‚e en ds:si -GetLength0: - push ax di es - push ds - pop es - mov di,si - mov al,0 - mov cx,0FFFFh - cld - repne scasb - neg cx - dec cx - dec cx - pop es di ax - ret - -;Met la taille en octets de la chaine point‚e ds:si a CX -SetLength0: - push bx - mov bx,cx - mov byte ptr [si+bx],0 - pop bx - ret - -;met en majuscule la chaine ds:si -UpperCase0: - push si ax -UpperCase: - mov al,ds:[si] - inc si - cmp al,0 - je EndUpperCase - cmp al,'a' - jb UpperCase - cmp al,'z' - ja UpperCase - sub byte ptr [si-1],'a'-'A' - jmp UpperCase -EndUpperCase: - clc - pop ax si - ret - -;met en majuscule la premiŠre lettre chaine ds:si -OneCase0: - push ax -OneUpperCase: - mov al,ds:[si] - cmp al,'a' - jb OneEndUpperCase - cmp al,'z' - ja OneEndUpperCase - sub byte ptr [si],'a'-'A' -OneEndUpperCase: - clc - pop ax - ret - -;met en minuscule la chaine ds:si -LowerCase0: - push si ax -LowerCase: - mov al,ds:[si] - inc si - cmp al,0 - je EndLowerCase - cmp al,'A' - jb LowerCase - cmp al,'Z' - ja LowerCase - add byte ptr [si-1],'a'-'A' - jmp LowerCase -EndLowerCase: - clc - pop ax si - ret - -;Inverse la casse la chaine ds:si -InvertCase0: - push si ax -InvertCase: - mov al,ds:[si] - inc si - cmp al,0 - je EndInvertCase - cmp al,'A' - jb InvertCase - cmp al,'Z' - jbe GoInvertCase - cmp al,'a' - jb InvertCase - cmp al,'z' - ja InvertCase - sub byte ptr [si-1],'a'-'A' - jmp InvertCase -GoInvertCase: - add byte ptr [si-1],'a'-'A' - jmp InvertCase -EndInvertCase: - clc - pop ax si - ret - - +;Librairie qui prend en charge le format de STR ASCIIZ +;# nombre 8 +;@ str 7 +;& nom 6 + +;High Low +;0 variable 4 hex +;1 byte 3 dec +;2 word 2 oct +;3 3 octets 1 bin +;4 dword 5 adresse +;5 5 octets 6 nom +;6 ... 7 str + ; 8 nombre + + +;Renvoie carry si la syntaxe de ds:si n'est pas respect‚ par rapport a es:di +CheckSyntax0: + push ax bx dx bp si di ds es + push es di + push cs + pop es + mov di,offset temp2 + call copy0 + mov si,di + push cs + pop ds + pop di es + call getdelimiter0 + mov bp,dx + mov dl,' ' + call setdelimiter0 + call compressdelimiter0 + call uppercase0 + call getnbitems0 + ;call xch + ;mov ax,cx + ;call getnbitem0 + ;call xch + ;cmp ax,cx + ;call xch + ;jne notequalatall + mov bx,cx + xor cx,cx +itemer: + call whatisitem0 + mov dx,ax + call xch + call whatisitem0 + call xch + cmp ax,dx + jne prob + cmp al,6 + jb equal + call cmpitems0 + je equal +prob: + cmp dl,4 + ja nosize + cmp al,8 + je equal + cmp al,4 + jne notequalatall + cmp dh,ah + ja notequalatall + jmp equal +nosize: + cmp al,7 + jne noname + cmp ah,0 + jne notequalatall + jmp equal +noname: + cmp al,8 + je equal + jmp notequalatall +equal: + inc cx + cmp cx,bx + jne itemer + cld +ackno: + mov dx,bp + call setdelimiter0 + pop es ds di si bp dx bx ax + ret +notequalatall: + stc + jmp ackno +xch: + push ds + push es + pop ds + pop es + xchg si,di + ret + +temp2 db 256 dup (0) + +;Compare les ‚l‚ments cx de deux chaine ds:si et es:di +Cmpitems0: + push cx dx si di + push cx di + call getpointeritem0 + mov si,di + xor cx,cx + inc cx + call getpointeritem0 + mov dx,di + sub dx,si + dec cx + pop di cx + push ds si + push es + pop ds + mov si,di + call getpointeritem0 + pop si ds + mov cx,dx + rep cmpsb + pop di si dx cx + ret + + + +;Renvoie l'‚l‚ment cx de ds:si dans edx si nb et dans es:di si str ou name +gettypeditem0: + push bx cx si + call getpointeritem0 + mov si,di + xor cx,cx + inc cl + call getpointeritem0 + mov bx,di + dec bx + mov cl,0 + xchg cl,ds:[bx] + call gettyped0 + xchg cl,ds:[bx] + pop si cx bx + ret + +;Renvoie ds:si dans edx si nb et dans es:di si str ou name +gettyped0: + push ax + call whatis0 + cmp al,5 + jb number + cmp al,6 + je pointer + push ds + pop es + call getpointeritem0 + jmp endofGettypeditem0 +number: + mov edx,cs:lastnumber + jmp endofgettypeditem0 +pointer: + call str0toadress +endofgettypeditem0: + pop ax + ret + +;Renvoie dans ax le type de la str0 point‚e par ds:si ‚l‚ment cx +whatisitem0: + push bx cx si di + call getpointeritem0 + mov si,di + xor cx,cx + inc cl + call getpointeritem0 + mov bx,di + dec bx + mov cl,0 + xchg cl,ds:[bx] + call whatis0 + xchg cl,ds:[bx] + pop di si cx bx + ret + +;Renvoie dans ax le type de la str0 point‚e par ds:si +;High Low +;0 variable 4 hex +;1 byte 3 dec +;2 word 2 oct +;3 3 octets 1 bin +;4 dword 5 adresse +;5 5 octets 6 name +;6 ... 7 str +whatis0: + push bx cx edx + mov cl,2 + call str0isbase + jnc finbase + mov cl,8 + call str0isbase + jnc finbase + mov cl,10 + call str0isbase + jnc finbase + mov cl,16 + call str0isbase + jc testadress +finbase: + mov bx,cx + xor ch,ch + mov al,cs:[bx+offset basenn-2] + call str0toint + mov cs:Lastnumber,edx + cmp edx,0000FFFFh + ja bits32 + cmp dx,00FFh + ja bits16 + mov ah,1 + jmp endofwhat +bits16: + mov ah,2 + jmp endofwhat +bits32: + mov ah,3 + jmp endofwhat +testadress: + call str0isadress + jc testname + mov ax,0005h + jmp endofwhat +testname: + ;call str0isname + ;jc testvarstr + ;jnc isok + ;mov al,06h + cmp byte ptr [si],'&' + jne testvarstr + mov al,06h + call getlength0 + dec cl + mov ah,cl + jmp endofwhat +testvarstr: + cmp byte ptr [si],'@' + jne testnumber + mov al,07h + call getlength0 + dec cl + mov ah,cl + jmp endofwhat +testnumber: + cmp byte ptr [si],'#' + jne isstr + mov al,8 + call getlength0 + dec cl + mov ah,cl + jmp endofwhat +isstr: + mov al,07h + call getlength0 + mov ah,cl +endofwhat: + pop edx cx bx + ret + +Lastnumber dd 0 + +;Renvoie non carry si la str ds:si point‚e peut ˆtre une adresse +str0isadress: + ;push + stc + ;pop + ret + +;Renvoie en es:di le pointeur str0 ds:si +Str0toAdress: + ;push + stc + ;pop + ret + +;Renvoie non carry si la str ds:si point‚e peut ˆtre un nom de fichier +str0isname: + push ax si di +isname: + mov al,[si] + inc si + cmp al,0 + je itsok + mov di,offset non +verify: + mov ah,[di] + inc di + cmp ah,0FFh + je isname + cmp ah,al + jne verify + stc + jmp itsdead +itsok: + clc +itsdead: + pop di si ax + ret + +non db '/<>|"?*:\',01,0FFh + +;Renvoie non carry si le texte point‚ par si est de la base cl +str0isbase: + push ax cx si di es + push cs + pop es + mov ah,cl +isstrbase: + mov al,[si] + cmp al,0 + je okbase + mov cl,ah + xor ch,ch + mov di,cx + cmp al,es:[di-2+offset basen] + je verifbase + xor ch,ch + inc cl + mov di,offset base + cld + repne scasb + cmp cx,0 + je nobase + inc si + jmp isstrbase +okbase: + clc +endbase: + pop es di si cx ax + ret +verifbase: + cmp byte ptr [si+1],0 + je okbase +nobase: + stc + jmp endbase + +temp dw 0 + +;Converti un str de base cl en int dans edx +str0toint: + push eax bx ecx si edi ebp es + push cs + pop es + mov ah,cl + mov cs:temp,si +gotos: + cmp byte ptr [si+1], 0 + je oklo + inc si + jmp gotos +oklo: + mov edi,1 + xor ebp,ebp + mov bl,cl +baseto: + cmp si,cs:temp + jb endbaseto + mov al,[si] + xor ecx,ecx + mov cl,bl + inc cl + push di + mov di,offset base + cld + repne scasb + pop di + jne noop + sub cl,bl + neg cl + mov eax,edi + mul ecx + add ebp,eax + mov eax,edi + mov cl,bl + mul ecx + mov edi,eax +noop: + dec si + jmp baseto +endbaseto: + mov edx,ebp + pop es ebp edi si ecx bx eax +ret +base db '0123456789ABCDEF' +basen db 'B O D H' +basenn db 1,0,0,0,0,0,2,0,3,0,0,0,0,0,4 + +;Renvoie en es:di la partie de cx caractŠres a partir de la gauche de ds:si +Left0: + push ax cx si di + cld + rep movsb + mov al,0 + stosb + pop di si cx ax + ret + +;Renvoie en es:di la partie de cx caractŠres a partir de la droite de ds:si +Right0: + push ax cx dx si di + mov dx,cx + call getlength0 + add si,cx + sub si,dx + mov cx,dx + cld + rep movsb + mov al,0 + stosb + pop di si dx cx ax + ret + +;Renvoie en es:di la partie de cx caractŠres a partir de la position bx de ds:si +middle0: + push ax cx si di + add si,bx + cld + rep movsb + mov al,0 + stosb + pop di si cx ax + ret + +;Rempli de cx caractŠres dl a partir de la position bx de ds:si +Fill0: + push ax bx cx si di es + push ds + pop es + add si,bx + mov al,dl + mov di,si + cld + rep stosb + pop es di si cx bx ax + ret + +;Remplace tout les caractŠres al de ds:si par des caractŠres dl +ReplaceAllchar0: + push ax cx di es + call GetLength0 + push ds + pop es + mov di,si +findandchange: + repne scasb + cmp cx,0 + je endofchange + mov es:[di-1],dl + jmp findandchange +endofchange: + pop es di cx ax + ret + + +;Recherche un caractŠre dl dans la chaŒne ds:si +SearchChar0: + push ax cx di es + call GetLength0 + push ds + pop es + mov di,si + mov al,dl + repne scasb + pop es di cx ax + ret + +;Inverse la chaine point‚e en ds:si +invert0: + push ax cx si di es + call GetLength0 + push ds + pop es + mov di,si + add di,cx + dec di +revert: + mov al,[si] + xchg al,es:[di] + mov [si],al + inc si + dec di + cmp si,di + je finishinvert + dec di + cmp si,di + je finishinvert + inc di + jmp revert +finishinvert: + pop es di si cx ax + ret + +;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal +cmpstr0: + push cx dx si di + call GetLength0 + mov dx,cx + push ds si + push es + pop ds + mov si,di + call GetLength0 + pop si ds + cmp cx,dx + jne NotEqual + repe cmpsb +NotEqual: + pop di si dx cx + ret + +;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal et renvoie le nb de caractŠre egaux dans dx +evalue0: + push cx si di + push ds si + push es + pop ds + mov si,di + call GetLength0 + pop si ds + mov dx,cx + repe cmpsb + pushf + sub dx,cx + popf + pop di si cx + ret + + +;Insert une chaine ds:si en es:di a partir du caractŠre cx +insert0: + push cx di si + add di,cx + call getlength0 + push si di ds + push es + pop ds + mov si,di + add di,cx + call copy20 + pop ds di si + cld + inc di + rep movsb + pop si di cx + ret + +;Detruit CX caractŠres a partir du caractŠre BX de DS:SI +delete0: + push cx dx si di es + push ds + pop es + mov dx,cx + call getlength0 + sub cx,dx + sub cx,bx + inc cx + add si,bx + mov di,si + add si,dx + cld + rep movsb + pop es di si dx cx + ret + +;Copie une chaine de ds:si en es:di +Copy0: + push ax cx si di + call GetLength0 + cld + rep movsb + mov al,0 + stosb + pop di si cx ax + ret + +;Copie une chaine de ds:si en es:di +Copy20: + push ax cx si di + call GetLength0 + cld + add si,cx + add di,cx + inc cx + std + rep movsb + pop di si cx ax + ret + +;ConcatŠne le chaine ds:si avec es:di +Concat0: + push ax cx dx si di + call GetLength0 + mov dx,cx + xchg si,di + push ds + push es + pop ds + call GetLength0 + pop ds + xchg si,di + add di,cx + mov cx,dx + cld + rep movsb + mov al,0 + stosb + pop di si dx cx ax + ret + +;Met DL comme d‚limiteur par d‚faut +SetDelimiter0: + mov cs:delim,dl + ret + +;Renvoie le d‚limiteur par d‚faut dans dl +GetDelimiter0: + mov dl,cs:delim + ret +delim db 0 + +;D‚truit les d‚limiteur qui sont cons‚cutifs dans ds:si +CompressDelimiter0: + push ax dx si di es + call Getlength0 + push ds + pop es + mov di,si + mov al,cs:delim + xor dx,dx +Compressitems: + repne scasb + inc dx +againcomp: + cmp [di],al + jne nosup + mov si,di + mov bx,0 + push cx + mov cx,1 + call delete0 + pop cx + jmp againcomp +nosup: + cmp cx,0 + jne compressitems + mov cx,dx + pop es di si dx ax + ret + +;Met le nombre d'‚l‚ments … cx +Setnbitems0: + push ax cx dx di es + mov dx,cx + call Getnbitems0 + cmp cx,dx + je noadjust + ja subsome + push ds + pop es + mov di,si + sub cx,dx + neg cx + push cx + call getlength0 + add di,cx + pop cx + mov al,cs:delim + mov ah,'a' + rep stosw + mov al,0 + stosb + jmp noadjust +subsome: + mov cx,dx + call GetPointeritem0 + dec di + mov byte ptr [di],0 +noadjust: + pop es di dx cx + ret + +;Renvoie la taille dx de l'‚l‚ment cx +Getitemsize: + push cx di + call getpointeritem0 + mov dx,di + inc cx + call getpointeritem0 + sub dx,di + neg dx + dec dx + pop di cx + ret + +;Renvoie en es:di l'‚l‚ment cx de ds:si +Getitem0: + push si di cx ax + push di + call getPointeritem0 + call getitemsize + mov si,di + pop di + mov cx,dx + rep movsb + mov al,0 + stosb + pop ax cx di si + ret + +;renvoi un pointeur di sur l'‚l‚ment cx de ds:si +GetPointeritem0: + push ax bx cx dx es + mov bx,cx + call Getlength0 + push ds + pop es + mov di,si + mov al,cs:delim + xor dx,dx +Countnbitems: + cmp bx,dx + je finishpointer + repne scasb + inc dx + cmp cx,0 + jne countnbitems + inc di +finishpointer: + pop es dx cx bx ax + ret + +;Renvoie le nombre d'‚l‚ments cx de ds:si +GetNbitems0: + push ax dx di es + call Getlength0 + push ds + pop es + mov di,si + mov al,cs:delim + xor dx,dx +Countitems: + repne scasb + inc dx + cmp cx,0 + jne countitems + mov cx,dx + pop es di dx ax + ret + +;renvoie la taille en octets CX de la chaine point‚e en ds:si +GetLength0: + push ax di es + push ds + pop es + mov di,si + mov al,0 + mov cx,0FFFFh + cld + repne scasb + neg cx + dec cx + dec cx + pop es di ax + ret + +;Met la taille en octets de la chaine point‚e ds:si a CX +SetLength0: + push bx + mov bx,cx + mov byte ptr [si+bx],0 + pop bx + ret + +;met en majuscule la chaine ds:si +UpperCase0: + push si ax +UpperCase: + mov al,ds:[si] + inc si + cmp al,0 + je EndUpperCase + cmp al,'a' + jb UpperCase + cmp al,'z' + ja UpperCase + sub byte ptr [si-1],'a'-'A' + jmp UpperCase +EndUpperCase: + clc + pop ax si + ret + +;met en majuscule la premiŠre lettre chaine ds:si +OneCase0: + push ax +OneUpperCase: + mov al,ds:[si] + cmp al,'a' + jb OneEndUpperCase + cmp al,'z' + ja OneEndUpperCase + sub byte ptr [si],'a'-'A' +OneEndUpperCase: + clc + pop ax + ret + +;met en minuscule la chaine ds:si +LowerCase0: + push si ax +LowerCase: + mov al,ds:[si] + inc si + cmp al,0 + je EndLowerCase + cmp al,'A' + jb LowerCase + cmp al,'Z' + ja LowerCase + add byte ptr [si-1],'a'-'A' + jmp LowerCase +EndLowerCase: + clc + pop ax si + ret + +;Inverse la casse la chaine ds:si +InvertCase0: + push si ax +InvertCase: + mov al,ds:[si] + inc si + cmp al,0 + je EndInvertCase + cmp al,'A' + jb InvertCase + cmp al,'Z' + jbe GoInvertCase + cmp al,'a' + jb InvertCase + cmp al,'z' + ja InvertCase + sub byte ptr [si-1],'a'-'A' + jmp InvertCase +GoInvertCase: + add byte ptr [si-1],'a'-'A' + jmp InvertCase +EndInvertCase: + clc + pop ax si + ret + + diff --git a/commande/test.asm b/commande/test.asm new file mode 100644 index 0000000..ffa5585 --- /dev/null +++ b/commande/test.asm @@ -0,0 +1,25 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: +mov si,offset essai +call whatis0 + + + mov si,offset pop1 + mov di,offset pop2 + call checksyntax0 +ret + +essai db '#',0 +pop1 db 'essai 0FFh',0 +pop2 db 'ESSAI 012H',0 + include str0.asm + + + +end start diff --git a/commande/write.bat b/commande/write.bat deleted file mode 100755 index 808b110..0000000 --- a/commande/write.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -cd .. -setup -cd sources diff --git a/contribs/MAKEFILE b/contribs/MAKEFILE new file mode 100644 index 0000000..a870e27 --- /dev/null +++ b/contribs/MAKEFILE @@ -0,0 +1,20 @@ +lnk_boot = tlink /x +asm= tasm /t/m5/zi +lnk= tlink /x/t + +all: ex-tasm.exe ex-nasm.exe + +ex-tasm.exe: ex-tasm.asm + $(asm) ex-tasm + $(lnk) ex-tasm + ren ex-tasm.com ex-tasm.exe + +ex-nasm.exe: ex-nasm.asm + nasm ex-nasm.asm -o ex-nasm.exe + +clean: + del *.obj + del *.exe + del *.com + del *.sys + del *.err diff --git a/contribs/ex-nasm.asm b/contribs/ex-nasm.asm new file mode 100644 index 0000000..dca5112 --- /dev/null +++ b/contribs/ex-nasm.asm @@ -0,0 +1,14 @@ +[bits 16] ;16 bits +[org 0x0100] ;Point d'entré en 0100h +section .text ;Segment de code + +start: + mov ah,0x0D + mov si,msg + int 0x47 ;Afficher le texte (Showstring0) + xor ax,ax + int 0x16 ;Attendre l'appuie sur une touche + retf ;retour far + +msg db 'Hello World',0 + diff --git a/contribs/ex-tasm.asm b/contribs/ex-tasm.asm new file mode 100644 index 0000000..56d894f --- /dev/null +++ b/contribs/ex-tasm.asm @@ -0,0 +1,19 @@ +.model tiny ;model tiny (.com) +.486 ;Pour processeur 80486 +Smart ;Optimisations +.code ;Segment de code + +org 0100h ;Point d'entré en 0100h + +start: + mov ah,0Dh + mov si,offset msg + int 47h ;Afficher le texte (Showstring0) + xor ax,ax + int 16h ;Attendre l'appuie sur une touche + db 0CBH ;retour far + +msg db 'Hello World',0 + +end start + diff --git a/include/bmp.h b/include/bmp.h new file mode 100644 index 0000000..955fe25 --- /dev/null +++ b/include/bmp.h @@ -0,0 +1,40 @@ +BMP_File struc +BMP_FileType db 'BM' +BMP_FileSize dd ? ; taille du fichier +BMP_Reserved dd 0 ; toujours 0 +BMP_BitMapOffset dd ? ; offset de l'image +BMP_HeaderSize dd ? ; taille de l'entete en octects +BMP_Width dd ? ; largeur en pixels de l'image +BMP_Height dd ? ; hauteur en pixels de l'image +BMP_Planes dw 1 ; nombre de plan utilisés +BMP_BitsPerPixel dw ? ; nombre de bits par pixels +BMP_Compression dd ? ; méthode de compression +BMP_SizeOfBitMap dd ? ; taille de l'image en octects +BMP_HorzResolution dd ? ; resolution horizontale en pixels par mètre +BMP_VertResolution dd ? ; resolution verticale en pixels par mètre +BMP_ColorsUsed dd ? ; nombre de couleur dans la palette si 0: palette entière si BitPerPixel<=8 +BMP_ColorsImportant dd ? ; nombre de couleurs importantes masques pour les modes de plus de 8 bits par pixels +BMP_RedMask dd ? +BMP_GreenMask dd ? +BMP_BlueMask dd ? +BMP_AlphaMask dd ? +BMP_ColorSpaceType dd ? +BMP_RedX dd ? +BMP_RedY dd ? +BMP_RedZ dd ? +BMP_GreenX dd ? +BMP_GreenY dd ? +BMP_GreenZ dd ? +BMP_BlueX dd ? +BMP_BlueY dd ? +BMP_BlueZ dd ? +BMP_GammaRed dd ? +BMP_GammaGreen dd ? +BMP_GammeBlue dd ? +BMP_file ends + +;BMP_Compression peut prendre les valeurs suivantes: +BMP_COMP_UNCOMP equ 0 ; pas de compression +BMP_COMP_RLE8 equ 1 ; 8-bit run length encoding +BMP_COMP_RLE4 equ 2 ; 4-bit tun length encoding +BMP_COMP_BFE equ 3 ; bitfields encoding diff --git a/include/fat.h b/include/fat.h new file mode 100644 index 0000000..4c89a7d --- /dev/null +++ b/include/fat.h @@ -0,0 +1,58 @@ +Free equ 0 +True equ 1 +False equ 0 + +DPT struc +StepRate&HeadUnload db 0DFh ;Vitesse de progression & mont‚e de la tˆte +DMAFlag&HeadLoad db 002h ;Etat Dma et temps de descente de la tˆte +DelayMotorOff db 025h ;Temps avant extinction moteur +BytePerSector db 002h ;Taille des secteurs +SectorPerTracks db 000h ;Nombre de secteur par piste +InterSectGapLength db 01Bh ;Taille du GAP3 en lecture/‚criture +DataLength db 0FFh ;Longueur du transfert de donn‚es +InterSectGapLengthF db 054h ;Taille du GAP3 en formatage +FormatByte db 0F6h ;Octet de formatage +HeadSettlingTime db 000h ;Temps de repos des tˆtes +DelayMotorNormSpeed db 008h ;Temps de mont‚e en vitesse du moteur +DPT ends + +Entries Struc +FileName db 8 dup (0) +FilExt db 3 dup (0) +FileAttr db 0 +FileReserved db 0 +FileTimeCreaMs db 0 ;(*10 ms) +FileTimeCrea dw 0 +FileDateCrea dw 0 +FileDateAcc dw 0 +FileNotused dw 0 +FileTime dw 0 +FileDate dw 0 +FileGroup dw 0 +FileSize dd 0 +Entries Ends + +BootSector Struc +jumper db 0,0,0 +Vendor db 'COS2000A' ;Fabricant + n°série Formatage +SectorSize dw 512 ;octet/secteur +SectorsPerCluster db 1 ;secteur/cluster +ReservedSectors dw 1 ;secteur reserv‚ +FatsPerDrive db 2 ;nb de copie de la FAT +DirectorySize dw 224 ;taille rep racine +SectorsPerDrive dw 2880 ;nb secteur du volume si < 32 még +MédiaDescriptor db 0F0h ;Descripteur de média +SectorsPerFat dw 9 ;secteur/FAT +SectorsPerTrack dw 18 ;secteur/piste +HeadsPerDrive dw 2 ;nb de tˆteb de lecture/écriture +HiddenSectorsH dw 0 ;nombre de secteur cach‚s +HiddenSectorsL dw 0 ; +SectorPerDisk2 dd 0 ;Nombre secteur du volume si > 32 Mo+20h ; the number of sectors +BootDrive db 0 ;Lecteur de d‚marrage +ReservedForNT db 0 ;NA +BootSign db 29h ;boot signature 29h +SerialNumber dd 01020304h ;no de serie +DriveName db 'COS2000 ' ;nom de volume +TypeOffAt db 'FAT16 ' ;FAT +bootcode db 453 dup (0) +BootSector ends diff --git a/include/pci.h b/include/pci.h new file mode 100644 index 0000000..380875e --- /dev/null +++ b/include/pci.h @@ -0,0 +1,19 @@ +pci Struc +vendor dw 0 ;vendor ID (read-only), FFFFh returned if requested device non-existent +device dw 0 ;device ID (read-only) +command dw 0 ;command register +status dw 0 ;status register +revision db 0 ;revision ID +interface db 0 ;programming interface +subclass db 0 ;sub-class +class db 0 ;class code +cache db 0 ;cache line size +timer db 0 ;latency timer +typed db 0 ;header type + ;bits 6-0: header format + ;00h other + ;01h PCI-to-PCI bridge + ;02h PCI-to-CardBus bridge + ;bit 7: multi-function device +result db 0 ;Built-In Self-Test result +pci Ends diff --git a/include/pol8x16.inc b/include/pol8x16.inc new file mode 100644 index 0000000..bd946e6 --- /dev/null +++ b/include/pol8x16.inc @@ -0,0 +1,256 @@ + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 07Eh, 081h, 0A5h, 081h, 081h, 0BDh, 099h, 081h, 07Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 07Eh, 0FFh, 0DBh, 0FFh, 0FFh, 0C3h, 0E7h, 0FFh, 07Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 036h, 07Fh, 07Fh, 07Fh, 07Fh, 03Eh, 01Ch, 008h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 008h, 01Ch, 03Eh, 07Fh, 03Eh, 01Ch, 008h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 018h, 03Ch, 03Ch, 0E7h, 0E7h, 0E7h, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 018h, 03Ch, 07Eh, 0FFh, 0FFh, 07Eh, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 018h, 03Ch, 03Ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0E7h, 0C3h, 0C3h, 0E7h, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h + DB 000h, 000h, 000h, 000h, 03Ch, 066h, 042h, 042h, 066h, 03Ch, 000h, 000h, 000h, 000h, 000h, 000h + DB 0FFh, 0FFh, 0FFh, 0FFh, 0C3h, 099h, 0BDh, 0BDh, 099h, 0C3h, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h + DB 000h, 000h, 00Fh, 007h, 00Dh, 019h, 03Ch, 066h, 066h, 066h, 03Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 03Ch, 066h, 066h, 066h, 03Ch, 018h, 07Eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 03Fh, 033h, 03Fh, 030h, 030h, 030h, 070h, 0F0h, 0E0h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 07Fh, 063h, 07Fh, 063h, 063h, 063h, 067h, 0E7h, 0E6h, 0C0h, 000h, 000h, 000h, 000h + DB 000h, 000h, 018h, 018h, 0DBh, 03Ch, 0E7h, 03Ch, 0DBh, 018h, 018h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 040h, 060h, 070h, 07Ch, 07Fh, 07Ch, 070h, 060h, 040h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 001h, 003h, 007h, 01Fh, 07Fh, 01Fh, 007h, 003h, 001h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 018h, 03Ch, 07Eh, 018h, 018h, 018h, 07Eh, 03Ch, 018h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 033h, 033h, 033h, 033h, 033h, 033h, 000h, 033h, 033h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 07Fh, 0DBh, 0DBh, 0DBh, 07Bh, 01Bh, 01Bh, 01Bh, 01Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 03Eh, 063h, 030h, 01Ch, 036h, 063h, 063h, 036h, 01Ch, 006h, 063h, 03Eh, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07Fh, 07Fh, 07Fh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 018h, 03Ch, 07Eh, 018h, 018h, 018h, 07Eh, 03Ch, 018h, 07Eh, 000h, 000h, 000h, 000h + DB 000h, 000h, 018h, 03Ch, 07Eh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 018h, 018h, 018h, 018h, 018h, 018h, 07Eh, 03Ch, 018h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 00Ch, 006h, 07Fh, 006h, 00Ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 018h, 030h, 07Fh, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 060h, 060h, 060h, 07Fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 024h, 066h, 0FFh, 066h, 024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 008h, 01Ch, 01Ch, 03Eh, 03Eh, 07Fh, 07Fh, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 07Fh, 07Fh, 03Eh, 03Eh, 01Ch, 01Ch, 008h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 000h, 000h, 010h, 010h, 000h, 000h, 000h, 000h + DB 000h, 024h, 024h, 024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 042h, 042h, 042h, 0FFh, 042h, 042h, 042h, 0FFh, 042h, 042h, 042h, 000h, 000h, 000h, 000h + DB 000h, 010h, 07Eh, 090h, 090h, 090h, 07Ch, 012h, 012h, 012h, 0FCh, 010h, 000h, 000h, 000h, 000h + DB 000h, 000h, 061h, 091h, 092h, 064h, 008h, 010h, 026h, 049h, 089h, 086h, 000h, 000h, 000h, 000h + DB 000h, 070h, 088h, 088h, 088h, 050h, 060h, 091h, 08Ah, 084h, 04Ah, 031h, 000h, 000h, 000h, 000h + DB 000h, 018h, 018h, 010h, 020h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 006h, 018h, 020h, 040h, 040h, 040h, 040h, 040h, 020h, 018h, 006h, 000h, 000h, 000h, 000h + DB 000h, 060h, 018h, 004h, 002h, 002h, 002h, 002h, 002h, 004h, 018h, 060h, 000h, 000h, 000h, 000h + DB 000h, 000h, 010h, 092h, 054h, 038h, 0FEh, 038h, 054h, 092h, 010h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 010h, 010h, 010h, 0FEh, 010h, 010h, 010h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 010h, 020h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 0FEh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h + DB 000h, 000h, 001h, 001h, 002h, 004h, 008h, 010h, 020h, 040h, 080h, 080h, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 083h, 085h, 089h, 091h, 0A1h, 0C1h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 010h, 030h, 050h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 07Ch, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 001h, 002h, 03Ch, 040h, 080h, 080h, 080h, 0FFh, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 001h, 002h, 03Ch, 002h, 001h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 002h, 006h, 00Ah, 012h, 022h, 042h, 082h, 0FFh, 002h, 002h, 002h, 000h, 000h, 000h, 000h + DB 000h, 0FFh, 080h, 080h, 080h, 0FCh, 002h, 001h, 001h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 080h, 0BCh, 0C2h, 081h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 0FFh, 081h, 001h, 002h, 004h, 008h, 010h, 010h, 010h, 010h, 010h, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 081h, 042h, 03Ch, 042h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 081h, 043h, 03Dh, 001h, 001h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 018h, 018h, 010h, 020h, 000h, 000h + DB 000h, 002h, 004h, 008h, 010h, 020h, 040h, 020h, 010h, 008h, 004h, 002h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 0FEh, 000h, 000h, 000h, 0FEh, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 040h, 020h, 010h, 008h, 004h, 002h, 004h, 008h, 010h, 020h, 040h, 000h, 000h, 000h, 000h + DB 000h, 038h, 044h, 082h, 082h, 004h, 008h, 010h, 010h, 000h, 010h, 010h, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 099h, 0A5h, 0A5h, 0A5h, 09Eh, 080h, 041h, 03Eh, 000h, 000h, 000h, 000h + DB 000h, 018h, 024h, 042h, 081h, 081h, 0FFh, 081h, 081h, 081h, 081h, 081h, 000h, 000h, 000h, 000h + DB 000h, 0FCh, 042h, 041h, 041h, 042h, 07Ch, 042h, 041h, 041h, 042h, 0FCh, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 081h, 080h, 080h, 080h, 080h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 0FCh, 042h, 041h, 041h, 041h, 041h, 041h, 041h, 041h, 042h, 0FCh, 000h, 000h, 000h, 000h + DB 000h, 0FFh, 080h, 080h, 080h, 080h, 0FCh, 080h, 080h, 080h, 080h, 0FFh, 000h, 000h, 000h, 000h + DB 000h, 0FFh, 080h, 080h, 080h, 080h, 0FCh, 080h, 080h, 080h, 080h, 080h, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 081h, 080h, 09Fh, 081h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 081h, 081h, 081h, 081h, 081h, 0FFh, 081h, 081h, 081h, 081h, 081h, 000h, 000h, 000h, 000h + DB 000h, 038h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 038h, 000h, 000h, 000h, 000h + DB 000h, 007h, 002h, 002h, 002h, 002h, 002h, 002h, 082h, 082h, 044h, 038h, 000h, 000h, 000h, 000h + DB 000h, 081h, 082h, 084h, 088h, 090h, 0E0h, 090h, 088h, 084h, 082h, 081h, 000h, 000h, 000h, 000h + DB 000h, 080h, 080h, 080h, 080h, 080h, 080h, 080h, 080h, 080h, 080h, 0FFh, 000h, 000h, 000h, 000h + DB 000h, 081h, 0C3h, 0A5h, 099h, 099h, 081h, 081h, 081h, 081h, 081h, 081h, 000h, 000h, 000h, 000h + DB 000h, 081h, 0C1h, 0A1h, 091h, 089h, 085h, 083h, 081h, 081h, 081h, 081h, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 081h, 081h, 081h, 081h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 0FCh, 082h, 081h, 081h, 082h, 0FCh, 080h, 080h, 080h, 080h, 080h, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 081h, 081h, 081h, 081h, 089h, 085h, 042h, 03Dh, 000h, 000h, 000h, 000h + DB 000h, 0FCh, 082h, 081h, 081h, 082h, 0FCh, 090h, 088h, 084h, 082h, 081h, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 042h, 081h, 080h, 040h, 03Ch, 002h, 001h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 0FEh, 092h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 000h, 000h, 000h, 000h + DB 000h, 081h, 081h, 081h, 081h, 081h, 081h, 081h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 081h, 081h, 081h, 081h, 081h, 042h, 042h, 024h, 024h, 018h, 018h, 000h, 000h, 000h, 000h + DB 000h, 081h, 081h, 081h, 081h, 081h, 081h, 099h, 099h, 0A5h, 0A5h, 042h, 000h, 000h, 000h, 000h + DB 000h, 081h, 081h, 081h, 042h, 024h, 018h, 024h, 042h, 081h, 081h, 081h, 000h, 000h, 000h, 000h + DB 000h, 082h, 082h, 082h, 082h, 044h, 028h, 010h, 010h, 010h, 010h, 010h, 000h, 000h, 000h, 000h + DB 000h, 0FFh, 001h, 001h, 002h, 004h, 018h, 020h, 040h, 080h, 080h, 0FFh, 000h, 000h, 000h, 000h + DB 000h, 07Eh, 040h, 040h, 040h, 040h, 040h, 040h, 040h, 040h, 040h, 07Eh, 000h, 000h, 000h, 000h + DB 000h, 000h, 080h, 080h, 040h, 020h, 010h, 008h, 004h, 002h, 001h, 001h, 000h, 000h, 000h, 000h + DB 000h, 07Eh, 002h, 002h, 002h, 002h, 002h, 002h, 002h, 002h, 002h, 07Eh, 000h, 000h, 000h, 000h + DB 000h, 018h, 024h, 042h, 081h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 000h, 000h + DB 000h, 008h, 004h, 002h, 001h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 07Ch, 002h, 002h, 07Eh, 082h, 082h, 07Dh, 000h, 000h, 000h, 000h + DB 000h, 080h, 080h, 080h, 080h, 0BCh, 0C2h, 081h, 081h, 081h, 0C2h, 0BCh, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 03Ch, 042h, 080h, 080h, 080h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 001h, 001h, 001h, 001h, 03Dh, 043h, 081h, 081h, 081h, 043h, 03Dh, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 03Ch, 042h, 081h, 0FFh, 080h, 040h, 03Eh, 000h, 000h, 000h, 000h + DB 000h, 00Eh, 011h, 010h, 010h, 0FEh, 010h, 010h, 010h, 010h, 010h, 010h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 03Dh, 043h, 081h, 081h, 043h, 03Dh, 001h, 002h, 07Ch, 000h, 000h + DB 000h, 080h, 080h, 080h, 080h, 0BCh, 0C2h, 081h, 081h, 081h, 081h, 081h, 000h, 000h, 000h, 000h + DB 000h, 000h, 008h, 008h, 000h, 038h, 008h, 008h, 008h, 008h, 008h, 03Eh, 000h, 000h, 000h, 000h + DB 000h, 000h, 002h, 002h, 000h, 006h, 002h, 002h, 002h, 002h, 002h, 082h, 044h, 038h, 000h, 000h + DB 000h, 080h, 080h, 080h, 080h, 082h, 084h, 088h, 090h, 0A8h, 0C4h, 082h, 000h, 000h, 000h, 000h + DB 038h, 008h, 008h, 008h, 008h, 008h, 008h, 008h, 008h, 008h, 008h, 03Eh, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 0ECh, 092h, 092h, 092h, 092h, 092h, 092h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 0B8h, 0C4h, 082h, 082h, 082h, 082h, 082h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 03Ch, 042h, 081h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 0BCh, 0C2h, 081h, 081h, 081h, 0C2h, 0BCh, 080h, 080h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 03Dh, 043h, 081h, 081h, 081h, 043h, 03Dh, 001h, 001h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 0BEh, 0C1h, 080h, 080h, 080h, 080h, 080h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 07Eh, 081h, 080h, 07Eh, 001h, 081h, 07Eh, 000h, 000h, 000h, 000h + DB 010h, 010h, 010h, 010h, 010h, 0FEh, 010h, 010h, 010h, 010h, 011h, 00Eh, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 081h, 081h, 081h, 081h, 081h, 043h, 03Dh, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 081h, 081h, 081h, 081h, 042h, 024h, 018h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 082h, 082h, 092h, 092h, 092h, 0AAh, 044h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 081h, 042h, 024h, 018h, 024h, 042h, 081h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 081h, 081h, 081h, 081h, 043h, 03Dh, 001h, 002h, 07Ch, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 0FFh, 002h, 004h, 018h, 020h, 040h, 0FFh, 000h, 000h, 000h, 000h + DB 000h, 004h, 008h, 010h, 010h, 010h, 020h, 010h, 010h, 010h, 008h, 004h, 000h, 000h, 000h, 000h + DB 000h, 010h, 010h, 010h, 010h, 000h, 000h, 010h, 010h, 010h, 010h, 000h, 000h, 000h, 000h, 000h + DB 000h, 040h, 020h, 010h, 010h, 010h, 008h, 010h, 010h, 010h, 020h, 040h, 000h, 000h, 000h, 000h + DB 000h, 000h, 070h, 099h, 00Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 008h, 01Ch, 036h, 063h, 063h, 07Fh, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 01Eh, 033h, 061h, 060h, 060h, 061h, 033h, 01Eh, 006h, 003h, 03Eh, 000h, 000h, 000h + DB 000h, 000h, 066h, 066h, 000h, 066h, 066h, 066h, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 006h, 00Ch, 018h, 000h, 03Eh, 063h, 07Fh, 060h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 008h, 01Ch, 036h, 000h, 03Ch, 006h, 03Eh, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 066h, 066h, 000h, 03Ch, 006h, 03Eh, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 030h, 018h, 00Ch, 000h, 03Ch, 006h, 03Eh, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 01Ch, 036h, 01Ch, 000h, 03Ch, 006h, 03Eh, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 03Ch, 066h, 060h, 066h, 03Ch, 00Ch, 006h, 03Ch, 000h, 000h, 000h, 000h + DB 000h, 008h, 01Ch, 036h, 000h, 03Eh, 063h, 07Fh, 060h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 066h, 066h, 000h, 03Eh, 063h, 07Fh, 060h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 030h, 018h, 00Ch, 000h, 03Eh, 063h, 07Fh, 060h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 066h, 066h, 000h, 038h, 018h, 018h, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 018h, 03Ch, 066h, 000h, 038h, 018h, 018h, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 060h, 030h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 063h, 063h, 008h, 01Ch, 036h, 063h, 063h, 07Fh, 063h, 063h, 000h, 000h, 000h, 000h, 000h + DB 01Ch, 036h, 01Ch, 000h, 01Ch, 036h, 063h, 063h, 07Fh, 063h, 063h, 000h, 000h, 000h, 000h, 000h + DB 00Ch, 018h, 030h, 000h, 07Fh, 033h, 030h, 03Eh, 030h, 033h, 07Fh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 06Eh, 03Bh, 01Bh, 07Eh, 0D8h, 0DCh, 077h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 01Fh, 036h, 066h, 066h, 07Fh, 066h, 066h, 066h, 067h, 000h, 000h, 000h, 000h, 000h + DB 000h, 008h, 01Ch, 036h, 000h, 03Eh, 063h, 063h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 063h, 063h, 000h, 03Eh, 063h, 063h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 030h, 018h, 00Ch, 000h, 03Eh, 063h, 063h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 018h, 03Ch, 066h, 000h, 066h, 066h, 066h, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 030h, 018h, 00Ch, 000h, 066h, 066h, 066h, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 063h, 063h, 000h, 063h, 063h, 063h, 063h, 03Fh, 003h, 006h, 03Ch, 000h, 000h, 000h + DB 000h, 063h, 063h, 01Ch, 036h, 063h, 063h, 063h, 063h, 036h, 01Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 063h, 063h, 000h, 063h, 063h, 063h, 063h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 018h, 018h, 07Eh, 0C3h, 0C0h, 0C0h, 0C3h, 07Eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h + DB 000h, 01Ch, 036h, 032h, 030h, 078h, 030h, 030h, 030h, 073h, 07Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 0C3h, 066h, 03Ch, 018h, 0FFh, 018h, 0FFh, 018h, 018h, 000h, 000h, 000h, 000h, 000h + DB 000h, 0FCh, 066h, 066h, 07Ch, 062h, 066h, 06Fh, 066h, 066h, 0F3h, 000h, 000h, 000h, 000h, 000h + DB 000h, 00Eh, 01Bh, 018h, 018h, 018h, 07Eh, 018h, 018h, 018h, 018h, 0D8h, 070h, 000h, 000h, 000h + DB 000h, 00Ch, 018h, 030h, 000h, 03Ch, 006h, 03Eh, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 00Ch, 018h, 030h, 000h, 038h, 018h, 018h, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 00Ch, 018h, 030h, 000h, 03Eh, 063h, 063h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 00Ch, 018h, 030h, 000h, 066h, 066h, 066h, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 03Bh, 06Eh, 000h, 06Eh, 033h, 033h, 033h, 033h, 033h, 000h, 000h, 000h, 000h, 000h + DB 03Bh, 06Eh, 000h, 063h, 073h, 07Bh, 07Fh, 06Fh, 067h, 063h, 063h, 000h, 000h, 000h, 000h, 000h + DB 000h, 03Ch, 06Ch, 06Ch, 03Eh, 000h, 07Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 038h, 06Ch, 06Ch, 038h, 000h, 07Ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 018h, 018h, 000h, 018h, 018h, 030h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 07Fh, 060h, 060h, 060h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 07Fh, 003h, 003h, 003h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 060h, 0E0h, 063h, 066h, 06Ch, 018h, 030h, 06Eh, 0C3h, 006h, 00Ch, 01Fh, 000h, 000h, 000h + DB 000h, 060h, 0E0h, 063h, 066h, 06Ch, 018h, 033h, 067h, 0CFh, 01Fh, 003h, 003h, 000h, 000h, 000h + DB 000h, 000h, 018h, 018h, 000h, 018h, 018h, 03Ch, 03Ch, 03Ch, 018h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 01Bh, 036h, 06Ch, 036h, 01Bh, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 06Ch, 036h, 01Bh, 036h, 06Ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 000h, 000h + DB 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 000h, 000h + DB 0DDh, 077h, 0DDh, 077h, 0DDh, 077h, 0DDh, 077h, 0DDh, 077h, 0DDh, 077h, 0DDh, 077h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0F8h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 0F8h, 018h, 0F8h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0F6h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FEh, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 0F8h, 018h, 0F8h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 0F6h, 006h, 0F6h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 0FEh, 006h, 0F6h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 0F6h, 006h, 0FEh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0FEh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 0F8h, 018h, 0F8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0F8h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 01Fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 01Fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0FFh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 01Fh, 018h, 01Fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 037h, 030h, 03Fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 03Fh, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 0F7h, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 0F7h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 0F7h, 000h, 0F7h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 0FFh, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 0FFh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 03Fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 01Fh, 018h, 01Fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 01Fh, 018h, 01Fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 03Fh, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0FFh, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 0FFh, 018h, 0FFh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0F8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 01Fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h + DB 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 000h, 000h + DB 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 000h, 000h + DB 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 03Bh, 06Eh, 06Ch, 06Ch, 06Eh, 03Bh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 03Eh, 063h, 07Eh, 063h, 063h, 07Eh, 060h, 060h, 020h, 000h, 000h, 000h + DB 000h, 000h, 07Fh, 063h, 063h, 060h, 060h, 060h, 060h, 060h, 060h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 07Fh, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 07Fh, 063h, 030h, 018h, 00Ch, 018h, 030h, 063h, 07Fh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 03Fh, 06Ch, 06Ch, 06Ch, 06Ch, 038h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 033h, 033h, 033h, 033h, 03Eh, 030h, 030h, 060h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 03Bh, 06Eh, 00Ch, 00Ch, 00Ch, 00Ch, 00Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 07Eh, 018h, 03Ch, 066h, 066h, 066h, 03Ch, 018h, 07Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 01Ch, 036h, 063h, 063h, 07Fh, 063h, 063h, 036h, 01Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 01Ch, 036h, 063h, 063h, 063h, 036h, 036h, 036h, 077h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 01Eh, 030h, 018h, 00Ch, 03Eh, 066h, 066h, 066h, 03Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 07Eh, 0DBh, 0DBh, 07Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 003h, 006h, 07Eh, 0DBh, 0DBh, 0F3h, 07Eh, 060h, 0C0h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 01Ch, 030h, 060h, 060h, 07Ch, 060h, 060h, 030h, 01Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 03Eh, 063h, 063h, 063h, 063h, 063h, 063h, 063h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 07Fh, 000h, 000h, 07Fh, 000h, 000h, 07Fh, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 018h, 018h, 018h, 0FFh, 018h, 018h, 018h, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 030h, 018h, 00Ch, 006h, 00Ch, 018h, 030h, 000h, 07Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 00Ch, 018h, 030h, 060h, 030h, 018h, 00Ch, 000h, 07Eh, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 00Eh, 01Bh, 01Bh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h + DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0D8h, 0D8h, 070h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 018h, 018h, 000h, 000h, 0FFh, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 03Bh, 06Eh, 000h, 03Bh, 06Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 038h, 06Ch, 06Ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 00Fh, 00Ch, 00Ch, 00Ch, 00Ch, 00Ch, 0ECh, 06Ch, 03Ch, 01Ch, 000h, 000h, 000h, 000h, 000h + DB 000h, 0D8h, 06Ch, 06Ch, 06Ch, 06Ch, 06Ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 070h, 0D8h, 030h, 060h, 0C8h, 0F8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 03Eh, 03Eh, 03Eh, 03Eh, 03Eh, 03Eh, 000h, 000h, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h diff --git a/include/pol8x8.inc b/include/pol8x8.inc new file mode 100644 index 0000000..7d5f4c0 --- /dev/null +++ b/include/pol8x8.inc @@ -0,0 +1,128 @@ + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07Eh, 081h, 0A5h, 081h, 0BDh, 099h, 081h, 07Eh + DB 07Eh, 0FFh, 0DBh, 0FFh, 0C3h, 0E7h, 0FFh, 07Eh, 06Ch, 0FEh, 0FEh, 0FEh, 07Ch, 038h, 010h, 000h + DB 010h, 038h, 07Ch, 0FEh, 07Ch, 038h, 010h, 000h, 038h, 07Ch, 038h, 0FEh, 0FEh, 07Ch, 038h, 07Ch + DB 010h, 010h, 038h, 07Ch, 0FEh, 07Ch, 038h, 07Ch, 000h, 000h, 018h, 03Ch, 03Ch, 018h, 000h, 000h + DB 0FFh, 0FFh, 0E7h, 0C3h, 0C3h, 0E7h, 0FFh, 0FFh, 000h, 03Ch, 066h, 042h, 042h, 066h, 03Ch, 000h + DB 0FFh, 0C3h, 099h, 0BDh, 0BDh, 099h, 0C3h, 0FFh, 00Fh, 007h, 00Fh, 07Dh, 0CCh, 0CCh, 0CCh, 078h + DB 03Ch, 066h, 066h, 066h, 03Ch, 018h, 07Eh, 018h, 03Fh, 033h, 03Fh, 030h, 030h, 070h, 0F0h, 0E0h + DB 07Fh, 063h, 07Fh, 063h, 063h, 067h, 0E6h, 0C0h, 099h, 05Ah, 03Ch, 0E7h, 0E7h, 03Ch, 05Ah, 099h + DB 080h, 0E0h, 0F8h, 0FEh, 0F8h, 0E0h, 080h, 000h, 002h, 00Eh, 03Eh, 0FEh, 03Eh, 00Eh, 002h, 000h + DB 018h, 03Ch, 07Eh, 018h, 018h, 07Eh, 03Ch, 018h, 066h, 066h, 066h, 066h, 066h, 000h, 066h, 000h + DB 07Fh, 0DBh, 0DBh, 07Bh, 01Bh, 01Bh, 01Bh, 000h, 03Eh, 063h, 038h, 06Ch, 06Ch, 038h, 0CCh, 078h + DB 000h, 000h, 000h, 000h, 07Eh, 07Eh, 07Eh, 000h, 018h, 03Ch, 07Eh, 018h, 07Eh, 03Ch, 018h, 0FFh + DB 018h, 03Ch, 07Eh, 018h, 018h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 07Eh, 03Ch, 018h, 000h + DB 000h, 018h, 00Ch, 0FEh, 00Ch, 018h, 000h, 000h, 000h, 030h, 060h, 0FEh, 060h, 030h, 000h, 000h + DB 000h, 000h, 0C0h, 0C0h, 0C0h, 0FEh, 000h, 000h, 000h, 024h, 066h, 0FFh, 066h, 024h, 000h, 000h + DB 000h, 018h, 03Ch, 07Eh, 0FFh, 0FFh, 000h, 000h, 000h, 0FFh, 0FFh, 07Eh, 03Ch, 018h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 040h, 040h, 040h, 040h, 040h, 000h, 040h, 000h + DB 090h, 090h, 000h, 000h, 000h, 000h, 000h, 000h, 050h, 050h, 0F8h, 050h, 0F8h, 050h, 050h, 000h + DB 020h, 078h, 0A0h, 070h, 028h, 0F0h, 020h, 000h, 0C8h, 0C8h, 010h, 020h, 040h, 098h, 098h, 000h + DB 070h, 088h, 050h, 020h, 054h, 088h, 074h, 000h, 060h, 020h, 040h, 000h, 000h, 000h, 000h, 000h + DB 020h, 040h, 080h, 080h, 080h, 040h, 020h, 000h, 020h, 010h, 008h, 008h, 008h, 010h, 020h, 000h + DB 000h, 020h, 0A8h, 070h, 070h, 0A8h, 020h, 000h, 000h, 000h, 020h, 020h, 0F8h, 020h, 020h, 000h + DB 000h, 000h, 000h, 000h, 000h, 060h, 020h, 040h, 000h, 000h, 000h, 000h, 0F8h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 000h, 060h, 060h, 000h, 002h, 004h, 008h, 010h, 020h, 040h, 080h, 000h + DB 070h, 088h, 098h, 0A8h, 0C8h, 088h, 070h, 000h, 040h, 0C0h, 040h, 040h, 040h, 040h, 0E0h, 000h + DB 070h, 088h, 008h, 010h, 020h, 040h, 0F8h, 000h, 070h, 088h, 008h, 010h, 008h, 088h, 070h, 000h + DB 008h, 018h, 028h, 048h, 0FCh, 008h, 008h, 000h, 0F8h, 080h, 080h, 0F0h, 008h, 088h, 070h, 000h + DB 020h, 040h, 080h, 0F0h, 088h, 088h, 070h, 000h, 0F8h, 008h, 010h, 020h, 040h, 040h, 040h, 000h + DB 070h, 088h, 088h, 070h, 088h, 088h, 070h, 000h, 070h, 088h, 088h, 078h, 008h, 008h, 070h, 000h + DB 000h, 000h, 060h, 060h, 000h, 060h, 060h, 000h, 000h, 000h, 060h, 060h, 000h, 060h, 060h, 020h + DB 010h, 020h, 040h, 080h, 040h, 020h, 010h, 000h, 000h, 000h, 0F8h, 000h, 0F8h, 000h, 000h, 000h + DB 080h, 040h, 020h, 010h, 020h, 040h, 080h, 000h, 078h, 084h, 004h, 008h, 010h, 000h, 010h, 000h + DB 070h, 088h, 088h, 0A8h, 0B8h, 080h, 078h, 000h, 020h, 050h, 088h, 088h, 0F8h, 088h, 088h, 000h + DB 0F0h, 088h, 088h, 0F0h, 088h, 088h, 0F0h, 000h, 070h, 088h, 080h, 080h, 080h, 088h, 070h, 000h + DB 0F0h, 088h, 088h, 088h, 088h, 088h, 0F0h, 000h, 0F8h, 080h, 080h, 0E0h, 080h, 080h, 0F8h, 000h + DB 0F8h, 080h, 080h, 0E0h, 080h, 080h, 080h, 000h, 070h, 088h, 080h, 080h, 098h, 088h, 078h, 000h + DB 088h, 088h, 088h, 0F8h, 088h, 088h, 088h, 000h, 0E0h, 040h, 040h, 040h, 040h, 040h, 0E0h, 000h + DB 038h, 010h, 010h, 010h, 010h, 090h, 060h, 000h, 088h, 090h, 0A0h, 0C0h, 0A0h, 090h, 088h, 000h + DB 080h, 080h, 080h, 080h, 080h, 080h, 0F8h, 000h, 082h, 0C6h, 0AAh, 092h, 082h, 082h, 082h, 000h + DB 084h, 0C4h, 0A4h, 094h, 08Ch, 084h, 084h, 000h, 070h, 088h, 088h, 088h, 088h, 088h, 070h, 000h + DB 0F0h, 088h, 088h, 0F0h, 080h, 080h, 080h, 000h, 070h, 088h, 088h, 088h, 0A8h, 090h, 068h, 000h + DB 0F0h, 088h, 088h, 0F0h, 0A0h, 090h, 088h, 000h, 070h, 088h, 080h, 070h, 008h, 088h, 070h, 000h + DB 0F8h, 020h, 020h, 020h, 020h, 020h, 020h, 000h, 088h, 088h, 088h, 088h, 088h, 088h, 070h, 000h + DB 088h, 088h, 088h, 050h, 050h, 020h, 020h, 000h, 082h, 082h, 082h, 082h, 092h, 092h, 06Ch, 000h + DB 088h, 088h, 050h, 020h, 050h, 088h, 088h, 000h, 088h, 088h, 088h, 050h, 020h, 020h, 020h, 000h + DB 0F8h, 008h, 010h, 020h, 040h, 080h, 0F8h, 000h, 0E0h, 080h, 080h, 080h, 080h, 080h, 0E0h, 000h + DB 080h, 040h, 020h, 010h, 008h, 004h, 002h, 000h, 0E0h, 020h, 020h, 020h, 020h, 020h, 0E0h, 000h + DB 020h, 050h, 088h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0F8h, 000h + DB 040h, 020h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 070h, 008h, 078h, 088h, 074h, 000h + DB 080h, 080h, 0B0h, 0C8h, 088h, 0C8h, 0B0h, 000h, 000h, 000h, 070h, 088h, 080h, 088h, 070h, 000h + DB 008h, 008h, 068h, 098h, 088h, 098h, 068h, 000h, 000h, 000h, 070h, 088h, 0F8h, 080h, 070h, 000h + DB 030h, 048h, 040h, 0E0h, 040h, 040h, 040h, 000h, 000h, 000h, 034h, 048h, 048h, 038h, 008h, 030h + DB 080h, 080h, 0B0h, 0C8h, 088h, 088h, 088h, 000h, 020h, 000h, 060h, 020h, 020h, 020h, 070h, 000h + DB 010h, 000h, 030h, 010h, 010h, 010h, 090h, 060h, 080h, 080h, 088h, 090h, 0A0h, 0D0h, 088h, 000h + DB 0C0h, 040h, 040h, 040h, 040h, 040h, 0E0h, 000h, 000h, 000h, 0ECh, 092h, 092h, 092h, 092h, 000h + DB 000h, 000h, 0B0h, 0C8h, 088h, 088h, 088h, 000h, 000h, 000h, 070h, 088h, 088h, 088h, 070h, 000h + DB 000h, 000h, 0B0h, 0C8h, 0C8h, 0B0h, 080h, 080h, 000h, 000h, 068h, 098h, 098h, 068h, 008h, 008h + DB 000h, 000h, 0B0h, 0C8h, 080h, 080h, 080h, 000h, 000h, 000h, 078h, 080h, 070h, 008h, 0F0h, 000h + DB 040h, 040h, 0E0h, 040h, 040h, 050h, 020h, 000h, 000h, 000h, 088h, 088h, 088h, 098h, 068h, 000h + DB 000h, 000h, 088h, 088h, 088h, 050h, 020h, 000h, 000h, 000h, 082h, 082h, 092h, 092h, 06Ch, 000h + DB 000h, 000h, 088h, 050h, 020h, 050h, 088h, 000h, 000h, 000h, 088h, 088h, 098h, 068h, 008h, 070h + DB 000h, 000h, 0F8h, 010h, 020h, 040h, 0F8h, 000h, 010h, 020h, 020h, 040h, 020h, 020h, 010h, 000h + DB 040h, 040h, 040h, 000h, 040h, 040h, 040h, 000h, 040h, 020h, 020h, 010h, 020h, 020h, 040h, 000h + DB 076h, 0DCh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 06Ch, 0C6h, 0C6h, 0FEh, 000h + DB 03Eh, 060h, 0C0h, 060h, 03Eh, 008h, 004h, 018h, 000h, 048h, 000h, 0CCh, 0CCh, 0CCh, 0CCh, 076h + DB 018h, 020h, 000h, 078h, 0CCh, 0FCh, 0C0h, 078h, 010h, 028h, 000h, 078h, 00Ch, 07Ch, 0CCh, 076h + DB 000h, 048h, 000h, 078h, 00Ch, 07Ch, 0CCh, 076h, 030h, 008h, 000h, 078h, 00Ch, 07Ch, 0CCh, 076h + DB 048h, 030h, 000h, 078h, 00Ch, 07Ch, 0CCh, 076h, 078h, 0CCh, 0C0h, 0CCh, 078h, 010h, 008h, 030h + DB 030h, 048h, 084h, 078h, 0CCh, 0FCh, 0C0h, 078h, 000h, 048h, 000h, 078h, 0CCh, 0FCh, 0C0h, 078h + DB 030h, 008h, 000h, 078h, 0CCh, 0FCh, 0C0h, 078h, 000h, 048h, 000h, 030h, 030h, 030h, 030h, 030h + DB 030h, 048h, 000h, 030h, 030h, 030h, 030h, 030h, 060h, 010h, 000h, 030h, 030h, 030h, 030h, 030h + DB 048h, 000h, 030h, 078h, 0CCh, 0CCh, 0FCh, 0CCh, 030h, 048h, 030h, 048h, 084h, 0FCh, 084h, 084h + DB 018h, 020h, 000h, 0F8h, 080h, 0F0h, 080h, 0F8h, 000h, 000h, 000h, 066h, 019h, 077h, 088h, 077h + DB 000h, 000h, 000h, 00Fh, 014h, 03Eh, 044h, 087h, 030h, 048h, 084h, 078h, 0CCh, 0CCh, 0CCh, 078h + DB 000h, 048h, 000h, 078h, 0CCh, 0CCh, 0CCh, 078h, 060h, 010h, 000h, 078h, 0CCh, 0CCh, 0CCh, 078h + DB 030h, 048h, 084h, 000h, 0CCh, 0CCh, 0CCh, 076h, 060h, 010h, 000h, 0CCh, 0CCh, 0CCh, 0CCh, 076h + DB 048h, 000h, 0CCh, 0CCh, 0CCh, 07Ch, 00Ch, 0F8h, 044h, 000h, 038h, 06Ch, 0C6h, 0C6h, 06Ch, 038h + DB 024h, 000h, 066h, 066h, 066h, 066h, 066h, 03Ch, 000h, 008h, 01Ch, 028h, 028h, 01Ch, 008h, 000h + DB 01Ch, 022h, 020h, 070h, 020h, 022h, 05Ch, 000h, 044h, 028h, 010h, 010h, 038h, 010h, 038h, 010h + DB 0F0h, 088h, 08Ah, 0F7h, 082h, 082h, 083h, 000h, 006h, 008h, 008h, 03Ch, 010h, 010h, 060h, 000h + DB 018h, 020h, 000h, 078h, 00Ch, 07Ch, 0CCh, 076h, 018h, 020h, 000h, 030h, 030h, 030h, 030h, 030h + DB 018h, 020h, 000h, 078h, 0CCh, 0CCh, 0CCh, 078h, 018h, 020h, 000h, 0CCh, 0CCh, 0CCh, 0CCh, 076h + DB 080h, 078h, 004h, 0F8h, 0CCh, 0CCh, 0CCh, 0CCh, 080h, 07Eh, 001h, 0C6h, 0E6h, 0D6h, 0CEh, 0C6h + DB 000h, 078h, 00Ch, 07Ch, 0CCh, 076h, 000h, 0FEh, 000h, 078h, 0CCh, 0CCh, 0CCh, 078h, 000h, 0FCh + DB 000h, 000h, 018h, 018h, 030h, 060h, 066h, 03Ch, 0FFh, 080h, 080h, 080h, 000h, 000h, 000h, 000h + DB 0FFh, 001h, 001h, 001h, 000h, 000h, 000h, 000h, 040h, 0C4h, 048h, 050h, 026h, 049h, 082h, 007h + DB 040h, 0C4h, 048h, 050h, 026h, 04Ah, 09Fh, 002h, 000h, 030h, 000h, 030h, 030h, 030h, 030h, 030h + DB 000h, 012h, 024h, 048h, 090h, 048h, 024h, 012h, 000h, 048h, 024h, 012h, 009h, 012h, 024h, 048h + DB 049h, 000h, 092h, 000h, 049h, 000h, 092h, 000h, 06Dh, 000h, 0B6h, 000h, 06Dh, 000h, 0B6h, 000h + DB 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 010h + DB 010h, 010h, 010h, 010h, 0F0h, 010h, 010h, 010h, 010h, 010h, 010h, 0F0h, 010h, 0F0h, 010h, 010h + DB 028h, 028h, 028h, 028h, 0E8h, 028h, 028h, 028h, 000h, 000h, 000h, 000h, 0F8h, 028h, 028h, 028h + DB 000h, 000h, 000h, 0F0h, 010h, 0F0h, 010h, 010h, 028h, 028h, 028h, 0E8h, 008h, 0E8h, 028h, 028h + DB 028h, 028h, 028h, 028h, 028h, 028h, 028h, 028h, 000h, 000h, 000h, 0F8h, 008h, 0E8h, 028h, 028h + DB 028h, 028h, 028h, 0E8h, 008h, 0F8h, 000h, 000h, 028h, 028h, 028h, 028h, 0F8h, 000h, 000h, 000h + DB 010h, 010h, 010h, 0F0h, 010h, 0F0h, 000h, 000h, 000h, 000h, 000h, 000h, 0F0h, 010h, 010h, 010h + DB 010h, 010h, 010h, 010h, 01Fh, 000h, 000h, 000h, 010h, 010h, 010h, 010h, 0FFh, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 0FFh, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 01Fh, 010h, 010h, 010h + DB 000h, 000h, 000h, 000h, 0FFh, 000h, 000h, 000h, 010h, 010h, 010h, 010h, 0FFh, 010h, 010h, 010h + DB 010h, 010h, 010h, 01Fh, 010h, 01Fh, 010h, 010h, 028h, 028h, 028h, 028h, 03Fh, 028h, 028h, 028h + DB 028h, 028h, 028h, 02Fh, 020h, 03Fh, 000h, 000h, 000h, 000h, 000h, 03Fh, 020h, 02Fh, 028h, 028h + DB 028h, 028h, 028h, 0EFh, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 0EFh, 028h, 028h + DB 028h, 028h, 028h, 02Fh, 020h, 02Fh, 028h, 028h, 000h, 000h, 000h, 0FFh, 000h, 0FFh, 000h, 000h + DB 028h, 028h, 028h, 0EFh, 000h, 0EFh, 028h, 028h, 010h, 010h, 010h, 0FFh, 000h, 0FFh, 000h, 000h + DB 028h, 028h, 028h, 028h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 0FFh, 010h, 010h + DB 000h, 000h, 000h, 000h, 0FFh, 028h, 028h, 028h, 028h, 028h, 028h, 028h, 03Fh, 000h, 000h, 000h + DB 010h, 010h, 010h, 01Fh, 010h, 01Fh, 000h, 000h, 000h, 000h, 000h, 01Fh, 010h, 01Fh, 010h, 010h + DB 000h, 000h, 000h, 000h, 03Fh, 028h, 028h, 028h, 028h, 028h, 028h, 028h, 0FFh, 028h, 028h, 028h + DB 010h, 010h, 010h, 0FFh, 010h, 0FFh, 010h, 010h, 010h, 010h, 010h, 010h, 0F0h, 000h, 000h, 000h + DB 000h, 000h, 000h, 000h, 01Fh, 010h, 010h, 010h, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh + DB 000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 000h, 0E0h, 0E0h, 0E0h, 0E0h, 0E0h, 0E0h, 0E0h, 0E0h + DB 007h, 007h, 007h, 007h, 007h, 007h, 007h, 007h, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 000h, 000h + DB 000h, 000h, 000h, 002h, 034h, 04Ch, 04Ch, 032h, 000h, 05Ch, 022h, 022h, 03Ch, 044h, 044h, 078h + DB 07Eh, 042h, 042h, 040h, 040h, 040h, 040h, 040h, 000h, 000h, 002h, 07Ch, 0A8h, 028h, 028h, 044h + DB 000h, 07Eh, 061h, 030h, 018h, 008h, 010h, 020h, 000h, 000h, 008h, 07Fh, 088h, 088h, 088h, 070h + DB 000h, 000h, 000h, 022h, 044h, 044h, 07Ah, 080h, 000h, 000h, 000h, 07Ch, 010h, 010h, 010h, 010h + DB 000h, 01Ch, 008h, 03Eh, 041h, 041h, 041h, 03Eh, 000h, 000h, 038h, 044h, 044h, 07Ch, 044h, 044h + DB 03Ch, 066h, 0C3h, 0C3h, 0C3h, 066h, 024h, 066h, 00Ch, 010h, 008h, 01Ch, 022h, 022h, 022h, 01Ch + DB 000h, 000h, 000h, 000h, 06Ch, 092h, 092h, 06Ch, 000h, 001h, 01Ah, 026h, 02Ah, 032h, 02Ch, 040h + DB 000h, 018h, 020h, 020h, 030h, 020h, 020h, 018h, 000h, 03Ch, 042h, 042h, 042h, 042h, 042h, 042h + DB 000h, 000h, 07Eh, 000h, 07Eh, 000h, 07Eh, 000h, 000h, 008h, 008h, 03Eh, 008h, 008h, 000h, 03Eh + DB 000h, 010h, 008h, 004h, 008h, 010h, 000h, 03Eh, 000h, 004h, 008h, 010h, 008h, 004h, 000h, 03Eh + DB 000h, 006h, 009h, 009h, 008h, 008h, 008h, 000h, 000h, 000h, 008h, 008h, 008h, 048h, 048h, 030h + DB 000h, 000h, 008h, 000h, 03Eh, 000h, 008h, 000h, 000h, 060h, 092h, 00Ch, 060h, 092h, 00Ch, 000h + DB 060h, 090h, 060h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 030h, 078h, 030h, 000h, 000h + DB 000h, 000h, 000h, 000h, 020h, 000h, 000h, 000h, 000h, 003h, 004h, 004h, 0C8h, 028h, 010h, 000h + DB 000h, 000h, 000h, 07Ch, 042h, 042h, 042h, 000h, 018h, 024h, 008h, 010h, 03Ch, 000h, 000h, 000h + DB 000h, 000h, 000h, 03Eh, 03Eh, 03Eh, 03Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h diff --git a/install/MAKEFILE b/install/MAKEFILE new file mode 100644 index 0000000..b37e0e8 --- /dev/null +++ b/install/MAKEFILE @@ -0,0 +1,16 @@ +lnk_boot = tlink /x +asm= tasm /t/m5/zi +lnk= tlink /x/t + +all: setup.com + +setup.com: setup.asm + $(asm) setup + $(lnk) setup + +clean: + del *.obj + del *.exe + del *.com + del *.sys + del *.err diff --git a/install/setup.asm b/install/setup.asm old mode 100755 new mode 100644 index 8bc1bb8..a84cf33 --- a/install/setup.asm +++ b/install/setup.asm @@ -1,456 +1,164 @@ -.model tiny -.486 -smart -.code - -org 0100h - -ent equ 32h - -start: -jmp CopyCOS - -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 - -Message db 0Dh,0Ah,'COS 2000b installation program (Celyn Operating System) !!',0Dh,0Ah,'Written By Nico',0Ah,0Dh,'Site online HTTP://WWW.MULTIMANIA.COM/COS2000',0Dh,0AH,'Copyright 2000',0Dh,0AH,'Please insert a floppy disk and press a key...',0Dh,0AH,'Be careful! All the disk is going to be deleted',0Dh,0AH,'$' -Message2 db 0Dh,0AH,'Create boot sector$' -systfile db 0Dh,0AH,'Creating file allocation table 16 bits$' -systfile2 db 0Dh,0AH,'Creating file information table 32 bytes$' -systfile3 db 0Dh,0AH,'Creating operating system files',0Dh,0Ah,'$' -systfile4 db 0D,0Ah,'Creating system tools',0Dh,0Ah,'$' -Errormsg db 0Dh,0AH,0Dh,0AH,'Installing error, please contact me at COS2000@MULTIMANIA.COM !',0Dh,0AH,'$' -Ok db 0Dh,0AH,0Dh,0AH,'The boot sector and the system files had been succefully copied.',0Dh,0AH, 'To try COS reboot with this system disk',0Dh,0AH,'$' -files db '*.*',0 -tools db '*.exe',0 -allboot db 0dh,0ah -boot db 'boot.bin',0,' $' -retu db 0Dh,0AH,'$' -dat db 'data',0 -dat2 db '..',0 -dta db 43 dup (0) - -copycos: - mov ah,4ah - mov bx,1000h - int 21h - jc error - mov ah,48h - mov bx,65536/16 - int 21h - jc error - mov fs,ax -mov ah,3Bh -mov dx,offset dat -int 21h -mov ah,9 -mov dx,offset message -int 21h -jc error -mov ax,0 -int 16h -mov ah,9 -mov dx,offset systfile -int 21h -jc error -mov cx,12 -mov bx,offset fat -erase: -call writesector -jc error -dec cx -jnz erase -mov ah,9 -mov dx,offset message2 -int 21h -jc error -mov dx,Offset allboot -int 21h -jc error -mov dx,offset boot -call addfile -jc error -mov ax,0F0FFh -mov cx,14 -mov di,offset fat -cld -rep stosw -mov bx,offset fat -mov cx,1 -call writesector -jc error -mov ah,9 -mov dx,offset systfile2 -int 21h -jc error -mov eax,0 -mov cx,512/4 -mov di,offset fat -cld -rep stosd -mov bx,offset fat -mov cx,13 -call writesector -jc error -mov ah,1Ah -mov dx,offset dta -int 21h -jc error -mov ah,4eh -xor cx,cx -mov dx,offset files -int 21h -mov ah,9 -mov dx,offset systfile3 -int 21h -jc error -allfile: -mov di,offset dta+43 -mov byte ptr [di],'$' -mov ah,9 -mov si,offset dta+30 -mov cl,13 -call uppercasemem -mov dx,si -cmp dword ptr [si],'toob' -clc -je allfilesend -int 21h -jc error -call addfile -jc error -call makefit -jc error -mov ah,9 -mov dx,offset retu -int 21h -jc error -mov di,offset dta+30 -mov al,0 -mov cl,13 -cld -rep stosb -allfilesend: -mov ah,4fh -int 21h -jnc allfile -mov ah,9 -mov dx,Offset ok -int 21h -mov ah,3Bh -mov dx,offset dat2 -int 21h -ret - -error: -mov ah,3Bh -mov dx,offset dat2 -int 21h -mov ah,9 -mov dx,offset errormsg -int 21h -ret - -addfile: -push ax bx dx si di bp ds es -mov cx,1 -mov bx,offset fat -call readsector -jc error2 -mov ax,3D00h -int 21h -jc error2 -mov cs:temp,ax -mov bx,ax -mov ax,4202h -xor cx,cx -xor dx,dx -int 21h -jc error2 -cmp dx,0 -jne error2 -cmp ax,0 -je error2 -sub ax,1 -shr ax,9 -inc ax -mov bp,ax -mov ax,4200h -xor cx,cx -xor dx,dx -int 21h -jc error2 -push fs -pop ds -push fs -pop es -mov ah,3fh -mov cx,0FFFFh -xor dx,dx -int 21h -push cs -pop ds -jc error2 -mov si,-2 -mov di,0 -xor bx,bx -fats: -add si,2 -cmp si,512 -jz error2 -cmp WORD PTR [si+offset fat],0h -jne fats -mov ax,si -shr ax,1 -cmp di,0 -jne nonew -mov entrie,ax -jmp new -nonew: -mov [offset fat+di],ax -new: -mov di,si -mov cx,ax -call writesector -jc error2 -add bx,512 -dec bp -jnz fats -mov word ptr [offset fat+di],0FFFFh -mov bx,offset fat -mov cx,1 -push cs -pop es -call writesector -mov cx,entrie -end1: -mov ah,3eh -mov bx,cs:temp -int 21h -errorend: -pop es ds bp di si dx bx ax -ret -entrie dw 0 -error2: -mov ah,3eh -mov bx,cs:temp -int 21h -stc -jmp errorend -temp dw 0 - -makefit: -push bx cx si di bp -mov ax,cx -mov bx,offset fat -mov cx,13 -retry: -call readsector -jc error3 -xor si,si -findfit: -cmp byte ptr [si+bx],0 -je finishfit -add si,32 -cmp si,512 -jb findfit -inc cx -jmp retry -finishfit: -mov di,si -add di,bx -mov si,dx -call asciiztofit -jc error3 -mov [di+26],ax -call writesector -jc error3 -end3: -pop bp di si cx bx -ret -error3: -stc -jmp end3 - -WriteSector: -push cx dx si - mov AX, CX - xor DX, DX - div DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor DX, DX - div DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 3 - int 13h - jnc Done - dec SI - jnz TryAgain -Done: - jc enddd - mov cl, AH - mov ah,9 - mov dx,offset sign - int 21h - cmp cl,0 - enddd: - pop si dx cx -ret - -ReadSector: -push ax cx dx si - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain2: - mov AL, 1 - mov DL, 0 - mov AH, 2 - int 13h - jnc Done2 - dec SI - jnz TryAgain2 -Done2: - pop si dx cx ax -ret - -;->name ds:si ->es:di -AsciiZtoFit: -push ax bx cx dx si di ds es -xor bx,bx -mov dx,di -noextens: -mov al,[si+bx] -cmp al,'.' -je extens -call Issystchar -jc errortranslate -mov es:[di],al -inc di -inc bx -cmp bx,namesize ;(.) -jne noextens -erro: -stc -jmp errortranslate -extens: -add si,bx -inc si -sub bx,namesize -neg bx -mov al,0 -mov cx,bx -cld -rep stosb -xor bx,bx -wasextens: -mov al,[si+bx] -cmp al,0 -je endextens -call Issystchar -jc errortranslate -mov es:[di],al -inc di -inc bx -cmp bx,extsize -jne wasextens -jmp erro -endextens: -sub bx,extsize -neg bx -mov al,0 -mov cx,bx -cld -rep stosb -mov si,dx -mov di,dx -push es -pop ds -mov cx,extsize+namesize -call uppercaseMEM -clc -endtranslate: -pop es ds di si dx cx bx ax -ret -errortranslate: -stc -jmp endtranslate - -;Carry si al = caractŠre systŠme -isSystchar: -push di -mov di,offset exeptchar -isexcept: -cmp al,cs:[di] -je nogood -inc di -cmp byte ptr cs:[di],0 -jne isexcept -endanal: -pop di -ret -exeptchar db '/\<>:|.',01,0,0 -nogood: -stc -jmp endanal - -;Transforme les x caractŠres de la mem en ds:si en maj -uppercaseMEM: -push si di cx ax -mov di,si -uppercaser: -mov al,ds:[si] -inc si -cmp al,'A' -jb nonmaj -cmp al,'Z' -ja nonmaj -add al,'a'-'A' -nonmaj: -mov es:[di],al -inc di -dec cx -jnz uppercaser -enduppercase: -clc -pop ax cx di si -ret - -namesize equ 12 -extsize equ 5 - -sign db '.$' -fat DB 512 dup (0) -buffer db 0 - -end start +.model tiny +.486 +smart +.code + +org 0100h + +ent equ 32h + +start: +jmp CopyCOS + +Message db 0Dh,0Ah,'COS 2000 V3.02Fr programme d''installation',0Dh,0AH,'Inserez une disquette formatee et appuyez sur entre...',0Dh,0AH,'Attention le contenu de celle ci peut etre altere !!!',0Dh,0AH,'$' +Message2 db 0Dh,0AH,'Creation du secteur de demarrage...',0Dh,0Ah,'$' +Message3 db 0Dh,0AH,'Copie des fichiers systeme...',0Dh,0Ah,'$' +Errormsg db 0Dh,0AH,'Erreur d''installation, contactez moi a COS2000@MULTIMANIA.COM !',0Dh,0AH,'$' +Ok db 0Dh,0AH,'COS2000 a été correctement installé, veuillez redemarrer votre PC',0Dh,0AH,'$' +files db '*.*',0 +boot db 'boot.bin',0 +dat db 'data',0 +retu db 0Dh,0AH,'$' +dta db 43 dup (0) + +copycos: + mov ah,9 + mov dx,offset message + int 21h + xor ax,ax + int 16h + mov ah,4ah + mov bx,1000h + int 21h + jc error + mov ah,48h + mov bx,65536/16 + int 21h + jc error + mov fs,ax + mov ah,3Bh + mov dx,offset dat + int 21h + jc error + mov ah,1Ah + mov dx,offset dta + int 21h + jc error + mov ah,4eh + xor cx,cx + mov dx,offset files + int 21h + jc error + mov ah,09 + mov dx,offset message3 + int 21h +allfile: + mov byte ptr [offset dta+43],'$' + mov ah,9 + mov dx,offset dta+30 + int 21h + push dx + mov ah,09 + mov dx,offset retu + int 21h + pop dx + mov ax,3D00h + int 21h + jc error + mov bx,ax + mov ax,4202h + xor cx,cx + xor dx,dx + int 21h + jc error + cmp dx,0 + jne error + cmp ax,0 + je error + mov bp,ax + mov ax,4200h + xor cx,cx + xor dx,dx + int 21h + jc error + push fs + pop ds + mov ah,3fh + mov cx,0FFFFh + xor dx,dx + int 21h + push cs + pop ds + jc error + mov ah,3eh + int 21h + jc error + mov ah,3ch + push cs + pop es + mov di,offset dta+30-3 + mov word ptr [di],":a" + mov byte ptr [di+2],"\" + xor cx,cx + mov dx,di + int 21h + jc error + mov bx,ax + push fs + pop ds + xor dx,dx + mov ah,40h + mov cx,bp + int 21h + push cs + pop ds + jc error + mov ah,3eh + int 21h + jc error + mov ah,4fh + int 21h + jnc allfile + mov ah,09 + mov dx,offset message2 + int 21h + mov ax,3D00h + mov dx,offset boot + int 21h + jc error + push fs + pop ds + mov ah,3fh + mov cx,000FFh + xor dx,dx + int 21h + push cs + pop ds + jc error + mov ah,3eh + int 21h + jc error + push fs + pop es + mov ax,0301h + mov dx,0 + mov cx,0001h + xor bx,bx + int 13h + mov ah,09 + mov dx,offset Ok + int 21h + xor ax,ax + int 16h + ret + + +error: + mov ah,09 + mov dx,offset errormsg + int 21h + xor ax,ax + int 16h + ret + +end start diff --git a/noyau/8237.asm b/noyau/8237.asm new file mode 100644 index 0000000..c03dcb1 --- /dev/null +++ b/noyau/8237.asm @@ -0,0 +1,266 @@ +;**************************************************************** +; * +; Periph‚rique : DMA * +; Plages Entr‚es-Sorties : 0000-000F * +; 00C0-00DF * +; 0080-0090 * +; (0094-009F) * +; Plages M‚moires : AUCUNES * +; * +DmaRead equ 044h ;I/O to memory, no autoinit, increment, single mode +DmaWrite equ 048h ;Memory to I/O, no autoinit, increment, single mode + +;Lecture des bits du registre d'‚tat (08, D0 ) +STATUS_REQ3 = 80h ;Bit actif: le canal DMA concern‚ +STATUS_REQ2 = 40h ;re‡oit une requˆte DMA +STATUS_REQ1 = 20h ;Request +STATUS_REQ0 = 10h +STATUS_TC3 = 08h ;Bit actif: Un transfert DMA a ‚t‚ +STATUS_TC2 = 04h ;ex‚cut‚ depuis la derniŠre lecture +STATUS_TC1 = 02h ;du registre d'‚tat. +STATUS_TC0 = 01h ;Terminal Count + +;Ecriture des bits du registre de commande (08, D0) +COMMAND_DACKLEVEL = 80h ;Bit 7 actif: ligne DMA Acknowledge HIGH active +COMMAND_DREQLEVEL = 40h ;Bit 6 actif: ligne REQ Acknowledge LOW active +COMMAND_EXTWRITE = 20h ;Bit 5 actif: EXTENDED Write,sinon LATE Write +COMMAND_FIXEDPRI = 10h ;Bit 4 actif: priorit‚ constante +COMMAND_COMPRESS = 08h ;Bit 3 actif: compression +COMMAND_INACTIVE = 04h ;Bit 2 actif: contr“leur d‚sactiv‚ +COMMAND_ADH0 = 02h ;Bit 1 actif: Adress Hold pour canal 0/4 d‚sactiv‚ +COMMAND_MEM2MEM = 01h ;Bit 0 actif: m‚moire/m‚moire, sinon m‚moire/p‚riph‚rie + +;Ecriture des bits du registre de requˆte ( 09, D2 ) +REQUEST_RESERVED = 0F8h ;R‚glage des bits r‚serv‚s =0 +REQUEST_SET = 04h ;D‚finir requˆte DMA +REQUEST_CLR = 00h ;Supprimer requˆte DMA +REQUEST_MSK = 03h ;Indiquer le canal dans les deux bits du bas + +;Ecriture des bits du registre de masquage de canal ( 0A, D4 ) +CHANNEL_RESERVED = 0F8h ;R‚glage des bits r‚serv‚s =0 +CHANNEL_SET = 04h ;Masquer/verrouiller canal DMA +CHANNEL_CLR = 00h ;Lib‚rer canal DMA +CHANNEL_MSK = 03h ;Indiquer le canal dans les deux bits du bas + +;Ecriture des bits du registre de mode (0B,D6) +MODE_DEMAND = 00h ;Transf‚rer … la demande +MODE_SINGLE = 40h ;Transf‚rer valeurs uniques +MODE_BLOCK = 80h ;Transf‚rer en bloc +MODE_CASCADE = 0C0h ;Transf‚rer en cascade +MODE_DECREMENT = 20h ;D‚cr‚menter +MODE_AUTOINIT = 10h ;Autoinitialisation vers la fin +MODE_VERIFY = 00h ;V‚rifier +MODE_WRITE = 04h ;Ecrire dans la m‚moire +MODE_READ = 08h ;Lire depuis la m‚moire +MODE_INVALID = 0Ch ;Incorrect +MODE_CHANNELMSK = 03h ;Indiquer le canal dans les deux bits du bas + +;Ports du DMA esclave + +DmaStatusS dw 08h ;R SLAVE Registre d'‚tat +DmaCommandS dw 08h ;W SLAVE Registre de commande +DmaRequestS dw 09h ;W SLAVE Ex‚cuter requˆte DMA +DmachMaskS dw 0ah ;W SLAVE Masquer canaux +DmaModeS dw 0bh ;W SLAVE Mode de transfert +DmaFlipFlopS dw 0ch ;W SLAVE Flipflop adr/compteur +DmaTempS dw 0dh ;R SLAVE Reset du contr“leur +DmaClearS dw 0dh ;R SLAVE Registre temporaire +DmaMaskClrS dw 0eh ;R SLAVE Lib‚rer canaux +DmaMaskS dw 0fh ;R SLAVE Masquer canaux + +;Ports du DMA esclave + +DmaStatusM dw 0D0h ;R MASTER Registre d'‚tat +DmaCommandM dw 0D0h ;W MASTER Registre de commande +DmaRequestM dw 0D2h ;W MASTER Ex‚cuter requˆte DMA +DmaMaskM dw 0D4h ;W MASTER Masquer canaux +DmaModeM dw 0D6h ;W MASTER Mode de transfert +DmaFlipFlopM dw 0D8h ;W MASTER Flipflop adr/compteur +DmaTempM dw 0DAh ;R MASTER Reset du contr“leur +DmaClearM dw 0DAh ;R MASTER Registre temporaire +DmaMaskClrM dw 0DCh ;R MASTER Lib‚rer canaux +DmaMaskM2 dw 0DEh ;R MASTER Masquer canaux + +DmaAdress db 00h ;DMA address register 0 + db 002h ;DMA address register 1 + db 004h ;DMA address register 2 + db 006h ;DMA address register 3 + db 0c0h ;DMA address register 4 + db 0c4h ;DMA address register 5 + db 0c8h ;DMA address register 6 + db 0cch ;DMA address register 7 + +DmaCount db 001h ;DMA count registers 0 + db 003h ;DMA count registers 1 + db 005h ;DMA count registers 2 + db 007h ;DMA count registers 3 + db 0c2h ;DMA count registers 4 + db 0c6h ;DMA count registers 5 + db 0cah ;DMA count registers 6 + db 0ceh ;DMA count registers 7 + +DmaPage db 087h ;DMA page registers 0 + db 083h ;DMA page registers 1 + db 081h ;DMA page registers 2 + db 082h ;DMA page registers 3 + db 08fh ;DMA page registers 4 + db 08bh ;DMA page registers 5 + db 089h ;DMA page registers 6 + db 08ah ;DMA page registers 7 + +;verouille le canal AL +DisableDma: + push ax dx + cmp al, 4 + jae MasterDisableDma + mov dx, DmaMaskS + or al, 00000100b + out dx, al + jmp EndDisableDma +MasterDisableDma: + mov dx, DmaMaskS + and al, 00000011b + or al, 00000100b + out dx, al +EndDisableDma: + pop dx ax + ret + +;déverouille le canal AL +EnableDma: + push ax dx + cmp al, 4 + jae MasterDisableDma + mov dx, DmaMaskS + out dx, al + jmp EndEnableDma +MasterEnableDma: + mov dx, DmaMaskS + and al, 00000011b + out dx, al +EndEnableDma: + pop dx ax + ret + +;Efface le FlipFlop canal AL +ClrDmaFlipFlop: + push ax dx + cmp al, 4 + jae MasterClrFlipFlopDma + mov dx,DmaFlipFlopS + xor ax, ax + out dx, al + jmp EndClrFlipFlopDma +MasterClrFlipFlopDma: + mov dx,DmaFlipFlopM + xor ax, ax + out dx, al +EndClrFlipFlopDma: + pop dx ax + ret + +;Met le mode du canal al à ah +SetDmaMode: + push ax dx + cmp al, 4 + jae MasterSetDmaMode + mov dx,DmaModeS + or al, ah + out dx, al + jmp EndSetDmaMode +MasterSetDmaMode: + mov dx,DmaModeM + and al, 00000011b + or al, ah + out dx, al +EndSetDmaMode: + pop dx ax + ret + + +;Met le page du canal al a ah +SetDmaPage: + push ax bx dx si + cmp al, 4 + jae MasterSetDmaPage + mov si, offset DmaPage + xor dh, dh + xor bh, bh + mov bl, al + mov dl, cs:[si+bx] + xchg al, ah + out dx, al + jmp EndSetDmaPage +MasterSetDmaPage: +EndSetDmaPage: + pop si dx bx ax + ret + +;Met l'adresse du canal al a DS:BX +SetDmaAdress: + push ax bx cx dx si + push ax + mov ax, ds + and ax, 0000111111111111b + shl ax,4 + add bx, ax + mov ax, ds + and ax, 1111000000000000b + shr ax, 4 + mov cx,ax + pop ax + push ax + add ax,cx + call SetDmaPage + pop ax + call ClrDmaFlipFlop + mov si, offset DmaAdress + xor dh, dh + push bx + xor bh, bh + mov bl, al + mov dl, byte ptr cs:[si+bx] + pop bx + cmp al, 4 + jae MasterSetDmaAddress + mov al, bh + out dx, al + mov al, bl + out dx, al + jmp EndSetDmaAddress +MasterSetDmaAddress: + mov al, bh + out dx, al + call ClrDmaFlipFlop + mov al, bl + out dx, al +EndSetDmaAddress: + pop si dx cx bx ax + ret + +;Spécifie au controleur DMA le nombre d'octets à transférer dans CX +SetDmaCount: + push ax bx dx si + call ClrDmaFlipFlop + mov si, offset DmaCount + xor dh, dh + xor bh, bh + mov bl, al + mov dl, byte ptr cs:[si+bx] + cmp al, 4 + jae MasterSetDmaCount + mov al, ch + out dx, al + mov al, cl + out dx, al + jmp EndSetDmaCount +MasterSetDmaCount: + mov al, ch + out dx, al + call ClrDmaFlipFlop + mov al, cl + out dx, al +EndSetDmaCount: + pop si dx bx ax + ret + diff --git a/noyau/pic8259a.asm b/noyau/8259a.asm old mode 100755 new mode 100644 similarity index 94% rename from noyau/pic8259a.asm rename to noyau/8259a.asm index 7fcf64c..1c05847 --- a/noyau/pic8259a.asm +++ b/noyau/8259a.asm @@ -1,241 +1,241 @@ -.model tiny -.486 -smart -.code -org 0100h -start: -jmp tsr -db 'PIC8259A' -Tsr: -cli -cmp ax,1234h -jne nomore -mov ax,4321h -jmp itsok -nomore: -push bx -mov bl,ah -xor bh,bh -shl bx,1 -mov bx,cs:[bx].tables -mov cs:current,bx -pop bx -call cs:current -itsok: -jnc noerror -push bp -mov bp,sp -or byte ptr [bp+6],1b -pop bp -mov ax,cs -shl eax,16 -mov ax,cs:current -jmp endofint -noerror: -push bp -mov bp,sp -and byte ptr [bp+6],0FEh -pop bp -endofint: -sti -iret -current dw 0 -tables dw enableirq - dw disableirq - dw readmaskirq - dw readirr - dw readisr - dw installhandler - dw replacehandler - dw getint - dw setint - dw seteoi - -;Adresses de port du contr“leur IRQ - MASTERPIC = 020h ;Adresse de base du PIC maŒtre - SLAVEPIC = 0A0h ;Adresse de base du PIC esclave - IRQMASK = 001h ;Offset sur port de masquage - -;Commandes IRQ OCW2 - DISABLEROTATION = 000h ;Desactiver la rotation de priorités en mode EOI automatique - EOI = 020h ;End of Interrupt non sp‚cifi‚ - COMMANDEOI = 060h ;Commande EOI particulière - ENABLEROTATION = 080h ;Activer la rotation de priorités en mode EOI automatique - ROTATIONNOSPEC = 0A0h ;Rotation des priorités en mode EOI automatique - SETPRIORITY = 0C0h ;Definir la priorité - ROTATIONSPEC = 0E0h ;Rotation des priorités en mode EOI spécifié - -;Position des vecteurs d'interruptions - MASTERFIRSTVECTOR = 008h ;Vecteurs logiciels des interruptions - SLAVEFIRSTVECTOR = 070h ;‚lectroniques - -;OCW3 codes registres - IRR = 002h ;Interrupt Request Register - ISR = 003h ;In Service Register -;OCW3 et modes - OCW3 = 008h ;OCW3 - POLLING = 004h ;Polling bit - - -ISR = 0Bh ; Pas d'op‚ration, pas de Poll, lire ISR OCW3 -IRR = 0Ah ; Pas d'op‚ration, pas de Poll, lire IRR - - -;Autorise une interruption ‚lectronique -;Entr‚e : AL - Num‚ro de l'interruption (0-15) … autoriser 0-7 = MASTERPIC , 8-15 = SLAVEPIC -EnableIRQ: -push ax cx dx -mov dx,MASTERPIC+IRQMASK -cmp al,7 -jbe master -mov dx,SLAVEPIC+IRQMASK -master: -mov cl,al -and cl,7 -mov al,1 -shl al,cl -not al -mov ah,al -in al,dx -and al,ah -out dx,al -pop dx cx ax -ret - -;Desactive une interruption ‚lectronique -;Entr‚e : AL - Num‚ro de l'interruption (0-15) … desactiver 0-7 = MASTERPIC , 8-15 = SLAVEPIC -DisableIRQ: -push ax cx dx -mov dx,MASTERPIC+IRQMASK -cmp al,7 -jbe master2 -mov dx,SLAVEPIC+IRQMASK -master2: -mov cl,al -and cl,7 -mov al,1 -shl al,cl -mov ah,al -in al,dx -or al,ah -out dx,al -pop dx cx ax -ret - -;Signale "End Of Interrupt" de l'interruption al -SetEOI: -push ax dx -cmp al,7 -jbe master3 -mov al,EOI -out SLAVEPIC,al -master3: -mov al,EOI -out MASTERPIC,al -pop dx ax -ret - -;Lit les masques d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh -ReadmaskIrq: -push dx -mov dx,MASTERPIC+ IRQMASK -cmp bh,0 -jne Master5 -mov dx,SLAVEPIC+ IRQMASK -master5: -in al,dx -pop dx -ret - -;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh -ReadISR: -push dx -mov dx,MASTERPIC -cmp bh,0 -jne Master6 -mov dx,SLAVEPIC -master6: -mov al,isr -out dx,al -in al,dx -pop dx -ret - -;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh -ReadIRR: -push dx -mov dx,MASTERPIC -cmp bh,0 -jne Master7 -mov dx,SLAVEPIC -master7: -mov al,irr -out dx,al -in al,dx -pop dx -ret - -;remplace le handler pointer par ds:si en bx:100h interruption ax -replacehandler: -push ax bx cx si di ds es -mov es,bx -mov di,0100h -mov ah,4 -int 48h -jc reph -mov bx,ax -call getint -mov es:[102h],si -mov es:[104h],ds -call setint -reph: -pop es ds di si cx bx ax -ret - -;install le handler pointer par ds:si en bx:100h interruption ax -installhandler: -push bx cx di es -mov es,bx -mov di,100h -mov ah,4 -int 48h -jc inh -mov bx,ax -call setint -inh: -pop es di cx bx -ret - -;met es:di le handle de l'int al -setint: -push ax bx ds -call disableirq -cli -xor ah,ah -mov bx,ax -shl bx,2 -xor ax,ax -mov ds,ax -mov ds:[bx],di -mov ds:[bx+2],es -pop ds bx ax -sti -call enableirq -ret - -;met ds:si le handle de l'int al -getint: -push ax bx es -xor ah,ah -mov bx,ax -shl bx,2 -xor ax,ax -mov es,ax -mov si,es:[bx] -mov ds,es:[bx+2] -pop es bx ax -ret - - -end start - +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +db 'PIC8259A' +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +sti +iret +current dw 0 +tables dw enableirq + dw disableirq + dw readmaskirq + dw readirr + dw readisr + dw installhandler + dw replacehandler + dw getint + dw setint + dw seteoi + +;Adresses de port du contr“leur IRQ + MASTERPIC = 020h ;Adresse de base du PIC maŒtre + SLAVEPIC = 0A0h ;Adresse de base du PIC esclave + IRQMASK = 001h ;Offset sur port de masquage + +;Commandes IRQ OCW2 + DISABLEROTATION = 000h ;Desactiver la rotation de priorités en mode EOI automatique + EOI = 020h ;End of Interrupt non sp‚cifi‚ + COMMANDEOI = 060h ;Commande EOI particulière + ENABLEROTATION = 080h ;Activer la rotation de priorités en mode EOI automatique + ROTATIONNOSPEC = 0A0h ;Rotation des priorités en mode EOI automatique + SETPRIORITY = 0C0h ;Definir la priorité + ROTATIONSPEC = 0E0h ;Rotation des priorités en mode EOI spécifié + +;Position des vecteurs d'interruptions + MASTERFIRSTVECTOR = 008h ;Vecteurs logiciels des interruptions + SLAVEFIRSTVECTOR = 070h ;‚lectroniques + +;OCW3 codes registres + IRR = 002h ;Interrupt Request Register + ISR = 003h ;In Service Register +;OCW3 et modes + OCW3 = 008h ;OCW3 + POLLING = 004h ;Polling bit + + +ISR = 0Bh ; Pas d'op‚ration, pas de Poll, lire ISR OCW3 +IRR = 0Ah ; Pas d'op‚ration, pas de Poll, lire IRR + + +;Autorise une interruption ‚lectronique +;Entr‚e : AL - Num‚ro de l'interruption (0-15) … autoriser 0-7 = MASTERPIC , 8-15 = SLAVEPIC +EnableIRQ: +push ax cx dx +mov dx,MASTERPIC+IRQMASK +cmp al,7 +jbe master +mov dx,SLAVEPIC+IRQMASK +master: +mov cl,al +and cl,7 +mov al,1 +shl al,cl +not al +mov ah,al +in al,dx +and al,ah +out dx,al +pop dx cx ax +ret + +;Desactive une interruption ‚lectronique +;Entr‚e : AL - Num‚ro de l'interruption (0-15) … desactiver 0-7 = MASTERPIC , 8-15 = SLAVEPIC +DisableIRQ: +push ax cx dx +mov dx,MASTERPIC+IRQMASK +cmp al,7 +jbe master2 +mov dx,SLAVEPIC+IRQMASK +master2: +mov cl,al +and cl,7 +mov al,1 +shl al,cl +mov ah,al +in al,dx +or al,ah +out dx,al +pop dx cx ax +ret + +;Signale "End Of Interrupt" de l'interruption al +SetEOI: +push ax dx +cmp al,7 +jbe master3 +mov al,EOI +out SLAVEPIC,al +master3: +mov al,EOI +out MASTERPIC,al +pop dx ax +ret + +;Lit les masques d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh +ReadmaskIrq: +push dx +mov dx,MASTERPIC+ IRQMASK +cmp bh,0 +jne Master5 +mov dx,SLAVEPIC+ IRQMASK +master5: +in al,dx +pop dx +ret + +;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh +ReadISR: +push dx +mov dx,MASTERPIC +cmp bh,0 +jne Master6 +mov dx,SLAVEPIC +master6: +mov al,isr +out dx,al +in al,dx +pop dx +ret + +;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh +ReadIRR: +push dx +mov dx,MASTERPIC +cmp bh,0 +jne Master7 +mov dx,SLAVEPIC +master7: +mov al,irr +out dx,al +in al,dx +pop dx +ret + +;remplace le handler pointer par ds:si en bx:100h interruption ax +replacehandler: +push ax bx cx si di ds es +mov es,bx +mov di,0100h +mov ah,4 +int 48h +jc reph +mov bx,ax +call getint +mov es:[102h],si +mov es:[104h],ds +call setint +reph: +pop es ds di si cx bx ax +ret + +;install le handler pointer par ds:si en bx:100h interruption ax +installhandler: +push bx cx di es +mov es,bx +mov di,100h +mov ah,4 +int 48h +jc inh +mov bx,ax +call setint +inh: +pop es di cx bx +ret + +;met es:di le handle de l'int al +setint: +push ax bx ds +call disableirq +cli +xor ah,ah +mov bx,ax +shl bx,2 +xor ax,ax +mov ds,ax +mov ds:[bx],di +mov ds:[bx+2],es +pop ds bx ax +sti +call enableirq +ret + +;met ds:si le handle de l'int al +getint: +push ax bx es +xor ah,ah +mov bx,ax +shl bx,2 +xor ax,ax +mov es,ax +mov si,es:[bx] +mov ds,es:[bx+2] +pop es bx ax +ret + + +end start + diff --git a/noyau/MAKEFILE b/noyau/MAKEFILE new file mode 100644 index 0000000..884139f --- /dev/null +++ b/noyau/MAKEFILE @@ -0,0 +1,67 @@ +lnk_boot = tlink /x +asm= tasm /t/m5/zi +lnk= tlink /x/t + +all: boot.bin clavier.sys 8259a.sys disque.sys heure.sys horloge.sys manette.sys port.sys souris.sys systeme.sys video.sys + +boot.bin: boot.asm + $(asm) boot + $(lnk_boot) boot + exe2boot boot.exe boot.bin + +clavier.sys: clavier.asm + $(asm) clavier + $(lnk) clavier + ren clavier.com clavier.sys + +8259a.sys: 8259a.asm + $(asm) 8259a + $(lnk) 8259a + ren 8259a.com 8259a.sys + +disque.sys: disque.asm + $(asm) disque + $(lnk) disque + ren disque.com disque.sys + +heure.sys: heure.asm + $(asm) heure + $(lnk) heure + ren heure.com heure.sys + +horloge.sys: horloge.asm + $(asm) horloge + $(lnk) horloge + ren horloge.com horloge.sys + +manette.sys: manette.asm + $(asm) manette + $(lnk) manette + ren manette.com manette.sys + +port.sys: port.asm + $(asm) port + $(lnk) port + ren port.com port.sys + +souris.sys: souris.asm + $(asm) souris + $(lnk) souris + ren souris.com souris.sys + +systeme.sys: systeme.asm + $(asm) systeme + $(lnk) systeme + ren systeme.com systeme.sys + +video.sys: video.asm + $(asm) video + $(lnk) video + ren video.com video.sys + +clean: + del *.obj + del *.exe + del *.com + del *.sys + del *.err diff --git a/noyau/asm.bat b/noyau/asm.bat deleted file mode 100755 index 0f3cfb8..0000000 --- a/noyau/asm.bat +++ /dev/null @@ -1,55 +0,0 @@ -@echo off - -echo Assembling file %1... -..\util\tasm %1.asm /m5/x/t -if errorlevel 1 goto end -if "%1"=="boot" goto boot -echo Linking file %1... -..\util\tlink %1.obj /x/t -if errorlevel 1 goto end -echo Copying file %1... -if "%1"=="video" goto video -if "%1"=="lpt" goto system -if "%1"=="keyboard" goto system -if "%1"=="mouse" goto system -if "%1"=="pic8259a" goto system -if "%1"=="timer" goto system -if "%1"=="drive" goto system -if "%1"=="joystick" goto system -if "%1"=="system" goto system -if "%1"=="setup" goto setup -if "%1"=="hours" goto system -copy %1.com ..\data\%1.exe>nul -goto end - -:boot -echo Linking file %1... -..\util\tlink %1.obj /x -if errorlevel 1 goto end -echo Copying file %1... -..\util\exe2boot %1.exe -copy %1.bin ..\data\%1.bin>nul -goto end - -:video -type thin8x8.fnt>>%1.com -:system -copy %1.com ..\data\%1.sys>nul -goto end -:setup -copy %1.com ..\%1.com>nul -goto end - -:end -if not exist *.bin goto exes -del *.bin -:exes -if not exist *.exe goto coms -del *.exe -:coms -if not exist *.com goto objs -del *.com -:objs -if not exist *.obj goto nobjs -del *.obj -:nobjs diff --git a/noyau/asmsys.bat b/noyau/asmsys.bat deleted file mode 100755 index 9bb00a9..0000000 --- a/noyau/asmsys.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -call asm video -call asm system -call asm lpt -call asm keyboard -call asm pic8259a -call asm timer -call asm drive -call asm mouse -call asm joystick -call asm boot \ No newline at end of file diff --git a/noyau/boot.asm b/noyau/boot.asm old mode 100755 new mode 100644 index 438a180..750e592 --- a/noyau/boot.asm +++ b/noyau/boot.asm @@ -1,219 +1,221 @@ -boots segment -.386 -org 7C00h -;org 100h -assume cs:boots,ds:boots - -start: -jmp boot - - -bootdb db 'COS2000A' ;Fabricant + n°série Formatage -sizec dw 512 ;octet/secteur - db 1 ;secteur/cluster -reserv dw 1 ;secteur reserv‚ -nbfat db 1 ;nb de copie de la FAT -nbfit dw 25 ;taille rep racine -allclu dw 2880 ;nb secteur du volume si < 32 még - db 0F0h ;Descripteur de média -fatsize dw 12 ;secteur/FAT -nbtrack dw 18 ;secteur/piste -head dw 2 ;nb de tˆteb de lecture/écriture -hidden dd 0 ;nombre de secteur cach‚s - dd 0 ;si nbsecteur = 0 nbsect ; the number of sectors -bootdrv db 0 ;Lecteur de d‚marrage - db 0 ;NA -bootsig db 29h ;boot signature 29h - dd 01020304h ;no de serie -pope db 'COS2000 ' ;nom de volume - db 'FAT16 ' ;FAT -specialboot: - -errorloading db 'It''s not a COS disk!',0dh,0ah,0 -okloading db 'COS search system',0Dh,0ah,0 -syst db 'Ok',0dh,0ah,0 -dot db '.',0 -carry db 0dh,0ah,0 -Sys db 'system',0,0,0,0,0,0 -sys2 db 'sys',0 - -errorboot: - mov si,offset errorloading - call showstr - mov ah,0 - int 16h - int 19h -boot: - mov Bootdrv,dl - cli - mov ax,09000h - mov ss,ax - mov sp,0FFFFh - sti - p: - push cs - pop ds - xor ax,ax - int 13h - jc errorboot - mov si,offset okloading - call showstr - mov cx,nbtrack - les si,ds:[1Eh*4] - mov byte ptr es:[si+4], cl - mov byte ptr es:[si+9], 0Fh - xor ax,ax - mov al,NbFat - mov bx,FatSize - mul bx - mov cx,ax - add cx,word ptr [offset Hidden] - adc cx,word ptr [offset Hidden+2] - add cx,Reserv - mov word ptr [offset BootSig],cx - xor dx,dx - mov ax,allclu - div nbtrack - xor dx,dx - div head - mov word ptr [offset pope],ax - push cs - pop es - mov bx,offset buffer - mov si,bx - xor dx,dx -CheckRoot: -call readsector -jc errorboot -xor di,di -findnext: -cmp byte ptr [bx+di],0 -je errorboot -push si di cx -mov si,di -add si,bx -call showstr -mov ax,si -mov si,offset dot -call showstr -mov si,ax -add si,12 -call showstr -mov si,offset carry -call showstr -mov si,ax -mov di,offset sys -mov cx,12+4 -rep cmpsb -pop cx di si -je oksystem -add di,32 -inc dx -cmp dx,nbfit -ja errorboot -cmp di,sizec -jb findnext -inc cx -jmp Checkroot -oksystem: -mov si,offset syst -call showstr -mov cx,[di+BX+26] -mov bx,200h -mov es,bx -push bx -mov bx,0100h -push bx -mov si,offset dot -fatagain: -cmp cx,0FFF0h -jae finishload -call readsector -jc errorboot -call showstr -add bx,sizec -call getfat -jnc fatagain -finishload: -push es -push es -push es -pop ds -pop fs -pop gs -push 7202h -popf -db 0CBh - - - -;<-cx nøsecteur ->cx code FAT -getfat: -push es bx -mov ax,cx -xor dx,dx -div sizec -mov cx,ax -add cx,reserv -mov bx,offset buffer -push cs -pop es -call readsector -jc errorgetfat -shl dx,1 -add bx,dx -mov cx,[bx] -errorgetfat: -pop bx es -ret - -ReadSector: -push ax cx dx si - mov AX, CX - xor DX, DX - div nbtrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div word ptr pope - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div head - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AX,0201h - mov DL, bootdrv - int 13h - jnc Done - dec SI - jnz TryAgain -Done: - pop si dx cx ax -ret - -showstr: - push ax bx si -again: - lodsb - or al,al - jz fin - mov ah,0Eh - mov bx,07h - int 10h - jmp again - fin: - pop si bx ax - ret - - -Buffer equ $ -boots ends -end start - +boots segment +.386 +org 7C00h +;org 100h +assume cs:boots,ds:boots + +start: +jmp boot + +bootdb db 'COS2000A' ;Fabricant + n°série Formatage +sizec dw 512 ;octet/secteur + db 1 ;secteur/cluster +reserv dw 1 ;secteur reserv‚ +nbfat db 2 ;nb de copie de la FAT +nbfit dw 224 ;taille rep racine +allclu dw 2880 ;nb secteur du volume si < 32 még + db 0F0h ;Descripteur de média +fatsize dw 9 ;secteur/FAT +nbtrack dw 18 ;secteur/piste +head dw 2 ;nb de tˆteb de lecture/écriture +hidden dd 0 ;nombre de secteur cach‚s + dd 0 ;si nbsecteur = 0 nbsect ; the number of sectors +bootdrv db 0 ;Lecteur de d‚marrage +bootsig db 0 ;NA + db 29h ;boot signature 29h +bootsig2 dd 01020304h ;no de serie +pope db 'COS2000 ' ;nom de volume + db 'FAT12 ' ;FAT +specialboot: + +errorloading db ' Erreur !!',0dh,0ah,0 +okloading db 'Recherche noyau',0Dh,0ah,' - system.sys',0 +syst db ' Ok',0dh,0ah,'Chargement',0 +dot db '.',0 +Sys db 'SYSTEME SYS' + +errorboot: + mov si,offset errorloading + call showstr + mov ah,0 + int 16h + int 19h +boot: + mov Bootdrv,dl + cli + mov ax,09000h + mov ss,ax + mov sp,0FFFFh + sti + +boot2: + push cs + push cs + pop es + pop ds + xor ax,ax + int 13h + jc errorboot + mov si,offset okloading + call showstr + mov cx,Reserv + add cx,word ptr [offset Hidden] + adc cx,word ptr [offset Hidden+2] + push cx + mov bx,fatsize + mov di,offset bufferfat +readfat: + call readsector + inc cx + add di,sizec + dec bx + jnz readfat + pop cx + xor ax,ax + mov al,NbFat + mov bx,FatSize + mul bx + add cx,ax + mov ax,32 + mul nbfit + div sizec + add ax,cx + sub ax,2 + mov word ptr [offset bootsig],ax + xor dx,dx +CheckRoot: + mov di,offset buffer + call readsector + jc errorboot + xor bx,bx +findnext: + cmp byte ptr [di],0 + je errorboot + cmp byte ptr [di],0E5h + je no + cmp byte ptr [di],041h + je no + mov si,offset dot + call showstr + push di cx + mov si,offset sys + mov cx,11 + rep cmpsb + pop cx di + je oksystem +no: + add di,32 + add bx,32 + inc dx + cmp dx,nbfit + ja errorboot + cmp bx,sizec + jb findnext + inc cx + jmp Checkroot +oksystem: + mov si,offset syst + call showstr + mov cx,[di+26] + mov ax,0900h + mov es,ax + push es + mov di,100h + push di + mov si,offset dot + xor ax,ax +fatagain: + cmp cx,0FF0h + jae finishload + push cx + add cx,word ptr [offset bootsig] + call readsector + pop cx + jc errorboot + inc ax + call showstr + add di,sizec + call getfat + jnc fatagain +finishload: + db 0CBh + +;=============READSECTOR (Fonction 01H)=============== +;Lit le secteur CX et le met en es:di +;-> AH=1 +;<- Flag Carry si erreur +;===================================================== +ReadSector: + push ax bx cx dx si + mov ax,cx + xor dx,dx + div nbtrack + inc dl + mov bl,dl + xor dx,dx + div head + mov dh, 0 + xchg dl,dh + mov cx,ax + xchg cl,ch + shl cl,6 + or cl, bl + mov bx,di + mov SI, 4 + mov AL, 1 +TryAgain: + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +Done: + pop si dx cx bx ax +ret + +getfat: + push ax bx dx di + mov di,offset bufferfat + mov ax,cx + mov bx,ax + and bx,0000000000000001b + shr ax,1 + mov cx,3 + mul cx + add di,ax + cmp bx,0h + jnz evenfat +oddfat: + mov dx,[di] + and dx,0FFFh + mov cx,dx + jmp endfat +evenfat: + mov dx,[di+1] + and dx,0FFF0h + shr dx,4 + mov cx,dx +endfat: + pop di dx bx ax + ret + +showstr: + push ax bx si +again: + lodsb + or al,al + jz fin + mov ah,0Eh + mov bx,07h + int 10h + jmp again + fin: + pop si bx ax + ret + +Buffer equ $ +BufferFat equ $+2048 + +boots ends +end start + diff --git a/noyau/keyboard.asm b/noyau/clavier.asm old mode 100755 new mode 100644 similarity index 91% rename from noyau/keyboard.asm rename to noyau/clavier.asm index 636fb52..cbc6cbc --- a/noyau/keyboard.asm +++ b/noyau/clavier.asm @@ -1,208 +1,218 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: - -jmp tsr -offsets dd 0 -db 'KEYBOARD' -tsr: - pushf - db 2eh,0ffh,1eh - dw offsets - cli - mov cs:feax,eax - in al,60h - cmp cs:isstate,1 - jne nostate - cmp al,57 - jne endof - mov cs:isstate,0 - jmp endof - nostate: - cmp al,87 - je F11 - cmp al,88 - je F12 - endof: - mov eax,cs:feax - sti - iret - isstate db 0 - infos db 40 dup (0) - -F11: - push ax di es - push cs - pop es - mov di,offset infos - mov ah,34 - int 47h - mov al,cs:[di+7] - inc al - cmp al,9 - jbe notabove - mov al,0 -notabove: - mov ah,0 - int 47h - pop es di ax - jmp endof - - -f12: - mov cs:isstate,1 - pop word ptr cs:fip - pop word ptr cs:fcs - pop dword ptr cs:ffl - mov cs:fesp,esp - push ds es - pusha - push word ptr cs:fip - push gs - push fs - push ss - push es - push ds - push word ptr cs:fcs - push dword ptr cs:fesp - push ebp - push edi - push esi - push edx - push ecx - push ebx - push eax - push dword ptr cs:ffl - push cs - push cs - pop es - pop ds - mov ah,26 - int 47h - mov ah,2 - int 47h - mov ah,21 - mov cl,4 - int 47h - mov ah,13 - mov si,offset reg - int 47h - mov ah,6 - int 47h - mov ah,21 - mov cl,7 - int 47h - mov ah,13 - mov si,offset fla - int 47h - pop edx - mov cx,32 - mov ah,11 - int 47h - mov ah,5 - int 47h - mov ah,10 - int 47h - mov si,offset regs - mov bx,8+7 - mov ah,21 - mov cl,6 - int 47h -showallREG: - mov ah,6 - int 47h - cmp bx,8 - jb nodr - pop edx - mov cx,32 - jmp popo - nodr: - mov ah,21 - mov cl,1 - int 47h - xor edx,edx - pop dx - mov cx,16 - popo: - mov ah,13 - int 47h - mov ah,10 - int 47h - mov ah,5 - int 47h - push si - mov si,offset gr - mov ah,13 - int 47h - mov ah,8 - int 47h - mov si,offset dr - mov ah,13 - int 47h - pop si - add si,5 - dec bx - jnz showallreg - mov ah,34 - mov di,offset infos - int 47h - mov ah,25 - mov bl,cs:infos - xor bh,bh - dec bl - int 47h - mov si,offset app - mov ah,13 - int 47h - mov ah,32 - mov bl,cs:infos - xor bh,bh - mov di,ax - dec di - mov cl,116 - int 47h - pop es ds - sti - waitt: - cmp cs:isstate,0 - jne waitt - mov ah,27 - int 47h - popa - pop es ds - push dword ptr cs:ffl - push word ptr cs:fcs - push word ptr cs:fip - jmp endof - -reg db ' State of registers',0 -fla db 'Eflags:',0 -regs db 'EAX:',0 - db 'EBX:',0 - db 'ECX:',0 - db 'EDX:',0 - db 'ESI:',0 - db 'EDI:',0 - db 'EBP:',0 - db 'ESP:',0 - db ' CS:',0 - db ' DS:',0 - db ' ES:',0 - db ' FS:',0 - db ' GS:',0 - db ' SS:',0 - db ' IP:',0 -gr db '(',0 -dr db ')',0 -app db 'Press space to quit...',0 -ffl dd 0 -fcs dw 0 -fip dw 0 -fesp dd 0 -feax dd 0 -end start +.model tiny +.486 +smart +.code + +org 0100h + +start: + +jmp tsr +offsets dd 0 +db 'KEYBOARD' +tsr: + pushf + db 2eh,0ffh,1eh + dw offsets + cli + mov cs:feax,eax + in al,60h + cmp cs:isstate,1 + jne nostate + cmp al,57 + jne endof + mov cs:isstate,0 + jmp endof + nostate: + cmp al,68 + je F10 + cmp al,87 + je F11 + cmp al,88 + je F12 + endof: + mov eax,cs:feax + sti + iret + isstate db 0 + infos db 40 dup (0) + +F10: + mov ax,6000h + push ax + mov di,0100h + push di +sti + db 0CBh + +F11: + push ax di es + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov al,cs:[di+7] + inc al + cmp al,9 + jbe notabove + mov al,0 +notabove: + mov ah,0 + int 47h + pop es di ax + jmp endof + + +f12: + mov cs:isstate,1 + pop word ptr cs:fip + pop word ptr cs:fcs + pop dword ptr cs:ffl + mov cs:fesp,esp + push ds es + pusha + push word ptr cs:fip + push gs + push fs + push ss + push es + push ds + push word ptr cs:fcs + push dword ptr cs:fesp + push ebp + push edi + push esi + push edx + push ecx + push ebx + push eax + push dword ptr cs:ffl + push cs + push cs + pop es + pop ds + mov ah,26 + int 47h + mov ah,2 + int 47h + mov ah,21 + mov cl,4 + int 47h + mov ah,13 + mov si,offset reg + int 47h + mov ah,6 + int 47h + mov ah,21 + mov cl,7 + int 47h + mov ah,13 + mov si,offset fla + int 47h + pop edx + mov cx,32 + mov ah,11 + int 47h + mov ah,5 + int 47h + mov ah,10 + int 47h + mov si,offset regs + mov bx,8+7 + mov ah,21 + mov cl,6 + int 47h +showallREG: + mov ah,6 + int 47h + cmp bx,8 + jb nodr + pop edx + mov cx,32 + jmp popo + nodr: + mov ah,21 + mov cl,1 + int 47h + xor edx,edx + pop dx + mov cx,16 + popo: + mov ah,13 + int 47h + mov ah,10 + int 47h + mov ah,5 + int 47h + push si + mov si,offset gr + mov ah,13 + int 47h + mov ah,8 + int 47h + mov si,offset dr + mov ah,13 + int 47h + pop si + add si,5 + dec bx + jnz showallreg + mov ah,34 + mov di,offset infos + int 47h + mov ah,25 + mov bl,cs:infos + xor bh,bh + dec bl + int 47h + mov si,offset app + mov ah,13 + int 47h + mov ah,32 + mov bl,cs:infos + xor bh,bh + mov di,ax + dec di + mov cl,116 + int 47h + pop es ds + sti + waitt: + cmp cs:isstate,0 + jne waitt + mov ah,27 + int 47h + popa + pop es ds + push dword ptr cs:ffl + push word ptr cs:fcs + push word ptr cs:fip + jmp endof + +reg db ' Etats des registres',0 +fla db 'Eflags:',0 +regs db 'EAX:',0 + db 'EBX:',0 + db 'ECX:',0 + db 'EDX:',0 + db 'ESI:',0 + db 'EDI:',0 + db 'EBP:',0 + db 'ESP:',0 + db ' CS:',0 + db ' DS:',0 + db ' ES:',0 + db ' FS:',0 + db ' GS:',0 + db ' SS:',0 + db ' IP:',0 +gr db '(',0 +dr db ')',0 +app db 'Appuyez sur espace pour quitter...',0 +ffl dd 0 +fcs dw 0 +fip dw 0 +fesp dd 0 +feax dd 0 +end start diff --git a/noyau/clean.bat b/noyau/clean.bat deleted file mode 100755 index 687f4b0..0000000 --- a/noyau/clean.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -echo nettoyage en cours... -del ..\data\*.* >nul diff --git a/noyau/debog.bat b/noyau/debog.bat deleted file mode 100755 index aedbb4e..0000000 --- a/noyau/debog.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -..\util\td %1 diff --git a/noyau/disque.asm b/noyau/disque.asm new file mode 100644 index 0000000..e842a0b --- /dev/null +++ b/noyau/disque.asm @@ -0,0 +1,964 @@ +.model tiny +.486 +smart +.code + +org 0100h + +include ..\include\fat.h + +start: + jmp tsr ;Saute à la routine résidente +names db 'DRIVE' ;Nom drivers +id dw 1234h ;Identifiant drivers +Tsr: + cli ;Désactive interruptions logiciellement + cmp ax,cs:ID ;Compare si test de chargement + jne nomore ;Si pas test alors on continu + rol ax,3*4 ;Rotation de 3 chiffre de l'ID pour montrer que le drivers est chargé + jmp itsok ;On termine l'int avec notre code d'ID preuve du bon chargement de VIDEO +nomore: + cmp ah,maxfunc + jbe noerrorint + stc + jmp itsok +noerrorint: + clc + push bx + mov bl,ah ;On calcule d'aprés le n° de fonction + xor bh,bh ;quel sera l'entrée dans la table indexée + shl bx,1 ;des adresses fonctions. + mov bx,cs:[bx+tables] ;On récupère cette adresse depuis la table + mov cs:current,bx ;On la stocke temporairement pour obtenir les registres d'origine + pop bx + clc + call cs:current ;Puis on execute la fonction +itsok: + push bp + mov bp,sp ;On prend sp dans bp pour adresser la pile + jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ? + or byte ptr [bp+6],1b;Si oui on le retranscrit sur le registre FLAG qui sera dépilé lors du IRET + ;xor eax,eax + ;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique + ;shl eax,4 ;de l'erreur. + ;add ax,cs:current + jmp endofint ;on termine l'int +noerror: + and byte ptr [bp+6],0FEh;Si pas d'erreur on efface le Bit CARRY du FLAG qui sera dépilé lors du IRET +endofint: + pop bp + sti ;On réactive les interruptions logiciellement + iret ;Puis on retourne au programme appelant. + +current dw 0 ;Mot temporaire qui contient l'adresse de la fonction appelée +tables dw readsector + dw writesector + dw verifysector2 + dw initdrive + dw loadfile + dw compressrle + dw decompressrle + dw FindFirstfile + dw Findnextfile + dw GetFreeSpace + dw Searchfile + dw Getname + dw Getserial + dw changedir + dw readcluster + dw writecluster + dw getdir + +maxfunc equ 24 + +;DPT disquette +mydpt DPT ? + +;Secteur de boot +myboot bootSector ? + +;Données Calculée +clustersize dw 0 +TracksPerHead dw 0 +DriveSize dd 0 +AdressBoot dw 0 +AdressFat dw 0 +AdressParent dw 0 +AdressData dw 0 +AddingValue dw 0 +CurrentDir dw 0 ;En cluster +CurrentDirStr db 128 dup (0) + +;Pour recherches +EntryPlace dw 0 ;En octet +AdressDirectory dw 0 ;En cluster +firstsearch dw 1 ;Premiere requete ? + +getfat: + push ax bx dx si + mov ax,cx + mov bx,ax + and bx,0000000000000001b + shr ax,1 + mov cx,3 + mul cx + mov si,offset bufferfat + add si,ax + cmp bx,0h + jnz evenfat +oddfat: + mov dx,cs:[si] + and dx,0FFFh + mov cx,dx + jmp endfat +evenfat: + mov dx,cs:[si+1] + and dx,0FFF0h + shr dx,4 + mov cx,dx +endfat: + cmp dx,0FF0h + jbe nocarry + stc + pop si dx bx ax + ret +nocarry: + clc + pop si dx bx ax + ret + +;============loadfile (Fonction 4)=============== +;Charge le fichier ds:si en es:di ->ecx taille +;-> AH=4 +;<- Flag Carry si erreur +;===================================================== +loadfile: + push eax bx di + push es di + push cs + pop es + mov di,offset tempfit + call searchfile + pop di es + jne errorload + jc errorload + mov cx,cs:tempfit.FileGroup + mov eax,cs:tempfit.FileSize + call loadway + jc errorload + clc + mov ecx,eax + pop di bx eax + ret +errorload: + stc + mov ecx,0 + pop di bx eax + ret + +tempfit db 32 dup (0) + +;=============SearchFile (Fonction 10)=============== +;Renvois dans ES:DI la fit du fichier DS:SI et non equal si pas existant +;-> AH=10 +;<- Flag Carry si erreur +;===================================================== +SearchFile: + push ax cx ds si di es + call uppercase + push ds si + call findfirstfilez + push ds + pop es + mov di,si + pop si ds + jc errorsearch + jmp founded +nextsearch: + push ds si + call findnextfilez + push ds + pop es + mov di,si + pop si ds +founded: + cmp byte ptr cs:[di],0 + je notgood + cmp byte ptr cs:[di+FileAttr],0Fh + je nextsearch + call cmpnames + jc nextsearch +okfound: + push cs + pop ds + mov si,di + pop es di + push di es + mov cx,32 + rep movsb + clc + pop es di si ds cx ax + ret +notgood: + cmp si,0FF5h + pop es di si ds cx ax + ret +errorsearch: + stc + pop es di si ds cx ax + ret + +;Transforme la chaine ds:si en maj +uppercase: + push si ax + mov di,si +uppercaser: + mov al,ds:[si] + cmp al,0 + je enduppercase + cmp al,'a' + jb nonmaj + cmp al,'z' + ja nonmaj + sub al,'a'-'A' + mov ds:[si],al +nonmaj: + inc si + jmp uppercaser +enduppercase: + clc + pop ax si + ret + +;Compare le nom ds:si '.' avec es:di +CmpNames: + push ax cx si di + mov cx,8 + repe cmpsb + jne nequal + inc si +nequal: + cmp byte ptr [si-1],'.' + jne trynoext + mov al,' ' + rep scasb + mov cx,3 + rep cmpsb + jne notequal + cmp byte ptr [si],0 + jne notequal + cmp cx,0 + jl notequal +itok: + pop di si cx ax + ret +trynoext: + cmp byte ptr [si-1],0 + jne notequal + jmp itok +notequal: + stc + pop di si cx ax + ret + +;charge le fichier de de groupe CX et de taille eax +LoadWay: + push eax bx dx si di ecx ds es + cmp eax,0 + je Zeroload + rol eax,16 + mov dx,ax + ror eax,16 + div cs:clusterSize + mov bx,ax + cmp bx,1 + jb adjustlast +Loadfat: + call readcluster + jc noway + add di,cs:clusterSize + call getfat + dec bx + jnz loadfat +AdjustLast: + push es di + push cs + pop es + mov di,offset bufferread + mov si,di + call Readcluster + pop di es + jc noway + mov cx,dx + push cs + pop ds + rep movsb +zeroload: + clc + pop es ds ecx di si dx bx eax + ret +noway: + stc + pop es ds ebp di si dx bx eax + ret + +;=============INITDRIVE (Fonction 04H)=============== +;Initialise le lecteur pour une utilisation ultérieure +;-> AH=4 +;<- Flag Carry si erreur +;===================================================== +InitDrive: + push eax bx cx edx di ds es + push cs + pop ds + push cs + pop es + mov di,3 +againtry: + xor ax,ax + mov dx,0000h + int 13h + mov bx,offset myboot + mov ax,0201h + mov cx,0001h + mov dx,0000h + int 13h + jnc oknoagaintry + dec di + jnz againtry +oknoagaintry: + mov cs:lastseg,0 + mov cs:lastoff,0 + mov cs:LastRead,0 + mov ax,myboot.sectorsize + mov bl,myboot.SectorsPerCluster + xor bh,bh + mul bx + mov clustersize,ax + mov bx,myboot.HiddenSectorsL + adc bx,myboot.HiddenSectorsH + mov AdressBoot,bx + add bx,myboot.ReservedSectors + mov AdressFat,bx + xor ax,ax + mov al,myboot.FatsPerDrive + mul myboot.SectorsPerFat + add bx,ax + mov AdressParent,bx + mov AdressDirectory,bx + mov ax,32 + mul myboot.DirectorySize + div myboot.SectorSize + add bx,ax + mov AdressData,bx + sub bx,2 + mov AddingValue,bx + mov ax,myboot.SectorsPerDrive + div myboot.SectorsPerTrack + xor dx,dx + div myboot.HeadsPerDrive + mov TracksPerHead,ax + xor eax,eax + mov ax,myboot.SectorsPerDrive + sub ax,AdressData + mul myboot.SectorSize + shl edx,16 + add edx,eax + mov DriveSize,edx + mov CurrentDir,0 + mov EntryPlace,0 + mov adressdirectory,0 + mov firstsearch,1 + mov currentdirstr,0 + mov di,offset bufferfat + mov dx,myboot.SectorsPerFat + mov cx,AdressFat +SeeFat: + call readsector + jc ErrorInit + add di,myboot.SectorSize + inc cx + dec dx + jnz seefat + clc + pop es ds di edx cx bx eax + ret +ErrorInit: + stc + pop es ds di edx cx bx eax + ret + +;=============FindFirstFile (Fonction 7)============== +;Renvois dans ES:DI un bloc d'info +;-> AH=7 +;<- Flag Carry si erreur +;===================================================== +FindFirstFile: + push cx ds di si + call FindFirstFileZ + mov cx,32 + rep movsb + pop si di ds cx + ret + +FindFirstFileZ: + push cx + mov cx,cs:CurrentDir + mov cs:AdressDirectory,cx + xor cx,cx + mov cs:EntryPlace,cx + mov cs:firstsearch,1 + call findnextfileZ + pop cx + ret + +;=============FindnextFile (Fonction 8)============== +;Renvois dans ES:DI un bloc d'info +;-> AH=8 +;<- Flag Carry si erreur +;===================================================== +;Renvois dans ES:DI un bloc d'info +FindnextFile: + push cx ds di si + call FindnextFileZ + mov cx,32 + rep movsb + pop si di ds cx + ret + +;fait pointer ds:si sur la prochaine entrée du repertoire courant +FindnextFileZ: + push ax bx cx es di + push cs + pop ds + mov cx,cs:AdressDirectory + mov bx,cs:Entryplace +FindnextFileagain: + cmp cs:firstsearch,1 + je first + add bx,32 + cmp bx,cs:clusterSize + jb nopop +first: + mov di,offset bufferentry + push cs + pop es + mov bx,0 + cmp cs:currentdir,0 + jne notrootdir + cmp cs:firstsearch,1 + je noaddfirst1 + inc cx +noaddfirst1: + add cx,cs:adressparent + mov al,myboot.sectorspercluster +readroot: + call readsector + jc notwell + add di,myboot.sectorsize + dec al + jnz readroot + sub cx,cs:adressparent + jmp nopop +notrootdir: + cmp cs:firstsearch,1 + je noaddfirst2 + call getfat +noaddfirst2: + jc notwell + call readcluster + jc notwell +nopop: + mov cs:firstsearch,0 + mov si,offset bufferentry + add si,bx + cmp byte ptr cs:[si],0 + je notwell + mov cs:entryplace,bx + mov cs:AdressDirectory,cx + cmp byte ptr cs:[si],0E5h + je findnextfileagain + cmp byte ptr cs:[si+fileattr],28h + je findnextfileagain + cmp byte ptr cs:[si+fileattr],0Fh + je findnextfileagain + clc + pop di es cx bx ax + ret +notwell: + stc + pop di es cx bx ax + ret + +;=============GetFreeSpace (Fonction 09H)=============== +;Renvoie en EDX l'espace disque libre du volume +;-> AH=9 +;<- Flag Carry si erreur +;===================================================== +GetFreeSpace: + push eax + xor eax,eax + call getsector + mul cs:myboot.SectorSize + shl edx,16 + add edx,eax + pop eax + ret + +;ax=défectueux bx=libre +GetSector: + push cx dx + mov dx,cs:myboot.SectorsPerDrive + sub dx,cs:AddingValue + xor ax,ax + xor bx,bx + mov cx,0 +goget: + push cx + call getfat + cmp cx,0FF7h + jne notdefect + inc bx +notdefect: + cmp cx,0 + jne notfree + inc ax +notfree: + pop cx + inc cx + dec dx + jnz goget + pop dx cx + ret +errorfree: + stc + pop dx cx + ret + + +;=============READCLUSTER (Fonction 14)=============== +;Lit le secteur CX et le met en es:di +;-> AH=14 +;<- Flag Carry si erreur +;===================================================== +readcluster: + push ax bx cx dx di + mov ax,cx + mov bl,cs:myboot.sectorspercluster + xor bh,bh + mul bx + mov cx,ax + add cx,cs:addingvalue +readsectors: + call readsector + jc errorreadincluster + add di,cs:myboot.sectorsize + inc cx + dec bl + jnz readsectors + clc + pop di dx cx bx ax + ret +errorreadincluster: + stc + pop di dx cx bx ax + ret + +;=============WRITECLUSTER (Fonction 15)=============== +;Ecrit le cluster CX et le met en es:di +;-> AH=14 +;<- Flag Carry si erreur +;===================================================== +writecluster: + push ax bx cx dx si + mov ax,cx + mov bl,cs:myboot.sectorspercluster + xor bh,bh + mul cx + mov cx,ax + add cx,cs:addingvalue +writesectors: + call writesector + jc errorwriteincluster + add si,cs:myboot.sectorsize + inc cx + dec bx + jnz writesectors + clc + pop si dx cx bx ax + ret +errorwriteincluster: + stc + pop si dx cx bx ax + ret + +;=============READSECTOR (Fonction 01H)=============== +;Lit le secteur CX et le met en es:di +;-> AH=1 +;<- Flag Carry si erreur +;===================================================== +ReadSector: + push ax bx cx dx si + cmp cx,cs:lastread + jne gom + mov ax,es + cmp cs:lastseg,ax + jne gom + cmp di,cs:lastoff + jne gom + jmp done +gom: + mov cs:lastseg,ax + mov cs:lastoff,di + mov cs:LastRead,cx + mov ax,cx + xor dx,dx + div cs:myboot.SectorsPerTrack + inc dl + mov bl,dl + xor dx,dx + div cs:myboot.HeadsPerDrive + mov dh,cs:myboot.bootdrive + xchg dl,dh + mov cx,ax + xchg cl,ch + shl cl,6 + or cl,bl + mov bx,di + mov SI,4 + mov AL,1 +TryAgain: + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +Done: + pop si dx cx bx ax +ret + +lastread dw 0 +lastseg dw 0 +lastoff dw 0 + +;=============WRITESECTOR (Fonction 02H)============== +;Ecrit le secteur CX pointé par ds:si +;-> AH=2 +;<- Flag Carry si erreur +;===================================================== +WriteSector: + push ax bx cx dx si es + cmp cs:Lastread,cx + jne nodestruct + mov cs:Lastread,0ffffh +nodestruct: + push ds + pop es + mov ax,cx + xor dx,dx + div cs:myboot.SectorsPerTrack + inc dl + mov bl,dl + xor dx,dx + div cs:myboot.HeadsPerDrive + mov dh,cs:myboot.BootDrive + xchg dl,dh + mov cx,ax + xchg cl,ch + shl cl,6 + or cl, bl + mov bx,si + mov SI, 4 + mov AL,1 +TryAgains: + mov AH, 3 + int 13h + jnc Dones + dec SI + jnz TryAgains +Dones: + pop es si dx cx bx ax +ret + +;=============Getname (Fonction 11)============== +;Renvoie le nom en ES:DI +;-> AH=11 +;<- Flag Carry si erreur +;===================================================== +getname: + push ax cx dx si di ds es + push cs + pop ds + mov dx,di + mov si,offset myboot.DriveName + mov cx,11 + rep movsb + mov al,' ' + mov di,dx + mov cx,11 + repne scasb + mov byte ptr es:[di],0 + pop es ds di si dx cx ax + ret + +;=============Getserial (Fonction 12)============== +;Renvoie le numéro de serie en EDX +;-> AH=12 +;<- Flag Carry si erreur +;===================================================== +getserial: + mov edx,cs:myboot.serialnumber + ret + +;=============VERIFYSECTOR (Fonction 03H)============== +;Vérifie le secteur CX +;-> AH=3 +;<- Flag Carry si erreur, Flag Equal si secteurs égaux +;===================================================== +VerifySector: + push bx cx si di ds es + push cs + pop es + push cs + pop ds + mov bx,offset bufferread + call ReadSector + jc errorverify + call inverse + call WriteSector + jc errorverify + mov bx,offset bufferwrite + call ReadSector + call inverse + jc errorverify + mov bx,offset bufferread + call inverse + call WriteSector + jc errorverify + mov cx,cs:myboot.SectorSize + shr cx,2 + mov si,offset bufferread + mov di,offset bufferwrite + cld + rep cmpsd +errorverify: + pop es ds di si cx bx + ret + +Inverse: + mov si,cs:myboot.sectorsize + shr si,2 +invert: + shl si,2 + not dword ptr [bx+si-4] + shr si,2 + dec si + jnz invert + ret + +VerifySector2: + call verifysector + jne nook + or byte ptr [bp+6],10b +nook: + ret + +;=============DecompressRle (Fonction 05H)============== +;decompress ds:si en es:di taille bp d‚compress‚ cx compress‚ +;-> AH=5 +;<- Flag Carry si erreur, Flag Equal si secteurs égaux +;===================================================== +DecompressRle: + push cx dx si di + mov dx,cx + mov bp,di +decompression: + mov eax,[si] + cmp al,'/' + jne nocomp + cmp si,07FFFh-6 + jae thenen + mov ecx,eax + ror ecx,16 + cmp cl,'*' + jne nocomp + cmp byte ptr [si+4],'/' + jne nocomp + mov al,ch + mov cl,ah + xor ah,ah + xor ch,ch + rep stosb + add si,5 + sub dx,5 + jnz decompression + jmp thenen +nocomp: + mov es:[di],al + inc si + inc di + dec dx + jnz decompression +thenen: + mov ax,dx + sub bp,di + neg bp + clc + pop di si dx cx + ret + +;=============CompressRle (Fonction 06H)============== +;compress ds:si en es:di taille cx d‚compress‚ BP compress‚ +;-> AH=6 +;<- Flag Carry si erreur, Flag Equal si secteurs égaux +;===================================================== +CompressRle: + push ax bx cx dx si di ds es + mov bp,di + xchg si,di + push es + push ds + pop es + pop ds + mov dx,cx + ;mov bp,cx +againcomp: + mov bx,di + mov al,es:[di] + mov cx,dx + cmp ch,0 + je poo + mov cl,0ffh + ;mov cx,bp + ;sub cx,di + ;mov ah,cl +poo: + mov ah,cl + inc di + xor ch,ch + repe scasb + sub cl,ah + neg cl + cmp cl,6 + jbe nocomp2 + mov dword ptr [si],' * /' + mov byte ptr [si+4],'/' + mov [si+1],cl + mov [si+3],al + add si,5 + dec di + xor ch,ch + sub dx,cx + jnz againcomp + jmp fini +nocomp2: + mov [si],al + inc si + inc bx + mov di,bx + dec dx + jnz againcomp +fini: + sub bp,si + neg bp + clc + pop es ds di si dx cx bx ax + ret + +;=============Changedir (Fonction 13)============== +;Change le repertoire courant a DS:SI +;-> AH=13 +;<- Flag Carry si erreur, Flag Equal si secteurs égaux +;===================================================== +Changedir: + push ax cx dx si di ds es + push cs + pop es + ;cmp [si],005Ch ;'\',0 (root dir) + mov di,offset tempdir + call searchfile + jc noch + mov cx,cs:tempdir.Filegroup + mov cs:CurrentDir,cx + mov cs:EntryPlace,0 + mov cs:adressdirectory,cx + mov cs:firstsearch,1 + cmp cs:[di],' ..' + jne notback + cmp cs:[di],' .' + je theend + mov di,offset currentdirstr + mov cx,128 + mov al,0 + repne scasb + mov al,'\' + std + repne scasb + cld + inc di + mov byte ptr es:[di],0 + jmp theend +notback: + mov di,offset currentdirstr + mov cx,128 + mov al,0 + repne scasb + dec di + mov al,'\' + stosb + mov dx,di + push ds + pop es + mov di,si + mov cx,128 + mov al,0 + repne scasb + sub cx,128 + neg cx + push cs + pop es + mov di,dx + rep movsb +theend: + pop es ds di si dx cx ax + clc + ret +noch: + pop es ds di si dx cx ax + stc + ret + +tempdir db 32 dup (0) + +;=============getdir (Fonction 16)============== +;Recupere le repertoire courant a ES:DI +;-> AH=16 +;<- Flag Carry si erreur +;===================================================== +getdir: + push ax cx si di ds es + push es di + push cs + pop es + mov di,offset currentdirstr + mov cx,128 + mov al,0 + repne scasb + sub cx,128 + neg cx + pop di es + push cs + pop ds + mov si,offset currentdirstr + rep movsb + pop es ds di si cx ax + clc + ret + + +bufferread equ $ +bufferwrite equ $+2048 +bufferentry equ $+2048+2048 +bufferFat equ $+2048+2048+2048 + +end start diff --git a/noyau/drive.asm b/noyau/drive.asm deleted file mode 100755 index 798fb8e..0000000 --- a/noyau/drive.asm +++ /dev/null @@ -1,505 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - - -start: -jmp tsr -db 'DRIVE' -Tsr: -cli -cmp ax,1234h -jne nomore -mov ax,4321h -jmp itsok -nomore: -push bx -mov bl,ah -xor bh,bh -shl bx,1 -mov bx,cs:[bx].tables -mov cs:current,bx -pop bx -call cs:current -itsok: -jnc noerror -push bp -mov bp,sp -or byte ptr [bp+6],1b -pop bp -mov ax,cs -shl eax,16 -mov ax,cs:current -jmp endofint -noerror: -push bp -mov bp,sp -and byte ptr [bp+6],0FEh -pop bp -endofint: -sti -iret -current dw 0 -tables dw readsector - dw writesector - dw verifysector2 - dw loadfatway - dw loadfile - dw compressrle - dw decompressrle - -;cx entr‚e -> fatway chemin -getfatway: -push bx cx -mov bx,offset fatway -fatagain: -mov cs:[bx],cx -add bx,2 -cmp cx,0FFF0h -jae finishload -call getfat -jnc fatagain -finishload: -pop cx bx -ret - -;Charge le fichier de chemin cx -> taille dx -loadfatway: -push ax bx cx di -call getfatway -jc endload -mov di,offset fatway -xor dx,dx -loadagain: -mov cx,cs:[di] -cmp cx,0FFF0h -jae endload -add di,2 -mov al,1 -call readsector -jc endload -add bx,cs:sizec -add dx,cs:sizec -jmp loadagain -endload: -pop di cx bx ax -ret - - -;<-cx nøsecteur ->cx code FAT -getfat: -push es ax bx dx -push cs -pop ds -push cs -pop es -mov ax,cx -xor dx,dx -div sizec -mov cx,ax -add cx,reserv -mov bx,offset buffer -call readsector -jc errorgetfat -shl dx,1 -add bx,dx -mov cx,[bx] -errorgetfat: -pop dx bx ax es -ret - -ReadSector: -push ax cx dx si - cmp al,1 - je pr - cmp cx,cs:lastread - je done - pr: - mov cs:LastRead,cx - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 2 - int 13h - jnc Done - dec SI - jnz TryAgain - mov word ptr cs:lastread,0ffffh -Done: - pop si dx cx ax -ret - -WriteSector: -push ax cx dx si - cmp cs:Lastread,cx - jne nodestruct - mov cs:Lastread,0ffffh - nodestruct: - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor DX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain2: - mov AL, 1 - mov DL, 0 - mov AH, 3 - int 13h - jnc Done2 - dec SI - jnz TryAgain2 -Done2: - pop si dx cx ax -ret - -Lastread dw 0FFFFh - -Inverse: -mov si,512/4 -invert: -shl si,2 -not dword ptr [bx+si-4] -shr si,2 -dec si -jnz invert -ret - -VerifySector: -push bx cx si di ds es -push cs -pop es -push cs -pop ds -mov bx,offset buffer -call ReadSector -jc errorverify -call inverse -call WriteSector -jc errorverify -mov bx,offset buffer2 -call ReadSector -call inverse -jc errorverify -mov bx,offset buffer -call inverse -call WriteSector -jc errorverify -mov cx,512/4 -mov si,offset buffer -mov di,offset buffer2 -cld -rep cmpsd -errorverify: -pop es ds di si cx bx -ret - -VerifySector2: -call verifysector -jne nook -or byte ptr [bp+6],10b -nook: -ret - -;Charge le fichier Ds:si en es:di taille-> cx -loadfile: -push bx -call searchfile -jc errorloadfile -mov bx,di -call loadfatway -jc errorloadfile -mov cx,dx -errorloadfile: -pop bx -ret - -;Recherche le fichier et retourne sont path et en cx sont debut -Searchfile: -push ax bx dx si di ds es -push cs -pop es -xor dx,dx -mov di,offset temp -call asciiztofit -push cs -pop ds -mov cx,13 -check: -mov al,1 -mov bx,offset buffer -call readsector -jc errorboot -xor di,di -findnext: -cmp byte ptr [bx+di],0 -je errorboot -push si di cx -mov si,di -add si,bx -mov di,offset temp -mov cx,12+4 -cld -rep cmpsb -pop cx di si -je oksystem -add di,32 -inc dx -cmp dx,nbfit -ja errorboot -cmp di,sizec -jb findnext -inc cx -jmp Check -oksystem: -mov cx,[di+BX+26] -cld -jmp goodboot -errorboot: -stc -goodboot: -pop es ds di si dx bx ax -ret - -;->name ds:si ->es:di -AsciiZtoFit: -push ax bx cx dx si di ds es -xor bx,bx -mov dx,di -noextens: -mov al,[si+bx] -cmp al,'.' -je extens -call Issystchar -jc errortranslate -mov es:[di],al -inc di -inc bx -cmp bx,namesize ;(.) -jne noextens -erro: -stc -jmp errortranslate -extens: -add si,bx -inc si -sub bx,namesize -neg bx -mov al,0 -mov cx,bx -cld -rep stosb -xor bx,bx -wasextens: -mov al,[si+bx] -cmp al,0 -je endextens -call Issystchar -jc errortranslate -mov es:[di],al -inc di -inc bx -cmp bx,extsize -jne wasextens -jmp erro -endextens: -sub bx,extsize -neg bx -mov al,0 -mov cx,bx -cld -rep stosb -mov si,dx -mov di,dx -push es -pop ds -mov cx,extsize+namesize -call uppercaseMEM -clc -endtranslate: -pop es ds di si dx cx bx ax -ret -errortranslate: -stc -jmp endtranslate - -;Carry si al = caractŠre systŠme -isSystchar: -push di -mov di,offset exeptchar -isexcept: -cmp al,cs:[di] -je nogood -inc di -cmp byte ptr cs:[di],0 -jne isexcept -endanal: -clc -pop di -ret -nogood: -stc -jmp endanal - -;Transforme les x caractŠres de la mem en ds:si en maj -uppercaseMEM: -push si di cx ax -mov di,si -uppercaser: -mov al,ds:[si] -inc si -cmp al,'A' -jb nonmaj -cmp al,'Z' -ja nonmaj -add al,'a'-'A' -nonmaj: -mov es:[di],al -inc di -dec cx -jnz uppercaser -enduppercase: -clc -pop ax cx di si -ret - -;decompress ds:si en es:di taille bp d‚compress‚ cx compress‚ -DecompressRle: -push cx dx si di -mov dx,cx -mov bp,di -decompression: -mov eax,[si] -cmp al,'/' -jne nocomp -cmp si,07FFFh-6 -jae thenen -mov ecx,eax -ror ecx,16 -cmp cl,'*' -jne nocomp -cmp byte ptr [si+4],'/' -jne nocomp -mov al,ch -mov cl,ah -xor ah,ah -xor ch,ch -rep stosb -add si,5 -sub dx,5 -jnz decompression -jmp thenen -nocomp: -mov es:[di],al -inc si -inc di -dec dx -jnz decompression -thenen: -mov ax,dx -sub bp,di -neg bp -pop di si dx cx -ret - -;compress ds:si en es:di taille cx d‚compress‚ BP compress‚ -CompressRle: -push ax bx cx dx si di ds es -mov bp,di -xchg si,di -push es -push ds -pop es -pop ds -mov dx,cx -;mov bp,cx -againcomp: -mov bx,di -mov al,es:[di] -mov cx,dx -cmp ch,0 -je poo -mov cl,0ffh -;mov cx,bp -;sub cx,di -;mov ah,cl -poo: -mov ah,cl -inc di -xor ch,ch -repe scasb -sub cl,ah -neg cl -cmp cl,6 -jbe nocomp2 -mov dword ptr [si],' * /' -mov byte ptr [si+4],'/' -mov [si+1],cl -mov [si+3],al -add si,5 -dec di -xor ch,ch -sub dx,cx -jnz againcomp -jmp fini -nocomp2: -mov [si],al -inc si -inc bx -mov di,bx -dec dx -jnz againcomp -fini: -sub bp,si -neg bp -pop es ds di si dx cx bx ax -ret - -nbfit equ 255 -namesize equ 12 -extsize equ 5 -exeptchar db '/\<>:|.',01,0,0 -temp db 12+5+1+90 dup (0) -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 -sizec dw 512 -reserv dw 1 -buffer equ $ -buffer2 equ $+512 -fatway equ $+512 - -end start diff --git a/noyau/font/2_hebrew.fnt b/noyau/font/2_hebrew.fnt new file mode 100644 index 0000000000000000000000000000000000000000..9e668d696026510a7bcba441cbc5eed24cd490e2 GIT binary patch literal 4096 zcmZu!&uiR96dqef_Cd8>C`H9$Hw~fCo5+H))T%Z~OCgsY3cd9pM@8;o*){dSff&h~ zLusLel3T8UUiv?z*eoQyG`$)&rFIQ5l#+x7oE*Zc-33SWr}xsv4hG8jGj|CBc$5TnZ8!`f+@Edg}Wz%l){hs-nhVL&axlMRYob zey8QV=AG z2~VjcNl;H;t*G8GIWdya`Ji^^8!Ay$M)D)Mo|j}BY2tj8C7#Z4BXd2!ld)A0MZx+Y z&({^k+@vf~56=fH41I0wdoGbzk1&s`IInF`oeH0tL2qD$7Kc}o#W4nR4t$5{{vHdH zY;$;XJ2SK81+hoeGjeH==?W*AWRD>7y&kR{4a(#ij;Q@1%gf%pB#yraeEvGm<`nac0IX({7#KDU4!Fy{4o*?T&C|H{F^!5=>> zqt&3bO!>9Ao*2(Jw?Jf1E$rK8JD**BFX(O^sTBeFC;$BQr<9Y2+fTON>ITb;di;oY z1?k=XVQ>G4`%;V9^H`4FL|*=v%%*wp zHl&dX5nzk9w`)08Kd8o22W!}hL#y3h!RRjyJSBBY|Irv^#cL=dOyz)h zJz{~=b^}@Q$=$HVT?*H&aYgc?#so9t5B|q+XW^6W^(UL!I3}P zKl!sU`Li*}yBM9mU-&p0Y>al-z*(k7%j=8Mk)vmf#wf~8n1mf&4q&AOlRcUDxZ`ITrAHSC6_3TnKduJj{r$1I z?*!4s@CJIocES0M^BCtNPDq7c=lSmSe3<7i6kc9K?dV41AIb$n1+eFfaF@i~FbLb@ zBizUz%WI&nL=*rh+rC*2H@Utd?)MYxG!or@zbkfCF7jJ0-q4Is^5_h;R76>?{q!iy z`+hhWyIz}A6z**P)^^kml>X=rV;rnS{fKX8k_Qy^S^DP3_MZ@+|78CO@%xVbXKhU? z5kkm^@4r${#;-IP?zNbKb1P2#Jcvc599@#P?ZXq0wAM^VU zZi>l7TMOa1fG>)4pZ(MQdpAu(?x!?7MJyL3#vuO{12aOa-7FD=qwBNjVR)x2wZY44 z)KL|g{ox;~?h2Q*Yby2Ni0F~^nJoLEPDMY-ra?7ck+u7~AMjSO)wHP9B)r literal 0 HcmV?d00001 diff --git a/noyau/font/8x11snsf.fnt b/noyau/font/8x11snsf.fnt new file mode 100644 index 0000000000000000000000000000000000000000..d409f71815947427970bb8a95874a8c6fa339b6b GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/noyau/font/antique.fnt b/noyau/font/antique.fnt new file mode 100644 index 0000000000000000000000000000000000000000..fe1aa6896d786bdcc378815467f637e2b0c878ba GIT binary patch literal 8192 zcma)BU1-}@6u$XEHN$hfhXsv_B#aQo7(=AN6+<{76tjoWy>z3LJqX3znN}DRN-Bns zn+{50Wsjp7dmWTM?WqrA1rviP%!DzD2_!3F8TLaV3+qS%3)arPk`>9hN7+d%U)}GV zbI(2Z+;fjCLe3+1?T59sXX|S&!szNdfCMq(zNE-q4JcqY|cfA(y>iOG*$c=H{dQcMBim<$sT4^HMU z&8wc2zg34#I0ikNzJ!jwPwZ)@DFN+@dpm+#q zT7C-SK|(jdj*T!ZasM^$Cb&;;lo?8^tCW_t)4q61)@-mI2r)u0Q7J2{riIkAsHC#Hyp^XSb}xkMP?t5;rP7zZJnC8^$$xWOrGUu zT9i=#fF4-e)aB({N0X8D9R=$QRn7`>S7;-67I7|Pm;zZg!>N#a;LGvuGZfvwdg;5T zKRx~a?uIiU7~V>`-1zuRu~hm?jGs`GI@C1ji5M@IHX1-19Yp_0l{pyV?^rC~GmWxS zHVm_ujvEJJT&Ek2P0#cGw8eNA#&($jT`{f)(T^4w5iW1lL>juLS*|!RNksnvWPe83 z{JM12bw4Yi{_mPAD>rUjy;|ysMkhqS3X@Nn{|WQG4F+KTsZiKWC=6_M06Jo5h6C?l>-!pGkUF%~M-!E&Lwj^F3CiL1Y z=t?GEGY}1K2@Y6OyuWfRb=25JoIc@PhVp=4gxUj9u0)8FS$9bcM7=CS+(WVxEKY%X zUXPs+kwBu+GtHpBI!Sa#H!S}<@WIZ1CeI0p4;VinzquAEjWv4Itk@O9q{s}~?Q7Q@ z=UTgsRN#&$vHDZ;oS4#B)AKer+no+Fe@#orA^50e*|ud-+Sd8={N-k zh%XN!?{HbTAoB}kas7P#QuZ&apIH5d)yM7)7MwuH{^sVnsQ-1@-Dc$C@|L4%j)nOT zQd2-ZNs29N)a;KhMhW4gvy1TOg*ZMk5-E)}j(=3u;w2#Q{wGbK*G&KGm{6?A>c6!8 z1MxdkoI(9ZHbM2jO#fy~X{SqEGwetsU7^w2(JePJjFA(+8QY|v!W zot=dQhn~-nf>;jlo6V$Hbmw@zMgxm);DQvu5sLbCFE=) zB-D%I+;3pNaNN^Q)PJGhCr??Etq@0YW5nx+d}nI7zJ3f3HK6+Y<74u?e^Q>r@X&vk zvGw8om(}@bCZfi?nl67tQ2V($pB$YtKB_;INA+{PN4S3O7azATvl+HppEEvcU*I44y!btDf1&Zm-U`J@JV6q%4B`g^G>Ee|BXJtU zL&byL$@?8%fIH|ToZ~?Om~#FGB_LiO^h+>AMOXsj@9;bep3hQ#zvYHlYMet)HNNnMkW&pag^p5UKxQ zD7V!*v05k&6A%8ARz-LG{RKgDNci(J`V)2d^EQU(E?(>>7x<0_4I6!EYfJp=Dq{mF zmt9a=-68NVCe5-mF%s`h)6V%)Mjsj(mPT6@Egx4HYk&RA^T&@LJ$mpU))#9o{BftK c=vD8lks-k=*y-tM8D2lTF1(?S3H|Tpf5(`nBLDyZ literal 0 HcmV?d00001 diff --git a/noyau/font/applicat.fnt b/noyau/font/applicat.fnt new file mode 100644 index 0000000000000000000000000000000000000000..b77b2dda30feb412adc9167b57722a839411e6c6 GIT binary patch literal 3584 zcmZ8jL2KMb6rMyNauD_&1=%_f@&iN+im1hIYeIiPe}Ehr`Lb-57+ljV+BlR_dgviH zLr;ZV`U6TY0bzl9Xh?cm3`#>FCBB4UC^$X@so#5VMw;!@t~B4gH{ZNB^X5rPtxA6M z^yui>@lnp*SDe;sgSL2NjBX@(azm*F;cLS%4Tsl6m8Ql-o_??h{JzVNV?iy+Sy`TO zgAC$qdpnD%MP23bvuDR8wWw#DB*~Z>kT}b-*w2088E=k*Aef!MVVzRB<2d3oI`ZT8 z_-UzOTbA`%U6xF!+Vbtc^~*mrg6#}6w}*<1XZ0HNn1nb3-&2?|%eDxSv_3>w{9D@( z{`_kDRu^Gb)^(k+nIFSP5<%R|b@WPk?!xt0L$}pca-7z2I$cq;MWGQ$;=G0fjNwHM zMvb}wT1OKq(WPm6(^iM!0#_(qeqNvE*Xvw37xjVX2h;i|Ru02(xHZ+WgKuE5z>EaT zL*jcbiKkZrwk6U2(0F0@Q#*>d=ZXWqAkkTeEF%ertn-GkM-b|b`wmi!wlf%g* zJ7aW-xiPz*;Rq)fhpH@DSEl<9@9(AQTSl~IB(l0314fE3h!#@6%v}eztea$d28;`a zt{Ki9@u-7e&ZW!JU z=J4*&=(bRZrXgn`I41{yvMV@U5iOJW>ADKEt}8nT%ROwMwq&!;62!l?$hz9h@CuaL z5?#E7vVTCYDTZlsF1FeiIag}BwQ2b|N~1L$-!-3#wSRrh%s>`&o-j+Fmi_G&k<-D(feulryfCkk)U2eD^U}jjTxOXC_OkkXy6h(28#qJy( z&!6K5IUpr+Ma`?Gs7Rv*(L^13bFCxG9wBusq^`PN6E&uSVeGsrz(U>-OV3FxJtCGK z;q_zfEmGP-YNT_QYiU)1wW^w`B0rT;(f(1*X|iOVWDVfOa_97kC}Y}khn6cbNEm7zfazsiW#7r#WJ$T_RCEN2}Cz-35>C=MBhO&T=OyxsZqUr?Jqg<%O#) z#lqZqT(hFPa3uwlw$X@v0H>Zw9=2z`e?vO8xAGD*=KS5IHL#SHR%%N#uCpRLZK-{^ zWBkVRPB1p)c#Z>G_fgrix9a1{IBm(JTVu%f*346 zyNGn(cx7BGNM`5Hu6{9AS6;6RKCvw^zDU>kimb1Q9%MPD9`^6C_};zjeRl8L_eMWM zHNy8b3C=A(;`w9(;jGZvoU=+LPdxRwKP;$HBszicp}>$$scI}u)j$slrXgV#DsPY3 z5>?o5y6;Gk*!;iW{pHDzcR!ce)kacW7RiQ2QZ%|+&?vf$Ncq&bh}@{?lxRn8hnfN6 z)76dQVWh|5yRosqBZ(Y~@f}ZMEfTP`NI)xVgbKHNa`Mk(2j&8ef4E)}{S G)A$cc_!?^f literal 0 HcmV?d00001 diff --git a/noyau/font/backward.fnt b/noyau/font/backward.fnt new file mode 100644 index 0000000000000000000000000000000000000000..2c971a7a2ce2cfcb71b6e1b53d5aa4587ffcae7d GIT binary patch literal 4096 zcmZWszl+>P6dvp#H)4H|MsSA>!KDjT8$rYdOh}bBz0$~yz*{X>2;E(Cr0^e*`vcOX zN*M?Sk%g(mxeE)sn5%9ZV;=;TEfy)?n|bqQw0?Vg()Zq*_iNrfX_Y#r=IZyWt9Lh7 z4GWrKJq*k3;IOKCP@SE)g(q1Z!X(eP+ijBMEKl-g7#fekhDyTHfoQvgeIm=u%U7>T zUQXQQ&AWFuODBK0`}4QFES-Wf_X!-Z#Y1<9<9PD)3FBV(TI>7m>&KRnB5{~K?6eI#iXvy7@QZRNUl@V;camjwE$%6ly3YLec}07N z&B+mriwCv)VWd)3ePzCeo2IqCj_URwU8gR_Yh9#Cr+HOYRoP}ymK%$)H_^ymnt&C@ ziCdkd1ySlVEb}2R{Tftfz}GYA4vg4yxRE@A6c}B$upP^Gt6JahKHO^Atu)J1q66#K z+APqn!ocl$+lqcMKd;KZC>~h9$8I!%Jd1%*Mb{0zvF8)0NfyZI{?N8X?xHu5OZc3L zPuFCF@)b^BDRdS$7kClLC}Wnxeu1r$-2&e2c8kcxcS7w;M~3wq^m~o3vv}TJBg5G7y(Dt>Z$I?Ad!G-b2dXlboBUwI#Ygqm|L*GI&MFu=a&-P6k8!wVKZo_r zC|+7ladAqKVU6ut&AmUQH>!u-QZKg+;4zwUv`y4LhhPHqCFZF+ zPjfh%;OqS1mZr4~2qOcWu>DQ2ah7FIxN~pLBaU;?+KxqIhVj!N4)+s_)u=z9A7UEh zA&o^%cs*icp9m*>GVv^I99rt?u{isBcW$#prZP=Z5c;TbU97p z#j;5E#Im@%|8LJK#vZ-H@B*b))wEg(QVOV=GXC|O@T1fpKZhTs{{9qxDB6$&Ket@Q z&lACTRU&$0FA~JX2p{XeDMa7ux&OTW;z<6cxNw$PQ?Q8(_MM!s5+7${N=Y)t^k@hP z?L;K^3vb@2B#Irqd^NXjmn}23nYq)ds_#E!=dLqC7V5V8G-D;)U0`Pqk z@y|U)@87d1iZd6FnPwQd4)^#;Wd1Azm8Nc&7J)l@eU=%9dwQi7JYTKs=FlQ{ev(r= zU15^AXfL`jVMh9gvYCfY;;w^UO+4sn%|qfi*deqpzPkL*`l=8nFcY E532`_hX4Qo literal 0 HcmV?d00001 diff --git a/noyau/font/bigserif.fnt b/noyau/font/bigserif.fnt new file mode 100644 index 0000000000000000000000000000000000000000..55a358cf56bad8feec68b03d9f22b02ffdd8a1e6 GIT binary patch literal 4096 zcmZu!&1&3M6ux1K?8Ve>cel*o$s!LRI-m?#$RYFu?oZw6-|&=@?GV)7JzfNuH# z-37)7CV@h{HK+{%L%r$3U`VnkR=@LeucS$jJ(9kA&OLwk+;b&kHmNxM_4M@h*=eDS zqN$svx^5gcQ3*=M+iv3aIO#$g$Jf`_*2c=WanUqIi!lrltK5d@x`KWp8I1GCk8_<) zqt)5#*JqXE?{0nlU7Y7m!0@w$0o8agJqW{aaq~fOnUz_V9bW&vk^yV$_&Tn={G)WS zESHP)k+99Z!PcalYz^)yhX2;u!h1YrGSjK@%et;lMj*jS7LKDVi^f5gs07`RGDTjW zCR8v?I6fY`_KX<@WiV7O-E3HfPMU|)G0WXLZ&;qi~(-+NAmErI$sroSCy{7qON})+VH5ZcUT`U&&j*>`rQfRFuebWAM^rQ zxSyt>l@M_ch%hb^wl3l(E@~e!oNLIz4YKx|`))`J$w9um8TSUHJ6*jLZc$ZlF6!H> zs*?4vvtuYH5?oY+K@g{_RV7LZ4-))TKG@ld@^u4`cUfVx0^POzJ(ybERUpyVRAirt z zN}R)&hWx2m{tlZbE9i2k^Uo>5)w#yQd}1rV$)2Q7mrv6tndHmiG`;D}zd+W1Va%2~ z_F~BmuF?T^xf+7?dc9=%t1O=%FOKJVcE$LHt0(pL&`E06ss2}2xAnyv9#Q+s?fPGk z66c@r|F|fEEzFSkVNUH)xuf2x;8|Z&pQ*>Xrh~T=$CgSU$T}#v0lr5{XnT%BK+)q zE0<(xs_kuu)+foaJ|fRTNme@kIQl*em*lapXJbwvUIe_Nt$tZgF7;U(zcE2z*oagB z%cBJ5xyZ99iTeWw9{k==Nw@yK=K^hULO5wL@lgX(0T>qlbVmcfe~u)0t}#hA+i~-^ zVVX{ek@P!Oitu{*kVS6oRTULLi*a1^)`{FZ7&r@P+4;~;OO~g-YZr7;d-RB9bnQ)8 zgcqWJ|ERSiPgE0`Xv4tX^a*y)bT1f4LQt3J?|Hs2!YDq3>zC7DvWc?zxqD;>BvjQsl!?XP3(uIJK@jG^w)&gz~eiO2v@_WY!LcBuI^@qC`Nr;#zU`Fv)U;tOB7dP5%{kCoVN z9T9``aG*H-fCB*U7gaEv(2(Hi;l)HnSYO<}VHz`v=FzC54k(%{{`QCNpD{oF*8MZ) zuNU1vYEE79__K^E{%k#tgg(m6J8{>;oAMt6FE4WLs`KwQ_#cBir&%REX1}1{@%8Tg z6TdB|l6Z=n4S9Ou0(t(#VU_dpGR`k(t^CA#dG+t1+>PP;!|Sx2i+N-1Nwp-5wd^1^rY!>>thNN80ZJ6MEmnad@9)@b!e<2x3H+(mBr~Wrmh! z!}dTi=3ow*d3ov%Nf@SXVE>3;Q4|*FkocO@*KOmvv+IA1Ggx%}cn{`q{P^!bs442& zbw6VU0pM+su2laR-xo`KUuZw2@Pw3aN<_r}GJqAKYWF1qbMyk{dl;VSh0Eie5p`4{ zzd!7ybXTaPUDL=-Euu%Zhcfp==Zd@2oF27!mvi^eJl1$FDc7!>Vb0<*Oy7R)O-`74 HLmvDGMHv`$ literal 0 HcmV?d00001 diff --git a/noyau/font/blcksnsf.fnt b/noyau/font/blcksnsf.fnt new file mode 100644 index 0000000000000000000000000000000000000000..1e4e53e7adb20bf7b6e73ebdb0ed60c3a9720e72 GIT binary patch literal 4096 zcmZ8kL2DaV5FT4X*?_Q@ki)iF93eyyrI1Hl#6q_#+vwnw9D3;`-Wt!Z{EzjdAn2@vfMi6pV-S`8*3;LxUS+6&z#%8Dz%5)dq|KyfE|(3s4j%GxT4u zCQLUr(vV>>J9zu{V8;CNmE|9gj*dpgAWYLV^m6vtU+pWkeRgd4aWYPltq)U!5AKI2 zC*l1AgD1!5^Yi10fv~s~&7-A7#$K3vUT!1C<J3`EJ+(-%7tV=tfr*#3(WnlNTQYh;av=+DN| zN-rHZn9t+9R!gkE6_qE6z+(zP?01wz6`oMPVb{leDQEVN4T3#k3q;w-`eC<~Uo!zY zO29w}Q-orFS5~*4Y^fFI{a!*RhA~D@U&c`q$FayKOEKWo9`8Jk>C5&S$Bc3Q7G}s8 zPg71O%1B7%7xiDRVL8QmNje-2QyU*fgJRc9cE{t#BK~CO#Zz3+xX1k_i5O>TnxO;6 zB_GvlMxpbU^OfHa^YQLLV$7j*FZdGoe91o^?^=IJ(xZ|KzUQMbF8f9FUx>#=Dcc`w zwEGPX7eYKf&8FquV0g&R?11k-c=)Wg97VOh*dMHIlI+;}0#-1N?f%u!I@$V0_~<_z z3*J{51uS{A@7IjS(!a>xg8<8E<8MNlP;+$QL8;YV*jr_PWG(FhQfdI^@i5R92uwR{ z_rK(KuuIv3^6A?KfTyd~_@g*%WNfX<{Cvhxc7UxzgMq*G7uV$6S{89*lWS4nb`+4VmhyUV2PLS zTZj=_`^l(&P7332k}n*7_~&nX&(Yp(!)b4yjD7hqi|qrom`o;?!`GFCg$0S%{@ncT z*4ukQ>>|8VUfa9yEGx#p-gZ^pF6Zix4PvhUeHy@2%7K_hH z9pf{%RA}5qIi*WiW4fMKaj`&2USx^XsdGvOc0M74Y5FDp)H&C-bR|mx0Yk%hEKj3L z@wzt!O{o+D)36}rMMu%-CSAD0kQesET(ZBZCuk#zuTK}7-|bdkH~{FkZddq^l?7TJz9R0_7vVFzANL`^C=4(Q$fqwc)K!OG{pR@EsiSr5_2ivuJlLo=z?h< zwDP6xLWd-pFIY6DE277B;C)09gF$-n~1_K4`bY!C+)gVZO1kro~t+X1{g2 z1A`!cs65AQt@9(w8Sm}wZ8Hzh9t?gk?ns^4Y!LZQw7$L`IX=(uIz@+{M`1df&C(9P zAU0jcZ@1gl8mA5S_w7F^3!mTm;?9?A)?2HkS}pbm;YKOUfi(`h&DHsz-TP^c)y8XrsLN!k1qylBxaMYbwQMWYW4bG-HT?>`V13d a3$Nq2A)|5-p|GaD^!2lU58mvVd&K``yZxyE literal 0 HcmV?d00001 diff --git a/noyau/font/block.fnt b/noyau/font/block.fnt new file mode 100644 index 0000000000000000000000000000000000000000..0ba23fe38445f9415fe031295a529af5cacec144 GIT binary patch literal 4096 zcmZWsPix~w6raUl=itWlHYFl1W$zU=Xbo27W!taNYf(C&T#Rj4r~?jC^D*`V^wRIJ z5b&k9UIT7RPW5G32NqU=ELMMS=Dm^ReTg;x&HMjm^k%HoG37VE-`u=?bCWY8ueMdS z*;Rs7RDhD;L=;bgqzQE#?{+(_W9I8Pud2Mpn1+aEZbh`)z&??ijI&p-GFGSA&6~Gx z-)w|G=zZ~3oMj@Q>~{?ZY;ii8hGDpTxMy6L!WeV8`|s9GXuXYh@z%?~OqbWi^)h|w z*y>rQH!Oy|&NIe{Uu&KFh)0&xXvF+tyWOtOKn^D+3?gHqplcGApaCUg7$>gB5i-8U>wj9?@l z)b5*>NE8*3{n*)lKQR|+()qz8eTnhHbo+W_SSyI4U^36LiNjc%lsRtbYfOcq7H!?{ z67}m0v$%@0S_jps@Tn*08z#bfhBs0@K?01PbznP8Z+~N)?{@nVJ68605XS+LtX{s~ z?+5w4Y)+MzWv}R!rN|Ek-!7^Fi0xJT-Qxf{!iWC-p@A!y8w``{$J+l6F?j#vuYdv3 zcai(>Ig>hFn+?j>WqTN)>a|r$Jj$5)iNW&pm0vC3#bPl}6Xx6e%CeLlh1lPJdcWTv zgpc^{8~IRfM4n%k)dTb;0@y1bs)vUM(I?!nkJNV+J(!Q}=ZGm0GA1yIo;@dN(S`&%A!_(8#flM6n8~N|84dGKdjrF&=!M)g{(1?!kuhI`Cyqdpy zk-tNM**;RG<@fnk<^JEd>vAu9I<~J%7>YgguW@i%_p7+?$nj6mjM(sJ16kDmy=$Fz)pfT=XFBL7JK>ejwN5HG+-l9|j|&=0gHjF?mBql+}X7@c=JZbh?9;dJ%=ni_Fpid0TBD66=e zcs_(%m>PMLA0Y82MigZ3SxYvNf zvFS5LV^qZ`Ou~^bh?-B%^1Hufe+{E7D^QP1S3k-hEz?Ln6bv=7i?`-ee9d|izllko z%uPG4AjVL5bb)aGnC<=HYOuMz-T3=X5PcV3p(VVQ{j|wqoR2smo&KjRyZ$9xWZ4IY zPtQ<0y3y!6yF;h|&GjKXCbnB1MYx$C;a2?EUvqaQA_qX`^}1MGa(z`in}D}!H8cpE_$(Sz>)AjXA3OVeR}peQw+fyQ2*xEGm{rDX2aQyh+e=w78x1z07rwjNYPjA_N5T@yMnugp@DLqHbR|PV% z|84>+Lc85>5xAr4v+rT}PFHG=PtT~MI`Z#_zH{9bCh4uI+`t~uBkM!i_CpCpM$&0f gjR&@N?`ARQb4Rt7ZU&v@U6}s)*iud`wWd7yA0{v(DF6Tf literal 0 HcmV?d00001 diff --git a/noyau/font/bold.fnt b/noyau/font/bold.fnt new file mode 100644 index 0000000000000000000000000000000000000000..1ccfa5938636d23294d91ae8d9296207e88d439a GIT binary patch literal 4096 zcmeHJJ#W)c6m{ANS5S75AZ%GjYAVu$S&b{`tTUHjN9Hnm0JNN6|d)@Z&vo}$cWTOXZdKdwZm1mPI%K|^i zGJXP2vNTPzByfm8r%%%KBuytlSDpqA{|8ymAI>-OB}1Z%AMXH12f;r(x_^BCsH+dv z0A0T9(TD|g_76w*`aGf9%g@UpK(MDiI=UM;^?p9opA35b6RCF?>?M3pC*R+{sgEA@ z>dW?r`~7-hj*ubVWUw>b>)kKeBf9>i>E3W>FbMVu`?b^Q!(_w?gN|quc#z-5xIq++ z$JFY2{-keH*R}Wax%c=%&JXOx#f3RLJ9DSx&%gh8k&N^5+vm4;L@zHdFU#`F=Z`O+ zk|TUBh9XAMNpXH%0oUh+><_*j#=s#2HF@tA4xjgp10z_AN6VY<{lM1V5QlrZBk3+W)L;Q}AG1EMN&(4dOhCu?`h_398)U&^y{oF!lr|r335YCx~aNy`m0VGRMXYp<7}i}rYiGsBJm(Q6vi)sDr&_8#E-!wAo*18zg}0B zosmmFq#m6wYhUwG>wT%?hE?0Ije{g`8~S_Rf3v~E`}%6cW6B0b_9=S( zK}WnRuYY7r(m?fNgkCbxU(kLb(O7=5_Vk5Gj9clxvoX?xX8tsr+8PUBWj9hgnjy4?YN zpLm97Twj?#`Eq%6g&hrJSwifON$kCitxgy_zzxuOjf>N=tg5m+E$|Kld|lcnXkHv7 r305XKD00f>Z~spI5Rh!K?ZCDJ+YW3yuG>B|GMZu7mQ?) literal 0 HcmV?d00001 diff --git a/noyau/font/breeze.fnt b/noyau/font/breeze.fnt new file mode 100644 index 0000000000000000000000000000000000000000..96ecb0dd6649cf3e1cc5995323fbdb4b84b33519 GIT binary patch literal 4096 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 TP-nPj2frSblzl;^Ar1ZqV0h(s literal 0 HcmV?d00001 diff --git a/noyau/font/comp.fnt b/noyau/font/comp.fnt new file mode 100644 index 0000000000000000000000000000000000000000..686266519ad427529fa01fdbb36c8ec8897bcdee GIT binary patch literal 4096 zcmZu!&ube;6rQR@=&)?m+q4l*3H}4NRdM#P*ujL5L-4KlMTk9#qBxKkx@;UDbSgRI z=1Xq9Wd$%8FTW^sdMlt3eJ*!?swq!?X-_q?01iTGTZh6xj;HOh=Kn)`g*WNAPdR zaHC{^xrgwe_$%x1G+E)yA? z9>?L}_;?U{$Ej5?S8ADs&R2*LT&9cUF0?ecO@sw1Ny&f~yZ+v|8dX72{CqyOtp z-UfwXn5HSEfSF5EK;k-;%1r=*f(n_tSX{kYR#;!p%wKpq>&2PBlSziBr;SEFpD(!I zYA^2RZ$V2o2*Z|`(&$sQ9U|YbhlCM742Pn2a+02$2%r(|k#;#Y+?M=ubDdNvRAi|E zLVoi(<9sxFL?j)Q@S>lOn$2cDKNb1%SI^({eW(8`QI7n@A11>u$@9^EUiJ@v5QA7h zy?whTAB{%jf#nz|cbC7zQg74K!7$|Z8KW#y_zT5>_WX`(C*o(rp~Bx%e(?L#r+@5A zc`EJq^HU<0FP}d*SQPTfc#Q73e&myhQFn4$jZi4#3*foLgZ%;)BA<{Hs`eDFn(wFT3sZoX}@_ax)H9Bm6aBz^D^)LC2u=-a0_FF={K=whjTo?}N$u?vs zI9gwA1?*9Vf^NQZi3?k$H@?b}Bx4-MS+CdI-4(199{AzV;bt?td2?rHr!4PfD|x3K z*$3SDhreC;Yc!0B@ejPqay;4XHf;iR+-ezC9QXVEY^6`@g*GhdKlZrCkN*PI;)#FC z-^8!Uv+LKdTb9eO!8k^}?s+lw(}u_P?a%5n?Q;E5ii+F#F=BnC9-I7R{*{7$w5rGI z_j=MF#Jhd}Nc%J_fsJwnmJn~oePw~r`{FO1u%j<*e z%b4`bcv{`hOgg;5Q7R}eukBY#6^GvxuU?y{11b-0-CDlDdE*7?E6x|w#q)3Tb(r&Y znDop2BzYNAJy712`JSr0vOguNwx3|0vmRE1%(v=n1VI`E$<~1+<@q68?jO&;tA}tUe=IJ{50yavfvWqh@r~CJCuem_SSh?X zJDuft;ua)SX->p~#vHF;i-Yg)+`02bG5_%Qhkq}DCHVdO_aDAADmb}>A(dwhaP213 zr0bAUK*`kN8(&v{Pk*ZZ?!T`7$nXEqMU{7RxRsVuqBbq zxD`|tJ}DQ#$P4wU;^3Oow{8ljZ`D3IeVb2RzEO1#Yblu1Dk|YNHe9-{K325Ds$OPq z)$E-=&PPi;i|f;+qO_46FWQJeKVcDxywB47k}bB^3MY23SwnR zY>DM~8V80LX9>=iI&kL&GI z!#$m-9riDqEtO|ZhI0MbiQsItAJHy}zol?62wh~kDQ#Ys<%}=kIP7`TLDcb##O}Rf Rhd^{zkko}85ecY_{{fp=oSpyx literal 0 HcmV?d00001 diff --git a/noyau/font/computer.fnt b/noyau/font/computer.fnt new file mode 100644 index 0000000000000000000000000000000000000000..a763ae7c0f3b02de3cf22f4fac9beb5edcb640f8 GIT binary patch literal 8192 zcmeHML2DaF6duK9C5kGmhmtK3c0x_aahrg$rHf>O=%J?`+)Gc24ci<<&?(VjS$SnO zRvSnY3L*Ldg^*ra3?VrL>-M*RKl~?k6tNwsI+1lCp z=6mzz&CJ`k8pg(nY5ihZ51N)qG&J2E*KKuO3TN3WNG_8g_$-mhMZvPBb-P_z)(F0= znXYTnIM6_aOt4)p-4@u-1#hJ3=g#Rw_ng&gK6ubeX;&JZjZROeT&Yy{*7kat!n>3tF*QtVZx>byuII@kAz*%T;Lw zu=#Qsdi&9e1){2|oJhdtRaLZQw;N>}WA%F7sn_kU+wG$Kv~%<3btilGuA`v%`QKOd zq^#(VuUo*pg;IE`#mqv>Z$o@&tviuW1~==wPb-oLxP4iQWU$~Ovyg6(dA z;QZ=3xTZ?;L1`wF@xRa>26zHn1K#BDb*&R`}|$EZo1&3qE&TaGcNoTE7EA;2biJb3yHM zU%cpax?NH~#Hacd2u>ggR?R`51`tZT$N4 zGMClWRkZ)-H-7kj*|Mx=vx(w-ewSemR{q5IuLIK>&pv0JpSN(FujF3X0(#n->K9QBxyPz zzu*7w_rJG+-tYf|U2#wvxBoK=aR?}JCwjCQJLdhp13V5 zR6Qs<`oe|Eh2nxvq(JTV{Jdezx7+OjWvF1-lB7WbZyQ6^gB#o4+G_9a6606ZXq>TK zy;Q1HN+o@FpmL}n{L9@-_}6~rz}s;I4v?50f^P^ed=caGxU_yTe|&<7`O)-;YakD) zA27^sy*Fg)2O43XN%~)t%^fZ#%`X|MYLqDdZ3f~<(vai*o1lLjWlZ$WzwqaG2%kU` zpx$qak~;%}=U1!+@`mewgIUMe9=JYg|G@e^nLA1Pk8OeKcU=D#u0IdEE0=>WJiq0n zO40x)UPAdtB+a)^LvdaSO9)0l#0S95)2HDltP07W&hi-Gwx~qLu${FvYJG!N2mw3* zkoq-UN=nrF1r}`a_Aa%);KeB#hY-L60JZ-?zaQdA`$Pz66Z>1(Cn5mJ_d)=%|AFO) z0F3`pVfZuJ=9@dipHckp%fp{h+>Z@|3xW571}NT>Nj&SxzJJY*^8I@!5+A33Un2Df zdV?$4zcYrvFA>i+#(cdbF8l`eqx~LKlK%7kK6B7?xa8wRY#g+8{dV%8#xDf=Dco;H z>JR#-_@aJBo}qBxe`l%r5%p)4{HWbS_jx6n|CW*V3q3A-JEnh9zt1Q23%ze?{lYIU zZJ%!!sXyqS@~`hFH*$R0Ea~51{(L?7C1QSkLVisDq!pBneh{Q!gbF_eq|fl|68r#D zqMwgm21w+8FjU?@WT3-?4&A}K0|*&oA-@nfp8tU!NC6=OB=SG6|NUpr_Cq}m7a;|V z%%32CnU2a|AO(aBkjVd_D|2(RU)m&b7`XR0Y}McnPQUo+0u>|pPuKi(gc?6Tec-1n z1fDu}EC?=e9dzm!0%&`CyF7{o_rNmQVQK&~cIheq!$mEXR2&J{MrjxA4jF#Hj!hhq zCO0pr`1?I$S0Ddz`}VC{jm7~bT$=mmaxSA?w3jDh$Pw)9?5qsO&!!0{^kLTjE&m6W CCR(om literal 0 HcmV?d00001 diff --git a/noyau/font/courier.fnt b/noyau/font/courier.fnt new file mode 100644 index 0000000000000000000000000000000000000000..dacd3a7415f6858c687c4cb8ba871b8307d8ba12 GIT binary patch literal 4096 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 O{p-VMu(C8_1@IrMAFJB{ literal 0 HcmV?d00001 diff --git a/noyau/font/dblmtx14.fnt b/noyau/font/dblmtx14.fnt new file mode 100644 index 0000000000000000000000000000000000000000..6a3a99b34ff3813af06fd7e441858460407701d6 GIT binary patch literal 3584 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 z leGt*%%>>7syT4bd#B)cv)@cUui@Uh^z27|<(@>Sg{{nOump=di literal 0 HcmV?d00001 diff --git a/noyau/font/frankfrt.fnt b/noyau/font/frankfrt.fnt new file mode 100644 index 0000000000000000000000000000000000000000..6123f78a8dcb79289dd962730c66deff2b64dc51 GIT binary patch literal 8192 zcma)BUuYx886R0ZLf#5#p88h$aG*v+EyVFd9>jsta5TYs2wYtPK0}PQ-;7qW zq?_M5pKNJne)IjlnQvyk`J`p+Fe$J9d42u%t@SeKSoWK~Uu*dYXW0sgZKyz>sfHZ} z>z37OwRGJA`npy2{W8W$jVN@W?Q?0>X#8B{oh9LM=dYr87%pzBSmWi=uHd|}0_cq@f@xjKtPM^ly5 zXfy(F^1rU@W$0mc{@wHU+Ku|pA4^CWOmjBBcW3e;&B!WaW0DSjG9HhQk;IeI<+;1E zwzjrY-Ptp=Z=~X}2N`JX zzB`3+)i7+kf(hvG*#2QCj|QAN|uLbcm-_|r(Aqxf-U#ux^Ix@tU5^FNwI zJKSD%$c0b*_%Xw{Cp?`O?*^S3j-FJ8ZxC z!onNlXTj7$U0|${a&-*D-9Ir<^emq z*Daa8aKWAHRR;_DikY3uWM)c(&Hc4xhB8>N{yg?gWJo6P4VlbXP@lyobz3+X>pz^y ze0?l(Lhiv}{Hqz1KTzyUYT6je4|r@PT#IS)8zw%NvS@rTKUNG<4&f(9Zu`w<^Vxon z4wje6eXGX?+xlyCh2i^+vH8+WCUYZeKGLt#SB^}kUH4j60T(o5%X1kshwdLDdU(b- zl979#v6z-RZ2l*=DFC4T$5?gwI^j5dsxDQQmX@CEo6%5lmaosbdBjkdotvJXJ|0Co zfEh~6h>wrUces{FBv#0P{CZ$w>vrCTMio>G{Ok}%K@N-7m;K*`pgcM_FoQ_as zN#qpmVzJ@t$o0v7NBr8ltVi1|F0L&Wif&tmGS+BZzU+CI8;yn> z_v(sbQ3$Pja=c#O+G=cXgZbxj;W!;mw^UkNE0x@BIlu5PcQ5d7{a%~C9f#lqiRA(M zp3tQ?Fu#s2<`?V77YMA6<-S)Xc@O=7QT}1Dg)RB~#qi3||8)6MaBDW{3P$=RFPHO5 z$bXw%X)B71p=)1`GA69^H*h~5;8AIczV}ztwD|>AmRV=4M)CzG`9hBGkn6+F5AENy zoreBnTSWaO=iid^=jn9WHodjvIJK^69y#$-1b7e+LVyfEc7E_R+~>u22VcYZzpoFzhVj1ZO%wsX*X<|8 z_jHKUcT+CA;+@`x^@Dml6hDlASAqOp-tMQ=e)|ypT?O22^xINLATIny#D5F2}a{h*)TYY7TneuM|zAb;0B(iiP1J%#YVf3s+PMEk6nA0GEWJ#U8V z-)C_Ag2!k4HxwZQyi^g5vzR~7hx|hSKIRvG@$vXNqsl`5u6^X+U_O4p^T7EF+M$2D z>lg6IKSI_wP{KFM0S+C15zB44lIDazIFT;31Jls53 z|5zm89!vqfIwgQ1_irZ!#Q8xt1p^d83P_KU07bo&%jHV=e(Yp`ApfJOa{H8l4oQ~Kz$G%pPcLl7y9fO4GLZ8&Ye3e z!&tXYT4nkk-K{?O`Rd1v{^XJ?m2z^Vzcq|q^b4^biH<0-%|-YF$*({7*E{dry!ra; l{RR)p^Z&VS8`g6D7tx615iC7g)9LYZxlB*!4|KkI>Hqk1I$8h# literal 0 HcmV?d00001 diff --git a/noyau/font/fresno.fnt b/noyau/font/fresno.fnt new file mode 100644 index 0000000000000000000000000000000000000000..842ab5c4c674498eb95327685d2eafdf48cefd66 GIT binary patch literal 8192 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 W*S4C0&GN!ee!J}$$0VI52mS%6y{^pw literal 0 HcmV?d00001 diff --git a/noyau/font/greek.fnt b/noyau/font/greek.fnt new file mode 100644 index 0000000000000000000000000000000000000000..510a2887dd310fbfcf1e466f65cd8f305793397d GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/noyau/font/hollow.fnt b/noyau/font/hollow.fnt new file mode 100644 index 0000000000000000000000000000000000000000..0a496784c63015cd7f5af17d16202119de135a5e GIT binary patch literal 4096 zcmZWsU1$_n6uz?VCZyYhLRzL~niTP2DWMFmj)9C5Yb%t}2aTyMrM07jlUCME#DcAE zXN-N)w?6t(HnZ8Sq^5{8KKYZnL`z>v`xF`r(NY(Rh#iUH#Ul4w@97WAmBr!7s5L@q*hMl^dgqmfwS}jep1g}|s6!|fR zW>C=t8=>^Lg7n1dG-3--28l9tS75i3ZFfHv0mTv+)IVAn@!TM++NIPcV@GT zw=0BmU7KEe=ls82U0vOTqg&U`T)Q3fusW+h%-2EqbblG0>+0(5EfhW-B7GkjqyF-SFS)qqtW14-#SV?j&9}tpP}kCbh1MB)+q5GA29njW}t=h(BBNVw+>gU zjt&8x=kcsVzPRvw97caAVm;jt!_m>v!NEZ>9>C%3>>rTg&#Aw^!UOLDx%KFtJA_-c z>EFlRMvvTIw0NGD%f9_`OD_U?vhrLw-wDM?DE{w(9yPV^6z$jl z-g%^6KTQpg-%D3p=zmvhT>A0q_gueyy@17o>*wn8 zbJ8DUk7)bFnEIFd9rPd4_^w`(OJE0$=h*gawgUrT>$PuTc~n;jz|DT+V4?Ta*$Ux} z`E5^W$-dYl`4**P?xe!C>FFzDAE@%ws?W{WzxhyAw4Z7R2Dcqu{95YYsr~kuxhbD7 z$r3Sjs<&`ZeUH1L)J?+0>kU;ttk$YV5QjR#-*8zvmQP$0ZXi*A@sQ&jD)#3xd`Eg7 zgRiTq*I0;cH*my!GB9RV&Q?4qr!W@sB(Ix#3PZP+=Xh2=2eS!+{*wODUlOCgBu0J+ zhs(|3ERn`g@KU_%^5MFC8(=sze1V}fvY=?#Mo}e%m52NMrMq(e229TjARprtu80@D ziacA4fg>oQ3iEhljPWJ&iF^{HJ(`bXctTtk!@~mv?@!RmKO7C33kywk-qFpi#urc$ zPWW7(H9ZTykMM=$_?hQb4to=x_k`o_KFA%OXtX6-A((*Vd?6k}TI3gTa(swW@x%Hm z^CJ;<0LVRYI+z$2`DIqAWGB8yY^YQkVig_>-62r;oT>3qTL34TgbE8XnT){BitCj$ zquk8p2e66b;`pxvLWTU{8AdtiGfSp8olzSgvn1FT-b(%$dv7-RW9-k9$sgZsm>n(( zuch#srZ60pP*&+~s*u)GxLtoWr}Vj=ybJsFHhwj?EGO6vpvC$Fn$j2X?ch(w=()ofN%c2kr1_^z`6s=IJ#DjB`hr*b zr1vz|r}(1SANOM_eQDo5zEppvsp2I)7+)&>#CS#fNSl2mF^{J$U)ulXOXUy$3yMYc zDw-I3oD#-*Qo@*0RHpDUTrQQ$;(QL!c750N9p_cjf&ZRhH-Zqt8=n6`1P)v%X|RC< z#j}wT$dJNV9qh!hf4EF16v6vYA>qF{P1Y|_on`%_YVAUIvL5$CckuZU=PPpJFE2}L z#xgm8Pkd)V_}2}`sW^@y>M0J7i{Kdq&i{A=%m}V_wM3vhJV2`&2Jd*NR=B$lD=HVY zKeQ!YUBM;pnutF{k5D7yk22Lm8H#+OO-f?iL%Dlcvc!0nFxRr0fz9NS;rzUoGPX%l HO$z)6Mjr`X literal 0 HcmV?d00001 diff --git a/noyau/font/hylas.fnt b/noyau/font/hylas.fnt new file mode 100644 index 0000000000000000000000000000000000000000..fdfd94081e3f1f55ab4a25c2d3d84a21aca53c62 GIT binary patch literal 4096 zcmZWs&x_ku5T4k<(ZSugkiaV|ViSDWqo_eKSs}Z^gc3?AA-R+ul&ENXFpeRIl*CB8 zW(hg;5SAXATMq4I>7THHB`&46UKiX#PW7dfKp@E>tUB}Fo2MsdY)krPzBe;(-VZ$k ztV_1{%iiAer+b+;WW};57OR3W_&G}GI^584LmP@9Sglq<1llfwtSGV)qZ%nfTMLra z0{xRHWspWus+*H`@$~ugrwg{9KljlmL7FlFs4+T)-%@H}t&>ZQhck|#;Bv-;;) zDTG)Ct6*vP!+1K&XVZA7%y6cDuAR5f)z4^*`3oU3lW|W9^m^K!FPF=Qn8=pZ`b8EGdKSIecW9DbW;mo$Xo#8ikqLQD<_?-^(1GGh! z9l^D$wX=P;v3}BqMTr%%7@jMgik}edCK^SlXiu^NASG zq6oi{RgWP`*&j06cIrP8Oa>Yc*tM5i;eoD5*2l(}Xgxdp9{-uA)-yVNu ze{rqb*RnB+0P%^cThK`Lq3#KO2)j z8z07ka(&4LaH0%ufEgFZlp%KTUJ2 z$Bx1(Up!H$Y5}0*5FulgZ;2^CyPjmXF}0`WgSsk6l2CedfKc(Y+4#q!!Q%LMVa_|Q z|Ec#q9(eBY{8*%cDDb2AoA+rtyOZ8c)7Q%1#wON|PBh{~&JZeqJ)VU7WY+a1Z1<0F zCI9USOw^Hx0w7B6JT*2MSQN4G3JYfQC`eR?8&ZHAW{#d*Fcw~P7ZXMbmfWPnCAAAp2 z#Nc;It?@fyu&?Bey6K<*rxm=;f7390#pA1Pf4XLW(>P_%nrX1i3;nZQ-%WlhZy`%b zHjRrlK29eRV{bFoJi}Ldntmjj-xh|i^Sh$%0P=pt8&u*AysG^z82^%2z}vORRrLCMX)1EOhfswJsFQDd_D(U?pcy#aomwc+&OVIqDVxSoI4{md4gLS zF5ukQVK7GN8%(=H=y@?KwkJ&z4Kv&!@!y=_Jwor!y#LAFI>Cs%A78?7`1&#b|Ikgg zTykrGdIRC>EI!u$T`!JjaqQ{+l)9%x+W`|-U!}kiq1kJu2!_LVpl9|le8zW7)8LIw z+EJC5^&w8w?ussH6%^{GBjO&3UoCP!WWaZ7Q;`y%m$mzM9O(X>P_214!#2|sFaG0Q LrEw^wqB7urD#Twb literal 0 HcmV?d00001 diff --git a/noyau/font/inverted.fnt b/noyau/font/inverted.fnt new file mode 100644 index 0000000000000000000000000000000000000000..1ff13cd8e82c5746abde789bffc905a2ce385311 GIT binary patch literal 4096 zcmZu!Pix#p6rUiFeNZ>_ref7wNYHEF*>?{Wq5p<>tIgAHCJeCc=a2k52W zAz;``ZoL}RLQdIB4}n19Ly7u(Gw;38I-SjW=lz}ceW@|T2qG(>dY6`a}^yc>U z>sy#GjuuxmO;ddH)!tLq5B0IdG5q%Zd77q+Y~kR$ciXeNuKT)I{-M|wLoD{4ROjn{ zeO{d~{YkJl@8^5L6X7qq7-y*cS!Oc3n0|nDJq&}>U)Eug*L9wxb?F!oE9SI6Fm_iT zl<(+wbf8o!3i~ip2=Pn%)KiV=tE!ri&9i1~o_R#ymu2GfWA>AzL<&8_?hXgX$dLN$ zsNW-oZkOkMZod|cqO$%mD67-DjGT>i7Dr)ys!ETWW_g_Cd7>EFRLGG-L@~B$8jFXJ zrWJV)n_?^)FOATQK0K-4dX~{|;mib}?Ma2hLd|bk*B95TGf9_OM6`-T?CEREuJp1F zg2NzC_-PpSO@25F`52;i$cO|O`fI?c_z!#Oc&$gG+b_!(VGt|`$FOt2djW?*@h~El zT91U^pi`w;fwMH?VLH+jAwjCYtd^_Q%ELIirvjFS?ojL{zM}FlJB4?r*&*v&=e8U2 zHN$=O{6+ENc_#i}rRfg*ZC0 zcCkE$lQl`~X_|2u2&48kh2>$G^jQ&x$IU4U@VAZVFRZs|D)GU*nk7emeigQUQNb+F zKb%p~vP&c=;*vtYmf=KriS*_;^qfV?x~kN9;J}aa55t+K_ftB>cb)#g@h+OMgupQ~ z;|KB0j&ra7knB%Tqn3rUKQp297xG`^*&}`{;&fsZ592$pAL_Gg>0z56Nv?r)lw75w zn;+Q+j_g?J2Kk>IP5ql4AYmBk(k~Q`W;(8>$%Gj${oWoV1|=ylx}Ta~VN7?-(?*&J zY%?5pj<3WUTbkH95G)O#gHRL7Z$@h@MN4xOc}-;NUVW|W=?%bjNr{6Ifd;$M216-~_@L<6-VaT)YJOQa&A)^=zo$~67svq@5a&zWck}m1!y*1Co$Xhc z`%CLf$E{-MIx5?CGE>&(sBMp&f$)#6G;zn6$=zu=f*|naKaaxAGL74&ep?YW2d@%(6u{V0zWX)!wzE%UP@RW z?cW?vX1DpQ#yG);_<=Ew{xNhC!q4I=|1tC$Nbs}rJ2jtKfR!5Pw+E?xLg3%IGlL7t z7m$9{O~_ zW_q@Lp7;X||L-mCn1kk@y`mVtM9eT@^}R;_*DG=0p=#`gL4<+3tGW+Bgn{Twt7<)Y ze?u3oQpMql`{yttH91u5;84_VlPGm=lF*D&rIr_Fk}7f)tI!$@0d)`HBAy p?dPG@s=RjNMFA#7`;U#GJcxm#khk|<=;2M3-pd1^w96Cy?mwa3dAtAs literal 0 HcmV?d00001 diff --git a/noyau/font/italic.fnt b/noyau/font/italic.fnt new file mode 100644 index 0000000000000000000000000000000000000000..2ebc0962b433fb96fa6b1461581ad8dcbe49380e GIT binary patch literal 8192 zcmb7J&ube;6dp%mZOT?o4}~=nQV%BdxQfC?skf_;=GbF;>1l1jCQ#Kj1QJ1)-MR%6 z=s%GB0fmrLPre0A1WTbJM-fmOLJ#&W7y^!=M%!;zs~;=Px29vW+L>>@H*em|d-HZz zh>J?F_xs-7i>G@5=@`U=IPMQ|2;*?hiU#yg!JlL@9xc}MWD z6}DQfd&ftI>JEl6u#fElm4D0K^+SKxy``p$rNVMGtS%Rp2oC!jh7nK;i#yNnydU*HTCMh(8cADArKV+B!**NQOVg?~({&2_kxy5^Y-zgbMM}O9#ZsxfvEA!E zRO47XqIue1(+&8SOIJwO3YsQ6spX@!ZpU_yqC(e=7(?(55|JwK9?G4c?al{SDnR+e zpR?VkwQ8-t^V5SU@~2IiJFQsJF$IITkEqs`U>!FaW?0h-@Is}aQTc`CRm%%?y)va_ z?hyUlActQxfVa5*%|t)gHzRdgsn%*OCxxR@9gZnIb`d9xmaqo!YE??*IZkxJ9W=v8m_LH zh;J|H`RA0@>h-$UJ|p@!*Np4-^(~L>uMzILCxoAjzY}?15gY*wCn%pEcE5}vCR_jI zf{YKn9>Z_0l`Pw8dq-q^1XpZMKEKTe;h@{y-`^+v+Rd-SoqJsWVyTAwAZj-VKUqI4 z5woA%|E(Y1`g&0yg0{`hUKedYQ>jl*_@14!{^8~~h_5gA+5W5~>+8B~e|%v!8s%b9yQDU+sNnFCTTso1ch(4T zp;@INV#h+ig$7%5==mxdNWCri|C2Rrw7)%>PWGly5JkB}ECN7&-Lkp=C*&OY80{z?92^{Ehn=l$ zBYt|`Y)kgu$@3p{m3*H^fYg5UgcjQy^&GZbzebs^|7Bgr1B7XnvpUb#FuC0Qk?a2u z)a?!qhRpwgx2$rb9nFrIy_fMP$jJag5BaIeyQG+9Y@S`j4>rHVx#ba%9dlA^fR7x< zd^c&y-fV1V>x;FOvV{|Tv3=A6=Zm5t&JSXM;ntSxV+Gg&e-0=Qm;9uV0|w)dO5EL3 z={WSZ?sx9H^nmR5@80$OyZwG&#TLSkG|k2d%{E{Zy?WI@IwJFLH1cscr`K+GI&JFU ziG8JciG8E@Lp&Yl;DD0lA$&jK;^M34KjL!v$@<9!BI{#&FAq^@0vCLb<69OIAQSZh zYJb}Z2C@X4-}V~~zs>B|8wW5s2SEE8Cqst3<$eQAXfh05U5 z?S7C#KB(~%m_E;cuz#;QSE>EPD~SGA%73Mn--LHL4lc)P9IYMQhY{5e(3dnj)sL(% z_}D_2!8w&5T)T$&rcPiasba|(5O=#of*%bJc>*8=LVyeage~xjP17~{03rljynn>@ zmqEm4*Nn|Fb*Uzxh7jJ|f~&@jCc{A}DqiJuu1$Ezh-PLnGx^Zc|v%*8K~f2vXWW4YsB<@m!3_@^36 z9z-ga;)&g$zjEAZBeh>@_v*B3_AbRqY@GCs(|*RJCA}HTXL#C;${&x<_(^-!s4_gY z-wn1tN&5}6Ij?u7-Zb<19|hGvkrRuL7mQEkr+g|uk^7O$PwWzN{ZhTC{PFnAzNww! z-1%7+weNWSQaS3Mob^o!@)dJZ<^`n9RKJmZ@Pali^Zc~=BLAZMPkt4eE%Wlz`lQP| zell0)artFrw#?(H;Q8ik{Y`Q_@h3n(LITM0ONbh!fIL4Kr(i@xngZe}kchy`t47`f z+9(4g`5*L?<0AvjPI{(>X9pA-W07AZxH|uX9HfBA07?Eg8vpd|+tZm5v$seAbMq(U zFO|If1t}mhK$8DqsG!$7Z}%vUiI4uXT1{$r_b=ZbvlxLF(8=c!Hh;Vw!`BsE5FFoc z#?FV|$)M@Y7<&Es_3k`2u7efu_uJ_8@QwUemqweu8J!_4DmDYk+Xcm^_)_7LcDZ-I zab?<+x%=&}Kc78&^5pU3OzWg_>z_wX+1`$REi5TM!LF~b8~FSj1o%Qfq5O}V{{ZK+ BWG?^! literal 0 HcmV?d00001 diff --git a/noyau/font/italics.fnt b/noyau/font/italics.fnt new file mode 100644 index 0000000000000000000000000000000000000000..ddb95d82758246cef1e88c622c94e777fdf43922 GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/noyau/font/lcd.fnt b/noyau/font/lcd.fnt new file mode 100644 index 0000000000000000000000000000000000000000..aefe346c8451d297965419ccd9558d39638ce118 GIT binary patch literal 8192 zcma)B&ube;6duW9vo5NvhO}&n&@V)2b6OHm1YK5ANFY82(n}9PwL$ek1fOCZmQ~zB z3G`NaNdACA$f^H8z(gPlH9iW1(-3;FZov?63=P`8H@mB>2?u;keEdSP#YJ`>rLCXw@=;x ze6Ts#+}!+Oa=fP&u&g6z;v7N#R%hEAc-x(pT3w`8E|dnP3o9vrQ~WK<@?nI?Gi zPRFAkzsf5ZZ2Ly@?C|m@*+Sh|TT=)G#au48MlDxVPS2a|e!qXRcXC$9eqPFD&NIyX z0}C|7X$a?4We*|LG~*LlV_;-~Hg{Y0z((v+t<&iYH2Sq}(5+$IEEHUKfC*^xxdpua zFmZ^OvI!IH-zqgNMYTF05jxaTrhDhko%-tPstXK=?|=Pm>x-|~e^%=Yx7BL7t#;d0 zLj$RF z#>|&nkLIKk7jC=V7Ic94v1exZkx)vUx~Wu3&OxFtc`9+1Np>dA$#k1#P=1lz8hwdt z{Fmd?@w4s{eL04N&vU07c^G|?l$dF%vLExv*(v8uMe2&pQ0Ah4&{$PYF~DhTsUk0N zh~K@N!}~|b*id}hK>vOezxx2^`4PNF0nYlo{&f1<^~KzDv;aS2Irb6Y1j+eF<6E}= z<#Hq3{(&GJ&ib;QsP)Ny*n;7%N@CjG*y?X} zHo8+4D#Unv@1Ez~8;{3o+#4B&V;IKBQ{$u2!NK_W7>vKs(BncJcYD2lzt`&?tNCSo zIlLggqqkG~b*#Y&lG6k9J*i6{V0@u2=9lxw69neR>Au{f_7Xk7@V^UxA)^O0(mfx> z-?987Za&uUd5wnGL-E^>+te^rGZ5QXqe4jQ{1K?MllaPtO5*Gf+jg&0^Hr!2Lu&7s z|D75?q0sC053S!T?iCn6aX{4nGXH^^ze&5xb?IZG#;LcT^(crBm3Z24BLCC{2rJPN zq7i`nK)8SH8a=}5EBU#zSmzuN42M9%8%_82(E27FN&%bzfHsv-T_bCt^-Ef`#mC2J zeF>QYG&rRIP5@~C6MvNApnoz2jKThv{>cmg^}`eZ_CIMwDL|$F*{%7%MVW7(&;Kpr zfA7ryE#gsbn0*2KEEZ7WXBNckVLOe!(M^7;#h3A)8jwHcjlUQDm)FxJ`lklCw+RvP zLR`j;{8!rj*a_no#l7@Vbp9;DL2jJM29eykhh#B7!XpOAAKORzvcF`N5FW+v2AUt) zf5UFhMxr`t+Is!>0{SoM0`Y!{eaIi_Lw?Eo9`nn%1lYgGFUTL;NAZoq6==s-ufzDp z^B3``zclk3DKwYZhyI1}v6ijhW%~=RKYlBeZ0Z4unaCo3vd|WBelwD6i+Du5*gb#! zN*3TAECIa{6@Z%iZ&(82`XDaB07X;+;&*tXUZc_I;rnA)0fPFEhRXJ-0-Yap;);Gd zP=h&^>I;dh>p$Y55|AoDQ2&MYPhY=2O<0^ir4mqEKT-Ws)YUIk0#XGC>OV5&@9%%; z?L(Xf9{$gJHM^p>U;K6q(6J;o;-Q{IMJ6lZT++3 c7Mus8pH@`QUuw0QMX#TIpWe_Xl>YbWe`m<@>Hq)$ literal 0 HcmV?d00001 diff --git a/noyau/font/mechanix.fnt b/noyau/font/mechanix.fnt new file mode 100644 index 0000000000000000000000000000000000000000..3207764c9c7b69fee4d66b6caced5d215caeedda GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/noyau/font/norway.fnt b/noyau/font/norway.fnt new file mode 100644 index 0000000000000000000000000000000000000000..103b729308b242360d4f2953e8da6e6f40df50da GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/noyau/thin8x8.fnt b/noyau/font/old8x8.fnt old mode 100755 new mode 100644 similarity index 100% rename from noyau/thin8x8.fnt rename to noyau/font/old8x8.fnt diff --git a/noyau/font/oldeng.fnt b/noyau/font/oldeng.fnt new file mode 100644 index 0000000000000000000000000000000000000000..14e12a63958e79083d481512f1bd21a8c2208c05 GIT binary patch literal 8192 zcma)BUuYZ286Qh#BicQAlcr%)@5!cT)Rr@0Ex8*}FDv&N4qE!qlpN&Ra#gK#<2$Lg zat?~X%j$f636z%WL(`;>g&xN}`R-`@(i|cJwNT?iAA~{aakL;&5-u(Q$8fH;->z1F zR+-KzB+OskR@N(}H>OfkY> zS=T$Ajx6hdFYC7B*cc}osgMENaivqI@w>wBq?<3iU;^_ltA6M1-8*%}pE~i(S=}^| z0_I^dO@MElWz$(zRZIIH1H78A=JWZhopz1iL6%#3M{hy>%ej(OwMw~VKAlZOPs~(j zPDCdFPX3o=*@hlw7v8<_Nw?W}^UD%PgQ}j-9_~$lMpQImYKqgrNyOvvDUx`CyF4G4 zDwWE9ZU0aaKR*+nd|Ja`d|-q2aGJu?RIh~)l92f^QK$+cV7tw-T2+yDkCw~jsv-P2 z(=q2T9#a&5fvF}_B6_~%jEwYTp?K$NFtMX1vR-U zYG8EKEJ>%jZ^7C5JSiiWu!=5*27EZls36K}u7*@RoBYPrs~gu+KL8zK%DgCw&m_ zWQ>k5;Oi^-=M?%w`U(Hi*@+1aTmYoiJsR+M3~;o*lQC(QcAqGK@i9iLAF=^FuB!y_ zjeK4ZMMiHR#@B!Tt6$%)+k7}vxqs_zB%o9WcXLq5Me zU!12m)PL}Haq;@;)03#f?QRwx(Cf8-0srij zSK4OVywU-1Z90hcyQ}lHO^4$PbY`ls1 zgLZEEDGF~>P2a1A)RaGr7rPJxx_}8!7IgzIMgY!2_q3;aQ(`WD~5@~WG z;IsJjS)HOgyr0Pal4+hhoxI2Qpg;bNG{_(5;*iMz)ZfD;NsjS%;HtW~nbNh5bkJ>s z+M=6YhUjN(qV2R=t#1w(c)gdETnogSLx+Z)! z*gCAOEu~eI9=g50b|rHLe*ZZw8^_F_eX(tt=F-q!u=GaFTrZm@if`Bx<= zjTf&uzZh>CsmBy8pNHQM5}Mg)bQ>fil#yb0WhG~k|IMS3#*yL?L1DPd_hf&BG*Tq{ zJ#p$=Bh7rDn4^pacq5LlAVz;86nFXzcDb+ifuaOeP#> ztZf#Hl}fQ_wgYAd70*Gvd0hHu4NL|KJucSot)II7e#{Ot>lhc`SM`d^oA3T~~Ijeg*1G>TRxV-=DAcKXs4guul8O5Z*oWz4hg z{sZ^p5RY>2=)-MQHQWmfB+zw|$F7pcywNeXPp%I;KeT_7MiTmu?UL$GUHu>d&(i5K z4El!>9L6f5MNTYp#}^TFe|%tliA7t8W&q*?;dUxTL9D{n?=~hhHwHNMI_P0Fy0seG z-^8I1;06G|rWDK+L;>wzV$l(Aw$c7#UI+-mDFnCy0G)r*?}s=zJ}(3`!TI*a=S2X> z?}Y$x{)y#>03QG3h2U$v&r9zHU*q^cZUkTBc>iwee**k46hD+9uJz==|3p8-bVKpu z^dAUNe_wC^b9{bYy?YG*Kmd0eW4>O9dw!$wbL|crq5pip&kVZ;OFj-_jR@F&OyUB>bKF&W3*CnKXWj{Azon}hZHUIK2x6wqo=0vK}t_EJEcAM{f&pu$f9 z@iV+ek)A;m@%`A#073poQ+4fA1{$37NR7TbkiZyA`Gtq`^FPuzpaczk-gA6)2jVAL=4p}oDm(m2+y6U$~#Q~NMu<@@fNFPUO7!$(G2!?b(- zo*MX&JrRuvlRK;M2a=!t^)K(dbNlv9@cZ@hKW`X{zSj6@bb|8;mL9Fi^!VAf=?VSN IV2qZojZQq-DGul<3EX{uNzIpG>o0+#` z#^xpNe&6jr?ssES#Q7-C(@Cx|a}p5GTGRsrN&UAzac6H_r2ThM^lMg0wlx zBnA5@s?!bc+zDwo_NM*EkNc_CFE3oYJVb&PTY~qOd{urzBgjY$6jj$72vt_sM``S9X$aKLLP(rXSzly%{@YUhV=(A70i&j)eXY?i#-ri_QL0lhq zt(_h3DQw$U)=8t9s<0t`Tj&|W6XzUyi6us{o4fJI%oqa9;af5SNf9eoOc!k=gWZ* zh_D5|rfF*Uxw7YvNgt!GpvUI~TsBA#4aRQbH<;!tCsW8DV-T4R4#=2KIRmm6r(@8pUhgUK&$BE$hnS{>AEw>?{r&C}J-=x>L^1k29Uh$>4O5*j zg$ILiar~p6$p;+%G>7km^sY+3sUOR*8#vFNJs|z$*Q1wb&oaXw4^U?Qy6N9PA9g{A z-y8n*WB=Pny&>T^MP=9c$F-S)h4H*zEXy9L2Y;uehxrd8UOCY7&->;5aw^j?9O`@m z-rBl#%jEm8-~a9T*Sn^Eq)+ZP#Py9{kL&{-$g_HxAK(fPdz4QXiklR@KlcZ?_*~a3 zw@RY)i%^Wn@O+~T3bFXnye8stmeF}-W8ZJ@Km~m>V@26uVAg+$^ZUoJM>HR3UXb{k z9`P;5wj+pGuOD>pWmz z8j(F{-az<)whuUhaLxH7{Z89|t4Bb5+3|g@)*m`whftx6ma%WLj+OnQ*(>%rOz)

hHe6}4hv2qhk5O_8Bk%JtN5GuTkf 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 literal 0 HcmV?d00001 diff --git a/noyau/font/standard.fnt b/noyau/font/standard.fnt new file mode 100644 index 0000000000000000000000000000000000000000..00e69f4c967f26eab291941eaa0c2ce18928021f GIT binary patch literal 8192 zcma)BPix#p6d&6`2}NDIhk{C$^~Ho9MFJa9#5#n0g!Iyru#1|5D0_1DAhdA{A&@VS ze1Jm8sb3(lctI4p__!GCE~bawO9_U6W2lk(-bnKPd%xL^lU?on=J(#4H#6@&NlLA1 z$>DE@hacV^CSYKapXPagk|SI-yVP3sJAkk5)LSOl@%_nU;y6CwJARVq3C4*=A{@ZZ zxlQ_HKR0=hA3lB@0`<)5zy0vxZ6EPBZ-4oXABISP(wIXNkd>?52fME8wlB^B-reu+ z@9+OK8TaG?j&tfy{8K3ZQP7UNaXWY<)79F>?d|UN?Ts~nlm8vZNuY<-llMg4VhcD-qBZVChPMy*!cq*iN)%X8lDbUGKki>tc*^>*#nvVXF zn!++w_YgwOFh6BmUCRb+?snX+i==B>5CmNVe<#et9gN?p*ITVF7C?uuRmaB<3oZ~k zJU%%<0SD2}HrU1@q9}{>e@T<$#OYBlwyc+F3^b^t)OOq;eJSyk@}kH)I2#NG2O>^q zClG-DY;d@mq8r3U0@ zq`z2WS$@n^1D~;k^xGYoPv@HtH+Fx8qvh4^qg`ep`HDOboX?bixxB(MpX|43^{|07 zU^E(?^??7jc!Ol@AX)x3MSz(8hu1Rhhex!6y(5$WuOcRgVRR+)vvBWO=UK29g8fzE zL2x1Swf<3>hTq9J&rDAb%#VYgZobTK=;%Q42kehAO|8?RNseXy1x0^qaDM5>jIt*; znV*g?v(Yie_1@`KU8Y`Sj1{t}J6 zEy+5i7#|LY*~bXsQS5m!ZE_jsy{Y#ASpO`2$%pR<#XrADFRlyt>P7Fo?bU16x~$(X z(vNM6d_J8rPv{j2DA!z>6hb<74D+ix4+7rZ6a)l~MOU0s06_b%PBV*0JjmZHAx} zJMf>3Ht-Oy^BJ2ThI*{@Q5<2sJ_SF9A)xXfO3`NrA&wtpP|Ohkt>2dGUh@%Y)+N(* zpI$!0{?N0>Hy{)OH~@h2Pa3H9@l5Ba2r-FeqZBpZ`V{1+8ZB*`H;@=Txp2_QnLowG zT$bUqMOYo2$^Fw_oxzcLs?iLM`90g)3u5;0^;F{Qm5%=gocX$e^GW)PmiG^5_yzn8-Nwn)3U)<(KyPkWX8PW&q*?v6B1uDZqpJnD9oEV?f^T0}aOfPaFyX z8~^}Y(IYm?w$S|tvFL~o$LM@09RdtEg#caPkD>lD#6et#07HJKEzGAF@>k{eG6YEc zub#~REspvA{ruk|{@3&QzeSuA*K7m$RW(M$uN;Usi*{LlHy8Qk@63p=l7DGI`IX%2 zThyPe;9pvxc2KI63vul?vR~9Y?S%d-{k}aNI)7E-AU58N&C791HB2QR;iUv9ztWHR zx_{f*MtJGJhiH9t|3i28W+u|bu50FhR?vPeE?1vd=!f!4K9sNJe#Y{(Uvg|;X&01V z=|}!8-IW{X*K9)nR_j;Fk-rSNq(dcqs=*%xF0gd$&)h`WG{X!)mRe+%W zBR$Dra2*XGP7^Qw&6qTMS-!qNF`|6@3?EVR(=i%@@Y>zGRdAv2S-pH+K_@3C;Qm)X zdQb49P##=3QD@C-elRImU1MQ^N literal 0 HcmV?d00001 diff --git a/noyau/font/stretch.fnt b/noyau/font/stretch.fnt new file mode 100644 index 0000000000000000000000000000000000000000..e619be7269693aa172dde764009d412256c5e569 GIT binary patch literal 4096 zcmZWs&1xJ+5H2xcq{C+I+&XB{>fi@xvM^rIFl$U+A@^|_MwekNFvJ3{d#uOs1LTqi z$jz`YUhV+gGmuXk>{JuMu^<;BG-Md1IA%g5svLiHZA%mv4eT_^l9bH zX|#R&?%mtg^AGmF{5r2HuK?y=-~`U&Vz!V{p55Iz+^9w=b-MX`Z3l$t@=e~c{*&@- z)vV6SCzgi2WPjRB_me$`F@7P0=7?uTU^a7n({cOh>)|Dsylfu5d5qXfQJ z<*HO6Uj~y?jxRX#mxf%Vb}HH`5_W>&i;)y zH%~0)7I&}ZeCF8ONPL3ctm)}Vxm)EUE1o~VX2ibZ8|P7ogD>J?yw^$7hUfLB#O+rf zBAr5&QGF(;-A4Lo-)^INI+{tT<#}ZP8uc4|sO*sSf6M#`Cb)tl#wm(hiuNA>-xY&B!tgLZA;j%?ezW!Sjd8hW_@5iBS$=2`h9ezs04GbnbvINKihIP- z>{(epn;oS|VR-EA*z>FE#A;)^ghDmE2w15CX<<|o-?fYEDSl~q1UZHbb< z*gyG;G5L!z@pD?Vt8jdH1{fcQ0anT`*OdT;W0vnQy=t17EaZ$60?U&_ef`Hvm#t}5 zRSo9j)M6ViR+P;aZlA*V0=Dr6O!39}BtFJuPv(onCPXO;j}8!aK1cI>_-<;c0sAeV zWZ%ehYzQy3iUrf`*!U20M<*I_ZEA!P5bqb^Inge^gyZ!Q9>kCJ zwX{bf3ILIM@v3=#>hcSDT^HbELxp)=&tc_arHgr=NnW2}8tm!j#{I!|k+|FPMpdDAP!7=L*>cI#tEXVcJ99VHvR#8_fz}>`157_qiADc{Mn8= z{8=#0tbDW=Hz~k&fOqvjrmS!E{9k9k-Qho`TkqLvGB$Ccf6u!s$7kafCY8iF-0$e) zk&A@+smD%__3b#7ABoeS3f6b=J+@Z>bA2oqgZUP6$bZ^7()I9Z$DZ|#pFZdty-z{k zgtg0O8OQJKjULADq#w+eWgM^3!}WPZbB)&P#uq#G?9axtlP~eV{o?%5S5Oe1)eQmM z4Fur9K=3$Wg$>Qk$+E7OuHWN8K_@Y$459FzJB=o58ddl3mqm&5#H-^ z?fg&h17n5X7_Ohv@~k+XPRsV69l#x->g5u`>C6X-p8?luK3F^+A5urP!q11ew%rw7 z(o@jei<=R9WOyl?e&|E-SF#yMzzgr?`CLob}h?aJ`aowBZDCZ{{fi< ByCwht literal 0 HcmV?d00001 diff --git a/noyau/font/thai.fnt b/noyau/font/thai.fnt new file mode 100644 index 0000000000000000000000000000000000000000..b275bd82eea5f95448d383bdf13d384bd3e94b39 GIT binary patch literal 4096 zcmeH}Pis>_5Wt7^5kh#>5^{LNQYAhlM39h_P;3bD2qnZ@2*s16?}eun5$VMeLIa@( z37&H7!Na5U5JaW;0ZQnp^yDcN4}Jvk)Pq=O_D|k!{RBd$ZMMIi+1Z($-A(~k%iEpK zc6l{%s|F-th~Fq1oFHL4Pzwf~KxiSkQh{osHrJEA&PB&Ic%`ypFnX;rs(b_T zr~4;=I+H)0Nx$x(h~?l^P3{yOLmvdVLl6vtfNw|P=xjSh7?g{(VtF9)#n0CpclKxB z-%7q)3Bv)N#|yzC-XKut0qD4fIA?BlJIO`50Jy%vSBk}$oZCyD+e`k(UU^pbH~31i z9Iq8idpW3Cee6$j9v3<3w%0Nw^1Pux9G;v+k>^Q$)Jo@a{>fxhaw3&rUM`(VNbV0= zwvbJwteE{Md|1BEnOTi5FY_dOg4xkCzTJGkU(FH9hs$%hUhw&GV@XU@ecC_rQ@e*< zno*qgCvD>1!IhQGrrgfgk9Fc`D~k(I2vAxR@_+g1hX2n`g<9l0j`Mvr#{4xF=jFG2 zX&+8@O1l5v!OvtJ<+s##kGihwKB_#BjG=S$ea?)T3^0wR!|`}L;lTrACZm4pd4}F# z09nuJRNrrRa;)OT$i2s&=lzj-ir2F2Oj5GSFUJ_4!FuLe&2XMCG746mYnjzQH}A*U zS-t&yo%*Dw#To3S$%f;k^bMN5CGJh<#&AC4u`xZ$;1ZZb$OT7egxQ4Gwy)3?g`Y1N);zo!GR%&kQ4Bf+#x>4L>=WwJd$Qh4hPx+$J zPNzi%LTjx*Y3DUPC7~fOzngz!OcV@zz($~M2%2HK_wvi!zSd|oiul|9Y&H`P=={KO zU3DUUguXQfR%p9AlWUzRHoe5;U{@$Q6G^%~RupfROmuqccC rT=f4%|JN^s>=*O?zUcpEzhCr!vwtu8Km9#k^#4WwSO1^=PyPQdYL{SR literal 0 HcmV?d00001 diff --git a/noyau/font/thin.fnt b/noyau/font/thin.fnt new file mode 100644 index 0000000000000000000000000000000000000000..22061e548ada1c0181fb8df51233160688ae1951 GIT binary patch literal 4096 zcmZWszi-<{6h29YEEKAvc)G$uEEGb~k*xqlfEh|*ytGq>bZ5$fUIfQLh7^cOib_)0 zoosJfT4XR#Y~Nz zQJOxRrm+xlHqWxzX=bqMCSYE(W*XL-UJ+{7Jv}|u+7({AahAn71~*8wuo>Fv4C14) z(~W#TlIG~0O`koR&J2HP`P0wbC^7;?*BUyIi2Y9Aah#nuuLLJy5{BW{>3_%U(0cBk zx^t@^1UsW-v=a=NR;9}Fda}M;DG7%BwbrrCxI?Bo9pRJte13lojIkFw&2AWWo7K=0 z1)iW}f^0k~C}Zft@Nik|PpNt}sn&(XlXeovsL34!fr*Z|9c59Q2s+f7P0zF4V=A84 z%%?9G(p7^^sYZivyIlwc9^dyf`LRCU-`^jtuCAW3Ufn)8{GrzP;+wsniQn1X-Mtwc z{POVIuLx`1Xwiins=75mYw0R^0=-m5Thak58i%)f=e=8p5*`z4oWoDr+fy;{x%K83 zrog3Ad8yWD4aQ^QT>rtNy@SWkQ=eB{!@0>7XpDqUOJx_-V_u!EkGNbi`f~M?)zAG& z1}T$11Law{WO>k!pT0;_qtBo@^p9rZ1La#DFK=AS+oOn5H~Ht73dw_MHEK)TKhQXO zTY&*lG-7Zo)!Up*uzxeZ(BJgv=;+t+b&q)6h6FOmH%$qj`PZ-eBRrfD#{6K2V>2G) z$%M!8kI(SH^~&)$Z~t3f59+DVUr(yvX!Jhylb&MZ zLE;nk{dQaCkNGLo+&6l^O-1MYCSaRiQcU7AT(5ACn0m%^x8NZrUX8~*#ibJAnCk^c z<}ox2KRQyuVBK)T0zHDplgUry!P?ULeeu*PTpye=z7p8A8!)OHTrU(sjk588*VD>n zzFp0FM;`UC#>;qz+4wR)s#a6I8XC7(a9>qvOuPb6k4xb9mlF)d(xM)muMf$PC;Q_i zR+aRGaSfaKL5GY_b_C9kZbDKk_2+Z!bu37!I333&en8Sh;da!xykdEp<3c?U!z5dN zGJ*V_Y+8(DahgzX>Vu+;RsgSW+B;g%Uu}unW7o7N%7zGw0XX=z2E?nKX`UE+YWRRk z_*$teo!dchyK|*l;etnzf~RW~ZLpwP*UAf%z&y>Mv2v@PT&@;!V)a&vf>Si}K58jE}w@^HhDy2Es6_=4-&QAx+~oQ^Gs z+TK`;PyV^b<5%n5C`zCnTZ}nhc%zWzsUVOC&|uCt$CzKSp2!z5w#VlE3Kt{{F+F^N z;QoZR@!{2Ac6>au?>o)z*Updd!gDv4d}ooXGx*4IJBy;x_tBjwddvLE8q^NoX!OYr zdawY+`9$19TI!3qI6lM+`EP8iZGI)faDc+Q_mewYQeWi`hn_OIfuJ`W_S6WaVvwlT zjvXI)6L_OBJf4$Er6M?Z6-GntY|pCob#yWAZ2i415{l>MZbob!k5d2MD}L}%Tr`V6uvhR0ZE=_F9iOCAcswuQi~4s}t7n}#O8fH*{JZM8 zi7ZNsDKCg`csbkrIB!j*L{4yaK@ZCb&GPF8i_YrVkIN5D^y}K{CBLhDR*KG7o&G|9 zeP@w>uWWqMW$OKf_Es;v)syahuBWuJJRZmCTD@scI=O|wmo4`v2jio5=1>@~ zxcV2`+jyMMg?j0a=F8R({{`h{I#l9P>dk^Fb!ow1AZ)fFU2JR*hugB>gTo8sFpPts zMI`)tg1Zrn5FQdU81f_`Y-w-h8+_A&1tho$nI?R zKiaKB=+W%QSD-t1{Mi405GJ0_O>3npRe*2f;8@}}ogf$mfg}4V4v$TE1&Q;Q9WW!f zdhHT{?%)~d*gXuc;Tco6cx4TDR5p8m=o8*uAtc@f8K0y_*dyU9M*E=w=8SC?EXS9q ecCUx7jOPSvZFVzgvvcAEe|=bJ?2#?FEchQI4AK1n literal 0 HcmV?d00001 diff --git a/noyau/format.asm b/noyau/format.asm new file mode 100644 index 0000000..62b8d30 --- /dev/null +++ b/noyau/format.asm @@ -0,0 +1,911 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: + jmp tsr ;Saute à la routine résidente +names db 'FORMAT' ;Nom drivers +id dw 1234h ;Identifiant drivers +Tsr: + cli ;Désactive interruptions logiciellement + cmp ax,cs:ID ;Compare si test de chargement + jne nomore ;Si pas test alors on continu + rol ax,3*4 ;Rotation de 3 chiffre de l'ID pour montrer que le drivers est chargé + jmp itsok ;On termine l'int avec notre code d'ID preuve du bon chargement de VIDEO +nomore: + cmp ah,maxfunc + jbe noerrorint + stc + jmp itsok + noerrorint: + clc + push bx + mov bl,ah ;On calcule d'aprés le n° de fonction + xor bh,bh ;quel sera l'entrée dans la table indexée + shl bx,1 ;des adresses fonctions. + mov bx,cs:[bx+tables] ;On récupère cette adresse depuis la table + mov cs:current,bx ;On la stocke temporairement pour obtenir les registres d'origine + pop bx + clc + call cs:current ;Puis on execute la fonction +itsok: + push bp + mov bp,sp ;On prend sp dans bp pour adresser la pile + jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ? + or byte ptr [bp+6],1b;Si oui on le retranscrit sur le registre FLAG qui sera dépilé lors du IRET + ;xor eax,eax + ;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique + ;shl eax,4 ;de l'erreur. + ;add ax,cs:current + ;jmp endofint ;on termine l'int +noerror: + and byte ptr [bp+6],0FEh;Si pas d'erreur on efface le Bit CARRY du FLAG qui sera dépilé lors du IRET +endofint: + pop bp + sti ;On réactive les interruptions logiciellement + iret ;Puis on retourne au programme appelant. + +current dw 0 ;Mot temporaire qui contient l'adresse de la fonction appelée +tables dw setvideomode ;Table qui contient les adresses de toutes les fonctions de VIDEO (WORD) + + +;Librairie qui prend en charge le format de STR ASCIIZ +;# nombre 8 +;@ str 7 +;& nom 6 + +;High Low +;0 variable 4 hex +;1 byte 3 dec +;2 word 2 oct +;3 3 octets 1 bin +;4 dword 5 adresse +;5 5 octets 6 nom +;6 ... 7 str + ; 8 nombre + + +;Renvoie carry si la syntaxe de ds:si n'est pas respect‚ par rapport a es:di +CheckSyntax0: + push ax bx dx bp si di ds es + push es di + push cs + pop es + mov di,offset temp2 + call copy0 + mov si,di + push cs + pop ds + pop di es + call getdelimiter0 + mov bp,dx + mov dl,' ' + call setdelimiter0 + call compressdelimiter0 + call uppercase0 + call getnbitems0 + ;call xch + ;mov ax,cx + ;call getnbitem0 + ;call xch + ;cmp ax,cx + ;call xch + ;jne notequalatall + mov bx,cx + xor cx,cx +itemer: + call whatisitem0 + mov dx,ax + call xch + call whatisitem0 + call xch + cmp ax,dx + jne prob + cmp al,6 + jb equal + call cmpitems0 + je equal +prob: + cmp dl,4 + ja nosize + cmp al,8 + je equal + cmp al,4 + jne notequalatall + cmp dh,ah + ja notequalatall + jmp equal +nosize: + cmp al,7 + jne noname + cmp ah,0 + jne notequalatall + jmp equal +noname: + cmp al,8 + je equal + jmp notequalatall +equal: + inc cx + cmp cx,bx + jne itemer + cld +ackno: + mov dx,bp + call setdelimiter0 + pop es ds di si bp dx bx ax + ret +notequalatall: + stc + jmp ackno +xch: + push ds + push es + pop ds + pop es + xchg si,di + ret + +temp2 db 256 dup (0) + +;Compare les ‚l‚ments cx de deux chaine ds:si et es:di +Cmpitems0: + push cx dx si di + push cx di + call getpointeritem0 + mov si,di + xor cx,cx + inc cx + call getpointeritem0 + mov dx,di + sub dx,si + dec cx + pop di cx + push ds si + push es + pop ds + mov si,di + call getpointeritem0 + pop si ds + mov cx,dx + rep cmpsb + pop di si dx cx + ret + + + +;Renvoie l'‚l‚ment cx de ds:si dans edx si nb et dans es:di si str ou name +gettypeditem0: + push bx cx si + call getpointeritem0 + mov si,di + xor cx,cx + inc cl + call getpointeritem0 + mov bx,di + dec bx + mov cl,0 + xchg cl,ds:[bx] + call gettyped0 + xchg cl,ds:[bx] + pop si cx bx + ret + +;Renvoie ds:si dans edx si nb et dans es:di si str ou name +gettyped0: + push ax + call whatis0 + cmp al,5 + jb number + cmp al,6 + je pointer + push ds + pop es + call getpointeritem0 + jmp endofGettypeditem0 +number: + mov edx,cs:lastnumber + jmp endofgettypeditem0 +pointer: + call str0toadress +endofgettypeditem0: + pop ax + ret + +;Renvoie dans ax le type de la str0 point‚e par ds:si ‚l‚ment cx +whatisitem0: + push bx cx si di + call getpointeritem0 + mov si,di + xor cx,cx + inc cl + call getpointeritem0 + mov bx,di + dec bx + mov cl,0 + xchg cl,ds:[bx] + call whatis0 + xchg cl,ds:[bx] + pop di si cx bx + ret + +;Renvoie dans ax le type de la str0 point‚e par ds:si +;High Low +;0 variable 4 hex +;1 byte 3 dec +;2 word 2 oct +;3 3 octets 1 bin +;4 dword 5 adresse +;5 5 octets 6 name +;6 ... 7 str +whatis0: + push bx cx edx + mov cl,2 + call str0isbase + jnc finbase + mov cl,8 + call str0isbase + jnc finbase + mov cl,10 + call str0isbase + jnc finbase + mov cl,16 + call str0isbase + jc testadress +finbase: + mov bx,cx + xor ch,ch + mov al,cs:[bx+offset basenn-2] + call str0toint + mov cs:Lastnumber,edx + cmp edx,0000FFFFh + ja bits32 + cmp dx,00FFh + ja bits16 + mov ah,1 + jmp endofwhat +bits16: + mov ah,2 + jmp endofwhat +bits32: + mov ah,3 + jmp endofwhat +testadress: + call str0isadress + jc testname + mov ax,0005h + jmp endofwhat +testname: + ;call str0isname + ;jc testvarstr + ;jnc isok + ;mov al,06h + cmp byte ptr [si],'&' + jne testvarstr + mov al,06h + call getlength0 + dec cl + mov ah,cl + jmp endofwhat +testvarstr: + cmp byte ptr [si],'@' + jne testnumber + mov al,07h + call getlength0 + dec cl + mov ah,cl + jmp endofwhat +testnumber: + cmp byte ptr [si],'#' + jne isstr + mov al,8 + call getlength0 + dec cl + mov ah,cl + jmp endofwhat +isstr: + mov al,07h + call getlength0 + mov ah,cl +endofwhat: + pop edx cx bx + ret + +Lastnumber dd 0 + +;Renvoie non carry si la str ds:si point‚e peut ˆtre une adresse +str0isadress: + ;push + stc + ;pop + ret + +;Renvoie en es:di le pointeur str0 ds:si +Str0toAdress: + ;push + stc + ;pop + ret + +;Renvoie non carry si la str ds:si point‚e peut ˆtre un nom de fichier +str0isname: + push ax si di +isname: + mov al,[si] + inc si + cmp al,0 + je itsok + mov di,offset non +verify: + mov ah,[di] + inc di + cmp ah,0FFh + je isname + cmp ah,al + jne verify + stc + jmp itsdead +itsok: + clc +itsdead: + pop di si ax + ret + +non db '/<>|"?*:\',01,0FFh + +;Renvoie non carry si le texte point‚ par si est de la base cl +str0isbase: + push ax cx si di es + push cs + pop es + mov ah,cl +isstrbase: + mov al,[si] + cmp al,0 + je okbase + mov cl,ah + xor ch,ch + mov di,cx + cmp al,es:[di-2+offset basen] + je verifbase + xor ch,ch + inc cl + mov di,offset base + cld + repne scasb + cmp cx,0 + je nobase + inc si + jmp isstrbase +okbase: + clc +endbase: + pop es di si cx ax + ret +verifbase: + cmp byte ptr [si+1],0 + je okbase +nobase: + stc + jmp endbase + +temp dw 0 + +;Converti un str de base cl en int dans edx +str0toint: + push eax bx ecx si edi ebp es + push cs + pop es + mov ah,cl + mov cs:temp,si +gotos: + cmp byte ptr [si+1], 0 + je oklo + inc si + jmp gotos +oklo: + mov edi,1 + xor ebp,ebp + mov bl,cl +baseto: + cmp si,cs:temp + jb endbaseto + mov al,[si] + xor ecx,ecx + mov cl,bl + inc cl + push di + mov di,offset base + cld + repne scasb + pop di + jne noop + sub cl,bl + neg cl + mov eax,edi + mul ecx + add ebp,eax + mov eax,edi + mov cl,bl + mul ecx + mov edi,eax +noop: + dec si + jmp baseto +endbaseto: + mov edx,ebp + pop es ebp edi si ecx bx eax +ret +base db '0123456789ABCDEF' +basen db 'B O D H' +basenn db 1,0,0,0,0,0,2,0,3,0,0,0,0,0,4 + +;Renvoie en es:di la partie de cx caractŠres a partir de la gauche de ds:si +Left0: + push ax cx si di + cld + rep movsb + mov al,0 + stosb + pop di si cx ax + ret + +;Renvoie en es:di la partie de cx caractŠres a partir de la droite de ds:si +Right0: + push ax cx dx si di + mov dx,cx + call getlength0 + add si,cx + sub si,dx + mov cx,dx + cld + rep movsb + mov al,0 + stosb + pop di si dx cx ax + ret + +;Renvoie en es:di la partie de cx caractŠres a partir de la position bx de ds:si +middle0: + push ax cx si di + add si,bx + cld + rep movsb + mov al,0 + stosb + pop di si cx ax + ret + +;Rempli de cx caractŠres dl a partir de la position bx de ds:si +Fill0: + push ax bx cx si di es + push ds + pop es + add si,bx + mov al,dl + mov di,si + cld + rep stosb + pop es di si cx bx ax + ret + +;Remplace tout les caractŠres al de ds:si par des caractŠres dl +ReplaceAllchar0: + push ax cx di es + call GetLength0 + push ds + pop es + mov di,si +findandchange: + repne scasb + cmp cx,0 + je endofchange + mov es:[di-1],dl + jmp findandchange +endofchange: + pop es di cx ax + ret + + +;Recherche un caractŠre dl dans la chaŒne ds:si +SearchChar0: + push ax cx di es + call GetLength0 + push ds + pop es + mov di,si + mov al,dl + repne scasb + pop es di cx ax + ret + +;Inverse la chaine point‚e en ds:si +invert0: + push ax cx si di es + call GetLength0 + push ds + pop es + mov di,si + add di,cx + dec di +revert: + mov al,[si] + xchg al,es:[di] + mov [si],al + inc si + dec di + cmp si,di + je finishinvert + dec di + cmp si,di + je finishinvert + inc di + jmp revert +finishinvert: + pop es di si cx ax + ret + +;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal +cmpstr0: + push cx dx si di + call GetLength0 + mov dx,cx + push ds si + push es + pop ds + mov si,di + call GetLength0 + pop si ds + cmp cx,dx + jne NotEqual + repe cmpsb +NotEqual: + pop di si dx cx + ret + +;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal et renvoie le nb de caractŠre egaux dans dx +evalue0: + push cx si di + push ds si + push es + pop ds + mov si,di + call GetLength0 + pop si ds + mov dx,cx + repe cmpsb + pushf + sub dx,cx + popf + pop di si cx + ret + + +;Insert une chaine ds:si en es:di a partir du caractŠre cx +insert0: + push cx di si + add di,cx + call getlength0 + push si di ds + push es + pop ds + mov si,di + add di,cx + call copy20 + pop ds di si + cld + inc di + rep movsb + pop si di cx + ret + +;Detruit CX caractŠres a partir du caractŠre BX de DS:SI +delete0: + push cx dx si di es + push ds + pop es + mov dx,cx + call getlength0 + sub cx,dx + sub cx,bx + inc cx + add si,bx + mov di,si + add si,dx + cld + rep movsb + pop es di si dx cx + ret + +;Copie une chaine de ds:si en es:di +Copy0: + push ax cx si di + call GetLength0 + cld + rep movsb + mov al,0 + stosb + pop di si cx ax + ret + +;Copie une chaine de ds:si en es:di +Copy20: + push ax cx si di + call GetLength0 + cld + add si,cx + add di,cx + inc cx + std + rep movsb + pop di si cx ax + ret + +;ConcatŠne le chaine ds:si avec es:di +Concat0: + push ax cx dx si di + call GetLength0 + mov dx,cx + xchg si,di + push ds + push es + pop ds + call GetLength0 + pop ds + xchg si,di + add di,cx + mov cx,dx + cld + rep movsb + mov al,0 + stosb + pop di si dx cx ax + ret + +;Met DL comme d‚limiteur par d‚faut +SetDelimiter0: + mov cs:delim,dl + ret + +;Renvoie le d‚limiteur par d‚faut dans dl +GetDelimiter0: + mov dl,cs:delim + ret +delim db 0 + +;D‚truit les d‚limiteur qui sont cons‚cutifs dans ds:si +CompressDelimiter0: + push ax dx si di es + call Getlength0 + push ds + pop es + mov di,si + mov al,cs:delim + xor dx,dx +Compressitems: + repne scasb + inc dx +againcomp: + cmp [di],al + jne nosup + mov si,di + mov bx,0 + push cx + mov cx,1 + call delete0 + pop cx + jmp againcomp +nosup: + cmp cx,0 + jne compressitems + mov cx,dx + pop es di si dx ax + ret + +;Met le nombre d'‚l‚ments … cx +Setnbitems0: + push ax cx dx di es + mov dx,cx + call Getnbitems0 + cmp cx,dx + je noadjust + ja subsome + push ds + pop es + mov di,si + sub cx,dx + neg cx + push cx + call getlength0 + add di,cx + pop cx + mov al,cs:delim + mov ah,'a' + rep stosw + mov al,0 + stosb + jmp noadjust +subsome: + mov cx,dx + call GetPointeritem0 + dec di + mov byte ptr [di],0 +noadjust: + pop es di dx cx + ret + +;Renvoie la taille dx de l'‚l‚ment cx +Getitemsize: + push cx di + call getpointeritem0 + mov dx,di + inc cx + call getpointeritem0 + sub dx,di + neg dx + dec dx + pop di cx + ret + +;Renvoie en es:di l'‚l‚ment cx de ds:si +Getitem0: + push si di cx ax + push di + call getPointeritem0 + call getitemsize + mov si,di + pop di + mov cx,dx + rep movsb + mov al,0 + stosb + pop ax cx di si + ret + +;renvoi un pointeur di sur l'‚l‚ment cx de ds:si +GetPointeritem0: + push ax bx cx dx es + mov bx,cx + call Getlength0 + push ds + pop es + mov di,si + mov al,cs:delim + xor dx,dx +Countnbitems: + cmp bx,dx + je finishpointer + repne scasb + inc dx + cmp cx,0 + jne countnbitems + inc di +finishpointer: + pop es dx cx bx ax + ret + +;Renvoie le nombre d'‚l‚ments cx de ds:si +GetNbitems0: + push ax dx di es + call Getlength0 + push ds + pop es + mov di,si + mov al,cs:delim + xor dx,dx +Countitems: + repne scasb + inc dx + cmp cx,0 + jne countitems + mov cx,dx + pop es di dx ax + ret + +;renvoie la taille en octets CX de la chaine point‚e en ds:si +GetLength0: + push ax di es + push ds + pop es + mov di,si + mov al,0 + mov cx,0FFFFh + cld + repne scasb + neg cx + dec cx + dec cx + pop es di ax + ret + +;Met la taille en octets de la chaine point‚e ds:si a CX +SetLength0: + push bx + mov bx,cx + mov byte ptr [si+bx],0 + pop bx + ret + +;met en majuscule la chaine ds:si +UpperCase0: + push si ax +UpperCase: + mov al,ds:[si] + inc si + cmp al,0 + je EndUpperCase + cmp al,'a' + jb UpperCase + cmp al,'z' + ja UpperCase + sub byte ptr [si-1],'a'-'A' + jmp UpperCase +EndUpperCase: + clc + pop ax si + ret + +;met en majuscule la premiŠre lettre chaine ds:si +OneCase0: + push ax +OneUpperCase: + mov al,ds:[si] + cmp al,'a' + jb OneEndUpperCase + cmp al,'z' + ja OneEndUpperCase + sub byte ptr [si],'a'-'A' +OneEndUpperCase: + clc + pop ax + ret + +;met en minuscule la chaine ds:si +LowerCase0: + push si ax +LowerCase: + mov al,ds:[si] + inc si + cmp al,0 + je EndLowerCase + cmp al,'A' + jb LowerCase + cmp al,'Z' + ja LowerCase + add byte ptr [si-1],'a'-'A' + jmp LowerCase +EndLowerCase: + clc + pop ax si + ret + +;Inverse la casse la chaine ds:si +InvertCase0: + push si ax +InvertCase: + mov al,ds:[si] + inc si + cmp al,0 + je EndInvertCase + cmp al,'A' + jb InvertCase + cmp al,'Z' + jbe GoInvertCase + cmp al,'a' + jb InvertCase + cmp al,'z' + ja InvertCase + sub byte ptr [si-1],'a'-'A' + jmp InvertCase +GoInvertCase: + add byte ptr [si-1],'a'-'A' + jmp InvertCase +EndInvertCase: + clc + pop ax si + ret + +end start diff --git a/noyau/hours.asm b/noyau/heure.asm old mode 100755 new mode 100644 similarity index 94% rename from noyau/hours.asm rename to noyau/heure.asm index b3daa5e..f4c547e --- a/noyau/hours.asm +++ b/noyau/heure.asm @@ -1,81 +1,81 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: - -jmp tsr -offsets dd 0 -db 'HOURS' -tsr: - pushf - db 2eh,0ffh,1eh - dw offsets - cli - pusha - push ds es - push cs - push cs - pop ds - pop es - mov ah,22h - mov di,offset infos - int 47h - mov bl,[infos+1] - xor bh,bh - sub bl,8 - mov di,bx - shl di,1 - mov dx,71h - xor eax,eax - mov cx,0B800h - mov es,cx - mov cl,4 - mov bp,8 -show: - dec dx - mov al,cl - out dx,al - inc dx - in al,dx - call showbcd - cmp cl,0 - je finic - mov byte ptr es:[di],':' - add di,2 - sub cl,2 - jmp show -finic: - pop es ds - popa - sti - iret - - -;==============================Affiche le nombre nb hexa en EDX============== -Showbcd: - push ax bx cx edx - mov edx,eax - mov cx,bp - sub cx,32 - neg cx - shl edx,cl - mov ax,bp - shr ax,2 -bcdaize: - rol edx,4 - mov bx,dx - and bx,0fh - add bl,'0' - mov es:[di],bl - add di,2 - dec al - jnz bcdaize - pop edx cx bx ax - ret -infos db 40 dup (0) - -end start +.model tiny +.486 +smart +.code + +org 0100h + +start: + +jmp tsr +offsets dd 0 +db 'HOURS' +tsr: + pushf + db 2eh,0ffh,1eh + dw offsets + cli + pusha + push ds es + push cs + push cs + pop ds + pop es + mov ah,22h + mov di,offset infos + int 47h + mov bl,[infos+1] + xor bh,bh + sub bl,8 + mov di,bx + shl di,1 + mov dx,71h + xor eax,eax + mov cx,0B800h + mov es,cx + mov cl,4 + mov bp,8 +show: + dec dx + mov al,cl + out dx,al + inc dx + in al,dx + call showbcd + cmp cl,0 + je finic + mov byte ptr es:[di],':' + add di,2 + sub cl,2 + jmp show +finic: + pop es ds + popa + sti + iret + + +;==============================Affiche le nombre nb hexa en EDX============== +Showbcd: + push ax bx cx edx + mov edx,eax + mov cx,bp + sub cx,32 + neg cx + shl edx,cl + mov ax,bp + shr ax,2 +bcdaize: + rol edx,4 + mov bx,dx + and bx,0fh + add bl,'0' + mov es:[di],bl + add di,2 + dec al + jnz bcdaize + pop edx cx bx ax + ret +infos db 40 dup (0) + +end start diff --git a/noyau/timer.asm b/noyau/horloge.asm old mode 100755 new mode 100644 similarity index 93% rename from noyau/timer.asm rename to noyau/horloge.asm index d631dd7..8ff0505 --- a/noyau/timer.asm +++ b/noyau/horloge.asm @@ -1,32 +1,32 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: - -jmp tsr -offsets dd 0 -db 'TIMER' -tsr: - pushf - db 2eh,0ffh,1eh - dw offsets - cli - push ax bx es - mov bx,cs:compteur - inc bx - and bx,11b - mov cs:compteur,bx - mov bx,cs:[offset fig+bx] - mov ax,0B800h - mov es,ax - mov es:[0],bl - pop es bx ax - sti - iret -compteur dw 0 -fig db 'Ä\³/' -end start +.model tiny +.486 +smart +.code + +org 0100h + +start: + +jmp tsr +offsets dd 0 +db 'TIMER' +tsr: + pushf + db 2eh,0ffh,1eh + dw offsets + cli + push ax bx es + mov bx,cs:compteur + inc bx + and bx,11b + mov cs:compteur,bx + mov bx,cs:[offset fig+bx] + mov ax,0B800h + mov es,ax + mov es:[0],bl + pop es bx ax + sti + iret +compteur dw 0 +fig db 'Ä\³/' +end start diff --git a/noyau/joystick.asm b/noyau/manette.asm old mode 100755 new mode 100644 similarity index 94% rename from noyau/joystick.asm rename to noyau/manette.asm index 9d96bd2..fe5c6ef --- a/noyau/joystick.asm +++ b/noyau/manette.asm @@ -1,298 +1,298 @@ -.model tiny -.486 -smart -.code -org 0100h -start: -jmp tsr -drv db 'JOYSTICK',0 -Tsr: -cli -cmp ax,1234h -jne nomore -mov ax,4321h -jmp itsok -nomore: -push bx -cmp byte ptr cs:isact,1 -je nottest -mov cs:isact,1 -jmp react -mov bl,ah -xor bh,bh -shl bx,1 -mov bx,cs:[bx].tables -mov cs:current,bx -pop bx -call cs:current -itsok: -jnc noerror -push bp -mov bp,sp -or byte ptr [bp+6],1b -pop bp -mov ax,cs -shl eax,16 -mov ax,cs:current -jmp endofint -noerror: -push bp -mov bp,sp -and byte ptr [bp+6],0FEh -pop bp -endofint: -mov cs:isact,0 -sti -iret -nottest: -pop bx -jmp endofint -current dw 0 -tables dw 0;detectjoystick - ;dw getjoystick - ;dw getjoystickscreen - ;dw configjoystick -isact db 0 - -;envoie en bx,cx les coordonn‚es et en dl les boutons -getjoystick: -push ax cx -mov bx,cs:rx -mov cx,cs:ry -mov al,cs:button -not al -mov cl,4 -shr al,cl -mov dl,al -pop cx ax -ret - -;envoie en di les coordonn‚es ecran et en dl les boutons -getjoystickscreen: -push ax cx -mov di,cs:xy -mov al,cs:button -not al -mov cl,4 -shr al,cl -mov dl,al -pop cx ax -ret -db 'button' -Button db 0 -db 'rx' -rx dw 0 -db 'ry' -ry dw 0 -db 'vx' -VX db 0 -db 'vy' -VY db 0 -db 'x' -X dw 7FFFh -db 'y' -Y dw 7FFFh -speed db 6 -spherex db 0 -spherey db 0 -db 'count' -count db 0 -db 'error' -error db 0 -xy dw 0 -old db 0 - -calibrate db 0 -db 'ticks' -ticks dw 0 -db 'state' -state db 0 -db 'connard' -connard db 1 -connard2 db 1 -;Gestionnaire de joystick -react: - push ax bx cx dx si di bp ds es - push cs - pop ds - mov dx,201h - cmp error, 1 - je gest1 - cmp count,1 - je gest1 - cmp count,2 - je gest2 -gest1: - mov error,0 - mov count,2 - call getticks - mov ticks,ax - out dx,al - in al,dx - and al,00000011b - mov state,al - jmp endgest -gest2: -not connard - call getticks - sub ax,ticks - cmp ax,1FF0h - jb nofinish - mov error,1 - jmp endgest -nofinish: - mov bx,ax - in al,dx - and al,00000011b - cmp state,al - je endgest - xchg state,al - xor al,state - mov cl,4 - or bx,bx - js noadj - shr bx,cl -noadj: - test al,1 - je isy - mov VX,bl - jmp wasx -isy: - test al,2 - je endgest - mov VY,bl -wasx: -mov connard2,0fh - mov count,1 -endgest: - in al,dx - not al - mov cl,4 - shr al,cl - mov button,al - push cs - pop es - mov di,offset infos - mov ah,34 - int 47h - mov cl,speed - movsx bx,VY - shl bx,cl - cmp spherey,0 - jne nolimity - xor ah,ah - mov al,[di] - cmp byte ptr [di+7],4 - jbe text4 - shl ax,3 -text4: - dec ax - cmp bx,0 - jg decy - cmp ry,ax - jae noaddy - jmp nolimity -decy: - cmp ry,0 - je noaddy -nolimity: - sub y,bx -noaddy: - movsx bx,VX - shl bx,cl - cmp spherex,0 - jne nolimitx - xor ah,ah - mov al,[di+1] - cmp byte ptr [di+7],4 - jbe text5 - shl ax,3 -text5: - dec ax - cmp bx,0 - jl decx - cmp rx,ax - jae noaddx - jmp nolimitx -decx: - cmp rx,0 - je noaddx -nolimitx: - add x,bx -noaddx: - mov ax,x - mov bx,0FFFFh - xor ch,ch - mov cl,[di+1] - cmp byte ptr [di+7],4 - jbe text1 - shl cx,3 -text1: - mul cx - div bx - mov rx,ax - mov ax,y - xor ch,ch - mov cl,[di] - cmp byte ptr [di+7],4 - jbe text2 - shl cx,3 -text2: - mul cx - div bx - mov ry,ax - xor ch,ch - mov cl,[di+1] - cmp byte ptr [di+7],4 - jbe text3 - shl cx,3 -text3: - mul cx - add ax,rx - cmp byte ptr [di+7],4 - mov di,ax - jbe textpoint - mov ax,0A000h - mov es,ax - jmp graphpoint -textpoint: - mov ax,0B800h - mov es,ax - shl di,1 - inc di -graphpoint: - mov bx,xy - cmp byte ptr es:[bx],070h - jne waschanged - mov al,old - mov byte ptr es:[bx],al -waschanged: - mov xy,di - mov al,es:[di] - mov old,al - mov byte ptr es:[di],070h - mov al, 20h - out 0a0h, al - out 20h, al -errormouse: - pop es ds bp di si dx cx bx ax - mov cs:isact,0 - pop bx - iret - infos db 40 dup (0) - - -getticks: -mov al,0 -out 43h,al -jmp wait1 -wait1: -in al,40h -mov ah,al -jmp wait2 -wait2: -in al,40h -xchg ah,al -ret - -end start +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +drv db 'JOYSTICK',0 +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +cmp byte ptr cs:isact,1 +je nottest +mov cs:isact,1 +jmp react +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +mov cs:isact,0 +sti +iret +nottest: +pop bx +jmp endofint +current dw 0 +tables dw 0;detectjoystick + ;dw getjoystick + ;dw getjoystickscreen + ;dw configjoystick +isact db 0 + +;envoie en bx,cx les coordonn‚es et en dl les boutons +getjoystick: +push ax cx +mov bx,cs:rx +mov cx,cs:ry +mov al,cs:button +not al +mov cl,4 +shr al,cl +mov dl,al +pop cx ax +ret + +;envoie en di les coordonn‚es ecran et en dl les boutons +getjoystickscreen: +push ax cx +mov di,cs:xy +mov al,cs:button +not al +mov cl,4 +shr al,cl +mov dl,al +pop cx ax +ret +db 'button' +Button db 0 +db 'rx' +rx dw 0 +db 'ry' +ry dw 0 +db 'vx' +VX db 0 +db 'vy' +VY db 0 +db 'x' +X dw 7FFFh +db 'y' +Y dw 7FFFh +speed db 6 +spherex db 0 +spherey db 0 +db 'count' +count db 0 +db 'error' +error db 0 +xy dw 0 +old db 0 + +calibrate db 0 +db 'ticks' +ticks dw 0 +db 'state' +state db 0 +db 'connard' +connard db 1 +connard2 db 1 +;Gestionnaire de joystick +react: + push ax bx cx dx si di bp ds es + push cs + pop ds + mov dx,201h + cmp error, 1 + je gest1 + cmp count,1 + je gest1 + cmp count,2 + je gest2 +gest1: + mov error,0 + mov count,2 + call getticks + mov ticks,ax + out dx,al + in al,dx + and al,00000011b + mov state,al + jmp endgest +gest2: +not connard + call getticks + sub ax,ticks + cmp ax,1FF0h + jb nofinish + mov error,1 + jmp endgest +nofinish: + mov bx,ax + in al,dx + and al,00000011b + cmp state,al + je endgest + xchg state,al + xor al,state + mov cl,4 + or bx,bx + js noadj + shr bx,cl +noadj: + test al,1 + je isy + mov VX,bl + jmp wasx +isy: + test al,2 + je endgest + mov VY,bl +wasx: +mov connard2,0fh + mov count,1 +endgest: + in al,dx + not al + mov cl,4 + shr al,cl + mov button,al + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov cl,speed + movsx bx,VY + shl bx,cl + cmp spherey,0 + jne nolimity + xor ah,ah + mov al,[di] + cmp byte ptr [di+7],4 + jbe text4 + shl ax,3 +text4: + dec ax + cmp bx,0 + jg decy + cmp ry,ax + jae noaddy + jmp nolimity +decy: + cmp ry,0 + je noaddy +nolimity: + sub y,bx +noaddy: + movsx bx,VX + shl bx,cl + cmp spherex,0 + jne nolimitx + xor ah,ah + mov al,[di+1] + cmp byte ptr [di+7],4 + jbe text5 + shl ax,3 +text5: + dec ax + cmp bx,0 + jl decx + cmp rx,ax + jae noaddx + jmp nolimitx +decx: + cmp rx,0 + je noaddx +nolimitx: + add x,bx +noaddx: + mov ax,x + mov bx,0FFFFh + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text1 + shl cx,3 +text1: + mul cx + div bx + mov rx,ax + mov ax,y + xor ch,ch + mov cl,[di] + cmp byte ptr [di+7],4 + jbe text2 + shl cx,3 +text2: + mul cx + div bx + mov ry,ax + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text3 + shl cx,3 +text3: + mul cx + add ax,rx + cmp byte ptr [di+7],4 + mov di,ax + jbe textpoint + mov ax,0A000h + mov es,ax + jmp graphpoint +textpoint: + mov ax,0B800h + mov es,ax + shl di,1 + inc di +graphpoint: + mov bx,xy + cmp byte ptr es:[bx],070h + jne waschanged + mov al,old + mov byte ptr es:[bx],al +waschanged: + mov xy,di + mov al,es:[di] + mov old,al + mov byte ptr es:[di],070h + mov al, 20h + out 0a0h, al + out 20h, al +errormouse: + pop es ds bp di si dx cx bx ax + mov cs:isact,0 + pop bx + iret + infos db 40 dup (0) + + +getticks: +mov al,0 +out 43h,al +jmp wait1 +wait1: +in al,40h +mov ah,al +jmp wait2 +wait2: +in al,40h +xchg ah,al +ret + +end start diff --git a/noyau/mcb.asm b/noyau/mcb.asm new file mode 100644 index 0000000..22dac0d --- /dev/null +++ b/noyau/mcb.asm @@ -0,0 +1,119 @@ +FirstMB dw 0 + +;Initialise les blocs de mémoire +MBinit: + push ax cx es + mov ax,gs + mov cs:Firstmb,ax + dec ax + mov es,ax + mov cx,0A000h + sub cx,ax + dec cx + mov es:[MB.Reference],Free + mov es:[MB.Sizes],cx + mov es:[MB.Check],'NH' + mov es:[MB.IsNotLast],False + clc + pop es cx ax + ret +notforfree: + stc + pop es cx ax + ret + +;Libère le bloc de mémoire GS +MBFree: + push bx es + mov bx,gs + dec bx + mov es,bx + cmp es:[MB.Check],'NH' + je notforfree + mov es:[MB.IsResident],0 + mov es:[MB.Reference],Free + mov dword ptr es:[MB.Names],'eerF' + mov dword ptr es:[MB.Names+4],0 + pop es bx + ret + +;Creér un bloc de nom ds:si de taille cx (octets) -> n°segement dans GS +MBCreate: + push ax bx cx dx si di es + shr cx,4 + inc cx + mov bx,cs:firstmb + dec bx +searchfree: + mov es,bx + cmp es:[MB.Check],'NH' + jne wasntgood + cmp es:[MB.IsNotLast],True + sete dl + cmp es:[MB.Reference],Free + je weregood + cmp dl,False + je wasntgood +notsogood: + inc bx + add bx,es:[MB.Sizes] + jmp searchfree +weregood: + mov ax,es:[MB.Sizes] + cmp cx,ax + ja notsogood + mov es:[MB.IsNotLast],True + mov es:[MB.Reference],cs + mov es:[MB.IsResident],False + mov es:[MB.Sizes],cx + mov di,MB.Names + push ax cx + mov cx,8 +loops: + mov dh,[si] + inc si + dec cx + jz endofloops + cmp dh,0 + je endofloops + mov es:[di],dh + inc di + jmp loops +endofloops: + inc cx + mov al,0 + rep stosb + pop cx ax + mov word ptr es:[MB.Check],'NH' + sub ax,cx + dec ax + js nofree + inc bx + mov gs,bx + add bx,cx + mov es,bx + mov es:[MB.IsNotLast],dl + mov es:[MB.IsResident],False + mov es:[MB.Reference],Free + mov es:[MB.Sizes],ax + mov dword ptr es:[MB.Names],'eerF' + mov dword ptr es:[MB.Names+4],0 + mov es:[MB.Check],'NH' +nofree: + clc + pop es di si dx cx bx ax + ret +wasntgood: + stc + pop es di si dx cx bx ax + ret + +;Rend le segment GS résident +MBresident: + push bx es + mov bx,gs + dec bx + mov es,bx + mov es:[MB.IsResident],True + pop es bx + ret diff --git a/noyau/old8x8.fnt b/noyau/old8x8.fnt deleted file mode 100755 index 9fd96cd50002a389cf5bb0856fb69fda77e5ac1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 zcmXw4KWO7t82{p$%L|x`I6A0JAP-{>Q3@xnH+T?=5JGnSLiK61Fm|quBZ?#(W+Zt)@zS8Y}n+<)fH1vsd%hHL8;(88#L6*P2?^{&N zPcJS`=f&pw=67kDhL-R9mLBQ5pX{1ukS&i7jt>sLd^bCNX@_MfO3v*K4OCR~to<;(=BuzOIuF0Y+JkRRfAlZ{?ZH zp3P<}sFq*&EoeBPS}t7C(Np5EkVB(UiM!n#PnTqP78seN#X^(LWI{pGm7gVFlP4WT zlujJSjwGoGAv8%Or$I1F=<0VnhLS82&f9H{~4c!(Hq-f)NlNMpb0A8|;sn9aXd*v!XVrdTA~=PzpX(=9wno*+1V%|M1kZqxO_7n z3ZFw1gX zkZ;Lpo{Er47#cVTH$j3u=4__arh%(uKquol#ax{BYF7(z(hy?fXbq^dzY6h zvb~vSi@HuO;kc$px}-3@n}wP|VWXcO!LGC^O6{7Z4%1m0YQi+#q2e=-{g}rZ*i=$! z4-3Nr7^dl6YP#^e8xD~#k27o-k^jN#`*!CC6&Lr1iVF>Y_@yE2T<8(7s#lfW zZ{!`~`SjW?Qa6W1V%spb1#LHFAe*nKW8mh(lO;d?HyC_R4}`EZ%_E*K&l6hJr{<45 z&?mVWhLvC z@Gy@-YR_K0cuKFDO{>!hqy2px89v~({?sr!6n$ap>S7ni)q!nxI^V?b!?zIiZVP*F zZ_g%bcRKw}$MWa%x!>{|n%HhOo7><~k1wjV4DFb?65h8~Cyy3R)MZkC+7PjT`uphr6~CGsGy1mw2AEumR# KC$b@B5AFXQ(OoS7 diff --git a/noyau/lpt.asm b/noyau/port.asm old mode 100755 new mode 100644 similarity index 92% rename from noyau/lpt.asm rename to noyau/port.asm index 3ab87ec..2e185f7 --- a/noyau/lpt.asm +++ b/noyau/port.asm @@ -1,699 +1,699 @@ -.model tiny -.486 -smart -.code -org 0100h -start: -jmp tsr -drv db 'LPT ',0 -Tsr: -cli -cmp ax,1234h -jne nomore -mov ax,4321h -jmp itsok -nomore: -push bx ax -mov ah,4 -mov bh,1 -int 50h -mov bl,al -pop ax -cmp byte ptr cs:isact,1 -je nottest -mov cs:isact,1 -cmp bl,80h -jae react -mov bl,ah -xor bh,bh -shl bx,1 -mov bx,cs:[bx].tables -mov cs:current,bx -pop bx -call cs:current -itsok: -jnc noerror -push bp -mov bp,sp -or byte ptr [bp+6],1b -pop bp -mov ax,cs -shl eax,16 -mov ax,cs:current -jmp endofint -noerror: -push bp -mov bp,sp -and byte ptr [bp+6],0FEh -pop bp -endofint: -mov cs:isact,0 -sti -iret -nottest: -pop bx -jmp endofint -current dw 0 -tables dw getlptin - dw getlptout - dw getlptinout - dw setlptin - dw setlptout - dw setlptinout - dw getlpt - dw getfirstlpt - dw setemettor - dw setreceptor - dw settimeout - dw gettimeout - dw receivelpt - dw sendlpt - dw receivelptblock - dw sendlptblock - dw receivecommand - dw sendcommand - -react: -push ds es -mov cs:isact,1 -pushad -push cs -pop ds -push cs -pop es -cmp byte ptr never,1 -je oknever -mov bl,[drv+3] -sub bl,'0' -xor bh,bh -call getlpt -dec bl -shl bl,1 -mov al,7 -sub al,bl -mov ah,40 -mov di,offset video -int 47h -push ax -mov ah,01h -int 50h -mov ah,21 -mov cl,4 -int 47h -sti -mov al,0111b -call setlptout -call setreceptor -call initlpt -jc errorie -mov cx,0 -mov ah,20 -mov bx,1012h -mov si,offset initok -int 47h -cmp byte ptr always,1 -je yes -mov ah,20 -mov bx,1010h -mov si,offset mdd -int 47h -mov ah,13 -mov si,offset drv -int 47h -mov ah,6 -int 47h -mov ah,20 -mov bx,1011h -mov si,offset msg -int 47h -waitkey: -mov ax,0 -int 16h -cmp al,'n' -je no -cmp al,'N' -je no -cmp al,'Y' -je yes -cmp al,'y' -je yes -cmp al,'e' -je nev -cmp al,'E' -je nev -cmp al,'a' -je alw -cmp al,'A' -je alw -jmp waitkey -yes: -call receivecommand -jc errortimeout -no: -mov al,0111b -call setlptout -cli -mov ah,41 -mov si,offset video -int 47h -pop ax -mov ah,00h -int 50h -mov ah,09h -int 50h -oknever: -popad -pop es ds -mov cs:isact,0 -pop bx -jmp endofint -errorie: -mov si,offset inits -jmp show -errortimeout: -mov si,offset timeouts -show: -mov ah,20 -mov bx,1012h -int 47h -mov ax,0 -int 16h -jmp no -nev: -mov byte ptr never,1 -jmp no -alw: -mov byte ptr always,1 -jmp yes -initok db 'Initialisation is realised !',0 -inits db 'Error on initialisation',0 -timeouts db 'Connection lost or timeout complete !!',0 -mdd db 'Connection demand on ',0 -msg db 'Accept connection ? (Y)es (N)o n(E)ver (A)lways',0 -isact db 0 -always db 0 -never db 0 - -;envois une commande al -sendcommand: -push ax bx cx di -mov bl,al -xor bh,bh -shl bx,1 -add bx,offset cmde -call cs:[bx] -pop di cx bx ax -ret -cmde dw nothing - dw getram - -;recupŠre la ram en ds:si de cx distant caractŠres en es:di local -getram: -push ax bx cx ds -mov bx,offset command -mov cs:[bx+2],ds -mov cs:[bx],si -mov cs:[bx+4],cx -push cs -pop ds -mov si,bx -mov cx,6 -call sendlptblock -jc endofget -call receivelptblock -endofget: -pop ds cx bx ax -ret - -;Re‡ois une commande et l'execute -Receivecommand: -push ax bx cx di ds es -push cs -pop es -push cs -pop ds -mov di,offset command -call receivelptblock -jc endofno -mov bl,al -xor bh,bh -shl bx,1 -add bx,offset cmd -call cs:[bx] -clc -endofno: -pop es ds di cx bx ax -ret - -command db 25 dup (0) -cmd dw nothings - dw sendram - dw receiveram - dw sendreg - dw receivereg - dw sendport - dw receiveport - dw letexecute -nothings: -ret - -letexecute: -push ds es fs gs -pushad -push cs -push offset suite -mov ax,es:[di+2] -mov ds,ax -mov es,ax -mov fs,ax -mov gs,ax -push ax -mov ax,es:[di] -push ax -DB 0CBh -suite: -popad -pop gs fs es ds -ret - -Sendram: -push ax cx si ds -mov si,es:[di] -mov ax,es:[di+2] -mov ds,ax -mov cx,es:[di+4] -call sendlptblock -pop ds si cx ax -ret - -receiveram: -sendreg: -receivereg: - -sendport: -push ax cx dx si -mov dx,es:[di] -in ax,dx -mov cx,2 -mov si,offset tempblock -mov ds:[si],ax -call sendlptblock -pop si dx cx ax -ret - -receiveport: -push ax dx -mov dx,es:[di] -mov ax,es:[di+2] -out dx,ax -pop dx ax -ret - -tempblock db 25 dup (0) - -;---------Segment Adress----------- -Bios equ 040h -;---------Offset Adress------------ -Lptadr equ 008h -Timer equ 06Ch -;---------Constant----------------- -onesec equ 18 -tensec equ 182 -Ack equ 00 -Nack equ 0FFh -maxtry equ 10 - -Initlpt: -push ax ecx -call StartTimer -cmp cs:emettor,0 -je receptinit -mov al,10000b -call SetLptOut -waitinit1: -call EndTimer -cmp cx,cs:timeout -ja errorinit -call getlptIn -cmp al,00000b -jnz waitinit1 -jmp endinit -receptinit: -call EndTimer -cmp cx,cs:timeout -ja errorinit -call getlptIn -cmp al,00000b -jnz receptinit -mov al,10000b -call SetLptOut -endinit: -clc -pop ecx ax -ret -errorinit: -stc -pop ecx ax -ret - - -;-Envoie DL (dh) JNE si problŠme JNC error timeout -Sendlpt: -push ax bx ecx -call StartTimer -mov dh,dl -mov al,dl -and al,0Fh -call SetLptOut -waitSend: -call EndTimer -cmp cx,cs:timeout -ja errorsend -call getlptIn -bt ax,4 -jnc waitsend -and al,0Fh -mov bl,al -call StartTimer ;///// -mov al,dh -shr al,4 -or al,10000b -call SetLptOut -waitSend2: -call EndTimer -cmp cx,cs:timeout -ja errorsend -call getlptIn -bt ax,4 -jc waitsend2 -and al,0Fh -shl al,4 -add bl,al -cmp dl,bl -pop ecx bx ax -clc -ret -errorsend: -pop ecx bx ax -stc -ret - - -;-Re‡ois DL (dh) -Receivelpt: -push ax bx ecx -call StartTimer -waitreceive: -call EndTimer -cmp cx,cs:timeout -ja errorreceive -call getlptIn -bt ax,4 -jnc waitreceive -and al,0Fh -mov dl,al -call SetLptOut -call StartTimer ;///// -waitreceive2: -call EndTimer -cmp cx,cs:timeout -ja errorreceive -call getlptIn -bt ax,4 -jc waitreceive2 -and al,0Fh -mov dh,al -shl dh,4 -add dl,dh -or al,10000b -call SetlptOut -clc -pop ecx bx ax -ret -errorreceive: -stc -pop ecx bx ax -ret - -;-AX -SetTimeout: -mov cs:Timeout,dx -ret - -timeout dw tensec - -getTimeout: -mov dx,cs:Timeout -ret - -SetEmettor: -mov cs:Emettor,1 -ret - -Emettor db 0 - -SetReceptor: -mov cs:Emettor,0 -ret - -;->bx Nøport->Adresse dx -GetLpt: -push ax bx ds -mov ax,bios -mov ds,ax -dec bx -shl bx,1 -mov dx,ds:[Lptadr+bx] -mov cs:lpt,dx -pop ds bx ax -ret -lpt dw 0 - -;->bx Nøport->Adresse dx -GetFirstLpt: -push ax ds -mov ax,bios -mov ds,ax -xor bx,bx -findlpt: -mov dx,ds:[Lptadr+bx] -cmp dx,0 -jne oklpt -add bx,2 -cmp bx,4 -jbe findlpt -oklpt: -mov cs:lpt,dx -pop ds ax -ret - -;-> -StartTimer: -push ax ecx ds -mov ax,Bios -mov ds,ax -mov ecx,ds:[timer] -mov cs:times,ecx -pop ds ecx ax -ret -times dd 0 - -;->Ecx time elapsed -EndTimer: -push ax ds -mov ax,Bios -mov ds,ax -mov ecx,ds:[timer] -sub ecx,cs:times -pop ds ax -ret - -;-> -GetLptOut: -push dx -mov dx,cs:lpt -in al,dx -pop dx -ret - -GetLptIn: -push dx -mov dx,cs:lpt -inc dx -in al,dx -shr al,3 -pop dx -ret - -GetLptInOut: -push dx -mov dx,cs:lpt -add dx,2 -in al,dx -and al,11111b -pop dx -ret - -SetLptOut: -push dx -mov dx,cs:lpt -out dx,al -pop dx -ret - -SetLptIn: -push dx -mov dx,cs:lpt -inc dx -out dx,al -pop dx -ret - -SetLptInOut: -push dx -mov dx,cs:lpt -add dx,2 -out dx,al -pop dx -ret - -;R‚alise un checksum 8 bits sur donn‚es DS:SI, nb CX r‚sultat dans dl -Checksum8: -push cx si -check: -add dl,[si] -inc si -dec cx -jnz check -pop si cx -ret - -;DS:SI pointeur sur donn‚es, CX nombres de donn‚es, AL token -SendLptBlock: -push ax bx cx edx si edi bp -mov dx,cx -shl edx,16 -mov dh,al -call checksum8 -mov edi,edx -xor dh,dh -mov bp,dx -mov ah,maxtry -retry: -mov bl,4 -xor al,al -header: -mov dx,di -call sendlpt -setne al -jc outt -rol edi,8 -dec bl -jnz header -cmp al,0 -jne notgood -mov dl,ACK -jmp allsend -notgood: -mov dl,NACK -allsend: -call sendlpt -setne al -jc outt -cmp al,0 -je okheader -dec ah -jnz retry -jmp outt -okheader: -cmp cx,0 -je endoftrans -mov di,maxtry -retry2: -mov bx,cx -xor ax,ax -body: -mov dl,[si+bx-1] -add ah,dl -call sendlpt -setne al -jc outt -dec bx -jnz body -cmp al,0 -jne notgood2 -mov dl,ACK -jmp allisend -notgood2: -mov dl,NACK -allisend: -call sendlpt -setne al -jc outt -cmp al,0 -je endoftrans -dec di -jnz retry2 -outt: -stc -endoftrans: -mov al,ah -xor ah,ah -cmp bp,ax -pop bp edi si edx cx bx ax -ret - -;Receptionne en es:di les donn‚es au nombres de CX token AL (AH) (ECX) -receiveLptBlock: -push bx dx si bp -mov ah,maxtry -retrye: -mov bl,4 -headere: -call receivelpt -jc outte -mov cl,dl -rol ecx,8 -dec bl -jnz headere -call receivelpt -jc outte -cmp dl,ACK -je okheadere -dec ah -jnz retrye -jmp outte -okheadere: -mov al,ch -xor ch,ch -mov bp,cx -rol ecx,16 -cmp cx,0 -je endoftranse -mov si,maxtry -retrye2: -mov bx,cx -xor ah,ah -bodye: -call receivelpt -jc outte -mov es:[di+bx-1],dl -add ah,dl -dec bx -jnz bodye -call receivelpt -jc outte -cmp dl,ACK -je endoftranse -dec si -jnz retrye2 -outte: -stc -endoftranse: -mov bl,ah -xor bh,bh -cmp bp,bx -pop bp si dx bx -ret -video db 0 -end start +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +drv db 'LPT ',0 +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx ax +mov ah,4 +mov bh,1 +int 50h +mov bl,al +pop ax +cmp byte ptr cs:isact,1 +je nottest +mov cs:isact,1 +cmp bl,80h +jae react +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +mov cs:isact,0 +sti +iret +nottest: +pop bx +jmp endofint +current dw 0 +tables dw getlptin + dw getlptout + dw getlptinout + dw setlptin + dw setlptout + dw setlptinout + dw getlpt + dw getfirstlpt + dw setemettor + dw setreceptor + dw settimeout + dw gettimeout + dw receivelpt + dw sendlpt + dw receivelptblock + dw sendlptblock + dw receivecommand + dw sendcommand + +react: +push ds es +mov cs:isact,1 +pushad +push cs +pop ds +push cs +pop es +cmp byte ptr never,1 +je oknever +mov bl,[drv+3] +sub bl,'0' +xor bh,bh +call getlpt +dec bl +shl bl,1 +mov al,7 +sub al,bl +mov ah,40 +mov di,offset video +int 47h +push ax +mov ah,01h +int 50h +mov ah,21 +mov cl,4 +int 47h +sti +mov al,0111b +call setlptout +call setreceptor +call initlpt +jc errorie +mov cx,0 +mov ah,20 +mov bx,1012h +mov si,offset initok +int 47h +cmp byte ptr always,1 +je yes +mov ah,20 +mov bx,1010h +mov si,offset mdd +int 47h +mov ah,13 +mov si,offset drv +int 47h +mov ah,6 +int 47h +mov ah,20 +mov bx,1011h +mov si,offset msg +int 47h +waitkey: +mov ax,0 +int 16h +cmp al,'n' +je no +cmp al,'N' +je no +cmp al,'Y' +je yes +cmp al,'y' +je yes +cmp al,'e' +je nev +cmp al,'E' +je nev +cmp al,'a' +je alw +cmp al,'A' +je alw +jmp waitkey +yes: +call receivecommand +jc errortimeout +no: +mov al,0111b +call setlptout +cli +mov ah,41 +mov si,offset video +int 47h +pop ax +mov ah,00h +int 50h +mov ah,09h +int 50h +oknever: +popad +pop es ds +mov cs:isact,0 +pop bx +jmp endofint +errorie: +mov si,offset inits +jmp show +errortimeout: +mov si,offset timeouts +show: +mov ah,20 +mov bx,1012h +int 47h +mov ax,0 +int 16h +jmp no +nev: +mov byte ptr never,1 +jmp no +alw: +mov byte ptr always,1 +jmp yes +initok db 'Initialisation is realised !',0 +inits db 'Error on initialisation',0 +timeouts db 'Connection lost or timeout complete !!',0 +mdd db 'Connection demand on ',0 +msg db 'Accept connection ? (Y)es (N)o n(E)ver (A)lways',0 +isact db 0 +always db 0 +never db 0 + +;envois une commande al +sendcommand: +push ax bx cx di +mov bl,al +xor bh,bh +shl bx,1 +add bx,offset cmde +call cs:[bx] +pop di cx bx ax +ret +cmde dw nothing + dw getram + +;recupŠre la ram en ds:si de cx distant caractŠres en es:di local +getram: +push ax bx cx ds +mov bx,offset command +mov cs:[bx+2],ds +mov cs:[bx],si +mov cs:[bx+4],cx +push cs +pop ds +mov si,bx +mov cx,6 +call sendlptblock +jc endofget +call receivelptblock +endofget: +pop ds cx bx ax +ret + +;Re‡ois une commande et l'execute +Receivecommand: +push ax bx cx di ds es +push cs +pop es +push cs +pop ds +mov di,offset command +call receivelptblock +jc endofno +mov bl,al +xor bh,bh +shl bx,1 +add bx,offset cmd +call cs:[bx] +clc +endofno: +pop es ds di cx bx ax +ret + +command db 25 dup (0) +cmd dw nothings + dw sendram + dw receiveram + dw sendreg + dw receivereg + dw sendport + dw receiveport + dw letexecute +nothings: +ret + +letexecute: +push ds es fs gs +pushad +push cs +push offset suite +mov ax,es:[di+2] +mov ds,ax +mov es,ax +mov fs,ax +mov gs,ax +push ax +mov ax,es:[di] +push ax +DB 0CBh +suite: +popad +pop gs fs es ds +ret + +Sendram: +push ax cx si ds +mov si,es:[di] +mov ax,es:[di+2] +mov ds,ax +mov cx,es:[di+4] +call sendlptblock +pop ds si cx ax +ret + +receiveram: +sendreg: +receivereg: + +sendport: +push ax cx dx si +mov dx,es:[di] +in ax,dx +mov cx,2 +mov si,offset tempblock +mov ds:[si],ax +call sendlptblock +pop si dx cx ax +ret + +receiveport: +push ax dx +mov dx,es:[di] +mov ax,es:[di+2] +out dx,ax +pop dx ax +ret + +tempblock db 25 dup (0) + +;---------Segment Adress----------- +Bios equ 040h +;---------Offset Adress------------ +Lptadr equ 008h +Timer equ 06Ch +;---------Constant----------------- +onesec equ 18 +tensec equ 182 +Ack equ 00 +Nack equ 0FFh +maxtry equ 10 + +Initlpt: +push ax ecx +call StartTimer +cmp cs:emettor,0 +je receptinit +mov al,10000b +call SetLptOut +waitinit1: +call EndTimer +cmp cx,cs:timeout +ja errorinit +call getlptIn +cmp al,00000b +jnz waitinit1 +jmp endinit +receptinit: +call EndTimer +cmp cx,cs:timeout +ja errorinit +call getlptIn +cmp al,00000b +jnz receptinit +mov al,10000b +call SetLptOut +endinit: +clc +pop ecx ax +ret +errorinit: +stc +pop ecx ax +ret + + +;-Envoie DL (dh) JNE si problŠme JNC error timeout +Sendlpt: +push ax bx ecx +call StartTimer +mov dh,dl +mov al,dl +and al,0Fh +call SetLptOut +waitSend: +call EndTimer +cmp cx,cs:timeout +ja errorsend +call getlptIn +bt ax,4 +jnc waitsend +and al,0Fh +mov bl,al +call StartTimer ;///// +mov al,dh +shr al,4 +or al,10000b +call SetLptOut +waitSend2: +call EndTimer +cmp cx,cs:timeout +ja errorsend +call getlptIn +bt ax,4 +jc waitsend2 +and al,0Fh +shl al,4 +add bl,al +cmp dl,bl +pop ecx bx ax +clc +ret +errorsend: +pop ecx bx ax +stc +ret + + +;-Re‡ois DL (dh) +Receivelpt: +push ax bx ecx +call StartTimer +waitreceive: +call EndTimer +cmp cx,cs:timeout +ja errorreceive +call getlptIn +bt ax,4 +jnc waitreceive +and al,0Fh +mov dl,al +call SetLptOut +call StartTimer ;///// +waitreceive2: +call EndTimer +cmp cx,cs:timeout +ja errorreceive +call getlptIn +bt ax,4 +jc waitreceive2 +and al,0Fh +mov dh,al +shl dh,4 +add dl,dh +or al,10000b +call SetlptOut +clc +pop ecx bx ax +ret +errorreceive: +stc +pop ecx bx ax +ret + +;-AX +SetTimeout: +mov cs:Timeout,dx +ret + +timeout dw tensec + +getTimeout: +mov dx,cs:Timeout +ret + +SetEmettor: +mov cs:Emettor,1 +ret + +Emettor db 0 + +SetReceptor: +mov cs:Emettor,0 +ret + +;->bx Nøport->Adresse dx +GetLpt: +push ax bx ds +mov ax,bios +mov ds,ax +dec bx +shl bx,1 +mov dx,ds:[Lptadr+bx] +mov cs:lpt,dx +pop ds bx ax +ret +lpt dw 0 + +;->bx Nøport->Adresse dx +GetFirstLpt: +push ax ds +mov ax,bios +mov ds,ax +xor bx,bx +findlpt: +mov dx,ds:[Lptadr+bx] +cmp dx,0 +jne oklpt +add bx,2 +cmp bx,4 +jbe findlpt +oklpt: +mov cs:lpt,dx +pop ds ax +ret + +;-> +StartTimer: +push ax ecx ds +mov ax,Bios +mov ds,ax +mov ecx,ds:[timer] +mov cs:times,ecx +pop ds ecx ax +ret +times dd 0 + +;->Ecx time elapsed +EndTimer: +push ax ds +mov ax,Bios +mov ds,ax +mov ecx,ds:[timer] +sub ecx,cs:times +pop ds ax +ret + +;-> +GetLptOut: +push dx +mov dx,cs:lpt +in al,dx +pop dx +ret + +GetLptIn: +push dx +mov dx,cs:lpt +inc dx +in al,dx +shr al,3 +pop dx +ret + +GetLptInOut: +push dx +mov dx,cs:lpt +add dx,2 +in al,dx +and al,11111b +pop dx +ret + +SetLptOut: +push dx +mov dx,cs:lpt +out dx,al +pop dx +ret + +SetLptIn: +push dx +mov dx,cs:lpt +inc dx +out dx,al +pop dx +ret + +SetLptInOut: +push dx +mov dx,cs:lpt +add dx,2 +out dx,al +pop dx +ret + +;R‚alise un checksum 8 bits sur donn‚es DS:SI, nb CX r‚sultat dans dl +Checksum8: +push cx si +check: +add dl,[si] +inc si +dec cx +jnz check +pop si cx +ret + +;DS:SI pointeur sur donn‚es, CX nombres de donn‚es, AL token +SendLptBlock: +push ax bx cx edx si edi bp +mov dx,cx +shl edx,16 +mov dh,al +call checksum8 +mov edi,edx +xor dh,dh +mov bp,dx +mov ah,maxtry +retry: +mov bl,4 +xor al,al +header: +mov dx,di +call sendlpt +setne al +jc outt +rol edi,8 +dec bl +jnz header +cmp al,0 +jne notgood +mov dl,ACK +jmp allsend +notgood: +mov dl,NACK +allsend: +call sendlpt +setne al +jc outt +cmp al,0 +je okheader +dec ah +jnz retry +jmp outt +okheader: +cmp cx,0 +je endoftrans +mov di,maxtry +retry2: +mov bx,cx +xor ax,ax +body: +mov dl,[si+bx-1] +add ah,dl +call sendlpt +setne al +jc outt +dec bx +jnz body +cmp al,0 +jne notgood2 +mov dl,ACK +jmp allisend +notgood2: +mov dl,NACK +allisend: +call sendlpt +setne al +jc outt +cmp al,0 +je endoftrans +dec di +jnz retry2 +outt: +stc +endoftrans: +mov al,ah +xor ah,ah +cmp bp,ax +pop bp edi si edx cx bx ax +ret + +;Receptionne en es:di les donn‚es au nombres de CX token AL (AH) (ECX) +receiveLptBlock: +push bx dx si bp +mov ah,maxtry +retrye: +mov bl,4 +headere: +call receivelpt +jc outte +mov cl,dl +rol ecx,8 +dec bl +jnz headere +call receivelpt +jc outte +cmp dl,ACK +je okheadere +dec ah +jnz retrye +jmp outte +okheadere: +mov al,ch +xor ch,ch +mov bp,cx +rol ecx,16 +cmp cx,0 +je endoftranse +mov si,maxtry +retrye2: +mov bx,cx +xor ah,ah +bodye: +call receivelpt +jc outte +mov es:[di+bx-1],dl +add ah,dl +dec bx +jnz bodye +call receivelpt +jc outte +cmp dl,ACK +je endoftranse +dec si +jnz retrye2 +outte: +stc +endoftranse: +mov bl,ah +xor bh,bh +cmp bp,bx +pop bp si dx bx +ret +video db 0 +end start diff --git a/noyau/mouse.asm b/noyau/souris.asm old mode 100755 new mode 100644 similarity index 95% rename from noyau/mouse.asm rename to noyau/souris.asm index b2e8a19..c639cfa --- a/noyau/mouse.asm +++ b/noyau/souris.asm @@ -1,327 +1,327 @@ -.model tiny -.486 -smart -.code -org 0100h -start: -jmp tsr -drv db 'MOUSE',0 -Tsr: -cli -cmp ax,1234h -jne nomore -mov ax,4321h -jmp itsok -nomore: -push bx ax -mov ah,4 -mov bh,0 -int 50h -mov bl,al -pop ax -cmp byte ptr cs:isact,1 -je nottest -mov cs:isact,1 -and bl,10000b -cmp bl,16 -jae react -mov bl,ah -xor bh,bh -shl bx,1 -mov bx,cs:[bx].tables -mov cs:current,bx -pop bx -call cs:current -itsok: -jnc noerror -push bp -mov bp,sp -or byte ptr [bp+6],1b -pop bp -mov ax,cs -shl eax,16 -mov ax,cs:current -jmp endofint -noerror: -push bp -mov bp,sp -and byte ptr [bp+6],0FEh -pop bp -endofint: -mov cs:isact,0 -sti -iret -nottest: -pop bx -jmp endofint -current dw 0 -tables dw cmdmouse - dw cmdmouse2 - dw detectmouse - dw getmouse - dw getmousescreen - dw configmouse - -isact db 0 - -;Envoie une commande AL … la souris via controleur clavier -cmdmouse: - push ax -videbuff1: - in al, 64h - and al, 10b - jne videbuff1 - mov al, 00d4h - out 64h, al -videbuff2: - in al, 64h - and al, 10b - jne videbuff2 - pop ax - out 60h, al - in al, 60h - ret - -;Envoie une commande2 AL … la souris via controleur clavier carry=nomouse -cmdmouse2: - push ax -videbuff21: - in al, 64h - and al, 10b - jne videbuff21 - mov al, 0060h - out 64h, al -videbuff22: - in al, 64h - and al, 10b - jne videbuff22 - pop ax - out 60h, al - in al, 60h - ret - -Detectmouse: - push ax cx - mov al, 0a8h ;AUX enable - out 64h, al - mov al, 0f3h ;Set sample - call cmdmouse - mov al, 100 ;Set sample - call cmdmouse - mov al, 0e8h ;Set resolution - call cmdmouse - mov al, 01 ;Set resolution - call cmdmouse - mov al, 0e7h ;Set scale 2:1 - call cmdmouse - mov al, 0f4h ;Enable device - call cmdmouse - mov al, 47h ;Interruption ON - call cmdmouse2 - mov cx, 1024 -testmouse: - in al, 60h ;Lecture du port de donn‚es - cmp al, 250 ;Test si il y a une souris - je okmouse - dec cx - jnz testmouse - stc - jmp endoftest -okmouse: - clc -endoftest: - pop cx ax - ret - -;envoie en bx,cx les coordonn‚es et en dl les boutons -getmouse: -mov bx,cs:rx -mov cx,cs:ry -mov dl,cs:button -sub dl,8 -and dl,0Fh -clc -ret - -;envoie en di les coordonn‚es ecran et en dl les boutons -getmousescreen: -mov di,cs:xy -mov dl,cs:button -sub dl,8 -and dl,0Fh -clc -ret - - -;configure la rapidit‚ dans cl et dans ah,al sphŠre x et y -Configmouse: -mov cs:speed,cl -mov cs:spherex,ah -mov cs:spherey,al -ret - -Button db 0 -rx dw 0 -ry dw 0 -VX db 0 -VY db 0 -X dw 7FFFh -Y dw 7FFFh -speed db 6 -spherex db 0 -spherey db 0 -count db 0 -error db 0 -xy dw 0 -old db 0 -;Gestionnaire de souris PS/2 -react: - push ax bx cx dx di ds es - push cs - pop ds - in al, 60h - cmp error, 1 - je gest1 - cmp count, 1 - je gest1 - cmp count, 2 - je gest2 - cmp count, 3 - je gest3 - -gest1: - mov count, 2 - mov Button, al - and al, 00001000b - cmp al, 8 - je gest1end - mov error, 1 - jmp gest1end2 -gest1end: - mov error, 0 -gest1end2: - mov count, 2 - jmp endgest -gest2: - mov count, 3 - mov VX, al - jmp endgest -gest3: - mov count, 1 - mov VY, al - jmp endgest -endgest: - cmp error,1 - je errormouse - push cs - pop es - mov di,offset infos - mov ah,34 - int 47h - mov cl,speed - movsx bx,VY - shl bx,cl - cmp spherey,0 - jne nolimity - xor ah,ah - mov al,[di] - cmp byte ptr [di+7],4 - jbe text4 - shl ax,3 -text4: - dec ax - cmp bx,0 - jg decy - cmp ry,ax - jae noaddy - jmp nolimity -decy: - cmp ry,0 - je noaddy -nolimity: - sub y,bx -noaddy: - movsx bx,VX - shl bx,cl - cmp spherex,0 - jne nolimitx - xor ah,ah - mov al,[di+1] - cmp byte ptr [di+7],4 - jbe text5 - shl ax,3 -text5: - dec ax - cmp bx,0 - jl decx - cmp rx,ax - jae noaddx - jmp nolimitx -decx: - cmp rx,0 - je noaddx -nolimitx: - add x,bx -noaddx: - mov ax,x - mov bx,0FFFFh - xor ch,ch - mov cl,[di+1] - cmp byte ptr [di+7],4 - jbe text1 - shl cx,3 -text1: - mul cx - div bx - mov rx,ax - mov ax,y - xor ch,ch - mov cl,[di] - cmp byte ptr [di+7],4 - jbe text2 - shl cx,3 -text2: - mul cx - div bx - mov ry,ax - xor ch,ch - mov cl,[di+1] - cmp byte ptr [di+7],4 - jbe text3 - shl cx,3 -text3: - mul cx - add ax,rx - cmp byte ptr [di+7],4 - mov di,ax - jbe textpoint - mov ax,0A000h - mov es,ax - jmp graphpoint -textpoint: - mov ax,0B800h - mov es,ax - shl di,1 - inc di -graphpoint: - mov bx,xy - cmp byte ptr es:[bx],070h - jne waschanged - mov al,old - mov byte ptr es:[bx],al -waschanged: - mov xy,di - mov al,es:[di] - mov old,al - mov byte ptr es:[di],070h - mov al, 20h - out 0a0h, al - out 20h, al -errormouse: - pop es ds di dx cx bx ax - mov cs:isact,0 - pop bx - iret - infos db 40 dup (0) - -end start +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +drv db 'MOUSE',0 +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx ax +mov ah,4 +mov bh,0 +int 50h +mov bl,al +pop ax +cmp byte ptr cs:isact,1 +je nottest +mov cs:isact,1 +and bl,10000b +cmp bl,16 +jae react +mov bl,ah +xor bh,bh +shl bx,1 +mov bx,cs:[bx].tables +mov cs:current,bx +pop bx +call cs:current +itsok: +jnc noerror +push bp +mov bp,sp +or byte ptr [bp+6],1b +pop bp +mov ax,cs +shl eax,16 +mov ax,cs:current +jmp endofint +noerror: +push bp +mov bp,sp +and byte ptr [bp+6],0FEh +pop bp +endofint: +mov cs:isact,0 +sti +iret +nottest: +pop bx +jmp endofint +current dw 0 +tables dw cmdmouse + dw cmdmouse2 + dw detectmouse + dw getmouse + dw getmousescreen + dw configmouse + +isact db 0 + +;Envoie une commande AL … la souris via controleur clavier +cmdmouse: + push ax +videbuff1: + in al, 64h + and al, 10b + jne videbuff1 + mov al, 00d4h + out 64h, al +videbuff2: + in al, 64h + and al, 10b + jne videbuff2 + pop ax + out 60h, al + in al, 60h + ret + +;Envoie une commande2 AL … la souris via controleur clavier carry=nomouse +cmdmouse2: + push ax +videbuff21: + in al, 64h + and al, 10b + jne videbuff21 + mov al, 0060h + out 64h, al +videbuff22: + in al, 64h + and al, 10b + jne videbuff22 + pop ax + out 60h, al + in al, 60h + ret + +Detectmouse: + push ax cx + mov al, 0a8h ;AUX enable + out 64h, al + mov al, 0f3h ;Set sample + call cmdmouse + mov al, 100 ;Set sample + call cmdmouse + mov al, 0e8h ;Set resolution + call cmdmouse + mov al, 01 ;Set resolution + call cmdmouse + mov al, 0e7h ;Set scale 2:1 + call cmdmouse + mov al, 0f4h ;Enable device + call cmdmouse + mov al, 47h ;Interruption ON + call cmdmouse2 + mov cx, 1024 +testmouse: + in al, 60h ;Lecture du port de donn‚es + cmp al, 250 ;Test si il y a une souris + je okmouse + dec cx + jnz testmouse + stc + jmp endoftest +okmouse: + clc +endoftest: + pop cx ax + ret + +;envoie en bx,cx les coordonn‚es et en dl les boutons +getmouse: +mov bx,cs:rx +mov cx,cs:ry +mov dl,cs:button +sub dl,8 +and dl,0Fh +clc +ret + +;envoie en di les coordonn‚es ecran et en dl les boutons +getmousescreen: +mov di,cs:xy +mov dl,cs:button +sub dl,8 +and dl,0Fh +clc +ret + + +;configure la rapidit‚ dans cl et dans ah,al sphŠre x et y +Configmouse: +mov cs:speed,cl +mov cs:spherex,ah +mov cs:spherey,al +ret + +Button db 0 +rx dw 0 +ry dw 0 +VX db 0 +VY db 0 +X dw 7FFFh +Y dw 7FFFh +speed db 6 +spherex db 0 +spherey db 0 +count db 0 +error db 0 +xy dw 0 +old db 0 +;Gestionnaire de souris PS/2 +react: + push ax bx cx dx di ds es + push cs + pop ds + in al, 60h + cmp error, 1 + je gest1 + cmp count, 1 + je gest1 + cmp count, 2 + je gest2 + cmp count, 3 + je gest3 + +gest1: + mov count, 2 + mov Button, al + and al, 00001000b + cmp al, 8 + je gest1end + mov error, 1 + jmp gest1end2 +gest1end: + mov error, 0 +gest1end2: + mov count, 2 + jmp endgest +gest2: + mov count, 3 + mov VX, al + jmp endgest +gest3: + mov count, 1 + mov VY, al + jmp endgest +endgest: + cmp error,1 + je errormouse + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov cl,speed + movsx bx,VY + shl bx,cl + cmp spherey,0 + jne nolimity + xor ah,ah + mov al,[di] + cmp byte ptr [di+7],4 + jbe text4 + shl ax,3 +text4: + dec ax + cmp bx,0 + jg decy + cmp ry,ax + jae noaddy + jmp nolimity +decy: + cmp ry,0 + je noaddy +nolimity: + sub y,bx +noaddy: + movsx bx,VX + shl bx,cl + cmp spherex,0 + jne nolimitx + xor ah,ah + mov al,[di+1] + cmp byte ptr [di+7],4 + jbe text5 + shl ax,3 +text5: + dec ax + cmp bx,0 + jl decx + cmp rx,ax + jae noaddx + jmp nolimitx +decx: + cmp rx,0 + je noaddx +nolimitx: + add x,bx +noaddx: + mov ax,x + mov bx,0FFFFh + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text1 + shl cx,3 +text1: + mul cx + div bx + mov rx,ax + mov ax,y + xor ch,ch + mov cl,[di] + cmp byte ptr [di+7],4 + jbe text2 + shl cx,3 +text2: + mul cx + div bx + mov ry,ax + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text3 + shl cx,3 +text3: + mul cx + add ax,rx + cmp byte ptr [di+7],4 + mov di,ax + jbe textpoint + mov ax,0A000h + mov es,ax + jmp graphpoint +textpoint: + mov ax,0B800h + mov es,ax + shl di,1 + inc di +graphpoint: + mov bx,xy + cmp byte ptr es:[bx],070h + jne waschanged + mov al,old + mov byte ptr es:[bx],al +waschanged: + mov xy,di + mov al,es:[di] + mov old,al + mov byte ptr es:[di],070h + mov al, 20h + out 0a0h, al + out 20h, al +errormouse: + pop es ds di dx cx bx ax + mov cs:isact,0 + pop bx + iret + infos db 40 dup (0) + +end start diff --git a/noyau/system.asm b/noyau/system.asm deleted file mode 100755 index 9680cde..0000000 --- a/noyau/system.asm +++ /dev/null @@ -1,676 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: -mov si,offset video -mov bx,400h -mov ax,47h -call installhandler -jc erroron -mov si,offset timer -mov bx,900h -mov ax,8h -call replacehandler -jc erroron -mov si,offset pic -mov bx,950h -mov ax,50h -call installhandler -jc erroron -mov si,offset drive -mov bx,1020h -mov ax,48h -call installhandler -jc erroron -mov si,offset keyboard -mov bx,1400h -mov ax,9h -call replacehandler -jc erroron -mov ax,40h -mov es,ax -mov dx,es:[8] -cmp dx,0 -je nolpt1 -mov al,0FFh -add dx,2 -out dx,al -mov si,offset lpt -mov bx,1500h -mov ax,0Fh -call installhandler -jc erroron -mov es,bx -sub al,8 -xor ah,ah -int 50h -mov byte ptr es:[105h],'1' -nolpt1: -push es -mov ax,40h -mov es,ax -mov dx,es:[10] -pop es -cmp dx,0 -je nolpt2 -mov al,0FFh -add dx,2 -out dx,al -mov si,offset lpt -mov bx,1700h -mov ax,0Dh -call installhandler -jc erroron -sub al,8 -xor ah,ah -int 50h -mov es,bx -mov byte ptr es:[105h],'2' -nolpt2: -mov si,offset mouse -mov bx,1900h -mov ax,74h -call installhandler -jc erroron -mov ax,0012 -int 50h -mov ah,2 -int 74h -;mov si,offset joystick -;mov bx,2700h -;mov ax,08h -;call replacehandler -mov si,offset hours -mov bx,2900h -mov ax,08h -call replacehandler - -start2: -push cs -push cs -pop ds -pop es -mov ah,21 -mov cl,7 -int 47h -mov ax,0002 -int 47h -mov ah,2 -int 47h -mov ah,25 -mov bx,0 -int 47h -mov ah,13 -mov si,offset msg1 -int 47h -mov ah,6 -int 47h -int 47h -mov ah,13 -mov si,offset prompt -int 47h -mov ah,6 -int 47h -xor di,di -mov ax,0001h -mov bx,offset buffer -mov cx,13 -int 48h -xor bp,bp -showall: -cmp byte ptr [bx+di],0 -je endof2 -mov al,[bx+di+12] -mov byte ptr [bx+di+12],0 -mov si,bx -add si,di -mov ah,13 -int 47h -mov si,offset spaces -int 47h -mov [bx+di+12],al -mov byte ptr [bx+di+12+5],0 -mov si,bx -add si,di -add si,12 -int 47h -mov ah,6 -int 47h -add di,32 -inc bp -jmp showall -endof2: -mov ah,21 -mov cl,112 -int 47h -mov ah,13 -mov si,offset menu -int 47h -mov xx,1 -mov xxold,2 -call Select -endof: -mov ax,0 -int 16h - cmp ah,50h - jne tre1 - cmp xx,bp - je endof - inc xx - call select - jmp endof -tre1: - cmp ah,48h - jne tre2 - cmp xx,1 - je endof - dec xx - call select - jmp endof -tre2: - cmp al,0Dh - jne tre3 - mov di,xx - dec di - shl di,5 - mov dx,[di+bx+26] - cmp [di+bx+12],00657865h ;EXE - jne tre3 - mov ah,6 - int 47h - int 47h - mov ah,21 - mov cl,7 - int 47h - mov ah,13 - mov si,offset msg2 - int 47h - mov cx,dx - call executefatway -tre3: - cmp ah,59 - jne tre4 - mov lastread,0FFFFh - jmp start2 -tre4: - cmp ah,67 - jne endof - mov ax,0001 - int 47h - mov ah,2 - int 47h - mov ah,21 - mov cl,4 - int 47h - mov ah,13 - mov si,offset msg3 - int 47h - mov ax,0 - int 16h - mov ax,40h - mov ds,ax - mov bx,1234h - mov ds:[072h],bx - push 0FFFFh - push 0000h - db 0CBh - -executefatway: - push cs - mov bx,offset start2 - push bx - mov bx,03000h - mov es,bx - push bx - mov bx,0100h - push bx - call loadfatway - push es - push es - push es - pop ds - pop fs - pop gs - push 7202h - popf - db 0CBh - -;selectionne la ligne xx -Select: -push ax di -mov di,xxold -mov al,7 -add di,2 -mov ah,32 -int 47h -mov ax,xx -mov xxold,ax -mov di,xx -mov ah,32 -mov al,112 -add di,2 -int 47h -pop di ax -ret - -xx dw 1 -xxold dw 0 -menu db 'F1 Read disk F2 Read file F9 Quit F11 Change video F12 Debug ',0 -msg1 db ' Cos 2000 menu loader release 1.0',0 -msg2 db 'The program is loading',0 -msg3 db ' Cos will restart your computer, eject the floppy disk and press a key',0 -prompt db '>',0 -spaces db ' ',0 -dot db '.',0 - -;cx entr‚e -> fatway chemin -getfatway: -push bx cx -mov bx,offset fatway -fatagain: -mov cs:[bx],cx -add bx,2 -cmp cx,0FFF0h -jae finishload -call getfat -jnc fatagain -finishload: -pop cx bx -ret - -;Charge le fichier de chemin cx -> taille dx -loadfatway: -push ax bx cx di -call getfatway -jc endload -mov di,offset fatway -mov si,offset dot -mov ah,13 -xor dx,dx -loadagain: -mov cx,cs:[di] -cmp cx,0FFF0h -jae endload -add di,2 -call readsector -jc endload -add bx,cs:sizec -add dx,cs:sizec -jmp loadagain -endload: -pop di cx bx ax -ret - - -sizec dw 512 -reserv dw 1 - -;<-cx nøsecteur ->cx code FAT -getfat: -push es ax bx dx -push cs -pop ds -push cs -pop es -mov ax,cx -xor dx,dx -div sizec -mov cx,ax -add cx,reserv -mov bx,offset buffer -call readsector -jc errorgetfat -shl dx,1 -add bx,dx -mov cx,[bx] -errorgetfat: -pop dx bx ax es -ret - -ReadSector: -push ax cx dx si - cmp cx,cs:lastread - je done - mov cs:LastRead,cx - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 2 - int 13h - jnc Done - dec SI - jnz TryAgain -mov word ptr cs:lastread,0ffffh -Done: - pop si dx cx ax -ret - -WriteSector: -push ax cx dx si - cmp cs:Lastread,cx - jne nodestruct - mov cs:Lastread,0ffffh - nodestruct: - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor DX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain2: - mov AL, 1 - mov DL, 0 - mov AH, 3 - int 13h - jnc Done2 - dec SI - jnz TryAgain2 -Done2: - pop si dx cx ax -ret - -Lastread dw 0FFFFh - -;remplace le handler pointer par ds:si en bx:100h interruption ax -replacehandler: -push ax bx cx si di ds es -mov es,bx -mov di,0100h -call loadfile -jc reph -mov bx,ax -call getint -mov es:[102h],si -mov es:[104h],ds -call setint -reph: -pop es ds di si cx bx ax -ret - -;install le handler pointer par ds:si en bx:100h interruption ax -installhandler: -push bx cx di es -mov es,bx -mov di,100h -call loadfile -jc insh -mov bx,ax -call setint -insh: -pop es di cx bx -ret - -;Charge le fichier Ds:si en es:di taille-> cx -loadfile: -push bx -call searchfile -jc errorloadfile -mov bx,di -call loadfatway -jc errorloadfile -mov cx,dx -errorloadfile: -pop bx -ret - -;met es:di le handle de l'int bx -setint: -push ax bx ds -cli -shl bx,2 -xor ax,ax -mov ds,ax -mov ds:[bx],di -mov ds:[bx+2],es -pop ds bx ax -sti -ret - -;met ds:si le handle de l'int bx -getint: -push ax bx es -shl bx,2 -xor ax,ax -mov es,ax -mov si,es:[bx] -mov ds,es:[bx+2] -pop es bx ax -ret - -;Recherche le fichier et retourne sont path et en cx sont debut -Searchfile: -push ax bx dx si di ds es -push cs -pop es -xor dx,dx -mov di,offset temp -call asciiztofit -push cs -pop ds -mov cx,13 -check: -mov bx,offset buffer -call readsector -jc errorboot -xor di,di -findnext: -cmp byte ptr [bx+di],0 -je errorboot -push si di cx -mov si,di -add si,bx -mov di,offset temp -mov cx,12+4 -cld -rep cmpsb -pop cx di si -je oksystem -add di,32 -inc dx -cmp dx,nbfit -ja errorboot -cmp di,sizec -jb findnext -inc cx -jmp Check -oksystem: -mov cx,[di+BX+26] -cld -jmp goodboot -errorboot: -stc -goodboot: -pop es ds di si dx bx ax -ret - -;->name ds:si ->es:di -AsciiZtoFit: -push ax bx cx dx si di ds es -xor bx,bx -mov dx,di -noextens: -mov al,[si+bx] -cmp al,'.' -je extens -call Issystchar -jc errortranslate -mov es:[di],al -inc di -inc bx -cmp bx,namesize ;(.) -jne noextens -erro: -stc -jmp errortranslate -extens: -add si,bx -inc si -sub bx,namesize -neg bx -mov al,0 -mov cx,bx -cld -rep stosb -xor bx,bx -wasextens: -mov al,[si+bx] -cmp al,0 -je endextens -call Issystchar -jc errortranslate -mov es:[di],al -inc di -inc bx -cmp bx,extsize -jne wasextens -jmp erro -endextens: -sub bx,extsize -neg bx -mov al,0 -mov cx,bx -cld -rep stosb -mov si,dx -mov di,dx -push es -pop ds -mov cx,extsize+namesize -call uppercaseMEM -clc -endtranslate: -pop es ds di si dx cx bx ax -ret -errortranslate: -stc -jmp endtranslate - -;Carry si al = caractŠre systŠme -isSystchar: -push di -mov di,offset exeptchar -isexcept: -cmp al,cs:[di] -je nogood -inc di -cmp byte ptr cs:[di],0 -jne isexcept -endanal: -clc -pop di -ret -nogood: -stc -jmp endanal - -;Transforme les x caractŠres de la mem en ds:si en maj -uppercaseMEM: -push si di cx ax -mov di,si -uppercaser: -mov al,ds:[si] -inc si -cmp al,'A' -jb nonmaj -cmp al,'Z' -ja nonmaj -add al,'a'-'A' -nonmaj: -mov es:[di],al -inc di -dec cx -jnz uppercaser -enduppercase: -clc -pop ax cx di si -ret - -erroron: -push cs -pop ds -xor edx,edx -mov dx,ax -mov ax,0001h -int 47h -mov ah,6 -int 47h -mov ah,6 -int 47h -mov ah,13 -mov si,offset errormsg -int 47h -mov ah,10 -mov cx,16 -int 47h -mov ah,6 -int 47h -mov ah,6 -int 47h -mov ah,13 -mov si,offset errormsg2 -int 47h -mov ax,0 -int 16h -push 0FFFFh -push 0 -db 0CBh - -errormsg db 'Error with drivers loading on interrupt nø',0 -errormsg2 db 'Press a key to restart...',0 -namesize equ 12 -extsize equ 5 -nbfit equ 255 -hours db 'hours.sys',0 -joystick db 'joystick.sys',0 -mouse db 'mouse.sys',0 -pic db 'pic8259a.sys',0 -drive db 'drive.sys',0 -timer db 'timer.sys',0 -lpt db 'lpt.sys',0 -video db 'video.sys',0 -keyboard db 'keyboard.sys',0 -temp db 12+5+1 dup (0) -exeptchar db '/\<>:|.',01,0,0 -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 - -fatway equ $ - -buffer equ $+3000 - -end start diff --git a/noyau/systeme.asm b/noyau/systeme.asm new file mode 100644 index 0000000..b9624ea --- /dev/null +++ b/noyau/systeme.asm @@ -0,0 +1,897 @@ +.model tiny +.486 +smart +.code + +org 0100h + +include ..\include\fat.h + +start: +push cs +push cs +push cs +push cs +pop ds +pop es +pop fs +pop gs + ;xor ax,ax + ;mov ds,ax + ;mov si,7C00h +mov si,offset eepop + mov di,offset myboot + mov cx,type bootsector + push cs + pop es + rep movsb +jmp noone + +eepop db 0,0,0 +bootdb db 'COS2000A' ;Fabricant + n°série Formatage +sizec dw 512 ;octet/secteur + db 1 ;secteur/cluster +reserv dw 1 ;secteur reserv‚ +nbfat db 2 ;nb de copie de la FAT +nbfit dw 224 ;taille rep racine +allclu dw 2880 ;nb secteur du volume si < 32 még + db 0F0h ;Descripteur de média +fatsize dw 9 ;secteur/FAT +nbtrack dw 18 ;secteur/piste +head dw 2 ;nb de tˆteb de lecture/écriture +hidden dd 0 ;nombre de secteur cach‚s + dd 0 ;si nbsecteur = 0 nbsect ; the number of sectors +bootdrv db 0 ;Lecteur de d‚marrage +bootsig db 0 ;NA + db 29h ;boot signature 29h +bootsig2 dd 01020304h ;no de serie +pope db 'COS2000 ' ;nom de volume + db 'FAT12 ' ;FAT + + + xor ax,ax + mov es,ax + mov di,1Eh*4 + lds si,es:[di] + mov es:[di],cs + mov word ptr es:[di],offset myDPT + push cs + pop es + mov cx,type DPT + rep movsb + mov ax,cs:[Bootsector.SectorsPerTrack] + mov es:[DPT.SectorPerTracks],al +noone: + push cs + push cs + push cs + push cs + pop ds + pop es + pop fs + pop gs + + call InitDrive + + mov si,offset premice + mov bx,7 + call showstr + mov si,offset next + call showstr + mov si,offset conf + call showstr + mov al,0 + mov cx,2000 + mov di,offset loadinglist + rep stosb + mov di,offset loadinglist + call loadfile + jc noconfread + + mov si,offset debut + mov bx,7 + call showstr + mov bx,500h + xor cx,cx + mov si,offset loadinglist +suiteloading: + call readline + jc noconfload + push bx si + mov bl,7 + mov si,offset next + call showstr + pop si bx + call showstr + mov dx,bx + push bx si + mov bx,7 + mov si,offset address + call showstr + mov cx,16 + call showhex + mov si,offset addressend + call showstr + xor bp,bp + mov dx,ax + cmp ax,8h + jb noadder + cmp ax,10h + ja noadder + mov bp,1 + sub dx,8 + jmp haveirq +noadder: + cmp ax,70h + jb noadd + cmp ax,78h + ja noadd + mov bp,1 + sub dx,68h +haveirq: + mov si,offset irqs + call showstr + mov cx,4 + call showhex + mov si,offset irqsend + call showstr +noadd: + pop si bx + cmp bp,1 + jne install + call replacehandler + jmp suites +install: + call installhandler +suites: + jc nohandlerload + add bx,0F00h + inc cx + call nextline + jnz suiteloading + + mov si,offset fini + mov bl,7 + call showstr + mov si,offset next + call showstr + mov si,offset prompt + call showstr + mov ax,6000h + mov es,ax + push ax + mov di,0100h + push di + call loadfile + jc nopromptload + push 7202h + popf + push es + push es + push es + pop ds + pop fs + pop gs + db 0CBh + +nopromptload: + mov si,offset prompte + mov bl,4 + call showstr + jmp erroron + +nohandlerload: + mov si,offset handlere + mov bl,4 + call showstr + jmp erroron + +noconfread: + mov si,offset confee + mov bl,4 + call showstr + jmp erroron + +noconfload: + mov di,si + mov si,offset confe + mov bl,4 + call showstr + mov dx,cx + mov cx,16 + call showhex + mov si,offset confe2 + mov bl,3 + call showstr + mov dx,di + mov cx,16 + call showhex + +erroron: + push cs + pop ds + mov si,offset erreur + mov bl,4 + call showstr + mov ax,0 + int 16h + push 0FFFFh + push 0 + db 0CBh + +address db ' [',0 +addressend db ':0100] ',0 +irqs db ' (IRQ ',0 +irqsend db ')',0 +prompt db 'commande.exe',0 +conf db 'systeme.ini',0 +premice db 0Dh,0Ah,'Chargement du fichier de configuration:',0 +debut db 0Dh,0Ah,'Chargement des pilotes systeme:',0 +fini db 0Dh,0Ah,'Chargement de l''interpreteur de commande:',0 +next db 0Dh,0Ah,' - ',0 +prompte db 0Dh,0Ah,'Erreur lors du chargement de l''interpreteur',0 +handlere db 0Dh,0Ah,'Erreur lors du chargement des pilotes',0 +confe db 0Dh,0Ah,'Erreur dans le fichier de configuration a la ligne ',0 +confee db 0Dh,0Ah,'Erreur de lecture du fichier de configuration',0 +confe2 db ' caractere ',0 +erreur db 0Dh,0Ah,'Pressez une touche pour redemarrer...',0 + +;==positionne si sur l'entrée suivante de la loading liste jusqu'a equal +nextline: +push ax cx di +mov di,si +mov al,0Ah +mov cx,20 +repnz scasb +mov si,di +cmp byte ptr [di],0 +pop di cx ax +ret + +;==Lit la loading list et initialise SI(Fichier) BX(adresse) AX(interruption) +readline: +push cx dx di es +push ds +pop es +;Voir taille de la ligne -> DX +mov di,si +mov al,0Dh +mov cx,20 +repne scasb +sub cx,20 +neg cx +mov dx,cx +;N° interruption ?? +mov di,si +mov al,'(' +repne scasb +jne noaddr +;Non, je recherche l'int positionnement parenthese de fin +mov al,')' +repne scasb +jne errorlist +;Je lit l'interruption dans DL +xor dl,dl +xor cx,cx +dec di +readingint: +dec di +mov al,[di] +cmp al,'(' +je finishint +call eval +jc errorlist +shl ax,cl +add dl,al +add cx,4 +cmp cx,8 +ja errorlist +jmp readingint +noaddr: +dec di +mov dl,0 +finishint: +;mise d'un 0 a la fin du nom +mov byte ptr [di],0 +mov al,dl +pop es di dx cx +clc +ret +errorlist: +sub di,si +mov si,di +pop es di dx cx +stc +ret + + +;return carry si pas hexa pour al et renvoie dans al la valeur décimale +eval: +push si +xor si,si +searchex: +cmp al,cs:[si+offset hexas] +je endsearchex +inc si +cmp si,15 +jbe searchex +pop si +stc +ret +endsearchex: +mov ax,si +pop si +clc +ret + +hexas db '0123456789ABCDEF',0 + +;==============================Affiche le nombre nb hexa en EDX de taille CX et couleur BL============== +ShowHex: + push ax bx cx edx si di + mov di,cx + sub cx,32 + neg cx + shl edx,cl + shr di,2 + mov ah,0Eh + and bx,1111b +Hexaize: + rol edx,4 + mov si,dx + and si,1111b + mov al,[si+offset tab] + int 10h + dec di + jnz Hexaize + pop di si edx cx bx ax + ret +Tab db '0123456789ABCDEF' + +;==============================Affiche une chaine DS:SI de couleur BL============== +showstr: + push ax bx si +again: + lodsb + or al,al + jz fin + mov ah,0Eh + and bx,1111b + int 10h + jmp again + fin: + pop si bx ax + ret + +;================================================ +;Routine de gestion de handler +;================================================ + +;remplace le handler pointer par ds:si en bx:100h interruption ax +replacehandler: +push ax bx cx si di ds es +mov es,bx +mov di,0100h +call loadfile +jc reph +mov bx,ax +call getint +mov es:[102h],si +mov es:[104h],ds +call setint +reph: +pop es ds di si cx bx ax +ret + +;install le handler pointer par ds:si en bx:100h interruption ax +installhandler: +push bx cx di es +mov es,bx +mov di,100h +call loadfile +jc insh +mov bx,ax +call setint +insh: +pop es di cx bx +ret + +;met es:di le handle de l'int bx +setint: +push ax bx ds +cli +shl bx,2 +xor ax,ax +mov ds,ax +mov ds:[bx],di +mov ds:[bx+2],es +pop ds bx ax +sti +ret + +;met ds:si le handle de l'int bx +getint: +push ax bx es +shl bx,2 +xor ax,ax +mov es,ax +mov si,es:[bx] +mov ds,es:[bx+2] +pop es bx ax +ret + +;================================================ +;Routine de gestion de systeme de fichier FAT12 +;================================================ + +;DPT disquette +mydpt DPT ? + +;Secteur de boot +myboot bootSector ? + +;Données Calculée +clustersize dw 0 +TracksPerHead dw 0 +DriveSize dd 0 +AdressBoot dw 0 +AdressFat dw 0 +AdressParent dw 0 +AdressData dw 0 +AddingValue dw 0 +CurrentDir dw 0 ;En cluster +CurrentDirStr db 128 dup (0) + +;Pour recherches +EntryPlace dw 0 ;En octet +AdressDirectory dw 0 ;En cluster +firstsearch dw 1 ;Premiere requete ? + +getfat: + push ax bx dx si + mov ax,cx + mov bx,ax + and bx,0000000000000001b + shr ax,1 + mov cx,3 + mul cx + mov si,offset bufferfat + add si,ax + cmp bx,0h + jnz evenfat +oddfat: + mov dx,cs:[si] + and dx,0FFFh + mov cx,dx + jmp endfat +evenfat: + mov dx,cs:[si+1] + and dx,0FFF0h + shr dx,4 + mov cx,dx +endfat: + cmp dx,0FF0h + jbe nocarry + stc + pop si dx bx ax + ret +nocarry: + clc + pop si dx bx ax + ret + +;============loadfile (Fonction 4)=============== +;Charge le fichier ds:si en es:di ->ecx taille +;-> AH=4 +;<- Flag Carry si erreur +;===================================================== +loadfile: + push eax bx di + push es di + push cs + pop es + mov di,offset tempfit + call searchfile + pop di es + jne errorload + jc errorload + mov cx,cs:tempfit.FileGroup + mov eax,cs:tempfit.FileSize + call loadway + jc errorload + clc + ;mov ecx,eax + pop di bx eax + ret +errorload: + stc + mov ecx,0 + pop di bx eax + ret + +tempfit db 32 dup (0) + +;=============SearchFile (Fonction 10)=============== +;Renvois dans ES:DI la fit du fichier DS:SI et non equal si pas existant +;-> AH=10 +;<- Flag Carry si erreur +;===================================================== +SearchFile: + push ax cx ds si di es + call uppercase + push ds si + call findfirstfilez + push ds + pop es + mov di,si + pop si ds + jc errorsearch + jmp founded +nextsearch: + push ds si + call findnextfilez + push ds + pop es + mov di,si + pop si ds +founded: + cmp byte ptr cs:[di],0 + je notgood + cmp byte ptr cs:[di+FileAttr],0Fh + je nextsearch + call cmpnames + jc nextsearch +okfound: + push cs + pop ds + mov si,di + pop es di + push di es + mov cx,32 + rep movsb + clc + pop es di si ds cx ax + ret +notgood: + cmp si,0FF5h + pop es di si ds cx ax + ret +errorsearch: + stc + pop es di si ds cx ax + ret + +;Transforme la chaine ds:si en maj +uppercase: + push si ax + mov di,si +uppercaser: + mov al,ds:[si] + cmp al,0 + je enduppercase + cmp al,'a' + jb nonmaj + cmp al,'z' + ja nonmaj + sub al,'a'-'A' + mov ds:[si],al +nonmaj: + inc si + jmp uppercaser +enduppercase: + clc + pop ax si + ret + +;Compare le nom ds:si '.' avec es:di +CmpNames: + push ax cx si di + mov cx,8 + repe cmpsb + jne nequal + inc si +nequal: + cmp byte ptr [si-1],'.' + jne trynoext + mov al,' ' + rep scasb + mov cx,3 + rep cmpsb + jne notequal + cmp byte ptr [si],0 + jne notequal + cmp cx,0 + jl notequal +itok: + pop di si cx ax + ret +trynoext: + cmp byte ptr [si-1],0 + jne notequal + jmp itok +notequal: + stc + pop di si cx ax + ret + +;charge le fichier de de groupe CX et de taille eax +LoadWay: + push eax bx dx si di ecx ds es + cmp eax,0 + je Zeroload + rol eax,16 + mov dx,ax + ror eax,16 + div cs:clusterSize + mov bx,ax + cmp bx,1 + jb adjustlast +Loadfat: + call readcluster + jc noway + add di,cs:clusterSize + call getfat + dec bx + jnz loadfat +AdjustLast: + push es di + push cs + pop es + mov di,offset bufferread + mov si,di + call Readcluster + pop di es + jc noway + mov cx,dx + push cs + pop ds + rep movsb +zeroload: + clc + pop es ds ecx di si dx bx eax + ret +noway: + stc + pop es ds ebp di si dx bx eax + ret + +;=============INITDRIVE (Fonction 04H)=============== +;Initialise le lecteur pour une utilisation ultérieure +;-> AH=4 +;<- Flag Carry si erreur +;===================================================== +InitDrive: + push eax bx cx edx di ds es + push cs + pop ds + push cs + pop es + mov cs:lastseg,0 + mov cs:lastoff,0 + mov cs:LastRead,0 + mov ax,myboot.sectorsize + mov bl,myboot.SectorsPerCluster + xor bh,bh + mul bx + mov clustersize,ax + mov bx,myboot.HiddenSectorsL + adc bx,myboot.HiddenSectorsH + mov AdressBoot,bx + add bx,myboot.ReservedSectors + mov AdressFat,bx + xor ax,ax + mov al,myboot.FatsPerDrive + mul myboot.SectorsPerFat + add bx,ax + mov AdressParent,bx + mov AdressDirectory,bx + mov ax,32 + mul myboot.DirectorySize + div myboot.SectorSize + add bx,ax + mov AdressData,bx + sub bx,2 + mov AddingValue,bx + mov ax,myboot.SectorsPerDrive + div myboot.SectorsPerTrack + xor dx,dx + div myboot.HeadsPerDrive + mov TracksPerHead,ax + xor eax,eax + mov ax,myboot.SectorsPerDrive + sub ax,AdressData + mul myboot.SectorSize + shl edx,16 + add edx,eax + mov DriveSize,edx + mov CurrentDir,0 + mov EntryPlace,0 + mov adressdirectory,0 + mov firstsearch,1 + mov currentdirstr,0 + mov di,offset bufferfat + mov dx,myboot.SectorsPerFat + mov cx,AdressFat +SeeFat: + call readsector + jc ErrorInit + add di,myboot.SectorSize + inc cx + dec dx + jnz seefat + clc + pop es ds di edx cx bx eax + ret +ErrorInit: + stc + pop es ds di edx cx bx eax + ret + +;=============FindFirstFile (Fonction 7)============== +;Renvois dans ES:DI un bloc d'info +;-> AH=7 +;<- Flag Carry si erreur +;===================================================== +FindFirstFileZ: + push cx + mov cx,cs:CurrentDir + mov cs:AdressDirectory,cx + xor cx,cx + mov cs:EntryPlace,cx + mov cs:firstsearch,1 + call findnextfileZ + pop cx + ret + +;=============FindnextFile (Fonction 8)============== +;Renvois dans ES:DI un bloc d'info +;-> AH=8 +;<- Flag Carry si erreur +;===================================================== +;fait pointer ds:si sur la prochaine entrée du repertoire courant +FindnextFileZ: + push ax bx cx es di + push cs + pop ds + mov cx,cs:AdressDirectory + mov bx,cs:Entryplace +FindnextFileagain: + cmp cs:firstsearch,1 + je first + add bx,32 + cmp bx,cs:clusterSize + jb nopop +first: + mov di,offset bufferentry + push cs + pop es + mov bx,0 + cmp cs:currentdir,0 + jne notrootdir + cmp cs:firstsearch,1 + je noaddfirst1 + inc cx +noaddfirst1: + add cx,cs:adressparent + mov al,myboot.sectorspercluster +readroot: + call readsector + jc notwell + add di,myboot.sectorsize + dec al + jnz readroot + sub cx,cs:adressparent + jmp nopop +notrootdir: + cmp cs:firstsearch,1 + je noaddfirst2 + call getfat +noaddfirst2: + jc notwell + call readcluster + jc notwell +nopop: + mov cs:firstsearch,0 + mov si,offset bufferentry + add si,bx + cmp byte ptr cs:[si],0 + je notwell + mov cs:entryplace,bx + mov cs:AdressDirectory,cx + cmp byte ptr cs:[si],0E5h + je findnextfileagain + cmp byte ptr cs:[si+fileattr],28h + je findnextfileagain + cmp byte ptr cs:[si+fileattr],0Fh + je findnextfileagain + clc + pop di es cx bx ax + ret +notwell: + stc + pop di es cx bx ax + ret + + +;=============READCLUSTER (Fonction 14)=============== +;Lit le secteur CX et le met en es:di +;-> AH=14 +;<- Flag Carry si erreur +;===================================================== +readcluster: + push ax bx cx dx di + mov ax,cx + mov bl,cs:myboot.sectorspercluster + xor bh,bh + mul bx + mov cx,ax + add cx,cs:addingvalue +readsectors: + call readsector + jc errorreadincluster + add di,cs:myboot.sectorsize + inc cx + dec bl + jnz readsectors + clc + pop di dx cx bx ax + ret +errorreadincluster: + stc + pop di dx cx bx ax + ret + +;=============READSECTOR (Fonction 01H)=============== +;Lit le secteur CX et le met en es:di +;-> AH=1 +;<- Flag Carry si erreur +;===================================================== +ReadSector: + push ax bx cx dx si + cmp cx,cs:lastread + jne gom + mov ax,es + cmp cs:lastseg,ax + jne gom + cmp di,cs:lastoff + jne gom + jmp done +gom: + mov cs:lastseg,ax + mov cs:lastoff,di + mov cs:LastRead,cx + mov ax,cx + xor dx,dx + div cs:myboot.SectorsPerTrack + inc dl + mov bl,dl + xor dx,dx + div cs:myboot.HeadsPerDrive + mov dh,cs:myboot.bootdrive + xchg dl,dh + mov cx,ax + xchg cl,ch + shl cl,6 + or cl,bl + mov bx,di + mov SI,4 + mov AL,1 +TryAgain: + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +Done: + pop si dx cx bx ax +ret + +lastread dw 0 +lastseg dw 0 +lastoff dw 0 + +bufferread equ $ +bufferFat equ $+2048 +bufferentry equ $+2048+2048 +loadinglist equ $+2048+2048+2048 +end start diff --git a/noyau/systeme.ini b/noyau/systeme.ini new file mode 100644 index 0000000..0b7f37e --- /dev/null +++ b/noyau/systeme.ini @@ -0,0 +1,7 @@ +video.sys(47) +horloge.sys(8) +8259a.sys(50) +disque.sys(48) +souris.sys(74) +clavier.sys(9) +heure.sys(8) \ No newline at end of file diff --git a/noyau/video.asm b/noyau/video.asm old mode 100755 new mode 100644 index 48c3e95..a1f3b37 --- a/noyau/video.asm +++ b/noyau/video.asm @@ -1,1560 +1,1821 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: - jmp tsr ;Saute à la routine résidente -names db 'VIDEO' ;Nom drivers -id dw 1234h ;Identifiant drivers -Tsr: - cli ;Désactive interruptions logiciellement - cmp ax,cs:ID ;Compare si test de chargement - jne nomore ;Si pas test alors on continu - rol ax,3*4 ;Rotation de 3 chiffre de l'ID pour montrer que le drivers est chargé - jmp itsok ;On termine l'int avec notre code d'ID preuve du bon chargement de VIDEO -nomore: - cmp ah,maxfunc - jbe noerrorint - stc - jmp itsok - noerrorint: - clc - push bx - mov bl,ah ;On calcule d'aprés le n° de fonction - xor bh,bh ;quel sera l'entrée dans la table indexée - shl bx,1 ;des adresses fonctions. - mov bx,cs:[bx+tables] ;On récupère cette adresse depuis la table - mov cs:current,bx ;On la stocke temporairement pour obtenir les registres d'origine - pop bx - clc - call cs:current ;Puis on execute la fonction -itsok: - push bp - mov bp,sp ;On prend sp dans bp pour adresser la pile - jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ? - or byte ptr [bp+6],1b;Si oui on le retranscrit sur le registre FLAG qui sera dépilé lors du IRET - ;xor eax,eax - ;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique - ;shl eax,4 ;de l'erreur. - ;add ax,cs:current - ;jmp endofint ;on termine l'int -noerror: - and byte ptr [bp+6],0FEh;Si pas d'erreur on efface le Bit CARRY du FLAG qui sera dépilé lors du IRET -endofint: - pop bp - sti ;On réactive les interruptions logiciellement - iret ;Puis on retourne au programme appelant. - -current dw 0 ;Mot temporaire qui contient l'adresse de la fonction appelée -tables dw setvideomode ;Table qui contient les adresses de toutes les fonctions de VIDEO (WORD) - dw getvideomode - dw clearscreen - dw setfont - dw loadfont - dw showspace - dw showline - dw showchar - dw showint - dw showsigned - dw showhex - dw showbin - dw showstring - dw showstring0 - dw showcharat - dw showintat - dw showsignedat - dw showhexat - dw showbinat - dw showstringat - dw showstring0at - dw setcolor - dw getcolor - dw scrolldown - dw getxy - dw setxy2 - dw savescreen - dw restorescreen - dw page2to1 - dw page1to2 - dw xchgPages - dw savepage1 - dw changelineattr - dw waitretrace - dw getvgainfos - dw loadbmppalet - dw showbmp - dw viewbmp - dw savedac - dw restoredac - dw savestate - dw restorestate - dw enablescroll - dw disablescroll - -;================================Table des modes videos (64 BYTES) ============================================ -;40*25 16 couleurs -mode0 DB 67H,00H, 03H,08H,03H,00H,02H - DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,01FH,00H,4FH,0DH,0EH,00H,00H,00H,00H - DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,08H,00H - DB 40,25 - -;80*25 16 couleurs -mode1 DB 67H,00H, 03H,00H,03H,00H,02H - DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0DH,0EH,00H,00H,00H,00H - DB 9CH,0EH,8FH,28H,1FH,96H,0B9H,0A3h,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,08H,00H - DB 80,25 - -;80*50 16 couleurs -mode2 DB 63H, 00H, 03H,01H,03H,01H,02H - DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H - DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,00H,00H - DB 80,50 - -;100*50 16 couleurs -mode3 DB 067H,00H,03H,01H,03H,01H,02H - DB 70H,63H,64H,85H,68H,84H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H - DB 00H,9Ch,08EH,8FH,32H,1FH,96H,0B9H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,00H,00H - DB 100,50 - -;100*60 16 couleurs -mode4 DB 0A7H,00H,03H,01H,03H,01H,02H - DB 70H,63H,64H,85H,68H,84H,0FFH,1FH,00H,47H,06H,07H,00H,00H,00H - DB 00H,0E7H,8EH,0DFH,32H,1FH,0DFH,0E5H,0A3H,0FFH - DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH - DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH - DB 0CH,00H,0FH,00H,00H - DB 100,60 - -;320*200 256 couleurs -mode5 DB 63H, 00H, 03H,01H,0FH,00H,06H - DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H - DB 9CH,0EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH - DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - DB 40,25 - -;320*400 256 couleurs -mode6 DB 063H, 00H, 03H,01H,0FH,00H,06H - DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H - DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH - DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - DB 40,50 - -;320*480 256 couleurs -mode7 DB 0E3H, 00H, 03H,01H,0FH,00H,06H - DB 5FH,4FH,50H,82H,54H,80H,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,00H - DB 0EAH,0ACH,0DFH,28H,00H,0E7H,06H,0E3H,0FFH - DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04h,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - DB 40,60 - -;360*480 256 couleurs -mode8 DB 0E7H, 00H, 03H,01H,0FH,00H,06H - DB 6BH,59H,5AH,8EH,5EH,8AH,0DH,3EH,00H,40H,00H,00H,00H,00H,00H,00H - DB 0EAH,0ACH,0DFH,2DH,00H,0E7H,06H,0E3H,0FFH - DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04h,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - DB 45,60 - -;400*600 256 couleurs -mode9 DB 0E7H, 00H, 03H,01H,0FH,00H,06H - DB 74h,63h,64h,97h,68h,95h,86h,0F0h,00h,60h,00h,00h,00h,00h,00h,00h - DB 5Bh,8Dh,57h,32h,00h,60h,80h,0E3h,0FFh - DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH - DB 00H,01H,02H,03H,04h,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH - DB 41H,00H,0FH,00H,00H - DB 50,75 - -DATABLOCKSIZE equ 40 -DATABLOCK equ $ -;============================================DATABLOCK========================================================= -lines db 0 -columns db 0 -x db 0 -y db 0 -xy dw 0 -colors db 7 -mode db 0FFh -pagesize dw 0 -pages db 0 -font db 0 -graphic db 0 -xg dw 0 -yg dw 0 -style dw 0 -nbpage db 0 -pagesshowed db 0 -plane db 0 -xyg dw 0 -linesize dw 0 -adress dw 0 -base dw 0 -scrolling db 1 - -;=======================================Equivalence pour la clarté du code======================================== -Sequencer equ 03C4h -misc equ 03C2h -CCRT equ 03D4h -Attribs equ 03C0h -graphics equ 03CEh -statut equ 03DAh - -maxfunc equ 43 -maxmode equ 9 -planesize equ 64000 -;============================================Fonctions de l'int VIDEO=========================================== - -;=============ENABLESCROLLING (Fonction 02AH)========= -;Autorise le d‚filement -;-> AH=42 -;<- -;===================================================== - EnableScroll: - mov cs:scrolling,1 - ret - -;=============DISABLESCROLLING (Fonction 2Bh)========= -;D‚sactive le d‚filement -;-> AH=43 -;<- -;==============================================x======= -DisableScroll: - mov cs:scrolling,0 - ret - -;=============SetVideoMode (Fonction 00h)========= -;Fixe le mode vidéo courant a AL -;-> AH=0, AL mode d'écran -;<- Carry if error -;================================================= -setvideomode: - push ax cx dx di - cmp al,maxmode - ja errorsetvideomode - cmp cs:mode,0FFh - jne noinit - call initvideo -noinit: - mov cs:mode,al - xor ah,ah - mov di,ax - shl di,6 - add di,offset mode0 - mov dx,misc - mov al,cs:[di] - out dx,al - inc di - mov dx,statut - mov al,cs:[di] - out dx,al - inc di - mov dx,sequencer - xor ax,ax -initsequencer: - mov ah,cs:[di] - out dx,ax - inc al - inc di - cmp al,4 - jbe initsequencer - mov ax,0E11h - mov dx,ccrt - out dx,ax - xor ax,ax -initcrt: - mov ah,cs:[di] - out dx,ax - inc al - inc di - cmp al,24 - jbe initcrt - mov dx,graphics - xor ax,ax -initgraphic: - mov ah,cs:[di] - out dx,ax - inc al - inc di - cmp al,8 - jbe initgraphic - mov dx,statut - in al,dx - mov dx,attribs - xor ax,ax -initattribs: - mov ah,cs:[di] - push ax - in ax,dx - pop ax - out dx,al - xchg ah,al - out dx,al - xchg ah,al - inc al - inc di - cmp al,20 - jbe initattribs - mov al,20h - out dx,al - mov al,cs:[di] - mov cs:columns,al - mov ah,cs:[di+1] - mov cs:lines,ah - mul ah - shl ax,1 - cmp cs:mode,5 - setae cs:graphics - jb istext - shl ax,3 -istext: - mov cs:pagesize,ax - mov ax,planesize - xor dx,dx - div cs:pagesize - mov cs:nbpage,al - mov al,cs:[di-36] - xor ah,ah - shl ax,2 - mov cl,cs:graphics - shr ax,cl - mov cs:linesize,ax - mov ax,cs:[di-43] - mov cs:adress,ax - mov cs:base,ax - mov cs:pages,0 - pop di dx cx ax - ret -errorsetvideomode: - pop di dx cx ax - ret - -initvideo: - push bx cx si ds -;xor bx,bx -;mov ds,bx -;lds si,ds:[43h*4] - push cs - pop ds - mov si,offset font8x8 - mov cl,8 - mov bl,1 - call loadfont - mov cs:pagesize,64000 - call clearscreen - pop ds si cx bx - ret - -;=============GetVideoMode (Fonction 01h)========= -;Renvoie le mode vidéo courant dans AL -;-> AH=1 -;<- AL mode d'écran -;================================================= -getvideomode: - mov al,cs:mode - ret - -;=============CLEARSCREEN (Fonction 02h)========= -;Efface l'ecran graphique ou texte -;-> AH=2 -;<- -;================================================ -clearscreen: - push eax cx dx di es - mov cx,cs:pagesize - mov di,cs:adress - shr cx,2 - cmp byte ptr cs:graphics,1 - jne erasetext - mov ax,0A000h - mov es,ax -erasegraph: - mov ah,0 -gogot: - push ax cx - mov cl,ah - mov ah,1 - shl ah,cl - mov al,2 - mov dx,sequencer - out dx,ax - pop cx ax - push si di cx eax - mov eax,00000000h - rep stosd - pop eax cx di si - inc ah - cmp ah,3 - jbe gogot - jmp enderase -erasetext: - mov ax,0B800h - mov es,ax - mov eax,07200720h - cld - rep stosd -enderase: - mov cs:x,0 - mov cs:y,0 - mov cs:xg,0 - mov cs:yg,0 - mov cs:xy,0 - mov cs:xyg,0 - mov cs:plane,0 - pop es di dx cx eax - ret - - -;=============SetFont (Fonction 03h)========= -;Active la font cl parmi les 8 -;-> AH=3, CL n° font -;<- Carry if error -;============================================ -setfont: - push ax cx dx - cmp cl,7 - ja errorsetfont - mov cs:font,cl - mov ah,cl - and cl,11b - and ah,0100b - shl ah,2 - add ah,cl - mov dx,sequencer - mov al,3 - out dx,ax - pop dx cx ax - ret -errorsetfont: - pop dx cx ax - ret - -;=============GetFont (Fonction 0xh)========= -;Récupère le n° de la font active -;-> AH=x -;<- CL n° font, Carry if error -;============================================ -Getfont: - push ax cx dx - cmp cl,7 - ja errorgetfont - mov cs:font,cl - mov ah,cl - and cl,11b - and ah,0100b - shl ah,2 - add ah,cl - mov dx,sequencer - mov al,3 - out dx,ax - pop dx cx ax - ret -errorgetfont: - stc - pop dx cx ax - ret - -;=============LoadFont (Fonction 04h)========== -;Charge une police pointée par ds:si dans la carte vidéo sous n°font BL, taille police dans CL -;-> AH=4, BL n°font, DS:SI pointeur vers Font, CL taille police -;<- Carry if error -;=========================================== -loadfont: - push ax bx cx dx si di es - cmp bl,7 - ja errorloadfont - xor di,di - cli - mov dx,sequencer -doseq: - mov ax,cs:[di+offset reg1] - out dx,ax - inc di - inc di - cmp di,6 - jbe doseq - mov dx,graphics -doseq2: - mov ax,cs:[di+offset reg1] - out dx,ax - inc di - inc di - cmp di,6+6 - jbe doseq2 - sti - mov ax,0A000h - mov es,ax - mov dx,256 - mov al,0 - xor bh,bh - cmp bl,4 - jb isless - sub bl,4 - shl bl,1 - inc bl - jmp okmake -isless: - shl bl,1 -okmake: - mov di,bx - shl di,13 - mov bh,cl - mov bl,cl - sub bl,32 - neg bl - xor cx,cx - cld -popz: - mov cl,bh - rep movsb - mov cl,bl - rep stosb - dec dx - jnz popz - xor di,di - mov dx,sequencer -doseqs: - mov ax,cs:[di+offset reg2] - out dx,ax - inc di - inc di - cmp di,6 - jbe doseqs - mov dx,graphics -doseqs2: - mov ax,cs:[di+offset reg2] - out dx,ax - inc di - inc di - cmp di,6+6 - jbe doseqs2 - pop es di si dx cx bx ax - ret -errorloadfont: - stc - pop es di si dx cx bx ax - ret -reg2 dw 0100h, 0302h, 0304h, 0300h - dw 0004h, 1005h, 0E06h -reg1 dw 0100h, 0402h, 0704h, 0300h - dw 0204h, 0005h, 0406h - -;==========SHOWSPACE (Fonction 05h)=========== -;met un espace aprés le curseur -;-> AH=5 -;<- -;============================================= -showspace: - push cx - mov cl,' ' - mov ch,cs:colors - call charout - clc - pop cx - ret - -;==========SHOWLINE (Fonction 06h)=============== -;remet le curseur text a la ligne avec un retour chariot -;-> AH=6 -;<- -;================================================ -showline: - push bx cx - mov bl,cs:y - xor bh,bh - mov cl,cs:lines - sub cl,2 - cmp bl,cl - jne scro - dec bl - mov cx,1 - cmp byte ptr cs:graphics,0 - je okscro - mov cx,8 -okscro: - call scrolldown -scro: - inc bl - call setxy2 - pop cx bx - ret - -;==========SHOWCHAR (Fonction 07h)=========== -;met un caractère de code ASCII DL aprés le curseur -;-> AH=7, DL code ASCII du caractère -;<- -;============================================ -showchar: - push cx - mov cl,dl - mov ch,cs:colors - call charout - pop cx - ret - -;==========SHOWINT (Fonction 08h)=========== -;Affiche un entier EDX aprés le curseur -;-> AH=8, EDX un entier -;<- -;=========================================== -ShowInt: - push eax bx cx edx esi - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint: - xor edx,edx - div esi - add dl,'0' - inc cx - mov cs:[bx],dl - dec bx - cmp ax,0 - jne decint - mov ax,cx - mov ch,cs:colors -showinteger: - inc bx - mov cl,cs:[bx] - call charout - dec ax - jnz showinteger - pop esi edx cx bx eax - ret - -showbuffer db 35 dup (0FFh) - -;==========SHOWSIGNED (Fonction 09h)=========== -;Affiche un entier EDX de taille CX aprés le curseur -;-> AH=9, EDX un entier, CX la taille -;<- -;============================================== -Showsigned: - push ebx edx - mov ebx,edx - xor edx,edx - cmp cx,8 - ja signed16 - mov dl,bl - cmp dl,7Fh - jbe notsigned - neg dl - jmp showminus -signed16: - cmp cx,16 - ja signed32 - mov dx,bx - cmp dx,7FFFh - jbe notsigned - neg dx - jmp showminus -signed32: - mov edx,ebx - cmp edx,7FFFFFFFh - jbe notsigned - neg edx -showminus: - push dx - mov dl,'-' - call showchar - pop dx -notsigned: - call showint - pop edx ebx - ret - -;==========SHOWHEX (Fonction 0Ah)=========== -;Affiche un nombre hexadécimal EDX de taille CX aprés le curseur -;-> AH=10, EDX un entier, CX la taille -;<- -;=========================================== -ShowHex: - push ax bx cx edx - mov ax,cx - shr ax,2 - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors -Hexaize: - rol edx,4 - mov bx,dx - and bx,0fh - mov cl,cs:[bx+offset Tab] - call charout - dec al - jnz Hexaize - pop edx cx bx ax - ret -Tab db '0123456789ABCDEF' - -;==========SHOWBIN (Fonction 0Bh)=========== -;Affiche un nombre binaire EDX de taille CX aprés le curseur -;-> AH=11, EDX un entier, CX la taille -;<- -;=========================================== -Showbin: - push ax cx edx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors -binaize: - rol edx,1 - mov cl,'0' - adc cl,0 - call charout - dec al - jnz binaize - pop edx cx ax - ret - -;==========SHOWBCD (Fonction 0xh)=========== -;Affiche un nombre en BCD EDX de taille CX aprés le curseur -;-> AH=x, EDX un entier, CX la taille -;<- -;=========================================== -ShowBCD: - push ax cx edx - mov ax,cx - shr ax,2 - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors -BCDaize: - rol edx,4 - mov cl,dl - and cl,0fh - add cl,'0' - call charout - dec al - jnz BCDaize - pop edx cx ax - ret - -;==========SHOWSTRING (Fonction 0Ch)=========== -;Affiche une chaine de caractère pointée par DS:SI aprés le curseur -;-> AH=12, DS:SI pointeur chaine type pascal -;<- -;============================================== -showstring: - push bx cx si - mov bl,[si] - mov ch,cs:colors -strinaize: - inc si - mov cl,[si] - call charout - dec bl - jnz strinaize - pop si cx bx - ret - -;==========SHOWSTRING0 (Fonction 0Dh)=========== -;Affiche une chaine de caractère pointée par DS:SI aprés le curseur -;-> AH=13, DS:SI pointeur chaine type zéro terminal -;<- -;=============================================== -showstring0: - push cx si - mov ch,cs:colors -strinaize0: - mov cl,[si] - cmp cl,0 - je no0 - call charout - inc si - jmp strinaize0 -no0: - pop si cx - ret - -;==========SHOWCHARAT (Fonction 0Eh)=========== -;met un caractère de code ASCII DL en (x;y) (BH;BL) -;-> AH=14, DL code ASCII du caractère, BH coordonnées x, BL coordonnées y -;<- -;============================================== -showcharat: - push es di - call setxy - call showchar - pop di es - ret - -;==========SHOWINTAT (Fonction 0Fh)=========== -;Affiche un entier EDX en (x;y) (BH;BL) -;-> AH=15, EDX entier, BH coordonnées x, BL coordonnées y -;<- -;============================================== -showintat: - push es di - call setxy - call showint - pop di es - ret - -;==========SHOWSIGNEDAT (Fonction 10h)=========== -;Affiche un entier EDX de taille CX aprés le curseur en (x;y) (BH;BL) -;-> AH=16, EDX entier, BH coordonnées x, BL coordonnées y -;<- -;============================================== -showsignedat: - push es di - call setxy - call showsigned - pop di es - ret - -;==========SHOWHEXAT (Fonction 11h)=========== -;Affiche un nombre hexadécimal EDX de taille CX en (x;y) (BH;BL) -;-> AH=17, EDX un entier, CX la taille, BH coordonnées x, BL coordonnées y -;<- -;============================================== -showhexat: - push es di - call setxy - call showhex - pop di es - ret - -;==========SHOWBINAT (Fonction 012h)=========== -;Affiche un nombre binaire EDX de taille CX en (x;y) (BH;BL) -;-> AH=18, EDX un entier, CX la taille, BH coordonnées x, BL coordonnées y -;<- -;============================================= -showbinat: - push es di - call setxy - call showbin - pop di es - ret - -;==========SHOWSTRINGAT (Fonction 13h)=========== -;Affiche une chaine de caractère pointée par DS:SI en (x;y) (BH;BL) -;-> AH=19, DS:SI pointeur chaine type pascal, BH coordonnées x, BL coordonnées y -;<- -;================================================ -showstringat: - push es di - call setxy - call showstring - pop di es - ret - -;==========SHOWSTRING0AT (Fonction 14h)=========== -;Affiche une chaine de caractère pointée par DS:SI en (x;y) (BH;BL) -;-> AH=20, DS:SI pointeur chaine type zéro terminal, BH coordonnées x, BL coordonnées y -;<- -;================================================= -showstring0at: - push es di - call setxy - call showstring0 - pop di es - ret - -;==========SETCOLOR (Fonction 15h)========= -;Change les attributs du texte a CL -;-> AH=21 ,CL couleur -;<- -;========================================= -setcolor: - mov cs:colors,CL - ret - -;==========GETCOLOR (Fonction 16h)========= -;Récupère les attributs du texte dans CL -;-> AH=22 -;<- CL couleur -;========================================= -getcolor: - mov cl,cs:colors - ret - -;==========SETSTYLE (Fonction xh)========= -;Change le style du texte a CL -;-> AH=x ,CX style -;<- -;========================================= -setstyle: - mov cs:style,CX - ret - -;==========GETSTYLE (Fonction xh)========= -;Récupère le style du texte dans CL -;-> AH=x -;<- CX style -;========================================= -getstyle: - mov cx,cs:style - ret - -;==========SCROLLDOWN (Fonction 17h)========= -;defile de cx lines vers le bas -;-> AH=23, CX lines à défiler vers le bas -;<- -;============================= -scrolldown: - push ax cx dx si di ds es - cmp cs:scrolling,0 - je graphp - mov ax,cx - mul cs:linesize - mov si,ax - mov cx,cs:pagesize - sub cx,si - mov di,cs:adress - cld - cmp byte ptr cs:graphics,1 - jne textp - mov ax,0A000h - mov es,ax - mov ds,ax - shr cx,2 -transfert: - mov ah,0 -gogo: - push ax cx - mov cl,ah - mov ah,1 - shl ah,cl - mov al,2 - mov dx,sequencer - out dx,ax - pop cx ax - mov al,4 - mov dx,graphics - out dx,ax - push si di cx - rep movsd - pop cx di si - inc ah - cmp ah,3 - jbe gogo - jmp graphp -textp: - mov ax,0B800h - mov es,ax - mov ds,ax - rep movsb -graphp: - pop es ds di si dx cx ax - ret - -;==========GETXY (Fonction 18h)========= -;Change les coordonnées du curseur a X:BH,Y:BL -;-> AH=24 -;<- BH coordonnées x, BL coordonnées y -;============================= -getxy: - mov bh,cs:x - mov bl,cs:y - ret - -;==========SETXY (Fonction 19h)========= -;Change les coordonnées du curseur a X:BH,Y:BL -;-> AH=25, BH coordonnées x, BL coordonnées y -;<- -;===================================== -setxy: - push ax bx cx dx - mov cs:x,bh - mov cs:y,bl - mov al,bl - mov bl,bh - xor bh,bh - mov di,cs:adress - add di,bx - mul cs:columns - add di,ax - shl di,1 - mov cs:xy,di - cmp byte ptr cs:graphics,1 - jne oktext - mov bl,cs:x - mov cl,cs:y - xor bh,bh - xor ch,ch - shl bx,3 - shl cx,3 - call setxyg - jmp endofsetxy -oktext: - mov ax,0B800h - mov es,ax -endofsetxy: - pop dx cx bx ax - ret - -setxy2: - push es di - call setxy - pop di es - ret - -;==========SETXYG (Fonction 0xh)========= -;Change les coordonnées du curseur graphique a X:BX,Y:CX -;-> AH=x, BX coordonnées x, CX coordonnées y -;<- ES:DI pointeur sur pixel avec plan de bit ajusté -;====================================== -setxyg: - push ax bx cx dx - mov cs:xg,bx - mov cs:yg,cx - mov ax,cx - mov cl,bl - mul cs:linesize - shr bx,2 - add ax,bx - mov di,ax - and cl,3 - mov ah,1 - shl ah,cl - mov al,2 - mov dx, 3c4h - out dx,ax - mov cs:plane,cl - mov cs:xyg,di - mov ax,0A000h - mov es,ax - pop dx cx bx ax - ret - -;==========SHOWPIXEL (Fonction 0xh)========= -;Affiche un pixel de couleur AL en X:BX,Y:CX -;-> AH=x, BX coordonnées x, CX coordonnées y, AL couleur -;<- -;========================================= -showpixel: - push ax bx cx dx di bp es - mov bp,ax - mov ax,cx - mov cl,bl - mul cs:linesize - shr bx,2 - add ax,bx - mov di,ax - add di,cs:adress - and cl,3 - mov ah,1 - shl ah,cl - mov al,2 - mov dx,sequencer - out dx,ax - mov bx,0A000h - mov es,bx - mov ax,bp - mov es:[di],al - pop es bp di dx cx bx ax - ret - -;==========SHOWPIXEL (Fonction 0xh)========= -;Récupère en al la couleur du pixel de coordonnées X:BX,Y:CX -;-> AH=x, BX coordonnées x, CX coordonnées y, AL couleur -;<- -;========================================= -getpixel: - push ax bx cx dx di bp es - mov bp,ax - mov ax,cx - mov cl,bl - mul cs:linesize - shr bx,2 - add ax,bx - mov di,ax - add di,cs:adress - and cl,3 - mov ah,cl - mov al,4 - mov dx,graphics - out dx,ax - mov bx,0A000h - mov es,bx - mov ax,bp - - mov al,es:[di] - pop es bp di dx cx bx ax - ret - -;==========LOADBMPPALET (Fonction 0xh)========= -;Charge la palette du BMP pointée par DS:SI -;-> AH=x, DS:SI BMP -;<- -;============================================= -loadbmppalet: - push ax bx cx dx - mov bx,0400h+36h-4 - mov cx,100h - mov dx, 3c8h -paletteload: - mov al, cl - dec al - out dx, al - inc dx - mov al,[bx+si+2] - shr al,2 - out dx, al - mov al,[bx+si+1] - shr al,2 - out dx, al - mov al,[bx+si] - shr al,2 - out dx, al - sub bx,4 - dec dx - dec cl - jnz paletteload - pop dx cx bx ax - ret - -;==========VIEWBMP (Fonction 0xh)========= -;Affiche le BMP pointée par DS:SI en X:BX, Y:CX avec la préparation de la palette -;<- AH=x, DS:SI BMP, BX coordonnées X, CX coordonnées Y -;-> -;========================================= -viewbmp: - call loadbmppalet - call showbmp - ret - -;==========SHOWBMP (Fonction 0xh)========= -;Affiche le BMP pointée par DS:SI en X:BX, Y:CX -;<- AH=x, DS:SI BMP, BX coordonnées X, CX coordonnées Y -;-> -;========================================= -showbmp: - push ax bx cx dx - mov cs:xc,bx - mov cs:yc,cx - xor cx,cx - xor bx,bx - xor dx,dx -bouclette: - mov al,[si+bx+436h] - push bx cx - sub cx,cs:yc - neg cx - mov bx,dx - add bx,cs:xc - call showpixel - pop cx bx - inc bx - inc dx - cmp dx,[si+offset BMP_width] - jb bouclette - xor dx,dx - inc cx - cmp cx,[si+offset BMP_height] - jb bouclette - pop dx cx bx ax - ret -xc dw 0 -yc dw 0 - -;==========GETVGAINFO (Fonction 0xh)========= -;Renvoie un bloc de donnée en ES:DI sur l'état de la carte graphique -;<- AH=x, ES:DI pointeur -;-> -;============================================= -Getvgainfos: - push cx si di ds - push cs - pop ds - mov cx,datablocksize - mov si,offset datablock - cld - rep movsb - pop ds di si cx - ret - -;==========WAITRETRACE (Fonction 0xh)========= -;Synchronisation avec la retrace verticale -;<- AH=x -;-> -;============================================= -waitretrace: - push ax dx - mov dx,3DAh -waitr: - in al,dx - test al,8 - jz waitr - pop dx ax - ret - -;Ecrit le caractère ASCII CL attribut CH aprés le curseur, en le mettant à jours -charout: - push ax bx cx dx di es - cmp byte ptr cs:graphics,1 - jne textaccess - mov dx,cx - mov di,dx - and di,11111111b - shl di,3 - add di,offset font8x8 - xor bx,bx - xor cx,cx - mov ah,cs:[di] -bouclet: - mov al,dh - rol ah,1 - jc colored - shr al,4 - bt word ptr cs:style,0 - jc transparent -colored: - and al,1111b - push bx cx - add cx,cs:yg - add bx,cs:xg - call showpixel - pop cx bx -transparent: - inc bx - cmp bx,8 - jb bouclet - xor bx,bx - inc di - mov ah,cs:[di] - inc cx - cmp cx,8 - jb bouclet - add cs:xg,8 - mov cx,cs:linesize - shl cx,2 - cmp cs:xg,cx - jb adjusttext - mov cs:xg,0 - add cs:yg,8 - jmp adjusttext -textaccess: - mov ax,0B800h - mov es,ax - mov di,cs:xy - mov es:[di],cx - add cs:xy,2 -adjusttext: - inc cs:x - mov cl,cs:columns - cmp cs:x,cl - jb noadjusted - call showline -noadjusted: - ;mov dx,3D4h - ;mov al,0Eh - ;mov di,offset xy - ;mov ah,cs:[di] - ;out dx,ax - ;mov ah,cs:[di+1] - ;dec al - ;out dx,ax - pop es di dx cx bx ax - ret - - - - - - -;===================================sauve l'ecran rapidement================ -SaveScreen: - push cx si di ds es - mov cx,0B800H - mov ds,cx - push cs - pop es - mov cx,cs:pagesize - shr cx,2 - xor si,si - mov di,offset Copy2 - cld - rep movsd - pop es ds di si cx - ret - -;===================================sauve l'ecran rapidement en es:di================ -SaveScreento: - push cx si di ds - mov cx,0B800H - mov ds,cx - mov cx,cs:pagesize - shr cx,2 - xor si,si - cld - rep movsd - pop ds di si cx - ret - -;===================================sauve l'ecran rapidement================ -Savepage1: - push cx si di ds es - mov cx,0B800H - mov ds,cx - push cs - pop es - mov cx,cs:pagesize - shr cx,2 - xor si,si - mov di,offset Copy - cld - rep movsd - pop es ds di si cx - ret - -;===================================sauve l'ecran rapidement================ -RestoreScreen: - push cx si di ds es - mov cx,0B800H - mov es,cx - push cs - pop ds - mov cx,cs:pagesize - shr cx,2 - mov si,offset Copy2 - xor di,di - cld - rep movsd - pop es ds di si cx - ret - -;===================================restore l'ecran rapidement de ds:si================ -RestoreScreenfrom: - push cx si di ds es - mov cx,0B800H - mov es,cx - mov cx,cs:pagesize - shr cx,2 - xor di,di - cld - rep movsd - pop es ds di si cx - ret - -;===============================Page2to1============================ -Page2to1: - push cx si di ds es - mov cx,0B800H - mov es,cx - mov ds,cx - mov cx,cs:pagesize - shr cx,2 - mov si,4000 - xor di,di - cld - rep movsd - pop es ds di si cx - ret - -;===============================Page1to2============================ -Page1to2: - push cx si di ds es - mov cx,0B800H - mov es,cx - mov ds,cx - mov cx,cs:pagesize - shr cx,2 - mov di,4000 - xor si,si - cld - rep movsd - pop ds es di si cx - ret - -;===============================xchgPages============================ -xchgPages: - push cx si di ds es - call savepage1 - call page2to1 - mov cx,0B800H - mov es,cx - push cs - pop ds - mov cx,cs:pagesize - shr cx,2 - mov si,offset Copy - mov di,4000 - rep movsd - pop es ds di si cx - ret - -;Sauve l'‚tat de la carte en es:di -savestate: -push cx si di ds -push cs -pop ds -mov cx,datablocksize -mov si,offset lines -cld -rep movsb -call savescreento -pop ds di si cx -ret - -;R‚cupŠre l'‚tat de la carte en ds:si -restorestate: -push ax cx si di es -mov al,[si+7] -cmp cs:mode,al -je nochangemode -mov ah,0 -call setvideomode -nochangemode: -push cs -pop es -mov cx,datablocksize -mov di,offset lines -cld -rep movsb -call restorescreenfrom -pop es di si cx ax -ret - -;sauve le DAC -savedac: -push ax cx dx di -mov dx,3C7h -xor ax,ax -out dx,al -mov cx,256*3 -inc dx -inc dx -mov di,offset dac -save: -in al,dx -mov cs:[di],al -inc di -dec cx -jne save -pop di dx cx ax -ret - -;restore le DAC -restoredac: -push ax cx dx si -xor ax,ax -cli -mov dx,3DAh -in al,dx -mov dx,0 -out dx,al -mov dx,3C8h -out dx,al -mov cx,256*3 -mov si,offset dac -save2: -mov al,cs:[si] -inc si -out dx,al -dec cx -jne save2 -mov dx,3DAh -in al,dx -mov dx,32 -out dx,al -pop si dx cx ax -ret - -;couleur al pour ligne di -changelineattr: -push ax bx di es -mov bx,ax -mov ax,0B800h -mov es,ax -mov ax,di -mul cs:columns -mov di,ax -shl di,1 -mov al,cs:columns -inc di -popep: -mov es:[di],bl -add di,2 -dec al -jnz popep -pop es di bx ax -ret - - - - - - - - - - - - - - - - -BMP_File struc -BMP_FileType db 'BM' -BMP_FileSize dd ? ; taille du fichier -BMP_Reserved dd 0 ; toujours 0 -BMP_BitMapOffset dd ? ; offset de l'image -BMP_HeaderSize dd ? ; taille de l'entete en octects -BMP_Width dd ? ; largeur en pixels de l'image -BMP_Height dd ? ; hauteur en pixels de l'image -BMP_Planes dw 1 ; nombre de plan utilisés -BMP_BitsPerPixel dw ? ; nombre de bits par pixels -BMP_Compression dd ? ; méthode de compression -BMP_SizeOfBitMap dd ? ; taille de l'image en octects -BMP_HorzResolution dd ? ; resolution horizontale en pixels par mètre -BMP_VertResolution dd ? ; resolution verticale en pixels par mètre -BMP_ColorsUsed dd ? ; nombre de couleur dans la palette si 0: palette entière si BitPerPixel<=8 -BMP_ColorsImportant dd ? ; nombre de couleurs importantes masques pour les modes de plus de 8 bits par pixels -BMP_RedMask dd ? -BMP_GreenMask dd ? -BMP_BlueMask dd ? -BMP_AlphaMask dd ? -BMP_ColorSpaceType dd ? -BMP_RedX dd ? -BMP_RedY dd ? -BMP_RedZ dd ? -BMP_GreenX dd ? -BMP_GreenY dd ? -BMP_GreenZ dd ? -BMP_BlueX dd ? -BMP_BlueY dd ? -BMP_BlueZ dd ? -BMP_GammaRed dd ? -BMP_GammaGreen dd ? -BMP_GammeBlue dd ? -BMP_file ends - -;BMP_Compression peut prendre les valeurs suivantes: -BMP_COMP_UNCOMP equ 0 ; pas de compression -BMP_COMP_RLE8 equ 1 ; 8-bit run length encoding -BMP_COMP_RLE4 equ 2 ; 4-bit tun length encoding -BMP_COMP_BFE equ 3 ; bitfields encoding - - -font8x8 equ $ -copy equ $+3000 -copy2 equ $+8000 -dac equ $+16000 -end start +.model tiny +.486 +smart +.code + +org 0100h + +include ..\include\bmp.h + +start: + jmp tsr ;Saute à la routine résidente +names db 'VIDEO' ;Nom drivers +id dw 1234h ;Identifiant drivers +Tsr: + cli ;Désactive interruptions logiciellement + cmp ax,cs:ID ;Compare si test de chargement + jne nomore ;Si pas test alors on continu + rol ax,3*4 ;Rotation de 3 chiffre de l'ID pour montrer que le drivers est chargé + jmp itsok ;On termine l'int avec notre code d'ID preuve du bon chargement de VIDEO +nomore: + cmp ah,maxfunc + jbe noerrorint + stc + jmp itsok + noerrorint: + clc + push bx + mov bl,ah ;On calcule d'aprés le n° de fonction + xor bh,bh ;quel sera l'entrée dans la table indexée + shl bx,1 ;des adresses fonctions. + mov bx,cs:[bx+tables] ;On récupère cette adresse depuis la table + mov cs:current,bx ;On la stocke temporairement pour obtenir les registres d'origine + pop bx + clc + call cs:current ;Puis on execute la fonction +itsok: + push bp + mov bp,sp ;On prend sp dans bp pour adresser la pile + jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ? + or byte ptr [bp+6],1b;Si oui on le retranscrit sur le registre FLAG qui sera dépilé lors du IRET + ;xor eax,eax + ;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique + ;shl eax,4 ;de l'erreur. + ;add ax,cs:current + ;jmp endofint ;on termine l'int +noerror: + and byte ptr [bp+6],0FEh;Si pas d'erreur on efface le Bit CARRY du FLAG qui sera dépilé lors du IRET +endofint: + pop bp + sti ;On réactive les interruptions logiciellement + iret ;Puis on retourne au programme appelant. + +current dw 0 ;Mot temporaire qui contient l'adresse de la fonction appelée +tables dw setvideomode ;Table qui contient les adresses de toutes les fonctions de VIDEO (WORD) + dw getvideomode + dw clearscreen + dw setfont + dw loadfont + dw showspace + dw showline + dw showchar + dw showint + dw showsigned + dw showhex + dw showbin + dw showstring + dw showstring0 + dw showcharat + dw showintat + dw showsignedat + dw showhexat + dw showbinat + dw showstringat + dw showstring0at + dw setcolor + dw getcolor + dw scrolldown + dw getxy + dw setxy2 + dw savescreen + dw restorescreen + dw page2to1 + dw page1to2 + dw xchgPages + dw savepage1 + dw changelineattr + dw waitretrace + dw getvgainfos + dw loadbmppalet + dw showbmp + dw viewbmp + dw savedac + dw restoredac + dw savestate + dw restorestate + dw enablescroll + dw disablescroll + dw showdate + dw showtime + dw showname + dw showattr + dw showsize + +;================================Table des modes videos (64 BYTES) ============================================ +;40*25 16 couleurs +mode0 DB 67H,00H, 03H,08H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,01FH,00H,4FH,0DH,0EH,00H,00H,00H,00H + DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H + DB 40,25 + +;80*25 16 couleurs +mode1 DB 67H,00H, 03H,00H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0DH,0EH,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,1FH,96H,0B9H,0A3h,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H + DB 80,25 + +;80*50 16 couleurs +mode2 DB 63H, 00H, 03H,01H,03H,01H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + DB 80,50 + +;100*50 16 couleurs +mode3 DB 067H,00H,03H,01H,03H,01H,02H + DB 70H,63H,64H,85H,68H,84H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,9Ch,08EH,8FH,32H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + DB 100,50 + +;100*60 16 couleurs +mode4 DB 0A7H,00H,03H,01H,03H,01H,02H + DB 70H,63H,64H,85H,68H,84H,0FFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,0E7H,8EH,0DFH,32H,1FH,0DFH,0E5H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + DB 100,60 + +;320*200 256 couleurs +mode5 DB 63H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + DB 40,25 + +;320*400 256 couleurs +mode6 DB 063H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H + DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + DB 40,50 + +;320*480 256 couleurs +mode7 DB 0E3H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,00H + DB 0EAH,0ACH,0DFH,28H,00H,0E7H,06H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04h,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + DB 40,60 + +;360*480 256 couleurs +mode8 DB 0E7H, 00H, 03H,01H,0FH,00H,06H + DB 6BH,59H,5AH,8EH,5EH,8AH,0DH,3EH,00H,40H,00H,00H,00H,00H,00H,00H + DB 0EAH,0ACH,0DFH,2DH,00H,0E7H,06H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04h,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + DB 45,60 + +;400*600 256 couleurs +mode9 DB 0E7H, 00H, 03H,01H,0FH,00H,06H + DB 74h,63h,64h,97h,68h,95h,86h,0F0h,00h,60h,00h,00h,00h,00h,00h,00h + DB 5Bh,8Dh,57h,32h,00h,60h,80h,0E3h,0FFh + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04h,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + DB 50,75 + +DATABLOCKSIZE equ 40 +DATABLOCK equ $ +;============================================DATABLOCK========================================================= +lines db 0 +columns db 0 +x db 0 +y db 0 +xy dw 0 +colors db 7 +mode db 0FFh +pagesize dw 0 +pages db 0 +font db 0 +graphic db 0 +xg dw 0 +yg dw 0 +style dw 0 +nbpage db 0 +pagesshowed db 0 +plane db 0 +xyg dw 0 +linesize dw 0 +adress dw 0 +base dw 0 +scrolling db 1 + +;=======================================Equivalence pour la clarté du code======================================== +Sequencer equ 03C4h +misc equ 03C2h +CCRT equ 03D4h +Attribs equ 03C0h +graphics equ 03CEh +statut equ 03DAh + +maxfunc equ 48 +maxmode equ 9 +planesize equ 64000 +;============================================Fonctions de l'int VIDEO=========================================== + +;=============ENABLESCROLLING (Fonction 02AH)========= +;Autorise le d‚filement +;-> AH=42 +;<- +;===================================================== + EnableScroll: + mov cs:scrolling,1 + ret + +;=============DISABLESCROLLING (Fonction 2Bh)========= +;D‚sactive le d‚filement +;-> AH=43 +;<- +;===================================================== +DisableScroll: + mov cs:scrolling,0 + ret + +;================SHOWDATE (Fonction 2Ch)============== +;Affiche la date contenu en DX +;-> AH=44 +;<- +;===================================================== +ShowDate: + push ax cx edx + mov ax,dx + mov cx,2 + xor edx,edx + mov dx,ax + and dx,11111b + call showfixint + mov dl,'/' + call showchar + mov dx,ax + shr dx,5 + and dx,111b + call showfixint + mov dl,'/' + call showchar + mov dx,ax + shr dx,8 + and dx,11111111b + add dx,1956 + mov cx,4 + call showfixint + pop edx cx ax + ret + +;================SHOWTIME (Fonction 2Dh)============== +;Affiche l'heure contenu en DX +;-> AH=45 +;<- +;===================================================== +ShowTime: + push ax cx edx + mov ax,dx + mov cx,2 + xor edx,edx + mov dx,ax + shr dx,11 + and dx,11111b + call showfixint + mov dl,':' + call showchar + mov dx,ax + shr dx,5 + and dx,111111b + call showfixint + mov dl,':' + call showchar + mov dx,ax + and dx,11111b + shl dx,1 + call showfixint + pop edx cx ax + ret + +;================SHOWNAME (Fonction 2Eh)============== +;Affiche le nom pointé par SI +;-> AH=46 +;<- +;===================================================== +ShowName: + push cx dx si + xor cx,cx +showthename: + mov dl,ds:[si] + call showchar + inc si + inc cx + cmp cx,8 + jne suiteaname + mov dl,' ' + call showchar +suiteaname: + cmp cx,8+3 + jb showthename + pop si dx cx + ret + +;================SHOWATTR (Fonction 2Fh)============== +;Affiche les attributs spécifié par DL +;-> AH=47 +;<- +;===================================================== +ShowAttr: + push dx + mov al,dl + + test al,00000001b + je noreadonly + mov dl,'L' + jmp readonly +noreadonly: + mov dl,'-' +readonly: + call showchar + + test al,00000010b + je nohidden + mov dl,'C' + jmp hidden +nohidden: + mov dl,'-' +hidden: + call showchar + + test al,00000100b + je nosystem + mov dl,'S' + jmp system +nosystem: + mov dl,'-' +system: + call showchar + + test al,00100000b + je noarchive + mov dl,'A' + jmp archive +noarchive: + mov dl,'-' +archive: + call showchar + + test al,00010000b + je nodirectory + mov dl,'R' + jmp directory +nodirectory: + mov dl,'-' +directory: + call showchar + + pop dx + ret + +;================SHOWSIZE (Fonction 30h)============== +;Affiche le nom pointé par DI +;-> AH=48 +;<- +;===================================================== +ShowSize: + push cx edx si ds + push cs + pop ds + mov cx,4 + cmp edx,1073741824 + ja giga + cmp edx,1048576*9 + ja mega + cmp edx,1024*9 + ja kilo + call showintR + mov si,offset unit + call showstring0 + jmp finsize +kilo: + shr edx,10 + call showintR + mov si,offset unitkilo + call showstring0 + jmp finsize +mega: + shr edx,20 + call showintR + mov si,offset unitmega + call showstring0 + jmp finsize +giga: + shr edx,30 + call showintR + mov si,offset unitgiga + call showstring0 +finsize: + pop ds si edx cx + ret + +unit db ' o ',0 +unitkilo db ' ko',0 +unitmega db ' mo',0 +unitgiga db ' go',0 + +;=============SetVideoMode (Fonction 00h)========= +;Fixe le mode vidéo courant a AL +;-> AH=0, AL mode d'écran +;<- Carry if error +;================================================= +setvideomode: + push ax cx dx di + cmp al,maxmode + ja errorsetvideomode + cmp cs:mode,5h + jb nographic + cmp al,5h + jae nographic + call initvideo +nographic: + cmp cs:mode,0FFh + jne noinit + call initvideo +noinit: + mov cs:mode,al + xor ah,ah + mov di,ax + shl di,6 + add di,offset mode0 + mov dx,misc + mov al,cs:[di] + out dx,al + inc di + mov dx,statut + mov al,cs:[di] + out dx,al + inc di + mov dx,sequencer + xor ax,ax +initsequencer: + mov ah,cs:[di] + out dx,ax + inc al + inc di + cmp al,4 + jbe initsequencer + mov ax,0E11h + mov dx,ccrt + out dx,ax + xor ax,ax +initcrt: + mov ah,cs:[di] + out dx,ax + inc al + inc di + cmp al,24 + jbe initcrt + mov dx,graphics + xor ax,ax +initgraphic: + mov ah,cs:[di] + out dx,ax + inc al + inc di + cmp al,8 + jbe initgraphic + mov dx,statut + in al,dx + mov dx,attribs + xor ax,ax +initattribs: + mov ah,cs:[di] + push ax + in ax,dx + pop ax + out dx,al + xchg ah,al + out dx,al + xchg ah,al + inc al + inc di + cmp al,20 + jbe initattribs + mov al,20h + out dx,al + mov al,cs:[di] + mov cs:columns,al + mov ah,cs:[di+1] + mov cs:lines,ah + mul ah + shl ax,1 + cmp cs:mode,5 + setae cs:graphics + jb istext + shl ax,3 +istext: + mov cs:pagesize,ax + mov ax,planesize + xor dx,dx + div cs:pagesize + mov cs:nbpage,al + mov al,cs:[di-36] + xor ah,ah + shl ax,2 + mov cl,cs:graphics + shr ax,cl + mov cs:linesize,ax + mov ax,cs:[di-43] + mov cs:adress,ax + mov cs:base,ax + mov cs:pages,0 + pop di dx cx ax + ret +errorsetvideomode: + pop di dx cx ax + ret + +initvideo: + push bx cx si ds +;xor bx,bx +;mov ds,bx +;lds si,ds:[43h*4] + push cs + pop ds + mov si,offset font8x8 + mov cl,8 + mov bl,1 + call loadfont + mov si,offset font8x16 + mov cl,16 + mov bl,0 + call loadfont + mov cs:pagesize,64000 + call clearscreen + pop ds si cx bx + ret + +;=============GetVideoMode (Fonction 01h)========= +;Renvoie le mode vidéo courant dans AL +;-> AH=1 +;<- AL mode d'écran +;================================================= +getvideomode: + mov al,cs:mode + ret + +;=============CLEARSCREEN (Fonction 02h)========= +;Efface l'ecran graphique ou texte +;-> AH=2 +;<- +;================================================ +clearscreen: + push eax cx dx di es + mov cx,cs:pagesize + mov di,cs:adress + shr cx,2 + cmp byte ptr cs:graphics,1 + jne erasetext + mov ax,0A000h + mov es,ax +erasegraph: + mov ah,0 +gogot: + push ax cx + mov cl,ah + mov ah,1 + shl ah,cl + mov al,2 + mov dx,sequencer + out dx,ax + pop cx ax + push si di cx eax + mov eax,00000000h + rep stosd + pop eax cx di si + inc ah + cmp ah,3 + jbe gogot + jmp enderase +erasetext: + mov ax,0B800h + mov es,ax + mov eax,07200720h + cld + rep stosd +enderase: + mov cs:x,0 + mov cs:y,0 + mov cs:xg,0 + mov cs:yg,0 + mov cs:xy,0 + mov cs:xyg,0 + mov cs:plane,0 + pop es di dx cx eax + ret + + +;=============SetFont (Fonction 03h)========= +;Active la font cl parmi les 8 +;-> AH=3, CL n° font +;<- Carry if error +;============================================ +setfont: + push ax cx dx + cmp cl,7 + ja errorsetfont + mov cs:font,cl + mov ah,cl + and cl,11b + and ah,0100b + shl ah,2 + add ah,cl + mov dx,sequencer + mov al,3 + out dx,ax + pop dx cx ax + ret +errorsetfont: + pop dx cx ax + ret + +;=============GetFont (Fonction 0xh)========= +;Récupère le n° de la font active +;-> AH=x +;<- CL n° font, Carry if error +;============================================ +Getfont: + push ax cx dx + cmp cl,7 + ja errorgetfont + mov cs:font,cl + mov ah,cl + and cl,11b + and ah,0100b + shl ah,2 + add ah,cl + mov dx,sequencer + mov al,3 + out dx,ax + pop dx cx ax + ret +errorgetfont: + stc + pop dx cx ax + ret + +;=============LoadFont (Fonction 04h)========== +;Charge une police pointée par ds:si dans la carte vidéo sous n°font BL, taille police dans CL +;-> AH=4, BL n°font, DS:SI pointeur vers Font, CL taille police +;<- Carry if error +;=========================================== +loadfont: + push ax bx cx dx si di es + cmp bl,7 + ja errorloadfont + xor di,di + cli + mov dx,sequencer +doseq: + mov ax,cs:[di+offset reg1] + out dx,ax + inc di + inc di + cmp di,6 + jbe doseq + mov dx,graphics +doseq2: + mov ax,cs:[di+offset reg1] + out dx,ax + inc di + inc di + cmp di,6+6 + jbe doseq2 + sti + mov ax,0A000h + mov es,ax + mov dx,256 + mov al,0 + xor bh,bh + cmp bl,4 + jb isless + sub bl,4 + shl bl,1 + inc bl + jmp okmake +isless: + shl bl,1 +okmake: + mov di,bx + shl di,13 + mov bh,cl + mov bl,cl + sub bl,32 + neg bl + xor cx,cx + cld +popz: + mov cl,bh + rep movsb + mov cl,bl + rep stosb + dec dx + jnz popz + xor di,di + mov dx,sequencer +doseqs: + mov ax,cs:[di+offset reg2] + out dx,ax + inc di + inc di + cmp di,6 + jbe doseqs + mov dx,graphics +doseqs2: + mov ax,cs:[di+offset reg2] + out dx,ax + inc di + inc di + cmp di,6+6 + jbe doseqs2 + pop es di si dx cx bx ax + ret +errorloadfont: + stc + pop es di si dx cx bx ax + ret + +reg2 dw 0100h, 0302h, 0304h, 0300h + dw 0004h, 1005h, 0E06h +reg1 dw 0100h, 0402h, 0704h, 0300h + dw 0204h, 0005h, 0406h + +;==========SHOWSPACE (Fonction 05h)=========== +;met un espace aprés le curseur +;-> AH=5 +;<- +;============================================= +showspace: + push cx + mov cl,' ' + mov ch,cs:colors + call charout + clc + pop cx + ret + +;==========SHOWLINE (Fonction 06h)=============== +;remet le curseur text a la ligne avec un retour chariot +;-> AH=6 +;<- +;================================================ +showline: + push bx cx + mov bl,cs:y + xor bh,bh + mov cl,cs:lines + sub cl,2 + cmp bl,cl + jne scro + dec bl + mov cx,1 + cmp byte ptr cs:graphics,0 + je okscro + mov cx,8 +okscro: + call scrolldown +scro: + inc bl + call setxy2 + pop cx bx + ret + +;==========SHOWCHAR (Fonction 07h)=========== +;met un caractère de code ASCII DL aprés le curseur +;-> AH=7, DL code ASCII du caractère +;<- +;============================================ +showchar: + push cx + mov cl,dl + mov ch,cs:colors + call charout + pop cx + ret + +;==========SHOWINT (Fonction 08h)=========== +;Affiche un entier EDX aprés le curseur +;-> AH=8, EDX un entier +;<- +;=========================================== +ShowInt: + push eax bx cx edx esi + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint: + xor edx,edx + div esi + add dl,'0' + inc cx + mov cs:[bx],dl + dec bx + cmp ax,0 + jne decint + mov ax,cx + mov ch,cs:colors +showinteger: + inc bx + mov cl,cs:[bx] + call charout + dec ax + jnz showinteger + pop esi edx cx bx eax + ret + +showbuffer db 35 dup (0FFh) + +;==========SHOWFIXINT (Fonction h)=========== +;Affiche un entier EDX aprés le curseur de taille cx +;-> AH=8, EDX un entier et al="cara" +;<- +;=========================================== +ShowfixInt: + push eax bx cx edx esi di + mov di,cx + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint2: + xor edx,edx + div esi + add dl,'0' + inc cx + mov cs:[bx],dl + dec bx + cmp cx,di + jae nomuch + cmp ax,0 + jne decint2 + mov ax,di + xchg cx,di + sub cx,di +rego: + mov byte ptr cs:[bx],'0' + dec bx + dec cx + jnz rego + jmp finishim +nomuch: + mov ax,di +finishim: + mov ch,cs:colors +showinteger2: + inc bx + mov cl,cs:[bx] + call charout + dec ax + jnz showinteger2 + pop di esi edx cx bx eax + ret + +;==========SHOWINTR (Fonction h)=========== +;Affiche un entier EDX aprés le curseur de taille cx +;-> AH=8, EDX un entier +;<- +;=========================================== +ShowIntR: + push eax bx cx edx esi di + mov di,cx + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint3: + xor edx,edx + div esi + add dl,'0' + inc cx + mov cs:[bx],dl + dec bx + cmp cx,di + jae nomuch + cmp ax,0 + jne decint3 + mov ax,di + xchg cx,di + sub cx,di +rego2: + mov byte ptr cs:[bx],' ' + dec bx + dec cx + jnz rego2 + jmp finishim2 +nomuch2: + mov ax,di +finishim2: + mov ch,cs:colors +showinteger3: + inc bx + mov cl,cs:[bx] + call charout + dec ax + jnz showinteger3 + pop di esi edx cx bx eax + ret + +;==========SHOWSIGNED (Fonction 09h)=========== +;Affiche un entier EDX de taille CX aprés le curseur +;-> AH=9, EDX un entier, CX la taille +;<- +;============================================== +Showsigned: + push ebx edx + mov ebx,edx + xor edx,edx + cmp cx,8 + ja signed16 + mov dl,bl + cmp dl,7Fh + jbe notsigned + neg dl + jmp showminus +signed16: + cmp cx,16 + ja signed32 + mov dx,bx + cmp dx,7FFFh + jbe notsigned + neg dx + jmp showminus +signed32: + mov edx,ebx + cmp edx,7FFFFFFFh + jbe notsigned + neg edx +showminus: + push dx + mov dl,'-' + call showchar + pop dx +notsigned: + call showint + pop edx ebx + ret + +;==========SHOWHEX (Fonction 0Ah)=========== +;Affiche un nombre hexadécimal EDX de taille CX aprés le curseur +;-> AH=10, EDX un entier, CX la taille +;<- +;=========================================== +ShowHex: + push ax bx cx edx + mov ax,cx + shr ax,2 + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors +Hexaize: + rol edx,4 + mov bx,dx + and bx,0fh + mov cl,cs:[bx+offset Tab] + call charout + dec al + jnz Hexaize + pop edx cx bx ax + ret + +Tab db '0123456789ABCDEF' + +;==========SHOWBIN (Fonction 0Bh)=========== +;Affiche un nombre binaire EDX de taille CX aprés le curseur +;-> AH=11, EDX un entier, CX la taille +;<- +;=========================================== +Showbin: + push ax cx edx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors +binaize: + rol edx,1 + mov cl,'0' + adc cl,0 + call charout + dec al + jnz binaize + pop edx cx ax + ret + +;==========SHOWBCD (Fonction 0xh)=========== +;Affiche un nombre en BCD EDX de taille CX aprés le curseur +;-> AH=x, EDX un entier, CX la taille +;<- +;=========================================== +ShowBCD: + push ax cx edx + mov ax,cx + shr ax,2 + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors +BCDaize: + rol edx,4 + mov cl,dl + and cl,0fh + add cl,'0' + call charout + dec al + jnz BCDaize + pop edx cx ax + ret + +;==========SHOWSTRING (Fonction 0Ch)=========== +;Affiche une chaine de caractère pointée par DS:SI aprés le curseur +;-> AH=12, DS:SI pointeur chaine type pascal +;<- +;============================================== +showstring: + push bx cx si + mov bl,[si] + mov ch,cs:colors +strinaize: + inc si + mov cl,[si] + call charout + dec bl + jnz strinaize + pop si cx bx + ret + +;==========SHOWSTRING0 (Fonction 0Dh)=========== +;Affiche une chaine de caractère pointée par DS:SI aprés le curseur +;-> AH=13, DS:SI pointeur chaine type zéro terminal +;<- +;=============================================== +showstring0: + push cx si + mov ch,cs:colors +strinaize0: + mov cl,[si] + cmp cl,0 + je no0 + call charout + inc si + jmp strinaize0 +no0: + pop si cx + ret + +;==========SHOWCHARAT (Fonction 0Eh)=========== +;met un caractère de code ASCII DL en (x;y) (BH;BL) +;-> AH=14, DL code ASCII du caractère, BH coordonnées x, BL coordonnées y +;<- +;============================================== +showcharat: + push es di + call setxy + call showchar + pop di es + ret + +;==========SHOWINTAT (Fonction 0Fh)=========== +;Affiche un entier EDX en (x;y) (BH;BL) +;-> AH=15, EDX entier, BH coordonnées x, BL coordonnées y +;<- +;============================================== +showintat: + push es di + call setxy + call showint + pop di es + ret + +;==========SHOWSIGNEDAT (Fonction 10h)=========== +;Affiche un entier EDX de taille CX aprés le curseur en (x;y) (BH;BL) +;-> AH=16, EDX entier, BH coordonnées x, BL coordonnées y +;<- +;============================================== +showsignedat: + push es di + call setxy + call showsigned + pop di es + ret + +;==========SHOWHEXAT (Fonction 11h)=========== +;Affiche un nombre hexadécimal EDX de taille CX en (x;y) (BH;BL) +;-> AH=17, EDX un entier, CX la taille, BH coordonnées x, BL coordonnées y +;<- +;============================================== +showhexat: + push es di + call setxy + call showhex + pop di es + ret + +;==========SHOWBINAT (Fonction 012h)=========== +;Affiche un nombre binaire EDX de taille CX en (x;y) (BH;BL) +;-> AH=18, EDX un entier, CX la taille, BH coordonnées x, BL coordonnées y +;<- +;============================================= +showbinat: + push es di + call setxy + call showbin + pop di es + ret + +;==========SHOWSTRINGAT (Fonction 13h)=========== +;Affiche une chaine de caractère pointée par DS:SI en (x;y) (BH;BL) +;-> AH=19, DS:SI pointeur chaine type pascal, BH coordonnées x, BL coordonnées y +;<- +;================================================ +showstringat: + push es di + call setxy + call showstring + pop di es + ret + +;==========SHOWSTRING0AT (Fonction 14h)=========== +;Affiche une chaine de caractère pointée par DS:SI en (x;y) (BH;BL) +;-> AH=20, DS:SI pointeur chaine type zéro terminal, BH coordonnées x, BL coordonnées y +;<- +;================================================= +showstring0at: + push es di + call setxy + call showstring0 + pop di es + ret + +;==========SETCOLOR (Fonction 15h)========= +;Change les attributs du texte a CL +;-> AH=21 ,CL couleur +;<- +;========================================= +setcolor: + mov cs:colors,CL + ret + +;==========GETCOLOR (Fonction 16h)========= +;Récupère les attributs du texte dans CL +;-> AH=22 +;<- CL couleur +;========================================= +getcolor: + mov cl,cs:colors + ret + +;==========SETSTYLE (Fonction xh)========= +;Change le style du texte a CL +;-> AH=x ,CX style +;<- +;========================================= +setstyle: + mov cs:style,CX + ret + +;==========GETSTYLE (Fonction xh)========= +;Récupère le style du texte dans CL +;-> AH=x +;<- CX style +;========================================= +getstyle: + mov cx,cs:style + ret + +;==========SCROLLDOWN (Fonction 17h)========= +;defile de cx lines vers le bas +;-> AH=23, CX lines à défiler vers le bas +;<- +;============================= +scrolldown: + push ax cx dx si di ds es + cmp cs:scrolling,0 + je graphp + mov ax,cx + mul cs:linesize + mov si,ax + mov cx,cs:pagesize + sub cx,si + mov di,cs:adress + cld + cmp byte ptr cs:graphics,1 + jne textp + mov ax,0A000h + mov es,ax + mov ds,ax + shr cx,2 +transfert: + mov ah,0 +gogo: + push ax cx + mov cl,ah + mov ah,1 + shl ah,cl + mov al,2 + mov dx,sequencer + out dx,ax + pop cx ax + mov al,4 + mov dx,graphics + out dx,ax + push si di cx + rep movsd + pop cx di si + inc ah + cmp ah,3 + jbe gogo + jmp graphp +textp: + mov ax,0B800h + mov es,ax + mov ds,ax + rep movsb +graphp: + pop es ds di si dx cx ax + ret + +;==========GETXY (Fonction 18h)========= +;Change les coordonnées du curseur a X:BH,Y:BL +;-> AH=24 +;<- BH coordonnées x, BL coordonnées y +;============================= +getxy: + mov bh,cs:x + mov bl,cs:y + ret + +;==========SETXY (Fonction 19h)========= +;Change les coordonnées du curseur a X:BH,Y:BL +;-> AH=25, BH coordonnées x, BL coordonnées y +;<- +;===================================== +setxy: + push ax bx cx dx + mov cs:x,bh + mov cs:y,bl + mov al,bl + mov bl,bh + xor bh,bh + mov di,cs:adress + add di,bx + mul cs:columns + add di,ax + shl di,1 + mov cs:xy,di + cmp byte ptr cs:graphics,1 + jne oktext + mov bl,cs:x + mov cl,cs:y + xor bh,bh + xor ch,ch + shl bx,3 + shl cx,3 + call setxyg + jmp endofsetxy +oktext: + mov ax,0B800h + mov es,ax +endofsetxy: + pop dx cx bx ax + ret + +setxy2: + push es di + call setxy + pop di es + ret + +;==========SETXYG (Fonction 0xh)========= +;Change les coordonnées du curseur graphique a X:BX,Y:CX +;-> AH=x, BX coordonnées x, CX coordonnées y +;<- ES:DI pointeur sur pixel avec plan de bit ajusté +;====================================== +setxyg: + push ax bx cx dx + mov cs:xg,bx + mov cs:yg,cx + mov ax,cx + mov cl,bl + mul cs:linesize + shr bx,2 + add ax,bx + mov di,ax + and cl,3 + mov ah,1 + shl ah,cl + mov al,2 + mov dx, 3c4h + out dx,ax + mov cs:plane,cl + mov cs:xyg,di + mov ax,0A000h + mov es,ax + pop dx cx bx ax + ret + +;==========SHOWPIXEL (Fonction 0xh)========= +;Affiche un pixel de couleur AL en X:BX,Y:CX +;-> AH=x, BX coordonnées x, CX coordonnées y, AL couleur +;<- +;========================================= +showpixel: + push ax bx cx dx di bp es + mov bp,ax + mov ax,cx + mov cl,bl + mul cs:linesize + shr bx,2 + add ax,bx + mov di,ax + add di,cs:adress + and cl,3 + mov ah,1 + shl ah,cl + mov al,2 + mov dx,sequencer + out dx,ax + mov bx,0A000h + mov es,bx + mov ax,bp + mov es:[di],al + pop es bp di dx cx bx ax + ret + +;==========SHOWPIXEL (Fonction 0xh)========= +;Récupère en al la couleur du pixel de coordonnées X:BX,Y:CX +;-> AH=x, BX coordonnées x, CX coordonnées y, AL couleur +;<- +;========================================= +getpixel: + push ax bx cx dx di bp es + mov bp,ax + mov ax,cx + mov cl,bl + mul cs:linesize + shr bx,2 + add ax,bx + mov di,ax + add di,cs:adress + and cl,3 + mov ah,cl + mov al,4 + mov dx,graphics + out dx,ax + mov bx,0A000h + mov es,bx + mov ax,bp + + mov al,es:[di] + pop es bp di dx cx bx ax + ret + +;==========LOADBMPPALET (Fonction 0xh)========= +;Charge la palette du BMP pointée par DS:SI +;-> AH=x, DS:SI BMP +;<- +;============================================= +loadbmppalet: + push ax bx cx dx + mov bx,0400h+36h-4 + mov cx,100h + mov dx, 3c8h +paletteload: + mov al, cl + dec al + out dx, al + inc dx + mov al,[bx+si+2] + shr al,2 + out dx, al + mov al,[bx+si+1] + shr al,2 + out dx, al + mov al,[bx+si] + shr al,2 + out dx, al + sub bx,4 + dec dx + dec cl + jnz paletteload + pop dx cx bx ax + ret + +;==========VIEWBMP (Fonction 0xh)========= +;Affiche le BMP pointée par DS:SI en X:BX, Y:CX avec la préparation de la palette +;<- AH=x, DS:SI BMP, BX coordonnées X, CX coordonnées Y +;-> +;========================================= +viewbmp: + call loadbmppalet + call showbmp + ret + +;==========SHOWBMP (Fonction 0xh)========= +;Affiche le BMP pointée par DS:SI en X:BX, Y:CX +;<- AH=x, DS:SI BMP, BX coordonnées X, CX coordonnées Y +;-> +;========================================= +showbmp: + push ax bx cx dx + cmp word ptr ds:[si+BMP_file.BMP_FileType],"MB" + jne errorshowing + mov cs:xc,bx + mov cs:yc,cx + xor cx,cx + xor bx,bx + xor dx,dx +bouclette: + mov al,[si+bx+436h] + push bx cx + sub cx,cs:yc + neg cx + mov bx,dx + add bx,cs:xc + call showpixel + pop cx bx + inc bx + inc dx + cmp dx,[si+offset BMP_File.BMP_width] + jb bouclette + xor dx,dx + inc cx + cmp cx,[si+offset BMP_File.BMP_height] + jb bouclette + clc + pop dx cx bx ax + ret + +errorshowing: + stc + pop dx cx bx ax + ret + +xc dw 0 +yc dw 0 + +;==========GETVGAINFO (Fonction 0xh)========= +;Renvoie un bloc de donnée en ES:DI sur l'état de la carte graphique +;<- AH=x, ES:DI pointeur +;-> +;============================================= +Getvgainfos: + push cx si di ds + push cs + pop ds + mov cx,datablocksize + mov si,offset datablock + cld + rep movsb + pop ds di si cx + ret + +;==========WAITRETRACE (Fonction 0xh)========= +;Synchronisation avec la retrace verticale +;<- AH=x +;-> +;============================================= +waitretrace: + push ax dx + mov dx,3DAh +waitr: + in al,dx + test al,8 + jz waitr + pop dx ax + ret + +;Ecrit le caractère ASCII CL attribut CH aprés le curseur, en le mettant à jours +charout: + push ax bx cx dx di es + cmp byte ptr cs:graphics,1 + jne textaccess + mov dx,cx + mov di,dx + and di,11111111b + shl di,3 + add di,offset font8x8 + xor bx,bx + xor cx,cx + mov ah,cs:[di] +bouclet: + mov al,dh + rol ah,1 + jc colored + shr al,4 + bt word ptr cs:style,0 + jc transparent +colored: + and al,1111b + push bx cx + add cx,cs:yg + add bx,cs:xg + call showpixel + pop cx bx +transparent: + inc bx + cmp bx,8 + jb bouclet + xor bx,bx + inc di + mov ah,cs:[di] + inc cx + cmp cx,8 + jb bouclet + add cs:xg,8 + mov cx,cs:linesize + shl cx,2 + cmp cs:xg,cx + jb adjusttext + mov cs:xg,0 + add cs:yg,8 + jmp adjusttext +textaccess: + mov ax,0B800h + mov es,ax + mov di,cs:xy + mov es:[di],cx + add cs:xy,2 +adjusttext: + inc cs:x + mov cl,cs:columns + cmp cs:x,cl + jb noadjusted + call showline +noadjusted: + ;mov dx,3D4h + ;mov al,0Eh + ;mov di,offset xy + ;mov ah,cs:[di] + ;out dx,ax + ;mov ah,cs:[di+1] + ;dec al + ;out dx,ax + pop es di dx cx bx ax + ret + + + + + + +;===================================sauve l'ecran rapidement================ +SaveScreen: + push cx si di ds es + mov cx,0B800H + mov ds,cx + push cs + pop es + mov cx,cs:pagesize + shr cx,2 + xor si,si + mov di,offset Copy2 + cld + rep movsd + pop es ds di si cx + ret + +;===================================sauve l'ecran rapidement en es:di================ +SaveScreento: + push cx si di ds + mov cx,0B800H + mov ds,cx + mov cx,cs:pagesize + shr cx,2 + xor si,si + cld + rep movsd + pop ds di si cx + ret + +;===================================sauve l'ecran rapidement================ +Savepage1: + push cx si di ds es + mov cx,0B800H + mov ds,cx + push cs + pop es + mov cx,cs:pagesize + shr cx,2 + xor si,si + mov di,offset Copy + cld + rep movsd + pop es ds di si cx + ret + +;===================================sauve l'ecran rapidement================ +RestoreScreen: + push cx si di ds es + mov cx,0B800H + mov es,cx + push cs + pop ds + mov cx,cs:pagesize + shr cx,2 + mov si,offset Copy2 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + +;===================================restore l'ecran rapidement de ds:si================ +RestoreScreenfrom: + push cx si di ds es + mov cx,0B800H + mov es,cx + mov cx,cs:pagesize + shr cx,2 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + +;===============================Page2to1============================ +Page2to1: + push cx si di ds es + mov cx,0B800H + mov es,cx + mov ds,cx + mov cx,cs:pagesize + shr cx,2 + mov si,4000 + xor di,di + cld + rep movsd + pop es ds di si cx + ret + +;===============================Page1to2============================ +Page1to2: + push cx si di ds es + mov cx,0B800H + mov es,cx + mov ds,cx + mov cx,cs:pagesize + shr cx,2 + mov di,4000 + xor si,si + cld + rep movsd + pop ds es di si cx + ret + +;===============================xchgPages============================ +xchgPages: + push cx si di ds es + call savepage1 + call page2to1 + mov cx,0B800H + mov es,cx + push cs + pop ds + mov cx,cs:pagesize + shr cx,2 + mov si,offset Copy + mov di,4000 + rep movsd + pop es ds di si cx + ret + +;Sauve l'‚tat de la carte en es:di +savestate: +push cx si di ds +push cs +pop ds +mov cx,datablocksize +mov si,offset lines +cld +rep movsb +call savescreento +pop ds di si cx +ret + +;R‚cupŠre l'‚tat de la carte en ds:si +restorestate: +push ax cx si di es +mov al,[si+7] +cmp cs:mode,al +je nochangemode +mov ah,0 +call setvideomode +nochangemode: +push cs +pop es +mov cx,datablocksize +mov di,offset lines +cld +rep movsb +call restorescreenfrom +pop es di si cx ax +ret + +;sauve le DAC +savedac: +push ax cx dx di +mov dx,3C7h +mov cx,256 +mov di,offset dac +save: +mov al,cl +dec al +out dx,al +inc dx +inc dx +in al,dx +mov cs:[di],al +inc di +in al,dx +mov cs:[di],al +inc di +in al,dx +mov cs:[di],al +inc di +dec dx +dec dx +dec cx +jne save +pop di dx cx ax +ret + +;restore le DAC +restoredac: +push ax cx dx si +xor ax,ax +mov dx,3C8h +mov cx,256 +mov si,offset dac +save2: +mov al,cl +dec al +out dx,al +inc dx +mov al,cs:[si] +inc si +out dx,al +mov al,cs:[si] +inc si +out dx,al +mov al,cs:[si] +inc si +out dx,al +dec dx +dec cx +jne save2 +pop si dx cx ax +ret + +;couleur al pour ligne di A SUPPRIMER +changelineattr: +push ax bx di es +mov bx,ax +mov ax,0B800h +mov es,ax +mov ax,di +mul cs:columns +mov di,ax +shl di,1 +mov al,cs:columns +inc di +popep: +mov es:[di],bl +add di,2 +dec al +jnz popep +pop es di bx ax +ret + +font8x8: +include ..\include\pol8x8.inc +font8x16: +include ..\include\pol8x16.inc + +copy equ $ +copy2 equ $+8192 +dac equ $+8192+8192 + +end start diff --git a/noyau/write.bat b/noyau/write.bat deleted file mode 100755 index 808b110..0000000 --- a/noyau/write.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -cd .. -setup -cd sources diff --git a/outils/exe2boot.asm b/outils/exe2boot.asm deleted file mode 100755 index 0946581..0000000 --- a/outils/exe2boot.asm +++ /dev/null @@ -1,67 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - - -start: -jmp transform -NameBoot db 'Boot.exe',0 -nameboot2 db 'Boot.bin',0 -buffer db 510 dup (0) - dw 0AA55h -message db 0ah,0dh,'Transformation of boot.com to boot.bin...',0ah,0dh,'By Nico',0ah,0dh,'Copyright 2000',0ah,0dh,'$' -ok db 0ah,0dh,'The transformation was done succefully !',0ah,0dh,'$' -errormsg db 0ah,0dh,'Some errors has been detected !',0ah,0dh,'$' -transform: -mov ah,09 -mov dx,offset message -int 21h -mov ax,3D00h -mov dx,offset nameboot -int 21h -jc error -mov bx,ax -mov ax,4202h -xor cx,cx -xor dx,dx -int 21h -jc error -cmp dx,0 -jne error -mov ax,4200h -xor cx,cx -mov dx,7E00h -int 21h -jc error -mov ah,3fh -mov cx,512 -mov dx,offset buffer -int 21h -jc error -mov ah,3eh -int 21h -jc error -mov ah,3ch -xor cx,cx -mov dx,offset nameboot2 -int 21h -jc error -mov ah,40h -mov cx,512 -mov dx,offset buffer -int 21h -jc error -mov ah,09 -mov dx,offset ok -int 21h -ret -error: -mov ah,09 -mov dx,offset errormsg -int 21h -ret - -end start diff --git a/outils/rip.asm b/outils/rip.asm deleted file mode 100755 index acefad7..0000000 --- a/outils/rip.asm +++ /dev/null @@ -1,108 +0,0 @@ -net segment - -org 0100h -assume cs:net,ds:net - -start: -jmp deb -taille dw 0 -signe db 'rip' -signe2 db 64 dup (0) -p1 db '@' -p2 db '@' -min db 4 -deb: -mov BL,DS:[0080h] -xor BH,BH -or BX,BX -mov byte ptr [0081h+BX],00h -mov AX,3D02h -mov DX,0082H -int 21h -mov bx,ax -mov ah,3fh -mov cx,0ffffh -mov dx,offset data -int 21h -mov taille,ax -mov ah,3eh -int 21h -mov si,82h -mov di,offset signe2 -mov cx,64 -rep movsb -mov di,offset signe2 -mov cx,64 -mov al,2eh -repne scasb -push di -mov si,di -mov di,offset data -add di,taille -mov cx,3 -rep movsb -mov ax,di -pop di -mov cx,3 -mov si,offset signe -rep movsb -mov di,ax -mov cx,taille -mov si,offset data -mov dx,1 -boucle: -lodsb -cmp al,[si] -jne pas -inc dl -loop boucle -jmp fin -pas: -cmp dl,min -jb suite -cmp dl,1 -jne go -suite: -mov bx,cx -mov cx,dx -rep stosb -mov cx,bx -mov dl,1 -loop boucle -jmp fin -go: -mov ah,al -mov al,p1 -stosb -mov al,dl -stosb -mov al,ah -stosb -mov al,p2 -stosb -mov dl,1 -loop boucle -fin: -mov ah,3ch -mov cx,0 -mov dx,offset signe2 -int 21h -mov bx,ax -mov ah,40h -mov cx,di -sub cx,offset data -sub cx,taille -mov dx,offset data -add dx,taille -int 21h -mov ah,3eh -int 21h -mov ah,41h -mov dx,82h -int 21h -ret -data db 0 -net ends -end start - -net \ No newline at end of file diff --git a/outils/unrip.asm b/outils/unrip.asm deleted file mode 100755 index 02d1f64..0000000 --- a/outils/unrip.asm +++ /dev/null @@ -1,88 +0,0 @@ -net segment - -org 0100h -assume cs:net,ds:net - -start: -jmp deb -taille dw 0 -signe2 db 64 dup (0) -p1 db '@' -p2 db '@' -deb: -mov BL,DS:[0080h] -xor BH,BH -or BX,BX -mov byte ptr [0081h+BX],00h -mov AX,3D02h -mov DX,0082H -int 21h -mov bx,ax -mov ah,3fh -mov cx,0ffffh -mov dx,offset data -int 21h -mov taille,ax -mov ah,3eh -int 21h -mov si,82h -mov di,offset signe2 -mov cx,64 -rep movsb -mov di,offset signe2 -mov cx,64 -mov al,2eh -repne scasb -mov si,offset data -mov cx,3 -rep movsb -mov cx,taille -mov di,offset data -add di,taille -mov dx,1 -boucle: -lodsb -cmp al,p1 -je pas -suite: -stosb -loop boucle -jmp fin -pas: -mov al,p2 -cmp [si+2],al -jne suite -lodsb -mov bx,cx -mov cl,al -xor ch,ch -lodsb -rep stosb -mov cx,bx -sub cx,3 -inc si -loop boucle -fin: -mov ah,3ch -mov cx,0 -mov dx,offset signe2 -int 21h -mov bx,ax -mov ah,40h -mov cx,di -sub cx,offset data -sub cx,taille -mov dx,offset data -add dx,taille -int 21h -mov ah,3eh -int 21h -mov ah,41h -mov dx,82h -int 21h -ret -data db 0 -net ends -end start - -net \ No newline at end of file diff --git a/programs/MAKEFILE b/programs/MAKEFILE new file mode 100644 index 0000000..dde9824 --- /dev/null +++ b/programs/MAKEFILE @@ -0,0 +1,57 @@ +lnk_boot = tlink /x +asm= tasm /t/m5/zi +lnk= tlink /x/t + +all: detect.exe editeur.exe gestion.exe logo.exe pmode.exe souris.exe test.exe verifier.exe volume.exe + +detect.exe: detect.asm + $(asm) detect + $(lnk) detect + ren detect.com detect.exe + +editeur.exe: editeur.asm + $(asm) editeur + $(lnk) editeur + ren editeur.com editeur.exe + +gestion.exe: gestion.asm + $(asm) gestion + $(lnk) gestion + ren gestion.com gestion.exe + +logo.exe: logo.asm + $(asm) logo + $(lnk) logo + ren logo.com logo.exe + +pmode.exe: pmode.asm + $(asm) pmode + $(lnk) pmode + ren pmode.com pmode.exe + +souris.exe: souris.asm + $(asm) souris + $(lnk) souris + ren souris.com souris.exe + +test.exe: test.asm + $(asm) test + $(lnk) test + ren test.com test.exe + +verifier.exe: verifier.asm + $(asm) verifier + $(lnk) verifier + ren verifier.com verifier.exe + +volume.exe: volume.asm + $(asm) volume + $(lnk) volume + ren volume.com volume.exe + +clean: + del *.obj + del *.exe + del *.com + del *.sys + del *.err diff --git a/programs/asm.bat b/programs/asm.bat deleted file mode 100755 index 9466a7b..0000000 --- a/programs/asm.bat +++ /dev/null @@ -1,54 +0,0 @@ -@echo off - -echo Assembling file %1... -..\util\tasm %1.asm /m5/x/t -if errorlevel 1 goto end -if "%1"=="boot" goto boot -echo Linking file %1... -..\util\tlink %1.obj /x/t -if errorlevel 1 goto end -echo Copying file %1... -if "%1"=="video" goto video -if "%1"=="lpt" goto system -if "%1"=="keyboard" goto system -if "%1"=="mouse" goto system -if "%1"=="pic8259a" goto system -if "%1"=="timer" goto system -if "%1"=="drive" goto system -if "%1"=="joystick" goto system -if "%1"=="system" goto system -if "%1"=="setup" goto setup -copy %1.com ..\data\%1.exe>nul -goto end - -:boot -echo Linking file %1... -..\util\tlink %1.obj /x -if errorlevel 1 goto end -echo Copying file %1... -..\util\exe2boot %1.exe -copy %1.bin ..\data\%1.bin>nul -goto end - -:video -type thin8x8.fnt>>%1.com -:system -copy %1.com ..\data\%1.sys>nul -goto end -:setup -copy %1.com ..\%1.com>nul -goto end - -:end -if not exist *.bin goto exes -del *.bin -:exes -if not exist *.exe goto coms -del *.exe -:coms -if not exist *.com goto objs -del *.com -:objs -if not exist *.obj goto nobjs -del *.obj -:nobjs diff --git a/programs/clean.bat b/programs/clean.bat deleted file mode 100755 index 687f4b0..0000000 --- a/programs/clean.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -echo nettoyage en cours... -del ..\data\*.* >nul diff --git a/programs/cos.bmp b/programs/cos.bmp deleted file mode 100755 index c5a0890f977e79cf3ab84995a02fb7d6f7327892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65078 zcmeHw2|!fWx&L{y56%n>!!~R)Farz>AnOba`;H7KFzkp6n}Xs3C@Nx9aEVUbF=|Yr zCJk92Nk@~kNl=@nO-xclYL~RuzO+r~dwqSc_W6JOpZ4Fr|99?e_ud%{=Cx|tdk5y8 zbMAM(bI$L6+xhMl^DA_JLByehZw>tB{u4s)!}*_(fM`c|5b~a9{k1kYzqvvIiZ9AT z#VePiqGipfs=o($c*{^hO9K*$=b;d7G+I2e70H4FQPP4!B$9_9S-1)XXXGQfIvlm` zA3-W(4f2UiLN#0ZP*`C(lBZ-KbxINv`UarPt@}`1UKWx@#Gsfg0}_XXq14q|P;hi4 z${RU`()xEIS%5E!sa}i<_dS6ks+y22Iu1#FWhfEmwd#o@D6wNb@|KBE`4carpdcCQ zIJysI)KnpDQ#(p2Ux0d_J%z#(L;U zC|n(cVhky$qIWgQ$_PW-zx6UQZCHnPU49L51w0fJuSO{;5y((sL=vSMEjsr)^6=oH zqMAj>Hz5@nOQTTZ&_=Z8>`HH}66j#hIuuUxl)F9!52lF~~0|9d(U9hQh;qkhZKG z)x0!`Vp5Y)-Ht)j`u$&^g3caPdi;4*zoHc_fc3OIx&s*(rXy8;5eheCpsY+S>VN(z zl(o1CEq?2VD8C>UWtQb5Rc1a)XlzE!O=-xGn~d0e0ZJ~&K-z^Slw4hd>K2!v?XOLs zf`$30{=$bSrFJn=>C#coj>nL(sS0H*ZAIF`GL%=AfsS8$9~sv4p}Ou>sH3w4)pj(X zh=w*)P@IC)(IH5ho{toreW-g)9a`GghoqrlC}U+0GM#<_t=ig;ie9~p!b&Pp@xe1F zV%wug*}4iDw{AyuHF_j~`?;WP3F=(aiVUM?k-E%?I+mxS{+*lA7V`+I=pRJ2TXvve zV>N2owH+mw*PwMz9Y@MgZ{(Y2M1_l6QQgs#$kc2?NxP1qH9z?rwV!w#89)97${Rj` zcK_-(Xu;?cs1W!pv0O&U*_kMN?@1J()}XSMW>m0c1O@nuQQW?BNd5e$D6qL5rB8j1 zf-9R)+8ZCBvi(Ov?(HN9p_CKx>bVqLR8L zD0iC~@uL$Ezn}>TQ}a>9ixcR;$-O8U+6VfI(8^aQQS)Pm(ejZYq^hh&x^MjwtvIk3 zg`Is1Z69nxVVR|9`>~^_W6wV1Da8mG6_tb#g7`-MXW37WyJ6vZ)Enm z5)2?hW{bo>ab0fs0c-Uh*?i5(S4kw|=U$yZr7KO%?ZfX$Y%-o&uM>B!J~oE)oI`<1mn>f@4o9qt}yHy3iV#K+4kDwqVu zTzVlSk5E(lu;d_yxe*Gldy)(P%?)wWiNSLllSb8hG*0VBodk{IK2=xM`xJIH_txK& zHcKWV={pevHPnK5^~F@$vAuxN!AXu%KSMbTUOr*H_V>xleFzl;+TSAOGI2 zE}yxpL};#z4j_yrln2WcgSo{sbG#Ym+>d?6di^4&Ire?@gNW zHW#v@{3ErB$gd#2ZkF`FZORUgijrHR{A7M!o?p%@cyK!yJ0CAMVk4ACjTeJjx<{D8 zdVH53QMZH!`^!plCV$3H}Tl^JWxpVlxRw+BG%fB9w%Z@srEyOC@rj)7kYdm&fn=AO`IuxhZuZu`u^ z{%V~IEYvRKH{xnFs zyu65L&LrwfhB>C-jnA~aVxT1 zEP>`6g&hKxJSsALTA{}3PdQi;LJY$WIOWB5J#<$w@Q8AiT!i>z!CsN!ak=5M+t8?^ zSD-iPkTgds!d>qniQ@hi&Gj?(fX19%?-w2sRvhWvV;mUtH^F?odPs@}8XMVjTp_b# zYM-x(U+d7D;nr;Iykfw@7@{iiVA0lo+K4yHWXI zL}YkaPa+m*+F_QAHT&g7#6{#~(5~QW;bw(PtGV7w8?J=_>!CSVQL;!snzie|D`7e};haSR=CCI&LV<&K z+hJCGA8!L!DF|NnR^lA$bEYT!;d)SG_EeXs39muS(9D-)_(u`Nt}E`GD89tv2ZQIC z);gq@php%ELv7r~h{WJQB8~$Uwu5YvkNL>7VPW9Pt+dW>vph6oJa1iGSc%==n18?7 z3$Dv^j|OVT={6EHAW%!S&Q4wrs3iB(miRf<)hxG0HTCOeuqwMh;E_{gPsDNBBPW{} z?)rYQ5W0~7gqoQj8Z};W{0f94bQg(bHslk-fT!i9j`7spJg~CqnPX zl8^bT!z0#dw^Ni8$RyxW%FYnTj_)eAk1r2y9@l9TXPiTrqt1LBkw?DY^f4Yt-5h!# zyx9KeDD=3WeF0xG8E_tjiU`7hktpSH>+WJiS@O{4$l{1F9o29^fBBfz&G;W(M+!IP zU?deKInI#W+*>vnroKTM@Zl)(y%Z29;FV{GC(?Cn_9;Tf0pf75Oiq!KH-x#`Kr#mt zKh#I2xDugozsdF4m`gFj@N~y3QI~hX@wjk}DBCIb<&Z z9c~P6^l|OSf@j^jvPgSET@v~6V3|v@(zV-tZ?X6*A{sW{`^_~8B|eGMgYY1e^`$E8 zToml+3QN{a^epWq#qO&<-qqzKA(bq_y)s>*%o+%pLlY+=9+JnOq&Y%SSf5Bw^HB+A ztHEx$t0ZhNB7F0gtFV&?4g7_91Xv>Raqdo$q9^@F0lrPX5Hqy{fAHTD6c%7jEHQqeTpX@MpH<^ zzIzWJUB}^eJ+w6WTW2c0(ITW5aMHWV}5Py8#x*ST_Ln8Y}E5f_6%@81N+#ErQ zq-O&G+_J1p)>UtosMiHJZk1lq}Q3AKs93uzbceBeEiNNDkc}({>`U@gQx}9KAWMDM}Cch?5sM z+GquRpRb1!6B(Aw3i6#wu@WB@-t$!E`sT=WJ#HQW()dC(D0QA7nngN<3#*kbWEItI zBob=z(xgku&ZG4fSIS~F;veE8$0csxlLV#PvH#x3;Ezmv}~ijaZNU8~PAOcNNtD3R@}-TrT&jU2rg+ zM$AsjTuoy-OSLiu_ptq12eE#$ST6YK`(n;>JqThAEL=R2oaMq*l)R0LwMWRZ1OW+~ zlT4j2?%>ht8%>NUY>UP;3uD~f2pVhCP~~a@KAQmAXXzpK?WUQlOSgDz%pa53$cPiP z7+3J}$&5vpl83nGx!gK})Ye6a?`ra-%lgS3ZDnCPA-TZbHkf@>IMe&9mduAcrNWd# zDPFfYsc)WDbR3+G!;@Tr2uOr1DS?f+{XHH{tdy<3`IrQ_SV`DfF`O^mjm#V7+Tat^ zStn^-vYyS}bdx&O^cEfmFUNM+sc}<4H*YoBt1a{f@Zb>W@q~y2&LOZiadnGhRkIg_ zm2I|;&<%62{u1BxUNPPAR6PxX8XoasLU9?B!Y{ujer=4HhEKMSgkFBAUuvx z7(y_?H)7s43XN;U)XlTQ#}z2?LNNz?E)|Otl;jTl6;(W*-7ML`BMcx*SXas8k)>6M z!8;EhLg6tn<~hI?w-2{c1eH7hsVuAvu}%bcv(1Q@6)+-^;i9n87shg!KPx)z)fC|} zruquFrG#}-*+pUuu9&mt?8$Kyr2;Q>um$vhsJmX(0fJD=Y{ zB~Pfn3C)z-P9?C{gsHCP-F}UB4jA?Z&9OCFLagX4NF}eE#f^z+w+oWdhF?1;xt+u+ zfU|ABt!gT@-UP9Dg!3MUMB}D-E2fG!LT@)@Eu_z@s^Wq0af9e~1;{n*e9~HD=JR+}^eE59G})WSqc8{n zoT91n%xXD2^a(VdpM?i`eympVog-gyDUbBUQ0_dA-Lg0_WVsP@T9%OdnIHmWw^OkR z;21dRPK+Ud23NO$!!cA+mPO)16h%+)s(4i#K|a~|JBc(&BsHp>2eh;39=PTqXE!Jr z1p=C=sxBpCnS>wrV^O-ZF3tPW$idn{!54QVY%XX1CTF950cUlkvkE1UuMrMs zVXC81$OZh!w$3aC>jm&p8Xe@0LQ;Aa9K1S;?m4a^q)KwgkbVUa8XQ#;5xnmNu9@mq z^>t32B1lV9ahO3IG+<2@xpB%T&We;XX}4SUMpheDwmblbYKn{^ zO9;ls>10xHHHK^FfX{q3Zlek^`8rXamkgj(QA|IT#<{4J6+lP@$w3O?GcV0iBMQ!r zM76FOM;Z7yAKmDnY}AO18KZ1*Q&ZEa{S|knLghAXF(t8mGv}b^2uV4dyuJU(!KLkw)pmxY1ax-R6x_)e4e5+BiaI)! zQYHK`27nJ|8+`TFy^HPJ%@7ujp__Pbl6)6awfO zIG08!jg$&6lZORRNoky=a(EK(BZV_$GRVyEX0=x0^cK7q!LGN??!H$(Qg?8vVA;z4 z_>P*Ib5f-;qwqVQ{$$+ifI7hQj)&A!PT(g_@=ji|1b&EL_@+iG#0*ReIMqt>TyUAq zp#*?w097W9rVYzhb+)~gjiI6i%SveCa3-l%(cXbLC-)KZH=Fk*(+aWsrKc?H1TlR) z-YiT^hIAeg^#O!eZKm(`?j!BvXM&ckEI(HekWx@kkaDiWC^d>wHWcd$3ui{}NXLS# z5o`!-NQpfu-UT=E7q-%TH%vglsdOS)02_QOznOIM`pJrA z(YqJ#-o31*c3DAxd3=0Pr&75gGOz6Q?I&jflu9B?C$?p=tQiEMN-RjNbFj7*5;&PI zUJb&L`7KUDh-Wy}wD;*$7@K5=fi*&nvyd7k!mWW;L*=aTY6{2{94=FGj_fRns{ud9 zaL#t3)ZM}}(3-4OX=Wc*Tzur)6ufcgA@=o(Q%9Pb)-GSZcI~2-D=+uApAf7OdwG23 zu|fUHAHAZlUmqxt5=kV;;uC2XYYxU3%}yKU(FRK5B)eEBDaSC`=cFqIY+7kX9`qhS z_O%n~F;bj#D##$WfZ&oWI}!bSK9#`FMf~Y>xV{>j%2_s5{3m!kfxAv2>5v;C@H?Mo zH=WClutS!;@r^HVh2{rxEwH3c<~rIo#M=hFj%v@@T6=b4$&fs~>)P+@CU znaF+tj!JMUN%X*)&55D=Rvg{=wmK(-qmw0ckiokeHpMuItPVu%sN=#N!T~$IH02^x z`eF$DoSvReK&nHcp=!45fzma6CVC30tGL+qak-x)*|(9Gk3^3?cIX>hP9533e9`ii z{pBkwqF0t*mM;BsP{odCw!ePt;`rO&c_t$R!Wr16;*2B~Kr4bNII+auG)!?-A(XwE zb;f!QXEiAR1Vd(UikfXvczZ!oSVGolQH}^mDBC;|9=O;I$%882IYrM1BJEkT2SL@4 z7^Lxr5Otn4XvP9~)gH|@o{CP}u%RyDv7j|IH3gle=i>XzKa-w2SMX$G=S|GL@ zPOE5jAWnJ2L?$i<&_L5_2OlGjo~z~-JzHH3dEO2-2<0E<@f=$rd%J4*5&#F{cb+S7 z#)h?fnsQE#zg}@t9TF7MmUpnQ@NNI7&U5F2!o!zt%~$W~jP~=|@OIafhv$@0rB{i} z*!|iMod3t4YO(;9ayBK~$8?-QIV&B$6(Oirk@T4$!`m~1GvXs0$m(?aeYSE+A`BoU zPv{r|xK?BMd>s4Ae+mM=KZC1p|LkJN36eD>h7N0$D+C-T`} zmWVgJ@{?bF`e<{)n%aUxkDuIg=&8qcNR_X9WsKDtMWR?CbvY`lQ%G#Vg|g#u@8biSVw36y;d3tKg(7?Hq_R1c}h-y@}H3s7ylgpvt#uR`={6ghDjz zRA$Q_AaB?3IgQ8{fB>H7ra2?S#x-l+QIsi`JyQJI_fEf@`16DLLr8n2> z{4Qiso#__Txh8GPJH?M43Hsizdw%h~*K}u+-r4%(qj`UP{P81OkLTpP^6BGWoH|mr z*K^7vUQ}BnkBv3akYV8`vstZVW2@nCR=A|Pz_^hEK8T&C3v3 z1`elsjMkN?YMyAp;y0)08Ev}+SXa1X18tSCwX^$IOrp6oJVdx%fUv?AG~@R8BjPPj zzI7sxt^4(d-#xwV&nHfBb%`Yl5-;X|cS}?I_Gi_{@~%f7*>bSU!=pU@+@f-QY$F{& zlLzD#GRbi$Z2h~*_7D$*Q&!tZ0U!~;IFc;{1-!I^bf4(m+K|-dGuk zSNH-Z?xSZDE%%NxZviPy18nmkwlQSWsH%=3Vix!kDD6aWZrs17WXtDOqpu&__~Gf| zk4~R>UYq#Qix-AYOkS+J_=Wn!+kafDJ@f3d;kuD_Pmibj7p>IXZiE*iNE~oc%3hF3 zh5~$TrHf(!V3Whnj@Z`SqHfL*!Z}le)09HY4GlD3YfT}%=LoZ%EI~@TGqL=+6DrN6 z!!&=e0%Wy{qN7e$@DPAU-r4DwR1+^Bfajp}C|J|3O=IRT$TDk&c^0s`1BZeOyHB=J~qeXHqP z7dsd66PK!ZB=c@-Ki}>92|TX1Q{gj_C_GPYA(h4S@VQhxzuWK$H;B3>)Bc2Nu!{+P zJum#{PrqON-ten`dhWTF|Nhq2>7S2`9Ps;Mp#4zNhG$=CYks|a@!EmtXz%ph{h!6c zJ6EKk;8DxG)}ed~Am?qN`0ij0xEoloUa-@by!Tiz=S z10)h$)IZ+c2jTRB@DG3UsY?_D)`x!>Qk3vZ<{P+KEnB#LtJXYBPam})xMb|>#VGt$EE082&WzIUD}syBI(ek zN)D+HY-Bi?5nId|cKUbr!b-QVx>@HW;yocC&ko8dhx_1ZF#eE@%*|oIFPcVbueJ>H zs>s9$UbGTVk`m}vLh%YBnJ{$aTR;BI#t+_q;fF)3U;OWH|J(ol_KQPXPv{<(edDQ9 z(IHpcUSGenzjpC%HeN_|)3w_sa&V$w0uMo{(4decyln9TXMo}X@NvoNi|%j<8n$@T z5=VPhx*?4$$Wl%g<^u>OEb+AqPeAJIFRQ|`?rd6-kR&F3hPr(*d~k5{Nw;b^H6|v8 z2QP$(-5kR)^qp}V-sV@PQE1P1R}r~{kFGrT-H1Qr{`Ae8lTTmR`t5(K{`|dnF1&N> zldE-C2cCNB>^C1-w0P~>#fvMjC~zxV{wFCd+Ib8Uo}FS^5b?$VP-hME0CYAxItkzt zP&5@86X13bAI`7<69ussR2u|Jy9nU3eu0$&L%1m>2}pv1*pr#ZEghYdAdxbVf+&;RSi&tG_R=#!<#MrQ)1_Pnus*&FNk?OVTiQ7ybl3hzky z`nI%ea(pJY5j<#q)P{^Wsj8*Lm-qXY0%{`=(c@Q5kR87^A{WLI4hTpaOM;Q})j%=Zns{XC zlSsaVjvY}Kwc%wt4=JI&Ab~*?$4ua7T?roFULs!q6B>D|X}ry_O~7j>-Uo&!7tleU zPsq;iel+;AANfNnPPbaM26O=J}AUf&#qD9Mh0)C4Ytt7I2 z8asZ(sCp1As?u54V9hIp*k(1r70}@WO>48spQm;5nydth$Ht7zgx+AF+bn%hj}fA61v@cD}u zo;+4^dgxEDZrSqA7hmjY`qRaMtJklNZa;D0?Cx(aTMKFZMg10dhX>2B4HXz$C<6H0 z#H)x;6(%fQ9mte24p_tbx@A z(7?N{m|P^F1)g?F;>|z!Hw<`I8prbl`&H}N`f?lb*acLE5>-$MNi`#8=sX4l+-Q>P zwGmPUklKS~j3%+O7o~XdFj*_DkOgWraOSm_j=%i7;{2=QBVW|L@U#Cn@xwQ_96Q#u zW_8j@^~tLl;5pWV^8o2vwES`-zkuCFaIi7~J^`*TDcYy!Ar1na0~%p~BiU`AiT%un z8)6}7SOG2qVk5#j+-9+ghLP%D>}=>~Gq!-ZhxK1`@YCGFP5^A>i>E+zuvVew*2+rx zL?1h;vMDWK{P(Yg|L#ZXgbf!T|8Un&KltD;lYjXA(vx*{7tih=9avW2Gj(~<`t{&_ z7cGyE)vK-*!M|d#j)j@9gefj2%efZm9b!r>Vd?CvW(6n-J}k>@@Bu#+xKv^|y*&tY z4l-NGjPRh=UwX>O-UrjzsNiJ%v3J4ku7|aUt(PU^$gzOt?SKB|L0yt;B;o0o-v8;( z6n`!b|6bm^15Io8?N2D^9Q9nZe(_@PzdKhhkG(DGk2UE{jY7SK7#Op0Ka6c)6C_(< z#Jkg&%y{bXb(aJFnl(XlS59~7|F^j$96gvbQr7isqF`%r5-CmPyhJ+_g_of!4|)}u=vEXWd)rBouxa=7lZZNxpVE#f+dfxXgdeg|I>z&wo)6p;a3p_ZkND{efBMaj{`qD0_3@eLLup@> z!mEEiQ+JALch;_qmq=?1LZzyBeJq4cLcQn1WrrRZs+zsW>IB7g`=4&w``Et!diSZ* zzyHOr2Cn<9IrPRM?wz8}{VC<;14T8R9g@(oP>HdqBOY>BCYF%zKH_^|%XnY|v)T^s zd8GKABZrRcU>|y_>CjVK6TLDzPyPG8^=HdP<(&bg13`-;)iv0SNE_V|Hh$5&OZ9-PyE;X`x`qK?><|za{pL{N9VGY z@z>y0d`-P7zP~>4RIsgB`i(^|5f-Ph4g zrPrU?pkBJYqV!~>?m%-rAXac>`_6q+|MJK{&HCN_9YygPjV8WdYV41X1^7%R*n5bm zuQcA*2|sLu={raL51d%qmXXn=esqWDR7Zz&@73jN|Mg!w{RZ}z$MfUif%&y~QUB%3 zv9Wp<{EJk*MdS9bZ9HrXyI=DWb!O~1@aT@w(u~p9eWs)$Rs8k+%WI{*H3RJ0j%)h( z*x3GS@t5N-f2N7G0DQ5U*ivTmLAp7nB9GwLz4n&ER&CjoR4R%ukKS9ed}Vn@Z)d+} z`O5gqs>_!@yL=gNgwW3v8>{Jo3usXn_Fd+nMA;4`y?*EFh9#(7YsMpHl5?3Ll+F_n=L`rA&aNR-i8Dz)&9@wemS zZ$qj@b^F@w+j@BIh1D2)O;t*JEJfw@k61Io?yUFDRB4Se^u`U30i{Q2QHLi)EqskA zzN6@xMt?0<&liI45CWP-Zqu^=h_E@=%#wu4n?0nRwVuEIZF6(4M|p={&-VyzRMiK= z#zP;g*IVEZJ+K<}w>2sylR0n#XD{g`a=t`VR8Sxd{_Vd$Q?Klm8u^VX5&RbwV{-j% zA^eRcvl)z^K2}q}_+C3`hCI|L zBD^km4wlejQAwG=g@Tt$#hlHT$n~qTvn{Lme7;4)hu3t$@FCD$i>5=wI9?aT=nX8r z#gfeeXA2?+J_Fl5kUc#JWf5cf=wP|4n}tG%RPZxze8TVv0X|iciV;3{aJgy2aUTAg znjnNM2wA`!YV?qFW{!J7z$~=z30I=0yl{9gEErn)Kk{G@VGv*tU=UysU=UysU=Uys zU=UysU=UysU=UysU=UysU=UysU=UysU=UysU=UysU=UysU=UysU=UysU=UysU=Uys ZU=UysU=UysU=UysU=Uys_=iW}{{w8+r9l7y diff --git a/programs/cos.rip b/programs/cos.rip old mode 100755 new mode 100644 diff --git a/programs/debog.bat b/programs/debog.bat deleted file mode 100755 index aedbb4e..0000000 --- a/programs/debog.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -..\util\td %1 diff --git a/programs/detect.asm b/programs/detect.asm new file mode 100644 index 0000000..875b608 --- /dev/null +++ b/programs/detect.asm @@ -0,0 +1,606 @@ +.model tiny +.486 +smart +.code + +org 0100h + +include ..\include\pci.h + +start: +call cleartext + +call getpciinfos +mov pciversion,bx +mov nbbus,cl +mov pcitype,al + +mov si,offset msg +call showstring0 +call line + +mov si,offset pcivers +call showstring0 +xor edx,edx +mov dx,bx +xchg dl,dh +mov cx,8 +call showhex +mov si,offset poin +call showstring0 +shr dx,8 +call showhex +mov si,offset pcivers2 +call showstring0 +call line + +mov si,offset nbbuses +call showstring0 +xor edx,edx +mov dl,nbbus +inc dl +call showint +call line + +mov si,offset typesof +call showstring0 +mov di,offset types +mov bx,7 +mov al,pcitype +vote: +bt ax,bx +jnc nowas +shl bx,1 +mov si,[di+bx] +call showstring0 +mov si,offset spac +call showstring0 +shr bx,1 +nowas: +dec bx +jns vote +call line + +xor ax,ax +xor cx,cx +mov di,offset infos +search: +call Getallfunctionsinfos +jc stopthis + +push cx di +mov si,offset msg1 +call showstring0 +mov cx,16 +xor edx,edx +mov dx,[di+pci.device] +call showhex +mov si,offset msg2 +call showstring0 +mov dx,[di+pci.vendor] +call showhex +mov si,offset msg3 +call showstring0 +mov cl,[di+pci.class] +mov ch,[di+pci.subclass] +mov di,offset temp +call getpciclass +mov si,di +call showstring0 +mov si,offset poin +call showstring0 +mov di,offset temp +call getpcisubclass +mov si,di +call showstring0 +call line +pop di cx + +jmp noerror +noerror: +inc ch +cmp ch,7 +jbe search +stopthis: +xor ch,ch +inc cl +cmp cl,31 +jbe search +xor cl,cl +inc al +cmp al,16 +jbe search +ret + +msg3 db ' Classe:',0 +msg1 db 'Peripherique :',0 +msg2 db ' Constructeur :',0 +msg db 'COS2000 hardware detecteur V1.1',0 +pcivers db 'BIOS PCI version ',0 +pcivers2 db ' a ete detecte !',0 +nbbuses db 'Nombre de bus : ',0 +typesof db 'Caracterisques PCI: ',0 +poin db '.',0 +virg db ', ',0 +spac db ' ',0 +temp db 128 dup (0) + +types dw config1 + dw config2 + dw poin + dw poin + dw config3 + dw config4 + dw poin + dw poin + +config1 db 'Config Mechanism 1',0 +config2 db 'Config Mechanism 2',0 +config3 db 'Special Cycle Mechanism 1',0 +config4 db 'Special Cycle Mechanism 2',0 + +PciVersion dw 0 +Nbbus db 0 +PciType db 0 +infos db 256 dup (0) + +;fonction 0-7 bus 0-255 device 0-31 + +;renvoie en es:di de classe cl +getpciclass: +push ax cx si di ds es +push es +push di +mov di,cx +and di,0FFh +shl di,1 +mov di,[offset classes+di] +mov cx,0FFh +mov al,0 +push cs +pop es +repne scasb +sub cx,0FFh +neg cx +sub di,cx +mov si,di +push cs +pop ds +pop di +pop es +rep movsb +pop es ds di si cx ax +ret + +;renvoie en es:di la sous-classe de ch et de classe cl +getpcisubclass: +push ax cx si di ds es +push es +push di +mov di,cx +and di,0FFh +shl di,1 +mov di,[offset classesd+di] +xchg ch,cl +xor ch,ch +cmp cx,80h +jne suiteac +mov di,offset divers +jmp found +suiteac: +shl cx,1 +add di,cx +mov di,[di] +found: +mov cx,0FFh +mov al,0 +push cs +pop es +repne scasb +sub cx,0FFh +neg cx +sub di,cx +mov si,di +push cs +pop ds +pop di +pop es +rep movsb +pop es ds di si cx ax +ret +divers db 'divers',0 + +classes: +dw offset class0 +dw offset class1 +dw offset class2 +dw offset class3 +dw offset class4 +dw offset class5 +dw offset class6 +dw offset class7 +dw offset class8 +dw offset class9 +dw offset class10 +dw offset class11 +dw offset class12 +class0 db 'Ancien',0 +class1 db 'Stockage',0 +class2 db 'Reseau',0 +class3 db 'Affichage',0 +class4 db 'Multimedia',0 +class5 db 'Memoire',0 +class6 db 'Pont',0 +class7 db 'Communication',0 +class8 db 'Systeme',0 +class9 db 'Acquisition',0 +class10 db 'Dock',0 +class11 db 'Processeur',0 +class12 db 'Bus serie',0 + +;Classes et sous classes +classesd: +dw offset class0d +dw offset class1d +dw offset class2d +dw offset class3d +dw offset class4d +dw offset class5d +dw offset class6d +dw offset class7d +dw offset class8d +dw offset class9d +dw offset class10d +dw offset class11d +dw offset class12d + +class0d: +dw offset subclass00 +dw offset subclass01 +subclass00 db 'divers',0 +subclass01 db 'vga',0 + +class1d: +dw offset subclass10 +dw offset subclass11 +dw offset subclass12 +dw offset subclass13 +subclass10 db 'scsi',0 +subclass11 db 'ide',0 +subclass12 db 'disquette',0 +subclass13 db 'ipi',0 + +class2d: +dw offset subclass20 +dw offset subclass21 +dw offset subclass22 +subclass20 db 'ethernet',0 +subclass21 db 'token ring',0 +subclass22 db 'fddi',0 + +class3d: +dw offset subclass30 +dw offset subclass31 +subclass30 db 'vga',0 +subclass31 db 'xga',0 + +class4d: +dw offset subclass40 +dw offset subclass41 +subclass40 db 'video',0 +subclass41 db 'audio',0 + +class5d: +dw offset subclass50 +dw offset subclass51 +subclass50 db 'ram',0 +subclass51 db 'flash',0 + +class6d: +dw offset subclass60 +dw offset subclass61 +dw offset subclass62 +dw offset subclass63 +dw offset subclass64 +dw offset subclass65 +dw offset subclass66 +dw offset subclass67 +subclass60 db 'hote',0 +subclass61 db 'isa',0 +subclass62 db 'eisa',0 +subclass63 db 'mc',0 +subclass64 db 'pci',0 +subclass65 db 'pcmcia',0 +subclass66 db 'nubus',0 +subclass67 db 'cardbus',0 + +class7d: +dw offset subclass70 +dw offset subclass71 +subclass70 db 'serie',0 +subclass71 db 'parallele',0 + +class8d: +dw offset subclass80 +dw offset subclass81 +dw offset subclass82 +subclass80 db 'pic 8259a',0 +subclass81 db 'dma 8237',0 +subclass82 db 'tim 8254',0 + +class9d: +dw offset subclass90 +dw offset subclass91 +dw offset subclass92 +subclass90 db 'clavier',0 +subclass91 db 'stylo',0 +subclass92 db 'souris',0 + +class10d: +dw offset subclass100 +subclass100 db 'station',0 + +class11d: +dw offset subclass110 +dw offset subclass111 +dw offset subclass112 +dw offset subclass113 +dw offset subclass114 +subclass110 db '386',0 +subclass111 db '486',0 +subclass112 db 'pentium',0 +subclass113 db 'alpha',0 +subclass114 db 'coprocesseur',0 + +class12d: +dw offset subclass120 +dw offset subclass121 +dw offset subclass122 +dw offset subclass123 +subclass120 db 'firewire',0 +subclass121 db 'access',0 +subclass122 db 'ssa',0 +subclass123 db 'usb',0 + +;bx pci version, cl nbbus, al pci type +getPciInfos: + push dx + mov ax,0B101h + xor edi,edi + mov edx," PCI" + int 1Ah + jc ErrorPci + cmp dx,04350h + jne ErrorPci + clc + pop dx + ret +errorpci: + stc + pop dx + ret + +;al=bus bl=index cl=deviceid ch=func->dl +getfunctioninfo: + push eax bx cx + mov ah,80h + shl eax,16 + mov ah,cl + shl ah,3 + or ah,ch + mov al,bl + and al,0fch + mov dx,0cf8h + out dx,eax + mov dx,0CFCh + and bl,3 + or dl,bl + in al,dx + mov dl,al + pop cx bx eax + ret + +;al=bus cl=deviceid ch=func es:di +Getallfunctionsinfos: + push ax bx dx di + xor bl,bl +goinfos: + call getfunctioninfo + inc bl + cmp bl,2 + ja notzarb + cmp dl,0FFh + je notexist +notzarb: + mov es:[di],dl + inc di + cmp bl,255 + jb goinfos + pop di + push di + cmp word ptr [di],0000h + je notexist + clc + pop di dx bx ax + ret +notexist: + stc + pop di dx bx ax + ret + +;=============CLEAR========= +;Efface l'ecran texte +;-> +;<- +;============================= +cleartext: +push es eax cx di +xor di,di +mov ax,0b800h +mov es,ax +mov eax,07200720h +mov cx,cs:pagesize +shr cx,2 +cld +rep stosd +mov cs:xy,0 +mov cs:x,0 +mov cs:y,0 +pop di cx eax es +ret + + +;==========LINE========= +;remet le curseur a la ligne +;-> +;<- +;============================= +line: +push bx cx di es +mov bh,cs:x +mov bl,cs:y +xor bh,bh +mov cl,cs:lines +dec cl +dec cl +cmp bl,cl +jne scro +dec bl +mov cl,1 +call scrolldown +scro: +inc bl +call setxy +pop es di cx bx +ret + +;==========SETXY========= +;Change les coordonnées du curseur a X:AH,Y:AL +;-> AX +;<- es di +;============================= +setxy: +push ax bx dx +mov cs:x,bh +mov cs:y,bl +mov al,bl +mov bl,bh +xor bh,bh +mov di,bx +mul cs:columns +add di,ax +shl di,1 +mov cs:xy,di +mov ax,0B800h +mov es,ax +pop dx bx ax +ret + +;==========SCROLLDOWN========= +;defile de cx lines vers le bas +;-> CX +;<- +;============================= +scrolldown: +push ax cx dx si di ds es +mov si,0B800h +mov es,si +mov ds,si +mov ax,cx +mul cs:columns +shl ax,1 +mov si,ax +mov cx,cs:pagesize +sub cx,si +xor di,di +cld +rep movsb +pop es ds di si dx cx ax +ret + + +;===================================Afficher un int EDX a l'‚cran en ah,al================ +ShowInt: + push eax bx cx edx esi di es ds + mov di,cs:xy + mov cx,0B800h + mov es,cx + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint3: + xor edx,edx + div esi + add dl,'0' + mov dh,7 + sub bx,2 + add cx,2 + mov cs:[bx],dx + cmp ax,0 + jne decint3 + mov si,bx + push cs + pop ds + cld + rep movsb + mov cs:xy,di + pop ds es di esi edx cx bx eax +ret + +;================Affiche la chaine 0 de caractŠre contenue dans ds:si +showstring0: + push es cx si di + mov di,cs:xy + mov cx,0B800h + mov es,cx + mov ch,cs:colors +strinaize0: + mov cl,[si] + cmp cl,0 + je no0 + mov es:[di],cx + add di,2 + inc si + jmp strinaize0 + no0: + mov cs:xy,di + pop di si cx es + ret + +;==============================Affiche le nombre nb hexa en EDX============== +ShowHex: + push es ax bx cx edx di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors + shr ax,2 +Hexaize: + rol edx,4 + mov bx,dx + and bx,0fh + mov cl,cs:[bx+offset Tab] + mov es:[di],cx + add di,2 + dec al + jnz Hexaize + mov cs:xy,di + pop di edx cx bx ax es + ret + +Tab db '0123456789ABCDEF' +x db 0 +y db 0 +xy dw 0 +pagesize dw 80*25*2 +lines db 25 +columns db 80 +colors db 7 +showbuffer db 35 dup (0FFh) + +end start diff --git a/programs/editor.asm b/programs/editeur.asm old mode 100755 new mode 100644 similarity index 91% rename from programs/editor.asm rename to programs/editeur.asm index 9608987..1afa5f6 --- a/programs/editor.asm +++ b/programs/editeur.asm @@ -1,393 +1,394 @@ -.model tiny -.386c -.code -org 0100h - - -start: - mov ax,0305h - mov bx,0008h - int 16h - mov ax,0002 - int 47H - mov ah,2 - int 47h - xor ebp,ebp - xor ax,ax - mov fs,ax - mov ah,43 - int 47h -Adres: - mov di,offset infos - mov ah,34 - int 47h - dec byte ptr [di] - mov al,[di+1] - sub al,16 - mov bl,al - shr al,2 - mov [di+1],al - and bl,11b - mov [di+2],bl - mov al,[di+7] - cmp al,oldmode - je noinit - mov ah,2 - int 47h - mov oldmode,al - noinit: - mov bx,0 - mov ah,25 - int 47h - mov bh,infos - mov edi,ebp - mov ah,21 - mov cl,7 - int 47h -lines: - mov edx,edi - shr edx,4*4 - shl edx,4*3 - mov cx,16 - mov ah,10 - int 47h - mov si,offset dep - mov ah,13 - int 47h - mov dx,di - mov ah,10 - int 47h - mov ah,13 - mov si,offset spaces - int 47h - mov ah,5 - int 47h - mov al,infos+1 - mov cl,7 - mov ah,21 - int 47h - mov esi,edi -doaline: - mov edx,edi - shr edx,4*4 - shl edx,4*3 - mov fs,dx - mov dl,fs:[di] - mov ah,10 - mov cl,8 - int 47h - mov ah,5 - int 47h - inc edi - dec al - jnz doaline - mov edi,esi - mov si,offset spaces - mov ah,13 - int 47h - mov al,infos+1 - mov ah,21 - mov cl,7 - int 47h -doaline2: - mov edx,edi - shr edx,4*4 - shl edx,4*3 - mov fs,dx - mov dl,fs:[di] - mov ah,7 - int 47h - inc edi - dec al - jnz doaline2 - dec bh - je outes - cmp byte ptr infos+2,0 - je lines - mov ah,6 - int 47h - jmp lines -outes: - mov ah,21 - mov cl,112 - int 47h - mov bh,0 - mov bl,infos - mov si,offset menu - mov ah,14h - int 47h - waitkey: - mov ax,0 - int 16h - cmp ax,3B00h - jne suit - inc ebp - jmp adres - suit: - cmp ax,3C00h - jne suit2 - dec ebp - jmp adres - suit2: - cmp ax,3D00h - jne suit3 - add ebp,24*16 - jmp adres - suit3: - cmp ax,3E00h - jne suit4 - sub ebp,24*16 - jmp adres - suit4: - cmp ax,3F00h - jne suit5 - add ebp,010000h - jmp adres - suit5: - cmp ax,4000h - jne suit6 - sub ebp,010000h - jmp adres - suit6: - cmp ax,4100h - jne suit7 - mov ah,21 - mov cl,116 - int 47h - mov dword ptr [pope],'TIDE' - mov bl,infos - xor bh,bh - mov si,offset menu - mov ah,14h - int 47h - mov ah,21 - mov cl,7 - int 47h - mov ax,0B800h - mov es,ax - mov xxyy2,3 - mov xxyy,3 - call calc1 - call calc2 -waitst: - mov ax,0 - int 16h - cmp ah,41h - jne tre - mov dword ptr [pope],' EUV' - push cs - pop es - jmp adres -tre: - cmp al,0 - jne write - cmp ah,48h - jne tre1 - cmp yy,0 - je waitst - dec yy - jmp cursor -tre1: - cmp ah,50h - jne tre2 - mov al,infos - dec al - xor ah,ah - cmp yy,ax - je waitst - inc yy - jmp cursor -tre2: - cmp ah,4Dh - jne tre4 - cmp xx,15 - je waitst - inc xx - jmp cursor -tre4: - cmp ah,4Bh - jne waitst - cmp xx,0 - je waitst - dec xx - jmp cursor -write: - call AsciiHex2dec - cmp cl,15 - ja waitst - call calc1 - call calc2 - mov edi,es:[bx-1] - mov dx,es:[si-1] - mov byte ptr es:[bx],0112 - mov es:[bx-1],al -writs: - mov ax,0 - int 16H - mov ch,cl - call AsciiHex2dec - cmp cl,15 - ja writs - shl ch,4 - add ch,cl - mov es:[bx+1],al - mov es:[si-1],ch - mov ax,bx - call calc3 - mov gs:[bx],ch - pusha - popa - mov cl,gs:[bx] - cmp ch,cl - je no - push si ax - mov ah,25 - mov bl,infos - xor bh,bh - int 47h - mov ah,21 - mov cl,117 - int 47h - mov si,offset msg - mov ah,13 - int 47h - mov ax,0 - int 16h - mov bl,infos - xor bh,bh - mov ah,25 - int 47h - mov ah,21 - mov cl,116 - int 47h - mov ah,13 - mov si,offset menu - int 47h - pop bx si - mov es:[bx-1],edi - mov es:[si-1],dx - no: - - inc xx - cmp xx,16 - jne pasde - inc yy - mov xx,0h - pasde: - call calc1 - call calc2 - jmp waitst - -cursor: - call calc1 - call calc2 - jmp waitst - suit7: - cmp ax,4200h - jne adres - mov ah,27 - int 47h - db 0CBH ; +++++++ - ret - -calc1: - push ax dx si - mov ax,xx - mov dx,xx - shl ax,2 - shl dx,1 - add ax,dx - add ax,27 - mov bx,YY - mov dx,yy - shl bx,5 - shl dx,7 - add bx,dx - add bx,ax - mov byte ptr es:[bx],112 - mov byte ptr es:[bx+2],112 - mov si,xxyy - mov byte ptr es:[si],07 - mov byte ptr es:[si+2],07 - mov xxyy,bx - pop si dx ax - ret - -calc2: - push ax bx dx - mov si,YY - mov dx,yy - shl si,5 - shl dx,7 - add si,dx - mov dx,xx - shl dx,1 - add si,dx - add si,129 - mov byte ptr es:[si],112 - mov bx,xxyy2 - mov byte ptr es:[bx],07 - mov xxyy2,si - pop dx bx ax - ret - -calc3: - push dx - xor ebx,ebx - mov bx,xx - mov dx,yy - shl dx,4 - add bx,dx - add ebx,ebp - mov edx,ebx - shr edx,4*4 - shl edx,4*3 - mov gs,dx - pop dx - ret - - asciihex2dec: - cmp al,'a' - jb nomin - cmp al,'f' - ja nomin - sub al,'a'-'A' - jmp ismaj - nomin: - cmp al,'A' - jb nomaj - cmp al,'F' - ja nomaj - ismaj: - mov cl,al - sub cl,'A'-10 - jmp endt - nomaj: - mov cl,al - sub cl,'0' - endt: - ret - -dep db ':',0 -sect dw 0 -xx dw 0 -yy dw 0 -xxyy dw 3 -xxyy2 dw 3 -msg db 'Error : Unchangeable area (ROM) press a key to continu ',0 -menu db 'Top F1, Bottom F2, Offset F3&F4, Segment F5&F6, Mode F7, Quit F8 MODE ' -pope db 'VUE ',0 -spaces db ' ³ ',0 - -showbuffer db 35 dup (0FFh) -oldmode db 0 -infos db 40 dup (0) -end start - - - - - - - - +.model tiny +.386c +.code +org 0100h + + +start: + mov ax,0305h + mov bx,0008h + int 16h + mov ax,0002 + int 47H + mov ah,2 + int 47h + xor ebp,ebp + xor ax,ax + mov fs,ax + mov ah,43 + int 47h +Adres: + mov di,offset infos + mov ah,34 + int 47h + dec byte ptr [di] + mov al,[di+1] + sub al,16 + mov bl,al + shr al,2 + mov [di+1],al + and bl,11b + mov [di+2],bl + mov al,[di+7] + cmp al,oldmode + je noinit + mov ah,2 + int 47h + mov oldmode,al + noinit: + mov bx,0 + mov ah,25 + int 47h + mov bh,infos + mov edi,ebp + mov ah,21 + mov cl,7 + int 47h +lines: + mov edx,edi + shr edx,4*4 + shl edx,4*3 + mov cx,16 + mov ah,10 + int 47h + mov si,offset dep + mov ah,13 + int 47h + mov dx,di + mov ah,10 + int 47h + mov ah,13 + mov si,offset spaces + int 47h + mov ah,5 + int 47h + mov al,infos+1 + mov cl,7 + mov ah,21 + int 47h + mov esi,edi +doaline: + mov edx,edi + shr edx,4*4 + shl edx,4*3 + mov fs,dx + mov dl,fs:[di] + mov ah,10 + mov cl,8 + int 47h + mov ah,5 + int 47h + inc edi + dec al + jnz doaline + mov edi,esi + mov si,offset spaces + mov ah,13 + int 47h + mov al,infos+1 + mov ah,21 + mov cl,7 + int 47h +doaline2: + mov edx,edi + shr edx,4*4 + shl edx,4*3 + mov fs,dx + mov dl,fs:[di] + mov ah,7 + int 47h + inc edi + dec al + jnz doaline2 + dec bh + je outes + cmp byte ptr infos+2,0 + je lines + mov ah,6 + int 47h + jmp lines +outes: + mov ah,21 + mov cl,112 + int 47h + mov bh,0 + mov bl,infos + mov si,offset menu + mov ah,14h + int 47h + waitkey: + mov ax,0 + int 16h + cmp ax,3B00h + jne suit + inc ebp + jmp adres + suit: + cmp ax,3C00h + jne suit2 + dec ebp + jmp adres + suit2: + cmp ax,3D00h + jne suit3 + add ebp,24*16 + jmp adres + suit3: + cmp ax,3E00h + jne suit4 + sub ebp,24*16 + jmp adres + suit4: + cmp ax,3F00h + jne suit5 + add ebp,010000h + jmp adres + suit5: + cmp ax,4000h + jne suit6 + sub ebp,010000h + jmp adres + suit6: + cmp ax,4100h + jne suit7 + mov ah,21 + mov cl,116 + int 47h + mov dword ptr [pope],'TIDE' + mov bl,infos + xor bh,bh + mov si,offset menu + mov ah,14h + int 47h + mov ah,21 + mov cl,7 + int 47h + mov ax,0B800h + mov es,ax + mov xxyy2,3 + mov xxyy,3 + call calc1 + call calc2 +waitst: + mov ax,0 + int 16h + cmp ah,41h + jne tre + mov dword ptr [pope],' EUV' + push cs + pop es + jmp adres +tre: + cmp al,0 + jne write + cmp ah,48h + jne tre1 + cmp yy,0 + je waitst + dec yy + jmp cursor +tre1: + cmp ah,50h + jne tre2 + mov al,infos + dec al + xor ah,ah + cmp yy,ax + je waitst + inc yy + jmp cursor +tre2: + cmp ah,4Dh + jne tre4 + cmp xx,15 + je waitst + inc xx + jmp cursor +tre4: + cmp ah,4Bh + jne waitst + cmp xx,0 + je waitst + dec xx + jmp cursor +write: + call AsciiHex2dec + cmp cl,15 + ja waitst + call calc1 + call calc2 + mov edi,es:[bx-1] + mov dx,es:[si-1] + mov byte ptr es:[bx],0112 + mov es:[bx-1],al +writs: + mov ax,0 + int 16H + mov ch,cl + call AsciiHex2dec + cmp cl,15 + ja writs + shl ch,4 + add ch,cl + mov es:[bx+1],al + mov es:[si-1],ch + mov ax,bx + call calc3 + mov gs:[bx],ch + pusha + popa + mov cl,gs:[bx] + cmp ch,cl + je no + push si ax + mov ah,25 + mov bl,infos + xor bh,bh + int 47h + mov ah,21 + mov cl,117 + int 47h + mov si,offset msg + mov ah,13 + int 47h + mov ax,0 + int 16h + mov bl,infos + xor bh,bh + mov ah,25 + int 47h + mov ah,21 + mov cl,116 + int 47h + mov ah,13 + mov si,offset menu + int 47h + pop bx si + mov es:[bx-1],edi + mov es:[si-1],dx + no: + + inc xx + cmp xx,16 + jne pasde + inc yy + mov xx,0h + pasde: + call calc1 + call calc2 + jmp waitst + +cursor: + call calc1 + call calc2 + jmp waitst + suit7: + cmp ax,4200h + jne adres + mov ah,27 + int 47h + db 0CBH ; +++++++ + ret + +calc1: + push ax dx si + mov ax,xx + mov dx,xx + shl ax,2 + shl dx,1 + add ax,dx + add ax,27 + mov bx,YY + mov dx,yy + shl bx,5 + shl dx,7 + add bx,dx + add bx,ax + mov byte ptr es:[bx],112 + mov byte ptr es:[bx+2],112 + mov si,xxyy + mov byte ptr es:[si],07 + mov byte ptr es:[si+2],07 + mov xxyy,bx + pop si dx ax + ret + +calc2: + push ax bx dx + mov si,YY + mov dx,yy + shl si,5 + shl dx,7 + add si,dx + mov dx,xx + shl dx,1 + add si,dx + add si,129 + mov byte ptr es:[si],112 + mov bx,xxyy2 + mov byte ptr es:[bx],07 + mov xxyy2,si + pop dx bx ax + ret + +calc3: + push dx + xor ebx,ebx + mov bx,xx + mov dx,yy + shl dx,4 + add bx,dx + add ebx,ebp + mov edx,ebx + shr edx,4*4 + shl edx,4*3 + mov gs,dx + pop dx + ret + + asciihex2dec: + cmp al,'a' + jb nomin + cmp al,'f' + ja nomin + sub al,'a'-'A' + jmp ismaj + nomin: + cmp al,'A' + jb nomaj + cmp al,'F' + ja nomaj + ismaj: + mov cl,al + sub cl,'A'-10 + jmp endt + nomaj: + mov cl,al + sub cl,'0' + endt: + ret + +dep db ':',0 +sect dw 0 +xx dw 0 +yy dw 0 +xxyy dw 3 +xxyy2 dw 3 + +msg db 'Erreur : zone non modifiable (ROM) pressez une touche pour continuer ',0 +menu db 'haut/bas [F1/2] Offset [F3/4] Segment [F5/6] Mode F7, Quitter F8 MODE ' +pope db 'VUE ',0 +spaces db ' ³ ',0 + +showbuffer db 35 dup (0FFh) +oldmode db 0 +infos db 40 dup (0) +end start + + + + + + + + diff --git a/programs/gestion.asm b/programs/gestion.asm new file mode 100644 index 0000000..d729164 --- /dev/null +++ b/programs/gestion.asm @@ -0,0 +1,194 @@ +.model tiny +.486 +smart +.code + +org 0100h + +include ..\include\fat.h + +start: +mov ah,2 +int 47h +mov ah,25 +mov bx,0 +int 47h +mov ah,21 +mov cl,70h +int 47h +mov ah,13 +mov si,offset msg1 +int 47h +mov ah,21 +mov cl,7 +int 47h +mov ah,13 +mov si,offset prompt +int 47h +mov ah,13 +mov si,offset infos +int 47h +mov ah,13 +mov si,offset prompt +int 47h +mov ah,3 +int 48h +xor bp,bp +mov di,offset bufferentry +mov si,di +mov ah,7 +int 48h +jc nofiles +go: +test [si+Entries.FileAttr],00010000b +je notdirectory +mov ah,21 +mov cl,4 +int 47h +jmp notall +notdirectory: +cmp [si+Entries.FilExt],'E' +jne notexe +cmp [si+Entries.FilExt+1],'X' +jne notexe +cmp [si+Entries.FilExt+2],'E' +jne notexe +mov ah,21 +mov cl,5 +int 47h +jmp notall +notexe: +cmp [si+Entries.FilExt],'S' +jne notsys +cmp [si+Entries.FilExt+1],'Y' +jne notsys +cmp [si+Entries.FilExt+2],'S' +jne notsys +mov ah,21 +mov cl,0Ah +int 47h +jmp notall +notsys: +mov ah,21 +mov cl,7h +int 47h +notall: +mov ah,46 +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,44 +mov dx,[si+Entries.FileDateCrea] +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,45 +mov dx,[si+Entries.FileTimeCrea] +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,44 +mov dx,[si+Entries.FileDate] +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,45 +mov dx,[si+Entries.FileTime] +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,48 +mov edx,[si+Entries.FileSize] +int 47h +mov ah,05 +int 47h +int 47h +int 47h +mov ah,47 +mov dl,[si+Entries.FileAttr] +int 47h +mov ah,6 +int 47h +inc bp +mov ah,8 +int 48h +jnc go +nofiles: +mov ah,21 +mov cl,70h +int 47h +mov ah,13 +mov si,offset menu +int 47h +mov xx,1 +mov xxold,2 +call Select +endof: +mov ax,0 +int 16h + cmp ah,50h + jne tre1 + cmp xx,bp + je endof + inc xx + call select + jmp endof +tre1: + cmp ah,48h + jne tre2 + cmp xx,1 + je endof + dec xx + call select + jmp endof +tre2: + cmp al,0Dh + jne tre3 +tre3: + cmp ah,59 + jne tre4 + jmp start +tre4: + cmp ah,67 + jne endof + db 0CBh + +;selectionne la ligne xx +Select: +push ax di +mov di,xxold +mov al,7 +add di,3 +mov ah,32 +int 47h +mov ax,xx +mov xxold,ax +mov di,xx +mov ah,32 +mov al,112 +add di,3 +int 47h +pop di ax +ret + +xx dw 1 +xxold dw 0 +menu db '[F1] Lire disque [F9] Quitter ',0 +msg1 db ' Gestionnaire de fichier Version 1.0 ',0 +msg2 db 'Programme en cours de chargement',0 +prompt db '--------------------------------------------------------------------------------',0 +infos db 'Nom Ext. Date creation Date modification Taille Attributs',0 + +bufferentry equ $ + +end start diff --git a/programs/logo.asm b/programs/logo.asm old mode 100755 new mode 100644 index 255295b..0b40be1 --- a/programs/logo.asm +++ b/programs/logo.asm @@ -1,46 +1,82 @@ -.model tiny -.386c -.code -org 0100h - - -start: -mov si,offset logo -mov ah,4 -xor di,di -mov bx,6000h -mov es,bx -int 48h -push es -pop ds -mov bx,5000h -mov es,bx -xor si,si -xor di,di -mov ah,6 -int 48h -push es -pop ds -mov ax,0009h -int 47h -mov ah,38 -int 47h -mov ah,35 -int 47h -mov ah,37 -int 47h -mov ah,2 -int 47h -mov cx,400 -mov bx,40 -mov ah,36 -int 47h -mov ax,0 -int 16h -mov ah,39 -int 47h -mov ax,0004 -int 47h -db 0CBH -logo db 'cos.rip',0 -end start +.model tiny +.386c +.code +org 0100h + + +start: +mov si,offset logo +mov ah,4 +xor di,di +mov bx,8000h +mov es,bx +int 48h +jc problem + +push es +pop ds +mov bx,7000h +mov es,bx +xor si,si +xor di,di +mov ah,6 +int 48h +jc problem2 + +push es +pop ds +xor si,si + +mov ax,0008h +int 47h +mov ah,38 +int 47h +mov ah,2 +int 47h +mov cx,300 +mov bx,30 +mov ah,37 +int 47h +mov ah,15h +mov cl,11 +int 47h +push cs +pop ds +mov ah,13 +mov si,offset poper +int 47h +mov ax,0 +int 16h +mov ah,39 +int 47h +mov ax,0004 +int 47h +db 0CBH + +problem: +push cs +pop ds +mov ah,13 +mov si,offset error +int 47h +mov ax,0 +int 16h +db 0CBh + +problem2: +push cs +pop ds +mov ah,13 +mov si,offset error2 +int 47h +mov ax,0 +int 16h +db 0CBh + +poper db 'COS2000 en mode graphique',0 +logo db 'cos.rip',0 +ok1 db 'Chargement de l''image OK',0 +ok2 db 'Decompression de l''image OK',0 +error db 'Une erreur est apparue lors du chargement de l''image',0 +error2 db 'Une erreur est apparue lors de la decompression de l''image',0 +end start diff --git a/programs/lpt/com.asm b/programs/lpt/com.asm old mode 100755 new mode 100644 index d9b7f42..4c83399 --- a/programs/lpt/com.asm +++ b/programs/lpt/com.asm @@ -1,471 +1,471 @@ -.model tiny -.486 -smart -.code -org 0100h -start: -;call setemettor -call getfirstlpt -call initlpt -call receivecommand -ret - - - -gogo db 'Salut' -gotoz db 23 dup (0) - -;Re‡ois une commande et l'execute -Receivecommand: -push ax bx cx di es -push cs -pop es -mov di,offset command -call receivelptblock -mov bl,al -xor bh,bh -shl bx,1 -add bx,offset cmd -call [bx] -pop es di cx ax -ret -command db 25 dup (0) -cmd dw nothings - dw sendram - -nothings: -ret - -Sendram: -push ax cx si ds -mov ax,es:[di] -mov si,ax -mov ax,es:[di+2] -mov ds,ax -mov cx,es:[di+2] -call sendlptblock -pop ds si cx ax -ret - - -;---------Segment Adress----------- -Bios equ 040h -;---------Offset Adress------------ -Lptadr equ 008h -Timer equ 06Ch -;---------Constant----------------- -onesec equ 18 -tensec equ 182 -Ack equ 00 -Nack equ 0FFh -maxtry equ 10 -tokenstart equ 0 -tokennext equ 1 -tokenstop equ 2 -tokenbad equ 3 -tokenresend equ 4 - - -Initlpt: -push ax ecx -call StartTimer -cmp emettor,0 -je receptinit -mov al,10000b -call SetLptOut -waitinit1: -call EndTimer -cmp cx,cs:timeout -ja errorinit -call getlptIn -cmp al,00000b -jnz waitinit1 -jmp endinit -receptinit: -call EndTimer -cmp cx,cs:timeout -ja errorinit -call getlptIn -cmp al,00000b -jnz receptinit -mov al,10000b -call SetLptOut -endinit: -clc -pop ecx ax -ret -errorinit: -stc -pop ecx ax -ret - - -;-Envoie DL (dh) JNE si problŠme JNC error timeout -Sendlpt: -push ax bx ecx -call StartTimer -mov dh,dl -mov al,dl -and al,0Fh -call SetLptOut -waitSend: -call EndTimer -cmp cx,cs:timeout -ja errorsend -call getlptIn -bt ax,4 -jnc waitsend -and al,0Fh -mov bl,al -call StartTimer ;///// -mov al,dh -shr al,4 -or al,10000b -call SetLptOut -waitSend2: -call EndTimer -cmp cx,cs:timeout -ja errorsend -call getlptIn -bt ax,4 -jc waitsend2 -and al,0Fh -shl al,4 -add bl,al -cmp dl,bl -pop ecx bx ax -clc -ret -errorsend: -pop ecx bx ax -stc -ret - - -;-Re‡ois DL (dh) -Receivelpt: -push ax bx ecx -call StartTimer -waitreceive: -call EndTimer -cmp cx,cs:timeout -ja errorreceive -call getlptIn -bt ax,4 -jnc waitreceive -and al,0Fh -mov dl,al -call SetLptOut -call StartTimer ;///// -waitreceive2: -call EndTimer -cmp cx,cs:timeout -ja errorreceive -call getlptIn -bt ax,4 -jc waitreceive2 -and al,0Fh -mov dh,al -shl dh,4 -add dl,dh -or al,10000b -call SetlptOut -clc -pop ecx bx ax -ret -errorreceive: -stc -pop ecx bx ax -ret - -;-AX -SetTimeout: -mov cs:Timeout,ax -ret - -timeout dw tensec - -getTimeout: -mov ax,cs:Timeout -ret - -SetEmettor: -mov cs:Emettor,1 -ret - -Emettor db 0 - -SetReceptor: -mov cs:Emettor,0 -ret - -;->bx Nøport->Adresse dx -GetLpt: -push ax bx ds -mov ax,bios -mov ds,ax -dec bx -shl bx,1 -mov dx,ds:[Lptadr+bx] -mov cs:lpt,dx -pop ds bx ax -ret -lpt dw 0 - -;->bx Nøport->Adresse dx -GetFirstLpt: -push ax ds -mov ax,bios -mov ds,ax -xor bx,bx -findlpt: -mov dx,ds:[Lptadr+bx] -cmp dx,0 -jne oklpt -add bx,2 -cmp bx,4 -jbe findlpt -oklpt: -mov cs:lpt,dx -pop ds ax -ret - -;-> -StartTimer: -push ax ecx ds -mov ax,Bios -mov ds,ax -mov ecx,ds:[timer] -mov times,ecx -pop ds ecx ax -ret -times dd 0 - -;->Ecx time elapsed -EndTimer: -push ax ds -mov ax,Bios -mov ds,ax -mov ecx,ds:[timer] -sub ecx,times -mov ecx,0 -pop ds ax -ret - -;-> -GetLptOut: -push dx -mov dx,lpt -in al,dx -pop dx -ret - -GetLptIn: -push dx -mov dx,lpt -inc dx -in al,dx -shr al,3 -pop dx -ret - -GetLptInOut: -push dx -mov dx,lpt -add dx,2 -in al,dx -and al,11111b -pop dx -ret - -SetLptOut: -push dx -mov dx,lpt -out dx,al -pop dx -ret - -SetLptIn: -push dx -mov dx,lpt -inc dx -out dx,al -pop dx -ret - -SetLptInOut: -push dx -mov dx,lpt -add dx,2 -out dx,al -pop dx -ret - -;R‚alise un checksum 8 bits sur donn‚es DS:SI, nb CX r‚sultat dans dl -Checksum8: -push cx si -check: -add dl,[si] -inc si -dec cx -jnz check -pop si cx -ret - -;DS:SI pointeur sur donn‚es, CX nombres de donn‚es, AL token -SendLptBlock: -push ax bx cx edx si edi bp -mov dx,cx -shl edx,16 -mov dh,al -call checksum8 -mov edi,edx -xor dh,dh -mov bp,dx -mov ah,maxtry -retry: -mov bl,4 -xor al,al -header: -mov dx,di -call sendlpt -setne al -jc outt -rol edi,8 -dec bl -jnz header -cmp al,0 -jne notgood -mov dl,ACK -jmp allsend -notgood: -mov dl,NACK -allsend: -call sendlpt -setne al -jc outt -cmp al,0 -je okheader -dec ah -jnz retry -jmp outt -okheader: -cmp cx,0 -je endoftrans -mov di,maxtry -retry2: -mov bx,cx -xor ax,ax -body: -mov dl,[si+bx-1] -add ah,dl -call sendlpt -setne al -jc outt -dec bx -jnz body -cmp al,0 -jne notgood2 -mov dl,ACK -jmp allisend -notgood2: -mov dl,NACK -allisend: -call sendlpt -setne al -jc outt -cmp al,0 -je endoftrans -dec di -jnz retry2 -outt: -stc -endoftrans: -mov al,ah -xor ah,ah -cmp bp,ax -pop bp edi si edx cx bx ax -ret - -;Receptionne en es:di les donn‚es au nombres de CX token AL (AH) (ECX) -receiveLptBlock: -push ax bx dx si bp -mov ah,maxtry -retrye: -mov bl,4 -headere: -call receivelpt -jc outte -mov cl,dl -rol ecx,8 -dec bl -jnz headere -call receivelpt -jc outte -cmp dl,ACK -je okheadere -dec ah -jnz retrye -jmp outte -okheadere: -mov al,ch -xor ch,ch -mov bp,cx -rol ecx,16 -cmp cx,0 -je endoftranse -mov si,maxtry -retrye2: -mov bx,cx -xor ah,ah -bodye: -call receivelpt -jc outte -mov es:[di+bx-1],dl -add ah,dl -dec bx -jnz bodye -call receivelpt -jc outte -cmp dl,ACK -je endoftranse -dec si -jnz retrye2 -outte: -stc -endoftranse: -mov bl,ah -xor bh,bh -cmp bp,bx -pop bp si dx bx ax -ret - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -end start; +.model tiny +.486 +smart +.code +org 0100h +start: +;call setemettor +call getfirstlpt +call initlpt +call receivecommand +ret + + + +gogo db 'Salut' +gotoz db 23 dup (0) + +;Re‡ois une commande et l'execute +Receivecommand: +push ax bx cx di es +push cs +pop es +mov di,offset command +call receivelptblock +mov bl,al +xor bh,bh +shl bx,1 +add bx,offset cmd +call [bx] +pop es di cx ax +ret +command db 25 dup (0) +cmd dw nothings + dw sendram + +nothings: +ret + +Sendram: +push ax cx si ds +mov ax,es:[di] +mov si,ax +mov ax,es:[di+2] +mov ds,ax +mov cx,es:[di+2] +call sendlptblock +pop ds si cx ax +ret + + +;---------Segment Adress----------- +Bios equ 040h +;---------Offset Adress------------ +Lptadr equ 008h +Timer equ 06Ch +;---------Constant----------------- +onesec equ 18 +tensec equ 182 +Ack equ 00 +Nack equ 0FFh +maxtry equ 10 +tokenstart equ 0 +tokennext equ 1 +tokenstop equ 2 +tokenbad equ 3 +tokenresend equ 4 + + +Initlpt: +push ax ecx +call StartTimer +cmp emettor,0 +je receptinit +mov al,10000b +call SetLptOut +waitinit1: +call EndTimer +cmp cx,cs:timeout +ja errorinit +call getlptIn +cmp al,00000b +jnz waitinit1 +jmp endinit +receptinit: +call EndTimer +cmp cx,cs:timeout +ja errorinit +call getlptIn +cmp al,00000b +jnz receptinit +mov al,10000b +call SetLptOut +endinit: +clc +pop ecx ax +ret +errorinit: +stc +pop ecx ax +ret + + +;-Envoie DL (dh) JNE si problŠme JNC error timeout +Sendlpt: +push ax bx ecx +call StartTimer +mov dh,dl +mov al,dl +and al,0Fh +call SetLptOut +waitSend: +call EndTimer +cmp cx,cs:timeout +ja errorsend +call getlptIn +bt ax,4 +jnc waitsend +and al,0Fh +mov bl,al +call StartTimer ;///// +mov al,dh +shr al,4 +or al,10000b +call SetLptOut +waitSend2: +call EndTimer +cmp cx,cs:timeout +ja errorsend +call getlptIn +bt ax,4 +jc waitsend2 +and al,0Fh +shl al,4 +add bl,al +cmp dl,bl +pop ecx bx ax +clc +ret +errorsend: +pop ecx bx ax +stc +ret + + +;-Re‡ois DL (dh) +Receivelpt: +push ax bx ecx +call StartTimer +waitreceive: +call EndTimer +cmp cx,cs:timeout +ja errorreceive +call getlptIn +bt ax,4 +jnc waitreceive +and al,0Fh +mov dl,al +call SetLptOut +call StartTimer ;///// +waitreceive2: +call EndTimer +cmp cx,cs:timeout +ja errorreceive +call getlptIn +bt ax,4 +jc waitreceive2 +and al,0Fh +mov dh,al +shl dh,4 +add dl,dh +or al,10000b +call SetlptOut +clc +pop ecx bx ax +ret +errorreceive: +stc +pop ecx bx ax +ret + +;-AX +SetTimeout: +mov cs:Timeout,ax +ret + +timeout dw tensec + +getTimeout: +mov ax,cs:Timeout +ret + +SetEmettor: +mov cs:Emettor,1 +ret + +Emettor db 0 + +SetReceptor: +mov cs:Emettor,0 +ret + +;->bx Nøport->Adresse dx +GetLpt: +push ax bx ds +mov ax,bios +mov ds,ax +dec bx +shl bx,1 +mov dx,ds:[Lptadr+bx] +mov cs:lpt,dx +pop ds bx ax +ret +lpt dw 0 + +;->bx Nøport->Adresse dx +GetFirstLpt: +push ax ds +mov ax,bios +mov ds,ax +xor bx,bx +findlpt: +mov dx,ds:[Lptadr+bx] +cmp dx,0 +jne oklpt +add bx,2 +cmp bx,4 +jbe findlpt +oklpt: +mov cs:lpt,dx +pop ds ax +ret + +;-> +StartTimer: +push ax ecx ds +mov ax,Bios +mov ds,ax +mov ecx,ds:[timer] +mov times,ecx +pop ds ecx ax +ret +times dd 0 + +;->Ecx time elapsed +EndTimer: +push ax ds +mov ax,Bios +mov ds,ax +mov ecx,ds:[timer] +sub ecx,times +mov ecx,0 +pop ds ax +ret + +;-> +GetLptOut: +push dx +mov dx,lpt +in al,dx +pop dx +ret + +GetLptIn: +push dx +mov dx,lpt +inc dx +in al,dx +shr al,3 +pop dx +ret + +GetLptInOut: +push dx +mov dx,lpt +add dx,2 +in al,dx +and al,11111b +pop dx +ret + +SetLptOut: +push dx +mov dx,lpt +out dx,al +pop dx +ret + +SetLptIn: +push dx +mov dx,lpt +inc dx +out dx,al +pop dx +ret + +SetLptInOut: +push dx +mov dx,lpt +add dx,2 +out dx,al +pop dx +ret + +;R‚alise un checksum 8 bits sur donn‚es DS:SI, nb CX r‚sultat dans dl +Checksum8: +push cx si +check: +add dl,[si] +inc si +dec cx +jnz check +pop si cx +ret + +;DS:SI pointeur sur donn‚es, CX nombres de donn‚es, AL token +SendLptBlock: +push ax bx cx edx si edi bp +mov dx,cx +shl edx,16 +mov dh,al +call checksum8 +mov edi,edx +xor dh,dh +mov bp,dx +mov ah,maxtry +retry: +mov bl,4 +xor al,al +header: +mov dx,di +call sendlpt +setne al +jc outt +rol edi,8 +dec bl +jnz header +cmp al,0 +jne notgood +mov dl,ACK +jmp allsend +notgood: +mov dl,NACK +allsend: +call sendlpt +setne al +jc outt +cmp al,0 +je okheader +dec ah +jnz retry +jmp outt +okheader: +cmp cx,0 +je endoftrans +mov di,maxtry +retry2: +mov bx,cx +xor ax,ax +body: +mov dl,[si+bx-1] +add ah,dl +call sendlpt +setne al +jc outt +dec bx +jnz body +cmp al,0 +jne notgood2 +mov dl,ACK +jmp allisend +notgood2: +mov dl,NACK +allisend: +call sendlpt +setne al +jc outt +cmp al,0 +je endoftrans +dec di +jnz retry2 +outt: +stc +endoftrans: +mov al,ah +xor ah,ah +cmp bp,ax +pop bp edi si edx cx bx ax +ret + +;Receptionne en es:di les donn‚es au nombres de CX token AL (AH) (ECX) +receiveLptBlock: +push ax bx dx si bp +mov ah,maxtry +retrye: +mov bl,4 +headere: +call receivelpt +jc outte +mov cl,dl +rol ecx,8 +dec bl +jnz headere +call receivelpt +jc outte +cmp dl,ACK +je okheadere +dec ah +jnz retrye +jmp outte +okheadere: +mov al,ch +xor ch,ch +mov bp,cx +rol ecx,16 +cmp cx,0 +je endoftranse +mov si,maxtry +retrye2: +mov bx,cx +xor ah,ah +bodye: +call receivelpt +jc outte +mov es:[di+bx-1],dl +add ah,dl +dec bx +jnz bodye +call receivelpt +jc outte +cmp dl,ACK +je endoftranse +dec si +jnz retrye2 +outte: +stc +endoftranse: +mov bl,ah +xor bh,bh +cmp bp,bx +pop bp si dx bx ax +ret + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +end start; diff --git a/programs/lpt/project1.dpr b/programs/lpt/project1.dpr old mode 100755 new mode 100644 index e4396d5..a771b7e --- a/programs/lpt/project1.dpr +++ b/programs/lpt/project1.dpr @@ -1,12 +1,12 @@ -program Project1; - -uses - Forms, - Unit1 in 'UNIT1.PAS' {Form1}; - -{$R *.RES} - -begin - Application.CreateForm(TForm1, Form1); - Application.Run; -end. +program Project1; + +uses + Forms, + Unit1 in 'UNIT1.PAS' {Form1}; + +{$R *.RES} + +begin + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/programs/lpt/project1.opt b/programs/lpt/project1.opt old mode 100755 new mode 100644 index 8aea239..8ebc76c --- a/programs/lpt/project1.opt +++ b/programs/lpt/project1.opt @@ -1,34 +1,34 @@ -[Compiler] -A=1 -B=0 -D=1 -F=0 -I=1 -K=1 -L=1 -P=1 -Q=0 -R=0 -S=1 -T=0 -U=1 -V=1 -W=0 -X=1 -Y=1 - -[Linker] -MapFile=0 -LinkBuffer=0 -DebugInfo=0 -OptimizeExe=0 -StackSize=16384 -HeapSize=8192 - -[Directories] -OutputDir= -SearchPath= -Conditionals= - -[Parameters] -RunParams= +[Compiler] +A=1 +B=0 +D=1 +F=0 +I=1 +K=1 +L=1 +P=1 +Q=0 +R=0 +S=1 +T=0 +U=1 +V=1 +W=0 +X=1 +Y=1 + +[Linker] +MapFile=0 +LinkBuffer=0 +DebugInfo=0 +OptimizeExe=0 +StackSize=16384 +HeapSize=8192 + +[Directories] +OutputDir= +SearchPath= +Conditionals= + +[Parameters] +RunParams= diff --git a/programs/lpt/project1.res b/programs/lpt/project1.res old mode 100755 new mode 100644 diff --git a/programs/lpt/unit1.dcu b/programs/lpt/unit1.dcu old mode 100755 new mode 100644 diff --git a/programs/lpt/unit1.dfm b/programs/lpt/unit1.dfm old mode 100755 new mode 100644 diff --git a/programs/lpt/unit1.pas b/programs/lpt/unit1.pas old mode 100755 new mode 100644 index 9546011..d3a6687 --- a/programs/lpt/unit1.pas +++ b/programs/lpt/unit1.pas @@ -1,517 +1,517 @@ -unit Unit1; - -interface - -uses - SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, - Forms, Dialogs, StdCtrls, Grids, Outline, DirOutln, FileCtrl, Buttons, - Gauges, ExtCtrls, Spin, Mask; - -type - TForm1 = class(TForm) - DriveComboBox1: TDriveComboBox; - FilterComboBox1: TFilterComboBox; - FileListBox1: TFileListBox; - DirectoryListBox1: TDirectoryListBox; - SpeedButton1: TSpeedButton; - SpeedButton2: TSpeedButton; - Memo1: TMemo; - Memo2: TMemo; - Memo3: TMemo; - SpeedButton3: TSpeedButton; - SpeedButton4: TSpeedButton; - Gauge1: TGauge; - SpeedButton5: TSpeedButton; - SpeedButton6: TSpeedButton; - SpinButton1: TSpinButton; - MaskEdit1: TMaskEdit; - SpeedButton8: TSpeedButton; - SpinButton2: TSpinButton; - okm: TCheckBox; - Label1: TLabel; - procedure FormActivate(Sender: TObject); - procedure SpinButton1DownClick(Sender: TObject); - procedure SpinButton1UpClick(Sender: TObject); - procedure showadress(Sender: TObject); - procedure SpeedButton6Click(Sender: TObject); - procedure SpeedButton8Click(Sender: TObject); - procedure MaskEdit1Change(Sender: TObject); - procedure SpinButton2DownClick(Sender: TObject); - procedure SpinButton2UpClick(Sender: TObject); - procedure SpeedButton3Click(Sender: TObject); - procedure Memo2Click(Sender: TObject); - - private - { Private-déclarations } - public - { Public-déclarations } - end; - -const UNESEC = 1000; - DIXSEC = 4000; - ACK = $00; - NAK = $FF; - MAXTRY = 5; - -type DBloc = array[ 1..15534 ] of byte; -type BHEADER = record - case boolean of - true : ( Checksum:byte; - Lenb : byte; - Lenh : byte; - Token : byte; - - ); - false : ( Champ : array[ 0..3 ] of byte ); - end; - -var - Form1: TForm1; - Inlpt : word; - Outlpt : word; - times : longint; - Block : DBLOC; - adress :longint; - errors: boolean; - reste:integer; - pop:boolean; - -implementation - -{$R *.DFM} - -function Getlpt( Number : integer ) : boolean; -begin - Outlpt := MemW[ $0040: 6 + Number * 2 ]; - if ( Outlpt <> 0 ) then - begin - Inlpt := Outlpt + 1; - Getlpt := TRUE; - end - else - Getlpt := FALSE; -end; - -function getfirstlpt:byte; -var i:integer; -begin -i:=1; - while (not(getlpt(i)) or (i>4)) do inc(i); - if (getlpt(i)=false) then i:=0; - getfirstlpt:= i; -end; - -function getb:byte; -begin - getb:=port[inlpt] and $F8 -end; - -procedure putb(what:byte); -begin - port[outlpt]:=what; -end; - -procedure starttimer; -begin - times:=GetTickCount; -end; - -function endtimer:longint; -begin - endtimer:=getTickCount-times; -end; - -function Initlpt( Emetteur : boolean ) : boolean; -begin - errors:=false; - putb($10); - putb($18); - putb($10); - starttimer; - if ( Emetteur ) then - begin - while ( ( GetB <> $00 ) and ( Endtimer <= DIXSEC ) ) do; - end - else - begin - while ( ( GetB <> $00 ) and ( Endtimer <= DIXSEC ) ) do; - PutB( $10 ); - end; - Initlpt := ( Endtimer <= DIXSEC ); -end; - -function sendlpt( Wert : byte ) : boolean; -var Retour : byte; -label fin; -begin -if errors then goto fin; - Starttimer; - PutB( Wert and $0F ); - while ( ( ( GetB and 128 ) = 0 ) and ( Endtimer <= DIXSEC )) do; - if ( Endtimer > DIXSEC ) then - begin - errors:=true; - goto fin; - end; - Retour := ( GetB shr 3 ) and $0F; - Starttimer; - PutB( ( Wert shr 4 ) or $10 ); - while ( ( ( GetB and 128 ) <> 0 ) and ( Endtimer <= DIXSEC ) ) do - if ( Endtimer > DIXSEC ) then - begin - errors:=true; - goto fin; - end; - Retour := Retour or ( ( GetB shl 1 ) and $F0 ); - fin: - sendlpt := ( Wert = Retour ); -end; - -function receivelpt : byte; -var LoNib, - HiNib : byte; -label fin; -begin - if errors then goto fin; - Starttimer; - while ( ( ( GetB and 128 ) = 0 ) and ( Endtimer <= DIXSEC )) do; - if ( Endtimer > DIXSEC ) then - begin - errors:=true; - goto fin; - end; - LoNib := ( GetB shr 3 ) and $0F; - PutB( LoNib ); - Starttimer; - while ( ( ( GetB and 128 ) <> 0 ) and ( Endtimer <= DIXSEC ) ) do; - if ( Endtimer > DIXSEC ) then - begin - errors:=true; - goto fin; - end; - HiNib := ( GetB shl 1 ) and $F0; - PutB( ( HiNib shr 4 ) or $10 ); - fin: - receivelpt := ( LoNib or HiNib ); -end; - -function checksum8(Nombre:word;Dptr : pointer):byte ; -var donnees : ^DBloc ; - i:word; - ch:byte; -begin -ch:=0; -donnees:=dptr; - for i:=1 to Nombre do ch:=ch + Donnees^[ i ]; - checksum8:=ch; - end; - -function SendlptBlock( Token : byte; - Nombre : word; - Dptr : pointer ):boolean; -var header : BHEADER; - ok : boolean; - i : word; - trys : word; - Donnees : ^DBloc; - label fin; -begin - form1.gauge1.visible:=true; - header.Token := Token; - header.Lenb := (Nombre and $FF00) shr 8; - header.Lenh := Nombre and $FF; - header.Checksum:=checksum8(nombre,Dptr); - trys := MAXTRY; - repeat - ok := TRUE; - for i := 0 to 3 do - ok := ok and sendlpt( Header.Champ[ i ] ); - if ( ok ) then - ok := ok and sendlpt( ACK ) - else - ok := ok and sendlpt( NAK ); - if ( not ok ) then - dec( trys ); - until ( ( ok ) or ( trys = 0 ) or (errors)); - if ( (trys = 0) or (errors)) then - begin - goto fin; - SendlptBlock:=false; - end; - if ( Nombre > 0 ) then - begin - Donnees := DPTR; - trys := MAXTRY; - repeat - ok := TRUE; - for i := Nombre downto 1 do - begin - ok := ok and sendlpt( Donnees^[ i ] ); - reste:=trunc(100-i/nombre*100); - form1.gauge1.progress:=reste - end; - if ( ok ) then - ok := ok and sendlpt( ACK ) - else - ok := ok and sendlpt( NAK ); - if ( not ok ) then - dec( trys ); - until ( ( ok ) or ( trys = 0 ) or (errors)); - if ( (trys = 0) or (errors)) then - begin - goto fin; - SendlptBlock:=false; - end; - end; - SendlptBlock:=true; - fin: - form1.gauge1.visible:=false; -end; - -function ReceivelptBlock( var Token : byte; - var Len : word; - Dptr : pointer ):boolean; -var header : BHEADER; - ok : boolean; - i : word; - trys : word; - EscapeStatus : boolean; - ByteBuffer : byte; - Donnees : ^DBloc; - label fin,good; -begin - form1.gauge1.visible:=true; - trys := MAXTRY; - repeat - for i:= 0 to 3 do - Header.Champ[ i ] := receivelpt; - ByteBuffer := receivelpt; - if ( ByteBuffer <> ACK ) then - dec( trys ); - until ( ( trys = 0 ) or ( ByteBuffer = ACK ) or (errors)); - if ( (trys = 0) or (errors)) then - begin - goto fin; - receivelptblock:=false; - end; - Token := Header.Token; - Len := Header.Lenh+(Header.Lenb shl 8); - if ( Len > 0 ) then - begin - Donnees := Dptr; - trys := MAXTRY; - repeat - for i := len downto 1 do - begin - Donnees^[ i ] := receivelpt; - reste:=trunc(100-i/len*100); - form1.gauge1.progress:=reste - end; - ByteBuffer := receivelpt; - if ( ByteBuffer <> ACK ) then - dec( trys ); - until ( ( trys = 0 ) or ( ByteBuffer = ACK ) ); - if ( trys = 0 ) then - begin - goto fin; - receivelptblock:=false; - end; - end; - receivelptblock:=true; - fin: - form1.gauge1.visible:=false; -end; - - -function Sendfile(name:string):boolean; -var lus:word; -Fichier:file; -begin -assign( Fichier, Name ); -reset( Fichier, 1 ); -Blockread( Fichier, Block, 15000, Lus ); -if lus>0 then -Sendfile:=SendlptBlock( 1, Lus, @Block ) -else -Sendfile:=false; -end; - -procedure TForm1.FormActivate(Sender: TObject); -begin -adress:=0; -showadress(sender); -Memo2Click(Sender); -SpeedButton8Click(Sender); -pop:=true; -end; - -procedure TForm1.SpinButton1DownClick(Sender: TObject); -begin -if (adress>0) and okm.checked then -begin -dec(adress); -SpeedButton6Click(Sender); -end; -end; - -procedure TForm1.SpinButton1UpClick(Sender: TObject); -begin -if (adress<65536*16) and okm.checked then -begin -inc(adress); -SpeedButton6Click(Sender); -end; -end; - -function hextoint(hex:string;n:word):longint; -var -resu,exp:longint; -i:word; -begin - hex :=UpperCase(hex); - resu:=0; - exp:=1; - for i:=n downto 1 do - begin - resu:=resu+(Pos(hex[i],'0123456789ABCDEF')-1)*(exp); - exp:=exp*16 - end; - hextoint:=resu; - end ; - - function adresstoint(hex:string):longint; -begin -adresstoint:=hextoint(Copy(hex, 1, 4),4)shl 4 + hextoint(Copy(hex, length(hex)-3, 4),4) -end; - -procedure TForm1.showadress(Sender: TObject); -var i,j,adh,adl:word; -adress2:longint; -old,old2:string; -begin -memo1.clear; -memo2.clear; -memo3.clear; -for i:=0 to 29 do -begin -adress2:=adress+i*16; -adl:=adress2 and $FFFF; -adh:=(adress2 and $F0000) shr 4; -memo1.lines.add(IntToHex(adh,4)+':'+IntToHex(adl,4)) ; -old:=''; -old2:=''; -for j:=1 to 16 do -begin -old:=old+inttohex(block[i*16+j],2); -if block[i*16+j]=0 then -old2:=old2+'.' -else -old2:=old2+char(block[i*16+j]) ; -if j mod 2=0 then old:=old+' '; -end; -memo2.lines.add(old) ; -memo3.lines.add(old2) ; -end -end; - -procedure TForm1.SpeedButton8Click(Sender: TObject); -begin -if getfirstlpt=0 then showmessage('Pas de port parallèle détecté'); -errors:=false; -end; - -procedure TForm1.SpeedButton6Click(Sender: TObject); -var adl,adh,good:word; -tok:byte; -ok:boolean; -begin -if (inlpt=0) then SpeedButton8Click(sender); -if ((inlpt<>0) and (initlpt(true))) then -begin - adl:=adress and $FFFF; - adh:=(adress and $F0000) shr 4; -Block[1]:=lo(adl); -Block[2]:= hi(adl); -Block[3]:= lo(adh); -Block[4]:= hi(adh); -Block[5]:= lo(512); -Block[6]:= hi(512) ; -ok:=false; -if SendlptBlock( 1,6,@Block) then ok:=receivelptBlock(tok,good ,@Block); {demande de RAM} -if not(ok) or errors then Showmessage('Erreur de transmission !!!!!!!!!!'); -showadress(sender); -end -else -Showmessage('Pas de PC distant'); -putb($08); -errors:=false; -end; - -procedure TForm1.MaskEdit1Change(Sender: TObject); -begin -if pop then -begin -adress:=adresstoint(maskedit1.text); -if okm.checked=true then SpeedButton6Click(sender); -showadress(sender); -end; -end; - -procedure TForm1.SpinButton2DownClick(Sender: TObject); -begin - if (adress+16*30<=65536*16) and okm.checked then - begin - adress:=adress+16*30; -SpeedButton6Click(Sender); -end; -end; - -procedure TForm1.SpinButton2UpClick(Sender: TObject); -begin - if (adress-16*30>=0) and okm.checked then - begin - adress:=adress-16*30; -SpeedButton6Click(Sender); -end; -end; -procedure TForm1.SpeedButton3Click(Sender: TObject); -var adl,adh,good:word; -adress2:longint; -tok:byte; -ok:boolean; -begin -if (inlpt=0) then SpeedButton8Click(sender); -if ((inlpt<>0) and (initlpt(true))) then -begin - adress2 :=adresstoint(maskedit1.text); - adl:=adress2 and $FFFF; - adh:=(adress2 and $F0000) shr 4; -Block[1]:=lo(adl); -Block[2]:= hi(adl); -Block[3]:= lo(adh); -Block[4]:= hi(adh); -ok:=SendlptBlock( 7,4,@Block); -if not(ok) or errors then Showmessage('Erreur de transmission !!!!!!!!!!'); -end -else -Showmessage('Pas de PC distant'); -putb($18); -errors:=false; -end; -procedure TForm1.Memo2Click(Sender: TObject); -var ligne,col,pos,adl,adh:word; -adress2:longint; -begin - ligne:=memo2.selstart div 42; - col:= (trunc((memo2.selstart mod 42+1) / 2.5)); - pos:=16*ligne+col; - label1.caption:=inttostr(ligne)+':'+inttostr(col)+':'+inttostr(pos); - adress2:=pos+adress; - adl:=adress2 and $FFFF; - adh:=(adress2 and $F0000) shr 4; - pop:=false; - maskedit1.text:=inttohex(adh,4)+':'+inttohex(adl,4); - pop:=true; -end; - -end. +unit Unit1; + +interface + +uses + SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, + Forms, Dialogs, StdCtrls, Grids, Outline, DirOutln, FileCtrl, Buttons, + Gauges, ExtCtrls, Spin, Mask; + +type + TForm1 = class(TForm) + DriveComboBox1: TDriveComboBox; + FilterComboBox1: TFilterComboBox; + FileListBox1: TFileListBox; + DirectoryListBox1: TDirectoryListBox; + SpeedButton1: TSpeedButton; + SpeedButton2: TSpeedButton; + Memo1: TMemo; + Memo2: TMemo; + Memo3: TMemo; + SpeedButton3: TSpeedButton; + SpeedButton4: TSpeedButton; + Gauge1: TGauge; + SpeedButton5: TSpeedButton; + SpeedButton6: TSpeedButton; + SpinButton1: TSpinButton; + MaskEdit1: TMaskEdit; + SpeedButton8: TSpeedButton; + SpinButton2: TSpinButton; + okm: TCheckBox; + Label1: TLabel; + procedure FormActivate(Sender: TObject); + procedure SpinButton1DownClick(Sender: TObject); + procedure SpinButton1UpClick(Sender: TObject); + procedure showadress(Sender: TObject); + procedure SpeedButton6Click(Sender: TObject); + procedure SpeedButton8Click(Sender: TObject); + procedure MaskEdit1Change(Sender: TObject); + procedure SpinButton2DownClick(Sender: TObject); + procedure SpinButton2UpClick(Sender: TObject); + procedure SpeedButton3Click(Sender: TObject); + procedure Memo2Click(Sender: TObject); + + private + { Private-déclarations } + public + { Public-déclarations } + end; + +const UNESEC = 1000; + DIXSEC = 4000; + ACK = $00; + NAK = $FF; + MAXTRY = 5; + +type DBloc = array[ 1..15534 ] of byte; +type BHEADER = record + case boolean of + true : ( Checksum:byte; + Lenb : byte; + Lenh : byte; + Token : byte; + + ); + false : ( Champ : array[ 0..3 ] of byte ); + end; + +var + Form1: TForm1; + Inlpt : word; + Outlpt : word; + times : longint; + Block : DBLOC; + adress :longint; + errors: boolean; + reste:integer; + pop:boolean; + +implementation + +{$R *.DFM} + +function Getlpt( Number : integer ) : boolean; +begin + Outlpt := MemW[ $0040: 6 + Number * 2 ]; + if ( Outlpt <> 0 ) then + begin + Inlpt := Outlpt + 1; + Getlpt := TRUE; + end + else + Getlpt := FALSE; +end; + +function getfirstlpt:byte; +var i:integer; +begin +i:=1; + while (not(getlpt(i)) or (i>4)) do inc(i); + if (getlpt(i)=false) then i:=0; + getfirstlpt:= i; +end; + +function getb:byte; +begin + getb:=port[inlpt] and $F8 +end; + +procedure putb(what:byte); +begin + port[outlpt]:=what; +end; + +procedure starttimer; +begin + times:=GetTickCount; +end; + +function endtimer:longint; +begin + endtimer:=getTickCount-times; +end; + +function Initlpt( Emetteur : boolean ) : boolean; +begin + errors:=false; + putb($10); + putb($18); + putb($10); + starttimer; + if ( Emetteur ) then + begin + while ( ( GetB <> $00 ) and ( Endtimer <= DIXSEC ) ) do; + end + else + begin + while ( ( GetB <> $00 ) and ( Endtimer <= DIXSEC ) ) do; + PutB( $10 ); + end; + Initlpt := ( Endtimer <= DIXSEC ); +end; + +function sendlpt( Wert : byte ) : boolean; +var Retour : byte; +label fin; +begin +if errors then goto fin; + Starttimer; + PutB( Wert and $0F ); + while ( ( ( GetB and 128 ) = 0 ) and ( Endtimer <= DIXSEC )) do; + if ( Endtimer > DIXSEC ) then + begin + errors:=true; + goto fin; + end; + Retour := ( GetB shr 3 ) and $0F; + Starttimer; + PutB( ( Wert shr 4 ) or $10 ); + while ( ( ( GetB and 128 ) <> 0 ) and ( Endtimer <= DIXSEC ) ) do + if ( Endtimer > DIXSEC ) then + begin + errors:=true; + goto fin; + end; + Retour := Retour or ( ( GetB shl 1 ) and $F0 ); + fin: + sendlpt := ( Wert = Retour ); +end; + +function receivelpt : byte; +var LoNib, + HiNib : byte; +label fin; +begin + if errors then goto fin; + Starttimer; + while ( ( ( GetB and 128 ) = 0 ) and ( Endtimer <= DIXSEC )) do; + if ( Endtimer > DIXSEC ) then + begin + errors:=true; + goto fin; + end; + LoNib := ( GetB shr 3 ) and $0F; + PutB( LoNib ); + Starttimer; + while ( ( ( GetB and 128 ) <> 0 ) and ( Endtimer <= DIXSEC ) ) do; + if ( Endtimer > DIXSEC ) then + begin + errors:=true; + goto fin; + end; + HiNib := ( GetB shl 1 ) and $F0; + PutB( ( HiNib shr 4 ) or $10 ); + fin: + receivelpt := ( LoNib or HiNib ); +end; + +function checksum8(Nombre:word;Dptr : pointer):byte ; +var donnees : ^DBloc ; + i:word; + ch:byte; +begin +ch:=0; +donnees:=dptr; + for i:=1 to Nombre do ch:=ch + Donnees^[ i ]; + checksum8:=ch; + end; + +function SendlptBlock( Token : byte; + Nombre : word; + Dptr : pointer ):boolean; +var header : BHEADER; + ok : boolean; + i : word; + trys : word; + Donnees : ^DBloc; + label fin; +begin + form1.gauge1.visible:=true; + header.Token := Token; + header.Lenb := (Nombre and $FF00) shr 8; + header.Lenh := Nombre and $FF; + header.Checksum:=checksum8(nombre,Dptr); + trys := MAXTRY; + repeat + ok := TRUE; + for i := 0 to 3 do + ok := ok and sendlpt( Header.Champ[ i ] ); + if ( ok ) then + ok := ok and sendlpt( ACK ) + else + ok := ok and sendlpt( NAK ); + if ( not ok ) then + dec( trys ); + until ( ( ok ) or ( trys = 0 ) or (errors)); + if ( (trys = 0) or (errors)) then + begin + goto fin; + SendlptBlock:=false; + end; + if ( Nombre > 0 ) then + begin + Donnees := DPTR; + trys := MAXTRY; + repeat + ok := TRUE; + for i := Nombre downto 1 do + begin + ok := ok and sendlpt( Donnees^[ i ] ); + reste:=trunc(100-i/nombre*100); + form1.gauge1.progress:=reste + end; + if ( ok ) then + ok := ok and sendlpt( ACK ) + else + ok := ok and sendlpt( NAK ); + if ( not ok ) then + dec( trys ); + until ( ( ok ) or ( trys = 0 ) or (errors)); + if ( (trys = 0) or (errors)) then + begin + goto fin; + SendlptBlock:=false; + end; + end; + SendlptBlock:=true; + fin: + form1.gauge1.visible:=false; +end; + +function ReceivelptBlock( var Token : byte; + var Len : word; + Dptr : pointer ):boolean; +var header : BHEADER; + ok : boolean; + i : word; + trys : word; + EscapeStatus : boolean; + ByteBuffer : byte; + Donnees : ^DBloc; + label fin,good; +begin + form1.gauge1.visible:=true; + trys := MAXTRY; + repeat + for i:= 0 to 3 do + Header.Champ[ i ] := receivelpt; + ByteBuffer := receivelpt; + if ( ByteBuffer <> ACK ) then + dec( trys ); + until ( ( trys = 0 ) or ( ByteBuffer = ACK ) or (errors)); + if ( (trys = 0) or (errors)) then + begin + goto fin; + receivelptblock:=false; + end; + Token := Header.Token; + Len := Header.Lenh+(Header.Lenb shl 8); + if ( Len > 0 ) then + begin + Donnees := Dptr; + trys := MAXTRY; + repeat + for i := len downto 1 do + begin + Donnees^[ i ] := receivelpt; + reste:=trunc(100-i/len*100); + form1.gauge1.progress:=reste + end; + ByteBuffer := receivelpt; + if ( ByteBuffer <> ACK ) then + dec( trys ); + until ( ( trys = 0 ) or ( ByteBuffer = ACK ) ); + if ( trys = 0 ) then + begin + goto fin; + receivelptblock:=false; + end; + end; + receivelptblock:=true; + fin: + form1.gauge1.visible:=false; +end; + + +function Sendfile(name:string):boolean; +var lus:word; +Fichier:file; +begin +assign( Fichier, Name ); +reset( Fichier, 1 ); +Blockread( Fichier, Block, 15000, Lus ); +if lus>0 then +Sendfile:=SendlptBlock( 1, Lus, @Block ) +else +Sendfile:=false; +end; + +procedure TForm1.FormActivate(Sender: TObject); +begin +adress:=0; +showadress(sender); +Memo2Click(Sender); +SpeedButton8Click(Sender); +pop:=true; +end; + +procedure TForm1.SpinButton1DownClick(Sender: TObject); +begin +if (adress>0) and okm.checked then +begin +dec(adress); +SpeedButton6Click(Sender); +end; +end; + +procedure TForm1.SpinButton1UpClick(Sender: TObject); +begin +if (adress<65536*16) and okm.checked then +begin +inc(adress); +SpeedButton6Click(Sender); +end; +end; + +function hextoint(hex:string;n:word):longint; +var +resu,exp:longint; +i:word; +begin + hex :=UpperCase(hex); + resu:=0; + exp:=1; + for i:=n downto 1 do + begin + resu:=resu+(Pos(hex[i],'0123456789ABCDEF')-1)*(exp); + exp:=exp*16 + end; + hextoint:=resu; + end ; + + function adresstoint(hex:string):longint; +begin +adresstoint:=hextoint(Copy(hex, 1, 4),4)shl 4 + hextoint(Copy(hex, length(hex)-3, 4),4) +end; + +procedure TForm1.showadress(Sender: TObject); +var i,j,adh,adl:word; +adress2:longint; +old,old2:string; +begin +memo1.clear; +memo2.clear; +memo3.clear; +for i:=0 to 29 do +begin +adress2:=adress+i*16; +adl:=adress2 and $FFFF; +adh:=(adress2 and $F0000) shr 4; +memo1.lines.add(IntToHex(adh,4)+':'+IntToHex(adl,4)) ; +old:=''; +old2:=''; +for j:=1 to 16 do +begin +old:=old+inttohex(block[i*16+j],2); +if block[i*16+j]=0 then +old2:=old2+'.' +else +old2:=old2+char(block[i*16+j]) ; +if j mod 2=0 then old:=old+' '; +end; +memo2.lines.add(old) ; +memo3.lines.add(old2) ; +end +end; + +procedure TForm1.SpeedButton8Click(Sender: TObject); +begin +if getfirstlpt=0 then showmessage('Pas de port parallèle détecté'); +errors:=false; +end; + +procedure TForm1.SpeedButton6Click(Sender: TObject); +var adl,adh,good:word; +tok:byte; +ok:boolean; +begin +if (inlpt=0) then SpeedButton8Click(sender); +if ((inlpt<>0) and (initlpt(true))) then +begin + adl:=adress and $FFFF; + adh:=(adress and $F0000) shr 4; +Block[1]:=lo(adl); +Block[2]:= hi(adl); +Block[3]:= lo(adh); +Block[4]:= hi(adh); +Block[5]:= lo(512); +Block[6]:= hi(512) ; +ok:=false; +if SendlptBlock( 1,6,@Block) then ok:=receivelptBlock(tok,good ,@Block); {demande de RAM} +if not(ok) or errors then Showmessage('Erreur de transmission !!!!!!!!!!'); +showadress(sender); +end +else +Showmessage('Pas de PC distant'); +putb($08); +errors:=false; +end; + +procedure TForm1.MaskEdit1Change(Sender: TObject); +begin +if pop then +begin +adress:=adresstoint(maskedit1.text); +if okm.checked=true then SpeedButton6Click(sender); +showadress(sender); +end; +end; + +procedure TForm1.SpinButton2DownClick(Sender: TObject); +begin + if (adress+16*30<=65536*16) and okm.checked then + begin + adress:=adress+16*30; +SpeedButton6Click(Sender); +end; +end; + +procedure TForm1.SpinButton2UpClick(Sender: TObject); +begin + if (adress-16*30>=0) and okm.checked then + begin + adress:=adress-16*30; +SpeedButton6Click(Sender); +end; +end; +procedure TForm1.SpeedButton3Click(Sender: TObject); +var adl,adh,good:word; +adress2:longint; +tok:byte; +ok:boolean; +begin +if (inlpt=0) then SpeedButton8Click(sender); +if ((inlpt<>0) and (initlpt(true))) then +begin + adress2 :=adresstoint(maskedit1.text); + adl:=adress2 and $FFFF; + adh:=(adress2 and $F0000) shr 4; +Block[1]:=lo(adl); +Block[2]:= hi(adl); +Block[3]:= lo(adh); +Block[4]:= hi(adh); +ok:=SendlptBlock( 7,4,@Block); +if not(ok) or errors then Showmessage('Erreur de transmission !!!!!!!!!!'); +end +else +Showmessage('Pas de PC distant'); +putb($18); +errors:=false; +end; +procedure TForm1.Memo2Click(Sender: TObject); +var ligne,col,pos,adl,adh:word; +adress2:longint; +begin + ligne:=memo2.selstart div 42; + col:= (trunc((memo2.selstart mod 42+1) / 2.5)); + pos:=16*ligne+col; + label1.caption:=inttostr(ligne)+':'+inttostr(col)+':'+inttostr(pos); + adress2:=pos+adress; + adl:=adress2 and $FFFF; + adh:=(adress2 and $F0000) shr 4; + pop:=false; + maskedit1.text:=inttohex(adh,4)+':'+inttohex(adl,4); + pop:=true; +end; + +end. diff --git a/programs/mous.asm b/programs/mous.asm deleted file mode 100755 index 785a328..0000000 --- a/programs/mous.asm +++ /dev/null @@ -1,41 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: -mov ax,6 -int 47h -mov ax,0a000h -mov es,ax -mov ds,ax -xor di,di -mov cx,0ffffh/4 -mov eax,0 -rep stosd -mov ax,0c40h -boucle: -mov ah,4 -int 74h -mov byte ptr es:[di],0FFh -mov si,0 -mov di,0 -mov cx,0ffffh -reboucle: -mov al,[si] -inc si -cmp al,0 -je suite -dec al -suite: -mov es:[di],al -inc di -dec cx -jnz reboucle -cmp dl,2 -jne boucle -db 0CBh - -end start diff --git a/programs/pmode.asm b/programs/pmode.asm old mode 100755 new mode 100644 index fc1625f..23b82e4 --- a/programs/pmode.asm +++ b/programs/pmode.asm @@ -1,15 +1,15 @@ -.model tiny -.486p -smart -.code - -org 0100h - -start: -mov eax,cr0 -or al,1 -mov cr0,eax - -db 0CBh - -end start +.model tiny +.486p +smart +.code + +org 0100h + +start: +mov eax,cr0 +or al,1 +mov cr0,eax + +db 0CBh + +end start diff --git a/programs/souris.asm b/programs/souris.asm new file mode 100644 index 0000000..2890412 --- /dev/null +++ b/programs/souris.asm @@ -0,0 +1,13 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: +mov ah,2 +int 74h +db 0CBh + +end start diff --git a/programs/test.asm b/programs/test.asm old mode 100755 new mode 100644 index 33ea3ee..49bbc1d --- a/programs/test.asm +++ b/programs/test.asm @@ -1,332 +1,373 @@ -.model tiny -.486 -smart -.code -org 0100h - - -start: -mov ah,26 -int 47h -mov ax,0001 -int 47h -mov ah,2 -int 47h - -mov si,offset text1 ;titre -mov ah,13 -int 47h -mov ah,6 -int 47h -int 47h - -mov ah,21 -mov cl,3 -int 47h -mov ah,13 -mov si,offset text2 -int 47h -mov ah,6 -int 47h -mov edx,2612182686 -mov ah,8 -int 47h -mov ah,6 -int 47h -mov edx,7576534 -mov ah,8 -int 47h -mov ah,6 -int 47h - -mov ah,21 -mov cl,4 -int 47h -mov si,offset text3 -mov ah,13 -int 47h -mov ah,6 -int 47h -mov edx,-6876253 -mov cx,32 -mov ah,9 -int 47h -mov ah,6 -int 47h -mov edx,-311212323 -mov cx,32 -mov ah,9 -int 47h -mov ah,6 -int 47h - -mov ah,21 -mov cl,5 -int 47h -mov ah,13 -mov si,offset text4 -int 47h -mov ah,6 -int 47h -mov edx,0892325457 -mov cx,16 -mov ah,10 -int 47h -mov ah,6 -int 47h -mov edx,0236514 -mov ah,10 -mov cx,32 -int 47h -mov ah,6 -int 47h - -mov ah,21 -mov cl,6 -int 47h -mov ah,13 -mov si,offset text5 -int 47h -mov ah,6 -int 47h -mov edx,3762182686 -mov ah,11 -mov cx,32 -int 47h -mov ah,6 -int 47h -mov edx,2182686 -mov ah,11 -mov cx,16 -int 47h -mov ah,6 -int 47h - -mov ah,21 -mov cl,7 -int 47h -mov ah,13 -mov si,offset text6 -int 47h -mov ah,6 -int 47h -mov dl,'h' -mov ah,7 -int 47h -mov ah,6 -int 47h -mov dl,'@' -mov ah,7 -int 47h -mov ah,6 -int 47h - -mov ah,21 -mov cl,8 -int 47h -mov ah,13 -mov si,offset text7 -int 47h -mov ah,6 -int 47h -mov si,offset textt -mov ah,13 -int 47h -mov ah,6 -int 47h -mov si,offset texttt -mov ah,13 -int 47h - -mov ax,0 -int 16h - -mov ah,2 -int 47h -mov ah,30 -int 47h -mov ah,2 -int 47h - -mov ah,21 -mov cl,5 -int 47h -mov cx,200 -go1: -mov ah,30 -int 47h -mov ah,33 -int 47 -mov ah,20 -xor bh,bh -inc bl -mov si,offset text8 -int 47h -call put -mov ah,30 -int 47h -mov ah,33 -int 47h -dec cx -jnz go1 - -mov ah,21 -mov cl,7 -int 47h -mov cx,200 -go2: -mov si,offset text9 -mov ah,30 -int 47h -mov ah,33 -int 47h -mov ah,6 -int 47h -mov ah,13 -int 47h -call put -mov ah,30 -int 47h -mov ah,33 -int 47h -dec cx -jnz go2 - -mov ah,21 -mov cl,9 -int 47h -mov cx,200 -go3: -mov si,offset text10 -mov ah,30 -int 47h -mov ah,33 -int 47h -xor bh,bh -inc bl -mov ah,20 -int 47h -call put -mov ah,30 -int 47h -mov ah,33 -int 47h -dec cx -jnz go3 - -mov ah,30 -int 47h -mov ah,2 -int 47h -mov bx,040Dh -mov si,offset texte1 -mov ah,20 -int 47h -mov si,offset texte2 -inc bl -mov ah,20 -int 47h -mov ah,30 -int 47h -mov ah,2 -int 47h -mov ah,30 -int 47h - -mov cl,12 -mov ah,21 -int 47h -mov bp,255 -xor edx,edx -go4: -mov ah,30 -int 47h -mov ah,33 -int 47h -inc edx -mov ah,11 -mov cx,16 -int 47h -mov ah,6 -int 47h -mov ah,30 -int 47h -mov ah,33 -int 47h -dec bp -jnz go4 -mov ah,27 -int 47h -xor bx,bx -mov si,offset texte3 -mov ah,20 -int 47h -mov ax,0 -int 16h -db 0CBh - -put: -call random -mov di,dx -and di,4096-2 -mov si,offset text11 -call showstring2 -ret - -Random: -push ax -MOV AX,cs:[RandSeed] -MOV DX,8405h -MUL DX -INC AX -MOV cs:[RandSeed],AX -pop ax -ret - -randseed dw 1234h - -Randomize: -push ax cx dx -mov ah,0 -int 1ah -mov cs:randseed,dx -pop dx cx ax -ret - -texttt db 'Texte',0 -textt db 'Divers',0 -text1 db ' D‚monstration de l''utilisation de la bibliothŠque VIDEO',0 -text2 db 'Nombre entier :',0 -text3 db 'Nombre sign‚ :',0 -text4 db 'Nombre h‚xad‚cimal :',0 -text5 db 'Nombre binaire :',0 -text6 db 'CaractŠres :',0 -text7 db 'Texte :',0 -text8 db 'Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling',0 -text9 db 'Vertical Vertical Vertical Vertical Vertical Vertical Vertical Vertical',0 -text10 db 'Rapide Rapide Rapide Rapide Rapide Rapide Rapide Rapide',0 -text11 db 'Echange rapide de pages Vid‚o',0 -texte1 db 'Routine d''affichage Ultra Rapide Agissant sur le Mat‚riel',0 -texte2 db 'Possibilit‚ de r‚aliser des effets de superposition',0 -texte3 db 'Sauvegarde et restauration de l''ecran',0 - -showstring2: - push es bx cx si di - add di,4000 - mov bx,0B800h - mov es,bx - mov bl,[si] - mov ch,3 -strinaize4: - inc si - mov cl,[si] - mov es:[di],cx - add di,2 - dec bl - jnz strinaize4 - pop di si cx bx es - ret - - - -end start +.model tiny +.486 +smart +.code +org 0100h + + +start: +mov ah,26 +int 47h +mov ax,0001 +int 47h +mov ah,2 +int 47h + +mov si,offset text1 ;titre +mov ah,13 +int 47h +mov ah,6 +int 47h +int 47h + +mov ah,21 +mov cl,3 +int 47h +mov ah,13 +mov si,offset text2 +int 47h +mov ah,6 +int 47h +mov edx,2612182686 +mov ah,8 +int 47h +mov ah,6 +int 47h +mov edx,7576534 +mov ah,8 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,4 +int 47h +mov si,offset text3 +mov ah,13 +int 47h +mov ah,6 +int 47h +mov edx,-6876253 +mov cx,32 +mov ah,9 +int 47h +mov ah,6 +int 47h +mov edx,-311212323 +mov cx,32 +mov ah,9 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,5 +int 47h +mov ah,13 +mov si,offset text4 +int 47h +mov ah,6 +int 47h +mov edx,0892325457 +mov cx,16 +mov ah,10 +int 47h +mov ah,6 +int 47h +mov edx,0236514 +mov ah,10 +mov cx,32 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,6 +int 47h +mov ah,13 +mov si,offset text5 +int 47h +mov ah,6 +int 47h +mov edx,3762182686 +mov ah,11 +mov cx,32 +int 47h +mov ah,6 +int 47h +mov edx,2182686 +mov ah,11 +mov cx,16 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,7 +int 47h +mov ah,13 +mov si,offset text6 +int 47h +mov ah,6 +int 47h +mov dl,'h' +mov ah,7 +int 47h +mov ah,6 +int 47h +mov dl,'@' +mov ah,7 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,8 +int 47h +mov ah,13 +mov si,offset text7 +int 47h +mov ah,6 +int 47h +mov si,offset textt +mov ah,13 +int 47h +mov ah,6 +int 47h +mov si,offset texttt +mov ah,13 +int 47h +mov ah,6 +int 47h + +mov ah,21 +mov cl,9 +int 47h +mov ah,13 +mov si,offset text71 +int 47h +mov ah,6 +int 47h +mov dx,0BF30h +mov ah,44 +int 47h +mov ah,6 +int 47h +mov dx,0B0B6h +mov ah,44 +int 47h +mov ah,6 +int 47h + +mov ah,13 +mov si,offset text72 +int 47h +mov ah,6 +int 47h +mov edx,8601h +mov ah,45 +int 47h +mov ah,6 +int 47h +mov dx,0B0B6h +mov ah,45 +int 47h +mov ah,6 +int 47h + + + +mov ax,0 +int 16h + +mov ah,2 +int 47h +mov ah,30 +int 47h +mov ah,2 +int 47h + +mov ah,21 +mov cl,5 +int 47h +mov cx,200 +go1: +mov ah,30 +int 47h +mov ah,33 +int 47 +mov ah,20 +xor bh,bh +inc bl +mov si,offset text8 +int 47h +call put +mov ah,30 +int 47h +mov ah,33 +int 47h +dec cx +jnz go1 + +mov ah,21 +mov cl,7 +int 47h +mov cx,200 +go2: +mov si,offset text9 +mov ah,30 +int 47h +mov ah,33 +int 47h +mov ah,6 +int 47h +mov ah,13 +int 47h +call put +mov ah,30 +int 47h +mov ah,33 +int 47h +dec cx +jnz go2 + +mov ah,21 +mov cl,9 +int 47h +mov cx,200 +go3: +mov si,offset text10 +mov ah,30 +int 47h +mov ah,33 +int 47h +xor bh,bh +inc bl +mov ah,20 +int 47h +call put +mov ah,30 +int 47h +mov ah,33 +int 47h +dec cx +jnz go3 + +mov ah,30 +int 47h +mov ah,2 +int 47h +mov bx,040Dh +mov si,offset texte1 +mov ah,20 +int 47h +mov si,offset texte2 +inc bl +mov ah,20 +int 47h +mov ah,30 +int 47h +mov ah,2 +int 47h +mov ah,30 +int 47h + +mov cl,12 +mov ah,21 +int 47h +mov bp,255 +xor edx,edx +go4: +mov ah,30 +int 47h +mov ah,33 +int 47h +inc edx +mov ah,11 +mov cx,16 +int 47h +mov ah,6 +int 47h +mov ah,30 +int 47h +mov ah,33 +int 47h +dec bp +jnz go4 +mov ah,27 +int 47h +xor bx,bx +mov si,offset texte3 +mov ah,20 +int 47h +mov ax,0 +int 16h +db 0CBh + +put: +call random +mov di,dx +and di,4096-2 +mov si,offset text11 +call showstring2 +ret + +Random: +push ax +MOV AX,cs:[RandSeed] +MOV DX,8405h +MUL DX +INC AX +MOV cs:[RandSeed],AX +pop ax +ret + +randseed dw 1234h + +Randomize: +push ax cx dx +mov ah,0 +int 1ah +mov cs:randseed,dx +pop dx cx ax +ret + +texttt db 'Texte',0 +textt db 'Divers',0 +text1 db ' D‚monstration de l''utilisation de la bibliothŠque VIDEO',0 +text2 db 'Nombre entier :',0 +text3 db 'Nombre sign‚ :',0 +text4 db 'Nombre h‚xad‚cimal :',0 +text5 db 'Nombre binaire :',0 +text6 db 'CaractŠres :',0 +text7 db 'Texte :',0 +text71 db 'Date :',0 +text72 db 'Heure :',0 +text8 db 'Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling Scrolling',0 +text9 db 'Vertical Vertical Vertical Vertical Vertical Vertical Vertical Vertical',0 +text10 db 'Rapide Rapide Rapide Rapide Rapide Rapide Rapide Rapide',0 +text11 db 'Echange rapide de pages Vid‚o',0 +texte1 db 'Routine d''affichage Ultra Rapide Agissant sur le Mat‚riel',0 +texte2 db 'Possibilit‚ de r‚aliser des effets de superposition',0 +texte3 db 'Sauvegarde et restauration de l''ecran',0 + +showstring2: + push es bx cx si di + add di,4000 + mov bx,0B800h + mov es,bx + mov bl,[si] + mov ch,3 +strinaize4: + inc si + mov cl,[si] + mov es:[di],cx + add di,2 + dec bl + jnz strinaize4 + pop di si cx bx es + ret + + + +end start diff --git a/programs/verif.asm b/programs/verifier.asm old mode 100755 new mode 100644 similarity index 82% rename from programs/verif.asm rename to programs/verifier.asm index 3250883..8443dd3 --- a/programs/verif.asm +++ b/programs/verifier.asm @@ -1,151 +1,151 @@ -.model tiny -.386c -.code -org 0100h - - -start: - mov ax,0002 - int 47H - mov ah,26 - int 47H -replay: - mov ah,2 - int 47h -mov ah,21 -mov cl,7 -int 47h - xor di,di - xor cx,cx - mov ah,20 - mov bx,1D00h - mov si,offset Msg - int 47h - mov ah,20 - mov bx,0231h - mov si,offset msgapp - int 47h -VerifAll: - mov ah,1 - int 16h - cmp al,32 - je enend - mov ax,cx - mov si,100 - mul si - mov si,2880 - div si - xor edx,edx - mov dx,ax - mov ah,15 - mov bx,0A14h - int 47h - mov ah,13 - mov si,offset po - int 47h - mov ah,15 - mov dx,cx - mov bx,0A10h - int 47h - mov ah,13 - mov si,offset Msg2 - int 47h - mov ah,8 - mov edx,0 - mov dx,di - int 47h - mov ah,13 - mov si,offset Msg3 - int 47h - call gauge - mov ah,2 - int 48h - jc errors - je noprob - inc di - noprob: - inc cx - cmp cx,2880 - jnz verifall - enend: - cmp di,0 - je noatall -mov bx,0E09h -mov ah,20 -mov si,offset error2 -int 47h - jmp someof - noatall: -mov bx,0E09h -mov ah,20 -mov si,offset noerror -int 47h - someof: - mov ah,0 - int 16h - mov ah,27 - int 47h - db 0CBH - errors: -mov ah,21 -mov cl,4 -int 47h -mov bx,0D09h -mov ah,20 -mov si,offset errore -int 47h -mov ah,0 -int 16h -jmp replay - - - -errore db 'Error IO with floppy drive, insert a disk and Press a key',0 -noerror db 'No defectuous Cluster, Press a key to Quit',0 -error2 db 'This disk is bad, Press a key to Quit',0 -po db ' %',0 -msgapp db '',0 -msg db '- Disk Surface Test -',0 -msg2 db ' cluster tested. ',0 -msg3 db ' defectuous cluster.',0 -;->Increment CX -gauge: -push ax bx cx dx si ds -push cs -pop ds -mov ax,cx -mul sizes -div max -mov dx,ax -mov bl,oldvalue -xor bh,bh -mov byte ptr [offset gaugetxt+bx],'Û' -cmp bx,0 -jnz nono2 -mov ah,21 -mov cl,8 -int 47h -mov bx,xy -mov ah,20 -mov si,offset gaugetxt -int 47h -mov ah,21 -mov cl,7 -int 47h -nono2: -mov bx,dx -xor bh,bh -mov byte ptr [offset gaugetxt+bx],0 -mov oldvalue,bl -mov bx,xy -mov ah,20 -mov si,offset gaugetxt -int 47h -pop ds si dx cx bx ax -ret -oldvalue db 0 -max dw 2880 -sizes dw 50 -xy dw 0A12h -gaugetxt db 'ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ',0 -End Start +.model tiny +.386c +.code +org 0100h + + +start: + mov ax,0002 + int 47H + mov ah,26 + int 47H +replay: + mov ah,2 + int 47h +mov ah,21 +mov cl,7 +int 47h + xor di,di + xor cx,cx + mov ah,20 + mov bx,1D00h + mov si,offset Msg + int 47h + mov ah,20 + mov bx,0231h + mov si,offset msgapp + int 47h +VerifAll: + mov ah,1 + int 16h + cmp al,32 + je enend + mov ax,cx + mov si,100 + mul si + mov si,2880 + div si + xor edx,edx + mov dx,ax + mov ah,15 + mov bx,0A14h + int 47h + mov ah,13 + mov si,offset po + int 47h + mov ah,15 + mov dx,cx + mov bx,0A10h + int 47h + mov ah,13 + mov si,offset Msg2 + int 47h + mov ah,8 + mov edx,0 + mov dx,di + int 47h + mov ah,13 + mov si,offset Msg3 + int 47h + call gauge + mov ah,2 + int 48h + jc errors + je noprob + inc di + noprob: + inc cx + cmp cx,2880 + jnz verifall + enend: + cmp di,0 + je noatall +mov bx,0E09h +mov ah,20 +mov si,offset error2 +int 47h + jmp someof + noatall: +mov bx,0E09h +mov ah,20 +mov si,offset noerror +int 47h + someof: + mov ah,0 + int 16h + mov ah,27 + int 47h + db 0CBH + errors: +mov ah,21 +mov cl,4 +int 47h +mov bx,0D09h +mov ah,20 +mov si,offset errore +int 47h +mov ah,0 +int 16h +jmp replay + + + +errore db 'Erreur avec le lecteur de disquette !',0 +noerror db 'Pas de secteurs defectueux, appuyez sur une touche pour continuer',0 +error2 db 'Le disque est defectueux, appuyez sur une touche pour quitter',0 +po db ' %',0 +msgapp db '',0 +msg db '- Test de surface du disque -',0 +msg2 db ' cluster tested. ',0 +msg3 db ' cluster defectueux. ',0 +;->Increment CX +gauge: +push ax bx cx dx si ds +push cs +pop ds +mov ax,cx +mul sizes +div max +mov dx,ax +mov bl,oldvalue +xor bh,bh +mov byte ptr [offset gaugetxt+bx],'Û' +cmp bx,0 +jnz nono2 +mov ah,21 +mov cl,8 +int 47h +mov bx,xy +mov ah,20 +mov si,offset gaugetxt +int 47h +mov ah,21 +mov cl,7 +int 47h +nono2: +mov bx,dx +xor bh,bh +mov byte ptr [offset gaugetxt+bx],0 +mov oldvalue,bl +mov bx,xy +mov ah,20 +mov si,offset gaugetxt +int 47h +pop ds si dx cx bx ax +ret +oldvalue db 0 +max dw 2880 +sizes dw 50 +xy dw 0A12h +gaugetxt db 'ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ',0 +End Start diff --git a/programs/disk.asm b/programs/volume.asm old mode 100755 new mode 100644 similarity index 89% rename from programs/disk.asm rename to programs/volume.asm index 291b624..518deeb --- a/programs/disk.asm +++ b/programs/volume.asm @@ -1,387 +1,387 @@ -.model tiny -.386c -.code -org 0100h - - -start: - mov ax,0305h - mov bx,0008h - int 16h - mov ax,0002 - int 47H - mov ah,2 - int 47h - mov ah,43 - int 47h - xor bp,bp -Adres: - mov di,offset infos - mov ah,34 - int 47h - dec infos - push cs - pop es - mov cx,sect - mov bx,offset buffer - mov ax,0001h - int 48h - jnc noerror - errtr: - mov ah,25 - mov bl,infos - xor bh,bh - int 47h - mov ah,21 - mov cl,116 - int 47h - mov ah,13 - mov si,offset errordisk - int 47h - mov ax,0 - int 16h - noerror: - adres2: - mov di,offset infos - mov ah,34 - int 47h - dec byte ptr [di] - mov al,[di+1] - sub al,16 - mov bl,al - shr al,2 - mov [di+1],al - and bl,11b - mov [di+2],bl - mov al,[di+7] - cmp al,oldmode - je noinit - mov ah,2 - int 47h - mov oldmode,al - noinit: - mov bx,0 - mov ah,25 - int 47h - mov bh,infos - mov di,bp - mov ah,21 - mov cl,7 - int 47h -lines: - mov dx,sect - mov cx,16 - mov ah,10 - int 47h - mov si,offset dep - mov ah,13 - int 47h - mov dx,di - mov ah,10 - int 47h - mov ah,13 - mov si,offset spaces - int 47h - mov ah,5 - int 47h - mov al,infos+1 - mov cl,7 - mov ah,21 - int 47h - mov si,di -doaline: - mov dl,[di+offset buffer] - mov ah,10 - mov cl,8 - int 47h - mov ah,5 - int 47h - inc di - dec al - jnz doaline - mov di,si - mov si,offset spaces - mov ah,13 - int 47h - mov al,infos+1 - mov ah,21 - mov cl,7 - int 47h -doaline2: - mov dl,[di+offset buffer] - mov ah,7 - int 47h - inc di - dec al - jnz doaline2 - dec bh - je outes - cmp byte ptr infos+2,0 - je lines - mov ah,6 - int 47h - jmp lines -outes: - mov ah,21 - mov cl,112 - int 47h - mov bh,0 - mov bl,infos - mov si,offset menu - mov ah,14h - int 47h - waitkey: - mov ax,0 - int 16h - cmp ax,3B00h - jne suit - cmp bp,8*16 - jae waitkey - add bp,16 - jmp adres2 - suit: - cmp ax,3C00h - jne suit2 - cmp bp,0 - je waitkey - sub bp,16 - jmp adres2 - suit2: - cmp ax,3D00h - jne suit3 - cmp sect,2880 - ja waitkey - inc sect - jmp adres - suit3: - cmp ax,3E00h - jne suit4 - cmp sect,0 - je waitkey - dec sect - jmp adres - suit4: - cmp ax,3F00h - jne suit5 - jmp adres2 - suit5: - cmp ax,4000h - jne suit6 - mov cx,sect - mov bx,offset buffer - mov ah,1 - int 48h - jnc waitkey - jmp errtr - suit6: - cmp ax,4100h - jne suit7 - mov dword ptr [pope],'TIDE' - mov bl,infos - xor bh,bh - mov ah,25 - int 47h - mov ah,21 - mov cl,116 - int 47h - mov si,offset menu - mov ah,13 - int 47h - mov ah,21 - mov cl,7 - int 47h - mov ax,0B800h - mov es,ax - mov xxyy2,3 - mov xxyy,3 - call calc1 - call calc2 -waitst: - mov ax,0 - int 16h - cmp ah,41h - jne tre - mov dword ptr [pope],'WEIV' - push cs - pop es - mov cx,sect - mov bx,offset buffer - mov ah,1 - int 48h - jnc adres - jmp errtr -tre: - cmp al,0 - jne write - cmp ah,48h - jne tre1 - cmp yy,0 - je waitst - dec yy - jmp cursor -tre1: - cmp ah,50h - jne tre2 - mov al,infos - dec al - xor ah,ah - cmp yy,ax - je waitst - inc yy - jmp cursor -tre2: - cmp ah,4Dh - jne tre4 - cmp xx,15 - je waitst - inc xx - jmp cursor -tre4: - cmp ah,4Bh - jne waitst - cmp xx,0 - je waitst - dec xx - jmp cursor -write: - call AsciiHex2dec - cmp cl,15 - ja waitst - call calc1 - call calc2 - mov byte ptr es:[bx],0112 - mov es:[bx-1],al -writs: - mov ax,0 - int 16H - mov ch,cl - call AsciiHex2dec - cmp cl,15 - ja writs - shl ch,4 - add ch,cl - mov es:[bx+1],al - mov es:[si-1],ch - mov ax,bx - call calc3 - mov [bx],ch - inc xx - cmp xx,16 - jne pasde - inc yy - mov xx,0h - pasde: - call calc1 - call calc2 - jmp waitst - -cursor: - call calc1 - call calc2 - jmp waitst - suit7: - cmp ax,4200h - jne adres2 - db 0CBH - ret - -calc1: - push ax dx si - mov ax,xx - mov dx,xx - shl ax,2 - shl dx,1 - add ax,dx - add ax,25 - mov bx,YY - mov dx,yy - shl bx,5 - shl dx,7 - add bx,dx - add bx,ax - mov byte ptr es:[bx],112 - mov byte ptr es:[bx+2],112 - mov si,xxyy - mov byte ptr es:[si],07 - mov byte ptr es:[si+2],07 - mov xxyy,bx - pop si dx ax - ret - -calc2: - push ax bx dx - mov si,YY - mov dx,yy - shl si,5 - shl dx,7 - add si,dx - mov dx,xx - shl dx,1 - add si,dx - add si,127 - mov byte ptr es:[si],112 - mov bx,xxyy2 - mov byte ptr es:[bx],07 - mov xxyy2,si - pop dx bx ax - ret - -calc3: - push dx - xor bx,bx - mov bx,xx - mov dx,yy - shl dx,4 - add bx,dx - add bx,bp - add bx,offset buffer - pop dx - ret - - asciihex2dec: - cmp al,'a' - jb nomin - cmp al,'f' - ja nomin - sub al,'a'-'A' - jmp ismaj - nomin: - cmp al,'A' - jb nomaj - cmp al,'F' - ja nomaj - ismaj: - mov cl,al - sub cl,'A'-10 - jmp endt - nomaj: - mov cl,al - sub cl,'0' - endt: - ret - -dep db ':',0 -sect dw 0 -xx dw 0 -yy dw 0 -xxyy dw 3 -xxyy2 dw 3 -errordisk db 'An error has occured on drive A:, press a key to continu ',0 -menu db 'Bottom F1, Top F2, Sectors F3&F4, Load/Save F5&F6, Mode F7, Quit F8 MODE ' -pope db 'VIEW',0 -spaces db ' ³ ',0 - -showbuffer db 35 dup (0FFh) -oldmode db 0 -infos db 10 dup (0) -buffer equ $ - -end start - - - - - - - - +.model tiny +.386c +.code +org 0100h + + +start: + mov ax,0305h + mov bx,0008h + int 16h + mov ax,0002 + int 47H + mov ah,2 + int 47h + mov ah,43 + int 47h + xor bp,bp +Adres: + mov di,offset infos + mov ah,34 + int 47h + dec infos + push cs + pop es + mov cx,sect + mov di,offset buffer + mov ax,0001h + int 48h + jnc noerror + errtr: + mov ah,25 + mov bl,infos + xor bh,bh + int 47h + mov ah,21 + mov cl,116 + int 47h + mov ah,13 + mov si,offset errordisk + int 47h + mov ax,0 + int 16h + noerror: + adres2: + mov di,offset infos + mov ah,34 + int 47h + dec byte ptr [di] + mov al,[di+1] + sub al,16 + mov bl,al + shr al,2 + mov [di+1],al + and bl,11b + mov [di+2],bl + mov al,[di+7] + cmp al,oldmode + je noinit + mov ah,2 + int 47h + mov oldmode,al + noinit: + mov bx,0 + mov ah,25 + int 47h + mov bh,infos + mov di,bp + mov ah,21 + mov cl,7 + int 47h +lines: + mov dx,sect + mov cx,16 + mov ah,10 + int 47h + mov si,offset dep + mov ah,13 + int 47h + mov dx,di + mov ah,10 + int 47h + mov ah,13 + mov si,offset spaces + int 47h + mov ah,5 + int 47h + mov al,infos+1 + mov cl,7 + mov ah,21 + int 47h + mov si,di +doaline: + mov dl,[di+offset buffer] + mov ah,10 + mov cl,8 + int 47h + mov ah,5 + int 47h + inc di + dec al + jnz doaline + mov di,si + mov si,offset spaces + mov ah,13 + int 47h + mov al,infos+1 + mov ah,21 + mov cl,7 + int 47h +doaline2: + mov dl,[di+offset buffer] + mov ah,7 + int 47h + inc di + dec al + jnz doaline2 + dec bh + je outes + cmp byte ptr infos+2,0 + je lines + mov ah,6 + int 47h + jmp lines +outes: + mov ah,21 + mov cl,112 + int 47h + mov bh,0 + mov bl,infos + mov si,offset menu + mov ah,14h + int 47h + waitkey: + mov ax,0 + int 16h + cmp ax,3B00h + jne suit + cmp bp,8*16 + jae waitkey + add bp,16 + jmp adres2 + suit: + cmp ax,3C00h + jne suit2 + cmp bp,0 + je waitkey + sub bp,16 + jmp adres2 + suit2: + cmp ax,3D00h + jne suit3 + cmp sect,2880 + ja waitkey + inc sect + jmp adres + suit3: + cmp ax,3E00h + jne suit4 + cmp sect,0 + je waitkey + dec sect + jmp adres + suit4: + cmp ax,3F00h + jne suit5 + jmp adres2 + suit5: + cmp ax,4000h + jne suit6 + mov cx,sect + mov di,offset buffer + mov ah,1 + int 48h + jnc waitkey + jmp errtr + suit6: + cmp ax,4100h + jne suit7 + mov dword ptr [pope],'TIDE' + mov bl,infos + xor bh,bh + mov ah,25 + int 47h + mov ah,21 + mov cl,116 + int 47h + mov si,offset menu + mov ah,13 + int 47h + mov ah,21 + mov cl,7 + int 47h + mov ax,0B800h + mov es,ax + mov xxyy2,3 + mov xxyy,3 + call calc1 + call calc2 +waitst: + mov ax,0 + int 16h + cmp ah,41h + jne tre + mov dword ptr [pope],'WEIV' + push cs + pop es + mov cx,sect + mov bx,offset buffer + mov ah,1 + int 48h + jnc adres + jmp errtr +tre: + cmp al,0 + jne write + cmp ah,48h + jne tre1 + cmp yy,0 + je waitst + dec yy + jmp cursor +tre1: + cmp ah,50h + jne tre2 + mov al,infos + dec al + xor ah,ah + cmp yy,ax + je waitst + inc yy + jmp cursor +tre2: + cmp ah,4Dh + jne tre4 + cmp xx,15 + je waitst + inc xx + jmp cursor +tre4: + cmp ah,4Bh + jne waitst + cmp xx,0 + je waitst + dec xx + jmp cursor +write: + call AsciiHex2dec + cmp cl,15 + ja waitst + call calc1 + call calc2 + mov byte ptr es:[bx],0112 + mov es:[bx-1],al +writs: + mov ax,0 + int 16H + mov ch,cl + call AsciiHex2dec + cmp cl,15 + ja writs + shl ch,4 + add ch,cl + mov es:[bx+1],al + mov es:[si-1],ch + mov ax,bx + call calc3 + mov [bx],ch + inc xx + cmp xx,16 + jne pasde + inc yy + mov xx,0h + pasde: + call calc1 + call calc2 + jmp waitst + +cursor: + call calc1 + call calc2 + jmp waitst + suit7: + cmp ax,4200h + jne adres2 + db 0CBH + ret + +calc1: + push ax dx si + mov ax,xx + mov dx,xx + shl ax,2 + shl dx,1 + add ax,dx + add ax,25 + mov bx,YY + mov dx,yy + shl bx,5 + shl dx,7 + add bx,dx + add bx,ax + mov byte ptr es:[bx],112 + mov byte ptr es:[bx+2],112 + mov si,xxyy + mov byte ptr es:[si],07 + mov byte ptr es:[si+2],07 + mov xxyy,bx + pop si dx ax + ret + +calc2: + push ax bx dx + mov si,YY + mov dx,yy + shl si,5 + shl dx,7 + add si,dx + mov dx,xx + shl dx,1 + add si,dx + add si,127 + mov byte ptr es:[si],112 + mov bx,xxyy2 + mov byte ptr es:[bx],07 + mov xxyy2,si + pop dx bx ax + ret + +calc3: + push dx + xor bx,bx + mov bx,xx + mov dx,yy + shl dx,4 + add bx,dx + add bx,bp + add bx,offset buffer + pop dx + ret + + asciihex2dec: + cmp al,'a' + jb nomin + cmp al,'f' + ja nomin + sub al,'a'-'A' + jmp ismaj + nomin: + cmp al,'A' + jb nomaj + cmp al,'F' + ja nomaj + ismaj: + mov cl,al + sub cl,'A'-10 + jmp endt + nomaj: + mov cl,al + sub cl,'0' + endt: + ret + +dep db ':',0 +sect dw 0 +xx dw 0 +yy dw 0 +xxyy dw 3 +xxyy2 dw 3 +errordisk db 'Une erreur est apparue sur le lecteur, appuyez sur une touche ',0 +menu db 'Haut&Bas [F1/2] Secteur [F3/4] Charger/Sauver [F5/6] Mode [F7] Quit. [F8] ' +pope db 'VIEW',0 +spaces db ' ³ ',0 + +showbuffer db 35 dup (0FFh) +oldmode db 0 +infos db 40 dup (0) +buffer equ $ + +end start + + + + + + + + diff --git a/programs/write.bat b/programs/write.bat deleted file mode 100755 index 808b110..0000000 --- a/programs/write.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -cd .. -setup -cd sources From 889a5b6cb959058f5f5ed595cff3da152d3c2df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sat, 12 Jun 2004 21:47:49 +0000 Subject: [PATCH 14/17] feat: utilisation de l'int 47h plutot que les sous routine video --- programs/detect.asm | 249 +++++++++----------------------------------- 1 file changed, 48 insertions(+), 201 deletions(-) diff --git a/programs/detect.asm b/programs/detect.asm index 875b608..8b2dcf3 100644 --- a/programs/detect.asm +++ b/programs/detect.asm @@ -8,42 +8,52 @@ org 0100h include ..\include\pci.h start: -call cleartext - call getpciinfos mov pciversion,bx mov nbbus,cl mov pcitype,al mov si,offset msg -call showstring0 -call line +mov ah,13 +int 47h +mov ah,6 +int 47h mov si,offset pcivers -call showstring0 +mov ah,13 +int 47h xor edx,edx mov dx,bx xchg dl,dh mov cx,8 -call showhex +mov ah,0Ah +int 47h mov si,offset poin -call showstring0 +mov ah,13 +int 47h shr dx,8 -call showhex +mov ah,0Ah +int 47h mov si,offset pcivers2 -call showstring0 -call line +mov ah,13 +int 47h +mov ah,6 +int 47h mov si,offset nbbuses -call showstring0 +mov si,offset pcivers2 +mov ah,13 xor edx,edx mov dl,nbbus inc dl -call showint -call line +mov ah,08 +int 47h +mov ah,06 +int 47h mov si,offset typesof -call showstring0 +mov ah,13 +int 47h mov di,offset types mov bx,7 mov al,pcitype @@ -52,14 +62,17 @@ bt ax,bx jnc nowas shl bx,1 mov si,[di+bx] -call showstring0 +mov ah,13 +int 47h mov si,offset spac -call showstring0 +mov ah,13 +int 47h shr bx,1 nowas: dec bx jns vote -call line +mov ah,6 +int 47h xor ax,ax xor cx,cx @@ -70,30 +83,39 @@ jc stopthis push cx di mov si,offset msg1 -call showstring0 +mov ah,13 +int 47h mov cx,16 xor edx,edx mov dx,[di+pci.device] -call showhex +mov ah,0Ah +int 47h mov si,offset msg2 -call showstring0 +mov ah,13 +int 47h mov dx,[di+pci.vendor] -call showhex +mov ah,0Ah +int 47h mov si,offset msg3 -call showstring0 +mov ah,13 +int 47h mov cl,[di+pci.class] mov ch,[di+pci.subclass] mov di,offset temp call getpciclass mov si,di -call showstring0 +mov ah,13 +int 47h mov si,offset poin -call showstring0 +mov ah,13 +int 47h mov di,offset temp call getpcisubclass mov si,di -call showstring0 -call line +mov ah,13 +int 47h +mov ah,06 +int 47h pop di cx jmp noerror @@ -428,179 +450,4 @@ notexist: pop di dx bx ax ret -;=============CLEAR========= -;Efface l'ecran texte -;-> -;<- -;============================= -cleartext: -push es eax cx di -xor di,di -mov ax,0b800h -mov es,ax -mov eax,07200720h -mov cx,cs:pagesize -shr cx,2 -cld -rep stosd -mov cs:xy,0 -mov cs:x,0 -mov cs:y,0 -pop di cx eax es -ret - - -;==========LINE========= -;remet le curseur a la ligne -;-> -;<- -;============================= -line: -push bx cx di es -mov bh,cs:x -mov bl,cs:y -xor bh,bh -mov cl,cs:lines -dec cl -dec cl -cmp bl,cl -jne scro -dec bl -mov cl,1 -call scrolldown -scro: -inc bl -call setxy -pop es di cx bx -ret - -;==========SETXY========= -;Change les coordonnées du curseur a X:AH,Y:AL -;-> AX -;<- es di -;============================= -setxy: -push ax bx dx -mov cs:x,bh -mov cs:y,bl -mov al,bl -mov bl,bh -xor bh,bh -mov di,bx -mul cs:columns -add di,ax -shl di,1 -mov cs:xy,di -mov ax,0B800h -mov es,ax -pop dx bx ax -ret - -;==========SCROLLDOWN========= -;defile de cx lines vers le bas -;-> CX -;<- -;============================= -scrolldown: -push ax cx dx si di ds es -mov si,0B800h -mov es,si -mov ds,si -mov ax,cx -mul cs:columns -shl ax,1 -mov si,ax -mov cx,cs:pagesize -sub cx,si -xor di,di -cld -rep movsb -pop es ds di si dx cx ax -ret - - -;===================================Afficher un int EDX a l'‚cran en ah,al================ -ShowInt: - push eax bx cx edx esi di es ds - mov di,cs:xy - mov cx,0B800h - mov es,cx - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint3: - xor edx,edx - div esi - add dl,'0' - mov dh,7 - sub bx,2 - add cx,2 - mov cs:[bx],dx - cmp ax,0 - jne decint3 - mov si,bx - push cs - pop ds - cld - rep movsb - mov cs:xy,di - pop ds es di esi edx cx bx eax -ret - -;================Affiche la chaine 0 de caractŠre contenue dans ds:si -showstring0: - push es cx si di - mov di,cs:xy - mov cx,0B800h - mov es,cx - mov ch,cs:colors -strinaize0: - mov cl,[si] - cmp cl,0 - je no0 - mov es:[di],cx - add di,2 - inc si - jmp strinaize0 - no0: - mov cs:xy,di - pop di si cx es - ret - -;==============================Affiche le nombre nb hexa en EDX============== -ShowHex: - push es ax bx cx edx di - mov di,cs:xy - mov bx,0B800h - mov es,bx - mov ax,cx - sub cx,32 - neg cx - shl edx,cl - mov ch,cs:colors - shr ax,2 -Hexaize: - rol edx,4 - mov bx,dx - and bx,0fh - mov cl,cs:[bx+offset Tab] - mov es:[di],cx - add di,2 - dec al - jnz Hexaize - mov cs:xy,di - pop di edx cx bx ax es - ret - -Tab db '0123456789ABCDEF' -x db 0 -y db 0 -xy dw 0 -pagesize dw 80*25*2 -lines db 25 -columns db 80 -colors db 7 -showbuffer db 35 dup (0FFh) - end start From a9fd6c916e02025773ae7318dde1b88c3c8fcbac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sat, 12 Jun 2004 21:56:31 +0000 Subject: [PATCH 15/17] fix: correction d'un bogue pour le ret far et de l'affichage du nombre de bus --- programs/detect.asm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/programs/detect.asm b/programs/detect.asm index 8b2dcf3..5dd4e0d 100644 --- a/programs/detect.asm +++ b/programs/detect.asm @@ -41,8 +41,8 @@ mov ah,6 int 47h mov si,offset nbbuses -mov si,offset pcivers2 mov ah,13 +int 47h xor edx,edx mov dl,nbbus inc dl @@ -118,8 +118,6 @@ mov ah,06 int 47h pop di cx -jmp noerror -noerror: inc ch cmp ch,7 jbe search @@ -132,7 +130,9 @@ xor cl,cl inc al cmp al,16 jbe search -ret +xor ax,ax +int 16h +db 0CBh msg3 db ' Classe:',0 msg1 db 'Peripherique :',0 From db731a84decb510e640472b24af0ba186d7bea9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sat, 12 Jun 2004 22:13:38 +0000 Subject: [PATCH 16/17] =?UTF-8?q?docs:=20Ajout=20de=20copies=20d'=C3=A9cra?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Graphisme/screenshots/chargement.jpg | Bin 0 -> 23012 bytes Graphisme/screenshots/dir.jpg | Bin 0 -> 54292 bytes Graphisme/screenshots/editeur.jpg | Bin 0 -> 113911 bytes Graphisme/screenshots/gestionnaire.jpg | Bin 0 -> 52570 bytes Graphisme/screenshots/installation.jpg | Bin 0 -> 23842 bytes Graphisme/screenshots/interpreteur.jpg | Bin 0 -> 5918 bytes Graphisme/screenshots/logo.jpg | Bin 0 -> 17124 bytes Graphisme/screenshots/pci.jpg | Bin 0 -> 20181 bytes Graphisme/screenshots/video.jpg | Bin 0 -> 129586 bytes SCREENSHOTS.md | 12 ++++++++++++ 10 files changed, 12 insertions(+) create mode 100644 Graphisme/screenshots/chargement.jpg create mode 100644 Graphisme/screenshots/dir.jpg create mode 100644 Graphisme/screenshots/editeur.jpg create mode 100644 Graphisme/screenshots/gestionnaire.jpg create mode 100644 Graphisme/screenshots/installation.jpg create mode 100644 Graphisme/screenshots/interpreteur.jpg create mode 100644 Graphisme/screenshots/logo.jpg create mode 100644 Graphisme/screenshots/pci.jpg create mode 100644 Graphisme/screenshots/video.jpg create mode 100644 SCREENSHOTS.md diff --git a/Graphisme/screenshots/chargement.jpg b/Graphisme/screenshots/chargement.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2d1f358dac40e60818b3c794856fdd6873e583c GIT binary patch literal 23012 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≦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 literal 0 HcmV?d00001 diff --git a/Graphisme/screenshots/gestionnaire.jpg b/Graphisme/screenshots/gestionnaire.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1cd94b990536ce46af39de8ad478d0ea951b511 GIT binary patch literal 52570 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 J=D?4k{{^JZ8R!52 literal 0 HcmV?d00001 diff --git a/Graphisme/screenshots/installation.jpg b/Graphisme/screenshots/installation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66d46f9947076c922d68eea325eb08a808299993 GIT binary patch literal 23842 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 literal 0 HcmV?d00001 diff --git a/Graphisme/screenshots/interpreteur.jpg b/Graphisme/screenshots/interpreteur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..987f3205ce26d1eb9b614e5c6a5ef24795394f71 GIT binary patch literal 5918 zcmeH`X*ApE8o>Ym>`2<$YKuxN6&YOC0$rKkpBG*qdzEma0ZuA)jUGo!Ay z(P>RnODWT#w1hIpUWsKyD6JwW*Nl!E_ue!2ocpCSbI(2Je#rBl=hOR~=RCjX{k=P{ zcYXr)IoUhf10V>AG&EGvG(AivS?CxTl6ISbVq#)w3A8*0BTvF(@uWW-JFS2u z3e1C~KtWXiA_+nz!JQ631pq*}aN6C0{}mtv3WFn%C^2yfVL|;q00Kgx5Ev8=hrxu^ zNy2*oCJC3q>suqF-Kj{`C>he#{M#rs8&;dFNB@etL11*MnD~A{1&$+d3uMc#Xjjc)44_W&VFsDfy7bhr&E|1pbn9 z(o2rR7*w0^09h2rAmv}peLW*f51@ApoXJ?);H;O(ZXQdNshpZ6XRF(5NF(Q3#hsW? zafu6FZit#DOqJ!>55dl~sUYc|jY~I-gH6W+aN)@%)~ydQN#993rYbda=>x$hCzSaf zIadmKgnaoz7nL$V>re%nKDPnvZfLMQYdNI*Ss^Zz-x{Dj{N4Vy80Pa)470C?$SyGVtd?Moxz03s!S&%?px-(C zFA+v;cPpi5#L~nM38#62bFY24H6NOMT2+nqm}prn@1ZpPc)9o;>x(IYzGAq$4Kead zJ=yZE(5#kMEOr}Ed4?&EVF#u8eUt&8@SJn#+%o58YWTH{yqAILb0`xIjC+^8-{IE$GA(tEIP3s9vx_amG9ZhG94K~gt{>DM zAyb=TGh!M^iCH&BO<^${dp)xyOCx`Qe?ulMK9+v>E*syRFl-&&UGXRiA6dK%)`qUU ziSPCMeO-t(=@DUjH+&}FYc5sUdp^^S%}cB~`c1Kl`jr=}8>i1^16+Z|i~9GycP1V+ z*j{o7(zoezD*TJr(zvTBx+0Wp<-j*MCHQogd811h(&V69WBu1-Ej@f=_s%1mzJVI1 zY8ElBN^|mjG-Ff%U2tYja2AT_SiSM5?Ph)o79H$&<*8;7YVykQDy6LX3dqxk)R>+t zd;Qx2H`U@x_O|3| z=1#LePd9nqej(3=5m(ONcf@Vaak)>IM0>d*oxfe+c%4F%IKAPKo*^zIw9Bn_eZgK9n_l!II;noX+9QG{+@`aF3nAu>xRedH^p!<+&df*`e^qlU6(XIWv+rOh7j zjkfk%Q;uGD1N{+AOz!w8^H%PiVNJQw&+=?tp*sC(oqdB?>~@A)`CQY_1Zd<7+h>mp z6o^&2VUdkoMPoIkotX+PP+`bXH{w@9b5qR0h1IK?oy|{gSeg>O6 z?6E7eyY7Rk4CgQjj_;E3fPI$&)$WW%Z5_3cfsX5xf8a!@fMoyg5_34jn_o&C&>ros z@~0?t3qO1SkJ?{;zVqwE_*a$L06~A=p|-vQGDcFF(% literal 0 HcmV?d00001 diff --git a/Graphisme/screenshots/logo.jpg b/Graphisme/screenshots/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd30ca1707ae4cef110c4aeca2f9baf7040d469a GIT binary patch literal 17124 zcmeIYcU03|+a(;j^cw}FBSq;Ty%QAa(nNX_ktR|??-3Oc1VZl+={*$bMG%mP^xk_3 zy+de8CO*&e&b;redDr*N%$hadTHhVk`Ge&Ae(UV(?6c2x_PH?Am}S6U8Y=2402~|~ zz$@$@05bQ(*dBmgR_h~ zjEBPxz@@^$qr$;-16Tn790KfU{|xwF9~@jfd;&tEJH#ZU*ba4n0dR5f@Nn_*2ng`; zvAu(^zXR~82=1~8KOwxQXHCQoq815>%elkxwE73li;*Kv(bw)Dh)HPg)6p|Le8k1g z!z(5(At@y-qx4K!MO95*L;t0Lp^>qPsm&W(J9`Jmw;rBe-afv5{vSVuhJ}BQh>TB2 zOiE5kO-s+s%P%M_DlRFl`Bqz3-_Y39+}YLrvj_gG_xI@7_{8MY^vvwa>e~9oCSq%Q z=lJCG?EC_Gd3F5<7Y+dLpRoQbvi}Yj6&4pRK0Y2k(H~qmxIWm1M}<$oCQNwui5`(P z=pMUB$Q|mZaXHmLh&e=G9MQaXA0eUT6kBogsG@OGchXzu$ep@JYA4W>>Em=sgJ63nQ?C(eYm2 zmd+rgxWtEc;>DU1VMnu1;q)=XC7<0C4n|d{vYSdhb@S|qKtX}fckw~ArxMW+-lhFM zN3uXbu+|QOi|bMvu}Rp}PNii7g3b38e*T%^e9{ftvuYL%35oGA@q7{W?tkNHJ-TU% z)$1#T8P02gO=m_HgZ8=PQMyaOZN|i)w$72qP(QgxFnfB>nnhEJ7S$JtxsA_j)9s%2 zcz8^kHCwsDRRq*}hD6pEl$0?745XidVI~U(b5jrIRs7e3eq5f*wIQd`GhEYh7(mVO zx1k>NM`<{-$Dc`R(3K%~(PHQ_%4U}7Buyopmz|d_S|Hk(?KtO>78r~2EJwLa4)z&k zFLti&)0Q;6$>=)x{lSmPi_xLKtlmXzvwVe1o@m9)s9 z1DW8uS>;H&JqXx z;Iiz4)4rrOAEDILAHP_+mnqt`6-t<+OcP5A2RJ8fSj^+egqQ8*D6aNjZsqXdjOsY% z^Y_=Uj%rC>x~wvkc3u z=J$HaG>V=K%ApnesW&kdnbNd(hHY9rT%9U66pyu+ndtPD?M|e z2?3h1l$^}1OfdlDfbEFBv#ZBmZ8Wh8*+4IqG}EBsW^SEYx{)71d@GwZ~^zrB7BZRWNx9P0xMf>xGJ}@fiPT?`=RW&%t-J-5Bc(NbFr>H8p`VFZ%;%_EoXpJ06ULhoB!$NYrY zF1;6z{g{h0+vuQNeSBcmGG5}QP8)OuxjkTXOf4aCz29%@7&QZ1;)g#vzsZx5mPUxD zC=;6%Glx&hDM-~i2tGj5+j|+gntue*@5UjC*2YheOEx!eps!BReLX`!#%nSJlh=R| zR*Ad-xskl@xpN}{f49G5@HYqk=D^<^_`k`4%;G_}Qk`L4Jcp9WiQcQvrr;S0Df$9W z0#n}M`gccVmt&vq+5;X1e@GEwj`TEue{krr{7V%!qQ}bb6%}lk)%`@-gxIC)GJJTH z(HsLPb6bQ*`rx)vBcj)&y!g(kXa7H|^E?Lhb0owHA3|Ti@hZF-f@7-Y%I=(U*mIr^ zr>AKql4)wOt-Gc@;ecra%A#MDoE*GXHFpE@?hcfDe~x>mnDwnm5kCeMoRmdgPWY-O z%Czvv+@bt6lT-{z_A_C&<|lJPt*m1JSf zo&?J5h?LAEsS`C6@@5zz&mMw(^o1*Cr9$r9m(S8xU3uBrlyQ0D|LT>|OXu8F&barN zgL*N<*CZwUk0$>zW%tGa{)#%j0-4TChl+a;$W3_PCFJzxf=uQlKi)@bWS>_GT|ej5 zAlywxu$PL*i`m=6$UEl4m}cn<$yl2`w1k^Ihej)}$XNyAvNK{l)VjP?<|$!3^q%$g`LDT=JlO1x8t{Lnxm*Tx`WHn!Vjsk1vuc;UEp7wF`>vNzXQ*3*gq0ev zJmDJFpC!}}>v3wB@{A_!A|`0j4DjI0XwY(@dAWxFs)`e}=gBNPNd#SKzgj890G6gP zfXnnG*|M*~t$91#Cy?R_D6k8B+GT(Nv{z#Q$6|hHMhqaEp%R6HU;q(C{Wmx%1esGJ zaF>Sx%+HE`h=ud$ny&nqfD6!MKP@RaT+r=Wt!=imUPi zfeA~sUn)1Se36EcaKdk146pof2(;<`3L<~#FY%2cSs>l)GB#v5E;di? z`C9{7Tn|$f^A3?nKGml+b>re00cJDVj6MtBp8?`RIlYj$8Qw;?A97p*^sxx|#$jmY zt$H6F7o=&-dXJy>nnLz@&(hD8UD6qWH{k~SslBH*2RP`%wr6j7-Vw=fu%1EO{5YpeYbzwen%ugK>^{|s2I zcxK#Ur%Wq;ysUe>uSa%XowebRn|2rH@P_S&%@a-Uc&#Oc)7rI|`D=q9%im5aYK7sX zEN(lZEmFW}$LY6mb91C7laEW#B^mG2IJ0Fpo9WrUPwYkWG(|59(_vYqtZ-_SIYV=4cE>RotmvNRImR${47$o^_6HaM>;dzRC)#dyN3z} zy*9jBk4QaFXh7eiwU&VdZ858LUQESb3IrgNY+VbYNP}^pYh4oaIk1G(oW!dwC-eV1beE>j>}e z_t2-jb2(Z=LaEVnAU+IWs+d7-Q6<#IlV=>|2TT1eYNW~+^|ha`&X;lXxr!{ZxV;9^ z!nkIxx-)O2Oq(s3k7u0$^rG>ATJpViRv;JfD6@duL#|%s1s0)kWxR;uMJVaZZN;*3 zJ^5z$PKz^pJjTZbGcuEwy=hw5jt(=u3yY1$TWzilz`(Ah)2^5QQV(&X6YgHDsFcyB zzeB=$2`51#>OX)8nt-7rBzA!T|FOW#$HavwW~|`C5Ca4A_3-ExsxdtIAV+E0ccNL@ zi%yPY9?wP^_qu49{imk+#dlv%zL?w5jmaV8v<%3(3R45VAMitd_WU$@kf_x1J3&^7 zX$@e1H5#fc0O-k$^7rQpcHQqjO zufG=9?@Xq8XJxcnl4_z&Ni^EVwukP!I{=oG5cYNoo7Hi-f5@^xL=Uq>?{?|953pV& z&g|^gJoaVA=`D$x!z1LgOX?)l)$x|1ZZPzrb${0wn&%3dy4|e3#Q-QVfFWj`e=eyh zi-N^1hJkcb#&$svbm1+IqKo>yqu@Jo8xxgEO@fXx3!XE%2zjLuu1A`l;bZygVmQ6OLdYaLY z5oyDGx3{xDfsC`k;TQlSrU(N7+h72zZ^tvtaMI-SCznNYrkA|nyuo2#VJ&JCt+IHj zg5cU03+Urm&Qjq7q#LDa!>SOjrjzr_I7`e%v{#M8h z3z;AdNn}>rKd(r$KU$7!Z9JE-gnK$(d)#hCB9%U99m7kos%Y^Cqm#D%G#M}7@L?bU zMUh>DDbpu&);4=Vn&uF=O$S%xvWq}rZB|ZW#A*^K5%fW7fO|mm6+8A+-|?Si@_~ZY zznSw)0BG7l$_-0wBtbMkvudxsr)x_Zg0i_gUeY~~#DlaYSSd`E21<@&0JXK6Srqzd z6&I)ok0}q?_ANe=;}Oj&($xyl8&$QSkD`wxKs$ZVVWT9YMx*%4FIwpSiTnr^cByGq zaH9Ryh>F!4vUKj;20#U~sO5yG-J{NHhbK3`DD;}o^?&U6M-JvDs2>oZ^o?331p{vi zpI;acv&R6IDTtoDV&SjB&DS?IGlDP0t-VA2I= zi2Q)m`hXC&G!3(!nZozHRegK%6*StcB@1Wx8F{BDPG}#l2Ky1{B`3Malz9|DF_BO> z*(qq{E39qW6Ucg?KGpypY$_WNIr&lTf%g@CAp!*UwBf>kGEn3{ZLM+q#<~JUK-!N( z;yMmwG6N=SC*AqkpO)~Gj~Y+QNREU(K|m@<@?xSWSzyp7$It3Th0@rfd%S<=$G~9< zjTIS(q>e~Ghs3$|@*r7nnB7emLuj_iU)tH#=lgRNR$_ML9cO0yD)RnA_X8wjYI5Hr z;>JUU6y-}TxVm3#GnSj$Inlz|hWf^jAs&mZ^G8D{VEO4$SH0yk8=dsyu2!HObJ~&m_FUzblZe@Jq~+|o8s*};3rkv$ z(>+fgPy&PEk9I`HE7qd71L>^a)C`TyA=aoT<=ZRq-kZcPPh=*>V|lz9mAP*E{jN7l z!A@p<5QUA$?Or~&L%Sb85CX|=rXG#-^s{i<4!v$)Q$op71&hZyfk8}sWZr9i=KJK_oIY|#j@Bvt zjjr`t_zu$@_WVRFO$rl5-)oSf zwUYw`*A7%{fq7@qovloM&0sW{Gd2-#23Enal3NeO06sE;(So&`7Co=`U6rm3`s8^J z&IqF=ijdRG;A~#x1l=xSv?<;nQnI)Y+0?8g-fl>_1Mvc8M7ZHG*Ki}4eOIdvTFnY) znVX#xEPlyo`JGg*FhGmfFNkKF+H}muy~31&JV(p@X6SJAM5Ffg-iwB0l7td#Xgnvo z#!3#JM`x^G^B%v-Qme@#BBjmXfs|iS@~S@nNo$RykvG52>RTCZ*n5(O zLNipEUL=#fH&{{YB@FUo5^Yz3ut6D}8`6k)YlZAkX;?%A!8D)o06|S8|PuS7;h=>^H<~}U1gdHy5h12BvVJ5 zS*VHe>_-cV(7Vy^8t+U zKWL18G!E@QeQ13O|M2O}xwNG;45IUa#|6*4zV8hNV2r4L0^haNTxGVi0Gl%p1(0%A)E8{lFus5CCfu7a=w;=3`EMR^FFT^| zZ}k*YSe)|+YZFlV7gBgYm{aUAMUrd9ot{%hc%~HnAP7wpn(uq!q{X|WF)pAm;YfHW zkeBf0OVbw??I#Fk)h8ANg_U`4rD&VuRS;+s3kWCrP11h$_pD2p0r8WN?nPfKy}I6K z_lnBxp}(saSR{CNes_H%V>s8+P#MiR6?`3QfAGF(VNB|L*Aff{`4rF7+eV-gc{-LU zx6Ph99}sHMcR3y}Ux+}bUq$u#Bt`q`opaTb@(S{TuV}*97D=5} zU*;!0fL*=*b=0u%K_Eo_`#}5eH5YUnFE4imVD~%YPFdk)^NbyEtLE@j6~+-5T-Zi} z?jzJR2`>aIS+d8=X*1K6QG7D`c9~(NvsWzsD<#14;ABLV$Od10z*Hzre4LW8DWn3% zaQ~(+3T;wcdRyip7tI;LA-$uKZa-7dBbS0r+{iu6NjwdPzV$)Rg|I6lU13P*_85G# zKH|nRWpy-qYkaxb*AHw2i~62-yF$jNq%Zuyh%ZB;Z&_K4YB)7rQnkhAi47jxgl*ORD)e&MK^@;aGJ&Tc$( zc%j>L#gxe+JeNLAkq#sxei!$%ixVMDCejA(tQPW=f7?+*#7`EE?)1Um3 zluxrzb6e<;{qR;pM2aO#XU){8^rD{9H-jq#bTe(NmZiAU>a|*hi1&Ui7hmZ(JD8WR z@n-DsQG?AmhueaGOnAwz+Q{=gliWb)g%;P$2G)c42lhGD#=&|xyh`ij?X@ovI$*|{ zGPpQce;O2nNZ)=J4J&V{&G>aFJSl!<%M5;hI(;^TCufw5%C@>%#Q>1Kurc+~#V*ar z)f3}#j(6ybm3sS4ju2!j48@&kE6CR={ssC{_H))KHdt4|#g9l}+9rl?h({J6^Hk@l`){(3p`XKo5-08aV!F0{!B z_r@Jup*Y*t<*8=0O;<{-UxPcgBdLP{2!PN#A-cGhPa2aIHq$gJ>Oyim{8b|=oddc2 zE|hEUH(1Qtv5POWHcQJ%7OxxKE4lorKha^Wq{M0ylv5!w^yrR}q2Kay}X8FF9y!+KvFN~hVOD{Xd?LmWSEO*F> zee+Myp6hOr?V%pmEOj1V-wy9c12RSl4LsOeksS z2>RTxRK4u$-MMFNP3!QD%Ch5YFBrVbo60fF7W%fG#=&Wf5UVG@4vm{M{2%b&YBvc-i)xY&6lFAm+pEKz zhMY7lCJ$Pb$_7d-@$YFi@X>Wfaa$4%lMGZi!jpL(lbj6^oBu3!95FMCQcIi9PU8m` z_+>e6$!tu8*Qp&=7%(RQIo~I}D`8sORaQF{0Bi+6(&7Kkn=O2=qTDPnUX_SDquq3M zcQkLxQ|NAC)^RE((LcJ54Zs^04GDCD?jYA$vj*A2{&?$VbO z5=SjEIQJTBg;CqpRRl_V2$Jnp^X!k0HyiZVyYKlzf4j8vtkJ`&W?OY5U@Wr6I_iQ< z59Aw%xS%?wToUi0Dr(NTT?>8(E>jD)JXSV&U>PTF|)#SUyhok&- zjMnnE9~)8q{}w9qo`wpG-Ru13(9IwGslUJeBO=SZY+6kok3~y0{b+e679@)Yjiw@F zBDe4+&vvK1)M(B0TP1=m*Amb)gMk|3A9t!9MkK7qPHSVr`(N5zPf34uLI$&pzc`uZ zOdZ_H?=@VG0c~eanSek!m)*94$}wO4AI_1n<{eS~Zac;X1+l)Kb&Z3Vuv_fh*+Os9 zTJH`Ad%4`Ge;uq?Cg@R@0jKa>hvVU>qEB1$&v+()-aF0vWfK3Ztp zIrxGWUzi(W>OHXr&zzMvIY-w9+pfo%s!k8isb34}&wV{KP^ok!d+&I0|2nZN$9Pr@ ztqh?*+g_|naL3c>NrzsjhE3^2#es_L2k^>+&B`eI8BS)m#4jf6vR;_&YjZCr9Vgit zk6SA)3t!NDWcPD!aBpbNjGTmbY`$c1!|laHC<@S z8mn+Fd4c|h0Xzx70B(uF$K^XbCOCPh_Hqnh7<< zDkiYAf8GBx;y~MxJ2w?u=b}hp-Y{{_r}j)@HhNx|B7&*^tIrm>e(o1@a@Kv6J^I5G zHY3OSaBJ%Se6#7l-t43hXQXMQ2U8s~kk6xP#0k)_`WdS>tEzO-b(mpnlHhp27yYSdeXVVQ>~ zA)9a}dhE7v%4vV{nq27O4KcdKphjt{Wgh)DKe*Nd{&lZ^hfh!7?EOvfM3CEJoEb0T zm|thxw5(ve-X;i@X9_v6Sa6BO)<%fws=DO6J=rW6SEJT8Evj#8u6aG#AgTy2iF}%m zw$e9CF+E74RuK?=T5EU+lCpQTq)82#_qpZ6RnJd~@V*6f+?M=oaw#V_ZbG${gNOeu zAP(roN#K^izd{XFHsYnq`41i5W+Lw`sJ&@SSAQdKs`AfVzD5zNqK`><6uG`~Z5vjc zwLRTiUF_M^M|VF57d#rBCrLDHJnDfF+ScC4T+hpN1CLj^(VcfhL1m6{l#aJUD1f+5 zEd(@^Ms3(WE#?qrJDINIOHx!L*IPC;=s&n%MpGfIbtX-)7xMi+Td=33a0xJX%FGy1y`L-e45 zc$Phm&3NVUH2)!5oHMjlBCPON9N-?8MtdTdy7)IqT1052>3 z;l_xmd#)Dc{=NmJpnTz#RM)h^zUXPZA71=IPN_9NjuJ9e8`ODL%@~U=kMohaDy@21x#iqki zL44>)Ej+E!VKmbG)Ai?9agZHA-mL0ZlQc2IMjcAk$si5ad~U2g_EapW;aSve`m@7B z0mK;zFpCM5KuTS4F8_2CC^&n)NsZofuYvqx$hh$_2A_ku*6lTj5|8{DRCdK@X{APt}OJKFwV7^cK)71`wvnocYg zJ`@Dv!2k+%0l?!;YL7>>_ilWQuopQMNHjk1azeT&eN~AQds1d8-!q1GPnOfxH_(~M zbLq9ZS}cvcyg}|`JJ-NgSry`nW{M93+^Esd*RFhM1oMr~!hgG;bGm5>T{mW701Gdi z@`T8Ukj;x(6u=LIL;W1bvqZbQXT=2*wJXSjy0WfAk&gD*CA4ZA%Sc51O^}jtXU_b^l%7Ax0Hdmq{{@#P1y#%f3c%PBJ7je4dL5b3LF!J&m>9TQ92nX zv!Vc$CtCN5F@VZTx8Z7{F#A+Oec2-9T3t|k1_2G%1q+lScnr*dvn%I!n}D?mfyqor zqx(AFSN&{VO_;Fy$SZA!wDy|b<(N3T;iQ6MKwotfn( zo9Q9%exP7`h5Jjrz1PTb^PaOsq49M)hvZ2@mjX6?=+BzBp@U7O3m>?~U9xnJ(zKWQ z3UqTz^gqlHOk*qcUjJu1(|`QFz`#yQSN#n4{oTlnJ?zX;D-)I7=AD=1jtSb*>)yct z?6Il+*N>WM1d*PG&_u7@BIi9PH&yu!sf#}z?T@z->l&$)h-xh3Mj3)^XW-$3jGTE?mv zKn|4==XklXvu_=J%Ba~0q|g4mxV^S~jKwh85n{rb1VMiy+SW|BXs>ML{~X*|N|X`s zHhc^OM&UE)xxRi(K7Yb`ZR;9$l}vP2g4Gy%z0b~`m#Q}saSb~i>68)T(JlJA=~UY| zRNyVCyd`w|N_dVOgZ(V!wO~Z4`3>UZCH^&X-*8HGd~6fl`K=Dw9Mpa-e0=Rglf=~A z^Gzz`VQXtrGn==&@6Z{F@0p{FW!&joq?IES9VEcSdb52^afgF`>&ee&u-fl!b>QNW zoFa$jjlD$!SYAOVYM{3Ijh9?%I5Xw$p^520No``65A4eY^E1Iw3V4~#+(|`PcsD~9 zG>N8ko56Z3gamJ>Xwfw_nEtF(RjYbzkj5Ei%L@1LjBH1C*88&{s>CyGVHN&Dr;Mg_ z66szGH&jk82SkQjW#={>TW=4iJzH2@UA6k5r#(Y)mrZMpa(Kfryg%2&_U;^<@45>3 zE91LX2fydGQhM21K|?v<6CiXG%L|!+oK*N_EFED0BJb3$&qjE(Wa!E{&OZerb`YEA zhf6ex{n%nsuJQEI8||3z^)VN$%K>Xp3=UB}&ATxq05*^8-5+!F0hZaEm6|$J1@`|= z=hKXsd-qtA?d;j3I`#>#h*VNzJsnr}0i4^;O&GImkECX^UI{PDsoJmh65NCgvzb7+ zjc}lB8MMt>%w|%rD%d$vFXvYga%$F7X>p(N?1h%G0#lN@q-kLa@nQ46Ia)JeTOE~_ z^Rxf@GGTUh0$UoeHm7d}xsJ`VIPy7~B13Iq=SzBPZ}| zaj)t&$*}OFUZcks0m5Fh`Z;fGS0#Z%jX)#+a1`y7b{#e&2=!pVD#sTR)^!m$U&!Qeav%` ze8fm^VfNwSxu`JS4zWP@>7Egp>w%hTh4^e_j@+l)n?PSs9Oh77us`U(uFt||DRx$(7=R*Sh)teq ze{-MuKEXFu6sfZo3X=a53hb8X#$GSby#Y_T08Mp-x*lV1V0wz&g1$au&0Ym-z?{y( zKDRi=pIIq;6b=fc&t%!r6^i57o$sL50*=mD5Cw0sy>;DZCgixuqOeD19|FJX-EIR{ z*p2^?RAr0}d6G7Smg~vN*g|6fCpaY)QbRMf(F&qFRoGE&J)0;C7@{`6t&i2f{;P2D z8Jl%6>m3@H{WSe?lOo)O0hkM{LCy_mw1ezlHq$kZS3YEc$V#4yxl4`&TYI=zi2ihk z2?@Hq)}Pw<2_QntE$NJwFynG=?wXC+oX-hmV3i%uIMIMx-RmaSg3-!)n4LbwB;D01 zKpzA6mXtSmG_SN#JMN-$<6ds{OY(~5iL($FUpeFAxXxxKuIEI zNdugcOP?-tM~U4sE67z~%kyXL2k@n^2Z%;|!-waS4XcdpwU*)&^F^1bcZmR?X*Z$` z6RD=X@|N}!aOJ$go);2I6_$c$dg-Ro@4sXb(s~L_BKqBCqEq|>W;b*rs++m!8*bKQ zFaLsjR-G}*eV}9Od#k^J^~!>>k>@sZ&Go!S$?ee9fY60S)HBko*Yhl^)Q&)1VQsN( zWm8JaUBgG~NExcteGV^Eo&Th%N=z?X$yYJOh;BeqS`eFNn6a#YSfyJGb=|RtSQei)MP@ zH?gk3%VTkGp-c4xn|@()cGlGxw!dyWXw+MkOP0%xa0%qUM%$ni2XxbSR@XQEHWIIY zZM0`uaqP7Vn@>Tt+dLX{Ck0|Day2U-qcx##!}ppwIgriKKYyGxG<4j~LpDsr47e3m zn_xn<4va{dX9+fK1HFhNU0@bow~;XAnVBZ3{w_^T!d1OaCBlSSZ*Of%w?$0QYrt^t zb&$&T)XjHC(koAFRePzrK&adQLai7Md$*2}GD|^wXLeOrRNW|w1}nyoc}aM%)}#qV zrECzj(79NylenCzEae5(GR84*$o=7tn2TkNADpLjQ%8Fiy=>yZ>(kq=Vnw7EC=0%n zO$OHrc64fwK-ADW8<8=ZX`6J(j!fX%?(vuUHGg62*#337UAaBt7`1WEm$nuKCTI=F zYDRM6%qC!KuPWMVkskaKN3Ast&y+c{Q3TG>cj1~i=Pi|s;Gu#tLh#RKim%8adEVX2 z6t%jLinBSsM(cNPILe>TBR1a&%OPmuXX_%tB_qzg==1IxHSkkD7RSDVIB&I}rO$|X zJg1^A=Fps7YG$*{+kuIuUi$6y{tt@>>Np>G(r&2rp`*1}9ca}SSgC1XJsX@5y^7V@ z)$Oa?IVDpl@M^dzy1dEYtVJp3|%>eU*J)3c@b=8 zZl!@Zd7j?u<4E_d+D^W=w{XJL0vkdLM%I~YekD<-VEekdGAN4DnHx;;R4V*M6L4Qf z>GmTy&Ujp}ccH4O#w$od=n^?B0BP$URlkiKh2C5I`m?PqvgKgEgYXunbY~h3o_8Nsl&SUq%)mdY35}d` zEqyf=8}5r}iKC0AQ7N8!C#obreQb4tKY`2*XlQs&%Ou41OUB>I96*XK#3%L`vU8-- zJTO|eVT$*XuYkNosHUPW$hXVjA>d-xqS7@DO}O$y4IZ;|R#Aze$jWi&hOnM_aJ54e zSOOniN0$9)asx-Z#4{2Y#zR8c>&C|$`8HFQG%a3BZi>9w@y(xI6j-79-zUfhy8Sq> zz9R}AQsYcIR<1C!u*r`Nlv#R5Tl0~eGaWo=!1sR@bGBgfbGz(U;p(V*oWi>E1GNOH zK@Po;%;3N&K4qIdn}PmwTMt;J4 zrDBGWR2Br@`0?)A4!Myz|FCubSUZ2Wzhm$>2ma>3-yHax1AlYiZw~y;f&brefE6?I FUjW?rq`3e9 literal 0 HcmV?d00001 diff --git a/Graphisme/screenshots/pci.jpg b/Graphisme/screenshots/pci.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c4b547112c0b827fc141a2d3d55466a46dab661 GIT binary patch literal 20181 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
Hk3Zjp4CRvmhX^^LLKS=I{T$S?zyE jpZni7|9)S8$H3n)@OKRS9Rq*Iz~3?OyD>oYbMpTHavQ_2 literal 0 HcmV?d00001 diff --git a/Graphisme/screenshots/video.jpg b/Graphisme/screenshots/video.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47891f3c77064e5866f3754b0222cf2bc777a07a GIT binary patch literal 129586 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 KLqw$inEn@u% Date: Sat, 12 Jun 2004 22:13:38 +0000 Subject: [PATCH 17/17] fix: correction de l'installation et de la detection BREAKING CHANGE: attention modification majeure du code --- install/setup.asm | 7 +- programs/detect.asm | 255 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 210 insertions(+), 52 deletions(-) diff --git a/install/setup.asm b/install/setup.asm index a84cf33..7494e87 100644 --- a/install/setup.asm +++ b/install/setup.asm @@ -20,6 +20,7 @@ boot db 'boot.bin',0 dat db 'data',0 retu db 0Dh,0AH,'$' dta db 43 dup (0) +nom db 25 dup (0) copycos: mov ah,9 @@ -96,7 +97,11 @@ allfile: mov ah,3ch push cs pop es - mov di,offset dta+30-3 + mov si,offset dta+30-3 + mov di,offset nom + mov cx,25 + rep movsb + mov di,offset nom mov word ptr [di],":a" mov byte ptr [di+2],"\" xor cx,cx diff --git a/programs/detect.asm b/programs/detect.asm index 5dd4e0d..875b608 100644 --- a/programs/detect.asm +++ b/programs/detect.asm @@ -8,52 +8,42 @@ org 0100h include ..\include\pci.h start: +call cleartext + call getpciinfos mov pciversion,bx mov nbbus,cl mov pcitype,al mov si,offset msg -mov ah,13 -int 47h -mov ah,6 -int 47h +call showstring0 +call line mov si,offset pcivers -mov ah,13 -int 47h +call showstring0 xor edx,edx mov dx,bx xchg dl,dh mov cx,8 -mov ah,0Ah -int 47h +call showhex mov si,offset poin -mov ah,13 -int 47h +call showstring0 shr dx,8 -mov ah,0Ah -int 47h +call showhex mov si,offset pcivers2 -mov ah,13 -int 47h -mov ah,6 -int 47h +call showstring0 +call line mov si,offset nbbuses -mov ah,13 -int 47h +call showstring0 xor edx,edx mov dl,nbbus inc dl -mov ah,08 -int 47h -mov ah,06 -int 47h +call showint +call line mov si,offset typesof -mov ah,13 -int 47h +call showstring0 mov di,offset types mov bx,7 mov al,pcitype @@ -62,17 +52,14 @@ bt ax,bx jnc nowas shl bx,1 mov si,[di+bx] -mov ah,13 -int 47h +call showstring0 mov si,offset spac -mov ah,13 -int 47h +call showstring0 shr bx,1 nowas: dec bx jns vote -mov ah,6 -int 47h +call line xor ax,ax xor cx,cx @@ -83,41 +70,34 @@ jc stopthis push cx di mov si,offset msg1 -mov ah,13 -int 47h +call showstring0 mov cx,16 xor edx,edx mov dx,[di+pci.device] -mov ah,0Ah -int 47h +call showhex mov si,offset msg2 -mov ah,13 -int 47h +call showstring0 mov dx,[di+pci.vendor] -mov ah,0Ah -int 47h +call showhex mov si,offset msg3 -mov ah,13 -int 47h +call showstring0 mov cl,[di+pci.class] mov ch,[di+pci.subclass] mov di,offset temp call getpciclass mov si,di -mov ah,13 -int 47h +call showstring0 mov si,offset poin -mov ah,13 -int 47h +call showstring0 mov di,offset temp call getpcisubclass mov si,di -mov ah,13 -int 47h -mov ah,06 -int 47h +call showstring0 +call line pop di cx +jmp noerror +noerror: inc ch cmp ch,7 jbe search @@ -130,9 +110,7 @@ xor cl,cl inc al cmp al,16 jbe search -xor ax,ax -int 16h -db 0CBh +ret msg3 db ' Classe:',0 msg1 db 'Peripherique :',0 @@ -450,4 +428,179 @@ notexist: pop di dx bx ax ret +;=============CLEAR========= +;Efface l'ecran texte +;-> +;<- +;============================= +cleartext: +push es eax cx di +xor di,di +mov ax,0b800h +mov es,ax +mov eax,07200720h +mov cx,cs:pagesize +shr cx,2 +cld +rep stosd +mov cs:xy,0 +mov cs:x,0 +mov cs:y,0 +pop di cx eax es +ret + + +;==========LINE========= +;remet le curseur a la ligne +;-> +;<- +;============================= +line: +push bx cx di es +mov bh,cs:x +mov bl,cs:y +xor bh,bh +mov cl,cs:lines +dec cl +dec cl +cmp bl,cl +jne scro +dec bl +mov cl,1 +call scrolldown +scro: +inc bl +call setxy +pop es di cx bx +ret + +;==========SETXY========= +;Change les coordonnées du curseur a X:AH,Y:AL +;-> AX +;<- es di +;============================= +setxy: +push ax bx dx +mov cs:x,bh +mov cs:y,bl +mov al,bl +mov bl,bh +xor bh,bh +mov di,bx +mul cs:columns +add di,ax +shl di,1 +mov cs:xy,di +mov ax,0B800h +mov es,ax +pop dx bx ax +ret + +;==========SCROLLDOWN========= +;defile de cx lines vers le bas +;-> CX +;<- +;============================= +scrolldown: +push ax cx dx si di ds es +mov si,0B800h +mov es,si +mov ds,si +mov ax,cx +mul cs:columns +shl ax,1 +mov si,ax +mov cx,cs:pagesize +sub cx,si +xor di,di +cld +rep movsb +pop es ds di si dx cx ax +ret + + +;===================================Afficher un int EDX a l'‚cran en ah,al================ +ShowInt: + push eax bx cx edx esi di es ds + mov di,cs:xy + mov cx,0B800h + mov es,cx + xor cx,cx + mov eax,edx + mov esi,10 + mov bx,offset showbuffer+27 +decint3: + xor edx,edx + div esi + add dl,'0' + mov dh,7 + sub bx,2 + add cx,2 + mov cs:[bx],dx + cmp ax,0 + jne decint3 + mov si,bx + push cs + pop ds + cld + rep movsb + mov cs:xy,di + pop ds es di esi edx cx bx eax +ret + +;================Affiche la chaine 0 de caractŠre contenue dans ds:si +showstring0: + push es cx si di + mov di,cs:xy + mov cx,0B800h + mov es,cx + mov ch,cs:colors +strinaize0: + mov cl,[si] + cmp cl,0 + je no0 + mov es:[di],cx + add di,2 + inc si + jmp strinaize0 + no0: + mov cs:xy,di + pop di si cx es + ret + +;==============================Affiche le nombre nb hexa en EDX============== +ShowHex: + push es ax bx cx edx di + mov di,cs:xy + mov bx,0B800h + mov es,bx + mov ax,cx + sub cx,32 + neg cx + shl edx,cl + mov ch,cs:colors + shr ax,2 +Hexaize: + rol edx,4 + mov bx,dx + and bx,0fh + mov cl,cs:[bx+offset Tab] + mov es:[di],cx + add di,2 + dec al + jnz Hexaize + mov cs:xy,di + pop di edx cx bx ax es + ret + +Tab db '0123456789ABCDEF' +x db 0 +y db 0 +xy dw 0 +pagesize dw 80*25*2 +lines db 25 +columns db 80 +colors db 7 +showbuffer db 35 dup (0FFh) + end start