Emulator Enhanced MC6809 Instructions v1.00

  1. MUL8
  2. MUL16
  3. DIV16
  4. DIV32
  5. IMUL8
  6. IMUL16
  7. IDIV16
  8. IDIV32
  9. SHELL
  10. IPORT
  11. OPORT
  12. RMEM
  13. WMEM
  14. SSPD
  15. GSPD
  16. OPEN
  17. CLOSE
  18. READ
  19. WRITE
  20. SEEK
  21. ERROR
  22. FINDFIRST
  23. FINDNEXT
  24. LOAD
  25. CHDIR
  26. GETDIR
  27. PATHOPEN
  28. CLOSEALL
  • Multiply two 8 bit values
  • Multiply two 16 bit values
  • Divide two 16 bit values
  • Divide two 32 bit values
  • Multiply two 8 bit signed values
  • Multiply two 16 bit signed values
  • Divide two 16 bit signed values
  • Divide two 32 bit signed values
  • PC DOS Shell function
  • Input from PC port
  • Output to PC port
  • Read from PC memory address
  • Write to PC memory address
  • Set CPU speed
  • Get Current CPU speed
  • Open PC file
  • Close PC file
  • Read record from PC file
  • Write record to PC file
  • Move PC file pointer
  • Build PC error mesage
  • Find first matching directory entry
  • Find next directory entry
  • Load object file from PC directory
  • Change PC's working directory
  • Get current working directory
  • Open PC file using default paths & hard disk paths
  • Close single file or all files

Return to emulator documentation


MUL8 U

Operation:  M:M+1 << M x M+1

Format:
                 Opcode     Operands

     FDB  $1000

Description:

Multiply value in memory location M by value in memory location M+1. Result is stored in M:M+1.

CYCLES: 2

Condition Bits Affected:

V:   Clear if M is zero; set otherwise
C:   Clear if M is zero; set otherwise

Example:

100       LDU      #WORK          ; load U with pointer to work area
110       LDD      #$1540         ; load D w/2 8 bit value to multiply
120       STD      U              ; store values in work area
130       FDB      $1000          ; multiply 8 bit unsigned values
          .
          .
          .
200 WORK  FDB      $0000          ; 8 bytes of work area used by all
210       FDB      $0000          ; the enhanced MC6809 instructions
220       FDB      $0000
230       FDB      $0000

After execution M:M+1 will contain 0540h and the C and V condition bits are set.


MUL16 U

Operation:   M:M+1:M+2:M+3 << M:M+1 x M+2:M:3

Format:

          Opcode    Operands

   FDB  $1001

Description:

Multiply value in memory location M:M+1 by value in memory location M+2:M+3.
Result is stored in M:M+1:M+2:M+3.

CYCLES: 2

Condition Bits Affected:

V:   Clear if M:M+1 is zero; set otherwise
C:   Clear if M:M+1 is zero; set otherwise

Example:

100       LDU      #WORK          ; load U with pointer to work area
110       LDD      #$2175         ; load D w/16 bit divisor
120       STD      U              ; store in work area
130       LDD      #$40           ; load D w/16 bit dividend
140       STD      2,U            ; store in work area
150       FDB      $1002          ; divide 16 bit unsigned values
          .
          .
          .
200 WORK  FDB      $0000          ; 8 bytes of work area used by all
210       FDB      $0000          ; the enhanced MC6809 instructions
220       FDB      $0000
230       FDB      $0000

After execution M+2:M+3 will contain 0085h, M:M+1 will contain 0035h and the C and V condition bits are clear.


DIV16 U

Operation:   remainder (M:M+1), quotient (M+2:M+3) << M+2:M+3 / M:M+1

Format:

          Opcode    Operands

   FDB  $1002

Description:

Divide value in memory location M+2:M+3 by value in memory location M:M+1.
Quotient is stored in M+2:M+3, the remainder is stored in M:M+1.

CYCLES: 2

Condition Bits Affected:

V:   Set if divide by zero; reset otherwise
C:   Set if divide by zero; reset otherwise

Example:

100       LDU       #WORK     ; load U with pointer to work area
110       LDD       #$2175    ; load D w/16 bit divisor
120       STD       U         ; store in work area
130       LDD       #$40      ; load D w/16 bit dividend
140       STD       2,U       ; store in work area
150       FDB       $1002     ; divide 16 bit unsigned values
          .
          .
          .
