 OPT  PAG
 NAM  DISSASSEMBLER
 TTL  Robert Henneke 6809 disassembler
 STTL 28 April 2020
 SETLI 100
 SETPG 75
 PAG
*
*** 6809 Dissassembler (april 2020)
*** Copyright (c) Robert Henneke, r.henneke@hccnet.nl
*
PRTPAGE   EQU   $F7E0
GET2SEQ   EQU   $F7E2
NLPDATA   EQU   $F806
OUTXS     EQU   $F834
OUTXNL    EQU   $F836
NEXTPAGE  EQU   $F84C
NOPRINT   EQU   $F85C
PCPRINT   EQU   $F886
PRTMSG    EQU   $F888

BASE      EQU   $E000

BS        EQU   $08
Space     EQU   $20
HiBit     EQU   $80

DISLINPA  EQU   $9FC4   ; aantal regels per page
DISASMFL  EQU   $9FC7   ; Dissassembler opties

DISREGEL  EQU   $9FD8   ; Dissassembler voor extern gebruik
OUTPC     EQU   $9FE2   ; OUTPC is Dissassembler

*
*** Working storage on stack
*
          ORG   0
* Werkvelden
OUTCH     RMB   2       ; Monitor ouput character routine
CURADR    RMB   2       ; Current disassembly adres
WRKADR    RMB   2       ; Working adres
LENGTH    RMB   1       ; Instructie lengte
PAGE      RMB   1       ; Opcode Page
OPCD      RMB   1       ; Opcode
POSTB     RMB   1       ; Opcode postbyte
BYTE1     RMB   1       ; MSB Operand
BYTE2     RMB   1       ; LSB Operand
INDFLG    RMB   1       ; Indirect vlag
INDBYT    RMB   1       ; Indexed byte
NXTBUF    RMB   2       ; Pointer in buffer
*
* Output buffer
*
BUFFER    EQU   *       ; Uitvoer buffer
ASCBUF    RMB   6       ; ASCII
PRTBUF    RMB   4       ; Adres
          RMB   1
          RMB   2       ; Page
          RMB   2       ; Opcode
          RMB   2       ; Postbyte
          RMB   1
HEXB      RMB   4       ; Operand hex byte
          RMB   2
MNEM      RMB   6       ; Opcode mnemonic
OPRAND    RMB   21      ; Operand
LENBUF    EQU   *
*
*                       ; dddooooo
*                       ;        1 : Geen test bij EXG en TFR
*                       ;       1  : BRN  is DEBUG #xx
*                       ;      1   : SWI2 is ERROR #xx
*                       ;     1    : SWI3 is SYSTEM
*                       ;    1     : Print Instructie in ASCII
*                       ; ddd      : F.F.E. (6309)
                                                                
 PAG
*
*** Dissassembler commando
*
          ORG   BASE
          FCC   'RH'
          BRA   INIT
          FCB   'D'
          FDB   DISASM
          FCB   $FF
*
INIT      JSR   [PRTPAGE]
          BSR   PRINTDIS
          LDD   #DISREG   ; Dissassembleer 1 regel
          STD   DISREGEL
          LDD   #$F537    ;$ LDD PCPRINT In plaats van alleen PC
          STD   OUTPC     ; gedissassembleerde instructie
          RTS

PRINTDIS  BSR   PRINTEXT
          FCC  '6809 Dissassemble' 'r'+hiBit


          RTS
*
DISASM    BSR   PRINTDIS   ; Print Dissassembler
          JSR   [GET2SEQ]  ; X is Startadres, $FFFF default eind >

DIS10     LDB   DISLINPA   ; aantal regels per blad
DIS20     CMPX  2,U        ; Eind adres
          BCC   DIS99      ; Einde bereikt of overschreden
          LDA   ,X         ; 3 * $FF
          ANDA  1,X        ; is leeg deel
          ANDA  2,X        ; en dat skippen we
          CMPA  #$FF
          BEQ   DIS40
          LDY   NLPDATA    ; Y is Print routine
          BSR   DISREG     ; Doe 1 regel
DIS30     DECB
          BNE   DIS20      ; Volgende regel
          TST   DISLINPA   ; aantal regels per blad
          BEQ   DIS10      ; 0 is geen page
          JSR   [NEXTPAGE] ; Volgende page
          BRA   DIS10

DIS40     JSR   [OUTXNL]
          BSR   PRINTEXT
          FCB   BS        ; verwijder spatie
          FCB   $2D+HiBit ; '-'+HiBit
DIS45     LDA   ,X+
          CMPA  #$FF
          BEQ   DIS45
          LEAX  -2,X
          JSR   [OUTXS]
          INX
          BSR   PRINTEXT
          FCC   'Lee'
          FCB   $67+HiBit ; 'g'+HiBit
DIS50     BRA   DIS30
DIS99     RTS
*
PRINTEXT  JMP   [PRTMSG]
 PAG
