JBUG Monitor V1.8ΒΆ

nosearch:

       NAM    JBUG
* REV 1.8  9-6-76
*
*A MONITOR PROGRAM WITH AN INTERNAL KEYBOARD/DISPLAY
*
* ASSEMBLED ON THE EXORCISER FOR MOTOROLA
* INC. -- FALL OF 76
*
* COPYRIGHT 1976 BY MOTOROLA SPG
*
       OPT    S,O      SYMBOL TABLE;OBJECT TAPE
*
*
*
**COMMAND SYMBOLS
****P - PUNCH DESIGNATED MEMORY TO AUDIO CASSETTE
****L - LOAD AUDIO CASSETTE TO MEMORY
****N - TRACE ONE INSTRUCTION
*        USES NMI INTERUPT
*        N CLEARS ANY BRKPTS IF SET
*        SINCE TRACE USES HARDWARE IT CAN
*        TRACE THRU ROM AND INTERRUPTS
****V - SET AND CLEAR BREAKPOINTS (FIVE ALLOWED)
*        IF THE ADDRESS NOT= ZERO THEN A BRKPT
*        IS INSERTED AT THE ADDRESS. IF THE
*        ADDRESS = 0 THEN ALL 5 BRKPTS ARE CLEARED.
****M - MEMORY EXAMINE AND CHANGE
****E - ESCAPE (ABORT)
****R - REGISTER DISPLAY
*        ORDER OF DISPLAY IS: PC,X,A,B,CC,SP
****G - GO TO USERS PROGRAM/ADVANCE/PROCEED.
*        IF ADDRESS NOT = 0 SET USER'S PC TO
*        NEW VALUE AND GO TO USER'S PROGRAM.
*        IF ADDRESS=0 THEN RETURN TO PROGRAM AT
*        PREVIOUS LOCATION (PROCEED MODE).
*        IF IN R,G MEANS ADVANCE TO NEXT REGISTER.
*        IF IN M,G MEANS ADVANCE TO NEXT MEMORY.
*
*
****************************************************
**CONTROL STACK AT $A078**
** RAM STARTS AT $A000
** ROM IS AT LOCATIONS $E000-$E3FF
** ACIA IS AT $8008-8009
** PIA IS AT $8020-8023
****************************************************
****************************************************
*
* THE RESTART ENTRY IS AT LABEL 'RESTAR' AT
* LOCATION $E08D.
*
****************************************************
       PAGE
        ORG    $E000
*
****ROUTINE TO CALCULATE OFFSETS****
***SETUP STACK AS FOLLOWS:
*   B-REG (SP+2) = HIGH BYTE OF DESTINATION ADDR
*   A-REG (SP+3) = LOW BYTE OF DEST ADDR
*   X-REG (SP+4,5) = ADDR OF OPCODE OF BRANCH
*                    INSTRUCTION
       INX
       STX    BPADR    ;STORE OFFSET ADDR
       INX
       STX    TEMP1    ;ADDR OF NEXT OP CODE
       SUBA   TEMP1+1  ;LOW BYTES
       SBCB   TEMP1    ;HIGH BYTES
       LDX    BPADR    ;GET OFFSET ADDR
       STAA   0,X      ;CHANGE OFFSET
       SWI             ;STACK AND DISPLAY
***REGISTERS ON STACK CONTAIN THE FOLLOWING:
*****INDEX - ADDR OF OFFSET BYTE THAT WAS CHANGED
*****A ACCM - VALUE OF OFFSET
*****B ACCM - 00 - FORWARD BRANCH WITHIN RANGE
*****         FF - REVERSE BRANCH WITHIN RANGE
*****         -ANY OTHER VALUE IMPLIES A BRANCH
*****          OUT OF RANGE.
****************************************************
*
* HERE ON IRQ INTERUPT
*
****IRQ INTERRUPT SERVICE****
IO     LDX    IOV      ;PICK UP PSEUDO VECTOR
       JMP    0,X      ;GO TO IT
*
* HERE ON NMI INTERUPT
*    MAY BE TRACE OR A TRACE TO PROCEED
*    OR A KEYBOARD INTERUPT.
*
****NMI INTERRUPT SERVICE****
NONMSK STS    SP       ;SAVE USER'S STACK PTR
       BSR    DISNMI   ;DISABLE NMI INTERUPTS
       TST    NFLAG    ;TRACE MODE?
       BEQ    NONMK1   ;NO
TNM1   CLR    NFLAG    ;RESET FLAG
       BSR    GETXB    ;GET TAB ADDR AND VFLAG
       BEQ    TDISP    ;NO BP, DISPLAY REGS
       JMP    TGB      ;BP ACTIVE
* MUST BE KEYBOARD INTERUPT
NONMK1 LDX    NIO
       JMP    0,X      ;DECODE KEYBOARD
*
* HERE ON SOFTWARE INTERUPT
*    USUALLY A BREAKPOINT
*
****SWI SERVICE ROUTINE****
SWIR   STS    SP       ;SAVE USER'S SP
       BSR    DISNMI   ;DISABLE NMI INTERRUPTS
       TSX             ;DECR PC BY 1
       TST    6,X      ;BACKUP PC ON STACK
       BNE    *+4
       DEC    5,X
       DEC    6,X
       BSR    GETXB    ;GET TAB ADDR AND VFLAG
       BEQ    TDISP    ;NO BRKPTS, GO DISPLAY REGS