200 WORK  FDB       $0000      ; 8 bytes of work area used by all
210       FDB       $0000      ; the enhanced MC6809 instructions
220       FDB       $0000
230       FDB       $0000

After execution M+2:M+3 will contain 0085h, M:M+1 will contain 0035h and the C and V condition bits are clear.


DIV32 U

Operation:   remainder (M:M+1:M+2:M+3), quotient (M+4:M+5:M+6:M+7) <<
                             M+4:M+5:M+6:M+7 / M:M+1:M+2:M+3

Format:

          Opcode    Operands

   FDB  $1003

Description:

Divide value in memory location M+4:M+5:M+6+M+7 by value in memory location M:M+1:M+2:M+3.
Quotient is stored in M+4:M+5:M+6:M+7, the remainder is stored in M:M+1:M+2:M+3.

CYCLES: 2

Condition Bits Affected:

V:   Set if divide by zero; reset otherwise
C:   Set if divide by zero; reset otherwise

Example:

100       LDU       #WORK     ; load U with pointer to work area
110       LDD       #$40      ; load D w/1st 16 bits of divisor
120       STD       U         ; store in work area
130       LDD       #$2175    ; load D w/2nd 16 bits of divisor
140       STD       2,U       ; store in work area
150       LDD       #$01      ; load D w/1st 16 bits of dividend
160       STD       4,U       ; store in work area
170       LDD       #$4578    ; load D w/2nd 16 bits of dividend
180       STD       6,U       ; store in work area
190       FDB       $1003     ; divide 16 bit unsigned values
          .
          .
          .
300 WORK  FDB $0000           ; 8 bytes of work area used by all
310       FDB $0000           ; the enhanced MC6809 instructions
320       FDB $0000
330       FDB $0000

After execution M+4:M+5:M+6:M+7 will contain 00000032h, M:M+1:M+2:M+3 will contain 00009005h and the C and V condition bits are clear.


IMUL8 U

Operation:   M:M+1 << M x M+1

Format:

          Opcode    Operands

   FDB  $1004

Description:

Preform a signed multiply of the value in memory location M by value in memory location M+1. Result is stored in M:M+1.

CYCLES: 2

Condition Bits Affected:

V:   Clear if M:M+1 = sign-extend of M+1 to 16 bits & no overflow; set otherwise
C:   Clear if M:M+1 = sign-extend of M+1 to 16 bits & no overflow; set otherwise

Example:

100       LDU      #WORK          ; load U with pointer to work area
110       LDD      #$2175         ; load D w/16 bit divisor
120       STD      U              ; store in work area
130       LDD      #$40           ; load D w/16 bit dividend
140       STD      2,U            ; store in work area
150       FDB      $1002          ; divide 16 bit unsigned values
          .
          .
          .
200 WORK  FDB      $0000          ; 8 bytes of work area used by all
210       FDB      $0000          ; the enhanced MC6809 instructions
220       FDB      $0000
230       FDB      $0000

After execution M+2:M+3 will contain 0085h, M:M+1 will contain 0035h and the C and V condition bits are clear.


IMUL16 U

Operation:   M:M+1:M+2:M+3 << M:M+1 x M+2:M:3

Format:

          Opcode    Operands

   FDB  $1005

Description:

Multiply value in memory location M:M+1 by value in memory location M+2:M+3.
Result is stored in M:M+1:M+2:M+3.

CYCLES: 2

Condition Bits Affected:

V:   Clear if M:M+1:M+2:M+3 = sign-extend of M+2:M+3 to 32 bits & no overflow;
       set otherwise
C:   Clear if M:M+1:M+2:M+3 = sign-extend of M+2:M+3 to 32 bits & no overflow;
      set otherwise

Example:

100       LDU      #WORK          ; load U with pointer to work area
110       LDD      #$2175         ; load D w/16 bit divisor
120       STD      U              ; store in work area
130       LDD      #$40           ; load D w/16 bit dividend
140       STD      2,U            ; store in work area
150       FDB      $1002          ; divide 16 bit unsigned values
          .
          .
          .
