Merge pull request #69 from FeralChild64/master

Minor fix release
This commit is contained in:
FeralChild64 authored and GitHub committed 2021-08-23 19:38:35 +02:00
commit 113523ab76
80 files changed
+1526 -585

No files matched your search

+1 -1
View File
@@ -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.
+3 -2
View File
@@ -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.
BIN
View File
Binary file not shown.
Binary file not shown.
+12 -11
View File
@@ -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
+1 -1
View File
@@ -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
+40 -30
View File
@@ -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
+1
View File
@@ -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
;
+8 -2
View File
@@ -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
+1
View File
@@ -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
+6
View File
@@ -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
+12
View File
@@ -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.
+32 -3
View File
@@ -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
View File
@@ -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
View File
@@ -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
+1
View File
@@ -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
+2
View File
@@ -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
+9 -5
View File
@@ -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
+6
View File
@@ -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
+17
View File
@@ -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
+24
View File
@@ -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
+13 -4
View File
@@ -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
+10 -3
View File
@@ -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
View File
@@ -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
+8 -6
View File
@@ -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
+38 -38
View File
@@ -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
+5 -41
View File
@@ -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
@@ -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
+65 -21
View File
@@ -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
+36 -13
View File
@@ -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
+23 -7
View File
@@ -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
+1
View File
@@ -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
+23 -7
View File
@@ -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
@@ -4,7 +4,7 @@
;
unit_sd_cmd_CLOSE:
card_sd_cmd_CLOSE:
; XXX provide implementation
@@ -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
@@ -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
+13
View File
@@ -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
+46
View File
@@ -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
@@ -4,7 +4,7 @@
;
unit_rd_cmd_CLOSE:
disk_rd_cmd_CLOSE:
; XXX provide implementation
+134
View File
@@ -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
+212
View File
@@ -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
+159
View File
@@ -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
@@ -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
-28
View File
@@ -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,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
-28
View File
@@ -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
+21
View File
@@ -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
+1 -1
View File
@@ -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
+75
View File
@@ -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
+31
View File
@@ -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
+11 -4
View File
@@ -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
+14 -14
View File
@@ -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
+5
View File
@@ -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
+83 -4
View File
@@ -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
}
}
+1 -1
View File
@@ -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
+31 -12
View File
@@ -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)
+2
View File
@@ -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
+1 -1
View File
@@ -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
+3
View File
@@ -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
View File
@@ -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