1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-08-09 16:25:01 +00:00

SANE ascii <-> bin WIP

This commit is contained in:
David Schmenk
2017-11-17 15:25:20 -08:00
parent 0432f68e90
commit 05d96070bd
3 changed files with 218 additions and 26 deletions

View File

@@ -135,8 +135,10 @@ struc t_sane
word fpOp0 word fpOp0
word fpOp1 word fpOp1
word fpOp2 word fpOp2
word fpOp3
word elOp1 word elOp1
word elOp2 word elOp2
word elOp3
word zpSave word zpSave
word zpRestore word zpRestore
end end

View File

@@ -15,8 +15,8 @@ end
// //
// External interface to SANE libraries // External interface to SANE libraries
// //
predef fpInit(), fpDefaultHalt(pstatus), uninit0(), uninit1(op, dst), uninit2(op, dst, src) predef fpInit(), fpDefaultHalt(pstatus), uninit0(), uninit1(op, dst), uninit2(op, dst, src), uninit3(op, dst, src, src2)
export word[7] sane = @fpInit, @fpDefaultHalt, @uninit0, @uninit1, @uninit2, @uninit1, @uninit2, @uninit0, @uninit0 export word sane = @fpInit, @fpDefaultHalt, @uninit0, @uninit1, @uninit2, @uninit3, @uninit1, @uninit2, @uninit3, @uninit0, @uninit0
// //
// Pointer to FP6502 entry // Pointer to FP6502 entry
// //
@@ -126,6 +126,36 @@ asm fixupFP2
STY ESTKH,X STY ESTKH,X
RTS RTS
end end
asm fpOp3(op, dst, src, src2)#1
LDA ESTKH,X
PHA
LDA ESTKL,X
PHA
LDA ESTKH+1,X
PHA
LDA ESTKL+1,X
PHA
LDA ESTKH+2,X
PHA
LDA ESTKL+2,X
PHA
LDA ESTKH+3,X
PHA
LDA ESTKL+3,X
PHA
INX
INX
INX
STX ESP
end
asm fixupFP3
JSR $FFF0
TXA
LDX ESP
STA ESTKL,X
STY ESTKH,X
RTS
end
// //
// AUX memory FP6502 API // AUX memory FP6502 API
// //
@@ -219,6 +249,54 @@ asm xfpOp2(op, dst, src)#1
STY ESTKH,X STY ESTKH,X
RTS RTS
end end
asm xfpOp3(op, dst, src, src2)#1
LDA ESTKL+3,X
STA $02FA
LDA ESTKH+3,X
STA $02FB
LDA ESTKL+2,X
STA $02FC
LDA ESTKH+2,X
STA $02FD
LDA ESTKL+1,X
STA $02FE
LDA ESTKH+1,X
STA $02FF
LDY ESTKL,X
LDA ESTKH,X
INX
INX
INX
STX ESP
PHP
SEI
STA $C009 ; SELECT ALTZP
BIT $C083 ; R/W LC BANK2
BIT $C083
PHA
TYA
PHA
LDA $02FF
PHA
LDA $02FE
PHA
LDA $02FD
PHA
LDA $02FC
PHA
LDA $02FB
PHA
LDA $02FA
PHA
JSR $E000
STA $C008 ; BACK TO MAINZP
PLP
TXA
LDX ESP
STA ESTKL,X
STY ESTKH,X
RTS
end
// //
// Main memory ELEMS6502 API // Main memory ELEMS6502 API
// //
@@ -267,6 +345,36 @@ asm fixupEL2
STY ESTKH,X STY ESTKH,X
RTS RTS
end end
asm elemsOp3(op, dst, src, src2)#1
LDA ESTKH,X
PHA
LDA ESTKL,X
PHA
LDA ESTKH+1,X
PHA
LDA ESTKL+1,X
PHA
LDA ESTKH+2,X
PHA
LDA ESTKL+2,X
PHA
LDA ESTKH+3,X
PHA
LDA ESTKL+3,X
PHA
INX
INX
INX
STX ESP
end
asm fixupEL3
JSR $FFF0
TXA
LDX ESP
STA ESTKL,X
STY ESTKH,X
RTS
end
// //
// AUX memory ELEMS6502 API // AUX memory ELEMS6502 API
// //
@@ -302,7 +410,7 @@ asm fixupXEL1
STY ESTKH,X STY ESTKH,X
RTS RTS
end end
asm xelemsOp2(op, dst)#1 asm xelemsOp2(op, dst, src)#1
LDA ESTKL+2,X LDA ESTKL+2,X
STA $02FC STA $02FC
LDA ESTKH+2,X LDA ESTKH+2,X
@@ -343,6 +451,56 @@ asm fixupXEL2
STY ESTKH,X STY ESTKH,X
RTS RTS
end end
asm xelemsOp3(op, dst, src, src2)#1
LDA ESTKL+2,X
STA $02FA
LDA ESTKH+2,X
STA $02FB
LDA ESTKL+2,X
STA $02FC
LDA ESTKH+2,X
STA $02FD
LDA ESTKL+1,X
STA $02FE
LDA ESTKH+1,X
STA $02FF
LDY ESTKL,X
LDA ESTKH,X
INX
INX
INX
STX ESP
PHP
SEI
STA $C009 ; SELECT ALTZP
BIT $C083 ; R/W LC BANK2
BIT $C083
PHA
TYA
PHA
LDA $02FF
PHA
LDA $02FE
PHA
LDA $02FD
PHA
LDA $02FC
PHA
LDA $02FB
PHA
LDA $02FA
PHA
end
asm fixupXEL3
JSR $FFF0
STA $C008 ; BACK TO MAINZP
PLP
TXA
LDX ESP
STA ESTKL,X
STY ESTKH,X
RTS
end
asm zpSave#1 asm zpSave#1
LDY #$33 LDY #$33
- LDA $00,Y - LDA $00,Y
@@ -421,9 +579,9 @@ end
// Default HALT handler // Default HALT handler
// //
def fpDefaultHalt(pstatus) def fpDefaultHalt(pstatus)
sane[8]() // zpRestore sane[10]() // zpRestore
puts("SANE Exception="); puti(pstatus->8); puts("!\n") puts("SANE Exception="); puti(pstatus->8); puts("!\n")
sane[7]() // zpSave sane[9]() // zpSave
return pstatus=>4 return pstatus=>4
end end
// //
@@ -576,13 +734,17 @@ def loadElems
if fp6502 == AUXADDR if fp6502 == AUXADDR
(@fixupXEL1)=>1 = elems (@fixupXEL1)=>1 = elems
(@fixupXEL2)=>1 = elems (@fixupXEL2)=>1 = elems
sane[5] = @xelemsOp1 (@fixupXEL3)=>1 = elems
sane[6] = @xelemsOp2 sane[6] = @xelemsOp1
sane[7] = @xelemsOp2
sane[8] = @xelemsOp3
else else
(@fixupEL1)=>1 = elems (@fixupEL1)=>1 = elems
(@fixupEL2)=>1 = elems (@fixupEL2)=>1 = elems
sane[5] = @elemsOp1 (@fixupEL3)=>1 = elems
sane[6] = @elemsOp2 sane[6] = @elemsOp1
sane[7] = @elemsOp2
sane[8] = @elemsOp3
fin fin
return 1 return 1
end end
@@ -595,9 +757,15 @@ def elemsLoad1(op, dst)#1
fin fin
return -1 return -1
end end
def elemsLoad2(op, src, dst)#1 def elemsLoad2(op, dst, src)#1
if loadElems if loadElems
return sane[4](op, src, dst) return sane[4](op, dst, src)
fin
return -1
end
def elemsLoad3(op, dst, src, src2)#1
if loadElems
return sane[4](op, dst, src, src2)
fin fin
return -1 return -1
end end
@@ -620,8 +788,9 @@ def fpInit()
sane[2] = @xfpOp0 sane[2] = @xfpOp0
sane[3] = @xfpOp1 sane[3] = @xfpOp1
sane[4] = @xfpOp2 sane[4] = @xfpOp2
sane[7] = @zpNop sane[5] = @xfpOp3
sane[8] = @zpNop sane[9] = @zpNop
sane[10] = @zpNop
// //
// Install AUX HALT handler // Install AUX HALT handler
// //
@@ -636,18 +805,21 @@ def fpInit()
(@fixupFP0)=>1 = fp6502 (@fixupFP0)=>1 = fp6502
(@fixupFP1)=>1 = fp6502 (@fixupFP1)=>1 = fp6502
(@fixupFP2)=>1 = fp6502 (@fixupFP2)=>1 = fp6502
(@fixupFP3)=>1 = fp6502
sane[2] = @fpOp0 sane[2] = @fpOp0
sane[3] = @fpOp1 sane[3] = @fpOp1
sane[4] = @fpOp2 sane[4] = @fpOp2
sane[7] = @zpSave sane[5] = @fpOp3
sane[8] = @zpRestore sane[9] = @zpSave
sane[10] = @zpRestore
// //
// Install MAIN HALT handler // Install MAIN HALT handler
// //
fpOp1($0005, @fpHalt) fpOp1($0005, @fpHalt)
fin fin
sane[5] = @elemsLoad1 sane[6] = @elemsLoad1
sane[6] = @elemsLoad2 sane[7] = @elemsLoad2
sane[8] = @elemsLoad3
fin fin
(@fixupHLT)=>1 = @sane+2 (@fixupHLT)=>1 = @sane+2
sane[1] = @fpDefaultHalt sane[1] = @fpDefaultHalt
@@ -667,9 +839,12 @@ def uninit0()
return uninit return uninit
end end
def uninit1(op, dst) def uninit1(op, dst)
return uninit return uninit
end end
def uninit2(op, dst, src) def uninit2(op, dst, src)
return uninit return uninit
end
def uninit3(op, dst, src, src2)
return uninit
end end
done done

