![]() |
Routines |
| 32815 | LD SP,33020 | Put the stack somewhere safe |
| 32818 | LD IX,16384 | Start loading at address 16384 (start of display area) |
| 32822 | LD DE,49152 | |
| 32825 | LD A,255 | We expect the first (marker) byte loaded to be 255 |
| 32827 | SCF | Set the carry flag |
| 32828 | INC D | Reset the zero flag |
| 32829 | EX AF,AF' | |
| 32830 | DEC D | Restore the value of DE |
| 32831 | DI | Disable interrupts |
| 32832 | LD A,15 | BORDER 7 |
| 32834 | OUT (254),A | |
| 32836 | IN A,(254) | Collect an initial EAR port reading into bit 6 of A |
| 32838 | RRA | Move it to bit 5 of A |
| 32839 | AND 32 | Clear the extraneous bits (0-4 and 6-7) |
| 32841 | OR 2 | The border will turn red when the first edge is found |
| 32843 | LD C,A | C will hold the border colour |
| 32844 | CP A | Set the zero flag |
| 32845 | RET NZ | |
| 32846 | CALL 32783 | Listen for an edge |
| 32849 | JR NC,32845 | Jump back to listen again if no edge was found within the time limit |
| 32851 | LD HL,1045 | An edge was found; now wait a bit... |
| 32854 | DJNZ 32854 | |
| 32856 | DEC HL | |
| 32857 | LD A,H | |
| 32858 | OR L | |
| 32859 | JR NZ,32854 | |
| 32861 | CALL 32768 | ...and see if the edges are still coming |
| 32864 | JR NC,32845 | Jump back if they're not |
| 32866 | LD B,156 | 256 double edges arriving within a specific time limit constitute a valid leader tone |
| 32868 | CALL 32768 | |
| 32871 | JR NC,32845 | |
| 32873 | LD A,198 | |
| 32875 | CP B | |
| 32876 | JR NC,32846 | |
| 32878 | INC H | |
| 32879 | JR NZ,32866 | |
| 32881 | LD B,201 | Is the leader tone still there? |
| 32883 | CALL 32783 | |
| 32886 | JR NC,32845 | Jump back if not |
| 32888 | LD A,B | Now start looking for the first edge of the data block |
| 32889 | CP 212 | |
| 32891 | JR NC,32881 | Jump back until it's found |
| 32893 | CALL 32783 | Look for the second edge of the data block |
| 32896 | RET NC | Reset the Spectrum if it can't be found |
| 32897 | LD A,C | The border will alternate between blue and yellow for the data block |
| 32898 | XOR 3 | |
| 32900 | LD C,A | |
| 32901 | LD H,0 | |
| 32903 | LD B,225 | |
| 32905 | JR 32931 | Jump forward to load the first (marker) byte of the data block |
| 32907 | EX AF,AF' | |
| 32908 | JR NZ,32915 | Jump if the first (marker) byte has just been collected |
| 32910 | LD (IX+0),L | Load the byte read from tape into memory |
| 32913 | JR 32925 | |
| 32915 | RL C | |
| 32917 | XOR L | L=first byte of data block |
| 32918 | RET NZ | Reset the Spectrum if it wasn't 255 |
| 32919 | LD A,C | |
| 32920 | RRA | |
| 32921 | LD C,A | |
| 32922 | INC DE | Compensate for the DEC DE below |
| 32923 | JR 32927 | Jump forward to start loading into memory |
| 32925 | INC IX | IX=next address to load byte from tape into |
| 32927 | DEC DE | |
| 32928 | EX AF,AF' | |
| 32929 | LD B,227 | |
| 32931 | LD L,1 | Get ready to load eight bits from the tape |
| 32933 | CALL 32768 | Load one bit from the tape |
| 32936 | RET NC | Reset the Spectrum if there was a loading error |
| 32937 | LD A,237 | |
| 32939 | CP B | The carry flag now holds the loaded bit |
| 32940 | RL L | Move the loaded bit into the L register |
| 32942 | LD B,225 | |
| 32944 | JP NC,32933 | Jump unless eight bits have been loaded |
| 32947 | LD A,H | |
| 32948 | XOR L | |
| 32949 | LD H,A | |
| 32950 | LD A,D | Note: DE never actually reaches 0 |
| 32951 | OR E | |
| 32952 | JR NZ,32907 | Jump back to load another byte from the tape |
| 32954 | RET | (We never actually get here) |
| 32952 | JR NZ,32893 |
| 32893 | LD (IX-52),L | POKE 32902,32 |
| 32896 | EXX | |
| 32897 | ADD IX,BC | Add 23 to IX |
| 32899 | EXX | |
| 32900 | SET 7,L |
| 32902 | JR NZ,32929 | Jump back to load next byte from tape |
| 32902 | LD SP,23833 | |
| 32905 | LD D,H | |
| 32906 | RET | To (23833) = 33204 |