Compare commits

...

6 Commits

Author SHA1 Message Date
Peter Ferrie be8a9e2670
Merge d4d3c59b8c into f572feade0 2024-04-25 14:51:07 -05:00
Brendan Robert f572feade0 Fixed broken transwarp implemetation 2024-04-25 14:50:49 -05:00
Peter Ferrie d4d3c59b8c defer case check to be faster 2023-09-03 15:08:16 -07:00
Peter Ferrie c540527370 another fix 2023-09-03 14:42:51 -07:00
Peter Ferrie 3f359cf3ff fix a couple of bugs, compare a bit faster 2023-09-03 14:41:10 -07:00
Peter Ferrie b258ed441a decompress faster 2023-09-02 11:30:15 -07:00
4 changed files with 51 additions and 48 deletions

View File

@ -93,7 +93,7 @@ public class Apple2e extends Computer {
@ConfigurableField(name = "No-Slot Clock Enabled", shortName = "clock", description = "If checked, no-slot clock will be enabled", enablesDevice = true) @ConfigurableField(name = "No-Slot Clock Enabled", shortName = "clock", description = "If checked, no-slot clock will be enabled", enablesDevice = true)
public boolean clockEnabled = true; public boolean clockEnabled = true;
@ConfigurableField(name = "Accelerator Enabled", shortName = "zip", description = "If checked, add support for Zip/Transwarp", enablesDevice = true) @ConfigurableField(name = "Accelerator Enabled", shortName = "zip", description = "If checked, add support for Zip/Transwarp", enablesDevice = true)
public boolean acceleratorEnabled = PRODUCTION_MODE; public boolean acceleratorEnabled = true;
public Joystick joystick1; public Joystick joystick1;
public Joystick joystick2; public Joystick joystick2;

View File

@ -24,7 +24,6 @@ import jace.core.RAMListener;
/** /**
* Implements a basic hardware accelerator that is able to adjust the speed of the emulator * Implements a basic hardware accelerator that is able to adjust the speed of the emulator
*/ */
// TODO: Support the registers used here: https://github.com/a2-4am/4cade/blob/main/src/hw.accel.a#L238
public class ZipWarpAccelerator extends Device { public class ZipWarpAccelerator extends Device {
@ConfigurableField(category = "debug", name = "Debug messages") @ConfigurableField(category = "debug", name = "Debug messages")
public boolean debugMessagesEnabled = false; public boolean debugMessagesEnabled = false;
@ -38,8 +37,14 @@ public class ZipWarpAccelerator extends Device {
public static final double UNLOCK_PENALTY_PER_TICK = 0.19; public static final double UNLOCK_PENALTY_PER_TICK = 0.19;
public static final double UNLOCK_MIN = 4.0; public static final double UNLOCK_MIN = 4.0;
/**
* Valid values for C074 are:
* 0: Enable full speed
* 1: Set speed to 1mhz (temporarily disable)
* 3: Disable completely (requres cold-start to re-enable -- this isn't implemented)
*/
public static final int TRANSWARP = 0x0c074; public static final int TRANSWARP = 0x0c074;
public static final int TRANSWARP_ON = 1; // Any other value written disables acceleration public static final int TRANSWARP_ON = 0; // Any other value written disables acceleration
boolean zipLocked = true; boolean zipLocked = true;
double zipUnlockCount = 0; double zipUnlockCount = 0;
@ -187,7 +192,10 @@ public class ZipWarpAccelerator extends Device {
private void turnOffAcceleration() { private void turnOffAcceleration() {
// The UI Logic retains the user's desired normal speed, reset to that // The UI Logic retains the user's desired normal speed, reset to that
Emulator.getUILogic().reconfigure(); Emulator.withComputer(c -> {
c.getMotherboard().setMaxSpeed(false);
c.getMotherboard().setSpeedInPercentage(100);
});
} }
@Override @Override

View File

@ -33,8 +33,9 @@ DEBUG = 0
decomp !zone { decomp !zone {
jsr .chkdst jsr .chkdst
ldy #0 ; In lit loop Y must be zero ldy #0 ; In lit loop Y must be zero
sec
.fill1A jsr .getbt2 .fill1A jsr .getbt2
jmp .fill1B bne .fill1B ; always taken
.incdst inc pDst+1 .incdst inc pDst+1
.chkdst ldx pDst+1 .chkdst ldx pDst+1
@ -174,19 +175,19 @@ decomp !zone {
bne .gshift ; always taken bne .gshift ; always taken
; Get another 8 bits into our bit buffer. Destroys X. Preserves A. Requires Y=0. ; Get another 8 bits into our bit buffer. Destroys X. Preserves A. Requires Y=0.
; Carry is always set on entry, Z always clear on exit
; Alternately, use .getbt2 to preserve X and destroy A ; Alternately, use .getbt2 to preserve X and destroy A
.getbts tax .getbts tax
.getbt2 lda (pSrc),y .getbt2 lda (pSrc),y
inc pSrc
beq .src3A
.src3B sec
rol rol
sta bits sta bits
txa txa
inc pSrc
beq .src3A
rts rts
.src3A inc pSrc+1 .src3A inc pSrc+1
bne .src3B ; always taken rts
} ; end of zone } ; end of zone

View File

@ -364,7 +364,7 @@ export asm memcpy(pSrc, pDst, len, auxWr)#0
inc pTmp+1 inc pTmp+1
bne .pglup ; always taken bne .pglup ; always taken
.part: .part:
cpx #0 txa
beq .done beq .done
- lda (tmp),y - lda (tmp),y
sta (pTmp),y sta (pTmp),y
@ -390,8 +390,8 @@ export asm memset(pDst, val, len)#0
lda evalStkL,x ; len lo lda evalStkL,x ; len lo
pha pha
lda evalStkH,x ; len hi lda evalStkH,x ; len hi
tax
beq + beq +
tax
lda tmp lda tmp
- sta (pTmp),y - sta (pTmp),y
iny iny
@ -420,10 +420,10 @@ export asm readAuxByte(ptr)#1
sta $10-1,y sta $10-1,y
dey dey
bne - bne -
jmp $10
.rdauxb
sei ; prevent interrupts while in aux mem sei ; prevent interrupts while in aux mem
sta setAuxRd sta setAuxRd
jmp $10
.rdauxb
lda (pTmp),y lda (pTmp),y
sta clrAuxRd sta clrAuxRd
cli cli
@ -462,19 +462,19 @@ end
export asm finishString(isPlural)#1 export asm finishString(isPlural)#1
!zone { !zone {
+asmPlasmRet 1 +asmPlasmRet 1
ldy prevCSWL+ABS_OFFSET ; put the cout vector back to default
sty cswl
ldy prevCSWL+1+ABS_OFFSET ; put the cout vector back to default
sty cswh
ldy #0 ; dest offset in Y (will be incremented before store)
cpy inbuf
beq .done1 ; failsafe: handle zero-length string
tax ; test for isPlural == 0 tax ; test for isPlural == 0
beq + beq +
lda #$40 ; for setting V later lda #$40 ; for setting V later
+ sta tmp ; save isPlural flag + sta tmp ; save isPlural flag
lda prevCSWL+ABS_OFFSET ; put the cout vector back to default
sta cswl
lda prevCSWL+1+ABS_OFFSET ; put the cout vector back to default
sta cswh
clv ; V flag for prev-is-alpha clv ; V flag for prev-is-alpha
ldy #0 ; dest offset in Y (will be incremented before store)
ldx #0 ; source offset in X (will be incremented before load) ldx #0 ; source offset in X (will be incremented before load)
cpx inbuf
beq .done ; failsafe: handle zero-length string
.fetch .fetch
inx inx
lda inbuf,x ; get next input char lda inbuf,x ; get next input char
@ -488,11 +488,11 @@ export asm finishString(isPlural)#1
dey ; undo copy of the paren dey ; undo copy of the paren
stx tmp+1 ; save position in input stx tmp+1 ; save position in input
dex ; needed for failsafe operation
bit tmp ; set copy flag (V) initially to same as isPlural flag bit tmp ; set copy flag (V) initially to same as isPlural flag
.findsl ; see if there's a slash within the parens .findsl ; see if there's a slash within the parens
inx inx
cpx inbuf cpx inbuf
bcs .done ; failsafe: handle missing end-paren
lda inbuf,x lda inbuf,x
ora #$80 ; normalize hi-bit for comparisons below ora #$80 ; normalize hi-bit for comparisons below
cmp #"/" cmp #"/"
@ -503,11 +503,8 @@ export asm finishString(isPlural)#1
pha pha
plp plp
+ cmp #")" ; scan until ending paren + cmp #")" ; scan until ending paren
beq + bne .findsl ; loop to scan next char
cpx inbuf ldx tmp+1 ; get back to start of parens
bcc .findsl ; loop to scan next char
bcs .done ; failsafe: handle missing end-paren (always taken)
+ ldx tmp+1 ; get back to start of parens
; copy mode flag is now in V: if slash present, single=copy, plural=nocopy ; copy mode flag is now in V: if slash present, single=copy, plural=nocopy
; if no slash: single=nocopy, plural=copy ; if no slash: single=nocopy, plural=copy
.plup .plup
@ -541,6 +538,7 @@ export asm finishString(isPlural)#1
.done .done
sty inbuf ; save new length sty inbuf ; save new length
.done1
lda #<inbuf ; return pointer to string lda #<inbuf ; return pointer to string
ldy #>inbuf ldy #>inbuf
rts rts
@ -575,8 +573,8 @@ export asm blit(isAux, srcData, dstScreenPtr, nLines, lineSize)#0
lsr ; to carry bit lsr ; to carry bit
bcc + bcc +
ldy #15 ; put aux copy routine in zero page ldy #15 ; put aux copy routine in zero page
- lda .cpaux + ABS_OFFSET,y - ldx .cpaux + ABS_OFFSET,y
sta $10,y stx $10,y
dey dey
bpl - bpl -
+ pla ; get line count + pla ; get line count
@ -694,8 +692,9 @@ export asm puts(str)#0
sta pTmp sta pTmp
lda #'!' lda #'!'
ldx #1 ldx #1
sty pTmp+1 tya
beq + ; safety: print '!' instead of null string beq + ; safety: print '!' instead of null string
sty pTmp+1
ldy #0 ldy #0
lda (pTmp),y lda (pTmp),y
tax tax
@ -913,9 +912,8 @@ export asm rawDisplayStr(pStr)#0
lda (pTmp),y lda (pTmp),y
sta tmp sta tmp
- cpy tmp - cpy tmp
bcc + bcs ++
rts iny
+ iny
lda (pTmp),y lda (pTmp),y
ora #$80 ora #$80
cmp #"^" cmp #"^"
@ -929,7 +927,8 @@ export asm rawDisplayStr(pStr)#0
+ sty tmp+1 + sty tmp+1
jsr DisplayChar jsr DisplayChar
ldy tmp+1 ldy tmp+1
bne - bne - ; always taken
++rts
end end
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
@ -991,8 +990,8 @@ export asm streqi(a, b)#1
lda evalStkL+1,x lda evalStkL+1,x
sta pTmp sta pTmp
lda evalStkH+1,x lda evalStkH+1,x
sta pTmp+1
beq .null beq .null
sta pTmp+1
ldy #0 ldy #0
lda (tmp),y lda (tmp),y
cmp (pTmp),y cmp (pTmp),y
@ -1004,21 +1003,16 @@ export asm streqi(a, b)#1
+ tax ; count up to (verified same) length of the strings + tax ; count up to (verified same) length of the strings
- iny - iny
lda (tmp),y lda (tmp),y
cmp #('z'&$7F)+1 ; convert to upper case eor (pTmp),y
bcs + beq + ; matched
cmp #$20 ; check for case bit
bne .noteqi ; abort on alpha inequality
ora (tmp),y ; convert to lower case
cmp #('z'&$7F)+1
bcs .noteqi ; abort on inequality
cmp #'a'&$7F cmp #'a'&$7F
bcc + bcc .noteqi ; abort on inequality
sbc #$20 + dex
+ sta ysav
lda (pTmp),y
cmp #('z'&$7F)+1 ; convert to upper case
bcs +
cmp #'a'&$7F
bcc +
sbc #$20
+ cmp ysav
bne .noteqi ; abort on inequality
dex
bne - bne -
lda #1 lda #1
ldy #0 ; okay, they're equal. Return 1 (not just any char; so that PLASMA when...is can work) ldy #0 ; okay, they're equal. Return 1 (not just any char; so that PLASMA when...is can work)