OpenCores
URL https://opencores.org/ocsvn/System09/System09/trunk

Subversion Repositories System09

[/] [System09/] [trunk/] [src/] [sys09bug/] [sys09270.lst] - Rev 209

Go to most recent revision | Compare with Previous | Blame | View Log

Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001                          NAM SYS09BUG FOR TERASIC CYCLONE II DE2-70 
0000                          INCLUDE "opt_270.asm"
0001                         
0002                         *
0003                         ***************************************************
0004                         *   OPTION SWITCHES
0005                         ***************************************************
0006                         *
0007                         *
0008                         ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0009                         ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0010                         ** FOR LOADING AND SAVING S1 RECORDS
0011                         *
0012                         *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0013                         *ADSOPT  EQU $FF ADS6809 & DG640 VIDEO DISPAY
0014                         *B3SOPT EQU $FF B3-SPARTAN2 FPGA VIDEO & PS2 KEYBOARD
0015                         *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
0016                         *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
0017                         *S3EOPT EQU $FF SPARTAN3E STARTER
0018                         *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
0019 00FF                    DE270OPT EQU $FF CYCLONE II DE2-70
0020                         *
0002                          END
0000                          INCLUDE "sys09equ.asm"
0001                         * 
0002                         ***************************************************
0003                         *   MEMORY MAP EQUATES                            *
0004                         ***************************************************
0005 E000                    MONIO  EQU $E000  I/O SPACE
0006                                IFD B3SOPT 
0007                         MONEXT EQU $F000  START OF EXTENDED COMMANDS
0008                         EXTCMD EQU $00    EXTENDED OFFSET
0009                                ENDIF B3SOPT
0009                                ENDIF B3SOPT
0010                                IFD S3EOPT
0011                         MONRAM EQU $7FC0
0012                                ELSE
0013 DFC0                    MONRAM EQU $DFC0  STACK SPACE
0014                                ENDIF S3EOPT
0015 F800                    MONROM EQU $F800  START OF ROM
0016                                IFD S3SOPT 
0017                         MONEXT EQU $F000  START OF EXTENDED COMMANDS
0018                         EXTCMD EQU $00    EXTENDED OFFSET
0019                                ENDIF S3SOPT
0019                                ENDIF S3SOPT
0020                                IFD XESOPT 
0021                         MONEXT EQU $F000  START OF EXTENDED COMMANDS
0022                         EXTCMD EQU $00    EXTENDED OFFSET
0023                                ENDIF XESOPT
0023                                ENDIF XESOPT
0024                                IFD DE270OPT 
0025 F000                    MONEXT EQU $F000  START OF EXTENDED COMMANDS
0026 0000                    EXTCMD EQU $00    EXTENDED OFFSET
0027                                ENDIF DE270OPT
0028                         **************************************************
0029                         **************************************************
0030                         
0031                                 IFD SWTOPT
0032                         *
0033                         * SOUTH WEST TECHNICAL PRODUCTS COMPUTER
0034                         *
0035                         ACIAOPT EQU $FF ACIA AT PORT 0
0036                         DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0037                         MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0038                         DATOPT  EQU $FF DYNAMIC ADDRESS TRANSLATION
0039                                 ENDIF
0039                                 ENDIF
0040                         *
0041                                 IFD ADSOPT
0042                         *
0043                         * ACKERMAN DIGITAL ADS6809
0044                         *
0045                         DG640OPT  EQU $FF DG640 VDU AT $E800
0046                         *RTCOPT  EQU $FF REAL TIME CLOCK
0047                         PRTOPT  EQU $FF PRINTER DRIVERS
0048                         MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0049                                 ENDIF ADSOPT
0049                                 ENDIF ADSOPT
0050                         *
0051                                 IFD B3SOPT
0052                         *
0053                         * BURCHED SPARTAN 2 B3+
0054                         *
0055                         ACIAOPT EQU $FF ACIA AT PORT 0
0056                         PS2OPT  EQU $FF PS2 KEYBOARD AT $E020
0057                         VDUOPT  EQU $FF VDU AT $E030
0058                         IDEOPT  EQU $FF IDE AT $E100
0059                         DATOPT  EQU $FF DYNAMIC ADDRESS TRANSLATION
0060                         HFCOPT  EQU $FF HARDWARE FLOW CONTROL
0061                                 ENDIF B3SOPT         
0061                                 ENDIF B3SOPT         
0062                         *
0063                                 IFD B5XOPT
0064                         *
0065                         * BURCHED SPARTAN 2 B5-X300
0066                         *
0067                         ACIAOPT EQU $FF ACIA AT PORT 0
0068                         PS2OPT  EQU $FF PS2 KEYBOARD AT $E020
0069                         VDUOPT  EQU $FF VDU AT $E030
0070                         CF8OPT  EQU $FF COMPACT FLASH AT $E040
0071                         DATOPT  EQU $FF DYNAMIC ADDRESS TRANSLATION
0072                         HFCOPT  EQU $FF HARDWARE FLOW CONTROL
0073                                 ENDIF B5XOPT         
0073                                 ENDIF B5XOPT         
0074                         *
0075                                 IFD S3SOPT
0076                         *
0077                         * DIGILENT SPARTAN 3 STARTER
0078                         *
0079                         ACIAOPT EQU $FF ACIA AT PORT 0
0080                         PS2OPT  EQU $FF PS2 KEYBOARD AT $E020
0081                         VDUOPT  EQU $FF VDU AT $E030
0082                         CF8OPT  EQU $FF COMPACT FLASH AT $E040
0083                         DATOPT  EQU $FF DYNAMIC ADDRESS TRANSLATION
0084                         EXTOPT  EQU $FF EXTENDED COMMANDS
0085                                 ENDIF S3SOPT         
0085                                 ENDIF S3SOPT         
0086                         *
0087                                 IFD S3EOPT
0088                         *
0089                         * DIGILENT SPARTAN 3E STARTER
0090                         *
0091                         ACIAOPT EQU $FF ACIA AT PORT 0
0092                         PS2OPT  EQU $FF PS2 KEYBOARD AT $E020
0093                         VDUOPT  EQU $FF VDU AT $E030
0094                         TRAOPT  EQU $FF PIA TRACE TIMER
0095                                 ENDIF S3EOPT         
0095                                 ENDIF S3EOPT         
0096                         *
0097                                 IFD XESOPT
0098                         *
0099                         * XESS SPARTAN 3 XSA-3S1000 & XST-3.0
0100                         *
0101                         ACIAOPT EQU $FF ACIA AT PORT 0
0102                         PS2OPT  EQU $FF PS2 KEYBOARD AT $E020
0103                         VDUOPT  EQU $FF VDU AT $E030
0104                         IDEOPT  EQU $FF IDE AT $E100
0105                         DATOPT  EQU $FF DYNAMIC ADDRESS TRANSLATION
0106                         HFCOPT  EQU $FF HARDWARE FLOW CONTROL
0107                         EXTOPT  EQU $FF EXTENDED COMMANDS
0108                                 ENDIF XESOPT         
0108                                 ENDIF XESOPT         
0109                         *
0110                                 IFD DE270OPT
0111                         *
0112                         * TERASIC CYCLONE 2 DE2-70 
0113                         *
0114 00FF                    ACIAOPT EQU $FF ACIA AT PORT 0
0115 00FF                    PS2OPT  EQU $FF PS2 KEYBOARD AT $E020
0116 00FF                    VDUOPT  EQU $FF VDU AT $E030
0117 00FF                    CF8OPT  EQU $FF COMPACT FLASH AT $E040
0118 00FF                    DATOPT  EQU $FF DYNAMIC ADDRESS TRANSLATION
0119 00FF                    EXTOPT  EQU $FF EXTENDED COMMANDS
0120                                 ENDIF DE270OPT         
0121                         *
0122                         *
0123                                 IFD   ACIAOPT
0124                         * 
0125                         ***************************************************
0126                         *   SERIAL PORT                                   *
0127                         ***************************************************
0128                         *
0129                         ** ACIA SITS ON PORT 0
0130                         *
0131 E000                    ACIAS   EQU   MONIO+$00   CONTROL PORT 
0132                         *
0133                                 ENDIF ACIAOPT
0134                                 IFD   MFDCOPT
0135                         * 
0136                         ***************************************************
0137                         *   MINIFLOPPY DRIVE                              *
0138                         ***************************************************
0139                         *
0140                         ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0141                         *
0142                         DRVFDC  EQU   MONIO+$14
0143                         CMDFDC  EQU   MONIO+$18
0144                         SECFDC  EQU   MONIO+$1A
0145                         DATFDC  EQU   MONIO+$1B
0146                                 ENDIF MFDCOPT
0146                                 ENDIF MFDCOPT
0147                                 IFD PS2OPT
0148                         * 
0149                         ***************************************************
0150                         *   VDU8 PS/2 KEYBOARD PORT                       *
0151                         ***************************************************
0152                         *
0153                         ** KEYBOARD SITS ON PORT 2
0154                         *
0155 E020                    PS2KBD  EQU   MONIO+$20   PS/2 KEYBOARD PORT 
0156                                 ENDIF PS2OPT
0157                                 IFD VDUOPT
0158                         * 
0159                         ***************************************************
0160                         *   VDU8 DISPLAY DRIVER EQUATES                   *
0161                         ***************************************************
0162                         *
0163                         ** VDU8 DISPLAY SITS ON PORT 3
0164                         *
0165 E030                    VDU     EQU   MONIO+$30
0166 0000                    VDUCHR  EQU   0        CHARACTER REGISTER
0167 0001                    VDUATT  EQU   1        ATTRIBUTE REGISTER
0168 0002                    VDUCOL  EQU   2        CURSOR COLUMN
0169 0003                    VDUROW  EQU   3        CURSOR ROW
0170 0004                    VDUOFF  EQU   4        ROW OFFSET
0171                         *
0172 0050                    LINLEN  EQU   80       LENGTH OF A LINE
0173 0019                    NUMLIN  EQU   25       NUMBER OF LINES
0174                                 ENDIF VDUOPT
0175                         *
0176                                    IFD CF8OPT
0177                         * 
0178                         ***************************************************
0179                         *   COMPACT FLASH EQUATES 8 BIT TRANSFER          *
0180                         ***************************************************
0181                         *
0182                         ** COMPACT FLASH SITS AT PORT 4
0183                         *
0184 E040                    CF_BASE    EQU MONIO+$40
0185 E040                    CF_DATA    EQU CF_BASE+0
0186 E041                    CF_ERROR   EQU CF_BASE+1 ; read error
0187 E041                    CF_FEATURE EQU CF_BASE+1 ; write feature
0188 E042                    CF_SECCNT  EQU CF_BASE+2
0189 E043                    CF_SECNUM  EQU CF_BASE+3
0190 E044                    CF_CYLLO   EQU CF_BASE+4
0191 E045                    CF_CYLHI   EQU CF_BASE+5
0192 E046                    CF_HEAD    EQU CF_BASE+6
0193 E047                    CF_STATUS  EQU CF_BASE+7 ; read status
0194 E047                    CF_COMAND  EQU CF_BASE+7 ; write command
0195                         *
0196                         * Command Equates
0197                         *
0198 0020                    CMDREAD    EQU $20 ; Read Single sector
0199 0030                    CMDWRITE   EQU $30 ; Write Single sector
0200 00EF                    CMDFEATURE EQU $EF
0201 0001                    FEAT8BIT   EQU $01 ; enable 8 bit transfers
0202 00E0                    HEADLBA    EQU $E0
0203                         *
0204                         * Status bit equates
0205                         *
0206 0080                    BUSY       EQU $80
0207 0040                    DRDY       EQU $40
0208 0008                    DRQ        EQU $08
0209 0001                    ERR        EQU $01
0210                         *
0211                                    ENDIF CF8OPT
0212                         *
0213                                    IFD IDEOPT
0214                         * 
0215                         ***************************************************
0216                         *   COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS)  *
0217                         ***************************************************
0218                         *
0219                         ** COMPACT FLASH SITS AT PORT 4
0220                         *
0221                         CF_BASE    EQU MONIO+$0100
0222                         CF_DATA    EQU CF_BASE+0
0223                         CF_ERROR   EQU CF_BASE+2 ; read error
0224                         CF_FEATURE EQU CF_BASE+2 ; write feature
0225                         CF_SECCNT  EQU CF_BASE+4
0226                         CF_SECNUM  EQU CF_BASE+6
0227                         CF_CYLLO   EQU CF_BASE+8
0228                         CF_CYLHI   EQU CF_BASE+10
0229                         CF_HEAD    EQU CF_BASE+12
0230                         CF_STATUS  EQU CF_BASE+14 ; read status
0231                         CF_COMAND  EQU CF_BASE+14 ; write command
0232                         CF_AUX     EQU CF_BASE+30
0233                         *
0234                         * Command Equates
0235                         *
0236                         CMDREAD    EQU $20 ; Read Single sector
0237                         CMDWRITE   EQU $30 ; Write Single sector
0238                         AUXRESET   EQU $06 ; Reset IDE
0239                         AUXRSTREL  EQU $02 ; Reset release IRQ masked
0240                         HEADLBA    EQU $E0
0241                         *
0242                         * Status bit equates
0243                         *
0244                         BUSY       EQU $80
0245                         DRDY       EQU $40
0246                         DRQ        EQU $08
0247                         ERR        EQU $01
0248                         *
0249                                    ENDIF CF8OPT
0249                                    ENDIF CF8OPT
0250                         *
0251                                 IFD RTCOPT
0252                         *
0253                         **************************************************
0254                         * MM58167A REAL TIME CLOCK MEMORY MAP:
0255                         **************************************************
0256                         *
0257                         ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0258                         *
0259                         CLOCK  EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0260                         *
0261                         * COUNTER AND COMPARITOR REGISTERS:
0262                         *
0263                         * Both the Clock Counter and Clock Comparitor
0264                         * consist of 8 registers for holding the time.
0265                         * The register offsets from the Counter and
0266                         * Comparitor registers are listed above.
0267                         *
0268                         COUNTR EQU CLOCK+0
0269                         CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0270                         *
0271                         * CLOCK REGISTER OFFSETS:
0272                         * These register offsets are used for the CLOCK
0273                         * and comparitor ram CMPRAM.
0274                         *
0275                         S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0276                         S100   EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0277                         SECOND EQU 2
0278                         MINUIT EQU 3
0279                         HOUR   EQU 4
0280                         WKDAY  EQU 5
0281                         MTHDAY EQU 6
0282                         MONTH  EQU 7
0283                         *
0284                         * INTERRUPT OUTPUT REGISTERS:
0285                         *
0286                         * An interrupt output may be generated at the
0287                         * following rates by setting the appropriate bit
0288                         * in the Interrupt Control Register (CINTCR).
0289                         * The Interrupt Status Register (CINTSR) must be
0290                         * read to clear the interrupt and will return
0291                         * the source of the interrupt.
0292                         *
0293                         * 1/Month      Bit 7
0294                         * 1/Week       Bit 6
0295                         * 1/Day        Bit 5
0296                         * 1/Hour       Bit 4
0297                         * 1/Minuite    Bit 3
0298                         * 1/Second     Bit 2
0299                         * 10/Second    Bit 1
0300                         * Comparitor   Bit 0
0301                         *
0302                         CINTSR  EQU CLOCK+16 INTERRUPT STATUS REGISTER
0303                         CINTCR  EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0304                         *
0305                         * COUNTER AND RAM RESETS; GO COMMAND.
0306                         *
0307                         * The counter and comparitor may be reset
0308                         * by writing $FF into CTRRES and CMPRES
0309                         * respectivly.
0310                         * A write to the Go command register (GOCMND)
0311                         * will reset the 1/1000ths, 1/100ths and 1/10ths
0312                         * of a second counter.
0313                         *
0314                         CTRRES EQU CLOCK+18 COUNTER RESET
0315                         CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0316                         GOCMND EQU CLOCK+21 GO COMMAND
0317                         *
0318                         * CLOCK STATUS REGISTER.
0319                         *
0320                         * The counter takes 61 usec. to rollover for
0321                         * every 1KHz clock pulse. If the Status bit is
0322                         * set after reading the counter, the counter
0323                         * should be re-read to ensure the time is correct.
0324                         *
0325                         CLKSTA EQU CLOCK+20 STATUS BIT
0326                         SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0327                         TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0328                                ENDIF RTCOPT
0328                                ENDIF RTCOPT
0329                         * 
0330                                IFD TRAOPT
0331                         *
0332                         **************************************************
0333                         * PIA INTERRUPT TIMER
0334                         **************************************************
0335                         *
0336                         ** PIA INTERRUPT TIMER SITS ON PORT 7 
0337                         *
0338                         ** PIA TIMER FOR SINGLE STEP / TRACE
0339                         *
0340                         * TADATA = Output = Timer preset register
0341                         * TACTRL - CA1 = input = rising edge = NMI
0342                         *        - CA2 = Output = Timer Reset (Active High)
0343                         * TBDATA = Input = Timer read back register
0344                         * TBCTRL - CB1 = input = rising edge = FIRQ
0345                         *        - CB2 = output = strobe low on write to TBDATA = Timer Preset
0346                         *
0347                         * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0348                         * CRA1 = 1 CA1 Rising edge IRQ
0349                         * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0350                         * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0351                         * CRA4 = 1 ] CA2 = Set/Reset output
0352                         * CRA5 = 1 ]
0353                         * CRA6 = X CA2 Input Interrupt Flag
0354                         * CRA7 = X CA1 Interrupt Flag
0355                         *
0356                         * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0357                         * CRB1 = 1 CB1 Rising edge IRQ
0358                         * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0359                         * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0360                         * CRB4 = 1 ] CB2 = Set/Reset output
0361                         * CRB5 = 1 ]
0362                         * CRB6 = X CB2 Input Interrupt Flag
0363                         * CRB7 = X CB1 Interrupt Flag
0364                         *
0365                         * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0366                         * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0367                         *
0368                         TADATA EQU MONIO+$70 Timer preset port
0369                         TACTRL EQU MONIO+$71
0370                         TBDATA EQU MONIO+$72 Timer read back port
0371                         TBCTRL EQU MONIO+$73
0372                         *
0373                         TRADEL EQU 13  Number of E cycles for RTI (May need to be fudged)
0374                         *
0375                                ENDIF TRAOPT
0375                                ENDIF TRAOPT
0376                                IFD ADSOPT
0377                         * 
0378                         ***************************************************
0379                         *   SERIAL PORT FOR DG640                         *
0380                         ***************************************************
0381                         *
0382                         ** SET UP FOR ACKERMAN DIGITAL ADS6809
0383                         ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0384                         *
0385                         ACIAS   EQU   MONIO+$400   CONTROL PORT 
0386                         *
0387                                 ENDIF ADSOPT
0387                                 ENDIF ADSOPT
0388                                 IFD PRTOPT
0389                         *
0390                         ***************************************************
0391                         * PRINTER INTERFACE                               *
0392                         ***************************************************
0393                         *
0394                         PADATA EQU MONIO+$404
0395                         PACTRL EQU MONIO+$405
0396                         PBDATA EQU MONIO+$406
0397                         PBCTRL EQU MONIO+$407
0398                         *
0399                         ** CB1  ACK.  I/P
0400                         ** CB2  STB.  O/P
0401                         ** PB0 - PB7   DATA 1 - 8   O/P
0402                         ** PORT A BIT ASSIGNMENT
0403                         *
0404                         PBUSY  EQU $80 I/P
0405                         PEMPTY EQU $40 I/P
0406                         SELECT EQU $20 I/P
0407                         PERROR EQU $10 I/P
0408                         PRESET EQU %00000100 O/P PA3 = 0
0409                         AUTOFD EQU %00001000 O/P PA2 = 0
0410                         DIRMSK EQU %00001100
0411                                ENDIF PRTOPT
0411                                ENDIF PRTOPT
0412                                IFD DG640OPT
0413                         *
0414                         ***************************************************
0415                         *   DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES  *
0416                         ***************************************************
0417                         *
0418                         ** VIDEO DISPLAY DEFINITIONS
0419                         *
0420                         SCREEN  EQU   MONIO+$0800 START OF SCREEN MEMORY
0421                         LINLEN  EQU   64          LENGTH OF A LINE
0422                         NUMLIN  EQU   16          NUMBER OF LINES
0423                         SCNLEN  EQU   $400        LENGTH OF SCREEN
0424                                 ENDIF DG640OPT
0424                                 ENDIF DG640OPT
0425                         * 
0426                                 IFD   DMAFOPT
0427                         * 
0428                         ***************************************************
0429                         *   DMAF2 8" DRIVE                                *
0430                         ***************************************************
0431                         *
0432                         ADDREG  EQU   $F000  ADDRESS REGISTER 
0433                         CNTREG  EQU   $F002  COUNT REGISTER 
0434                         CCREG   EQU   $F010  CHANNEL CONTROL REGISTER 
0435                         PRIREG  EQU   $F014  DMA PRIORITY REGISTER 
0436                         AAAREG  EQU   $F015  ??? 
0437                         BBBREG  EQU   $F016  ??? 
0438                         COMREG  EQU   $F020  1791 COMMAND REGISTER 
0439                         SECREG  EQU   $F022  SECTOR REGISTER 
0440                         DRVREG  EQU   $F024  DRIVE SELECT LATCH 
0441                         CCCREG  EQU   $F040  ??? 
0442                                 ENDIF DMAFOPT
0442                                 ENDIF DMAFOPT
0443                                 IFD DATOPT
0444                         **************************************************
0445                         * DYNAMIC ADDRESS TRANSLATION REGISTERS          *
0446                         **************************************************
0447                         *
0448 FFF0                    IC11    EQU  $FFF0  DAT RAM CHIP 
0449 55AA                    TSTPAT  EQU  $55AA  TEST PATTERN 
0450                                 ENDIF DATOPT
0451                         *
0003                                 END
0000                          INCLUDE "sys09bug.asm"
0001                         * NAM SYS09BUG12 SYSTEM09 MONITOR
0002                          OPT l


