ca65 V2.18 - N/A
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 D7 20      jsr SendByte
002041  1  A9 09         lda #ShellCommand
002043  1  20 D7 20      jsr SendByte
002046  1  20 52 20      jsr DumpOutput
002049  1  A9 00         lda #ResetCommand
00204B  1  20 D7 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 F5 20      jsr GetByte
002055  1  B0 2A         bcs checkInput
002057  1  C9 00         cmp #$00
002059  1  F0 39         beq endOutput
00205B  1  48            pha
00205C  1  20 54 21      jsr ClearCursor
00205F  1  68            pla
002060  1  C9 48         cmp #'H'
002062  1  F0 3A         beq setColumn
002064  1  C9 56         cmp #'V'
002066  1  F0 44         beq setRow
002068  1  C9 43         cmp #'C'
00206A  1  F0 29         beq clearScreen
00206C  1  C9 54         cmp #'T'
00206E  1  F0 4A         beq setTop
002070  1  C9 42         cmp #'B'
002072  1  F0 4E         beq setBottom
002074  1  C9 55         cmp #'U'
002076  1  F0 52         beq moveUp
002078  1  20 ED FD      jsr PrintChar
00207B  1  20 23 21      jsr SetCursor
00207E  1  4C 52 20      jmp DumpOutput
002081  1               checkInput:
002081  1  2C 00 C0      bit Keyboard ;check for keypress
002084  1  10 CC         bpl DumpOutput ;keep dumping output if no keypress
002086  1  AD 00 C0      lda Keyboard ;send keypress to RPi
002089  1  29 7F         and #$7f
00208B  1  20 D7 20      jsr SendByte
00208E  1  2C 10 C0      bit ClearKeyboard
002091  1  4C 52 20      jmp DumpOutput
002094  1               endOutput:
002094  1  60            rts
002095  1               clearScreen:
002095  1  20 58 FC      jsr Home
002098  1  20 23 21      jsr SetCursor
00209B  1  4C 52 20      jmp DumpOutput
00209E  1               setColumn:
00209E  1  20 F5 20      jsr GetByte
0020A1  1  85 24         sta htab
0020A3  1  8D 7B 05      sta htab80
0020A6  1  20 23 21      jsr SetCursor
0020A9  1  4C 52 20      jmp DumpOutput
0020AC  1               setRow:
0020AC  1  20 F5 20      jsr GetByte
0020AF  1  85 25         sta vtab
0020B1  1  20 C1 FB      jsr BasCalc
0020B4  1  20 23 21      jsr SetCursor
0020B7  1  4C 52 20      jmp DumpOutput
0020BA  1               setTop:
0020BA  1  20 F5 20      jsr GetByte
0020BD  1  85 22         sta $22
0020BF  1  4C 52 20      jmp DumpOutput
0020C2  1               setBottom:
0020C2  1  20 F5 20      jsr GetByte
0020C5  1  85 23         sta $23
0020C7  1  4C 52 20      jmp DumpOutput
0020CA  1               moveUp:
0020CA  1  C6 25         dec vtab
0020CC  1  A5 25         lda vtab
0020CE  1  20 C1 FB      jsr BasCalc
0020D1  1  20 23 21      jsr SetCursor
0020D4  1  4C 52 20      jmp DumpOutput
0020D7  1               
0020D7  1               SendByte:
0020D7  1  48            pha
0020D8  1               waitWrite:
0020D8  1  BD 8B C0      lda InputFlags,x
0020DB  1  2A            rol
0020DC  1  2A            rol
0020DD  1  B0 F9         bcs waitWrite
0020DF  1  68            pla
0020E0  1  9D 8D C0      sta OutputByte,x
0020E3  1  A9 1E         lda #$1e ; set bit 0 low to indicate write started
0020E5  1  9D 87 C0      sta OutputFlags,x
0020E8  1               finishWrite:
0020E8  1  BD 8B C0      lda InputFlags,x
0020EB  1  2A            rol
0020EC  1  2A            rol
0020ED  1  90 F9         bcc finishWrite
0020EF  1  A9 1F         lda #$1f
0020F1  1  9D 87 C0      sta OutputFlags,x
0020F4  1  60            rts
0020F5  1               
0020F5  1               GetByte:
0020F5  1  2C 00 C0      bit Keyboard ; skip byte read if key pressed
0020F8  1  90 10         bcc keyPressed
0020FA  1  A9 1D         lda #$1d ;set read flag low
0020FC  1  9D 87 C0      sta OutputFlags,x
0020FF  1               waitRead:
0020FF  1  BD 8B C0      lda InputFlags,x
002102  1  2A            rol
002103  1  90 0C         bcc readByte
002105  1  2C 00 C0      bit Keyboard ;keypress will abort waiting to read
002108  1  10 F5         bpl waitRead
00210A  1               keyPressed:
00210A  1  A9 1F         lda #$1f ;set all flags high and exit
00210C  1  9D 87 C0      sta OutputFlags,x
00210F  1  38            sec ;failure
002110  1  60            rts
002111  1               readByte:
002111  1  BD 8E C0      lda InputByte,x
002114  1  48            pha
002115  1  A9 1F         lda #$1f ;set all flags high
002117  1  9D 87 C0      sta OutputFlags,x
00211A  1               finishRead:
00211A  1  BD 8B C0      lda InputFlags,x
00211D  1  2A            rol
00211E  1  90 FA         bcc finishRead
002120  1  68            pla
002121  1  18            clc ;success
002122  1               end:
002122  1  60            rts
002123  1               
002123  1               SetCursor:
002123  1  AD 7B 05      lda htab80 ;get horizontal location / 2
002126  1  4A            lsr
002127  1  A8            tay
002128  1  AD 55 C0      lda TextPage2
00212B  1  90 03         bcc setChar
00212D  1  AD 54 C0      lda TextPage1
002130  1               setChar:
002130  1  B1 28         lda (BasL),y
002132  1  85 06         sta LastChar ; save so ClearCursor will pick it up
002134  1  C9 E0         cmp #$e0
002136  1  10 0C         bpl lowerCase
002138  1  C9 C0         cmp #$c0
00213A  1  10 0D         bpl upperCase
00213C  1  C9 A0         cmp #$a0
00213E  1  10 04         bpl symbol
002140  1  C9 80         cmp #$80
002142  1  10 0A         bpl noop
002144  1               symbol:
002144  1               lowerCase:
002144  1               invert:
002144  1  49 80         eor #$80
002146  1  4C 4E 21      jmp storeChar
002149  1               upperCase:
002149  1  29 1F         and #$1f
00214B  1  4C 4E 21      jmp storeChar
00214E  1               noop:
00214E  1               storeChar:
00214E  1  91 28         sta (BasL),y
002150  1  AD 54 C0      lda TextPage1
002153  1  60            rts
002154  1               
002154  1               ClearCursor:
002154  1  AD 7B 05      lda htab80 ;get horizontal location / 2
002157  1  4A            lsr
002158  1  A8            tay
002159  1  AD 55 C0      lda TextPage2
00215C  1  90 03         bcc restoreChar
00215E  1  AD 54 C0      lda TextPage1
002161  1               restoreChar:
002161  1  A5 06         lda LastChar
002163  1  91 28         sta (BasL),y
002165  1  AD 54 C0      lda TextPage1
002168  1  60            rts
002168  1               
