ca65 V2.18 - Raspbian 2.19-1
Main file   : Shell.asm
Current file: Shell.asm

000000r 1               ; Copyright Terence J. Boldt (c)2021-2022
000000r 1               ; Use of this source code is governed by an MIT
000000r 1               ; license that can be found in the LICENSE file.
000000r 1               
000000r 1               ; This file contains the source for the SHELL
000000r 1               ; application that runs on the Apple II to talk
000000r 1               ; to the Raspberry Pi
000000r 1               
000000r 1               ;ProDOS Zero Page
000000r 1               Command = $42 ;ProDOS Command
000000r 1               Unit = $43 ;ProDOS unit (SDDD0000)
000000r 1               BufferLo = $44
000000r 1               BufferHi = $45
000000r 1               BlockLo = $46
000000r 1               BlockHi = $47
000000r 1               
000000r 1               ; ProDOS Error Codes
000000r 1               IOError = $27
000000r 1               NoDevice = $28
000000r 1               WriteProtect = $2B
000000r 1               
000000r 1               InputByte = $c08e
000000r 1               OutputByte = $c08d
000000r 1               InputFlags = $c08b
000000r 1               OutputFlags = $c087
000000r 1               
000000r 1               ResetCommand = $00
000000r 1               ReadBlockCommand = $01
000000r 1               WriteBlockCommand = $02
000000r 1               GetTimeCommand = $03
000000r 1               ChangeDriveCommand = $04
000000r 1               ExecCommand = $05
000000r 1               LoadFileCommand = $06
000000r 1               SaveFileCommand = $07
000000r 1               MenuCommand = $08
000000r 1               ShellCommand = $09
000000r 1               
000000r 1               InputString = $fd6a
000000r 1               StringBuffer = $0200
000000r 1               PrintChar = $fded
000000r 1               Keyboard = $c000
000000r 1               ClearKeyboard = $c010
000000r 1               Home = $fc58
000000r 1               Wait = $fca8
000000r 1               PromptChar = $33
000000r 1               Read80Col = $c01f
000000r 1               TextPage1 = $c054
000000r 1               TextPage2 = $c055
000000r 1               
000000r 1               htab = $24
000000r 1               vtab = $25
000000r 1               BasL = $28
000000r 1               htab80 = $057b
000000r 1               BasCalc = $fbc1
000000r 1               
000000r 1               LastChar = $06
000000r 1               SlotL = $fe
000000r 1               SlotH = $ff
000000r 1               ESC = $9b
000000r 1               
000000r 1                .org $2000
002000  1  A2 07         ldx #$07 ; start at slot 7
002002  1               DetectSlot:
002002  1  A0 00         ldy #$00
002004  1  A9 FC         lda #$fc
002006  1  85 FE         sta SlotL
002008  1  8A            txa
002009  1  09 C0         ora #$c0
00200B  1  85 FF         sta SlotH
00200D  1  B1 FE         lda (SlotL),y
00200F  1  D0 1C         bne nextSlot
002011  1  C8            iny
002012  1  B1 FE         lda (SlotL),y
002014  1  D0 17         bne nextSlot
002016  1  C8            iny
002017  1  B1 FE         lda (SlotL),y
002019  1  C9 17         cmp #$17
00201B  1  D0 10         bne nextSlot
00201D  1  C8            iny
00201E  1  B1 FE         lda (SlotL),y
002020  1  C9 14         cmp #$14
002022  1  D0 09         bne nextSlot
002024  1  8A            txa
002025  1  0A            asl
002026  1  0A            asl
002027  1  0A            asl
002028  1  0A            asl
002029  1  AA            tax
00202A  1  18            clc
00202B  1  90 04         bcc Start
00202D  1               nextSlot:
00202D  1  CA            dex
00202E  1  D0 D2         bne DetectSlot
002030  1  60            rts
002031  1               Start:
002031  1  A9 8D         lda #$8d
002033  1  20 00 C3      jsr $c300 ; force 80 columns
002036  1  A5 06         lda LastChar
002038  1  48            pha
002039  1  2C 10 C0      bit ClearKeyboard
00203C  1  A9 00         lda #ResetCommand
00203E  1  20 C2 20      jsr SendByte
002041  1  A9 09         lda #ShellCommand
002043  1  20 C2 20      jsr SendByte
002046  1  20 52 20      jsr DumpOutput
002049  1  A9 00         lda #ResetCommand
00204B  1  20 C2 20      jsr SendByte
00204E  1  68            pla
00204F  1  85 06         sta LastChar
002051  1  60            rts
002052  1               
002052  1               DumpOutput:
002052  1  20 E0 20      jsr GetByte
002055  1  C9 00         cmp #$00
002057  1  F0 26         beq endOutput
002059  1  48            pha
00205A  1  20 52 21      jsr ClearCursor
00205D  1  68            pla
00205E  1  C9 48         cmp #'H'
002060  1  F0 27         beq setColumn
002062  1  C9 56         cmp #'V'
002064  1  F0 31         beq setRow
002066  1  C9 43         cmp #'C'
002068  1  F0 16         beq clearScreen
00206A  1  C9 54         cmp #'T'
00206C  1  F0 37         beq setTop
00206E  1  C9 42         cmp #'B'
002070  1  F0 3B         beq setBottom
002072  1  C9 55         cmp #'U'
002074  1  F0 3F         beq moveUp
002076  1  20 ED FD      jsr PrintChar
002079  1  20 21 21      jsr SetCursor
00207C  1  4C 52 20      jmp DumpOutput
00207F  1               endOutput:
00207F  1  60            rts
002080  1               clearScreen:
002080  1  20 58 FC      jsr Home
002083  1  20 21 21      jsr SetCursor
002086  1  4C 52 20      jmp DumpOutput
002089  1               setColumn:
002089  1  20 E0 20      jsr GetByte
00208C  1  85 24         sta htab
00208E  1  8D 7B 05      sta htab80
002091  1  20 21 21      jsr SetCursor
002094  1  4C 52 20      jmp DumpOutput
002097  1               setRow:
002097  1  20 E0 20      jsr GetByte
00209A  1  85 25         sta vtab
00209C  1  20 C1 FB      jsr BasCalc
00209F  1  20 21 21      jsr SetCursor
0020A2  1  4C 52 20      jmp DumpOutput
0020A5  1               setTop:
0020A5  1  20 E0 20      jsr GetByte
0020A8  1  85 22         sta $22
0020AA  1  4C 52 20      jmp DumpOutput
0020AD  1               setBottom:
0020AD  1  20 E0 20      jsr GetByte
0020B0  1  85 23         sta $23
0020B2  1  4C 52 20      jmp DumpOutput
0020B5  1               moveUp:
0020B5  1  C6 25         dec vtab
0020B7  1  A5 25         lda vtab
0020B9  1  20 C1 FB      jsr BasCalc
0020BC  1  20 21 21      jsr SetCursor
0020BF  1  4C 52 20      jmp DumpOutput
0020C2  1               
0020C2  1               SendByte:
0020C2  1  48            pha
0020C3  1               waitWrite:
0020C3  1  BD 8B C0      lda InputFlags,x
0020C6  1  2A            rol
0020C7  1  2A            rol
0020C8  1  B0 F9         bcs waitWrite
0020CA  1  68            pla
0020CB  1  9D 8D C0      sta OutputByte,x
0020CE  1  A9 1E         lda #$1e ; set bit 0 low to indicate write started
0020D0  1  9D 87 C0      sta OutputFlags,x
0020D3  1               finishWrite:
0020D3  1  BD 8B C0      lda InputFlags,x
0020D6  1  2A            rol
0020D7  1  2A            rol
0020D8  1  90 F9         bcc finishWrite
0020DA  1  A9 1F         lda #$1f
0020DC  1  9D 87 C0      sta OutputFlags,x
0020DF  1  60            rts
0020E0  1               
0020E0  1               GetByte:
0020E0  1  A9 1D         lda #$1d ;set read flag low
0020E2  1  9D 87 C0      sta OutputFlags,x
0020E5  1               waitRead:
0020E5  1  BD 8B C0      lda InputFlags,x
0020E8  1  2A            rol
0020E9  1  90 24         bcc readByte
0020EB  1  2C 00 C0      bit Keyboard ;keypress will abort waiting to read
0020EE  1  10 F5         bpl waitRead
0020F0  1               keyPressed:
0020F0  1  AD 00 C0      lda Keyboard ;send keypress to RPi
0020F3  1  29 7F         and #$7f
0020F5  1  9D 8D C0      sta OutputByte,x
0020F8  1  2C 10 C0      bit ClearKeyboard
0020FB  1  A9 1C         lda #$1c ;set write flag low too
0020FD  1  9D 87 C0      sta OutputFlags,x
002100  1               finishKeyPress:
002100  1  BD 8B C0      lda InputFlags,x
002103  1  2A            rol
002104  1  2A            rol
002105  1  90 F9         bcc finishKeyPress
002107  1  A9 1D         lda #$1d ;set flags back for reading
002109  1  9D 87 C0      sta OutputFlags,x
00210C  1  4C E5 20      jmp waitRead
00210F  1               readByte:
00210F  1  BD 8E C0      lda InputByte,x
002112  1  48            pha
002113  1  A9 1F         lda #$1f ;set all flags high
002115  1  9D 87 C0      sta OutputFlags,x
002118  1               finishRead:
002118  1  BD 8B C0      lda InputFlags,x
00211B  1  2A            rol
00211C  1  90 FA         bcc finishRead
00211E  1  68            pla
00211F  1  18            clc ;success
002120  1               end:
002120  1  60            rts
002121  1               
002121  1               SetCursor:
002121  1  AD 7B 05      lda htab80 ;get horizontal location / 2
002124  1  4A            lsr
002125  1  A8            tay
002126  1  AD 55 C0      lda TextPage2
002129  1  90 03         bcc setChar
00212B  1  AD 54 C0      lda TextPage1
00212E  1               setChar:
00212E  1  B1 28         lda (BasL),y
002130  1  85 06         sta LastChar ; save so ClearCursor will pick it up
002132  1  C9 E0         cmp #$e0
002134  1  10 0C         bpl lowerCase
002136  1  C9 C0         cmp #$c0
002138  1  10 0D         bpl upperCase
00213A  1  C9 A0         cmp #$a0
00213C  1  10 04         bpl symbol
00213E  1  C9 80         cmp #$80
002140  1  10 0A         bpl noop
002142  1               symbol:
002142  1               lowerCase:
002142  1               invert:
002142  1  49 80         eor #$80
002144  1  4C 4C 21      jmp storeChar
002147  1               upperCase:
002147  1  29 1F         and #$1f
002149  1  4C 4C 21      jmp storeChar
00214C  1               noop:
00214C  1               storeChar:
00214C  1  91 28         sta (BasL),y
00214E  1  AD 54 C0      lda TextPage1
002151  1  60            rts
002152  1               
002152  1               ClearCursor:
002152  1  AD 7B 05      lda htab80 ;get horizontal location / 2
002155  1  4A            lsr
002156  1  A8            tay
002157  1  AD 55 C0      lda TextPage2
00215A  1  90 03         bcc restoreChar
00215C  1  AD 54 C0      lda TextPage1
00215F  1               restoreChar:
00215F  1  A5 06         lda LastChar
002161  1  91 28         sta (BasL),y
002163  1  AD 54 C0      lda TextPage1
002166  1  60            rts
002166  1               
