Apple2-IO-RPi/Apple2/Clock.Driver.asm

141 lines
2.4 KiB
NASM

; Copyright Terence J. Boldt (c)2024
; Use of this source code is governed by an MIT
; license that can be found in the LICENSE file.
; This file contains the source for the clock
; driver for the Apple2-IO-RPi
EnableWriteLang = $C08B
DisableWriteLang = $C082
ProdosJump = $BF06
ProdosClockCode = $BF07
ProdosMachineId = $BF98
PrintChar = $FDED
PrintHex = $FDE3
PrintByte = $FDDA
GetTimeCommand = $03
.org $2000
; Find Apple2-IO-RPi card
ldx #$06
ldy #$09
CheckIdBytes:
lda $C700,y ; !! Self modifying code
cmp IdBytes,y
bne NextCard
dey
bne CheckIdBytes
jmp FoundCard
NextCard:
dec CheckIdBytes+2
ldy #$09
dex
bne CheckIdBytes
CardNotFound:
ldy #$00
PrintCardNotFound:
lda TextCardNotFound,y
beq Failed
ora #$80
jsr PrintChar
iny
bne PrintCardNotFound
Failed:
rts
FoundCard:
ldy #$00
PrintCardFound:
lda TextCardFound,y
beq PrintCardNumber
ora #$80
jsr PrintChar
iny
bne PrintCardFound
PrintCardNumber:
inx
txa
jsr PrintHex
lda #$8D
jsr PrintChar
; Change driver code to point to the card
txa
ora #$C0
sta GetByte+2
sta SendByte+2
; Change destination to be ProDOS clock code location
lda ProdosClockCode
sta DriverDestination+1
lda ProdosClockCode+1
sta DriverDestination+2
; Changing RTS to JMP enables clock driver
lda #$4C ; jump instruction
sta ProdosJump
; Enable writing to language card RAM
; by triggering switch twice
lda EnableWriteLang
lda EnableWriteLang
; write driver code to language card RAM
ldy #$00
WriteDriver:
lda Driver,y
DriverDestination:
sta $D742,y ; !! this address gets modified above
iny
cpy #EndDriver-Driver+2
bne WriteDriver
; Disable writing to language card RAM
lda DisableWriteLang
; Update ProDOS Machine ID to mark clock as enabled
lda ProdosMachineId
ora #$01
sta ProdosMachineId
ldy #$00
PrintFinished:
lda TextDriverInstalled,y
beq Finished
ora #$80
jsr PrintChar
iny
bne PrintFinished
Finished:
rts
IdBytes:
.byte $E0,$20,$E0,$00,$E0,$03,$E0,$3C,$A9,$3F
TextCardFound:
.byte "Found Apple2-IO-RPi in slot ",$00
TextCardNotFound:
.byte "Apple2-IO-RPi not found",$8D,$00
TextDriverInstalled:
.byte "Apple2-IO-RPi Clock driver version 0001",$8D,$00
Driver:
lda #GetTimeCommand
SendByte:
jsr $C749 ; !! address gets modified on installation
ldy #$00
getTimeByte:
GetByte:
jsr $C743 ; !! address gets modified on installation
sta $bf90,y
iny
cpy #$04
bne getTimeByte
EndDriver:
rts