*
* REMOVE BRKPTS WHILE WE ARE IN JBUG. THEY
* WILL BE RESTORED ON A GO OR PROCEED
*
******HERE TO REMOVE BREAKPOINTS******
TZONK  STX    BPADR    ;SAVE IN TEMP
       LDAA   2,X      ;GET OP CODE TO RESTORE
* SAFEGUARD AGAINST MULTI DEFINED BRKPTS
*     
       CMPA   #$3F
       BEQ    GENA     ;BRANCH IF MULTI-DEF
       LDX    0,X      ;GET ADDR OF BKPT
       STAA   0,X      ;RESTORE OP CODE
       LDX    BPADR    ;GET TABLE POSITION
GENA   BSR    ADD3X    ;GET NEXT POSITION AND DECB
       BNE    TZONK    ;GO AGAIN
TDISP  STS    SP       ;SAVE USER'S STACK POINTER
       JMP    KEYDCE   ;GO DISPLAY REGS
*
****SUBROUTINE TO GET NEXT TABLE ENTRY
*
ADD3X  INX
       INX
       INX
       DECB            ;DEC CTR
       RTS             ;LET CALLED DO CTR CHECK
*
****SUB TO GET TABLE ADDR IN X VFLAG IN B
*
GETXB  LDX    #BPTAB   ;GET TABLE BASE ADDR
       LDAB   VFLAG
       RTS
*
**SUBROUTINE TO SET A BREAKPOINT (MAKE AN
****ENTRY INTO BREAKPOINT TABLE) IF ENOUGH
****SPACE EXISTS
*   THE ACTUAL BRKPTS ARE PUT IN MEMORY
*   ON THE 'G' COMMAND
*
SETBR  BSR    GETXB    ;GET TAB ADDR AND VFLAG
       BEQ    TZOT     ;NO BKPTS, GO INSERT ONE
       CMPB   #$5      ;ENOUGH ROOM?
       BGE    CLRDS    ;NO, CLEAR DISPLAY AND RTS
******GET TO FIRST FREE SPACE IN TABLE******
TPIG   BSR    ADD3X    ;ADD 3 TO X AND DECB
       BNE    TPIG     ;BRANCH IF NOT DONE
******INSERT NEW BKPT IN TABLE*****
TZOT   INC    VFLAG    ;INCR FLAG
       LDAA   BPADR    ;INSERT IN TABLE
       STAA   0,X
       LDAA   BPADR+1
       STAA   1,X
       RTS
*
****SUBROUTINE TO DISABLE NMI INTERRUPTS****
*
DISNMI LDAA   #$3C
       STAA   DISCTR   ;INTR MASKED CA1 ACTIVE LOW
       STAA   SCNCTR   ;INTR MASKED CB1 ACTIVE LOW
       RTS
*
*
****RESTART ROUTINE****
*
*
RESTAR LDS    #$A078
       STS    SP       ;INITALIZE STACK POINTER
       LDX    #KEYDC   ;GO DECODE KEYBOARD
       STX    NIO      ;INITALIZE NMI INTERRUPT
*INITALIZE KEYBOARD/DISPLAY PIA
       LDAA   #$FF
       STAA   SCNREG   ;PBO-PB7 OUTPUTS
       LSRA 
       STAA   DISREG   ;PA0-PA6 OUTPUTS,PA7 INPUT
       BSR    DISNMI   ;DISABLE KEYBOARD/TRACE
**INITALIZE ACIA**
       LDAA   #3
       STAA   ACIAS    ;RESET THE ACIA
       CLR    VFLAG    ;INITALIZE VFLAG
INIT   BSR    CLFLG    ;CLEAR DISPLAY AND FLAGS
       BSR    HDR      ;WRITE PROMPT "-"
       BRA    OUTDS
*
****SUBROUTINE TO CLEAR DISPLAY BUFFER AND FLAGS****
*
CLFLG  LDX    #DIGIN4
       CLRA            ;CLEARS DIGIN4 AND DIGIN8
CLFLG1 STAA   0,X      ;CLEARS MFLAG AND RFLAG
       INX             ;CLEARS NFLAG AND TEMP2
       CPX    #DIGIN4+6  ;END?
       BNE    CLFLG1   ;NO LOOP BACK
       LDX    #DISBUF
       STX    XKEYBF   ;INITALIZE XKEYBF
CLRDS  LDAA   #$7F
       STAA   DISREG   ;BLANK DISPLAY
       LDAA   #17
       LDX    #DISBUF
CLRDS1 STAA   0,X      ;CLEAR OUT DISPLAY BUFFER
       INX
       CPX    #DISBUF+8  ;END?
       BNE    CLRDS1
       RTS
*
*SUBROUTINE TO WRITE PROMPT ON DISPLAY
*
HDR    LDAA   #16
       STAA   DISBUF   ;OUTPUT -
       RTS
*
*SUBROUTINE TO DELAY 20 MS OR X MS
*   WHEN ENTERING AT DLY1 THE XREG MUST CONTAIN
*   THE DESIRED DELAY CT (APX 13USEC/COUNT)
*
DLY20  LDX    #$0600
DLY1   DEX
       BNE    DLY1
       RTS
