How does the Z80 determine which peripheral sent an interrupt? The Next CEO of Stack OverflowWhy does the Z80 have a half-carry bit?How fast is memcpy on the Z80?How can a C64 interrupt let the KERNAL keep operating?Which Z80 opcodes can I use without a stack?Why does the Z80 include the RLD and RRD instructions?Intel 8080 and Altair 8800. 256 I/0 ports, but only 7 free RST (interrupt subroutine) - how it works?Is it possible to switch the interrupt source of the C64 to VIC without changing the IRQ routine?Why do we need to acknowledge the interrupt from VIC-II?How do I Interface a PS/2 Keyboard without Modern Techniques?Where does the Z80 processor start executing from?

Is a distribution that is normal, but highly skewed, considered Gaussian?

I dug holes for my pergola too wide

Help understanding this unsettling image of Titan, Epimetheus, and Saturn's rings?

What does "shotgun unity" refer to here in this sentence?

Does Germany produce more waste than the US?

Can Sneak Attack be used when hitting with an improvised weapon?

Where do students learn to solve polynomial equations these days?

Which one is the true statement?

Is it convenient to ask the journal's editor for two additional days to complete a review?

Can I use the word “Senior” as part of a job title directly in German?

(How) Could a medieval fantasy world survive a magic-induced "nuclear winter"?

Do scriptures give a method to recognize a truly self-realized person/jivanmukta?

Defamation due to breach of confidentiality

Prepend last line of stdin to entire stdin

Getting Stale Gas Out of a Gas Tank w/out Dropping the Tank

What CSS properties can the br tag have?

How to avoid supervisors with prejudiced views?

Sulfuric acid symmetry point group

Aggressive Under-Indexing and no data for missing index

what's the use of '% to gdp' type of variables?

Film where the government was corrupt with aliens, people sent to kill aliens are given rigged visors not showing the right aliens

"Eavesdropping" vs "Listen in on"

Expressing the idea of having a very busy time

How many extra stops do monopods offer for tele photographs?



How does the Z80 determine which peripheral sent an interrupt?



The Next CEO of Stack OverflowWhy does the Z80 have a half-carry bit?How fast is memcpy on the Z80?How can a C64 interrupt let the KERNAL keep operating?Which Z80 opcodes can I use without a stack?Why does the Z80 include the RLD and RRD instructions?Intel 8080 and Altair 8800. 256 I/0 ports, but only 7 free RST (interrupt subroutine) - how it works?Is it possible to switch the interrupt source of the C64 to VIC without changing the IRQ routine?Why do we need to acknowledge the interrupt from VIC-II?How do I Interface a PS/2 Keyboard without Modern Techniques?Where does the Z80 processor start executing from?










3















My understanding of how interrupts (and more specifically, interrupt daisy-chaining) works in the Z80 is limited, to say the least, so if I get anything wrong please correct me.



Anyway, let's say I have 2 PIO chips to control 2 different peripherals (lets say, a character LCD display, and some switches, but I'm sure that's not very relevant). I've connected the IEO pin of one PIO to the CPU's INT pin, and it's IEI pin to the other PIO's IEO. I then connected that PIO's IEI pin to a 5V rail. I got this information from this image: (but instead of the three different peripheral chips they use, I just have two PIO chips.)



daisy
[from here]



Anyway, my understanding is that this kind of configuration means that if the second PIO (the one directly connected to the 5V rail) pulls its IEO pin low, the other PIO will not be able to send an interrupt. Correct?



My issue is this: How would I cause a PIO chip's IEO pin to go low? And how can I actually send an interrupt from one of these peripherals? My initial thought would be that I'd just pull the CPU's INT pin low, but that doesn't make sense the more I think about it.



(On a side note, any idea what the INTACK pin is on that diagram?)










share|improve this question









New contributor




