URL
https://opencores.org/ocsvn/rf6809/rf6809/trunk
Subversion Repositories rf6809
[/] [rf6809/] [trunk/] [software/] [boot/] [boot_rom.lst] - Rev 16
Go to most recent revision | Compare with Previous | Blame | View Log
3 error(s), 526 warning(s) unlisted in pass 1; ============================================================================; __; \\__/ o\ (C) 2013-2022 Robert Finch, Waterloo; \ __ / All rights reserved.; \/_// robfinch<remove>@opencores.org; ||;;; BSD 3-Clause License; Redistribution and use in source and binary forms, with or without; modification, are permitted provided that the following conditions are met:;; 1. Redistributions of source code must retain the above copyright notice, this; list of conditions and the following disclaimer.;; 2. Redistributions in binary form must reproduce the above copyright notice,; this list of conditions and the following disclaimer in the documentation; and/or other materials provided with the distribution.;; 3. Neither the name of the copyright holder nor the names of its; contributors may be used to endorse or promote products derived from; this software without specific prior written permission.;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.;; ============================================================================;; ============================================================================; __; \\__/ o\ (C) 2013-2022 Robert Finch, Waterloo; \ __ / All rights reserved.; \/_// robfinch<remove>@opencores.org; ||;;; BSD 3-Clause License; Redistribution and use in source and binary forms, with or without; modification, are permitted provided that the following conditions are met:;; 1. Redistributions of source code must retain the above copyright notice, this; list of conditions and the following disclaimer.;; 2. Redistributions in binary form must reproduce the above copyright notice,; this list of conditions and the following disclaimer in the documentation; and/or other materials provided with the distribution.;; 3. Neither the name of the copyright holder nor the names of its; contributors may be used to endorse or promote products derived from; this software without specific prior written permission.;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.;; ============================================================================;CR EQU $0D ;ASCII equatesLF EQU $0ATAB EQU $09CTRLC EQU $03CTRLH EQU $08CTRLI EQU $09CTRLJ EQU $0ACTRLK EQU $0BCTRLM EQU $0DCTRLS EQU $13CTRLT EQU $14CTRLX EQU $18CTRLZ EQU $1AXON EQU $11XOFF EQU $13FIRST_CORE EQU 1MAX_TASKNO EQU 63DRAM_BASE EQU $10000000; ROM monitor functions;MF_Monitor EQU 0MF_INCH EQU 1MF_OUTCH EQU 2MF_CRLF EQU 3MF_DisplayString EQU 4MF_DisplayByteAsHex EQU 5MF_DisplayWordAsHex EQU 6MF_ShowSprites EQU 7MF_Srand EQU 8MF_Random EQU 9MF_OSCALL EQU 10MF_GetRange EQU 11 ; gets a pair of numbers last>firstMF_GetNumber EQU 12mon_numwka EQU $910mon_r1 EQU $920mon_r2 EQU $924; ============================================================================; __; \\__/ o\ (C) S2022 Robert Finch, Waterloo; \ __ / All rights reserved.; \/_// robfinch<remove>@opencores.org; ||;;; BSD 3-Clause License; Redistribution and use in source and binary forms, with or without; modification, are permitted provided that the following conditions are met:;; 1. Redistributions of source code must retain the above copyright notice, this; list of conditions and the following disclaimer.;; 2. Redistributions in binary form must reproduce the above copyright notice,; this list of conditions and the following disclaimer in the documentation; and/or other materials provided with the distribution.;; 3. Neither the name of the copyright holder nor the names of its; contributors may be used to endorse or promote products derived from; this software without specific prior written permission.;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.;; ============================================================================COREID EQU $FFFFFFFE0MSCOUNT EQU $FFFFFFFE4LEDS EQU $FFFE60001VIA EQU $FFFE60000VIA_PA EQU 1VIA_DDRA EQU 3VIA_ACR EQU 11VIA_IFR EQU 13VIA_IER EQU 14VIA_T3LL EQU 18VIA_T3LH EQU 19VIA_T3CMPL EQU 20VIA_T3CMPH EQU 21TEXTSCR EQU $FFFE00000TEXTREG EQU $FFFE07F00TEXT_COLS EQU 0TEXT_ROWS EQU 1TEXT_CURPOS EQU 34COLS EQU 64ROWS EQU 32ACIA EQU $FFFE30100ACIA_TX EQU 0ACIA_RX EQU 0ACIA_STAT EQU 1ACIA_CMD EQU 2ACIA_CTRL EQU 3ACIA_CTRL2 EQU 11RTC EQU $FFFE30500 ; I2CRTCBuf EQU $7FC0PRNG EQU $FFFE30600KEYBD EQU $FFFE30400KEYBDCLR EQU $FFFE30402PIC EQU $FFFE3F000SPRITE_CTRL EQU $FFFE10000SPRITE_EN EQU $3C0OUTSEMA EQU $EF0000SEMAABS EQU $1000OSSEMA EQU $EF0010OPC_SWI EQU $03FScreenLocation EQU $10ColorCodeLocation EQU $14ScreenLocation2 EQU $18BlkcpySrc EQU $1CBlkcpyDst EQU $20Strptr EQU $24PICptr EQU $28; Forth Area; 0x30-0x60; Task control blocks, room for 256 tasksTCB_NxtRdy EQU $00 ; next task on ready / timeout listTCB_PrvRdy EQU $04 ; previous task on ready / timeout listTCB_NxtTCB EQU $08TCB_Timeout EQU $0CTCB_Priority EQU $10TCB_MSGPTR_D1 EQU $14TCB_MSGPTR_D2 EQU $18TCB_hJCB EQU $1CTCB_Status EQU $1ETCB_CursorRow EQU $20TCB_CursorCol EQU $21TCB_hWaitMbx EQU $22 ; handle of mailbox task is waiting atTCB_mbq_next EQU $24 ; mailbox queue nextTCB_mbq_prev EQU $28 ; mailbox queue previousTCB_iof_next EQU $2CTCB_iof_prev EQU $30TCB_SPSave EQU $34 ; TCB_SPSave areaTCB_mmu_map EQU $38KeybdHead EQU $FFFFFC800KeybdTail EQU $FFFFFC900KeybdEcho EQU $FFFFFCA00KeybdBad EQU $FFFFFCB00KeybdAck EQU $FFFFFCC00KeybdLocks EQU $FFFFFCD00KeybdBuffer EQU $FFFFFC000 ; buffer is 16 charsBIOS_SCREENS EQU $17000000 ; $17000000 to $171FFFFF; EhBASIC vars:;NmiBase EQU $FFC013IrqBase EQU $FFC014IOFocusNdx EQU $100; These variables in global OS storage areaIOFocusList EQU $FFC000 ; to $FF000FIOFocusID EQU $FFC010IrqSource EQU $FFC011IRQFlag EQU $FFC012RunningID EQU $FFC013; Top of boot stack is at $FFC0FF; These variables use direct page accessCursorRow EQU $110CursorCol EQU $111CharColor EQU $112ScreenColor EQU $113CursorFlash EQU $114KeyState1 EQU $120KeyState2 EQU $121KeyLED EQU $122KeybdID EQU $124KeybdBlock EQU $126kbdHeadRcv EQU $127kbdTailRcv EQU $128kbdFifo EQU $40 ; in local RAMkbdFifoAlias EQU $C00040 ; to $C0007F ; alias for $40 to $7FSerhZero EQU $130SerHeadRcv EQU $131SertZero EQU $132SerTailRcv EQU $133SerHeadXmit EQU $136SerTailXmit EQU $138SerRcvXon EQU $139SerRcvXoff EQU $140SerRcvBuf EQU $BFF000 ; 4kB serial recieve bufferfarflag EQU $15Fasmbuf EQU $160 ; to $17FQNdx0 EQU $780QNdx1 EQU QNdx0+2QNdx2 EQU QNdx1+2QNdx3 EQU QNdx2+2QNdx4 EQU QNdx3+2FreeTCB EQU QNdx4+2TimeoutList EQU FreeTCB+2FreeMbx EQU RunningTCB + 2nMailbox EQU FreeMbx + 2FreeMsg EQU nMailbox + 2nMsgBlk EQU FreeMsg + 2CharOutVec EQU $800CharInVec EQU $804CmdPromptJI EQU $808MonErrVec EQU $80CBreakpointFlag EQU $810NumSetBreakpoints EQU $811Breakpoints EQU $820 ; to $82FBreakpointBytes EQU $830 ; to $83Fmon_vectb EQU $880; Register save area for monitormon_DSAVE EQU $900mon_XSAVE EQU $902mon_YSAVE EQU $904mon_USAVE EQU $906mon_SSAVE EQU $908mon_PCSAVE EQU $90Amon_DPRSAVE EQU $90Emon_CCRSAVE EQU $90Fmon_numwka EQU $910mon_r1 EQU $920mon_r2 EQU $924jmpvec EQU $928mon_init EQU $92Cmon_retflag EQU $930; The ORG directive must set an address a multiple of 4 in order for the Verilog; output to work correctly.org $FFD0AC00FFD0AC 012 nop00FFD0AD 012 nop00FFD0AE 012 nopXBLANK00FFD0AF 0C6020 ldb #' '00FFD0B1 017001E2D lbsr OUTCH00FFD0B4 039 rtsorg $FFD0D000FFD0D0 012 nop00FFD0D1 012 nopCRLFCRLF1:00FFD0D2 0C600D ldb #CR00FFD0D4 017001E0A lbsr OUTCH00FFD0D7 0C600A ldb #LF00FFD0D9 017001E05 lbsr OUTCH00FFD0DC 039 rtsorg $FFD0F000FFD0F0 012 nop00FFD0F1 020FDF bra CRLF1org $FFD1DCONEKEY00FFD1DC 06E90F000804 jmp [CharInVec]org $FFD2C000FFD2C0 012 nopLETTER00FFD2C1 017001C1D lbsr OUTCH00FFD2C4 039 rtsorg $FFD2CC00FFD2CC 012 nop00FFD2CD 012 nopHEX200FFD2CE 017001166 lbsr DispByteAsHex00FFD2D1 039 rtsHEX400FFD2D2 017001159 lbsr DispWordAsHex00FFD2D5 039 rtsorg $FFD300ClearScreenJmp00FFD300 016000F36 lbra ClearScreenorg $FFD308HomeCursorJmp00FFD308 016000FA5 lbra HomeCursororg $FFD400; Local RAM test routine; Checkerboard testing.; There is 70kB of local RAM; Does not use any RAM including no stackramtest:00FFD400 18E000000 ldy #000FFD403 086001 lda #100FFD405 0150B7FFFE60001 sta LEDS00FFD40A 0CCAAA555 ldd #$AAA555ramtest1:00FFD40D 0EDA01 std ,y++00FFD40F 18C008000 cmpy #$800000FFD412 025FF9 blo ramtest1; now readback values and compare00FFD414 18E000000 ldy #0ramtest3:00FFD417 0ECA01 ldd ,y++00FFD419 183AAA555 cmpd #$AAA55500FFD41C 02600E bne ramerr00FFD41E 18C008000 cmpy #$800000FFD421 025FF4 blo ramtest300FFD423 086002 lda #200FFD425 0150B7FFFE60001 sta LEDS00FFD42A 06EC04 jmp ,uramerr:00FFD42C 086080 lda #$8000FFD42E 0150B7FFFE60001 sta LEDS00FFD433 0150F6FFFFFFFE0 ldb COREID00FFD438 0C1020 cmpb #$2000FFD43A 027009 beq ramerr100FFD43C 08EE00000 ldx #TEXTSCR00FFD43F 03A abx00FFD440 086046 lda #'F'00FFD442 0A7804 sta ,x00FFD444 013 syncramerr1:00FFD445 06EC04 jmp ,uorg $FFE00000FFE000 FFF039 FDB Monitor00FFE002 FFE022 FDB DumRts ; NEXTCMD00FFE004 FFEEA9 FDB INCH00FFE006 FFEEC7 FDB INCHE00FFE008 FFEECB FDB INCHEK00FFE00A FFEEE1 FDB OUTCH00FFE00C FFE41B FDB PDATA00FFE00E FFE40E FDB PCRLF00FFE010 FFE40A FDB PSTRNG00FFE012 FFE022 FDB DumRts ; LRA00FFE014 FFE022 FDB DumRts00FFE016 FFE022 FDB DumRts00FFE018 FFE022 FDB DumRts00FFE01A FFE022 FDB DumRts ; VINIZ00FFE01C FFE319 FDB DisplayChar ; VOUTCH00FFE01E FFE022 FDB DumRts ; ACINIZ00FFE020 FFE022 FDB DumRts ; AOUTCHDumRts:00FFE022 039 rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------start:00FFE023 086FFF lda #$FFF ; all cores can do this00FFE025 0150B7FFFE60003 sta VIA+VIA_DDRA00FFE02A 086055 lda #$55 ; see if we can at least set LEDs00FFE02C 0150B7FFFE60001 sta LEDS00FFE031 086001 lda #1 ; prime OS semaphore00FFE033 0B7EF1010 sta OSSEMA+$100000FFE036 0B7EF1000 sta OUTSEMA+$100000FFE039 0CEFFE03C ldu #st6 ; U = return address; jmp ramtest ; JMP dont JSRst6:00FFE03C 1CE006FFF lds #$6FFF ; boot up stack area00FFE03F 0150B6FFFFFFFE0 lda COREID00FFE044 081001 cmpa #FIRST_CORE; beq st8; sync ; halt cores other than 2st8:; bne skip_init; bsr romToRam; ldd #st7 & $FFFF; tfr d,x; jmp ,x ; jump to the BIOS now in local RAMst7:00FFE046 08D16D bsr Delay3s ; give some time for devices to reset00FFE048 07F000810 clr BreakpointFlag00FFE04B 07F000811 clr NumSetBreakpoints00FFE04E 0860AA lda #$AA00FFE050 0150B7FFFE60001 sta LEDS00FFE055 0150B6FFFFFFFE0 lda COREID00FFE05A 081020 cmpa #$2000FFE05C 027002 beq st1100FFE05E 086001 lda #FIRST_COREst11:00FFE060 0B7FFC010 sta IOFocusID ; core #2 has focus00FFE063 0B7FFC013 sta RunningID; Clear IO focus list00FFE066 08E000000 ldx #0st9:00FFE069 06F80A000FFC000 clr IOFocusList,x00FFE06E 030001 inx00FFE070 08C000010 cmpx #1600FFE073 025FF4 blo st900FFE075 086018 lda #2400FFE077 0B7FFC001 sta IOFocusList+FIRST_CORE00FFE07A 0860CE lda #$0CE00FFE07C 097113 sta ScreenColor00FFE07E 097112 sta CharColor00FFE080 08D1B7 bsr ClearScreen00FFE082 0CCFFE319 ldd #DisplayChar00FFE085 0FD000800 std CharOutVec00FFE088 0CCFFEC64 ldd #SerialPeekCharDirect00FFE08B 0FD000804 std CharInVec; swi; fcb MF_OSCALL; fcb 24 ; request IO focus00FFE08E 0150F6FFFFFFFE0 ldb COREID00FFE093 0C1001 cmpb #FIRST_CORE00FFE095 027011 beq init00FFE097 0C1020 cmpb #$20 ; CmodA709 core?00FFE099 02705D beq init200FFE09B 02006D bra skip_init00FFE09D 0200B4 bra multi_sievest3:00FFE09F 0860FF lda #$FF00FFE0A1 0150B7FFFE60001 sta LEDS00FFE0A6 020FF7 bra st3; initialize interrupt controller; first, zero out all the vectorsinit:00FFE0A8 017000449 lbsr rtc_read ; get clock values00FFE0AB 08E000127 ldx #kbdHeadRcv00FFE0AE 0C6020 ldb #32 ; number of bytes to zero outinit1:00FFE0B0 06F800 clr ,x+00FFE0B2 05A decb00FFE0B3 026FFB bne init1st1:00FFE0B5 06F809E3F000 clr PIC,x ; cause code00FFE0B9 0A7809E3F001 sta PIC+1,x00FFE0BD 0E7809E3F002 stb PIC+2,x00FFE0C1 030004 leax 4,x00FFE0C3 08C000100 cmpx #25600FFE0C6 025FED blo st100FFE0C8 086081 lda #$81 ; make irq edge sensitive00FFE0CA 0150B7FFFE3F0FD sta PIC+$FD00FFE0CF 08601F lda #31 ; enable timer interrupt00FFE0D1 0150B7FFFE3F009 sta PIC+900FFE0D6 086040 lda #COLS00FFE0D8 0150B7FFFE07F00 sta TEXTREG+TEXT_COLS00FFE0DD 086020 lda #ROWS00FFE0DF 0150B7FFFE07F01 sta TEXTREG+TEXT_ROWS00FFE0E4 08D153 bsr ClearScreen00FFE0E6 08D1C8 bsr HomeCursor00FFE0E8 08E000000 ldx #000FFE0EB 0CC000000 ldd #000FFE0EE 017000DFA lbsr ShowSprites00FFE0F1 0170008CC lbsr KeybdInit00FFE0F4 0DC124 ldd KeybdID00FFE0F6 08D336 bsr DispWordAsHexinit2:00FFE0F8 01700036A lbsr TimerInit00FFE0FB 017000AF1 lbsr InitSerial00FFE0FE 08E000080 ldx #12800FFE101 086001 lda #1 ; set irq(bit0), clear firq (bit1), disable int (bit 6), clear edge sense(bit 7)00FFE103 0C6001 ldb #FIRST_CORE ; serving core id; lda #4 ; make the timer interrupt edge sensitive; sta PIC+4 ; reg #4 is the edge sensitivity setting; sta PIC ; reg #0 is interrupt enable00FFE105 0C6001 ldb #100FFE107 0F7EF1000 stb OUTSEMA+SEMAABS ; set semaphore to 1 available slotskip_init:00FFE10A 01C0EF andcc #$EF ; unmask irq00FFE10C 086005 lda #500FFE10E 0150B7FFFE60001 sta LEDS00FFE113 0CCFFE11C ldd #msgStartup00FFE116 08D2C2 bsr DisplayStringst10:00FFE118 03F swi00FFE119 000 fcb MF_Monitor00FFE11A 020FFC bra st10msgStartup00FFE11C 072066036038030039020 fcb "rf6809 12-bit System Starting.",CR,LF,000FFE123 03103202D06206907402000FFE12A 05307907307406506D02000FFE131 05307406107207406906E00FFE138 06702E00D00A000;------------------------------------------------------------------------------; The checkpoint register must be cleared within 1 second or a NMI interrupt; will occur. checkpoint should be called with a JSR so that the global ROM; routine is called.;; Modifies:; none;------------------------------------------------------------------------------checkpoint:00FFE13D 01507FFFFFFFFE1 clr $FFFFFFFE1 ; writing any value will do00FFE142 039 rts;------------------------------------------------------------------------------; Copy the system ROM to local RAM; Running the code from local RAM is probably an order of magnitude faster; then running from the global ROM. It also reduces the network traffic to; run from local RAM.;; Modifies:; d,x,y;------------------------------------------------------------------------------romToRam:00FFE143 08EFFC000 ldx #$FFC00000FFE146 18E00C000 ldy #$00C000romToRam1:00FFE149 0EC801 ldd ,x++00FFE14B 0EDA01 std ,y++00FFE14D 08C000000 cmpx #000FFE150 026FF7 bne romToRam100FFE152 039 rts;------------------------------------------------------------------------------; Multi-core sieve program.;------------------------------------------------------------------------------; First fill screen chars with 'P' indicating prime positions; Each core is responsible for the Nth position where N is the; core number minus two.;multi_sieve:00FFE153 086050 lda #'P' ; indicate prime00FFE155 0150F6FFFFFFFE0 ldb COREID ; find out which core we are00FFE15A 0C0001 subb #FIRST_CORE00FFE15C 08E000000 ldx #0 ; start at first char of screen00FFE15F 03A abxmulti_sieve3:00FFE160 0A7809E00000 sta TEXTSCR,x ; store 'P'00FFE164 030008 leax 8,x ; advance to next position00FFE166 08C000FFF cmpx #409500FFE169 025FF5 blo multi_sieve300FFE16B 0BDFFE13D jsr checkpoint*** warning 1: Long branch within short branch range could be optimized00FFE16E 0CB002 addb #2 ; start sieve at 2 (core id)00FFE170 08604E lda #'N' ; flag position value of 'N' for non-primemulti_sieve2:00FFE172 08E000000 ldx #000FFE175 03A abx ; skip the first position - might be primemulti_sieve1:00FFE176 03A abx ; increment00FFE177 0A7809E00000 sta TEXTSCR,x00FFE17B 08C000FFF cmpx #409500FFE17E 025FF6 blo multi_sieve100FFE180 0BDFFE13D jsr checkpoint*** warning 1: Long branch within short branch range could be optimized00FFE183 0CB008 addb #8 ; number of cores working on it00FFE185 0C1FF0 cmpb #408000FFE187 025FE9 blo multi_sieve2multi_sieve4: ; hang machine00FFE189 013 sync00FFE18A 016000EAC lbra Monitor;------------------------------------------------------------------------------; Single core sieve.;------------------------------------------------------------------------------sieve:00FFE18D 086050 lda #'P' ; indicate prime00FFE18F 08E000000 ldx #0 ; start at first char of screensieve3:00FFE192 0A7809E00000 sta TEXTSCR,x ; store 'P'00FFE196 030001 inx ; advance to next position00FFE198 08C000FFF cmpx #409500FFE19B 025FF5 blo sieve300FFE19D 0C6002 ldb #2 ; start sieve at 200FFE19F 08604E lda #'N' ; flag position value of 'N' for non-primesieve2:00FFE1A1 08E000000 ldx #000FFE1A4 03A abx ; skip the first position - might be primesieve1:00FFE1A5 03A abx ; increment00FFE1A6 0A7809E00000 sta TEXTSCR,x00FFE1AA 08C000FFF cmpx #409500FFE1AD 025FC7 blo multi_sieve100FFE1AF 05C incb ; number of cores working on it00FFE1B0 0C1FF0 cmpb #408000FFE1B2 025FED blo sieve2sieve4: ; hang machine00FFE1B4 039 rts;------------------------------------------------------------------------------; Three second delay for user convenience and to allow some devices time to; reset.;------------------------------------------------------------------------------Delay3s:00FFE1B5 0CC895440 ldd #9000000dly3s1:00FFE1B8 0C10FF cmpb #$FF00FFE1BA 026000 bne dly3s2dly3s2:00FFE1BC 0150B7FFFE60001 sta LEDS00FFE1C1 083000001 subd #100FFE1C4 026FF2 bne dly3s100FFE1C6 039 rts;------------------------------------------------------------------------------;------------------------------------------------------------------------------ShiftLeft5:00FFE1C7 058 aslb00FFE1C8 049 rola00FFE1C9 058 aslb00FFE1CA 049 rola00FFE1CB 058 aslb00FFE1CC 049 rola00FFE1CD 058 aslb00FFE1CE 049 rola00FFE1CF 058 aslb00FFE1D0 049 rola00FFE1D1 039 rts;------------------------------------------------------------------------------; Parameters:; b = core id of core to copy;------------------------------------------------------------------------------;CopyVirtualScreenToScreen:00FFE1D2 034076 pshs d,x,y,u; Compute virtual screen location for core passed in accb.00FFE1D4 01F098 tfr b,a00FFE1D6 048 asla00FFE1D7 048 asla00FFE1D8 048 asla00FFE1D9 048 asla00FFE1DA 08AC00 ora #$C0000FFE1DC 05F clrb00FFE1DD 01F001 tfr d,x00FFE1DF 034006 pshs d00FFE1E1 18EE00000 ldy #TEXTSCR00FFE1E4 0CE000400 ldu #COLS*ROWS/2cv2s1:00FFE1E7 0EC801 ldd ,x++00FFE1E9 0EDA01 std ,y++00FFE1EB 0335FF leau -1,u00FFE1ED 283000000 cmpu #000FFE1F0 026FF5 bne cv2s1; reset the cursor position in the text controller00FFE1F2 035010 puls x00FFE1F4 0E6808110 ldb CursorRow,x00FFE1F7 086040 lda #COLS00FFE1F9 03D mul00FFE1FA 01F002 tfr d,y00FFE1FC 0E6808111 ldb CursorCol,x00FFE1FF 01F021 tfr y,x00FFE201 03A abx00FFE202 0150BFFFFE07F22 stx TEXTREG+TEXT_CURPOS00FFE207 0350F6 puls d,x,y,u,pc;------------------------------------------------------------------------------;------------------------------------------------------------------------------;CopyScreenToVirtualScreen:00FFE209 034076 pshs d,x,y,u00FFE20B 08D08D bsr GetScreenLocation00FFE20D 01F002 tfr d,y00FFE20F 08EE00000 ldx #TEXTSCR00FFE212 0CE000400 ldu #COLS*ROWS/2cs2v1:00FFE215 0EC801 ldd ,x++00FFE217 0EDA01 std ,y++00FFE219 0335FF leau -1,u00FFE21B 283000000 cmpu #000FFE21E 026FF5 bne cs2v100FFE220 0350F6 puls d,x,y,u,pc;------------------------------------------------------------------------------;------------------------------------------------------------------------------00FFE222 054045058054053043052 fcb "TEXTSCR "00FFE229 02000FFE22A FFE234 fcw TextOpen00FFE22C FFE235 fcw TextClose00FFE22E FFE236 fcw TextRead00FFE230 FFE237 fcw TextWrite00FFE232 FFE238 fcw TextSeekTextOpen:00FFE234 039 rtsTextClose:00FFE235 039 rtsTextRead:00FFE236 039 rtsTextWrite:00FFE237 039 rtsTextSeek:00FFE238 039 rts;------------------------------------------------------------------------------; Clear the screen and the screen color memory; We clear the screen to give a visual indication that the system; is working at all.;; Modifies:; none;------------------------------------------------------------------------------ClearScreen:00FFE239 034076 pshs d,x,y,u00FFE23B 08E000800 ldx #COLS*ROWS00FFE23E 01F013 tfr x,u00FFE240 08D058 bsr GetScreenLocation00FFE242 01F002 tfr d,y00FFE244 0C6020 ldb #' ' ; space charcs1:00FFE246 0E7A00 stb ,y+ ; set text to space00FFE248 0301FF leax -1,x ; decrement x00FFE24A 026FFA bne cs100FFE24C 0150F6FFFFFFFE0 ldb COREID ; update colors only if we have focus00FFE251 0F1FFC010 cmpb IOFocusID00FFE254 02000D bra cs300FFE256 18EE02000 ldy #TEXTSCR+$2000; lda CharColor00FFE259 0860CE lda #$0CE00FFE25B 01F031 tfr u,x ; get back countcs2:00FFE25D 0A7A00 sta ,y+00FFE25F 0301FF dex ; decrement x00FFE261 026FFA bne cs2cs3:00FFE263 0350F6 puls d,x,y,u,pc;------------------------------------------------------------------------------; Scroll text on the screen upwards;; Modifies:; none;------------------------------------------------------------------------------ScrollUp:00FFE265 034076 pshs d,x,y,u00FFE267 18E0003FF ldy #(COLS*ROWS-1)/2 ; y = num chars/2 to move00FFE26A 08D02E bsr GetScreenLocation00FFE26C 01F001 tfr d,x00FFE26E 01F003 tfr d,u00FFE270 030040 leax COLS,x ; x = index to source rowscrup1:00FFE272 0EC801 ldd ,x++ ; move 2 characters00FFE274 0EDC01 std ,u++00FFE276 0313FF dey00FFE278 026FF8 bne scrup100FFE27A 08601F lda #ROWS-100FFE27C 08D002 bsr BlankLine00FFE27E 0350F6 puls d,x,y,u,pc;------------------------------------------------------------------------------; Blank out a line on the display;; Modifies:; none; Parameters:; acca = line number to blank;------------------------------------------------------------------------------BlankLine:00FFE280 034016 pshs d,x00FFE282 034002 pshs a00FFE284 08D014 bsr GetScreenLocation00FFE286 01F001 tfr d,x00FFE288 035002 puls a00FFE28A 0C6040 ldb #COLS ; b = # chars to blank out from video controller00FFE28C 03D mul ; d = screen index (row# * #cols)00FFE28D 03080B leax d,x00FFE28F 086020 lda #' '00FFE291 0C6040 ldb #COLS ; b = # chars to blank out from video controllerblnkln1:00FFE293 0A7800 sta ,x+00FFE295 05A decb00FFE296 026FFB bne blnkln100FFE298 035096 puls d,x,pc;------------------------------------------------------------------------------; Get the location of the screen memory. The location; depends on whether or not the task has the output focus.;; Modifies:; d; Retuns:; d = screen location;------------------------------------------------------------------------------GetScreenLocation:00FFE29A 0150B6FFFFFFFE0 lda COREID ; which core are we?00FFE29F 0B1FFC010 cmpa IOFocusID ; do we have the IO focus00FFE2A2 026008 bne gsl1 ; no, go pick virtual screen address00FFE2A4 081020 cmpa #$20 ; CmodA709?00FFE2A6 027004 beq gsl100FFE2A8 0CCE00000 ldd #TEXTSCR ; yes, we update the real screen00FFE2AB 039 rtsgsl1:00FFE2AC 0CC007800 ldd #$780000FFE2AF 039 rts;------------------------------------------------------------------------------; HomeCursor; Set the cursor location to the top left of the screen.;; Modifies:; none;------------------------------------------------------------------------------HomeCursor:00FFE2B0 034016 pshs d,x00FFE2B2 00F110 clr CursorRow00FFE2B4 00F111 clr CursorCol00FFE2B6 0150F6FFFFFFFE0 ldb COREID00FFE2BB 0F1FFC010 cmpb IOFocusID00FFE2BE 02600A bne hc100FFE2C0 0C1020 cmpb #$2000FFE2C2 027006 beq hc100FFE2C4 04F clra00FFE2C5 0150B7FFFE07F22 sta TEXTREG+TEXT_CURPOShc1:00FFE2CA 035096 puls d,x,pc;------------------------------------------------------------------------------; Update the cursor position in the text controller based on the; CursorRow,CursorCol.;; Modifies:; none;------------------------------------------------------------------------------;UpdateCursorPos:00FFE2CC 034016 pshs d,x00FFE2CE 0150F6FFFFFFFE0 ldb COREID ; update cursor position in text controller00FFE2D3 0F1FFC010 cmpb IOFocusID ; only for the task with the output focus00FFE2D6 026018 bne ucp100FFE2D8 0C1020 cmpb #$20 ; and not for CmodA70900FFE2DA 027014 beq ucp100FFE2DC 096110 lda CursorRow00FFE2DE 08403F anda #$3F ; limit of 63 rows00FFE2E0 0150F6FFFE07F00 ldb TEXTREG+TEXT_COLS00FFE2E5 03D mul00FFE2E6 01F001 tfr d,x00FFE2E8 0D6111 ldb CursorCol00FFE2EA 03A abx00FFE2EB 0150BFFFFE07F22 stx TEXTREG+TEXT_CURPOSucp1:00FFE2F0 035096 puls d,x,pc;------------------------------------------------------------------------------; Calculate screen memory location from CursorRow,CursorCol.; Also refreshes the cursor location.;; Modifies:; d; Returns:; d = screen location;------------------------------------------------------------------------------;CalcScreenLoc:00FFE2F2 034010 pshs x00FFE2F4 096110 lda CursorRow00FFE2F6 0C6040 ldb #COLS00FFE2F8 03D mul00FFE2F9 01F001 tfr d,x00FFE2FB 0D6111 ldb CursorCol00FFE2FD 03A abx00FFE2FE 0150F6FFFFFFFE0 ldb COREID ; update cursor position in text controller00FFE303 0F1FFC010 cmpb IOFocusID ; only for the task with the output focus00FFE306 026009 bne csl100FFE308 0C1020 cmpb #$2000FFE30A 027005 beq csl100FFE30C 0150BFFFFE07F22 stx TEXTREG+TEXT_CURPOScsl1:00FFE311 08DF87 bsr GetScreenLocation00FFE313 03080B leax d,x00FFE315 01F010 tfr x,d00FFE317 035090 puls x,pc;------------------------------------------------------------------------------; Display a character on the screen.; If the task doesn't have the I/O focus then the character is written to; the virtual screen.;; Modifies:; none; Parameters:; accb = char to display;------------------------------------------------------------------------------;DisplayChar:00FFE319 01700096C lbsr SerialPutChar00FFE31C 034016 pshs d,x00FFE31E 0C100D cmpb #CR ; carriage return ?00FFE320 026007 bne dccr00FFE322 00F111 clr CursorCol ; just set cursor column to zero on a CR00FFE324 08DFA6 bsr UpdateCursorPosdcx14:00FFE326 01600008C lbra dcx4dccr:00FFE329 0C1091 cmpb #$91 ; cursor right ?00FFE32B 02600D bne dcx600FFE32D 096111 lda CursorCol00FFE32F 081040 cmpa #COLS00FFE331 024003 bhs dcx700FFE333 04C inca00FFE334 097111 sta CursorColdcx7:00FFE336 08DF94 bsr UpdateCursorPos00FFE338 035096 puls d,x,pcdcx6:00FFE33A 0C1090 cmpb #$90 ; cursor up ?00FFE33C 026009 bne dcx800FFE33E 096110 lda CursorRow00FFE340 027FF4 beq dcx700FFE342 04A deca00FFE343 097110 sta CursorRow00FFE345 020FEF bra dcx7dcx8:00FFE347 0C1093 cmpb #$93 ; cursor left ?00FFE349 026009 bne dcx900FFE34B 096111 lda CursorCol00FFE34D 027FE7 beq dcx700FFE34F 04A deca00FFE350 097111 sta CursorCol00FFE352 020FE2 bra dcx7dcx9:00FFE354 0C1092 cmpb #$92 ; cursor down ?00FFE356 02600B bne dcx1000FFE358 096110 lda CursorRow00FFE35A 081020 cmpa #ROWS00FFE35C 027FD8 beq dcx700FFE35E 04C inca00FFE35F 097110 sta CursorRow00FFE361 020FD3 bra dcx7dcx10:00FFE363 0C1094 cmpb #$94 ; cursor home ?00FFE365 02600C bne dcx1100FFE367 096111 lda CursorCol00FFE369 027004 beq dcx1200FFE36B 00F111 clr CursorCol00FFE36D 020FC7 bra dcx7dcx12:00FFE36F 00F110 clr CursorRow00FFE371 020FC3 bra dcx7dcx11:00FFE373 0C1099 cmpb #$99 ; delete ?00FFE375 026008 bne dcx1300FFE377 08DF79 bsr CalcScreenLoc00FFE379 01F001 tfr d,x00FFE37B 096111 lda CursorCol ; acc = cursor column00FFE37D 020011 bra dcx5dcx1300FFE37F 0C1008 cmpb #CTRLH ; backspace ?00FFE381 02601E bne dcx300FFE383 096111 lda CursorCol00FFE385 02702E beq dcx400FFE387 04A deca00FFE388 097111 sta CursorCol00FFE38A 08DF66 bsr CalcScreenLoc00FFE38C 01F001 tfr d,x00FFE38E 096111 lda CursorColdcx5:00FFE390 0E6001 ldb 1,x00FFE392 0E7801 stb ,x++00FFE394 04C inca00FFE395 081040 cmpa #COLS00FFE397 025FF7 blo dcx500FFE399 0C6020 ldb #' '00FFE39B 0301FF dex00FFE39D 0E7804 stb ,x00FFE39F 020014 bra dcx4dcx3:00FFE3A1 0C100A cmpb #LF ; linefeed ?00FFE3A3 02700E beq dclf00FFE3A5 034004 pshs b00FFE3A7 08DF49 bsr CalcScreenLoc00FFE3A9 01F001 tfr d,x00FFE3AB 035004 puls b00FFE3AD 0E7804 stb ,x; ToDo character color; lda CharColor; sta $2000,x00FFE3AF 08D006 bsr IncCursorPos00FFE3B1 020002 bra dcx4dclf:00FFE3B3 08D011 bsr IncCursorRowdcx4:00FFE3B5 035096 puls d,x,pc;------------------------------------------------------------------------------; Increment the cursor position, scroll the screen if needed.;; Modifies:; none;------------------------------------------------------------------------------IncCursorPos:00FFE3B7 034016 pshs d,x00FFE3B9 096111 lda CursorCol00FFE3BB 04C inca00FFE3BC 097111 sta CursorCol00FFE3BE 081040 cmpa #COLS00FFE3C0 025014 blo icc100FFE3C2 00F111 clr CursorCol ; column = 000FFE3C4 020002 bra icr1IncCursorRow:00FFE3C6 034016 pshs d,xicr1:00FFE3C8 096110 lda CursorRow00FFE3CA 04C inca00FFE3CB 097110 sta CursorRow00FFE3CD 081020 cmpa #ROWS00FFE3CF 025005 blo icc100FFE3D1 04A deca ; backup the cursor row, we are scrolling up00FFE3D2 097110 sta CursorRow00FFE3D4 08DE8F bsr ScrollUpicc1:00FFE3D6 08DEF4 bsr UpdateCursorPosicc2:00FFE3D8 035096 puls d,x,pc;------------------------------------------------------------------------------; Display a string on the screen.;; Modifies:; none; Parameters:; d = pointer to string;------------------------------------------------------------------------------;DisplayString:00FFE3DA 034016 pshs d,x00FFE3DC 01F001 tfr d,x00FFE3DE 0150B6FFFFFFFE0 lda COREID00FFE3E3 081020 cmpa #$2000FFE3E5 027005 beq dspj1Bdspj2: ; lock semaphore for access00FFE3E7 0B6EF0001 lda OUTSEMA+100FFE3EA 027FFB beq dspj2dspj1B:00FFE3EC 0E6800 ldb ,x+ ; move string char into acc00FFE3EE 027005 beq dsretB ; is it end of string ?00FFE3F0 017000AEE lbsr OUTCH ; display character00FFE3F3 020FF7 bra dspj1BdsretB:00FFE3F5 07FEF0001 clr OUTSEMA+1 ; unlock semaphore00FFE3F8 035096 puls d,x,pcDisplayStringCRLF:00FFE3FA 034006 pshs d00FFE3FC 08DFDC bsr DisplayString00FFE3FE 0C600D ldb #CR00FFE400 017000ADE lbsr OUTCH00FFE403 0C600A ldb #LF00FFE405 017000AD9 lbsr OUTCH00FFE408 035086 puls d,pc;; PRINT CR, LF, STRING;PSTRNG00FFE40A 08D002 BSR PCRLF00FFE40C 02000D BRA PDATAPCRLF00FFE40E 034010 PSHS X00FFE410 08EFFE422 LDX #CRLFST00FFE413 08D006 BSR PDATA00FFE415 035010 PULS X00FFE417 039 RTS00FFE418 0BDFFEEE1 JSR OUTCHPDATA00FFE41B 0E6800 LDB ,X+00FFE41D 0C1004 CMPB #$0400FFE41F 026FF7 BNE PRINT00FFE421 039 RTSCRLFST00FFE422 00D00A004 fcb CR,LF,4DispDWordAsHex:00FFE425 08D007 bsr DispWordAsHex00FFE427 01E001 exg d,x00FFE429 08D003 bsr DispWordAsHex00FFE42B 01E001 exg d,x00FFE42D 039 rtsDispWordAsHex:00FFE42E 01E089 exg a,b00FFE430 08D005 bsr DispByteAsHex00FFE432 01E089 exg a,b00FFE434 08D001 bsr DispByteAsHex00FFE436 039 rtsDispByteAsHex:00FFE437 034004 pshs b00FFE439 054 lsrb00FFE43A 054 lsrb00FFE43B 054 lsrb00FFE43C 054 lsrb00FFE43D 054 lsrb00FFE43E 054 lsrb00FFE43F 054 lsrb00FFE440 054 lsrb00FFE441 08D00C bsr DispNyb00FFE443 035004 puls b00FFE445 034004 pshs b00FFE447 054 lsrb00FFE448 054 lsrb00FFE449 054 lsrb00FFE44A 054 lsrb00FFE44B 08D002 bsr DispNyb00FFE44D 035004 puls bDispNyb00FFE44F 034004 pshs b00FFE451 0C400F andb #$0F00FFE453 0C100A cmpb #1000FFE455 025007 blo DispNyb100FFE457 0CB037 addb #'A'-1000FFE459 017000A85 lbsr OUTCH00FFE45C 035084 puls b,pcDispNyb100FFE45E 0CB030 addb #'0'00FFE460 017000A7E lbsr OUTCH00FFE463 035084 puls b,pc;==============================================================================; Timer;==============================================================================; ============================================================================; __; \\__/ o\ (C) 2022 Robert Finch, Waterloo; \ __ / All rights reserved.; \/_// robfinch<remove>@opencores.org; ||;;; Timer routines for a WDC6522 compatible circuit.;; This source file is free software: you can redistribute it and/or modify; it under the terms of the GNU Lesser General Public License as published; by the Free Software Foundation, either version 3 of the License, or; (at your option) any later version.;; This source file is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License; along with this program. If not, see <http://www.gnu.org/licenses/>.;; ============================================================================;TimerInit:00FFE465 0CC061A80 ldd #$61A80 ; compare to 400000 (100 Hz assuming 40MHz clock)00FFE468 0150F7FFFE60014 stb VIA+VIA_T3CMPL00FFE46D 0150B7FFFE60015 sta VIA+VIA_T3CMPH00FFE472 01507FFFFE60012 clr VIA+VIA_T3LL00FFE477 01507FFFFE60013 clr VIA+VIA_T3LH00FFE47C 0150B6FFFE6000B lda VIA+VIA_ACR ; set continuous mode for timer00FFE481 08A100 ora #$10000FFE483 0150B7FFFE6000B sta VIA+VIA_ACR ; enable timer #3 interrupts00FFE488 086810 lda #$81000FFE48A 0150B7FFFE6000E sta VIA+VIA_IER00FFE48F 039 rtsTimerIRQ:; Reset the edge sense circuit in the PIC00FFE490 08601F lda #31 ; Timer is IRQ #3100FFE492 0B7FFC011 sta IrqSource ; stuff a byte indicating the IRQ source for PEEK()00FFE495 0150B7FFFE3F010 sta PIC+16 ; register 16 is edge sense reset reg00FFE49A 0150B6FFFE6000D lda VIA+VIA_IFR00FFE49F 02A011 bpl notTimerIRQ00FFE4A1 085080 bita #$80 ; timer3 irq is bit 700FFE4A3 02700D beq notTimerIRQ00FFE4A5 01507FFFFE60012 clr VIA+VIA_T3LL00FFE4AA 01507FFFFE60013 clr VIA+VIA_T3LH00FFE4AF 07CE00037 inc $E00037 ; update timer IRQ screen flagnotTimerIRQ:00FFE4B2 039 rts; ============================================================================; __; \\__/ o\ (C) 2013-2022 Robert Finch, Waterloo; \ __ / All rights reserved.; \/_// robfinch<remove>@opencores.org; ||;;; BSD 3-Clause License; Redistribution and use in source and binary forms, with or without; modification, are permitted provided that the following conditions are met:;; 1. Redistributions of source code must retain the above copyright notice, this; list of conditions and the following disclaimer.;; 2. Redistributions in binary form must reproduce the above copyright notice,; this list of conditions and the following disclaimer in the documentation; and/or other materials provided with the distribution.;; 3. Neither the name of the copyright holder nor the names of its; contributors may be used to endorse or promote products derived from; this software without specific prior written permission.;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.;; ============================================================================;;===============================================================================; Generic I2C routines;; It is assumed there may be more than one I2C controller in the system, so; the address of the controller is passed in the X register.;===============================================================================I2C_PREL EQU $0I2C_PREH EQU $1I2C_CTRL EQU $2I2C_RXR EQU $3I2C_TXR EQU $3I2C_CMD EQU $4I2C_STAT EQU $4; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; i2c initialization, sets the clock prescaler;; Parameters:; x = I2C controller address; Returns: none; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -i2c_init:00FFE4B3 034004 pshs b00FFE4B5 0C6004 ldb #4 ; setup prescale for 400kHz clock00FFE4B7 0E7804 stb I2C_PREL,x00FFE4B9 06F001 clr I2C_PREH,x00FFE4BB 035084 puls b,pc; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Wait for I2C transfer to complete;; Parameters; x - I2C controller base address; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -i2c_wait_tip:00FFE4BD 034004 pshs bi2cw1:00FFE4BF 0E6004 ldb I2C_STAT,x ; would use lvb, but lb is okay since its the I/O area00FFE4C1 0C5001 bitb #1 ; wait for tip to clear00FFE4C3 026FFA bne i2cw100FFE4C5 035084 puls b,pc; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Write command to i2c;; Parameters; accb - data to transmit; acca - command value; x - I2C controller base address; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -i2c_wr_cmd:00FFE4C7 0E7003 stb I2C_TXR,x00FFE4C9 0A7004 sta I2C_CMD,x00FFE4CB 08DFF0 bsr i2c_wait_tip00FFE4CD 0E6004 ldb I2C_STAT,x00FFE4CF 039 rts; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Parameters; x - I2C controller base address; accb - data to send; Returns: none; Stack space: 2 words; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -i2c_xmit1:00FFE4D0 034006 pshs d ; save data value00FFE4D2 034006 pshs d ; and save it again00FFE4D4 0C6001 ldb #100FFE4D6 0E7002 stb I2C_CTRL,x ; enable the core00FFE4D8 0C6076 ldb #$76 ; set slave address = %011101100FFE4DA 086090 lda #$90 ; set STA, WR00FFE4DC 08DFE9 bsr i2c_wr_cmd00FFE4DE 08D00A bsr i2c_wait_rx_nack00FFE4E0 035006 puls d ; get back data value00FFE4E2 086050 lda #$50 ; set STO, WR00FFE4E4 08DFE1 bsr i2c_wr_cmd00FFE4E6 08D002 bsr i2c_wait_rx_nack00FFE4E8 035086 puls d,pc; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -i2c_wait_rx_nack:00FFE4EA 034004 pshs b ; save off accbi2cwr1:00FFE4EC 0E6004 ldb I2C_STAT,x ; wait for RXack = 000FFE4EE 0C5080 bitb #$80 ; test for nack00FFE4F0 026FFA bne i2cwr100FFE4F2 035084 puls b,pc; ============================================================================; __; \\__/ o\ (C) 2022 Robert Finch, Waterloo; \ __ / All rights reserved.; \/_// robfinch<remove>@opencores.org; ||;;; BSD 3-Clause License; Redistribution and use in source and binary forms, with or without; modification, are permitted provided that the following conditions are met:;; 1. Redistributions of source code must retain the above copyright notice, this; list of conditions and the following disclaimer.;; 2. Redistributions in binary form must reproduce the above copyright notice,; this list of conditions and the following disclaimer in the documentation; and/or other materials provided with the distribution.;; 3. Neither the name of the copyright holder nor the names of its; contributors may be used to endorse or promote products derived from; this software without specific prior written permission.;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.;; ============================================================================;===============================================================================; Realtime clock routines;===============================================================================; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Read the real-time-clock chip.;; The entire contents of the clock registers and sram are read into a buffer; in one-shot rather than reading the registers individually.;; Parameters: none; Returns: d = 0 on success, otherwise non-zero; Modifies: d and RTCBuf; Stack space: 6 words; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -rtc_read:00FFE4F4 08EE30500 ldx #RTC00FFE4F7 18E007FC0 ldy #RTCBuf00FFE4FA 0C6080 ldb #$8000FFE4FC 0E7002 stb I2C_CTRL,x ; enable I2C00FFE4FE 0CC0900DE ldd #$900DE ; read address, write op, STA + wr bit00FFE501 08DFC4 bsr i2c_wr_cmd00FFE503 0C5080 bitb #$8000FFE505 02603C bne rtc_rxerr00FFE507 0CC010000 ldd #$10000 ; address zero, wr bit00FFE50A 08DFBB bsr i2c_wr_cmd00FFE50C 0C5080 bitb #$8000FFE50E 026033 bne rtc_rxerr00FFE510 0CC0900DF ldd #$900DF ; read address, read op, STA + wr bit00FFE513 08DFB2 bsr i2c_wr_cmd00FFE515 0C5080 bitb #$8000FFE517 02602A bne rtc_rxerr00FFE519 05F clrbrtcr0001:00FFE51A 086020 lda #$2000FFE51C 0A7004 sta I2C_CMD,x ; rd bit00FFE51E 08DF9D bsr i2c_wait_tip00FFE520 08DFC8 bsr i2c_wait_rx_nack00FFE522 0A6004 lda I2C_STAT,x00FFE524 085080 bita #$8000FFE526 02601B bne rtc_rxerr00FFE528 0A6003 lda I2C_RXR,x00FFE52A 0A7A07 sta b,y00FFE52C 05C incb00FFE52D 0C105F cmpb #$5F00FFE52F 025FE9 blo rtcr000100FFE531 086068 lda #$6800FFE533 0A7004 sta I2C_CMD,x ; STO, rd bit + nack00FFE535 08DF86 bsr i2c_wait_tip00FFE537 0A6004 lda I2C_STAT,x00FFE539 085080 bita #$8000FFE53B 026006 bne rtc_rxerr00FFE53D 0A6003 lda I2C_RXR,x00FFE53F 0A7A07 sta b,y00FFE541 04F05F clrd ; return 0rtc_rxerr:00FFE543 06F002 clr I2C_CTRL,x ; disable I2C and return status00FFE545 04F clra00FFE546 039 rts; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Write the real-time-clock chip.;; The entire contents of the clock registers and sram are written from a; buffer (RTCBuf) in one-shot rather than writing the registers individually.;; Parameters: none; Returns: r1 = 0 on success, otherwise non-zero; Modifies: r1 and RTCBuf; Stack space: 6 words; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -rtc_write:00FFE547 08EE30500 ldx #RTC00FFE54A 18E007FC0 ldy #RTCBuf00FFE54D 0C6080 ldb #$8000FFE54F 0E7002 stb I2C_CTRL,x ; enable I2C00FFE551 0CC0900DE ldd #$900DE ; read address, write op, STA + wr bit00FFE554 08DF71 bsr i2c_wr_cmd00FFE556 0C5080 bitb #$8000FFE558 026FE9 bne rtc_rxerr00FFE55A 0CC010000 ldd #$10000 ; address zero, wr bit00FFE55D 08DF68 bsr i2c_wr_cmd00FFE55F 0C5080 bitb #$8000FFE561 026FE0 bne rtc_rxerr00FFE563 0C6000 ldb #0rtcw0001:00FFE565 034004 pshs b00FFE567 0E6A05 ldb b,y00FFE569 086010 lda #$1000FFE56B 08DF5A bsr i2c_wr_cmd00FFE56D 0C5080 bitb #$8000FFE56F 035004 puls b00FFE571 026FD0 bne rtc_rxerr00FFE573 05C incb00FFE574 0C105F cmpb #$5F00FFE576 025FED blo rtcw000100FFE578 0E6A05 ldb b,y00FFE57A 086050 lda #$50 ; STO, wr bit00FFE57C 08DF49 bsr i2c_wr_cmd00FFE57E 0C5080 bitb #$8000FFE580 026FC1 bne rtc_rxerr00FFE582 04F05F clrd ; return 000FFE584 06F002 clr I2C_CTRL,x ; disable I2C and return status00FFE586 039 rts;==============================================================================; Keyboard I/O;==============================================================================;--------------------------------------------------------------------------; PS2 scan codes to ascii conversion tables.;--------------------------------------------------------------------------;org (* + 127) & $FFFFFF80unshiftedScanCodes:00FFE600 02E0A902E0A50A30A10A2 fcb $2e,$a9,$2e,$a5,$a3,$a1,$a2,$ac00FFE607 0AC00FFE608 02E0AA0A80A60A4009060 fcb $2e,$aa,$a8,$a6,$a4,$09,$60,$2e00FFE60F 02E00FFE610 02E02E02E02E02E071031 fcb $2e,$2e,$2e,$2e,$2e,$71,$31,$2e00FFE617 02E00FFE618 02E02E07A073061077032 fcb $2e,$2e,$7a,$73,$61,$77,$32,$2e00FFE61F 02E00FFE620 02E063078064065034033 fcb $2e,$63,$78,$64,$65,$34,$33,$2e00FFE627 02E00FFE628 02E020076066074072035 fcb $2e,$20,$76,$66,$74,$72,$35,$2e00FFE62F 02E00FFE630 02E06E062068067079036 fcb $2e,$6e,$62,$68,$67,$79,$36,$2e00FFE637 02E00FFE638 02E02E06D06A075037038 fcb $2e,$2e,$6d,$6a,$75,$37,$38,$2e00FFE63F 02E00FFE640 02E02C06B06906F030039 fcb $2e,$2c,$6b,$69,$6f,$30,$39,$2e00FFE647 02E00FFE648 02E02E02F06C03B07002D fcb $2e,$2e,$2f,$6c,$3b,$70,$2d,$2e00FFE64F 02E00FFE650 02E02E02702E05B03D02E fcb $2e,$2e,$27,$2e,$5b,$3d,$2e,$2e00FFE657 02E00FFE658 0AD02E00D05D02E05C02E fcb $ad,$2e,$0d,$5d,$2e,$5c,$2e,$2e00FFE65F 02E00FFE660 02E02E02E02E02E02E008 fcb $2e,$2e,$2e,$2e,$2e,$2e,$08,$2e00FFE667 02E00FFE668 02E09502E09309402E02E fcb $2e,$95,$2e,$93,$94,$2e,$2e,$2e00FFE66F 02E00FFE670 09807F09202E09109001B fcb $98,$7f,$92,$2e,$91,$90,$1b,$af00FFE677 0AF00FFE678 0AB02E09702E02E0960AE fcb $ab,$2e,$97,$2e,$2e,$96,$ae,$2e00FFE67F 02E00FFE680 02E02E02E0A702E02E02E fcb $2e,$2e,$2e,$a7,$2e,$2e,$2e,$2e00FFE687 02E00FFE688 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE68F 02E00FFE690 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE697 02E00FFE698 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE69F 02E00FFE6A0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6A7 02E00FFE6A8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6AF 02E00FFE6B0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6B7 02E00FFE6B8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6BF 02E00FFE6C0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6C7 02E00FFE6C8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6CF 02E00FFE6D0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6D7 02E00FFE6D8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6DF 02E00FFE6E0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6E7 02E00FFE6E8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6EF 02E00FFE6F0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE6F7 02E00FFE6F8 02E02E0FA02E02E02E02E fcb $2e,$2e,$fa,$2e,$2e,$2e,$2e,$2e00FFE6FF 02EshiftedScanCodes:00FFE700 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE707 02E00FFE708 02E02E02E02E02E00907E fcb $2e,$2e,$2e,$2e,$2e,$09,$7e,$2e00FFE70F 02E00FFE710 02E02E02E02E02E051021 fcb $2e,$2e,$2e,$2e,$2e,$51,$21,$2e00FFE717 02E00FFE718 02E02E05A053041057040 fcb $2e,$2e,$5a,$53,$41,$57,$40,$2e00FFE71F 02E00FFE720 02E043058044045024023 fcb $2e,$43,$58,$44,$45,$24,$23,$2e00FFE727 02E00FFE728 02E020056046054052025 fcb $2e,$20,$56,$46,$54,$52,$25,$2e00FFE72F 02E00FFE730 02E04E04204804705905E fcb $2e,$4e,$42,$48,$47,$59,$5e,$2e00FFE737 02E00FFE738 02E02E04D04A05502602A fcb $2e,$2e,$4d,$4a,$55,$26,$2a,$2e00FFE73F 02E00FFE740 02E03C04B04904F029028 fcb $2e,$3c,$4b,$49,$4f,$29,$28,$2e00FFE747 02E00FFE748 02E03E03F04C03A05005F fcb $2e,$3e,$3f,$4c,$3a,$50,$5f,$2e00FFE74F 02E00FFE750 02E02E02202E07B02B02E fcb $2e,$2e,$22,$2e,$7b,$2b,$2e,$2e00FFE757 02E00FFE758 02E02E00D07D02E07C02E fcb $2e,$2e,$0d,$7d,$2e,$7c,$2e,$2e00FFE75F 02E00FFE760 02E02E02E02E02E02E008 fcb $2e,$2e,$2e,$2e,$2e,$2e,$08,$2e00FFE767 02E00FFE768 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE76F 02E00FFE770 02E07F02E02E02E02E01B fcb $2e,$7f,$2e,$2e,$2e,$2e,$1b,$2e00FFE777 02E00FFE778 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE77F 02E00FFE780 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE787 02E00FFE788 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE78F 02E00FFE790 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE797 02E00FFE798 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE79F 02E00FFE7A0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7A7 02E00FFE7A8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7AF 02E00FFE7B0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7B7 02E00FFE7B8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7BF 02E00FFE7C0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7C7 02E00FFE7C8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7CF 02E00FFE7D0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7D7 02E00FFE7D8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7DF 02E00FFE7E0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7E7 02E00FFE7E8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7EF 02E00FFE7F0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7F7 02E00FFE7F8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE7FF 02E; controlkeybdControlCodes:00FFE800 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE807 02E00FFE808 02E02E02E02E02E00907E fcb $2e,$2e,$2e,$2e,$2e,$09,$7e,$2e00FFE80F 02E00FFE810 02E02E02E02E02E011021 fcb $2e,$2e,$2e,$2e,$2e,$11,$21,$2e00FFE817 02E00FFE818 02E02E01A013001017040 fcb $2e,$2e,$1a,$13,$01,$17,$40,$2e00FFE81F 02E00FFE820 02E003018004005024023 fcb $2e,$03,$18,$04,$05,$24,$23,$2e00FFE827 02E00FFE828 02E020016006014012025 fcb $2e,$20,$16,$06,$14,$12,$25,$2e00FFE82F 02E00FFE830 02E00E00200800701905E fcb $2e,$0e,$02,$08,$07,$19,$5e,$2e00FFE837 02E00FFE838 02E02E00D00A01502602A fcb $2e,$2e,$0d,$0a,$15,$26,$2a,$2e00FFE83F 02E00FFE840 02E03C00B00900F029028 fcb $2e,$3c,$0b,$09,$0f,$29,$28,$2e00FFE847 02E00FFE848 02E03E03F00C03A01005F fcb $2e,$3e,$3f,$0c,$3a,$10,$5f,$2e00FFE84F 02E00FFE850 02E02E02202E07B02B02E fcb $2e,$2e,$22,$2e,$7b,$2b,$2e,$2e00FFE857 02E00FFE858 02E02E00D07D02E07C02E fcb $2e,$2e,$0d,$7d,$2e,$7c,$2e,$2e00FFE85F 02E00FFE860 02E02E02E02E02E02E008 fcb $2e,$2e,$2e,$2e,$2e,$2e,$08,$2e00FFE867 02E00FFE868 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE86F 02E00FFE870 02E07F02E02E02E02E01B fcb $2e,$7f,$2e,$2e,$2e,$2e,$1b,$2e00FFE877 02E00FFE878 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE87F 02EkeybdExtendedCodes:00FFE880 02E02E02E02E0A30A10A2 fcb $2e,$2e,$2e,$2e,$a3,$a1,$a2,$2e00FFE887 02E00FFE888 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE88F 02E00FFE890 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE897 02E00FFE898 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE89F 02E00FFE8A0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE8A7 02E00FFE8A8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE8AF 02E00FFE8B0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE8B7 02E00FFE8B8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE8BF 02E00FFE8C0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE8C7 02E00FFE8C8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE8CF 02E00FFE8D0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE8D7 02E00FFE8D8 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE8DF 02E00FFE8E0 02E02E02E02E02E02E02E fcb $2e,$2e,$2e,$2e,$2e,$2e,$2e,$2e00FFE8E7 02E00FFE8E8 02E09502E09309402E02E fcb $2e,$95,$2e,$93,$94,$2e,$2e,$2e00FFE8EF 02E00FFE8F0 09809909202E09109002E fcb $98,$99,$92,$2e,$91,$90,$2e,$2e00FFE8F7 02E00FFE8F8 02E02E09702E02E09602E fcb $2e,$2e,$97,$2e,$2e,$96,$2e,$2e00FFE8FF 02E; ============================================================================; __; \\__/ o\ (C) 2013-2022 Robert Finch, Waterloo; \ __ / All rights reserved.; \/_// robfinch<remove>@opencores.org; ||;;; Keyboard driver routines to interface to a PS2 style keyboard; Converts the scancode to ascii;; This source file is free software: you can redistribute it and/or modify; it under the terms of the GNU Lesser General Public License as published; by the Free Software Foundation, either version 3 of the License, or; (at your option) any later version.;; This source file is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License; along with this program. If not, see <http://www.gnu.org/licenses/>.;; ============================================================================;SC_F12 EQU $07SC_C EQU $21SC_T EQU $2CSC_Z EQU $1ASC_DEL EQU $71 ; extendSC_KEYUP EQU $F0 ; should be $f0SC_EXTEND EQU $E0SC_CTRL EQU $14SC_RSHIFT EQU $59SC_NUMLOCK EQU $77SC_SCROLLLOCK EQU $7ESC_CAPSLOCK EQU $58SC_ALT EQU $11;#define SC_LSHIFT EQU $12;SC_DEL EQU $71 ; extend;SC_LCTRL EQU $58SC_TAB EQU $0D; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Recieve a byte from the keyboard, used after a command is sent to the; keyboard in order to wait for a response.;; Parameters: none; Returns: accd = recieved byte ($00 to $FF), -1 on timeout; Modifies: acc; Stack Space: 2 words; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -KeybdRecvByte:00FFE900 034010 pshs x00FFE902 08E000064 ldx #100 ; wait up to 1skrb3:00FFE905 08D05A bsr KeybdGetStatus ; wait for response from keyboard00FFE907 05D tstb00FFE908 02B00B bmi krb4 ; is input buffer full ? yes, branch00FFE90A 08D02D bsr Wait10ms ; wait a bit00FFE90C 0301FF dex00FFE90E 026FF5 bne krb3 ; go back and try again00FFE910 0CCFFFFFF ldd #-1 ; return -100FFE913 035090 puls x,pckrb4:00FFE915 08D066 bsr KeybdGetScancode00FFE917 035090 puls x,pc; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Send a byte to the keyboard.;; Parameters: accb byte to send; Returns: none; Modifies: none; Stack Space: 0 words; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -KeybdSendByte:00FFE919 0150F7FFFE30400 stb KEYBD00FFE91E 039 rts; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Wait until the keyboard transmit is complete;; Parameters: none; Returns: r1 = 0 if successful, r1 = -1 timeout; Modifies: r1; Stack Space: 3 words; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -KeybdWaitTx:00FFE91F 034010 pshs x00FFE921 08E000064 ldx #100 ; wait a max of 1skwt1:00FFE924 08D03B bsr KeybdGetStatus00FFE926 0C4040 andb #$40 ; check for transmit complete bit; branch if bit set00FFE928 02600B bne kwt200FFE92A 08D00D bsr Wait10ms ; delay a little bit00FFE92C 0301FF dex00FFE92E 026FF4 bne kwt1 ; go back and try again00FFE930 0CCFFFFFF ldd #-1 ; timed out, return -100FFE933 035090 puls x,pckwt2:00FFE935 04F clra ; wait complete, return 000FFE936 05F clrb00FFE937 035090 puls x,pc; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Wait for 10 ms;; Parameters: none; Returns: none; Modifies: none; Stack Space: 2 words; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Wait10ms:00FFE939 034006 pshs d00FFE93B 0150B6FFFFFFFE7 lda MSCOUNT+3W10_0001:00FFE940 01F089 tfr a,b00FFE942 0150F0FFFFFFFE7 subb MSCOUNT+300FFE947 0C1FFA cmpb #$FFA00FFE949 022FF5 bhi W10_000100FFE94B 035086 puls d,pc; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Wait for 300 ms (256 ms);; Parameters: none; Returns: none; Modifies: none; Stack Space: 2 words; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Wait300ms:00FFE94D 034006 pshs d00FFE94F 0150B6FFFFFFFE7 lda MSCOUNT+3W300_0001:00FFE954 01F089 tfr a,b00FFE956 0150F0FFFFFFFE7 subb MSCOUNT+300FFE95B 0C1F00 cmpb #$F0000FFE95D 022FF5 bhi W300_000100FFE95F 035086 puls d,pc; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Get the keyboard status;; Parameters: none; Returns: d = status; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -KeybdGetStatus:kbgs3:00FFE961 0150F6FFFE30401 ldb KEYBD+100FFE966 0C5080 bitb #$8000FFE968 02600E bne kbgs100FFE96A 0C5001 bitb #$01 ; check parity error flag00FFE96C 026002 bne kbgs200FFE96E 04F clra00FFE96F 039 rtskbgs2:00FFE970 0C60FE ldb #$FE ; request resend00FFE972 08DFA5 bsr KeybdSendByte00FFE974 08DFA9 bsr KeybdWaitTx00FFE976 020FE9 bra kbgs3kbgs1: ; return negative status00FFE978 0CAF00 orb #$F0000FFE97A 086FFF lda #-100FFE97C 039 rts; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Get the scancode from the keyboard port;; Parameters: none; Returns: acca = scancode; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -KeybdGetScancode:00FFE97D 04F clra00FFE97E 0150F6FFFE30400 ldb KEYBD ; get the scan code00FFE983 01507FFFFE30401 clr KEYBD+1 ; clear receive register (write $00 to status reg)00FFE988 039 rts; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Set the LEDs on the keyboard.;; Parameters: d LED status to set; Returns: none; Modifies: none; Stack Space: 2 words; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -KeybdSetLED:00FFE989 034004 pshs b00FFE98B 0C60ED ldb #$ED ; set LEDs command00FFE98D 08DF8A bsr KeybdSendByte00FFE98F 08DF8E bsr KeybdWaitTx00FFE991 08DF6D bsr KeybdRecvByte ; should be an ack00FFE993 035004 puls b00FFE995 08DF82 bsr KeybdSendByte00FFE997 08DF86 bsr KeybdWaitTx00FFE999 08DF65 bsr KeybdRecvByte ; should be an ack00FFE99B 039 rts; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Get ID - get the keyboards identifier code.;; Parameters: none; Returns: d = $AB83, $00 on fail; Modifies: d, KeybdID updated; Stack Space: 2 words; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -KeybdGetID:00FFE99C 0C60F2 ldb #$F200FFE99E 08DF79 bsr KeybdSendByte00FFE9A0 08DF7D bsr KeybdWaitTx00FFE9A2 08DF5C bsr KeybdRecvByte00FFE9A4 0C5080 bitb #$8000FFE9A6 026014 bne kgnotKbd00FFE9A8 0C10AB cmpb #$AB00FFE9AA 026010 bne kgnotKbd00FFE9AC 08DF52 bsr KeybdRecvByte00FFE9AE 0C5080 bitb #$8000FFE9B0 02600A bne kgnotKbd00FFE9B2 0C1083 cmpb #$8300FFE9B4 026006 bne kgnotKbd00FFE9B6 0CC00AB83 ldd #$AB83kgid1:00FFE9B9 0DD124 std KeybdID00FFE9BB 039 rtskgnotKbd:00FFE9BC 04F clra00FFE9BD 05F clrb00FFE9BE 020FF9 bra kgid1; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Initialize the keyboard.;; Parameters:; none; Modifies:; none; Returns:; none; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -KeybdInit:00FFE9C0 034026 pshs d,y00FFE9C2 18E000005 ldy #500FFE9C5 00F120 clr KeyState1 ; records key up/down state00FFE9C7 00F121 clr KeyState2 ; records shift,ctrl,alt statekbdi0002:00FFE9C9 08DF6E bsr Wait10ms00FFE9CB 01507FFFFE30401 clr KEYBD+1 ; clear receive register (write $00 to status reg)00FFE9D0 0C6FFF ldb #-1 ; send reset code to keyboard00FFE9D2 0150F7FFFE30401 stb KEYBD+1 ; write $FF to status reg to clear TX state00FFE9D7 08DF40 bsr KeybdSendByte ; now write to transmit register00FFE9D9 08DF44 bsr KeybdWaitTx ; wait until no longer busy00FFE9DB 08DF23 bsr KeybdRecvByte ; look for an ACK ($FA)00FFE9DD 0C10FA cmpb #$FA00FFE9DF 026021 bne kbdiTryAgain00FFE9E1 08DF1D bsr KeybdRecvByte ; look for BAT completion code ($AA)00FFE9E3 0C10FC cmpb #$FC ; reset error ?00FFE9E5 02701B beq kbdiTryAgain00FFE9E7 0C10AA cmpb #$AA ; reset complete okay ?00FFE9E9 026017 bne kbdiTryAgain; After a reset, scan code set #2 should be active.config:00FFE9EB 0C60F0 ldb #$F0 ; send scan code select00FFE9ED 0150F7FFFE60001 stb LEDS00FFE9F2 08DF25 bsr KeybdSendByte00FFE9F4 08DF29 bsr KeybdWaitTx00FFE9F6 05D tstb00FFE9F7 02B009 bmi kbdiTryAgain00FFE9F9 08DF05 bsr KeybdRecvByte ; wait for response from keyboard00FFE9FB 04D tsta00FFE9FC 02B004 bmi kbdiTryAgain00FFE9FE 0C10FA cmpb #$FA ; ACK00FFEA00 02700C beq kbdi0004kbdiTryAgain:00FFEA02 0313FF dey00FFEA04 026FC3 bne kbdi0002.keybdErr:00FFEA06 0CCFFEA2E ldd #msgBadKeybd00FFEA09 017FFF9EE lbsr DisplayStringCRLF*** warning 1: Long branch within short branch range could be optimized00FFEA0C 020014 bra ledxitkbdi0004:00FFEA0E 0C6002 ldb #2 ; select scan code set #200FFEA10 08DF07 bsr KeybdSendByte00FFEA12 08DF0B bsr KeybdWaitTx00FFEA14 05D tstb00FFEA15 02BFEB bmi kbdiTryAgain00FFEA17 08DEE7 bsr KeybdRecvByte ; wait for response from keyboard00FFEA19 04D tsta00FFEA1A 02BFE6 bmi kbdiTryAgain00FFEA1C 0C10FA cmpb #$FA00FFEA1E 026FE2 bne kbdiTryAgain00FFEA20 08DF7A bsr KeybdGetIDledxit:00FFEA22 0C6007 ldb #$0700FFEA24 08DF63 bsr KeybdSetLED00FFEA26 08DF25 bsr Wait300ms00FFEA28 0C6000 ldb #$0000FFEA2A 08DF5D bsr KeybdSetLED00FFEA2C 0350A6 puls d,y,pcmsgBadKeybd:00FFEA2E 04B06507906206F061072 fcb "Keyboard error",000FFEA35 06402006507207206F07200FFEA3C 000;------------------------------------------------------------------------------; Calculate number of character in input buffer;; Parameters:; y = $Cn00000 where n is core id; Returns:; d = number of bytes in buffer.;------------------------------------------------------------------------------kbdRcvCount:00FFEA3D 04F clra00FFEA3E 0E6A08128 ldb kbdTailRcv,y00FFEA41 0E0A08127 subb kbdHeadRcv,y00FFEA44 02C008 bge krcXit00FFEA46 0C6040 ldb #$4000FFEA48 0E0A08127 subb kbdHeadRcv,y00FFEA4B 0EBA08128 addb kbdTailRcv,ykrcXit:00FFEA4E 039 rts; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -KeybdIRQ:00FFEA4F 0150B6FFFE30401 lda KEYBD+1 ; check status00FFEA54 085080 bita #$80 ; was key pressed?00FFEA56 027034 beq notKbdIRQ ; if not, exit00FFEA58 0150F6FFFE30400 ldb KEYBD ; get the scan code00FFEA5D 01507FFFFE30401 clr KEYBD+1 ; clear receive register (write $00 to status reg)00FFEA62 034004 pshs b ; save it off00FFEA64 0B6FFC010 lda IOFocusID ; compute core memory address $Cn000000FFEA67 05F clrb00FFEA68 048 asla00FFEA69 048 asla00FFEA6A 048 asla00FFEA6B 048 asla00FFEA6C 08AC00 ora #$C00 ; address $Cn000000FFEA6E 01F002 tfr d,y ; y =00FFEA70 08DFCB bsr kbdRcvCount ; get count of scan codes in buffer00FFEA72 0C1040 cmpb #64 ; check if buffer full?00FFEA74 024017 bhs kbdBufFull ; if buffer full, ignore new keystroke00FFEA76 01F021 tfr y,x ; compute fifo address00FFEA78 0E6A08128 ldb kbdTailRcv,y ; b = buffer index00FFEA7B 035002 puls a ; get back scancode00FFEA7D 030040 leax kbdFifo,x ; x = base address for fifo00FFEA7F 0A7845 sta b,x ; store in buffer00FFEA81 05C incb ; increment buffer index00FFEA82 0C403F andb #$3f ; wrap around at 64 chars00FFEA84 0E7A08128 stb kbdTailRcv,y ; update it00FFEA87 08601C lda #28 ; Keyboard is IRQ #2800FFEA89 0B7FFC011 sta IrqSource ; stuff a byte indicating the IRQ source for PEEK()notKbdIRQ:00FFEA8C 039 rtskbdBufFull:00FFEA8D 032601 leas 1,s ; get rid of saved scancode00FFEA8F 039 rts; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -DBGCheckForKey:00FFEA90 020ECF bra KeybdGetStatus; KeyState2 variable bit meanings;1176543210; ||||||||+ = shift; |||||||+- = alt; ||||||+-- = control; |||||+--- = numlock; ||||+---- = capslock; |||+----- = scrolllock; ||+------ = <empty>; |+------- = "; | = "; | = "; | = "; +-------- = extended; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Keyboard get routine.;; The routine may get characters directly from the scancode input or less; directly from the scancode buffer, if things are interrupt driven.;; Parameters:; b: bit 11 = blocking status 1=blocking, 0=non blocking; b: bit 1 = scancode source 1=scancode buffer, 0=direct; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -GetKey:00FFEA92 034030 pshs x,y00FFEA94 0D7126 stb KeybdBlock ; save off blocking statusdbgk2:00FFEA96 0D6126 ldb KeybdBlock00FFEA98 034004 pshs b00FFEA9A 0C5001 bitb #1 ; what is the scancode source00FFEA9C 02701A beq dbgk20 ; branch if direct read00FFEA9E 0150B6FFFFFFFE0 lda COREID ; compute core memory address00FFEAA3 05F clrb00FFEAA4 048 asla00FFEAA5 048 asla00FFEAA6 048 asla00FFEAA7 048 asla00FFEAA8 08AC00 ora #$C0000FFEAAA 01F002 tfr d,y ; y = $Cn000000FFEAAC 08DF8F bsr kbdRcvCount00FFEAAE 05D tstb ; anything in buffer?00FFEAAF 035004 puls b00FFEAB1 026018 bne dbgk1 ; branch if something in buffer00FFEAB3 05D tstb00FFEAB4 02BFE0 bmi dbgk2 ; if no key and blocking - loop00FFEAB6 02000E bra dbgk24dbgk20:00FFEAB8 18E000000 ldy #000FFEABB 08DEA4 bsr KeybdGetStatus00FFEABD 0C4080 andb #$80 ; is key available?00FFEABF 035004 puls b00FFEAC1 026008 bne dbgk1 ; branch if key00FFEAC3 05D tstb ; block?00FFEAC4 02BFD0 bmi dbgk2 ; If no key and blocking - loopdbgk24:00FFEAC6 0CCFFFFFF ldd #-1 ; return -1 if no block and no key00FFEAC9 0350B0 puls x,y,pcdbgk1:00FFEACB 18C000000 cmpy #000FFEACE 026004 bne dbgk2200FFEAD0 08DEAB bsr KeybdGetScancode ; get scancode directly00FFEAD2 020011 bra dbgk23dbgk22:; Retrieve value from scancode buffer00FFEAD4 01F021 tfr y,x00FFEAD6 030040 leax kbdFifo,x ; x = fifo address00FFEAD8 0E6A08127 ldb kbdHeadRcv,y ; b = buffer index00FFEADB 0A6A0D lda b,x ; get the scancode00FFEADD 05C incb ; increment fifo index00FFEADE 0C403F andb #$3f ; and wrap around00FFEAE0 0E7A08127 stb kbdHeadRcv,y ; save it back00FFEAE3 01F089 tfr a,b ; the scancode is needed in accbdbgk23:; lbsr DispByteAsHex; Make sure there is a small delay between scancode reads00FFEAE5 08E000014 ldx #20dbgk3:00FFEAE8 0301FF dex00FFEAEA 026FFC bne dbgk3; switch on scan code00FFEAEC 0C10F0 cmpb #SC_KEYUP00FFEAEE 026004 bne dbgk400FFEAF0 0D7120 stb KeyState1 ; make KeyState1 <> 000FFEAF2 020FA2 bra dbgk2 ; loop backdbgk4:00FFEAF4 0C10E0 cmpb #SC_EXTEND00FFEAF6 026008 bne dbgk500FFEAF8 096121 lda KeyState200FFEAFA 08A800 ora #$80000FFEAFC 097121 sta KeyState200FFEAFE 020F96 bra dbgk2dbgk5:00FFEB00 0C1014 cmpb #SC_CTRL00FFEB02 026016 bne dbgkNotCtrl00FFEB04 00D120 tst KeyState100FFEB06 026008 bne dbgk700FFEB08 096121 lda KeyState200FFEB0A 08A004 ora #400FFEB0C 097121 sta KeyState200FFEB0E 020006 bra dbgk8dbgk7:00FFEB10 096121 lda KeyState200FFEB12 084FFB anda #~400FFEB14 097121 sta KeyState2dbgk8:00FFEB16 00F120 clr KeyState100FFEB18 020F7C bra dbgk2dbgkNotCtrl:00FFEB1A 0C1059 cmpb #SC_RSHIFT00FFEB1C 026016 bne dbgkNotRshift00FFEB1E 00D120 tst KeyState100FFEB20 026008 bne dbgk900FFEB22 096121 lda KeyState200FFEB24 08A001 ora #100FFEB26 097121 sta KeyState200FFEB28 020006 bra dbgk10dbgk9:00FFEB2A 096121 lda KeyState200FFEB2C 084FFE anda #~100FFEB2E 097121 sta KeyState2dbgk10:00FFEB30 00F120 clr KeyState100FFEB32 020F62 bra dbgk2dbgkNotRshift:00FFEB34 0C1077 cmpb #SC_NUMLOCK00FFEB36 026013 bne dbgkNotNumlock00FFEB38 096121 lda KeyState200FFEB3A 088010 eora #1600FFEB3C 097121 sta KeyState200FFEB3E 096122 lda KeyLED00FFEB40 088002 eora #200FFEB42 097122 sta KeyLED00FFEB44 01F089 tfr a,b00FFEB46 04F clra00FFEB47 08DE40 bsr KeybdSetLED00FFEB49 020F4B bra dbgk2dbgkNotNumlock:00FFEB4B 0C1058 cmpb #SC_CAPSLOCK00FFEB4D 026013 bne dbgkNotCapslock00FFEB4F 096121 lda KeyState200FFEB51 088020 eora #3200FFEB53 097121 sta KeyState200FFEB55 096122 lda KeyLED00FFEB57 088004 eora #400FFEB59 097122 sta KeyLED00FFEB5B 01F089 tfr a,b00FFEB5D 04F clra00FFEB5E 08DE29 bsr KeybdSetLED00FFEB60 020F34 bra dbgk2dbgkNotCapslock:00FFEB62 0C107E cmpb #SC_SCROLLLOCK00FFEB64 026013 bne dbgkNotScrolllock00FFEB66 096121 lda KeyState200FFEB68 088040 eora #6400FFEB6A 097121 sta KeyState200FFEB6C 096122 lda KeyLED00FFEB6E 088001 eora #100FFEB70 097122 sta KeyLED00FFEB72 01F089 tfr a,b00FFEB74 04F clra00FFEB75 08DE12 bsr KeybdSetLED00FFEB77 020F1D bra dbgk2dbgkNotScrolllock:00FFEB79 0C1011 cmpb #SC_ALT00FFEB7B 026016 bne dbgkNotAlt00FFEB7D 00D120 tst KeyState100FFEB7F 026008 bne dbgk1100FFEB81 096121 lda KeyState200FFEB83 08A002 ora #200FFEB85 097121 sta KeyState200FFEB87 020006 bra dbgk12dbgk11:00FFEB89 096121 lda KeyState200FFEB8B 084FFD anda #~200FFEB8D 097121 sta KeyState2dbgk12:00FFEB8F 00F120 clr KeyState100FFEB91 020F03 bra dbgk2dbgkNotAlt:00FFEB93 00D120 tst KeyState100FFEB95 027004 beq dbgk1300FFEB97 00F120 clr KeyState100FFEB99 020EFB bra dbgk2dbgk13:00FFEB9B 096121 lda KeyState2 ; Check for CTRL-ALT-DEL00FFEB9D 084006 anda #600FFEB9F 081006 cmpa #600FFEBA1 026008 bne dbgk1400FFEBA3 0C1071 cmpb #SC_DEL00FFEBA5 026004 bne dbgk1400FFEBA7 06E90FFFFFFC jmp [$FFFFFC] ; jump to NMI vectordbgk14:00FFEBAB 00D121 tst KeyState2 ; extended code?00FFEBAD 02A00B bpl dbgk1500FFEBAF 096121 lda KeyState200FFEBB1 0847FF anda #$7FF00FFEBB3 097121 sta KeyState200FFEBB5 08EFFE880 ldx #keybdExtendedCodes00FFEBB8 020017 bra dbgk18dbgk15:00FFEBBA 096121 lda KeyState2 ; Is CTRL down?00FFEBBC 085004 bita #400FFEBBE 027005 beq dbgk1600FFEBC0 08EFFE800 ldx #keybdControlCodes00FFEBC3 02000C bra dbgk18dbgk16:00FFEBC5 085001 bita #1 ; Is shift down?00FFEBC7 027005 beq dbgk1700FFEBC9 08EFFE700 ldx #shiftedScanCodes00FFEBCC 020003 bra dbgk18dbgk17:00FFEBCE 08EFFE600 ldx #unshiftedScanCodesdbgk18:00FFEBD1 0E690FFFE600 ldb b,x ; load accb with ascii from table00FFEBD5 04F clra00FFEBD6 0350B0 puls x,y,pc ; and return00FFEBD8 04B04505904204F041052 fcb "KEYBOARD"00FFEBDF 04400FFEBE0 FFEBEA fcw KeybdOpen00FFEBE2 FFEBEB fcw KeybdClose00FFEBE4 FFEBEC fcw KeybdRead00FFEBE6 FFEBED fcw KeybdWrite00FFEBE8 FFEBEE fcw KeybdSeek; Keyboard Open:; Initialize the keyboard buffer head and tail indexes;KeybdOpen:00FFEBEA 039 rts; Keyboard Close:; Nothing to do except maybe clear the keyboard buffer;KeybdClose:00FFEBEB 039 rts;KeybdRead:00FFEBEC 039 rts;KeybdWrite:00FFEBED 039 rtsKeybdSeek:00FFEBEE 039 rts;==============================================================================; Serial I/O;==============================================================================; ============================================================================; __; \\__/ o\ (C) 2022 Robert Finch, Waterloo; \ __ / All rights reserved.; \/_// robfinch<remove>@opencores.org; ||;;; Serial port routines for a WDC6551 compatible circuit.;; This source file is free software: you can redistribute it and/or modify; it under the terms of the GNU Lesser General Public License as published; by the Free Software Foundation, either version 3 of the License, or; (at your option) any later version.;; This source file is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License; along with this program. If not, see <http://www.gnu.org/licenses/>.;; ============================================================================;;------------------------------------------------------------------------------; Initialize serial port.;; Clear buffer indexes. Two bytes are used for the buffer index even though; only a single byte is needed. This is for convenience in calculating the; number of characters in the buffer, done later. The upper byte remains at; zero.; The port is initialized for 9600 baud, 1 stop bit and 8 bits data sent.; The internal baud rate generator is used.;; Parameters:; none; Modifies:; d; Returns:; none;------------------------------------------------------------------------------InitSerial:SerialInit:00FFEBEF 04F clra00FFEBF0 05F clrb00FFEBF1 0DD130 std SerHeadRcv-100FFEBF3 0DD132 std SerTailRcv-100FFEBF5 0DD135 std SerHeadXmit-100FFEBF7 0DD137 std SerTailXmit-100FFEBF9 00F139 clr SerRcvXon00FFEBFB 00F140 clr SerRcvXoff00FFEBFD 0150B6FFFFFFFE0 lda COREIDsini1:00FFEC02 0B1FFC010 cmpa IOFocusID00FFEC05 026FFB bne sini100FFEC07 0C6009 ldb #$09 ; dtr,rts active, rxint enabled, no parity00FFEC09 0150F7FFFE30102 stb ACIA+ACIA_CMD00FFEC0E 0C601E ldb #$1E ; baud 9600, 1 stop bit, 8 bit, internal baud gen00FFEC10 0150F7FFFE30103 stb ACIA+ACIA_CTRL00FFEC15 0C60A6 ldb #$0A6 ; diable fifos, reset fifos00FFEC17 0150F7FFFE3010B stb ACIA+ACIA_CTRL200FFEC1C 039 rts;------------------------------------------------------------------------------; SerialGetChar;; Check the serial port buffer to see if there's a char available. If there's; a char available then return it. If the buffer is almost empty then send an; XON.;; Stack Space:; 2 words; Parameters:; none; Modifies:; none; Returns:; d = character or -1;------------------------------------------------------------------------------SerialGetChar:00FFEC1D 034030 pshs x,y00FFEC1F 18E000000 ldy #000FFEC22 01A010 sei ; disable interrupts00FFEC24 08D082 bsr SerialRcvCount ; check number of chars in receive buffer00FFEC26 0C1008 cmpb #8 ; less than 8?00FFEC28 02200C bhi sgc200FFEC2A 0D6139 ldb SerRcvXon ; skip sending XON if already sent00FFEC2C 026008 bne sgc2 ; XON already sent?00FFEC2E 0C6011 ldb #XON ; if <8 send an XON00FFEC30 00F140 clr SerRcvXoff ; clear XOFF status00FFEC32 0D7139 stb SerRcvXon ; flag so we don't send it multiple times00FFEC34 08D052 bsr SerialPutCharsgc2:00FFEC36 0D6131 ldb SerHeadRcv ; check if anything is in buffer00FFEC38 0D1133 cmpb SerTailRcv00FFEC3A 02700A beq sgcNoChars ; no?00FFEC3C 08EBFF000 ldx #SerRcvBuf00FFEC3F 04F clra00FFEC40 0E6835 ldb b,x ; get byte from buffer00FFEC42 00C131 inc SerHeadRcv ; 4k wrap around00FFEC44 020003 bra sgcXitsgcNoChars:00FFEC46 0CCFFFFFF ldd #-1sgcXit:00FFEC49 01C0EF cli00FFEC4B 0350B0 puls x,y,pc;------------------------------------------------------------------------------; SerialPeekChar;; Check the serial port buffer to see if there's a char available. If there's; a char available then return it. But don't update the buffer indexes. No need; to send an XON here.;; Stack Space:; 0 words; Parameters:; none; Modifies:; none; Returns:; d = character or -1;------------------------------------------------------------------------------SerialPeekChar:00FFEC4D 034011 pshs x,ccr00FFEC4F 01A010 sei00FFEC51 0D6131 ldb SerHeadRcv ; check if anything is in buffer00FFEC53 0D1133 cmpb SerTailRcv00FFEC55 027008 beq spcNoChars ; no?00FFEC57 08EBFF000 ldx #SerRcvBuf00FFEC5A 04F clra00FFEC5B 0E6815 ldb b,x ; get byte from buffer00FFEC5D 020003 bra spcXitspcNoChars:00FFEC5F 0CCFFFFFF ldd #-1spcXit:00FFEC62 035091 puls x,ccr,pc;------------------------------------------------------------------------------; SerialPeekChar; Get a character directly from the I/O port. This bypasses the input; buffer.;; Stack Space:; 0 words; Parameters:; none; Modifies:; d; Returns:; d = character or -1;------------------------------------------------------------------------------SerialPeekCharDirect:00FFEC64 0150B6FFFFFFFE0 lda COREID ; Ensure we have the IO Focus00FFEC69 0B1FFC010 cmpa IOFocusID00FFEC6C 026014 bne spcd0001; Disallow interrupts between status read and rx read.00FFEC6E 01A010 sei00FFEC70 0150F6FFFE30101 ldb ACIA+ACIA_STAT00FFEC75 0C5008 bitb #8 ; look for Rx not empty00FFEC77 027009 beq spcd000100FFEC79 04F clra00FFEC7A 0150F6FFFE30100 ldb ACIA+ACIA_RX00FFEC7F 01C0EF cli00FFEC81 039 rtsspcd0001:00FFEC82 0CCFFFFFF ldd #-100FFEC85 01C0EF cli00FFEC87 039 rts;------------------------------------------------------------------------------; SerialPutChar; Put a character to the serial transmitter. This routine blocks until the; transmitter is empty.;; Stack Space; 0 words; Parameters:; b = character to put; Modifies:; none;------------------------------------------------------------------------------SerialPutChar:00FFEC88 034003 pshs a,ccrspc0001:00FFEC8A 0150B6FFFFFFFE0 lda COREID ; Ensure we have the IO Focus00FFEC8F 0B1FFC010 cmpa IOFocusID00FFEC92 026FF6 bne spc000100FFEC94 01C0EF cli ; provide a window for an interrupt to occur00FFEC96 01A010 sei; Between the status read and the transmit do not allow an; intervening interrupt.00FFEC98 0150B6FFFE30101 lda ACIA+ACIA_STAT ; wait until the uart indicates tx empty00FFEC9D 085010 bita #16 ; bit #4 of the status reg00FFEC9F 027FE9 beq spc0001 ; branch if transmitter is not empty00FFECA1 0150F7FFFE30100 stb ACIA+ACIA_TX ; send the byte00FFECA6 035083 puls a,ccr,pc;------------------------------------------------------------------------------; Calculate number of character in input buffer;; Parameters:; y = 0 if current core, otherwise reference to core memory area $Cyxxxx; Returns:; d = number of bytes in buffer.;------------------------------------------------------------------------------SerialRcvCount:00FFECA8 04F clra00FFECA9 0E6A08133 ldb SerTailRcv,y00FFECAC 0E0A08131 subb SerHeadRcv,y00FFECAF 02C009 bge srcXit00FFECB1 0CC001000 ldd #$100000FFECB4 0A3A08131 subd SerHeadRcv,y00FFECB7 0E3A08133 addd SerTailRcv,ysrcXit:00FFECBA 039 rts;------------------------------------------------------------------------------; Serial IRQ routine;; Keeps looping as long as it finds characters in the ACIA recieve buffer/fifo.; Received characters are buffered. If the buffer becomes full, new characters; will be lost.;; Parameters:; none; Modifies:; d,x; Returns:; none;------------------------------------------------------------------------------SerialIRQ:sirqNxtByte:00FFECBB 0150F6FFFE30101 ldb ACIA+ACIA_STAT ; check the status00FFECC0 0C5008 bitb #$08 ; bit 3 = rx full00FFECC2 027049 beq notRxInt00FFECC4 0150F6FFFE30100 ldb ACIA+ACIA_RX ; get data from Rx buffer to clear interrupt00FFECC9 0C1014 cmpb #CTRLT ; detect special keystroke00FFECCB 026000 bne sirq0001; bsr DumpTraceQueuesirq0001:00FFECCD 034004 pshs b; Compute receive buffer address00FFECCF 0B6FFC010 lda IOFocusID00FFECD2 048 asla00FFECD3 048 asla00FFECD4 048 asla00FFECD5 048 asla00FFECD6 08AC00 ora #$C0000FFECD8 05F clrb00FFECD9 01F002 tfr d,y00FFECDB 035004 puls b00FFECDD 0A6A08133 lda SerTailRcv,y ; check if recieve buffer full00FFECE0 04C inca00FFECE1 0A1A08131 cmpa SerHeadRcv,y00FFECE4 027027 beq sirqRxFull00FFECE6 0A7A08133 sta SerTailRcv,y ; update tail pointer00FFECE9 04A deca ; backup00FFECEA 01E089 exg a,b00FFECEC 030A0A000BFF000 leax SerRcvBuf,y ; x = buffer address00FFECF1 0A7A0F sta b,x ; store recieved byte in buffer00FFECF3 06DA08140 tst SerRcvXoff,y ; check if xoff already sent00FFECF6 026FC3 bne sirqNxtByte00FFECF8 08DFAE bsr SerialRcvCount ; if more than 4080 chars in buffer00FFECFA 0C1FF0 cmpb #408000FFECFC 025FBD blo sirqNxtByte00FFECFE 0C6013 ldb #XOFF ; send an XOFF00FFED00 06FA08139 clr SerRcvXon,y ; clear XON status00FFED03 0E7A08140 stb SerRcvXoff,y ; set XOFF status00FFED06 0150F7FFFE30100 stb ACIA+ACIA_TX00FFED0B 020FAE bra sirqNxtByte ; check the status for another bytesirqRxFull:notRxInt:00FFED0D 039 rtsnmeSerial:00FFED0E 05306507206906106C000 fcb "Serial",0;------------------------------------------------------------------------------; Put a string to the serial port.;; Parameters:; d = pointer to string; Modifies:; none; Returns:; none;------------------------------------------------------------------------------SerialPutString:00FFED15 034016 pshs d,x00FFED17 01F001 tfr d,xsps2:00FFED19 0E6804 ldb ,x00FFED1B 027006 beq spsXit00FFED1D 030001 inx00FFED1F 08DF67 bsr SerialPutChar00FFED21 020FF6 bra sps2spsXit:00FFED23 035096 puls d,x,pc;------------------------------------------------------------------------------; A little routine to test serial output.;; Parameters:; none; Modifies:; none; Returns:; none;------------------------------------------------------------------------------SerialOutputTest:00FFED25 034006 pshs d00FFED27 0CCFFED45 ldd #msgSerialTest00FFED2A 017FFF6AD lbsr DisplayString*** warning 1: Long branch within short branch range could be optimized00FFED2D 08DEC0 bsr SerialInitsotst1:00FFED2F 0C6011 ldb #XON00FFED31 08DF55 bsr SerialPutChar00FFED33 08DF53 bsr SerialPutChar00FFED35 08DF51 bsr SerialPutChar00FFED37 0CCFFED45 ldd #msgSerialTest00FFED3A 08DFD9 bsr SerialPutString00FFED3C 01700016A lbsr INCH00FFED3F 0C1003 cmpb #CTRLC00FFED41 026FEC bne sotst100FFED43 035086 puls d,pcmsgSerialTest:00FFED45 05306507206906106C020 fcb "Serial port test",CR,LF,000FFED4C 07006F07207402007406500FFED53 07307400D00A000; ============================================================================; __; \\__/ o\ (C) 2022 Robert Finch, Waterloo; \ __ / All rights reserved.; \/_// robfinch<remove>@opencores.org; ||;;; BSD 3-Clause License; Redistribution and use in source and binary forms, with or without; modification, are permitted provided that the following conditions are met:;; 1. Redistributions of source code must retain the above copyright notice, this; list of conditions and the following disclaimer.;; 2. Redistributions in binary form must reproduce the above copyright notice,; this list of conditions and the following disclaimer in the documentation; and/or other materials provided with the distribution.;; 3. Neither the name of the copyright holder nor the names of its; contributors may be used to endorse or promote products derived from; this software without specific prior written permission.;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.;; ============================================================================;s19Address EQU $940 ; to $943s19StartAddress EQU $944 ; to $947s19Rectype EQU $948s19Reclen EQU $949s19Abort EQU $94A; ------------------------------------------------------------------------------; Skip over input to the next record.; ------------------------------------------------------------------------------s19NextRecord:00FFED58 0CCFFFFFF ldd #-1 ; block until input is available00FFED5B 03F swi00FFED5C 001 fcb MF_INCH ; monitor input rout00FFED5D 0C100A cmpb #LF ; line feed marks end of record00FFED5F 027013 beq s19nr100FFED61 0C1003 cmpb #CTRLC ; should not get this in a file transfer00FFED63 026003 bne s19nr200FFED65 0F700094A stb s19Aborts19nr2:00FFED68 0C101A cmpb #CTRLZ ; end of file marker?00FFED6A 026003 bne s19nr300FFED6C 0F700094A stb s19Aborts19nr3:00FFED6F 07D00094A tst s19Abort00FFED72 027FE4 beq s19NextRecords19nr1:00FFED74 039 rts; ------------------------------------------------------------------------------; Input a byte. There are three characters per byte since things are 12-bit.;; Parameters:; none; Returns:; accb = byte value converted from text; ------------------------------------------------------------------------------s19GetByte:00FFED75 03F swi00FFED76 001 fcb MF_INCH ; get the first character00FFED77 0170004F6 lbsr AsciiToHexNybble ; convert to nybble00FFED7A 07D00094A tst s19Abort ; check for abort00FFED7D 027002 beq s19gb100FFED7F 04F clra00FFED80 039 rtss19gb1: ; shift the value four bits00FFED81 058 aslb00FFED82 058 aslb00FFED83 058 aslb00FFED84 058 aslb00FFED85 034004 pshs b ; save off value00FFED87 03F swi00FFED88 001 fcb MF_INCH ; get the second character00FFED89 0170004E4 lbsr AsciiToHexNybble ; convert to nybble00FFED8C 07D00094A tst s19Abort ; check for abort00FFED8F 026011 bne s19gb200FFED91 0EAE00 orb ,s+ ; merge new nybble into value00FFED93 058 aslb ; shift the value four more bits00FFED94 058 aslb00FFED95 058 aslb00FFED96 058 aslb00FFED97 034004 pshs b ; save off value00FFED99 03F swi00FFED9A 001 fcb MF_INCH ; get third character00FFED9B 0170004D2 lbsr AsciiToHexNybble ; convert to nybble00FFED9E 0EAE00 orb ,s+ ; merge in value00FFEDA0 04F clra ; make byte 000 to FFF in D00FFEDA1 039 rtss19gb2:00FFEDA2 032601 leas 1,s ; discard saved byte00FFEDA4 04F clra00FFEDA5 039 rts; ------------------------------------------------------------------------------; Zero out address; ------------------------------------------------------------------------------s19ClearAddress:00FFEDA6 07F000940 clr s19Address00FFEDA9 07F000941 clr s19Address+100FFEDAC 07F000942 clr s19Address+200FFEDAF 07F000943 clr s19Address+300FFEDB2 039 rts; ------------------------------------------------------------------------------; Get an address composed of two bytes (24 bit);; Side Effects:; updates s19Address variable; Returns:; none; ------------------------------------------------------------------------------s19GetAddress2:00FFEDB3 08DFF1 bsr s19ClearAddress00FFEDB5 08DFBE bsr s19GetByte00FFEDB7 0F7000942 stb s19Address+200FFEDBA 07D00094A tst s19Abort00FFEDBD 026005 bne s19ga100FFEDBF 08DFB4 bsr s19GetByte00FFEDC1 0F7000943 stb s19Address+3s19ga1:00FFEDC4 039 rts; ------------------------------------------------------------------------------; Get an address composed of three bytes (36 bit);; Side Effects:; updates s19Address variable; Returns:; none; ------------------------------------------------------------------------------s19GetAddress3:00FFEDC5 08DFDF bsr s19ClearAddress00FFEDC7 08DFAC bsr s19GetByte00FFEDC9 0F7000941 stb s19Address+100FFEDCC 07D00094A tst s19Abort00FFEDCF 02600F bne s19ga200FFEDD1 08DFA2 bsr s19GetByte00FFEDD3 0F7000942 stb s19Address+200FFEDD6 07D00094A tst s19Abort00FFEDD9 026005 bne s19ga200FFEDDB 08DF98 bsr s19GetByte00FFEDDD 0F7000943 stb s19Address+3s19ga2:00FFEDE0 039 rts; ------------------------------------------------------------------------------; Put a byte to memory.; ------------------------------------------------------------------------------s19PutMem:00FFEDE1 05F clrb ; accb = current byte counts19pm3:00FFEDE2 034004 pshs b ; save byte count00FFEDE4 08DF8F bsr s19GetByte00FFEDE6 07D00094A tst s19Abort00FFEDE9 02601C bne s19pm100FFEDEB 0150E790F000941 stb far [s19Address+1] ; store the byte using far addressing00FFEDF0 07C000943 inc s19Address+300FFEDF3 026008 bne s19pm200FFEDF5 07C000942 inc s19Address+200FFEDF8 026003 bne s19pm200FFEDFA 07C000941 inc s19Address+1s19pm2:00FFEDFD 035004 puls b ; get back byte count00FFEDFF 05C incb ; increment and00FFEE00 0F1000949 cmpb s19Reclen ; compare to record length00FFEE03 025FDD blo s19pm300FFEE05 020F6E bra s19GetByte ; get the checksum bytes19pm1:00FFEE07 032601 leas 1,s ; faster than actual pull00FFEE09 020F6A bra s19GetByte ; get the checksum byte; ------------------------------------------------------------------------------; Processing for S1 record type.; ------------------------------------------------------------------------------s19ProcessS1:00FFEE0B 08DFA6 bsr s19GetAddress200FFEE0D 08DFD2 bsr s19PutMem00FFEE0F 020072 bra s19lnr; ------------------------------------------------------------------------------; Processing for S2 record type.; ------------------------------------------------------------------------------s19ProcessS2:00FFEE11 08DFB2 bsr s19GetAddress300FFEE13 08DFCC bsr s19PutMem00FFEE15 02006C bra s19lnr; S3,4,5,6 not processed; ------------------------------------------------------------------------------; Processing for S7 record type. Gets a two byte (24 bit) start address.; ------------------------------------------------------------------------------s19ProcessS9:00FFEE17 08DF9A bsr s19GetAddress200FFEE19 0FC000942 ldd s19Address+200FFEE1C 0FD000946 std s19StartAddress+200FFEE1F 0FC000940 ldd s19Address+000FFEE22 0FD000944 std s19StartAddress+000FFEE25 020069 bra s19l2; ------------------------------------------------------------------------------; Processing for S8 record type. Gets a three byte (36 bit) start address.; ------------------------------------------------------------------------------s19ProcessS8:00FFEE27 08DF9C bsr s19GetAddress300FFEE29 0FC000942 ldd s19Address+200FFEE2C 0FD000946 std s19StartAddress+200FFEE2F 0FC000940 ldd s19Address+000FFEE32 0FD000944 std s19StartAddress+000FFEE35 020059 bra s19l2; ------------------------------------------------------------------------------; S19 Loader;; Not all record types are processed. Some are skipped over.; ------------------------------------------------------------------------------S19Loader:00FFEE37 07F00094A clr s19Abort ; clear the abort flag00FFEE3A 0CCFFEE93 ldd #msgS19Loader ; signon banner00FFEE3D 03F swi00FFEE3E 004 fcb MF_DisplayStrings19l3:00FFEE3F 03F swi ; get a character from input00FFEE40 001 fcb MF_INCH00FFEE41 0C101A cmpb #CTRLZ ; is it CTRL-Z?00FFEE43 02704B beq s19l200FFEE45 0C1053 cmpb #'S' ; records must start with the letter S00FFEE47 02603A bne s19lnr00FFEE49 03F swi ; get the next character00FFEE4A 001 fcb MF_INCH00FFEE4B 0C1030 cmpb #'0' ; must be a numeric digit00FFEE4D 025034 blo s19lnr00FFEE4F 0C1039 cmpb #'9'00FFEE51 022030 bhi s19lnr00FFEE53 0F7000948 stb s19Rectype ; save off in record type00FFEE56 08DF1D bsr s19GetByte ; get a byte indicating record length00FFEE58 0F7000949 stb s19Reclen00FFEE5B 07D00094A tst s19Abort ; check for abort00FFEE5E 026030 bne s19l200FFEE60 0F6000948 ldb s19Rectype ; process according to record type00FFEE63 0C1030 cmpb #'0'00FFEE65 02701C beq s19lnr00FFEE67 0C1031 cmpb #'1'00FFEE69 027FA0 beq s19ProcessS1 ; data record with a two byte address00FFEE6B 0C1032 cmpb #'2'00FFEE6D 027FA2 beq s19ProcessS2 ; data record with a three byte address00FFEE6F 0C1033 cmpb #'3'00FFEE71 027010 beq s19lnr00FFEE73 0C1035 cmpb #'5' ; record count? ignore00FFEE75 02700C beq s19lnr00FFEE77 0C1037 cmpb #'7' ; ignore record with 48 bit address00FFEE79 027015 beq s19l200FFEE7B 0C1038 cmpb #'8'00FFEE7D 027FA8 beq s19ProcessS8 ; two byte start address00FFEE7F 0C1039 cmpb #'9'00FFEE81 027F94 beq s19ProcessS9 ; three byte start addresss19lnr:00FFEE83 0C602E ldb #'.' ; output a progress indicator00FFEE85 03F swi00FFEE86 002 fcb MF_OUTCH00FFEE87 08DECF bsr s19NextRecord ; skip to the next record00FFEE89 07D00094A tst S19Abort ; check for abort00FFEE8C 026002 bne s19l200FFEE8E 020FAF bra s19l3 ; loop back to process more recordss19l2:00FFEE90 0160001A6 lbra MonitormsgS19Loader:00FFEE93 05303103902004C06F061 fcb "S19 Loader Active",CR,LF,000FFEE9A 06406507202004106307400FFEEA1 06907606500D00A000;------------------------------------------------------------------------------; Check if there is a keyboard character available. If so return true (<0); otherwise return false (0) in accb.;------------------------------------------------------------------------------;KeybdCheckForKeyDirect:00FFEEA7 020BE7 bra DBGCheckForKey;------------------------------------------------------------------------------;------------------------------------------------------------------------------INCH:00FFEEA9 034004 pshs bINCH2:00FFEEAB 0150F6FFFFFFFE0 ldb COREID00FFEEB0 0F1FFC010 cmpb IOFocusID ; if we do not have focus, block00FFEEB3 026FF6 bne INCH2; ldb #$800 ; block if no key available, get scancode directly; bra GetKey; jsr [CharInVec] ; vector is being overwritten somehow00FFEEB5 017FFFDAC lbsr SerialPeekCharDirect*** warning 1: Long branch within short branch range could be optimized00FFEEB8 04D tsta00FFEEB9 02B003 bmi INCH1 ; block if no key available00FFEEBB 032601 leas 1,s ; get rid of blocking status00FFEEBD 039 rtsINCH1:00FFEEBE 035004 puls b ; check blocking status00FFEEC0 05D tstb00FFEEC1 02BFE6 bmi INCH ; if blocking, loop00FFEEC3 0CCFFFFFF ldd #-1 ; return -1 if no char available00FFEEC6 039 rtsINCHE:00FFEEC7 08DFE0 bsr INCH00FFEEC9 020009 bra INCHEK3INCHEK:00FFEECB 08DFDC bsr INCH00FFEECD 01507DFFFFFCA00 tst KeybdEcho00FFEED2 02700C beq INCHEK1INCHEK3:00FFEED4 08100D cmpa #CR00FFEED6 026005 bne INCHEK200FFEED8 017FFE1F7 lbsr CRLF*** warning 1: Long branch within short branch range could be optimized00FFEEDB 020003 bra INCHEK1INCHEK2:00FFEEDD 017FFF439 lbsr DisplayChar*** warning 1: Long branch within short branch range could be optimizedINCHEK1:00FFEEE0 039 rtsOUTCH:00FFEEE1 06E90F000800 jmp [CharOutVec];------------------------------------------------------------------------------; r1 0=echo off, non-zero = echo on;------------------------------------------------------------------------------;SetKeyboardEcho:00FFEEE5 0150F7FFFFFCA00 stb KeybdEcho00FFEEEA 039 rts;------------------------------------------------------------------------------; Parameters:; x,d bitmap of sprites to enable;------------------------------------------------------------------------------ShowSprites:00FFEEEB 0150BFFFFE103C0 stx SPRITE_CTRL+SPRITE_EN00FFEEF0 0150FDFFFE103C2 std SPRITE_CTRL+SPRITE_EN+200FFEEF5 039 rts;==============================================================================; Femtiki Operating System.;==============================================================================OSCallTbl:00FFEEF6 000000 fcw 000FFEEF8 000000 fcw 000FFEEFA 000000 fcw 000FFEEFC 000000 fcw 000FFEEFE 000000 fcw 000FFEF00 000000 fcw 000FFEF02 000000 fcw 000FFEF04 000000 fcw 000FFEF06 000000 fcw 000FFEF08 000000 fcw 000FFEF0A 000000 fcw 000FFEF0C 000000 fcw 000FFEF0E 000000 fcw 000FFEF10 000000 fcw 000FFEF12 000000 fcw 000FFEF14 000000 fcw 000FFEF16 000000 fcw 000FFEF18 000000 fcw 000FFEF1A 000000 fcw 000FFEF1C 000000 fcw 000FFEF1E 000000 fcw 000FFEF20 000000 fcw 000FFEF22 FFEF3F fcw ReleaseIOFocus00FFEF24 000000 fcw 000FFEF26 FFEF28 fcw RequestIOFocusNumOSFuncs EQU (*-OSCallTbl)/2RequestIOFocus:00FFEF28 0150F6FFFFFFFE0 ldb COREID00FFEF2D 08EFFC000 ldx #IOFocusList00FFEF30 03A abx00FFEF31 0A7804 sta ,x00FFEF33 07DFFC010 tst IOFocusID00FFEF36 1260007D1 lbne oscx00FFEF39 0F7FFC010 stb IOFocusID00FFEF3C 0160007CB lbra oscxReleaseIOFocus:00FFEF3F 0150F6FFFFFFFE0 ldb COREID00FFEF44 08EFFC000 ldx #IOFocusList00FFEF47 03A abx00FFEF48 06F804 clr ,x ; clear the request indicator00FFEF4A 017FFF2BC lbsr CopyScreenToVirtualScreen*** warning 1: Long branch within short branch range could be optimized00FFEF4D 0F1FFC010 cmpb IOFocusID ; are we the one with the focus?00FFEF50 1260007B7 lbne oscx; We had the focus, so now a new core needs the focus.; Search the focus list for a requestor. If no requester; is found, give focus to core #1.00FFEF53 08600F lda #15riof2:00FFEF55 05C incb00FFEF56 0C400F andb #1500FFEF58 03A abx00FFEF59 06D804 tst ,x00FFEF5B 026009 bne riof100FFEF5D 04A deca00FFEF5E 026FF5 bne riof2; If no focus is requested by anyone, give to core #100FFEF60 0C6001 ldb #100FFEF62 086018 lda #2400FFEF64 0A7804 sta ,xriof1:00FFEF66 0F7FFC010 stb IOFocusID00FFEF69 017FFF266 lbsr CopyVirtualScreenToScreen*** warning 1: Long branch within short branch range could be optimized00FFEF6C 01600079B lbra oscx;==============================================================================;==============================================================================;------------------------------------------------------------------------------; Seed the random number generator. All channels are seeded with the same; value.;; Parameters:; d = 'z' part of seed; x = 'w' part of seed; Returns:; none;------------------------------------------------------------------------------mon_srand:00FFEF6F 18E000000 ldy #0mon_srand1:00FFEF72 0151BFFFFE30604 sty PRNG+4 ; select channel00FFEF77 01507FFFFE30608 clr PRNG+800FFEF7C 01507FFFFE30609 clr PRNG+900FFEF81 0150FDFFFE3060A std PRNG+10 ; update low half of value00FFEF86 01507FFFFE3060C clr PRNG+1200FFEF8B 01507FFFFE3060D clr PRNG+1300FFEF90 0150BFFFFE3060E stx PRNG+14 ; update low half of value00FFEF95 031201 iny00FFEF97 18C000400 cmpy #$400 ; 1k channels00FFEF9A 025FD6 blo mon_srand100FFEF9C 039 rts;------------------------------------------------------------------------------; Get a random number and generate the next one.;; Parameters:; d = channel to use; Returns:; x,d = 36 bit random value;------------------------------------------------------------------------------mon_rand:00FFEF9D 0150FDFFFE30604 std PRNG+4 ; select channel00FFEFA2 0150BEFFFE30600 ldx PRNG+000FFEFA7 0150FCFFFE30602 ldd PRNG+200FFEFAC 0150F7FFFE30603 stb PRNG+3 ; trigger calc of next number00FFEFB1 039 rts;==============================================================================; System Monitor;==============================================================================; Command TablescmdTable1:00FFEFB2 03C83E fcb '<','>'+$80000FFEFB4 062873 fcb 'b','s'+$80000FFEFB6 062863 fcb 'b','c'+$80000FFEFB8 044852 fcb 'D','R'+$80000FFEFBA 844 fcb 'D'+$80000FFEFBB 83A fcb ':'+$80000FFEFBC 046049847 fcb "FI",'G'+$80000FFEFBF 04604984C fcb "FI",'L'+$80000FFEFC2 04684C fcb 'F','L'+$80000FFEFC4 84A fcb 'J'+$80000FFEFC5 05204104D054045053854 fcb "RAMTES",'T'+$80000FFEFCC 053050844 fcb "SP",'D'+$80000FFEFCF 054049852 fcb "TI",'R'+$80000FFEFD2 855 fcb 'U'+$80000FFEFD3 065078069874 fcb "exi",'t'+$80000FFEFD7 83F fcb '?'+$80000FFEFD8 04304C853 fcb "CL",'S'+$80000FFEFDB 053031839 fcb "S1",'9'+$80000FFEFDE 04A044834 fcb "JD",'4'+$80000FFEFE1 000000 fcw 0cmdTable2:00FFEFE3 FFF0F8 fcw Redirect00FFEFE5 FFF13A fcw MonArmBreakpoint00FFEFE7 FFF145 fcw MonDisarmBreakpoint00FFEFE9 FFF54A fcw DumpRegs00FFEFEB FFF484 fcw DumpMemory00FFEFED FFF4E0 fcw EditMemory00FFEFEF FE0000 fcw $FE0000 ; FIG forth00FFEFF1 FFF520 fcw FillMemory00FFEFF3 FFF60B fcw DumpIOFocusList00FFEFF5 FFF595 fcw jump_to_code00FFEFF7 FFD400 fcw $FFD40000FFEFF9 FF8000 fcw $FF8000 ; sprite demo00FFEFFB FFE4F4 fcw rtc_read00FFEFFD FF8003 fcw $FF8003 ; unassembler00FFEFFF FFF6F3 fcw xitMonitor00FFF001 FFF11E fcw PromptHelp00FFF003 FFF126 fcw PromptClearscreen00FFF005 FFEE37 fcw S19Loader00FFF007 FFD400 fcw $FFD400CmdPrompt:00FFF009 017FFE0C6 lbsr CRLF*** warning 1: Long branch within short branch range could be optimized00FFF00C 0C6024 ldb #'$'00FFF00E 017FFFED0 lbsr OUTCH*** warning 1: Long branch within short branch range could be optimized00FFF011 016FFFECD lbra OUTCH*** warning 1: Long branch within short branch range could be optimizedmsgF09Starting:00FFF014 04606506D07406906B069 fcb "Femtiki F09 Multi-core OS Starting",CR,LF,000FFF01B 02004603003902004D07500FFF022 06C07406902D06306F07200FFF029 06502004F05302005307400FFF030 06107207406906E06700D00FFF037 00A000Monitor:00FFF039 0FC00092C ldd mon_init ; check special code to see if monitor has been initialized00FFF03C 18312D687 cmpd #123456700FFF03F 02704D beq mon100FFF041 07F000810 clr BreakpointFlag00FFF044 07F000811 clr NumSetBreakpoints00FFF047 0CC00007B ldd #12300FFF04A 08E00028E ldx #65400FFF04D 017FFFF1F lbsr mon_srand*** warning 1: Long branch within short branch range could be optimized00FFF050 0CCFFF014 ldd #msgF09Starting00FFF053 017FFF384 lbsr DisplayString*** warning 1: Long branch within short branch range could be optimized00FFF056 0CCFFF2CF ldd #HelpMsg00FFF059 017FFF37E lbsr DisplayString*** warning 1: Long branch within short branch range could be optimized00FFF05C 0CCFFF009 ldd #CmdPrompt00FFF05F 0FD000808 std CmdPromptJI00FFF062 0CCFFF2B6 ldd #DisplayErr00FFF065 0FD00080C std MonErrVec00FFF068 0CC0063FF ldd #$63FF ; default app stack00FFF06B 0FD000908 std mon_SSAVE00FFF06E 07F00090E clr mon_DPRSAVE ;00FFF071 01F0A8 tfr ccr,a00FFF073 0B700090F sta mon_CCRSAVE00FFF076 07F00090A clr mon_PCSAVE00FFF079 0CCFFF039 ldd #Monitor00FFF07C 0FD00090B std mon_PCSAVE+100FFF07F 07F000902 clr mon_XSAVE00FFF082 07F000904 clr mon_YSAVE00FFF085 07F000906 clr mon_USAVE00FFF088 0CC12D687 ldd #123456700FFF08B 0FD00092C std mon_initmon1:00FFF08E 03280F006FFF leas $6FFF ; reset stack pointer00FFF092 05F clrb ; turn off keyboard echo00FFF093 017FFFE4F lbsr SetKeyboardEcho*** warning 1: Long branch within short branch range could be optimized; Reset IO vectors00FFF096 0CCFFEC64 ldd #SerialPeekCharDirect00FFF099 0FD000804 std CharInVec00FFF09C 0CCFFE319 ldd #DisplayChar00FFF09F 0FD000800 std CharOutVec00FFF0A2 0CCFFF009 ldd #CmdPrompt00FFF0A5 0FD000808 std CmdPromptJI; jsr RequestIOFocusPromptLn:00FFF0A8 0AD90F000808 jsr [CmdPromptJI]; Get characters until a CR is keyedPrompt3:00FFF0AC 0CCFFFFFF ldd #-1 ; block until key present00FFF0AF 017FFFDF7 lbsr INCH*** warning 1: Long branch within short branch range could be optimized00FFF0B2 0C100D cmpb #CR ; carriage return?00FFF0B4 027005 beq Prompt100FFF0B6 017FFFE28 lbsr OUTCH ; spit out the character*** warning 1: Long branch within short branch range could be optimized00FFF0B9 020FF1 bra Prompt3 ; and keep going; Process the screen line that the CR was keyed on;Prompt1:00FFF0BB 0CC005050 ldd #$505000FFF0BE 0150FDFFFE60001 std LEDS; ldb RunningID; cmpb #61; bhi Prompt300FFF0C3 00F111 clr CursorCol ; go back to the start of the line00FFF0C5 017FFF22A lbsr CalcScreenLoc ; calc screen memory location*** warning 1: Long branch within short branch range could be optimized00FFF0C8 01F002 tfr d,yskipDollar:00FFF0CA 08D067 bsr MonGetNonSpace00FFF0CC 0C1024 cmpb #'$'00FFF0CE 027FFA beq skipDollar ; skip over '$' prompt character; Dispatch based on command;00FFF0D0 0313FF dey00FFF0D2 01F023 tfr y,u ; save off input position00FFF0D4 05F clrb00FFF0D5 08EFFEFB2 ldx #cmdTable1parseCmd1:00FFF0D8 0A6A00 lda ,y+ ; get input character00FFF0DA 06D804 tst ,x ; test for end of command00FFF0DC 02B00F bmi endOfWord ;00FFF0DE 0A1800 cmpa ,x+ ; does input match command?00FFF0E0 027FF6 beq parseCmd1scanNextWord:00FFF0E2 06D800 tst ,x+00FFF0E4 027F53 beq Monitor ; if end of table reached, not a command00FFF0E6 02AFFA bpl scanNextWord00FFF0E8 05C incb00FFF0E9 01F032 tfr u,y ; reset input pointer00FFF0EB 020FEB bra parseCmd1 ; try againendOfWord:00FFF0ED 0A8804 eora ,x00FFF0EF 048 asla00FFF0F0 026FF0 bne scanNextWord; we found the command in the table00FFF0F2 058 aslb ; b = word index00FFF0F3 08EFFEFE3 ldx #cmdTable200FFF0F6 06E905 jmp [b,x] ; execute commandRedirect:00FFF0F8 08D034 bsr MonGetch00FFF0FA 0C1073 cmpb #'s'00FFF0FC 02600E bne Prompt2a00FFF0FE 0CCFFEC64 ldd #SerialPeekCharDirect00FFF101 0FD000804 std CharInVec00FFF104 0CCFFEC88 ldd #SerialPutChar00FFF107 0FD000800 std CharOutVec00FFF10A 020F2D bra MonitorPrompt2a:00FFF10C 0C1063 cmpb #'c'00FFF10E 026F29 bne Monitor00FFF110 0CCFFEA92 ldd #GetKey00FFF113 0FD000804 std CharInVec00FFF116 0CCFFE319 ldd #DisplayChar00FFF119 0FD000800 std CharOutVec00FFF11C 020F1B bra MonitorPromptHelp:00FFF11E 0CCFFF2CF ldd #HelpMsg00FFF121 017FFF2B6 lbsr DisplayString*** warning 1: Long branch within short branch range could be optimized00FFF124 020F13 bra MonitorPromptClearscreen:00FFF126 017FFF110 lbsr ClearScreen*** warning 1: Long branch within short branch range could be optimized00FFF129 017FFF184 lbsr HomeCursor*** warning 1: Long branch within short branch range could be optimized00FFF12C 020F0B bra MonitorMonGetch:00FFF12E 0E6A04 ldb ,y00FFF130 031201 iny00FFF132 039 rtsMonGetNonSpace:00FFF133 08DFF9 bsr MonGetCh00FFF135 0C1020 cmpb #' '00FFF137 027FFA beq MonGetNonSpace00FFF139 039 rtsMonArmBreakpoint:00FFF13A 017000611 lbsr ArmBreakpoint00FFF13D 0C6FFF ldb #$FFF00FFF13F 0F7000810 stb BreakpointFlag00FFF142 016FFFEF4 lbra Monitor*** warning 1: Long branch within short branch range could be optimizedMonDisarmBreakpoint:00FFF145 017000632 lbsr DisarmBreakpoint00FFF148 016FFFEEE lbra Monitor*** warning 1: Long branch within short branch range could be optimized;------------------------------------------------------------------------------; Ignore blanks in the input; Y = text pointer; D destroyed;------------------------------------------------------------------------------;ignBlanks:ignBlanks1:00FFF14B 08DFE1 bsr MonGetch00FFF14D 0C1020 cmpb #' '00FFF14F 027FFA beq ignBlanks100FFF151 0313FF dey00FFF153 039 rts;------------------------------------------------------------------------------; Multiply number in work area by 10.;------------------------------------------------------------------------------Times10:00FFF154 034006 pshs d00FFF156 0FC000910 ldd mon_numwka ; make a copy of the number00FFF159 0FD000918 std mon_numwka+800FFF15C 0FC000912 ldd mon_numwka+200FFF15F 0FD00091A std mon_numwka+1000FFF162 08D05B bsr shl_numwka ; shift left = *200FFF164 08D059 bsr shl_numwka ; shift left = *400FFF166 0FC000912 ldd mon_numwka+2 ; add in original value00FFF169 0F300091A addd mon_numwka+10 ; = *500FFF16C 0F6000911 ldb mon_numwka+100FFF16F 0F9000919 adcb mon_numwka+900FFF172 0F7000911 stb mon_numwka+100FFF175 0B6000910 lda mon_numwka+000FFF178 0B9000918 adca mon_numwka+800FFF17B 0B7000910 sta mon_numwka+000FFF17E 08D03F bsr shl_numwka ; shift left = * 1000FFF180 035086 puls d,pc;------------------------------------------------------------------------------;------------------------------------------------------------------------------GetTwoParams:00FFF182 08DFC7 bsr ignBlanks00FFF184 08D0DC bsr GetNumber ; get start address of dump00FFF186 0FC000910 ldd mon_numwka00FFF189 0FD000920 std mon_r100FFF18C 0FC000912 ldd mon_numwka+200FFF18F 0FD000922 std mon_r1+200FFF192 08DFB7 bsr ignBlanks00FFF194 08D0CC bsr GetNumber ; get end address of dump00FFF196 0FC000910 ldd mon_numwka00FFF199 0FD000924 std mon_r200FFF19C 0FC000912 ldd mon_numwka+200FFF19F 0FD000926 std mon_r2+200FFF1A2 039 rts;------------------------------------------------------------------------------; Get a range, the end must be greater or equal to the start.;------------------------------------------------------------------------------GetRange:00FFF1A3 08DFDD bsr GetTwoParams00FFF1A5 0FC000926 ldd mon_r2+200FFF1A8 0B3000922 subd mon_r1+200FFF1AB 0FC000924 ldd mon_r200FFF1AE 0F2000921 sbcb mon_r1+100FFF1B1 0B2000920 sbca mon_r100FFF1B4 124000007 lbcc grng100FFF1B7 0AD90F00080C jsr [MonErrVec]00FFF1BB 016FFFE7B lbra Monitor*** warning 1: Long branch within short branch range could be optimizedgrng1:00FFF1BE 039 rtsshl_numwka:00FFF1BF 078000913 asl mon_numwka+300FFF1C2 079000912 rol mon_numwka+200FFF1C5 079000911 rol mon_numwka+100FFF1C8 079000910 rol mon_numwka00FFF1CB 039 rts;------------------------------------------------------------------------------; Get a hexidecimal number. Maximum of twelve digits.;; Modifies:; Y = text pointer (updated); D = number of digits; mon_numwka contains number;------------------------------------------------------------------------------;GetHexNumber:00FFF1CC 04F05F clrd00FFF1CE 0FD000910 std mon_numwka ; zero out work area00FFF1D1 0FD000912 std mon_numwka+200FFF1D4 034010 pshs x00FFF1D6 08E000000 ldx #0 ; max 12 eight digitsgthxn2:00FFF1D9 08DF53 bsr MonGetch00FFF1DB 08D093 bsr AsciiToHexNybble00FFF1DD 0C1FFF cmpb #-100FFF1DF 027017 beq gthxn100FFF1E1 08DFDC bsr shl_numwka00FFF1E3 08DFDA bsr shl_numwka00FFF1E5 08DFD8 bsr shl_numwka00FFF1E7 08DFD6 bsr shl_numwka00FFF1E9 0C400F andb #$0f00FFF1EB 0FA000913 orb mon_numwka+300FFF1EE 0F7000913 stb mon_numwka+300FFF1F1 030001 inx00FFF1F3 08C00000C cmpx #1200FFF1F6 025FE1 blo gthxn2gthxn1:00FFF1F8 01F010 tfr x,d00FFF1FA 035090 puls x,pcGetBinNumber:00FFF1FC 04F05F clrd00FFF1FE 0FD000910 std mon_numwka00FFF201 0FD000912 std mon_numwka+200FFF204 034010 pshs x00FFF206 08E000000 ldx #0gtbin2:00FFF209 08DF23 bsr MonGetch00FFF20B 08D099 bsr AsciiToBinDigit00FFF20D 05D tstb00FFF20E 02B00F bmi gtbin100FFF210 08DFAD bsr shl_numwka00FFF212 0FA000913 orb mon_numwka+300FFF215 0F7000913 stb mon_numwka+300FFF218 030001 inx00FFF21A 08C000030 cpx #4800FFF21D 025FEA blo gtbin2gtbin1:00FFF21F 01F010 tfr x,d00FFF221 035090 puls x,pcGetDecNumber:00FFF223 04F05F clrd00FFF225 0FD000910 std mon_numwka00FFF228 0FD000912 std mon_numwka+200FFF22B 034010 pshs x00FFF22D 08E000000 ldx #0gtdec2:00FFF230 08DEFC bsr MonGetch00FFF232 08D064 bsr AsciiToDecDigit00FFF234 05D tstb00FFF235 02B027 bmi gtdec100FFF237 08DF1B bsr Times1000FFF239 0FB000913 addb mon_numwka+300FFF23C 0F7000913 stb mon_numwka+300FFF23F 0F6000912 ldb mon_numwka+200FFF242 0C9000 adcb #000FFF244 0F7000912 stb mon_numwka+200FFF247 0F6000911 ldb mon_numwka+100FFF24A 0C9000 adcb #000FFF24C 0F7000911 stb mon_numwka+100FFF24F 0F6000910 ldb mon_numwka+000FFF252 0C9000 adcb #000FFF254 0F7000910 stb mon_numwka+000FFF257 030001 inx00FFF259 08C00000F cpx #1500FFF25C 025FD2 blo gtdec2gtdec1:00FFF25E 01F010 tfr x,d00FFF260 035090 puls x,pcGetNumber:00FFF262 08DECA bsr MonGetch00FFF264 0C102B cmpb #'+'00FFF266 027FBB beq GetDecNumber00FFF268 0C1025 cmpb #'%'00FFF26A 027F90 beq GetBinNumber00FFF26C 0313FF dey00FFF26E 020F5C bra GetHexNumber; phx; push r4; push r5; ldx #0; ld r4,#10; ld r5,#10;gtdcn2:; jsr MonGetch; jsr AsciiToDecNybble; cmp #-1; beq gtdcn1; mul r2,r2,r5; add r2,r1; dec r4; bne gtdcn2;gtdcn1:; txa; pop r5; pop r4; plx; rts;------------------------------------------------------------------------------; Convert ASCII character in the range '0' to '9', 'a' to 'f' or 'A' to 'F'; to a hex nybble.;------------------------------------------------------------------------------;AsciiToHexNybble:00FFF270 0C1030 cmpb #'0'00FFF272 025021 blo gthx300FFF274 0C1039 cmpb #'9'00FFF276 022003 bhi gthx500FFF278 0C0030 subb #'0'00FFF27A 039 rtsgthx5:00FFF27B 0C1041 cmpb #'A'00FFF27D 025016 blo gthx300FFF27F 0C1046 cmpb #'F'00FFF281 022005 bhi gthx600FFF283 0C0041 subb #'A'00FFF285 0CB00A addb #1000FFF287 039 rtsgthx6:00FFF288 0C1061 cmpb #'a'00FFF28A 025009 blo gthx300FFF28C 0C107A cmpb #'z'00FFF28E 022005 bhi gthx300FFF290 0C0061 subb #'a'00FFF292 0CB00A addb #1000FFF294 039 rtsgthx3:00FFF295 0C6FFF ldb #-1 ; not a hex number00FFF297 039 rtsAsciiToDecDigit:00FFF298 0C1030 cmpb #'0'00FFF29A 025007 blo gtdc300FFF29C 0C1039 cmpb #'9'00FFF29E 022003 bhi gtdc300FFF2A0 0C0030 subb #'0'00FFF2A2 039 rtsgtdc3:00FFF2A3 0C6FFF ldb #-100FFF2A5 039 rtsAsciiToBinDigit:00FFF2A6 0C1030 cmpb #'0'00FFF2A8 026002 bne abd100FFF2AA 05F clrb00FFF2AB 039 rtsabd1:00FFF2AC 0C1031 cmpb #'1'00FFF2AE 026003 bne abd200FFF2B0 0C6001 ldb #100FFF2B2 039 rtsabd2:00FFF2B3 0C6FFF ldb #-100FFF2B5 039 rtsDisplayErr:00FFF2B6 0CCFFF2C7 ldd #msgErr00FFF2B9 017FFF11E lbsr DisplayString*** warning 1: Long branch within short branch range could be optimized00FFF2BC 07EFFF039 jmp MonitorDisplayStringDX00FFF2BF 0DD024 std Strptr00FFF2C1 09F026 stx Strptr+200FFF2C3 0BDFFE3DA jsr DisplayString00FFF2C6 039 rtsmsgErr:00FFF2C7 02A02A04507207200D00A fcb "**Err",CR,LF,000FFF2CE 000HelpMsg:00FFF2CF 03F02003D020044069073 fcb "? = Display help",CR,LF00FFF2D6 07006C06107902006806500FFF2DD 06C07000D00A00FFF2E1 04304C05302003D020063 fcb "CLS = clear screen",CR,LF00FFF2E8 06C06506107202007306300FFF2EF 07206506506E00D00A00FFF2F5 06207302003D020073065 fcb "bs = set breakpoint",CR,LF00FFF2FC 07402006207206506106B00FFF303 07006F06906E07400D00A00FFF30A 06206302003D02006306C fcb "bc = clear breakpoint",CR,LF00FFF311 06506107202006207206500FFF318 06106B07006F06906E07400FFF31F 00D00A; db "S = Boot from SD Card",CR,LF00FFF321 03A02003D020045064069 fcb ": = Edit memory bytes",CR,LF00FFF328 07402006D06506D06F07200FFF32F 07902006207907406507300FFF336 00D00A; db "L = Load sector",CR,LF; db "W = Write sector",CR,LF00FFF338 04405202003D020044075 fcb "DR = Dump registers",CR,LF00FFF33F 06D07002007206506706900FFF346 07307406507207300D00A00FFF34D 04402003D02004407506D fcb "D = Dump memory",CR,LF00FFF354 07002006D06506D06F07200FFF35B 07900D00A00FFF35E 04602003D02004606906C fcb "F = Fill memory",CR,LF00FFF365 06C02006D06506D06F07200FFF36C 07900D00A00FFF36F 04604C02003D020044075 fcb "FL = Dump I/O Focus List",CR,LF00FFF376 06D07002004902F04F02000FFF37D 04606F06307507302004C00FFF384 06907307400D00A; fcb "FIG = start FIG Forth",CR,LF; db "KILL n = kill task #n",CR,LF; db "B = start tiny basic",CR,LF; db "b = start EhBasic 6502",CR,LF00FFF389 04A02003D02004A07506D fcb "J = Jump to code",CR,LF00FFF390 07002007406F02006306F00FFF397 06406500D00A00FFF39B 04A04403402003D02004A fcb "JD4 = Jump to $FFD400",CR,LF00FFF3A2 07506D07002007406F02000FFF3A9 02404604604403403003000FFF3B0 00D00A00FFF3B2 05204104D054045053054 fcb "RAMTEST = test RAM",CR,LF00FFF3B9 02003D02007406507307400FFF3C0 02005204104D00D00A; db "R[n] = Set register value",CR,LF; db "r = random lines - test bitmap",CR,LF; db "e = ethernet test",CR,LF00FFF3C6 07302003D020073065072 fcb "s = serial output test",CR,LF00FFF3CD 06906106C02006F07507400FFF3D4 07007507402007406507300FFF3DB 07400D00A00FFF3DE 05303103902003D020072 fcb "S19 = run S19 loader",CR,LF00FFF3E5 07506E02005303103902000FFF3EC 06C06F06106406507200D00FFF3F3 00A00FFF3F4 05305002003D020073070 fcb "SP = sprite demo",CR,LF00FFF3FB 07206907406502006406500FFF402 06D06F00D00A; db "T = Dump task list",CR,LF; db "TO = Dump timeout list",CR,LF00FFF406 05404902003D020064069 fcb "TI = display date/time",CR,LF00FFF40D 07307006C06107902006400FFF414 06107406502F07406906D00FFF41B 06500D00A; db "TEMP = display temperature",CR,LF00FFF41E 05502003D02007506E061 fcb "U = unassemble",CR,LF00FFF425 07307306506D06206C06500FFF42C 00D00A; db "P = Piano",CR,LF00FFF42E 07802003D020065078069 fcb "x = exit monitor",CR,LF00FFF435 07402006D06F06E06907400FFF43C 06F07200D00A00FFF440 000 fcb 0msgRegHeadings00FFF441 00D00A02002004402F041 fcb CR,LF," D/AB X Y U S PC DP CCR",CR,LF,000FFF448 04202002002002002005800FFF44F 02002002002002002005900FFF456 02002002002002002005500FFF45D 02002002002002002005300FFF464 02002002002002002002000FFF46B 05004302002002002004400FFF472 05002002004304305200D00FFF479 00A000nHEX4:00FFF47B 0BDFFD2D2 jsr HEX400FFF47E 039 rtsnXBLANK:00FFF47F 0C6020 ldb #' '00FFF481 016FFFA5D lbra OUTCH*** warning 1: Long branch within short branch range could be optimized;------------------------------------------------------------------------------; Dump Memory;; Usage:; $D FFFC12 FFFC20;; Dump formatted to look like:; :FFFC12 012 012 012 012 555 666 777 888;;------------------------------------------------------------------------------DumpMemory:00FFF484 08DD1D bsr GetRange00FFF486 18E000000 ldy #000FFF489 1BE000922 ldy mon_r1+2dmpm2:00FFF48C 017FFDC43 lbsr CRLF*** warning 1: Long branch within short branch range could be optimized00FFF48F 0C603A ldb #':'00FFF491 017FFFA4D lbsr OUTCH*** warning 1: Long branch within short branch range could be optimized00FFF494 01F020 tfr y,d;addd mon_r1+2 ; output the address00FFF496 017FFEF95 lbsr DispWordAsHex*** warning 1: Long branch within short branch range could be optimized00FFF499 0C6020 ldb #' '00FFF49B 017FFFA43 lbsr OUTCH*** warning 1: Long branch within short branch range could be optimized00FFF49E 08E000008 ldx #8 ; number of bytes to displaydmpm1:; ldb far [mon_r1+1],y;ldb [mon_r1+2],y00FFF4A1 0E6A04 ldb ,y00FFF4A3 031201 iny00FFF4A5 017FFEF8F lbsr DispByteAsHex ; display byte*** warning 1: Long branch within short branch range could be optimized00FFF4A8 0C6020 ldb #' ' ; followed by a space00FFF4AA 017FFFA34 lbsr OUTCH*** warning 1: Long branch within short branch range could be optimized00FFF4AD 05F clrb00FFF4AE 04F clra00FFF4AF 017FFF9F7 lbsr INCH*** warning 1: Long branch within short branch range could be optimized00FFF4B2 0C1003 cmpb #CTRLC00FFF4B4 027024 beq dmpm300FFF4B6 0301FF dex00FFF4B8 026FE7 bne dmpm1; Now output ascii00FFF4BA 0C6020 ldb #' '00FFF4BC 017FFFA22 lbsr OUTCH*** warning 1: Long branch within short branch range could be optimized00FFF4BF 08E000008 ldx #8 ; 8 chars to output00FFF4C2 0313F8 leay -8,y ; backup pointerdmpm5:; ldb far [mon_r1+1],y ; get the char; ldb [mon_r1+2],y ; get the char00FFF4C4 0E6A04 ldb ,y00FFF4C6 0C1020 cmpb #$20 ; is it a control char?00FFF4C8 024002 bhs dmpm400FFF4CA 0C602E ldb #'.'dmpm4:00FFF4CC 017FFFA12 lbsr OUTCH*** warning 1: Long branch within short branch range could be optimized00FFF4CF 031201 iny00FFF4D1 0301FF dex00FFF4D3 026FEF bne dmpm500FFF4D5 1BC000926 cmpy mon_r2+200FFF4D8 025FB2 blo dmpm2dmpm3:00FFF4DA 017FFDBF5 lbsr CRLF*** warning 1: Long branch within short branch range could be optimized00FFF4DD 016FFFB59 lbra Monitor*** warning 1: Long branch within short branch range could be optimized;------------------------------------------------------------------------------; Edit Memory;; Usage:; $$:FFFC12 8 "Hello World!" 0;; Dump formatted to look like:; :FFFC12 012 012 012 012 555 666 777 888;;------------------------------------------------------------------------------EditMemory:00FFF4E0 0CE000008 ldu #8 ; set max byte count00FFF4E3 017FFFCE6 lbsr GetHexNumber ; get the start address*** warning 1: Long branch within short branch range could be optimized00FFF4E6 0BE000912 ldx mon_numwka+2EditMem2:00FFF4E9 017FFFC5F lbsr ignBlanks ; skip over blanks*** warning 1: Long branch within short branch range could be optimized00FFF4EC 017FFFCDD lbsr GetHexNumber ; get the byte value*** warning 1: Long branch within short branch range could be optimized00FFF4EF 05D tstb ; check for valid value00FFF4F0 02700C beq EditMem1 ; if invalid, quit00FFF4F2 0F6000913 ldb mon_numwka+3 ; get value00FFF4F5 0E7800 stb ,x+ ; update memory at address00FFF4F7 0335FF leau -1,u ; decremeent byte count00FFF4F9 283000000 cmpu #000FFF4FC 026FEB bne EditMem2 ; go back for annother byteEditMem1:00FFF4FE 017FFFC2D lbsr MonGetch ; see if a string is being entered*** warning 1: Long branch within short branch range could be optimized00FFF501 0C1022 cmpb #'"'00FFF503 026018 bne EditMem3 ; no string, we're done00FFF505 0CE000028 ldu #40 ; string must be less than 40 charsEditMem4:00FFF508 017FFFC23 lbsr MonGetch ; look for close quote*** warning 1: Long branch within short branch range could be optimized00FFF50B 0C1022 cmpb #'"'00FFF50D 026005 bne EditMem6 ; end of string?00FFF50F 0CE000008 ldu #8 ; reset the byte count00FFF512 020FD5 bra EditMem2EditMem6:00FFF514 0E7800 stb ,x+ ; store the character in memory00FFF516 0335FF leau -1,u ; decrement byte count00FFF518 283000000 cmpu #000FFF51B 022FEB bhi EditMem4 ; max 40 charsEditMem3:00FFF51D 016FFFB19 lbra Monitor*** warning 1: Long branch within short branch range could be optimized;------------------------------------------------------------------------------; Fill Memory;; Usage:; $$F FFFC12 FFFC30 89F;;------------------------------------------------------------------------------FillMemory:00FFF520 017FFFC80 lbsr GetRange ; get address range to fill*** warning 1: Long branch within short branch range could be optimized00FFF523 017FFFC25 lbsr ignBlanks*** warning 1: Long branch within short branch range could be optimized00FFF526 017FFFCA3 lbsr GetHexNumber ; get target byte to write*** warning 1: Long branch within short branch range could be optimized00FFF529 0F6000913 ldb mon_numwka+300FFF52C 0BE000922 ldx mon_r1+200FFF52F 04F clrafillm1: ; Check for a CTRL-C every page of memory00FFF530 04D tsta00FFF531 02600D bne fillm200FFF533 05F clrb ; we want a non-blocking check00FFF534 04F clra00FFF535 017FFF971 lbsr INCH*** warning 1: Long branch within short branch range could be optimized00FFF538 0C1003 cmpb #CTRLC00FFF53A 127FFFAFC lbeq Monitor*** warning 1: Long branch within short branch range could be optimized00FFF53D 0F6000913 ldb mon_numwka+3 ; reset target bytefillm2:00FFF540 0E7800 stb ,x+00FFF542 0BC000926 cmpx mon_r2+200FFF545 023FE9 bls fillm1fillm3:00FFF547 016FFFAEF lbra Monitor*** warning 1: Long branch within short branch range could be optimized;------------------------------------------------------------------------------; Dump Registers;; Usage:; $DR;------------------------------------------------------------------------------DumpRegs:00FFF54A 0CCFFF441 ldd #msgRegHeadings00FFF54D 017FFEE8A lbsr DisplayString*** warning 1: Long branch within short branch range could be optimized00FFF550 08DF2D bsr nXBLANK00FFF552 0FC000900 ldd mon_DSAVE00FFF555 08DF24 bsr nHEX400FFF557 08DF26 bsr nXBLANK00FFF559 0FC000902 ldd mon_XSAVE00FFF55C 08DF1D bsr nHEX400FFF55E 08DF1F bsr nXBLANK00FFF560 0FC000904 ldd mon_YSAVE00FFF563 08DF16 bsr nHEX400FFF565 08DF18 bsr nXBLANK00FFF567 0FC000906 ldd mon_USAVE00FFF56A 08DF0F bsr nHEX400FFF56C 08DF11 bsr nXBLANK00FFF56E 0FC000908 ldd mon_SSAVE00FFF571 08DF08 bsr nHEX400FFF573 08DF0A bsr nXBLANK00FFF575 0F600090B ldb mon_PCSAVE+100FFF578 017FFEEBC lbsr DispByteAsHex*** warning 1: Long branch within short branch range could be optimized00FFF57B 0FC00090C ldd mon_PCSAVE+200FFF57E 08DEFB bsr nHEX400FFF580 08DEFD bsr nXBLANK00FFF582 0FC00090E ldd mon_DPRSAVE00FFF585 0BDFFD2CE jsr HEX200FFF588 08DEF5 bsr nXBLANK00FFF58A 0B600090F lda mon_CCRSAVE00FFF58D 017FFDD3E lbsr HEX2*** warning 1: Long branch within short branch range could be optimized00FFF590 08DEED bsr nXBLANK00FFF592 016FFFAA4 lbra Monitor*** warning 1: Long branch within short branch range could be optimized;------------------------------------------------------------------------------; Jump to code;; Registers are loaded with values from the monitor register save area before; the code is jumped to.;; J <address>;------------------------------------------------------------------------------jump_to_code:00FFF595 08DCCB bsr GetNumber00FFF597 01A010 sei00FFF599 1FE000908 lds mon_SSAVE00FFF59C 0CCFFF5D0 ldd #jtc_exit ; setup stack for RTS back to monitor00FFF59F 034006 pshs d00FFF5A1 0C6000 ldb #000FFF5A3 034004 pshs b00FFF5A5 0FC000912 ldd mon_numwka+2 ; get the address parameter00FFF5A8 034006 pshs d00FFF5AA 0F6000911 ldb mon_numwka+100FFF5AD 034004 pshs b00FFF5AF 0FC000906 ldd mon_USAVE00FFF5B2 034006 pshs d00FFF5B4 0FC000904 ldd mon_YSAVE00FFF5B7 034006 pshs d00FFF5B9 0FC000902 ldd mon_XSAVE00FFF5BC 034006 pshs d00FFF5BE 0B600090E lda mon_DPRSAVE00FFF5C1 034002 pshs a00FFF5C3 0FC000900 ldd mon_DSAVE00FFF5C6 034006 pshs d00FFF5C8 0B600090F lda mon_CCRSAVE00FFF5CB 034002 pshs a00FFF5CD 0150350FF puls far ccr,d,dpr,x,y,u,pcjtc_exit:00FFF5D0 1FF000908 sts >mon_SSAVE ; need to use extended addressing, no direct page setting00FFF5D3 03280F006FFF leas $6FFF ; reset stack to system area, dont modify flags register!00FFF5D7 034001 pshs ccr ; now the stack can be used00FFF5D9 034002 pshs a ; save acca register so we can use it00FFF5DB 01F0B8 tfr dpr,a ; a = outgoing dpr value00FFF5DD 0B700090E sta >mon_DPRSAVE ; force extended addressing mode usage here dpr is not set00FFF5E0 04F clra ; dpg register must be set to zero before values are00FFF5E1 01F08B tfr a,dpr ; saved in the monitor register save area.00FFF5E3 035002 puls a ; get back acca00FFF5E5 0FD000900 std mon_DSAVE ; save regsters, can use direct addressing now00FFF5E8 0BF000902 stx mon_XSAVE00FFF5EB 1BF000904 sty mon_YSAVE00FFF5EE 0FF000906 stu mon_USAVE00FFF5F1 035002 puls a ; get back ccr00FFF5F3 0B700090F sta mon_CCRSAVE ; and save it too; Reset vectors in case they got toasted.00FFF5F6 0CCFFEC64 ldd #SerialPeekCharDirect00FFF5F9 0FD000804 std CharInVec00FFF5FC 0CCFFE319 ldd #DisplayChar00FFF5FF 0FD000800 std CharOutVec00FFF602 0FCFFF2B6 ldd DisplayErr00FFF605 0FD00080C std MonErrVec; todo set according to coreid00FFF608 016FFFF3F lbra DumpRegs ; now go do a register dump*** warning 1: Long branch within short branch range could be optimized;------------------------------------------------------------------------------;------------------------------------------------------------------------------DumpIOFocusList:00FFF60B 08E000000 ldx #0dfl2:00FFF60E 0E680A000FFC000 ldb IOFocusList,x00FFF613 0C1018 cmpb #2400FFF615 02600A bne dfl100FFF617 01F010 tfr x,d00FFF619 017FFEE1B lbsr DispByteAsHex*** warning 1: Long branch within short branch range could be optimized00FFF61C 0C6020 ldb #' '00FFF61E 017FFF8C0 lbsr OUTCH*** warning 1: Long branch within short branch range could be optimizeddfl1:00FFF621 030001 inx00FFF623 08C000010 cmpx #1600FFF626 025FE6 blo dfl200FFF628 017FFDAA7 lbsr CRLF*** warning 1: Long branch within short branch range could be optimized00FFF62B 016FFFA0B lbra Monitor*** warning 1: Long branch within short branch range could be optimizedbootpg:00FFF62E 000 fcb $000boot_stack:00FFF62F FFC0FF fcw $FFC0FFnumBreakpoints:00FFF631 008 fcb 8mon_rom_vectab:00FFF632 FFF634 fcw mon_rom_vecsmon_rom_vecs:00FFF634 FFF039 fcw Monitor ; enter monitor program00FFF636 FFEEA9 fcw INCH ; input a character00FFF638 FFEEE1 fcw OUTCH ; output a character00FFF63A FFD0D2 fcw CRLF ; output carriage-return, line feed00FFF63C FFE3DA fcw DisplayString00FFF63E FFE437 fcw DispByteAsHex00FFF640 FFE42E fcw DispWordAsHex00FFF642 FFEEEB fcw ShowSprites00FFF644 FFEF6F fcw mon_srand00FFF646 FFEF9D fcw mon_rand00FFF648 000000 fcw 0 ; operating system call00FFF64A FFF1A3 fcw GetRange00FFF64C FFF262 fcw GetNumberNumFuncs EQU (*-mon_rom_vectab)/2; The following table indicates which routines need to return values in the; D and possibly X registers.mon_rettab:00FFF64E 000 fcb 0 ; monitor00FFF64F 800 fcb $800 ; INCH00FFF650 000 fcb 0 ; OUTCH00FFF651 000 fcb 0 ; CRLF00FFF652 000 fcb 0 ; DisplayString00FFF653 000 fcb 0 ; DisplayByte00FFF654 000 fcb 0 ; DisplayWord00FFF655 000 fcb 0 ; show sprites00FFF656 000 fcb 0 ; srand00FFF657 C00 fcb $C00 ; rand00FFF658 C00 fcb $C00 ; OS call00FFF659 000 fcb 0 ; GetRange00FFF65A 800 fcb $800 ; GetNumber;------------------------------------------------------------------------------; SWI routine.;; SWI is used to call ROM monitor routines and process breakpoints.;; swi; fcb <desired function>;------------------------------------------------------------------------------swi_rout:00FFF65B 0E680CFD0 ldb bootpg,pcr ; reset direct page00FFF65E 01F09B tfr b,dpswi_rout1:00FFF660 0EE60B ldu 11,s ; get program counter (low order 2 bytes)00FFF662 0335FF leau -1,u ; backup a byte00FFF664 07D000810 tst BreakpointFlag ; are we in breakpoint mode?00FFF667 02700F beq swiNotBkpt00FFF669 0CE000820 ldu #Breakpoints00FFF66C 0F6000811 ldb NumSetBreakpoints00FFF66F 027007 beq swiNotBkptswi_rout2:00FFF671 2A3A01 cmpu ,y++00FFF673 02704B beq processBreakpoint00FFF675 05A decb00FFF676 026FF9 bne swi_rout2swiNotBkpt:00FFF678 07F000810 clr BreakpointFlag00FFF67B 037006 pulu d ; get function #, increment PC00FFF67D 0C100E cmpb #NumFuncs00FFF67F 122FFFC34 lbhi DisplayErr*** warning 1: Long branch within short branch range could be optimized00FFF682 0EF60B stu 11,s ; save updated PC on stack00FFF684 0C100A cmpb #MF_OSCALL00FFF686 02706D beq swiCallOS00FFF688 058 aslb ; 2 bytes per vector00FFF689 0AE80CFA6 ldx mon_rom_vectab,pcr00FFF68C 03A abx00FFF68D 0AE804 ldx ,x00FFF68F 0BF000928 stx jmpvec00FFF692 054 lsrb00FFF693 08EFFF64E ldx #mon_rettab00FFF696 03A abx00FFF697 0E6804 ldb ,x00FFF699 0F7000930 stb mon_retflag00FFF69C 1FF000908 sts mon_SSAVE ; save the stack pointer00FFF69F 0EC601 ldd 1,s ; get back D00FFF6A1 0AE604 ldx 4,s ; get back X00FFF6A3 1AE606 ldy 6,s ; get back Y00FFF6A5 0EE608 ldu 8,s ; get back U00FFF6A7 1EE80CF85 lds boot_stack,pcr ; and use our own stack00FFF6AA 0AD90F000928 jsr [jmpvec] ; call the routineswi_rout3:00FFF6AE 1FE000908 lds mon_SSAVE ; restore stack00FFF6B1 07D000930 tst mon_retflag00FFF6B4 02A009 bpl swi_rout400FFF6B6 0ED601 std 1,s ; return value in D00FFF6B8 078000930 asl mon_retflag00FFF6BB 02A002 bpl swi_rout400FFF6BD 0AF604 stx 4,s ; return value in Xswi_rout4:00FFF6BF 03B rtiprocessBreakpoint:00FFF6C0 0A6E04 lda ,s00FFF6C2 0B700090F sta mon_CCRSAVE00FFF6C5 0EC601 ldd 1,s00FFF6C7 0FD000900 std mon_DSAVE00FFF6CA 0E6603 ldb 3,s00FFF6CC 0F700090E stb mon_DPRSAVE00FFF6CF 0EC604 ldd 4,s00FFF6D1 0FD000902 std mon_XSAVE00FFF6D4 0EC606 ldd 6,s00FFF6D6 0FD000904 std mon_YSAVE00FFF6D9 0EC608 ldd 8,s00FFF6DB 0FD000906 std mon_USAVE00FFF6DE 1FF000908 sts mon_SSAVE00FFF6E1 0EC60B ldd 11,s00FFF6E3 0FD00090A std mon_PCSAVE00FFF6E6 1EE80CF46 lds boot_stack,pcr00FFF6E9 0CCFFF6AE ldd #swi_rout3 ; setup so monitor can return00FFF6EC 034006 pshs d00FFF6EE 08D01F bsr DisarmAllBreakpoints00FFF6F0 016FFFE57 lbra DumpRegs*** warning 1: Long branch within short branch range could be optimizedxitMonitor:00FFF6F3 020039 bra ArmAllBreakpointsswiCallOS:00FFF6F5 033401 leau 1,u ; next byte is func number00FFF6F7 0E6C00 ldb ,u+00FFF6F9 0C1019 cmpb #NumOSFuncs ; check for valid range00FFF6FB 122FFFBB8 lbhi DisplayErr*** warning 1: Long branch within short branch range could be optimized00FFF6FE 0EF60B stu 11,s ; save updateed PC on stack00FFF700 058 aslb ; compute vector address00FFF701 08EFFEEF6 ldx #OSCallTbl00FFF704 06DE0F tst b,x ; check for non-zero vector00FFF706 027FA6 beq swi_rout3osc1:; tst OSSEMA+1 ; wait for availability; beq osc100FFF708 0ADF0F jsr [b,x] ; call the OS routineoscx:00FFF70A 07FEF0011 clr OSSEMA+100FFF70D 020F9F bra swi_rout3DisarmAllBreakpoints:00FFF70F 034036 pshs d,x,y00FFF711 18E000000 ldy #000FFF714 05F clrb00FFF715 08E000830 ldx #BreakpointBytes ; x = breakpoint byte table addressdisarm2:00FFF718 0C1631 cmpb #numBreakpoints ; safety check00FFF71A 024010 bhs disarm100FFF71C 0F1000811 cmpb NumSetBreakpoints00FFF71F 02400B bhs disarm100FFF721 0A6837 lda b,x ; get memory byte00FFF723 0A7B09000820 sta [Breakpoints,y] ; and store it back to memory00FFF727 031202 leay 2,y ; increment for next address00FFF729 05C incb ; increment to next byte00FFF72A 020FEC bra disarm2 ; loop backdisarm1:00FFF72C 0350B6 puls d,x,y,pcArmAllBreakpoints:00FFF72E 034036 pshs d,x,y00FFF730 18E000000 ldy #000FFF733 05F clrb00FFF734 08E000830 ldx #BreakpointBytes ; x = breakpoint byte table addressarm2:00FFF737 0F1FFF631 cmpb numBreakpoints ; safety check00FFF73A 024010 bhs arm100FFF73C 0F1000811 cmpb NumSetBreakpoints00FFF73F 02400B bhs arm100FFF741 0A6B09000820 lda [Breakpoints,y] ; load byte at memory address00FFF745 0A7B0D sta b,x ; save in table00FFF747 031202 leay 2,y ; increment for next address00FFF749 05C incb ; increment to next byte00FFF74A 020FEB bra arm2 ; loop backarm1:00FFF74C 0350B6 puls d,x,y,pcArmBreakpoint:00FFF74E 034036 pshs d,x,y00FFF750 0B6000811 lda NumSetBreakpoints ; check if too many breakpoints set00FFF753 0B1FFF631 cmpa numBreakpoints00FFF756 124FFFB5D lbhs DisplayErr*** warning 1: Long branch within short branch range could be optimized00FFF759 017FFFA70 lbsr GetHexNumber ; get address parameter*** warning 1: Long branch within short branch range could be optimized00FFF75C 0F6000811 ldb NumSetBreakpoints ; bv= number of set breakpoints00FFF75F 1BE000912 ldy mon_numwka+2 ; get address00FFF762 0A6A04 lda ,y ; get byte at address00FFF764 08E000830 ldx #BreakpointBytes ; and store byte in a table00FFF767 0A7A05 sta b,x ; record00FFF769 08603F lda #OPC_SWI ; put a SWI instruction in place00FFF76B 0A7A04 sta ,y00FFF76D 08E000820 ldx #Breakpoints ; also store the address in a table00FFF770 058 aslb ; index for 2 byte values00FFF771 1AFA05 sty b,x00FFF773 054 lsrb ; size back to single byte00FFF774 05C incb00FFF775 0F7000811 stb NumSetBreakpoints00FFF778 0350B6 puls d,x,y,pcDisarmBreakpoint:00FFF77A 034076 pshs d,x,y,u00FFF77C 017FFFA4D lbsr GetHexNumber*** warning 1: Long branch within short branch range could be optimized00FFF77F 05F clrb00FFF780 05F clrb00FFF781 01F001 tfr d,x ; x = zero toodisarm6:00FFF783 0F1FFF631 cmpb numBreakpoints ; no more than this many may be set00FFF786 024041 bhs disarm400FFF788 0F1000811 cmpb NumSetBreakpoints ; number actually set00FFF78B 02403C bhs disarm400FFF78D 1AE809000820 ldy Breakpoints,x ; y = breakpoint address00FFF791 1BC000912 cmpy mon_numwka+2 ; is it the one we want?00FFF794 02602E bne disarm3 ; if not, go increment to next00FFF796 0BE000912 ldx mon_numwka+2 ; x = memory address00FFF799 18E000830 ldy #BreakpointBytes00FFF79C 0A6A0D lda b,y ; get saved byte from table00FFF79E 0A7804 sta ,x ; set the byte at the memory address; compress breakpoint table by removing breakpoint00FFF7A0 07A000811 dec NumSetBreakpoints ; set the new number of set breakpoints00FFF7A3 034004 pshs b ; save the position we're removing fromdisarm7:00FFF7A5 05C incb ; set index for next byte00FFF7A6 0A6A05 lda b,y ; get byte00FFF7A8 05A decb ; and store it back00FFF7A9 0A7A05 sta b,y00FFF7AB 05C incb ; move to next position00FFF7AC 0F1FFF631 cmpb numBreakpoints ; hit end of table?00FFF7AF 025FF4 blo disarm700FFF7B1 035004 puls b ; get back position00FFF7B3 058 aslb ; times two for word index00FFF7B4 04F clra00FFF7B5 01F002 tfr d,y00FFF7B7 054 lsrb ; back to byte index valuedisarm8:00FFF7B8 0EE202 ldu 2,y ; get next breakpoint address00FFF7BA 0EFA01 stu ,y++ ; store in current pos, increment00FFF7BC 05C incb ; increment count00FFF7BD 0F1FFF631 cmpb numBreakpoints ; hit end of table?00FFF7C0 025FF6 blo disarm800FFF7C2 0350F6 puls d,x,y,u,pcdisarm3:00FFF7C4 030002 leax 2,x00FFF7C6 05C incb00FFF7C7 020FBA bra disarm6disarm4:00FFF7C9 0350F6 puls d,x,y,u,pc;------------------------------------------------------------------------------;------------------------------------------------------------------------------swi3_rout:00FFF7CB 01A010 sei00FFF7CD 0A6E04 lda ,s00FFF7CF 0B700090F sta mon_CCRSAVE00FFF7D2 0EC601 ldd 1,s00FFF7D4 0FD000900 std mon_DSAVE00FFF7D7 0E6603 ldb 3,s00FFF7D9 0F700090E stb mon_DPRSAVE00FFF7DC 0EC604 ldd 4,s00FFF7DE 0FD000902 std mon_XSAVE00FFF7E1 0EC606 ldd 6,s00FFF7E3 0FD000904 std mon_YSAVE00FFF7E6 0EC608 ldd 8,s00FFF7E8 0FD000906 std mon_USAVE00FFF7EB 1FF000908 sts mon_SSAVE00FFF7EE 0EC60B ldd 11,s00FFF7F0 0FD00090A std mon_PCSAVE00FFF7F3 1FF000908 sts mon_SSAVE00FFF7F6 1CE003FFF lds #$3FFF00FFF7F9 0CCFFF803 ldd #swi3_exit00FFF7FC 034006 pshs d00FFF7FE 01C0EF cli00FFF800 07EFFF54A jmp DumpRegsswi3_exit:00FFF803 1FE000908 lds mon_SSAVE00FFF806 03B rti;------------------------------------------------------------------------------;------------------------------------------------------------------------------firq_rout:00FFF807 03B rtiirq_rout:; lbsr SerialIRQ ; check for recieved character00FFF808 017FFEC85 lbsr TimerIRQ*** warning 1: Long branch within short branch range could be optimized; Reset the edge sense circuit in the PIC; lda #31 ; Timer is IRQ #31; sta IrqSource ; stuff a byte indicating the IRQ source for PEEK(); sta PIC+16 ; register 16 is edge sense reset reg; lda VIA+VIA_IFR; bpl notTimerIRQ2; bita #$800; beq notTimerIRQ2; clr VIA+VIA_T3LL; clr VIA+VIA_T3LH; inc $E00037 ; update timer IRQ screen flag;notTimerIRQ2:00FFF80B 0B6FFC014 lda IrqBase ; get the IRQ flag byte00FFF80E 044 lsra00FFF80F 0BAFFC014 ora IrqBase00FFF812 084FE0 anda #$FE000FFF814 0B7FFC014 sta IrqBase; inc TEXTSCR+54 ; update IRQ live indicator on screen; flash the cursor; only bother to flash the cursor for the task with the IO focus.; lda COREID; cmpa IOFocusID; bne tr1a; lda CursorFlash ; test if we want a flashing cursor; beq tr1a; lbsr CalcScreenLoc ; compute cursor location in memory; tfr d,y; lda $2000,y ; get color code $2000 higher in memory; ldb IRQFlag ; get counter; lsrb; lsra; lsra; lsra; lsra; lsrb; rola; lsrb; rola; lsrb; rola; lsrb; rola; sta $E00000,y ; store the color code back to memorytr1a:00FFF817 03B rti;------------------------------------------------------------------------------;------------------------------------------------------------------------------nmi_rout:00FFF818 0150F6FFFFFFFE0 ldb COREID00FFF81D 086049 lda #'I'00FFF81F 08EE00028 ldx #TEXTSCR+4000FFF822 0A7807 sta b,xrti_insn:00FFF824 03B rti; Special Register Areaorg $FFFFE0; Interrupt vector tableorg $FFFFF000FFFFF0 FFF824 fcw rti_insn ; reserved00FFFFF2 FFF7CB fcw swi3_rout ; SWI300FFFFF4 FFF824 fcw rti_insn ; SWI200FFFFF6 FFF807 fcw firq_rout ; FIRQ00FFFFF8 FFF808 fcw irq_rout ; IRQ00FFFFFA FFF65B fcw swi_rout ; SWI00FFFFFC FFF818 fcw nmi_rout ; NMI00FFFFFE FFE023 fcw start ; RST66 warning(s) in pass 2.SYMBOL TABLEABD1 02 00FFF2AC ABD2 02 00FFF2B3 ACIA 00 FFE30100 ACIA_CMD 00 00000002ACIA_CTRL 00 00000003 ACIA_CTRL2 00 0000000B ACIA_RX 00 00000000 ACIA_STAT 00 00000001ACIA_TX 00 00000000 ARM1 02 00FFF74C ARM2 02 00FFF737 ARMALLBREAKPOINTS 02 00FFF72EARMBREAKPOINT 02 00FFF74E ASCIITOBINDIGIT 02 00FFF2A6 ASCIITODECDIGIT 02 00FFF298 ASCIITOHEXNYBBLE 02 00FFF270ASMBUF 00 00000160 BIOS_SCREENS 00 17000000 BLANKLINE 02 00FFE280 BLKCPYDST 00 00000020BLKCPYSRC 00 0000001C BLNKLN1 02 00FFE293 BOOTPG 02 00FFF62E BOOT_STACK 02 00FFF62FBREAKPOINTBYTES 00 00000830 BREAKPOINTFLAG 00 00000810 BREAKPOINTS 00 00000820 CALCSCREENLOC 02 00FFE2F2CHARCOLOR 00 00000112 CHARINVEC 00 00000804 CHAROUTVEC 00 00000800 CHECKPOINT 02 00FFE13DCLEARSCREEN 02 00FFE239 CLEARSCREENJMP 02 00FFD300 CMDPROMPT 02 00FFF009 CMDPROMPTJI 00 00000808CMDTABLE1 02 00FFEFB2 CMDTABLE2 02 00FFEFE3 COLORCODELOCATION 00 00000014 COLS 00 00000040COPYSCREENTOVIRTUALSCREEN 02 00FFE209 COPYVIRTUALSCREENTOSCREEN 02 00FFE1D2 COREID 00 FFFFFFE0 CR 00 0000000DCRLF 02 00FFD0D2 CRLF1 02 00FFD0D2 CRLFST 02 00FFE422 CS1 02 00FFE246CS2 02 00FFE25D CS2V1 02 00FFE215 CS3 02 00FFE263 CSL1 02 00FFE311CTRLC 00 00000003 CTRLH 00 00000008 CTRLI 00 00000009 CTRLJ 00 0000000ACTRLK 00 0000000B CTRLM 00 0000000D CTRLS 00 00000013 CTRLT 00 00000014CTRLX 00 00000018 CTRLZ 00 0000001A CURSORCOL 00 00000111 CURSORFLASH 00 00000114CURSORROW 00 00000110 CV2S1 02 00FFE1E7 DBGCHECKFORKEY 02 00FFEA90 DBGK1 02 00FFEACBDBGK10 02 00FFEB30 DBGK11 02 00FFEB89 DBGK12 02 00FFEB8F DBGK13 02 00FFEB9BDBGK14 02 00FFEBAB DBGK15 02 00FFEBBA DBGK16 02 00FFEBC5 DBGK17 02 00FFEBCEDBGK18 02 00FFEBD1 DBGK2 02 00FFEA96 DBGK20 02 00FFEAB8 DBGK22 02 00FFEAD4DBGK23 02 00FFEAE5 DBGK24 02 00FFEAC6 DBGK3 02 00FFEAE8 DBGK4 02 00FFEAF4DBGK5 02 00FFEB00 DBGK7 02 00FFEB10 DBGK8 02 00FFEB16 DBGK9 02 00FFEB2ADBGKNOTALT 02 00FFEB93 DBGKNOTCAPSLOCK 02 00FFEB62 DBGKNOTCTRL 02 00FFEB1A DBGKNOTNUMLOCK 02 00FFEB4BDBGKNOTRSHIFT 02 00FFEB34 DBGKNOTSCROLLLOCK 02 00FFEB79 DCCR 02 00FFE329 DCLF 02 00FFE3B3DCX10 02 00FFE363 DCX11 02 00FFE373 DCX12 02 00FFE36F DCX13 02 00FFE37FDCX14 02 00FFE326 DCX3 02 00FFE3A1 DCX4 02 00FFE3B5 DCX5 02 00FFE390DCX6 02 00FFE33A DCX7 02 00FFE336 DCX8 02 00FFE347 DCX9 02 00FFE354DELAY3S 02 00FFE1B5 DFL1 02 00FFF621 DFL2 02 00FFF60E DISARM1 02 00FFF72CDISARM2 02 00FFF718 DISARM3 02 00FFF7C4 DISARM4 02 00FFF7C9 DISARM6 02 00FFF783DISARM7 02 00FFF7A5 DISARM8 02 00FFF7B8 DISARMALLBREAKPOINTS 02 00FFF70F DISARMBREAKPOINT 02 00FFF77ADISPBYTEASHEX 02 00FFE437 DISPDWORDASHEX 02 00FFE425 DISPLAYCHAR 02 00FFE319 DISPLAYERR 02 00FFF2B6DISPLAYSTRING 02 00FFE3DA DISPLAYSTRINGCRLF 02 00FFE3FA DISPLAYSTRINGDX 02 00FFF2BF DISPNYB 02 00FFE44FDISPNYB1 02 00FFE45E DISPWORDASHEX 02 00FFE42E DLY3S1 02 00FFE1B8 DLY3S2 02 00FFE1BCDMPM1 02 00FFF4A1 DMPM2 02 00FFF48C DMPM3 02 00FFF4DA DMPM4 02 00FFF4CCDMPM5 02 00FFF4C4 DRAM_BASE 00 10000000 DSPJ1B 02 00FFE3EC DSPJ2 02 00FFE3E7DSRETB 02 00FFE3F5 DUMPIOFOCUSLIST 02 00FFF60B DUMPMEMORY 02 00FFF484 DUMPREGS 02 00FFF54ADUMRTS 02 00FFE022 EDITMEM1 02 00FFF4FE EDITMEM2 02 00FFF4E9 EDITMEM3 02 00FFF51DEDITMEM4 02 00FFF508 EDITMEM6 02 00FFF514 EDITMEMORY 02 00FFF4E0 ENDOFWORD 02 00FFF0EDFARFLAG 00 0000015F FILLM1 02 00FFF530 FILLM2 02 00FFF540 FILLM3 02 00FFF547FILLMEMORY 02 00FFF520 FIRQ_ROUT 02 00FFF807 FIRST_CORE 00 00000001 FREEMBX 02 00000002FREEMSG 02 00000006 FREETCB 00 0000078A GETBINNUMBER 02 00FFF1FC GETDECNUMBER 02 00FFF223GETHEXNUMBER 02 00FFF1CC GETKEY 02 00FFEA92 GETNUMBER 02 00FFF262 GETRANGE 02 00FFF1A3GETSCREENLOCATION 02 00FFE29A GETTWOPARAMS 02 00FFF182 GRNG1 02 00FFF1BE GSL1 02 00FFE2ACGTBIN1 02 00FFF21F GTBIN2 02 00FFF209 GTDC3 02 00FFF2A3 GTDEC1 02 00FFF25EGTDEC2 02 00FFF230 GTHX3 02 00FFF295 GTHX5 02 00FFF27B GTHX6 02 00FFF288GTHXN1 02 00FFF1F8 GTHXN2 02 00FFF1D9 HC1 02 00FFE2CA HELPMSG 02 00FFF2CFHEX2 02 00FFD2CE HEX4 02 00FFD2D2 HOMECURSOR 02 00FFE2B0 HOMECURSORJMP 02 00FFD308I2CW1 02 00FFE4BF I2CWR1 02 00FFE4EC I2C_CMD 00 00000004 I2C_CTRL 00 00000002I2C_INIT 02 00FFE4B3 I2C_PREH 00 00000001 I2C_PREL 00 00000000 I2C_RXR 00 00000003I2C_STAT 00 00000004 I2C_TXR 00 00000003 I2C_WAIT_RX_NACK 02 00FFE4EA I2C_WAIT_TIP 02 00FFE4BDI2C_WR_CMD 02 00FFE4C7 I2C_XMIT1 02 00FFE4D0 ICC1 02 00FFE3D6 ICC2 02 00FFE3D8ICR1 02 00FFE3C8 IGNBLANKS 02 00FFF14B IGNBLANKS1 02 00FFF14B INCCURSORPOS 02 00FFE3B7INCCURSORROW 02 00FFE3C6 INCH 02 00FFEEA9 INCH1 02 00FFEEBE INCH2 02 00FFEEABINCHE 02 00FFEEC7 INCHEK 02 00FFEECB INCHEK1 02 00FFEEE0 INCHEK2 02 00FFEEDDINCHEK3 02 00FFEED4 INIT 02 00FFE0A8 INIT1 02 00FFE0B0 INIT2 02 00FFE0F8INITSERIAL 02 00FFEBEF IOFOCUSID 00 00FFC010 IOFOCUSLIST 00 00FFC000 IOFOCUSNDX 00 00000100IRQBASE 00 00FFC014 IRQFLAG 00 00FFC012 IRQSOURCE 00 00FFC011 IRQ_ROUT 02 00FFF808JMPVEC 00 00000928 JTC_EXIT 02 00FFF5D0 JUMP_TO_CODE 02 00FFF595 KBDBUFFULL 02 00FFEA8DKBDFIFO 00 00000040 KBDFIFOALIAS 00 00C00040 KBDHEADRCV 00 00000127 KBDI0002 02 00FFE9C9KBDI0004 02 00FFEA0E KBDITRYAGAIN 02 00FFEA02 KBDRCVCOUNT 02 00FFEA3D KBDTAILRCV 00 00000128KBGS1 02 00FFE978 KBGS2 02 00FFE970 KBGS3 02 00FFE961 KEYBD 00 FFE30400KEYBDACK 00 FFFFCC00 KEYBDBAD 00 FFFFCB00 KEYBDBLOCK 00 00000126 KEYBDBUFFER 00 FFFFC000KEYBDCHECKFORKEYDIRECT 02 00FFEEA7 KEYBDCLOSE 02 00FFEBEB KEYBDCLR 00 FFE30402 KEYBDCONTROLCODES 02 00FFE800KEYBDECHO 00 FFFFCA00 KEYBDEXTENDEDCODES 02 00FFE880 KEYBDGETID 02 00FFE99C KEYBDGETSCANCODE 02 00FFE97DKEYBDGETSTATUS 02 00FFE961 KEYBDHEAD 00 FFFFC800 KEYBDID 00 00000124 KEYBDINIT 02 00FFE9C0KEYBDIRQ 02 00FFEA4F KEYBDLOCKS 00 FFFFCD00 KEYBDOPEN 02 00FFEBEA KEYBDREAD 02 00FFEBECKEYBDRECVBYTE 02 00FFE900 KEYBDSEEK 02 00FFEBEE KEYBDSENDBYTE 02 00FFE919 KEYBDSETLED 02 00FFE989KEYBDTAIL 00 FFFFC900 KEYBDWAITTX 02 00FFE91F KEYBDWRITE 02 00FFEBED KEYLED 00 00000122KEYSTATE1 00 00000120 KEYSTATE2 00 00000121 KGID1 02 00FFE9B9 KGNOTKBD 02 00FFE9BCKRB3 02 00FFE905 KRB4 02 00FFE915 KRCXIT 02 00FFEA4E KWT1 02 00FFE924KWT2 02 00FFE935 LEDS 00 FFE60001 LEDXIT 02 00FFEA22 LETTER 02 00FFD2C1LF 00 0000000A MAX_TASKNO 00 0000003F MF_CRLF 00 00000003 MF_DISPLAYBYTEASHEX 00 00000005MF_DISPLAYSTRING 00 00000004 MF_DISPLAYWORDASHEX 00 00000006 MF_GETNUMBER 00 0000000C MF_GETRANGE 00 0000000BMF_INCH 00 00000001 MF_MONITOR 00 00000000 MF_OSCALL 00 0000000A MF_OUTCH 00 00000002MF_RANDOM 00 00000009 MF_SHOWSPRITES 00 00000007 MF_SRAND 00 00000008 MON1 02 00FFF08EMONARMBREAKPOINT 02 00FFF13A MONDISARMBREAKPOINT 02 00FFF145 MONERRVEC 00 0000080C MONGETCH 02 00FFF12EMONGETNONSPACE 02 00FFF133 MONITOR 02 00FFF039 MON_CCRSAVE 00 0000090F MON_DPRSAVE 00 0000090EMON_DSAVE 00 00000900 MON_INIT 00 0000092C MON_NUMWKA 00 00000910 MON_PCSAVE 00 0000090AMON_R1 00 00000920 MON_R2 00 00000924 MON_RAND 02 00FFEF9D MON_RETFLAG 00 00000930MON_RETTAB 02 00FFF64E MON_ROM_VECS 02 00FFF634 MON_ROM_VECTAB 02 00FFF632 MON_SRAND 02 00FFEF6FMON_SRAND1 02 00FFEF72 MON_SSAVE 00 00000908 MON_USAVE 00 00000906 MON_VECTB 00 00000880MON_XSAVE 00 00000902 MON_YSAVE 00 00000904 MSCOUNT 00 FFFFFFE4 MSGBADKEYBD 02 00FFEA2EMSGERR 02 00FFF2C7 MSGF09STARTING 02 00FFF014 MSGREGHEADINGS 02 00FFF441 MSGS19LOADER 02 00FFEE93MSGSERIALTEST 02 00FFED45 MSGSTARTUP 02 00FFE11C MULTI_SIEVE 02 00FFE153 MULTI_SIEVE1 02 00FFE176MULTI_SIEVE2 02 00FFE172 MULTI_SIEVE3 02 00FFE160 MULTI_SIEVE4 02 00FFE189 NHEX4 02 00FFF47BNMAILBOX 02 00000004 NMESERIAL 02 00FFED0E NMIBASE 00 00FFC013 NMI_ROUT 02 00FFF818NMSGBLK 02 00000008 NOTKBDIRQ 02 00FFEA8C NOTRXINT 02 00FFED0D NOTTIMERIRQ 02 00FFE4B2NUMBREAKPOINTS 02 00FFF631 NUMFUNCS 00 0000000E NUMOSFUNCS 00 00000019 NUMSETBREAKPOINTS 00 00000811NXBLANK 02 00FFF47F ONEKEY 02 00FFD1DC OPC_SWI 00 0000003F OSC1 02 00FFF708OSCALLTBL 02 00FFEEF6 OSCX 02 00FFF70A OSSEMA 00 00EF0010 OUTCH 02 00FFEEE1OUTSEMA 00 00EF0000 PARSECMD1 02 00FFF0D8 PCRLF 02 00FFE40E PDATA 02 00FFE41BPIC 00 FFE3F000 PICPTR 00 00000028 PRINT 02 00FFE418 PRNG 00 FFE30600PROCESSBREAKPOINT 02 00FFF6C0 PROMPT1 02 00FFF0BB PROMPT2A 02 00FFF10C PROMPT3 02 00FFF0ACPROMPTCLEARSCREEN 02 00FFF126 PROMPTHELP 02 00FFF11E PROMPTLN 02 00FFF0A8 PSTRNG 02 00FFE40AQNDX0 00 00000780 QNDX1 00 00000782 QNDX2 00 00000784 QNDX3 00 00000786QNDX4 00 00000788 RAMERR 02 00FFD42C RAMERR1 02 00FFD445 RAMTEST 02 00FFD400RAMTEST1 02 00FFD40D RAMTEST3 02 00FFD417 REDIRECT 02 00FFF0F8 RELEASEIOFOCUS 02 00FFEF3FREQUESTIOFOCUS 02 00FFEF28 RIOF1 02 00FFEF66 RIOF2 02 00FFEF55 ROMTORAM 02 00FFE143ROMTORAM1 02 00FFE149 ROWS 00 00000020 RTC 00 FFE30500 RTCBUF 00 00007FC0RTCR0001 02 00FFE51A RTCW0001 02 00FFE565 RTC_READ 02 00FFE4F4 RTC_RXERR 02 00FFE543RTC_WRITE 02 00FFE547 RTI_INSN 02 00FFF824 RUNNINGID 00 00FFC013 RUNNINGTCB 06 00000000S19ABORT 00 0000094A S19ADDRESS 00 00000940 S19CLEARADDRESS 02 00FFEDA6 S19GA1 02 00FFEDC4S19GA2 02 00FFEDE0 S19GB1 02 00FFED81 S19GB2 02 00FFEDA2 S19GETADDRESS2 02 00FFEDB3S19GETADDRESS3 02 00FFEDC5 S19GETBYTE 02 00FFED75 S19L2 02 00FFEE90 S19L3 02 00FFEE3FS19LNR 02 00FFEE83 S19LOADER 02 00FFEE37 S19NEXTRECORD 02 00FFED58 S19NR1 02 00FFED74S19NR2 02 00FFED68 S19NR3 02 00FFED6F S19PM1 02 00FFEE07 S19PM2 02 00FFEDFDS19PM3 02 00FFEDE2 S19PROCESSS1 02 00FFEE0B S19PROCESSS2 02 00FFEE11 S19PROCESSS8 02 00FFEE27S19PROCESSS9 02 00FFEE17 S19PUTMEM 02 00FFEDE1 S19RECLEN 00 00000949 S19RECTYPE 00 00000948S19STARTADDRESS 00 00000944 SCANNEXTWORD 02 00FFF0E2 SCREENCOLOR 00 00000113 SCREENLOCATION 00 00000010SCREENLOCATION2 00 00000018 SCROLLUP 02 00FFE265 SCRUP1 02 00FFE272 SC_ALT 00 00000011SC_C 00 00000021 SC_CAPSLOCK 00 00000058 SC_CTRL 00 00000014 SC_DEL 00 00000071SC_EXTEND 00 000000E0 SC_F12 00 00000007 SC_KEYUP 00 000000F0 SC_NUMLOCK 00 00000077SC_RSHIFT 00 00000059 SC_SCROLLLOCK 00 0000007E SC_T 00 0000002C SC_TAB 00 0000000DSC_Z 00 0000001A SEMAABS 00 00001000 SERHEADRCV 00 00000131 SERHEADXMIT 00 00000136SERHZERO 00 00000130 SERIALGETCHAR 02 00FFEC1D SERIALINIT 02 00FFEBEF SERIALIRQ 02 00FFECBBSERIALOUTPUTTEST 02 00FFED25 SERIALPEEKCHAR 02 00FFEC4D SERIALPEEKCHARDIRECT 02 00FFEC64 SERIALPUTCHAR 02 00FFEC88SERIALPUTSTRING 02 00FFED15 SERIALRCVCOUNT 02 00FFECA8 SERRCVBUF 00 00BFF000 SERRCVXOFF 00 00000140SERRCVXON 00 00000139 SERTAILRCV 00 00000133 SERTAILXMIT 00 00000138 SERTZERO 00 00000132SETKEYBOARDECHO 02 00FFEEE5 SGC2 02 00FFEC36 SGCNOCHARS 02 00FFEC46 SGCXIT 02 00FFEC49SHIFTEDSCANCODES 02 00FFE700 SHIFTLEFT5 02 00FFE1C7 SHL_NUMWKA 02 00FFF1BF SHOWSPRITES 02 00FFEEEBSIEVE 02 00FFE18D SIEVE1 02 00FFE1A5 SIEVE2 02 00FFE1A1 SIEVE3 02 00FFE192SIEVE4 02 00FFE1B4 SINI1 02 00FFEC02 SIRQ0001 02 00FFECCD SIRQNXTBYTE 02 00FFECBBSIRQRXFULL 02 00FFED0D SKIPDOLLAR 02 00FFF0CA SKIP_INIT 02 00FFE10A SOTST1 02 00FFED2FSPC0001 02 00FFEC8A SPCD0001 02 00FFEC82 SPCNOCHARS 02 00FFEC5F SPCXIT 02 00FFEC62SPRITE_CTRL 00 FFE10000 SPRITE_EN 00 000003C0 SPS2 02 00FFED19 SPSXIT 02 00FFED23SRCXIT 02 00FFECBA ST1 02 00FFE0B5 ST10 02 00FFE118 ST11 02 00FFE060ST3 02 00FFE09F ST6 02 00FFE03C ST7 02 00FFE046 ST8 02 00FFE046ST9 02 00FFE069 START 02 00FFE023 STRPTR 00 00000024 SWI3_EXIT 02 00FFF803SWI3_ROUT 02 00FFF7CB SWICALLOS 02 00FFF6F5 SWINOTBKPT 02 00FFF678 SWI_ROUT 02 00FFF65BSWI_ROUT1 02 00FFF660 SWI_ROUT2 02 00FFF671 SWI_ROUT3 02 00FFF6AE SWI_ROUT4 02 00FFF6BFTAB 00 00000009 TCB_CURSORCOL 00 00000021 TCB_CURSORROW 00 00000020 TCB_HJCB 00 0000001CTCB_HWAITMBX 00 00000022 TCB_IOF_NEXT 00 0000002C TCB_IOF_PREV 00 00000030 TCB_MBQ_NEXT 00 00000024TCB_MBQ_PREV 00 00000028 TCB_MMU_MAP 00 00000038 TCB_MSGPTR_D1 00 00000014 TCB_MSGPTR_D2 00 00000018TCB_NXTRDY 00 00000000 TCB_NXTTCB 00 00000008 TCB_PRIORITY 00 00000010 TCB_PRVRDY 00 00000004TCB_SPSAVE 00 00000034 TCB_STATUS 00 0000001E TCB_TIMEOUT 00 0000000C TEXTCLOSE 02 00FFE235TEXTOPEN 02 00FFE234 TEXTREAD 02 00FFE236 TEXTREG 00 FFE07F00 TEXTSCR 00 FFE00000TEXTSEEK 02 00FFE238 TEXTWRITE 02 00FFE237 TEXT_COLS 00 00000000 TEXT_CURPOS 00 00000022TEXT_ROWS 00 00000001 TIMEOUTLIST 00 0000078C TIMERINIT 02 00FFE465 TIMERIRQ 02 00FFE490TIMES10 02 00FFF154 TR1A 02 00FFF817 UCP1 02 00FFE2F0 UNSHIFTEDSCANCODES 02 00FFE600UPDATECURSORPOS 02 00FFE2CC VIA 00 FFE60000 VIA_ACR 00 0000000B VIA_DDRA 00 00000003VIA_IER 00 0000000E VIA_IFR 00 0000000D VIA_PA 00 00000001 VIA_T3CMPH 00 00000015VIA_T3CMPL 00 00000014 VIA_T3LH 00 00000013 VIA_T3LL 00 00000012 W10_0001 02 00FFE940W300_0001 02 00FFE954 WAIT10MS 02 00FFE939 WAIT300MS 02 00FFE94D XBLANK 02 00FFD0AFXITMONITOR 02 00FFF6F3 XOFF 00 00000013 XON 00 00000011575 SYMBOLS3 error(s), 592 warning(s)
Go to most recent revision | Compare with Previous | Blame | View Log
