From 4a040ac935763401b8c5ac541113092b958f0b9f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 19 Jul 2019 21:23:43 +0200 Subject: [PATCH] work towards Ultimate 64 LOAD support --- c64/kernal/,platform_generic/,hooks_generic.s | 6 + c64/kernal/,platform_generic/.dummy | 0 c64/kernal/,platform_mega65/,hooks_mega65.s | 6 + c64/kernal/,platform_mega65/.dummy | 0 .../,aliases_ultimate64.s | 61 +++++++- .../,platform_ultimate64/,hooks_ultimate64.s | 7 + c64/kernal/,platform_ultimate64/u64_load.s | 140 ++++++++++++++++++ c64/kernal/load.s | 12 +- c64/kernal/lvs_helpers.s | 2 + 9 files changed, 219 insertions(+), 15 deletions(-) create mode 100644 c64/kernal/,platform_generic/,hooks_generic.s delete mode 100644 c64/kernal/,platform_generic/.dummy create mode 100644 c64/kernal/,platform_mega65/,hooks_mega65.s delete mode 100644 c64/kernal/,platform_mega65/.dummy create mode 100644 c64/kernal/,platform_ultimate64/,hooks_ultimate64.s create mode 100644 c64/kernal/,platform_ultimate64/u64_load.s diff --git a/c64/kernal/,platform_generic/,hooks_generic.s b/c64/kernal/,platform_generic/,hooks_generic.s new file mode 100644 index 00000000..7de47686 --- /dev/null +++ b/c64/kernal/,platform_generic/,hooks_generic.s @@ -0,0 +1,6 @@ + +;; Platform-specific hooks + + +.macro PLATFORM_HOOK_LOAD +.macend diff --git a/c64/kernal/,platform_generic/.dummy b/c64/kernal/,platform_generic/.dummy deleted file mode 100644 index e69de29b..00000000 diff --git a/c64/kernal/,platform_mega65/,hooks_mega65.s b/c64/kernal/,platform_mega65/,hooks_mega65.s new file mode 100644 index 00000000..7de47686 --- /dev/null +++ b/c64/kernal/,platform_mega65/,hooks_mega65.s @@ -0,0 +1,6 @@ + +;; Platform-specific hooks + + +.macro PLATFORM_HOOK_LOAD +.macend diff --git a/c64/kernal/,platform_mega65/.dummy b/c64/kernal/,platform_mega65/.dummy deleted file mode 100644 index e69de29b..00000000 diff --git a/c64/kernal/,platform_ultimate64/,aliases_ultimate64.s b/c64/kernal/,platform_ultimate64/,aliases_ultimate64.s index 1f30e332..a4aabfaf 100644 --- a/c64/kernal/,platform_ultimate64/,aliases_ultimate64.s +++ b/c64/kernal/,platform_ultimate64/,aliases_ultimate64.s @@ -1,10 +1,57 @@ -;; Registers according to Ultimate 64 Command Interface ddescription, +;; Registers according to Ultimate 64 Command Interface description, ;; https://1541u-documentation.readthedocs.io/en/latest/command%20interface.html +;; and ultimate_dos_v1.0.pdf and command_interface_v1.0.pdf by Gideon Zweijtzer - .alias U64_CONTROL $DF1C ; write - .alias U64_STATUS $DF1C ; read - .alias U64_COMMAND_DATA $DF1D ; write - .alias U64_IDENTIFICATION $DF1D ; read - .alias U64_RESPONSE_DATA $DF1E ; read only - .alias U64_STATUS_DATA $DF1F ; read only + ;; Command interface registers + .alias U64_CONTROL $DF1C ; write + .alias U64_STATUS $DF1C ; read + .alias U64_COMMAND_DATA $DF1D ; write + .alias U64_IDENTIFICATION $DF1D ; read + .alias U64_RESPONSE_DATA $DF1E ; read only + .alias U64_STATUS_DATA $DF1F ; read only + + ;; Constant for U64_IDENTIFICATION register + .alias U64_MAGIC_ID $C9 + + ;; Constants for U64_CONTROL register + .alias U64_CTRL_BIT_PUSH_CMD $01 + .alias U64_CTRL_BIT_DATA_ACC $02 + .alias U64_CTRL_BIT_ABORT $04 + .alias U64_CTRL_BIT_CLR_ERR $08 + + ;; Constants for U64_STATUS register + .alias U64_STAT_BIT_CMD_BUSY $01 + .alias U64_STAT_BIT_DATA_ACC $02 + .alias U64_STAT_BIT_ABORT_P $04 + .alias U64_STAT_BIT_ERROR $08 + .alias U64_STAT_MASK_STATE $30 ; two bits! + .alias U64_STAT_BIT_STAT_AV $40 + .alias U64_STAT_BIT_DATA_AV $80 + + ;; Interface targets + .alias U64_TARGET_DOS1 $01 + .alias U64_TARGET_DOS2 $02 + + ;; DOS command codes + .alias U64_DOS_CMD_IDENTIFY $01 + .alias U64_DOS_CMD_OPEN_FILE $02 + .alias U64_DOS_CMD_CLOSE_FILE $03 + .alias U64_DOS_CMD_READ_DATA $04 + .alias U64_DOS_CMD_WRITE_DATA $05 + .alias U64_DOS_CMD_FILE_SEEK $06 + .alias U64_DOS_CMD_FILE_INFO $07 + .alias U64_DOS_CMD_CHANGE_DIR $11 + .alias U64_DOS_CMD_GET_PATH $12 + .alias U64_DOS_CMD_OPEN_DIR $13 + .alias U64_DOS_CMD_READ_DIR $14 + .alias U64_DOS_CMD_COPY_UI_PATH $15 + .alias U64_DOS_CMD_LOAD_REU $21 + .alias U64_DOS_CMD_SAVE_REU $22 + .alias U64_DOS_CMD_ECHO $F0 + + ;; DOS file opening constants + .alias U64_FA_READ $01 + .alias U64_FA_WRITE $02 + .alias U64_FA_CREATE_NEW $03 + .alias U64_FA_CREATE_ALWAYS $04 diff --git a/c64/kernal/,platform_ultimate64/,hooks_ultimate64.s b/c64/kernal/,platform_ultimate64/,hooks_ultimate64.s new file mode 100644 index 00000000..50f780b7 --- /dev/null +++ b/c64/kernal/,platform_ultimate64/,hooks_ultimate64.s @@ -0,0 +1,7 @@ + +;; Platform-specific hooks + + +.macro PLATFORM_HOOK_LOAD + jsr u64_load +.macend diff --git a/c64/kernal/,platform_ultimate64/u64_load.s b/c64/kernal/,platform_ultimate64/u64_load.s new file mode 100644 index 00000000..19764034 --- /dev/null +++ b/c64/kernal/,platform_ultimate64/u64_load.s @@ -0,0 +1,140 @@ + +;; +;; LOAD routine hook for fast loading via UltiDOS +;; + + +u64_load: + + jsr printf + .byte "DGB: 0",$0D,0 + + ;; First check whether the command interface is enabled + ;; XXX identification does not work, why? + ;; lda U64_IDENTIFICATION + ;; cmp U64_MAGIC_ID + ;; beq + + +u64_load_skip: + ;; rts +* + jsr printf + .byte "DGB: 1",$0D,0 + + ;; XXX find out which device number softIEC is mapped to + lda current_device_number + cmp #$20 ; for now use device number 32 + beq u64_load_skip + + .byte "DGB: 2",$0D,0 + + ;; Takeover the flow completely + pla + pla + + ;; Display SEARCHING FOR + filename + jsr lvs_display_searching_for + + .byte "DGB: 3",$0D,0 + + ;; Whatever the interface was doing - ask to abort it + jsr u64_load_abort + + .byte "DGB: 4",$0D,0 + + ;; Send a command to open the file + lda #U64_DOS_CMD_OPEN_FILE + jsr u64_load_send_cmd + lda #U64_FA_READ + jsr u64_load_send_cmd + jsr u64_load_send_filename + jsr u64_load_finalize_cmd + + .byte "DGB: 5",$0D,0 + + ;; Check status + jsr u64_load_check_status + bcs lvs_file_not_found_error + + ;; Load first two bytes to determine start address + + ;; XXX + + .byte "DGB: 6",$0D,0 + + jmp lvs_wrap_around_error + rts + +u64_load_abort: + lda #U64_CTRL_BIT_ABORT + sta U64_CONTROL +* + lda U64_STATUS + bne - + rts + +u64_load_send_cmd: + + ldx #U64_TARGET_DOS2 + stx U64_COMMAND_DATA ; target + sta U64_COMMAND_DATA ; command code + rts + +u64_load_send_filename: + ldy #0 +u64_load_send_filename_loop: + cpy FNLEN + bne+ + rts +* + ldx #