sys09bug.asm                                                                      page   2
0004                         *
0005                         * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
0006                         * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
0007                         *
0008                         * ALLEN CLARK            WALLACE WATSON
0009                         * 2502 REGAL OAKS LANE   4815 EAST 97th AVE.
0010                         * LUTZ, FLA. 33549       TEMPLE TERRACE, FLA. 33617
0011                         * PH. 813-977-0347       PH. 813-985-1359
0012                         *
0013                         * MODIFIED TO SBUG09 VER 1.8 BY:  RANDY JARRETT
0014                         *                                 2561 NANTUCKET DR APT. E
0015                         *                                 ATLANTA, GA  30345
0016                         *                                 PH. 404-320-1043
0017                         *
0018                         * MODIFIED TO SYS09BUG VER 1.0
0019                         * FOR:     SYSTEM09 FPGA SYSTEM
0020                         * BY:      JOHN KENT
0021                         * DATE:    21ST NOVEMBER 2006
0022                         * REMOVED: DISK BOOTS
0023                         *          MEMORY TEST
0024                         * ADDED:   ADM3A VDU DRIVER
0025                         *
0026                         * MODIFIED TO SYS09BUG VER 1.1
0027                         * BY:      JOHN KENT
0028                         * DATE:    7TH JANUARY 2007
0029                         * ADDED:   'U' USER EXTENTION COMMANDS AT $F000
0030                         *          CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
0031                         *          AND REALTIME CLOCK
0032                         *
0033                         * MODIFIED TO SYS09BUG VER 1.2
0034                         * BY:      JOHN KENT
0035                         * DATE:    21ST MAY 2007
0036                         * ADDED:   COMPACT FLASH BOOT TO FPGA VERSION
0037                         *          REMOVED PORT REDIRECTION ON PUNCH & LOAD
0038                         *
0039                         * Modified to SYS09BUG VER 1.3
0040                         * BY:      JOHN KENT
0041                         * DATE:    8TH JAN 2008
0042                         * ADDED:   CONDITIONALS FOR SPARTAN3E STARTER BOARD
0043                         *          WITH ONLY 32K OF RAM
0044                         *
0045                         * Modified to SYS09BUG VER 1.4
0046                         * BY:      JOHN KENT
0047                         * DATE:    3RD FEB 2008
0048                         * ADDED:   CONDITIONALS FOR XESS BOARD WITH IDE
0049                         *          SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
0050                         *          16 BIT IDE DISK BOOT STRAP ROUTINE
0051                         *
0052                         * Modified to SYS09BUG VER 1.5
0053                         * BY:      JOHN KENT
0054                         * DATE:    7TH SEP 2008
0055                         * ADDED:   ADDED "B3-S2+" STRING
0056                         *
0057                         * Modified to SYS09BUG VER 1.6
0058                         * BY:      JOHN KENT
0059                         * DATE:    2ND DEC 2008
0060                         * ADDED:   ADDED HARDWARE FLOW CONTROL
0061                         *
0062                         * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
0063                         *
0064                         * Modified to SYS09BUG VER 1.7
0065                         * BY:     JOHN KENT
0066                         * DATE:   16TH OCT 2010
0067                         * ADDED:  "DE2-70" STRING
0068                         * 
0069                         *       *** COMMANDS ***
0070                         *
0071                         * CONTROL A   = ALTER THE "A" ACCUMULATOR
0072                         * CONTROL B   = ALTER THE "B" ACCUMULATOR
0073                         * CONTROL C   = ALTER THE CONDITION CODE REGISTER
0074                         * CONTROL D   = ALTER THE DIRECT PAGE REGISTER
0075                         * CONTROL P   = ALTER THE PROGRAM COUNTER
0076                         * CONTROL U   = ALTER USER STACK POINTER
0077                         * CONTROL X   = ALTER "X" INDEX REGISTER
0078                         * CONTROL Y   = ALTER "Y" INDEX REGISTER
0079                         * B hhhh      = SET BREAKPOINT AT LOCATION $hhhh
0080                         * D           = 5.25" MINIFLOPPY BOOT
0081                         * E ssss-eeee = EXAMINE MEMORY
0082                         *               FROM STARTING ADDRESS ssss
0083                         *               TO ENDING ADDRESS eeee.
0084                         * G           = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0085                         * L           = LOAD TAPE
0086                         * M hhhh      = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0087                         * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0088                         * R           = DISPLAY REGISTER CONTENTS
0089                         * S           = DISPLAY STACK FROM ssss TO $DFC0
0090                         * U           = 8" DMAF2 FLOPPY BOOT
0091                         * U           = USER EXTENSION COMMANDS AT $F000
0092                         * X           = REMOVE ALL BREAKPOINTS
0093                         *
0094                         *
0095                         ***************************************************
0096                         *   SYS09BUG VARIABLE SPACE
0097                         ***************************************************
0098                         *
0099 DFC0                            ORG   MONRAM
0100 DFC0                    STACK   EQU   *         ; TOP OF INTERNAL STACK
0101 DFC0                    NMI     RMB   2         ; USER NMI VECTOR
0102 DFC2                    SWI3    RMB   2         ; SOFTWARE INTERRUPT VECTOR #3
0103 DFC4                    SWI2    RMB   2         ; SOFTWARE INTERRUPT VECTOR #2
0104 DFC6                    FIRQ    RMB   2         ; FAST INTERRUPT VECTOR
0105 DFC8                    IRQ     RMB   2         ; INTERRUPT VECTOR
0106 DFCA                    SWI     RMB   2         ; SOFTWARE INTERRUPT VECTOR
0107 DFCC                    SVCVO   RMB   2         ; SUPERVISOR CALL VECTOR ORGIN
0108 DFCE                    SVCVL   RMB   2         ; SUPERVISOR CALL VECTOR LIMIT
0109                                 IFD DATOPT
0110 DFD0                    LRARAM  RMB  16         ; LRA ADDRESSES
0111                                 ENDIF DATOPT
0112 DFE0                    CPORT   RMB   2         ; RE-VECTORABLE CONTROL PORT
0113 DFE2                    ECHO    RMB   1         ; ECHO FLAG
0114 DFE3                    BPTBL   RMB  24         ; BREAKPOINT TABLE BASE ADDR
0115                                 IFD  TRAOPT
0116                         NMISAV  RMB   2         ; NMI Jump Vector Backup
0117                         TRACNT  RMB   2         ; Trace Count
0118                                 ENDIF TRAOPT
0118                                 ENDIF TRAOPT
0119                                 IFD VDUOPT
0120                         *
0121                         **************************************************
0122                         *   VDU8 DISPLAY DRIVER VARIABLES                                    *
0123                         **************************************************
0124                         *
0125                         **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0126 DFFB                    COLADX  RMB   1         ; CURSOR COLUMN
0127 DFFC                    ROWADX  RMB   1         ; CURSOR ROW
0128                         **************************************************
0129                         *
0130 DFFD                    NEWROW  RMB   1         ; NEW ROW TEMP FOR ESCAPE
0131 DFFE                    ESCFLG  RMB   1         ; ESCAPE SEQUENCE ACTIVE
0132                                 ENDIF VDUOPT
0133                                 IFD DG640OPT
0134                         *
0135                         ***************************************************
0136                         *   DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES  *
0137                         ***************************************************
0138                         *
0139                         ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0140                         COLADX  RMB   1        ; CURSOR COLUMN
0141                         ROWADX  RMB   1        ; CURSOR ROW
0142                         *************************************************
0143                         CURSOR  RMB   2        ; ABSOLUTE SCREEN ADDRESS
0144                         NEWROW  RMB   1        ; NEW ROW TEMP FOR ESCAPE
0145                         ESCFLG  RMB   1        ; ESCAPE SEQUENCE ACTIVE
0146                                 ENDIF DG640OPT
0146                                 ENDIF DG640OPT
0147                         *
0148                         *
0149                         ***************************************************
0150                         *   START OF ROM                                  *
0151                         ***************************************************
0152                         *
0153 F800                            ORG   MONROM
0154 F800 F8 14                      FDB   MONITOR
0155 F802 F8 61                      FDB   NEXTCMD
0156 F804 FC A1                      FDB   INCH
0157 F806 FC 9B                      FDB   INCHE
0158 F808 FC B9                      FDB   INCHEK
0159 F80A FC CE                      FDB   OUTCH
0160 F80C FB 8F                      FDB   PDATA
0161 F80E FB 1E                      FDB   PCRLF
0162 F810 FB 1A                      FDB   PSTRNG
0163 F812 FA 2E                      FDB   LRA
0164                         *
0165                                 IFD   ADSOPT
0166                                 FDB   PCHK     ; CHECK FOR PRINTER INPUT
0167                                 FDB   PINIZ    ; INITIATE PRINTER
0168                                 FDB   POUTCH   ; OUTPUT CH. TO PRINTER
0169                                 FDB   VINIZ
0170                                 FDB   VOUTCH
0171                                 FDB   ACINIZ
0172                                 FDB   AOUTCH
0173                                 ENDIF ADSOPT
0173                                 ENDIF ADSOPT
0174                         *
0175                         * MONITOR
0176                         *
0177                         * VECTOR ADDRESS STRING IS.....
0178                         * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0179                         *
0180 F814 8E FE 62           MONITOR LDX   #RAMVEC  ; POINT TO VECTOR ADDR. STRING
0181 F817 10 8E DF C0                LDY   #STACK   ; POINT TO RAM VECTOR LOCATION
0182 F81B C6 10                      LDB   #$10     ; BYTES TO MOVE = 16
0183 F81D A6 80              LOOPA   LDA   ,X+      ; GET VECTOR BYTE
0184 F81F A7 A0                      STA   ,Y+      ; PUT VECTORS IN RAM / $DFC0-$DFCF
0185 F821 5A                         DECB           ; SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0186 F822 26 F9                      BNE   LOOPA    ; CONTINUE UNTIL ALL VECTORS MOVED
0187                         *
0188                         * CONTENTS     FROM         TO      FUNCTION
0189                         *  $F8A1       $FE40      $DFC0     USER-V
0190                         *  $F8A1       $FE42      $DFC2     SWI3-V
0191                         *  $F8A1       $FE44      $DFC4     SWI2-V
0192                         *  $F8A1       $FE46      $DFC6     FIRQ-V
0193                         *  $F8A1       $FE48      $DFC8     IRQ-V
0194                         *  $FAB0       $FE4A      $DFCA     SWI-V
0195                         *  $FFFF       $FE4C      $DFCC     SVC-VO
0196                         *  $FFFF       $FE4E      $DFCE     SVC-VL
0197                         *
0198 F824 8E E0 00                   LDX   #ACIAS
0199 F827 BF DF E0                   STX   CPORT    ; STORE ADDR. IN RAM
0200 F82A 17 01 5B                   LBSR  XBKPNT   ; CLEAR OUTSTANDING BREAKPOINTS
0201 F82D C6 0C                      LDB   #12      ; CLEAR 12 BYTES ON STACK
0202 F82F 6F E2              CLRSTK  CLR   ,-S
0203 F831 5A                         DECB
0204 F832 26 FB                      BNE   CLRSTK
0205 F834 30 8C DD                   LEAX  MONITOR,PCR  ; SET PC TO SBUG-E ENTRY
0206 F837 AF 6A                      STX   10,S    ; ON STACK
0207 F839 86 D0                      LDA   #$D0    ; PRESET CONDITION CODES ON STACK
0208 F83B A7 E4                      STA   ,S
0209 F83D 1F 43                      TFR   S,U
0210 F83F 17 04 A3                   LBSR  IOINIZ  ; INITIALIZE CONTROL PORT
0211 F842 8E FE 72                   LDX   #MSG1   ; POINT TO MONITOR MESSAGE
0212 F845 17 03 47                   LBSR  PDATA   ; PRINT MSG
0213                         *
0214                                 IFD   DATOPT
0215 F848 8E DF D0                   LDX   #LRARAM ; POINT TO LRA RAM STORAGE AREA
0216 F84B 4F                         CLRA  START   ; TOTAL AT ZERO
0217 F84C C6 0D                      LDB   #13     ; TOTAL UP ALL ACTIVE RAM MEMORY
0218 F84E 6D 85              FNDREL  TST   B,X     ; TEST FOR RAM AT NEXT LOC.
0219 F850 27 03                      BEQ   RELPAS  ; IF NO RAM GO TO NEXT LOC.
0220 F852 8B 04                      ADDA  #4      ; ELSE ADD 4K TO TOTAL
0221 F854 19                         DAA           ; ADJ. TOTAL FOR DECIMAL
0222 F855 5A                 RELPAS  DECB          ; SUB. 1 FROM LOCS. TO TEST
0223 F856 2A F6                      BPL   FNDREL  ; PRINT TOTAL OF RAM
0224 F858 17 04 0C                   LBSR  OUT2H   ; OUTPUT HEX BYTE AS ASCII
0225 F85B 8E FE 92                   LDX   #MSG2   ; POINT TO MSG 'K' CR/LF + 3 NULS
0226 F85E 17 03 2E                   LBSR  PDATA   ; PRINT MSG
0227                                 ENDIF DATOPT
0228                         *
0229                                 IFD   TRAOPT
0230                                 LBSR  TRAINZ
0231                                 ENDIF TRAOPT
0231                                 ENDIF TRAOPT
0232                         *
0233                         ***** NEXTCMD *****
0234                         *
0235 F861 8E FE 99           NEXTCMD LDX  #MSG3   ; POINT TO MSG ">"
0236 F864 17 02 B3                   LBSR PSTRNG  ; PRINT MSG
0237 F867 17 04 37                   LBSR INCH    ; GET ONE CHAR. FROM TERMINAL
0238 F86A 84 7F                      ANDA #$7F    ; STRIP PARITY FROM CHAR.
0239 F86C 81 0D                      CMPA #$0D    ; IS IT CARRIAGE RETURN ?
0240 F86E 27 F1                      BEQ  NEXTCMD ; IF CR THEN GET ANOTHER CHAR.
0241 F870 1F 89                      TFR  A,B     ; PUT CHAR. IN "B" ACCUM.
0242 F872 81 20                      CMPA #$20    ; IS IT CONTROL OR DATA CHAR ?
0243 F874 2C 09                      BGE  PRTCMD  ; IF CMD CHAR IS DATA, PRNT IT
0244 F876 86 5E                      LDA  #'^     ; ELSE CNTRL CHAR CMD SO...
0245 F878 17 04 53                   LBSR OUTCH   ; PRINT "^"
0246 F87B 1F 98                      TFR  B,A     ; RECALL CNTRL CMD CHAR
0247 F87D 8B 40                      ADDA #$40    ; CONVERT IT TO ASCII LETTER
0248 F87F 17 04 4C           PRTCMD  LBSR OUTCH   ; PRNT CMD CHAR
0249 F882 17 04 47                   LBSR OUT1S   ; PRNT SPACE
0250 F885 C1 60                      CMPB #$60
0251 F887 2F 02                      BLE  NXTCH0
0252 F889 C0 20                      SUBB #$20
0253                         *
0254                         ***** DO TABLE LOOKUP *****
0255                         *   FOR COMMAND FUNCTIONS
0256                         *
0257 F88B 8E FE 29           NXTCH0  LDX  #JMPTAB ; POINT TO JUMP TABLE
0258 F88E E1 80              NXTCHR  CMPB ,X+     ; DOES COMMAND MATCH TABLE ENTRY ?
0259 F890 27 0F                      BEQ  JMPCMD  ; BRANCH IF MATCH FOUND
0260 F892 30 02                      LEAX 2,X     ; POINT TO NEXT ENTRY IN TABLE
0261 F894 8C FE 62                   CMPX #TABEND ; REACHED END OF TABLE YET ?
0262 F897 26 F5                      BNE  NXTCHR  ; IF NOT END, CHECK NEXT ENTRY
0263 F899 8E FE 9B                   LDX  #MSG4   ; POINT TO MSG "WHAT?"
0264 F89C 17 02 F0                   LBSR PDATA   ; PRINT MSG
0265 F89F 20 C0                      BRA  NEXTCMD ; IF NO MATCH, PRMPT FOR NEW CMD
0266 F8A1 AD 94              JMPCMD  JSR  [,X]    ; JUMP TO COMMAND ROUTINE
0267 F8A3 20 BC                      BRA  NEXTCMD ; PROMPT FOR NEW COMMAND
0268                         *
0269                         * "G" GO OR CONTINUE
0270                         *
0271 F8A5 1F 34              GO      TFR  U,S
0272 F8A7 3B                 RTI     RTI
0273                         *
0274                         ***** "M" MEMORY EXAMINE AND CHANGE *****
0275                         *
0276 F8A8 17 03 6B           MEMCHG  LBSR IN1ADR  ; INPUT ADDRESS
0277 F8AB 29 2D                      BVS  CHRTN   ; IF NOT HEX, RETURN
0278 F8AD 1F 12                      TFR  X,Y     ; SAVE ADDR IN "Y"
0279 F8AF 8E FE A1           MEMC2   LDX  #MSG5   ; POINT TO MSG " - "
0280 F8B2 17 02 65                   LBSR PSTRNG  ; PRINT MSG
0281 F8B5 1F 21                      TFR  Y,X     ; FETCH ADDRESS
0282 F8B7 17 03 A5                   LBSR OUT4H   ; PRINT ADDR IN HEX
0283 F8BA 17 04 0F                   LBSR OUT1S   ; OUTPUT SPACE
0284 F8BD A6 A4                      LDA  ,Y      ; GET CONTENTS OF CURRENT ADDR.
0285 F8BF 17 03 A5                   LBSR OUT2H   ; OUTPUT CONTENTS IN ASCII
0286 F8C2 17 04 07                   LBSR OUT1S   ; OUTPUT SPACE
0287 F8C5 17 03 5E                   LBSR BYTE    ; LOOP WAITING FOR OPERATOR INPUT
0288 F8C8 28 11                      BVC  CHANGE  ; IF VALID HEX GO CHANGE MEM. LOC.
0289 F8CA 81 08                      CMPA #8      ; IS IT A BACKSPACE (CNTRL H)?
0290 F8CC 27 E1                      BEQ  MEMC2   ; PROMPT OPERATOR AGAIN
0291 F8CE 81 18                      CMPA #$18    ; IS IT A CANCEL (CNTRL X)?
0292 F8D0 27 DD                      BEQ  MEMC2   ; PROMPT OPERATOR AGAIN
0293 F8D2 81 5E                      CMPA #'^     ; IS IT AN UP ARROW?
0294 F8D4 27 17                      BEQ  BACK    ; DISPLAY PREVIOUS BYTE
0295 F8D6 81 0D                      CMPA #$D     ; IS IT A CR?
0296 F8D8 26 0F                      BNE  FORWRD  ; DISPLAY NEXT BYTE
0297 F8DA 39                 CHRTN   RTS          ; EXIT ROUTINE
0298                         *
0299                         *
0300 F8DB A7 A4              CHANGE  STA  ,Y      ; CHANGE BYTE IN MEMORY
0301 F8DD A1 A4                      CMPA ,Y      ; DID MEMORY BYTE CHANGE?
0302 F8DF 27 08                      BEQ  FORWRD  ; $F972
0303 F8E1 17 03 E8                   LBSR OUT1S   ; OUTPUT SPACE
0304 F8E4 86 3F                      LDA  #'?     ; LOAD QUESTION MARK
0305 F8E6 17 03 E5                   LBSR OUTCH   ; PRINT IT
0306 F8E9 31 21              FORWRD  LEAY 1,Y     ; POINT TO NEXT HIGHER MEM LOCATION
0307 F8EB 20 C2                      BRA  MEMC2   ; PRINT LOCATION & CONTENTS
0308 F8ED 31 3F              BACK    LEAY -1,Y    ; POINT TO LAST MEM LOCATION
0309 F8EF 20 BE                      BRA  MEMC2   ; PRINT LOCATION & CONTENTS
0310                         *
0311                         * "S" DISPLAY STACK
0312                         * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0313                         ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0314                         *
0315 F8F1 17 02 A2           DISSTK  LBSR PRTSP   ; PRINT CURRENT STACK POINTER
0316 F8F4 1F 32                      TFR  U,Y
0317 F8F6 8E DF C0                   LDX  #STACK  ; LOAD INTERNAL STACK AS UPPER LIMIT
0318 F8F9 30 1F                      LEAX -1,X    ; POINT TO CURRENT STACK
0319 F8FB 20 05                      BRA  MDUMP1  ; ENTER MEMORY DUMP OF STACK CONTENTS
0320                         *
0321                         * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0322                         * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0323                         *                        UPPER ADDRESS IN X-REG.
0324                         * IF HEX ADDRESSES ARE INVALID (V)=1.
0325                         *
0326 F8FD 17 03 0B           MEMDUMP LBSR IN2ADR  ; INPUT ADDRESS BOUNDRIES
0327 F900 29 06                      BVS  EDPRTN  ; NEW COMMAND IF ILLEGAL HEX
0328 F902 34 20              MDUMP1  PSHS Y       ; COMPARE LOWER TO UPPER BOUNDS
0329 F904 AC E1                      CMPX ,S++    ; LOWER BOUNDS > UPPER BOUNDS?
0330 F906 24 01                      BCC  AJDUMP  ; IF NOT, DUMP HEX AND ASCII
0331 F908 39                 EDPRTN  RTS          ;
0332                         *
0333                         * ADJUST LOWER AND UPPER ADDRESS LIMITS
0334                         * TO EVEN 16 BYTE BOUNDRIES.
0335                         *
0336                         * IF LOWER ADDR = $4532
0337                         * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0338                         *
0339                         * IF UPPER ADDR = $4567
0340                         * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0341                         *
0342                         * ENTER WITH LOWER ADDRESS IN X-REG.
0343                         *           -UPPER ADDRESS ON TOP OF STACK.
0344                         *
0345 F909 1F 10              AJDUMP  TFR  X,D     ; GET UPPER ADDR IN D-REG
0346 F90B C3 00 10                   ADDD #$10    ; ADD 16 TO UPPER ADDRESS
0347 F90E C4 F0                      ANDB #$F0    ; MASK TO EVEN 16 BYTE BOUNDRY
0348 F910 34 06                      PSHS A,B     ; SAVE ON STACK AS UPPER DUMP LIMIT
0349 F912 1F 20                      TFR  Y,D     ; $F9A5 GET LOWER ADDRESS IN D-REG
0350 F914 C4 F0                      ANDB #$F0    ; MASK TO EVEN 16 BYTE BOUNDRY
0351 F916 1F 01                      TFR  D,X     ; PUT IN X-REG AS LOWER DUMP LIMIT
0352 F918 AC E4              NXTLIN  CMPX ,S      ; COMPARE LOWER TO UPPER LIMIT
0353 F91A 27 05                      BEQ  SKPDMP  ; IF EQUAL SKIP HEX-ASCII DUMP
0354 F91C 17 03 9A                   LBSR INCHEK  ; CHECK FOR INPUT FROM KEYBOARD
0355 F91F 27 03                      BEQ  EDUMP
0356 F921 32 62              SKPDMP  LEAS 2,S     ; READJUST STACK IF NOT DUMPING
0357 F923 39                         RTS          ;
0358                         *
0359                         * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0360                         * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0361                         *
0362 F924 34 10              EDUMP   PSHS X       ; PUSH LOWER ADDR LIMIT ON STACK
0363 F926 8E FE A1                   LDX  #MSG5   ; POINT TO MSG " - "
0364 F929 17 01 EE                   LBSR PSTRNG  ; PRINT MSG
0365 F92C AE E4                      LDX  ,S      ; LOAD LOWER ADDR FROM TOP OF STACK
0366 F92E 17 03 2E                   LBSR OUT4H   ; PRINT THE ADDRESS
0367 F931 17 03 96                   LBSR OUT2S   ; 2 SPACES
0368 F934 C6 10                      LDB  #$10    ; LOAD COUNT OF 16 BYTES TO DUMP
0369 F936 A6 80              ELOOP   LDA  ,X+     ; GET FROM MEMORY HEX BYTE TO PRINT
0370 F938 17 03 2C                   LBSR OUT2H   ; OUTPUT HEX BYTE AS ASCII
0371 F93B 17 03 8E                   LBSR OUT1S   ; OUTPUT SPACE
0372 F93E 5A                         DECB         ; $F9D1 DECREMENT BYTE COUNT
0373 F93F 26 F5                      BNE  ELOOP   ; CONTINUE TIL 16 HEX BYTES PRINTED
0374                         *
0375                         * PRINT 16 ASCII CHARACTERS
0376                         * IF NOT PRINTABLE OR NOT VALID
0377                         * ASCII PRINT A PERIOD (.)
0378 F941 17 03 86                   LBSR OUT2S   ; 2 SPACES
0379 F944 AE E1                      LDX  ,S++    ; GET LOW LIMIT FRM STACK - ADJ STACK
0380 F946 C6 10                      LDB  #$10    ; SET ASCII CHAR TO PRINT = 16
0381 F948 A6 80              EDPASC  LDA  ,X+     ; GET CHARACTER FROM MEMORY
0382 F94A 81 20                      CMPA #$20    ; IF LESS THAN $20, NON-PRINTABLE?
0383 F94C 25 04                      BCS  PERIOD  ; IF SO, PRINT PERIOD INSTEAD
0384 F94E 81 7E                      CMPA #$7E    ; IS IT VALID ASCII?
0385 F950 23 02                      BLS  PRASC   ; IF SO PRINT IT
0386 F952 86 2E              PERIOD  LDA  #'.     ; LOAD A PERIOD (.)
0387 F954 17 03 77           PRASC   LBSR OUTCH   ; PRINT ASCII CHARACTER
0388 F957 5A                         DECB         ; DECREMENT COUNT
0389 F958 26 EE                      BNE  EDPASC
0390 F95A 20 BC                      BRA  NXTLIN
0391                         *
0392                         ***** "B" SET BREAKPOINT *****
0393                         *
0394 F95C 17 02 B7           BRKPNT  LBSR IN1ADR  ; GET BREAKPOINT ADDRESS
0395 F95F 29 1E                      BVS  EXITBP  ; EXIT IF INVALID HEX ADDR.
0396 F961 8C DF C0                   CMPX #STACK  ; ADDRESS ILLEGAL IF >=$DFC0
0397 F964 24 1A                      BCC  BPERR   ; IF ERROR PRINT (?), EXIT
0398 F966 34 10                      PSHS X       ; $FA82 PUSH BP ADDRESS ON STACK
0399 F968 8E FF FF                   LDX  #$FFFF  ; LOAD DUMMY ADDR TO TEST BP TABLE
0400 F96B 8D 55                      BSR BPTEST   ; TEST BP TABLE FOR FREE SPACE
0401 F96D 35 10                      PULS X       ; POP BP ADDRESS FROM STACK
0402 F96F 27 0F                      BEQ  BPERR   ; (Z) SET, OUT OF BP TABLE SPACE
0403 F971 A6 84                      LDA  ,X      ; GET DATA AT BREAKPOINT ADDRESS
0404 F973 81 3F                      CMPA #$3F    ; IS IT A SWI?
0405 F975 27 09                      BEQ  BPERR   ; IF SWI ALREADY, INDICATE ERROR
0406 F977 A7 A0                      STA  ,Y+     ; SAVE DATA BYTE IN BP TABLE
0407 F979 AF A4                      STX  ,Y      ; SAVE BP ADDRESS IN BP TABLE
0408 F97B 86 3F                      LDA  #$3F    ; LOAD A SWI ($3F)
0409 F97D A7 84                      STA  ,X      ; SAVE SWI AT BREAKPOINT ADDRESS
0410 F97F 39                 EXITBP  RTS ;
0411                         *
0412                         *  INDICATE ERROR SETTING BREAKPOINT
0413                         *
0414 F980 17 03 49           BPERR   LBSR OUT1S   ; OUTPUT SPACE
0415 F983 86 3F                      LDA  #'?     ; LOAD (?), INDICATE BREAKPOINT ERROR
0416 F985 16 03 46                   LBRA OUTCH   ; PRINT "?"
0417                         *
0418                         *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0419                         *
0420 F988 10 8E DF E3        XBKPNT  LDY  #BPTBL  ; POINT TO BREAKPOINT TABLE
0421 F98C C6 08                      LDB  #8      ; LOAD BREAKPOINT COUNTER
0422 F98E 8D 18              XBPLP   BSR  RPLSWI  ; REMOVE USED ENTRY IN BP TABLE
0423 F990 5A                         DECB  $FAAC  ; DECREMENT BP COUNTER
0424 F991 26 FB                      BNE  XBPLP   ; END OF BREAKPOINT TABLE?
0425 F993 39                         RTS
0426                         *
0427                         ***** SWI ENTRY POINT *****
0428                         *
0429 F994 1F 43              SWIE    TFR  S,U     ; TRANSFER STACK TO USER POINTER
0430 F996 AE 4A                      LDX  10,U    ; LOAD PC FROM STACK INTO X-REG
0431 F998 30 1F                      LEAX -1,X    ; ADJUST ADDR DOWN 1 BYTE.
0432 F99A 8D 26                      BSR  BPTEST  ; FIND BREAKPOINT IN BP TABLE
0433 F99C 27 04                      BEQ  REGPR   ; IF FOUND, REPLACE DATA AT BP ADDR
0434 F99E AF 4A                      STX  10,U    ; SAVE BREAKPOINT ADDR IN STACK
0435 F9A0 8D 06                      BSR  RPLSWI  ; GO REPLACE SWI WITH ORIGINAL DATA
0436 F9A2 17 02 48           REGPR   LBSR REGSTR  ; GO PRINT REGISTERS
0437                         *
0438                                 IFD TRAOPT
0439                                 LDX #0
0440                                 STX TRACNT
0441                                 ENDIF TRAOPT
0441                                 ENDIF TRAOPT
0442                         *
0443 F9A5 16 FE B9                   LBRA NEXTCMD ; GET NEXT COMMAND
0444                         *
0445 F9A8 AE 21              RPLSWI  LDX  1,Y     ; LOAD BP ADDRESS FROM BP TABLE
0446 F9AA 8C DF C0                   CMPX #STACK  ; COMPARE TO TOP AVAILABLE USER MEMORY
0447 F9AD 24 0A                      BCC  FFSTBL  ; GO RESET TABLE ENTRY TO $FF'S
0448 F9AF A6 84                      LDA  ,X      ; GET DATA FROM BP ADDRESS
0449 F9B1 81 3F                      CMPA #$3F    ; IS IT SWI?
0450 F9B3 26 04                      BNE  FFSTBL  ; IF NOT, RESET TABLE ENTRY TO $FF'S
0451 F9B5 A6 A4                      LDA  ,Y      ; GET ORIGINAL DATA FROM BP TABLE
0452 F9B7 A7 84                      STA  ,X      ; $FAD3 RESTORE DATA AT BP ADDRESS
0453 F9B9 86 FF              FFSTBL  LDA  #$FF    ; LOAD $FF IN A-ACC
0454 F9BB A7 A0                      STA  ,Y+     ; RESET BREAKPOINT TABLE DATA TO $FF'S
0455 F9BD A7 A0                      STA  ,Y+     ; RESET BREAKPOINT TABLE ADDR TO $FF'S
0456 F9BF A7 A0                      STA  ,Y+
0457 F9C1 39                         RTS
0458                         *
0459                         ** SEARCH BREAKPOINT TABLE FOR MATCH **
0460                         *
0461 F9C2 10 8E DF E3        BPTEST  LDY  #BPTBL  ; POINT TO BREAKPOINT TABLE
0462 F9C6 C6 08                      LDB  #8      ; LOAD BREAKPOINT COUNTER
0463 F9C8 A6 A0              FNDBP   LDA  ,Y+     ; LOAD DATA BYTE
0464 F9CA AC A1                      CMPX ,Y++    ; COMPARE ADDRESS, IS IT SAME?
0465 F9CC 27 04                      BEQ  BPADJ   ; IF SO, ADJUST POINTER FOR TABLE ENTRY
0466 F9CE 5A                         DECB         ; IF NOT, DECREMENT BREAKPOINT COUNTER
0467 F9CF 26 F7                      BNE  FNDBP   ; AND LOOK FOR NEXT POSSIBLE MATCH
0468 F9D1 39                         RTS          ;
0469                         *
0470                         *
0471 F9D2 31 3D              BPADJ   LEAY -3,Y    ; MOVE POINTER TO BEGIN OF BP ENTRY
0472 F9D4 39                         RTS
0473                         *
0474                                 IFD TRAOPT
0475                         *
0476                         ** TRACE from address AAAA BB bytes
0477                         *
0478                         TRACE   LBSR ALTPC1  ; SET UP NEW PC
0479                                 BVS  TREXIT  ; ADDRESS ERROR, EXIT
0480                                 LBSR OUT1S
0481                                 LBSR IN1ADR  ; Fetch Byte Count
0482                                 BVS TREXIT   ; Byte Count error, EXIT
0483                                 STX TRACNT
0484                         *
0485                                 LDX NMI      ; Save NMI Vector
0486                                 STX NMISAV
0487                                 LDX #NMIE    ; Set up NMI for Tracing
0488                                 STX NMI
0489                                 LBSR TRAINZ  ; Initialise Hardware
0490                                 BRA TRACEG   ; Start Trace
0491                         TREXIT  RTS
0492                         *
0493                         * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0494                         * CRA1 = 1 CA1 Rising edge IRQ
0495                         * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0496                         * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0497                         * CRA4 = 1 ] CA2 = Set/Reset output
0498                         * CRA5 = 1 ]
0499                         * CRA6 = X CA2 Input Interrupt Flag
0500                         * CRA7 = X CA1 Interrupt Flag
0501                         *
0502                         * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0503                         * CRB1 = 1 CB1 Rising edge IRQ
0504                         * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0505                         * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0506                         * CRB4 = 1 ] CB2 = Set/Reset output
0507                         * CRB5 = 1 ]
0508                         * CRB6 = X CB2 Input Interrupt Flag
0509                         * CRB7 = X CB1 Interrupt Flag
0510                         *
0511                         *
0512                         ** TRACE NMI ENTRY POINT
0513                         *
0514                         NMIE    TFR  S,U
0515                                 LDA  #$36    ; Disable Interrupt, CA2 Low
0516                                 STA  TACTRL
0517                                 LDA  TADATA  ; Clear Interrupt flag by reading data port
0518                         *
0519                                 LBSR REGSTR  ; DUMP REGISTERS
0520                         *
0521                                 LDX  10,U    ; TEST IF NEXT INSTRUCTION IS A SWI
0522                                 LDA  ,X
0523                                 CMPA #$3F
0524                                 BEQ  TRACEX  ; EXIT ON SWI
0525                         *
0526                                 LDX  TRACNT  ; CHECK IF TRACE COUNT EXPIRED
0527                                 BEQ  TRACEX  ; YES, GO BACK TO THE MONITOR
0528                                 LEAX -1,X    ; ECREMENT TRACE COUNT
0529                                 STX  TRACNT
0530                         *
0531                         **  TRACE GO (RESUME SINGLE STEP)
0532                         *
0533                         TRACEG  TFR  U,S     ; SET UP PROGRAM STACK POINTER
0534                                 LDA  #TRADEL ; SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0535                                 STA  TADATA
0536                                 LDA  #$36    ; LOAD STROBE LOW
0537                                 STA  TACTRL
0538                                 LDA  TADATA  ; CLEAR INTERRUPT
0539                                 LDA  #$36    ; RELEASE RESET
0540                                 STA  TBCTRL
0541                                 LDA  #$3F    ; RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0542                                 STA  TACTRL
0543                                 RTI          ; GO EXECUTE INSTRUCTION
0544                         *
0545                         TRACEX  LDX NMISAV   ; Restore NMI vector
0546                                 STX NMI
0547                                 LBRA NEXTCMD ; Jump back to the command loop.
0548                         *
0549                         ** TRACE HARDWARE INITIALISATION
0550                         *
0551                         TRAINZ  LDA #$32     ; SELECT DDRA, CA2 LOW, NMI DISABLED
0552                                 STA TACTRL
0553                                 LDA #$3A     ; SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0554                                 STA TBCTRL
0555                                 LDA #$FF     ; PORTA = OUTPUT
0556                                 STA TADATA
0557                                 LDA #$00     ; PORTB = INPUT
0558                                 STA TBDATA
0559                                 LDA #$36     ; SELECT OUTPUT REGISTER A, CA2 LOW
0560                                 STA TACTRL
0561                                 LDA #$3E     ; SELECT OUTPUT REGISTER B, CB2 HIGH
0562                                 STA TBCTRL
0563                                 RTS
0564                         *
0565                                 ENDIF TRAOPT
0565                                 ENDIF TRAOPT
0566                                 IFD  MFDCOPT
0567                         *
0568                         ** "U" MINI DISK BOOT
0569                         *
0570                         MINBOOT TST  CMDFDC
0571                                 CLR  DRVFDC
0572                                 LDX  #$0000
0573                         LOOP    LEAX $01,X
0574                                 CMPX #$0000
0575                                 BNE  LOOP
0576                                 LDA  #$0F
0577                                 STA  CMDFDC
0578                                 BSR  DELAY
0579                         LOOP1   LDB  CMDFDC
0580                                 BITB #$01
0581                                 BNE  LOOP1
0582                                 LDA  #$01
0583                                 STA  SECFDC
0584                                 BSR  DELAY
0585                                 LDA  #$8C
0586                                 STA  CMDFDC
0587                                 BSR  DELAY
0588                                 LDX  #$C000
0589                                 BRA  LOOP3
0590                         LOOP2   BITB #$02
0591                                 BEQ  LOOP3
0592                                 LDA  DATFDC
0593                                 STA ,X+
0594                         LOOP3   LDB  CMDFDC
0595                                 BITB #$01
0596                                 BNE  LOOP2
0597                                 BITB #$2C
0598                                 BEQ  LOOP4
0599                                 RTS
0600                         *
0601                         LOOP4   LDX  #$C000
0602                                 STX  $0A,U
0603                                 TFR  U,S
0604                                 RTI
0605                         *
0606                         DELAY   LDB  #$04
0607                         LOOP5   DECB
0608                                 BNE  LOOP5
0609                                 RTS
0610                                 ENDIF MFDCOPT
0610                                 ENDIF MFDCOPT
0611                         *
0612                                 IFD  DMAFOPT
0613                         *
0614                         *** "D" DISK BOOT FOR DMAF2 ***
0615                         *
0616                         DBOOT   LDA  #$DE
0617                                 STA  DRVREG
0618                                 LDA  #$FF
0619                                 STA  PRIREG  ; $FAF8
0620                                 STA  CCREG
0621                                 STA  AAAREG
0622                                 STA  BBBREG
0623                                 TST  CCREG
0624                                 LDA  #$D8
0625                                 STA  COMREG
0626                                 LBSR DLY
0627                         DBOOT0  LDA  COMREG
0628                                 BMI  DBOOT0
0629                                 LDA  #$09
0630                                 STA  COMREG
0631                                 LBSR DLY
0632                         *
0633                         DISKWT  LDA  COMREG  ; FETCH DRIVE STATUS
0634                                 BITA #1      ; TEST BUSY BIT
0635                                 BNE  DISKWT  ; LOOP UNTIL NOT BUSY
0636                         *
0637                                 BITA #$10
0638                                 BNE  DBOOT
0639                         *
0640                                 LDX  #$C000  ; LOGICAL ADDR. = $C000
0641                                 BSR LRA      ; GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0642                                 ORA  #$10
0643                                 STA  CCCREG
0644                                 TFR  X,D
0645                                 COMA  ;
0646                                 COMB  ;
0647                                 STD  ADDREG
0648                                 LDX  #$FEFF  ; LOAD DMA BYTE COUNT = $100
0649                                 STX  CNTREG  ; STORE IN COUNT REGISTER
0650                                 LDA  #$FF    ; LOAD THE CHANNEL REGISTER
0651                                 STA  CCREG
0652                                 LDA  #$FE    ; SET CHANNEL 0
0653                                 STA  PRIREG
0654                                 LDA  #1      ; SET SECTOR TO "1"
0655                                 STA  SECREG  ; ISSUE COMMAND
0656                                 LDA  #$8C    ; SET SINGLE SECTOR READ
0657                                 STA  COMREG  ; ISSUE COMMAND
0658                                 BSR  DLY
0659                         *
0660                         * THE FOLLOWING CODE TESTS THE STATUS OF THE
0661                         * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0662                         * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0663                         * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0664                         * IS STILL A ONE THE BOOT OPERATION WILL
0665                         * BE STARTED OVER FROM THE BEGINING.
0666                         *
0667                                 CLRB         ;
0668                         DBOOT1  PSHS B       ; $FB55
0669                                 CLRB         ;
0670                         DBOOT2  TST  CCREG
0671                                 BPL  DBOOT3
0672                                 DECB  ;
0673                                 BNE  DBOOT2
0674                                 PULS B
0675                                 DECB
0676                                 BNE  DBOOT1
0677                                 BRA  DBOOT
0678                         DBOOT3  PULS B
0679                                 LDA  COMREG
0680                                 BITA #$1C
0681                                 BEQ  DBOOT4
0682                                 RTS  ;
0683                         *
0684                         *
0685                         DBOOT4  LDB  #$DE
0686                                 STB  DRVREG
0687                                 LDX  #$C000
0688                                 STX  10,U
0689                                 TFR  U,S     ; $FB7B
0690                                 RTI  ;
0691                                 ENDIF DMAFOPT
0691                                 ENDIF DMAFOPT
0692                         *
0693                                 IFD CF8OPT
0694                         *
0695                         * COMPACT FLASH BOOT
0696                         *
0697 F9D5 8D 40              CFBOOT  BSR  WAITRDY
0698 F9D7 86 E0                      LDA  #HEADLBA
0699 F9D9 B7 E0 46                   STA  CF_HEAD
0700 F9DC 8D 39                      BSR  WAITRDY
0701 F9DE 86 01                      LDA  #FEAT8BIT
0702 F9E0 B7 E0 41                   STA  CF_FEATURE
0703 F9E3 86 EF                      LDA  #CMDFEATURE
0704 F9E5 B7 E0 47                   STA  CF_COMAND
0705 F9E8 8D 2D                      BSR  WAITRDY
0706                         *
0707                         * READ SECTORS FROM CF
0708                         *
0709 F9EA 86 01              CFREAD  LDA  #$01
0710 F9EC B7 E0 42                   STA  CF_SECCNT
0711 F9EF 4F                         CLRA
0712 F9F0 B7 E0 43                   STA  CF_SECNUM
0713 F9F3 B7 E0 44                   STA  CF_CYLLO
0714 F9F6 B7 E0 45                   STA  CF_CYLHI
0715                         *
0716 F9F9 86 20                      LDA  #CMDREAD ; IDE READ MULTIPLE
0717 F9FB B7 E0 47                   STA  CF_COMAND
0718 F9FE 8D 17                      BSR  WAITRDY
0719 FA00 8E C0 00                   LDX  #$C000
0720                         *
0721                         * READ LOOP
0722                         *
0723 FA03 8D 21              RDLOOP  BSR  WAITDRQ
0724 FA05 B6 E0 40                   LDA  CF_DATA
0725 FA08 A7 80                      STA  ,X+
0726 FA0A 8C C2 00                   CMPX #$C200
0727 FA0D 26 F4                      BNE  RDLOOP
0728                         *
0729 FA0F 8E C0 00                   LDX  #$C000
0730 FA12 AF 4A                      STX  $0A,U
0731 FA14 1F 34                      TFR  U,S
0732 FA16 3B                         RTI
0733                         *
0734                         * WAIT UNTIL READY
0735                         *
0736 FA17 B6 E0 47           WAITRDY LDA  CF_STATUS
0737 FA1A 85 80                      BITA #BUSY
0738 FA1C 26 F9                      BNE  WAITRDY
0739 FA1E B6 E0 47                   LDA  CF_STATUS
0740 FA21 85 40                      BITA #DRDY
0741 FA23 27 F2                      BEQ  WAITRDY
0742 FA25 39                         RTS
0743                         *
0744                         * WAIT FOR DATA REQUEST
0745                         *
0746 FA26 B6 E0 47           WAITDRQ LDA  CF_STATUS
0747 FA29 85 08                      BITA #DRQ
0748 FA2B 27 F9                      BEQ  WAITDRQ
0749 FA2D 39                         RTS
0750                                 ENDIF CF8OPT
0751                         *
0752                                 IFD IDEOPT
0753                         *
0754                         * XESS 16 BIT IDE BOOT
0755                         *
0756                         IDEBOOT LDD  #AUXRESET
0757                                 STD  CF_AUX
0758                                 LDD #AUXRSTREL
0759                                 STD CF_AUX
0760                                 LDD  #HEADLBA
0761                                 STD  CF_HEAD
0762                                 BSR  WAITRDY
0763                         *
0764                         * READ SECTORS FROM CF
0765                         *
0766                                 LDD  #$01
0767                                 STD  CF_SECCNT
0768                                 CLRB
0769                                 STD  CF_SECNUM
0770                                 STD  CF_CYLLO
0771                                 STD  CF_CYLHI
0772                         *
0773                                 LDB  #CMDREAD ; IDE READ MULTIPLE
0774                                 STD  CF_COMAND
0775                                 BSR  WAITRDY
0776                                 LDX  #$C000
0777                         *
0778                         * READ LOOP
0779                         *
0780                         RDLOOP  BSR  WAITDRQ
0781                                 LDD  CF_DATA
0782                                 STB  ,X+
0783                                 CMPX #$C100
0784                                 BNE  RDLOOP
0785                         *
0786                                 LDX  #$C000
0787                                 STX  $0A,U
0788                                 TFR  U,S
0789                                 RTI
0790                         *
0791                         * WAIT UNTIL READY
0792                         *
0793                         WAITRDY LDD  CF_STATUS
0794                                 BITB #BUSY
0795                                 BNE  WAITRDY
0796                                 LDD  CF_STATUS
0797                                 BITB #DRDY
0798                                 BEQ  WAITRDY
0799                                 RTS
0800                         *
0801                         * WAIT FOR DATA REQUEST
0802                         *
0803                         WAITDRQ LDD  CF_STATUS
0804                                 BITB #DRQ
0805                                 BEQ  WAITDRQ
0806                                 RTS
0807                                 ENDIF IDEOPT
0807                                 ENDIF IDEOPT
0808                         *
0809                                 IFD RTCOPT
0810                         *
0811                         * CLOCK INTER FACE UTILITY
0812                         *
0813                         * TIME <Hours> <Minuits> <Seconds>
0814                         * If no argument is specified, the current time
0815                         * will be displayed.
0816                         *
0817                         * READ A REGISTER FROM THE COUNTER.
0818                         * The X Index rgister points to the register
0819                         * to be read. The Status Register is checked
0820                         * before and after the register is read before
0821                         * returning a value in accumulator A
0822                         *
0823                         RDCLK  TST CLKSTA
0824                                BNE RDCLK
0825                         RDCLK1 LDA 0,X
0826                                TST CLKSTA
0827                                BNE RDCLK1
0828                                RTS
0829                         *
0830                         * MAIN PROGRAM:
0831                         *
0832                         TIMSET LDX #COUNTR    ; POINT TO TIMER
0833                               LBSR BYTE       ; READ HOURS
0834                               BVS  SHOWTM     ; NO ARG, DISP TIME
0835                               STA HOUR,X
0836                               LBSR OUT1S
0837                               LBSR BYTE       ; READ MINUITES
0838                               BVS  SHOWTM
0839                               STA MINUIT,X
0840                               LBSR OUT1S
0841                               LBSR BYTE       ; SECONDS.
0842                               BVS SHOWTM
0843                               STA SECOND,X
0844                         *
0845                         * DISPLAY CURRENT TIME
0846                         *
0847                         SHOWTM LBSR PCRLF
0848                                LDX #COUNTR+HOUR
0849                                LDB #3
0850                         SHOWLP BSR RDCLK
0851                                LBSR OUT2H
0852                                LDA #':
0853                                LBSR OUTCH
0854                                LEAX -1,X
0855                                DECB
0856                                BNE SHOWLP
0857                                RTS
0858                         *
0859                         * INITIATE CLOCK.
0860                         * MASK INTERRUPTS.
0861                         *
0862                         CLKINZ CLR CINTCR     ; MASK ALL INTERRUPTS
0863                                TST CINTSR     ; CLEAR ANY INTERRUPTS
0864                                RTS
0865                                ENDIF RTCOPT
0865                                ENDIF RTCOPT
0866                                IFD DATOPT
0867                         *
0868                         ***** LRA LOAD REAL ADDRESS *****
0869                         *
0870                         * THE FOLLOWING CODE LOADS THE 20-BIT
0871                         * PHYSICAL ADDRESS OF A MEMORY BYTE
0872                         * INTO THE "A" AND "X" REGISTERS. THIS
0873                         * ROUTINE IS ENTERED WITH THE LOGICAL
0874                         * ADDRESS OF A MEMORY BYTE IN THE "IX"
0875                         * REGISTER. EXIT IS MADE WITH THE HIGH-
0876                         * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
0877                         * ADDRESS IN THE "A" REGISTER, AND THE
0878                         * LOW-ORDER 16-BITS OF THE 20-BIT
0879                         * PHYSICAL ADDRESS IN THE "IX" REGISTER.
0880                         * ALL OTHER REGISTERS ARE PRESERVED.
0881                         * THIS ROUTINE IS REQUIRED SINCE THE
0882                         * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
0883                         * PRESENT PHYSICAL ADDRESSES ON THE
0884                         * SYSTEM BUS.
0885                         *
0886 FA2E 34 36              LRA     PSHS A,B,X,Y  ; PUSH REGISTERS ON STACK
0887 FA30 A6 62                      LDA  2,S      ; GET MSB LOGICAL ADDR FRM X REG ON STACK
0888 FA32 44                         LSRA          ;
0889 FA33 44                         LSRA          ; ADJ FOR INDEXED INTO
0890 FA34 44                         LSRA          ; CORRESPONDING LOCATION
0891 FA35 44                         LSRA          ; IN LRA TABLE
0892 FA36 10 8E DF D0                LDY  #LRARAM  ; LOAD LRA TABLE BASE ADDRESS
0893 FA3A E6 A6                      LDB  A,Y      ; GET PHYSICAL ADDR. DATA FROM LRA TABLE
0894 FA3C 54                         LSRB          ; ADJ. REAL ADDR. TO REFLECT EXTENDED
0895 FA3D 54                         LSRB          ; PHYSICAL ADDRESS.
0896 FA3E 54                         LSRB          ; EXTENDED MS 4-BITS ARE RETURNED
0897 FA3F 54                         LSRB          ; IN THE "A" ACCUMULATOR
0898 FA40 E7 E4                      STB  ,S       ; MS 4 BITS IN A ACCUM. STORED ON STACK
0899 FA42 E6 A6                      LDB  A,Y      ; LOAD REAL ADDRESS DATA FROM LRA TABLE
0900 FA44 53                         COMB          ; COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
0901 FA45 58                         ASLB          ; ADJ DATA FOR RELOCATION IN X REG
0902 FA46 58                         ASLB          ;
0903 FA47 58                         ASLB          ; $FB97
0904 FA48 58                         ASLB          ;
0905 FA49 A6 62                      LDA  2,S      ; GET MS BYTE OF LOGICAL ADDR.
0906 FA4B 84 0F                      ANDA #$0F     ; MASK MS NIBBLE OF LOGICAL ADDRESS
0907 FA4D A7 62                      STA  2,S      ; SAVE IT IN X REG ON STACK
0908 FA4F EA 62                      ORB  2,S      ; SET MS BYTE IN X REG TO ADJ PHY ADDR.
0909                         *
0910                         * PLUS LS NIBBLE OF LOGICAL ADDRESS
0911                         *
0912 FA51 E7 62                      STB  2,S      ; SAVE AS LS 16 BITS OF PHY ADDR IN X REG ON STACK
0913 FA53 35 B6                      PULS A,B,X,Y,PC ; POP REGS. FROM STACK
0914                                 ENDIF DATOPT
0915                         *
0916                         * DELAY LOOP
0917                         *
0918 FA55 34 04              DLY     PSHS B        ; SAVE CONTENTS OF "B"
0919 FA57 C6 20                      LDB  #$20     ; GET LOOP DELAY VALUE
0920 FA59 5A                 SUB1    DECB          ; SUBTRACT ONE FROM VALUE
0921 FA5A 26 FD                      BNE  SUB1     ; LOOP UNTIL ZERO
0922 FA5C 35 84                      PULS B,PC     ; RESTORE CONTENTS OF "B"
0923                         * RTS  ;
0924                         *
0925                         ***** "L" LOAD MIKBUG TAPE *****
0926                         *
0927 FA5E BD FC E7           LOAD    JSR  ACINIZ
0928 FA61 86 11                      LDA  #$11     ; LOAD 'DC1' CASS. READ ON CODE
0929 FA63 17 02 68                   LBSR OUTCH    ; OUTPUT IT TO TERMINAL PORT
0930 FA66 7F DF E2                   CLR  ECHO     ; TURN OFF ECHO FLAG
0931 FA69 17 02 2A           LOAD1   LBSR ECHON    ; INPUT 8 BIT BYTE WITH NO ECHO
0932 FA6C 81 53              LOAD2   CMPA #'S      ; IS IT AN "S", START CHARACTER ?
0933 FA6E 26 F9                      BNE  LOAD1    ; IF NOT, DISCARD AND GET NEXT CHAR.
0934 FA70 17 02 23                   LBSR ECHON
0935 FA73 81 39                      CMPA #'9      ; IS IT A "9" , END OF FILE CHAR ?
0936 FA75 27 3D                      BEQ  LOAD21   ; IF SO, EXIT LOAD
0937 FA77 81 31                      CMPA #'1      ; IS IT A "1" , FILE LOAD CHAR ?
0938 FA79 26 F1                      BNE  LOAD2    ; IF NOT, LOOK FOR START CHAR.
0939 FA7B 17 01 A8                   LBSR BYTE     ; INPUT BYTE COUNT
0940 FA7E 34 02                      PSHS A        ; PUSH COUNT ON STACK
0941 FA80 29 26                      BVS  LODERR   ; (V) C-CODE SET, ILLEGAL HEX
0942 FA82 17 01 91                   LBSR IN1ADR   ; INPUT LOAD ADDRESS
0943 FA85 29 21                      BVS  LODERR   ; (V) C-CODE SET, ADDR NOT HEX
0944 FA87 34 10                      PSHS X        ; PUSH ADDR ON STACK
0945 FA89 E6 E0                      LDB  ,S+      ; LOAD MSB OF ADDR AS CHECKSUM BYTE
0946 FA8B EB E0                      ADDB ,S+      ; ADD LSB OF ADDR TO CHECKSUM
0947 FA8D EB E4                      ADDB ,S       ; ADD BYTE COUNT BYTE TO CHECKSUM
0948 FA8F 6A E4                      DEC  ,S       ; $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
0949 FA91 6A E4                      DEC  ,S       ; ADDRESS BYTES.
0950 FA93 34 04              LOAD10  PSHS B        ; PUSH CHECKSUM ON STACK
0951 FA95 17 01 8E                   LBSR BYTE     ; INPUT DATA BYTE (2 HEX CHAR)
0952 FA98 35 04                      PULS B        ; POP CHECKSUM FROM STACK
0953 FA9A 29 0C                      BVS  LODERR   ; (V) SET, DATA BYTE NOT HEX
0954 FA9C 34 02                      PSHS A        ; PUSH DATA BYTE ON STACK
0955 FA9E EB E0                      ADDB ,S+      ; ADD DATA TO CHECKSUM, AUTO INC STACK
0956 FAA0 6A E4                      DEC  ,S       ; DECREMENT BYTE COUNT 1
0957 FAA2 27 05                      BEQ  LOAD16   ; IF BYTE COUNT ZERO, TEST CHECKSUM
0958 FAA4 A7 80                      STA  ,X+      ; SAVE DATA BYTE IN MEMORY
0959 FAA6 20 EB                      BRA  LOAD10   ; GET NEXT DATA BYTE
0960 FAA8 5F                 LODERR  CLRB          ; ERROR CONDITION, ZERO CHECKSUM  ;
0961 FAA9 35 02              LOAD16  PULS A        ; ADJUST STACK (REMOVE BYTE COUNT)
0962 FAAB C1 FF                      CMPB #$FF     ; CHECKSUM OK?
0963 FAAD 27 BA                      BEQ  LOAD1    ; IF SO, LOAD NEXT LINE
0964 FAAF 86 3F                      LDA  #'?      ; LOAD (?) ERROR INDICATOR
0965 FAB1 17 02 1A                   LBSR OUTCH    ; OUTPUT IT TO TERMINAL
0966 FAB4 73 DF E2           LOAD21  COM  ECHO     ; TURN ECHO ON
0967 FAB7 86 13                      LDA  #$13     ; $FC5F LOAD 'DC3' CASS. READ OFF CODE
0968 FAB9 16 02 12                   LBRA OUTCH    ; OUTPUT IT
0969                         *
0970                         ***** "P" PUNCH MIKBUG TAPE *****
0971                         *
0972 FABC 6F E2              PUNCH   CLR  ,-S      ; CLEAR RESERVED BYTE ON STACK
0973 FABE 17 01 4A                   LBSR IN2ADR   ; GET BEGIN AND END ADDRESS
0974 FAC1 34 30                      PSHS X,Y      ; SAVE ADDRESSES ON STACK
0975 FAC3 29 4D                      BVS  PUNEXT   ; (V) C-CODE SET, EXIT PUNCH
0976 FAC5 AC 62                      CMPX 2,S      ; COMPARE BEGIN TO END ADDR
0977 FAC7 25 49                      BCS  PUNEXT   ; IF BEGIN GREATER THAN END, EXIT PUNCH
0978 FAC9 30 01                      LEAX 1,X      ; INCREMENT END ADDRESS
0979 FACB AF E4                      STX  ,S       ; STORE END ADDR ON STACK
0980 FACD BD FC E7                   JSR  ACINIZ
0981 FAD0 86 12                      LDA  #$12     ; LOAD 'DC2' PUNCH ON CODE
0982 FAD2 17 01 F9                   LBSR OUTCH    ; OUTPUT IT TO TERMINAL
0983 FAD5 EC E4              PUNCH2  LDD  ,S       ; LOAD END ADDR IN D-ACC
0984 FAD7 A3 62                      SUBD 2,S      ; SUBTRACT BEGIN FROM END
0985 FAD9 27 06                      BEQ  PUNCH3   ; SAME, PUNCH 32 BYTES DEFAULT
0986 FADB 10 83 00 20                CMPD #$20     ; LESS THAN 32 BYTES?
0987 FADF 23 02                      BLS  PUNCH4   ; PUNCH THAT MANY BYTES
0988 FAE1 C6 20              PUNCH3  LDB  #$20     ; LOAD BYTE COUNT OF 32.
0989 FAE3 E7 64              PUNCH4  STB  4,S      ; STORE ON STACK AS BYTE COUNT
0990 FAE5 8E FE E2                   LDX  #MSG20   ; POINT TO MSG "S1"
0991 FAE8 17 00 2F                   LBSR PSTRNG   ; PRINT MSG
0992 FAEB CB 03                      ADDB #3       ; ADD 3 BYTES TO BYTE COUNT
0993 FAED 1F 98                      TFR  B,A      ; GET BYTE COUNT IN A-ACC TO PUNCH
0994 FAEF 17 01 75                   LBSR OUT2H    ; OUTPUT BYTE COUNT
0995 FAF2 AE 62                      LDX  2,S      ; LOAD BEGIN ADDRESS
0996 FAF4 17 01 68                   LBSR OUT4H    ; PUNCH ADDRESS
0997 FAF7 EB 62                      ADDB 2,S      ; ADD ADDR MSB TO CHECKSUM
0998 FAF9 EB 63                      ADDB 3,S      ; ADD ADDR LSB TO CHECKSUM
0999 FAFB EB 84              PUNCHL  ADDB ,X       ; ADD DATA BYTE TO CHECKSUM
1000 FAFD A6 80                      LDA  ,X+      ; LOAD DATA BYTE TO PUNCH
1001 FAFF 17 01 65                   LBSR OUT2H    ; OUTPUT DATA BYTE
1002 FB02 6A 64                      DEC  4,S      ; DECREMENT BYTE COUNT
1003 FB04 26 F5                      BNE  PUNCHL   ; NOT DONE, PUNCH NEXT BYTE
1004 FB06 53                         COMB  1's     ; COMPLIMENT CHECKSUM BYTE
1005 FB07 1F 98                      TFR  B,A      ; GET IT IN A-ACC TO PUNCH
1006 FB09 17 01 5B                   LBSR OUT2H    ; OUTPUT CHECKSUM BYTE
1007 FB0C AF 62                      STX  2,S      ; SAVE X-REG IN STACK AS NEW PUNCH ADDR
1008 FB0E AC E4                      CMPX ,S       ; COMPARE IT TO END ADDR
1009 FB10 26 C3                      BNE  PUNCH2   ; $FCB5 PUNCH NOT DONE, CONT.
1010 FB12 86 14              PUNEXT  LDA  #$14     ; LOAD 'DC4' PUNCH OFF CODE
1011 FB14 17 01 B7                   LBSR OUTCH    ; OUTPUT IT
1012 FB17 32 65                      LEAS 5,S      ; READJUST STACK POINTER
1013 FB19 39                         RTS  ;
1014                         *
1015                         * PRINT STRING PRECEEDED BY A CR & LF.
1016                         *
1017 FB1A 8D 02              PSTRNG  BSR  PCRLF    ; PRINT CR/LF
1018 FB1C 20 71                      BRA  PDATA    ; PRINT STRING POINTED TO BY IX
1019                         *
1020                         * PCRLF
1021                         *
1022 FB1E 34 10              PCRLF   PSHS X        ; SAVE IX
1023 FB20 8E FE 93                   LDX  #MSG2+1  ; POINT TO MSG CR/LF + 3 NULS
1024 FB23 17 00 69                   LBSR PDATA    ; PRINT MSG
1025 FB26 35 90                      PULS X,PC     ; RESTORE IX & RETURN
1026                         *
1027                         * LONG BRANCHES TO COMMON ROUTINES
1028                         *
1029 FB28 16 01 A1           JOUT1S  LBRA OUT1S
1030 FB2B 16 00 F8           JBYTE   LBRA BYTE
1031 FB2E 16 00 E5           JIN1ADR LBRA IN1ADR
1032                         *
1033                         * ALTER "PC" PROGRAM COUNTER
1034                         *
1035 FB31 17 00 91           ALTRPC  LBSR  PRTPC   ; $FCF5 PRINT MSG " PC = "
1036 FB34 8D F2              ALTPC1  BSR  JOUT1S   ; OUTPUT SPACE
1037 FB36 8D F6                      BSR  JIN1ADR  ; GET NEW CONTENTS FOR "PC"
1038 FB38 29 02                      BVS  ALTPCD   ; EXIT IF INVALID HEX
1039 FB3A AF 4A                      STX  10,U     ; POKE IN NEW CONTENTS
1040 FB3C 39                 ALTPCD  RTS           ;
1041                         *
1042                         * ALTER "U" USER STACK POINTER
1043                         *
1044 FB3D 8D 61              ALTRU   BSR  PRTUS    ; $FCCA PRINT MSG " US = "
1045 FB3F 8D E7                      BSR  JOUT1S   ; OUTPUT SPACE
1046 FB41 8D EB                      BSR  JIN1ADR  ; GET NEW CONTENTS FOR "US"
1047 FB43 29 02                      BVS  ALTUD    ; EXIT IF INVALID HEX
1048 FB45 AF 48                      STX  8,U      ; POKE IN NEW CONTENTS
1049 FB47 39                 ALTUD   RTS           ;
1050                         *
1051                         * ALTER "Y" INDEX REGISTER
1052                         *
1053 FB48 8D 72              ALTRY   BSR  PRTIY    ; PRINT MSG " IY = "
1054 FB4A 8D DC                      BSR  JOUT1S   ; OUTPUT SPACE
1055 FB4C 8D E0                      BSR  JIN1ADR  ; GET NEW CONTENTS FOR "IY"
1056 FB4E 29 02                      BVS  ALTYD    ; EXIT IF INVALID HEX
1057 FB50 AF 46                      STX  6,U      ; $F8F0 POKE IN NEW CONTENTS
1058 FB52 39                 ALTYD   RTS           ;
1059                         *
1060                         * ALTER "X" INDEX REGISTER
1061                         *
1062 FB53 8D 5E              ALTRX   BSR  PRTIX    ; $FCE0 PRINT MSG " IX = "
1063 FB55 8D D1                      BSR  JOUT1S   ; OUTPUT SPACE
1064 FB57 8D D5                      BSR  JIN1ADR
1065 FB59 29 02                      BVS  ALTXD
1066 FB5B AF 44                      STX  4,U
1067 FB5D 39                 ALTXD   RTS ;
1068                         *
1069                         * ALTER "DP" DIRECT PAGE REGISTER
1070                         *
1071 FB5E 8D 49              ALTRDP  BSR  PRTDP    ; $FCD5 PRINT MSG " DP = "
1072 FB60 8D C6                      BSR  JOUT1S   ; OUTPUT SPACE
1073 FB62 8D C7                      BSR  JBYTE    ; INPUT BYTE (2 HEX CHAR)
1074 FB64 29 02                      BVS  ALTDPD
1075 FB66 A7 43                      STA  3,U
1076 FB68 39                 ALTDPD  RTS ;
1077                         *
1078                         * ALTER "B" ACCUMULATOR
1079                         *
1080 FB69 8D 6C              ALTRB   BSR  PRTB     ; $FD09 PRINT MSG " B = "
1081 FB6B 8D BB                      BSR  JOUT1S   ; OUTPUT SPACE
1082 FB6D 8D BC                      BSR  JBYTE    ; INPUT BYTE (2 HEX CHAR)
1083 FB6F 29 02                      BVS  ALTBD
1084 FB71 A7 42                      STA  2,U
1085 FB73 39                 ALTBD   RTS           ; $F91C
1086                         *
1087                         * ALTER "A" ACCUMULATOR
1088                         *
1089 FB74 8D 58              ALTRA   BSR  PRTA     ; $FCFF RINT MSG " A = "
1090 FB76 8D B0                      BSR  JOUT1S   ; OUTPUT SPACE
1091 FB78 8D B1                      BSR  JBYTE    ; INPUT BYTE (2 HEX CHAR)
1092 FB7A 29 02                      BVS  ALTAD
1093 FB7C A7 41                      STA  1,U
1094 FB7E 39                 ALTAD   RTS ;
1095                         *
1096                         * ALTER "CC" REGISTER
1097                         *
1098 FB7F 8D 5F              ALTRCC  BSR  PRTCC    ; $FD13 PRINT MSG " CC: "
1099 FB81 8D A5                      BSR  JOUT1S   ; OUTPUT SPACE
1100 FB83 8D A6                      BSR  JBYTE    ; INPUT BYTE (2 HEX CHAR)
1101 FB85 29 04                      BVS  ALTCCD
1102 FB87 8A 80                      ORA  #$80     ; SETS "E" FLAG IN PRINT LIST
1103 FB89 A7 C4                      STA  ,U
1104 FB8B 39                 ALTCCD  RTS ;
1105                         *
1106                         * PDATA
1107                         *
1108 FB8C 17 01 3F           PRINT   LBSR OUTCH
1109 FB8F A6 80              PDATA   LDA  ,X+      ; GET 1st CHAR. TO PRINT
1110 FB91 81 04                      CMPA #4       ; IS IT EOT?
1111 FB93 26 F7                      BNE  PRINT    ; IF NOT EOT PRINT IT
1112 FB95 39                         RTS  ;
1113                         *
1114                         * PRINT REGISTERS
1115                         *
1116 FB96 8E FE A5           PRTSP   LDX  #MSG10   ; POINT TO MSG "SP="
1117 FB99 8D F4                      BSR  PDATA    ; PRINT MSG
1118 FB9B 1F 31                      TFR  U,X
1119 FB9D 16 00 BF           JOUT4H  LBRA OUT4H
1120                         *
1121 FBA0 8E FE B1           PRTUS   LDX  #MSG12   ; POINT TO MSG "US="
1122 FBA3 8D EA                      BSR  PDATA    ; PRINT MSG
1123 FBA5 AE 48                      LDX  8,U
1124 FBA7 20 F4                      BRA  JOUT4H
1125                         *
1126 FBA9 8E FE C3           PRTDP   LDX   #MSG15  ; POINT TO MSG "DP="
1127 FBAC 8D E1                      BSR  PDATA    ; PRINT MSG
1128 FBAE A6 43                      LDA  3,U
1129 FBB0 16 00 B4           JOUT2H  LBRA OUT2H    ; OUTPUT HEX BYTE AS ASCII
1130                         *
1131 FBB3 8E FE BD           PRTIX   LDX  #MSG14   ; POINT TO MSG "IX="
1132 FBB6 8D D7                      BSR  PDATA    ; PRINT MSG
1133 FBB8 AE 44                      LDX  4,U      ; $FCE6
1134 FBBA 20 E1                      BRA  JOUT4H
1135                         *
1136 FBBC 8E FE B7           PRTIY   LDX  #MSG13   ; POINT TO MSG "IY="
1137 FBBF 8D CE                      BSR  PDATA    ; PRINT MSG
1138 FBC1 AE 46                      LDX  6,U
1139 FBC3 20 D8                      BRA  JOUT4H
1140                         *
1141 FBC5 8E FE AB           PRTPC   LDX  #MSG11   ; POINT TO MSG "PC="
1142 FBC8 8D C5                      BSR  PDATA    ; PRINT MSG
1143 FBCA AE 4A                      LDX  10,U
1144 FBCC 20 CF                      BRA  JOUT4H
1145                         *
1146 FBCE 8E FE C9           PRTA    LDX  #MSG16   ; POINT TO MSG "A="
1147 FBD1 8D BC                      BSR  PDATA    ; PRINT MSG
1148 FBD3 A6 41                      LDA  1,U
1149 FBD5 20 D9                      BRA  JOUT2H   ; OUTPUT HEX BYTE AS ASCII
1150                         *
1151 FBD7 8E FE CE           PRTB    LDX  #MSG17   ; POINT TO MSG "B="
1152 FBDA 8D B3                      BSR  PDATA    ; PRINT MSG
1153 FBDC A6 42                      LDA  2,U
1154 FBDE 20 D0                      BRA  JOUT2H   ; OUTPUT HEX BYTE AS ASCII
1155                         *
1156 FBE0 8E FE D3           PRTCC   LDX  #MSG18   ; POINT TO MSG "CC:"
1157 FBE3 8D AA                      BSR  PDATA    ; PRINT MSG
1158 FBE5 A6 C4                      LDA  ,U
1159 FBE7 8E FE DA                   LDX  #MSG19   ; POINT TO MSG "EFHINZVC"
1160 FBEA 16 00 90                   LBRA BIASCI   ; OUTPUT IN BINARY/ASCII FORMAT
1161                         *
1162                         * "R" DISPLAY REGISTERS
1163                         *
1164 FBED 8E FE A1           REGSTR  LDX  #MSG5    ; POINT TO MSG " - "
1165 FBF0 17 FF 27                   LBSR PSTRNG   ; PRINT MSG
1166 FBF3 8D A1                      BSR  PRTSP    ; $FCBF
1167 FBF5 8D A9                      BSR  PRTUS    ; $FCCA
1168 FBF7 8D B0                      BSR  PRTDP    ; $FCD5
1169 FBF9 8D B8                      BSR  PRTIX    ; $FCE0
1170 FBFB 8D BF                      BSR  PRTIY    ; $FCEB
1171 FBFD 8E FE A1                   LDX  #MSG5    ; POINT TO MSG " - "
1172 FC00 17 FF 17                   LBSR PSTRNG   ; PRINT MSG
1173 FC03 8D C0                      BSR  PRTPC    ; $FCF5
1174 FC05 8D C7                      BSR  PRTA     ; $FCFF
1175 FC07 8D CE                      BSR  PRTB     ; $FD09
1176 FC09 20 D5                      BRA  PRTCC    ; $FD13
1177                         *
1178                         * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1179                         * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1180                         * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1181                         * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1182                         * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1183                         * ADDRESS IS INPUT.
1184                         *
1185 FC0B 8D 09              IN2ADR  BSR  IN1ADR   ; GET FIRST ADDRESS
1186 FC0D 29 4D                      BVS  NOTHEX   ; EXIT IF NOT VALID HEX
1187 FC0F 1F 12                      TFR  X,Y      ; SAVE FIRST ADDR. IN "IY"
1188 FC11 86 2D                      LDA  #'-
1189 FC13 17 00 B8                   LBSR OUTCH    ; PRINT " - "
1190                         *
1191                         * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1192                         * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1193                         * ADDRESS IS RETURNED IN THE "X" REGISTER.
1194                         *
1195 FC16 8D 0E              IN1ADR  BSR  BYTE     ; INPUT BYTE (2 HEX CHAR)
1196 FC18 29 42                      BVS  NOTHEX   ; EXIT IF NOT VALID HEX
1197 FC1A 1F 01                      TFR  D,X
1198 FC1C 8D 08                      BSR  BYTE     ; INPUT BYTE (2 HEX CHAR)
1199 FC1E 29 3C                      BVS  NOTHEX
1200 FC20 34 10                      PSHS X
1201 FC22 A7 61                      STA  1,S
1202 FC24 35 90                      PULS X,PC
1203                         *
1204                         ***** INPUT BYTE (2 HEX CHAR.) *****
1205                         *
1206 FC26 8D 11              BYTE    BSR  INHEX    ; GET HEX LEFT
1207 FC28 29 32                      BVS  NOTHEX   ; EXIT IF NOT VALID HEX
1208 FC2A 48                         ASLA          ;
1209 FC2B 48                         ASLA          ;
1210 FC2C 48                         ASLA          ; SHIFT INTO LEFT NIBBLE
1211 FC2D 48                         ASLA          ;
1212 FC2E 1F 89                      TFR  A,B      ; PUT HEXL IN "B"
1213 FC30 8D 07                      BSR  INHEX    ; GET HEX RIGHT
1214 FC32 29 28                      BVS  NOTHEX   ; EXIT IF NOT VALID HEX
1215 FC34 34 04                      PSHS B        ; PUSH HEXL ON STACK
1216 FC36 AB E0                      ADDA ,S+      ; ADD HEXL TO HEXR AND ADJ. STK
1217 FC38 39                         RTS           ; RETURN WITH HEX L&R IN "A"
1218                         *
1219                         *
1220 FC39 8D 5B              INHEX   BSR  ECHON    ; INPUT ASCII CHAR.
1221 FC3B 81 30                      CMPA #'0      ; IS IT > OR = "0" ?
1222 FC3D 25 1D                      BCS  NOTHEX   ; IF LESS IT AIN'T HEX
1223 FC3F 81 39                      CMPA #'9      ; IS IT < OR = "9" ?
1224 FC41 22 03                      BHI  INHEXA   ; IF > MAYBE IT'S ALPHA
1225 FC43 80 30                      SUBA #$30     ; ASCII ADJ. NUMERIC
1226 FC45 39                         RTS           ;
1227                         *
1228                         *
1229 FC46 81 41              INHEXA  CMPA #'A      ; IS IT > OR = "A"
1230 FC48 25 12                      BCS  NOTHEX   ; IF LESS IT AIN'T HEX
1231 FC4A 81 46                      CMPA #'F      ; IS IT < OR = "F" ?
1232 FC4C 22 03                      BHI  INHEXL   ; IF > IT AIN'T HEX
1233 FC4E 80 37                      SUBA #'A-10   ; ($37) ASCII ADJ. ALPHA
1234 FC50 39                         RTS           ;
1235                         *
1236 FC51 81 61              INHEXL  CMPA #'a      ; IS IT > OR = "a"
1237 FC53 25 07                      BCS  NOTHEX   ; IF LESS IT AIN'T HEX
1238 FC55 81 66                      CMPA #'f      ; IS IT < "f"
1239 FC57 22 03                      BHI  NOTHEX   ; IF > IT AIN'T HEX
1240 FC59 80 57                      SUBA #'a-10   ; ($57) ADJUST TO LOWER CASE
1241 FC5B 39                         RTS           ;
1242                         *
1243                         *
1244 FC5C 1A 02              NOTHEX  ORCC #2       ; SET (V) FLAG IN C-CODES REGISTER
1245 FC5E 39                         RTS           ;
1246                         *
1247                         *
1248 FC5F 34 10              OUT4H   PSHS X        ; PUSH X-REG. ON THE STACK
1249 FC61 35 02                      PULS A        ; POP MS BYTE OF X-REG INTO A-ACC.
1250 FC63 8D 02                      BSR  OUTHL    ; OUTPUT HEX LEFT
1251 FC65 35 02                      PULS A        ; POP LS BYTE OF X-REG INTO A-ACC.
1252 FC67                    OUTHL   EQU *
1253 FC67 34 02              OUT2H   PSHS A        ; SAVE IT BACK ON STACK
1254 FC69 44                         LSRA          ; CONVERT UPPER HEX NIBBLE TO ASCII
1255 FC6A 44                         LSRA          ;
1256 FC6B 44                         LSRA          ;
1257 FC6C 44                         LSRA          ;
1258 FC6D 8D 04                      BSR  XASCII   ; PRINT HEX NIBBLE AS ASCII
1259 FC6F 35 02              OUTHR   PULS A        ; CONVERT LOWER HEX NIBBLE TO ASCII
1260 FC71 84 0F                      ANDA #$0F     ; STRIP LEFT NIBBLE
1261 FC73 8B 30              XASCII  ADDA #$30     ; ASCII ADJ
1262 FC75 81 39                      CMPA #$39     ; IS IT < OR = "9" ?
1263 FC77 2F 02                      BLE  OUTC     ; IF LESS, OUTPUT IT
1264 FC79 8B 07                      ADDA #7       ; IF > MAKE ASCII LETTER
1265 FC7B 20 51              OUTC    BRA  OUTCH    ; OUTPUT CHAR
1266                         *
1267                         * BINARY / ASCII --- THIS ROUTINE
1268                         * OUTPUTS A BYTE IN ENHANCED
1269                         * BINARY FORMAT. THE ENHANCEMENT
1270                         * IS DONE BY SUBSTITUTING ASCII
1271                         * LETTERS FOR THE ONES IN THE BYTE.
1272                         * THE ASCII ENHANCEMENT LETTERS
1273                         * ARE OBTAINED FROM THE STRING
1274                         * POINTED TO BY THE INDEX REG. "X".
1275                         *
1276 FC7D 34 02              BIASCI  PSHS A        ; SAVE "A" ON STACK
1277 FC7F C6 08                      LDB  #8       ; PRESET LOOP# TO BITS PER BYTE
1278 FC81 A6 80              OUTBA   LDA  ,X+      ; GET LETTER FROM STRING
1279 FC83 68 E4                      ASL  ,S       ; TEST BYTE FOR "1" IN B7
1280 FC85 25 02                      BCS  PRTBA    ; IF ONE PRINT LETTER
1281 FC87 86 2D                      LDA  #'-      ; IF ZERO PRINT "-"
1282 FC89 8D 43              PRTBA   BSR  OUTCH    ; PRINT IT
1283 FC8B 8D 3F                      BSR  OUT1S    ; PRINT SPACE
1284 FC8D 5A                         DECB          ; SUB 1 FROM #BITS YET TO PRINT
1285 FC8E 26 F1                      BNE  OUTBA
1286 FC90 35 82                      PULS A,PC
1287                         *
1288                                 IFD EXTOPT
1289                         *
1290                         * EXTENDED USER COMMANDS
1291                         *
1292 FC92 6E 9F F0 00        USRCMD  JMP [MONEXT+EXTCMD]
1293                                 ENDIF EXTOPT
1294                         *
1295                         *
1296 FC96 7D DF E2           ECHON   TST  ECHO     ; IS ECHO REQUIRED ?
1297 FC99 27 06                      BEQ  INCH     ; ECHO NOT REQ. IF CLEAR
1298                         *
1299                         * INCHE
1300                         *
1301                         * GETS CHARACTER FROM TERMINAL AND
1302                         * ECHOS SAME. THE CHARACTER IS RETURNED
1303                         * IN THE "A" ACCUMULATOR WITH THE PARITY
1304                         * BIT MASKED OFF. ALL OTHER REGISTERS
1305                         * ARE PRESERVED.
1306                         *
1307 FC9B 8D 04              INCHE   BSR  INCH     ; GET CHAR FROM TERMINAL
1308 FC9D 84 7F                      ANDA #$7F     ; STRIP PARITY FROM CHAR.
1309 FC9F 20 2D                      BRA  OUTCH    ; ECHO CHAR TO TERMINAL
1310                         *
1311                         * INCH
1312                         *
1313                         * GET CHARACTER FROM TERMINAL. RETURN
1314                         * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1315                         * ALL OTHER REGISTERS. THE INPUT CHARACTER
1316                         * IS 8 BITS AND IS NOT ECHOED.
1317                         *
1318                         *
1319 FCA1 34 10              INCH    PSHS X        ; SAVE IX
1320                                 IFD  HFCOPT
1321                                 LDA  #$11     ; SET RTS* LOW, REQUEST FAR END TO TX
1322                                 STA  [CPORT]
1323                                 ENDIF HFCOPT
1323                                 ENDIF HFCOPT
1324 FCA3 BE DF E0           GETSTA  LDX  CPORT    ; POINT TO TERMINAL PORT
1325 FCA6 A6 84                      LDA  ,X       ; FETCH PORT STATUS
1326 FCA8 85 01                      BITA #1       ; TEST READY BIT, RDRF ?
1327                                 IFD  PS2OPT
1328 FCAA 26 09                      BNE  GETST1
1329 FCAC 8E E0 20                   LDX  #PS2KBD
1330 FCAF A6 84                      LDA  ,X
1331 FCB1 85 01                      BITA #1
1332                                 ENDIF PS2OPT
1333 FCB3 27 EE                      BEQ  GETSTA   ; IF NOT RDY, THEN TRY AGAIN
1334 FCB5                    GETST1  EQU  *
1335                                 IFD  HFCOPT
1336                                 LDA  #$51     ; SET RTS* HIGH, STOP FAR END FROM TXING, UNTIL NEXT INPUT
1337                                 STA  [CPORT]
1338                                 ENDIF HFCOPT
1338                                 ENDIF HFCOPT
1339 FCB5 A6 01                      LDA  1,X      ; FETCH CHAR
1340 FCB7 35 90                      PULS X,PC     ; RESTORE IX
1341                         *
1342                         * INCHEK
1343                         *
1344                         * CHECK FOR A CHARACTER AVAILABLE FROM
1345                         * THE TERMINAL. THE SERIAL PORT IS CHECKED
1346                         * FOR READ READY. ALL REGISTERS ARE
1347                         * PRESERVED, AND THE "Z" BIT WILL BE
1348                         * CLEAR IF A CHARACTER CAN BE READ.
1349                         *
1350                         *
1351 FCB9 34 02              INCHEK  PSHS A        ; SAVE A ACCUM
1352                                 IFD  HFCOPT
1353                                 LDA  #$11     ; SET RTS* LOW, REQUEST FAR END TO TX
1354                                 STA  [CPORT]
1355                                 ENDIF HFCOPT
1355                                 ENDIF HFCOPT
1356 FCBB A6 9F DF E0                LDA  [CPORT]  ; FETCH PORT STATUS
1357 FCBF 85 01                      BITA #1       ; TEST READY BIT, RDRF ?
1358                                 IFD  PS2OPT
1359 FCC1 26 05                      BNE  INCHEK1
1360 FCC3 B6 E0 20                   LDA  PS2KBD
1361 FCC6 85 01                      BITA #1       ; TEST READY BIT< RDRF ?
1362                                 ENDIF PS2OPT
1363 FCC8 35 82              INCHEK1 PULS A,PC     ; RESTORE A ACCUM.
1364                         *
1365 FCCA 8D 00              OUT2S   BSR  OUT1S    ; OUTPUT 2 SPACES
1366 FCCC 86 20              OUT1S   LDA  #$20     ; OUTPUT 1 SPACE
1367                         *
1368                         *
1369                         * OUTCH
1370                         *
1371                         * OUTPUT CHARACTER TO TERMINAL.
1372                         * THE CHAR. TO BE OUTPUT IS
1373                         * PASSED IN THE A REGISTER.
1374                         * ALL REGISTERS ARE PRESERVED.
1375                         *
1376                         OUTCH   IFD   VDUOPT
1377 FCCE 8D 49                      BSR   VOUTCH
1378                                 ENDIF VDUOPT
1379                                 IFD   DG640OPT
1380                                 BSR   VOUTCH
1381                                 ENDIF DG640OPT
1381                                 ENDIF DG640OPT
1382 FCD0 34 12              AOUTCH  PSHS A,X      ; SAVE A ACCUM AND IX
1383 FCD2 BE DF E0                   LDX  CPORT    ; GET ADDR. OF TERMINAL
1384 FCD5 A6 84              FETSTA  LDA  ,X       ; FETCH PORT STATUS
1385 FCD7 85 02                      BITA #2       ; TEST TDRE, OK TO XMIT ?
1386 FCD9 27 FA                      BEQ  FETSTA   ; IF NOT LOOP UNTIL RDY
1387 FCDB 85 08                      BITA #8       ; CLEAR TO SEND ?
1388 FCDD 26 F6                      BNE  FETSTA   ; NO, LOOP UNTIL CLEAR
1389 FCDF 35 02                      PULS A        ; GET CHAR. FOR XMIT
1390 FCE1 A7 01                      STA  1,X      ; XMIT CHAR.
1391 FCE3 35 90                      PULS X,PC     ; RESTORE IX
1392                         *
1393                         * IO INITIALIZATION
1394                         *
1395 FCE5                    IOINIZ  EQU  *
1396                                 IFD  VDUOPT
1397 FCE5 8D 13                      BSR  VINIZ
1398                                 ENDIF VDUOPT
1399                                 IFD  DG640OPT
1400                                 BSR  VINIZ
1401                                 ENDIF DG640OPT
1401                                 ENDIF DG640OPT
1402 FCE7 BE DF E0           ACINIZ  LDX  CPORT    ; POINT TO CONTROL PORT ADDRESS
1403 FCEA 86 03                      LDA  #3       ; RESET ACIA PORT CODE
1404 FCEC A7 84                      STA  ,X       ; STORE IN CONTROL REGISTER
1405 FCEE 86 51                      LDA  #$51     ; SET 8 DATA, 2 STOP AN 0 PARITY RTS* HIGH
1406 FCF0 A7 84                      STA  ,X       ; STORE IN CONTROL REGISTER
1407 FCF2 6D 01                      TST  1,X      ; ANYTHING IN DATA REGISTER?
1408 FCF4 86 FF                      LDA  #$FF     ; TURN ON ECHO FLAG
1409 FCF6 B7 DF E2                   STA  ECHO
1410 FCF9 39                         RTS
1411                         *
1412                                 IFD VDUOPT
1413                         *
1414                         ***************************************************
1415                         *      VDU8 ADM3A REGISTER-MAPPED EMULATOR        *
1416                         *                                                 *
1417                         *      80 x 25 Characters
1418                         *
1419                         ***************************************************
1420                         *
1421                         ***************************************************
1422                         *               INITIALIZE EMULATOR               *
1423                         ***************************************************
1424                         *
1425 FCFA 8E E0 30           VINIZ   LDX  #VDU
1426 FCFD CC 00 00                   LDD  #0
1427 FD00 FD DF FB                   STD  COLADX   ; AND ROWADX
1428 FD03 A7 02                      STA  VDUCOL,X
1429 FD05 E7 03                      STB  VDUROW,X
1430 FD07 E7 04                      STB  VDUOFF,X
1431 FD09 FD DF FD                   STD  NEWROW   ; AND ESCFLG
1432 FD0C C6 02                      LDB  #$02
1433 FD0E E7 01                      STB  VDUATT,X
1434 FD10 7F DF FE                   CLR  ESCFLG
1435 FD13 86 1B                      LDA  #$1B     ; SEND ESCAPE
1436 FD15 8D 02                      BSR  VOUTCH
1437 FD17 86 59                      LDA  #'Y      ; CLEAR TO END OF SCREEN
1438                         *
1439                         ** VIDEO OUTPUT ROUTINE
1440                         *
1441 FD19 34 16              VOUTCH  PSHS A,B,X    ; SAVE REGISTERS
1442 FD1B 8E E0 30                   LDX  #VDU     ; POINT TO VDU REGISTERS
1443                         *
1444                         ** CHECK FOR ESCAPE SEQUENCE
1445                         *
1446 FD1E 7D DF FE                   TST  ESCFLG   ; ESCAPE ACTIVE?
1447 FD21 27 04                      BEQ  SOROU1   ; BRANCH IF NOT
1448 FD23 8D 60                      BSR  ESCAPE   ; ELSE DO ESCAPE
1449 FD25 20 0D                      BRA  RETURN   ; AND RETURN
1450                         *
1451                         ** CHECK FOR CONTROL CHARACTERS
1452                         *
1453 FD27 81 20              SOROU1  CMPA #$20     ; CONTROL CODES?
1454 FD29 24 04                      BHS  SOROU2
1455 FD2B 8D 09                      BSR  CONTRL   ; BRANCH IF SO
1456 FD2D 20 05                      BRA  RETURN
1457                         *
1458                         ** OUTPUT TEXT CHARACTER
1459                         *
1460 FD2F A7 84              SOROU2  STA  VDUCHR,X ; DISPLAY CHARACTER
1461 FD31 17 00 AF                   LBSR NEWCOL   ; UPDATE COLUMN
1462                         *
1463                         ** DISPLAY CURSOR AND RETURN
1464                         *
1465 FD34 35 96              RETURN  PULS A,B,X,PC ; RESTORE REGISTERS AND RETURN
1466                         *
1467                         ***************************************************
1468                         *              CONTROL CODE HANDLERS              *
1469                         ***************************************************
1470                         *
1471 FD36 81 08              CONTRL  CMPA #$08     ; CTRL H - BACKSPACE ?
1472 FD38 27 34                      BEQ  BACKSP
1473 FD3A 81 1B                      CMPA #$1B     ; ESCAPE SEQUENCE?
1474 FD3C 27 5A                      BEQ  SETESC
1475 FD3E 81 1A                      CMPA #$1A     ; CTRL Z - Clear Screen
1476 FD40 10 27 00 7C                LBEQ CLRSCR
1477 FD44 81 16                      CMPA #$16     ; CTRL ^ - Home
1478 FD46 27 38                      BEQ  HOME
1479 FD48 81 0D                      CMPA #$0D     ; CTRL M - RETURN?
1480 FD4A 10 27 00 89                LBEQ CRETN
1481 FD4E 81 0C                      CMPA #$0C     ; CTRL L - CHAR RIGHT
1482 FD50 27 24                      BEQ  CHRIGHT
1483 FD52 81 0B                      CMPA #$0B     ; CTRL K - MOVE UP ONE LINE
1484 FD54 27 0F                      BEQ  LINEUP
1485 FD56 81 0A                      CMPA #$0A     ; CTRL J - LINE FEED
1486 FD58 26 45                      BNE  RETESC   ; NONE OF THESE, RETURN
1487                         *
1488                         ***************************************** LINE FEED
1489                         *
1490 FD5A FC DF FB           LINEFD  LDD  COLADX   ; GET CURRENT COLUMN AND ROW
1491 FD5D 5C                         INCB          ; BUMP ROW
1492 FD5E C1 19                      CMPB #NUMLIN  ; SCROLL TIME?
1493 FD60 26 79                      BNE  NEWCUR   ; POSITION CURSOR IF NOT
1494 FD62 16 00 8F                   LBRA SCROLL   ; ELSE SCROLL IT
1495                         *
1496                         ***************************************** LINE FEED
1497                         *
1498 FD65 FC DF FB           LINEUP  LDD  COLADX   ; GET CURRENT COLUMN AND ROW
1499 FD68 5D                         TSTB          ; AT TOP OF SCREEN ?
1500 FD69 27 34                      BEQ  RETESC   ; Yes, Ignore
1501 FD6B 5A                         DECB          ; No, Decrement ROW
1502 FD6C 20 6D                      BRA  NEWCUR   ; POSITION CURSOR
1503                         *
1504                         *********************************** BACK SPACE
1505                         *
1506 FD6E B6 DF FB           BACKSP  LDA  COLADX
1507 FD71 27 2C                      BEQ  RETESC   ; RETURN
1508 FD73 4A                         DECA
1509 FD74 20 62                      BRA  POSCOL   ; POSITION CURSOR
1510                         *
1511                         *********************************** CURSOR RIGHT
1512                         *
1513 FD76 B6 DF FB           CHRIGHT LDA  COLADX
1514 FD79 4C                         INCA
1515 FD7A 81 50                      CMPA #LINLEN
1516 FD7C 27 21                      BEQ  RETESC
1517 FD7E 20 58                      BRA  POSCOL
1518                         *
1519                         *********************************** CURSOR RIGHT
1520                         *
1521 FD80 CC 00 00           HOME    LDD  #0       ; HOME - POSITION TOP OF SCREEN
1522 FD83 20 56                      BRA  NEWCUR
1523                         *
1524                         ***************************************************
1525                         *                 ESCAPE HANDLERS                 *
1526                         ***************************************************
1527                         *
1528 FD85 F6 DF FE           ESCAPE  LDB  ESCFLG   ; GET FLAG
1529 FD88 C1 3D                      CMPB #'=      ; SETTING CURSOR?
1530 FD8A 27 14                      BEQ  ESCCUR   ; BRANCH IF SO
1531 FD8C 81 59                      CMPA #'Y      ; CLEAR TO END OF SCREEN?
1532 FD8E 27 6E                      BEQ  ESCCLS
1533 FD90 81 54                      CMPA #'T      ; CLEAR TO END OF LINE?
1534 FD92 27 31                      BEQ  ESCCLL
1535 FD94 81 3D                      CMPA #'=      ; STARTING CURSOR SET?
1536 FD96 26 04                      BNE  CLRESC   ; BRANCH IF NOT
1537                         *
1538                         ***************************** START ESCAPE SEQUENCE
1539                         *
1540 FD98 B7 DF FE           SETESC  STA  ESCFLG   ; ELSE START CURSORING
1541 FD9B 39                         RTS           ; AND RETURN
1542                         *
1543 FD9C 7F DF FE           CLRESC  CLR  ESCFLG   ; NO OTHERS SUPPORTED
1544 FD9F 39                 RETESC  RTS           ; SO RETURN
1545                         *
1546                         ********************************* SET SCREEN CURSOR
1547                         *
1548 FDA0 7D DF FD           ESCCUR  TST  NEWROW   ; ROW SET?
1549 FDA3 26 04                      BNE  ESCCU1   ; BRANCH IF SO
1550 FDA5 B7 DF FD                   STA  NEWROW   ; ELSE SET NEW ROW
1551 FDA8 39                         RTS           ; AND RETURN
1552                         *
1553 FDA9 7F DF FE           ESCCU1  CLR  ESCFLG
1554 FDAC 80 20                      SUBA #$20     ; ADJUST COLUMN ADDRESS
1555 FDAE 81 4F                      CMPA #LINLEN-1 ;CHECK FOR ACCEPTABLE COLUM
1556 FDB0 22 ED                      BHI  RETESC   ; NOT OK, DO NOTHING
1557                         *
1558 FDB2 F6 DF FD           ESCCU2  LDB  NEWROW
1559 FDB5 7F DF FD                   CLR  NEWROW
1560 FDB8 C0 20                      SUBB #$20     ; ADJUST TO ROW ADDRESS
1561 FDBA C1 18                      CMPB #NUMLIN-1 ; CHECK FOR ACCEPTABLE ROW
1562 FDBC 22 E1                      BHI  RETESC   ; ELSE RETURN DOING NOTHING
1563 FDBE 20 1B                      BRA  NEWCUR   ; GO SET NEW CURSOR IF SO
1564                         *
1565                         ****************** CLEAR FROM CURSOR TO END OF LINE
1566                         *
1567 FDC0 CC 00 00           CLRSCR  LDD  #0       ; CLEAR FROM TOP OF SCREEN
1568 FDC3 8D 16                      BSR  NEWCUR
1569 FDC5 B6 DF FB           ESCCLL  LDA  COLADX
1570 FDC8 C6 20                      LDB  #$20     ; AND CLEAR CHAR
1571 FDCA E7 84              ESCCL1  STB  VDUCHR,X ; DISPLAY TEXT
1572 FDCC 4C                         INCA
1573 FDCD A7 02                 STA  VDUCOL,X
1574 FDCF 81 50                      CMPA #LINLEN  ; UNTIL END OF LINE
1575 FDD1 26 F7                      BNE  ESCCL1
1576 FDD3 7F DF FE                   CLR  ESCFLG
1577 FDD6 39                         RTS
1578                         *
1579                         *********************************** CARRIAGE RETURN
1580                         *
1581 FDD7 4F                 CRETN   CLRA          ; SET COLUMN ZERO
1582 FDD8 F6 DF FC           POSCOL  LDB  ROWADX   ; GET CURRENT ROW
1583                         *
1584                         *********** GENERATE NEW CURSOR POSITION AND RETURN
1585                         *
1586 FDDB FD DF FB           NEWCUR  STD  COLADX   ; SAVE NEW ROW AND COLUMN
1587 FDDE A7 02                 STA  VDUCOL,X ; SET NEW COLUMN
1588 FDE0 E7 03                      STB  VDUROW,X ; SET NEW ROW
1589 FDE2 39                         RTS           ; AND RETURN
1590                         *
1591                         ********************* UPDATE CURRENT COLUMN AND ROW
1592                         *
1593 FDE3 FC DF FB           NEWCOL  LDD  COLADX   ; GET ROW AND COLUMN
1594 FDE6 4C                         INCA          ; BUMP COLUMN
1595 FDE7 81 50                      CMPA #LINLEN  ; ROLL?
1596 FDE9 26 F0                      BNE  NEWCUR   ; BRANCH IF NOT
1597 FDEB 4F                         CLRA          ; ELSE RESET TO ZERO
1598 FDEC 5C                         INCB          ; AND BUMP ROW
1599 FDED C1 19                      CMPB #NUMLIN
1600 FDEF 26 EA                      BNE  NEWCUR
1601 FDF1 5A                         DECB          ; BOTTOM ROW
1602 FDF2 8D E7                      BSR  NEWCUR
1603                         *
1604                         ********************************* SCROLL THE SCREEN
1605                         *
1606 FDF4 E6 04              SCROLL  LDB  VDUOFF,X
1607 FDF6 5C                         INCB
1608 FDF7 C1 19                      CMPB #NUMLIN
1609 FDF9 25 01                      BLO  SCROL1
1610 FDFB 5F                         CLRB
1611 FDFC E7 04              SCROL1  STB  VDUOFF,X
1612                         *
1613                         **************** CLEAR FROM CURSOR TO END OF SCREEN
1614                         *
1615 FDFE F6 DF FB           ESCCLS  LDB  COLADX   ; GET CURSOR
1616 FE01 86 20                      LDA  #$20     ; GET A SPACE
1617 FE03 F7 DF FB           ESCCLS1    STB  COLADX
1618 FE06 E7 02                      STB  VDUCOL,X
1619 FE08 A7 84                      STA  VDUCHR,X
1620 FE0A 5C                         INCB
1621 FE0B C1 50                      CMPB #LINLEN
1622 FE0D 26 F4                      BNE  ESCCLS1
1623                         *
1624 FE0F F6 DF FC                   LDB  ROWADX
1625 FE12 5C                         INCB
1626 FE13 C1 19                      CMPB #NUMLIN
1627 FE15 27 08                      BEQ  ESCCLS2
1628 FE17 F7 DF FC                   STB  ROWADX
1629 FE1A E7 03                      STB  VDUROW,X
1630 FE1C 5F                         CLRB
1631 FE1D 20 E4                      BRA  ESCCLS1
1632                         *
1633 FE1F 5F                 ESCCLS2 CLRB
1634 FE20 F7 DF FB                   STB  COLADX
1635 FE23 E7 02                      STB  VDUCOL,X
1636 FE25 F7 DF FE                   STB  ESCFLG
1637 FE28 39                         RTS
1638                                 ENDIF VDUOPT
1639                         *
1640                                 IFD DG640OPT
1641                         ***************************************************
1642                         *      TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR      *
1643                         *                                                 *
1644                         * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1645                         * HIGH ORDER BIT OF EACH BYTE FOR  REVERSE  VIDEO *
1646                         * CURSORING  (SUCH  AS THE THOMAS INSTRUMENTATION *
1647                         * 16x64 BOARD).                                   *
1648                         ***************************************************
1649                         *
1650                         ***************************************************
1651                         *               INITIALIZE EMULATOR               *
1652                         ***************************************************
1653                         *
1654                         VINIZ   LDX  #0
1655                                 STX  COLADX   ; AND ROWADX
1656                                 STX  NEWROW   ; AND ESCFLG
1657                                 LDX  #SCREEN  ; POINT TO SCREEN
1658                                 STX  CURSOR   ; SET PROGRAM CURSOR
1659                                 LDA  #$1B     ; SEND ESCAPE
1660                                 BSR  VOUTCH
1661                                 LDA  #'Y      ; CLEAR TO END OF SCREEN
1662                         *
1663                         ** VIDEO OUTPUT ROUTINE
1664                         *
1665                         VOUTCH  PSHS A,B,X    ; SAVE REGISTERS
1666                         *
1667                         ** CLEAR CURSOR
1668                         *
1669                                 LDX  CURSOR
1670                                 LDB  0,X
1671                                 ANDB #$7F
1672                                 STB  0,X
1673                         *
1674                         ** CHECK FOR ESCAPE SEQUENCE
1675                         *
1676                                 TST  ESCFLG   ; ESCAPE ACTIVE?
1677                                 BEQ  SOROU1   ; BRANCH IF NOT
1678                                 BSR  ESCAPE   ; ELSE DO ESCAPE
1679                                 BRA  RETURN   ; AND RETURN
1680                         *
1681                         ** CHECK FOR CONTROL CHARACTERS
1682                         *
1683                         SOROU1  CMPA #$20     ; CONTROL CODES?
1684                                 BHS  SOROU2
1685                                 BSR  CONTRL   ; BRANCH IF SO
1686                                 BRA  RETURN
1687                         *
1688                         ** OUTPUT TEXT CHARACTER
1689                         *
1690                         SOROU2  LDX  CURSOR   ; ELSE GET CURSOR
1691                                 STA  0,X      ; DISPLAY CHARACTER
1692                                 LBSR NEWCOL   ; UPDATE COLUMN
1693                         *
1694                         ** DISPLAY CURSOR AND RETURN
1695                         *
1696                         RETURN  LDX  CURSOR   ; AND DISPLAY IT
1697                                 LDB  ,X
1698                                 ORB  #$80     ; WITH REVID
1699                                 STB  ,X
1700                                 PULS A,B,X,PC ; RESTORE REGISTERS AND RETURN
1701                         *
1702                         ***************************************************
1703                         *              CONTROL CODE HANDLERS              *
1704                         ***************************************************
1705                         *
1706                         CONTRL  CMPA #$08     ; CTRL H - BACKSPACE ?
1707                                 LBEQ BACKSP
1708                                 CMPA #$1B     ; ESCAPE SEQUENCE?
1709                                 LBEQ SETESC
1710                                 CMPA #$D      ; CTRL M - RETURN?
1711                                 LBEQ CRETN
1712                                 CMPA #$0A     ; CTRL J - LINE FEED
1713                                 BNE  RETESC   ; NONE OF THESE, RETURN
1714                         *
1715                         ***************************************** LINE FEED
1716                         *
1717                         LINEFD  LDD  COLADX   ; GET CURRENT COLUMN AND ROW
1718                                 INCB          ; BUMP ROW
1719                                 CMPB #NUMLIN  ; SCROLL TIME?
1720                                 LBNE NEWCUR   ; POSITION CURSOR IF NOT
1721                                 LBRA SCROLL   ; ELSE SCROLL IT
1722                         *
1723                         ***************************************** LINE FEED
1724                         *
1725                         LINEUP  LDD  COLADX   ; GET CURRENT COLUMN AND ROW
1726                                 TSTB          ; AT TOP OF SCREEN ?
1727                                 BEQ  RETESC   ; YES, RETURN
1728                                 DECB          ; NO, DECREMENT ROW
1729                                 LBRA NEWCUR   ; POSITION CURSOR
1730                         *
1731                         *********************************** BACK SPACE
1732                         *
1733                         BACKSP  LDA  COLADX    ; GET CURRENT COLUMN AND ROW
1734                                 BEQ  RETESC    ; IF AT TOP LEFT CORNER RETURN
1735                                 DECA           ; OTHERWISE BACK STEP ONE CHARACTER
1736                                 LBRA POSCOL    ; POSITION CURSOR
1737                         *
1738                         *********************************** CURSOR RIGHT
1739                         *
1740                         CHRIGHT LDA  COLADX    ; GET CURRENT COLUMN AND ROW
1741                                 INCA           ; MOVE RIGHT ONE CHARACTER
1742                                 CMPA #LINLEN   ; ARE WE AT THE END OF THE LINE ?
1743                                 BEQ  RETESC    ; YES, RETURN
1744                                 LBRA POSCOL    ; NO, POSITION CURSOR
1745                         *
1746                         ***************************************************
1747                         *                 ESCAPE HANDLERS                 *
1748                         ***************************************************
1749                         *
1750                         ESCAPE  LDB  ESCFLG   ; ARE WE IN AN ESCAPE SEQUENCE ?
1751                                 CMPB #'=      ; ARE WE SETTING CURSOR?
1752                                 BEQ  ESCCUR   ; YES BRANCH TO SET CURSOR
1753                                 CMPA #'Y      ; CLEAR TO END OF SCREEN?
1754                                 LBEQ ESCCLS   ; YES, CLEAR SCREEN
1755                                 CMPA #'T      ; CLEAR TO END OF LINE?
1756                                 BEQ  ESCCLL   ; YES, CLEAR LINE
1757                                 CMPA #'E      ; INSERT LINE?
1758                                 BEQ  ESCINL
1759                                 CMPA #'R      ; DELETE LINE?
1760                                 BEQ  ESCDLL
1761                                 CMPA #'=      ; STARTING CURSOR SET?
1762                                 BNE  CLRESC   ; BRANCH IF NOT
1763                         *
1764                         ***************************** START ESCAPE SEQUENCE
1765                         *
1766                         SETESC  STA  ESCFLG   ; ELSE START CURSORING
1767                                 RTS           ; AND RETURN
1768                         *
1769                         CLRESC  CLR  ESCFLG   ; NO OTHERS SUPPORTED
1770                         RETESC  RTS           ;  SO RETURN
1771                         *
1772                         ********************************* SET SCREEN CURSOR
1773                         *
1774                         ESCCUR  TST  NEWROW   ; ROW SET?
1775                                 BNE  ESCCU1   ; BRANCH IF SO
1776                                 STA  NEWROW   ; ELSE SET NEW ROW
1777                                 RTS           ;  AND RETURN
1778                         *
1779                         ESCCU1  CLR  ESCFLG
1780                                 SUBA #$20      ; ADJUST COLUMN ADDRESS
1781                                 CMPA #LINLEN-1 ; CHECK FOR ACCEPTABLE COLUM
1782                                 BHI  RETESC    ; NOT OK, DO NOTHING
1783                         *
1784                         ESCCU2  LDB  NEWROW
1785                                 CLR  NEWROW
1786                                 SUBB #$20      ; ADJUST TO ROW ADDRESS
1787                                 CMPB #NUMLIN-1 ; CHECK FOR ACCEPTABLE ROW
1788                                 BHI  RETESC    ; ELSE RETURN DOING NOTHING
1789                                 BRA  NEWCUR    ; GO SET NEW CURSOR IF SO
1790                         *
1791                         *************************** DELETE LINE FROM SCREEN
1792                         *
1793                         ESCDLL  BSR  CRETN     ; GO COL. ZERO
1794                                 LDB  ROWADX
1795                                 CMPB #NUMLIN-1
1796                                 BEQ  SCROL3
1797                                 BRA  SCROL1    ; AND DELETE THIS LINE
1798                         *
1799                         *************************** INSERT LINE INTO SCREEN
1800                         *
1801                         ESCINL  BSR  CRETN     ; GO TO COL. ZERO
1802                                 LDB  ROWADX
1803                                 CMPB #NUMLIN-1
1804                                 BEQ  ESCCLL
1805                         *
1806                         ** SCROLL SCREEN DOWN FROM CURSOR
1807                         *
1808                                 LDX  #SCREEN+SCNLEN-LINLEN
1809                         ESCIN0  LDA  ,-X
1810                                 STA  LINLEN,X
1811                                 LDA  SCNLEN,X
1812                                 STA  SCNLEN+LINLEN,X
1813                                 CMPX CURSOR
1814                                 BNE  ESCIN0
1815                         *
1816                         ****************** CLEAR FROM CURSOR TO END OF LINE
1817                         *
1818                         ESCCLL  LDA  COLADX    ; GET CURRENT COLUMN
1819                                 LDX  CURSOR    ; GET CURSOR
1820                                 LDB  #$20      ; AND CLEAR CHAR
1821                         ESCLL1  STB  SCNLEN,X  ; CLEAR ATTRIBUTE
1822                                 STB  ,X+       ; CLEAR TEXT
1823                                 INCA
1824                                 CMPA #LINLEN   ; UNTIL END OF LINE
1825                                 BNE  ESCLL1
1826                                 CLR  ESCFLG
1827                                 RTS
1828                         *
1829                         *********************************** CARRIAGE RETURN
1830                         *
1831                         CRETN   CLRA           ; SET COLUMN ZERO
1832                         POSCOL  LDB  ROWADX    ; GET CURRENT ROW
1833                         *
1834                         *********** GENERATE NEW CURSOR POSITION AND RETURN
1835                         *
1836                         NEWCUR  STD  COLADX    ; SAVE NEW ROW AND COLUMN
1837                                 LDA  #LINLEN   ; ELSE ADD A LINE
1838                                 MUL            ; LINLEN * ROWADX
1839                                 ADDB COLADX
1840                                 ADCA #0
1841                                 ADDD #SCREEN   ; ADD SCREEN BASE.
1842                                 STD  CURSOR    ; SAVE NEW CURSOR
1843                                 TFR  D,X       ; GET CURSOR IN X
1844                                 RTS            ; AND RETURN
1845                         *
1846                         ********************* UPDATE CURRENT COLUMN AND ROW
1847                         *
1848                         NEWCOL  LDD  COLADX    ; GET ROW AND COLUMN
1849                                 INCA           ; BUMP COLUMN
1850                                 CMPA #LINLEN   ; ROLL?
1851                                 BNE  NEWCUR    ; BRANCH IF NOT
1852                                 CLRA           ; ELSE RESET TO ZERO
1853                                 INCB           ; AND BUMP ROW
1854                                 CMPB #NUMLIN
1855                                 BNE  NEWCUR
1856                                 DECB           ; BOTTOM ROW
1857                                 BSR  NEWCUR
1858                         *
1859                         ********************************* SCROLL THE SCREEN
1860                         *
1861                         SCROLL  LDX  #SCREEN   ; POINT TO SCREEN
1862                         SCROL1  LDA  SCNLEN+LINLEN,X
1863                                 STA  SCNLEN,X
1864                                 LDA  LINLEN,X  ; MOVE TWO BYTES
1865                                 STA  ,X+       ; UP ONE LINE
1866                                 CMPX #SCREEN+SCNLEN-LINLEN
1867                                 BNE  SCROL1    ; LOOP UNTIL DONE
1868                                 BRA  SCROL3
1869                         *
1870                         **************** CLEAR FROM CURSOR TO END OF SCREEN
1871                         *
1872                         ESCCLS  LDX   CURSOR   ; GET CURSOR
1873                         SCROL3  LDA   #$20     ; GET A SPACE
1874                         SCROL2  STA   SCNLEN,X ; CLEAR ATTRIBUTES
1875                                 STA   ,X+      ; AND TEXT
1876                                 CMPX  #SCREEN+SCNLEN
1877                                 BNE   SCROL2   ; UNTIL DONE
1878                                 CLR   ESCFLG
1879                                 RTS
1880                                 ENDIF DG640OPT
1880                                 ENDIF DG640OPT
1881                         *
1882                                 IFD PRTOPT
1883                         *************************************
1884                         *
1885                         ** PRINTER DRIVER ROUTINES
1886                         *
1887                         *************************************
1888                         *
1889                         ** PINIZ - INITIATE PRINTER PORT
1890                         *
1891                         PINIZ   PSHS B
1892                                 LDD #DIRMSK*256+$04 ; ACCA=DIRMSK ACCB=$04
1893                                 STD PADATA     ; SET DDR AND SELECT DATA
1894                         *
1895                         ** RESET PRINTER
1896                         *
1897                                 LDB  #PRESET
1898                                 STB  PADATA
1899                         RESTLP  INCB           ; DELAY FOR RESET
1900                                 BNE  RESTLP
1901                                 STA  PADATA    ; ACCA=DIRMSK
1902                         *
1903                         ** INITALIZE PORT B (DATA PORT)
1904                         *
1905                                 LDA  #$2A
1906                                 STA  PBCTRL
1907                                 LDD  #$FF2E    ; ACCA=$FF ACCB =%00101110
1908                                 STD  PBDATA    ; PBDREG   PBCTRL
1909                         *
1910                         ** SELECT 66 LINES/PAGE
1911                         *
1912                                 LDA  #$1B
1913                                 BSR  POUTCH
1914                                 LDA  #'C
1915                                 BSR  POUTCH
1916                                 LDA  #66
1917                                 PULS B
1918                         *************************************
1919                         *
1920                         ** OUTPUT A CHARACTER TO THE PRINTER
1921                         *
1922                         *************************************
1923                         POUTCH  PSHS B
1924                                 LDB  PBDATA    ; CLEAR INTERRUPT BIT
1925                         *
1926                         ** WAIT TILL NOT BUSY
1927                         *
1928                         BUSYLP  LDB  PADATA
1929                                 BITB #PERROR
1930                                 BEQ  PEXIT
1931                                 TSTB
1932                                 BMI  BUSYLP
1933                         *
1934                         ** NOW OUTPUT CHARACTER
1935                         *
1936                                 STA  PBDATA
1937                         PEXIT   PULS B,PC
1938                         *************************************
1939                         *
1940                         ** PCHK TEST IFD PRINTER READY
1941                         *
1942                         *************************************
1943                         PCHK    TST  PBCTRL    ; TEST STATE OF CRB7
1944                                 RTS            ; SET ON ACKNOWLEDGE
1945                                 ENDIF PRTOPT
1945                                 ENDIF PRTOPT
1946                         *************************************
1947                         *
1948                         * MONITOR KEYBOARD COMMAND JUMP TABLE
1949                         *
1950                         *************************************
1951                         *
1952 FE29                    JMPTAB  EQU *
1953 FE29 01                         FCB 1 " ^A "
1954 FE2A FB 74                      FDB ALTRA
1955 FE2C 02                         FCB 2 " ^B "
1956 FE2D FB 69                      FDB ALTRB
1957 FE2F 03                         FCB 3 " ^C "
1958 FE30 FB 7F                      FDB ALTRCC
1959 FE32 04                         FCB 4 " ^D "
1960 FE33 FB 5E                      FDB ALTRDP
1961 FE35 10                         FCB $10 " ^P "
1962 FE36 FB 31                      FDB ALTRPC
1963 FE38 15                         FCB $15 " ^U "
1964 FE39 FB 3D                      FDB ALTRU
1965 FE3B 18                         FCB $18 " ^X "
1966 FE3C FB 53                      FDB ALTRX
1967 FE3E 19                         FCB $19 " ^Y "
1968 FE3F FB 48                      FDB ALTRY
1969                         *
1970 FE41 42                         FCC 'B'
1971 FE42 F9 5C                      FDB BRKPNT
1972 FE44 45                         FCC 'E'
1973 FE45 F8 FD                      FDB MEMDUMP
1974 FE47 47                         FCC 'G'
1975 FE48 F8 A5                      FDB GO
1976 FE4A 4C                         FCC 'L'
1977 FE4B FA 5E                      FDB LOAD
1978 FE4D 50                         FCC 'P'
1979 FE4E FA BC                      FDB PUNCH
1980 FE50 4D                         FCC 'M'
1981 FE51 F8 A8                      FDB MEMCHG
1982 FE53 52                         FCC 'R'
1983 FE54 FB ED                      FDB REGSTR
1984 FE56 53                         FCC 'S'
1985 FE57 F8 F1                      FDB DISSTK
1986 FE59 58                         FCC 'X'
1987 FE5A F9 88                      FDB XBKPNT
1988                                 IFD MFDCOPT
1989                                 FCC 'D'        ; *** SWTPC USES 'U' FOR MINIBOOT
1990                                 FDB MINBOOT
1991                                 ENDIF MFDCOPT
1991                                 ENDIF MFDCOPT
1992                                 IFD CF8OPT
1993 FE5C 44                         FCC 'D'        ; *** FPGA 8 BIT USES 'D' FOR CFBOOT
1994 FE5D F9 D5                      FDB CFBOOT
1995                                 ENDIF CF8OPT
1996                                 IFD IDEOPT
1997                                 FCC 'D'        ; *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
1998                                 FDB IDEBOOT
1999                                 ENDIF IDEOPT
1999                                 ENDIF IDEOPT
2000                                 IFD DMAFOPT
2001                                 FCC 'U'        ; *** SWTPC USES 'D' FOR DMAF2 BOOT
2002                                 FDB DBOOT
2003                                 ENDIF DMAFOPT
2003                                 ENDIF DMAFOPT
2004                                 IFD EXTOPT
2005 FE5F 55                         FCC 'U'        ; *** IF FPGA, 'U' IS FOR USER
2006 FE60 FC 92                      FDB USRCMD
2007                                 ENDIF EXTOPT
2008                                 IFD RTCOPT
2009                                 FCC 'T'
2010                                 FDB TIMSET
2011                                 ENDIF RTCOPT
2011                                 ENDIF RTCOPT
2012                                 IFD TRAOPT
2013                                 FCC "T"
2014                                 FDB TRACE
2015                                 ENDIF TRAOPT
2015                                 ENDIF TRAOPT
2016                         *
2017 FE62                    TABEND  EQU *
2018                         *
2019                         * ** 6809 VECTOR ADDRESSES **
2020                         *
2021                         * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
2022                         * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
2023                         * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
2024                         * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
2025                         * HIS OWN ROUTINES IF HE SO DESIRES.
2026                         *
2027                         *
2028 FE62 F9 94              RAMVEC  FDB SWIE       ; USER-V
2029 FE64 F8 A7                      FDB RTI        ; SWI3-V
2030 FE66 F8 A7                      FDB RTI        ; SWI2-V
2031 FE68 F8 A7                      FDB RTI        ; FIRQ-V
2032 FE6A F8 A7                      FDB RTI        ; IRQ-V
2033 FE6C F9 94                      FDB SWIE       ; SWI-V
2034 FE6E FF FF                      FDB $FFFF      ; SVC-VO
2035 FE70 FF FF                      FDB $FFFF      ; SVC-VL
2036                         *
2037                         * PRINTABLE MESSAGE STRINGS
2038                         *
2039 FE72 0D 0A 00 00 00     MSG1    FCB  $D,$A,$0,$0,$0 * 0, CR/LF, 0
2040 FE77 53 59 53 30 39 42          FCC  'SYS09BUG 1.7 FOR '
          55 47 20 31 2E 37
          20 46 4F 52 20