200 WORK  FDB      $0000          ; 8 bytes of work area used by all
210       FDB      $0000          ; the enhanced MC6809 instructions
220       FDB      $0000
230       FDB      $0000

After execution M+2:M+3 will contain 0085h, M:M+1 will contain 0035h and the C and V condition bits are clear.


IDIV16 U

Operation:   remainder (M:M+1), quotient (M+2:M+3) << M+2:M+3 / M:M+1

Format:

          Opcode    Operands

   FDB  $1006

Description:

Divide value in memory location M+2:M+3 by value in memory location M:M+1.
Quotient is stored in M+2:M+3, the remainder is stored in M:M+1.

CYCLES: 2

Condition Bits Affected:

V:   Set if divide by zero or overflow; reset otherwise
C:   Set if divide by zero or overflow; reset otherwise

Example:

100       LDU       #WORK     ; load U with pointer to work area
110       LDD       #$2175    ; load D w/16 bit divisor
120       STD       U         ; store in work area
130       LDD       #$40      ; load D w/16 bit dividend
140       STD       2,U       ; store in work area
150       FDB       $1002     ; divide 16 bit unsigned values
          .
          .
          .
200 WORK  FDB       $0000      ; 8 bytes of work area used by all
210       FDB       $0000      ; the enhanced MC6809 instructions
220       FDB       $0000
230       FDB       $0000

After execution M+2:M+3 will contain 0085h, M:M+1 will contain 0035h and the C and V condition bits are clear.


IDIV32 U

Operation:   remainder (M:M+1:M+2:M+3), quotient (M+4:M+5:M+6:M+7) <<
                             M+4:M+5:M+6:M+7 / M:M+1:M+2:M+3

Format:

         Opcode    Operands

   FDB  $1007

Description:

Divide value in memory location M+4:M+5:M+6+M+7 by value in memory location M:M+1:M+2:M+3.
Quotient is stored in M+4:M+5:M+6:M+7, the remainder is stored in M:M+1:M+2:M+3.

CYCLES: 2

Condition Bits Affected:

V:   Set if divide by zero or overflow; reset otherwise
C:   Set if divide by zero or overflow; reset otherwise

Example:

100       LDU       #WORK     ; load U with pointer to work area
110       LDD       #$40      ; load D w/1st 16 bits of divisor
120       STD       U         ; store in work area
130       LDD       #$2175    ; load D w/2nd 16 bits of divisor
140       STD       2,U       ; store in work area
150       LDD       #$01      ; load D w/1st 16 bits of dividend
160       STD       4,U       ; store in work area
170       LDD       #$4578    ; load D w/2nd 16 bits of dividend
180       STD       6,U       ; store in work area
190       FDB       $1003     ; divide 16 bit unsigned values
          .
          .
          .
300 WORK  FDB $0000           ; 8 bytes of work area used by all
310       FDB $0000           ; the enhanced MC6809 instructions
320       FDB $0000
330       FDB $0000

After execution M+4:M+5:M+6:M+7 will contain 00000032h, M:M+1:M+2:M+3 will contain 00009005h and the C and V condition bits are clear.


SHELL U, A

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $1008

Description:

Shell to DOS and execute the command pointed to by register M:M+1. If the command is null (only a zero terminator) then this function shells to a DOS prompt. If Z condition bit is set then the command executed ok else register A contains the error number.

If register A is non-zero then a push any key to continue message will be displayed when the command finishes before the COCO screen is re-displayed.

CYCLES: 2

Condition Bits Affected:

Z:   Set if shell command ok; reset otherwise

Example:

100       LDU       #WORK      ; load U with pointer to work area
110       LDD       #CMD       ; load D with address of command
120       STD       U          ; string and store in work area
130       LDA       #$01       ; display push any key to continue message
140       FDB       $1008      ; execute shell command
          .
          .
          .
200 CMD   FCC       'DIR'      ; zero terminated command to execute
210       FCB       $00
220 WORK  FDB       $0000      ; 8 bytes of work area used by all
230       FDB       $0000      ; the enhanced MC6809 instructions
240       FDB       $0000
250       FDB       $0000


IPORT A, U

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $100A

Description:

Read the PC port pointed to by M:M+1 into register A.

CYCLES: 2

Condition Bits Affected: none

Example:

100       LDU       #WORK     ; load U with pointer to work area
110       LDD       #$0201    ; load D with address of PC game port
120       STD       U         ; store in work area
130       FDB       $100A     ; read PC port and store in A
          .
          .
          .
300 WORK  FDB $0000           ; 8 bytes of work area used by all
310       FDB $0000           ; the enhanced MC6809 instructions
320       FDB $0000
330       FDB $0000


OPORT U, A

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $100B

Description:

Write register to the PC port pointed to by M:M+1.

CYCLES: 2

Condition Bits Affected: none

Example:

100       LDU       #WORK     ; load U with pointer to work area
110       LDD       #$0201    ; load D with address of PC game port
120       STD       U         ; store in work area
130       LDA       #$0FF     ; load A with value to write to port
140       FDB       $100B     ; store A in PC port
          .
          .
          .
300 WORK  FDB $0000           ; 8 bytes of work area used by all
310       FDB $0000           ; the enhanced MC6809 instructions
320       FDB $0000
330       FDB $0000


RMEM A, U

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $100C

Description:

Read the PC memory address pointed to by register M:M+1 : M+2:M+3 into register A. Register M:M+1 contains the PC segment and M+2:M+3 contains the address within the segment.

CYCLES: 2

Condition Bits Affected: none

Example:

100       LDU       #WORK     ; load U with pointer to work area
110       LDD       #$0040    ; load D with segment address
120       STD       U         ; store in work area
130       LDD       #$0000    ; load D with memory address
140       STD       U         ; store in work area
150       FDB       $100C     ; read address 0040h:0000h into A
          .
          .
          .
300 WORK  FDB $0000           ; 8 bytes of work area used by all
310       FDB $0000           ; the enhanced MC6809 instructions
320       FDB $0000
330       FDB $0000


WMEM U, A

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $100D

Description:

Read the PC memory address pointed to by register M:M+1 : M+2:M+3 into register A. Register M:M+1 contains the PC segment and M+2:M+3 contains the address within the segment.

CYCLES: 2

Condition Bits Affected: none

Example:

100       LDU       #WORK     ; load U with pointer to work area
110       LDD       #$0040    ; load D with segment address
120       STD       U         ; store in work area
130       LDD       #$0000    ; load D with memory address
140       STD       U         ; store in work area
150       FDB       $100C     ; read address 0040h:0000h into A
          .
          .
          .
300 WORK  FDB $0000           ; 8 bytes of work area used by all
310       FDB $0000           ; the enhanced MC6809 instructions
320       FDB $0000
330       FDB $0000


SSPD A

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $100E

Description:

Set CPU speed to value defined by register A.bits 0-1

bits 0-1
   00   2/1.77mhz
   01   4mhz
   10   1mhz
   11   8mhz

bit 2   Turbo speed if set

bit 3   Speed port locked if set

CYCLES: 2

Condition Bits Affected: none

Example:

100      LDA      #$03      ; load A with value for 3.58mhz
110      FDB      $100E     ; set speed


GSPD A

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $100F

Description:

Get CPU speed and return value in register A.

bits 0-1
   00   2/1.77mhz
   01   4mhz
   10   1mhz
   11   8mhz

bit 2   Turbo speed if set

bit 3   Speed port locked if set

CYCLES: 2

Condition Bits Affected: none

Example:

110      FDB      $100E     ; get speed


OPEN U

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $1010

Description:

Opens the file specified by the path pointed to by M:M+1. The path must conform to PC standards and be zero terminated. M+2:M+3 is used to define the type of file access. If the file is being created M+4:M+5 is used to define the access permission.

If the open is successful the Z condition bit is set and the file's channel is returned in M+4:M+5 else the Z condition bit is reset, and the A register contains the error number.
File Access:

File Access:

M+2:M+3, bits 0-1:
     00 open file read only
     01 open file write only
     10 open file read/write

bit 6    create file if doesn't exist (create)
bit 7    used only with bit 6 set. If file exists, an error is returned
bit 9    if file exists then file is truncated (truncate)
bit 10  the file pointer will be set to the end of the file prior to each write (append)

File Access Permission:

M+4:M+5:
bit 7   if set, permission to write to file
bit 8   if set, permission to read to file

NOTE: only has effect when file is being created. To allow read & write access both bits must be set.

CYCLES: 2

Condition Bits Affected:

