Mercurial > hg > Members > kono > nitros9-code
changeset 743:9d5be3fe8ebb
New subroutine module added
author | boisy |
---|---|
date | Mon, 06 Jan 2003 05:07:48 +0000 |
parents | a05740780938 |
children | 07f62f74805a |
files | 3rdparty/subrtns/cpu.asm 3rdparty/subrtns/makefile |
diffstat | 2 files changed, 106 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/subrtns/cpu.asm Mon Jan 06 05:07:48 2003 +0000 @@ -0,0 +1,105 @@ +*=========================================================================== +* 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 +*=========================================================================== + + nam CPU + + 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