2041                                 IFD  SWTOPT
2042                                 FCC  'SWTPC'
2043                                 ENDIF SWTOPT
2043                                 ENDIF SWTOPT
2044                                 IFD  ADSOPT
2045                                 FCC  'ADS6809'
2046                                 ENDIF ADSOPT
2046                                 ENDIF ADSOPT
2047                                 IFD  B3SOPT
2048                                 FCC  'B3-S2+'
2049                                 ENDIF B3SOPT
2049                                 ENDIF B3SOPT
2050                                 IFD  B5XOPT
2051                                 FCC  'B5-X300'
2052                                 ENDIF B5XOPT
2052                                 ENDIF B5XOPT
2053                                 IFD  S3SOPT
2054                                 FCC  'S3STARTER'
2055                                 ENDIF S3SOPT
2055                                 ENDIF S3SOPT
2056                                 IFD  S3EOPT
2057                                 FCC  'S3E'
2058                                 ENDIF S3EOPT
2058                                 ENDIF S3EOPT
2059                                 IFD  XESOPT
2060                                 FCC  'XESS'
2061                                 ENDIF XESOPT
2061                                 ENDIF XESOPT
2062                                 IFD  DE270OPT
2063 FE88 44 45 32 2D 37 30          FCC  'DE2-70'
2064                                 ENDIF DE270OPT
2065 FE8E 20 2D 20                   FCC ' - '
2066 FE91 04                         FCB 4
2067 FE92 4B 0D 0A 00 00 00  MSG2    FCB 'K,$0D,$0A,$00,$00,$00,$04 ; K,<CR>,<LF>,3 NULS,<EOT>
          04