*
*** Init programma
*
DISREG    PSHS  B,Y,U     ; Doe 1 regel, Printdriver in Y
          LEAU  -LENBUF,S ; Maak buffer op stack

          TFR   U,S       ; Adresseer met U
          STX   CURADR,U  ; Current adres
          STY   OUTCH,U   ; Print Routine

          LEAX  LENGTH,U  ; Init werkvelden
          LDB   #BUFFER-LENGTH
INIT1     CLR   ,X+
          DECB            ; met 0
          BNE   INIT1

          LDA   #Space          ; Init print buffer
          LDB   #LENBUF-BUFFER  ; met spatie
INIT2     STA   ,X+
          DECB
          BNE   INIT2

          LDX   CURADR,U   ; Init werkadres
          STX   WRKADR,U
          INC   LENGTH,U   ; Instructie minimaal 1 byte
*
*** Main Procedure
*
          LDB   ,X+
          CMPB  #$10            ; Page 1
          BEQ   MAIN1           ; Ja
          CMPB  #$11            ; Page 2
          BNE   MAIN2
*
MAIN1     STB   PAGE,U          ; Bewaar page
          INC   LENGTH,U        ; Instructie minimaal 2 bytes
          LDB   ,X+             ; Opcode

MAIN2     STX   WRKADR,U        ; Bewaar werk adres
          STB   OPCD,U          ; en OpCode
          CMPB  #$80            ; Opcode 80 - FF
          BHS   MAIN3           ; Ja
          CMPB  #$40            ; Opcode 40 - 7F
          BLO   MAIN4           ; Nee
          ANDB  #$0F            ; Ja, converteer naar 00 - 0F
          BRA   MAIN4

PUTMNEM   LEAX  MNOSTAB,PCR     ; Start tabel
          ABX                   ; Offset in tabel
          LDB   ,X              ; Relatief adres mnenomic
          LEAY  MNEM,U          ; Plek in buffer
          LEAX  MNEMTAB,PCR     ; Start tabel + offset
          ABX                   ; = adres Mnenomic
PM10      LDA   ,X+             ; Zet in buffer
          BMI   PM20
          STA   ,Y+
          BRA   PM10
PM20      ANDA  #$7F
          STA   ,Y+
          RTS

MAIN3     ANDB  #$0F            ; Converteer naar 40 - 4F
          ORB   #$40

MAIN4     BSR   PUTMNEM         ; Menommic in buffer
          LEAX  OPRAND,U        ; Operand buffer
          STX   NXTBUF,U        ; in print pointer

          LDA   MNEM,U          ; Eerste teken mnemonic
          CMPA  #'*'            ; Ongeldige opcode
          BEQ   OP11            ; Verwerk deze
*
*** Bepaal de juiste verwerkings routine
*
          LDA   OPCD,U  ; Bepaal groep a.d.h.v.
          CMPA  #$C0    ; C0-FF  high nibble
          LBHS  OPC0
          CMPA  #$80    ; 80-BF
          LBHS  OP80
          CMPA  #$40    ; 40-7F
          BHS   OP00
          CMPA  #$30    ; 30-3F
          LBHS  OP30
          CMPA  #$20    ; 20-2F
          LBHS  OP20
          CMPA  #$10    ; 10-1F
          BHS   OP10

*** Opcode 00-0F en 40-7F
*
OP00      TST   PAGE,U  ; Moet page 0 zijn
          BNE   OP11    ; Anders fout
          CMPA  #$4E    ; 4E
          BEQ   OP11    ; en
          CMPA  #$5E    ; 5E zijn fout
          BEQ   OP11

*** Accu's
OP02      ANDA  #$F0
          LDB   #'A'
          CMPA  #$40    ; Accu A
          BEQ   OP03
          CMPA  #$50    ; Accu B
          BNE   OP04
          LDB   #'B'
OP03      STB   MNEM+3,U ; Zet Accu in Nnemonic
          BRA   OP07

*** Indexed
OP04      CMPA  #$60
          BNE   OP05
          LBSR  INDEX   ; Verwerk indexed mode
          BRA   OP07

*** Extended
OP05      CMPA  #$70
          BNE   OP06
          LBSR  EXTEND  ; Verwerk extended mode
          BRA   OP07

*** Direct
OP06      LBSR  DIRECT  ; Verwerk directe mode
OP07      LBRA  FINISH  ; en sluit af
*
*** Opcode 10-1F
*
OP10      LDB   PAGE,U
          BEQ   OP12
OP11      LBRA  ILEGOP

*** LBRA en LBSR
OP12      CMPA  #$16    ; LBRA
          BEQ   OP13
          CMPA  #$17    ; LBSR
          BNE   OP14
OP13      BRA   OP23    ; verwerk als branches

*** CC instructies
OP14      CMPA  #$1A
          BEQ   OP15
          CMPA  #$1C
          BNE   OP17
          LDA   #'C'    ; Fix ANDCC
          STA   MNEM+4,U
OP15      LDA   #'#'
          LBSR  J1PUTCH
          BRA   OP06    ; verwerk als direct