*
****SUBROUTINE TO BUILD TWO BYTE ADDRESS FROM
******FIRST LOCATIONS OF DISBUF
*   ADDRESS IS IN X-REG AND 'BPADR' ON EXIT
*
BLDX   LDX    #DISBUF
       LDAA   0,X      ;GET FIRST BYTE
       ASLA 
       ASLA 
       ASLA 
       ASLA            ;MOVE TO HIGH NIBBLE
       ORAA   1,X      ;OR WITH LOW NIBBLE
       STAA   BPADR-DISBUF,X  ;STORE IN BPADR
       LDAA   2,X      ;GET SECOND BYTE
       ASLA 
       ASLA 
       ASLA 
       ASLA            ;MOVE TO HIGH NIBBLE
       ORAA   3,X      ;OR WITH LOW NIBBLE
       STAA   BPADR+1-DISBUF,X  ;STORE IN BPADR+1
       LDX    BPADR-DISBUF,X  ;ADDRESS TO XREG
       RTS
*
*
****ROUTINE TO DISPLAY 6 DIGITS IN DISBUF
*
*
OUTDS  LDX    #DISBUF  ;GET STARTING ADDRESS
OUTDS1 LDAA   0,X      ;GET FIRST DIGIT
       INCA 
       INX
       STX    XDSBUF   ;SAVE POINTER
       LDX    #DIGTBL-1
OUTDS2 INX
       DECA            ;POINT TO PATTERN
       BNE    OUTDS2
       CLR    SCNREG   ;BLANK DISPLAY
       LDAA   0,X      ;GET PATTERN
       STAA   DISREG   ;SET UP SEGMENTS
       LDAA   SCNCNT
       STAA   SCNREG   ;SELECT DIGIT
       LDX    #$4D     ;SETUP FOR 1MS DELAY
       BSR    DLY1     ;DELAY 1 MS
       LDX    XDSBUF   ;RECOVER POINTER
       CPX    #DISBUF+6
       BEQ    OUTDS3
       LSR    SCNCNT   ;NO,MOVE TO NEXT DIGIT
       BRA    OUTDS1
*
****SUBROUTINE TO SCAN KEYBOARD****
*
KEYCL  LDAA   #$FF
       LDX    #DISREG
       STAA   0,X      ;BLANK DISPLAY
       LDAA   #$3F
       STAA   2,X      ;ALL ROWS LOW
KEYCL1 LDAA   2,X
       TST    0,X
       BPL    KEYCL2   ;KEY DOWN?
       ADDA   #64
       STAA   2,X      ;SELECT NEXT COLUMN
       ANDA   #$C0
       BNE    KEYCL1   ;LAST COLUMN SCANNED?
KEYCL2 RTS             ;NO KEY FOUND
OUTDS3 LDAA   #$20
       STAA   SCNCNT   ;INITALIZE SCNCNT
*
****ROUTINE TO SCAN AND DECODE KEYBOARD****
*
KEYDC  BSR    KEYCL
       BEQ    OUTDS    ;NO KEY CLOSED
       BSR    DLY20
       LDX    #DISREG  ;RESTORE X
       LDAA   #$01     ;SETUP SCAN FOR FIRST ROW
       STAA   2,X
KEYDC1 BSR    KEYCL1   ;SCAN KEYBOARD,GET KEY
       BNE    KEYDC2   ;KEY FOUND
       LDAA   2,X      ;CLEARS NMI INTERRUPT
       CMPA   #$20
       BEQ    OUTDS    ;LAST ROW
       ASL    2,X      ;SHIFT LEFT
       BRA    KEYDC1
KEYDC2 CLRB            ;INITIALIZE COUNTER
       LDX    #KEYTBL
KEYDC3 CMPA   0,X      ;SEARCH TABLE
       BEQ    KEYDC4
       CPX    #KEYTBL+24  ;END OF TABLE?
       BEQ    KEYD0F   ;NO KEY FOUND IN TABLE
       INX
       INCB            ;ADVANCE
       BRA    KEYDC3
KEYDC4 BSR    KEYCL    ;WAIT FOR KEY RELEASE
       BNE    KEYDC4
       JSR    DLY20    ;DELAY 20 MSEC
       CMPB   #$0F
       BGT    KEYDC5
       LDX    XKEYBF   ;POINTER IN DISBUF
       STAB   0,X      ;STORE KEY VALUE
       CPX    #DISBUF+3  ;4 DIGITS IN?
       BNE    KEYDC7   ;NO
       INC    DIGIN4   ;YES
KEYDC6 INX
       STX    XKEYBF
       BRA    KEYD0F
KEYDC7 CPX    #DISBUF+7  ;8 DIGITS IN?
       BNE    KEYDC6
       INC    DIGIN8   ;SET FLAG
       JSR    MDIS1    ;DISPLAY NEW DATA
       LDX    XKEYBF
       DEX             ;BACK UP POINTER
       STX    XKEYBF   ;SAVE
       BRA    KEYD0F
*
* HERE TO DISPATCH TO A KEYBOARD OPTION
**
*
KEYDC5 LDX    #JMPTAB-32
KYDC5  INX             ;GET TO ADDRESS IN JUMP TABLE
       INX
       DECB 
       BNE    KYDC5    ;THIS ONE?
       JMP    0,X      ;YES
JMPTAB BRA    KEYDC8   ;P KEY
       BRA    KEYDC9   ;L KEY
       BRA    KEYDCA   ;N KEY
       BRA    KEYDCB   ;V KEY
       BRA    KEYDCC   ;M KEY
       BRA    KEYDCD   ;E KEY
       BRA    KEYDCE   ;R KEY
       BRA    KEYDCF   ;G KEY