2068 FE99 3E                 MSG3    FCC '>'
2069 FE9A 04                         FCB 4
2070 FE9B 57 48 41 54 3F     MSG4    FCC 'WHAT?'
2071 FEA0 04                         FCB 4
2072 FEA1 20 2D 20           MSG5    FCC ' - '
2073 FEA4 04                         FCB 4'
2074 FEA5 20 20 53 50 3D     MSG10   FCC '  SP='
2075 FEAA 04                         FCB 4
2076 FEAB 20 20 50 43 3D     MSG11   FCC '  PC='
2077 FEB0 04                         FCB 4
2078 FEB1 20 20 55 53 3D     MSG12   FCC '  US='
2079 FEB6 04                         FCB 4
2080 FEB7 20 20 49 59 3D     MSG13   FCC '  IY='
2081 FEBC 04                         FCB 4
2082 FEBD 20 20 49 58 3D     MSG14   FCC '  IX='
2083 FEC2 04                         FCB 4
2084 FEC3 20 20 44 50 3D     MSG15   FCC '  DP='
2085 FEC8 04                         FCB 4
2086 FEC9 20 20 41 3D        MSG16   FCC '  A='
2087 FECD 04                         FCB 4
2088 FECE 20 20 42 3D        MSG17   FCC '  B='
2089 FED2 04                         FCB 4
2090 FED3 20 20 43 43 3A 20  MSG18   FCC '  CC: '
2091 FED9 04                         FCB 4
2092 FEDA 45 46 48 49 4E 5A  MSG19   FCC 'EFHINZVC'
          56 43