*** Transfer registers
OP17      CMPA  #$1E
          BLO   OP07    ; Verwerk overige 1 byte instructie
          INC   LENGTH,U
          LDB   [WRKADR,U] ; Postbyte
          STB   BYTE1,U

          LDA   DISASMFL        ; Geen test op
          BITA  #%00000001      ; ongeldige combinaties
          BEQ   OP17A           ; of operand
          LEAY  REGTABZC,PCR    ;
          BRA   OP18            ;

OP17A     ANDB  #$88    ; Kijk of operanden
          BEQ   OP17B   ; van het zelfde soort zijn
          CMPB  #$88
          BNE   REGFOUT ; Nee fout
OP17B     LEAY  REGTABCT,PCR

OP18      LDB   BYTE1,U
          LSRB
          LSRB
          LSRB
          LSRB          ; B is source nibble
          BSR   REG
;#        CMPA  #'*'    ; Geldig register
;#        BEQ   OP11    ; nee
          BSR   PUTComma
          LDB   BYTE1,U
          BSR   REG     ; Destination register
;#        CMPA  #'*'
;#        BEQ   OP11    ; Niet OK
OP07X     BRA   OP07

REG       TFR   Y,X
          ANDB  #$0F    ; Mask high nibble
          LDA   B,X     ; Naam uit tabel
          BSR   J1PUTCH
          CMPB  #$05
          BNE   REG1

REG0      LDA   #'C'    ;$ PC
          BRA   REG3

REG1      CMPB  #$0A
          BEQ   REG0

REG2      CMPB  #$0B
          BNE   REG4    ;$
          LDA   #'P'    ; DP
REG3      LBSR  PUTCH
REG4      RTS

REGFOUT   LDA   #'*'    ; Ongeldige combinatie
          BSR   REG3    ; van registers
          BSR   REG3
          BSR   REG3
          BRA   OP07X

*** Opcodes 20-2F
OP20      LDB   PAGE,U
          BEQ   OP26    ; Page 0 is short branches
          CMPB  #$10    ; Page 1 is long branches
          LBNE  ILEGOP  ; Page 2 is fout

OP23      LDB   #3      ; Schuif naam 1 pos op
          LEAX  MNEM+2,U
OP24      LDA   ,X+
          STA   ,X
          LEAX  -2,X
          DECB
          BNE   OP24
          LDA   #'L'    ; en plemp er een 'L' voor
          STA   1,X
          LBSR  REL16   ; verwerk  relatief adres
OP25      LBRA  FINISH  ;$

*** Short branches
OP26      LDB   DISASMFL
          BITB  #%00000010 ; BRN = DEBUG
          BEQ   OP28
          CMPA  #$21
          BNE   OP28
          LDB   #83         ; Overschrijf
OP27      LBSR  PUTMNEM     ; met DEBUG
          LBRA  OP302       ; Operand #xx

OP28      LBSR  REL8    ; verwerk  relatief adres
          BRA   OP25

PUTComma  LDA   #','
J1PUTCH   BRA   REG3

*** Opcodes 30-3F
OP30      LDB   PAGE,U  ; Moet page 0 zijn
          CMPA  #$3F    ; behalve SWI
          BEQ   OP301
          CMPB  #0
          LBNE  ILEGOP

*** LEA instructies
OP32      CMPA  #$33
          BHI   OP34
OP32A     LBSR  INDEX   ; altijd indexed mode
OP33      LBRA  FINISH  ;$

*** Stack instructies
OP34      CMPA  #$3C
          BEQ   OP302   ; CWAI
          CMPA  #$3E
          BEQ   OP302   ; SVC
          CMPA  #$37
          BHI   OP33    ; Rest 1 byte instructies
          INC   LENGTH,U
          LDA   [WRKADR,U] ; Postbyte
          STA   BYTE1,U    ; Bewaar voor later
          STA   BYTE2,U

          CLRB           ; Verwerk PSH/PUL Postbyte
OP35      LSL   BYTE2,U  ; bit in carry
          BCC   OP300    ; 0 -> geen register
          LEAX  STKTAB,PCR
          LDA   B,X      ; Register uit tabel

          CMPA  #'S'     ; Bepaal 'S' of 'U
          BNE   OP36
          CMPA  MNEM+3,U ; vergelijk met operand mnemonic
          BNE   OP36
          LDA   #'U'     ; Vervang stack pointer

OP36      BSR   J1PUTCH  ; Fix 'PC' en 'CC'
          CMPA  #'P'
          BEQ   OP37
          CMPA  #'C'
          BNE   OP38
OP37      LDA   #'C'
OP37A     BSR   J1PUTCH
          BRA   OP39

OP38      CMPA  #'D'    ; Fix 'DP'
          BNE   OP39
          LDA   #'P'
          BRA   OP37A