Z:   Set if file opened ok; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #PCFN        ; load D w/address of filename
120       STD       U            ; store in work area
130       LDD       #$0241       ; create or truncate file & open
140       STD       2,U          ; in write only mode
150       LDD       #$0180       ; create file with read & write
160       STD       4,U          ; permission
170       FDB       $1010        ; execute open command
180       BNE       ERROR        ; jump if error
190       LDD       4,U          ; save channel #
200       STD       CHAN
          .
          .
          .
300 PCFN  FCC       'PCFILE.BIN' ; zero terminated filespec to open
310       FCB       $00
320 CHAN  FDB       $0000        ; saved channel number
330 WORK  FDB       $0000        ; 8 bytes of work area used by all
340       FDB       $0000        ; the enhanced MC6809 instructions
350       FDB       $0000
360       FDB       $0000


CLOSE U

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $1011

Description:

Closes file on channel specified by M+4:M+5. The Z condition bit is set if close successful else the Z condition bit is reset and the A register contains the error number.

CYCLES: 2

Condition Bits Affected:

Z:   Set if file closed ok; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       CHAN         ; load D with channel #
120       STD       4,U          ; store in work area
130       FDB       $1011        ; execute close command
140       BNE       ERROR        ; jump if error          .
          .
          .
          .
300 CHAN  FDB       $0000        ; saved channel number
310 WORK  FDB       $0000        ; 8 bytes of work area used by all
320       FDB       $0000        ; the enhanced MC6809 instructions
330       FDB       $0000
340       FDB       $0000


READ U

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $1012

Description:

Read the number of bytes defined by register M+2:M+3 into the buffer area pointed to by M:M+1 from the channel defined by M+4:M+5. If the Z condition bit is set then the read was successful, M+2:M+3 will contain the number of bytes actually read and the buffer will contain the data read. If M+2:M+3 is less than the value before execution of the instruction and there was no error then the end of file was reached. If an read error occurred then the Z condition bit is reset and M+2:M+3 will contain the number of bytes actually read and register A will contain the error number.

It is possible to read 0001h to 2000h bytes in a single read.

CYCLES: 2

Condition Bits Affected:

Z:   Set if file read ok; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #BUFF        ; load D w/address of buffer
120       STD       U            ; store in work area
130       LDD       CHAN         ; load D with channel #
140       STD       4,U          ; store in work area
150       LDD       #$0100       ; store number of bytes to read
160       STD       2,U
170       FDB       $1012        ; execute read command
180       BNE       ERROR        ; jump if error
190       CMPD       2,U         ; all bytes read?
200       BNE       ERROR        ; jump if not
          .
          .
          .
300 BUFF  FCB       $00          ; 256 bytes of storage space
          .
          .
          .
320 CHAN  FDB       $0000        ; saved channel number
330 WORK  FDB       $0000        ; 8 bytes of work area used by all
340       FDB       $0000        ; the enhanced MC6809 instructions
350       FDB       $0000
360       FDB       $0000


WRITE U

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $1013

Description:

Write the number of bytes defined by M+2:M+3 from the buffer area pointed to by M:M+1 to the channel defined by M+4:M+5. If the Z condition bit is set then the write was successful, M+2:M+3 will contain the number of bytes actually read and the buffer will be unchanged. If an read error occurred then the Z condition bit is reset and M+2:M+3 will contain the number of bytes actually written & register A will contain the error number.

It is possible to write 0001h to 2000h bytes in a single write. If M+2:M+3 contains 0000h then the file will be truncated at the current file pointer location.

CYCLES: 2

Condition Bits Affected:

Z:   Set if file write ok; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #BUFF        ; load D w/address of buffer
120       STD       U            ; store in work area
130       LDD       CHAN         ; load D with channel #
140       STD       4,U          ; store in work area
150       LDD       #$0100       ; store number of bytes to read
160       STD       2,U
170       FDB       $1013        ; execute write command
180       BNE       ERROR        ; jump if error
190       CMPD       2,U         ; all bytes written?
200       BNE       ERROR        ; jump if not
          .
          .
          .
300 BUFF  FCB       $00          ; 256 bytes of storage space
          .
          .
          .
