* EXTENDED MODE TEST * * START ADDRESS: (OCTAL) 1000 * * DATE: JAN-15-2010 * * AUTHOR : THEO ENGEL * CONTACT: INFO@THEOENGEL.NL * \LOAD \ORG\'100 * IN THIS PROGRAM USE IS MADE OF THE FOLLOWING CODE * TO CHECK WHETHER THE CPU IS IN NORMAL MODE OR IN * EXTEND MODE: * -TEST FOR EXTENDED MODE, WHEN X=1, BY DOING: * LDA* A,1 * THE RESULT OF THIS LOAD SHOULD BE: * -NORMAL MODE: A=-1 (CONTENT OF C) * -EXTENDED MODE: A=0 (CONTENT OF D) * * A SWITCH FROM NORMAL TO EXTENDED MODE IS OBTAINED BY: * -EXECUTING THE EXA INSTRUCTION, OR * -AFTER AN INTERRUPT, OR * -EXECUTING AN OTK INSTRUCTION WITH A3=1 * * A SWITCH FROM EXTENDED TO NORMAL MODE IS OBTAINED BY: * -EXECUTING THE DXA INSTRUCTION, OR * -EXECUTING AN OTK INSTRUCTION WITH A3=0 * IN BOTH CASES, THE NORMAL MODE IS ACTIVATED AFTER * THE EXECTION OF 1ST JMP AFTER EITHER THE DXA OR OTK. * * WITH AN INTERRUPT, THE CURRENT MODE (EITHER NORMAL, * OR EXTENDED) IS STORED IN PMI. THE VALUE OF PMI CAN * BE OBTAINED IN A3 BY MEANS OF A INK INSTRUCTION. * A\DAC*\E B\DAC\C E\DAC\C C\OCT\177777 D\OCT\0 * * CLOCK 1 INTERRUPT DATA * (ENTERS INTERRUPT WITH NORMAL MODE) M50\DEC\-50\50 TICK PER SECOND MASK\DEC\1\RTC MASK BIT INT1\DAC\ID1\TO BE LOADED IN '63 * CLOCK 2 INTERRUPT DATA * (ENTERS INTERRUPT WITH EXTENDED MODE) INT2\DAC\ID2\TO BE LOADED IN '63 PME\OCT\020000\PME BIT * CLOCK 3 INTERRUPT DATA * (ENTERS INTERRUPT WITH NORMAL MODE) INT3\DAC\ID3\TO BE LOADED IN '63 * MSB\OCT\100000 MO1\OCT\120000\OTK:SET C AND EXTEND ONL\OCT\'106612\NLCR AST\BCI\1, * MSTR\OCT\30000 MEND\OCT\47757 ONE\OCT\1 FFFF\OCT\177777 * * POINTER TO EXTENDED MEMORY CODE MUP\EAC\ECD BACK\DAC\STR * * PRINT ASCII ASRO\DAC\** \SKS\'104 \JMP\*-1 \OCP\'104 \OTA\4 \JMP\*-1 \JMP*\ASRO * * PRINT 2 ASCII'S PRIN\DAC\** \ICA \JST\ASRO \ICA \JST\ASRO \JMP*\PRIN * * PRINT NLCR NLCR\DAC\** \LDA\ONL \JST\PRIN \JMP*\NLCR * \BCI\15,X16 EXTENDED MODE TEST PROGRAM M1\EQU\* ML\DEC\-15 * \ORG\'1000\ STRT\CRA\\START ADDRESS \LDX\ML \LDA\M1,1 \JST\PRIN \IRS\0 \JMP\*-3 \JST\NLCR STR\CRA * BASIC EXA AND DXA TESTING \AOA \STA\0\X=1 \LDA*\A,1\NORMAL MODE? \CMA \SZE \HLT\\NO=>ERROR \AOA\\A#0 \EXA\\SET EXT MODE \LDA*\A,1\EXT MODE? \SZE \HLT\\NO=>ERROR \DXA \AOA\\A#0 \LDA*\A,1\EXT MODE? \SZE \HLT\\NO=>ERROR \JMP\*+1 * AFTER THIS JMP WE MUST HAVE NORMAL MODE \LDA*\A,1\NORMAL MODE? \CMA \SZE \HLT\\NO=>ERROR * * BASIC INK AND OTK TESTING \SCB\\C=1 \INK \ERA\MSB\A1 MUST BE 1 \SZE \HLT \RCB\\C=0 \INK\\A MUST BE 0 \SZE \HLT \AOA \LGL\15\A1=1 \OTK\\C=1? \SSC \HLT \CRA \OTK\\C=0? \SRC \HLT * WE MUST BE IN NORMAL MODE \LDA*\A,1\NORMAL MODE? \CMA \SZE \HLT\\NO=>ERROR * SET C AND EXTEND \LDA\MO1\'120000 \OTK \SSC \HLT \LDA*\A,1\EXT MODE? \SZE \HLT\\NO=>ERROR * RESET C AND SET NORMAL \OTK\\C=0? \SRC \HLT \AOA\\BUT STILL IN EXTEND \LDA*\A,1\EXT MODE? \SZE \HLT\\NO=>ERROR \JMP\*+1 * NOW WE MUST NORMAL MODE \LDA*\A,1\NORMAL MODE? \CMA \SZE \HLT\\NO=>ERROR * * ENTER IN NORMAL MODE AND TEST WHETHER IN * EXTENDED MODE AFTER INTERRUPT \LDA\INT1\INTERRUPT SETUP \STA\'63 \LDA\M50 \STA\'61\INIT RTC TO INTERRUPT (1 SEC) \LDA\IA \STA\ID1 \OCP\'20\START RTC * * INIT THE INTERRUPT PROCESSING \LDA\MASK\ENABLE RTC INTERRUPT \SMK\'20 \CRA \ENB CD\JMP\*\AND WAIT FOR AN INTERRUPT \NOP IA\DAC*\**,1 * * * INTERRUPT ROUTINE, ENTERS HERE * * CHECK WHETHER THE JST* '63 KEEPS THE FLAG IN ID1 * AND DESTROYS ITS TAG BIT ID1\DAC*\**,1 * CHECK FOR A CLOCK INTERRUPT \SKS\'20 \JMP\CLCK * NO RTC INTERRUPT, SO ERROR \HLT \JMP\*-1 * * RTC INTERRUPT ACD\DAC\CD CLCK\AOA\\A#0 \LDA*\A,1\EXT MODE? \SZE \HLT\\NO=>ERROR * PME AND C MUST BE 0 \AOA \INK \SZE \HLT \LDA\ID1\ \SMI\\FLAG OK? \HLT\\NO=>ERROR \CSA \SUB\ACD\ADDRESS OK? \SZE \HLT\\NO=>ERROR \LDA\AST \JST\PRIN\PRINT * * * ENTER IN EXTENDED MODE AND TEST WHETHER IN * EXTENDED MODE AFTER INTERRUPT \LDA\INT2\INTERRUPT SETUP \STA\'63 \LDA\M50 \STA\'61\INIT RTC TO INTERRUPT (1 SEC) \LDA\IA \STA\ID2 \OCP\'20\START RTC * * INIT THE INTERRUPT PROCESSING \LDA\MASK\ENABLE RTC INTERRUPT \SMK\'20 \CRA \ENB CD1\JMP\*\AND WAIT FOR AN INTERRUPT \NOP * * * INTERRUPT ROUTINE, ENTERS HERE * * CHECK WHETHER THE JST* '63 KEEPS THE FLAG IN ID2 * AND DESTROYS ITS TAG BIT ID2\DAC*\**,1 * CHECK FOR A CLOCK INTERRUPT \SKS\'20 \JMP\CLK1 * NO RTC INTERRUPT, SO ERROR \HLT \JMP\*-1 * * RTC INTERRUPT ACD1\DAC\CD1 CLK1\AOA\\A#0 \LDA*\A,1\EXT MODE? \SZE \HLT\\NO=>ERROR * PME MUST BE 1 AND C MUST BE 0 \AOA \INK \ERA\PME\A3=1? \SZE \HLT \LDA\ID2\ \SMI\\FLAG OK? \HLT\\NO=>ERROR \CSA \SUB\ACD1\ADDRESS OK? \SZE \HLT\\NO=>ERROR \DXA \LDA\AST \JST\PRIN\PRINT * * * ENTER IN NORMAL MODE AND TEST WHETHER IN * EXTENDED MODE AFTER INTERRUPT \LDA\INT3\INTERRUPT SETUP \STA\'63 \LDA\M50 \STA\'61\INIT RTC TO INTERRUPT (1 SEC) \LDA\IA \STA\ID3 \OCP\'20\START RTC * * INIT THE INTERRUPT PROCESSING \LDA\MASK\ENABLE RTC INTERRUPT \SMK\'20 \CRA \ENB CD2\JMP\*\AND WAIT FOR AN INTERRUPT \NOP * * * INTERRUPT ROUTINE, ENTERS HERE * * CHECK WHETHER THE JST* '63 KEEPS THE FLAG IN ID3 * AND DESTROYS ITS TAG BIT ID3\DAC*\**,1 * CHECK FOR A CLOCK INTERRUPT \SKS\'20 \JMP\CLK2 * NO RTC INTERRUPT, SO ERROR \HLT \JMP\*-1 * * RTC INTERRUPT ACD2\DAC\CD2 CLK2\AOA\\A#0 \LDA*\A,1\EXT MODE? \SZE \HLT\\NO=>ERROR * PME MUST BE 0 AND C MUST BE 0 \AOA \INK \SZE \HLT \LDA\ID3\ \SMI\\FLAG OK? \HLT\\NO=>ERROR \CSA \SUB\ACD2\ADDRESS OK? \SZE \HLT\\NO=>ERROR \DXA \LDA\AST \JST\PRIN\PRINT * \JST\NLCR * NORMAL MODE AND PME==0 * * TEST JST IN NORMAL MODE \LDA*\A,1\NORMAL MODE? \CMA \SZE \HLT\\NO=>ERROR \LDA\IA \STA\ID4 \JST\ID4 ACD3\DAC\* ID4\DAC\** * FLAG AND TAG OK? \LDA\ID4 \ANA\IA \ERA\IA \SZE \HLT\\NO=>ERROR \LDA\ID4\ADDRESS \ERA\IA \SUB\ACD3 \SZE \HLT\\NO=>ERROR * \EXA * TEST JST IN EXTENDED MODE \AOA \LDA*\A,1\EXTENDED MODE? \SZE \HLT\\NO=>ERROR \LDA\IA \STA\ID5 \JST\ID5 ACD4\DAC\* ID5\DAC\** * FLAG AND TAG OK? \LDA\ID5 \ANA\MSB \ERA\MSB \SZE \HLT\\NO=>ERROR \LDA\ID5\ADDRESS \ERA\MSB \SUB\ACD4 \SZE \HLT\\NO=>ERROR * * MEMORY STORE AND LOAD IN EXTENDED MODE \CRA \STA\0\X=0 ML1\CRA \AOA \STA*\MSTR,1\POSTINDEXING \IRS\0 \LDA\0 \CAS\MEND \JMP\*+3 \JMP\ML1 \JMP\ML1 * CHECK \CRA \STA\0\X=0 ML11\LDA*\MSTR,1\POSTINDEXING \CAS\ONE \HLT\\NE 1 =>ERROR \SKP \HLT\\NE 1 =>ERROR \IRS\0 \LDA\0 \CAS\MEND \JMP\*+3 \JMP\ML11 \JMP\ML11 * OK, NEXT TEST \CRA \STA\0\X=0 ML2\LDA\FFFF \STA*\MSTR,1\POSTINDEXING \IRS\0 \LDA\0 \CAS\MEND \JMP\*+3 \JMP\ML2 \JMP\ML2 * CHECK \CRA \STA\0\X=0 ML21\LDA*\MSTR,1\POSTINDEXING \CMA \SZE \HLT\\NE FFFF => ERROR \IRS\0 \LDA\0 \CAS\MEND \JMP\*+3 \JMP\ML21 \JMP\ML21 * OK, NEXT TEST \CRA \STA\0\X=0 ML3\CRA \STA*\MSTR,1\POSTINDEXING \IRS\0 \LDA\0 \CAS\MEND \JMP\*+3 \JMP\ML3 \JMP\ML3 * CHECK \CRA \STA\0\X=0 ML31\LDA*\MSTR,1\POSTINDEXING \SZE \HLT\\NE 0 => ERROR \IRS\0 \LDA\0 \CAS\MEND \JMP\*+3 \JMP\ML31 \JMP\ML31 * * EXE SOME CODE IN EXTENDED MEMORY \JMP*\MUP * \ORG\'77760 ECD\EQU\* \NOP \NOP \NOP \NOP \NOP \LDA\MSB \ERA\MSB \SZE \HLT \LDA*\IIA \ERA*\IIA \SZE \HLT \DXA \JMP*\BACK IIA\DAC\IA \END