OP39      BSR   PUTComma ; Comma in buffer
OP300     INCB
          CMPB  #8
          BNE   OP35     ; Volgend register

          LDX   NXTBUF,U ; Verwijder de laatste comma
          LEAX  -1,X
          STX   NXTBUF,U
XOP33     BRA   OP33

*** SWI
OP301     CMPB  #0       ; Page 0 dan klaar
          BEQ   OP33

          LDA   DISASMFL
          BITA  #%00000100 ; SWI2 = ERROR
          BEQ   OP301B
          CMPB  #$10
          BNE   OP301B

          LDB   #84     ; Overschrijf
          LBSR  OP27    ; SWI met ERROR
          BRA   OP302   ; Voeg #xx toe

OP301B    BITA  #%00001000 ; SWI3 = ????
          BEQ   OP301C
          CMPB  #$11
          BNE   OP301C
*
*** Verwerk alternatieve SWI3
*
          LDB   #85     ; Overschrijf
          LBSR  OP27    ; SWI met SYS
          LBRA  OP302   ; Voeg #xx toe

OP301C    ADDB  #$22     ; Add $22
          STB   MNEM+3,U ; 10=SWI2, 11=SWI3
          BRA  XOP33 ; LBRA  XOP33

*** CWAI, DEBUG en SVC
OP302     LDA   #'#'    ; Print immediate mode
          LBSR  PUTCH
          LBRA  OP06    ; en verwerk als direct
*
*** Opcodes 80-BF
*
OP80      LDB   PAGE,U
          CMPA  #$8D
          BNE   OP81
          CMPB  #0      ; BSR page 0
          BNE   OP801
          LDA   #'B'
          STA   MNEM,U  ; vervang JSR door BSR
          LBRA  OP26    ; en verwerk als short branch

*** Mnemonic afhankelijk van page
OP81      ANDA  #$8F    ; Fix SUBD/CMPD/CMPU
          CMPA  #$83
          BNE   OP83
          CMPB  #$00
          BEQ   OP800
          LDA   #'C'
          STA   MNEM,U
          LDA   #'M'
          STA   MNEM+1,U
          LDA   #'P'
          STA   MNEM+2,U
          LDA   #'D'
          CMPB  #$10
          BEQ   OP82
          LDA   #'U'
OP82      STA   MNEM+3,U
          BRA   OP800

OP83      CMPA  #$8C    ; Fix CMPX/CMPY/CMPS
          BNE   OP85
          CMPB  #$00
          BEQ   OP800
          LDA   #'Y'
          CMPB  #$10
          BEQ   OP84
          LDA   #'S'
OP84      STA   MNEM+3,U
          BRA   OP800

OP85      CMPA  #$8E    ; Fix LDX/LDY en STX/STY
          BLO   OP86
          CMPB  #$11    ; Kan niet PAGE 2 zijn
          BEQ   OP801
          CMPB  #$00
          BEQ   OP800
          LDA   #'Y'
          STA   MNEM+2,U
          BRA   OP800

OP86      CMPB  #$00    ; Rest is page 0
          BNE   OP801

*** 80-BF en C0-FF
OP800     LDA   OPCD,U
          ANDA  #$BF
          CMPA  #$87    ; Store kent geen inmediate
          BEQ   OP801
          CMPA  #$8D
          BEQ   OP801
          CMPA  #$8F
          BNE   OP802
OP801     LBRA  ILEGOP

*** Extended adressing
OP802     LDA   OPCD,U
          ANDA  #$30
          CMPA  #$30
          BEQ   OP806

*** Indexed adressing
OP803     CMPA  #$20
          LBEQ  OP32A

*** Direct adressing
OP804     CMPA  #$10
          BEQ   OP805A

*** Immediated adressing
OP805     LDA   #'#'
          LBSR  PUTCH
          LDA   OPCD,U
          ANDA  #$8F
          CMPA  #$83    ; opcodes 83 en 8C-8F
          BEQ   OP806   ; hebben 2 bytes operand
          CMPA  #$8C
          BHS   OP806
OP805A    LBSR  DIRECT  ; 1 byte als direct
          BRA   OP806A

OP806     LBSR  EXTEND  ; 2 byte als extended
OP806A    LBRA  FINISH

*** C0-CF
OPC0      LDB   PAGE,U
          ANDA  #$CF
          CMPA  #$CB
          BHI   OPC3
          CMPA  #$C3    ; Fix ADDD
          BNE   OPC0A

          LDB   #82     ; ADDD
          BRA   OPC4

OPC0A     LEAX  MNEM+2,U
          LDA   ,X
          CMPA  #'A'
          BEQ   OPC1
          LEAX  1,X
OPC1      INC   ,X      ; Verander 'A' in 'B'

OPC2      LDB   PAGE,U
          BEQ   OPC8    ; Moet page 0 zijn
          BRA   ILEGOP

OPC3      CMPA  #$CD
          BHI   OPC6
          BNE   OPC5

          LDB   #80     ; STD
OPC4      LBSR  PUTMNEM
          BRA   OPC2
