; Proof-corrected original text of 1979 Acorn monitor in original ; assembly form (from OCR Scan 2002.01.05). Includes errors from ; the original (e.g., COPY IOF SO, QDATFE7). [Starts at FE00] ; Other changes: 'h' used for half-symbol; 'u' used for micro. ACORN MONITOR QUAD LDY #06 DISPLAY THE 4 BYTES AT X-3,X-2, X-1 & X IN THAT ORDER ON THE DISPLAY STILL LDA ZX 00 - GET THE BYTE POINTED TO BY X JSR DHEXTD - USE DOUBLE HEX TO DISPLAY ROUTINE DEX - NEXT X DEY - NEXT Y POSITION DEY BPL STILL - FALL AUTO DISPLAY WHEN FINISHED -Y POSITION & ALSO LOOP COUNTER DISPLAY STX Z TX - SAVE X!!!! RESCAN LDX #07 - SCAN 8 DIGITS, NO MATTER WHAT STX 1 ADDR - SET UP DATA DIRECTION REGISTER SCAN LDY #00 - CLEAR Y FOR LATER USE LDA Z,X D - GET DISPLAY DATA FROM THE ZERO PAGE MEMORY STA 1PIB - & PUT IT ONTO SEGMENTS STX 1PIA - SET DIGIT DRIVE ON AND THE KEY COLUMNS LDA 1PIA - GET KEY DIGIT BACK AND #3F - REMOVE SURPLUS TOP BITS BIT Z EXEC - CHECK STATUS ='1' MEANS NOT PROCESSING A KEY BPL BUTTON - BUT 0 MEANS THAT WE ARE BVS DELAY - THUS CAN BE BLOWN TO AN ESCAPE FROM THE DISPLAY ROUTINE ALTOGETHER ON STATUS C0 AT THE MOMENT IT IGNORES KEYS IF GIVEN THIS STATUS CMP #38 - CHECK FOR ALL 1'S ROW INPUT FROM KEYBOARD = SET COPY IOF SO BCS DELAY - IF ALL 1's THEN NO KEY HAS BEEN PRESSED STX Z COL - STORE THE PRESSED KEY'S COLUMN INFORMATION LDA #40 - SET STATUS TO "WE ARE PROCESSING A KEY" KEY CLEAR STA Z ECEC DELAY DEY - Y WAS ZERO SO HERE IS A 256X5uS DELAY BNE DELAY - Y WILL BE ZERO ON EXIT DEX BPL SCAN - IF X WAS STILL TVE, CONTINUE THIS SCAN LDA Z REPEAT - IF WE SHOULD CONTINUE SCANNING THEN TOP BIT IS SET BMI RESCAN - CONTINUE SCANNING BPL OUTPUT - IF TOP BIT IS ZERO, THEN USE THIS DATA AS THE KEY ITSELF BUTTON CPX Z COL - ARE WE ON THE SAME KEY'S COLUMN? BNE DELAY - NO CMP #38 - HAS A KEY ACTUALLY BEEN PRESSED? BCC PRESSED - YES LDA #80 - NO, THEN CLEAR THE EXECUTION STATUS - THE KEY HAS BEEN PRESSED & RELEASED BNE KEYCLEAR - ALWAYS BRANCH PRESSED CMP Z EXEC - A KEY HAS BEEN PRESSED BEQ DELAY - BUT IT HAS ALREADY BEEN EXECUTED STA Z EXEC - SET IT AS BEING EXECUTED EOR #38 - JIGGERY POKERY TO ENCODE THE ROW INPUTS TO BINARY OUTPUT AND #1F - ALSO ENSURE THE KEY IN REPEAT WAS OF REASONABLE SIZE CMP #10 - A HEX KEY OR NOT? CARRY CLEAR IF HEX STA Z KEY - PUT THE KEY IN A TEMP LOCATION FOR FURTHER USE (BY "MODIFY") LDX Z TX - RETRIEVE X STY 1PIB - TURN THE SEGMENT DRIVES OFF RTS - AND RETURN MHEXTD LDA (00, X) - MEMORY HEX TO DISPLAY = GET A BYTE FROM MEMORY RDHEXTD LDY #06 - RIGHT (OF DISPLAY) DOUBLE HEX TO DISPLAY : SET Y TO RIGHT OF DISPLAY BNE DHEXTD - AND USE DHEXTD QHEXTD1 LDY #03 - QUAD HEX TO DISPLAY 1: SET Y TO USE POSNS 1,2,3 & 4 QHEXTD2 LDA Z,Y 00 2: USE ANY Y: GET THE DATA JSR DHEXTD - AND USE DHEXTD DEY DEY - HAVING DECREMENTED THE POSITION LDA Z,X 01 - GET THE HIGH BYTE OF THE DATA & USE DHEXTD DHEXTD INY - DOUBLE HEX TO DISPLAY : FIRST HEX ON RIGHTEST POSITION PHA - SAVE A JSR HEXTD - USE HEX TO DISPLAY DEY - GET Y BACK TO CORRECT POSITION PLA - RETRIEVE A LSR A LSR A LSR A LSR A - ORIENTATED FOR OTHER HEX DIGIT HEXTD STY Z TY - HEX TO DISPLAY = SAVE Y AND #0F - REMOVE SURPLUS BITS FROM A TAY - & PUT IT IN 7 LDA, Y FONT - GET THE 7 SEGMENT FORM LDY Z TY - RETRIEVE Y STA, Y D - AND POSITION THE 7 SEG FORM ON THE DISPLAY RTS QDATFE7 JSR QHEXTD1 - QUAD DATA FETCH - DISPLAY OLD DATA JSR DISPLAY - GET KEY BCS RETURN - NON HEX RETURN LDY #04 - LOOP COUNTER ASL A ASL A ASL A ASL A - DIGIT IN A IN CORRECT PLACE SHIFTIN ASL A - MULTI SHIFT TO GET DIGIT INTO MEMORY ROL Z,X 00 - INDEXED ROL Z,X 01 DEY BNE SHIFTIN - KEEP SHIFTING IN BEQ QDATFET - GO AND DO IT ALL AGAIN COM16 INC Z,X 06 - INCREMENT & COMPARE 16 BIT NOS - INCREMENT LOWER BNE NOINC - NO HIGH INCREMENT INC Z,X 07 UDINC LDA Z,X 06 - LOW BYTE EQUALITY TEST CMP Z,X 08 BNE RETURN - NO NEED TO DO HIGH BYTE LDA Z,X 07 - HIGH BYTE EQUALITY TEST CMP Z,X 09 RETURN RTS PUTBYTE LDY #40 - PUT BYTE TO TAPE - CONFIGURE I/O PORT STY 1ADDR LDY #07 - LOOPCOUNTER STY 1PIA - AND SEND THE START BIT ROR A ROR A - BACK A UP A COUPLE OF BITS AGAIN JSR WAIT - WAIT TO SEND OUT RESET BIT ROR A - SENDING ORDER IS BIT 0 -> BIT 7 STA 1PIA - SEND BIT DEY BNE AGAIN - KEEP GOING JSR WAIT - WAIT FOR THAT BIT TO END STY 1PIA - SEND STOP BIT : Y IS FF WAIT JSR h WAIT - 300 BAND WAITING TIME - IN TWO PARTS h WAIT STY Z TY - 1/2 THE WAITING TIME - SAVE Y LDY #48 - 72 X 5uS DELAY WAIT 1 DEY - PART ONE OF THE WAIT BNE WAIT 1 WAIT 2 DEY - Y WAS ZERO ON ENTRY - 256 x 5uS BNE WAIT 2 DELAY LDY Z TY - RETRIEVE Y RTS GETBYTE LDY #08 - GET BYTE FROM TAPE - LOAD COUNTER START BIT 1PIA - WAIT FOR 1 -> 0 TRANSISITON - BMI START A START BIT JSR h WAIT - WAIT HALF THE TIME, SO SAMPLING IN THE CENTRE INPUT JSR WAIT - FULL WAIT TIME BETWEEN SAMPLES ASL 1PIA - GET SAMPLE AUTO CARRY ROR A - AND AUTO A DEY BNE INPUT - KEEP GOING BEQ WAIT - USE WAIT TO GET OUT ONTO THE THE SHOP BIT HIGH RESET LDX #FF - MAIN PROGRAM TXS - INITIALIZE STACK STX 1BDDR - AND B DATA DIRECTION REGISTER STX Z REPEAT - MULTI-SCAN DISPLAY MODE INIT LDY #80 - THE FAMILIAR DOT ON THE DISPLAY LDX #09 - ALL EIGHT DISPLAYS AND INITIALIZE EXEC STY Z,X REPEAT - Y USED FOR AMUSEMENT DEX BNE ROUND - X ZERO ON EXIT, SO UP & DOWN IMMEDIATELY VALID RESTART JSR DISPLAY - MARK RETURN TO MONITOR POINT DISPLAY DISPLAY & GET KEY RE-ENTER BCC INIT - HEX KEY GETS THE DOTS BACK SEARCH AND #07 - REMOVE ANY STRAY BITS (EFFECTIVELY SUBTRACT 10) CMP #04 BCC FETADD - KEYS OF VALUE LESS THAN 4 NEED AN ADDRESS BEQ LOAD - KEY 4 IS THE LOAD KEY CMP #06 BEQ "UP" - KEY 6 IS UP BCS "DOWN" - & KEY 7 IS DOWN "RETURN" LDA Z R0 - MUST BE KEY 5 - GET A BACK LDX Z R1 - GET X BACK LDY Z R2 - GET Y BACK RTI - GET P & PC BACK & CONTINUE FROM WHERE YOU WERE "UP" INC Z,X 00 - 16 BIT INDEXED INCREMENT BNE ENTERM INC Z,X 01 BCS ENTERM - A BRANCH ALWAYS: THE CARRY WAS SET BY THE FF11 COMPARE "DOWN" LDA Z,X 00 - 16 BIT INDEXED DECREMENT BNE NODEC DEC Z,X 01 NODEC DEC Z,X 00 ENTERM JSR QHEXTD1 - NOW DISPLAY THE VALUE JMP "MODIFY" - AND GET INTO THE MODIFY SECTION FETADD STY Z D+6 - CLEAR DISPLAYS 6 STY Z D+7 - & 7 - Y WAS ZERO ON EXIT FROM DISPLAY ASL A - DOUBLE A TAX - THE ZERO PAGE ADDRESSES MAP, GAP, PAP & FAP EOR #F7 - FIX UP DIGIT 0 COMMAND SYMBOL STA Z D JSR QDATFET - FETCH THE ADDRESS, AUTO MAP, GAP, PAP OR FAP CPX #02 - CHECK X TO FIND OUT WHICH COMMAND WE'RE DOING BCS NI - MUST BE 2,4 OR 6 - AS 0 IS "MODIFY" JSR MHEXTD - DISPLAY THE MEMORY JSR DISPLAY - AND GET KEY BCS SEARCH - IF NOT HEX DO OVER LDA (00, X) - HEX SO GET OLD INFO ASL A ASL A ASL A ASL A - MOVED ALONG ORA Z KEY - AND PUT IN NEW INFO STA (00, X) - AND PUT IT BACK JMP "MODIFY" - THEN KEEP DOING IT N1 BNE N2 - MUST BE 4 OR 6 AS 2 IS "GO" JMP (GAP) - THE VERY SIMPLE GO N2 CPX #04 - IS IT 4 OR 6? BEQ POINT - WELL IT'S NOT 4 "STORE" LDX #08 - SO IT MUST BE 6 - X NOW POINTS TO TAP STX Z D - GIVE PROMPT JSR QDATFET - AND GET 2ND STORE INFO LDX #04 - LOOP COUNT LDA Z,X 05 - SEND ADDRESSES TO TAPE JSR PUTBYTE DEX BNE ADDRESS - X NEATLY ZEROED ON EXIT DATAS LDA (06, X) - DATA SEND - GET INFO FROM MEMORY JSR PUTBYTE - AND SEND IT TO TAPE JSR COM16 - SEE IF PRINTED BNE DATAS - NO BEQ WAYOUT - YES "LOAD" LDX #04 ADDRSL JSR GETBYTE - RESCUE ADDRESSES FROM TAPE STA Z,X 05 - PUT THEM IN FAP & TAP, THOUGH IT COULD BE ELSEWHERE DEX BNE ADDRSL - X NEATLY SERVED AGAIN DATAL JSR GETBYTE - GET DATA FROM TAPE STA (06, X) - AND STORE IT IN MEMORY STA 1PIB - AND ON THE DISPLAY SO IT CAN BE SEEN JSR COM16 - SEE IF FINISHED BNE DATAL - NO BEQ WAYOUT - YES "POINT" LDA (00, X) - SET/CLEAR BREAK POINT - GET DATA FROM ADDRESSED MEMORY BEQ SET - IF ZERO BREAK POINT HAS ALREADY BEEN SET = MUST CLEAR IT STA Z P - NOT ZERO SO SAVE THE INFORMATION LDA #00 - AND PUT IN A BREAK POINT BEQ OUT SET LDA Z P - WAS SET SO GET OLD INFORMATION BACK OUT STA (00, X) - INSERT BREAK POINT OR OLD INFORMATION JSR MHEXTD - NOW READ IT OUT AGAIN TO REVEAL ROM WAYOUT JMP RESTART - GO BACK & DO IT ALL OVER AGAIN NMI JMP (USERNMI) - INDIRECTION ON NMI IRQ JMP (USERIRQ) - INDIRECTION ON IRQ BREAK STA Z R0 - WHEN THE IRQ/BREAK VECTOR POINTS HERE THEN DISPLAY DISPLAY EVERYTHING - SAVE A STX Z R1 - SAVE X STY Z R2 - SAVE Y PLA - GET P OFF STACK PHA - PUT IT BACK FOR FUTURE USE STA Z R3 - STORE Q IN REGISTER 3 LDX #R3 - SET X TO POINT AT REGISTERS 3 -> 0 FOR QUAD LDA #FF - KILL POSSIBILITY OF DISPLAY BEING ON SINGLE SCAN STA Z REPEAT JSR QUAD - USE QUAD TO WRITE OUT A X Y P TSX - GET STACK POINTER STX Z R7 INY - Y ZERO SINE QUAD ENDED WITH DISPLAY SO THIS FORMS 01 STY Z R6 CLD - CLEAR DECIMAL MODE FOR BINARY SUBTRACT - DOESN'T AFFECT USER SINCE P IS STACKED LDA, X 0102 - GET PCL OFF STACK SEC SBC Z RECAL - CORRECT IT BY AMOUNT IN RECAL STA, X 0102 - PUT IT BACK ON STACK STA Z R5 - AND STORE IT FOR QUAD LDA, X 0103 - PCH OFF STACK SBC #00 - REST OF TWO BYTE SUBTRACTION STA, X 0103 - PUT IT BACK ON STACK STA Z R4 - AND STORE IT FOR QUAD LDX #R7 - POINT X AT THESE REGISTERS - QUAD WILL DESTROY THEM JSR QUAD - QUAD WRITES OUT PC SP JMP RE-ENTER - AND THE WHOLE SHEBARG STARTS OVER AGAIN FONT '0''1''2''3' - 7 SEGMENT FORMS OF THE HEX DIGITS '4''5''6''7' '8''9''A''b' 'c''d''E''F' NMIVEC NMI - POINT TO THE ADDED INDIRECTION RSTVEC RESET - POINT TO THE RESET ENTRY POINT IRQVEC IRQ - POINT TO THE ADDED INDIRECTION ; 'SEVEN SEGMENT FORMS OF THE HEX DIGITS' at 'FONT' are: ; ; 3F 06 5B 4F ; 66 6D 7D 07 ; 7F 6F 77 7C ; 58 5E 79 71 ; ; Hence the bits are: ; 0(MSB)=d.p; 1=centre; 2=left-top; 3=left-bot; ; 4=bot; 5=right-bot; 6=right-top; 7=top;