view 3rdparty/subrtns/cpu.asm @ 2772:0a3f4d8ea6d5

Found ENDC in wrong location in dwread.asm and dwwrite.asm. Corrected. Moved the native 6309 code in dwread.asm and dwwrite.asm into the H6309 labeled area and changed IFEQ H6309 to IFNE H6309. Also moved the 57600bps 6809 code to the default location. This change had been done in the old dwread.asm and dwwrite.asm files to make it easier to follow. Though these two files were overwritten from the HDBDOS project dwread.asm and dwwrite.asm files. So this conversion needed to be done again so it made the source easier to follow.
author drencor-xeen
date Wed, 23 Jan 2013 12:36:55 -0600
parents 900ceed1880a
children
line wrap: on
line source

********************************************************************
* CPU - CPU Determiner Subroutine Module
*
* $Id$
*
* Basic09 subroutine module to determine the CPU type of the computer
* Test via:
*
* PROGRAM CPU
* DIM CPUType,Mode:integer
* RUN CPU(Type,Mode)
* PRINT "CPU type:";CPUType
* IF Mode=0 THEN
*  PRINT "6809 Emulation mode"
* ELSE
*  PRINT "6309 Native mode"
* ENDIF
* END
*
* returns: CPUType: 6809 or 6309  (decimal integer)
*             Mode: 0=emulation mode, 1=native mode
*
* Ed.    Comments                                       Who YY/MM/DD
* ------------------------------------------------------------------
*   1    Created                                        ADK ??/??/??

         nam   CPU
         ttl   CPU Determiner Subroutine Module

         ifp1
         use   defsfile
         endc

rev      set   1          first revision
tylg     set   Sbrtn+Objct
atrv     set   ReEnt+Rev
edition  set   1

         org   0
         rmb   2          return address
PCount   rmb   2          number of parameters
Param1   rmb   2          1st param address
Length1  rmb   2          size
Param2   rmb   2
Length2  rmb   2
Size     equ   .

         mod   eom,name,tylg,atrv,start,size

name     fcs   /CPU/
         fcb   edition

Start    ldd   PCount,s   get parameter count
         cmpd  #2         2 parameters?
         bne   p.error    no, error out.

         ldd   Length1,s  get size of the first parameter
         cmpd  #2         integer variable?
         bne   p.error    no, error out.

         ldd   Length2,s
         cmpd  #2         integer variable?
         bne   p.error    no, error out.

* do a 6309/6809 test
         ldd   #$FFFF     make sure it's non-zero
*         clrd             executes as a pseudo-NOP ($10), and a CLRA
         fdb   $104F
         tstb
         bne   is.6809
         ldd   #6309      it's a 6309
         bra   save.1

is.6809  ldd   #6809      it's a 6809
save.1   ldx   Param1,s   where to put the CPU type
         std   ,x         save the integer CPU type

* if it's a 6809, we don't need to do the next part, as we KNOW it's
* running in 6809 emulation mode!

* this is harder.... are we in native mode?
         pshs  cc,dp,x,y,u   save all registers but D
*         pshsw            a NOP on a 6809
         fdb   $1038

         leay  native,pc   native mode PC
         leax  emulate,pc  emulation mode PC
         pshs  x,y         save them
         pshs  cc,d,dp,x,y,u  and the rest of the registers, too.
         orcc  #Entire     set the entire bit in CC
         rti

emulate  leas  2,s        emulation mode: kill native mode PC
         clrb             we're in emulation mode
         fcb   $8C        skip 2 bytes
native   ldb   #1         in native mode
         puls  u          restore W from off-stack
*         tfr   u,w        a PULSW does an 'RTS' on a 6809
         fdb   $1F36 
         puls  cc,dp,x,y,u  restore all of our other registers
         clra             now d=0: emulation, 1: native
         ldx   Param2,s   where to put the data
         std   ,x         save native/emulation mode flag
         clrb             no errors
         rts

p.error  comb             set the carry
         ldb   #$38       Basic09 parameter error
         rts

         emod
eom      equ   *
         end