*
* HERE ON P KEY
*   PUNCH MEMORY TO AUDIO CASSETTE
*
KEYDC8 JSR    CLRDS    ;CLEAR DISPLAY
       JSR    PNCH     ;PUNCH DATA TO CASSETTE
       BRA    KEYDCH
*
* HERE ON L KEY
*   LOAD MEMORY FROM AUDIO CASSETTE 
*
KEYDC9 JSR    CLRDS    ;CLEAR DISPLAY
       JSR    LOAD     ;LOAD DATA FROM CASSETTE
KEYDCH JSR    HDR      ;WRITE HEADER
* RETURN TO DISPLAY HEADER
KEYD0F JMP    OUTDS    ;DISPLAY HEADER
*
* HERE ON N KEY
*   TRACE ONE INSTRUCTION
*
KEYDCA CLR    VFLAG
TRACE  INC    NFLAG
       LDAA   #$34     ;SET UP HARDWARE TO TRACE
       STAA   DISCTR   ;CA2 LOW START TRACE
       RTI
*
* HERE ON V KEY
*   IF ADDRESS HAS 4 DIGITS INSERT A BRKPT
*   AT ADDRESS OTHERWISE CLEAR ALL 5 BRKPTS
*
KEYDCB TST    DIGIN4   ;4 DIGITS IN?
       BNE    *+7      ;YES, INSERT BP
       CLR    VFLAG
       BRA    KEYD0F   ;GO DISPLAY
       BSR    KEYD3F   ;YES, INSERT BREAKPOINT
       JSR    SETBR
       BRA    KEYD0F
*
* HERE ON M KEY
*   DISPLAY MEMORY CONTENTS
*
KEYDCC INC    MFLAG    ;SET FLAG
       TST    DIGIN4   ;4 DIGITS IN?
       BEQ    KEYD0F   ;NO
       BSR    MDIS     ;YES,DISPLAY MEMORY
       BRA    KEYD0F
*
* HERE ON E KEY
*   ESCAPE (ABORT) USER PGM
*
KEYDCD JMP    INIT     ;CLEAR DISPLAY AND FLAGS
*
* HERE ON R KEY
*   DISPLAY USER REGISTERS
*
KEYDCE INC    RFLAG    ;REGISTER DISPLAY
       JSR    REGST
* MUTUAL RETURN TO DISPLAY
KEYDCG BRA    KEYD0F
*
* HERE ON G KEY
*   IF IN 'M' DISPLAY NEXT MEMORY LOCATION
*   IF IN 'R' DISPLAY NEXT REGISTER
*   IF 4 DIGIT ADDRESS WAS PUNCHED GO TO
*      ADDRESS IN USER PROGRAM
*   IF 4 DIGITS WEREN'T INPUT RETURN TO USERS
*      PGM AT CURRENT USER PC (PROCEED)
*
KEYDCF TST    MFLAG    ;MEMORY MODE?
       BNE    KEYD1F   ;YES
       TST    RFLAG
       BNE    KEYD2F
* IS IT A 'GO' OR 'PROCEED'?
       TST    DIGIN4   ;4 DIGITS IN?
       BNE    KEYDCJ   ;NO, PROCEED MODE
* HERE ON PROCEED
       JSR    GETXB    ;GET ADDR AND VFLAG
       BEQ    TGC      ;BRANCH IF NO BREAKPOINTS
       BRA    TRACE    ;GO TRACE
* HERE ON GO MODE
KEYDCJ BSR    KEYD3F   ;GET ADDR
       TSX
       STAA   6,X      ;MODIFY LOW BYTE
       LDAB   BPADR    ;GET LOW BYTE
       STAB   5,X      ;MODIFY HIGH BYTE
       JSR    CLRDS    ;CLEAR DISPLAY
       JSR    GETXB    ;GET TAB ADDR&VFLAG
       BEQ    TGC      ;BRANCH IF NO  BP
****INSTALL ALL BREAKPOINTS****
TGB    STX    BPADR    ;SAVE IN TEMP
       LDX    0,X      ;GET ADDR OF BP
       LDAA   0,X      ;GET OP-CODE     
       PSHA            ;SAVE
       LDAA   #$3F     ;INSTALL A SWI
       STAA   0,X
       LDX    BPADR    ;GET BACK CURR TAB LOC
       PULA            ;GET BACK OP-CODE
       STAA   2,X      ;SAVE IT IN A TABLE
       JSR    ADD3X    ;GET NEXT TAB LOC
       BNE    TGB      ;MORE TO DO?
* PREPARE TO RETURN TO USER
TGC    LDAA   #$20
       STAA   SCNREG   ;SETUP FOR KB INTR
       LDAB   SCNREG   ;DUMMY READ TO CLEAR INTR
       LDAA   #$3D
       STAA   SCNCTR   ;ENABLE KB INTR
       RTI             ;BACK TO USER
* HERE TO DISPLAY NEXT ;MEM LOC
KEYD1F BSR    MINC     ;MEMORY INCREMENT
       BSR    MDIS0    ;MEMORY DISPLAY
       BRA    KEYDCG
* HERE ON DISPLAY NEXT REGISTER
KEYD2F JSR    REGST1   ;REGISTER DISPLAY
       BRA    KEYDCG
KEYD3F JMP    BLDX
**
*
**SUBROUTINE TO DISPLAY MEMORY AND CHANGE IT**
*
*
MDIS   LDX    XKEYBF
       INX
       INX
       STX    XKEYBF   ;UPDATE POINTER
