COURS210.TXT
Jump to navigation
Jump to search
****************************************************************** * * * 68000 ASSEMBLY COURSE ON ATARI ST * * * * by The Ferocious Rabbit (from 44E) * * * * Second series * * * * Lesson number 10 * ****************************************************************** Before providing you with the much-awaited bibliography, I will very briefly talk about interruptions. The principle is nor- mally known (if not, refer to lesson number 5 of the first series!). However, there is a topic that deserves a bit more attention: the MFP68901. It is a circuit recognized by the 68000 as having an interruption level of 6 (see the sheet provided with lesson 1 titled "68000 AND 68901 INTERRUPTION VECTORS TABLE"). Internally, this circuit can manage 16 levels of interruption, with each level having an associated address ($100-$13C for the ST). Here is a small bit of listing intended to show you how to place your own routine in Timer A. First, you must block interruptions by setting the SR to $2700, save the MFP registers, place your routine, and then lower the interruption level to its usual level on the ST, which is $2300. This is done, of course, in Supervisor mode, a mode you can access with Gemdos $20. * To set up.... MOVE.W #$2700,SR interrupts forbidden MOVE.B $FFFFFA07,ANC_IERA save MOVE.B $FFFFFA09,ANC_IERB MFP 68901 MOVE.B $FFFFFA13,ANC_IMRA values MOVE.B $FFFFFA15,ANC_IMRB MOVE.B $FFFFFA17,ANC_VR MOVE.L $134,ANC_TIMEA save Timer A MOVE.L #MY_TIMEA,$134 place new routine CLR.B $FFFFFA09 prevents interrupt 0-7 CLR.B $FFFFFA15 masks interrupt 0-7 MOVE.B #%00100000,$FFFA07 OK interrupt 13 (timer A) MOVE.B #%00100000,$FFFA13 OK also for its mask MOVE.B #7,$FFFFFA19 set TACR MOVE.B #12,$FFFFFA1F and TADR (1kHz) BCLR #3,$FFFFFA17 automatic end of interrupt MOVE.W #$2300,SR allow interruptions * And now, when we leave the program... MOVE.W #$2700,SR interrupts forbidden MOVE.B ANC_IERA,$FFFFFA07 restoring MOVE.B ANC_IERB,$FFFFFA09 MOVE.B ANC_IMRA,$FFFFFA13 MOVE.B ANC_IMRB,$FFFFFA15 MOVE.B ANC_VR,$FFFFFA17 MOVE.L ANC_TIMEA,$134 MOVE.W #$2300,SR allow interruptions * My Timer A routine * Do not forget to save the registers that are used * and to finish with an RTE. MY_TIMEA: movem.l d0-a6,-(sp) ' ' ' BCLR #5,ISRA depending on VR!!! MOVEM.L sp)+,d0-a6 RTE *----------------------------------------------------------* SECTION BSS ANC_TIMEA DS.L 1 ANC_IERA DS.B 1 backup for the MFP ANC_IERB DS.B 1 " ANC_IMRA DS.B 1 " ANC_IMRB DS.B 1 " ANC_VR DS.B 1 " I will simply describe to you the IERA, IMRA, IPRA etc... registers of the MFP. For more details, consult the ST Bible, the Developer's Book, or the official ATARI documentation (the ideal!), the goal of these lessons is not to be a copy of the information you can find elsewhere. First of all, the 16 levels of the MFP are divided into 2 groups. Group A covers levels 15 to 8 and group B covers levels 7 to 0. Be careful, here A and B have nothing to do with Timers A and B!!! For each group (A or B), there is a series of registers. In each of these registers, the interruptions are represented by a bit. Let's see these registers: IERA ($FFFFFA07) and IERB ($FFFFFA09) Interrupt Enable Register A (or B) By setting the corresponding bit for an interruption to 0, you forbid it. It will not be taken into account by the MFP at all. IPRA ($FFFFFA0B) and IPRB ($FFFFFA0D) Interrupt Pending Register A (or B) When an interruption occurs, the MFP sets the corresponding bit to 1 in the IPRA (or IPRB). This signals that an interruption is pending. Because of the priority system, it is possible for a high-level interruption to be in process and a lower level interruption to occur during that time. It is therefore necessary to note this intention to trigger, so that once the treatment of the priority interruption is finished, the treatment of the weaker one can take place. It is, of course, possible to read IPRA and IPRB to determine if an interruption is pending. It is also possible to set the bit of a pending interruption to 0, so that it does not trigger. However, setting a bit to 1 in this register has no effect. We realize here that the possibilities are already quite numerous. An interruption may thus scrutinize another one to obtain an irregular interruption cycle. It is also possible to let an interruption trigger just 'for fun'. This can be done by leaving it valid through IERA but masking it with IMRA. IMRA ($FFFFFA13) and IMRB ($FFFFFA15) Interrupt Mask Register A (and B) Masking prevents an interruption from triggering although it is authorized by IERA or IERB. This can allow, for example, a level 4 interruption to not be bothered by a level 6 interruption. For this, it simply has to mask the latter during its execution. VR ($FFFFFA17) Vector Register This byte is a bit special. In our case, only bit 3 interests us, the others being used by the MFP to encode the vector number that corresponds to the source of interruption. Bit 3 is used to indicate to the MFP if it is in Software End of Interrupt mode or in Automatic End of Interrupt mode (default mode). Let's see the explanations with the following registers: ISRA ($FFFFFA0F) and ISRB ($FFFFFA11) Interrupt in Service Register A (or B) A bit at 1 indicates that the interruption is being processed. If we are in Software End of Interrupt mode, it is at the end of our routine in interruption that we must indicate ourselves that our routine is finished. For this, we must set to 0 the corresponding bit of our interruption, in ISRA (or ISRB). As long as this bit is at 1, less priority interruptions cannot disturb us. However, as soon as the treatment of our interruption begins, its bit in IPRA is automatically set to 0, and another interruption of the same level can very well occur during the treatment of this one. The IPRA bit will therefore be set to 1 again, but this new interruption will only be treated when the first one has set the ISRA bit back to 0. On the other hand, if we are in Automatic End of Interrupt mode, as soon as our routine executes, the MFP, of course, sets its IPRA bit to 0 (since the interrupt is no longer pending), but also sets its ISRA bit to 0! It is then possible for other weaker interruptions to interrupt the first one, even if it is not yet finished. You see that with all this, it is possible to skillfully juggle by considering the most twisted cases!!! Concerning the timers A, B, C, and D, here are just the addresses to address them, the information provided in the bible or the developer's book being largely sufficient. If by chance you are eager for information on this circuit, rush to a bookstore specialized in electronic "literature" and ask for a book on the MK68901. Also pass by the pharmacy to pick up some aspirin.... To conclude these assembly lessons, here is a small bibliography so that you can direct your research toward the subjects that interest you. Machine Language on ST (Ed. Micro App). Quite an unnecessary book! Very very little information, really, it is not a good purchase. The ST Bible (Ed. Micro-App). Became quite hard to find, too bad! Quite a lot of good info, sufficient in most cases. It has been replaced by the Developer's Book. Tips and Traps (Ed. Micro-App). To be avoided at all costs! The programs made following these tips will surely be incompatible as soon as there is a change in TOS. The Developer's Book (Volume 1 and 2) (Ed. Micro App) If you do not have access to the documentation for developers with the Atari endorsement, this is the book you need. We can regret the doz- ens of pages containing the BIOS listing of the STF and the other dozens of pages containing the BIOS of the Mega ST. It feels a bit like padding: either you have the level in assembly to understand something and then you have the level to follow the BIOS with MONST, or anyway, you do not understand anything and it is not because you have the listing in front of your eyes that it will change anything. Anyway, this is my opinion, and as, in addition, the listing is only valid for the mentioned models, if you rely on it to "discover" new addresses you might be surprised with newer machines... The book on GEM on Atari ST (Ed. Micro App). If you think you are going to learn how to program GEM with that, you are heading for disaster. The problem with GEM is that it is usable in assembly provided you use macros, otherwise it is far too heavy. However, in a commercial book, it is impossible to limit oneself to a single assembler. This means that the authors have dissected everything with direct calls to TRAP #2, and it becomes totally incomprehensible for beginners. However, the functions are relatively well detailed, and if you already know what you are looking for, this book will be a good tool. We can just regret some absences such as the Escape functions of GEM and some AES functions. Note that this book is 99% taken from the Developer's Book. GFA 3.00 Documentation. There, it's the right thing! Indeed in the last pages of the documentation of this BASIC, you will find the list of all the GEMDOS, BIOS, and XBIOS functions (the GEMDOS $20 function that allows you to switch to Supervisor mode is missing, since it is inaccessible in GFA), ASCII codes, keyboard codes and a few pages earlier, a good list of AES functions. I have to admit that I photocopied these few pages and they often serve me: the information is sufficient in most cases, and especially very easy to find, which is not the case for example with the GEM Book which does not even include an index of functions!!! Note that some GEM functions exist in the internal library of GFA but are not available in the DEV-PACK library. This is the case with Form_Button and Form_Keybd. And it's annoying! Indeed, at the beginning Form_do did not exist. The people of Digital Research thus decided to create this function from scratch using Form_Keybd and Form_button, and released the C source code. After a while, programmers no longer used anything but Form_Do and we fell into the current routine of form management that we know. If you want to make your own Form_do, more advanced, it "simply" necessitates taking Form_Keybd and Form_button to recreate Form_do. Unfor- tunately these two functions have fallen into oblivion and to get them, well, pffuuuuuttt!!! You want to know their opcode and parameters? Easy as pie! If you have followed these lessons well, you know a lot of things about GEM (where the function opcode is placed, where the number of parameters is written etc... and well, you launch AMonst, and then you run a small piece of GFA that calls Form_keybd while displaying on the screen the AES table address beforehand, and that waits for a key press thereafter. All of this happens under the GFA interpreter, of course! As soon as you are waiting for a key press, you trigger AMONST (shift+alternate+help) and hop, the great search begins. You do the same with Form_button, and the job is done. Courage, it's not very hard, and it makes a great exercise! Implementation of the 68000 (Ed. Sybex) Excellent book, dealing with the 68000 in general. Do not expect to find system addresses for your ST. Here, we talk about clock cycles, addressing modes, etc... Implementation of Common Functions in 68000 (Ed. Masson, by François BRET). How to do sine, cosine, Fourier transforms, etc... Not sold with aspirin or coffee, but essential if you tackle trigonometry problems in ASM. Only 191 Francs, a bargain! (Thanks to Shizuka for providing the reference for this book!!!!!) STATION INFORMATIQUE 2 rue Piémontési 75018 PARIS tel:(1)42.55.14.26 Excellent Dom-Pubs catalog. Before trying to pirate various software without the documentation, take a look at their catalog. Many little things are to be discovered (various ASM sources, debugging utilities, etc...) If you are a fan of Mac emulation, the Cyclan pack, a Mac assembler with its editor, etc. can be found among the dom-pubs for this machine... Quite nice to discover this other machine, equipped with a 68000 too. ST Mags was also teeming with various tricks, at least especially in the old issues in my opinion... Here is a small non-exhaustive list... Integration of a resource in GFA (46) Form Exdo (46) Samples on ST (27,28,29,30,31,35) (In GFA with assembler, but the GFA is barely noticeable...) Scrolling in GFA (31 to 45 except issue 37 and 44) Same remark as for the digits!!! Managing disks in GFA (13,14,15,16) Programming GEM (6 to about 30) Great! All in C, but the calls are the same and the syntax identical to the DEV-PACK library! Quickly search your old ST Mag issues because to learn GEM, it's excellent!!! 3D Animation (45,46,49) For the moment the last article has not been released... We hope it will not end up like the listing that allows booting from a cartridge... Very clear, nice, ideal for starting in 3D. For coprocessors, 2 articles in issues 31 and 32. In the extinct First (1ST), there were some nice tricks on MIDI, decompressing DEGAS images, creating a RAM disk and a printer spooler. Atari Mag is coming back strong at the moment. Very good articles on graphic programming of the STE. This allows to get an idea of the BLITTER, the 4096 colors, etc... It's in BASIC, but the translation is easy. (21,22). Being in the know, I can also inform you that in the upcoming issues of Atari Mag, you will find articles on different subjects with sources in ASM and GFA, and that this type of article should last quite some time. Well, in a summary, buy ST Mag and Atari Mag every month. If necessary, buy them in groups, but make a big pile of all those magazines because it's an important mine of information. Often the questions that are asked on RTEL for example find their answer in reading the old issues! Some good binders, dividers, and you'll have a huge documentation for not very expensive. I will end these courses by renewing the warning about the hunt for listings! It is preferable to have some books and notes on paper rather than 10 megabytes of sources to which one does not understand much, and which, in any case, are quite inconvenient to consult compared to written information! As for fairly large programs, prepare a few sheets next to you, to jot down the names of routines, labels, variables, etc... you will quickly realize that the main difficulty of assembly lies in the fact that listings are very very long and it is difficult to navigate them to look for something. Program cleanly, be clear and avoid inelegant solutions if possible. Comment profusely your sources because in 6 months when it comes to making a slight modi- fication, you will see the difference between clear sources and the others! Well, I leave you hoping that these courses will have interests- ed you and that they will have given you a taste for assembly! Don't forget that you can always contact me on 3614 RTEL1 (or RTEL2) in FEROCE LAPIN's inbox, and that there is a section on this server for 68000 assembly on ST, MAC or AMIGA. To access this section, type *MOT and SEND. See you soon !
Back to ASM_Tutorial