OPC5      LDB   #81     ; LDD
          BRA   OPC4

OPC6      CMPB  #$11    ; Geen page 2 voor CE-CF
          BEQ   ILEGOP
          LDA   #'U'    ; Fix LDU/LDS en STU/STS
          CMPB  #$00
          BEQ   OPC7
          LDA   #'S'
OPC7      STA   MNEM+2,U
OPC8      LBRA  OP800   ; verwerk als 80-BF

*** Foute opcodes
ILEGOP    LDA   #1       ; Lengte = 1
          STA   LENGTH,U
          LEAX  NFCB,PCR ; X @ 'FCB'
          LEAY  MNEM,U
          LBSR  PM10     ; Zet 'FCB' in buffer
          LEAX  MNEM,U
          LEAX  6,X
          STX   NXTBUF,U
          LDA   #'$'     ; $xx
          LBSR  PUTCH
          TST   PAGE,U   ; Geen page
          BEQ   IO10     ; dan opcode
          LDA   PAGE,U   : Ander page
          BRA   IO20
IO10      LDA   OPCD,U
IO20      LBSR  PUT2H    ; in buffer
          LBRA  FINISH

*** Indexed adressing mode
INDEX     INC   LENGTH,U
          LDX   WRKADR,U ; Increment current adres
          LDB   ,X+      ; en pak postbyte
          STX   WRKADR,U
          STB   INDBYT,U
          STB   BYTE1,U

*** Test op indirect
          ANDB  #$90
          CMPB  #$90     ; bit 4 en 7 geset?
          BNE   IND1     ; Nee, geen indirect
          COM   INDFLG,U ; Ja, Set indirect vlag
          LDA   #'['     ; en print '['
          LBSR  J2PUTCH

*** Auto increment / decrement
IND1      LDB   INDBYT,U
          ANDB  #$8F    ; Mask register en indirect bits
          CMPB  #$80    ; Auto INC/DEC
          BLO   IND5    ; Nee
          CMPB  #$83
          BHI   IND5
          LDA   INDBYT,U ; Get postbyte
          ANDA  #$11     ; Test op INC/DEC 1
          CMPA  #$10     ; en indirect
          BEQ   ILEGOP   ; want dat is fout

          LBSR  PUTComma
          CMPB  #$81     ; Auto increment
          BHI   IND3     ; Nee
          BSR   GETREG   ; Zet index register in buffer
          LDA   #'+'     ; en '+'
          LBSR  J2PUTCH
          CMPB  #$81     ; increment 2
          BNE   IND2
          LBSR  J2PUTCH  ; '++'

IND2      BRA   IND11A

IND3      LDA   #'-'    ; Auto decrement
          BSR   J2PUTCH ; '-'
          CMPB  #$83    ; decrement 2
          BNE   IND4
          BSR   J2PUTCH ; '--'
IND4      BSR   GETREG
          BRA   IND11A

*** Accu offset
IND5      LDA   #'A'
          CMPB  #$86    ; 86 = A
          BEQ   IND6
          LDA   #'B'
          CMPB  #$85    ; 85 = B
          BEQ   IND6
          LDA   #'D'
          CMPB  #$8B    ; 8B = D
          BNE   IND7

IND6      BSR   J2PUTCH ; Print offset register
          LBSR  PUTComma
          BRA   IND4

*** PCR offset
IND7      CMPB  #$8D    ; 8D en 8C
          BEQ   IND8    ; ,PCR
          CMPB  #$8C
          BNE   IND10
IND8      LDA   INDBYT,U
          STA   POSTB,U
          CMPB  #$8D
          BEQ   IND9
          LBSR  REL8    ; 8C = 8 bits


IND8A     LBSR  PUTComma ; nn,PCR
          LDA   #'P'
          BSR   J2PUTCH
          LDA   #'C'
          BSR   J2PUTCH
          BRA   IND11A

IND9      LBSR  REL16   ; 8D = 16 bits
          BRA   IND8A

*** Constant offset
IND10     CMPB  #$84
          BNE   IND12
          BRA   IND11C

IND11     CMPA  #9
          BHI   IND11D
          LBSR  PUT2HR
          BRA   IND11C

IND11D    BSR   DOLLAR
IND11E    LBSR  PUT2H ; 0,R
IND11C    LBSR  PUTComma
          BSR   GETREG
IND11A    BRA   INDEND

*** Get index register
GETREG    PSHS  B
          LDB   INDBYT,U ; Postbyte
          ANDB  #%01100000
          LSRB
          LSRB
          LSRB
          LSRB
          LSRB
          LEAX  REGTABCT+1,PCR
          LDA   B,X
          PULS  B
J2PUTCH   LBRA  PUTCH

DOLLAR    PSHS  A
          LDA   #'$'
          BSR   J2PUTCH
          PULS  A,PC

