Programming:Calling a RSX from outside of BASIC

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
;; This example will show how to execute a RSX command with parameters
;; outside BASIC.
;; e.g. 
;; |REN,"<new filename>,"<old filename>"
;; Steps:
;; 1. Find RSX command and store information to access it (address of function
;;    and "rom select")
;; 2. Initialise parameter buffer (pointed to by IX register), and number of parameters (in A register)
;; 3. Execute command.

org &8000

;; firmware function to find a RSX command by name
.kl_find_command equ &bcd4

;; STEP 1: Find "REN" command, store access information

ld hl,cmd_ren
call kl_find_command
ret nc

ld (ren_command),hl	;; store address of function
ld a,c
ld (ren_command+2),a	;; store "rom select" of function

;; STEP 2: Initialise parameter buffer and number of parameters

ld ix,parameter_buffer	;; pointer to start of parameter buffer
ld a,2			;; number of parameters

;; store address of string descriptor block for old filename (2nd parameter)
ld hl,sdb_old_filename
ld (ix+0),l
ld (ix+1),h

;; store address of string descriptor block for new filename (1st parameter)
ld hl,sdb_new_filename
ld (ix+2),l
ld (ix+3),h

;; STEP 3: Execute REN command with parameters

rst 3			;; KL FAR CALL
defw ren_command


;; This is initialised if the "REN" command is found.
;; this data is used to access command via "RST 3: KL FAR CALL"

defw 0			;; address of function
defb 0			;; "rom select" to access function


;; the name of the function 
;; - AMSDOS command "REN" (rename a file)
defb "RE","N"+&80


;; the parameter buffer:
;; - 2 bytes per parameter:
;;   integer constant: the constant
;;   integer variable: address of 2-byte integer variable
;;   string: address of string descriptor block
;;   real: address of 5-byte real number

;; - parameters are stored in reverse order (last parameter is first
;; in the buffer, first parameter is last in the buffer)

defs 4			;; space for 2 parameters

;; the string descriptor blocks for the parameters

;; string descriptor block for old filename
defb end_old_filename-old_filename		;; length of string
defw old_filename				;; address of string

;; string descriptor block for new filename
defb end_new_filename-new_filename		;; length of string
defw new_filename				;; address of string


;; the old filename

;; the new filename