MDIS0  BSR    KEYD3F   ;GET ADDR OF MEM LOCATION
       LDAA   0,X      ;GET MEMORY DATA
       BSR    MDIS2    ;FORMAT DATA
       STAA   DISBUF+4 ;STORE DATA IN DISBUF
       STAB   DISBUF+5
       RTS
*
* SUB TO PUT NEW DATA IN MEMORY AND DISPLAY IT
*
MDIS1  LDAB   DISBUF+6 ;GET NEW DATA
       ASLB 
       ASLB 
       ASLB 
       ASLB            ;DATA TO HIGH NIBBLE
       ORAB   DISBUF+7 ;OR WITH LOW NIBBLE
       BSR    KEYD3F   ;GET MEMORY ADDR AGAIN
       STAB   0,X      ;STORE NEW DATA
       LDAA   0,X      ;ACTUAL DATA IN MEMORY
       BSR    MDIS2    ;FORMAT
       STAA   DISBUF+4 ;ACTUAL DATA TO DISPLAY
       STAB   DISBUF+5
       CLR    DIGIN8   ;SETUP FOR NEW DATA ENTRY
       RTS
*
**SUBROUTINE TO MOVE LOW NIBBLE OF A TO B AND TO
****MOVE HIGH NIBBLE OF A TO LOW NIBBLE OF A
*
MDIS2  TAB
       ANDB   #$0F     ;MASK LOW NIBBLE
       ANDA   #$F0     ;MASK HIGH NIBBLE
       LSRA 
       LSRA 
       LSRA 
       LSRA            ;HIGN NIBBLE TO LOW NIBBLE
       RTS
*
* SUBROUTINE TO INC MEMORY DISPLAY AND CHG?
*
MINC   BSR    KEYD3F   ;GET MEMORY ADDRESS
       INX             ;SETUP FOR NEXT MEMORY LOC
       STX    TEMP1    ;SAVE
       LDAA   TEMP1    ;GET HIGH BYTE
       BSR    MDIS2    ;FORMAT FOR DISBUF
       LDX    #DISBUF
       STAA   0,X
       STAB   1,X      ;PUT IN DISPLAY BUFFER
       LDAA   TEMP1+1  ;GET LOW BYTE
       BSR    MDIS2    ;FORMAT
       STAA   2,X
       STAB   3,X
       INC    DIGIN4   ;FOUR DIGITS ENTERED
       INC    MFLAG    ;SETUP FOR MEMORY EXAMINE
       RTS
*
*
**SUBROUTINE TO DISPLAY REGISTERS ON USERS STACK
*
* ORDER OF DISPLAY IS: PC,X,A,B,CC,SP
*   TEMP2 STARTS AT -2 AND ADVANCES TO +3 AND
*   CORRESPONDS TO THE ORDER OF DISPLAY
*
REGST  LDAA   #$FE     ;INITIALIZE COUNTER
       STAA   TEMP2
       LDX    SP       ;GET USER'S SP
       LDAA   #$6
REGST0 INX             ;POINT TO TOP OF STACK
       DECA 
       BNE    REGST0
       STX    TEMP1    ;TEMP X LOCATION
REGST1 JSR    CLRDS    ;CLEAR DISPLAY
       LDX    TEMP1    ;RESTORE X
       LDAA   TEMP2
       BMI    REGST2   ;PC AND X REGS
       CMPA   #$3      ;IS IT SP?
       BEQ    REGST3   ;YES
       CMPA   #$4      ;ALL REGS OUT START OVER
       BEQ    REGST
       LDAA   0,X      ;OUTPUT A,B,CC
       BSR    REGST5   ;DISPLAY ONE BYTE
       BRA    REGST4   ;UPDATE COUNTER
REGST2 PSHA            ;SAVE A
       LDAA   0,X      ;GET HIGH BYTE
       BSR    REGST5   ;DISPLAY
       LDX    TEMP1
       LDAA   1,X      ;GET LOW BYTE
       BSR    REGST6   ;DISPLAY
       PULA            ;RESTORE A
       INCA            ;X REG? (A=0)
       BEQ    REGST4   ;YES
       BSR    REGST8   ;DEC POINTER
       JSR    MDIS0
       BRA    REGST4   ;UPDATE COUNTER
REGST3 LDAA   SP       ;SP TO DISPLAY
       BSR    REGST5   ;DISPLAY
       LDAA   SP+1
       BSR    REGST6
REGST4 INC    TEMP2    ;UPDATE COUNTER
REGST8 LDX    TEMP1    ;INCREMENT X
       DEX
       STX    TEMP1    ;SAVE X
       RTS
*
*SUBROUTINE TO MOVE TWO DIGITS IN A TO FIRST TWO
****LOCATIONS IN THE DISPLAY BUFFER (DISBUF)
*
REGST5 JSR    MDIS2    ;FORMAT
       LDX    #DISBUF
REGST7 STAA   0,X      ;FIRST DIGIT(OR THIRD)
       STAB   1,X      ;SECOND DIGHT
       RTS
*
**SUBROUTINE TO MOVE TWO DIGITS IN A TO SECOND TWO L
****LOCATIONS IN THE DISPLAY BUFFER (DISBUF)
*
REGST6 JSR    MDIS2    ;FORMAT
       LDX    #DISBUF+2  ;THIRD & FOURTH DIGITS
       BRA    REGST7