*** 5 bits offset
IND12     BITB  #$80    ; 5 bits offset als bit 7 = 0
          BNE   IND13
          TST   INDFLG,U ; Indirect niet toegestaan
          BNE   IND18
          LDB   INDBYT,U
          ANDB  #$1F    ; offset bits
          BITB  #$10    ; test sign
          BEQ   IND12A  ; positief

IND12B    ORB   #$E0    ; Converteer naar positief nummer
IND12C    NEGB
          LDA   #'-'
          BSR   J2PUTCH

IND12A    TFR   B,A
          BRA   IND11   ; en print

*** 8 bits offset
IND13     LDA   INDBYT,U ; Postbyte
          STA   POSTB,U
          CMPB  #$88      ; 16 bits
          BNE   IND15

          INC   LENGTH,U  ; 8 bits
          LDB   [WRKADR,U]
          STB   BYTE1,U
          BPL   IND12A
          BRA   IND12C

*** 16 bits offset
IND15     CMPB  #$89
          BNE   IND16
          BSR   DOLLAR
          INC   LENGTH,U ; lengte +2
          INC   LENGTH,U
          LDD   [WRKADR,U]
          STD   BYTE1,U
          BSR   PUT2H   ; print high byte
          TFR   B,A
          BRA   IND11E  ; en low byte

*** Extended indirect
IND16     LDA   INDBYT,U
          CMPA  #$9F
          BNE   IND18   ; Rest is fout
          STA   POSTB,U
          BSR   EXTEND  ; Verwerk als extended
          BRA   INDEND

IND18     LBRA  ILEGOP  ; Stepstone naar error

*** Einde indexed verwerking
INDEND    TST   INDFLG,U ; Indirect
          BEQ   INDEN9
          LDA   #']'     ; Sluit af met ']'
          BSR   PUTCH
INDEN9    RTS

*** Verwerk directe adressering
DIRECT    INC   LENGTH,U
          LDA   #'$'    ; '$' en
          BSR   PUTCH
          LDA   [WRKADR,U]
          STA   BYTE1,U ; waarde in hex
          BRA   PUT2H

*** Verwerk extended adressering
EXTEND    BSR   DIRECT  ; $high byte
          INC   LENGTH,U
          INC   WRKADR+1,U
          BNE   EXT1
          INC   WRKADR,U
EXT1      LDA   [WRKADR,U] ; en low byte
          STA   BYTE2,U

*** Output routines
PUT2H     PSHS  A       ; Zet A als 2 hex in buffer
          BSR   PUT2HL
          PULS  A
          BRA   PUT2HR
PUT2HL    LSRA
          LSRA
          LSRA
          LSRA
PUT2HR    ANDA  #$0F
          ADDA  #'0'
          CMPA  #'9'
          BLS   PUTCH
          ADDA  #7

PUTCH     LDX   NXTBUF,U ; Zet A in buffer @NXTBUF
          STA   ,X+
          STX   NXTBUF,U
          RTS

*** Verwerk relatieve adressering
REL8      INC   LENGTH,U
          BSR   PUTLAB
          LDA   [WRKADR,U]
          TFR   A,B
          STA   BYTE1,U
          SEX
          ADDD  #1

REL8A     ADDD  WRKADR,U ; We printen het target adres
          BSR   PUT2H    ; tussen haakjes
          TFR   B,A
          BRA   PUT2H

REL16     INC   LENGTH,U
          INC   LENGTH,U
          BSR   PUTLAB
          LDD   [WRKADR,U]
          STA   BYTE1,U
          STB   BYTE2,U
          ADDD  #2
          BRA   REL8A

PUTLAB    PSHS  A
          LDA   #'L'
          BSR   PUTCH
          LDA   #'X'
          BSR   PUTCH
          PULS  A,PC
 PAG
*** End of job
FINISH    CLRA          ; Sluit regel af
          BSR   PUTCH
*
*** Vul ASCII buffer
*
          LEAY  ASCBUF,U ; Point naar buffer
          LDB   LENGTH,U ; aantal instructies
          LDX   CURADR,U
AS10      LDA   ,X+     ; Van memory
          JSR   [NOPRINT]
          CMPA  #$7F    ; Rub out,
          BNE   AS15    ; Hoewel ASCII,
          LDA   #'.'    ; Toch unprintable
AS15      STA   ,Y+     ; naar buffer
          DECB
          BNE   AS10    ; Volgende
*
*** Aanmaken print regel
*
          LEAX  PRTBUF,U ; Point naar buffer
          STX   NXTBUF,U ; in print pointer
          LDA   CURADR,U ; High adres
          BSR   PUT2H    ; in buffer
          LDA   CURADR+1,U
          BSR   PUT2H    ; Low adres
          LDA   #Space   ; en spatie
          BSR   PUTCH

          LDA   LENGTH,U ; Instructie lengte
          PSHS  A
          LDA   PAGE,U   ; Eventuele Page
          BEQ   EOJ1
          LBSR  PUT2H
          DEC   LENGTH,U