Jacob Garby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
























    3















    My understanding of how interrupts (and more specifically, interrupt daisy-chaining) works in the Z80 is limited, to say the least, so if I get anything wrong please correct me.



    Anyway, let's say I have 2 PIO chips to control 2 different peripherals (lets say, a character LCD display, and some switches, but I'm sure that's not very relevant). I've connected the IEO pin of one PIO to the CPU's INT pin, and it's IEI pin to the other PIO's IEO. I then connected that PIO's IEI pin to a 5V rail. I got this information from this image: (but instead of the three different peripheral chips they use, I just have two PIO chips.)



    daisy
    [from here]



    Anyway, my understanding is that this kind of configuration means that if the second PIO (the one directly connected to the 5V rail) pulls its IEO pin low, the other PIO will not be able to send an interrupt. Correct?



    My issue is this: How would I cause a PIO chip's IEO pin to go low? And how can I actually send an interrupt from one of these peripherals? My initial thought would be that I'd just pull the CPU's INT pin low, but that doesn't make sense the more I think about it.



    (On a side note, any idea what the INTACK pin is on that diagram?)










    share|improve this question









    New contributor




    Jacob Garby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.






















      3












      3








      3


      1






      My understanding of how interrupts (and more specifically, interrupt daisy-chaining) works in the Z80 is limited, to say the least, so if I get anything wrong please correct me.



      Anyway, let's say I have 2 PIO chips to control 2 different peripherals (lets say, a character LCD display, and some switches, but I'm sure that's not very relevant). I've connected the IEO pin of one PIO to the CPU's INT pin, and it's IEI pin to the other PIO's IEO. I then connected that PIO's IEI pin to a 5V rail. I got this information from this image: (but instead of the three different peripheral chips they use, I just have two PIO chips.)



      daisy
      [from here]



      Anyway, my understanding is that this kind of configuration means that if the second PIO (the one directly connected to the 5V rail) pulls its IEO pin low, the other PIO will not be able to send an interrupt. Correct?



      My issue is this: How would I cause a PIO chip's IEO pin to go low? And how can I actually send an interrupt from one of these peripherals? My initial thought would be that I'd just pull the CPU's INT pin low, but that doesn't make sense the more I think about it.



      (On a side note, any idea what the INTACK pin is on that diagram?)










      share|improve this question









      New contributor




      Jacob Garby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.












      My understanding of how interrupts (and more specifically, interrupt daisy-chaining) works in the Z80 is limited, to say the least, so if I get anything wrong please correct me.



      Anyway, let's say I have 2 PIO chips to control 2 different peripherals (lets say, a character LCD display, and some switches, but I'm sure that's not very relevant). I've connected the IEO pin of one PIO to the CPU's INT pin, and it's IEI pin to the other PIO's IEO. I then connected that PIO's IEI pin to a 5V rail. I got this information from this image: (but instead of the three different peripheral chips they use, I just have two PIO chips.)



      daisy
      [from here]



      Anyway, my understanding is that this kind of configuration means that if the second PIO (the one directly connected to the 5V rail) pulls its IEO pin low, the other PIO will not be able to send an interrupt. Correct?



      My issue is this: How would I cause a PIO chip's IEO pin to go low? And how can I actually send an interrupt from one of these peripherals? My initial thought would be that I'd just pull the CPU's INT pin low, but that doesn't make sense the more I think about it.



      (On a side note, any idea what the INTACK pin is on that diagram?)







      z80 interrupt






      share|improve this question









      New contributor




      Jacob Garby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Jacob Garby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited yesterday







      Jacob Garby













      New contributor




      Jacob Garby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 2 days ago









      Jacob GarbyJacob Garby

      2306




      2306




      New contributor




      Jacob Garby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Jacob Garby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Jacob Garby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.




















          2 Answers
          2






          active

          oldest

          votes


















          5














          You might want to consult the chapter for 'Interrupt Response' of the CPU manual (Chapter 8 on p.55 of the 1976 issue) and 'Interrupt Servicing' from the PIO manual (Chapter 6 on p.15 of the 1977 issue).



          In general the Z80 supports 3 different interrupt modes:



          • Mode 0 - like 8080, here the interrupting device must place an instrution on the bus - usually done by a 8259 interrupt controller.


          • Mode 1 - All interrupts will jump to 38h (restart) and execute from there. Much like NMI


          • Mode 2 - Peripherals put an interrupt service number on the bus during interrupt response, the CPU uses for an indirect call thru a table of pointers in a 256 byte page pointed to by the I register.


          The picture inserted hints that you intend to use Z80s Mode 2. To make it work:



          • Write some service routine for your interrupt, ending in an RETI

          • Disable interrupts

          • Setup a vector table in a memory page (256 byte boundry)

          • Pick any vector number you like (lets say 3)

          • Put the address of your service routing to that vector (xx06/xx07)

          • Put the vector number into the PIO channels vector register (control word with 2^0 set)

          • Set the Interrupt control word (x7) for the port to define which bits and under wich configuration will trigger an interrupt. For example 97h FFh sent to Port A will make all inputs issue interrupts as soon as they go high.

          • Set interrupt Mmode 2 of the CPU

          • Enable interrupts

          • Enjoy whatever happens :))

          A Z80 in Mode 2 is perfect suited for an interrupt driven system.




          How would I cause a PIO chip's IEO pin to go low?




          Err ... by waiting for an interrupt to occur, then serving it?



          (Maybe I do not really understand what part of information is missing).






          share|improve this answer























          • Okay, thanks! That cleared a lot of things up for me. I don't know if I'm being stupid, but one thing I don't understand is exactly how I would create an interrupt from the PIO -- I mean, how can I interrupt the CPU when a button is pressed, for example?

            – Jacob Garby
            yesterday











          • @Jacob, do you mean, how do you configure the PIO to generate an interrupt? If I'm reading this correctly, you use the interrupt control word. If the PIO is in input mode then it looks like all you have to do is set the interrupt enable bit and every byte of data that arrives will generate an interrupt.

            – Harry Johnston
            yesterday











          • @JacobGarbyIt's the above interrupt control word(s) of 97h FFh. First byte defined the workings. abcd0111 means interrupt control word, where a enables interrupt (1=enable); b defines if all or any port bit have to be set/reset (0=any); c if tested for set or reset (0=set) and d tells that a mask for the bits follows. A mask of FFh lets thus the interrupt fire if any of the port lines goes high. For a button it may be more appropriate to take one pin, pull it via a resistor high and ahave the button pull it low. Words to make only pin 2^0 sensitive would be 93h 01h

            – Raffzahn
            yesterday


















          1














          The short answer is that Z80 do NOT determine itself which peripheral sends an interrupt. In Zilog's framework, all compatible peripherals determine among themselves who's emitting the interrupt to the CPU this time. Or more specifically, who is sending IM2 vector on the bus during the time Z80 acknowledges the interrupt.



          This kind of controlling prioritization of interrupts allows one building Z80 system not to use additional dedicated interrupt controller, as i8080 system designer had to do. However, the drawbacks are:



          • extra pins every Z80-world compatible peripheral has to have.

          • extra intelligence every such a peripheral has to have: particularly, they have to understand specific Z80 command (that is, RETI), whose the only purpose is to say to the peripherals the interrupt routine ends; otherwise RETI is fully equivalent to RET.

          • probably the very long interrupt chains could have timing problems.





          share|improve this answer























            Your Answer








            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "648"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            noCode: true, onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );






            Jacob Garby is a new contributor. Be nice, and check out our Code of Conduct.









            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fretrocomputing.stackexchange.com%2fquestions%2f9475%2fhow-does-the-z80-determine-which-peripheral-sent-an-interrupt%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            5














            You might want to consult the chapter for 'Interrupt Response' of the CPU manual (Chapter 8 on p.55 of the 1976 issue) and 'Interrupt Servicing' from the PIO manual (Chapter 6 on p.15 of the 1977 issue).



            In general the Z80 supports 3 different interrupt modes:



            • Mode 0 - like 8080, here the interrupting device must place an instrution on the bus - usually done by a 8259 interrupt controller.


            • Mode 1 - All interrupts will jump to 38h (restart) and execute from there. Much like NMI


            • Mode 2 - Peripherals put an interrupt service number on the bus during interrupt response, the CPU uses for an indirect call thru a table of pointers in a 256 byte page pointed to by the I register.


            The picture inserted hints that you intend to use Z80s Mode 2. To make it work:



            • Write some service routine for your interrupt, ending in an RETI

            • Disable interrupts

            • Setup a vector table in a memory page (256 byte boundry)

            • Pick any vector number you like (lets say 3)

            • Put the address of your service routing to that vector (xx06/xx07)

            • Put the vector number into the PIO channels vector register (control word with 2^0 set)

            • Set the Interrupt control word (x7) for the port to define which bits and under wich configuration will trigger an interrupt. For example 97h FFh sent to Port A will make all inputs issue interrupts as soon as they go high.

            • Set interrupt Mmode 2 of the CPU

            • Enable interrupts

            • Enjoy whatever happens :))

            A Z80 in Mode 2 is perfect suited for an interrupt driven system.




            How would I cause a PIO chip's IEO pin to go low?




            Err ... by waiting for an interrupt to occur, then serving it?



            (Maybe I do not really understand what part of information is missing).






            share|improve this answer























            • Okay, thanks! That cleared a lot of things up for me. I don't know if I'm being stupid, but one thing I don't understand is exactly how I would create an interrupt from the PIO -- I mean, how can I interrupt the CPU when a button is pressed, for example?

              – Jacob Garby
              yesterday











            • @Jacob, do you mean, how do you configure the PIO to generate an interrupt? If I'm reading this correctly, you use the interrupt control word. If the PIO is in input mode then it looks like all you have to do is set the interrupt enable bit and every byte of data that arrives will generate an interrupt.

              – Harry Johnston
              yesterday











            • @JacobGarbyIt's the above interrupt control word(s) of 97h FFh. First byte defined the workings. abcd0111 means interrupt control word, where a enables interrupt (1=enable); b defines if all or any port bit have to be set/reset (0=any); c if tested for set or reset (0=set) and d tells that a mask for the bits follows. A mask of FFh lets thus the interrupt fire if any of the port lines goes high. For a button it may be more appropriate to take one pin, pull it via a resistor high and ahave the button pull it low. Words to make only pin 2^0 sensitive would be 93h 01h

              – Raffzahn
              yesterday















            5














            You might want to consult the chapter for 'Interrupt Response' of the CPU manual (Chapter 8 on p.55 of the 1976 issue) and 'Interrupt Servicing' from the PIO manual (Chapter 6 on p.15 of the 1977 issue).



            In general the Z80 supports 3 different interrupt modes:



            • Mode 0 - like 8080, here the interrupting device must place an instrution on the bus - usually done by a 8259 interrupt controller.


            • Mode 1 - All interrupts will jump to 38h (restart) and execute from there. Much like NMI


            • Mode 2 - Peripherals put an interrupt service number on the bus during interrupt response, the CPU uses for an indirect call thru a table of pointers in a 256 byte page pointed to by the I register.


            The picture inserted hints that you intend to use Z80s Mode 2. To make it work:



            • Write some service routine for your interrupt, ending in an RETI

            • Disable interrupts

            • Setup a vector table in a memory page (256 byte boundry)

            • Pick any vector number you like (lets say 3)

            • Put the address of your service routing to that vector (xx06/xx07)

            • Put the vector number into the PIO channels vector register (control word with 2^0 set)

            • Set the Interrupt control word (x7) for the port to define which bits and under wich configuration will trigger an interrupt. For example 97h FFh sent to Port A will make all inputs issue interrupts as soon as they go high.

            • Set interrupt Mmode 2 of the CPU

            • Enable interrupts

            • Enjoy whatever happens :))

            A Z80 in Mode 2 is perfect suited for an interrupt driven system.




            How would I cause a PIO chip's IEO pin to go low?




            Err ... by waiting for an interrupt to occur, then serving it?



            (Maybe I do not really understand what part of information is missing).






            share|improve this answer























            • Okay, thanks! That cleared a lot of things up for me. I don't know if I'm being stupid, but one thing I don't understand is exactly how I would create an interrupt from the PIO -- I mean, how can I interrupt the CPU when a button is pressed, for example?

              – Jacob Garby
              yesterday











            • @Jacob, do you mean, how do you configure the PIO to generate an interrupt? If I'm reading this correctly, you use the interrupt control word. If the PIO is in input mode then it looks like all you have to do is set the interrupt enable bit and every byte of data that arrives will generate an interrupt.

              – Harry Johnston
              yesterday











            • @JacobGarbyIt's the above interrupt control word(s) of 97h FFh. First byte defined the workings. abcd0111 means interrupt control word, where a enables interrupt (1=enable); b defines if all or any port bit have to be set/reset (0=any); c if tested for set or reset (0=set) and d tells that a mask for the bits follows. A mask of FFh lets thus the interrupt fire if any of the port lines goes high. For a button it may be more appropriate to take one pin, pull it via a resistor high and ahave the button pull it low. Words to make only pin 2^0 sensitive would be 93h 01h

              – Raffzahn
              yesterday













            5












            5








            5







            You might want to consult the chapter for 'Interrupt Response' of the CPU manual (Chapter 8 on p.55 of the 1976 issue) and 'Interrupt Servicing' from the PIO manual (Chapter 6 on p.15 of the 1977 issue).



            In general the Z80 supports 3 different interrupt modes:



            • Mode 0 - like 8080, here the interrupting device must place an instrution on the bus - usually done by a 8259 interrupt controller.


            • Mode 1 - All interrupts will jump to 38h (restart) and execute from there. Much like NMI


            • Mode 2 - Peripherals put an interrupt service number on the bus during interrupt response, the CPU uses for an indirect call thru a table of pointers in a 256 byte page pointed to by the I register.


            The picture inserted hints that you intend to use Z80s Mode 2. To make it work:



            • Write some service routine for your interrupt, ending in an RETI

            • Disable interrupts

            • Setup a vector table in a memory page (256 byte boundry)

            • Pick any vector number you like (lets say 3)

            • Put the address of your service routing to that vector (xx06/xx07)

            • Put the vector number into the PIO channels vector register (control word with 2^0 set)

            • Set the Interrupt control word (x7) for the port to define which bits and under wich configuration will trigger an interrupt. For example 97h FFh sent to Port A will make all inputs issue interrupts as soon as they go high.

            • Set interrupt Mmode 2 of the CPU

            • Enable interrupts

            • Enjoy whatever happens :))

            A Z80 in Mode 2 is perfect suited for an interrupt driven system.




            How would I cause a PIO chip's IEO pin to go low?




            Err ... by waiting for an interrupt to occur, then serving it?



            (Maybe I do not really understand what part of information is missing).






            share|improve this answer













            You might want to consult the chapter for 'Interrupt Response' of the CPU manual (Chapter 8 on p.55 of the 1976 issue) and 'Interrupt Servicing' from the PIO manual (Chapter 6 on p.15 of the 1977 issue).



            In general the Z80 supports 3 different interrupt modes:



            • Mode 0 - like 8080, here the interrupting device must place an instrution on the bus - usually done by a 8259 interrupt controller.


            • Mode 1 - All interrupts will jump to 38h (restart) and execute from there. Much like NMI


            • Mode 2 - Peripherals put an interrupt service number on the bus during interrupt response, the CPU uses for an indirect call thru a table of pointers in a 256 byte page pointed to by the I register.


            The picture inserted hints that you intend to use Z80s Mode 2. To make it work:



            • Write some service routine for your interrupt, ending in an RETI

            • Disable interrupts

            • Setup a vector table in a memory page (256 byte boundry)

            • Pick any vector number you like (lets say 3)

            • Put the address of your service routing to that vector (xx06/xx07)

            • Put the vector number into the PIO channels vector register (control word with 2^0 set)

            • Set the Interrupt control word (x7) for the port to define which bits and under wich configuration will trigger an interrupt. For example 97h FFh sent to Port A will make all inputs issue interrupts as soon as they go high.

            • Set interrupt Mmode 2 of the CPU

            • Enable interrupts

            • Enjoy whatever happens :))

            A Z80 in Mode 2 is perfect suited for an interrupt driven system.




            How would I cause a PIO chip's IEO pin to go low?




            Err ... by waiting for an interrupt to occur, then serving it?



            (Maybe I do not really understand what part of information is missing).







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered yesterday









            RaffzahnRaffzahn

            54.4k6134220




            54.4k6134220












            • Okay, thanks! That cleared a lot of things up for me. I don't know if I'm being stupid, but one thing I don't understand is exactly how I would create an interrupt from the PIO -- I mean, how can I interrupt the CPU when a button is pressed, for example?

              – Jacob Garby
              yesterday











            • @Jacob, do you mean, how do you configure the PIO to generate an interrupt? If I'm reading this correctly, you use the interrupt control word. If the PIO is in input mode then it looks like all you have to do is set the interrupt enable bit and every byte of data that arrives will generate an interrupt.

              – Harry Johnston
              yesterday











            • @JacobGarbyIt's the above interrupt control word(s) of 97h FFh. First byte defined the workings. abcd0111 means interrupt control word, where a enables interrupt (1=enable); b defines if all or any port bit have to be set/reset (0=any); c if tested for set or reset (0=set) and d tells that a mask for the bits follows. A mask of FFh lets thus the interrupt fire if any of the port lines goes high. For a button it may be more appropriate to take one pin, pull it via a resistor high and ahave the button pull it low. Words to make only pin 2^0 sensitive would be 93h 01h

              – Raffzahn
              yesterday

















            • Okay, thanks! That cleared a lot of things up for me. I don't know if I'm being stupid, but one thing I don't understand is exactly how I would create an interrupt from the PIO -- I mean, how can I interrupt the CPU when a button is pressed, for example?

              – Jacob Garby
              yesterday











            • @Jacob, do you mean, how do you configure the PIO to generate an interrupt? If I'm reading this correctly, you use the interrupt control word. If the PIO is in input mode then it looks like all you have to do is set the interrupt enable bit and every byte of data that arrives will generate an interrupt.

              – Harry Johnston
              yesterday











            • @JacobGarbyIt's the above interrupt control word(s) of 97h FFh. First byte defined the workings. abcd0111 means interrupt control word, where a enables interrupt (1=enable); b defines if all or any port bit have to be set/reset (0=any); c if tested for set or reset (0=set) and d tells that a mask for the bits follows. A mask of FFh lets thus the interrupt fire if any of the port lines goes high. For a button it may be more appropriate to take one pin, pull it via a resistor high and ahave the button pull it low. Words to make only pin 2^0 sensitive would be 93h 01h

              – Raffzahn
              yesterday
















            Okay, thanks! That cleared a lot of things up for me. I don't know if I'm being stupid, but one thing I don't understand is exactly how I would create an interrupt from the PIO -- I mean, how can I interrupt the CPU when a button is pressed, for example?

            – Jacob Garby
            yesterday





            Okay, thanks! That cleared a lot of things up for me. I don't know if I'm being stupid, but one thing I don't understand is exactly how I would create an interrupt from the PIO -- I mean, how can I interrupt the CPU when a button is pressed, for example?

            – Jacob Garby
            yesterday













            @Jacob, do you mean, how do you configure the PIO to generate an interrupt? If I'm reading this correctly, you use the interrupt control word. If the PIO is in input mode then it looks like all you have to do is set the interrupt enable bit and every byte of data that arrives will generate an interrupt.

            – Harry Johnston
            yesterday





            @Jacob, do you mean, how do you configure the PIO to generate an interrupt? If I'm reading this correctly, you use the interrupt control word. If the PIO is in input mode then it looks like all you have to do is set the interrupt enable bit and every byte of data that arrives will generate an interrupt.

            – Harry Johnston
            yesterday













            @JacobGarbyIt's the above interrupt control word(s) of 97h FFh. First byte defined the workings. abcd0111 means interrupt control word, where a enables interrupt (1=enable); b defines if all or any port bit have to be set/reset (0=any); c if tested for set or reset (0=set) and d tells that a mask for the bits follows. A mask of FFh lets thus the interrupt fire if any of the port lines goes high. For a button it may be more appropriate to take one pin, pull it via a resistor high and ahave the button pull it low. Words to make only pin 2^0 sensitive would be 93h 01h

            – Raffzahn
            yesterday





            @JacobGarbyIt's the above interrupt control word(s) of 97h FFh. First byte defined the workings. abcd0111 means interrupt control word, where a enables interrupt (1=enable); b defines if all or any port bit have to be set/reset (0=any); c if tested for set or reset (0=set) and d tells that a mask for the bits follows. A mask of FFh lets thus the interrupt fire if any of the port lines goes high. For a button it may be more appropriate to take one pin, pull it via a resistor high and ahave the button pull it low. Words to make only pin 2^0 sensitive would be 93h 01h

            – Raffzahn
            yesterday











            1














            The short answer is that Z80 do NOT determine itself which peripheral sends an interrupt. In Zilog's framework, all compatible peripherals determine among themselves who's emitting the interrupt to the CPU this time. Or more specifically, who is sending IM2 vector on the bus during the time Z80 acknowledges the interrupt.



            This kind of controlling prioritization of interrupts allows one building Z80 system not to use additional dedicated interrupt controller, as i8080 system designer had to do. However, the drawbacks are:



            • extra pins every Z80-world compatible peripheral has to have.

            • extra intelligence every such a peripheral has to have: particularly, they have to understand specific Z80 command (that is, RETI), whose the only purpose is to say to the peripherals the interrupt routine ends; otherwise RETI is fully equivalent to RET.

            • probably the very long interrupt chains could have timing problems.





            share|improve this answer



























              1














              The short answer is that Z80 do NOT determine itself which peripheral sends an interrupt. In Zilog's framework, all compatible peripherals determine among themselves who's emitting the interrupt to the CPU this time. Or more specifically, who is sending IM2 vector on the bus during the time Z80 acknowledges the interrupt.



              This kind of controlling prioritization of interrupts allows one building Z80 system not to use additional dedicated interrupt controller, as i8080 system designer had to do. However, the drawbacks are:



              • extra pins every Z80-world compatible peripheral has to have.

              • extra intelligence every such a peripheral has to have: particularly, they have to understand specific Z80 command (that is, RETI), whose the only purpose is to say to the peripherals the interrupt routine ends; otherwise RETI is fully equivalent to RET.

              • probably the very long interrupt chains could have timing problems.





              share|improve this answer

























                1












                1








                1







                The short answer is that Z80 do NOT determine itself which peripheral sends an interrupt. In Zilog's framework, all compatible peripherals determine among themselves who's emitting the interrupt to the CPU this time. Or more specifically, who is sending IM2 vector on the bus during the time Z80 acknowledges the interrupt.



                This kind of controlling prioritization of interrupts allows one building Z80 system not to use additional dedicated interrupt controller, as i8080 system designer had to do. However, the drawbacks are:



                • extra pins every Z80-world compatible peripheral has to have.

                • extra intelligence every such a peripheral has to have: particularly, they have to understand specific Z80 command (that is, RETI), whose the only purpose is to say to the peripherals the interrupt routine ends; otherwise RETI is fully equivalent to RET.

                • probably the very long interrupt chains could have timing problems.





                share|improve this answer













                The short answer is that Z80 do NOT determine itself which peripheral sends an interrupt. In Zilog's framework, all compatible peripherals determine among themselves who's emitting the interrupt to the CPU this time. Or more specifically, who is sending IM2 vector on the bus during the time Z80 acknowledges the interrupt.



                This kind of controlling prioritization of interrupts allows one building Z80 system not to use additional dedicated interrupt controller, as i8080 system designer had to do. However, the drawbacks are:



                • extra pins every Z80-world compatible peripheral has to have.

                • extra intelligence every such a peripheral has to have: particularly, they have to understand specific Z80 command (that is, RETI), whose the only purpose is to say to the peripherals the interrupt routine ends; otherwise RETI is fully equivalent to RET.

                • probably the very long interrupt chains could have timing problems.






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered yesterday









                lvdlvd

                2,845720




                2,845720




















                    Jacob Garby is a new contributor. Be nice, and check out our Code of Conduct.









                    draft saved

                    draft discarded


















                    Jacob Garby is a new contributor. Be nice, and check out our Code of Conduct.












                    Jacob Garby is a new contributor. Be nice, and check out our Code of Conduct.











                    Jacob Garby is a new contributor. Be nice, and check out our Code of Conduct.














                    Thanks for contributing an answer to Retrocomputing Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fretrocomputing.stackexchange.com%2fquestions%2f9475%2fhow-does-the-z80-determine-which-peripheral-sent-an-interrupt%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    How to write a 12-bar blues melodyI-IV-V blues progressionHow to play the bridges in a standard blues progressionHow does Gdim7 fit in C# minor?question on a certain chord progressionMusicology of Melody12 bar blues, spread rhythm: alternative to 6th chord to avoid finger stretchChord progressions/ Root key/ MelodiesHow to put chords (POP-EDM) under a given lead vocal melody (starting from a good knowledge in music theory)Are there “rules” for improvising with the minor pentatonic scale over 12-bar shuffle?Confusion about blues scale and chords

                    What if the end-user didn't have the required library?What is setup.py?What is a clean, pythonic way to have multiple constructors in Python?What does Ruby have that Python doesn't, and vice versa?What is the reason for having '//' in Python?How do I create a namespace package in Python?How to package shared objects that python modules depend on?setuptools vs. distutils: why is distutils still a thing?Navigation in Windows 10 vs code not going to virtualenv library when the same library is installed at user levelPython create package for local usePackaging a project that uses multiple python versionsWhy is permission denied on pip install except for when “--user” is included at end of command?

                    Esgonzo ibérico Índice Descrición Distribución Hábitat Ameazas Notas Véxase tamén "Acerca dos nomes dos anfibios e réptiles galegos""Chalcides bedriagai"Chalcides bedriagai en Carrascal, L. M. Salvador, A. (Eds). Enciclopedia virtual de los vertebrados españoles. Museo Nacional de Ciencias Naturales, Madrid. España.Fotos