*
*
****SUBROUTINE TO PUNCH DATA TO CASSETTE TAPE****
* AUDIO CASSETTE WITH KC STANDARD
*
PNCH   LDAA   #%01010001  ;8 BIT CHR PAR 2 STOP
       STAA   ACIAS    ;DIVIDE BY 16 WITH RTS NOT HIG
       LDX    #$03FF
       BSR    PNLDR    ;PUNCH LEADER
PUND10 LDAB   ENDA+1   ;FORM END TEMP REG
       SUBB   BEGA+1
       LDAA   ENDA
       SBCA   BEGA
       BEQ    PUND25   ;DIFF LESS THAN 255
       LDAB   #$FF     ;YES, SET BLOCK=256
PUND25 LDAA   #'B'      ;PUNCH B
       BSR    OUTCH
       PSHB 
       TSX
       BSR    PUN
       PULA            ;GET BYTE COUNT
       INCA            ;ADJUST IT
       STAA   TEMP2
       LDX    #BEGA    ;PUNCH ADDR
       BSR    PUN
       BSR    PUN
       LDX    BEGA     ;PUNCH DATA
PUND30 BSR    PUN
       DEC    TEMP2    ;DONE YET?
       BNE    PUND30   ;NO
       STX    BEGA     ;SAVE XR VALUE
       LDX    #$0019
       BSR    PNLDR    ;PUNCH 25 ONES
       LDX    BEGA     ;RESTORE XR
       DEX
       CPX    ENDA
       BNE    PUND10   ;NO
       LDAA   #'G'      ;PUNCH G
*
***SUBROUTINE TO PUNCH DATA BYTE****
*
OUTCH  PSHB            ;SAVE B
OUTC1  LDAB   ACIAS    ;IS DATA READY YET?
       ASRB 
       ASRB 
       BCC    OUTC1    ;XMIT NOT READY YET
       STAA   ACIAD    ;OUTPUT ONE CHAR
       PULB            ;RESTORE B
       RTS
*
* SUB TO PUNCH ONE BYTE PTED TO BY XREG.
* ALSO INCREMENTS XREG BEFORE RETURN
*
PUN    LDAA   0,X      ;GET DATA
       BSR    OUTCH    ;PUNCH IT
       INX             ;UPDATE ADDR
       RTS
*
***PUNCH LEADER***
*
PNLDR  LDAA   #$FF     ;OUTPUT ALL ONES
       BSR    OUTCH    ;OUTPUT
       DEX             ;DECREMENT COUNTER
       BNE    PNLDR    ;IF NOT DONE THEN LOOP
       RTS
*
*
******SUBROUTINE TO LOAD DATA FROM CASSETTE TAPE****
*
*
LOAD   LDAA   #%00010000  ;DIVIDE BY ONE
       STAA   ACIAS
BILD   BSR    INCHR
       CMPA   #'B'      ;START OF BINARY?
       BEQ    RDBLCK   ;YES
       CMPA   #'G'      ;END OF FILE?
       BNE    BILD
       RTS             ;YES
RDBLCK BSR    INCHR    ;GET BYTE COUNT
       TAB             ;PUT IN B
       INCB            ;ADJUST IT
       BSR    INCHR    ;GET START ADDR HI
       STAA   BEGA
       BSR    INCHR    ;GET START ADDR LO
       STAA   BEGA+1
       LDX    BEGA     ;ADDR TO X REG
STBLCK BSR    INCHR    ;NOT DONE
       STAA   0,X      ;STRE IT
       INX             ;INCA ADDR
       DECB            ;DECB BYTE COUNT
       BNE    STBLCK   ;NOT DONE
       BRA    BILD
*
*****INPUT ONE CHR TO A REG******
*
INCHR  LDAA   ACIAS
       ASRA 
       BCC    INCHR    ;DATA READY?
       LDAA   ACIAD    ;INPUT CHAR
       RTS
*
*****SEVEN SEGMENT PATTERNS - USED BY OUTDS****
*               0   1   2   3   4   5   6   7
DIGTBL FCB    $40,$79,$24,$30,$19,$12,$02,$78

*               8   9   A   B   C   D   E   F
       FCB    $00,$18,$08,$03,$46,$21,$06,$0E

*               -   BLANK
       FCB    $BF,$7F
****KEY VALUE LOOKUP TABLE - USED BY KEYDC
*               0   1   2   3   4   5   6   7
KEYTBL FCB    $01,$02,$42,$82,$04,$44,$84,$08

*               8   9   A   B   C   D   E   F
       FCB    $48,$88,$C8,$C4,$C2,$C1,$81,$41

*               P   L   N   V   M   E   R   G
       FCB    $10,$50,$90,$D0,$20,$60,$A0,$E0

*
******KEYBOARD/DISPLAY REGISTER ASSIGNMENT
*
DISREG EQU    $8020    ;DISPLAY SEGMENTS REGISTER
DISCTR EQU    $8021    ;DISPLAY SEGMENTS CONTROL
SCNREG EQU    $8022    ;KEYBOARD/DISPLAY SCAN REG
SCNCTR EQU    $8023    ;KEYBOARD/DISPLAY SCAN CTR
ACIAS  EQU    $8008    ;ACIA CTRL OR STATUS REG
ACIAD  EQU    $8009    ;ACIA XMIT OR RCV REGS
*
****INTERRUPT VECTORS
*      ORG    $E3F8
       FDB    IO       ;IRQ INTERRUPT VECTOR
       FDB    SWIR     ;SOFTWARE INTERRUPT VECTOR
       FDB    NONMSK   ;NMI INTERRUPT VECTOR
       FDB    RESTAR   ;RESTART INTERRUPT VECTOR     
       PAGE
 *
