(Indeed, the data is being transfered between an IO device and the memory, and not between IO device and the CPU, because there is no space inside the CPU to hold the vast amount of data that is being transfered.)
When the CPU performs the IO operation, the technique is called "programmed IO".
Before I can show you exactly what happens in programmed IO, I need to make some assumptions about the computer system...
The following are the assumptions for the computer system:
To put things in perspective:
(Assume String myString = "ABCDEFGHIJ";) System.output.print(myString);
If the computer system uses programmed IO, the program statement "System.output.print(myString)" will generate an assembler program that instruct the CPU to do the IO communication with the intended IO device (in this case, the printer).
The Java statement:
System.output.print(myString)(assume variable myString = "ABCDEFGHIJ";) will translate into the following assembler program that prints the (10) characters in the variable "myString" to the printer:
* Memory address 2000 = status register of printer * Memory address 2004 = data register of printer * Memory address 2008 = command register of printer move.l #myString, A0 // A0 points to the first character in myString move.l #10, D0 // D0 = count Loop: move.l 2000, D1 // Read printer status cmp.l #0, D1 // Check if printer is idle bne Loop // Wait until printer is idle before you can send the next character to printer // Now the printer status = idle... move.b (A0), 2004 // Send next character to be printer move.l #1, 2008 // Tell printer to print adda.l #1, A0 // Make A0 point to next character in myString sub.l #1, D0 cmp.l #0, D0 // Check if all characters printed... bne Loop // Loop if not done... .... myString: dc.b 'ABCDEFGHIJ' // The ASCII codes of the string
xdef Start, Stop, End Start: move.l #-1, $140C ; Clobber status move.l #1, $1404 ; Set length move.l #X, $1408 ; Set buffer address move.l #1, $1400; ; Write wait: move.l $140C, d0 cmp.l #-1, d0 ; Test if status has changed to ready beq wait ; Repeat testing until status changes Stop: nop nop nop X: dc.b 'H' End: end
How to run the program:
BUT... in doing so, we create two new problems...
We will see this next...