3,051 bytes added,
22:50, 12 March 2007 <pre>
;; 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
;;----------------------------------------------------------------
ret
;;-------------------------------------------------------------
;; This is initialised if the "REN" command is found.
;; this data is used to access command via "RST 3: KL FAR CALL"
.ren_command
defw 0 ;; address of function
defb 0 ;; "rom select" to access function
;;-------------------------------------------------------------
;; the name of the function
;; - AMSDOS command "REN" (rename a file)
.cmd_ren
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)
.parameter_buffer
defs 4 ;; space for 2 parameters
;;-------------------------------------------------------------
;; the string descriptor blocks for the parameters
;; string descriptor block for old filename
.sdb_old_filename
defb end_old_filename-old_filename ;; length of string
defw old_filename ;; address of string
;; string descriptor block for new filename
.sdb_new_filename
defb end_new_filename-new_filename ;; length of string
defw new_filename ;; address of string
;;-------------------------------------------------------------
;; the old filename
.old_filename
defb "SCREEN.BIN"
.end_old_filename
;; the new filename
.new_filename
defb "SCREEN.SCR"
.end_new_filename
</pre>