I'm pulling my hair out with this code. Its intended to run from the internal function ROM in the C128 and is trying to dump track 18, sector 1 to the screen as a proof of concept. The problem with this is that the drive reports a syntax error. Trouble is, I can't figure out why! I've tried both the B-R and U1 commands, but nothing seems to work.
I'm developing this code with the cc65 tools, just in case it matters.
Any ideas?
Code: Select all
;
; The BOOT ROM for c128 - version 0.1
;
; Note: This version is to be used as Option ROM
; starting from $8000 onwards on a c128!
;
;
; disk access routines adapted from original Commodore CP/M code
; http://www.z80.eu/c64/BOOT65.ASM
SETLFS = $ffba
SETNAM = $ffbd
OPEN = $ffc0
CHKIN = $ffc6
CKOUT = $ffc9
CLRCH = $ffcc
BASIN = $ffcf
BSOUT = $ffd2
CLALL = $ffe7
LOADADR = $1c01
.org $8000
; c128 Option ROM trickery
jmp start_code ;Cold start vector
jmp start_code ;Warm start vector
.byte $FF ;> $01 for Autostart
.byte $43,$42,$4d ;"CBM"
.byte $00,$00,$00 ;padding (easier on the eyes)
start_code:
lda #6 ;Kernal and Internal ROM (LOW), RAM(0), I/O
sta $d501 ;write to preconfiguration register A
sta $ff01 ;write to LCR A
sei ;disable interrupts
jsr CLALL ;close all files and channels
; set up command channel
lda #15 ;logical file number 15
ldx #8 ;device 8
ldy #15 ;secondary address 15
jsr SETLFS ;set LA, FA, SA
lda #0 ;zero length file name
jsr SETNAM
jsr OPEN ;open command channel
; set up for random access
lda #5 ;logical file number 5
ldx #8 ;device 8
ldy #5 ;secondary address 5
jsr SETLFS ;set LA, FA, SA
lda #1 ;single character file name
ldx #<buffer
ldy #>buffer ;set file name
jsr SETNAM
jsr OPEN ;open command channel
; grab info from Track 1, Sector 0 (block-read)
ldx #15 ;15 is active channel out
jsr CKOUT
ldx #0
ldy #13 ;length of file name (11 characters)
fname:
lda drivecmd,x ;pointer to file name
jsr BSOUT ;output to channel
inx
dey
bne fname ;loop to finish sending filename
jsr CLRCH ;restore default channel
ldx #5 ;set 5 as active channel in
jsr CHKIN
ldx #0
rdloop:
jsr BASIN ;input from channel
rl1:
sta $0400,x ;put to screen
inx
bne rdloop ;read 256 bytes
jsr CLRCH ;restore default channel
;jsr CLALL ;close all channels
brk
; data
buffer:
.byte "#"
drivecmd:
.byte "u1: 5 0 18 1", $0D
readcnt:
.byte 0