******VARIABLE PARAMETERS******
*   SYSTEM RAM
*
*
* CAUTION: IF THE USER MODIFY'S THIS PROGRAM
* (GENERATES HIS OWN PROM) THE ORDER OF SOME
* OF THE FOLLOWING VARIABLES IS CRITICAL FOR
* CORRECT OPERATION
*
       ORG    $A000
* THE USER CAN STORE THE ADDRES OF HIS IRQ
* ROUTINE HERE.
IOV    RMB    2        ;IRQ INTERRUPT POINTER
BEGA   RMB    2        ;PUNCH BEGINNING ADDRESS
ENDA   RMB    2        ;PUNCH ENDING ADDRESS
NIO    RMB    2        ;NMI INTERRUPT POINTER
SP     RMB    2        ;TEMP STACK POINTER
TEMP1  RMB    2        ;SCRATCH
DISBUF RMB    8        ;DISPLAY BUFFER
DIGIN4 RMB    1        ;4 DIGITS ENTERED FLAG
DIGIN8 RMB    1        ;8 DIGITS ENTERED FLAG
MFLAG  RMB    1        ;MEMORY CHANGE MODE FLAG
RFLAG  RMB    1        ;REGISTER DISPLAY MODE FLAG
NFLAG  RMB    1        ;TRACE MODE FLAG
TEMP2  RMB    1        ;COUNTER IN REG DISPLAY, AUDIO
XKEYBF RMB    2        ;NEXT LOC IN DISPLAY BUFFER
SCNCNT RMB    1        ;KEYBOARD /DISPLAY SCAN COUNTE
VFLAG  RMB    1        ;CONTAINS THE NBR OF ACTIVE BR
BPADR  RMB    2        ;TEMP ADDR OF BP&XREG TEMP
XDSBUF RMB    2        ;XREG TEMP LOCATION
*
* BREAKPOINT AND OPCODE TABLE
*   EACH BRKPT REQUIRES 3 BYTES,
*   BYTES 1,2 ARE THE ADDRESS OF THE BRKPT
*   BYTE 3 IS THE REPLACED OP CODE
*   CHECK VFLAG TO SEE HOW MANY OF THE BRKPTS
*   ARE VALID
*
BPTAB  RMB    15       ;BREAKPOINT & OP CODE TABLE
       END
