2025-10-05, 10:33 PM
Hi
I'm looking at using some 3DOS commands, starting to see how I can cat a disk.
I've takend the below code from the +3 manula (pg 200 to 203) which should allow me to get the CAT into memory - the code looks to activate the disk (and for example if I don't attach a disk, it give me abort/retry) but then "reboots"/crashes the emulator back to the +3 menu.
I'm assuming that there might be some incompatibility somewhere between, starting reading, and returning contorl to the program. Code is below.
Any thoughts?
(PS If the ASM didn't crash, the program wouldn't actually do anything anyway yet, as I've not sorted any output, or any caribles)
I'm looking at using some 3DOS commands, starting to see how I can cat a disk.
I've takend the below code from the +3 manula (pg 200 to 203) which should allow me to get the CAT into memory - the code looks to activate the disk (and for example if I don't attach a disk, it give me abort/retry) but then "reboots"/crashes the emulator back to the +3 menu.
I'm assuming that there might be some incompatibility somewhere between, starting reading, and returning contorl to the program. Code is below.
Any thoughts?
(PS If the ASM didn't crash, the program wouldn't actually do anything anyway yet, as I've not sorted any output, or any caribles)
Code:
#include <input.bas>
#include <screen.bas>
#INCLUDE <keys.bas>
PRINT "This is the start"
main()
SUB main()
LET YesNo = "n"
PRINT "do you want to CAT disk"
YesNo = INPUT(1)
IF YesNo="y" then
Catalogue()
END IF
PRINT "Ed#nd Main"
END SUB
SUB Catalogue()
ASM
PUSH IX ; dos catalog corrupts ix
PROC
LOCAL MYSTACK
LOCAL STACKSTORAGE
LOCAL BANKM
LOCAL PORT1
LOCAL CATBUFF
LOCAL DOS_CATALOG
MYSTACK EQU 9fffh ;
STACKSTORAGE EQU 9000h ; save pointer
BANKM EQU 5b5ch ; system var that holds last value output to 7ff0h
PORT1 EQU 7ffdh ; address of rom/ram switching port
CATBUFF EQU 8000h ; location for dos to output
DOS_CATALOG EQU 011Eh ; DOS routine to call
JP start
stardstar: defb "*.*",255
dosret: defw 0
start:
DI
LD (STACKSTORAGE),SP
LD BC,PORT1 ;
LD A,(BANKM) ; current switch state
RES 4,A ; move right to left in horizontal rom switch (3 to 2)
OR 7 ; switch in ram page 7
LD (BANKM),A ; keep system var up to date
OUT (C),A ; switch ram and rom
LD SP,MYSTACK ; make sure stack is above 4000h and below bfeoh
EI ; enable interrupts
;
LD HL,CATBUFF
LD DE,CATBUFF+1
LD BC,1024
LD (HL),0
LDIR
LD B,64
LD C,1
LD DE, CATBUFF
LD HL,stardstar ;file name *.*
CALL DOS_CATALOG ;call dos catalog
PUSH AF
POP HL
LD (dosret),HL ; put here so can be seen from basic
LD C,B ; number of files in catalog, low byte of bc
LD B,0 ; returned to basic by usr functio
DI
PUSH BC
LD BC, PORT1
LD A, (BANKM)
SET 4, A ; move left to right (riom 2 to 3)
AND 48h ; ram page 9
LD (BANKM),A ; update syste value
OUT (C),A ;switch
POP BC ; get back saved number of files
LD SP,(STACKSTORAGE) ;
EI
;RET ; not sure if thisis needed
ENDP
POP IX
;RET ; Not sure if this is needed here
END ASM
END SUB
