Write binary data to TRD from ASM
Re: Write binary data to TRD from ASM
Good to know. I've had a similar experience recently trying to figure out the (low-level) +3DOS stuff. Those multi-byte OUTs/INs, madness.
Inactive account
- Alessandro
- Dynamite Dan
- Posts: 1910
- Joined: Wed Nov 15, 2017 11:10 am
- Location: Messina, Italy
- Contact:
Re: Write binary data to TRD from ASM
Hi, I suppose that's because you typed "CODE" in the string as four separate characters instead of the single character 175.Seven.FFF wrote: ↑Wed Dec 13, 2017 7:39 pm I had been trying to get this one working too. This is the "official" API that passes tokenized basic commands to TR-Dos. I ran into issues with my tokenization - the stuff in my reference REM statements were being tokenised as "C", "O", "D", "E" etc and it was causing confusion with some other problems I was having at the same time. It clearly works in my basic loader though, so I could revisit this later. But I don't really need to.
Tokenization of BASIC commands is actually more useful to me since it allows me, with a simple trick, to modify the code of the TR-DOS file management program, so that it can be compatible with the Brazilian clones of the Beta Disk interface, i.e. Arcade AR-20, IDS-91, CBI-95, which point of access for the commands is 15363 instead of 15619. This was pointed to my attention by Flávio Massao Matsumoto, and I have employed it in many of my games.
Code: Select all
LET d = 15363 + 256 * PEEK (15363<>195)
If for instance the call routine is located at 25000:
Code: Select all
25000 034 093 092 LD (CHADD),HL
25003 205 003 061 CALL 15619
25006 042 181 097 LD HL,(TEMP)
25009 034 093 092 LD (CHADD),HL
25012 201 RET
25013 DEFS 2
Code: Select all
IF d = 15619 THEN POKE 25005,61
IF d = 15363 THEN POKE 25005,60
Re: Write binary data to TRD from ASM
That’s very useful, thanks Alessandro!
Robin Verhagen-Guest
SevenFFF / Threetwosevensixseven / colonel32
NXtel • NXTP • ESP Update • ESP Reset • CSpect Plugins
SevenFFF / Threetwosevensixseven / colonel32
NXtel • NXTP • ESP Update • ESP Reset • CSpect Plugins
- Alessandro
- Dynamite Dan
- Posts: 1910
- Joined: Wed Nov 15, 2017 11:10 am
- Location: Messina, Italy
- Contact:
Re: Write binary data to TRD from ASM
You are welcome
Of course HL should point to the BASIC command of the block you wish to load. Another example, related to my post above (loading routine at 25000):
Notice that the CODE function is stored as character 175.
Of course HL should point to the BASIC command of the block you wish to load. Another example, related to my post above (loading routine at 25000):
Code: Select all
LD HL, CHADD
LD (TEMP),HL
LD HL,BLOCK
CALL 25000
RET
BLOCK:
DEFB 234 ; REM
DEFM ":"
DEFB 239 ; LOAD
DEFB 34 ; "
DEFM "FILENAME"
DEFB 34 ; "
DEFB 175 ; CODE
DEFB 13 ; [ENTER]
- Alessandro
- Dynamite Dan
- Posts: 1910
- Joined: Wed Nov 15, 2017 11:10 am
- Location: Messina, Italy
- Contact:
Re: Write binary data to TRD from ASM
Update. This comes from the forthcoming new version of the Al's Double Bill compilation.
Here is the "boot" program for the disk (any BASIC program named "boot" will be executed when RUN is entered at the TR-DOS prompt):
Line 20 checks if PEEK 15363 = 195; in this case, d = 15363 and a non-standard Beta Disk interface is connected.
And here is the code for the first MC block loaded from disk. First, it checks the type of Beta Disk interface - standard or not -, then it "recognizes" whether it is running on a 48K or not. Finally, it loads the main selection program accordingly.
The first trick was suggested to me by Einar Saukas, the second by Flávio Matsumoto.
Here is the "boot" program for the disk (any BASIC program named "boot" will be executed when RUN is entered at the TR-DOS prompt):
Code: Select all
10 BORDER NOT PI: PAPER NOT PI: INK NOT PI: BRIGHT SGN PI: CLEAR VAL "24499"
20 LET d=VAL "15363"+VAL "256"*(PEEK 15363<>195)
30 RANDOMIZE USR d : REM : LOAD "ADB" CODE
40 RANDOMIZE USR VAL "24500"
And here is the code for the first MC block loaded from disk. First, it checks the type of Beta Disk interface - standard or not -, then it "recognizes" whether it is running on a 48K or not. Finally, it loads the main selection program accordingly.
The first trick was suggested to me by Einar Saukas, the second by Flávio Matsumoto.
Code: Select all
ORG 24500
KEY_VAL EQU 24587
CHADD EQU 23645
CALL CLEANER
LD HL, ADB_SCR
LD DE, 16384
CALL dzx7
LD B,150
CALL DELAY
LD A,(15363)
CP 195
JR NZ, MEMORY ; if PEEK 15363 <> 195 then a standard Beta Disk is connected
LD A,60
LD (KEY_VAL),A ; ...otherwise it is a clone and the location is modified
MEMORY:
LD A,(2899)
CP 165
JR NZ,ZX128
ZX48:
LD HL,(CHADD)
LD (TEMP),HL
LD HL,ADB48
CALL TRDOS
JP 32770
ZX128:
LD HL,(CHADD)
LD (TEMP),HL
LD HL,ADB128
CALL TRDOS
JP 32770
DELAY:
HALT
DJNZ DELAY
RET
CLEANER:
LD A,64 ; (64 for BRIGHT 1)
LD (23693),A ; PAPER 0, INK 0, BRIGHT 1
LD (23624),A ; the last two rows have INK and PAPER set to 0
CALL 3503 ; CLS
RET
TRDOS:
LD (CHADD),HL
CALL 15619 ; recalls the TR-DOS loading routine (the last byte here is KEY_VAL)
LD HL,(TEMP) ; reloads CHADD's original value in HL
LD (CHADD),HL ; restores CHADD's original value
RET
TEMP: DEFS 2 ; CHADD's original value is stored here
ADB48:
DEFB 234 ; REM
DEFM ":"
DEFB 239 ; LOAD
DEFB 34 ; "
DEFM "ADB-48"
DEFB 34 ; "
DEFB 175 ; CODE
DEFB 13 ; [ENTER]
ADB128:
DEFB 234 ; REM
DEFM ":"
DEFB 239 ; LOAD
DEFB 34 ; "
DEFM "ADB-128"
DEFB 34 ; "
DEFB 175 ; CODE
DEFB 13 ; [ENTER]
INCLUDE "dzx7_agileRCS.asm" ; Einar Saukas's RCS-ZX7 integrated decompressor
ADB_SCR: INCBIN "ADB-ZX7.bin" ; compressed loading screen