View File

@@ -8,7 +8,11 @@ include "inc/sane.plh"
// //
word iA, iB, iC, zero, fpEnv word iA, iB, iC, zero, fpEnv
byte xT[t_extended] byte xT[t_extended]
word decform = 0, 4
byte strA[29] = "8.5"
//
// My custom SANE exception handler
//
def myException(pstatus) def myException(pstatus)
sane:zpRestore() sane:zpRestore()
puts("Floating point exception:") puts("Floating point exception:")
@@ -52,10 +56,21 @@ sane:fpOp2(FFINT|FODIV, @xT, @iB) // Div int B into ext T
sane:fpOp2(FFINT|FOX2Z, @iC, @xT) // Convert ext T to int C sane:fpOp2(FFINT|FOX2Z, @iC, @xT) // Convert ext T to int C
sane:zpRestore() sane:zpRestore()
puti(iA); putc('/'); puti(iB); putc('='); puti(iC); putc('\n') puti(iA); putc('/'); puti(iB); putc('='); puti(iC); putc('\n')
//
// Convert string to and from SANE
//
sane:zpSave() sane:zpSave()
sane:fpOp2(FFEXT|FOD2B, @xT, "8.5")
//sane:fpOp2(FFINT|FOZ2X, @xT, @iA) // Convert int A to ext T
sane:fpOp2(FFINT|FODIV, @xT, @iB) // Div int B into ext T
sane:fpOp2(FFINT|FOX2Z, @iC, @xT) // Convert ext T to int C
sane:fpOp3(FFEXT|FOB2D, @strA, @xT, @decform)
sane:zpRestore()
puts("8.5 / 4 = "); puts(@strA); putc('('); puti(iC); putc(')'); putln
// //
// Hook custom HALT exception handler and divide by zero :-) // Hook custom HALT exception handler and divide by zero :-)
// //
sane:zpSave()
sane:fpHalt = @myException sane:fpHalt = @myException
fpEnv = sane:fpOp0(FOGETENV) fpEnv = sane:fpOp0(FOGETENV)
// //