EOJ1      LEAX  PRTBUF+7,U
          STX   NXTBUF,U ; Opcode
          LDA   OPCD,U
          LBSR  PUT2H    ; in buffer
          DEC   LENGTH,U
          LDA   POSTB,U
          BEQ   EOJ2
          LBSR  PUT2H   ; Eventuele Postbyte
          DEC   LENGTH,U

*** Output operand bytes
EOJ2      LEAX  HEXB,U  ; Operand veld
          STX   NXTBUF,U
          TST   LENGTH,U
          BEQ   EOJ4
          LDA   BYTE1,U ; High operand
          LBSR  PUT2H
          DEC   LENGTH,U
          BEQ   EOJ4
          LDA   BYTE2,U ; Low operand
          LBSR  PUT2H

EOJ4      LEAX  BUFFER,U   ; Start buffer
          LDA   DISASMFL
          BITA  #%00010000 ; ASCII afdrukken?
          BNE   AS20
          LEAX  6,X        ; Skip ASCII buffer

AS20      JSR   [OUTCH,U]  ; Externe routine drukt af

          PULS  B          ; lengte instructie
          SEX
          ADDD  CURADR,U   ; Optellen bij start
          TFR D,X          ; geeft nieuw adres in X
          LEAS  LENBUF,U   ; Restore stack
          LDA   LENGTH,U   ; Instructie lengte in A
          PULS  B,Y,U,PC   ; en return
 PAG
*
*** Tabellen
*
*** Stack
STKTAB    FCC   'PSYXDBAC'

*
*** Transfer
REGTABCT  FCC   'DXYUSP**' ; met controle

          FCC   'ABCD****' ; op type


REGTABZC  FCC   'DXYUSP67' ; zonder controle

          FCC   'ABCDcdef' ; op type


NFCB      FCC  'FCB ' ' '+hiBit
 PAG
*
*** Mnemonic tabel
MNEMTAB   EQU   *
MT00      FCCH  '***'    ; Niet gedefinieerd
MT01      FCCH  'NEG'
MT02      FCCH  'COM'
MT03      FCCH  'LSR'
MT04      FCCH  'ROR'
MT05      FCCH  'ASR'
MT06      FCCH  'ASL'
MT07      FCCH  'ROL'
MT08      FCCH  'DEC'
MT09      FCCH  'INC'
MT10      FCCH  'TST'
MT11      FCCH  'JMP'
MT12      FCCH  'CLR'
MT13      FCCH  'NOP'
MT14      FCCH  'SYNC'
MT15      FCCH  'BRA'
MT16      FCCH  'BSR'
MT17      FCCH  'DAA'
MT18      FCCH  'ORCC'
MT19      FCCH  'ANDCC'
MT20      FCCH  'SEX'
MT21      FCCH  'EXG'
MT22      FCCH  'TFR'
MT23      FCCH  'BRN'
MT24      FCCH  'BHI'
MT25      FCCH  'BLS'
MT26      FCCH  'BHS'
MT27      FCCH  'BLO'
MT28      FCCH  'BNE'
MT29      FCCH  'BEQ'
MT30      FCCH  'BVC'
MT31      FCCH  'BVS'
MT32      FCCH  'BPL'
MT33      FCCH  'BMI'
MT34      FCCH  'BGE'
MT35      FCCH  'BLT'
MT36      FCCH  'BGT'
MT37      FCCH  'BLE'
MT38      FCCH  'LEAX'
MT39      FCCH  'LEAY'
MT40      FCCH  'LEAS'
MT41      FCCH  'LEAU'
MT42      FCCH  'PSHS'
MT43      FCCH  'PULS'
MT44      FCCH  'PSHU'
MT45      FCCH  'PULU'
MT46      FCCH  'RTS'
MT47      FCCH  'ABX'
MT48      FCCH  'RTI'
MT49      FCCH  'CWAI'
MT50      FCCH  'MUL'
MT51      FCCH  'SVC'
MT52      FCCH  'SWI'
MT53      FCCH  'SUBBA'
MT54      FCCH  'CMPA'
MT55      FCCH  'SBCA'
MT56      FCCH  'SUBD'
MT57      FCCH  'ANDA'
MT58      FCCH  'BITA'
MT59      FCCH  'LDA'
MT60      FCCH  'STA'
MT61      FCCH  'EORA'
MT62      FCCH  'ADCA'
MT63      FCCH  'ORA'
MT64      FCCH  'ADDA'
MT65      FCCH  'CMPX'
MT66      FCCH  'JSR'
MT67      FCCH  'LDX'
MT68      FCCH  'STX'

MT69      FCCH  'STD '

MT70      FCCH  'LDD '
MT71      FCCH  'ADDD'

MT72      FCCH  'DEBUG'
MT73      FCCH  'ERROR'
MT74      FCCH  'SYS'
MT75      FCCH  '#'
 PAG
