diff --git a/library-asm/save.asm b/library-asm/save.asm index 5cb2141b7..5d078dd78 100644 --- a/library-asm/save.asm +++ b/library-asm/save.asm @@ -81,8 +81,16 @@ SAVE_CONT: ldir ; Copy String block NAME ld l, (ix + 13) ld h, (ix + 14) ; Restores start of bytes - + + ld a, r + push af call ROM_SAVE + + LOCAL NO_INT + pop af + jp po, NO_INT + ei +NO_INT: ; Recovers ECHO_E since ROM SAVE changes it ld hl, 1821h ld (23682), hl @@ -98,6 +106,8 @@ SAVE_STOP: LOCAL PO_MSG LOCAL WAIT_KEY LOCAL SA_BYTES + LOCAL SA_CHK_BRK + LOCAL SA_CONT CHAN_OPEN EQU 1601h PO_MSG EQU 0C0Ah @@ -105,7 +115,6 @@ SAVE_STOP: SA_BYTES EQU 04C6h ROM_SAVE: - push hl ld a, 0FDh call CHAN_OPEN @@ -116,12 +125,17 @@ ROM_SAVE: call WAIT_KEY push ix ld de, 0011h - ld a, r - push af xor a call SA_BYTES + pop ix + call SA_CHK_BRK + jr c, SA_CONT pop ix + ret + +SA_CONT: + ei ld b, 32h LOCAL SA_1_SEC @@ -135,9 +149,18 @@ SA_1_SEC: pop ix call SA_BYTES - pop af - ret po - ei +SA_CHK_BRK: + ld b, a + ld a, (5C48h) + and 38h + rrca + rrca + rrca + out (0FEh), a + ld a, 7Fh + in a, (0FEh) + rra + ld a, b ret #endif diff --git a/tests/functional/save.asm b/tests/functional/save.asm index 9461d5fac..a939736be 100644 --- a/tests/functional/save.asm +++ b/tests/functional/save.asm @@ -439,7 +439,14 @@ SAVE_CONT: ldir ; Copy String block NAME ld l, (ix + 13) ld h, (ix + 14) ; Restores start of bytes + ld a, r + push af call ROM_SAVE + LOCAL NO_INT + pop af + jp po, NO_INT + ei +NO_INT: ; Recovers ECHO_E since ROM SAVE changes it ld hl, 1821h ld (23682), hl @@ -452,6 +459,8 @@ SAVE_STOP: LOCAL PO_MSG LOCAL WAIT_KEY LOCAL SA_BYTES + LOCAL SA_CHK_BRK + LOCAL SA_CONT CHAN_OPEN EQU 1601h PO_MSG EQU 0C0Ah WAIT_KEY EQU 15D4h @@ -467,11 +476,15 @@ ROM_SAVE: call WAIT_KEY push ix ld de, 0011h - ld a, r - push af xor a call SA_BYTES pop ix + call SA_CHK_BRK + jr c, SA_CONT + pop ix + ret +SA_CONT: + ei ld b, 32h LOCAL SA_1_SEC SA_1_SEC: @@ -482,11 +495,20 @@ SA_1_SEC: ld a, 0FFh pop ix call SA_BYTES - pop af - ret po - ei +SA_CHK_BRK: + ld b, a + ld a, (5C48h) + and 38h + rrca + rrca + rrca + out (0FEh), a + ld a, 7Fh + in a, (0FEh) + rra + ld a, b ret -#line 144 "/zxbasic/library-asm/save.asm" +#line 167 "/zxbasic/library-asm/save.asm" ENDP #line 33 "save.bas" ZXBASIC_USER_DATA: diff --git a/tests/functional/save01.asm b/tests/functional/save01.asm index 0e6849cd9..cce453e1f 100644 --- a/tests/functional/save01.asm +++ b/tests/functional/save01.asm @@ -443,7 +443,14 @@ SAVE_CONT: ldir ; Copy String block NAME ld l, (ix + 13) ld h, (ix + 14) ; Restores start of bytes + ld a, r + push af call ROM_SAVE + LOCAL NO_INT + pop af + jp po, NO_INT + ei +NO_INT: ; Recovers ECHO_E since ROM SAVE changes it ld hl, 1821h ld (23682), hl @@ -456,6 +463,8 @@ SAVE_STOP: LOCAL PO_MSG LOCAL WAIT_KEY LOCAL SA_BYTES + LOCAL SA_CHK_BRK + LOCAL SA_CONT CHAN_OPEN EQU 1601h PO_MSG EQU 0C0Ah WAIT_KEY EQU 15D4h @@ -471,11 +480,15 @@ ROM_SAVE: call WAIT_KEY push ix ld de, 0011h - ld a, r - push af xor a call SA_BYTES pop ix + call SA_CHK_BRK + jr c, SA_CONT + pop ix + ret +SA_CONT: + ei ld b, 32h LOCAL SA_1_SEC SA_1_SEC: @@ -486,11 +499,20 @@ SA_1_SEC: ld a, 0FFh pop ix call SA_BYTES - pop af - ret po - ei +SA_CHK_BRK: + ld b, a + ld a, (5C48h) + and 38h + rrca + rrca + rrca + out (0FEh), a + ld a, 7Fh + in a, (0FEh) + rra + ld a, b ret -#line 144 "/zxbasic/library-asm/save.asm" +#line 167 "/zxbasic/library-asm/save.asm" ENDP #line 37 "save01.bas" ZXBASIC_USER_DATA: diff --git a/tests/functional/save02.asm b/tests/functional/save02.asm index 10993bf5f..e88025396 100644 --- a/tests/functional/save02.asm +++ b/tests/functional/save02.asm @@ -440,7 +440,14 @@ SAVE_CONT: ldir ; Copy String block NAME ld l, (ix + 13) ld h, (ix + 14) ; Restores start of bytes + ld a, r + push af call ROM_SAVE + LOCAL NO_INT + pop af + jp po, NO_INT + ei +NO_INT: ; Recovers ECHO_E since ROM SAVE changes it ld hl, 1821h ld (23682), hl @@ -453,6 +460,8 @@ SAVE_STOP: LOCAL PO_MSG LOCAL WAIT_KEY LOCAL SA_BYTES + LOCAL SA_CHK_BRK + LOCAL SA_CONT CHAN_OPEN EQU 1601h PO_MSG EQU 0C0Ah WAIT_KEY EQU 15D4h @@ -468,11 +477,15 @@ ROM_SAVE: call WAIT_KEY push ix ld de, 0011h - ld a, r - push af xor a call SA_BYTES pop ix + call SA_CHK_BRK + jr c, SA_CONT + pop ix + ret +SA_CONT: + ei ld b, 32h LOCAL SA_1_SEC SA_1_SEC: @@ -483,11 +496,20 @@ SA_1_SEC: ld a, 0FFh pop ix call SA_BYTES - pop af - ret po - ei +SA_CHK_BRK: + ld b, a + ld a, (5C48h) + and 38h + rrca + rrca + rrca + out (0FEh), a + ld a, 7Fh + in a, (0FEh) + rra + ld a, b ret -#line 144 "/zxbasic/library-asm/save.asm" +#line 167 "/zxbasic/library-asm/save.asm" ENDP #line 34 "save02.bas" ZXBASIC_USER_DATA: diff --git a/tests/functional/save03.asm b/tests/functional/save03.asm index c42975b1e..93cc6b085 100644 --- a/tests/functional/save03.asm +++ b/tests/functional/save03.asm @@ -439,7 +439,14 @@ SAVE_CONT: ldir ; Copy String block NAME ld l, (ix + 13) ld h, (ix + 14) ; Restores start of bytes + ld a, r + push af call ROM_SAVE + LOCAL NO_INT + pop af + jp po, NO_INT + ei +NO_INT: ; Recovers ECHO_E since ROM SAVE changes it ld hl, 1821h ld (23682), hl @@ -452,6 +459,8 @@ SAVE_STOP: LOCAL PO_MSG LOCAL WAIT_KEY LOCAL SA_BYTES + LOCAL SA_CHK_BRK + LOCAL SA_CONT CHAN_OPEN EQU 1601h PO_MSG EQU 0C0Ah WAIT_KEY EQU 15D4h @@ -467,11 +476,15 @@ ROM_SAVE: call WAIT_KEY push ix ld de, 0011h - ld a, r - push af xor a call SA_BYTES pop ix + call SA_CHK_BRK + jr c, SA_CONT + pop ix + ret +SA_CONT: + ei ld b, 32h LOCAL SA_1_SEC SA_1_SEC: @@ -482,11 +495,20 @@ SA_1_SEC: ld a, 0FFh pop ix call SA_BYTES - pop af - ret po - ei +SA_CHK_BRK: + ld b, a + ld a, (5C48h) + and 38h + rrca + rrca + rrca + out (0FEh), a + ld a, 7Fh + in a, (0FEh) + rra + ld a, b ret -#line 144 "/zxbasic/library-asm/save.asm" +#line 167 "/zxbasic/library-asm/save.asm" ENDP #line 33 "save03.bas" ZXBASIC_USER_DATA: