       NAM     MIKBUG
*     REV 009
*     COPYRIGHT 1974 BY MOTOROLA INC

*     MIKBUG (TM)

*     L  LOAD
*     G  GO TO TARGET PROGRAM
*     M  MEMORY CHANGE
*     P  PRINT/PUNCH DUMP
*     R  DISPLAY CONTENTS OF TARGET STACK
*           CC   B   A   X   P   S

PIASB  EQU    $8007
PIADB  EQU    $8006    B DATA
PIAS   EQU    $8005    PIA STATUS
PIAD   EQU    $8004    PIA DATA
       OPT    MEMORY
       ORG    $E000

*     I/O INTERRUPT SEQUENCE
IO     LDX    IOV
       JMP    X

* NMI SEQUENCE
POWDWN LDX    NIO      GET NMI VECTOR
       JMP    X


LOAD   EQU    *
       LDA A  #$3C
       STA A  PIASB    READER RELAY ON
       LDA A  #@21
       BSR    OUTCH    OUTPUT CHAR

LOAD3  BSR    INCH
       CMP A  #'S
       BNE    LOAD3    1ST CHAR NOT (S)
       BSR    INCH
       CMP A  #'9
       BEQ    LOAD21
       CMP A  #'1
       BNE    LOAD3    2ND CHAR NOT (1)
       CLR    CKSM     ZERO CHECKSUM
       BSR    BYTE     READ BYTE
       SUB A  #2
       STA A  BYTECT   BYTE COUNT
* BUILD ADDRESS
       BSR    BADDR
* STORE DATA
LOAD11 BSR    BYTE
       DEC    BYTECT
       BEQ    LOAD15   ZERO BYTE COUNT
       STA A  X        STORE DATA
       INX
       BRA    LOAD11

LOAD15 INC    CKSM
       BEQ    LOAD3
LOAD19 LDA A  #'?      PRINT QUESTION MARK
       BSR    OUTCH
LOAD21 EQU    *
C1     JMP    CONTRL

* BUILD ADDRESS
BADDR  BSR    BYTE     READ 2 FRAMES
       STA A  XHI
       BSR    BYTE
       STA A  XLOW
       LDX    XHI      (X) ADDRESS WE BUILT
       RTS

* INPUT BYTE (TWO FRAMES)
BYTE   BSR    INHEX    GET HEX CHAR
       ASL A
       ASL A
       ASL A
       ASL A
       TAB
       BSR    INHEX
       ABA
       TAB
       ADD B  CKSM
       STA B  CKSM
       RTS

OUTHL  LSR A           OUT HEX LEFT BCD DIGIT
       LSR A
       LSR A
       LSR A

OUTHR  AND A  #$F      OUT HEX RIGHT BCD DIGIT
       ADD A  #$30
       CMP A  #$39
       BLS    OUTCH
       ADD A  #$7

* OUTPUT ONE CHAR
OUTCH  JMP    OUTEEE
INCH   JMP    INEEE

* PRINT DATA POINTED AT BY X-REG
PDATA2 BSR    OUTCH
       INX
PDATA1 LDA A  X
       CMP A  #4
       BNE    PDATA2
       RTS             STOP ON EOT

* CHANGE MEMORY (M AAAA DD NN)
CHANGE BSR    BADDR    BUILD ADDRESS
CHA51  LDX    #MCL
       BSR    PDATA1   C/R L/F
       LDX    #XHI
       BSR    OUT4HS   PRINT ADDRESS
       LDX    XHI
       BSR    OUT2HS   PRINT DATA (OLD)
       STX    XHI      SAVE DATA ADDRESS
       BSR    INCH     INPUT ONE CHAR
       CMP A  #$20
       BNE    CHA51    NOT SPACE
       BSR    BYTE     INPUT NEW DATA
       DEX
       STA A  X        CHANGE MEMORY
       CMP A  X
       BEQ    CHA51    DID CHANGE
       BRA    LOAD19   NOT CHANGED



* INPUT HEX CHAR
INHEX  BSR    INCH
       SUB A  #$30
       BMI    C1       NOT HEX
       CMP A  #$09
       BLE    IN1HG
       CMP A  #$11
       BMI    C1       NOT HEX
       CMP A  #$16
       BGT    C1       NOT HEX
       SUB A  #7
IN1HG  RTS


OUT2H  LDA A  0,X      OUTPUT 2 HEX CHAR
OUT2HA BSR    OUTHL    OUT LEFT HEX CHAR
       LDA A  0,X
       INX
       BRA    OUTHR    OUTPUT RIGHT HEX CHAR AND RTS

OUT4HS BSR    OUT2H    OUTPUT 4 HEX CHAR + SPACE
OUT2HS BSR    OUT2H    OUTPUT 2 HEX CHAR + SPACE
OUTS   LDA A  #$20     SPACE
       BRA    OUTCH    (BSR & RTS)

* ENTER POWER ON SEQUENCE
START  EQU    *
       LDS    #STACK
       STS    SP       INZ TARGET'S STACK PNTR
* INZ PIA
       LDX    #PIAD    (X) POINTER TO DEVICE PIA
       INC    0,X      SET DATA DIR PIAD
       LDA A  #$7
       STA A  1,X      INIT CON PIAS
       INC    0,X      MARK COM LINE
       STA A  2,X      SET DATA DIR PIADB
CONTRL LDA A  #$34
       STA A  PIASB    SET CONTROL PIASB TURN READER
       STA A  PIADB    SET TIMER INTERVAL
       LDS    #STACK   SET CONTROL STACK POINTER
       LDX    #MCLOFF

       BSR    PDATA1   PRINT DATA STRING

       BSR    INCH     READ CHARACTER
       TAB
       BSR    OUTS     PRINT SPACE
       CMP B  #'L
       BNE    *+5
       JMP    LOAD
       CMP B  #'M
       BEQ    CHANGE
       CMP B  #'R
       BEQ    PRINT    STACK
       CMP B  #'P
       BEQ    PUNCH    PRINT/PUNCH
       CMP B  #'G
       BNE    CONTRL
       LDS    SP       RESTORE PGM'S STACK PTR
       RTI             GO

* ENTER FROM SOFTWARE INTERRUPT
SFE    EQU    *
       STS    SP       SAVE TARGET'S STACK POINTER
* DECREMENT P-COUNTER
       TSX
       TST    6,X
       BNE    *+4
       DEC    5,X
       DEC    6,X

* PRINT CONTENTS OF STACK
PRINT  LDX    SP
       INX
       BSR    OUT2HS   CONDITION CODES
       BSR    OUT2HS   ACC-B
       BSR    OUT2HS   ACC-A
       BSR    OUT4HS   X-REG
       BSR    OUT4HS   P-COUNTER
       LDX    #SP
       BSR    OUT4HS   STACK POINTER
C2     BRA    CONTRL

*     PUNCH DUMP
*     PUNCH FROM BEGINING ADDRESS (BEGA) THRU ENDING
*     ADDRESS (ENDA)
*

MTAPE1 FCB    $D,$A,0,0,0,0,'S,'1,4   PUNCH FORMAT

PUNCH  EQU    *

       LDA A  #$12     TURN TTY PUNCH ON
       JSR    OUTCH    OUT CHAR

       LDX    BEGA
       STX    TW       TEMP BEGINING ADDRESS
PUN11  LDA A  ENDA+1
       SUB A  TW+1
       LDA B  ENDA
       SBC B  TW
       BNE    PUN22
       CMPA   #16
       BCS    PUN23
PUN22  LDA A  #15
PUN23  ADD A  #4
       STA A  MCONT    FRAME COUNT THIS RECORD
       SUB A  #3
       STA A  TEMP     BYTE COUNT THIS RECORD
*     PUNCH C/R,L/F,NULL,S,1
       LDX    #MTAPE1
       JSR    PDATA1
       CLR B           ZERO CHECKSUM
*     PUNCH FRAME COUNT
       LDX    #MCONT
       BSR    PUNT2    PUNCH 2 HEX CHAR
