80 files changed
+1526
-585
No files matched your search
@@ -177,7 +177,7 @@ Enable this option if you are using a tape interface adapter lacking tape motor
|
||||
|
||||
## Additional storage
|
||||
|
||||
### `UNIT_SDCARD`, `UNIT_FLOPPY`, `UNIT_RAMDISK`
|
||||
### `UNIT_SDCARD`, `UNIT_FLOPPY0`, `UNIT_FLOPPY1`, `UNIT_RAMDISK`
|
||||
|
||||
MEGA65 specific pseudo-IEC devices, handled by internal DOS (work in progress). If set to 0, given unit is disabled. Otherwise - assigns IEC unit number to the given storage.
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \
|
||||
src/basic/basic_functions_06 \
|
||||
src/basic/board_crt \
|
||||
src/basic/board_m65 \
|
||||
src/basic/board_u64 \
|
||||
src/basic/board_x16 \
|
||||
src/basic/engine_editor \
|
||||
src/basic/engine_runtime \
|
||||
@@ -67,9 +68,9 @@ SRCDIR_DOS_M65 = $(SRCDIR_COMMON) \
|
||||
src/dos_m65/filesystem_vfs \
|
||||
src/dos_m65/lowlevel \
|
||||
src/dos_m65/pseudoiec \
|
||||
src/dos_m65/unit_floppy \
|
||||
src/dos_m65/unit_card \
|
||||
src/dos_m65/unit_disk \
|
||||
src/dos_m65/unit_ramdisk \
|
||||
src/dos_m65/unit_sdcard \
|
||||
src/dos_m65/utils
|
||||
|
||||
SRCDIR_MON_M65 = $(SRCDIR_COMMON) \
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+12
-11
@@ -52,24 +52,24 @@
|
||||
|
||||
;; #CONFIG# PROGRAMMABLE_KEYS YES
|
||||
|
||||
;; #CONFIG# KEYCMD_RUN "RUN"
|
||||
;; #CONFIG# KEYCMD_RUN "RUN:"
|
||||
|
||||
;; #CONFIG# KEYCMD_F1 "@8$"
|
||||
;; #CONFIG# KEYCMD_F2 "LOAD"
|
||||
;; #CONFIG# KEYCMD_F3 "@9$"
|
||||
;; #CONFIG# KEYCMD_F4 "RUN:"
|
||||
;; #CONFIG# KEYCMD_F4 "\5FL"
|
||||
;; #CONFIG# KEYCMD_F5 "@10$"
|
||||
;; #CONFIG# KEYCMD_F6 "REM F6"
|
||||
;; #CONFIG# KEYCMD_F6 "\5FHF"
|
||||
;; #CONFIG# KEYCMD_F7 "@11$"
|
||||
;; #CONFIG# KEYCMD_F8 "MONITOR"
|
||||
|
||||
;; #CONFIG# KEYCMD_HELP "LIST"
|
||||
|
||||
;; #CONFIG# KEYCMD_F9 "@28$"
|
||||
;; #CONFIG# KEYCMD_F10 "\5FL"
|
||||
;; #CONFIG# KEYCMD_F11 "@29$"
|
||||
;; #CONFIG# KEYCMD_F12 "\5FHF"
|
||||
;; #CONFIG# KEYCMD_F13 "JOYCRSR 2"
|
||||
;; #CONFIG# KEYCMD_F9 "@27$"
|
||||
;; #CONFIG# KEYCMD_F10 "REM F10"
|
||||
;; #CONFIG# KEYCMD_F11 "@28$"
|
||||
;; #CONFIG# KEYCMD_F12 "@29$"
|
||||
;; #CONFIG# KEYCMD_F13 "@30$"
|
||||
;; #CONFIG# KEYCMD_F14 "BOOTCPM"
|
||||
|
||||
|
||||
@@ -90,9 +90,10 @@
|
||||
|
||||
; --- Built-in DOS configuration
|
||||
|
||||
;; #CONFIG# UNIT_SDCARD 28
|
||||
;; #CONFIG# UNIT_FLOPPY 29
|
||||
;; #CONFIG# UNIT_RAMDISK 0 ; do not change, ram disk is not implemented yet
|
||||
;; #CONFIG# UNIT_SDCARD 27
|
||||
;; #CONFIG# UNIT_FLOPPY0 0
|
||||
;; #CONFIG# UNIT_FLOPPY1 0
|
||||
;; #CONFIG# UNIT_RAMDISK 0
|
||||
|
||||
|
||||
; --- Debug options
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
!addr OLDLIN = $3B ; $3B-$3C previous BASIC line number
|
||||
!addr OLDTXT = $3D ; $3D-$3E current BASIC line pointer
|
||||
!addr DATLIN = $3F ; $3F-$40 -- NOT IMPLEMENTED --
|
||||
!addr DATPTR = $41 ; $41-$42 pointer for READ/DATA copmmands
|
||||
!addr DATPTR = $41 ; $41-$42 pointer for READ/DATA commands
|
||||
!addr INPPTR = $43 ; $43-$44 -- NOT IMPLEMENTED --
|
||||
!addr VARNAM = $45 ; $45-$46 current variable name
|
||||
!addr VARPNT = $47 ; $47-$48 current variable/descriptor pointer
|
||||
|
||||
@@ -33,39 +33,49 @@
|
||||
; Pages 4-7 - reused screen memory
|
||||
;
|
||||
|
||||
; $400-$57F - reserved for BASIC
|
||||
!addr M65_RS232_INBUF = $400 ; $400-$4FF -- reserved for RS-232 input buffer --
|
||||
!addr M65_RS232_OUTBUF = $500 ; $500-$5FF -- reserved for RS-232 output buffer --
|
||||
|
||||
; $400-$57F -- UNUSED -- reserved for BASIC
|
||||
; $600-$77F - reserved for BASIC
|
||||
|
||||
; $580-$5FF - reserved for KERNAL
|
||||
; $600-$77F -- UNUSED -- reserved for BASIC
|
||||
|
||||
!addr M65_SCRSEG = $580 ; $580-$581 segment address (2 higher bytes) of the screen memory
|
||||
!addr M65_SCRBASE = $582 ; $582-$583 first byte of screen memory
|
||||
!addr M65_SCRGUARD = $584 ; $584-$585 last byte of screen memory + 1 XXX is it needed?
|
||||
!addr M65_COLGUARD = $586 ; $586-$587 last byte of colour memory + 1
|
||||
!addr M65_COLVIEW = $588 ; $588-$589 first byte of color memory viewport
|
||||
!addr M65_COLVIEWMAX = $58A ; $58A-$58B largest allowed value of M65_COLVIEW
|
||||
!addr M65_SCRMODE = $58C ; 0 = 40x25, 1 = 80x25, 2 = 80x50
|
||||
!addr M65_SCRWINMODE = $58D ; $00 = normal mode, $FF = window enabled
|
||||
!addr M65_TXTWIN_X0 = $58E ; text window - top-left X coordinate, starting from 0
|
||||
!addr M65_TXTWIN_Y0 = $58F ; text window - top-left Y coordinate, starting from 0
|
||||
!addr M65_TXTWIN_X1 = $590 ; text window - bottom-right X coordinate + 1
|
||||
!addr M65_TXTWIN_Y1 = $591 ; text window - bottom-right Y coordinate + 1
|
||||
!addr M65_TXTROW_OFF = $592 ; $592-$593 offset to the current text row from the viewport start
|
||||
!addr M65_SCRCOLMAX = $594 ; maximum allowed column
|
||||
!addr M65_ESCMODE = $595 ; flag - if set, escape mode is in effect
|
||||
!addr M65_KB_BUCKY = $596 ; result of bucky keys scan
|
||||
!addr M65_KB_COLSCAN = $597 ; $597-$59F results of keyboard scan, columns 0-8
|
||||
!addr M65_KB_PRESSED = $5A0 ; $5A0-$5A2 keys pressed, used during scanning keyboard
|
||||
!addr M65_KB_PRESSED_OLD = $5A3 ; $5A3-$5A5 keys pressed during previous scan
|
||||
!addr M65_KB_PRESSED_NEW = $5A6 ; $5A6-$5A8 set of M65_KB_PRESSED minus M65_KB_PRESSED_OLD
|
||||
!addr M65_BELLDSBL = $5A9 ; flag - if set, disable the bell
|
||||
!addr M65_SOLIDCRSR = $5AA ; flag - if set, cursor is solid (does not flash)
|
||||
!addr M65_JOYCRSR = $5AB ; joystick to be used for cursor movement
|
||||
; $5AC-$5EB -- UNUSED --
|
||||
!addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed)
|
||||
!addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer --
|
||||
!addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer --
|
||||
; $780-$7FF - reserved for KERNAL
|
||||
|
||||
!addr M65_SCRSEG = $780 ; $780-$781 segment address (2 higher bytes) of the screen memory
|
||||
!addr M65_SCRBASE = $782 ; $782-$783 first byte of screen memory
|
||||
!addr M65_SCRGUARD = $784 ; $784-$785 last byte of screen memory + 1 XXX is it needed?
|
||||
!addr M65_COLGUARD = $786 ; $786-$787 last byte of colour memory + 1
|
||||
!addr M65_COLVIEW = $788 ; $788-$789 first byte of color memory viewport
|
||||
!addr M65_COLVIEWMAX = $78A ; $78A-$78B largest allowed value of M65_COLVIEW
|
||||
!addr M65_SCRMODE = $78C ; 0 = 40x25, 1 = 80x25, 2 = 80x50
|
||||
!addr M65_SCRWINMODE = $78D ; $00 = normal mode, $FF = window enabled
|
||||
!addr M65_TXTWIN_X0 = $78E ; text window - top-left X coordinate, starting from 0
|
||||
!addr M65_TXTWIN_Y0 = $78F ; text window - top-left Y coordinate, starting from 0
|
||||
!addr M65_TXTWIN_X1 = $790 ; text window - bottom-right X coordinate + 1
|
||||
!addr M65_TXTWIN_Y1 = $791 ; text window - bottom-right Y coordinate + 1
|
||||
!addr M65_TXTROW_OFF = $792 ; $792-$793 offset to the current text row from the viewport start
|
||||
!addr M65_SCRCOLMAX = $794 ; maximum allowed column
|
||||
!addr M65_ESCMODE = $795 ; flag - if set, escape mode is in effect
|
||||
!addr M65_KB_BUCKY = $796 ; result of bucky keys scan
|
||||
!addr M65_KB_COLSCAN = $797 ; $797-$79F results of keyboard scan, columns 0-8
|
||||
!addr M65_KB_PRESSED = $7A0 ; $7A0-$7A2 keys pressed, used during scanning keyboard
|
||||
!addr M65_KB_PRESSED_OLD = $7A3 ; $7A3-$7A5 keys pressed during previous scan
|
||||
!addr M65_KB_PRESSED_NEW = $7A6 ; $7A6-$7A8 set of M65_KB_PRESSED minus M65_KB_PRESSED_OLD
|
||||
!addr M65_BELLDSBL = $7A9 ; flag - if set, disable the bell
|
||||
!addr M65_SOLIDCRSR = $7AA ; flag - if set, cursor is solid (does not flash)
|
||||
!addr M65_JOYCRSR = $7AB ; joystick to be used for cursor movement
|
||||
; $7AC-$7C8 -- UNUSED --
|
||||
!addr M65_DMAGIC_LIST = $7C9 ; $7C9-$7D7 reserved for DMAgic list, 15 bytes (modulo bytes are not needed)
|
||||
|
||||
; $7D8-$7E7 - 4 32bit registers, reserved for parameters for future Kernal AP{I expansion
|
||||
|
||||
!addr M65_R0 = $7D8 ; $7D8-$7DB
|
||||
!addr M65_R1 = $7DC ; $7DC-$7DF
|
||||
!addr M65_R2 = $7E0 ; $7E0-$7E3
|
||||
!addr M65_R3 = $7E4 ; $7E4-$7E7
|
||||
|
||||
; $7E8-$7FF - 24 free bytes, as in the legacy compatibility mode
|
||||
|
||||
;
|
||||
; Addresses for configuring the DMA job
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
;; #ALIAS# m65_shadow_BZP = KERNAL_0.m65_shadow_BZP
|
||||
;; #ALIAS# proxy_M1_IO_end = KERNAL_0.proxy_M1_IO_end
|
||||
|
||||
;; #ALIAS# m65dos_rdchk = KERNAL_0.m65dos_rdchk
|
||||
;; #ALIAS# m65dos_unitnum = KERNAL_0.m65dos_unitnum
|
||||
|
||||
;
|
||||
|
||||
@@ -119,17 +119,23 @@ print_sysinfo_video:
|
||||
ldx #IDX__STR_DOS_FD
|
||||
jsr print_packed_misc_str
|
||||
|
||||
; Print floppy unit ID
|
||||
; Print floppy unit IDs
|
||||
|
||||
lda #$01
|
||||
jsr cmd_sysinfo_print_dev
|
||||
|
||||
ldx #IDX__STR_DOS_SEPAR
|
||||
jsr print_packed_misc_str
|
||||
|
||||
lda #$02
|
||||
jsr cmd_sysinfo_print_dev
|
||||
|
||||
; Print ram disk unit ID
|
||||
|
||||
ldx #IDX__STR_DOS_RD
|
||||
jsr print_packed_misc_str
|
||||
|
||||
lda #$02
|
||||
lda #$03
|
||||
jsr cmd_sysinfo_print_dev
|
||||
|
||||
jmp print_return
|
||||
|
||||
@@ -46,4 +46,5 @@
|
||||
;; #ALIAS# fetch_character_skip_spaces = BASIC_0.proxy_B1_fetch_character_skip_spaces
|
||||
;; #ALIAS# fetch_uint8 = BASIC_0.proxy_B1_fetch_uint8
|
||||
;; #ALIAS# shell_main_loop = BASIC_0.proxy_B1_shell_main_loop
|
||||
;; #ALIAS# m65dos_rdchk = BASIC_0.proxy_B1_m65dos_rdchk
|
||||
;; #ALIAS# m65dos_unitnum = BASIC_0.proxy_B1_m65dos_unitnum
|
||||
@@ -157,6 +157,12 @@ proxy_M1_print_kernal_error:
|
||||
jmp proxy_M1_IO_end
|
||||
}
|
||||
|
||||
proxy_B1_m65dos_rdchk:
|
||||
|
||||
jsr map_NORMAL
|
||||
jsr m65dos_rdchk
|
||||
bra proxy_B1_end_2
|
||||
|
||||
proxy_B1_m65dos_unitnum:
|
||||
|
||||
jsr map_NORMAL
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
Information about Ultimate 64 bank switching: https://www.forum64.de/index.php?thread/102375-16k-bzw-24k-kernal/&postID=1674790#post1674790
|
||||
|
||||
lda $e460 ; only needed if switching from outside of the Kernal
|
||||
lda $e460
|
||||
lda $e494
|
||||
lda $e464
|
||||
lda $e462
|
||||
lda $e495
|
||||
lda $e480+bankno
|
||||
|
||||
There can be no $e460-$e49f access in between.
|
||||
@@ -31,11 +31,11 @@ INITMSG_native:
|
||||
|
||||
; Native mode
|
||||
|
||||
ldx #46
|
||||
ldx #48
|
||||
ldy #0
|
||||
jsr M65_SETWIN_XY
|
||||
|
||||
ldx #34
|
||||
ldx #32
|
||||
ldy #9
|
||||
jsr M65_SETWIN_WH
|
||||
|
||||
@@ -66,7 +66,36 @@ INITMSG_native:
|
||||
|
||||
ldx #$09
|
||||
ldy #$00
|
||||
jmp plot_set
|
||||
jsr plot_set
|
||||
|
||||
; Display the preloaded RAM disc image status
|
||||
|
||||
jsr m65dos_rdchk
|
||||
cmp #$FF
|
||||
+beq print_return
|
||||
|
||||
pha
|
||||
jsr print_return
|
||||
pla
|
||||
pha
|
||||
cmp #$00
|
||||
beq @skip_bold
|
||||
|
||||
lda #$1B
|
||||
jsr JCHROUT
|
||||
lda #'S'
|
||||
jsr JCHROUT
|
||||
|
||||
@skip_bold:
|
||||
|
||||
ldx #IDX__STR_RD_NAME
|
||||
jsr print_packed_misc_str
|
||||
pla
|
||||
|
||||
clc
|
||||
adc #IDX__STR_RD_OK
|
||||
tax
|
||||
jmp print_packed_misc_str
|
||||
|
||||
INITMSG_main_banner:
|
||||
|
||||
|
||||
+92
-63
@@ -11,7 +11,7 @@
|
||||
; Temporary storage locations
|
||||
;
|
||||
|
||||
!addr FS_HVSR_DIRENT = $1000
|
||||
!addr MEM_BUF = $1000 ; buffer for hypervisor calls; starting at $1000 VIC sees chargen, so this should be a safe place
|
||||
|
||||
|
||||
;
|
||||
@@ -27,13 +27,19 @@
|
||||
!addr REG_Y = $8007
|
||||
!addr REG_Z = $8008
|
||||
|
||||
; Reserved: $8009 - $800C
|
||||
; System configuration
|
||||
|
||||
!addr RAM_ATTIC = $8009 ; $8000000-$87FFFFF RAM status; 0 = not present, $FF = present
|
||||
!addr RAM_CELLAR = $800A ; $8800000-$8FFFFFF RAM status; 0 = not present, $FF = present
|
||||
|
||||
!addr RD_MSG = $800B ; code of the RAM disk message to be displayed on banner screen, $FF for none
|
||||
|
||||
; General DOS configuration
|
||||
|
||||
!addr UNIT_SDCARD = $800D ; unit number for device, 0 = none
|
||||
!addr UNIT_FLOPPY = $800E ; as above
|
||||
!addr UNIT_RAMDISK = $800F ; as above
|
||||
!addr UNIT_SDCARD = $800C ; unit number for device, 0 = none
|
||||
!addr UNIT_FLOPPY0 = $800D ; as above - for the internal floppy
|
||||
!addr UNIT_FLOPPY1 = $800E ; as above - for additional floppy drive
|
||||
!addr UNIT_RAMDISK = $800F ; as above - for the RAM disk
|
||||
|
||||
; General DOS status
|
||||
|
||||
@@ -46,7 +52,7 @@
|
||||
|
||||
!addr code_LDA_nnnn_Y = $8014 ; - LDA nnnn, Y instruction
|
||||
!addr par_LDA_nnnn_Y = $8015 ; - 2 bytes; address
|
||||
!addr code_RTS_04 = $8017 ; - RTS instruction
|
||||
!addr code_RTS_05 = $8017 ; - RTS instruction
|
||||
|
||||
; Parameters for utilities/helpers
|
||||
|
||||
@@ -60,65 +66,86 @@
|
||||
!addr PAR_FNAME = $8021 ; 16 bytes - filename, filled with $A0
|
||||
!addr PAR_FPATTERN = $8031 ; 16 bytes - pattern to match, filled with $A0
|
||||
|
||||
!addr PAR_FSINSTANCE = $8041 ; 0 = SD card, 1/2 = floppy, 3 = ram disk
|
||||
|
||||
; Various temporary data
|
||||
|
||||
!addr XX_DIR_PHASE = $8041 ; directory output phase, values deponds on device driver, but 0 = not reading
|
||||
!addr SD_DIR_PHASE = $8041 ; - SD card
|
||||
!addr FD_DIR_PHASE = $8042 ; - floppy
|
||||
!addr RD_DIR_PHASE = $8043 ; - ram disk
|
||||
!addr XX_DIR_PHASE = $8042 ; directory output phase, values deponds on device driver, but 0 = not reading
|
||||
!addr SD_DIR_PHASE = $8042 ; - SD card
|
||||
!addr F0_DIR_PHASE = $8043 ; - floppy 0
|
||||
!addr F1_DIR_PHASE = $8044 ; - floppy 0
|
||||
!addr RD_DIR_PHASE = $8045 ; - ram disk
|
||||
|
||||
; Free space: $8044-$8063
|
||||
; Free space: $8046-$8063
|
||||
|
||||
!addr SD_ACPTR_helper = $8052 ; subroutine in RAM to read a byte
|
||||
!addr code_LDA_01 = $8052 ; - LDA instruction
|
||||
!addr SD_ACPTR_PTR = $8053 ; - 2 bytes; address in buffer, SD card
|
||||
!addr code_RTS_01 = $8055 ; - RTS instruction
|
||||
|
||||
!addr FD_ACPTR_helper = $8056 ; subroutine in RAM to read a byte
|
||||
!addr F0_ACPTR_helper = $8056 ; subroutine in RAM to read a byte
|
||||
!addr code_LDA_02 = $8056 ; - LDA instruction
|
||||
!addr FD_ACPTR_PTR = $8057 ; - 2 bytes; address in buffer, floppy
|
||||
!addr F0_ACPTR_PTR = $8057 ; - 2 bytes; address in buffer, floppy 0
|
||||
!addr code_RTS_02 = $8059 ; - RTS instruction
|
||||
|
||||
!addr RD_ACPTR_helper = $805A ; subroutine in RAM to read a byte
|
||||
!addr F1_ACPTR_helper = $805A ; subroutine in RAM to read a byte
|
||||
!addr code_LDA_03 = $805A ; - LDA instruction
|
||||
!addr RD_ACPTR_PTR = $805B ; - 2 bytes; address in buffer, ram disk
|
||||
!addr F1_ACPTR_PTR = $805B ; - 2 bytes; address in buffer, floppy 1
|
||||
!addr code_RTS_03 = $805D ; - RTS instruction
|
||||
|
||||
!addr XX_ACPTR_LEN = $805E ; 2 bytes - length of data left for ACPTR
|
||||
!addr SD_ACPTR_LEN = $805E ; - SD card
|
||||
!addr FD_ACPTR_LEN = $8060 ; - floppy
|
||||
!addr RD_ACPTR_LEN = $8062 ; - ram disk
|
||||
!addr RD_ACPTR_helper = $805E ; subroutine in RAM to read a byte
|
||||
!addr code_LDA_04 = $805E ; - LDA instruction
|
||||
!addr RD_ACPTR_PTR = $805F ; - 2 bytes; address in buffer, ram disk
|
||||
!addr code_RTS_04 = $8061 ; - RTS instruction
|
||||
|
||||
!addr XX_MODE = $8064 ; current mode (0 = none, 1 = receiving command/file name)
|
||||
!addr SD_MODE = $8064 ; - SD card
|
||||
!addr FD_MODE = $8065 ; - floppy
|
||||
!addr RD_MODE = $8066 ; - ram disk
|
||||
!addr XX_ACPTR_LEN = $8062 ; 2 bytes - length of data left for ACPTR
|
||||
!addr SD_ACPTR_LEN = $8062 ; - SD card
|
||||
!addr F0_ACPTR_LEN = $8064 ; - floppy
|
||||
!addr F1_ACPTR_LEN = $8064 ; - floppy
|
||||
!addr RD_ACPTR_LEN = $8066 ; - ram disk
|
||||
|
||||
!addr XX_CHANNEL = $8067 ; current channel
|
||||
!addr SD_CHANNEL = $8067 ; - SD card
|
||||
!addr FD_CHANNEL = $8068 ; - floppy
|
||||
!addr RD_CHANNEL = $8069 ; - ram disk
|
||||
!addr XX_MODE = $8068 ; current mode (0 = none, 1 = receiving command/file name)
|
||||
!addr SD_MODE = $8068 ; - SD card
|
||||
!addr F0_MODE = $8069 ; - floppy 0
|
||||
!addr F1_MODE = $806A ; - floppy 1
|
||||
!addr RD_MODE = $806B ; - ram disk
|
||||
|
||||
!addr XX_CMDFN_IDX = $806A ; index byte for storing file name/command
|
||||
!addr SD_CMDFN_IDX = $806A ; - SD card
|
||||
!addr FD_CMDFN_IDX = $806B ; - floppy
|
||||
!addr RD_CMDFN_IDX = $806C ; - ram disk
|
||||
!addr XX_CHANNEL = $806C ; current channel
|
||||
!addr SD_CHANNEL = $806C ; - SD card
|
||||
!addr F0_CHANNEL = $806D ; - floppy 0
|
||||
!addr F1_CHANNEL = $806E ; - floppy 0
|
||||
!addr RD_CHANNEL = $806F ; - ram disk
|
||||
|
||||
!addr XX_STATUS_IDX = $806D ; index byte for reading status
|
||||
!addr SD_STATUS_IDX = $806D ; - SD card
|
||||
!addr FD_STATUS_IDX = $806E ; - floppy
|
||||
!addr RD_STATUS_IDX = $806F ; - ram disk
|
||||
!addr XX_CMDFN_IDX = $8070 ; index byte for storing file name/command
|
||||
!addr SD_CMDFN_IDX = $8070 ; - SD card
|
||||
!addr F0_CMDFN_IDX = $8071 ; - floppy 0
|
||||
!addr F1_CMDFN_IDX = $8072 ; - floppy 1
|
||||
!addr RD_CMDFN_IDX = $8073 ; - ram disk
|
||||
|
||||
!addr XX_STATUS_IDX = $8074 ; index byte for reading status
|
||||
!addr SD_STATUS_IDX = $8074 ; - SD card
|
||||
!addr F0_STATUS_IDX = $8075 ; - floppy
|
||||
!addr F1_STATUS_IDX = $8076 ; - floppy
|
||||
!addr RD_STATUS_IDX = $8077 ; - ram disk
|
||||
|
||||
; Various, most likely to be reworked
|
||||
|
||||
!addr SD_DESC = $8070 ; current file descriptor
|
||||
!addr FD_DIRENT = $8071 ; directory entry to read, 0-15
|
||||
!addr SD_DESC = $8078 ; current file descriptor
|
||||
!addr F0_DIRENT = $8079 ; directory entry to read, 0-15
|
||||
!addr F1_DIRENT = $807A ; directory entry to read, 0-15
|
||||
|
||||
!addr FD_LOADTRACK = $8072 ; current track for file loading
|
||||
!addr FD_LOADSECTOR = $8073 ; current sector for file loading
|
||||
!addr F0_LOADTRACK = $807B ; current track for file loading
|
||||
!addr F0_LOADSECTOR = $807C ; current sector for file loading
|
||||
|
||||
; XXX Free space
|
||||
!addr F1_LOADTRACK = $807D ; current track for file loading
|
||||
!addr F1_LOADSECTOR = $807E ; current sector for file loading
|
||||
|
||||
!addr RD_MAXTRACK = $807F ; maximum RAM disk track number of loaded image
|
||||
!addr RD_STARTSEG = $8080 ; RAM disk start address, 2nd most significant byte (or $FF if no RAM)
|
||||
!addr RD_VALIDIMG = $8081 ; $00 = no valid image loaded
|
||||
|
||||
|
||||
; Reserved: $8082-$81FF
|
||||
|
||||
;
|
||||
; Various buffers, caches, and other large memory chunks
|
||||
@@ -128,8 +155,8 @@
|
||||
; General purpose buffers, 512 bytes each, each starts at page start - XXX dynamic alllocation to be written
|
||||
|
||||
!addr SHARED_BUF_0 = $8200 ; XXX temporarily hardcoded for usage by SD card
|
||||
!addr SHARED_BUF_1 = $8400 ; XXX temporarily hardcoded for usage by floppy
|
||||
!addr SHARED_BUF_2 = $8600
|
||||
!addr SHARED_BUF_1 = $8400 ; XXX temporarily hardcoded for usage by floppy 0
|
||||
!addr SHARED_BUF_2 = $8600 ; XXX temporarily hardcoded for usage by floppy 1
|
||||
!addr SHARED_BUF_3 = $8800
|
||||
!addr SHARED_BUF_4 = $8A00
|
||||
!addr SHARED_BUF_5 = $8C00
|
||||
@@ -142,49 +169,51 @@
|
||||
!addr SHARED_BUF_C = $9A00
|
||||
!addr SHARED_BUF_D = $9C00
|
||||
!addr SHARED_BUF_E = $9E00
|
||||
!addr SHARED_BUF_F = $A000
|
||||
|
||||
; BAM cache for floppy drives; 2 KB (4 blocks) each, to cover up to ED floppies
|
||||
|
||||
!addr FD_BAM_CACHE_0 = $A200 ; - floppy disk 0 BAM
|
||||
!addr SHARED_BUF_X0 = $A400 ; - buffer which can be used if disk is not ED
|
||||
!addr FD_BAM_CACHE_1 = $A600 ; - floppy disk 1 BAM
|
||||
!addr SHARED_BUF_X1 = $A800 ; - buffer which can be used if disk is not ED
|
||||
!addr F0_BAM_CACHE = $A000 ; - floppy disk 0 BAM
|
||||
!addr SHARED_BUF_X0 = $A200 ; - buffer which can be used if disk is not ED
|
||||
!addr F1_BAM_CACHE = $A400 ; - floppy disk 1 BAM
|
||||
!addr SHARED_BUF_X1 = $A600 ; - buffer which can be used if disk is not ED
|
||||
|
||||
; Memory shadow, needed for SD card support
|
||||
|
||||
!addr SD_MEMSHADOW_BUF = $AA00 ; 256 byte buffer for preserving original memory content
|
||||
!addr MEMSHADOW_BUF = $A800 ; 256 byte buffer for preserving original memory content
|
||||
|
||||
; Command/filename buffers, 128 bytes each - XXX extend to 256 bytes (change implementation)
|
||||
; Command/filename buffers, 256 bytes each
|
||||
|
||||
!addr SD_CMDFN_BUF = $AB00 ; - SD card
|
||||
!addr FD_CMDFN_BUF = $AC00 ; - floppy
|
||||
!addr SD_CMDFN_BUF = $A900 ; - SD card
|
||||
!addr F0_CMDFN_BUF = $AA00 ; - floppy 0
|
||||
!addr F1_CMDFN_BUF = $AB00 ; - floppy 1
|
||||
!addr RD_CMDFN_BUF = $AD00 ; - ram disk
|
||||
|
||||
; Directory entry buffers, in BASIC format, $30 bytes each
|
||||
|
||||
!addr XX_DIRENT_BUF = $AE00
|
||||
!addr SD_DIRENT_BUF = $AE00 ; - SD card
|
||||
!addr FD_DIRENT_BUF = $AE30 ; - floppy
|
||||
!addr RD_DIRENT_BUF = $AE60 ; - ram disk
|
||||
!addr F0_DIRENT_BUF = $AE30 ; - floppy 0
|
||||
!addr F1_DIRENT_BUF = $AE60 ; - floppy 1
|
||||
!addr RD_DIRENT_BUF = $AE90 ; - ram disk
|
||||
|
||||
; Status buffers, content terminated by 0, $30 bytes each
|
||||
|
||||
!addr XX_STATUS_BUF = $AE90
|
||||
!addr SD_STATUS_BUF = $AE90 ; - SD card
|
||||
!addr FD_STATUS_BUF = $AEC0 ; - floppy
|
||||
!addr RD_STATUS_BUF = $AEF0 ; - ram disk
|
||||
!addr XX_STATUS_BUF = $AEC0
|
||||
!addr SD_STATUS_BUF = $AEC0 ; - SD card
|
||||
!addr F0_STATUS_BUF = $AEF0 ; - floppy 0
|
||||
!addr F1_STATUS_BUF = $AF20 ; - floppy 1
|
||||
!addr RD_STATUS_BUF = $AF50 ; - ram disk
|
||||
|
||||
; Shared buffer metadata tables, 18 bytes each
|
||||
|
||||
!addr BUFTAB_UNIT = $AF20 ; which unit the buffer is assigned to
|
||||
!addr BUFTAB_DEV = $AF32 ; which device within the unit
|
||||
!addr BUFTAB_TRACK = $AF44 ; which track (or other kind of handle)
|
||||
!addr BUFTAB_SECTOR = $AF56 ; which sector is stored in the first half of the buffer
|
||||
!addr BUFTAB_UNIT = $AF50 ; which unit the buffer is assigned to
|
||||
!addr BUFTAB_DEV = $AF62 ; which device within the unit
|
||||
!addr BUFTAB_TRACK = $AF74 ; which track (or other kind of handle)
|
||||
!addr BUFTAB_SECTOR = $AF86 ; which sector is stored in the first half of the buffer
|
||||
|
||||
; Common DMA list, 15 bytes
|
||||
|
||||
!addr DMAJOB_LIST = $AF68
|
||||
!addr DMAJOB_LIST = $AF98
|
||||
!addr DMAJOB_SRC_MB = DMAJOB_LIST+2
|
||||
!addr DMAJOB_DST_MB = DMAJOB_LIST+4
|
||||
!addr DMAJOB_SIZE = DMAJOB_LIST+7 ; keep $0200 here
|
||||
@@ -195,4 +224,4 @@
|
||||
; Reserved 20 KB for floppy track buffers + some area still free
|
||||
;
|
||||
|
||||
!addr XX_REMAINING = $AF87
|
||||
!addr XX_REMAINING = $AFA7
|
||||
@@ -2,6 +2,8 @@
|
||||
; A vector table to integrate DOS with the MEGA65 Kernal
|
||||
|
||||
!word dos_INIT
|
||||
!word dos_PRELOAD
|
||||
!word dos_RDCHK
|
||||
!word dos_UNITCHK
|
||||
!word dos_UNITSET
|
||||
!word dos_UNITNUM
|
||||
|
||||
@@ -59,6 +59,7 @@ dir_types:
|
||||
!pet "d2m", $00 ; CMD FD 2000 / 4000 - disk image (HD)
|
||||
!pet "d4m", $00 ; CMD FD 4000 - disk image (ED)
|
||||
!pet "dhd", $00 ; CMD HD - hard disk image
|
||||
!pet "dnp", $00 ; CMD partition - single partition image
|
||||
!pet "rom", $00 ; rom image
|
||||
!pet "m65", $00 ; MEGA65 utility
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
|
||||
;
|
||||
; File name for the initial RAM disk
|
||||
;
|
||||
|
||||
ramdisk_filename:
|
||||
|
||||
!pet "ramdisk.dnp", 0
|
||||
@@ -12,3 +12,5 @@
|
||||
|
||||
;; #ALIAS# m65_speed_tape_cbdos = KERNAL_0.m65_speed_tape_cbdos
|
||||
;; #ALIAS# m65_speed_restore = KERNAL_0.m65_speed_restore
|
||||
|
||||
;; #ALIAS# wait_x_bars = KERNAL_0.wait_x_bars
|
||||
@@ -26,8 +26,10 @@ dos_INIT:
|
||||
|
||||
lda #CONFIG_UNIT_SDCARD
|
||||
sta UNIT_SDCARD
|
||||
lda #CONFIG_UNIT_FLOPPY
|
||||
sta UNIT_FLOPPY
|
||||
lda #CONFIG_UNIT_FLOPPY0
|
||||
sta UNIT_FLOPPY0
|
||||
lda #CONFIG_UNIT_FLOPPY1
|
||||
sta UNIT_FLOPPY1
|
||||
lda #CONFIG_UNIT_RAMDISK
|
||||
sta UNIT_RAMDISK
|
||||
|
||||
@@ -68,6 +70,7 @@ dos_INIT:
|
||||
sta code_LDA_01
|
||||
sta code_LDA_02
|
||||
sta code_LDA_03
|
||||
sta code_LDA_04
|
||||
|
||||
lda #$B9 ; LDA nnnn, y opcode
|
||||
sta code_LDA_nnnn_Y
|
||||
@@ -77,12 +80,13 @@ dos_INIT:
|
||||
sta code_RTS_02
|
||||
sta code_RTS_03
|
||||
sta code_RTS_04
|
||||
sta code_RTS_05
|
||||
|
||||
; Initialize device handlers
|
||||
|
||||
jsr unit_sd_init
|
||||
jsr unit_fd_init
|
||||
jsr unit_rd_init
|
||||
jsr card_sd_init
|
||||
jsr disk_fd_init
|
||||
jsr disk_rd_init
|
||||
|
||||
; Safer version of 'dos_EXIT' - does not affect speed related registers
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@ dos_MEMCHK:
|
||||
bne @fail
|
||||
cmp code_LDA_03
|
||||
bne @fail
|
||||
cmp code_LDA_04
|
||||
bne @fail
|
||||
|
||||
lda #$60
|
||||
cmp code_RTS_01
|
||||
@@ -36,6 +38,10 @@ dos_MEMCHK:
|
||||
bne @fail
|
||||
cmp code_RTS_03
|
||||
bne @fail
|
||||
cmp code_RTS_04
|
||||
bne @fail
|
||||
cmp code_RTS_05
|
||||
bne @fail
|
||||
|
||||
plx
|
||||
pla
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
|
||||
;
|
||||
; Preload RAM disk image
|
||||
;
|
||||
|
||||
|
||||
dos_PRELOAD:
|
||||
|
||||
; Before the start make sure memory content is not damaged
|
||||
|
||||
jsr dos_MEMCHK
|
||||
bcc @ok
|
||||
rts
|
||||
@ok:
|
||||
jsr dos_ENTER
|
||||
jsr disk_rd_preload
|
||||
jmp dos_EXIT_CLC
|
||||
@@ -0,0 +1,24 @@
|
||||
|
||||
;
|
||||
; Preload RAM disk image
|
||||
;
|
||||
|
||||
|
||||
dos_RDCHK:
|
||||
|
||||
; Before the start make sure memory content is not damaged
|
||||
|
||||
jsr dos_MEMCHK
|
||||
bcc @ok
|
||||
lda #$FF
|
||||
jmp dos_EXIT_SEC_A
|
||||
|
||||
@ok:
|
||||
jsr dos_ENTER
|
||||
|
||||
lda RD_MSG
|
||||
|
||||
ldx #$FF ; reset the message after it gets displayed
|
||||
stx RD_MSG
|
||||
|
||||
jmp dos_EXIT_CLC_A
|
||||
@@ -18,8 +18,10 @@ dos_UNITCHK:
|
||||
|
||||
cmp UNIT_SDCARD
|
||||
beq dos_UNITCHK_sdcard
|
||||
cmp UNIT_FLOPPY
|
||||
beq dos_UNITCHK_floppy
|
||||
cmp UNIT_FLOPPY0
|
||||
beq dos_UNITCHK_floppy0
|
||||
cmp UNIT_FLOPPY1
|
||||
beq dos_UNITCHK_floppy1
|
||||
cmp UNIT_RAMDISK
|
||||
beq dos_UNITCHK_ramdisk
|
||||
|
||||
@@ -36,15 +38,22 @@ dos_UNITCHK_sdcard:
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
dos_UNITCHK_floppy:
|
||||
dos_UNITCHK_floppy0:
|
||||
|
||||
lda #$01
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
dos_UNITCHK_ramdisk:
|
||||
dos_UNITCHK_floppy1:
|
||||
|
||||
lda #$02
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
dos_UNITCHK_ramdisk:
|
||||
|
||||
lda #$03
|
||||
|
||||
jmp dos_EXIT_CLC_A
|
||||
@@ -20,8 +20,10 @@ dos_UNITNUM:
|
||||
cmp #$00
|
||||
beq dos_UNITNUM_sdcard
|
||||
cmp #$01
|
||||
beq dos_UNITNUM_floppy
|
||||
beq dos_UNITNUM_floppy0
|
||||
cmp #$02
|
||||
beq dos_UNITNUM_floppy1
|
||||
cmp #$03
|
||||
beq dos_UNITNUM_ramdisk
|
||||
|
||||
; FALLTROUGH
|
||||
@@ -37,9 +39,14 @@ dos_UNITNUM_sdcard:
|
||||
lda UNIT_SDCARD
|
||||
bra dos_UNITNUM_common
|
||||
|
||||
dos_UNITNUM_floppy:
|
||||
dos_UNITNUM_floppy0:
|
||||
|
||||
lda UNIT_FLOPPY
|
||||
lda UNIT_FLOPPY0
|
||||
bra dos_UNITNUM_common
|
||||
|
||||
dos_UNITNUM_floppy1:
|
||||
|
||||
lda UNIT_FLOPPY1
|
||||
bra dos_UNITNUM_common
|
||||
|
||||
dos_UNITNUM_ramdisk:
|
||||
|
||||
+22
-12
@@ -14,36 +14,46 @@ dos_UNITSET:
|
||||
@ok:
|
||||
jsr dos_ENTER
|
||||
|
||||
; XXX do not allow illegal device numbers... above 30 or below 8 ?
|
||||
; XXX do not allow illegal device numbers (above 30 or below 8)
|
||||
|
||||
; Check what kind of device was requested
|
||||
|
||||
cmp #$00
|
||||
beq dos_UNITSET_sdcard
|
||||
; XXX devices below are not implemented yet
|
||||
; cmp #$01
|
||||
; beq dos_UNITSET_floppy
|
||||
; cmp #$02
|
||||
; beq dos_UNITSET_ramdisk
|
||||
cmp #$01
|
||||
beq dos_UNITSET_floppy0
|
||||
cmp #$02
|
||||
beq dos_UNITSET_floppy1
|
||||
cmp #$03
|
||||
beq dos_UNITSET_ramdisk
|
||||
|
||||
jmp dos_EXIT_SEC
|
||||
|
||||
dos_UNITSET_sdcard:
|
||||
|
||||
stx UNIT_SDCARD
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
dos_UNITSET_floppy:
|
||||
dos_UNITSET_end:
|
||||
|
||||
stx UNIT_FLOPPY
|
||||
+skip_2_bytes_trash_nvz
|
||||
jmp dos_EXIT_CLC
|
||||
|
||||
; FALLTROUGH
|
||||
dos_UNITSET_floppy0:
|
||||
|
||||
stx UNIT_FLOPPY0
|
||||
bra dos_UNITSET_end
|
||||
|
||||
dos_UNITSET_floppy1:
|
||||
|
||||
stx UNIT_FLOPPY1
|
||||
bra dos_UNITSET_end
|
||||
|
||||
dos_UNITSET_ramdisk:
|
||||
|
||||
stx UNIT_RAMDISK
|
||||
|
||||
jmp dos_EXIT_CLC
|
||||
; Clear RAM disk device number if no Hyper RAM available
|
||||
|
||||
jsr util_check_rd_ram
|
||||
jmp dos_EXIT
|
||||
@@ -6,13 +6,15 @@
|
||||
|
||||
dos_cmd_OPEN_vectab:
|
||||
|
||||
!word unit_sd_cmd_OPEN
|
||||
!word unit_fd_cmd_OPEN
|
||||
!word unit_rd_cmd_OPEN
|
||||
!word card_sd_cmd_OPEN
|
||||
!word disk_xx_cmd_OPEN
|
||||
!word disk_xx_cmd_OPEN
|
||||
!word disk_xx_cmd_OPEN
|
||||
|
||||
|
||||
dos_cmd_CLOSE_vectab:
|
||||
|
||||
!word unit_sd_cmd_CLOSE
|
||||
!word unit_fd_cmd_CLOSE
|
||||
!word unit_rd_cmd_CLOSE
|
||||
!word card_sd_cmd_CLOSE
|
||||
!word disk_fd_cmd_CLOSE
|
||||
!word disk_fd_cmd_CLOSE
|
||||
!word disk_rd_cmd_CLOSE
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
fs_cbm_nextdirentry:
|
||||
|
||||
lda FD_DIRENT
|
||||
lda F0_DIRENT
|
||||
|
||||
; If first entry within sector - make sure it is present within the buffer
|
||||
|
||||
@@ -42,7 +42,7 @@ fs_cbm_nextdirentry:
|
||||
@1:
|
||||
; Set next directory entry
|
||||
|
||||
inc FD_DIRENT
|
||||
inc F0_DIRENT
|
||||
|
||||
; Copy data to parameter variables
|
||||
|
||||
@@ -69,10 +69,10 @@ fs_cbm_nextdirentry:
|
||||
|
||||
ldy #$03 ; get file starting track and sector
|
||||
jsr code_LDA_nnnn_Y
|
||||
sta FD_LOADTRACK
|
||||
sta F0_LOADTRACK
|
||||
iny
|
||||
jsr code_LDA_nnnn_Y
|
||||
sta FD_LOADSECTOR
|
||||
sta F0_LOADSECTOR
|
||||
|
||||
iny ; copy the file name
|
||||
@lp1:
|
||||
@@ -115,7 +115,7 @@ fs_cbm_nextdirentry:
|
||||
|
||||
@get_sector_common:
|
||||
|
||||
jsr lowlevel_readsector ; XXX handle read errors
|
||||
jsr lowlevel_xx_readsector ; XXX handle read errors
|
||||
|
||||
; Set new FD_DIRENT
|
||||
|
||||
@@ -124,7 +124,7 @@ fs_cbm_nextdirentry:
|
||||
beq @2
|
||||
lda #$08
|
||||
@2:
|
||||
sta FD_DIRENT
|
||||
sta F0_DIRENT
|
||||
jmp @cont
|
||||
|
||||
@end_of_dir:
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
;
|
||||
|
||||
|
||||
; XXX add support for both floppies
|
||||
|
||||
fs_cbm_nextfileblock:
|
||||
|
||||
; Fetch the next track/sector
|
||||
@@ -50,19 +52,19 @@ fs_cbm_nextfileblock_got_ts:
|
||||
|
||||
; Load next track/sector
|
||||
|
||||
jsr lowlevel_readsector ; XXX handle read errors
|
||||
jsr lowlevel_xx_readsector ; XXX handle read errors
|
||||
|
||||
; Store pointer and amount of data ready to fetch
|
||||
|
||||
lda #$FE
|
||||
sta FD_ACPTR_LEN+0
|
||||
sta F0_ACPTR_LEN+0
|
||||
lda #$00
|
||||
sta FD_ACPTR_LEN+1
|
||||
sta F0_ACPTR_LEN+1
|
||||
|
||||
lda #$02
|
||||
sta FD_ACPTR_PTR+0
|
||||
sta F0_ACPTR_PTR+0
|
||||
lda #>SHARED_BUF_1
|
||||
sta FD_ACPTR_PTR+1
|
||||
sta F0_ACPTR_PTR+1
|
||||
|
||||
lda PAR_SECTOR
|
||||
and #$01
|
||||
@@ -84,7 +86,7 @@ fs_cbm_nextfileblock_got_ts:
|
||||
|
||||
; Sector with data is located in the 2nd half of the buffer
|
||||
|
||||
inc FD_ACPTR_PTR+1
|
||||
inc F0_ACPTR_PTR+1
|
||||
|
||||
lda SHARED_BUF_1+$100+0
|
||||
bne @exit
|
||||
@@ -99,7 +101,7 @@ fs_cbm_nextfileblock_got_ts:
|
||||
cmp #$FF
|
||||
beq fs_cbm_nextfileblock_eof
|
||||
|
||||
sta FD_ACPTR_LEN+0
|
||||
sta F0_ACPTR_LEN+0
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
|
||||
@@ -13,63 +13,63 @@ fs_cbm_read_dir_open:
|
||||
lda #$00
|
||||
sta PAR_SECTOR
|
||||
|
||||
jsr lowlevel_readsector ; XXX handle read errors
|
||||
jsr lowlevel_xx_readsector ; XXX handle read errors
|
||||
|
||||
; Create the first directory listing entry (title, id)
|
||||
|
||||
ldx #$1F ; first fetch the template
|
||||
@lp1:
|
||||
lda dir_hdr,x
|
||||
sta FD_DIRENT_BUF,x
|
||||
sta F0_DIRENT_BUF,x
|
||||
dex
|
||||
bpl @lp1
|
||||
|
||||
ldx #$0F ; file name
|
||||
@lp2:
|
||||
lda SHARED_BUF_1+$04,x
|
||||
sta FD_DIRENT_BUF+$08,x
|
||||
sta F0_DIRENT_BUF+$08,x
|
||||
dex
|
||||
bpl @lp2
|
||||
|
||||
lda SHARED_BUF_1+$16 ; disk ID XXX test this on a disk with ID
|
||||
cmp #$A0
|
||||
beq @skip1
|
||||
sta FD_DIRENT_BUF+$1A
|
||||
sta F0_DIRENT_BUF+$1A
|
||||
@skip1:
|
||||
lda SHARED_BUF_1+$17
|
||||
cmp #$A0
|
||||
beq @skip2
|
||||
sta FD_DIRENT_BUF+$1B
|
||||
sta F0_DIRENT_BUF+$1B
|
||||
@skip2:
|
||||
|
||||
lda SHARED_BUF_1+$19 ; dos version
|
||||
sta FD_DIRENT_BUF+$1D
|
||||
sta F0_DIRENT_BUF+$1D
|
||||
lda SHARED_BUF_1+$1A
|
||||
sta FD_DIRENT_BUF+$1E
|
||||
sta F0_DIRENT_BUF+$1E
|
||||
|
||||
; Provide pointer to the header
|
||||
|
||||
lda #$20
|
||||
sta FD_ACPTR_LEN+0
|
||||
sta F0_ACPTR_LEN+0
|
||||
lda #$00
|
||||
sta FD_ACPTR_LEN+1
|
||||
sta F0_ACPTR_LEN+1
|
||||
|
||||
lda #<FD_DIRENT_BUF
|
||||
sta FD_ACPTR_PTR+0
|
||||
lda #>FD_DIRENT_BUF
|
||||
sta FD_ACPTR_PTR+1
|
||||
lda #<F0_DIRENT_BUF
|
||||
sta F0_ACPTR_PTR+0
|
||||
lda #>F0_DIRENT_BUF
|
||||
sta F0_ACPTR_PTR+1
|
||||
|
||||
; Set directory phase to 'file name'
|
||||
|
||||
lda #$01
|
||||
sta FD_DIR_PHASE
|
||||
sta F0_DIR_PHASE
|
||||
|
||||
; Copy 1st BAM sector to the cache
|
||||
|
||||
ldx #$00
|
||||
@lp3:
|
||||
lda SHARED_BUF_1+$100, x
|
||||
sta FD_BAM_CACHE_0,x
|
||||
sta F0_BAM_CACHE,x
|
||||
inx
|
||||
bne @lp3
|
||||
|
||||
@@ -78,21 +78,21 @@ fs_cbm_read_dir_open:
|
||||
lda #$02
|
||||
sta PAR_SECTOR
|
||||
|
||||
jsr lowlevel_readsector ; XXX handle read errors
|
||||
jsr lowlevel_xx_readsector ; XXX handle read errors
|
||||
|
||||
; Copy 2nd BAM sector to the cache
|
||||
|
||||
ldx #$00
|
||||
@lp4:
|
||||
lda SHARED_BUF_1, x
|
||||
sta FD_BAM_CACHE_0+$100,x
|
||||
sta F0_BAM_CACHE+$100,x
|
||||
inx
|
||||
bne @lp4
|
||||
|
||||
; Set variables to point to the 1st directory entry in the 2nd sector of the buffer
|
||||
|
||||
lda #$08
|
||||
sta FD_DIRENT
|
||||
sta F0_DIRENT
|
||||
|
||||
; Make sure the 1st sector in buffer points to 2nd one
|
||||
|
||||
@@ -117,22 +117,22 @@ fs_cbm_read_dir:
|
||||
; Prepare output entry, starting from XX_DIRENT_BUF + initial offset
|
||||
|
||||
jsr util_dir_filesize_blocks
|
||||
ldx #(FD_DIRENT_BUF - XX_DIRENT_BUF)
|
||||
ldx #(F0_DIRENT_BUF - XX_DIRENT_BUF)
|
||||
ldx #$30
|
||||
jsr util_dir_basic
|
||||
|
||||
; Provide pointers and length
|
||||
|
||||
sta FD_ACPTR_LEN+1
|
||||
sta F0_ACPTR_LEN+1
|
||||
txa
|
||||
sec
|
||||
sbc #$30
|
||||
sta FD_ACPTR_LEN+0
|
||||
sta F0_ACPTR_LEN+0
|
||||
|
||||
lda #<(FD_DIRENT_BUF)
|
||||
sta FD_ACPTR_PTR+0
|
||||
lda #>(FD_DIRENT_BUF)
|
||||
sta FD_ACPTR_PTR+1
|
||||
lda #<(F0_DIRENT_BUF)
|
||||
sta F0_ACPTR_PTR+0
|
||||
lda #>(F0_DIRENT_BUF)
|
||||
sta F0_ACPTR_PTR+1
|
||||
clc
|
||||
rts
|
||||
|
||||
@@ -143,7 +143,7 @@ fs_cbm_read_dir_blocksfree:
|
||||
ldx #$13
|
||||
@lp1:
|
||||
lda dir_end, x
|
||||
sta FD_DIRENT_BUF, x
|
||||
sta F0_DIRENT_BUF, x
|
||||
dex
|
||||
bpl @lp1
|
||||
|
||||
@@ -151,11 +151,11 @@ fs_cbm_read_dir_blocksfree:
|
||||
|
||||
ldx #$10
|
||||
@lp2:
|
||||
lda FD_BAM_CACHE_0+$100,x
|
||||
lda F0_BAM_CACHE+$100,x
|
||||
jsr @sub_free_add
|
||||
cpx #$FA
|
||||
beq @lp2_end
|
||||
lda FD_BAM_CACHE_0+$000,x
|
||||
lda F0_BAM_CACHE+$000,x
|
||||
jsr @sub_free_add
|
||||
inx
|
||||
inx
|
||||
@@ -170,19 +170,19 @@ fs_cbm_read_dir_blocksfree:
|
||||
; Set pointer and length
|
||||
|
||||
lda #$13
|
||||
sta FD_ACPTR_LEN+0
|
||||
sta F0_ACPTR_LEN+0
|
||||
lda #$00
|
||||
sta FD_ACPTR_LEN+1
|
||||
sta F0_ACPTR_LEN+1
|
||||
|
||||
lda #<FD_DIRENT_BUF
|
||||
sta FD_ACPTR_PTR+0
|
||||
lda #>FD_DIRENT_BUF
|
||||
sta FD_ACPTR_PTR+1
|
||||
lda #<F0_DIRENT_BUF
|
||||
sta F0_ACPTR_PTR+0
|
||||
lda #>F0_DIRENT_BUF
|
||||
sta F0_ACPTR_PTR+1
|
||||
|
||||
; Mark end of directory
|
||||
|
||||
lda #$00
|
||||
sta FD_DIR_PHASE
|
||||
sta F0_DIR_PHASE
|
||||
|
||||
clc
|
||||
rts
|
||||
@@ -193,9 +193,9 @@ fs_cbm_read_dir_blocksfree:
|
||||
; Helper routine to calculate free blocks
|
||||
|
||||
clc
|
||||
adc FD_DIRENT_BUF+2
|
||||
sta FD_DIRENT_BUF+2
|
||||
adc F0_DIRENT_BUF+2
|
||||
sta F0_DIRENT_BUF+2
|
||||
bcc @noinc
|
||||
inc FD_DIRENT_BUF+3
|
||||
inc F0_DIRENT_BUF+3
|
||||
@noinc:
|
||||
rts
|
||||
@@ -13,12 +13,12 @@ fs_cbm_read_file_open:
|
||||
lda #$03
|
||||
sta PAR_SECTOR
|
||||
|
||||
jsr lowlevel_readsector ; XXX handle read errors
|
||||
jsr lowlevel_xx_readsector ; XXX handle read errors
|
||||
|
||||
; Set variables to point to the 1st directory entry in the 2nd sector of the buffer
|
||||
|
||||
lda #$08
|
||||
sta FD_DIRENT
|
||||
sta F0_DIRENT
|
||||
|
||||
; Make sure the 1st sector in buffer points to 2nd one
|
||||
|
||||
@@ -51,11 +51,11 @@ fs_cbm_read_file_open:
|
||||
; Found the file, load it
|
||||
|
||||
lda #$03 ; mode: read file
|
||||
sta FD_MODE
|
||||
sta F0_MODE
|
||||
|
||||
lda FD_LOADTRACK
|
||||
lda F0_LOADTRACK
|
||||
sta PAR_TRACK
|
||||
lda FD_LOADSECTOR
|
||||
lda F0_LOADSECTOR
|
||||
sta PAR_SECTOR
|
||||
|
||||
jmp fs_cbm_nextfileblock_got_ts
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
; Fills-in: PAR_FNAME, PAR_FTYPE, PAR_FSIZE_BYTES
|
||||
|
||||
; NOTE: overrides page pointed by FS_HVSR_DIRENT!
|
||||
; NOTE: overrides page pointed by MEM_BUF!
|
||||
|
||||
|
||||
fs_vfs_nextdirentry:
|
||||
@@ -18,18 +18,16 @@ fs_vfs_nextdirentry:
|
||||
|
||||
@lpclear:
|
||||
|
||||
sta FS_HVSR_DIRENT, x
|
||||
sta MEM_BUF, x
|
||||
inx
|
||||
bne @lpclear
|
||||
|
||||
; Ask the hypervisor to read the next dirent structure
|
||||
|
||||
ldx SD_DESC ; directory descriptor XXX rename to FS_HVSR_DESC
|
||||
ldy #>FS_HVSR_DIRENT ; target page number
|
||||
ldy #>MEM_BUF ; target page number
|
||||
|
||||
lda #$14 ; dos_readdir
|
||||
sta HTRAP00
|
||||
+nop
|
||||
jsr util_htrap_dos_readddir
|
||||
|
||||
+bcc @fail
|
||||
|
||||
@@ -44,7 +42,7 @@ fs_vfs_nextdirentry:
|
||||
; Preprocess/validate the filename
|
||||
;
|
||||
|
||||
ldx FS_HVSR_DIRENT+$40 ; file name length
|
||||
ldx MEM_BUF+$40 ; file name length
|
||||
beq fs_vfs_nextdirentry ; do not even try for empty file name
|
||||
cpx #20
|
||||
bcs fs_vfs_nextdirentry ; if longer than 16 characters + dot + extension - also skip this one
|
||||
@@ -52,7 +50,7 @@ fs_vfs_nextdirentry:
|
||||
|
||||
@lpname:
|
||||
|
||||
lda FS_HVSR_DIRENT,x
|
||||
lda MEM_BUF,x
|
||||
cmp #$22
|
||||
beq fs_vfs_nextdirentry ; quotation mark is illegal
|
||||
cmp #$2A
|
||||
@@ -79,7 +77,7 @@ fs_vfs_nextdirentry:
|
||||
|
||||
@lpname_store_next:
|
||||
|
||||
sta FS_HVSR_DIRENT,x ; use this when file name has to be adapted
|
||||
sta MEM_BUF,x ; use this when file name has to be adapted
|
||||
|
||||
@lpname_next:
|
||||
|
||||
@@ -90,7 +88,7 @@ fs_vfs_nextdirentry:
|
||||
; Determine type (file/directory)
|
||||
;
|
||||
|
||||
lda FS_HVSR_DIRENT+$56
|
||||
lda MEM_BUF+$56
|
||||
tax
|
||||
and #$FE
|
||||
beq @entity_file ; workaround for older hypervisors
|
||||
@@ -106,7 +104,7 @@ fs_vfs_nextdirentry:
|
||||
|
||||
; Once again validate the name length, with more precise information
|
||||
|
||||
lda FS_HVSR_DIRENT+$40
|
||||
lda MEM_BUF+$40
|
||||
cmp #$11
|
||||
bcs fs_vfs_nextdirentry ; skip entry if file name longer than 16 characters
|
||||
|
||||
@@ -119,17 +117,17 @@ fs_vfs_nextdirentry:
|
||||
|
||||
; Once again validate the name length, with more precise information
|
||||
|
||||
lda FS_HVSR_DIRENT+$40
|
||||
lda MEM_BUF+$40
|
||||
sec
|
||||
sbc #$04 ; strip 4 bytes - for dot and extension
|
||||
bmi fs_vfs_nextdirentry ; if name too short, try next entry
|
||||
beq fs_vfs_nextdirentry ; if name too short, try next entry
|
||||
sta FS_HVSR_DIRENT+$40 ; store corrected file name length
|
||||
sta MEM_BUF+$40 ; store corrected file name length
|
||||
tax
|
||||
|
||||
; Make sure there is a dot marking the start of a 3-byte extension
|
||||
|
||||
lda FS_HVSR_DIRENT, x
|
||||
lda MEM_BUF, x
|
||||
cmp #$2E
|
||||
+bne fs_vfs_nextdirentry
|
||||
|
||||
@@ -142,15 +140,15 @@ fs_vfs_nextdirentry:
|
||||
|
||||
@lpext:
|
||||
|
||||
lda FS_HVSR_DIRENT+0, x
|
||||
lda MEM_BUF+0, x
|
||||
cmp dir_types+0, y
|
||||
bne @lpext_next
|
||||
|
||||
lda FS_HVSR_DIRENT+1, x
|
||||
lda MEM_BUF+1, x
|
||||
cmp dir_types+1, y
|
||||
bne @lpext_next
|
||||
|
||||
lda FS_HVSR_DIRENT+2, x
|
||||
lda MEM_BUF+2, x
|
||||
cmp dir_types+2, y
|
||||
beq @lpext_found
|
||||
|
||||
@@ -185,7 +183,7 @@ fs_vfs_nextdirentry:
|
||||
ora #$80 ; mark the file as closed, FAT32 does not have a 'not closed' attribute
|
||||
sta PAR_FTYPE
|
||||
|
||||
lda FS_HVSR_DIRENT+$56 ; also apply read-only attribute from FAT32
|
||||
lda MEM_BUF+$56 ; also apply read-only attribute from FAT32
|
||||
and #$01
|
||||
beq @copy_size
|
||||
|
||||
@@ -201,7 +199,7 @@ fs_vfs_nextdirentry:
|
||||
|
||||
@lpsize:
|
||||
|
||||
lda FS_HVSR_DIRENT+$52,x ; copy file size in byytes
|
||||
lda MEM_BUF+$52,x ; copy file size in byytes
|
||||
sta PAR_FSIZE_BYTES,x
|
||||
dex
|
||||
bpl @lpsize
|
||||
@@ -215,9 +213,9 @@ fs_vfs_nextdirentry:
|
||||
|
||||
@lpname_cpy:
|
||||
|
||||
cpx FS_HVSR_DIRENT+$40
|
||||
cpx MEM_BUF+$40
|
||||
bcs @lpname_fill
|
||||
lda FS_HVSR_DIRENT, x
|
||||
lda MEM_BUF, x
|
||||
|
||||
@lpname_fill:
|
||||
|
||||
|
||||
@@ -9,9 +9,7 @@ fs_vfs_nextfileblock:
|
||||
; Read chunk of data to SD card buffer
|
||||
|
||||
ldx SD_DESC
|
||||
lda #$1A ; dos_readfile
|
||||
sta HTRAP00
|
||||
+nop
|
||||
jsr util_htrap_dos_readfile
|
||||
|
||||
; XXX check error code
|
||||
|
||||
@@ -26,9 +24,7 @@ fs_vfs_nextfileblock:
|
||||
ora SD_ACPTR_LEN+0
|
||||
bne @copy
|
||||
|
||||
lda #$20 ; dos_closefile
|
||||
sta HTRAP00
|
||||
+nop
|
||||
jsr util_htrap_dos_closefile
|
||||
|
||||
lda #$00
|
||||
sec
|
||||
@@ -66,12 +62,10 @@ fs_vfs_nextfileblock:
|
||||
|
||||
fs_vfs_file_not_found:
|
||||
|
||||
jsr fs_vfs_direntmem_restore ; restore $1000 memory content
|
||||
jsr util_shadow_restore ; restore MEM_BUF memory content
|
||||
|
||||
ldx SD_DESC
|
||||
lda #$16 ; dos_closedir
|
||||
sta HTRAP00
|
||||
+nop
|
||||
jsr util_htrap_dos_closedir
|
||||
|
||||
lda #39 ; file not found error
|
||||
jsr util_status_SD
|
||||
|
||||
@@ -8,9 +8,7 @@ fs_vfs_read_dir_open:
|
||||
|
||||
; Open the directory
|
||||
|
||||
lda #$12 ; dos_opendir
|
||||
sta HTRAP00
|
||||
+nop
|
||||
jsr util_htrap_dos_opendir
|
||||
|
||||
; XXX handle read errors
|
||||
|
||||
@@ -46,12 +44,11 @@ fs_vfs_read_dir_open:
|
||||
|
||||
fs_vfs_read_dir:
|
||||
|
||||
; Read dirent structure into $1000, process it, restore the memory content.
|
||||
; Starting at $1000 VIC sees chargen, so this should be a safe place
|
||||
; Read dirent structure into MEM_BUF, process it, restore the memory content.
|
||||
|
||||
jsr fs_vfs_direntmem_prepare
|
||||
jsr util_shadow
|
||||
jsr fs_vfs_nextdirentry
|
||||
jsr fs_vfs_direntmem_restore ; processor status is preserved
|
||||
jsr util_shadow_restore ; processor status is preserved
|
||||
|
||||
; If nothing to read, output 'blocks free'
|
||||
|
||||
@@ -106,40 +103,7 @@ fs_vfs_read_dir_blocksfree:
|
||||
; Close the directory within the hypervisor XXX maybe move it to close routine
|
||||
|
||||
ldx SD_DESC
|
||||
lda #$16 ; dos_closedir
|
||||
sta HTRAP00
|
||||
+nop
|
||||
jsr util_htrap_dos_closedir
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
;
|
||||
; Helper routines
|
||||
;
|
||||
|
||||
fs_vfs_direntmem_prepare:
|
||||
|
||||
ldx #$00
|
||||
@1:
|
||||
ldy $1000, x
|
||||
sty SD_MEMSHADOW_BUF, x
|
||||
inx
|
||||
bne @1
|
||||
|
||||
rts
|
||||
|
||||
fs_vfs_direntmem_restore:
|
||||
|
||||
php
|
||||
|
||||
ldx #$00
|
||||
@1:
|
||||
ldy SD_MEMSHADOW_BUF, x
|
||||
sty $1000, x
|
||||
inx
|
||||
bne @1
|
||||
|
||||
bne @1
|
||||
|
||||
plp
|
||||
rts
|
||||
@@ -25,10 +25,9 @@ fs_vfs_read_file_open:
|
||||
|
||||
; XXX deduplicate part above with opening directory
|
||||
|
||||
; Read dirent structures into $1000, find the first matching file
|
||||
; Starting at $1000 VIC sees chargen, so this should be a safe place
|
||||
; Read dirent structures into MEM_BUF, find the first matching file
|
||||
|
||||
jsr fs_vfs_direntmem_prepare
|
||||
jsr util_shadow
|
||||
|
||||
@lp_find:
|
||||
|
||||
@@ -49,11 +48,9 @@ fs_vfs_read_file_open:
|
||||
|
||||
; Found the file - load it
|
||||
|
||||
jsr fs_vfs_direntmem_restore ; restore $1000 memory content
|
||||
jsr util_shadow_restore ; restore MEM_BUF memory content
|
||||
|
||||
lda #$18 ; dos_openfile
|
||||
sta HTRAP00
|
||||
+nop
|
||||
jsr util_htrap_dos_openfile
|
||||
|
||||
; XXX check error code
|
||||
|
||||
|
||||
+56
-28
@@ -1,38 +1,56 @@
|
||||
|
||||
; Read a sector pair from a block device
|
||||
; Read a sector pair from a block device, flow partially based on:
|
||||
; - https://github.com/MEGA65/mega65-tools/blob/master/src/tests/floppytest.c
|
||||
|
||||
|
||||
lowlevel_readsector:
|
||||
lowlevel_xx_readsector:
|
||||
|
||||
; XXX compare device and unit too
|
||||
ldx PAR_FSINSTANCE
|
||||
+beq lowlevel_rd_readsector
|
||||
|
||||
; Check if buffer contains data from given track
|
||||
; FALLTROUGH
|
||||
|
||||
lowlevel_fd_readsector:
|
||||
|
||||
; Check if buffer contains data from given track, sector, drive
|
||||
|
||||
lda PAR_TRACK
|
||||
cmp BUFTAB_TRACK+1
|
||||
bne lowlevel_readsector_force
|
||||
|
||||
; Check if sectors match
|
||||
bne lowlevel_fd_readsector_force
|
||||
|
||||
lda PAR_SECTOR
|
||||
and #%11111110
|
||||
cmp BUFTAB_SECTOR+1
|
||||
bne lowlevel_readsector_force
|
||||
bne lowlevel_fd_readsector_force
|
||||
|
||||
; XXX compare drive
|
||||
|
||||
; Data already loaded into buffer - do nothing
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
lowlevel_readsector_force:
|
||||
lowlevel_fd_readsector_force:
|
||||
|
||||
; Select FDD sector as buffer
|
||||
; Set drive, motor ON
|
||||
|
||||
lda #%10000000 ; select floppy buffer
|
||||
lda #$68
|
||||
cpx #$01
|
||||
beq @1
|
||||
inc
|
||||
@1:
|
||||
sta FDC_CONTROL ; $D080
|
||||
|
||||
; Select floppy buffer
|
||||
|
||||
lda #%10000000
|
||||
trb SD_BUFCTL ; $D689
|
||||
|
||||
lda #%00001111 ; set drive 0 (internal) and side 0
|
||||
trb FDC_CONTROL ; $D080
|
||||
; Wait until BUSY flag clears
|
||||
|
||||
@2:
|
||||
lda FDC_STATUS_A ; $D082
|
||||
bmi @2
|
||||
|
||||
; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR
|
||||
|
||||
@@ -65,30 +83,30 @@ lowlevel_readsector_force:
|
||||
inc
|
||||
sta FDC_SECTOR ; $D085
|
||||
|
||||
; Reset buffers
|
||||
|
||||
lda #$00
|
||||
sta FDC_COMMAND ; $D081
|
||||
|
||||
; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.?
|
||||
|
||||
lda #$40
|
||||
sta FDC_COMMAND ; $D081
|
||||
|
||||
; Wait for RDREQ (indicates sector found)
|
||||
; Wait for busy flag to assert XXX how much? 1 second? most likelly too much...
|
||||
|
||||
@lp1:
|
||||
lda FDC_STATUS_B ; $D083
|
||||
bpl @lp1
|
||||
ldy #71
|
||||
@3:
|
||||
ldx #$00
|
||||
jsr wait_x_bars
|
||||
dey
|
||||
bne @3
|
||||
|
||||
; Wait for BUSY flag to clear
|
||||
; Wait until BUSY flag clears
|
||||
|
||||
@lp2:
|
||||
@4:
|
||||
lda FDC_STATUS_A ; $D082
|
||||
bmi @lp2
|
||||
|
||||
; Wait for DRQ and EQ flags to go high
|
||||
|
||||
@lp3:
|
||||
lda FDC_STATUS_A ; $D082
|
||||
and #%01100000
|
||||
cmp #%01000000 ; XXX is this correct? .A seems to stay at $40 at this point
|
||||
bne @lp3
|
||||
bmi @4
|
||||
|
||||
; Copy sector to buffer in RAM
|
||||
|
||||
@@ -115,3 +133,13 @@ lowlevel_readsector_force:
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
|
||||
|
||||
lowlevel_fd_motor_off:
|
||||
|
||||
; XXX set correct drive
|
||||
|
||||
lda #$00
|
||||
sta FDC_CONTROL ; $D080
|
||||
rts
|
||||
@@ -0,0 +1,7 @@
|
||||
|
||||
; Read a sector pair from a RAM disk
|
||||
|
||||
|
||||
lowlevel_rd_readsector:
|
||||
|
||||
; XXX provide implementation
|
||||
@@ -13,6 +13,10 @@ msg_ACPTR:
|
||||
ldx IDX1_TALKER
|
||||
+bmi msg_ACPTR_fail_no_talker
|
||||
|
||||
; Set file system instance
|
||||
|
||||
stx PAR_FSINSTANCE
|
||||
|
||||
; Check if active channel is status one
|
||||
|
||||
lda XX_CHANNEL, X
|
||||
@@ -56,45 +60,75 @@ msg_ACPTR_read_SD:
|
||||
|
||||
ora SD_ACPTR_LEN+1
|
||||
bne @3
|
||||
jsr unit_sd_cmd_READ
|
||||
jsr card_sd_cmd_READ
|
||||
bcc @3
|
||||
jsr kernalstatus_EOI
|
||||
@3:
|
||||
jmp dos_EXIT_CLC
|
||||
|
||||
msg_ACPTR_read_FD:
|
||||
msg_ACPTR_read_F0:
|
||||
|
||||
; Read and return one byte
|
||||
|
||||
jsr FD_ACPTR_helper
|
||||
jsr F0_ACPTR_helper
|
||||
sta TBTCNT
|
||||
sta REG_A
|
||||
|
||||
; Increment pointer, decrement length
|
||||
|
||||
inc FD_ACPTR_PTR+0
|
||||
inc F0_ACPTR_PTR+0
|
||||
bne @1
|
||||
inc FD_ACPTR_PTR+1
|
||||
inc F0_ACPTR_PTR+1
|
||||
@1:
|
||||
dec FD_ACPTR_LEN+0
|
||||
lda FD_ACPTR_LEN+0
|
||||
dec F0_ACPTR_LEN+0
|
||||
lda F0_ACPTR_LEN+0
|
||||
cmp #$FF
|
||||
bne @2
|
||||
dec FD_ACPTR_LEN+1
|
||||
dec F0_ACPTR_LEN+1
|
||||
@2:
|
||||
; If new length is 0, try to read next block of data
|
||||
|
||||
ora FD_ACPTR_LEN+1
|
||||
bne @3
|
||||
jsr unit_fd_cmd_READ
|
||||
ora F0_ACPTR_LEN+1
|
||||
bra msg_ACPTR_read_XX_common
|
||||
|
||||
msg_ACPTR_read_F1:
|
||||
|
||||
; Read and return one byte
|
||||
|
||||
jsr F1_ACPTR_helper
|
||||
sta TBTCNT
|
||||
sta REG_A
|
||||
|
||||
; Increment pointer, decrement length
|
||||
|
||||
inc F1_ACPTR_PTR+0
|
||||
bne @1
|
||||
inc F1_ACPTR_PTR+1
|
||||
@1:
|
||||
dec F1_ACPTR_LEN+0
|
||||
lda F1_ACPTR_LEN+0
|
||||
cmp #$FF
|
||||
bne @2
|
||||
dec F1_ACPTR_LEN+1
|
||||
@2:
|
||||
; If new length is 0, try to read next block of data
|
||||
|
||||
ora F1_ACPTR_LEN+1
|
||||
bra msg_ACPTR_read_XX_common
|
||||
|
||||
msg_ACPTR_read_RD:
|
||||
|
||||
; XXX provide implementation
|
||||
|
||||
msg_ACPTR_read_XX_common:
|
||||
|
||||
bne @3
|
||||
jsr disk_xx_cmd_READ
|
||||
bcc @3
|
||||
jsr kernalstatus_EOI
|
||||
@3:
|
||||
jmp dos_EXIT_CLC
|
||||
|
||||
msg_ACPTR_read_RD:
|
||||
|
||||
; XXX provide implementation
|
||||
|
||||
|
||||
msg_ACPTR_fail_no_data:
|
||||
@@ -117,11 +151,18 @@ msg_ACPTR_status_SD: ; get next byte of status - SD card
|
||||
lda SD_STATUS_BUF,x
|
||||
bra msg_ACPTR_status_got
|
||||
|
||||
msg_ACPTR_status_FD: ; get next byte of status - floppy
|
||||
msg_ACPTR_status_F0: ; get next byte of status - floppy 0
|
||||
|
||||
ldx FD_STATUS_IDX
|
||||
inc FD_STATUS_IDX
|
||||
lda FD_STATUS_BUF,x
|
||||
ldx F0_STATUS_IDX
|
||||
inc F0_STATUS_IDX
|
||||
lda F0_STATUS_BUF,x
|
||||
bra msg_ACPTR_status_got
|
||||
|
||||
msg_ACPTR_status_F1: ; get next byte of status - floppy 0
|
||||
|
||||
ldx F1_STATUS_IDX
|
||||
inc F1_STATUS_IDX
|
||||
lda F1_STATUS_BUF,x
|
||||
bra msg_ACPTR_status_got
|
||||
|
||||
msg_ACPTR_status_RD: ; get next byte of status - ram disk
|
||||
@@ -166,17 +207,20 @@ msg_ACPTR_EOI:
|
||||
msg_ACPTR_status_vectab:
|
||||
|
||||
!word msg_ACPTR_status_SD
|
||||
!word msg_ACPTR_status_FD
|
||||
!word msg_ACPTR_status_F0
|
||||
!word msg_ACPTR_status_F1
|
||||
!word msg_ACPTR_status_RD
|
||||
|
||||
msg_ACPTR_read_vectab:
|
||||
|
||||
!word msg_ACPTR_read_SD
|
||||
!word msg_ACPTR_read_FD
|
||||
!word msg_ACPTR_read_F0
|
||||
!word msg_ACPTR_read_F1
|
||||
!word msg_ACPTR_read_RD
|
||||
|
||||
msg_ACPTR_set_status_vectab:
|
||||
|
||||
!word util_status_SD
|
||||
!word util_status_FD
|
||||
!word util_status_F0
|
||||
!word util_status_F1
|
||||
!word util_status_RD
|
||||
@@ -13,8 +13,14 @@ msg_CIOUT:
|
||||
|
||||
ldx IDX1_LISTENER
|
||||
bmi msg_CIOUT_fail
|
||||
lda XX_MODE, x
|
||||
|
||||
; Set file system instance
|
||||
|
||||
stx PAR_FSINSTANCE
|
||||
|
||||
; Check current operation mode
|
||||
|
||||
lda XX_MODE, x
|
||||
cmp #$01
|
||||
bne @1
|
||||
|
||||
@@ -38,7 +44,7 @@ msg_CIOUT_fail:
|
||||
|
||||
|
||||
|
||||
; Receiving command/file name
|
||||
; Receiving command/file name XXX limit $7F is too small, buffer size is 256 bytes
|
||||
|
||||
msg_CIOUT_cmdfn_SD: ; get next byte of status - SD card
|
||||
|
||||
@@ -52,23 +58,34 @@ msg_CIOUT_cmdfn_SD: ; get next byte of status - SD card
|
||||
lda #$A0
|
||||
sta SD_CMDFN_BUF,x
|
||||
plp
|
||||
+bcs unit_sd_cmd_OPEN_EOI ; if EOI - execute command
|
||||
+bcs card_sd_cmd_OPEN_EOI ; if EOI - execute command
|
||||
jmp dos_EXIT_CLC
|
||||
|
||||
msg_CIOUT_cmdfn_FD: ; get next byte of status - floppy
|
||||
msg_CIOUT_cmdfn_F0: ; get next byte of status - floppy
|
||||
|
||||
ldx FD_CMDFN_IDX
|
||||
sta FD_CMDFN_BUF,x
|
||||
ldx F0_CMDFN_IDX
|
||||
sta F0_CMDFN_BUF,x
|
||||
inx
|
||||
bpl @1
|
||||
ldx #$7F
|
||||
@1:
|
||||
stx FD_CMDFN_IDX
|
||||
stx F0_CMDFN_IDX
|
||||
lda #$A0
|
||||
sta FD_CMDFN_BUF,x
|
||||
plp
|
||||
+bcs unit_fd_cmd_OPEN_EOI ; if EOI - execute command
|
||||
jmp dos_EXIT_CLC
|
||||
sta F0_CMDFN_BUF,x
|
||||
bra msg_CIOUT_cmdfn_FX
|
||||
|
||||
msg_CIOUT_cmdfn_F1: ; get next byte of status - floppy
|
||||
|
||||
ldx F1_CMDFN_IDX
|
||||
sta F1_CMDFN_BUF,x
|
||||
inx
|
||||
bpl @1
|
||||
ldx #$7F
|
||||
@1:
|
||||
stx F1_CMDFN_IDX
|
||||
lda #$A0
|
||||
sta F1_CMDFN_BUF,x
|
||||
bra msg_CIOUT_cmdfn_FX
|
||||
|
||||
msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk
|
||||
|
||||
@@ -81,12 +98,18 @@ msg_CIOUT_cmdfn_RD: ; get next byte of status - ram disk
|
||||
stx RD_CMDFN_IDX
|
||||
lda #$A0
|
||||
sta RD_CMDFN_BUF,x
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
msg_CIOUT_cmdfn_FX: ; common pard for floppy and RAM disk
|
||||
|
||||
plp
|
||||
+bcs unit_rd_cmd_OPEN_EOI ; if EOI - execute command
|
||||
+bcs disk_xx_cmd_OPEN_EOI ; if EOI - execute command
|
||||
jmp dos_EXIT_CLC
|
||||
|
||||
msg_CIOUT_cmdfn_vectab:
|
||||
|
||||
!word msg_CIOUT_cmdfn_SD
|
||||
!word msg_CIOUT_cmdfn_FD
|
||||
!word msg_CIOUT_cmdfn_F0
|
||||
!word msg_CIOUT_cmdfn_F1
|
||||
!word msg_CIOUT_cmdfn_RD
|
||||
@@ -12,28 +12,44 @@ msg_LISTEN:
|
||||
and #$1F
|
||||
beq msg_LISTEN_fail ; branch if device 0 (used to denote lack of device)
|
||||
|
||||
@try_sd:
|
||||
|
||||
cmp UNIT_SDCARD
|
||||
bne @1
|
||||
bne @try_f0
|
||||
|
||||
; LISTEN on SD card
|
||||
|
||||
lda #$00
|
||||
bra msg_LISTEN_success
|
||||
@1:
|
||||
cmp UNIT_FLOPPY
|
||||
bne @2
|
||||
|
||||
; LISTEN on floppy
|
||||
@try_f0:
|
||||
|
||||
cmp UNIT_FLOPPY0
|
||||
bne @try_f1
|
||||
|
||||
; LISTEN on floppy 0
|
||||
|
||||
lda #$01
|
||||
bra msg_LISTEN_success
|
||||
@2:
|
||||
|
||||
@try_f1:
|
||||
|
||||
cmp UNIT_FLOPPY1
|
||||
bne @try_rd
|
||||
|
||||
; LISTEN on floppy 1
|
||||
|
||||
lda #$02
|
||||
bra msg_LISTEN_success
|
||||
|
||||
@try_rd:
|
||||
|
||||
cmp UNIT_RAMDISK
|
||||
bne msg_LISTEN_fail
|
||||
|
||||
; LISTEN on ram disk
|
||||
|
||||
lda #$02
|
||||
lda #$03
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ msg_SECOND:
|
||||
|
||||
ldx IDX1_LISTENER
|
||||
bmi msg_SECOND_done ; do nothing if no listener
|
||||
stx PAR_FSINSTANCE ; set file system instance
|
||||
sta XX_CHANNEL, x ; store channel
|
||||
|
||||
; Determine command type
|
||||
|
||||
@@ -12,28 +12,44 @@ msg_TALK:
|
||||
and #$1F
|
||||
beq msg_TALK_fail ; branch if device 0 (used to denote lack of device)
|
||||
|
||||
@try_sd:
|
||||
|
||||
cmp UNIT_SDCARD
|
||||
bne @1
|
||||
bne @try_f0
|
||||
|
||||
; TALK on SD card
|
||||
|
||||
lda #$00
|
||||
bra msg_TALK_success
|
||||
@1:
|
||||
cmp UNIT_FLOPPY
|
||||
bne @2
|
||||
|
||||
; TALK on floppy
|
||||
@try_f0:
|
||||
|
||||
cmp UNIT_FLOPPY0
|
||||
bne @try_f1
|
||||
|
||||
; TALK on floppy 0
|
||||
|
||||
lda #$01
|
||||
bra msg_TALK_success
|
||||
@2:
|
||||
|
||||
@try_f1:
|
||||
|
||||
cmp UNIT_FLOPPY1
|
||||
bne @try_rd
|
||||
|
||||
; TALK on floppy 1
|
||||
|
||||
lda #$02
|
||||
bra msg_TALK_success
|
||||
|
||||
@try_rd:
|
||||
|
||||
cmp UNIT_RAMDISK
|
||||
bne msg_TALK_fail
|
||||
|
||||
; TALK on ram disk
|
||||
|
||||
lda #$02
|
||||
lda #$03
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
;
|
||||
|
||||
|
||||
unit_sd_cmd_CLOSE:
|
||||
card_sd_cmd_CLOSE:
|
||||
|
||||
; XXX provide implementation
|
||||
|
||||
+5
-7
@@ -4,14 +4,14 @@
|
||||
;
|
||||
|
||||
|
||||
unit_sd_cmd_OPEN:
|
||||
card_sd_cmd_OPEN:
|
||||
|
||||
lda #$01 ; mode: receive command or file name
|
||||
sta SD_MODE
|
||||
|
||||
jmp dos_EXIT_CLC
|
||||
|
||||
unit_sd_cmd_OPEN_EOI:
|
||||
card_sd_cmd_OPEN_EOI:
|
||||
|
||||
; XXX this dispatcher is temporary
|
||||
|
||||
@@ -24,15 +24,13 @@ unit_sd_cmd_OPEN_EOI:
|
||||
dey
|
||||
bpl @lp1
|
||||
|
||||
; XXX add support for second card
|
||||
|
||||
lda SD_CMDFN_BUF
|
||||
cmp #'$'
|
||||
beq unit_sd_cmd_OPEN_dir
|
||||
beq card_sd_cmd_OPEN_dir
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
unit_sd_cmd_OPEN_file:
|
||||
card_sd_cmd_OPEN_file:
|
||||
|
||||
; Copy the filter from command XXX this should be moved to common part and deduplicated with directory opening
|
||||
|
||||
@@ -51,7 +49,7 @@ unit_sd_cmd_OPEN_file:
|
||||
jmp fs_vfs_read_file_open
|
||||
|
||||
|
||||
unit_sd_cmd_OPEN_dir:
|
||||
card_sd_cmd_OPEN_dir:
|
||||
|
||||
lda #$02 ; mode: read directory
|
||||
sta SD_MODE
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
;
|
||||
|
||||
|
||||
unit_sd_cmd_READ:
|
||||
card_sd_cmd_READ:
|
||||
|
||||
lda SD_MODE
|
||||
cmp #$03
|
||||
@@ -4,7 +4,7 @@
|
||||
;
|
||||
|
||||
|
||||
unit_sd_init:
|
||||
card_sd_init:
|
||||
|
||||
; Copy initial status string
|
||||
|
||||
@@ -26,14 +26,5 @@ unit_sd_init:
|
||||
|
||||
; Close all the files in the hypervisor, go to root directory
|
||||
|
||||
lda #$22 ; dos_closeall
|
||||
sta HTRAP00
|
||||
+nop
|
||||
|
||||
lda #$3C ; dos_cdrootdir
|
||||
sta HTRAP00
|
||||
+nop
|
||||
|
||||
; End of initialization
|
||||
|
||||
rts
|
||||
jsr util_htrap_dos_closeall
|
||||
jmp util_htrap_dos_cdrootdir
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
;
|
||||
; Close currently opened file
|
||||
;
|
||||
|
||||
|
||||
disk_fd_cmd_CLOSE:
|
||||
|
||||
; XXX provide implementation
|
||||
|
||||
jsr lowlevel_fd_motor_off ; disable drive motor XXX only do this if no channel is opened
|
||||
|
||||
jmp dos_EXIT_SEC
|
||||
@@ -0,0 +1,46 @@
|
||||
|
||||
;
|
||||
; Initializes DOS part of floppy controller
|
||||
;
|
||||
|
||||
|
||||
disk_fd_init:
|
||||
|
||||
; Copy status string
|
||||
|
||||
ldx #$00
|
||||
|
||||
stx F0_STATUS_IDX
|
||||
stx F0_CMDFN_IDX
|
||||
stx F0_MODE
|
||||
stx F0_ACPTR_LEN+0
|
||||
stx F0_ACPTR_LEN+1
|
||||
stx F0_ACPTR_PTR+0
|
||||
stx F0_ACPTR_PTR+1
|
||||
|
||||
stx F1_STATUS_IDX
|
||||
stx F1_CMDFN_IDX
|
||||
stx F1_MODE
|
||||
stx F1_ACPTR_LEN+0
|
||||
stx F1_ACPTR_LEN+1
|
||||
stx F1_ACPTR_PTR+0
|
||||
stx F1_ACPTR_PTR+1
|
||||
|
||||
dex
|
||||
@1:
|
||||
inx
|
||||
lda dos_sts_init_floppy,x
|
||||
sta F0_STATUS_BUF,x
|
||||
sta F1_STATUS_BUF,x
|
||||
bne @1
|
||||
|
||||
; Initialize the controller
|
||||
|
||||
lda #$80 ; default track stepping rate
|
||||
sta FDC_STEP
|
||||
lda #$FF
|
||||
sta FDC_CLOCK
|
||||
|
||||
; End of initialization
|
||||
|
||||
rts
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
;
|
||||
|
||||
|
||||
unit_rd_cmd_CLOSE:
|
||||
disk_rd_cmd_CLOSE:
|
||||
|
||||
; XXX provide implementation
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
|
||||
;
|
||||
; Initializes DOS part of RAM disk
|
||||
;
|
||||
|
||||
|
||||
disk_rd_init:
|
||||
|
||||
|
||||
; Copy status string
|
||||
|
||||
ldx #$00
|
||||
stx RD_STATUS_IDX
|
||||
stx RD_CMDFN_IDX
|
||||
stx RD_MODE
|
||||
stx RD_ACPTR_LEN+0
|
||||
stx RD_ACPTR_LEN+1
|
||||
stx RD_ACPTR_PTR+0
|
||||
stx RD_ACPTR_PTR+1
|
||||
dex
|
||||
@1:
|
||||
inx
|
||||
lda dos_sts_init_ramdisk,x
|
||||
sta RD_STATUS_BUF,x
|
||||
bne @1
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
disk_rd_init_test_ram: ; non-destructive ATTIC/CELLAR RAM test
|
||||
|
||||
; Preserve temporary address area on stack
|
||||
|
||||
ldx #$03
|
||||
@2:
|
||||
lda PNTR, x
|
||||
pha
|
||||
dex
|
||||
bpl @2
|
||||
|
||||
stx RD_MSG ; $FF - mark no message to be displayed
|
||||
|
||||
; For the start, mark extended RAM as not present
|
||||
|
||||
stx RD_STARTSEG ; by default $FF, to mark no RAM disk
|
||||
inx
|
||||
stx RD_VALIDIMG ; mark no valid image loaded
|
||||
stx RAM_ATTIC ; set ATTIC/CELLAR RAM as not present
|
||||
stx RAM_CELLAR
|
||||
|
||||
; Prepare address - CELLAR RAM, $0880:$0000
|
||||
|
||||
stx PNTR+0
|
||||
stx PNTR+1
|
||||
lda #$80
|
||||
sta PNTR+2
|
||||
lda #$08
|
||||
sta PNTR+3
|
||||
|
||||
ldz #$00
|
||||
|
||||
; Test for CELLAR RAM
|
||||
|
||||
jsr @perform_ram_test
|
||||
bne @done_cellar
|
||||
dec RAM_ATTIC ; test passed
|
||||
lda #$08
|
||||
sta RD_STARTSEG ; RAM DISK start segment - CELLAR RAM
|
||||
|
||||
@done_cellar:
|
||||
|
||||
; Prepare address - ATTIC RAM, $0800:$0000
|
||||
|
||||
lda #$00
|
||||
sta PNTR+2
|
||||
|
||||
; Test for ATTIC RAM
|
||||
|
||||
jsr @perform_ram_test
|
||||
bne @done_attic
|
||||
dec RAM_CELLAR ; test passed
|
||||
lda #$00
|
||||
sta RD_STARTSEG ; RAM DISK start segment - ATTIC RAM
|
||||
|
||||
@done_attic:
|
||||
|
||||
; Restore temporary address area content
|
||||
|
||||
ldx #$00
|
||||
@3:
|
||||
pla
|
||||
sta PNTR, x
|
||||
inx
|
||||
cpx #$04
|
||||
bne @3
|
||||
|
||||
; Clear RAM disk device number if no Hyper RAM available
|
||||
|
||||
jsr util_check_rd_ram
|
||||
|
||||
; End of initialization
|
||||
|
||||
rts
|
||||
|
||||
@perform_ram_test:
|
||||
|
||||
; Try to change one byte in extended RAM
|
||||
|
||||
lda [PNTR], z
|
||||
tax
|
||||
eor #$FF
|
||||
sta [PNTR], z
|
||||
|
||||
; Make sure the cache does not contain the value any more
|
||||
|
||||
tay
|
||||
dez
|
||||
lda [PNTR], z
|
||||
inz
|
||||
tya
|
||||
|
||||
; Check if byte still contains the new value
|
||||
|
||||
cmp [PNTR], z
|
||||
php
|
||||
|
||||
; Restore byte content
|
||||
|
||||
txa
|
||||
sta [PNTR], z
|
||||
|
||||
; Return test result
|
||||
|
||||
plp
|
||||
rts
|
||||
@@ -0,0 +1,212 @@
|
||||
|
||||
;
|
||||
; Preload RAM disk image from SD card
|
||||
;
|
||||
|
||||
|
||||
!addr __stoptrack = RD_DIR_PHASE ; helper value for detecting too large image
|
||||
|
||||
|
||||
disk_rd_preload:
|
||||
|
||||
; Check if RAM disk is enabled (should be disabled if no Hyper RAM is present)
|
||||
|
||||
lda UNIT_RAMDISK
|
||||
+beq disk_rd_preload_err_common_noclose
|
||||
|
||||
; Select SD card buffer
|
||||
|
||||
lda #$80
|
||||
tsb SD_BUFCTL
|
||||
|
||||
; Set file name
|
||||
|
||||
jsr util_shadow
|
||||
ldx #$FF
|
||||
@lp1:
|
||||
inx
|
||||
lda ramdisk_filename, x
|
||||
sta MEM_BUF, x
|
||||
bne @lp1
|
||||
|
||||
ldy #>MEM_BUF
|
||||
ldx #<MEM_BUF
|
||||
jsr util_htrap_dos_setname
|
||||
jsr util_shadow_restore
|
||||
|
||||
+bcc @error_not_found ; branch if error
|
||||
|
||||
; Try to find the file
|
||||
|
||||
jsr util_htrap_dos_findfile
|
||||
+bcc @error_not_found ; branch if file not found
|
||||
|
||||
; Calculate maximum amount of tracks possible to load
|
||||
|
||||
; XXX clean this up, for the loop counter it should be enough to use DMAJOB_DST_ADDR
|
||||
|
||||
lda #$FF
|
||||
sta RD_MAXTRACK ; maximum track number of loaded image, for now set $FF
|
||||
sta __stoptrack
|
||||
|
||||
lda RAM_ATTIC
|
||||
beq @added_attic
|
||||
jsr disk_rd_preload_addram
|
||||
|
||||
@added_attic:
|
||||
|
||||
lda RAM_CELLAR
|
||||
beq @added_cellar
|
||||
jsr disk_rd_preload_addram
|
||||
|
||||
@added_cellar:
|
||||
|
||||
; Load the image
|
||||
|
||||
lda #$08 ; set the ram disk start address
|
||||
sta DMAJOB_DST_MB
|
||||
lda #$00
|
||||
sta DMAJOB_DST_ADDR+0
|
||||
sta DMAJOB_DST_ADDR+1
|
||||
lda RD_STARTSEG
|
||||
sta DMAJOB_DST_ADDR+2
|
||||
|
||||
jsr util_htrap_dos_openfile
|
||||
sta SD_DESC ; XXX consider using separate variable
|
||||
|
||||
lda #$FF
|
||||
sta RD_MAXTRACK
|
||||
|
||||
bra @load_track_check_done
|
||||
|
||||
@load_track:
|
||||
|
||||
lda RD_MAXTRACK
|
||||
cmp __stoptrack
|
||||
beq @load_image_mem_full
|
||||
inc DMAJOB_DST_ADDR+2
|
||||
|
||||
@load_track_check_done:
|
||||
|
||||
inc RD_MAXTRACK
|
||||
ldx #$00 ; counter of 512-byte blocks to load
|
||||
|
||||
@load_track_loop:
|
||||
|
||||
phx
|
||||
|
||||
; Read 512 bytes
|
||||
|
||||
jsr util_htrap_dos_readfile
|
||||
|
||||
cpx #$00
|
||||
bne @error_wrong_size_plx ; file size not multiplicity of 64K
|
||||
|
||||
cpy #$00
|
||||
beq @load_image_end
|
||||
|
||||
cpy #$02
|
||||
bne @error_wrong_size_plx ; file size not multiplicity of 64K
|
||||
|
||||
jsr util_dma_launch_from_hwbuf ; copy data to Hyper RAM
|
||||
|
||||
inc DMAJOB_DST_ADDR+1 ; advance pointer to the next block
|
||||
inc DMAJOB_DST_ADDR+1
|
||||
|
||||
; Next 512-byte block or next track
|
||||
|
||||
plx
|
||||
inx
|
||||
inx
|
||||
bne @load_track_loop ; next 512-byte block of the same track
|
||||
|
||||
bra @load_track ; next track
|
||||
|
||||
@load_image_mem_full:
|
||||
|
||||
; Make sure this is the end of the file
|
||||
|
||||
jsr util_htrap_dos_readfile
|
||||
|
||||
cpx #$00
|
||||
bne @error_too_large
|
||||
cpy #$00
|
||||
bne @error_too_large
|
||||
|
||||
@load_image_end:
|
||||
|
||||
plx
|
||||
cpx #$00
|
||||
bne @error_wrong_size ; file empty or file size not multiplicity of 64K
|
||||
|
||||
lda RD_MAXTRACK
|
||||
cmp #$02
|
||||
bcc @error_wrong_size ; file too small, at least 128K required
|
||||
|
||||
ldx SD_DESC
|
||||
jsr util_htrap_dos_closefile
|
||||
|
||||
; End of initialization
|
||||
|
||||
lda #$FF
|
||||
sta RD_VALIDIMG ; mark image as valid
|
||||
|
||||
lda #$00 ; temporary storage needs to be restored to 0
|
||||
sta __stoptrack
|
||||
|
||||
lda #$00 ; set message to OK
|
||||
sta RD_MSG
|
||||
|
||||
rts
|
||||
|
||||
|
||||
|
||||
@error_wrong_size_plx:
|
||||
|
||||
plx
|
||||
|
||||
@error_wrong_size:
|
||||
|
||||
lda #$01
|
||||
jmp disk_rd_preload_err_common
|
||||
|
||||
@error_too_large:
|
||||
|
||||
lda #$02
|
||||
jmp disk_rd_preload_err_common
|
||||
|
||||
@error_not_found:
|
||||
|
||||
lda #$03
|
||||
sta RD_MSG
|
||||
|
||||
jmp disk_rd_preload_err_common_noclose
|
||||
|
||||
|
||||
disk_rd_preload_err_common:
|
||||
|
||||
sta RD_MSG ; set code for startup screen
|
||||
|
||||
jsr util_htrap_dos_closefile ; XXX set descriptor
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
disk_rd_preload_err_common_noclose:
|
||||
|
||||
lda #$00 ; temporary storage needs to be restored to 0
|
||||
sta __stoptrack
|
||||
sta RD_VALIDIMG ; mark image as invalid
|
||||
|
||||
rts
|
||||
|
||||
|
||||
|
||||
disk_rd_preload_addram:
|
||||
|
||||
; Add allowed number of tracks due to attic/cellar block presence
|
||||
|
||||
clc
|
||||
lda #$80
|
||||
adc __stoptrack
|
||||
sta __stoptrack
|
||||
rts
|
||||
@@ -0,0 +1,159 @@
|
||||
|
||||
;
|
||||
; Open file for reading
|
||||
;
|
||||
|
||||
; XXX add support for both floppies
|
||||
|
||||
|
||||
disk_xx_cmd_OPEN:
|
||||
|
||||
lda #$01 ; mode: receive command or file name
|
||||
ldx PAR_FSINSTANCE
|
||||
sta XX_MODE, x
|
||||
|
||||
jmp dos_EXIT_CLC
|
||||
|
||||
disk_xx_cmd_OPEN_EOI:
|
||||
|
||||
; XXX this dispatcher needs improvements to handle more of the syntax
|
||||
|
||||
; Erase filter pattern
|
||||
|
||||
ldy #$0F
|
||||
lda #$A0
|
||||
@lp1:
|
||||
sta PAR_FPATTERN, y
|
||||
dey
|
||||
bpl @lp1
|
||||
|
||||
ldx PAR_FSINSTANCE
|
||||
cmp #$02
|
||||
beq @f1
|
||||
bcs @rd
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
lda F0_CMDFN_BUF
|
||||
cmp #'$'
|
||||
beq disk_f0_cmd_OPEN_dir
|
||||
bra disk_f0_cmd_OPEN_file
|
||||
@f1:
|
||||
lda F1_CMDFN_BUF
|
||||
cmp #'$'
|
||||
beq disk_f1_cmd_OPEN_dir
|
||||
bra disk_f1_cmd_OPEN_file
|
||||
@rd:
|
||||
lda RD_CMDFN_BUF
|
||||
cmp #'$'
|
||||
beq disk_rd_cmd_OPEN_dir
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
|
||||
disk_rd_cmd_OPEN_file:
|
||||
|
||||
; Copy the filter from command
|
||||
ldy #$00
|
||||
@lp1:
|
||||
lda RD_CMDFN_BUF, y
|
||||
jsr disk_xx_cmd_OPEN_file_common
|
||||
bne @lp1
|
||||
|
||||
jmp fs_cbm_read_file_open
|
||||
|
||||
|
||||
disk_f0_cmd_OPEN_file:
|
||||
|
||||
; Copy the filter from command
|
||||
ldy #$00
|
||||
@lp1:
|
||||
lda F0_CMDFN_BUF, y
|
||||
jsr disk_xx_cmd_OPEN_file_common
|
||||
bne @lp1
|
||||
|
||||
jmp fs_cbm_read_file_open
|
||||
|
||||
|
||||
disk_f1_cmd_OPEN_file:
|
||||
|
||||
; Copy the filter from command
|
||||
ldy #$00
|
||||
@lp1:
|
||||
lda F1_CMDFN_BUF, y
|
||||
jsr disk_xx_cmd_OPEN_file_common
|
||||
bne @lp1
|
||||
|
||||
jmp fs_cbm_read_file_open
|
||||
|
||||
|
||||
disk_rd_cmd_OPEN_dir:
|
||||
|
||||
lda #$02
|
||||
sta RD_MODE
|
||||
|
||||
; Copy the filter from command
|
||||
ldy #$00
|
||||
@lp1:
|
||||
lda RD_CMDFN_BUF+1, y
|
||||
jsr disk_xx_cmd_OPEN_dir_common
|
||||
bne @lp1
|
||||
|
||||
@lp1_end:
|
||||
|
||||
jmp fs_cbm_read_dir_open
|
||||
|
||||
|
||||
disk_f0_cmd_OPEN_dir:
|
||||
|
||||
lda #$02
|
||||
sta F0_MODE
|
||||
|
||||
; Copy the filter from command
|
||||
ldy #$00
|
||||
@lp1:
|
||||
lda F0_CMDFN_BUF+1, y
|
||||
jsr disk_xx_cmd_OPEN_dir_common
|
||||
bne @lp1
|
||||
|
||||
jmp fs_cbm_read_dir_open
|
||||
|
||||
|
||||
disk_f1_cmd_OPEN_dir:
|
||||
|
||||
lda #$02
|
||||
sta F1_MODE
|
||||
|
||||
; Copy the filter from command
|
||||
ldy #$00
|
||||
@lp1:
|
||||
lda F1_CMDFN_BUF+1, y
|
||||
jsr disk_xx_cmd_OPEN_dir_common
|
||||
bne @lp1
|
||||
|
||||
jmp fs_cbm_read_dir_open
|
||||
|
||||
|
||||
|
||||
disk_xx_cmd_OPEN_file_common:
|
||||
|
||||
; Common part of filter copy loop
|
||||
|
||||
cmp #$A0
|
||||
+beq fs_cbm_read_file_open
|
||||
sta PAR_FPATTERN, y
|
||||
iny
|
||||
cpy #$10
|
||||
|
||||
rts
|
||||
|
||||
|
||||
disk_xx_cmd_OPEN_dir_common:
|
||||
|
||||
cmp #$A0
|
||||
+beq fs_cbm_read_dir_open
|
||||
sta PAR_FPATTERN, y
|
||||
iny
|
||||
cpy #$10
|
||||
|
||||
rts
|
||||
+6
-3
@@ -4,13 +4,16 @@
|
||||
;
|
||||
|
||||
|
||||
unit_fd_cmd_READ:
|
||||
disk_xx_cmd_READ:
|
||||
|
||||
lda FD_MODE
|
||||
ldx PAR_FSINSTANCE
|
||||
lda XX_MODE, x
|
||||
cmp #$03
|
||||
+beq fs_cbm_nextfileblock
|
||||
|
||||
lda FD_DIR_PHASE
|
||||
; Reading directory
|
||||
|
||||
lda XX_DIR_PHASE, x
|
||||
cmp #$01
|
||||
+beq fs_cbm_read_dir
|
||||
cmp #$02
|
||||
@@ -1,11 +0,0 @@
|
||||
|
||||
;
|
||||
; Close currently opened file
|
||||
;
|
||||
|
||||
|
||||
unit_fd_cmd_CLOSE:
|
||||
|
||||
; XXX provide implementation
|
||||
|
||||
jmp dos_EXIT_SEC
|
||||
@@ -1,73 +0,0 @@
|
||||
|
||||
;
|
||||
; Open file for reading
|
||||
;
|
||||
|
||||
|
||||
unit_fd_cmd_OPEN:
|
||||
|
||||
lda #$01 ; mode: receive command or file name
|
||||
sta FD_MODE
|
||||
|
||||
jmp dos_EXIT_CLC
|
||||
|
||||
unit_fd_cmd_OPEN_EOI:
|
||||
|
||||
; XXX this dispatcher is temporary
|
||||
|
||||
; Erase filter pattern XXX this should be moved to common part
|
||||
|
||||
ldy #$0F
|
||||
lda #$A0
|
||||
@lp1:
|
||||
sta PAR_FPATTERN, y
|
||||
dey
|
||||
bpl @lp1
|
||||
|
||||
; XXX add support for second floppy
|
||||
|
||||
lda FD_CMDFN_BUF
|
||||
cmp #'$'
|
||||
beq unit_fd_cmd_OPEN_dir
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
unit_fd_cmd_OPEN_file:
|
||||
|
||||
; Copy the filter from command XXX this should be moved to common part and deduplicated with directory opening
|
||||
|
||||
ldy #$00
|
||||
@lp1:
|
||||
lda FD_CMDFN_BUF, y
|
||||
cmp #$A0
|
||||
beq @lp1_end
|
||||
sta PAR_FPATTERN, y
|
||||
iny
|
||||
cpy #$10
|
||||
bne @lp1
|
||||
|
||||
@lp1_end:
|
||||
|
||||
jmp fs_cbm_read_file_open
|
||||
|
||||
|
||||
unit_fd_cmd_OPEN_dir:
|
||||
|
||||
lda #$02 ; mode: read directory
|
||||
sta FD_MODE
|
||||
|
||||
; Copy the filter from command XXX this should be moved to common part and deduplicated with file opening
|
||||
|
||||
ldy #$00
|
||||
@lp1:
|
||||
lda FD_CMDFN_BUF+1, y
|
||||
cmp #$A0
|
||||
beq @lp1_end
|
||||
sta PAR_FPATTERN, y
|
||||
iny
|
||||
cpy #$10
|
||||
bne @lp1
|
||||
|
||||
@lp1_end:
|
||||
|
||||
jmp fs_cbm_read_dir_open
|
||||
@@ -1,28 +0,0 @@
|
||||
|
||||
;
|
||||
; Initializes DOS part of floppy controller
|
||||
;
|
||||
|
||||
|
||||
unit_fd_init:
|
||||
|
||||
; Copy status string
|
||||
|
||||
ldx #$00
|
||||
stx FD_STATUS_IDX
|
||||
stx FD_CMDFN_IDX
|
||||
stx FD_MODE
|
||||
stx FD_ACPTR_LEN+0
|
||||
stx FD_ACPTR_LEN+1
|
||||
stx FD_ACPTR_PTR+0
|
||||
stx FD_ACPTR_PTR+1
|
||||
dex
|
||||
@1:
|
||||
inx
|
||||
lda dos_sts_init_floppy,x
|
||||
sta FD_STATUS_BUF,x
|
||||
bne @1
|
||||
|
||||
; End of initialization
|
||||
|
||||
rts
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
;
|
||||
; Open file for reading
|
||||
;
|
||||
|
||||
; XXX to be unified with floppy code
|
||||
|
||||
|
||||
disk_rd_cmd_OPEN_EOI:
|
||||
|
||||
; XXX provide implementation
|
||||
|
||||
jmp dos_EXIT_CLC
|
||||
+3
-1
@@ -3,8 +3,10 @@
|
||||
; Read more data into the buffer
|
||||
;
|
||||
|
||||
; XXX to be unified with floppy code
|
||||
|
||||
unit_rd_cmd_READ:
|
||||
|
||||
disk_rd_cmd_READ:
|
||||
|
||||
; XXX provide implementation
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
|
||||
;
|
||||
; Open file for reading
|
||||
;
|
||||
|
||||
|
||||
unit_rd_cmd_OPEN:
|
||||
|
||||
; XXX provide implementation
|
||||
|
||||
jmp dos_EXIT_SEC
|
||||
|
||||
unit_rd_cmd_OPEN_EOI:
|
||||
|
||||
; XXX provide implementation
|
||||
|
||||
jmp dos_EXIT_CLC
|
||||
@@ -1,28 +0,0 @@
|
||||
|
||||
;
|
||||
; Initializes DOS part of ram disk
|
||||
;
|
||||
|
||||
|
||||
unit_rd_init:
|
||||
|
||||
; Copy status string
|
||||
|
||||
ldx #$00
|
||||
stx RD_STATUS_IDX
|
||||
stx RD_CMDFN_IDX
|
||||
stx RD_MODE
|
||||
stx RD_ACPTR_LEN+0
|
||||
stx RD_ACPTR_LEN+1
|
||||
stx RD_ACPTR_PTR+0
|
||||
stx RD_ACPTR_PTR+1
|
||||
dex
|
||||
@1:
|
||||
inx
|
||||
lda dos_sts_init_ramdisk,x
|
||||
sta RD_STATUS_BUF,x
|
||||
bne @1
|
||||
|
||||
; End of initialization
|
||||
|
||||
rts
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
; If no Hyper RAM is present, clear the RAM DISK device number and set Carry
|
||||
|
||||
|
||||
util_check_rd_ram:
|
||||
|
||||
lda RAM_ATTIC
|
||||
ora RAM_CELLAR
|
||||
beq @no_hyperram
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
|
||||
@no_hyperram:
|
||||
|
||||
lda #$00
|
||||
sta UNIT_RAMDISK
|
||||
|
||||
sec
|
||||
rts
|
||||
@@ -50,7 +50,7 @@ util_dir_filter:
|
||||
beq @done
|
||||
lda PAR_FPATTERN, y
|
||||
|
||||
sta $1000
|
||||
sta MEM_BUF
|
||||
|
||||
cmp #$44 ; if 'D' - require a directory XXX documment this extension
|
||||
beq @require_dir
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
|
||||
; Size-optimized hypervisor interaction code
|
||||
|
||||
|
||||
util_htrap_dos_opendir:
|
||||
|
||||
lda #$12
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_htrap_dos_readddir:
|
||||
|
||||
lda #$14
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_htrap_dos_closedir:
|
||||
|
||||
lda #$16
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_htrap_dos_openfile:
|
||||
|
||||
lda #$18
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_htrap_dos_closefile:
|
||||
|
||||
lda #$20
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_htrap_dos_closeall:
|
||||
|
||||
lda #$22
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_htrap_dos_setname:
|
||||
|
||||
lda #$2E
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_htrap_dos_findfile:
|
||||
|
||||
lda #$34
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_htrap_dos_cdrootdir:
|
||||
|
||||
lda #$3C
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
util_htrap_dos_readfile: ; make sure this is the fastest to execute
|
||||
|
||||
lda #$1A
|
||||
|
||||
sta HTRAP00
|
||||
+nop ; NOP required by hypervisor
|
||||
|
||||
rts
|
||||
@@ -0,0 +1,31 @@
|
||||
|
||||
; Handling shadow memory, preserves .P
|
||||
|
||||
|
||||
|
||||
util_shadow:
|
||||
|
||||
ldx #$00
|
||||
@1:
|
||||
ldy MEM_BUF, x
|
||||
sty MEMSHADOW_BUF, x
|
||||
inx
|
||||
bne @1
|
||||
|
||||
rts
|
||||
|
||||
util_shadow_restore:
|
||||
|
||||
php
|
||||
|
||||
ldx #$00
|
||||
@1:
|
||||
ldy MEMSHADOW_BUF, x
|
||||
sty MEM_BUF, x
|
||||
inx
|
||||
bne @1
|
||||
|
||||
bne @1
|
||||
|
||||
plp
|
||||
rts
|
||||
@@ -14,18 +14,25 @@ util_status_SD:
|
||||
ldx #$00 ; offset to status buffer
|
||||
bra util_status_common
|
||||
|
||||
util_status_FD:
|
||||
util_status_F0:
|
||||
|
||||
ldx #$00
|
||||
stx FD_STATUS_IDX ; set first byte of status to read
|
||||
ldx #$20 ; offset to status buffer
|
||||
stx F0_STATUS_IDX ; set first byte of status to read
|
||||
ldx #$30 ; offset to status buffer
|
||||
bra util_status_common
|
||||
|
||||
util_status_F1:
|
||||
|
||||
ldx #$00
|
||||
stx F1_STATUS_IDX ; set first byte of status to read
|
||||
ldx #$60 ; offset to status buffer
|
||||
bra util_status_common
|
||||
|
||||
util_status_RD:
|
||||
|
||||
ldx #$00
|
||||
stx RD_STATUS_IDX ; set first byte of status to read
|
||||
ldx #$40 ; offset to status buffer
|
||||
ldx #$90 ; offset to status buffer
|
||||
|
||||
; FALLLTROUGH
|
||||
|
||||
|
||||
@@ -8,33 +8,33 @@ m65_hypervisor_reset:
|
||||
|
||||
; Proceed like with normal reset, skip problematic parts
|
||||
|
||||
sei ; disable the interrupts, as fast as possible
|
||||
cld ; Kernal is not designed to operate in decimal mode
|
||||
sei ; disable the interrupts, as fast as possible
|
||||
cld ; Kernal is not designed to operate in decimal mode
|
||||
|
||||
lda #$00
|
||||
sta NMINV+1 ; soft-disable custom NMI interrupt handler
|
||||
sta NMINV+1 ; soft-disable custom NMI interrupt handler
|
||||
|
||||
; Do not reset the stack (see, ldx #$FF, txs) - we need to know where to return
|
||||
|
||||
jsr m65_reset_part ; init MEGA65 specific hardware, shutdown VIC-IV, clear native mode mark
|
||||
ldx #$28 ; 40 columns, screen disabled for now
|
||||
jsr m65_reset_part ; init MEGA65 specific hardware, shutdown VIC-IV, clear native mode mark
|
||||
ldx #$28 ; 40 columns, screen disabled for now
|
||||
stx VIC_SCROLX
|
||||
|
||||
jsr IOINIT_skip_DOS ; better not to initialize DOS under hypervisor, risk of incompatibility
|
||||
jsr m65_reset_common ; RAMTAS, RESTOR, CINT
|
||||
jsr IOINIT_skip_DOS ; better not to initialize DOS under hypervisor, risk of incompatibility
|
||||
jsr m65_reset_part_skip_palette ; also skip palette setting, but do RAMTAS, RESTOR, CINT
|
||||
|
||||
; Restore hypervisor memory mapping and quit
|
||||
|
||||
lda #$00 ; lower memory - megabyte $00
|
||||
ldx #$0F ; lower memory - request to set the megabyte
|
||||
ldy #$FF ; higher memory - megabyte $FF
|
||||
ldz #$0F ; higher memory - request to set the megabyte
|
||||
lda #$00 ; lower memory - megabyte $00
|
||||
ldx #$0F ; lower memory - request to set the megabyte
|
||||
ldy #$FF ; higher memory - megabyte $FF
|
||||
ldz #$0F ; higher memory - request to set the megabyte
|
||||
|
||||
map
|
||||
|
||||
tax ; lower memory - keep unmapped (.A is already 0)
|
||||
tay ; higher memory - lower 16 bits of the offset are also 0's
|
||||
ldz #$3F ; higher memory - map is %0011 = $3, offset is $FF0
|
||||
tax ; lower memory - keep unmapped (.A is already 0)
|
||||
tay ; higher memory - lower 16 bits of the offset are also 0's
|
||||
ldz #$3F ; higher memory - map is %0011 = $3, offset is $FF0
|
||||
|
||||
map
|
||||
eom
|
||||
|
||||
@@ -8,6 +8,11 @@ m65_reset_part:
|
||||
|
||||
jsr map_KERNAL_1
|
||||
jsr (VK1__m65_colorset_reset)
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
m65_reset_part_skip_palette: ; for hypervisor reset do not set palette, see https://github.com/MEGA65/open-roms/issues/68
|
||||
|
||||
jsr map_NORMAL ; we want normal memory mapping
|
||||
|
||||
jsr viciv_shutdown ; by default we do not want the VIC-IV
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
|
||||
!ifdef CONFIG_IEC {
|
||||
|
||||
!ifndef HAS_OPCODES_65C02 {
|
||||
|
||||
|
||||
iec_pull_atn_clk_release_data:
|
||||
|
||||
@@ -34,7 +36,7 @@ iec_pull_clk_release_data:
|
||||
iec_pull_clk_release_data_1:
|
||||
|
||||
and #$FF - BIT_CIA2_PRA_DAT_OUT ; release
|
||||
bne iec_pull_release_end ; branch always
|
||||
bne iec__pull_release_end ; branch always
|
||||
|
||||
iec_pull_clk_release_data_oneshot:
|
||||
|
||||
@@ -56,7 +58,7 @@ iec_release_clk_data:
|
||||
and #$FF - BIT_CIA2_PRA_DAT_OUT ; release
|
||||
sta CIA2_PRA
|
||||
and #$FF - BIT_CIA2_PRA_CLK_OUT ; release
|
||||
jmp iec_pull_release_end
|
||||
+bra iec__pull_release_end
|
||||
|
||||
iec_release_clk_pull_data:
|
||||
|
||||
@@ -64,7 +66,7 @@ iec_release_clk_pull_data:
|
||||
ora #BIT_CIA2_PRA_DAT_OUT ; pull
|
||||
sta CIA2_PRA
|
||||
and #$FF - BIT_CIA2_PRA_CLK_OUT ; release
|
||||
bne iec_pull_release_end ; branch always
|
||||
bne iec__pull_release_end ; branch always
|
||||
|
||||
iec_pull_data_release_atn_clk:
|
||||
|
||||
@@ -83,8 +85,85 @@ iec_release_atn:
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
iec_pull_release_end:
|
||||
iec__pull_release_end:
|
||||
|
||||
sta CIA2_PRA
|
||||
rts
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
; 65C02 version
|
||||
|
||||
iec_pull_atn_clk_release_data:
|
||||
|
||||
lda #BIT_CIA2_PRA_ATN_OUT
|
||||
tsb CIA2_PRA
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
iec_pull_clk_release_data:
|
||||
|
||||
lda #BIT_CIA2_PRA_CLK_OUT
|
||||
tsb CIA2_PRA
|
||||
lda #BIT_CIA2_PRA_DAT_OUT
|
||||
bra iec__pull_release_trb
|
||||
|
||||
iec_pull_clk_release_data_oneshot:
|
||||
|
||||
lda CIA2_PRA
|
||||
ora #BIT_CIA2_PRA_CLK_OUT ; pull
|
||||
and #$FF - BIT_CIA2_PRA_DAT_OUT ; release
|
||||
sta CIA2_PRA
|
||||
rts
|
||||
|
||||
iec_release_atn_clk_data:
|
||||
|
||||
lda #BIT_CIA2_PRA_ATN_OUT
|
||||
trb CIA2_PRA
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
iec_release_clk_data:
|
||||
|
||||
lda #BIT_CIA2_PRA_DAT_OUT
|
||||
trb CIA2_PRA
|
||||
bra iec__release_clk
|
||||
|
||||
iec_release_clk_pull_data:
|
||||
|
||||
lda #BIT_CIA2_PRA_DAT_OUT
|
||||
tsb CIA2_PRA
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
iec__release_clk:
|
||||
|
||||
lda #BIT_CIA2_PRA_CLK_OUT
|
||||
bra iec__pull_release_trb
|
||||
|
||||
iec_pull_data_release_atn_clk:
|
||||
|
||||
lda #BIT_CIA2_PRA_DAT_OUT
|
||||
tsb CIA2_PRA
|
||||
lda #(BIT_CIA2_PRA_CLK_OUT + BIT_CIA2_PRA_ATN_OUT)
|
||||
+skip_2_bytes_trash_nvz
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
iec_release_atn:
|
||||
|
||||
lda #BIT_CIA2_PRA_ATN_OUT
|
||||
|
||||
; FALLTROUGH
|
||||
|
||||
iec__pull_release_trb:
|
||||
|
||||
trb CIA2_PRA
|
||||
rts
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -92,7 +92,7 @@ load_iec:
|
||||
sta EAL+1
|
||||
|
||||
!ifdef CONFIG_MB_M65 {
|
||||
load_iec_m65cont:
|
||||
load_iec_m65cont:
|
||||
}
|
||||
|
||||
; If secondary address is 0, override EAL with STAL
|
||||
|
||||
@@ -7,17 +7,19 @@
|
||||
|
||||
|
||||
!addr VDOS_INIT = $4020 + 0 * 2
|
||||
!addr VDOS_UNITCHK = $4020 + 1 * 2
|
||||
!addr VDOS_UNITSET = $4020 + 2 * 2
|
||||
!addr VDOS_UNITNUM = $4020 + 3 * 2
|
||||
!addr VDOS_ACPTR = $4020 + 4 * 2
|
||||
!addr VDOS_CIOUT = $4020 + 5 * 2
|
||||
!addr VDOS_LISTEN = $4020 + 6 * 2
|
||||
!addr VDOS_SECOND = $4020 + 7 * 2
|
||||
!addr VDOS_TALK = $4020 + 8 * 2
|
||||
!addr VDOS_TKSA = $4020 + 9 * 2
|
||||
!addr VDOS_UNTLK = $4020 + 10 * 2
|
||||
!addr VDOS_UNLSN = $4020 + 11 * 2
|
||||
!addr VDOS_PRELOAD = $4020 + 1 * 2
|
||||
!addr VDOS_RDCHK = $4020 + 2 * 2
|
||||
!addr VDOS_UNITCHK = $4020 + 3 * 2
|
||||
!addr VDOS_UNITSET = $4020 + 4 * 2
|
||||
!addr VDOS_UNITNUM = $4020 + 5 * 2
|
||||
!addr VDOS_ACPTR = $4020 + 6 * 2
|
||||
!addr VDOS_CIOUT = $4020 + 7 * 2
|
||||
!addr VDOS_LISTEN = $4020 + 8 * 2
|
||||
!addr VDOS_SECOND = $4020 + 9 * 2
|
||||
!addr VDOS_TALK = $4020 + 10 * 2
|
||||
!addr VDOS_TKSA = $4020 + 11 * 2
|
||||
!addr VDOS_UNTLK = $4020 + 12 * 2
|
||||
!addr VDOS_UNLSN = $4020 + 13 * 2
|
||||
|
||||
|
||||
m65dos_init:
|
||||
@@ -28,11 +30,28 @@ m65dos_init:
|
||||
jsr (VDOS_INIT)
|
||||
bra m65dos_end_1
|
||||
|
||||
m65dos_preload:
|
||||
|
||||
; Preaload RAM disk content, only to be used during KERNAL initialization
|
||||
|
||||
jsr map_DOS_1
|
||||
jsr (VDOS_PRELOAD)
|
||||
bra m65dos_end_1
|
||||
|
||||
m65dos_rdchk:
|
||||
|
||||
; Returns in .A the RAM DISK preload status; $00 = OK, $FF = N/A, other = error code
|
||||
|
||||
jsr map_DOS_1
|
||||
jsr (VDOS_RDCHK)
|
||||
bra m65dos_end_1
|
||||
|
||||
|
||||
m65dos_unitchk: ; XXX expose to BASIC
|
||||
|
||||
; Checks is the unit number is supported by the internal DOS
|
||||
; Input: .A - unit number to check
|
||||
; Output: Carry set if not supported, otherwise .A contains unit type (0 = SD card, 1 = internal floppy, 2 = RAM disk)
|
||||
; Output: Carry set if not supported, otherwise .A contains unit type (0 = SD card, 1/2 = internal/external floppy, 3 = RAM disk)
|
||||
|
||||
jsr map_DOS_1
|
||||
jsr (VDOS_UNITCHK)
|
||||
|
||||
@@ -64,6 +64,8 @@ hw_entry_reset:
|
||||
|
||||
jsr m65_reset_common ; RAMTAS, RESTOR, CINT
|
||||
|
||||
jsr m65dos_preload ; preload RAM disk content
|
||||
|
||||
clc
|
||||
jsr M65_MODESET ; on MEGA65 go to native mode by default
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ LOAD:
|
||||
lda MEMUSS+0
|
||||
sta STAL+0
|
||||
lda MEMUSS+1
|
||||
sty STAL+1
|
||||
sta STAL+1
|
||||
|
||||
; Reset status
|
||||
jsr kernalstatus_reset
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
LDA $C3 + STA $C1 + LDA $C$ + STA $C2 + JSR (address not imnculded in similarity)
|
||||
|
||||
Copy 16-bit value from one well-known zero page location to another + jump to subroutine. Trivial - not copyrightable.
|
||||
+18
-11
@@ -306,14 +306,15 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc",
|
||||
{ false, true, true, false, false, "STR_MEM_STRS", "\r STRS" },
|
||||
{ false, true, true, false, false, "STR_MEM_FREE", "\r\r FREE" },
|
||||
|
||||
{ false, false, true, false, false, "STR_DOS_FD", ", FLOPPY " },
|
||||
{ false, false, true, false, false, "STR_DOS_RD", ", RAM DISK " },
|
||||
{ false, false, true, false, false, "STR_DOS_FD", "\rFLOPPY : " },
|
||||
{ false, false, true, false, false, "STR_DOS_SEPAR", " / " },
|
||||
{ false, false, true, false, false, "STR_DOS_RD", "\rRAM DISK : " },
|
||||
|
||||
{ false, false, true, false, false, "STR_SI_HEADER", "OPEN ROMS, " },
|
||||
{ false, false, true, false, false, "STR_SI_MODE64", "LEGACY MODE" },
|
||||
{ false, false, true, false, false, "STR_SI_MODE65", "NATIVE MODE" },
|
||||
{ false, false, true, false, false, "STR_SI_HDR_REL", "\rRELEASE " },
|
||||
{ false, false, true, false, false, "STR_SI_HDR_HW", "BOARD : " },
|
||||
{ false, false, true, false, false, "STR_SI_HDR_HW", "BOARD : " },
|
||||
{ false, false, true, false, false, "STR_SI_HW_01", "MEGA65 R1" },
|
||||
{ false, false, true, false, false, "STR_SI_HW_02", "MEGA65 R2" },
|
||||
{ false, false, true, false, false, "STR_SI_HW_03", "MEGA65 R3" },
|
||||
@@ -324,7 +325,13 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc",
|
||||
{ false, false, true, false, false, "STR_SI_HW_FD", "WUKONG A100T" },
|
||||
{ false, false, true, false, false, "STR_SI_HW_FE", "SIMULATION VHDL" },
|
||||
{ false, false, true, false, false, "STR_SI_HW_XX", "UNKNOWN ID $" },
|
||||
{ false, false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " },
|
||||
{ false, false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " },
|
||||
|
||||
{ false, false, true, false, false, "STR_RD_NAME", "RAMDISK.DNP " },
|
||||
{ false, false, true, false, false, "STR_RD_OK", "LOADED OK\r" },
|
||||
{ false, false, true, false, false, "STR_RD_ERR1", "SIZE WRONG\r" },
|
||||
{ false, false, true, false, false, "STR_RD_ERR2", "TOO LARGE\r" },
|
||||
{ false, false, true, false, false, "STR_RD_ERR3", "NOT FOUND\r" },
|
||||
|
||||
// Note: depending on configuration, additional strings will be added here
|
||||
} };
|
||||
@@ -1147,17 +1154,17 @@ void DataSet::generateConfigDepStrings()
|
||||
if (GLOBAL_ConfigOptions["TAPE_NORMAL"] && GLOBAL_ConfigOptions["TAPE_TURBO"])
|
||||
{
|
||||
featureStr += "TAPE LOAD NORMAL TURBO\r";
|
||||
featureStrM65 += "TAPE : LOAD NORMAL TURBO\r";
|
||||
featureStrM65 += "TAPE : LOAD NORMAL TURBO\r";
|
||||
}
|
||||
else if (GLOBAL_ConfigOptions["TAPE_NORMAL"])
|
||||
{
|
||||
featureStr += "TAPE LOAD NORMAL\r";
|
||||
featureStrM65 += "TAPE : LOAD NORMAL\r";
|
||||
featureStrM65 += "TAPE : LOAD NORMAL\r";
|
||||
}
|
||||
else if (GLOBAL_ConfigOptions["TAPE_TURBO"])
|
||||
{
|
||||
featureStr += "TAPE LOAD TURBO\r";
|
||||
featureStrM65 += "TAPE : LOAD TURBO\r";
|
||||
featureStrM65 += "TAPE : LOAD TURBO\r";
|
||||
}
|
||||
|
||||
// IEC support features
|
||||
@@ -1165,7 +1172,7 @@ void DataSet::generateConfigDepStrings()
|
||||
if (GLOBAL_ConfigOptions["IEC"])
|
||||
{
|
||||
featureStr += "IEC";
|
||||
featureStrM65 += "IEC :";
|
||||
featureStrM65 += "IEC :";
|
||||
|
||||
bool extendedIEC = false;
|
||||
|
||||
@@ -1211,7 +1218,7 @@ void DataSet::generateConfigDepStrings()
|
||||
}
|
||||
else
|
||||
{
|
||||
featureStrM65 += "IEC : NO\r";
|
||||
featureStrM65 += "IEC : -\r";
|
||||
}
|
||||
|
||||
// RS-232 support features
|
||||
@@ -1220,11 +1227,11 @@ void DataSet::generateConfigDepStrings()
|
||||
if (GLOBAL_ConfigOptions["RS232_UP2400"]) featureStr += "UP2400\r";
|
||||
if (GLOBAL_ConfigOptions["RS232_UP9600"]) featureStr += "UP9600\r";
|
||||
|
||||
featureStrM65 += "RS-232 : NO\r";
|
||||
featureStrM65 += "RS-232 : -\r";
|
||||
|
||||
// CBDOS features
|
||||
|
||||
featureStrM65 += "\rSD CARD ";
|
||||
featureStrM65 += "\rSD CARD : ";
|
||||
|
||||
// Keyboard support features
|
||||
|
||||
|
||||
Reference in new issue
Block a user