home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / develop / adev11 / examples / buffalo34f1 / buffalo34f1.a next >
Text File  |  1995-02-27  |  109KB  |  5,041 lines

  1.     PROCESSOR 68HC11
  2.  
  3. *                  BUFFALO
  4. * "Bit User's Fast Friendly Aid to Logical Operation"
  5. *
  6. * Rev 2.0 - 4/23/85 - added disassembler.
  7. *                   - variables now PTRn and TMPn.
  8. * Rev 2.1 - 4/29/85 - added byte erase to chgbyt routine.
  9. * Rev 2.2 - 5/16/85 - added hooks for evb board - acia
  10. *                     drivers, init and host routines.
  11. *           7/8/85  - fixed dump wraparound problem.
  12. *           7/10/85 - added evm board commands.
  13. *                   - added fill instruction.
  14. *           7/18/85 - added jump to EEPROM.
  15. * Rev 2.3 - 8/22/85 - call targco to disconnect sci from host
  16. *                     in reset routine for evb board.
  17. *           10/3/85 - modified load for download through terminal.
  18. * Rev 2.4 - 7/1/86  - Changed DFLOP address to fix conflicts with
  19. *                     EEPROM.  (was at A000)
  20. * Rev 2.5 - 9/8/86  - Modified to provide additional protection from
  21. *                     program run-away on power down.  Also fixed bugs
  22. *                     in MM and MOVE.  Changed to 1 stop bit from 2.
  23. * Rev 2.6 - 9/25/86 - Modified boot routine for variable length download
  24. *                     for use with 'HC11E8.
  25. * Rev 3.0   1/15/87 - EEPROM programming routines consolidated into WRITE.
  26. *                     Fill, Assem, and breakpoints will now do EEPROM.
  27. *                   - Added compare a to $0D to WSKIP routine.
  28. *           2/11/87 - Set up load to detect receiver error.
  29. * Rev 3.2   7/7/87  - Add disassembly to trace.
  30. *                   - Add entries to jump table.
  31. *           9/20/87 - Rewrote trace to use XIRQ, added STOPAT Command
  32. *           11/24/87- Write block protect reg for 'E9 version
  33. *                   - Modified variable length download for use
  34. *                       with 'E9 bootloader (XBOOT command)
  35. * Rev 3.3   3/17/88 - Set I bit to block interrupts on Warm Start and
  36. *                       return from CALL command.
  37. *                   - Added EEMOD Command.
  38. *                   - Rearranged source so that HELP command overlaps
  39. *                       EEPROM in test mode.
  40. *           3/24/88 - Added '+', '-', '=', '.' to MEM and ASM commands.
  41. *                   - Added check for 16 byte boundary to MEM
  42. *                       space sub-command.
  43. *                   - LOAD command now puts dummy (~) command into
  44. *                       inbuff so that any stray cr's won`t hang.
  45. * Rev 3.4   8/15/88 - Changed WRITE subroutine so that config register
  46. *                       gets byte erased before programmed.  The original
  47. *                       value of config is used for EEBYTE so that config
  48. *                       RAM value doesn't get changed in test mode.
  49. *           8/17/88 - Fixed MOVE command so that it doesn't hang when move
  50. *                       is done to a ROM location.
  51. *                   - Added OFFSET command for download offset capability.
  52. *
  53. ****************************************************
  54. *    Although the information contained herein,    *
  55. *    as well as any information provided relative  *
  56. *    thereto, has been carefully reviewed and is   *
  57. *    believed accurate, Motorola assumes no        *
  58. *    liability arising out of its application or   *
  59. *    use, neither does it convey any license under *
  60. *    its patent rights nor the rights of others.   *
  61. ****************************************************
  62.  
  63. ***************
  64. *   EQUATES   *
  65. ***************
  66. *Author    EQU    Tony Fourcroy
  67. RAMBS    EQU    $0000      start of ram
  68. REGBS    EQU    $1000      start of registers
  69. ROMBS    EQU    $E000      start of rom
  70. ***
  71. DSTREE    EQU    $BE00      start of eeprom  HC11F1
  72. DENDEE    EQU    $BFFF      end of eeprom    HC11F1
  73. ***
  74. APORT   EQU    REGBS+$00  port a
  75. PORTE    EQU    REGBS+$0A  port e
  76. CFORC    EQU    REGBS+$0B  force output compare
  77. TCNT    EQU    REGBS+$0E  timer count
  78. TOC5    EQU    REGBS+$1E  oc5 reg
  79. TCTL1    EQU    REGBS+$20  timer control 1
  80. TMSK1    EQU    REGBS+$22  timer mask 1
  81. TFLG1    EQU    REGBS+$23  timer flag 1
  82. TMSK2    EQU    REGBS+$24  timer mask 2
  83. BAUD    EQU    REGBS+$2B  sci baud reg
  84. SCCR1    EQU    REGBS+$2C  sci control1 reg
  85. SCCR2    EQU    REGBS+$2D  sci control2 reg
  86. SCSR    EQU    REGBS+$2E  sci status reg
  87. SCDAT    EQU    REGBS+$2F  sci data reg
  88. BPROT    EQU    REGBS+$35  block protect reg
  89. OPTION    EQU    REGBS+$39  option reg
  90. COPRST    EQU    REGBS+$3A  cop reset reg
  91. PPROG    EQU    REGBS+$3B  ee prog reg
  92. HPRIO    EQU    REGBS+$3C  hprio reg
  93. CONFIG    EQU    REGBS+$3F  config register
  94. ***  HC11F1 EXTRA    EQUATES
  95. CSCTL    EQU    REGBS+$5D  chip select control
  96. CSGADR    EQU    REGBS+$5E  general purpose cs
  97. CSGSIZ    EQU    REGBS+$5F  chip select size
  98. ***
  99. DFLOP    EQU    $4000      evb d flip flop
  100. DUART    EQU    $D000      duart address
  101. PORTA    EQU    DUART
  102. PORTB    EQU    DUART+8
  103. ACIA    EQU    $9800      acia address
  104. PROMPT    EQU    '>'
  105. BUFFLNG    EQU    35
  106. CTLA    EQU    $01        exit host or assembler
  107. CTLB    EQU    $02        send break to host
  108. CTLW    EQU    $17        wait
  109. CTLX    EQU    $18        abort
  110. DEL    EQU    $7F        abort
  111. EOT    EQU    $04        end of text/table
  112. SWI    EQU    $3F
  113. CS5D    EQU    $05    CSPROG @ $8OOO-$FFFF
  114. CS5E    EQU    $00    CSGEN  @ $0000
  115. CS5F    EQU    $01    CSGSIZ = 32K BYTES
  116. * original values
  117. *CS5D    EQU    $07    CSPROG @ $EOOO-$FFFF
  118. *CS5E    EQU    $C0    CSGEN  @ $C000
  119. *CS5F    EQU    $03    CSGSIZ = 8K BYTES
  120.  
  121. ***************
  122. *     RAM     *
  123. ***************
  124.     RSEG.z    BUFF_RAM
  125. *** Buffalo ram space ***
  126.     RMB    20    user stack area
  127. USTACK    RMB    30    monitor stack area
  128. STACK    RMB    1
  129. REGS    RMB    9     user's pc,y,x,a,b,c
  130. SP    RMB    2     user's sp
  131. INBUFF    RMB    BUFFLNG    input buffer
  132. ENDBUFF
  133. COMBUFF    RMB    8     command buffer
  134. SHFTREG    RMB    2     input shift register
  135. STREE    RMB    2     eeprom start address
  136. ENDEE    RMB    2     eeprom end address
  137. BRKTABL    RMB    8     breakpoint table
  138. AUTOLF    RMB    1     auto lf flag for i/o
  139. IODEV    RMB    1     0=sci,  1=acia, 2=duartA, 3=duartB
  140. EXTDEV    RMB    1     0=none, 1=acia, 2=duart,
  141. HOSTDEV    RMB    1     0=sci,  1=acia,           3=duartB
  142. COUNT    RMB    1     # characters read
  143. CHRCNT    RMB    1     # characters output on current line
  144. PTRMEM    RMB    2     current memory location
  145. LDOFFST    RMB    2     offset for download
  146.  
  147. *** Buffalo variables - used by: ***
  148. PTR0    RMB    2     main,readbuff,incbuff,AS
  149. PTR1    RMB    2     main,BR,DU,MO,AS,EX
  150. PTR2    RMB    2     EX,DU,MO,AS
  151. PTR3    RMB    2     EX,HO,MO,AS
  152. PTR4    RMB    2     EX,AS
  153. PTR5    RMB    2     EX,AS,BOOT
  154. PTR6    RMB    2     EX,AS,BOOT
  155. PTR7    RMB    2     EX,AS
  156. PTR8    RMB    2     AS
  157. TMP1    RMB    1     main,hexbin,buffarg,termarg
  158. TMP2    RMB    1     GO,HO,AS,LOAD
  159. TMP3    RMB    1     AS,LOAD
  160. TMP4    RMB    1     TR,HO,ME,AS,LOAD
  161. *** Vector jump table ***
  162. JSCI    RMB    3
  163. JSPI    RMB    3
  164. JPAIE    RMB    3
  165. JPAO    RMB    3
  166. JTOF    RMB    3
  167. JTOC5    RMB    3
  168. JTOC4    RMB    3
  169. JTOC3    RMB    3
  170. JTOC2    RMB    3
  171. JTOC1    RMB    3
  172. JTIC3    RMB    3
  173. JTIC2    RMB    3
  174. JTIC1    RMB    3
  175. JRTI    RMB    3
  176. JIRQ    RMB    3
  177. JXIRQ    RMB    3
  178. JSWI    RMB    3
  179. JILLOP    RMB    3
  180. JCOP    RMB    3
  181. JCLM    RMB    3
  182.  
  183.     RSEG.z    BUFF_RAM2
  184.  
  185. *****************
  186. *
  187. * ROM starts here *
  188. *
  189. *****************
  190.  
  191.     RSEG    CODE
  192.  
  193. *****************
  194. **  BUFFALO - This is where Buffalo starts
  195. ** out of reset.  All initialization is done
  196. ** here including determination of where the
  197. ** user terminal is (SCI,ACIA, or DUART).
  198. *****************
  199.  
  200. BUFFALO  LDX     #PORTE
  201.     BRCLR    0,X,$01,BUFISIT if bit 0 of port e is 1
  202.     JMP    DSTREE      then jump to the start of EEPROM
  203. BUFISIT  LDAA    #$93
  204.     STAA    OPTION      adpu, dly, irqe, cop
  205.     LDAA    #$00
  206.     STAA    TMSK2       timer pre = %1 for trace
  207.     LDAA    #$00
  208.     STAA    BPROT       clear 'E9 eeprom block protect
  209.     LDX    #DSTREE     set up default eeprom address range
  210.     STX    STREE
  211.     LDX    #DENDEE
  212.     STX    ENDEE
  213. **********************
  214. * HC11F1 EXTRA INITS *
  215. **********************
  216.     LDAA    #CS5D
  217.     STAA    CSCTL
  218.     LDAA    #CS5E
  219.     STAA    CSGADR
  220.     LDAA    #CS5F
  221.     STAA    CSGSIZ
  222. *********************
  223.     LDX    #$0000      set up default download offset
  224.     STX    LDOFFST
  225.     LDS    #STACK      monitor stack pointer
  226.     JSR    VECINIT
  227.     LDX    #USTACK
  228.     STX    SP    default user stack
  229.     LDAA    TCTL1
  230.     ORAA    #$03
  231.     STAA    TCTL1       force oc5 pin high for trace
  232.     LDAA    #$D0
  233.     STAA    REGS+8      default user ccr
  234.     LDD    #$3F0D      initial command is ?
  235.     STD    INBUFF
  236.     JSR    BPCLR       clear breakpoints
  237.     CLR    AUTOLF
  238.     INC    AUTOLF      auto cr/lf = on
  239.  
  240. * Determine type of external comm device - none, or acia *
  241.  
  242.     CLR    EXTDEV      default is none
  243.     LDAA    HPRIO
  244.     ANDA    #$20
  245.     BEQ    BUFF2       jump if single chip mode
  246.     LDAA    #$03        see if external acia exists
  247.     STAA    ACIA        master reset
  248.     LDAA    ACIA
  249.     ANDA    #$7F        mask irq bit from status register
  250.     BNE    BUFF1       jump if status reg not 0
  251.     LDAA    #$12
  252.     STAA    ACIA        turn on acia
  253.     LDAA    ACIA
  254.     ANDA    #$02
  255.     BEQ    BUFF1       jump if tdre not set
  256.     LDAA    #$01
  257.     STAA    EXTDEV      external device is acia
  258.     BRA    BUFF2
  259.  
  260. BUFF1    LDAA    DUART+$0C  read IRQ vector register
  261.     CMPA    #$0F       should be out of reset
  262.     BNE    BUFF2
  263.     LDAA    #$AA
  264.     STAA    DUART+$0C   write irq vector register
  265.     LDAA    DUART+$0C   read irq vector register
  266.     CMPA    #$AA
  267.     BNE    BUFF2
  268.     LDAA #$02
  269.     STAA EXTDEV      external device is duart A
  270.  
  271. * Find terminal port - SCI or external. *
  272.  
  273. BUFF2    CLR  IODEV
  274.     JSR  TARGCO    disconnect sci for evb board
  275.     JSR  SIGNON    initialize sci
  276.     LDAA EXTDEV
  277.     BEQ  BUFF3     jump if no external device
  278.     STAA IODEV
  279.     JSR  SIGNON    initialize external device
  280. BUFF3    CLR  IODEV
  281.     JSR  INPUT     get input from sci port
  282.     CMPA #$0D
  283.     BEQ  BUFF4     jump if cr - sci is terminal port
  284.     LDAA EXTDEV
  285.     BEQ  BUFF3     jump if no external device
  286.     STAA IODEV
  287.     JSR  INPUT     get input from external device
  288.     CMPA #$0D
  289.     BEQ  BUFF4     jump if cr - terminal found ext
  290.     BRA  BUFF3
  291.  
  292. SIGNON   JSR  INIT        initialize device
  293.     LDX  #MSG1       buffalo message
  294.     JSR  OUTSTRG
  295.     RTS
  296.  
  297. * Determine where host port should be. *
  298.  
  299. BUFF4    CLR  HOSTDEV     default - host = sci port
  300.     LDAA IODEV
  301.     CMPA #$01
  302.     BEQ  BUFF5       default host if term = acia
  303.     LDAA #$03
  304.     STAA HOSTDEV     else host is duart port b
  305. BUFF5
  306.  
  307. *****************
  308. **  MAIN - This module reads the user's input into
  309. ** a buffer called INBUFF.  The first field (assumed
  310. ** to be the command field) is then parsed into a
  311. ** second buffer called COMBUFF.  The command table
  312. ** is then searched for the contents of COMBUFF and
  313. ** if found, the address of the corresponding task
  314. ** routine is fetched from the command table.  The
  315. ** task is then called as a subroutine so that
  316. ** control returns back to here upon completion of
  317. ** the task.  Buffalo expects the following format
  318. ** for commands:
  319. **     <cmd>[<wsp><arg><wsp><arg>...]<cr>
  320. ** [] implies contents optional.
  321. ** <wsp> means whitespace character (space,comma,tab).
  322. ** <cmd> = command string of 1-8 characters.
  323. ** <arg> = Argument particular to the command.
  324. ** <cr> = Carriage return signifying end of input string.
  325. *****************
  326. * Prompt user
  327. *do
  328. *   a=input();
  329. *   if(a==(cntlx or del)) continue;
  330. *   elseif(a==backspace)
  331. *      b--;
  332. *      if(b<0) b=0;
  333. *   else
  334. *      if(a==cr && buffer empty)
  335. *         repeat last command;
  336. *      else put a into buffer;
  337. *         check if buffer full;
  338. *while(a != (cr or /)
  339. MAIN     SEI      block interrupts
  340.     LDS  #STACK    initialize sp every time
  341.     CLR  AUTOLF
  342.     INC  AUTOLF    auto cr/lf = on
  343.     JSR  OUTCRLF
  344.     LDAA #PROMPT   prompt user
  345.     JSR  OUTPUT
  346.     CLRB
  347. MAIN1    JSR  INCHAR    read terminal
  348.     LDX  #INBUFF
  349.     ABX      pointer into buffer
  350.     CMPA #CTLX
  351.     BEQ  MAIN      jump if cntl X
  352.     CMPA #DEL
  353.     BEQ  MAIN      jump if del
  354.     CMPA #$08
  355.     BNE  MAIN2     jump if not bckspc
  356.     DECB
  357.     BLT  MAIN      jump if buffer empty
  358.     BRA  MAIN1
  359. MAIN2    CMPA #$D
  360.     BNE  MAIN3     jump if not cr
  361.     TSTB
  362.     BEQ  COMM0     jump if buffer empty
  363.     STAA ,X        put a in buffer
  364.     BRA  COMM0
  365. MAIN3    STAA ,X        put a in buffer
  366.     INCB
  367.     CMPB #BUFFLNG
  368.     BLE  MAIN4     jump if not long
  369.     LDX  #MSG3     "long"
  370.     JSR  OUTSTRG
  371.     BRA  MAIN
  372. MAIN4    CMPA #'/'
  373.     BNE  MAIN1     jump if not "/"
  374. *        *******************
  375.  
  376. *****************
  377. *  Parse out and evaluate the command field.
  378. *****************
  379. *Initialize
  380.  
  381. COMM0    CLR  TMP1        Enable "/" command
  382.     CLR  SHFTREG
  383.     CLR  SHFTREG+1
  384.     CLRB
  385.     LDX  #INBUFF     ptrbuff[] = inbuff[]
  386.     STX  PTR0
  387.     JSR  WSKIP       find first char
  388.  
  389. *while((a=readbuff) != (cr or wspace))
  390. *     upcase(a);
  391. *     buffptr[b] = a
  392. *     b++
  393. *     if (b > 8) error(too long);
  394. *     if(a == "/")
  395. *          if(enabled) mslash();
  396. *          else error(command?);
  397. *     else hexbin(a);
  398.  
  399. COMM1    JSR  READBUFF  read from buffer
  400.     LDX  #COMBUFF
  401.     ABX
  402.     JSR  UPCASE    convert to upper case
  403.     STAA ,X        put in command buffer
  404.     CMPA #$0D
  405.     BEQ  SRCH      jump if cr
  406.     JSR  WCHEK
  407.     BEQ  SRCH      jump if wspac
  408.     JSR  INCBUFF   move buffer pointer
  409.     INCB
  410.     CMPB #$8
  411.     BLE  COMM2
  412.     LDX  #MSG3     "long"
  413.     JSR  OUTSTRG
  414.     JMP  MAIN
  415.  
  416. COMM2    CMPA #'/'
  417.     BNE  COMM4       jump if not "/"
  418.     TST  TMP1
  419.     BNE  COMM3       jump if not enabled
  420.     DECB
  421.     STAB COUNT
  422.     LDX  #MSLASH
  423.     JMP  EXEC        execute "/"
  424. COMM3    LDX  #MSG8       "command?"
  425.     JSR  OUTSTRG
  426.     JMP  MAIN
  427. COMM4    JSR  HEXBIN
  428.     BRA  COMM1
  429.  
  430. *****************
  431. *   Search tables for command.  At this point,
  432. * COMBUFF holds the command field to be executed,
  433. * and B = # of characters in the command field.
  434. * The command table holds the whole command name
  435. * but only the first n characters of the command
  436. * must match what is in COMBUFF where n is the
  437. * number of characters entered by the user.
  438. *****************
  439. *count = b;
  440. *ptr1 = comtabl;
  441. *while(ptr1[0] != end of table)
  442. *   ptr1 = next entry
  443. *   for(b=1; b=count; b++)
  444. *      if(ptr1[b] == combuff[b]) continue;
  445. *      else error(not found);
  446. *   execute task;
  447. *  return();
  448. *return(command not found);
  449.  
  450. SRCH    STAB COUNT     size of command entered
  451.     LDX  #COMTABL  pointer to table
  452.     STX  PTR1      pointer to next entry
  453. SRCH1   LDX  PTR1
  454.     LDY  #COMBUFF  pointer to command buffer
  455.     LDAB 0,X
  456.     CMPB #$FF
  457.     BNE  SRCH2
  458.     LDX  #MSG2     "command not found"
  459.     JSR  OUTSTRG
  460.     JMP  MAIN
  461. SRCH2   PSHX      compute next table entry
  462.     ADDB #$3
  463.     ABX
  464.     STX  PTR1
  465.     PULX
  466.     CLRB
  467. SRCHLP  INCB      match characters loop
  468.     LDAA 1,X        read table
  469.     CMPA 0,Y        compare to combuff
  470.     BNE  SRCH1      try next entry
  471.     INX       move pointers
  472.     INY
  473.     CMPB COUNT
  474.     BLT  SRCHLP     loop countu1 times
  475.     LDX  PTR1
  476.     DEX
  477.     DEX
  478.     LDX  0,X     jump address from table
  479. EXEC    JSR  0,X     call task as subroutine
  480.     JMP  MAIN
  481. *
  482. *****************
  483. *   UTILITY SUBROUTINES - These routines
  484. * are called by any of the task routines.
  485. *****************
  486. *****************
  487. *  UPCASE(a) - If the contents of A is alpha,
  488. * returns a converted to uppercase.
  489. *****************
  490. UPCASE   CMPA #'a'
  491.     BLT  UPCASE1      jump if < a
  492.     CMPA #'z'
  493.     BGT  UPCASE1      jump if > z
  494.     SUBA #$20         convert
  495. UPCASE1  RTS
  496.  
  497. *****************
  498. *  BPCLR() - Clear all entries in the
  499. * table of breakpoints.
  500. *****************
  501. BPCLR    LDX  #BRKTABL
  502.     LDAB #8
  503. BPCLR1   CLR  0,X
  504.     INX
  505.     DECB
  506.     BGT  BPCLR1      loop 8 times
  507.     RTS
  508.  
  509. *****************
  510. *  RPRNT1(x) - Prints name and contents of a single
  511. * user register. On entry X points to name of register
  512. * in reglist.  On exit, a=register name.
  513. *****************
  514. REGLIST  FCC    "PYXABCS"       names
  515.     FCB    0,2,4,6,7,8,9   offset
  516.     FCB    1,1,1,0,0,0,1   size
  517. RPRNT1   LDAA 0,X
  518.     PSHA
  519.     PSHX
  520.     JSR  OUTPUT      name
  521.     LDAA #'-'
  522.     JSR  OUTPUT      dash
  523.     LDAB 7,X         contents offset
  524.     LDAA 14,X        bytesize
  525.     LDX  #REGS       address
  526.     ABX
  527.     TSTA
  528.     BEQ  RPRN2       jump if 1 byte
  529.     JSR  OUT1BYT     2 bytes
  530. RPRN2    JSR  OUT1BSP
  531.     PULX
  532.     PULA
  533.     RTS
  534.  
  535. *****************
  536. *  RPRINT() - Print the name and contents
  537. * of all the user registers.
  538. *****************
  539. RPRINT   PSHX
  540.     LDX  #REGLIST
  541. RPRI1    JSR  RPRNT1      print name
  542.     INX
  543.     CMPA #'S'        s is last register
  544.     BNE  RPRI1       jump if not done
  545.     PULX
  546.     RTS
  547.  
  548. *****************
  549. *   HEXBIN(a) - Convert the ASCII character in a
  550. * to binary and shift into shftreg.  Returns value
  551. * in tmp1 incremented if a is not hex.
  552. *****************
  553. HEXBIN  PSHA
  554.     PSHB
  555.     PSHX
  556.     JSR  UPCASE     convert to upper case
  557.     CMPA #'0'
  558.     BLT  HEXNOT     jump if a < $30
  559.     CMPA #'9'
  560.     BLE  HEXNMB     jump if 0-9
  561.     CMPA #'A'
  562.     BLT  HEXNOT     jump if $39> a <$41
  563.     CMPA #'F'
  564.     BGT  HEXNOT     jump if a > $46
  565.     ADDA #$9        convert $A-$F
  566. HEXNMB  ANDA #$0F       convert to binary
  567.     LDX  #SHFTREG
  568.     LDAB #4
  569. HEXSHFT ASL  1,X        2 byte shift through
  570.     ROL  0,X         carry bit
  571.     DECB
  572.     BGT  HEXSHFT    shift 4 times
  573.     ORAA 1,X
  574.     STAA 1,X
  575.     BRA  HEXRTS
  576. HEXNOT  INC  TMP1       indicate not hex
  577. HEXRTS  PULX
  578.     PULB
  579.     PULA
  580.     RTS
  581.  
  582. *****************
  583. *  BUFFARG() - Build a hex argument from the
  584. * contents of the input buffer. Characters are
  585. * converted to binary and shifted into shftreg
  586. * until a non-hex character is found.  On exit
  587. * shftreg holds the last four digits read, count
  588. * holds the number of digits read, ptrbuff points
  589. * to the first non-hex character read, and A holds
  590. * that first non-hex character.
  591. *****************
  592. *Initialize
  593. *while((a=readbuff()) not hex)
  594. *     hexbin(a);
  595. *return();
  596.  
  597. BUFFARG  CLR  TMP1        not hex indicator
  598.     CLR  COUNT       # or digits
  599.     CLR  SHFTREG
  600.     CLR  SHFTREG+1
  601.     JSR  WSKIP
  602. BUFFLP   JSR  READBUFF    read char
  603.     JSR  HEXBIN
  604.     TST  TMP1
  605.     BNE  BUFFRTS     jump if not hex
  606.     INC  COUNT
  607.     JSR  INCBUFF     move buffer pointer
  608.     BRA  BUFFLP
  609. BUFFRTS  RTS
  610.  
  611. *****************
  612. *  TERMARG() - Build a hex argument from the
  613. * terminal.  Characters are converted to binary
  614. * and shifted into shftreg until a non-hex character
  615. * is found.  On exit shftreg holds the last four
  616. * digits read, count holds the number of digits
  617. * read, and A holds the first non-hex character.
  618. *****************
  619. *initialize
  620. *while((a=inchar()) == hex)
  621. *     if(a = cntlx or del)
  622. *          abort;
  623. *     else
  624. *          hexbin(a); countu1++;
  625. *return();
  626.  
  627. TERMARG  CLR  COUNT
  628.     CLR  SHFTREG
  629.     CLR  SHFTREG+1
  630. TERM0    JSR  INCHAR
  631.     CMPA #CTLX
  632.     BEQ  TERM1     jump if controlx
  633.     CMPA #DEL
  634.     BNE  TERM2     jump if not delete
  635. TERM1    JMP  MAIN      abort
  636. TERM2    CLR  TMP1      hex indicator
  637.     JSR  HEXBIN
  638.     TST  TMP1
  639.     BNE  TERM3     jump if not hex
  640.     INC  COUNT
  641.     BRA  TERM0
  642. TERM3    RTS
  643.  
  644. *****************
  645. *   CHGBYT() - If shftreg is not empty, put
  646. * contents of shftreg at address in X.  If X
  647. * is an address in EEPROM then program it.
  648. *****************
  649. *if(count != 0)
  650. *   (x) = a;
  651. CHGBYT   TST  COUNT
  652.     BEQ  CHGBYT4   quit if shftreg empty
  653.     LDAA SHFTREG+1 get data into a
  654.     JSR  WRITE
  655. CHGBYT4  RTS
  656.  
  657.  
  658. *****************
  659. * WRITE() - This routine is used to write the
  660. *contents of A to the address of X.  If the
  661. *address is in EEPROM, it will be programmed
  662. *and if it is already programmed, it will be
  663. *byte erased first.
  664. ******************
  665. *if(X == config) then
  666. *   byte erase config;
  667. *if(X is eeprom)then
  668. *   if(not erased) then erase;
  669. *   program (x) = A;
  670. *write (x) = A;
  671. *if((x) != A) error(rom);
  672. WRITE   CPX  #CONFIG
  673.     BEQ  WRITE0     jump if config
  674.     CPX  STREE      start of EE
  675.     BLO  WRITE2     jump if not EE
  676.     CPX  ENDEE      end of EE
  677.     BHI  WRITE2     jump if not EE
  678. WRITEE  PSHB      check if byte erased
  679.     LDAB 0,X
  680.     CMPB #$FF
  681.     PULB
  682.     BEQ  WRITE1     jump if erased
  683. WRITE0  JSR  EEBYTE     byte erase
  684. WRITE1  JSR  EEWRIT     byte program
  685. WRITE2  STAA 0,X        write for non EE
  686.     CMPA 0,X
  687.     BEQ  WRITE3     jump if write ok
  688.     PSHX
  689.     LDX  #MSG6      "rom"
  690.     JSR  OUTSTRG
  691.     PULX
  692. WRITE3  RTS
  693.  
  694.  
  695. *****************
  696. *   EEWRIT(), EEBYTE(), EEBULK() -
  697. * These routines are used to program and eeprom
  698. *locations.  eewrite programs the address in X with
  699. *the value in A, eebyte does a byte address at X,
  700. *and eebulk does a bulk of eeprom.  Whether eebulk
  701. *erases the config or not depends on the address it
  702. *receives in X.
  703. ****************
  704. EEWRIT  PSHB
  705.     LDAB #$02
  706.     STAB PPROG
  707.     STAA 0,X
  708.     LDAB #$03
  709.     BRA  EEPROG
  710. ***
  711. EEBYTE  PSHB
  712.     LDAB #$16
  713.     STAB PPROG
  714.     LDAB #$FF
  715.     STAB 0,X
  716.     LDAB #$17
  717.     BRA  EEPROG
  718. ***
  719. EEBULK  PSHB
  720.     LDAB #$06
  721.     STAB PPROG
  722.     STAA 0,X        erase config or not ...
  723.     LDAB #$07         ... depends on X addr
  724. EEPROG  BNE  ACL1
  725.     CLRB      fail safe
  726. ACL1    STAB PPROG
  727.     PULB
  728. ***
  729. DLY10MS PSHX      delay 10ms at E = 2MHz
  730.     LDX  #$0D06
  731. DLYLP   DEX
  732.     BNE  DLYLP
  733.     PULX
  734.     CLR  PPROG
  735.     RTS
  736.  
  737.  
  738. *****************
  739. *  READBUFF() -  Read the character in INBUFF
  740. * pointed at by ptrbuff into A.  Returns ptrbuff
  741. * unchanged.
  742. *****************
  743. READBUFF PSHX
  744.     LDX  PTR0
  745.     LDAA 0,X
  746.     PULX
  747.     RTS
  748.  
  749. *****************
  750. *  INCBUFF(), DECBUFF() - Increment or decrement
  751. * ptrbuff.
  752. *****************
  753. INCBUFF  PSHX
  754.     LDX  PTR0
  755.     INX
  756.     BRA  INCDEC
  757. DECBUFF  PSHX
  758.     LDX  PTR0
  759.     DEX
  760. INCDEC   STX  PTR0
  761.     PULX
  762.     RTS
  763.  
  764. *****************
  765. *  WSKIP() - Read from the INBUFF until a
  766. * non whitespace (space, comma, tab) character
  767. * is found.  Returns ptrbuff pointing to the
  768. * first non-whitespace character and a holds
  769. * that character.  WSKIP also compares a to
  770. * $0D (CR) and cond codes indicating the
  771. * results of that compare.
  772. *****************
  773. WSKIP    JSR  READBUFF  read character
  774.     JSR  WCHEK
  775.     BNE  WSKIP1    jump if not wspc
  776.     JSR  INCBUFF   move pointer
  777.     BRA  WSKIP     loop
  778. WSKIP1   CMPA #$0D
  779.     RTS
  780.  
  781. *****************
  782. *  WCHEK(a) - Returns z=1 if a holds a
  783. * whitespace character, else z=0.
  784. *****************
  785. WCHEK    CMPA #$2C      comma
  786.     BEQ  WCHEK1
  787.     CMPA #$20      space
  788.     BEQ  WCHEK1
  789.     CMPA #$09      tab
  790. WCHEK1   RTS
  791.  
  792. *****************
  793. *   DCHEK(a) - Returns Z=1 if a = whitespace
  794. * or carriage return.  Else returns z=0.
  795. *****************
  796. DCHEK   JSR  WCHEK
  797.     BEQ  DCHEK1     jump if whitespace
  798.     CMPA #$0D
  799. DCHEK1  RTS
  800.  
  801. *****************
  802. *  CHKABRT() - Checks for a control x or delete
  803. * from the terminal.  If found, the stack is
  804. * reset and the control is transferred to main.
  805. * Note that this is an abnormal termination.
  806. *   If the input from the terminal is a control W
  807. * then this routine keeps waiting until any other
  808. * character is read.
  809. *****************
  810. *a=input();
  811. *if(a=cntl w) wait until any other key;
  812. *if(a = cntl x or del) abort;
  813.  
  814. CHKABRT  JSR  INPUT
  815.     BEQ  CHK4      jump if no input
  816.     CMPA #CTLW
  817.     BNE  CHK2      jump in not cntlw
  818. CHKABRT1 JSR  INPUT
  819.     BEQ  CHKABRT1  jump if no input
  820. CHK2     CMPA #DEL
  821.     BEQ  CHK3      jump if delete
  822.     CMPA #CTLX
  823.     BEQ  CHK3      jump if control x
  824.     CMPA #CTLA
  825.     BNE  CHK4      jump not control a
  826. CHK3     JMP  MAIN      abort
  827. CHK4     RTS      return
  828.  
  829. ***********************
  830. *  HOSTCO - connect sci to host for evb board.
  831. *  TARGCO - connect sci to target for evb board.
  832. ***********************
  833. HOSTCO   PSHA
  834.     LDAA #$01
  835.     STAA DFLOP     send 1 to d-flop
  836.     PULA
  837.     RTS
  838.  
  839. TARGCO   PSHA
  840.     LDAA #$00
  841.     STAA DFLOP     send 0 to d-flop
  842.     PULA
  843.     RTS
  844.  
  845. *
  846. **********
  847. *
  848. *     VECINIT - This routine checks for
  849. *        vectors in the RAM table.  All
  850. *        uninitialized vectors are programmed
  851. *        to JMP STOPIT
  852. *
  853. **********
  854. *
  855. VECINIT  LDX  #JSCI     Point to First RAM Vector
  856.     LDY  #STOPIT   Pointer to STOPIT routine
  857.     LDD  #$7E03    A=JMP opcode; B=offset
  858. VECLOOP  CMPA 0,X
  859.     BEQ  VECNEXT   If vector already in
  860.     STAA 0,X       install JMP
  861.     STY  1,X       to STOPIT routine
  862. VECNEXT  ABX      Add 3 to point at next vector
  863.     CPX  #JCLM+3   Done?
  864.     BNE  VECLOOP   If not, continue loop
  865.     RTS
  866. *
  867. STOPIT   LDAA #$50      Stop-enable; IRQ, XIRQ-Off
  868.     TAP
  869.     STOP     You are lost!  Shut down
  870.     JMP  STOPIT    In case continue by XIRQ
  871.  
  872. **********
  873. *
  874. *   I/O MODULE
  875. *     Communications with the outside world.
  876. * 3 I/O routines (INIT, INPUT, and OUTPUT) call
  877. * drivers specified by IODEV (0=SCI, 1=ACIA,
  878. * 2=DUARTA, 3=DUARTB).
  879. *
  880. **********
  881. *   INIT() - Initialize device specified by iodev.
  882. *********
  883. *
  884. INIT     PSHA        save registers
  885.     PSHX
  886.     LDAA IODEV
  887.     CMPA #$00
  888.     BNE  INIT1     jump not sci
  889.     JSR  ONSCI     initialize sci
  890.     BRA  INIT4
  891. INIT1    CMPA #$01
  892.     BNE  INIT2     jump not acia
  893.     JSR  ONACIA    initialize acia
  894.     BRA  INIT4
  895. INIT2    LDX  #PORTA
  896.     CMPA #$02
  897.     BEQ  INIT3     jump duart a
  898.     LDX  #PORTB
  899. INIT3    JSR  ONUART    initialize duart
  900. INIT4    PULX         restore registers
  901.     PULA
  902.     RTS
  903.  
  904. **********
  905. *  INPUT() - Read device. Returns a=char or 0.
  906. *    This routine also disarms the cop.
  907. **********
  908. INPUT    PSHX
  909.     LDAA #$55    reset cop
  910.     STAA COPRST
  911.     LDAA #$AA
  912.     STAA COPRST
  913.     LDAA IODEV
  914.     BNE  INPUT1    jump not sci
  915.     JSR  INSCI     read sci
  916.     BRA  INPUT4
  917. INPUT1   CMPA #$01
  918.     BNE  INPUT2    jump not acia
  919.     JSR  INACIA    read acia
  920.     BRA  INPUT4
  921. INPUT2   LDX  #PORTA
  922.     CMPA #$02
  923.     BEQ  INPUT3    jump if duart a
  924.     LDX  #PORTB
  925. INPUT3   JSR  INUART    read uart
  926. INPUT4   PULX
  927.     RTS
  928.  
  929. **********
  930. *   OUTPUT() - Output character in A.
  931. * chrcnt indicates the current column on the
  932. *output display.  It is incremented every time
  933. *a character is outputted, and cleared whenever
  934. *the subroutine outcrlf is called.
  935. **********
  936.  
  937. OUTPUT   PSHA         save registers
  938.     PSHB
  939.     PSHX
  940.     LDAB IODEV
  941.     BNE  OUTPUT1   jump not sci
  942.     JSR  OUTSCI    write sci
  943.     BRA  OUTPUT4
  944. OUTPUT1  CMPB #$01
  945.     BNE  OUTPUT2   jump not acia
  946.     JSR  OUTACIA   write acia
  947.     BRA  OUTPUT4
  948. OUTPUT2  LDX  #PORTA
  949.     CMPB #$02
  950.     BEQ  OUTPUT3   jump if duart a
  951.     LDX  #PORTB
  952. OUTPUT3  JSR  OUTUART   write uart
  953. OUTPUT4  PULX
  954.     PULB
  955.     PULA
  956.     INC  CHRCNT    increment column count
  957.     RTS
  958.  
  959. **********
  960. *   ONUART(port) - Initialize a duart port.
  961. * Sets duart to internal clock, divide by 16,
  962. * 8 data + 1 stop bits.
  963. **********
  964.  
  965. ONUART   LDAA #$22
  966.     STAA 2,X         reset receiver
  967.     LDAA #$38
  968.     STAA 2,X         reset transmitter
  969.     LDAA #$40
  970.     STAA 2,X         reset error status
  971.     LDAA #$10
  972.     STAA 2,X         reset pointer
  973.     LDAA #$00
  974.     STAA DUART+4     clock source
  975.     LDAA #$00
  976.     STAA DUART+5     interrupt mask
  977.     LDAA #$13
  978.     STAA 0,X         8 data, no parity
  979.     LDAA #$07
  980.     STAA 0,X         1 stop bits
  981.     LDAA #$BB        baud rate (9600)
  982.     STAA 1,X         tx and rcv baud rate
  983.     LDAA #$05
  984.     STAA 2,X         enable tx and rcv
  985.     RTS
  986.  
  987. **********
  988. *   INUART(port) - Check duart for any input.
  989. **********
  990. INUART   LDAA 1,X         read status
  991.     ANDA #$01        check rxrdy
  992.     BEQ  INUART1     jump if no data
  993.     LDAA 3,X         read data
  994.     ANDA #$7F        mask parity
  995. INUART1  RTS
  996.  
  997. **********
  998. *   OUTUART(port) - Output the character in a.
  999. *        if autolf=1, transmits cr or lf as crlf.
  1000. **********
  1001. OUTUART  TST  AUTOLF
  1002.     BEQ  OUTUART2    jump if no autolf
  1003.     BSR  OUTUART2
  1004.     CMPA #$0D
  1005.     BNE  OUTUART1
  1006.     LDAA #$0A        if cr, output lf
  1007.     BRA  OUTUART2
  1008. OUTUART1 CMPA #$0A
  1009.     BNE  OUTUART3
  1010.     LDAA #$0D        if lf, output cr
  1011. OUTUART2 LDAB 1,X         check status
  1012.     ANDB #$4
  1013.     BEQ  OUTUART2    loop until tdre=1
  1014.     ANDA #$7F        mask parity
  1015.     STAA 3,X         send character
  1016. OUTUART3 RTS
  1017.  
  1018. **********
  1019. *   ONSCI() - Initialize the SCI for 9600
  1020. *                 baud at 8 MHz Extal.
  1021. **********
  1022. ONSCI    LDAA #$30
  1023.     STAA BAUD        baud register
  1024.     LDAA #$00
  1025.     STAA SCCR1
  1026.     LDAA #$0C
  1027.     STAA SCCR2       enable
  1028.     RTS
  1029.  
  1030. **********
  1031. *   INSCI() - Read from SCI.  Return a=char or 0.
  1032. **********
  1033. INSCI    LDAA SCSR      read status reg
  1034.     ANDA #$20      check rdrf
  1035.     BEQ  INSCI1    jump if no data
  1036.     LDAA SCDAT     read data
  1037.     ANDA #$7F      mask parity
  1038. INSCI1   RTS
  1039.  
  1040. **********
  1041. *  OUTSCI() - Output A to sci. IF autolf = 1,
  1042. *               cr and lf sent as crlf.
  1043. **********
  1044. OUTSCI   TST  AUTOLF
  1045.     BEQ  OUTSCI2     jump if autolf=0
  1046.     BSR  OUTSCI2
  1047.     CMPA #$0D
  1048.     BNE  OUTSCI1
  1049.     LDAA #$0A        if cr, send lf
  1050.     BRA  OUTSCI2
  1051. OUTSCI1  CMPA #$0A
  1052.     BNE  OUTSCI3
  1053.     LDAA #$0D        if lf, send cr
  1054. OUTSCI2  LDAB SCSR        read status
  1055.     BITB #$80
  1056.     BEQ  OUTSCI2     loop until tdre=1
  1057.     ANDA #$7F        mask parity
  1058.     STAA SCDAT       send character
  1059. OUTSCI3  RTS
  1060.  
  1061. **********
  1062. *   ONACIA - Initialize the ACIA for
  1063. * 8 data bits, 1 stop bit, divide by 64 clock.
  1064. **********
  1065. ONACIA   LDX  #ACIA
  1066.     LDAA #$03
  1067.     STAA 0,X       master reset
  1068.     LDAA #$16
  1069.     STAA 0,X       setup
  1070.     RTS
  1071.  
  1072. **********
  1073. *   INACIA - Read from the ACIA, Return a=char or 0.
  1074. * Tmp3 is used to flag overrun or framing error.
  1075. **********
  1076. INACIA   LDX  #ACIA
  1077.     LDAA 0,X       read status register
  1078.     PSHA
  1079.     ANDA #$30      check ov, fe
  1080.     PULA
  1081.     BEQ  INACIA1   jump - no error
  1082.     LDAA #$01
  1083.     STAA TMP3      flag reciever error
  1084.     BRA  INACIA2   read data to clear status
  1085. INACIA1  ANDA #$01      check rdrf
  1086.     BEQ  INACIA3   jump if no data
  1087. INACIA2  LDAA 1,X       read data
  1088.     ANDA #$7F      mask parity
  1089. INACIA3  RTS
  1090.  
  1091. **********
  1092. *  OUTACIA - Output A to acia. IF autolf = 1,
  1093. *               cr or lf sent as crlf.
  1094. **********
  1095. OUTACIA  BSR  OUTACIA3  output char
  1096.     TST  AUTOLF
  1097.     BEQ  OUTACIA2  jump no autolf
  1098.     CMPA #$0D
  1099.     BNE  OUTACIA1
  1100.     LDAA #$0A
  1101.     BSR  OUTACIA3  if cr, output lf
  1102.     BRA  OUTACIA2
  1103. OUTACIA1 CMPA #$0A
  1104.     BNE  OUTACIA2
  1105.     LDAA #$0D
  1106.     BSR  OUTACIA3  if lf, output cr
  1107. OUTACIA2 RTS
  1108.  
  1109. OUTACIA3 LDX  #ACIA
  1110.     LDAB 0,X
  1111.     BITB #$2
  1112.     BEQ  OUTACIA3  loop until tdre
  1113.     ANDA #$7F      mask parity
  1114.     STAA 1,X       output
  1115.     RTS
  1116. *
  1117. *        Space for modifying OUTACIA routine
  1118. *
  1119.     FDB    $FFFF,$FFFF,$FFFF,$FFFF
  1120. *******************************
  1121. *** I/O UTILITY SUBROUTINES ***
  1122. ***These subroutines perform the neccesary
  1123. * data I/O operations.
  1124. * OUTLHLF-Convert left 4 bits of A from binary
  1125. *            to ASCII and output.
  1126. * OUTRHLF-Convert right 4 bits of A from binary
  1127. *            to ASCII and output.
  1128. * OUT1BYT-Convert byte addresed by X f0Oȁ+J¹ary
  1129. *           to ASCII and output.
  1130. * OUT1BSP-Convert byte addressed by X from binary
  1131. *           to ASCII and output followed by a space.
  1132. * OUT2BSP-Convert 2 bytes addressed by X from binary
  1133. *            to ASCII and  output followed by a space.
  1134. * OUTSPAC-Output a space.
  1135. *
  1136. * OUTCRLF-Output a line feed and carriage return.
  1137. *
  1138. * OUTSTRG-Output the string of ASCII bytes addressed
  1139. *            by X until $04.
  1140. * OUTA-Output the ASCII character in A.
  1141. *
  1142. * TABTO-Output spaces until column 20 is reached.
  1143. *
  1144. * INCHAR-Input to A and echo one character.  Loops
  1145. *            until character read.
  1146. *        *******************
  1147.  
  1148. **********
  1149. *  OUTRHLF(), OUTLHLF(), OUTA()
  1150. *Convert A from binary to ASCII and output.
  1151. *Contents of A are destroyed..
  1152. **********
  1153. OUTLHLF  LSRA      shift data to right
  1154.     LSRA
  1155.     LSRA
  1156.     LSRA
  1157. OUTRHLF  ANDA #$0F       mask top half
  1158.     ADDA #$30       convert to ascii
  1159.     CMPA #$39
  1160.     BLE  OUTA       jump if 0-9
  1161.     ADDA #$07       convert to hex A-F
  1162. OUTA     JSR  OUTPUT     output character
  1163.     RTS
  1164.  
  1165. **********
  1166. *  OUT1BYT(x) - Convert the byte at X to two
  1167. * ASCII characters and output. Return X pointing
  1168. * to next byte.
  1169. **********
  1170. OUT1BYT  PSHA
  1171.     LDAA 0,X        get data in a
  1172.     PSHA      save copy
  1173.     BSR  OUTLHLF    output left half
  1174.     PULA      retrieve copy
  1175.     BSR  OUTRHLF    output right half
  1176.     PULA
  1177.     INX
  1178.     RTS
  1179.  
  1180. **********
  1181. *  OUT1BSP(x), OUT2BSP(x) - Output 1 or 2 bytes
  1182. * at x followed by a space.  Returns x pointing to
  1183. * next byte.
  1184. **********
  1185. OUT2BSP  JSR  OUT1BYT      do first byte
  1186. OUT1BSP  JSR  OUT1BYT      do next byte
  1187. OUTSPAC  LDAA #$20         output a space
  1188.     JSR  OUTPUT
  1189.     RTS
  1190.  
  1191. **********
  1192. *  OUTCRLF() - Output a Carriage return and
  1193. * a line feed.  Returns a = cr.
  1194. **********
  1195. OUTCRLF  LDAA #$0D      cr
  1196.     JSR  OUTPUT    output a
  1197.     LDAA #$00
  1198.     JSR  OUTPUT    output padding
  1199.     LDAA #$0D
  1200.     CLR  CHRCNT    zero the column counter
  1201.     RTS
  1202.  
  1203. **********
  1204. *  OUTSTRG(x) - Output string of ASCII bytes
  1205. * starting at x until end of text ($04).  Can
  1206. * be paused by control w (any char restarts).
  1207. **********
  1208. OUTSTRG  JSR  OUTCRLF
  1209. OUTSTRG0 PSHA
  1210. OUTSTRG1 LDAA 0,X    read char into a
  1211.     CMPA #EOT
  1212.     BEQ  OUTSTRG3     jump if eot
  1213.     JSR  OUTPUT       output character
  1214.     INX
  1215.     JSR  INPUT
  1216.     BEQ  OUTSTRG1     jump if no input
  1217.     CMPA #CTLW
  1218.     BNE  OUTSTRG1     jump if not cntlw
  1219. OUTSTRG2 JSR  INPUT
  1220.     BEQ  OUTSTRG2     jump if any input
  1221.     BRA  OUTSTRG1
  1222. OUTSTRG3 PULA
  1223.     RTS
  1224.  
  1225.  
  1226. *********
  1227. *  TABTO() - move cursor over to column 20.
  1228. *while(chrcnt < 16) outspac.
  1229. TABTO   PSHA
  1230. TABTOLP JSR  OUTSPAC
  1231.     LDAA CHRCNT
  1232.     CMPA #20
  1233.     BLE  TABTOLP
  1234.     PULA
  1235.     RTS
  1236.  
  1237. **********
  1238. *  INCHAR() - Reads input until character sent.
  1239. *    Echoes char and returns with a = char.
  1240. INCHAR   JSR  INPUT
  1241.     TSTA
  1242.     BEQ  INCHAR      jump if no input
  1243.     JSR  OUTPUT      echo
  1244.     RTS
  1245.  
  1246. *********************
  1247. *** COMMAND TABLE ***
  1248. COMTABL  FCB    5
  1249.     FCC    "ASSEM"
  1250.     FDB    ASSEM
  1251.     FCB    5
  1252.     FCC    "BREAK"
  1253.     FDB    BREAK
  1254.     FCB    4
  1255.     FCC    "BULK"
  1256.     FDB    BULK
  1257.     FCB    7
  1258.     FCC    "BULKALL"
  1259.     FDB    BULKALL
  1260.     FCB    4
  1261.     FCC    "CALL"
  1262.     FDB    CALL
  1263.     FCB    4
  1264.     FCC    "DUMP"
  1265.     FDB    DUMP
  1266.     FCB    5
  1267.     FCC    "EEMOD"
  1268.     FDB    EEMOD
  1269.     FCB    4
  1270.     FCC    "FILL"
  1271.     FDB    FILL
  1272.     FCB    2
  1273.     FCC    "GO"
  1274.     FDB    GO
  1275.     FCB    4
  1276.     FCC    "HELP"
  1277.     FDB    HELP
  1278.     FCB    4
  1279.     FCC    "HOST"
  1280.     FDB    HOST
  1281.     FCB    4
  1282.     FCC    "LOAD"
  1283.     FDB    LOAD
  1284.     FCB    6    LENGTH OF COMMAND
  1285.     FCC    "MEMORY"   ASCII COMMAND
  1286.     FDB    MEMORY    COMMAND ADDRESS
  1287.     FCB    4
  1288.     FCC    "MOVE"
  1289.     FDB    MOVE
  1290.     FCB    6
  1291.     FCC    "OFFSET"
  1292.     FDB    OFFSET
  1293.     FCB    7
  1294.     FCC    "PROCEED"
  1295.     FDB    PROCEED
  1296.     FCB    8
  1297.     FCC    "REGISTER"
  1298.     FDB    REGISTER
  1299.     FCB    6
  1300.     FCC    "STOPAT"
  1301.     FDB    STOPAT
  1302.     FCB    5
  1303.     FCC    "TRACE"
  1304.     FDB    TRACE
  1305.     FCB    6
  1306.     FCC    "VERIFY"
  1307.     FDB    VERIFY
  1308.     FCB    1
  1309.     FCC    "?"       initial command
  1310.     FDB    HELP
  1311.     FCB    5
  1312.     FCC    "XBOOT"
  1313.     FDB    BOOT
  1314.     FCB    1         dummy command for load
  1315.     FCC    "~"
  1316.     FDB    TILDE
  1317. *
  1318. *** Command names for evm compatability ***
  1319. *
  1320.     FCB    3
  1321.     FCC    "ASM"
  1322.     FDB    ASSEM
  1323.     FCB    2
  1324.     FCC    "BF"
  1325.     FDB    FILL
  1326.     FCB    4
  1327.     FCC    "COPY"
  1328.     FDB    MOVE
  1329.     FCB    5
  1330.     FCC    "ERASE"
  1331.     FDB    BULK
  1332.     FCB    2
  1333.     FCC    "MD"
  1334.     FDB    DUMP
  1335.     FCB    2
  1336.     FCC    "MM"
  1337.     FDB    MEMORY
  1338.     FCB    2
  1339.     FCC    "RD"
  1340.     FDB    REGISTER
  1341.     FCB    2
  1342.     FCC    "RM"
  1343.     FDB    REGISTER
  1344.     FCB    4
  1345.     FCC    "READ"
  1346.     FDB    MOVE
  1347.     FCB    2
  1348.     FCC    "TM"
  1349.     FDB    HOST
  1350.     FCB    4
  1351.     FCC    "TEST"
  1352.     FDB    EVBTEST
  1353.     FCB    $FF
  1354.  
  1355. *******************
  1356. *** TEXT TABLES ***
  1357.  
  1358. MSG1    FCC    "BUFFALO 3.4 (ext) - Bit User Fast Friendly Aid to Logical Operation"
  1359.     FCB    EOT
  1360. MSG2    FCC    "What?"
  1361.     FCB    EOT
  1362. MSG3    FCC    "Too Long"
  1363.     FCB    EOT
  1364. MSG4    FCC    "Full"
  1365.     FCB    EOT
  1366. MSG5    FCC    "Op- "
  1367.     FCB    EOT
  1368. MSG6    FCC    "rom-"
  1369.     FCB    EOT
  1370. MSG8    FCC    "Command?"
  1371.     FCB    EOT
  1372. MSG9    FCC    "Bad argument"
  1373.     FCB    EOT
  1374. MSG10   FCC    "No host port"
  1375.     FCB    EOT
  1376. MSG11   FCC    "done"
  1377.     FCB    EOT
  1378. MSG12   FCC    "chksum error"
  1379.     FCB    EOT
  1380. MSG13   FCC    "error addr "
  1381.     FCB    EOT
  1382. MSG14   FCC    "rcvr error"
  1383.     FCB    EOT
  1384.  
  1385. **********
  1386. *   break [-][<addr>] . . .
  1387. * Modifies the breakpoint table.  More than
  1388. * one argument can be entered on the command
  1389. * line but the table will hold only 4 entries.
  1390. * 4 types of arguments are implied above:
  1391. * break           Prints table contents.
  1392. * break <addr>    Inserts <addr>.
  1393. * break -<addr>   Deletes <addr>.
  1394. * break -         Clears all entries.
  1395. **********
  1396. * while 1
  1397. *     a = wskip();
  1398. *     switch(a)
  1399. *          case(cr):
  1400. *               bprint(); return;
  1401.  
  1402. BREAK   JSR  WSKIP
  1403.     BNE  BRKDEL     jump if not cr
  1404.     JSR  BPRINT     print table
  1405.     RTS
  1406.  
  1407. *          case("-"):
  1408. *               incbuff(); readbuff();
  1409. *               if(dchek(a))          /* look for wspac or cr */
  1410. *                    bpclr();
  1411. *                    breaksw;
  1412. *               a = buffarg();
  1413. *               if( !dchek(a) ) return(bad argument);
  1414. *               b = bpsrch();
  1415. *               if(b >= 0)
  1416. *                    brktabl[b] = 0;
  1417. *               breaksw;
  1418.  
  1419. BRKDEL  CMPA #'-'
  1420.     BNE  BRKDEF     jump if not -
  1421.     JSR  INCBUFF
  1422.     JSR  READBUFF
  1423.     JSR  DCHEK
  1424.     BNE  BRKDEL1    jump if not delimeter
  1425.     JSR  BPCLR      clear table
  1426.     JMP  BREAK      do next argument
  1427. BRKDEL1 JSR  BUFFARG    get address to delete
  1428.     JSR  DCHEK
  1429.     BEQ  BRKDEL2    jump if delimeter
  1430.     LDX  #MSG9      "bad argument"
  1431.     JSR  OUTSTRG
  1432.     RTS
  1433. BRKDEL2 JSR  BPSRCH     look for addr in table
  1434.     TSTB
  1435.     BMI  BRKDEL3    jump if not found
  1436.     LDX  #BRKTABL
  1437.     ABX
  1438.     CLR  0,X        clear entry
  1439.     CLR  1,X
  1440. BRKDEL3 JMP  BREAK      do next argument
  1441.  
  1442. *          default:
  1443. *               a = buffarg();
  1444. *               if( !dchek(a) ) return(bad argument);
  1445. *               b = bpsrch();
  1446. *               if(b < 0)            /* not already in table */
  1447. *                    x = shftreg;
  1448. *                    shftreg = 0;
  1449. *                    a = x[0]; x[0] = $3F
  1450. *                    b = x[0]; x[0] = a;
  1451. *                    if(b != $3F) return(rom);
  1452. *                    b = bpsrch();   /* look for hole */
  1453. *                    if(b >= 0) return(table full);
  1454. *                    brktabl[b] = x;
  1455. *               breaksw;
  1456.  
  1457. BRKDEF  JSR  BUFFARG    get argument
  1458.     JSR  DCHEK
  1459.     BEQ  BRKDEF1    jump if delimiter
  1460.     LDX  #MSG9      "bad argument"
  1461.     JSR  OUTSTRG
  1462.     RTS
  1463. BRKDEF1 JSR  BPSRCH     look for entry in table
  1464.     TSTB
  1465.     BGE  BREAK      jump if already in table
  1466.  
  1467.     LDX  SHFTREG     x = new entry addr
  1468.     LDAA 0,X         save original contents
  1469.     PSHA
  1470.     LDAA #SWI
  1471.     JSR  WRITE       write to entry addr
  1472.     LDAB 0,X         read back
  1473.     PULA
  1474.     JSR  WRITE       restore original
  1475.     CMPB #SWI
  1476.     BEQ  BRKDEF2    jump if writes ok
  1477.     STX  PTR1       save address
  1478.     LDX  #PTR1
  1479.     JSR  OUT2BSP     print address
  1480.     JSR  BPRINT
  1481.     RTS
  1482. BRKDEF2 CLR  SHFTREG
  1483.     CLR  SHFTREG+1
  1484.     PSHX
  1485.     JSR  BPSRCH     look for 0 entry
  1486.     PULX
  1487.     TSTB
  1488.     BPL  BRKDEF3    jump if table not full
  1489.     LDX  #MSG4      "full"
  1490.     JSR  OUTSTRG
  1491.     JSR  BPRINT
  1492.     RTS
  1493. BRKDEF3 LDY  #BRKTABL
  1494.     ABY
  1495.     STX  0,Y        put new entry in
  1496.     JMP  BREAK      do next argument
  1497.  
  1498. **********
  1499. *   bprint() - print the contents of the table.
  1500. **********
  1501. BPRINT   JSR  OUTCRLF
  1502.     LDX  #BRKTABL
  1503.     LDAB #4
  1504. BPRINT1  JSR  OUT2BSP
  1505.     DECB
  1506.     BGT  BPRINT1     loop 4 times
  1507.     RTS
  1508.  
  1509. **********
  1510. *   bpsrch() - search table for address in
  1511. * shftreg. Returns b = index to entry or
  1512. * b = -1 if not found.
  1513. **********
  1514. *for(b=0; b=6; b=+2)
  1515. *     x[] = brktabl + b;
  1516. *     if(x[0] = shftreg)
  1517. *          return(b);
  1518. *return(-1);
  1519.  
  1520. BPSRCH   CLRB
  1521. BPSRCH1  LDX  #BRKTABL
  1522.     ABX
  1523.     LDX  0,X       get table entry
  1524.     CPX  SHFTREG
  1525.     BNE  BPSRCH2   jump if no match
  1526.     RTS
  1527. BPSRCH2  INCB
  1528.     INCB
  1529.     CMPB #$6
  1530.     BLE  BPSRCH1  loop 4 times
  1531.     LDAB #$FF
  1532.     RTS
  1533.  
  1534.  
  1535. **********
  1536. *  bulk  - Bulk erase the eeprom not config.
  1537. * bulkall - Bulk erase eeprom and config.
  1538. *********
  1539. BULK    LDX  STREE
  1540.     BRA  BULK1
  1541. BULKALL LDX  #CONFIG
  1542. BULK1   LDAA #$FF
  1543.     JSR  EEBULK
  1544.     RTS
  1545.  
  1546.  
  1547.  
  1548. **********
  1549. *  dump [<addr1> [<addr2>]]  - Dump memory
  1550. * in 16 byte lines from <addr1> to <addr2>.
  1551. *   Default starting address is "current
  1552. * location" and default number of lines is 8.
  1553. **********
  1554. *ptr1 = ptrmem;        /* default start address */
  1555. *ptr2 = ptr1 + $80;    /* default end address */
  1556. *a = wskip();
  1557. *if(a != cr)
  1558. *     a = buffarg();
  1559. *     if(countu1 = 0) return(bad argument);
  1560. *     if( !dchek(a) ) return(bad argument);
  1561. *     ptr1 = shftreg;
  1562. *     ptr2 = ptr1 + $80;  /* default end address */
  1563. *     a = wskip();
  1564. *     if(a != cr)
  1565. *          a = buffarg();
  1566. *          if(countu1 = 0) return(bad argument);
  1567. *          a = wskip();
  1568. *          if(a != cr) return(bad argument);
  1569. *          ptr2 = shftreg;
  1570.  
  1571. DUMP     LDX  PTRMEM    current location
  1572.     STX  PTR1      default start
  1573.     LDAB #$80
  1574.     ABX
  1575.     STX  PTR2      default end
  1576.     JSR  WSKIP
  1577.     BEQ  DUMP1     jump - no arguments
  1578.     JSR  BUFFARG   read argument
  1579.     TST  COUNT
  1580.     BEQ  DUMPERR   jump if no argument
  1581.     JSR  DCHEK
  1582.     BNE  DUMPERR   jump if delimiter
  1583.     LDX  SHFTREG
  1584.     STX  PTR1
  1585.     LDAB #$80
  1586.     ABX
  1587.     STX  PTR2      default end address
  1588.     JSR  WSKIP
  1589.     BEQ  DUMP1     jump - 1 argument
  1590.     JSR  BUFFARG   read argument
  1591.     TST  COUNT
  1592.     BEQ  DUMPERR   jump if no argument
  1593.     JSR  WSKIP
  1594.     BNE  DUMPERR   jump if not cr
  1595.     LDX  SHFTREG
  1596.     STX  PTR2
  1597.     BRA  DUMP1     jump - 2 arguments
  1598. DUMPERR  LDX  #MSG9     "bad argument"
  1599.     JSR  OUTSTRG
  1600.     RTS
  1601.  
  1602. *ptrmem = ptr1;
  1603. *ptr1 = ptr1 & $fff0;
  1604.  
  1605. DUMP1    LDD  PTR1
  1606.     STD  PTRMEM    new current location
  1607.     ANDB #$F0
  1608.     STD  PTR1      start dump at 16 byte boundary
  1609.  
  1610. *** dump loop starts here ***
  1611. *do:
  1612. *     output address of first byte;
  1613.  
  1614. DUMPLP   JSR  OUTCRLF
  1615.     LDX  #PTR1
  1616.     JSR  OUT2BSP   first address
  1617.  
  1618. *     x = ptr1;
  1619. *     for(b=0; b=16; b++)
  1620. *          output contents;
  1621.  
  1622.     LDX  PTR1      base address
  1623.     CLRB     loop counter
  1624. DUMPDAT  JSR  OUT1BSP   hex value loop
  1625.     INCB
  1626.     CMPB #$10
  1627.     BLT  DUMPDAT    loop 16 times
  1628.  
  1629. *     x = ptr1;
  1630. *     for(b=0; b=16; b++)
  1631. *          a = x[b];
  1632. *          if($7A < a < $20)  a = $20;
  1633. *          output ascii contents;
  1634.  
  1635.     CLRB     loop counter
  1636. DUMPASC  LDX  PTR1      base address
  1637.     ABX
  1638.     LDAA ,X        ascii value loop
  1639.     CMPA #$20
  1640.     BLO  DUMP3     jump if non printable
  1641.     CMPA #$7A
  1642.     BLS  DUMP4     jump if printable
  1643. DUMP3    LDAA #$20      space for non printables
  1644. DUMP4    JSR  OUTPUT    output ascii value
  1645.     INCB
  1646.     CMPB #$10
  1647.     BLT  DUMPASC   loop 16 times
  1648.  
  1649. *     chkabrt();
  1650. *     ptr1 = ptr1 + $10;
  1651. *while(ptr1 <= ptr2);
  1652. *return;
  1653.  
  1654.     JSR  CHKABRT   check abort or wait
  1655.     LDD  PTR1
  1656.     ADDD #$10      point to next 16 byte bound
  1657.     STD  PTR1      update ptr1
  1658.     CPD  PTR2
  1659.     BHI  DUMP5     quit if ptr1 > ptr2
  1660.     CPD  #$00      check wraparound at $ffff
  1661.     BNE  DUMPLP    jump - no wraparound
  1662.     LDD  PTR2
  1663.     CPD  #$FFF0
  1664.     BLO  DUMPLP    upper bound not at top
  1665. DUMP5    RTS      quit
  1666.  
  1667.  
  1668.  
  1669. **********
  1670. *   eemod [<addr1> [<addr2>]]
  1671. * Modifies the eeprom address range.
  1672. *  EEMOD                 -show ee address range
  1673. *  EEMOD <addr1>         -set range to addr1 -> addr1+2k
  1674. *  EEMOD <addr1> <addr2> -set range to addr1 -> addr2
  1675. **********
  1676. *if(<addr1>)
  1677. *    stree = addr1;
  1678. *    endee = addr1 + 2k bytes;
  1679. *if(<addr2>)
  1680. *    endee = addr2;
  1681. *print(stree,endee);
  1682. EEMOD    JSR  WSKIP
  1683.     BEQ  EEMOD2    jump - no arguments
  1684.     JSR  BUFFARG   read argument
  1685.     TST  COUNT
  1686.     BEQ  EEMODER   jump if no argument
  1687.     JSR  DCHEK
  1688.     BNE  EEMODER   jump if no delimeter
  1689.     LDD  SHFTREG
  1690.     STD  PTR1
  1691.     ADDD #$07FF    add 2k bytes to stree
  1692.     STD  PTR2      default endee address
  1693.     JSR  WSKIP
  1694.     BEQ  EEMOD1    jump - 1 argument
  1695.     JSR  BUFFARG   read argument
  1696.     TST  COUNT
  1697.     BEQ  EEMODER   jump if no argument
  1698.     JSR  WSKIP
  1699.     BNE  EEMODER   jump if not cr
  1700.     LDX  SHFTREG
  1701.     STX  PTR2
  1702. EEMOD1   LDX  PTR1
  1703.     STX  STREE     new stree address
  1704.     LDX  PTR2
  1705.     STX  ENDEE     new endee address
  1706. EEMOD2   JSR  OUTCRLF   display ee range
  1707.     LDX  #STREE
  1708.     JSR  OUT2BSP
  1709.     LDX  #ENDEE
  1710.     JSR  OUT2BSP
  1711.     RTS
  1712.  
  1713. EEMODER  LDX  #MSG9     "bad argument"
  1714.     JSR  OUTSTRG
  1715.     RTS
  1716.  
  1717.  
  1718.  
  1719.  
  1720. **********
  1721. *  fill <addr1> <addr2> [<data>]  - Block fill
  1722. *memory from addr1 to addr2 with data.  Data
  1723. *defaults to $FF.
  1724. **********
  1725. *get addr1 and addr2
  1726. FILL    JSR  WSKIP
  1727.     JSR  BUFFARG
  1728.     TST  COUNT
  1729.     BEQ  FILLERR    jump if no argument
  1730.     JSR  WCHEK
  1731.     BNE  FILLERR    jump if bad argument
  1732.     LDX  SHFTREG
  1733.     STX  PTR1       address1
  1734.     JSR  WSKIP
  1735.     JSR  BUFFARG
  1736.     TST  COUNT
  1737.     BEQ  FILLERR    jump if no argument
  1738.     JSR  DCHEK
  1739.     BNE  FILLERR    jump if bad argument
  1740.     LDX  SHFTREG
  1741.     STX  PTR2       address2
  1742.  
  1743. *Get data if it exists
  1744.     LDAA #$FF
  1745.     STAA TMP2       default data
  1746.     JSR  WSKIP
  1747.     BEQ  FILL1      jump if default data
  1748.     JSR  BUFFARG
  1749.     TST  COUNT
  1750.     BEQ  FILLERR    jump if no argument
  1751.     JSR  WSKIP
  1752.     BNE  FILLERR    jump if bad argument
  1753.     LDAA SHFTREG+1
  1754.     STAA TMP2
  1755.  
  1756. *while(ptr1 <= ptr2)
  1757. *   *ptr1 = data
  1758. *   if(*ptr1 != data) abort
  1759.  
  1760. FILL1   JSR  CHKABRT    check for abort
  1761.     LDX  PTR1       starting address
  1762.     LDAA TMP2       data
  1763.     JSR  WRITE      write the data to x
  1764.     CMPA 0,X
  1765.     BNE  FILLBAD    jump if no write
  1766.     CPX  PTR2
  1767.     BEQ  FILL2      quit yet?
  1768.     INX
  1769.     STX  PTR1
  1770.     BRA  FILL1      loop
  1771. FILL2   RTS
  1772.  
  1773. FILLERR LDX  #MSG9     "bad argument"
  1774.     JSR  OUTSTRG
  1775.     RTS
  1776.  
  1777. FILLBAD LDX  #PTR1     output bad address
  1778.     JSR  OUT2BSP
  1779.     RTS
  1780.  
  1781.  
  1782.  
  1783. *******************************************
  1784. *   MEMORY [<addr>]
  1785. *   [<addr>]/
  1786. * Opens memory and allows user to modify the
  1787. *contents at <addr> or the last opened location.
  1788. *    Subcommands:
  1789. * [<data>]<cr>       - Close current location and exit.
  1790. * [<data>]<lf><+>    - Close current and open next.
  1791. * [<data>]<^><-><bs> - Close current and open previous.
  1792. * [<data>]<sp>       - Close current and open next.
  1793. * [<data>]</><=>     - Reopen current location.
  1794. *     The contents of the current location is only
  1795. *  changed if valid data is entered before each
  1796. *  subcommand.
  1797. * [<addr>]O - Compute relative offset from current
  1798. *     location to <addr>.  The current location must
  1799. *     be the address of the offset byte.
  1800. **********
  1801. *a = wskip();
  1802. *if(a != cr)
  1803. *     a = buffarg();
  1804. *     if(a != cr) return(bad argument);
  1805. *     if(countu1 != 0) ptrmem[] = shftreg;
  1806.  
  1807. MEMORY   JSR  WSKIP
  1808.     BEQ  MEM1      jump if cr
  1809.     JSR  BUFFARG
  1810.     JSR  WSKIP
  1811.     BEQ  MSLASH    jump if cr
  1812.     LDX  #MSG9     "bad argument"
  1813.     JSR  OUTSTRG
  1814.     RTS
  1815. MSLASH   TST  COUNT
  1816.     BEQ  MEM1      jump if no argument
  1817.     LDX  SHFTREG
  1818.     STX  PTRMEM    update "current location"
  1819.  
  1820. **********
  1821. * Subcommands
  1822. **********
  1823. *outcrlf();
  1824. *out2bsp(ptrmem[]);
  1825. *out1bsp(ptrmem[0]);
  1826.  
  1827. MEM1     JSR  OUTCRLF
  1828. MEM2     LDX  #PTRMEM
  1829.     JSR  OUT2BSP   output address
  1830. MEM3     LDX  PTRMEM
  1831.     JSR  OUT1BSP   output contents
  1832.     CLR  SHFTREG
  1833.     CLR  SHFTREG+1
  1834. *while 1
  1835. *a = termarg();
  1836. *     switch(a)
  1837. *          case(space):
  1838. *             chgbyt();
  1839. *             ptrmem[]++;
  1840. *             if(ptrmem%16 == 0) start new line;
  1841. *          case(linefeed | +):
  1842. *             chgbyt();
  1843. *             ptrmem[]++;
  1844. *          case(up arrow | backspace | -):
  1845. *               chgbyt();
  1846. *               ptrmem[]--;
  1847. *          case('/' | '='):
  1848. *               chgbyt();
  1849. *               outcrlf();
  1850. *          case(O):
  1851. *               d = ptrmem[0] - (shftreg);
  1852. *               if($80 < d < $ff81)
  1853. *                    print(out of range);
  1854. *               countt1 = d-1;
  1855. *               out1bsp(countt1);
  1856. *          case(carriage return):
  1857. *               chgbyt();
  1858. *               return;
  1859. *          default: return(command?)
  1860.  
  1861. MEM4     JSR  TERMARG
  1862.     JSR  UPCASE
  1863.     LDX  PTRMEM
  1864.     CMPA #$20
  1865.     BEQ  MEMSP     jump if space
  1866.     CMPA #$0A
  1867.     BEQ  MEMLF     jump if linefeed
  1868.     CMPA #$2B
  1869.     BEQ  MEMPLUS   jump if +
  1870.     CMPA #$5E
  1871.     BEQ  MEMUA     jump if up arrow
  1872.     CMPA #$2D
  1873.     BEQ  MEMUA     jump if -
  1874.     CMPA #$08
  1875.     BEQ  MEMUA     jump if backspace
  1876.     CMPA #'/'
  1877.     BEQ  MEMSL     jump if /
  1878.     CMPA #'='
  1879.     BEQ  MEMSL     jump if =
  1880.     CMPA #'O'
  1881.     BEQ  MEMOFF    jump if O
  1882.     CMPA #$0D
  1883.     BEQ  MEMCR     jump if carriage ret
  1884.     CMPA #'.'
  1885.     BEQ  MEMEND    jump if .
  1886.     LDX  #MSG8     "command?"
  1887.     JSR  OUTSTRG
  1888.     JMP  MEM1
  1889. MEMSP    JSR  CHGBYT
  1890.     INX
  1891.     STX  PTRMEM
  1892.     XGDX
  1893.     ANDB #$0F
  1894.     BEQ  MEMSP1    jump if mod16=0
  1895.     JMP  MEM3      continue same line
  1896. MEMSP1   JMP  MEM1      .. else start new line
  1897. MEMLF    JSR  CHGBYT
  1898.     INX
  1899.     STX  PTRMEM
  1900.     JMP  MEM2      output next address
  1901. MEMPLUS  JSR  CHGBYT
  1902.     INX
  1903.     STX  PTRMEM
  1904.     JMP  MEM1      output cr, next address
  1905. MEMUA    JSR  CHGBYT
  1906.     DEX
  1907.     STX  PTRMEM
  1908.     JMP  MEM1      output cr, previous address
  1909. MEMSL    JSR  CHGBYT
  1910.     JMP  MEM1      output cr, same address
  1911. MEMOFF   LDD  SHFTREG   destination addr
  1912.     SUBD PTRMEM
  1913.     CMPA #$0
  1914.     BNE  MEMOFF1   jump if not 0
  1915.     CMPB #$80
  1916.     BLS  MEMOFF3   jump if in range
  1917.     BRA  MEMOFF2   out of range
  1918. MEMOFF1  CMPA #$FF
  1919.     BNE  MEMOFF2   out of range
  1920.     CMPB #$81
  1921.     BHS  MEMOFF3   in range
  1922. MEMOFF2  LDX  #MSG3     "Too long"
  1923.     JSR  OUTSTRG
  1924.     JMP  MEM1      output cr, addr, contents
  1925. MEMOFF3  SUBD #$1       b now has offset
  1926.     STAB TMP4
  1927.     JSR  OUTSPAC
  1928.     LDX  #TMP4
  1929.     JSR  OUT1BSP   output offset
  1930.     JMP  MEM1      output cr, addr, contents
  1931. MEMCR    JSR  CHGBYT
  1932. MEMEND   RTS      exit task
  1933.  
  1934.  
  1935. **********
  1936. *   move <src1> <src2> [<dest>]  - move
  1937. *block at <src1> to <src2> to <dest>.
  1938. *  Moves block 1 byte up if no <dest>.
  1939. **********
  1940. *a = buffarg();
  1941. *if(countu1 = 0) return(bad argument);
  1942. *if( !wchek(a) ) return(bad argument);
  1943. *ptr1 = shftreg;         /* src1 */
  1944.  
  1945. MOVE     JSR  BUFFARG
  1946.     TST  COUNT
  1947.     BEQ  MOVERR    jump if no arg
  1948.     JSR  WCHEK
  1949.     BNE  MOVERR    jump if no delim
  1950.     LDX  SHFTREG   src1
  1951.     STX  PTR1
  1952.  
  1953. *a = buffarg();
  1954. *if(countu1 = 0) return(bad argument);
  1955. *if( !dchek(a) ) return(bad argument);
  1956. *ptr2 = shftreg;         /* src2 */
  1957.  
  1958.     JSR  BUFFARG
  1959.     TST  COUNT
  1960.     BEQ  MOVERR    jump if no arg
  1961.     JSR  DCHEK
  1962.     BNE  MOVERR    jump if no delim
  1963.     LDX  SHFTREG   src2
  1964.     STX  PTR2
  1965.  
  1966. *a = buffarg();
  1967. *a = wskip();
  1968. *if(a != cr) return(bad argument);
  1969. *if(countu1 != 0) tmp2 = shftreg;  /* dest */
  1970. *else tmp2 = ptr1 + 1;
  1971.  
  1972.     JSR  BUFFARG
  1973.     JSR  WSKIP
  1974.     BNE  MOVERR    jump if not cr
  1975.     TST  COUNT
  1976.     BEQ  MOVE1     jump if no arg
  1977.     LDX  SHFTREG   dest
  1978.     BRA  MOVE2
  1979. MOVERR   LDX  #MSG9     "bad argument"
  1980.     JSR  OUTSTRG
  1981.     RTS
  1982.  
  1983. MOVE1    LDX  PTR1
  1984.     INX      default dest
  1985. MOVE2    STX  PTR3
  1986.  
  1987. *if(src1 < dest <= src2)
  1988. *     dest = dest+(src2-src1);
  1989. *     for(x = src2; x = src1; x--)
  1990. *          dest[0]-- = x[0]--;
  1991.     LDX  PTR3        dest
  1992.     CPX  PTR1        src1
  1993.     BLS  MOVE3       jump if dest =< src1
  1994.     CPX  PTR2        src2
  1995.     BHI  MOVE3       jump if dest > src2
  1996.     LDD  PTR2
  1997.     SUBD PTR1
  1998.     ADDD PTR3
  1999.     STD  PTR3        dest = dest+(src2-src1)
  2000.     LDX  PTR2
  2001. MOVELP1  JSR  CHKABRT     check for abort
  2002.     LDAA ,X    char at src2
  2003.     PSHX
  2004.     LDX  PTR3
  2005.     JSR  WRITE       write a to x
  2006.     CMPA 0,X
  2007.     BNE  MOVEBAD     jump if no write
  2008.     DEX
  2009.     STX  PTR3
  2010.     PULX
  2011.     CPX  PTR1
  2012.     BEQ  MOVRTS
  2013.     DEX
  2014.     BRA  MOVELP1    Loop SRC2 - SRC1 times
  2015. *
  2016. * else
  2017. *     for(x=src1; x=src2; x++)
  2018. *          dest[0]++ = x[0]++;
  2019.  
  2020.  
  2021. MOVE3    LDX  PTR1        srce1
  2022. MOVELP2  JSR  CHKABRT     check for abort
  2023.     LDAA ,X
  2024.     PSHX
  2025.     LDX  PTR3        dest
  2026.     JSR  WRITE       write a to x
  2027.     CMPA 0,X
  2028.     BNE  MOVEBAD     jump if no write
  2029.     INX
  2030.     STX  PTR3
  2031.     PULX
  2032.     CPX  PTR2
  2033.     BEQ  MOVRTS
  2034.     INX
  2035.     BRA  MOVELP2      Loop SRC2-SRC1 times
  2036. MOVRTS   RTS
  2037.  
  2038. MOVEBAD  PULX        restore stack
  2039.     LDX  #PTR3
  2040.     JSR  OUT2BSP      output bad address
  2041.     RTS
  2042.  
  2043.  
  2044. ****************
  2045. *  assem(addr) -68HC11 line assembler/disassembler.
  2046. *       This routine will disassemble the opcode at
  2047. *<addr> and then allow the user to enter a line for
  2048. *assembly. Rules for assembly are as follows:
  2049. * -A '#' sign indicates immediate addressing.
  2050. * -A ',' (comma) indicates indexed addressing
  2051. *       and the next character must be X or Y.
  2052. * -All arguments are assumed to be hex and the
  2053. *       '$' sign shouldn't be used.
  2054. * -Arguments should be separated by 1 or more
  2055. *       spaces or tabs.
  2056. * -Any input after the required number of
  2057. *       arguments is ignored.
  2058. * -Upper or lower case makes no difference.
  2059. *
  2060. *       To signify end of input line, the following
  2061. *commands are available and have the indicated action:
  2062. *   <cr>      - Finds the next opcode for
  2063. *          assembly.  If there was no assembly input,
  2064. *          the next opcode disassembled is retrieved
  2065. *          from the disassembler.
  2066. *   <lf><+>   - Works the same as carriage return
  2067. *          except if there was no assembly input, the
  2068. *          <addr> is incremented and the next <addr> is
  2069. *          disassembled.
  2070. *    <^><->   - Decrements <addr> and the previous
  2071. *          address is then disassembled.
  2072. *    </><=>   - Redisassembles the current address.
  2073. *
  2074. *       To exit the assembler use CONTROL A or . (period).
  2075. *Of course control X and DEL will also allow you to abort.
  2076. *** Equates for assembler ***
  2077. PAGE1    EQU    $00     values for page opcodes
  2078. PAGE2    EQU    $18
  2079. PAGE3    EQU    $1A
  2080. PAGE4    EQU    $CD
  2081. IMMED    EQU    $0      addressing modes
  2082. INDX    EQU    $1
  2083. INDY    EQU    $2
  2084. LIMMED    EQU    $3      (long immediate)
  2085. OTHER    EQU    $4
  2086.  
  2087. *** Rename variables for assem/disassem ***
  2088. AMODE    EQU    TMP2    addressing mode
  2089. YFLAG    EQU    TMP3
  2090. PNORM    EQU    TMP4    page for normal opcode
  2091. OLDPC    EQU    PTR8
  2092. PC    EQU    PTR1    program counter
  2093. PX    EQU    PTR2    page for x indexed
  2094. PY    EQU    PTR2+1  page for y indexed
  2095. BASEOP    EQU    PTR3    base opcode
  2096. CLASS    EQU    PTR3+1  class
  2097. DISPC    EQU    PTR4    pc for disassembler
  2098. BRADDR    EQU    PTR5    relative branch offset
  2099. MNEPTR    EQU    PTR6    pointer to table for dis
  2100. ASSCOMM    EQU    PTR7    subcommand for assembler
  2101.  
  2102. *** Error messages for assembler ***
  2103. MSGDIR  FDB    MSGA1   message table index
  2104.     FDB    MSGA2
  2105.     FDB    MSGA3
  2106.     FDB    MSGA4
  2107.     FDB    MSGA5
  2108.     FDB    MSGA6
  2109.     FDB    MSGA7
  2110.     FDB    MSGA8
  2111.     FDB    MSGA9
  2112. MSGA1   FCC    "Immed mode illegal"
  2113.     FCB    EOT
  2114. MSGA2   FCC    "Error in Mne table"
  2115.     FCB    EOT
  2116. MSGA3   FCC    "Illegal bit op"
  2117.     FCB    EOT
  2118. MSGA4   FCC    "Bad argument"
  2119.     FCB    EOT
  2120. MSGA5   FCC    "Mnemonic not found"
  2121.     FCB    EOT
  2122. MSGA6   FCC    "Unknown addressing mode"
  2123.     FCB    EOT
  2124. MSGA7   FCC    "Indexed addressing assumed"
  2125.     FCB    EOT
  2126. MSGA8   FCC    "Syntax error"
  2127.     FCB    EOT
  2128. MSGA9   FCC    "Branch out of range"
  2129.     FCB    EOT
  2130.  
  2131. **********
  2132. *oldpc = rambase;
  2133. *a = wskip();
  2134. *if (a != cr)
  2135. *   buffarg()
  2136. *   a = wskip();
  2137. *   if ( a != cr ) return(error);
  2138. *   oldpc = a;
  2139. ASSEM   LDX  #RAMBS
  2140.     STX  OLDPC
  2141.     JSR  WSKIP
  2142.     BEQ  ASSLOOP jump if no argument
  2143.     JSR  BUFFARG
  2144.     JSR  WSKIP
  2145.     BEQ  ASSEM1  jump if argument ok
  2146.     LDX  #MSGA4  "bad argument"
  2147.     JSR  OUTSTRG
  2148.     RTS
  2149. ASSEM1  LDX  SHFTREG
  2150.     STX  OLDPC
  2151.  
  2152. *repeat
  2153. *  pc = oldpc;
  2154. *  out2bsp(pc);
  2155. *  disassem();
  2156. *  a=readln();
  2157. *  asscomm = a;  /* save command */
  2158. *  if(a == [^,+,-,/,=]) outcrlf;
  2159. *  if(a == 0) return(error);
  2160.  
  2161. ASSLOOP LDX  OLDPC
  2162.     STX  PC
  2163.     JSR  OUTCRLF
  2164.     LDX  #PC
  2165.     JSR  OUT2BSP   output the address
  2166.     JSR  DISASSM   disassemble opcode
  2167.     JSR  TABTO
  2168.     LDAA #PROMPT   prompt user
  2169.     JSR  OUTA      output prompt character
  2170.     JSR  READLN    read input for assembly
  2171.     STAA ASSCOMM
  2172.     CMPA #'^'
  2173.     BEQ  ASSLP0    jump if '^'
  2174.     CMPA #'+'
  2175.     BEQ  ASSLP0    jump if '+'
  2176.     CMPA #'-'
  2177.     BEQ  ASSLP0    jump if '-'
  2178.     CMPA #'/'
  2179.     BEQ  ASSLP0    jump if '/'
  2180.     CMPA #'='
  2181.     BEQ  ASSLP0    jump if '='
  2182.     CMPA #$00
  2183.     BNE  ASSLP1    jump if none of above
  2184.     RTS      return if bad input
  2185. ASSLP0  JSR  OUTCRLF
  2186. ASSLP1  JSR  OUTSPAC   come here for cr or lf
  2187.     JSR  OUTSPAC
  2188.     JSR  OUTSPAC
  2189.     JSR  OUTSPAC
  2190.     JSR  OUTSPAC
  2191.  
  2192. *  b = parse(input); /* get mnemonic */
  2193. *  if(b > 5) print("not found"); asscomm='/';
  2194. *  elseif(b >= 1)
  2195. *     msrch();
  2196. *     if(class==$FF)
  2197. *        print("not found"); asscomm='/';
  2198. *     else
  2199. *        a = doop(opcode,class);
  2200. *        if(a == 0) dispc=0;
  2201. *        else process error; asscomm='/';
  2202.  
  2203.     JSR  PARSE
  2204.     CMPB #$5
  2205.     BLE  ASSLP2  jump if mnemonic <= 5 chars
  2206.     LDX  #MSGA5  "mnemonic not found"
  2207.     JSR  OUTSTRG
  2208.     BRA  ASSLP5
  2209. ASSLP2  CMPB #$0
  2210.     BEQ  ASSLP10 jump if no input
  2211.     JSR  MSRCH
  2212.     LDAA CLASS
  2213.     CMPA #$FF
  2214.     BNE  ASSLP3
  2215.     LDX  #MSGA5  "mnemonic not found"
  2216.     JSR  OUTSTRG
  2217.     BRA  ASSLP5
  2218. ASSLP3  JSR  DOOP
  2219.     CMPA #$00
  2220.     BNE  ASSLP4  jump if doop error
  2221.     LDX  #$00
  2222.     STX  DISPC   indicate good assembly
  2223.     BRA  ASSLP10
  2224. ASSLP4  DECA         a = error message index
  2225.     TAB
  2226.     LDX  #MSGDIR
  2227.     ABX
  2228.     ABX
  2229.     LDX  0,X
  2230.     JSR  OUTSTRG output error message
  2231. ASSLP5  CLR  ASSCOMM error command
  2232.  
  2233. *  /* compute next address - asscomm holds subcommand
  2234. *     and dispc indicates if valid assembly occured. */
  2235. *  if(asscomm== ^ or -) oldpc--;
  2236. *  if(asscomm==(lf or + or cr)
  2237. *     if(dispc==0) oldpc=pc;   /* good assembly */
  2238. *     else
  2239. *        if(asscomm==lf or +) dispc= ++oldpc;
  2240. *        oldpc=dispc;
  2241. *until(eot)
  2242. ASSLP10 LDAA ASSCOMM
  2243.     CMPA #'^'
  2244.     BEQ  ASSLPA     jump if '^'
  2245.     CMPA #'-'
  2246.     BNE  ASSLP11    jump not '-'
  2247. ASSLPA  LDX  OLDPC      back up for '^' or '-'
  2248.     DEX
  2249.     STX  OLDPC
  2250.     BRA  ASSLP15
  2251. ASSLP11 CMPA #$0A
  2252.     BEQ  ASSLP12    jump if linefeed
  2253.     CMPA #'+'
  2254.     BEQ  ASSLP12    jump if '+'
  2255.     CMPA #$0D
  2256.     BNE  ASSLP15    jump if not cr
  2257. ASSLP12 LDX  DISPC
  2258.     BNE  ASSLP13    jump if dispc != 0
  2259.     LDX  PC
  2260.     STX  OLDPC
  2261.     BRA  ASSLP15
  2262. ASSLP13 CMPA #$0A
  2263.     BEQ  ASSLPB    jump not lf
  2264.     CMPA #'+'
  2265.     BNE  ASSLP14   jump not lf or '+'
  2266. ASSLPB  LDX  OLDPC
  2267.     INX
  2268.     STX  DISPC
  2269. ASSLP14 LDX  DISPC
  2270.     STX  OLDPC
  2271. ASSLP15 JMP  ASSLOOP
  2272.  
  2273. ****************
  2274. *  readln() --- Read input from terminal into buffer
  2275. * until a command character is read (cr,lf,/,^).
  2276. * If more chars are typed than the buffer will hold,
  2277. * the extra characters are overwritten on the end.
  2278. *  On exit: b=number of chars read, a=0 if quit,
  2279. * else a=next command.
  2280. ****************
  2281. *for(b==0;b<=bufflng;b++) inbuff[b] = cr;
  2282.  
  2283. READLN  CLRB
  2284.     LDAA #$0D    carriage ret
  2285. RLN0    LDX  #INBUFF
  2286.     ABX
  2287.     STAA 0,X     initialize input buffer
  2288.     INCB
  2289.     CMPB #BUFFLNG
  2290.     BLT  RLN0
  2291. *b=0;
  2292. *repeat
  2293. *  if(a == (ctla, cntlc, cntld, cntlx, del))
  2294. *     return(a=0);
  2295. *  if(a == backspace)
  2296. *     if(b > 0) b--;
  2297. *     else b=0;
  2298. *  else  inbuff[b] = upcase(a);
  2299. *  if(b < bufflng) b++;
  2300. *until (a == [cr,lf,+,^,-,/,=])
  2301. *return(a);
  2302.  
  2303.     CLRB
  2304. RLN1    JSR  INCHAR
  2305.     CMPA #DEL    Delete
  2306.     BEQ  RLNQUIT
  2307.     CMPA #CTLX   Control X
  2308.     BEQ  RLNQUIT
  2309.     CMPA #CTLA   Control A
  2310.     BEQ  RLNQUIT
  2311.     CMPA #$2E    Period
  2312.     BEQ  RLNQUIT
  2313.     CMPA #$03    Control C
  2314.     BEQ  RLNQUIT
  2315.     CMPA #$04    Control D
  2316.     BEQ  RLNQUIT
  2317.     CMPA #$08    backspace
  2318.     BNE  RLN2
  2319.     DECB
  2320.     BGT  RLN1
  2321.     BRA  READLN  start over
  2322. RLN2    LDX  #INBUFF
  2323.     ABX
  2324.     JSR  UPCASE
  2325.     STAA 0,X     put char in buffer
  2326.     CMPB #BUFFLNG        max buffer length
  2327.     BGE  RLN3    jump if buffer full
  2328.     INCB         move buffer pointer
  2329. RLN3    JSR  ASSCHEK check for subcommand
  2330.     BNE  RLN1
  2331.     RTS
  2332. RLNQUIT CLRA         quit
  2333.     RTS    return
  2334.  
  2335.  
  2336. **********
  2337. *  parse() -parse out the mnemonic from INBUFF
  2338. * to COMBUFF. on exit: b=number of chars parsed.
  2339. **********
  2340. *combuff[3] = <space>;   initialize 4th character to space.
  2341. *ptrbuff[] = inbuff[];
  2342. *a=wskip();
  2343. *for (b = 0; b = 5; b++)
  2344. *   a=readbuff(); incbuff();
  2345. *   if (a = (cr,lf,^,/,wspace)) return(b);
  2346. *   combuff[b] = upcase(a);
  2347. *return(b);
  2348.  
  2349. PARSE   LDAA #$20
  2350.     STAA COMBUFF+3
  2351.     LDX  #INBUFF         initialize buffer ptr
  2352.     STX  PTR0
  2353.     JSR  WSKIP     find first character
  2354.     CLRB
  2355. PARSLP  JSR  READBUFF        read character
  2356.     JSR  INCBUFF
  2357.     JSR  WCHEK
  2358.     BEQ  PARSRT    jump if whitespace
  2359.     JSR  ASSCHEK
  2360.     BEQ  PARSRT    jump if end of line
  2361.     JSR  UPCASE    convert to upper case
  2362.     LDX  #COMBUFF
  2363.     ABX
  2364.     STAA 0,X       store in combuff
  2365.     INCB
  2366.     CMPB #$5
  2367.     BLE  PARSLP    loop 6 times
  2368. PARSRT  RTS
  2369.  
  2370.  
  2371. ****************
  2372. *  asschek() -perform compares for
  2373. * lf, cr, ^, /, +, -, =
  2374. ****************
  2375. ASSCHEK CMPA #$0A    linefeed
  2376.     BEQ  ASSCHK1
  2377.     CMPA #$0D    carriage ret
  2378.     BEQ  ASSCHK1
  2379.     CMPA #'^'    up arrow
  2380.     BEQ  ASSCHK1
  2381.     CMPA #'/'    slash
  2382.     BEQ  ASSCHK1
  2383.     CMPA #'+'    plus
  2384.     BEQ  ASSCHK1
  2385.     CMPA #'-'    minus
  2386.     BEQ  ASSCHK1
  2387.     CMPA #'='    equals
  2388. ASSCHK1 RTS
  2389.  
  2390.  
  2391. *********
  2392. *  msrch() --- Search MNETABL for mnemonic in COMBUFF.
  2393. *stores base opcode at baseop and class at class.
  2394. *  Class = FF if not found.
  2395. **********
  2396. *while ( != EOF )
  2397. *   if (COMBUFF[0-3] = MNETABL[0-3])
  2398. *      return(MNETABL[4],MNETABL[5]);
  2399. *   else *MNETABL =+ 6
  2400.  
  2401. MSRCH   LDX  #MNETABL        pointer to mnemonic table
  2402.     LDY  #COMBUFF        pointer to string
  2403.     BRA  MSRCH1
  2404. MSNEXT  LDAB #6
  2405.     ABX            point to next table entry
  2406. MSRCH1  LDAA 0,X       read table
  2407.     CMPA #EOT
  2408.     BNE  MSRCH2    jump if not end of table
  2409.     LDAA #$FF
  2410.     STAA CLASS     FF = not in table
  2411.     RTS
  2412. MSRCH2  CMPA 0,Y       op[0] = tabl[0] ?
  2413.     BNE  MSNEXT
  2414.     LDAA 1,X
  2415.     CMPA 1,Y       op[1] = tabl[1] ?
  2416.     BNE  MSNEXT
  2417.     LDAA 2,X
  2418.     CMPA 2,Y       op[2] = tabl[2] ?
  2419.     BNE  MSNEXT
  2420.     LDAA 3,X
  2421.     CMPA 3,Y       op[2] = tabl[2] ?
  2422.     BNE  MSNEXT
  2423.     LDD  4,X       opcode, class
  2424.     STAA BASEOP
  2425.     STAB CLASS
  2426.     RTS
  2427.  
  2428. **********
  2429. **   doop(baseop,class) --- process mnemonic.
  2430. **   on exit: a=error code corresponding to error
  2431. **                                     messages.
  2432. **********
  2433. *amode = OTHER; /* addressing mode */
  2434. *yflag = 0;     /* ynoimm, nlimm, and cpd flag */
  2435. *x[] = ptrbuff[]
  2436.  
  2437. DOOP    LDAA #OTHER
  2438.     STAA AMODE   mode
  2439.     CLR  YFLAG
  2440.     LDX  PTR0
  2441.  
  2442. *while (*x != end of buffer)
  2443. *   if (x[0]++ == ',')
  2444. *      if (x[0] == 'y') amode = INDY;
  2445. *      else amod = INDX;
  2446. *      break;
  2447. *a = wskip()
  2448. *if( a == '#' ) amode = IMMED;
  2449.  
  2450. DOPLP1  CPX  #ENDBUFF (end of buffer)
  2451.     BEQ  DOOP1   jump if end of buffer
  2452.     LDD  0,X     read 2 chars from buffer
  2453.     INX    move pointer
  2454.     CMPA #','
  2455.     BNE  DOPLP1
  2456.     CMPB #'Y'    look for ",y"
  2457.     BNE  DOPLP2
  2458.     LDAA #INDY
  2459.     STAA AMODE
  2460.     BRA  DOOP1
  2461. DOPLP2  CMPB #'X'    look for ",x"
  2462.     BNE  DOOP1   jump if not x
  2463.     LDAA #INDX
  2464.     STAA AMODE
  2465.     BRA  DOOP1
  2466. DOOP1   JSR  WSKIP
  2467.     CMPA #'#'    look for immediate mode
  2468.     BNE  DOOP2
  2469.     JSR  INCBUFF point at argument
  2470.     LDAA #IMMED
  2471.     STAA AMODE
  2472. DOOP2
  2473.  
  2474. *switch(class)
  2475.     LDAB CLASS
  2476.     CMPB #P2INH
  2477.     BNE  DOSW1
  2478.     JMP  DOP2I
  2479. DOSW1   CMPB #INH
  2480.     BNE  DOSW2
  2481.     JMP  DOINH
  2482. DOSW2   CMPB #REL
  2483.     BNE  DOSW3
  2484.     JMP  DOREL
  2485. DOSW3   CMPB #LIMM
  2486.     BNE  DOSW4
  2487.     JMP  DOLIM
  2488. DOSW4   CMPB #NIMM
  2489.     BNE  DOSW5
  2490.     JMP  DONOI
  2491. DOSW5   CMPB #GEN
  2492.     BNE  DOSW6
  2493.     JMP  DOGENE
  2494. DOSW6   CMPB #GRP2
  2495.     BNE  DOSW7
  2496.     JMP  DOGRP
  2497. DOSW7   CMPB #CPD
  2498.     BNE  DOSW8
  2499.     JMP  DOCPD
  2500. DOSW8   CMPB #XNIMM
  2501.     BNE  DOSW9
  2502.     JMP  DOXNOI
  2503. DOSW9   CMPB #XLIMM
  2504.     BNE  DOSW10
  2505.     JMP  DOXLI
  2506. DOSW10  CMPB #YNIMM
  2507.     BNE  DOSW11
  2508.     JMP  DOYNOI
  2509. DOSW11  CMPB #YLIMM
  2510.     BNE  DOSW12
  2511.     JMP  DOYLI
  2512. DOSW12  CMPB #BTB
  2513.     BNE  DOSW13
  2514.     JMP  DOBTB
  2515. DOSW13  CMPB #SETCLR
  2516.     BNE  DODEF
  2517.     JMP  DOSET
  2518.  
  2519. *   default: return("error in mnemonic table");
  2520.  
  2521. DODEF   LDAA #$2
  2522.     RTS
  2523.  
  2524. *  case P2INH: emit(PAGE2)
  2525.  
  2526. DOP2I   LDAA #PAGE2
  2527.     JSR  EMIT
  2528.  
  2529. *  case INH: emit(baseop);
  2530. *       return(0);
  2531.  
  2532. DOINH   LDAA BASEOP
  2533.     JSR  EMIT
  2534.     CLRA
  2535.     RTS
  2536.  
  2537. *  case REL: a = assarg();
  2538. *            if(a=4) return(a);
  2539. *            d = address - pc + 2;
  2540. *            if ($7f >= d >= $ff82)
  2541. *               return (out of range);
  2542. *            emit(opcode);
  2543. *            emit(offset);
  2544. *            return(0);
  2545.  
  2546. DOREL   JSR  ASSARG
  2547.     CMPA #$04
  2548.     BNE  DOREL1  jump if arg ok
  2549.     RTS
  2550. DOREL1  LDD  SHFTREG get branch address
  2551.     LDX  PC      get program counter
  2552.     INX
  2553.     INX    point to end of opcode
  2554.     STX  BRADDR
  2555.     SUBD BRADDR  calculate offset
  2556.     STD  BRADDR  save result
  2557.     CMPD #$7F    in range ?
  2558.     BLS  DOREL2  jump if in range
  2559.     CMPD #$FF80
  2560.     BHS  DOREL2  jump if in range
  2561.     LDAA #$09    'Out of range'
  2562.     RTS
  2563. DOREL2  LDAA BASEOP
  2564.     JSR  EMIT    emit opcode
  2565.     LDAA BRADDR+1
  2566.     JSR  EMIT    emit offset
  2567.     CLRA         normal return
  2568.     RTS
  2569.  
  2570. *  case LIMM: if (amode == IMMED) amode = LIMMED;
  2571.  
  2572. DOLIM   LDAA AMODE
  2573.     CMPA #IMMED
  2574.     BNE  DONOI
  2575.     LDAA #LIMMED
  2576.     STAA AMODE
  2577.  
  2578. *  case NIMM: if (amode == IMMED)
  2579. *                return("Immediate mode illegal");
  2580.  
  2581. DONOI   LDAA AMODE
  2582.     CMPA #IMMED
  2583.     BNE  DOGENE  jump if not immediate
  2584.     LDAA #$1     "immediate mode illegal"
  2585.     RTS
  2586.  
  2587. *  case GEN: dogen(baseop,amode,PAGE1,PAGE1,PAGE2);
  2588. *            return;
  2589.  
  2590. DOGENE  LDAA #PAGE1
  2591.     STAA PNORM
  2592.     STAA PX
  2593.     LDAA #PAGE2
  2594.     STAA PY
  2595.     JSR  DOGEN
  2596.     RTS
  2597.  
  2598. *  case GRP2: if (amode == INDY)
  2599. *                emit(PAGE2);
  2600. *                amode = INDX;
  2601. *             if( amode == INDX )
  2602. *                doindx(baseop);
  2603. *             else a = assarg();
  2604. *                if(a=4) return(a);
  2605. *                emit(opcode+0x10);
  2606. *                emit(extended address);
  2607. *             return;
  2608.  
  2609. DOGRP   LDAA AMODE
  2610.     CMPA #INDY
  2611.     BNE  DOGRP1
  2612.     LDAA #PAGE2
  2613.     JSR  EMIT
  2614.     LDAA #INDX
  2615.     STAA AMODE
  2616. DOGRP1  LDAA AMODE
  2617.     CMPA #INDX
  2618.     BNE  DOGRP2
  2619.     JSR  DOINDEX
  2620.     RTS
  2621. DOGRP2  LDAA BASEOP
  2622.     ADDA #$10
  2623.     JSR  EMIT
  2624.     JSR  ASSARG
  2625.     CMPA #$04
  2626.     BEQ  DOGRPRT jump if bad arg
  2627.     LDD  SHFTREG extended address
  2628.     JSR  EMIT
  2629.     TBA
  2630.     JSR  EMIT
  2631.     CLRA
  2632. DOGRPRT RTS
  2633.  
  2634. *  case CPD: if (amode == IMMED)
  2635. *               amode = LIMMED; /* cpd */
  2636. *            if( amode == INDY ) yflag = 1;
  2637. *            dogen(baseop,amode,PAGE3,PAGE3,PAGE4);
  2638. *            return;
  2639.  
  2640. DOCPD   LDAA AMODE
  2641.     CMPA #IMMED
  2642.     BNE  DOCPD1
  2643.     LDAA #LIMMED
  2644.     STAA AMODE
  2645. DOCPD1  LDAA AMODE
  2646.     CMPA #INDY
  2647.     BNE  DOCPD2
  2648.     INC  YFLAG
  2649. DOCPD2  LDAA #PAGE3
  2650.     STAA PNORM
  2651.     STAA PX
  2652.     LDAA #PAGE4
  2653.     STAA PY
  2654.     JSR  DOGEN
  2655.     RTS
  2656.  
  2657. *  case XNIMM: if (amode == IMMED)      /* stx */
  2658. *                 return("Immediate mode illegal");
  2659.  
  2660. DOXNOI  LDAA AMODE
  2661.     CMPA #IMMED
  2662.     BNE  DOXLI
  2663.     LDAA #$1     "immediate mode illegal"
  2664.     RTS
  2665.  
  2666. *  case XLIMM: if (amode == IMMED)  /* cpx, ldx */
  2667. *                 amode = LIMMED;
  2668. *              dogen(baseop,amode,PAGE1,PAGE1,PAGE4);
  2669. *              return;
  2670.  
  2671. DOXLI   LDAA AMODE
  2672.     CMPA #IMMED
  2673.     BNE  DOXLI1
  2674.     LDAA #LIMMED
  2675.     STAA AMODE
  2676. DOXLI1  LDAA #PAGE1
  2677.     STAA PNORM
  2678.     STAA PX
  2679.     LDAA #PAGE4
  2680.     STAA PY
  2681.     JSR  DOGEN
  2682.     RTS
  2683.  
  2684. *  case YNIMM: if (amode == IMMED)      /* sty */
  2685. *                 return("Immediate mode illegal");
  2686.  
  2687. DOYNOI  LDAA AMODE
  2688.     CMPA #IMMED
  2689.     BNE  DOYLI
  2690.     LDAA #$1     "immediate mode illegal"
  2691.     RTS
  2692.  
  2693. *  case YLIMM: if (amode == INDY) yflag = 1;/* cpy, ldy */
  2694. *              if(amode == IMMED) amode = LIMMED;
  2695. *              dogen(opcode,amode,PAGE2,PAGE3,PAGE2);
  2696. *              return;
  2697.  
  2698. DOYLI   LDAA AMODE
  2699.     CMPA #INDY
  2700.     BNE  DOYLI1
  2701.     INC  YFLAG
  2702. DOYLI1  CMPA #IMMED
  2703.     BNE  DOYLI2
  2704.     LDAA #LIMMED
  2705.     STAA AMODE
  2706. DOYLI2  LDAA #PAGE2
  2707.     STAA PNORM
  2708.     STAA PY
  2709.     LDAA #PAGE3
  2710.     STAA PX
  2711.     JSR  DOGEN
  2712.     RTS
  2713.  
  2714. *  case BTB:        /* bset, bclr */
  2715. *  case SETCLR: a = bitop(baseop,amode,class);
  2716. *               if(a=0) return(a = 3);
  2717. *               if( amode == INDY )
  2718. *                  emit(PAGE2);
  2719. *                  amode = INDX;
  2720.  
  2721. DOBTB
  2722. DOSET   JSR  BITOP
  2723.     CMPA #$00
  2724.     BNE  DOSET1
  2725.     LDAA #$3     "illegal bit op"
  2726.     RTS
  2727. DOSET1  LDAA AMODE
  2728.     CMPA #INDY
  2729.     BNE  DOSET2
  2730.     LDAA #PAGE2
  2731.     JSR  EMIT
  2732.     LDAA #INDX
  2733.     STAA AMODE
  2734. DOSET2
  2735.  
  2736. *               emit(baseop);
  2737. *               a = assarg();
  2738. *               if(a = 4) return(a);
  2739. *               emit(index offset);
  2740. *               if( amode == INDX )
  2741. *                  Buffptr += 2;      /* skip ,x or ,y */
  2742.  
  2743.     LDAA BASEOP
  2744.     JSR  EMIT
  2745.     JSR  ASSARG
  2746.     CMPA #$04
  2747.     BNE  DOSET22         jump if arg ok
  2748.     RTS
  2749. DOSET22 LDAA SHFTREG+1       index offset
  2750.     JSR  EMIT
  2751.     LDAA AMODE
  2752.     CMPA #INDX
  2753.     BNE  DOSET3
  2754.     JSR  INCBUFF
  2755.     JSR  INCBUFF
  2756. DOSET3
  2757.  
  2758. *               a = assarg();
  2759. *               if(a = 4) return(a);
  2760. *               emit(mask);   /* mask */
  2761. *               if( class == SETCLR )
  2762. *                  return;
  2763.  
  2764.     JSR  ASSARG
  2765.     CMPA #$04
  2766.     BNE  DOSET33         jump if arg ok
  2767.     RTS
  2768. DOSET33 LDAA SHFTREG+1       mask
  2769.     JSR  EMIT
  2770.     LDAA CLASS
  2771.     CMPA #SETCLR
  2772.     BNE  DOSET4
  2773.     CLRA
  2774.     RTS
  2775. DOSET4
  2776.  
  2777. *               a = assarg();
  2778. *               if(a = 4) return(a);
  2779. *               d = (pc+1) - shftreg;
  2780. *               if ($7f >= d >= $ff82)
  2781. *                  return (out of range);
  2782. *               emit(branch offset);
  2783. *               return(0);
  2784.  
  2785.     JSR  ASSARG
  2786.     CMPA #$04
  2787.     BNE  DOSET5    jump if arg ok
  2788.     RTS
  2789. DOSET5  LDX  PC        program counter
  2790.     INX            point to next inst
  2791.     STX  BRADDR    save pc value
  2792.     LDD  SHFTREG         get branch address
  2793.     SUBD BRADDR    calculate offset
  2794.     CMPD #$7F
  2795.     BLS  DOSET6    jump if in range
  2796.     CMPD #$FF80
  2797.     BHS  DOSET6    jump if in range
  2798.     CLRA
  2799.     JSR  EMIT
  2800.     LDAA #$09      'out of range'
  2801.     RTS
  2802. DOSET6  TBA            offset
  2803.     JSR  EMIT
  2804.     CLRA
  2805.     RTS
  2806.  
  2807.  
  2808. **********
  2809. **   bitop(baseop,amode,class) --- adjust opcode on bit
  2810. **       manipulation instructions.  Returns opcode in a
  2811. **       or a = 0 if error
  2812. **********
  2813. *if( amode == INDX || amode == INDY ) return(op);
  2814. *if( class == SETCLR ) return(op-8);
  2815. *else if(class==BTB) return(op-12);
  2816. *else fatal("bitop");
  2817.  
  2818. BITOP   LDAA AMODE
  2819.     LDAB CLASS
  2820.     CMPA #INDX
  2821.     BNE  BITOP1
  2822.     RTS
  2823. BITOP1  CMPA #INDY
  2824.     BNE  BITOP2  jump not indexed
  2825.     RTS
  2826. BITOP2  CMPB #SETCLR
  2827.     BNE  BITOP3  jump not bset,bclr
  2828.     LDAA BASEOP  get opcode
  2829.     SUBA #8
  2830.     STAA BASEOP
  2831.     RTS
  2832. BITOP3  CMPB #BTB
  2833.     BNE  BITOP4  jump not bit branch
  2834.     LDAA BASEOP  get opcode
  2835.     SUBA #12
  2836.     STAA BASEOP
  2837.     RTS
  2838. BITOP4  CLRA         0 = fatal bitop
  2839.     RTS
  2840.  
  2841. **********
  2842. **   dogen(baseop,mode,pnorm,px,py) - process
  2843. ** general addressing modes. Returns a = error #.
  2844. **********
  2845. *pnorm = page for normal addressing modes: IMM,DIR,EXT
  2846. *px = page for INDX addressing
  2847. *py = page for INDY addressing
  2848. *switch(amode)
  2849. DOGEN   LDAA AMODE
  2850.     CMPA #LIMMED
  2851.     BEQ  DOGLIM
  2852.     CMPA #IMMED
  2853.     BEQ  DOGIMM
  2854.     CMPA #INDY
  2855.     BEQ  DOGINDY
  2856.     CMPA #INDX
  2857.     BEQ  DOGINDX
  2858.     CMPA #OTHER
  2859.     BEQ  DOGOTH
  2860.  
  2861. *default: error("Unknown Addressing Mode");
  2862.  
  2863. DOGDEF  LDAA #$06        unknown addre...
  2864.     RTS
  2865.  
  2866. *case LIMMED: epage(pnorm);
  2867. *             emit(baseop);
  2868. *             a = assarg();
  2869. *             if(a = 4) return(a);
  2870. *             emit(2 bytes);
  2871. *             return(0);
  2872.  
  2873. DOGLIM  LDAA PNORM
  2874.     JSR  EPAGE
  2875. DOGLIM1 LDAA BASEOP
  2876.     JSR  EMIT
  2877.     JSR  ASSARG   get next argument
  2878.     CMPA #$04
  2879.     BNE  DOGLIM2   jump if arg ok
  2880.     RTS
  2881. DOGLIM2 LDD  SHFTREG
  2882.     JSR  EMIT
  2883.     TBA
  2884.     JSR  EMIT
  2885.     CLRA
  2886.     RTS
  2887.  
  2888. *case IMMED: epage(pnorm);
  2889. *            emit(baseop);
  2890. *            a = assarg();
  2891. *            if(a = 4) return(a);
  2892. *            emit(lobyte);
  2893. *            return(0);
  2894.  
  2895. DOGIMM  LDAA PNORM
  2896.     JSR  EPAGE
  2897.     LDAA BASEOP
  2898.     JSR  EMIT
  2899.     JSR  ASSARG
  2900.     CMPA #$04
  2901.     BNE  DOGIMM1   jump if arg ok
  2902.     RTS
  2903. DOGIMM1 LDAA SHFTREG+1
  2904.     JSR  EMIT
  2905.     CLRA
  2906.     RTS
  2907.  
  2908. *case INDY: epage(py);
  2909. *           a=doindex(op+0x20);
  2910. *           return(a);
  2911.  
  2912. DOGINDY LDAA PY
  2913.     JSR  EPAGE
  2914.     LDAA BASEOP
  2915.     ADDA #$20
  2916.     STAA BASEOP
  2917.     JSR  DOINDEX
  2918.     RTS
  2919.  
  2920. *case INDX: epage(px);
  2921. *           a=doindex(op+0x20);
  2922. *           return(a);
  2923.  
  2924. DOGINDX LDAA PX
  2925.     JSR  EPAGE
  2926.     LDAA BASEOP
  2927.     ADDA #$20
  2928.     STAA BASEOP
  2929.     JSR  DOINDEX
  2930.     RTS
  2931.  
  2932. *case OTHER: a = assarg();
  2933. *            if(a = 4) return(a);
  2934. *            epage(pnorm);
  2935. *            if(countu1 <= 2 digits)   /* direct */
  2936. *               emit(op+0x10);
  2937. *               emit(lobyte(Result));
  2938. *               return(0);
  2939. *            else    emit(op+0x30);    /* extended */
  2940. *               eword(Result);
  2941. *               return(0)
  2942.  
  2943. DOGOTH  JSR  ASSARG
  2944.     CMPA #$04
  2945.     BNE  DOGOTH0  jump if arg ok
  2946.     RTS
  2947. DOGOTH0 LDAA PNORM
  2948.     JSR  EPAGE
  2949.     LDAA COUNT
  2950.     CMPA #$2
  2951.     BGT  DOGOTH1
  2952.     LDAA BASEOP
  2953.     ADDA #$10      direct mode opcode
  2954.     JSR  EMIT
  2955.     LDAA SHFTREG+1
  2956.     JSR  EMIT
  2957.     CLRA
  2958.     RTS
  2959. DOGOTH1 LDAA BASEOP
  2960.     ADDA #$30      extended mode opcode
  2961.     JSR  EMIT
  2962.     LDD  SHFTREG
  2963.     JSR  EMIT
  2964.     TBA
  2965.     JSR  EMIT
  2966.     CLRA
  2967.     RTS
  2968.  
  2969. **********
  2970. **  doindex(op) --- handle all wierd stuff for
  2971. **   indexed addressing. Returns a = error number.
  2972. **********
  2973. *emit(baseop);
  2974. *a=assarg();
  2975. *if(a = 4) return(a);
  2976. *if( a != ',' ) return("Syntax");
  2977. *buffptr++
  2978. *a=readbuff()
  2979. *if( a != 'x' &&  != 'y') warn("Ind Addr Assumed");
  2980. *emit(lobyte);
  2981. *return(0);
  2982.  
  2983. DOINDEX LDAA BASEOP
  2984.     JSR  EMIT
  2985.     JSR  ASSARG
  2986.     CMPA #$04
  2987.     BNE  DOINDX0     jump if arg ok
  2988.     RTS
  2989. DOINDX0 CMPA #','
  2990.     BEQ  DOINDX1
  2991.     LDAA #$08        "syntax error"
  2992.     RTS
  2993. DOINDX1 JSR  INCBUFF
  2994.     JSR  READBUFF
  2995.     CMPA #'Y'
  2996.     BEQ  DOINDX2
  2997.     CMPA #'X'
  2998.     BEQ  DOINDX2
  2999.     LDX  MSGA7       "index addr assumed"
  3000.     JSR  OUTSTRG
  3001. DOINDX2 LDAA SHFTREG+1
  3002.     JSR  EMIT
  3003.     CLRA
  3004.     RTS
  3005.  
  3006. **********
  3007. **   assarg(); - get argument.  Returns a = 4 if bad
  3008. ** argument, else a = first non hex char.
  3009. **********
  3010. *a = buffarg()
  3011. *if(asschk(aa) && countu1 != 0) return(a);
  3012. *return(bad argument);
  3013.  
  3014. ASSARG  JSR  BUFFARG
  3015.     JSR  ASSCHEK   check for command
  3016.     BEQ  ASSARG1   jump if ok
  3017.     JSR  WCHEK     check for whitespace
  3018.     BNE  ASSARG2   jump if not ok
  3019. ASSARG1 TST  COUNT
  3020.     BEQ  ASSARG2   jump if no argument
  3021.     RTS
  3022. ASSARG2 LDAA #$04      bad argument
  3023.     RTS
  3024.  
  3025. **********
  3026. **  epage(a) --- emit page prebyte
  3027. **********
  3028. *if( a != PAGE1 ) emit(a);
  3029.  
  3030. EPAGE   CMPA #PAGE1
  3031.     BEQ  EPAGRT  jump if page 1
  3032.     JSR  EMIT
  3033. EPAGRT  RTS
  3034.  
  3035. **********
  3036. *   emit(a) --- emit contents of a
  3037. **********
  3038. EMIT    LDX  PC
  3039.     JSR  WRITE      write a to x
  3040.     JSR  OUT1BSP
  3041.     STX  PC
  3042.     RTS
  3043.  
  3044. *Mnemonic table for hc11 line assembler
  3045. NULL    EQU    $0      nothing
  3046. INH    EQU    $1      inherent
  3047. P2INH    EQU    $2      page 2 inherent
  3048. GEN    EQU    $3      general addressing
  3049. GRP2    EQU    $4      group 2
  3050. REL    EQU    $5      relative
  3051. IMM    EQU    $6      immediate
  3052. NIMM    EQU    $7      general except for immediate
  3053. LIMM    EQU    $8      2 byte immediate
  3054. XLIMM    EQU    $9      longimm for x
  3055. XNIMM    EQU    $10     no immediate for x
  3056. YLIMM    EQU    $11     longimm for y
  3057. YNIMM    EQU    $12     no immediate for y
  3058. BTB    EQU    $13     bit test and branch
  3059. SETCLR    EQU    $14     bit set or clear
  3060. CPD    EQU    $15     compare d
  3061. BTBD    EQU    $16     bit test and branch direct
  3062. SETCLRD    EQU    $17     bit set or clear direct
  3063.  
  3064. **********
  3065. *   mnetabl - includes all '11 mnemonics, base opcodes,
  3066. * and type of instruction.  The assembler search routine
  3067. *depends on 4 characters for each mnemonic so that 3 char
  3068. *mnemonics are extended with a space and 5 char mnemonics
  3069. *are truncated.
  3070. **********
  3071.  
  3072. MNETABL FCC    "ABA "   Mnemonic
  3073.     FCB    $1B     Base opcode
  3074.     FCB    INH     Class
  3075.     FCC    "ABX "
  3076.     FCB    $3A
  3077.     FCB    INH
  3078.     FCC    "ABY "
  3079.     FCB    $3A
  3080.     FCB    P2INH
  3081.     FCC    "ADCA"
  3082.     FCB    $89
  3083.     FCB    GEN
  3084.     FCC    "ADCB"
  3085.     FCB    $C9
  3086.     FCB    GEN
  3087.     FCC    "ADDA"
  3088.     FCB    $8B
  3089.     FCB    GEN
  3090.     FCC    "ADDB"
  3091.     FCB    $CB
  3092.     FCB    GEN
  3093.     FCC    "ADDD"
  3094.     FCB    $C3
  3095.     FCB    LIMM
  3096.     FCC    "ANDA"
  3097.     FCB    $84
  3098.     FCB    GEN
  3099.     FCC    "ANDB"
  3100.     FCB    $C4
  3101.     FCB    GEN
  3102.     FCC    "ASL "
  3103.     FCB    $68
  3104.     FCB    GRP2
  3105.     FCC    "ASLA"
  3106.     FCB    $48
  3107.     FCB    INH
  3108.     FCC    "ASLB"
  3109.     FCB    $58
  3110.     FCB    INH
  3111.     FCC    "ASLD"
  3112.     FCB    $05
  3113.     FCB    INH
  3114.     FCC    "ASR "
  3115.     FCB    $67
  3116.     FCB    GRP2
  3117.     FCC    "ASRA"
  3118.     FCB    $47
  3119.     FCB    INH
  3120.     FCC    "ASRB"
  3121.     FCB    $57
  3122.     FCB    INH
  3123.     FCC    "BCC "
  3124.     FCB    $24
  3125.     FCB    REL
  3126.     FCC    "BCLR"
  3127.     FCB    $1D
  3128.     FCB    SETCLR
  3129.     FCC    "BCS "
  3130.     FCB    $25
  3131.     FCB    REL
  3132.     FCC    "BEQ "
  3133.     FCB    $27
  3134.     FCB    REL
  3135.     FCC    "BGE "
  3136.     FCB    $2C
  3137.     FCB    REL
  3138.     FCC    "BGT "
  3139.     FCB    $2E
  3140.     FCB    REL
  3141.     FCC    "BHI "
  3142.     FCB    $22
  3143.     FCB    REL
  3144.     FCC    "BHS "
  3145.     FCB    $24
  3146.     FCB    REL
  3147.     FCC    "BITA"
  3148.     FCB    $85
  3149.     FCB    GEN
  3150.     FCC    "BITB"
  3151.     FCB    $C5
  3152.     FCB    GEN
  3153.     FCC    "BLE "
  3154.     FCB    $2F
  3155.     FCB    REL
  3156.     FCC    "BLO "
  3157.     FCB    $25
  3158.     FCB    REL
  3159.     FCC    "BLS "
  3160.     FCB    $23
  3161.     FCB    REL
  3162.     FCC    "BLT "
  3163.     FCB    $2D
  3164.     FCB    REL
  3165.     FCC    "BMI "
  3166.     FCB    $2B
  3167.     FCB    REL
  3168.     FCC    "BNE "
  3169.     FCB    $26
  3170.     FCB    REL
  3171.     FCC    "BPL "
  3172.     FCB    $2A
  3173.     FCB    REL
  3174.     FCC    "BRA "
  3175.     FCB    $20
  3176.     FCB    REL
  3177.     FCC    "BRCL"       (BRCLR)
  3178.     FCB    $1F
  3179.     FCB    BTB
  3180.     FCC    "BRN "
  3181.     FCB    $21
  3182.     FCB    REL
  3183.     FCC    "BRSE"       (BRSET)
  3184.     FCB    $1E
  3185.     FCB    BTB
  3186.     FCC    "BSET"
  3187.     FCB    $1C
  3188.     FCB    SETCLR
  3189.     FCC    "BSR "
  3190.     FCB    $8D
  3191.     FCB    REL
  3192.     FCC    "BVC "
  3193.     FCB    $28
  3194.     FCB    REL
  3195.     FCC    "BVS "
  3196.     FCB    $29
  3197.     FCB    REL
  3198.     FCC    "CBA "
  3199.     FCB    $11
  3200.     FCB    INH
  3201.     FCC    "CLC "
  3202.     FCB    $0C
  3203.     FCB    INH
  3204.     FCC    "CLI "
  3205.     FCB    $0E
  3206.     FCB    INH
  3207.     FCC    "CLR "
  3208.     FCB    $6F
  3209.     FCB    GRP2
  3210.     FCC    "CLRA"
  3211.     FCB    $4F
  3212.     FCB    INH
  3213.     FCC    "CLRB"
  3214.     FCB    $5F
  3215.     FCB    INH
  3216.     FCC    "CLV "
  3217.     FCB    $0A
  3218.     FCB    INH
  3219.     FCC    "CMPA"
  3220.     FCB    $81
  3221.     FCB    GEN
  3222.     FCC    "CMPB"
  3223.     FCB    $C1
  3224.     FCB    GEN
  3225.     FCC    "COM "
  3226.     FCB    $63
  3227.     FCB    GRP2
  3228.     FCC    "COMA"
  3229.     FCB    $43
  3230.     FCB    INH
  3231.     FCC    "COMB"
  3232.     FCB    $53
  3233.     FCB    INH
  3234.     FCC    "CPD "
  3235.     FCB    $83
  3236.     FCB    CPD
  3237.     FCC    "CPX "
  3238.     FCB    $8C
  3239.     FCB    XLIMM
  3240.     FCC    "CPY "
  3241.     FCB    $8C
  3242.     FCB    YLIMM
  3243.     FCC    "DAA "
  3244.     FCB    $19
  3245.     FCB    INH
  3246.     FCC    "DEC "
  3247.     FCB    $6A
  3248.     FCB    GRP2
  3249.     FCC    "DECA"
  3250.     FCB    $4A
  3251.     FCB    INH
  3252.     FCC    "DECB"
  3253.     FCB    $5A
  3254.     FCB    INH
  3255.     FCC    "DES "
  3256.     FCB    $34
  3257.     FCB    INH
  3258.     FCC    "DEX "
  3259.     FCB    $09
  3260.     FCB    INH
  3261.     FCC    "DEY "
  3262.     FCB    $09
  3263.     FCB    P2INH
  3264.     FCC    "EORA"
  3265.     FCB    $88
  3266.     FCB    GEN
  3267.     FCC    "EORB"
  3268.     FCB    $C8
  3269.     FCB    GEN
  3270.     FCC    "FDIV"
  3271.     FCB    $03
  3272.     FCB    INH
  3273.     FCC    "IDIV"
  3274.     FCB    $02
  3275.     FCB    INH
  3276.     FCC    "INC "
  3277.     FCB    $6C
  3278.     FCB    GRP2
  3279.     FCC    "INCA"
  3280.     FCB    $4C
  3281.     FCB    INH
  3282.     FCC    "INCB"
  3283.     FCB    $5C
  3284.     FCB    INH
  3285.     FCC    "INS "
  3286.     FCB    $31
  3287.     FCB    INH
  3288.     FCC    "INX "
  3289.     FCB    $08
  3290.     FCB    INH
  3291.     FCC    "INY "
  3292.     FCB    $08
  3293.     FCB    P2INH
  3294.     FCC    "JMP "
  3295.     FCB    $6E
  3296.     FCB    GRP2
  3297.     FCC    "JSR "
  3298.     FCB    $8D
  3299.     FCB    NIMM
  3300.     FCC    "LDAA"
  3301.     FCB    $86
  3302.     FCB    GEN
  3303.     FCC    "LDAB"
  3304.     FCB    $C6
  3305.     FCB    GEN
  3306.     FCC    "LDD "
  3307.     FCB    $CC
  3308.     FCB    LIMM
  3309.     FCC    "LDS "
  3310.     FCB    $8E
  3311.     FCB    LIMM
  3312.     FCC    "LDX "
  3313.     FCB    $CE
  3314.     FCB    XLIMM
  3315.     FCC    "LDY "
  3316.     FCB    $CE
  3317.     FCB    YLIMM
  3318.     FCC    "LSL "
  3319.     FCB    $68
  3320.     FCB    GRP2
  3321.     FCC    "LSLA"
  3322.     FCB    $48
  3323.     FCB    INH
  3324.     FCC    "LSLB"
  3325.     FCB    $58
  3326.     FCB    INH
  3327.     FCC    "LSLD"
  3328.     FCB    $05
  3329.     FCB    INH
  3330.     FCC    "LSR "
  3331.     FCB    $64
  3332.     FCB    GRP2
  3333.     FCC    "LSRA"
  3334.     FCB    $44
  3335.     FCB    INH
  3336.     FCC    "LSRB"
  3337.     FCB    $54
  3338.     FCB    INH
  3339.     FCC    "LSRD"
  3340.     FCB    $04
  3341.     FCB    INH
  3342.     FCC    "MUL "
  3343.     FCB    $3D
  3344.     FCB    INH
  3345.     FCC    "NEG "
  3346.     FCB    $60
  3347.     FCB    GRP2
  3348.     FCC    "NEGA"
  3349.     FCB    $40
  3350.     FCB    INH
  3351.     FCC    "NEGB"
  3352.     FCB    $50
  3353.     FCB    INH
  3354.     FCC    "NOP "
  3355.     FCB    $01
  3356.     FCB    INH
  3357.     FCC    "ORAA"
  3358.     FCB    $8A
  3359.     FCB    GEN
  3360.     FCC    "ORAB"
  3361.     FCB    $CA
  3362.     FCB    GEN
  3363.     FCC    "PSHA"
  3364.     FCB    $36
  3365.     FCB    INH
  3366.     FCC    "PSHB"
  3367.     FCB    $37
  3368.     FCB    INH
  3369.     FCC    "PSHX"
  3370.     FCB    $3C
  3371.     FCB    INH
  3372.     FCC    "PSHY"
  3373.     FCB    $3C
  3374.     FCB    P2INH
  3375.     FCC    "PULA"
  3376.     FCB    $32
  3377.     FCB    INH
  3378.     FCC    "PULB"
  3379.     FCB    $33
  3380.     FCB    INH
  3381.     FCC    "PULX"
  3382.     FCB    $38
  3383.     FCB    INH
  3384.     FCC    "PULY"
  3385.     FCB    $38
  3386.     FCB    P2INH
  3387.     FCC    "ROL "
  3388.     FCB    $69
  3389.     FCB    GRP2
  3390.     FCC    "ROLA"
  3391.     FCB    $49
  3392.     FCB    INH
  3393.     FCC    "ROLB"
  3394.     FCB    $59
  3395.     FCB    INH
  3396.     FCC    "ROR "
  3397.     FCB    $66
  3398.     FCB    GRP2
  3399.     FCC    "RORA"
  3400.     FCB    $46
  3401.     FCB    INH
  3402.     FCC    "RORB"
  3403.     FCB    $56
  3404.     FCB    INH
  3405.     FCC    "RTI "
  3406.     FCB    $3B
  3407.     FCB    INH
  3408.     FCC    "RTS "
  3409.     FCB    $39
  3410.     FCB    INH
  3411.     FCC    "SBA "
  3412.     FCB    $10
  3413.     FCB    INH
  3414.     FCC    "SBCA"
  3415.     FCB    $82
  3416.     FCB    GEN
  3417.     FCC    "SBCB"
  3418.     FCB    $C2
  3419.     FCB    GEN
  3420.     FCC    "SEC "
  3421.     FCB    $0D
  3422.     FCB    INH
  3423.     FCC    "SEI "
  3424.     FCB    $0F
  3425.     FCB    INH
  3426.     FCC    "SEV "
  3427.     FCB    $0B
  3428.     FCB    INH
  3429.     FCC    "STAA"
  3430.     FCB    $87
  3431.     FCB    NIMM
  3432.     FCC    "STAB"
  3433.     FCB    $C7
  3434.     FCB    NIMM
  3435.     FCC    "STD "
  3436.     FCB    $CD
  3437.     FCB    NIMM
  3438.     FCC    "STOP"
  3439.     FCB    $CF
  3440.     FCB    INH
  3441.     FCC    "STS "
  3442.     FCB    $8F
  3443.     FCB    NIMM
  3444.     FCC    "STX "
  3445.     FCB    $CF
  3446.     FCB    XNIMM
  3447.     FCC    "STY "
  3448.     FCB    $CF
  3449.     FCB    YNIMM
  3450.     FCC    "SUBA"
  3451.     FCB    $80
  3452.     FCB    GEN
  3453.     FCC    "SUBB"
  3454.     FCB    $C0
  3455.     FCB    GEN
  3456.     FCC    "SUBD"
  3457.     FCB    $83
  3458.     FCB    LIMM
  3459.     FCC    "SWI "
  3460.     FCB    $3F
  3461.     FCB    INH
  3462.     FCC    "TAB "
  3463.     FCB    $16
  3464.     FCB    INH
  3465.     FCC    "TAP "
  3466.     FCB    $06
  3467.     FCB    INH
  3468.     FCC    "TBA "
  3469.     FCB    $17
  3470.     FCB    INH
  3471.     FCC    "TPA "
  3472.     FCB    $07
  3473.     FCB    INH
  3474.     FCC    "TEST"
  3475.     FCB    $00
  3476.     FCB    INH
  3477.     FCC    "TST "
  3478.     FCB    $6D
  3479.     FCB    GRP2
  3480.     FCC    "TSTA"
  3481.     FCB    $4D
  3482.     FCB    INH
  3483.     FCC    "TSTB"
  3484.     FCB    $5D
  3485.     FCB    INH
  3486.     FCC    "TSX "
  3487.     FCB    $30
  3488.     FCB    INH
  3489.     FCC    "TSY "
  3490.     FCB    $30
  3491.     FCB    P2INH
  3492.     FCC    "TXS "
  3493.     FCB    $35
  3494.     FCB    INH
  3495.     FCC    "TYS "
  3496.     FCB    $35
  3497.     FCB    P2INH
  3498.     FCC    "WAI "
  3499.     FCB    $3E
  3500.     FCB    INH
  3501.     FCC    "XGDX"
  3502.     FCB    $8F
  3503.     FCB    INH
  3504.     FCC    "XGDY"
  3505.     FCB    $8F
  3506.     FCB    P2INH
  3507.     FCC    "BRSE"        bit direct modes for
  3508.     FCB    $12       disassembler.
  3509.     FCB    BTBD
  3510.     FCC    "BRCL"
  3511.     FCB    $13
  3512.     FCB    BTBD
  3513.     FCC    "BSET"
  3514.     FCB    $14
  3515.     FCB    SETCLRD
  3516.     FCC    "BCLR"
  3517.     FCB    $15
  3518.     FCB    SETCLRD
  3519.     FCB    EOT       End of table
  3520.  
  3521. **********************************************
  3522. PG1     EQU    $0
  3523. PG2     EQU    $1
  3524. PG3     EQU    $2
  3525. PG4     EQU    $3
  3526.  
  3527. ******************
  3528. *disassem() - disassemble the opcode.
  3529. ******************
  3530. *(check for page prebyte)
  3531. *baseop=pc[0];
  3532. *pnorm=PG1;
  3533. *if(baseop==$18) pnorm=PG2;
  3534. *if(baseop==$1A) pnorm=PG3;
  3535. *if(baseop==$CD) pnorm=PG4;
  3536. *if(pnorm != PG1) dispc=pc+1;
  3537. *else dispc=pc; (dispc points to next byte)
  3538.  
  3539. DISASSM LDX  PC         address
  3540.     LDAA 0,X        opcode
  3541.     LDAB #PG1
  3542.     CMPA #$18
  3543.     BEQ  DISP2      jump if page2
  3544.     CMPA #$1A
  3545.     BEQ  DISP3      jump if page3
  3546.     CMPA #$CD
  3547.     BNE  DISP1      jump if not page4
  3548. DISP4   INCB      set up page value
  3549. DISP3   INCB
  3550. DISP2   INCB
  3551.     INX
  3552. DISP1   STX  DISPC      point to opcode
  3553.     STAB PNORM      save page
  3554.  
  3555. *If(opcode == ($00-$5F or $8D or $8F or $CF))
  3556. *  if(pnorm == (PG3 or PG4))
  3557. *      disillop(); return();
  3558. *  b=disrch(opcode,NULL);
  3559. *  if(b==0) disillop(); return();
  3560.  
  3561.     LDAA 0,X  get current opcode
  3562.     STAA BASEOP
  3563.     INX
  3564.     STX  DISPC      point to next byte
  3565.     CMPA #$5F
  3566.     BLS  DIS1       jump if in range
  3567.     CMPA #$8D
  3568.     BEQ  DIS1       jump if bsr
  3569.     CMPA #$8F
  3570.     BEQ  DIS1       jump if xgdx
  3571.     CMPA #$CF
  3572.     BEQ  DIS1       jump if stop
  3573.     JMP  DISGRP     try next part of map
  3574. DIS1    LDAB PNORM
  3575.     CMPB #PG3
  3576.     BLO  DIS2       jump if page 1 or 2
  3577.     JSR  DISILLOP   "illegal opcode"
  3578.     RTS
  3579. DIS2    LDAB BASEOP     opcode
  3580.     CLRB      class=null
  3581.     JSR  DISRCH
  3582.     TSTB
  3583.     BNE  DISPEC     jump if opcode found
  3584.     JSR  DISILLOP   "illegal opcode"
  3585.     RTS
  3586.  
  3587. *   if(opcode==$8D) dissrch(opcode,REL);
  3588. *   if(opcode==($8F or $CF)) disrch(opcode,INH);
  3589.  
  3590. DISPEC  LDAA BASEOP
  3591.     CMPA #$8D
  3592.     BNE  DISPEC1
  3593.     LDAB #REL
  3594.     BRA  DISPEC3    look for BSR opcode
  3595. DISPEC1 CMPA #$8F
  3596.     BEQ  DISPEC2    jump if XGDX opcode
  3597.     CMPA #$CF
  3598.     BNE  DISINH     jump not STOP opcode
  3599. DISPEC2 LDAB #INH
  3600. DISPEC3 JSR  DISRCH     find other entry in table
  3601.  
  3602. *   if(class==INH)           /* INH */
  3603. *      if(pnorm==PG2)
  3604. *         b=disrch(baseop,P2INH);
  3605. *         if(b==0) disillop(); return();
  3606. *      prntmne();
  3607. *      return();
  3608.  
  3609. DISINH  LDAB CLASS
  3610.     CMPB #INH
  3611.     BNE  DISREL     jump if not inherent
  3612.     LDAB PNORM
  3613.     CMPB #PG1
  3614.     BEQ  DISINH1    jump if page1
  3615.     LDAA BASEOP     get opcode
  3616.     LDAB #P2INH     class=p2inh
  3617.     JSR  DISRCH
  3618.     TSTB
  3619.     BNE  DISINH1    jump if found
  3620.     JSR  DISILLOP   "illegal opcode"
  3621.     RTS
  3622. DISINH1 JSR  PRNTMNE
  3623.     RTS
  3624.  
  3625. *   elseif(class=REL)       /* REL */
  3626. *      if(pnorm != PG1)
  3627. *         disillop(); return();
  3628. *      prntmne();
  3629. *      disrelad();
  3630. *      return();
  3631.  
  3632. DISREL  LDAB CLASS
  3633.     CMPB #REL
  3634.     BNE  DISBTD
  3635.     TST  PNORM
  3636.     BEQ  DISREL1    jump if page1
  3637.     JSR  DISILLOP   "illegal opcode"
  3638.     RTS
  3639. DISREL1 JSR  PRNTMNE    output mnemonic
  3640.     JSR  DISRELAD   compute relative address
  3641.     RTS
  3642.  
  3643. *   else           /* SETCLR,SETCLRD,BTB,BTBD */
  3644. *      if(class == (SETCLRD or BTBD))
  3645. *         if(pnorm != PG1)
  3646. *            disillop(); return();   /* illop */
  3647. *         prntmne();           /* direct */
  3648. *         disdir();           /* output $byte */
  3649. *      else (class == (SETCLR or BTB))
  3650. *         prntmne();           /* indexed */
  3651. *         disindx();
  3652. *      outspac();
  3653. *      disdir();
  3654. *      outspac();
  3655. *      if(class == (BTB or BTBD))
  3656. *         disrelad();
  3657. *   return();
  3658.  
  3659. DISBTD  LDAB CLASS
  3660.     CMPB #SETCLRD
  3661.     BEQ  DISBTD1
  3662.     CMPB #BTBD
  3663.     BNE  DISBIT     jump not direct bitop
  3664. DISBTD1 TST  PNORM
  3665.     BEQ  DISBTD2    jump if page 1
  3666.     JSR  DISILLOP
  3667.     RTS
  3668. DISBTD2 JSR  PRNTMNE
  3669.     JSR  DISDIR     operand(direct)
  3670.     BRA  DISBIT1
  3671. DISBIT  JSR  PRNTMNE
  3672.     JSR  DISINDX    operand(indexed)
  3673. DISBIT1 JSR  OUTSPAC
  3674.     JSR  DISDIR     mask
  3675.     LDAB CLASS
  3676.     CMPB #BTB
  3677.     BEQ  DISBIT2    jump if btb
  3678.     CMPB #BTBD
  3679.     BNE  DISBIT3    jump if not bit branch
  3680. DISBIT2 JSR  DISRELAD   relative address
  3681. DISBIT3 RTS
  3682.  
  3683.  
  3684. *Elseif($60 <= opcode <= $7F)  /*  GRP2 */
  3685. *   if(pnorm == (PG3 or PG4))
  3686. *      disillop(); return();
  3687. *   if((pnorm==PG2) and (opcode != $6x))
  3688. *      disillop(); return();
  3689. *   b=disrch(baseop & $6F,NULL);
  3690. *   if(b==0) disillop(); return();
  3691. *   prntmne();
  3692. *   if(opcode == $6x)
  3693. *      disindx();
  3694. *   else
  3695. *      disext();
  3696. *   return();
  3697.  
  3698. DISGRP  CMPA #$7F       a=opcode
  3699.     BHI  DISNEXT    try next part of map
  3700.     LDAB PNORM
  3701.     CMPB #PG3
  3702.     BLO  DISGRP2    jump if page 1 or 2
  3703.     JSR  DISILLOP   "illegal opcode"
  3704.     RTS
  3705. DISGRP2 ANDA #$6F       mask bit 4
  3706.     CLRB      class=null
  3707.     JSR  DISRCH
  3708.     TSTB
  3709.     BNE  DISGRP3    jump if found
  3710.     JSR  DISILLOP   "illegal opcode"
  3711.     RTS
  3712. DISGRP3 JSR  PRNTMNE
  3713.     LDAA BASEOP     get opcode
  3714.     ANDA #$F0
  3715.     CMPA #$60
  3716.     BNE  DISGRP4    jump if not 6x
  3717.     JSR  DISINDX    operand(indexed)
  3718.     RTS
  3719. DISGRP4 JSR  DISEXT     operand(extended)
  3720.     RTS
  3721.  
  3722. *Else  ($80 <= opcode <= $FF)
  3723. *   if(opcode == ($87 or $C7))
  3724. *      disillop(); return();
  3725. *   b=disrch(opcode&$CF,NULL);
  3726. *   if(b==0) disillop(); return();
  3727.  
  3728. DISNEXT CMPA #$87       a=opcode
  3729.     BEQ  DISNEX1
  3730.     CMPA #$C7
  3731.     BNE  DISNEX2
  3732. DISNEX1 JSR  DISILLOP   "illegal opcode"
  3733.     RTS
  3734. DISNEX2 ANDA #$CF
  3735.     CLRB      class=null
  3736.     JSR  DISRCH
  3737.     TSTB
  3738.     BNE  DISNEW     jump if mne found
  3739.     JSR  DISILLOP   "illegal opcode"
  3740.     RTS
  3741.  
  3742. *   if(opcode&$CF==$8D) disrch(baseop,NIMM; (jsr)
  3743. *   if(opcode&$CF==$8F) disrch(baseop,NIMM; (sts)
  3744. *   if(opcode&$CF==$CF) disrch(baseop,XNIMM; (stx)
  3745. *   if(opcode&$CF==$83) disrch(baseop,LIMM); (subd)
  3746.  
  3747. DISNEW  LDAA BASEOP
  3748.     ANDA #$CF
  3749.     CMPA #$8D
  3750.     BNE  DISNEW1    jump not jsr
  3751.     LDAB #NIMM
  3752.     BRA  DISNEW4
  3753. DISNEW1 CMPA #$8F
  3754.     BNE  DISNEW2    jump not sts
  3755.     LDAB #NIMM
  3756.     BRA  DISNEW4
  3757. DISNEW2 CMPA #$CF
  3758.     BNE  DISNEW3    jump not stx
  3759.     LDAB #XNIMM
  3760.     BRA  DISNEW4
  3761. DISNEW3 CMPA #$83
  3762.     BNE  DISGEN     jump not subd
  3763.     LDAB #LIMM
  3764. DISNEW4 JSR  DISRCH
  3765.     TSTB
  3766.     BNE  DISGEN     jump if found
  3767.     JSR  DISILLOP   "illegal opcode"
  3768.     RTS
  3769.  
  3770. *   if(class == (GEN or NIMM or LIMM   ))   /* GEN,NIMM,LIMM,CPD */
  3771. *      if(opcode&$CF==$83)
  3772. *         if(pnorm==(PG3 or PG4)) disrch(opcode#$CF,CPD)
  3773. *         class=LIMM;
  3774. *      if((pnorm == (PG2 or PG4) and (opcode != ($Ax or $Ex)))
  3775. *         disillop(); return();
  3776. *      disgenrl();
  3777. *      return();
  3778.  
  3779. DISGEN  LDAB CLASS      get class
  3780.     CMPB #GEN
  3781.     BEQ  DISGEN1
  3782.     CMPB #NIMM
  3783.     BEQ  DISGEN1
  3784.     CMPB #LIMM
  3785.     BNE  DISXLN     jump if other class
  3786. DISGEN1 LDAA BASEOP
  3787.     ANDA #$CF
  3788.     CMPA #$83
  3789.     BNE  DISGEN3    jump if not #$83
  3790.     LDAB PNORM
  3791.     CMPB #PG3
  3792.     BLO  DISGEN3    jump not pg3 or 4
  3793.     LDAB #CPD
  3794.     JSR  DISRCH     look for cpd mne
  3795.     LDAB #LIMM
  3796.     STAB CLASS      set class to limm
  3797. DISGEN3 LDAB PNORM
  3798.     CMPB #PG2
  3799.     BEQ  DISGEN4    jump if page 2
  3800.     CMPB #PG4
  3801.     BNE  DISGEN5   jump not page 2 or 4
  3802. DISGEN4 LDAA BASEOP
  3803.     ANDA #$B0       mask bits 6,3-0
  3804.     CMPA #$A0
  3805.     BEQ  DISGEN5     jump if $Ax or $Ex
  3806.     JSR  DISILLOP   "illegal opcode"
  3807.     RTS
  3808. DISGEN5 JSR  DISGENRL   process general class
  3809.     RTS
  3810.  
  3811. *   else       /* XLIMM,XNIMM,YLIMM,YNIMM */
  3812. *      if(pnorm==(PG2 or PG3))
  3813. *         if(class==XLIMM) disrch(opcode&$CF,YLIMM);
  3814. *         else disrch(opcode&$CF,YNIMM);
  3815. *      if((pnorm == (PG3 or PG4))
  3816. *         if(opcode != ($Ax or $Ex))
  3817. *            disillop(); return();
  3818. *      class=LIMM;
  3819. *      disgen();
  3820. *   return();
  3821.  
  3822. DISXLN  LDAB PNORM
  3823.     CMPB #PG2
  3824.     BEQ  DISXLN1    jump if page2
  3825.     CMPB #PG3
  3826.     BNE  DISXLN4    jump not page3
  3827. DISXLN1 LDAA BASEOP
  3828.     ANDA #$CF
  3829.     LDAB CLASS
  3830.     CMPB #XLIMM
  3831.     BNE  DISXLN2
  3832.     LDAB #YLIMM
  3833.     BRA  DISXLN3    look for ylimm
  3834. DISXLN2 LDAB #YNIMM     look for ynimm
  3835. DISXLN3 JSR  DISRCH
  3836. DISXLN4 LDAB PNORM
  3837.     CMPB #PG3
  3838.     BLO  DISXLN5    jump if page 1 or 2
  3839.     LDAA BASEOP     get opcode
  3840.     ANDA #$B0       mask bits 6,3-0
  3841.     CMPA #$A0
  3842.     BEQ  DISXLN5    jump opcode = $Ax or $Ex
  3843.     JSR  DISILLOP   "illegal opcode"
  3844.     RTS
  3845. DISXLN5 LDAB #LIMM
  3846.     STAB CLASS
  3847.     JSR  DISGENRL   process general class
  3848.     RTS
  3849.  
  3850.  
  3851. ******************
  3852. *disrch(a=opcode,b=class)
  3853. *return b=0 if not found
  3854. *  else mneptr=points to mnemonic
  3855. *        class=class of opcode
  3856. ******************
  3857. *x=#MNETABL
  3858. *while(x[0] != eot)
  3859. *   if((opcode==x[4]) && ((class=NULL) || (class=x[5])))
  3860. *      mneptr=x;
  3861. *      class=x[5];
  3862. *      return(1);
  3863. *   x += 6;
  3864. *return(0);      /* not found */
  3865.  
  3866. DISRCH  LDX  #MNETABL   point to top of table
  3867. DISRCH1 CMPA 4,X        test opcode
  3868.     BNE  DISRCH3    jump not this entry
  3869.     TSTB
  3870.     BEQ  DISRCH2    jump if class=null
  3871.     CMPB 5,X        test class
  3872.     BNE  DISRCH3    jump not this entry
  3873. DISRCH2 LDAB 5,X
  3874.     STAB CLASS
  3875.     STX  MNEPTR     return ptr to mnemonic
  3876.     INCB
  3877.     RTS       return found
  3878. DISRCH3 PSHB      save class
  3879.     LDAB #6
  3880.     ABX
  3881.     LDAB 0,X
  3882.     CMPB #EOT       test end of table
  3883.     PULB
  3884.     BNE  DISRCH1
  3885.     CLRB
  3886.     RTS       return not found
  3887.  
  3888. ******************
  3889. *prntmne() - output the mnemonic pointed
  3890. *at by mneptr.
  3891. ******************
  3892. *outa(mneptr[0-3]);
  3893. *outspac;
  3894. *return();
  3895.  
  3896. PRNTMNE LDX  MNEPTR
  3897.     LDAA 0,X
  3898.     JSR  OUTA       output char1
  3899.     LDAA 1,X
  3900.     JSR  OUTA       output char2
  3901.     LDAA 2,X
  3902.     JSR  OUTA       output char3
  3903.     LDAA 3,X
  3904.     JSR  OUTA       output char4
  3905.     JSR  OUTSPAC
  3906.     RTS
  3907.  
  3908. ******************
  3909. *disindx() - process indexed mode
  3910. ******************
  3911. *disdir();
  3912. *outa(',');
  3913. *if(pnorm == (PG2 or PG4)) outa('Y');
  3914. *else outa('X');
  3915. *return();
  3916.  
  3917. DISINDX JSR  DISDIR     output $byte
  3918.     LDAA #','
  3919.     JSR  OUTA       output ,
  3920.     LDAB PNORM
  3921.     CMPB #PG2
  3922.     BEQ  DISIND1    jump if page2
  3923.     CMPB #PG4
  3924.     BNE  DISIND2    jump if not page4
  3925. DISIND1 LDAA #'Y'
  3926.     BRA DISIND3
  3927. DISIND2 LDAA #'X'
  3928. DISIND3 JSR  OUTA       output x or y
  3929.     RTS
  3930.  
  3931. ******************
  3932. *disrelad() - compute and output relative address.
  3933. ******************
  3934. * braddr = dispc[0] + (dispc++);( 2's comp arith)
  3935. *outa('$');
  3936. *out2bsp(braddr);
  3937. *return();
  3938.  
  3939. DISRELAD LDX  DISPC
  3940.     LDAB 0,X        get relative offset
  3941.     INX
  3942.     STX  DISPC
  3943.     TSTB
  3944.     BMI  DISRLD1    jump if negative
  3945.     ABX
  3946.     BRA  DISRLD2
  3947. DISRLD1 DEX
  3948.     INCB
  3949.     BNE  DISRLD1    subtract
  3950. DISRLD2 STX  BRADDR     save address
  3951.     JSR  OUTSPAC
  3952.     LDAA #'$'
  3953.     JSR  OUTA
  3954.     LDX  #BRADDR
  3955.     JSR  OUT2BSP    output address
  3956.     RTS
  3957.  
  3958.  
  3959. ******************
  3960. *disgenrl() - output data for the general cases which
  3961. *includes immediate, direct, indexed, and extended modes.
  3962. ******************
  3963. *prntmne();
  3964. *if(baseop == ($8x or $Cx))   /* immediate */
  3965. *   outa('#');
  3966. *   disdir();
  3967. *   if(class == LIMM)
  3968. *      out1byt(dispc++);
  3969. *elseif(baseop == ($9x or $Dx))  /* direct */
  3970. *   disdir();
  3971. *elseif(baseop == ($Ax or $Ex)) /* indexed */
  3972. *   disindx();
  3973. *else  (baseop == ($Bx or $Fx)) /* extended */
  3974. *   disext();
  3975. *return();
  3976.  
  3977. DISGENRL JSR  PRNTMNE    print mnemonic
  3978.     LDAA BASEOP     get opcode
  3979.     ANDA #$B0       mask bits 6,3-0
  3980.     CMPA #$80
  3981.     BNE  DISGRL2   jump if not immed
  3982.     LDAA #'#'       do immediate
  3983.     JSR  OUTA
  3984.     JSR  DISDIR
  3985.     LDAB CLASS
  3986.     CMPB #LIMM
  3987.     BEQ  DISGRL1   jump class = limm
  3988.     RTS
  3989. DISGRL1 LDX  DISPC
  3990.     JSR  OUT1BYT
  3991.     STX  DISPC
  3992.     RTS
  3993. DISGRL2 CMPA #$90
  3994.     BNE  DISGRL3    jump not direct
  3995.     JSR  DISDIR     do direct
  3996.     RTS
  3997. DISGRL3 CMPA #$A0
  3998.     BNE  DISGRL4    jump not indexed
  3999.     JSR  DISINDX    do extended
  4000.     RTS
  4001. DISGRL4 JSR  DISEXT     do extended
  4002.     RTS
  4003.  
  4004. *****************
  4005. *disdir() - output "$ next byte"
  4006. *****************
  4007. DISDIR  LDAA #'$'
  4008.     JSR  OUTA
  4009.     LDX  DISPC
  4010.     JSR  OUT1BYT
  4011.     STX  DISPC
  4012.     RTS
  4013.  
  4014. *****************
  4015. *disext() - output "$ next 2 bytes"
  4016. *****************
  4017. DISEXT  LDAA #'$'
  4018.     JSR  OUTA
  4019.     LDX  DISPC
  4020.     JSR  OUT2BSP
  4021.     STX  DISPC
  4022.     RTS
  4023.  
  4024.  
  4025. *****************
  4026. *disillop() - output "illegal opcode"
  4027. *****************
  4028. DISMSG1 FCC    "ILLOP"
  4029.     FCB    EOT
  4030. DISILLOP PSHX
  4031.     LDX  #DISMSG1
  4032.     JSR  OUTSTRG0   no cr
  4033.     PULX
  4034.     RTS
  4035.  
  4036.  
  4037.  
  4038. **********
  4039. *   help  -  List buffalo commands to terminal.
  4040. **********
  4041. HELP     LDX  #HELPMSG1
  4042.     JSR  OUTSTRG    print help screen
  4043.     RTS
  4044.  
  4045. HELPMSG1 FCC    "ASM [<addr>]  Line asm/disasm"
  4046.     FCB    $0D
  4047.     FCC    "  [/,=]  Same addr,       [^,-]  Prev addr,       [+,CTLJ] Next addr"
  4048.     FCB    $0D
  4049.     FCC    "  [CR]  Next opcode,                              [CTLA,.]  Quit"
  4050.     FCB    $0D
  4051.     FCC    "BF <addr1> <addr2> [<data>]  Block fill memory"
  4052.     FCB    $0D
  4053.     FCC    "BR [-][<addr>] Set up bkpt table"
  4054.     FCB    $0D
  4055.     FCC    "BULK  Erase EEPROM,                 BULKALL  Erase EEPROM and CONFIG"
  4056.     FCB    $0D
  4057.     FCC    "CALL [<addr>] Call subroutine"
  4058.     FCB    $0D
  4059.     FCC    "GO [<addr>] Execute code at addr,        PROCEED  Continue execution"
  4060.     FCB    $0D
  4061.     FCC    "EEMOD [<addr> [<addr>]] Modify EEPROM range"
  4062.     FCB    $0D
  4063.     FCC    "LOAD, VERIFY [T] <host dwnld command>  Load or verify S-records"
  4064.     FCB    $0D
  4065.     FCC    "MD [<addr1> [<addr2>]]  Memory dump"
  4066.     FCB    $0D
  4067.     FCC    "MM [<addr>] or [<addr>]/  Memory Modify"
  4068.     FCB    $0D
  4069.     FCC    "  [/,=]  Same addr,  [^,-,CTLH] Prev addr,  [+,CTLJ,SPACE] Next addr"
  4070.     FCB    $0D
  4071.     FCC    "  <addr>O Compute offset,                   [CR]  Quit"
  4072.     FCB    $0D
  4073.     FCC    "MOVE <s1> <s2> [<d>]  Block move"
  4074.     FCB    $0D
  4075.     FCC    "OFFSET [-]<arg>  Offset for download"
  4076.     FCB    $0D
  4077.     FCC    "RM [P,Y,X,A,B,C,S]  Register modify"
  4078.     FCB    $0D
  4079.     FCC    "STOPAT <addr>  Trace until addr"
  4080.     FCB    $0D
  4081.     FCC    "T [<n>]  Trace n instructions"
  4082.     FCB    $0D
  4083.     FCC    "TM  Transparent mode (CTLA = exit, CTLB = send brk)"
  4084.     FCB    $0D
  4085.     FCC    "[CTLW]  Wait,          [CTLX,DEL] Abort         [CR] Repeat last cmd"
  4086.     FCB    $0D
  4087.     FCB    4
  4088.  
  4089.  
  4090.  
  4091. **********
  4092. *   call [<addr>] - Execute a jsr to <addr> or user
  4093. *pc value.  Return to monitor via  rts or breakpoint.
  4094. **********
  4095. *a = wskip();
  4096. *if(a != cr)
  4097. *     a = buffarg();
  4098. *     a = wskip();
  4099. *     if(a != cr) return(bad argument)
  4100. *     pc = shftreg;
  4101. CALL     JSR  WSKIP
  4102.     BEQ  CALL3       jump if no arg
  4103.     JSR  BUFFARG
  4104.     JSR  WSKIP
  4105.     BEQ  CALL2       jump if cr
  4106.     LDX  #MSG9       "bad argument"
  4107.     JSR  OUTSTRG
  4108.     RTS
  4109. CALL2    LDX  SHFTREG
  4110.     STX  REGS        pc = <addr>
  4111.  
  4112. *put return address on user stack
  4113. *setbps();
  4114. *restack();     /* restack and go*/
  4115. CALL3    LDX  SP
  4116.     DEX        user stack pointer
  4117.     LDD  #RETURN     return address
  4118.     STD  0,X
  4119.     DEX
  4120.     STX  SP    new user stack pointer
  4121.     JSR  SETBPS
  4122.     CLR  TMP2        1=go, 0=call
  4123.     JMP  RESTACK     go to user code
  4124.  
  4125. **********
  4126. *   return() - Return here from rts after
  4127. *call command.
  4128. **********
  4129. RETURN   PSHA       save a register
  4130.     TPA
  4131.     STAA REGS+8      cc register
  4132.     SEI        mask interrupts
  4133.     PULA
  4134.     STD  REGS+6      a and b registers
  4135.     STX  REGS+4      x register
  4136.     STY  REGS+2      y register
  4137.     STS  SP    user stack pointer
  4138.     LDS  PTR2        monitor stack pointer
  4139.     JSR  REMBPS      remove breakpoints
  4140.     JSR  OUTCRLF
  4141.     JSR  RPRINT      print user registers
  4142.     RTS
  4143.  
  4144.  
  4145. **********
  4146. *   proceed - Same as go except it ignores
  4147. *a breakpoint at the first opcode.  Calls
  4148. *runone for the first instruction only.
  4149. **********
  4150. PROCEED  JSR  RUNONE      run one instruction
  4151.     JSR  CHKABRT     check for abort
  4152.     CLR  TMP2        flag for breakpoints
  4153.     INC  TMP2    1=go 0=call
  4154.     JSR  SETBPS
  4155.     JMP  RESTACK     go execute
  4156.  
  4157. **********
  4158. *   go [<addr>] - Execute starting at <addr> or
  4159. *user's pc value.  Executes an rti to user code.
  4160. *Returns to monitor via an swi through swiin.
  4161. **********
  4162. *a = wskip();
  4163. *if(a != cr)
  4164. *     a = buffarg();
  4165. *     a = wskip();
  4166. *     if(a != cr) return(bad argument)
  4167. *     pc = shftreg;
  4168. *setbps();
  4169. *restack();     /* restack and go*/
  4170. GO       JSR  WSKIP
  4171.     BEQ  GO2         jump if no arg
  4172.     JSR  BUFFARG
  4173.     JSR  WSKIP
  4174.     BEQ  GO1         jump if cr
  4175.     LDX  #MSG9       "bad argument"
  4176.     JSR  OUTSTRG
  4177.     RTS
  4178. GO1      LDX  SHFTREG
  4179.     STX  REGS        pc = <addr>
  4180. GO2      CLR  TMP2
  4181.     INC  TMP2        1=go, 0=call
  4182.     JSR  SETBPS
  4183.     JMP  RESTACK     go to user code
  4184.  
  4185. *****
  4186. ** SWIIN - Breakpoints from go or call commands enter here.
  4187. *Remove breakpoints, save user registers, return
  4188. SWIIN    TSX      swi entry point
  4189. *           user sp -> x
  4190.     LDS  PTR2     restore monitor sp
  4191.     JSR  SAVSTACK save user regs
  4192.     JSR  REMBPS   remove breakpoints from code
  4193.     LDX  REGS
  4194.     DEX
  4195.     STX  REGS     save user pc value
  4196.  
  4197. *if(call command) remove call return addr from user stack;
  4198.     TST  TMP2     1=go, 0=call
  4199.     BNE  GO3      jump if go command
  4200.     LDX  SP       remove return address
  4201.     INX       user stack pointer
  4202.     INX
  4203.     STX  SP
  4204. GO3      JSR  OUTCRLF  print register values
  4205.     JSR  RPRINT
  4206.     RTS     done
  4207.  
  4208. **********
  4209. *  setbps - Replace user code with swi's at
  4210. *breakpoint addresses.
  4211. **********
  4212. *for(b=0; b=6; b =+ 2)
  4213. *     x = brktabl[b];
  4214. *     if(x != 0)
  4215. *          optabl[b] = x[0];
  4216. *          x[0] = $3F;
  4217. *Put monitor SWI vector into jump table
  4218.  
  4219. SETBPS   CLRB
  4220. SETBPS1  LDX  #BRKTABL
  4221.     LDY  #PTR4
  4222.     ABX
  4223.     ABY
  4224.     LDX  0,X         breakpoint table entry
  4225.     BEQ  SETBPS2     jump if 0
  4226.     LDAA 0,X         save user opcode
  4227.     STAA 0,Y
  4228.     LDAA #SWI
  4229.     JSR  WRITE       insert swi into code
  4230. SETBPS2  ADDB #$2
  4231.     CMPB #$6
  4232.     BLE  SETBPS1     loop 4 times
  4233.     LDX  JSWI+1
  4234.     STX  PTR3        save user swi vector
  4235.     LDAA #$7E        jmp opcode
  4236.     STAA JSWI
  4237.     LDX  #SWIIN
  4238.     STX  JSWI+1      monitor swi vector
  4239.     RTS
  4240.  
  4241. **********
  4242. *   rembps - Remove breakpoints from user code.
  4243. **********
  4244. *for(b=0; b=6; b =+ 2)
  4245. *     x = brktabl[b];
  4246. *     if(x != 0)
  4247. *          x[0] = opTa³l[b];
  4248. *Replace user's SWI vector
  4249. REMBPS   CLRB
  4250. REMBPS1  LDX  #BRKTABL
  4251.     LDY  #PTR4
  4252.     ABX
  4253.     ABY
  4254.     LDX  0,X         breakpoint table entry
  4255.     BEQ  REMBPS2     jump if 0
  4256.     LDAA 0,Y
  4257.     JSR  WRITE       restore user opcode
  4258. REMBPS2  ADDB #$2
  4259.     CMPB #$6
  4260.     BLE  REMBPS1     loop 4 times
  4261.     LDX  PTR3        restore user swi vector
  4262.     STX  JSWI+1
  4263.     RTS
  4264.  
  4265.  
  4266. **********
  4267. *   trace <n> - Trace n instructions starting
  4268. *at user's pc value. n is a hex number less than
  4269. *$FF (defaults to 1).
  4270. **********
  4271. *a = wskip();
  4272. *if(a != cr)
  4273. *     a = buffarg(); a = wskip();
  4274. *     if(a != cr) return(bad argument);
  4275. *     countt1 = n
  4276. TRACE    CLR  TMP4
  4277.     INC  TMP4        default count=1
  4278.     CLR  CHRCNT      set up for display
  4279.     JSR  WSKIP
  4280.     BEQ  TRACE2      jump if cr
  4281.     JSR  BUFFARG
  4282.     JSR  WSKIP
  4283.     BEQ  TRACE1      jump if cr
  4284.     LDX  #MSG9       "bad argument"
  4285.     JSR  OUTSTRG
  4286.     RTS
  4287. TRACE1   LDAA SHFTREG+1   n
  4288.     STAA TMP4
  4289.  
  4290. *Disassemble the line about to be traced
  4291. TRACE2   LDAB TMP4
  4292.     PSHB
  4293.     LDX  REGS
  4294.     STX  PTR1        pc value for disass
  4295.     JSR  DISASSM
  4296.     PULB
  4297.     STAB TMP4
  4298.  
  4299. *run one instruction
  4300. *rprint();
  4301. *while(count > 0) continue trace;
  4302.     JSR  RUNONE
  4303.     JSR  CHKABRT     check for abort
  4304.     JSR  TABTO       print registers for
  4305.     JSR  RPRINT    result of trace
  4306.     DEC  TMP4
  4307.     BEQ  TRACDON     quit if count=0
  4308. TRACE3   JSR  OUTCRLF
  4309.     BRA  TRACE2
  4310. TRACDON  RTS
  4311.  
  4312.  
  4313. **********
  4314. *   stopat <addr> - Trace instructions until <addr>
  4315. *is reached.
  4316. **********
  4317. *if((a=wskip) != cr)
  4318. *     a = buffarg(); a = wskip();
  4319. *     if(a != cr) return(bad argument);
  4320. *else return(bad argument);
  4321. STOPAT   JSR  WSKIP
  4322.     BEQ  STOPGO    jump if cr - no argument
  4323.     JSR  BUFFARG
  4324.     JSR  WSKIP
  4325.     BEQ  STOPAT1   jump if cr
  4326.     LDX  #MSG9     "bad argument"
  4327.     JSR  OUTSTRG
  4328.     RTS
  4329. STOPAT1  TST  COUNT
  4330.     BEQ  STOPGO    jump if no argument
  4331.     LDX  SHFTREG
  4332.     STX  PTRMEM    update "current location"
  4333.  
  4334. *while(!(ptrmem <= userpc < ptrmem+10)) runone();
  4335. *rprint();
  4336. STOPGO   LDD  REGS      userpc
  4337.     CPD  PTRMEM
  4338.     BLO  STOPNEXT  if(userpc < ptrmem) runone
  4339.     LDD  PTRMEM
  4340.     ADDD #10
  4341.     CPD  REGS
  4342.     BHI  STOPDON   quit if ptrmem+10 > userpc
  4343. STOPNEXT JSR  RUNONE
  4344.     JSR  CHKABRT   check for abort
  4345.     BRA  STOPGO
  4346. STOPDON  JSR  OUTCRLF
  4347.     JSR  RPRINT    result of trace
  4348.     RTS      done
  4349.  
  4350.  
  4351. *************************
  4352. * runone - This routine is used by the trace and
  4353. * execute commands to run one only one user instruction.
  4354. *   Control is passed to the user code via an RTI.  OC5
  4355. * is then used to trigger an XIRQ as soon as the first user
  4356. * opcode is fetched.  Control then returns to the monitor
  4357. * through XIRQIN.
  4358. *  Externally, the OC5 pin must be wired to the XIRQ pin.
  4359. ************************
  4360. * Disable oc5 interrupts
  4361. * Put monitor XIRQ vector into jump table
  4362. * Unmask x bit in user ccr
  4363. * Setup OC5 to go low when first user instruction executed
  4364. RUNONE  LDAA #$7E        put "jmp xirqin" in jump table
  4365.     STAA JTOC5
  4366.     LDX  #XIRQIN
  4367.     STX  JXIRQ+1
  4368.     LDAA REGS+8      x bit will be cleared when
  4369.     ANDA #$BF      rti is executed below
  4370.     STAA REGS+8
  4371.     LDAB #87        cycles to end of rti
  4372.     LDX  TCNT
  4373.     ABX                   3~
  4374.     STX  TOC5       oc5 match register      5~
  4375.     LDAA TCTL1            4~
  4376.     ANDA #$FE       set up oc5 low on match 2~
  4377.     STAA TCTL1      enable oc5 interrupt    4~
  4378.  
  4379. ** RESTACK - Restore user stack and RTI to user code.
  4380. * This code is the pathway to execution of user code.
  4381. *(Force extended addressing to maintain cycle count)
  4382. *Restore user stack and rti to user code
  4383. RESTACK STS.e    PTR2      save monitor sp
  4384.     LDS.e    SP        user stack pointer
  4385.     LDX.e    REGS
  4386.     PSHX    pc
  4387.     LDX.e    REGS+2
  4388.     PSHX    y
  4389.     LDX.e    REGS+4
  4390.     PSHX    x
  4391.     LDD.e    REGS+6
  4392.     PSHA    a
  4393.     PSHB    b
  4394.     LDAA.e    REGS+8
  4395.     PSHA    ccr
  4396.     RTI
  4397.  
  4398. ** Return here from run one line of user code.
  4399. XIRQIN  TSX       user sp -> x
  4400.     LDS  PTR2       restore monitor sp
  4401.  
  4402. ** SAVSTACK - Save user's registers.
  4403. * On entry - x points to top of user stack.
  4404. SAVSTACK LDAA 0,X
  4405.     STAA REGS+8      user ccr
  4406.     LDD  1,X
  4407.     STAA REGS+7      b
  4408.     STAB REGS+6      a
  4409.     LDD  3,X
  4410.     STD  REGS+4      x
  4411.     LDD  5,X
  4412.     STD  REGS+2      y
  4413.     LDD  7,X
  4414.     STD  REGS        pc
  4415.     LDAB #8
  4416.     ABX
  4417.     STX  SP    user stack pointer
  4418.     LDAA TCTL1       force oc5 pin high which
  4419.     ORAA #$03    is tied to xirq line
  4420.     STAA TCTL1
  4421.     LDAA #$08
  4422.     STAA CFORC
  4423.     RTS
  4424.  
  4425.  
  4426. **********
  4427. *   HOST() - Establishes transparent link between
  4428. *       terminal and host.  Port used for host is
  4429. *       determined in the reset initialization routine
  4430. *       and stored in HOSTDEV.
  4431. *          To exit type control A.
  4432. *          To send break to host type control B.
  4433. *if(no external device) return;
  4434. *initialize host port;
  4435. *While( !(control A))
  4436. *     input(terminal); output(host);
  4437. *     input(host); output(terminal);
  4438.  
  4439. HOST      LDAA EXTDEV
  4440.     BNE  HOST0    jump if host port avail.
  4441.     LDX  #MSG10   "no host port avail"
  4442.     JSR  OUTSTRG
  4443.     RTS
  4444. HOST0     CLR  AUTOLF    turn off autolf
  4445.     JSR  HOSTCO    connect sci (evb board)
  4446.     JSR  HOSTINIT  initialize host port
  4447. HOST1     JSR  INPUT     read terminal
  4448.     TSTA
  4449.     BEQ  HOST3     jump if no char
  4450.     CMPA #CTLA
  4451.     BEQ  HOSTEND   jump if control a
  4452.     CMPA #CTLB
  4453.     BNE  HOST2     jump if not control b
  4454.     JSR  TXBREAK   send break to host
  4455.     BRA  HOST3
  4456. HOST2     JSR  HOSTOUT   echo to host
  4457. HOST3     JSR  HOSTIN    read host
  4458.     TSTA
  4459.     BEQ  HOST1     jump if no char
  4460.     JSR  OUTPUT    echo to terminal
  4461.     BRA  HOST1
  4462. HOSTEND   INC  AUTOLF    turn on autolf
  4463.     JSR  TARGCO    disconnect sci (evb board)
  4464.     RTS      return
  4465.  
  4466. **********
  4467. * txbreak() - transmit break to host port.
  4468. * The duration of the transmitted break is
  4469. * approximately 200,000 E-clock cycles, or
  4470. * 100ms at 2.0 MHz.
  4471. ***********
  4472. TXBREAK   LDAA HOSTDEV
  4473.     CMPA #$03
  4474.     BEQ  TXBDU    jump if duartb is host
  4475.  
  4476. TXBSCI    LDX  #SCCR2   sci is host
  4477.     BSET 0,X,$01  set send break bit
  4478.     BSR  TXBWAIT
  4479.     BCLR 0,X,$01  clear send break bit
  4480.     BRA TXB1
  4481.  
  4482. TXBDU     LDX  #PORTB   duart host port
  4483.     LDAA #$60     start break cmd
  4484.     STAA 2,X      port b command register
  4485.     BSR  TXBWAIT
  4486.     LDAA #$70     stop break cmd
  4487.     STAA 2,X      port b command register
  4488.  
  4489. TXB1      LDAA #$0D
  4490.     JSR  HOSTOUT  send carriage return
  4491.     LDAA #$0A
  4492.     JSR  HOSTOUT  send linefeed
  4493.     RTS
  4494.  
  4495. TXBWAIT   LDY  #$6F9B   loop count = 28571
  4496. TXBWAIT1  DEY     7 cycle loop
  4497.     BNE  TXBWAIT1
  4498.     RTS
  4499.  
  4500.  
  4501. **********
  4502. *   hostinit(), hostin(), hostout() - host i/o
  4503. *routines.  Restores original terminal device.
  4504. **********
  4505. HOSTINIT  LDAB IODEV    save terminal
  4506.     PSHB
  4507.     LDAB HOSTDEV
  4508.     STAB IODEV    point to host
  4509.     JSR  INIT     initialize host
  4510.     BRA  TERMRES  restore terminal
  4511. HOSTIN    LDAB IODEV    save terminal
  4512.     PSHB
  4513.     LDAB HOSTDEV
  4514.     STAB IODEV    point to host
  4515.     JSR  INPUT    read host
  4516.     BRA  TERMRES  restore terminal
  4517. HOSTOUT   LDAB IODEV    save terminal
  4518.     PSHB
  4519.     LDAB HOSTDEV
  4520.     STAB IODEV    point to host
  4521.     JSR  OUTPUT   write to host
  4522. TERMRES   PULB    restore terminal device
  4523.     STAB IODEV
  4524.     RTS
  4525.  
  4526.  
  4527. **********
  4528. *   load(ptrbuff[]) - Load s1/s9 records from
  4529. *host to memory.  Ptrbuff[] points to string in
  4530. *input buffer which is a command to output s1/s9
  4531. *records from the host ("cat filename" for unix).
  4532. *    Returns error and address if it can't write
  4533. *to a particular location.
  4534. **********
  4535. *   verify(ptrbuff[]) - Verify memory from load
  4536. *command.  Ptrbuff[] is same as for load.
  4537. * tmp3 is used as an error indication, 0=no errors,
  4538. * 1=receiver, 2=rom error, 3=checksum error.
  4539. **********
  4540. VERIFY    CLR  TMP2
  4541.     INC  TMP2      TMP2=1=verify
  4542.     BRA  LOAD1
  4543. LOAD      CLR  TMP2     0=load
  4544.  
  4545. *a=wskip();
  4546. *if(a = cr) goto transparent mode;
  4547. *if(t option) hostdev = iodev;
  4548. LOAD1     CLR  TMP3      clear error flag
  4549.     JSR  WSKIP
  4550.     BNE  LOAD2
  4551.     JMP  HOST      go to host if no args
  4552. LOAD2     JSR  UPCASE
  4553.     CMPA #'T'      look for t option
  4554.     BNE  LOAD3     jump not t option
  4555.     JSR  INCBUFF
  4556.     JSR  READBUFF  get next character
  4557.     JSR  DECBUFF
  4558.     CMPA #$0D
  4559.     BNE  LOAD3     jump if not t option
  4560.     CLR  AUTOLF
  4561.     LDAA IODEV
  4562.     STAA HOSTDEV   set host port = terminal
  4563.     BRA  LOAD10    go wait for s1 records
  4564.  
  4565. *else while(not cr)
  4566. *     read character from input buffer;
  4567. *     send character to host;
  4568. LOAD3     CLR  AUTOLF
  4569.     JSR  HOSTCO    connect sci (evb board)
  4570.     JSR  HOSTINIT  initialize host port
  4571. LOAD4     JSR  READBUFF  get next char
  4572.     JSR  INCBUFF
  4573.     PSHA     save char
  4574.     JSR  HOSTOUT   output to host
  4575.     JSR  OUTPUT    echo to terminal
  4576.     PULA
  4577.     CMPA #$0D
  4578.     BNE  LOAD4     jump if not cr
  4579.  
  4580. *repeat:                           /* look for s records */
  4581. *      if(hostdev != iodev) check abort;
  4582. *      a = hostin();
  4583. *      if(a = 'S')
  4584. *          a = hostin;
  4585. *          if(a = '1')
  4586. *              checksum = 0;
  4587. *              get byte count in b;
  4588. *              get base address in x;
  4589. *              while(byte count > 0)
  4590. *                  byte();
  4591. *                  x++; b--;
  4592. *                  if(tmp3=0)           /* no error */
  4593. *                      if(load) x[0] = shftreg+1;
  4594. *                      if(x[0] != shftreg+1)
  4595. *                          tmp3 = 2;    /* rom error */
  4596. *                          ptr3 = x;    /* save address */
  4597. *              if(tmp3 = 0) do checksum;
  4598. *              if(checksum err) tmp3 = 3; /* checksum error */
  4599. ** Look for s-record header
  4600. LOAD10    LDAA HOSTDEV
  4601.     CMPA IODEV
  4602.     BEQ  LOAD11    jump if hostdev=iodev
  4603.     JSR  CHKABRT   check for abort
  4604. LOAD11    JSR  HOSTIN    read host
  4605.     TSTA
  4606.     BEQ  LOAD10    jump if no input
  4607.     CMPA #'S'
  4608.     BNE  LOAD10    jump if not S
  4609. LOAD12    JSR  HOSTIN    read host
  4610.     TSTA
  4611.     BEQ  LOAD12    jump if no input
  4612.     CMPA #'9'
  4613.     BEQ  LOAD90    jump if S9 record
  4614.     CMPA #'1'
  4615.     BNE  LOAD10    jump if not S1
  4616.     CLR  TMP4      clear checksum
  4617. ** Get Byte Count and Starting Address
  4618.     JSR  BYTE
  4619.     LDAB SHFTREG+1
  4620.     SUBB #$2       b = byte count
  4621.     JSR  BYTE
  4622.     JSR  BYTE
  4623.     PSHB     save byte count
  4624.     LDD  SHFTREG
  4625.     ADDD LDOFFST   add offset
  4626.     XGDX     x = address+offset
  4627.     PULB     restore byte count
  4628.     DEX      condition for loop
  4629. ** Get and Store Incoming Data Byte
  4630. LOAD20    JSR  BYTE      get next byte
  4631.     INX
  4632.     DECB     check byte count
  4633.     BEQ  LOAD30    if b=0, go do checksum
  4634.     TST  TMP3
  4635.     BNE  LOAD10    jump if error flagged
  4636.     TST  TMP2
  4637.     BNE  LOAD21    jump if verify
  4638.     LDAA SHFTREG+1
  4639.     JSR  WRITE     load only
  4640. LOAD21    CMPA 0,X       verify ram location
  4641.     BEQ  LOAD20    jump if ram ok
  4642.     LDAA #$02
  4643.     STAA TMP3      indicate rom error
  4644.     STX  PTR3      save error address
  4645.     BRA  LOAD20    finish download
  4646. ** Get and Test Checksum
  4647. LOAD30    TST  TMP3
  4648.     BNE  LOAD10    jump if error already
  4649.     LDAA TMP4
  4650.     INCA     do checksum
  4651.     BEQ  LOAD10    jump if s1 record okay
  4652.     LDAA #$03
  4653.     STAA TMP3      indicate checksum error
  4654.     BRA  LOAD10
  4655.  
  4656. *          if(a = '9')
  4657. *              read rest of record;
  4658. *              if(tmp3=2) return("[ptr3]");
  4659. *              if(tmp3=1) return("rcv error");
  4660. *              if(tmp3=3) return("checksum err");
  4661. *              else return("done");
  4662. LOAD90    JSR  BYTE
  4663.     LDAB SHFTREG+1 b = byte count
  4664. LOAD91    JSR  BYTE
  4665.     DECB
  4666.     BNE  LOAD91    loop until end of record
  4667.     LDAB #$64
  4668. LOAD91A   JSR  DLY10MS   delay 1 sec -let host finish
  4669.     DECB
  4670.     BNE  LOAD91A
  4671.     JSR  INPUT     clear comm device
  4672.     LDD  #$7E0D    put dummy command in inbuff
  4673.     STD  INBUFF
  4674.     INC  AUTOLF    turn on autolf
  4675.     JSR  TARGCO    disconnect sci (evb)
  4676.     LDX  #MSG11    "done" default msg
  4677.     LDAA TMP3
  4678.     CMPA #$02
  4679.     BNE  LOAD92    jump not rom error
  4680.     LDX  #PTR3
  4681.     JSR  OUT2BSP   address of rom error
  4682.     BRA  LOAD95
  4683. LOAD92    CMPA #$01
  4684.     BNE  LOAD93    jump not rcv error
  4685.     LDX  #MSG14    "rcv error"
  4686.     BRA  LOAD94
  4687. LOAD93    CMPA #$03
  4688.     BNE  LOAD94    jump not checksum error
  4689.     LDX  #MSG12    "checksum error"
  4690. LOAD94    JSR  OUTSTRG
  4691. LOAD95    RTS
  4692.  
  4693.  
  4694. **********
  4695. *  byte() -  Read 2 ascii bytes from host and
  4696. *convert to one hex byte.  Returns byte
  4697. *shifted into shftreg and added to tmp4.
  4698. **********
  4699. BYTE      PSHB
  4700.     PSHX
  4701. BYTE0     JSR  HOSTIN    read host (1st byte)
  4702.     TSTA
  4703.     BEQ  BYTE0     loop until input
  4704.     JSR  HEXBIN
  4705. BYTE1     JSR  HOSTIN    read host (2nd byte)
  4706.     TSTA
  4707.     BEQ  BYTE1     loop until input
  4708.     JSR  HEXBIN
  4709.     LDAA SHFTREG+1
  4710.     ADDA TMP4
  4711.     STAA TMP4      add to checksum
  4712.     PULX
  4713.     PULB
  4714.     RTS
  4715.  
  4716.  
  4717. **********
  4718. *   offset [<addr>]
  4719. * Specify offset to be added to s-record address when
  4720. * downloading from the host.
  4721. *  OFFSET                -show the current offset
  4722. *  OFFSET <data>         -current offset = data
  4723. *  OFFSET -<data>        -current offset = 0 - data
  4724. **********
  4725. *if(<data>) then offset = data;
  4726. *print(offset);
  4727. OFFSET   CLR  TMP4      minus indicator
  4728.     JSR  WSKIP
  4729.     BEQ  OFFST3    jump if cr (no argument)
  4730.     CMPA #'-'
  4731.     BNE  OFFST1    jump not -
  4732.     INC  TMP4      set minus sign flag
  4733.     JSR  INCBUFF   move buffer pointer
  4734.     JSR  WSKIP
  4735. OFFST1   JSR  BUFFARG   read argument
  4736.     TST  COUNT
  4737.     BEQ  OFFSTER  jump if bad argument
  4738.     JSR  WSKIP
  4739.     BNE  OFFSTER   jump if not cr
  4740.     LDD  SHFTREG   get offset value
  4741.     TST  TMP4
  4742.     BEQ  OFFST2    jump if positive
  4743.     LDD  #$0000    negative - sub from 0
  4744.     SUBD SHFTREG
  4745. OFFST2   STD  LDOFFST
  4746. OFFST3   JSR  OUTCRLF   display current offset
  4747.     LDX  #LDOFFST
  4748.     JSR  OUT2BSP
  4749.     RTS
  4750.  
  4751. OFFSTER  LDX  #MSG9     "bad argument"
  4752.     JSR  OUTSTRG
  4753.     RTS
  4754.  
  4755.  
  4756.  
  4757.  
  4758.  
  4759. **********
  4760. *   register [<name>]  - prints the user regs
  4761. *and opens them for modification.  <name> is
  4762. *the first register opened (default = P).
  4763. *   Subcommands:
  4764. * [<nn>]<space>  Opens the next register.
  4765. * [<nn>]<cr>     Return.
  4766. *    The register value is only changed if
  4767. *    <nn> is entered before the subcommand.
  4768. **********
  4769. *x[] = reglist
  4770. *a = wskip(); a = upcase(a);
  4771. *if(a != cr)
  4772. *     while( a != x[0] )
  4773. *          if( x[0] = "s") return(bad argument);
  4774. *          x[]++;
  4775. *     incbuff(); a = wskip();
  4776. *     if(a != cr) return(bad argument);
  4777.  
  4778. REGISTER LDX  #REGLIST
  4779.     JSR  WSKIP       a = first char of arg
  4780.     JSR  UPCASE      convert to upper case
  4781.     CMPA #$D
  4782.     BEQ  REG4        jump if no argument
  4783. REG1     CMPA 0,X
  4784.     BEQ  REG3
  4785.     LDAB 0,X
  4786.     INX
  4787.     CMPB #'S'
  4788.     BNE  REG1        jump if not "s"
  4789. REG2     LDX  #MSG9       "bad argument"
  4790.     JSR  OUTSTRG
  4791.     RTS
  4792. REG3     PSHX
  4793.     JSR  INCBUFF
  4794.     JSR  WSKIP       next char after arg
  4795.     PULX
  4796.     BNE  REG2        jump if not cr
  4797.  
  4798. *rprint();
  4799. *     while(x[0] != "s")
  4800. *          rprnt1(x);
  4801. *          a = termarg();    /* read from terminal */
  4802. *          if( ! dchek(a) ) return(bad argument);
  4803. *          if(countu1 != 0)
  4804. *               if(x[14] = 1)
  4805. *                    regs[x[7]++ = shftreg;
  4806. *               regs[x[7]] = shftreg+1;
  4807. *          if(a = cr) break;
  4808. *return;
  4809.  
  4810. REG4     JSR  RPRINT      print all registers
  4811. REG5     JSR  OUTCRLF
  4812.     JSR  RPRNT1      print reg name
  4813.     CLR  SHFTREG
  4814.     CLR  SHFTREG+1
  4815.     JSR  TERMARG     read subcommand
  4816.     JSR  DCHEK
  4817.     BEQ  REG6        jump if delimeter
  4818.     LDX  #MSG9       "bad argument"
  4819.     JSR  OUTSTRG
  4820.     RTS
  4821. REG6     PSHA
  4822.     PSHX
  4823.     TST  COUNT
  4824.     BEQ  REG8        jump if no input
  4825.     LDAB 7,X         get reg offset
  4826.     LDAA 14,X        byte size
  4827.     LDX  #REGS       user registers
  4828.     ABX
  4829.     TSTA
  4830.     BEQ  REG7        jump if 1 byte reg
  4831.     LDAA SHFTREG
  4832.     STAA 0,X         put in top byte
  4833.     INX
  4834. REG7     LDAA SHFTREG+1
  4835.     STAA 0,X         put in bottom byte
  4836. REG8     PULX
  4837.     PULA
  4838.     LDAB 0,X         CHECK FOR REGISTER S
  4839.     CMPB #'S'
  4840.     BEQ  REG9        jump if "s"
  4841.     INX        point to next register
  4842.     CMPA #$D
  4843.     BNE  REG5        jump if not cr
  4844. REG9     RTS
  4845.  
  4846.  
  4847. * Equates
  4848. JPORTD    EQU    $08
  4849. JDDRD    EQU    $09
  4850. JBAUD    EQU    $2B
  4851. JSCCR1    EQU    $2C
  4852. JSCCR2    EQU    $2D
  4853. JSCSR    EQU    $2E
  4854. JSCDAT    EQU    $2F
  4855. *
  4856.  
  4857. ************
  4858. *  xboot [<addr1> [<addr2>]] - Use SCI to talk to an 'hc11 in
  4859. * boot mode.  Downloads bytes from addr1 thru addr2.
  4860. * Default addr1 = $C000 and addr2 = $C0ff.
  4861. *
  4862. * IMPORTANT:
  4863. * if talking to an 'A8 or 'A2: use either default addresses or ONLY
  4864. *    addr1 - this sends 256 bytes
  4865. * if talking to an 'E9: include BOTH addr1 and addr2 for variable
  4866. *    length
  4867. ************
  4868.  
  4869. *Get arguments
  4870. *If no args, default $C000
  4871. BOOT    JSR   WSKIP
  4872.     BNE   BOT1       jump if arguments
  4873.     LDX   #$C0FF     addr2 default
  4874.     STX   PTR5
  4875.     LDY   #$C000     addr1 default
  4876.     BRA   BOT2       go - use default address
  4877.  
  4878. *Else get arguments
  4879. BOT1    JSR   BUFFARG
  4880.     TST   COUNT
  4881.     BEQ   BOTERR    jump if no address
  4882.     LDY   SHFTREG   start address (addr1)
  4883.     JSR   WSKIP
  4884.     BNE   BOT1A     go get addr2
  4885.     STY   PTR5      default addr2...
  4886.     LDD   PTR5      ...by taking addr1...
  4887.     ADDD  #$FF      ...and adding 255 to it...
  4888.     STD   PTR5      ...for a total download of 256
  4889.     BRA   BOT2      continue
  4890. *
  4891. BOT1A   JSR   BUFFARG
  4892.     TST   COUNT
  4893.     BEQ   BOTERR    jump if no address
  4894.     LDX   SHFTREG   end address (addr2)
  4895.     STX   PTR5
  4896.     JSR   WSKIP
  4897.     BNE   BOTERR    go use addr1 and addr2
  4898.     BRA   BOT2
  4899.  
  4900. *
  4901. BOTERR  LDX   #MSG9     "bad argument"
  4902.     JSR   OUTSTRG
  4903.     RTS
  4904.  
  4905. *Boot routine
  4906. BOT2    LDAB  #$FF       control character ($ff -> download)
  4907.     JSR   BTSUB      set up SCI and send control char
  4908. *            initializes X as register pointer
  4909. *Download block
  4910. BLOP    LDAA  0,Y
  4911.     STAA  JSCDAT,X   write to transmitter
  4912.     BRCLR JSCSR,X,$80,.      wait for TDRE
  4913.     CPY   PTR5       if last...
  4914.     BEQ   BTDONE    ...quit
  4915.     INY        else...
  4916.     BRA   BLOP      ...send next
  4917. BTDONE  RTS
  4918.  
  4919. ************************************************
  4920. *Subroutine
  4921. *  btsub   - sets up SCI and outputs control character
  4922. * On entry, B = control character
  4923. * On exit,  X = $1000
  4924. *           A = $0C
  4925. ***************************
  4926.  
  4927. BTSUB   LDX   #APORT    to use indexed addressing
  4928.     LDAA  #$02
  4929.     STAA  JPORTD,X  drive transmitter line
  4930.     STAA  JDDRD,X     high
  4931.     CLR   JSCCR2,X  turn off XMTR and RCVR
  4932.     LDAA  #$22      BAUD = /16
  4933.     STAA  JBAUD,X
  4934.     LDAA  #$0C      TURN ON XMTR & RCVR
  4935.     STAA  JSCCR2,X
  4936.     STAB  JSCDAT,X
  4937.     BRCLR JSCSR,X,$80,.   wait for TDRE
  4938.     RTS
  4939.  
  4940.  
  4941. ***********
  4942. * TILDE - This command is put into the combuff by the
  4943. * load command so that extraneous carriage returns after
  4944. * the load will not hang up.
  4945. TILDE   RTS
  4946.  
  4947. ******************
  4948. *
  4949. *       EVBTEST - This routine makes it a little easier
  4950. *       on us to test this board.
  4951. *
  4952. ******************
  4953.  
  4954. EVBTEST  LDAA  #$FF
  4955.     STAA  APORT    Write ones to port A
  4956.     CLR  AUTOLF    Turn off auto lf
  4957.     JSR  HOSTCO    Connect host
  4958.     JSR  HOSTINIT  Initialize host
  4959.     LDAA #$7f
  4960.     JSR  HOSTOUT   Send Delete to Altos
  4961.     LDAA #$0d
  4962.     JSR  HOSTOUT   Send <CR>
  4963.     INC  AUTOLF    Turn on Auto LF
  4964.     LDX  #INBUFF+5 Point at Load message
  4965.     STX  PTR0      Set pointer for load command
  4966.     LDY  #MSGEVB   Point at cat line
  4967. LOOP     LDAA 0,Y       Loop to xfer command line
  4968.     CMPA #04       Into buffalo line buffer
  4969.     BEQ  DONE      Quit on $04
  4970.     STAA 0,X
  4971.     INX      next character
  4972.     INY
  4973.     BRA  LOOP
  4974. DONE     CLR  TMP2      Set load vs. verify
  4975.     JSR  LOAD3     Jmp into middle of load
  4976.     LDS  #STACK    Reset Stack
  4977.     JMP  $C0B3     Jump to Downloaded code
  4978.  
  4979. MSGEVB   FCC    "cat evbtest.out"
  4980.     FCB    $0D
  4981.     FCB    $04
  4982.  
  4983.  
  4984. *** Jump table ***
  4985.     RSEG    BUF_VECTS1
  4986. .WARMST JMP     MAIN        warm start
  4987. .BPCLR  JMP     BPCLR       clear breakpoint table
  4988. .RPRINT JMP     RPRINT      display user registers
  4989. .HEXBIN JMP     HEXBIN      convert ascii hex char to binary
  4990. .BUFFAR JMP     BUFFARG     build hex argument from buffer
  4991. .TERMAR JMP     TERMARG     read hex argument from terminal
  4992. .CHGBYT JMP     CHGBYT      modify memory at address in x
  4993. .READBU JMP     READBUFF    read character from buffer
  4994. .INCBUF JMP     INCBUFF     increment buffer pointer
  4995. .DECBUF JMP     DECBUFF     decrement buffer pointer
  4996. .WSKIP  JMP     WSKIP       find non-whitespace char in buffer
  4997. .CHKABR JMP     CHKABRT     check for abort from terminal
  4998.  
  4999.     RSEG    BUF_VECTS2
  5000. .UPCASE JMP     UPCASE      convert to upper case
  5001. .WCHEK  JMP     WCHEK       check for white space
  5002. .DCHEK  JMP     DCHEK       check for delimeter
  5003. .INIT   JMP     INIT        initialize i/o device
  5004. .INPUT  JMP     INPUT       low level input routine
  5005. .OUTPUT JMP     OUTPUT      low level output routine
  5006. .OUTLHL JMP     OUTLHLF     display top 4 bits as hex digit
  5007. .OUTRHL JMP     OUTRHLF     display bottom 4 bits as hex digit
  5008. .OUTA   JMP     OUTA        output ascii character in A
  5009. .OUT1BY JMP     OUT1BYT     display the hex value of byte at X
  5010. .OUT1BS JMP     OUT1BSP     out1byt followed by space
  5011. .OUT2BS JMP     OUT2BSP     display 2 hex bytes at x and a space
  5012. .OUTCRL JMP     OUTCRLF     carriage return, line feed to terminal
  5013. .OUTSTR JMP     OUTSTRG     display string at X (term with $04)
  5014. .OUTST0 JMP     OUTSTRG0    outstrg with no initial carr ret
  5015. .INCHAR JMP     INCHAR      wait for and input a char from term
  5016. .VECINT JMP     VECINIT     initialize RAM vector table
  5017.  
  5018.     RSEG    VECTORS
  5019. *** Vectors ***
  5020. VSCI     FDB    JSCI
  5021. VSPI     FDB    JSPI
  5022. VPAIE    FDB    JPAIE
  5023. VPAO     FDB    JPAO
  5024. VTOF     FDB    JTOF
  5025. VTOC5    FDB    JTOC5
  5026. VTOC4    FDB    JTOC4
  5027. VTOC3    FDB    JTOC3
  5028. VTOC2    FDB    JTOC2
  5029. VTOC1    FDB    JTOC1
  5030. VTIC3    FDB    JTIC3
  5031. VTIC2    FDB    JTIC2
  5032. VTIC1    FDB    JTIC1
  5033. VRTI     FDB    JRTI
  5034. VIRQ     FDB    JIRQ
  5035. VXIRQ    FDB    JXIRQ
  5036. VSWI     FDB    JSWI
  5037. VILLOP   FDB    JILLOP
  5038. VCOP     FDB    JCOP
  5039. VCLM     FDB    JCLM
  5040. VRST     FDB    BUFFALO
  5041.