*     PUNCH ADDRESS
       LDX    #TW
       BSR    PUNT2
       BSR    PUNT2
*     PUNCH DATA
       LDX    TW
PUN32  BSR    PUNT2    PUNCH ONE BYTE (2 FRAMES)
       DEC    TEMP     DEC BYTE COUNT
       BNE    PUN32
       STX    TW
       COM B
       PSH B
       TSX
       BSR    PUNT2    PUNCH CHECKSUM
       PUL B
       LDX    TW
       DEX
       CPX    ENDA
       BNE    PUN11
       BRA    C2       JMP TO CONTROL

*     PUNCH 2 HEX CHAR, UPDATE CHECKSUM
PUNT2  ADD B  0,X      UPDATE CHECKSUM
       JMP    OUT2H    OUTPUT TWO HEX CHAR AND RTS

MCLOFF FCB    $13      READER OFF
MCL    FCB    $D,$A,$14,0,0,0,'*,4   C/R,L/F,PUNCH
*
SAV    STX    XTEMP
       LDX    #PIAD
       RTS
* INPUT ONE CHAR INTO A-REGISTER
INEEE  PSH B           SAVE ACC-B
       BSR    SAV      SAV XR
IN1    LDA A  0,X      LOOK FOR START BIT
       BMI    IN1
       CLR    2,X      SET COUNTER FOR HALF BIT TIME
       BSR    DE       START TIMER
       BSR    DEL      DELAY HALF BIT TIME
       LDA B  #4       SET DEL FOR FULL BIT TIME
       STA B  2,X
       ASL B           SET UP CNTR WITH 8
IN3    BSR    DEL      WAIT ONE CHAR TIME
       SEC             MARK COM LINE
       ROL    0,X      GET BIT INTO CFF
       ROR A           CFF TO AR
       DEC B
       BNE    IN3
       BSR    DEL      WAIT FOR STOP BIT
       AND A  #$7F     RESET PARITY BIT
       CMP A  #$7F
       BEQ    IN1      IF RUBOUT,GET NEXT CHAR
       BRA    IOUT2    GO RESTORE REG

* OUTPUT ONE CHAR
OUTEEE PSH B           SAV BR
       BSR    SAV      SAV XR
IOUT   LDA B  #$A      SET UP COUNTER
       DEC    0,X      SET START BIT
       BSR    DE       START TIMER
*
OUT1   BSR    DEL      DELAY ONE BIT TIME
       STA A  0,X      SET START BIT
       SEC             SET CARRY BIT
       ROR A           SHIFT IN NEXT BIT
       DEC B           DECEREMENT COUNTER
       BNE    OUT1     TEST FOR 0
IOUT2  LDA B  2,X      TEST FOR STOP BITS
       ASL B           SHIFT BIT TO SIGN
       BPL    IOS      BRANCH FOR 1 STOP BIT
       BSR    DEL      DELAY FOR STOP BITS
IOS    LDX    XTEMP    RES XR
       PUL B           REESTORE BR
       RTS
*
DEL    TST    2,X      IS TIME UP
       BPL    DEL
DE     INC    2,X      RESET TIMER
       DEC    2,X
       RTS

       FDB    IO
       FDB    SFE
       FDB    POWDWN
       FDB    START
       ORG    $A000
IOV    RMB    2        IO INTERRUPT POINTER
BEGA   RMB    2        BEGINING ADDR PRINT/PUNCH
ENDA   RMB    2        ENDING ADDR PRINT/PUNCH
NIO    RMB    2        NMI INTERRUPT POINTER
SP     RMB    1        S-HIGH
       RMB    1        S-LOW
CKSM   RMB    1        CHECKSUM
BYTECT RMB    1        BYTE COUNT
XHI    RMB    1        XREG HIGH
XLOW   RMB    1        XREG LOW
TEMP   RMB    1        CHAR COUNT (INADDR)
TW     RMB    2        TEMP/
MCONT  RMB    1        TEMP
XTEMP  RMB    2        X-REG TEMP STORAGE
       RMB    46
STACK  RMB    1        STACK POINTER



       END