2093 FEE2 53 31              MSG20   FCC 'S1'
2094 FEE4 04                         FCB 4
2095                                 IFD DATOPT
2096                         *
2097                         * POWER UP/ RESET/ NMI ENTRY POINT
2098                         *
2099 FF00                            ORG $FF00
2100                         *
2101                         *
2102 FF00 8E FF F0           START   LDX  #IC11    ; POINT TO DAT RAM IC11
2103 FF03 86 0F                      LDA  #$0F     ; GET COMPLIMENT OF ZERO
2104                         *
2105                         *
2106                         * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2107                         * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2108                         * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2109                         * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2110                         * STORED IN IT.
2111                         *
2112                         *
2113 FF05 A7 80              DATLP   STA  ,X+       ; STORE & POINT TO NEXT RAM LOCATION
2114 FF07 4A                         DECA           ; GET COMP. VALUE FOR NEXT LOCATION
2115 FF08 26 FB                      BNE  DATLP     ; ALL 16 LOCATIONS INITIALIZED ?
2116                         *
2117                         * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2118                         *       ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2119                         *       PHYSICAL ADDRESSES.
2120                         *
2121 FF0A 86 F0                      LDA  #$F0
2122 FF0C A7 84                      STA  ,X        ; STORE $F0 AT $FFFF
2123 FF0E 8E D0 A0                   LDX  #$D0A0    ; ASSUME RAM TO BE AT $D000-$DFFF
2124 FF11 10 8E 55 AA                LDY  #TSTPAT   ; LOAD TEST DATA PATTERN INTO "Y"
2125 FF15 EE 84              TSTRAM  LDU  ,X        ; SAVE DATA FROM TEST LOCATION
2126 FF17 10 AF 84                   STY  ,X        ; STORE TEST PATTERN AT $D0A0
2127 FF1A 10 AC 84                   CMPY ,X        ; IS THERE RAM AT THIS LOCATION ?
2128 FF1D 27 0B                      BEQ  CNVADR    ; IF MATCH THERE'S RAM, SO SKIP
2129 FF1F 30 89 F0 00                LEAX -$1000,X  ; ELSE POINT 4K LOWER
2130 FF23 8C F0 A0                   CMPX #$F0A0    ; DECREMENTED PAST ZER0 YET ?
2131 FF26 26 ED                      BNE  TSTRAM    ; IF NOT CONTINUE TESTING FOR RAM
2132 FF28 20 D6                      BRA  START     ; ELSE START ALL OVER AGAIN
2133                         *
2134                         *
2135                         * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2136                         * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2137                         * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2138                         * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2139                         * IS STORED IN RAM IN THE LOCATION THAT IS
2140                         * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2141                         * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2142                         * WHEN TESTING LOCATION $70A0, MEANING THERE
2143                         * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2144                         * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2145                         * "7" IN THE $70A0 WILL BE STORED IN
2146                         * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2147                         * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2148                         * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2149                         * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2150                         * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2151                         * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2152                         * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2153                         * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2154                         * OF RAM RESPONDS.
2155                         *
2156                         *
2157 FF2A EF 84              CNVADR  STU  ,X        ; RESTORE DATA AT TEST LOCATION
2158 FF2C 1F 10                      TFR  X,D       ; PUT ADDR. OF PRESENT 4K BLOCK IN D
2159 FF2E 43                         COMA           ; COMPLEMENT MSB OF THAT ADDRESS
2160 FF2F 44                         LSRA           ; PUT MS 4 BITS OF ADDRESS IN
2161 FF30 44                         LSRA           ; LOCATION D0-D3 TO ALLOW STORING
2162 FF31 44                         LSRA           ; IT IN THE DYNAMIC ADDRESS
2163 FF32 44                         LSRA           ; TRANSLATION RAM.
2164 FF33 B7 FF FD                   STA  $FFFD     ; STORE XLATION FACTOR IN DAT "D"
2165                         *
2166 FF36 10 CE DF C0                LDS  #STACK    ; INITIALIZE STACK POINTER
2167                         *
2168                         *
2169                         * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2170                         * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2171                         * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2172                         * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2173                         * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2174                         * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2175                         * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2176                         *
2177                         *  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
2178                         * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2179                         *
2180                         * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2181                         * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2182                         *
2183                         *  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
2184                         * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2185                         *
2186                         *
2187                         * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2188                         * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2189                         * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2190                         * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2191                         * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2192                         * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2193                         * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2194                         * MEMORY ADDRESSED AS FOLLOWS....
2195                         *
2196                         *  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
2197                         * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2198                         *
2199                         *
2200 FF3A 10 8E DF D0                LDY  #LRARAM   ; POINT TO LOGICAL/REAL ADDR. TABLE
2201 FF3E A7 2D                      STA  13,Y      ; STORE $D--- XLATION FACTOR AT $DFDD
2202 FF40 6F 2E                      CLR  14,Y      ; CLEAR $DFDE
2203 FF42 86 F0                      LDA  #$F0      ; DESTINED FOR IC8 AN MEM EXPANSION ?
2204 FF44 A7 2F                      STA  15,Y      ; STORE AT $DFDF
2205 FF46 86 0C                      LDA  #$0C      ; PRESET NUMBER OF BYTES TO CLEAR
2206 FF48 6F A6              CLRLRT  CLR  A,Y       ; CLEAR $DFDC THRU $DFD0
2207 FF4A 4A                         DECA           ; SUB. 1 FROM BYTES LEFT TO CLEAR
2208 FF4B 2A FB                      BPL  CLRLRT    ; CONTINUE IF NOT DONE CLEARING
2209 FF4D 30 89 F0 00        FNDRAM  LEAX -$1000,X  ; POINT TO NEXT LOWER 4K OF RAM
2210 FF51 8C F0 A0                   CMPX #$F0A0    ; TEST FOR DECREMENT PAST ZERO
2211 FF54 27 22                      BEQ  FINTAB    ; SKIP IF FINISHED
2212 FF56 EE 84                      LDU  ,X        ; SAVE DATA AT CURRENT TEST LOCATION
2213 FF58 10 8E 55 AA                LDY  #TSTPAT   ; LOAD TEST DATA PATTERN INTO Y REG.
2214 FF5C 10 AF 84                   STY  ,X        ; STORE TEST PATT. INTO RAM TEST LOC.
2215 FF5F 10 AC 84                   CMPY ,X        ; VERIFY RAM AT TEST LOCATION
2216 FF62 26 E9                      BNE  FNDRAM    ; IF NO RAM GO LOOK 4K LOWER
2217 FF64 EF 84                      STU  ,X        ; ELSE RESTORE DATA TO TEST LOCATION
2218 FF66 10 8E DF D0                LDY  #LRARAM   ; POINT TO LOGICAL/REAL ADDR. TABLE
2219 FF6A 1F 10                      TFR  X,D       ; PUT ADDR. OF PRESENT 4K BLOCK IN D
2220 FF6C 44                         LSRA           ; PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2221 FF6D 44                         LSRA           ; TO ALLOW STORING IT IN THE DAT RAM.
2222 FF6E 44                         LSRA
2223 FF6F 44                         LSRA
2224 FF70 1F 89                      TFR  A,B       ; SAVE OFFSET INTO LRARAM TABLE
2225 FF72 88 0F                      EORA #$0F      ; INVERT MSB OF ADDR. OF CURRENT 4K BLK
2226 FF74 A7 A5                      STA  B,Y       ; SAVE TRANSLATION FACTOR IN LRARAM TABLE
2227 FF76 20 D5                      BRA  FNDRAM    ; GO TRANSLATE ADDR. OF NEXT 4K BLK
2228 FF78 86 F1              FINTAB  LDA  #$F1      ; DESTINED FOR IC8 AND MEM EXPANSION ?
2229 FF7A 10 8E DF D0                LDY  #LRARAM   ; POINT TO LRARAM TABLE
2230 FF7E A7 2E                      STA  14,Y      ; STORE $F1 AT $DFCE
2231                         *
2232                         * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2233                         * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2234                         * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2235                         * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2236                         *
2237                         *
2238 FF80 86 0C                      LDA  #$0C      ; PRESET NUMBER HEX "C"
2239 FF82 E6 A6              FINDC   LDB  A,Y       ; GET ENTRY FROM LRARAM TABLE
2240 FF84 26 05                      BNE  FOUNDC    ; BRANCH IF RAM THIS PHYSICAL ADDR.
2241 FF86 4A                         DECA           ; ELSE POINT 4K LOWER
2242 FF87 2A F9                      BPL  FINDC     ; GO TRY AGAIN
2243 FF89 20 14                      BRA  XFERTF
2244 FF8B 6F A6              FOUNDC  CLR  A,Y       ; CLR XLATION FACTOR OF 4K BLOCK FOUND
2245 FF8D E7 2C                      STB  $0C,Y     ; GIVE IT XLATION FACTOR MOVING IT TO $C---
2246                         *
2247                         * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2248                         * FACTORS SUCH THAT ALL REMAINING RAM WILL
2249                         * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2250                         * ADDRESSES FROM $0000 AND UP....
2251                         *
2252 FF8F 4F                         CLRA           ; START AT ZERO
2253 FF90 1F 21                      TFR  Y,X       ; START POINTER "X" START OF "LRARAM" TABLE.
2254 FF92 E6 A6              COMPRS  LDB  A,Y       ; GET ENTRY FROM "LRARAM" TABLE
2255 FF94 27 04                      BEQ  PNTNXT    ; IF IT'S ZER0 SKIP
2256 FF96 6F A6                      CLR  A,Y       ; ELSE ERASE FROM TABLE
2257 FF98 E7 80                      STB  ,X+       ; AND ENTER ABOVE LAST ENTRY- BUMP
2258 FF9A 4C                 PNTNXT  INCA           ; GET OFFSET TO NEXT ENTRY
2259 FF9B 81 0C                      CMPA #$0C      ; LAST ENTRY YET ?
2260 FF9D 2D F3                      BLT  COMPRS
2261                         *
2262                         * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2263                         * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2264                         * THE MP-09 CPU CARD.
2265                         *
2266 FF9F 8E FF F0           XFERTF  LDX  #IC11     ; POINT TO DAT RAM IC11
2267 FFA2 C6 10                      LDB  #$10      ; GET NO. OF BYTES TO MOVE
2268 FFA4 A6 A0              FETCH   LDA  ,Y+       ; GET BYTE AND POINT TO NEXT
2269 FFA6 A7 80                      STA  ,X+       ; POKE XLATION FACTOR IN IC11
2270 FFA8 5A                         DECB           ; SUB 1 FROM BYTES TO MOVE
2271 FFA9 26 F9                      BNE  FETCH     ; CONTINUE UNTIL 16 MOVED
2272                         *
2273                                 ELSE
2274                         LRA     RTS
2275                         START   LDS  #STACK    ; INITIALIZE STACK POINTER
2276                                 CLRB
2277                                 ENDIF DATOPT
2277                                 ENDIF DATOPT
2278                         *
2279 FFAB 53                         COMB           ; SET "B" NON-ZERO
2280 FFAC F7 DF E2                   STB  ECHO      ; TURN ON ECHO FLAG
2281 FFAF 16 F8 62                   LBRA MONITOR   ; INITIALIZATION IS COMPLETE
2282                         *
2283                         ** INTERRUPT JUMP VECTORS
2284                         *
2285 FFB2 6E 9F DF C0        V1      JMP  [STACK]
2286 FFB6 6E 9F DF C4        V2      JMP  [SWI2]
2287 FFBA 6E 9F DF C6        V3      JMP  [FIRQ]
2288 FFBE 6E 9F DF C8        V4      JMP  [IRQ]
2289 FFC2 6E 9F DF CA        V5      JMP  [SWI]
2290                         *
2291                         * SWI3 ENTRY POINT
2292                         *
2293 FFC6 1F 43              SWI3E   TFR  S,U
2294 FFC8 AE 4A                      LDX  10,U      *$FFC8
2295 FFCA E6 80                      LDB  ,X+
2296 FFCC AF 4A                      STX  10,U
2297 FFCE 4F                         CLRA
2298 FFCF 58                         ASLB
2299 FFD0 49                         ROLA
2300 FFD1 BE DF CC                   LDX  SVCVO
2301 FFD4 8C FF FF                   CMPX #$FFFF
2302 FFD7 27 0F                      BEQ  SWI3Z
2303 FFD9 30 8B                      LEAX D,X
2304 FFDB BC DF CE                   CMPX SVCVL
2305 FFDE 22 08                      BHI  SWI3Z
2306 FFE0 34 10                      PSHS X
2307 FFE2 EC C4                      LDD  ,U
2308 FFE4 AE 44                      LDX  4,U
2309 FFE6 6E F1                      JMP  [,S++]
2310 FFE8 37 1F              SWI3Z   PULU A,B,X,CC,DP
2311 FFEA EE 42                      LDU  2,U
2312 FFEC 6E 9F DF C2                JMP  [SWI3]
2313                         *
2314                         * 6809 VECTORS
2315                         *
2316 FFF0                            ORG $FFF0
2317 FFF0 FF B2                      FDB V1    USER-V
2318 FFF2 FF C6                      FDB SWI3E SWI3-V
2319 FFF4 FF B6                      FDB V2    SWI2-V
2320 FFF6 FF BA                      FDB V3    FIRQ-V
2321 FFF8 FF BE                      FDB V4    IRQ-V
2322 FFFA FF C2                      FDB V5    SWI-V
2323 FFFC FF B2                      FDB V1    NMI-V
2324 FFFE FF 00                      FDB START RESTART-V
0004                                 END START
0005                          END 
Program + Init Data = 2021 bytes
Error count = 0

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.