320 CHAN  FDB       $0000        ; saved channel number
330 WORK  FDB       $0000        ; 8 bytes of work area used by all
340       FDB       $0000        ; the enhanced MC6809 instructions
350       FDB       $0000
360       FDB       $0000


SEEK U

Operation:   Emulator Instruction (DOS Int 21h Function 42h)

Format:

          Opcode    Operands

   FDB  $1014

-or-

   FDB  $101D

Description:

Set the file position to the 32 bit signed integer value defined by M:M+1:M+2:M+3 using the method defined in register A. If successful the Z condition bit is set and the 32 bit signed integer value M:M+1:M+2:M+3 is updated with the new file position. If an error occurs then the Z condition bitg is reset and register A contains the error number.

Using method 1 or 2 it is possible to position beyond the start of the file without an error, an error will occur upon a subsequent read or write to the file.

Method code:

A = 0 absolute byte offset from beginning of file (always positive double integer)
A = 1 byte offset from current location (positive or negative double integer)
A = 2 byte offset from end of file (positive or negative double integer)

The $101D command will truncate or extend the file to the new position.

CYCLES: 2

Condition Bits Affected:

Z:   Set if file seek ok; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #$00         ; load D w/new file position
120       STD       U            ; store in work area
130       LDD       #$0100
140       STD       2,U
150       LDD       CHAN         ; load D with channel #
160       STD       4,U          ; store in work area
170       FDB       $1014        ; execute seek command
180       BNE       ERROR        ; jump if error
          .
          .
          .
300 BUFF  FCB       $00          ; 256 bytes of storage space
          .
          .
          .
320 CHAN  FDB       $0000        ; saved channel number
330 WORK  FDB       $0000        ; 8 bytes of work area used by all
340       FDB       $0000        ; the enhanced MC6809 instructions
350       FDB       $0000
360       FDB       $0000


ERROR U, A

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $1015

Description:

Builds error message in buffer pointed to by M:M+1 for the error number in register A. If the length of the buffer is not able to hold the entire message the message is truncated to fit and register A contains range error, else register A is set to zero.

CYCLES: 2

Condition Bits Affected:

Z:   always set

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       CHAN         ; load D with channel #
120       STD       4,U          ; store in work area
130       FDB       $1011        ; execute close command
140       BNE       ERROR        ; jump if error
          .
          .
          .
200 ERROR LDD      #BUFF         ; load D with address of buffer
210       STD      U             ; store in work area
220       LDD      #$0100        ; load D with length of buffer
230       STD      2,U           ; store in work area
240     
  FDB      $1015         ; execute error message command
          .                      ; upon return the error message is in
          .                      ; buffer, zero terminated
          .
300 BUFF  FCB       $00          ; 256 bytes of storage space
          .
          .
          .
320 CHAN  FDB       $0000        ; saved channel number
330 WORK  FDB       $0000        ; 8 bytes of work area used by all
340       FDB       $0000        ; the enhanced MC6809 instructions
350       FDB       $0000
360       FDB       $0000


FINDFIRST U

Operation:   Emulator Instruction (DOS Int 21h Function 4Eh)

Format:

          Opcode    Operands

   FDB  $1016

Description:

Given a file specification in the form of an ASCIIZ string, searches the default or specified directory on the default or specified disk drive for the first matching file. If a match is found the buffer pointed to by M:M+1 will be loaded with the file data found and the Z condition bit is set, else the Z condition bit is reset and register A contains the error number.

Wildcard characters ? and * are allowed in the filename. Files found are based on the attributes set in M+4:M+5.

WARNING: Buffer must be at least 43 bytes long but not longer than 255 bytes.

File Attributes:

M+4:M+5:
bit 0 read-only
bit 1 hidden
bit 2 system
bit 3 volume labels (if set only volume labels are returned)
bit 4 subdirectory; entry excluded from normal searches
bit 5 archive

Buffer Structure:

bytes 0-20   reserved for DOS on subsequent calls
byte   21      attribute of matching file
bytes 22-23 file time
bytes 24-25 file date
bytes 26-29 file size (32 bit integer)
bytes 30-42 filename & extension in form of ASCIIZ string

CYCLES: 2

Condition Bits Affected:

Z:   Set if file match found; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #BUFF        ; load D with address of buffer
120       STD       U            ; store in work area
130       LDD       #43          ; load D w/buffer length of 43 bytes
140       STD       2,U          ; store in work area
150       LDD       #$01         ; find all normal and read only files
160       STD       4,U          ; store in work area
170       FDB       $1016        ; execute find first command
180       BNE       ERROR        ; jump if no match found
300 BUFF  FCB       $00          ; 43-255 bytes of storage space
          .
          .
          .
310 WORK  FDB       $0000        ; 8 bytes of work area used by all
320       FDB       $0000        ; the enhanced MC6809 instructions
330       FDB       $0000
340       FDB       $0000


FINDNEXT U

Operation:   Emulator Instruction (DOS Int 21h Function 4Fh)

Format:

          Opcode    Operands

   FDB  $1017

Description:

Assuming a successful previous FINDFIRST function the FINDNEXT function finds the next file in the default or specified directory on the default or specified disk drive that matches the original file specification. If a match is found the buffer pointed to by M:M+1 will be loaded with the file data found and the Z condition bit is set, else the Z condition bit is reset and register A contains the error number.

WARNING: Buffer must be at least 43 bytes long but not longer than 255 bytes.

Buffer Structure:

bytes 0-20 reserved for DOS on subsequent calls
byte 21 attribute of matching file
bytes 22-23 file time
bytes 24-25 file date
bytes 26-29 file size (32 bit integer)
bytes 30-42 filename & extension in form of ASCIIZ string

M CYCLES: 4      T STATES: 4       4 MHZ E.T.: 1.00

Condition Bits Affected:

Z:   Set if file match found; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #BUFF        ; load D with address of buffer
120       STD       U            ; store in work area
130       LDD       #43          ; load D w/buffer length of 43 bytes
140       STD       2,U          ; store in work area
170       FDB       $1017        ; execute find next command
180       BNE       DIREND       ; jump if no more matching entries
          .
          .
          .
300 BUFF  FCB       $00          ; 43-255 bytes of storage space
          .
          .
          .
310 WORK  FDB       $0000        ; 8 bytes of work area used by all
320       FDB       $0000        ; the enhanced MC6809 instructions
330       FDB       $0000
340       FDB       $0000


LOAD U

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $1019

Description:

Open and load the binary file specified by the path pointed to by M:M+1. The path must conform to PC standards and be zero terminated. M+2:M+3 contains a load offset that is added to the object file's load addresses. Normally BC is zero.

If the load is successful the Z condition bit is set and M+2+M+3 contains the execution address. If the file was not found or was not a valid object file then the Z condition bit is reset and the A register contains the error number.

CYCLES: 2

Condition Bits Affected:

Z:   Set if file opened ok; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #PCFN        ; load D w/address of filename
120       STD       U            ; store in work area
130       LDD       #$00         ; load D w/zero (no load offset)
140       STD       2,U          ; store in work area
150       FDB       $1019        ; execute load command
160       BNE       ERROR        ; jump if error
170       JMP       [2,U]        ; execute loaded program
          .
          .
          .
300 PCFN  FCC       'POLARIS.BIN'; zero terminated filespec to open
310       FCB       $00
320 WORK  FDB       $0000        ; 8 bytes of work area used by all
330       FDB       $0000        ; the enhanced MC6809 instructions
340       FDB       $0000
350       FDB       $0000


CHDIR U

Operation:   Emulator Instruction

Format:

           Opcode    Operands

   FDB  $101A

Description:

Changes the current drive and directory to the path pointed to by the M:M+1. If the command is successful the Z condition bit is set else the Z condition bit is reset and the A register contains the error number.

CYCLES: 2

Condition Bits Affected:

Z:   Set if file chdir ok; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #PCFN        ; load D w/address of pathname
120       STD       U            ; store in work area
130       FDB       $101A        ; execute chdir command
140       BNE       ERROR        ; jump if error
          .
          .
          .
300 PCFN  FCC       'C:TRS80'    ; zero terminated pathspec to
310       FCB       $00          ; change to
320 WORK  FDB       $0000        ; 8 bytes of work area used by all
330       FDB       $0000        ; the enhanced MC6809 instructions
340       FDB       $0000
350       FDB       $0000


GETDIR U

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $101B

Description:

Gets the current working directory and drive. The path and drive are stored in the buffer pointed to by M:M+1. If the command is successful the Z condition bit is set else the Z condition bit is reset and the A register contains the error number. If the length of the buffer is not able to hold the entire path the path is truncated to fit and register A contains range error, else register A is set to zero.

CYCLES: 2

Condition Bits Affected:

Z:   Set if file getdir ok; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #BUFF        ; load D with address of buffer
120       STD       U            ; store in work area
130       LDD       #$0100       ; load D with length of buffer
140       STD       2,U          ; store in work area
150       FDB       $101B        ; execute getdir command
          .                      ; upon return the directory is in
          .                      ; buffer, zero terminated          .
          .
300 BUFF  FCB       $00          ; 256 bytes of storage space
          .
          .
          .
310 WORK  FDB       $0000        ; 8 bytes of work area used by all
320       FDB       $0000        ; the enhanced MC6809 instructions
330       FDB       $0000
340       FDB       $0000


PATHOPEN U

Operation:   Emulator Instruction

Format:

           Opcode    Operands

   FDB  $101E

Description:

Opens the file specified by the path pointed to by M:M=1. The path must conform to PC standards and be zero terminated. M+2:M+3 is used to define the type of file access. If the file is being created M+4:M+5 is used to define the access permission.

If the open is successful the Z condition bit is set and the file's channel is returned in M+4:M+5 else the Z condition bit is reset and the A register contains the error number.

Unlike the OPEN command this command is used in writing floppy & hard disk drivers for COCO DOS's.

If no path is given the current floppy path will be used (set in the floppy selection screen). If no extension is given the extension .DSK will be used.

If 'HARD-X' (where Y= a value of 0-3) is given as the filename then one of the 4 hard disk filenames defined in the configuration screen will be opened.

File Access:

M+2:M+3, bits 0-1:
     00 open file read only
     01 open file write only
     10 open file read/write

bit 6    create file if doesn't exist (create)
bit 7    used only with bit 6 set. If file exists, an error is returned
bit 9    if file exists then file is truncated (truncate)
bit 10  the file pointer will be set to the end of the file prior to each write (append)

File Access Permission:

M+4:M+5:
bit 7   if set, permission to write to file
bit 8   if set, permission to read to file

NOTE: only has effect when file is being created. To allow read & write access both bits must be set.

CYCLES: 2

Condition Bits Affected:

Z:   Set if file opened ok; reset otherwise

Example:

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #HARD        ; load D w/address of filename
120       STD       U            ; store in work area
130       LDD       #$0002       ; open in read/write mode
140       STD       2,U          ; store in work area
150       FDB       $101E        ; execute open command
160       BNE       ERROR        ;jump if error
170       LDD       4,U          ; save channel #
180       STD       CHAN
          .
          .
          .
300 HARD  FCC       'HARD-0'     ; open defined COCO hard drive #0
310       FCB       $00
320 CHAN  FDB       $0000        ; saved channel number
330 WORK  FDB       $0000        ; 8 bytes of work area used by all
340       FDB       $0000        ; the enhanced MC6809 instructions
350       FDB       $0000
360       FDB       $0000

If in the configuration screen the 'Virtual HD0 Filename' is defined as:

C:\TRS-80\OS9.HDV

Then, if the file exists, it will be opened for read/write I/O and the channel number returned in M+4:M+5.


CLOSEALL U

Operation:   Emulator Instruction

Format:

          Opcode    Operands

   FDB  $101F

Description:

Closes file on channel specified by M+4:M+5 or closes all open files if M+4:M+5=FFFFh. The Z condition bit is set if close successful else the Z condition bit is reset and the A register contains the error number.

If M+4:M+5=FFFFh then no error is reported even if no files are closed.

CYCLES: 2

Condition Bits Affected:

Z:   Set if file closed ok; reset otherwise

Example:

 

100       LDU       #WORK        ; load U with pointer to work area
110       LDD       #$0FFFF      ; load D with close all files command
120       STD       4,U          ; store in work area
130       FDB       $101F        ; execute closeall command
140       BNE       ERROR        ; jump if error
          .
          .
          .
300 CHAN  FDB       $0000        ; saved channel number
310 WORK  FDB       $0000        ; 8 bytes of work area used by all
320       FDB       $0000        ; the enhanced MC6809 instructions
330       FDB       $0000
340       FDB       $0000