0000  08 ff a0 1e 08 ff a0 0a  b0 a0 0b f2 a0 0a fe a0  ........ ........
0010  1e a7 00 3f fe a0 00 6e  00 bf a0 08 8d 66 7d a0  ...?...n .....f}.
0020  18 27 0a 7f a0 18 8d 3b  27 2e 7e e2 36 fe a0 06  .'.....; '.~.6...
0030  6e 00 bf a0 08 8d 4d 30  6d 06 26 02 6a 05 6a 06  n.....M0 m.&.j.j.
0040  8d 21 27 14 ff a0 1e a6  02 81 3f 27 07 ee 00 a7  .!'..... ..?'....
0050  00 fe a0 1e 8d 08 26 ec  bf a0 08 7e e2 06 08 08  ......&. ...~....
0060  08 5a 39 ce a0 22 f6 a0  1d 39 8d f7 27 08 c1 05  .Z9..".. .9..'...
0070  2c 52 8d ea 26 fc 7c a0  1d b6 a0 1e a7 00 b6 a0  ,R..&.|. ........
0080  1f a7 01 39 86 3c b7 80  21 b7 80 23 39 8e a0 78  ...9.<.. !..#9..x
0090  bf a0 08 ce e1 4e ff a0  06 86 ff b7 80 22 44 b7  .....N.. ....."D.
00a0  80 20 8d e0 86 03 b7 80  08 7f a0 1d 8d 04 8d 27  . ...... .......'
00b0  20 4c ce a0 14 4f a7 00  08 8c a0 1a 26 f8 ce a0   L...O.. ....&...
00c0  0c ff a0 1a 86 7f b7 80  20 86 11 ce a0 0c a7 00  ........  .......
00d0  08 8c a0 14 26 f8 39 86  10 b7 a0 0c 39 ce 06 00  ....&.9. ....9...
00e0  09 26 fd 39 ce a0 0c a6  00 48 48 48 48 aa 01 a7  .&.9.... .HHHH...
00f0  12 a6 02 48 48 48 48 aa  03 a7 13 ee 12 39 ce a0  ...HHHH. .....9..
0100  0c a6 00 4c 08 ff a0 20  ce e3 c9 08 4a 26 fc 7f  ...L...  ....J&..
0110  80 22 a6 00 b7 80 20 b6  a0 1c b7 80 22 ce 00 4d  .".... . ...."..M
0120  8d be fe a0 20 8c a0 12  27 1f 74 a0 1c 20 d2 86  .... ... '.t.. ..
0130  ff ce 80 20 a7 00 86 3f  a7 02 a6 02 6d 00 2a 08  ... ...? ....m.*.
0140  8b 40 a7 02 84 c0 26 f2  39 86 20 b7 a0 1c 8d df  .@....&. 9. .....
0150  27 ac 8d 89 ce 80 20 86  01 a7 02 8d dd 26 0a a6  '..... . .....&..
0160  02 81 20 27 99 68 02 20  f2 5f ce e3 dc a1 00 27  .. '.h.  ._.....'
0170  09 8c e3 f4 27 61 08 5c  20 f3 8d b3 26 fc bd e0  ....'a.\  ...&...
0180  dd c1 0f 2e 27 fe a0 1a  e7 00 8c a0 0f 26 09 7c  ....'... .....&.|
0190  a0 14 08 ff a0 1a 20 3f  8c a0 13 26 f5 7c a0 15  ...... ? ...&.|..
01a0  bd e2 7e fe a0 1a 09 ff  a0 1a 20 2b ce e1 96 08  ..~..... .. +....
01b0  08 5a 26 fb 6e 00 20 0e  20 14 20 1e 20 28 20 37  .Z&.n. .  . . ( 7
01c0  20 41 20 42 20 48 bd e0  c4 bd e3 2f 20 06 bd e0   A B H.. .../ ...
01d0  c4 bd e3 95 bd e0 d7 7e  e0 fe 7f a0 1d 7c a0 18  .......~ .....|..
01e0  86 34 b7 80 21 3b 7d a0  14 26 05 7f a0 1d 20 e7  .4..!;}. .&.... .
01f0  8d 74 bd e0 6a 20 e0 7c  a0 16 7d a0 14 27 d8 8d  .t..j .| ..}..'..
0200  68 20 d4 7e e0 ac 7c a0  17 bd e2 c6 20 c9 7d a0  h .~..|. .... .}.
0210  16 26 48 7d a0 17 26 49  7d a0 14 26 07 bd e0 63  .&H}..&I }..&...c
0220  27 2b 20 b9 8d 40 30 a7  06 f6 a0 1e e7 05 bd e0  '+ ..@0. ........
0230  c4 bd e0 63 27 17 ff a0  1e ee 00 a6 00 36 86 3f  ...c'... .....6.?
0240  a7 00 fe a0 1e 32 a7 02  bd e0 5e 26 e9 86 20 b7  .....2.. ..^&.. .
0250  80 22 f6 80 22 86 3d b7  80 23 3b 8d 47 8d 12 20  ."..".=. .#;.G.. 
0260  ab bd e2 d7 20 a6 7e e0  e4 fe a0 1a 08 08 ff a0  .... .~. ........
0270  1a 8d f3 a6 00 8d 23 b7  a0 10 f7 a0 11 39 f6 a0  ......#. .....9..
0280  12 58 58 58 58 fa a0 13  8d dc e7 00 a6 00 8d 0a  .XXXX... ........
0290  b7 a0 10 f7 a0 11 7f a0  15 39 16 c4 0f 84 f0 44  ........ .9.....D
02a0  44 44 44 39 8d c0 08 ff  a0 0a b6 a0 0a 8d eb ce  DDD9.... ........
02b0  a0 0c a7 00 e7 01 b6 a0  0b 8d df a7 02 e7 03 7c  ........ .......|
02c0  a0 14 7c a0 16 39 86 fe  b7 a0 19 fe a0 08 86 06  ..|..9.. ........
02d0  08 4a 26 fc ff a0 0a bd  e0 c4 fe a0 0a b6 a0 19  .J&..... ........
02e0  2b 0e 81 03 27 21 81 04  27 dc a6 00 8d 2e 20 21  +...'!.. '..... !
02f0  36 a6 00 8d 27 fe a0 0a  a6 01 8d 2b 32 4c 27 11  6...'... ...+2L'.
0300  8d 12 bd e2 71 20 0a b6  a0 08 8d 10 b6 a0 09 8d  ....q .. ........
0310  16 7c a0 19 fe a0 0a 09  ff a0 0a 39 bd e2 9a ce  .|...... ...9....
0320  a0 0c a7 00 e7 01 39 bd  e2 9a ce a0 0e 20 f3 86  ......9. ..... ..
0330  51 b7 80 08 ce 03 ff 8d  54 f6 a0 05 f0 a0 03 b6  Q....... T.......
0340  a0 04 b2 a0 02 27 02 c6  ff 86 42 8d 2d 37 30 8d  .....'.. ..B.-70.
0350  36 32 4c b7 a0 19 ce a0  02 8d 2c 8d 2a fe a0 02  62L..... ..,.*...
0360  8d 25 7a a0 19 26 f9 ff  a0 02 ce 00 19 8d 1e fe  .%z..&.. ........
0370  a0 02 09 bc a0 04 26 c1  86 47 37 f6 80 08 57 57  ......&. .G7...WW
0380  24 f9 b7 80 09 33 39 a6  00 8d ef 08 39 86 ff 8d  $....39. ....9...
0390  e9 09 26 f9 39 86 10 b7  80 08 8d 24 81 42 27 05  ..&.9... ...$.B'.
03a0  81 47 26 f6 39 8d 19 16  5c 8d 15 b7 a0 02 8d 10  .G&.9... \.......
03b0  b7 a0 03 fe a0 02 8d 08  a7 00 08 5a 26 f8 20 da  ........ ...Z&. .
03c0  b6 80 08 47 24 fa b6 80  09 39 40 79 24 30 19 12  ...G$... .9@y$0..
03d0  02 78 00 18 08 03 46 21  06 0e bf 7f 01 02 42 82  .x....F! ......B.
03e0  04 44 84 08 48 88 c8 c4  c2 c1 81 41 10 50 90 d0  .D..H... ...A.P..
03f0  20 60 a0 e0 00 00 00 00  e0 14 e0 32 e0 19 e0 8d   `...... ...2....

Collection Information

Acquired

22-AUG-2025

Links

Assembly Listing

Hex Dump

Binary