NAM PSYMON ************************************************* * PSYMON VERSION 1.20 * * A 6809 ROM MONITOR * * * * THE PERCOM SYSTEM MONITOR (PSYMON) WAS * * WRITTEN BY A TEAM OF PROGRAMMERS USING * * STRUCTURED TECHNIQUES. THE TEAM MEMBERS * * ARE AS FOLLOWS: * * HAROLD A MAUCH - PRESIDENT, PERCOM DATA * * MIKE FOREMAN - 6809 PROJECT LEADER * * BYRON SEASTRUNK - DESIGN ENGINEER * * CLIFF RUSHING - PROGRAMMER * * JIM STUTSMAN - CHIEF PROGRAMMER * * * * COPYRIGHT (c) 1979 PERCOM DATA COMPANY, INC. * * USE OF THIS SOFTWARE IS GRANTED ROYALTY-FREE * * AS LONG AS THE USER CLEARLY ACKNOWLEDGES ITS * * ORIGIN. * * * * WHILE THIS MONITOR IS VERY SIMPLE, ITS TRUE * * POWER LIES IN ITS EXTENSIBILITY AND IN THE * * TOOLS THAT IT PROVIDES FOR OTHER SOFTWARE * * TO USE. THIS OPERATING SYSTEM IS DEDICATED * * TO HAROLD MAUCH AND HIS LEGENDARY 512 BYTE * * OPERATING SYSTEM. * * * * COMMANDS: * * M
- MEMORY EXAMINE/CHANGE * * G
- GO TO ADDRESS * * R - REGISTER EXAMINE/CHANGE * * L - LOAD PROGRAM FROM TAPE * * S - SAVE PROGRAM TO TAPE * * B
- SET/LIST BREAKPOINTS * * U
- UNSET BREAKPOINTS * * Z - JUMP TO PROM AT ADDRESS C000 HEX * * * * CALLABLE SUBROUTINES: * * INCHR - INPUT CHARACTER FROM CONSOLE * * OUTCHR - OUTPUT CHARACTER TO CONSOLE * * REQIO - PERFORM I/O TO PERIPHERAL * * GETHEX - INPUT HEX NUMBER FROM CONSOLE * * INHEX - INPUT HEX DIGIT FROM CONSOLE * * DSPSBY - DISPLAY SINGLE BYTE & SPACE * * DSPDBY - DISPLAY DOUBLE BYTE & SPACE * * OUTHEX - DISPLAY 2 HEX DIGIST * * PSTRNG - DIPLAY STRING ON CONSOLE * * LOAD - LOAD HEX PROGRAM FROM CONSOLE * * SAVE - SAVE HEX PROGRAM TO CONSOLE * * CRLF - BEGIN NEW LINE ON CONSOLE * * OUTS - OUTPUT SPACE TO CONSOLE * * * * ALL I/O WITHIN PSYMON IS DONE THROUGH THE * * USE OF DEVICE CONTROL BLOCKS. THIS ALLOWS * * EASY MODIFICATION BY THE USER. PSYMON HAS * * FOUR DCB POINTERS INITIALIZED TO POINT TO THE * * CONSOLE (ACIA) DCB. THEY ARE USED AS * * FOLLOWS: * * CIDCB - POINTS TO DCB USED FOR CONSOLE * * INPUT (CHARACTER I/O). * * CEDCB - POINTS TO DCB USED FOR ECHO OF * * CHARACTERS RECEIVED USING CIDCB. * * ECHO MAY BE SUPPRESSED BY SETTING * * THIS POINTER TO ZERO. * * CODCB - POINTS TO DCB USED FOR CONSOLE * * OUTPUT (CHARACTER I/O). * * TPDCB - POINTS TO DCB USED FOR PSYMON * * TAPE LOAD & SAVE COMMANDS * * * * THE PSYMON COMMAND TABLE MAY BE EXTENDED * * OR CHANGED BY SETTING THE POINTER 'USRTBL' * * TO THE ADDRESS OF A USER COMMAND TABLE. IT * * IS INITIALIZED TO ZERO, INDICATING NO USER * * TABLE EXISTS. * * * * ADDITIONAL INFORMATION REGARDING THE USE OF * * 'PSYMON' MAY BE OBTAINED FROM: * * PERCOM DATA COMPANY, INC. * * 211 NORTH KIRBY * * GARLAND, TEXAS 75042 * * * * REVISION A - 11/23/79 * * ADDITION OF A VECTOR FOR SCRATCHPAD RAM * * * * REVISION B - 02/08/80 * * ADDITIONAL OF A VECTOR FOR FREE RAM * * * ************************************************* * SYSTEM ADDRESS CONSTANTS ROM1 EQU $8000 BASE ADDRESS OF PSYMON ROM ROM2 EQU $A000 BASE ADDRESS OF EXTENSION ROM RAM EQU $7000 BASE ADDRESS OF SCRATCHPAD RAM FREE EQU $0000 ADDRESS OF FREE RAM TERMNL EQU $EB00 SYSTEM TERMINAL ACIA * ASCII CHARACTER CONSTANTS CR EQU $0D CARRIAGE RETURN LF EQU $0A LINE FEED SP EQU $20 SPACE * ACIA CONTROL CONFIGURATIONS RESET EQU $03 RESET ACIA CONFIG EQU $51 SET FOR 8 DATA, 2 STOP, NO PARITY RDRON EQU CONFIG-$40 READER ON (RTS ON) RDROFF EQU CONFIG READER OFF (RTS OFF) * PSYMON DCB OFFSETS DCBLNK EQU 0 POINTER TO NEXT DCB IN CHAIN DCBDID EQU 2 ASCII 2 CHARACTER DEVICE ID DCBDVR EQU 4 DEVICE DRIVER ADDRESS DCBIOA EQU 6 DEVICE I/O ADDRESS DCBERR EQU 8 ERROR STATUS CODE DCBEXT EQU 9 NUMBER OF EXTENSION BYTES IN DCB DCBAPP EQU 10 DCB APPENDAGE FOR DRIVER USE * PSYMON DCB FUNCTION CODES READFN EQU $01 READ FUNCTION CODE WRITFN EQU $02 WRITE FUNCTION CODE STATFN EQU $04 STATUS FUNCTION CODE CNTLFN EQU $08 DEVICE CONTROL FUNCTION CODE * PSYMON RAM DEFINITIONS ORG RAM * PSYMON INTERNAL STACK & REGISTER SPACE * OFFSETS TO RAM BASE IN PARENTHESES RMB 55 STACK SPACE STACK EQU * (55) TOP OF STACK REGC RMB 1 (55) CONDITION CODE REGISTER REGA RMB 1 (56) A REGISTER REGB RMB 1 (57) B REGISTER REGD RMB 1 (58) DIRECT PAGE REGISTER REGX RMB 2 (59) X REGISTER REGY RMB 2 (61) Y REGISTER REGU RMB 2 (63) U STACK POINTER REGP RMB 2 (65) PROGRAM COUNTER * PSYMON BREAKPOINT TABLE BPTABL RMB 15 (67) SPACE FOR 5 BREAKPOINTS BPTEND EQU * (82) END OF BREAKPOINT TABLE * PSYMON WORK AREAS MEMPTR RMB 2 (82) MEMORY POINTER FOR 'M' COMMAND USRTBL RMB 2 (84) ADDRESS OF USER COMMAND TABLE COMAND RMB 1 (86) COMMAND CHARACTER STORAGE CKSUM RMB 1 (87) CHECKSUM FOR LOAD AND SAVE BEGADD RMB 2 (88) BEGIN ADDRESS FOR SAVE ENDADD RMB 2 (90) END ADDRESS FOR SAVE STKPTR RMB 2 (92) CONTENTS OF STACK POINTER * THE PSYMON CONSOLE DCB CONDCB RMB 10 (94) STANDARD DCB * PSYMON DCB POINTERS DCBCHN RMB 2 (104) BASE OF DCB CHAIN CIDCB RMB 2 (106) CONSOLE INPUT DCB CEDCB RMB 2 (108) CONSOLE ECHO DCB CODCB RMB 2 (110) CONSOLE OUTPUT DCB TPDCB RMB 2 (112) CASSETTE TAPE DCB * PSYMON VECTORS SWI3V RMB 2 (114) SOFTWARE INTERRUPT 3 SWI2V RMB 2 (116) SOFTWARE INTERRUPT 2 FIRQV RMB 2 (118) FAST INTERRUPT REQUEST IRQV RMB 2 (120) INTERRUPT REQUEST SWIV RMB 2 (122) SOFTWARE INTERRUPT NMIV RMB 2 (124) NON-MASKABLE INTERRUPT FRERAM RMB 2 (126) ADDRESS OF FREE RAM * PSYMON ROM CODING ORG ROM1 ************************************************* * PSYMON INITIALIZATION * ************************************************* INIT LDS #STACK SET UP STACK POINTER TFR S,X POINT X AT STACK INIT1 CLR ,X+ CLEAR A BYTE CMPX #CONDCB+2 ALL FIELDS CLEAR? BNE INIT1 LOOP IF NOT LDY #RAMINT POINT TO RAM DATA INIT2 LDD ,Y++ MOVE 2 BYTES STD ,X++ CMPX #FRERAM+2 END OF RAM? BNE INIT2 LOOP IF NOT LDX #CONDCB POINT TO DCB LDD #RESET*256+CNTLFN A=RESET, B=CNTLFN JSR REQIO RESET ACIA LDA #CONFIG CONFIGURE ACIA JSR REQIO LDA ROM2 CHECK FOR SECOND ROM CMPA #$7E IS THERE A JUMP THERE? BNE MONENT GO IF NOT JSR ROM2 CALL SECOND ROM ************************************************* * PSYMON USER ENTRY * ************************************************* MONENT STS STKPTR SAVE STACK POINTER ************************************************* * GET COMMAND * ************************************************* GETCMD LDX #PROMPT DISPLAY PROMPT JSR PSTRNG JSR INCHR INPUT COMMAND CHARACTER BSR LOOKUP LOOK IT UP BNE GETCMD LOOP IF NOT FOUND JSR OUTSP OUTPUT A SPACE JSR [,X] CALL COMMAND ROUTINE BRA GETCMD GO BACK FOR MORE PROMPT FCB CR,LF FCC 'CMD' FCB '?+$80 END OF STRING ************************************************* * LOOK UP COMMAND IN TABLE * ************************************************* LOOKUP LDY #COMAND POINT Y TO COMMAND STA ,Y SAVE COMMAND CHARACTER LDX USRTBL GET USER TABLE ADDRESS BEQ LOOK1 GO IF NONE BSR SEARCH SEARCH USER TABLE BEQ SERCHX GO IF FOUND LOOK1 LDX #CMDTBL SEARCH INTERNAL TABLE ************************************************* * GENERAL TABLE SEARCH * * * * ENTRY REQUIREMENTS: X - POINTS TO TABLE * * Y - POINTS TO ITEM * * FIRST BYTE OF TABLE MUST * * CONTAIN ITEM LENGTH * * LAST BYTE MUST BE FF * * * * EXIT CONDITIONS: C - Z SET IF FOUND, CLEAR * * IF NOT FOUND * * X - POINTS TO ADDRESS OF * * ROUTINE FOR MATCH * * A,B - CHANGED * * * ************************************************* SEARCH LDB ,X+ GET ITEM LENGTH SERCH1 BSR COMPAR COMPARE CURRENT ITEM ABX ADVANCE TO NEXT ITEM BEQ SERCHX EXIT IF MATCH LEAX 2,X STEP OVER ADDRESS TST ,X END OF TABLE? BPL SERCH1 LOOP IF NOT SERCHX RTS ************************************************* * GENERAL STRING COMPARE * * * * ENTRY REQUIREMENTS: X - ADDRESS OF STRING 1 * * Y - ADDRESS OF STRING 2 * * B - LENGTH OF STRINGS * * * * EXIT CONDITIONS: C - SET PER COMPARE 1:2 * * B,X,Y - UNCHANGED * * A - CHANGED * * * ************************************************* COMPAR PSHS B,X,Y SAVE REGISTERS COMP1 LDA ,X+ GET NEXT CHARACTER CMPA ,Y+ COMPARE IT BNE COMP2 EXIT IF UNMATCHED DECB DECREMENT LOOP COUNT BNE COMP1 COMP2 PULS B,X,Y,PC RESTORE REGISTERS & EXIT ************************************************* * LOAD PROGRAM FROM TAPE * ************************************************* TLOAD LDD CIDCB SAVE CONSOLE DCBS LDX CEDCB PSHS A,B,X LDX TPDCB POINT TO TAPE DCB CLRA SET D TO 0 CLRB STX CIDCB SET TAPE IN, NO ECHO STD CEDCB LDD #RDRON*256+CNTLFN RAISE READER CONTROL JSR REQIO BSR LOAD LOAD THE TAPE LDD #RDROFF*256+CNTLFN DROP READ CONTROL LDX TPDCB JSR REQIO PULS A,B,X RESTORE CONSOLE DCBS STD CIDCB STX CEDCB TST CKSUM ANY ERRORS? BEQ LOADX GO IF NOT ************************************************* * DISPLAY ERROR INDICATOR OF '?' * ************************************************* ERROR LDA #'? DISPLAY ERROR INDICATOR JMP OUTCHR ************************************************* * LOAD PROGRAM IN HEX FORMAT * * * * ENTRY REQUIREMENTS: NONE * * * * EXIT CONDITIONS: ALL REGISTERS CHANGED * * CKSUM NON-ZERO IF ERROR * * * ************************************************* LOAD TFR S,Y MARK STACK FOR ERROR RECOVERY LOAD1 JSR INCHR GET A CHARACTER LOAD2 CMPA #'S START OF RECORD? BNE LOAD1 LOOP IF NOT JSR INCHR GET ANOTHER CHARACTER CMPA #'9 END OF LOAD? BEQ LOADX GO IF YES CMPA #'1 START OF RECORD? BNE LOAD2 LOOP IF NOT CLR CKSUM INIT CHECKSUM BSR INBYTE READ LENGTH SUBA #2 ADJUST IT TFR A,B SAVE IN B BSR INBYTE GET ADDRESS HI STA ,--S SAVE ON STACK BSR INBYTE GET ADDRESS LO STA 1,S PUT ON STACK PULS X ADDRESS NOW IN X LOAD3 BSR INBYTE READ A BYTE DECB DECREMENT COUNT BEQ LOAD4 GO IF DONE STA ,X STORE BYTE CMPA ,X+ VERIFY GOOD STORE BNE LOAD5 GO IF ERROR BRA LOAD3 LOAD4 INC CKSUM CHECK CHECKSUM BEQ LOAD1 LOOP IF GOOD LOAD5 LDA #$FF SET ERROR FLAG STA CKSUM TFR Y,S RESTORE STACK LOADX RTS ************************************************* * INPUT BYTE * ************************************************* INBYTE BSR INHEX GET HEX DIGIT BEQ LOAD4 GO IF ERROR ASLA SHIFT TO MS HALF ASLA ASLA ASLA PSHS A SAVE DIGIT BSR INHEX GET ANOTHER DIGIT BEQ LOAD4 GO IF ERROR ADDA ,S COMBINE HALVES STA ,S SAVE ON STACK ADDA CKSUM ADD TO CHECKSUM STA CKSUM PULS A,PC GET RESULT & RETURN ************************************************* * GET HEX NUMBER FROM CONSOLE * * * * ENTRY REQUIREMENTS: NONE * * * * EXIT CONDITIONS: A - LAST CHAR INPUT * * B - HEX DIGIT COUNT * * X - HEX NUMBER * * C - SET ACCORDING TO B * * * ************************************************* GETHEX CLRB INITIALIZE DIGIT COUNT, RESULT LDX #0 GETHX1 BSR INHEX GET A DIGIT BEQ GETHX2 GO IF NOT HEX EXG D,X OLD RESULT TO A,B ASLB SHIFT LEFT 1 DIGIT ROLA ASLB ROLA ASLB ROLA ASLB ROLA EXG D,X REPLACE RESULT LEAX A,X ADD IN NEW DIGIT INCB ADD TO DIGIT COUNT BRA GETHX1 LOOP FOR MORE GETHX2 TSTB SET/RESET Z FLAG RTS ************************************************* * GET HEX DIGIT FROM CONSOLE * * * * ENTRY REQUIREMENTS: NONE * * * * EXIT CONDITIONS: A - HEX DIGIT OR NON-HEX * * C - Z FLAG SET IF A NOT HEX * * ALL OTHER REGS PRESERVED * * * ************************************************* INHEX BSR INCHR GET A CHARACTER PSHS A SAVE IT SUBA #$30 CONVERT TO BINARY BMI INHEX2 GO IF NOT A NUMBER CMPA #$09 GREATER THAN 9? BLS INHEX1 GO IF NOT SUBA #$07 CONVERT LETTER CMPA #$0A LEGAL VALUE? BLO INHEX2 GO IF NOT INHEX1 CMPA #$0F GREATER THAN 15? BLS INHEX3 GO IF NOT INHEX2 LDA ,S GET ORIGINAL CHAR BACK INHEX3 CMPA ,S+ SET/RESET Z FLAG RTS ************************************************* * CONSOLE INPUT ROUTINE * * * * ENTRY REQUIREMENTS: NONE * * * * EXIT CONDITIONS: A - CHARACTER WITH PARITY * * REMOVED * * ALL OTHER REGS PRESERVED * * EXCEPT C * * * ************************************************* INCHR PSHS B,X SAVE REGISTERS LDX CIDCB POINT TO INPUT DCB LDB #READFN SET UP FOR READ BSR REQIO READ A CHARACTER ANDA #$7F REMOVE PARITY LDX CEDCB POINT TO ECHO DCB PSHS A SAVE CHARACTER BNE OUTCH1 GO IF ECHO PULS A,B,X,PC RESTORE & RETURN ************************************************* * CONSOLE OUTPUT ROUTINE * * * * ENTRY REQUIREMENTS: A - CHARACTER TO BE * * OUTPUT TO CONSOLE * * * * EXIT CONDITIONS: ALL REGISTERS PRESERVED * * EXCEPT C * * * ************************************************* OUTCHR PSHS A,B,X SAVE REGISTERS LDX CODCB POINT TO OUTPUT DCB OUTCH1 LDB #WRITFN SET FUNCTION BSR REQIO OUTPUT THE CHARACTER PULS A,B,X,PC RESTORE REGISTERS & RETURN ************************************************* * PERFORM I/O REQUESTS * * * * ENTRY REQUIREMENTS: A - DRIVER PARAMETER * * B - FUNCTION CODE * * X - DCB ADDRESS * * * * EXIT CONDITIONS: A - DRIVER RESULT * * ALL OTHERS PRESERVED * * EXCEPT C * * * ************************************************* REQIO PSHS B,DP,X,Y,U SAVE REGISTERS JSR [DCBDVR,X] CALL DRIVER PULS B,DP,X,Y,U,PC RESTORE REGISTERS & EXIT ************************************************* * DISPLAY DOUBLE BYTE * * * * ENTRY REQUIREMENTS: A,B - DOUBLE BYTE * * TO BE PRINTED * * * * EXIT CONDITIONS: ALL REGISTERS PRESERVED * * EXCEPT C * * * ************************************************* DSPDBY BSR OUTHEX DISPLAY A AS 2 HEX DIGITS EXG A,B LS BYTE TO A BSR DSPSBY DISPLAY AS 2 DIGITS, SPACE EXG A,B RESTORE A & B RTS ************************************************* * DISPLAY A BYTE AND SPACE * * * * ENTRY REQUIREMENTS: A - BYTE TO BE DISPLAYED * * * * EXIT CONDITIONS: ALL REGISTERS PRESERVED * * EXCEPT C * * * ************************************************* DSPSBY BSR OUTHEX DISPLAY BYTE IN A ************************************************* * OUTPUT A SPACE TO THE CONSOLE * * * * ENTRY REQUIREMENTS: NONE * * * * EXIT CONDITIONS: ALL REGISTERS PRESERVED * * EXCEPT C * * * ************************************************* OUTSP PSHS A SAVE A REGISTER LDA #SP OUTPUT A SPACE ************************************************* * OUTPUT CHARACTER, RESTORE A, & RETURN * ************************************************* OUTCHX BSR OUTCHR DISPLAY CHARACTER PULS A,PC RESTORE & EXIT ************************************************* * DISPLAY A REGISTER AS 2 HEX DIGITS * * * * ENTRY REQUIREMENTS: A - BYTE TO DISPLAY * * * * EXIT CONDITIONS: ALL REGISTERS PRESERVED * * EXCEPT C * * * ************************************************* OUTHEX PSHS A SAVE THE BYTE LSRA LSRA LSRA LSRA BSR OUTDIG DISPLAY IT LDA ,S GET LS DIGIT BSR OUTDIG DISPLAY IT PULS A,PC RESTORE A & RETURN ************************************************* * DISPLAY A HEX DIGIT * ************************************************* OUTDIG ANDA #$0F MASK OFF DIGIT ADDA #$30 CONVERT TO ASCII CMPA #$39 BIGGER THAN 9? BLS OUTCHR GO IF NOT ADDA #$07 CONVERT TO LETTER BRA OUTCHR PRINT AND EXIT ************************************************* * PRINT A STRING TO THE CONSOLE * * * * ENTRY CONDITIONS: X - POINTS TO STRING * * LAST BYTE HAS BIT 7 ON * * * * EXIT CONDITIONS: X - POINTS 1 BYTE PAST END * * A,C - CHANGED * * * ************************************************* PSTRNG LDA ,X GET A CHARACTER ANDA #$7F MASK OFF BSR OUTCHR DISPLAY IT TST ,X+ WAS IT LAST? BPL PSTRNG LOOP IF NOT RTS ************************************************* * PRINT CR/LF ON CONSOLE * * * * ENTRY REQUIREMENTS: NONE * * * * EXIT CONDITIONS: ALL REGISTERS PRESERVED * * EXCEPT C * * * ************************************************* CRLF PSHS A SAVE A REGISTER LDA #CR OUTPUT CR BSR OUTCHR LDA #LF OUTPUT LF & EXIT BRA OUTCHX ************************************************* * SAVE PROGRAM ON TAPE * ************************************************* TSAVE BSR GETHX GET START ADDRESS BEQ TSAVE2 GO IF NONE STX BEGADD SAVE START BSR GETHX GET END ADDRESS BNE TSAVE1 GO IF ENTERED LDX BEGADD DUPLICATE ADDRESS INCB SET ADDRESS INDICATOR TSAVE1 STX ENDADD SAVE END TSAVE2 LDX CODCB SAVE CONSOLE DCB PSHS A,X SAVE TERMINATOR TOO LDX TPDCB SET UP FOR TAPE STX CODCB TSTB ANY ADDRESS ENTERED? BEQ TSAVE3 GO IF NOT BSR SAVE SAVE THE PROGRAM TSAVE3 PULS A GET TERMINATOR CMPA #CR WAS IT RETURN? BNE TSAVE4 GO IF NOT LDB #'9 OUTPUT S9 RECORD BSR OUTSN TSAVE4 PULS X RESTORE DCB POINTER STX CODCB RTS ************************************************* * GET HEX NUMBER IN X * ************************************************* GETHX JMP GETHEX RELATIVE BRANCH BOOSTER ************************************************* * SAVE A PROGRAM IN HEX * * * * ENTRY REQUIREMENTS: SAVE ADDRESSES ARE IN * * BEGADDR & ENDADDR * * * * EXIT CONDITIONS: ALL REGISTERS CHANGED * * * ************************************************* SAVE LDX BEGADD POINT AT FIRST BYTE SAVE1 LDB #'1 BEGIN NEW S1 RECORD BSR OUTSN CLR CKSUM INIT CHECKSUM LDD ENDADD CALCULATE BYTES TO SAVE PSHS X SUBD ,S++ TSTA GREATER THAN 255? BNE SAVE2 GO IF YES CMPB #16 LESS THAN FULL RECORD? BLO SAVE3 GO IF YES SAVE2 LDB #15 SET FULL RECORD SIZE SAVE3 INCB CORRECT RECORD SIZE TFR B,A OUTPUT RECORD SIZE ADDA #3 ADJUST FOR ADDRESS,COUNT BSR OUTBYT PSHS X ADDRESS TO STACK PULS A OUTPUT ADDRESS HI BSR OUTBYT PULS A OUTPUT ADDRESS LO BSR OUTBYT SAVE4 LDA ,X+ SAVE A DATA BYTE BSR OUTBYT DECB LOOP UNTIL 0 BNE SAVE4 LDA CKSUM GET CHECKSUM COMA COMPLIMENT IT BSR OUTBYT OUTPUT IT LEAY -1,X CHECK FOR END CMPY ENDADD BNE SAVE1 LOOP IF NOT RTS ************************************************* * OUTPUT BYTE AS HEX AND ADD TO CHECKSUM * ************************************************* OUTBYT JSR OUTHEX OUTPUT BYTE AS HEX ADDA CKSUM ADD TO CHECKSUM STA CKSUM RTS ************************************************* * OUTPUT 'S' TAPE RECORD HEADERS * ************************************************* OUTSN JSR CRLF BEGIN NEW LINE LDA #'S OUTPUT 'S' HEADER BSR OUTC TFR B,A RECORD TYPE TO A ************************************************* * OUTPUT CHARACTER TO CONSOLE * ************************************************* OUTC JMP OUTCHR RELATIVE BRANCH BOOSTER ************************************************* * MEMORY EXAMINE AND CHANGE * ************************************************* MEMEC BSR GETHX GET ADDRESS BNE MEMEC1 GO IF GOOD LDX MEMPTR USE PREVIOUS MEMEC1 STX MEMPTR UPDATE RAM POINTER JSR CRLF BEGIN NEW LINE TFR X,D DISPLAY ADDRESS JSR DSPDBY LDA ,X+ GET CONTENTS JSR DSPSBY DISPLAY THEM TFR X,Y SAVE ADDRESS IN Y BSR GETHX GET CHANGE DATA EXG D,X SAVE DELIM, GET NEW BEQ MEMEC2 GO IF NO CHANGE STB -1,Y UPDATE MEMORY CMPB -1,Y VERIFY GOOD STORE BEQ MEMEC2 GO IF NO CHANGE JSR ERROR DISPLAY ERROR MEMEC2 TFR X,D GET DELIMITER IN A TFR Y,X GET NEXT ADDRESS IN X CMPA #CR END OF UPDATE? BEQ MEMEC3 GO IF YES CMPA #'^ BACKING UP? BNE MEMEC1 LOOP IF NOT LEAX ,--X BACK UP 2 BRA MEMEC1 CONTINUE MEMEC3 RTS ************************************************* * GO TO ADDRESS * ************************************************* GO LDS STKPTR SET UP STACK JSR GETHEX GET TARGET ADDRESS BEQ GO1 GO IF NONE STX 10,S STORE IN PC ON STACK GO1 LDA ,S SET 'E' FLAG IN CC ORA #$80 STA ,S INTRET RTI LOAD REGISTERS AND GO ************************************************* * BREAKPOINT (SOFTWARE INTERRUPT) TRAP * ************************************************* BRKPNT LDX 10,S GET PROGRAM COUNTER LEAX -1,X DECREMENT BY 1 STX 10,S REPLACE ON STACK LDB #$FF FLAG FOR SINGLE REMOVAL JSR REMBK REMOVE BREAKPOINT ************************************************* * INTERRUPT (HARDWARE/SOFTWARE) TRAP * ************************************************* TRAP STS STKPTR SAVE STACK POINTER JSR CRLF BEGIN NEW LINE BSR REGDMP DUMP REGISTERS JMP GETCMD GET NEXT COMMAND ************************************************* * REGISTER EXAMINE AND CHANGE * ************************************************* REGEC JSR INCHR GET REGISTER TO EXAMINE JSR CRLF BEGIN NEW LINE CLRB CLEAR OFFSET COUNT LDX #REGIDS POINT TO REGISTER ID STRING REGEC1 CMPA B,X CHECK REGISTER NAME BEQ REGEC2 GO IF FOUND INCB ADVANCE COUNTER CMPB #11 END OF LIST? BLS REGEC1 LOOP IF NOT BRA REGDMP BAD ID - DUMP ALL REGEC2 PSHS B SAVE OFFSET BSR RDUMP DISPLAY THE REG & CONTENTS JSR GETHEX GET NEW VALUE PULS B RESTORE OFFSET BEQ REGECX GO IF NO CHANGE LEAY B,Y POINT TO REG ON STACK CMPB #3 SINGLE BYTE REG? TFR X,D GET NEW DATA IN A,B BLS REGEC3 GO IF SINGLE STA ,Y+ STORE MS BYTE REGEC3 STB ,Y STORE LS BYTE REGECX RTS REGIDS FCC 'CABDXXYYUUPP' ************************************************* * COMPLETE REGISTER DUMP * ************************************************* REGDMP LDX #REGIDS POINT TO ID STRING CLRB CLEAR OFFSET COUNTER RGDMP1 LDA B,X GET REG NAME BSR RDUMP DISPLAY IT INCB BUMP TO NEXT REG CMPB #11 ALL PRINTED? BLS RGDMP1 LOOP IF NOT LDA #'S DISPLAY STACK ID BSR DSPID LDY #STKPTR-12 Y+B=>STKPTR BRA RDUMP1 ************************************************* * DISPLAY REGISTER CONTENTS * ************************************************* RDUMP BSR DSPID DISPLAY REGISTER ID LDY STKPTR POINT Y AT STACK CMPB #3 SINGLE BYTE REG? BLS RDUMP2 GO IF YES RDUMP1 LDA B,Y DISPLAY MS BYTE JSR OUTHEX INCB ADVANCE OFFSET RDUMP2 LDA B,Y DISPLAY A BYTE JMP DSPSBY ************************************************* * DISPLAY REGISTER ID * ************************************************* DSPID BSR OUTCH DISPLAY REG NAME LDA #'= DISPLAY '=' ************************************************* * OUTPUT CHARACTER TO CONSOLE * ************************************************* OUTCH JMP OUTCHR RELATIVE BRANCH BOOSTER ************************************************* * SET A BREAKPOINT * ************************************************* SETBK JSR GETHEX GET ADDRESS BEQ DSPBK GO IF NONE ENTERED BSR INITBP POINT Y AT BP TABLE SETBK1 LDD ,Y EMPTY SLOT? BEQ SETBK2 GO IF YES BSR NEXTBP ADVANCE TO NEXT SLOT BNE SETBK1 LOOP IF NOT END BRA DSPBK EXIT SETBK2 STX ,Y SAVE ADDRESS BEQ DSPBK GO IF ADDRESS = 0 LDA ,X GET CONTENTS STA 2,Y SAVE IN TABLE LDA #$3F SWI OP CODE STA ,X SET BREAK ************************************************* * DISPLAY ALL BREAKPOINTS * ************************************************* DSPBK JSR CRLF BEGIN NEW LINE BSR INITBP POINT Y AT BP TABLE DSPBK1 LDD ,Y GET ADDRESS OF BP BEQ DSPBK2 GO IF INACTIVE JSR DSPDBY DISPLAY ADDRESS DSPBK2 BSR NEXTBP ADVANCE POINTER BNE DSPBK1 LOOP IF NOT END RTS ************************************************* * INITIALIZE BREAKPOINT TABLE POINTER * ************************************************* INITBP LDY #BPTABL POINT Y AT BP TABLE RTS ************************************************* * ADVANCE BREAKPOINT TABLE POINTER * ************************************************* NEXTBP LEAY 3,Y ADVANCE TO NEXT ENTRY CMPY #BPTEND CHECK FOR END OF TABLE RTS ************************************************* * UNSET A BREAKPOINT * ************************************************* UNSBK JSR GETHEX GET ADDRESS ************************************************* * REMOVE ONE OR MORE BREAKPOINTS * ************************************************* REMBK BSR INITBP POINT Y AT BP TABLE REMBK1 TSTB REMOVE ALL? BEQ REMBK2 GO IF YES CMPX ,Y FIND ADDRESS? BEQ UNSET GO IF YES BRA REMBK3 LOOP IF NO REMBK2 BSR UNSET UNSET IT REMBK3 BSR NEXTBP ADVANCE POINTER BNE REMBK1 LOOP IF NOT END RTS ************************************************* * REMOVE A BREAKPOINT * ************************************************* UNSET LDX ,Y GET ADDRESS OF BP BEQ UNSET1 GO IF INACTIVE LDA 2,Y GET CONTENTS STA ,X REPLACE BP CLR 0,Y MARK BP INACTIVE CLR 1,Y UNSET1 RTS ************************************************* * TERMINAL DRIVER (ACIA) * ************************************************* TERMDR CLR DCBERR,X NO ERRORS POSSIBLE LDX DCBIOA,X GET I/O ADDRESS LSRB READ FUNCTION? BCS TERMRD GO IF YES LSRB WRITE FUNCTION? BCS TERMWT GO IF YES LSRB STATUS FUNCTION? BCS TERMST GO IF YES LSRB CONTROL FUNCTION? BCC TERM1 GO IF NOT STA ,X STORE CONTROL CODE TERM1 RTS TERMRD LDB ,X GET STATUS LSRB INPUT BIT TO C BCC TERMRD LOOP IF NO INPUT LDA 1,X GET CHARACTER RTS TERMWT LDB ,X GET STATUS BITB #2 READY FOR OUTPUT? BEQ TERMWT LOOP IF NOT STA 1,X OUTPUT CHARACTER RTS TERMST LDA ,X GET STATUS ANDA #3 MASK OFF READY BITS RTS ************************************************* * INTERRUPT HANDLERS * ************************************************* SWI3 JMP [SWI3V] SOFTWARE INTERRUPT 3 SWI2 JMP [SWI2V] SOFTWARE INTERRUPT 2 FIRQ JMP [FIRQV] FAST INTERRUPT REQUEST IRQ JMP [IRQV] INTERRUPT REQUEST SWI JMP [SWIV] SOFTWARE INTERRUPT NMI JMP [NMIV] NON-MASKABLE INTERRUPT ************************************************* * PSYMON COMMAND TABLE * ************************************************* CMDTBL FCB 1 ITEM LENGTH FCB 'M MEMORY EXAMINE/CHANGE FDB MEMEC FCB 'G GOTO ADDRESS FDB GO FCB 'L PROGRAM LOAD FDB TLOAD FCB 'S PROGRAM SAVE FDB TSAVE FCB 'R REGISTER EXAMINE/CHANGE FDB REGEC FCB 'B SET/PRINT BREAKPOINTS FDB SETBK FCB 'U UNSET BREAKPOINTS FDB UNSBK FCB $FF END SENTINEL ************************************************* * RAM INITIALIZATION DATA * ************************************************* RAMINT FCC 'CN' CONSOLE DCB ID FDB TERMDR CONSOLE DRIVER FDB TERMNL CONSOLE I/O ADDRESS FDB 0 ERROR STATUS, EXT FDB CONDCB DCB CHAIN POINTER FDB CONDCB DCB POINTERS FDB CONDCB FDB CONDCB FDB CONDCB FDB TRAP INTERRUPT VECTORS FDB TRAP FDB INTRET FDB TRAP FDB BRKPNT FDB TRAP FDB FREE FCB $FF,$FF,$FF,$FF RESERVED SPACE ************************************************* * SOFTWARE VECTORS * ************************************************* FDB RAM BASE OF PSYMON RAM FDB DSPSBY DISPLAY SINGLE BYTE ON CONSOLE FDB DSPDBY DISPLAY DOUBLE BYTE ON CONSOLE FDB GETHEX GET HEX NUMBER FROM CONSOLE FDB PSTRNG PRINT STRING TO CONSOLE FDB INCHR INPUT CHARACTER FROM CONSOLE FDB OUTCHR OUTPUT CHARACTER TO CONSOLE FDB REQIO PERFORM I/O REQUEST FDB MONENT MONITOR RE-ENTRY ************************************************* * HARDWARE VECTORS * ************************************************* FDB INIT RESERVED BY MOTOROLA FDB SWI3 SOFTWARE INTERRUPT 3 FDB SWI2 SOFTWARE INTERRUPT 2 FDB FIRQ FAST INTERRUPT REQUEST FDB IRQ INTERRUPT REQUEST FDB SWI SOFTWARE INTERRUPT FDB NMI NON-MASKABLE INTERRUPT FDB INIT RESTART END