*
*** Mnemonic Offset tabel
*
MNOSTAB   FCB   MT01-MT00       ; NEG   00 40-70
          FCB   MT00-MT00       ; ***   01 41-71
          FCB   MT00-MT00       ; ***   02 42-72
          FCB   MT02-MT00       ; COM   03 43-73
          FCB   MT03-MT00       ; LSR   04 44-74
          FCB   MT00-MT00       ; ***   05 45-75
          FCB   MT04-MT00       ; ROR   06 46-76
          FCB   MT05-MT00       ; ASR   07 47-77
          FCB   MT06-MT00       ; ASL   08 48-78
          FCB   MT07-MT00       ; ROL   09 49-79
          FCB   MT08-MT00       ; DEC   0A 4A-7A
          FCB   MT00-MT00       ; ***   0B 4B-7B
          FCB   MT09-MT00       ; INC   0C 4C-7C
          FCB   MT10-MT00       ; TST   0D 4D-7D
          FCB   MT11-MT00       ; JMP   0E 4E-7E
          FCB   MT12-MT00       ; CLR   0F 4F-7F

          FCB   MT00-MT00       ; PAG0  10
          FCB   MT00-MT00       ; PAG1  11
          FCB   MT13-MT00       ; NOP   12
          FCB   MT14-MT00       ; SYNC  13
          FCB   MT00-MT00       ; ***   14
          FCB   MT00-MT00       ; ***   15
          FCB   MT15-MT00       ; BRA   16
          FCB   MT16-MT00       ; BSR   17
          FCB   MT00-MT00       ; ***   18
          FCB   MT17-MT00       ; DAA   19
          FCB   MT18-MT00       ; ORCC  1A
          FCB   MT00-MT00       ; ***   1B
          FCB   MT19-MT00       ; ANDCC 1C
          FCB   MT20-MT00       ; SEX   1D
          FCB   MT21-MT00       ; EXG   1E
          FCB   MT22-MT00       ; TFR   1F

          FCB   MT15-MT00       ; BRA   20
          FCB   MT23-MT00       ; BRN   21
          FCB   MT24-MT00       ; BHI   22
          FCB   MT25-MT00       ; BLS   23
          FCB   MT26-MT00       ; BHS   24
          FCB   MT27-MT00       ; BLO   25
          FCB   MT28-MT00       ; BNE   26
          FCB   MT29-MT00       ; BEQ   27
          FCB   MT30-MT00       ; BVC   28
          FCB   MT31-MT00       ; BVS   29
          FCB   MT32-MT00       ; BPL   2A
          FCB   MT33-MT00       ; BMI   2B
          FCB   MT34-MT00       ; BGE   2C
          FCB   MT35-MT00       ; BLT   2D
          FCB   MT36-MT00       ; BGT   2E
          FCB   MT37-MT00       ; BLE   2F

          FCB   MT38-MT00       ; LEAX  30
          FCB   MT39-MT00       ; LEAY  31
          FCB   MT40-MT00       ; LEAS  32
          FCB   MT41-MT00       ; LEAU  33
          FCB   MT42-MT00       ; PSHS  34
          FCB   MT43-MT00       ; PULS  35
          FCB   MT44-MT00       ; PSHU  36
          FCB   MT45-MT00       ; PULU  37
          FCB   MT00-MT00       ; ***   38
          FCB   MT46-MT00       ; RTS   39
          FCB   MT47-MT00       ; ABX   3A
          FCB   MT48-MT00       ; RTI   3B
          FCB   MT49-MT00       ; CWAI  3C
          FCB   MT50-MT00       ; MUL   3D
          FCB   MT51-MT00       ; SVC   3E
          FCB   MT52-MT00       ; SWI   3F

          FCB   MT53-MT00       ; SUBA  80-F0
          FCB   MT54-MT00       ; CMPA  81-F1
          FCB   MT55-MT00       ; SBCA  82-F2
          FCB   MT56-MT00       ; SUBD  83-F3
          FCB   MT57-MT00       ; ANDA  84-F4
          FCB   MT58-MT00       ; BITA  85-F5
          FCB   MT59-MT00       ; LDA   86-F6
          FCB   MT60-MT00       ; STA   87-F7
          FCB   MT61-MT00       ; ORA   88-F8
          FCB   MT62-MT00       ; ADDA  89-F9
          FCB   MT63-MT00       ; ORA   8A-FA
          FCB   MT64-MT00       ; ADDA  8B-FB
          FCB   MT65-MT00       ; CMPX  8C-FC
          FCB   MT66-MT00       ; JSR   8D-FD
          FCB   MT67-MT00       ; LDX   8E-FE
          FCB   MT68-MT00       ; STX   8F-FF

          FCB   MT69-MT00       ; 80 STD
          FCB   MT70-MT00       ; 81 LDD
          FCB   MT71-MT00       ; 82 ADDD

          FCB   MT72-MT00       ; 83 DEBUG 21
          FCB   MT73-MT00       ; 84 ERROR 103F
          FCB   MT74-MT00       ; 85 SYS   113F
          FCB   MT75-MT00       ; 86 Laatste
          FCC  '#'              ; Einde marker
          END
