Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

;; This test should be kept identical to "savetap_test.asm" (except syntax error part)
;; But it does use ZX Next device (with 8kiB memory pages), to verify the "real tape"
;; works in such case too (the resulting TAP files must be identical on ZX48 and Next).

                device zxspectrumnext

; BASIC block
        module bas
line10:         db      0, 10
                dw      .len
.cmds           ; BORDER NOT PI:
                db      #E7, #C3, #A7, ':'
                ; PAPER NOT PI:
                db      #DA, #C3, #A7, ':'
                ; INK VAL "7":
                db      #D9, #B0, '"7":'
                ; CLEAR VAL "32763" : REM demo-1 address
                db      #FD, #B0, '"32763"', #0D
.len = $ - .cmds

line20:         db      0, 20
                dw      .len
.cmds           ; POKE VAL "23739",CODE "o":
                db      #F4, #B0, '"23739",', #AF, '"o":'
                ; LOAD ""SCREEN#: LOAD ""CODE
                db      #EF, '""', #AA, ':', #EF, '""', #AF, #0D
.len = $ - .cmds

line30:         db      0, 30
                dw      .len
.cmds           ; RANDOMIZE USR VAL "32764" : REM demo address
                db      #F9, #C0, #B0, '"32764"', #0D
.len = $ - .cmds

total = $ - line10
        endmodule


; NUMS block
nums            db      1
                dw      .datalen
.data           db      #82,#49,#0F,#DA,#A2     ;; Value 3.1415927
.datalen = $ - .data
.savelen = $ - nums

; CHARS block
chars           db      1
                dw      .datalen
.data           db      "SAVETAP testing character array"
.datalen = $ - .data
.savelen = $ - chars


; SCREEN$ block
                org     #4000
screen:
        dup 12
                block   256,#AA
                block   256,#55
        edup
        dup 24
                db      #07, #06, #06, #16, #05, #05, #0D, #04, #04, #14, #03, #03, #11, #02, #02, #29
                db      #29, #02, #02, #11, #03, #03, #14, #04, #04, #0D, #05, #05, #16, #06, #06, #07
        edup
.len = $ - screen


; CODE block
                org     #7FFC     ; to cross the slot-boundary

demo:           ei
                halt
                djnz    demo
.loop           ei
                halt
                ld      hl,#5801
                ld      de,#5800
                ld      bc,#300
                ld      a,(de)
                ld      (#5B00),a
                ldir
                call    .rnd
                ld      c,a
                and     #0C
                sub     #0B
                jr      nc,.not12
                ld      a,2
.not12          ld      d,a
                call    .rnd
                ld      e,a
                ld      hl,#5800
                add     hl,de
                ld      a,c
                and     #7F
                xor     (hl)
                ld      (hl),a
                jr      .loop

.rnd            ld      a,#29
                ld      b,a
                rrca
                rrca
                rrca
                xor     #1F
                add     a,b
                sbc     a,#FF
                ld      (.rnd+1),a
                ret
.len = $ - demo
        db      "XXXX"

; Clear output tap file
                emptytap "savetap_next.tap"
; Store BASIC
                savetap "savetap_next.tap",BASIC,"tstSAVETAP", bas.line10, bas.total, 10
; Store SCREEN#
                savetap "savetap_next.tap",CODE,"intro", screen, screen.len
; Store CODE
                savetap "savetap_next.tap",CODE,"demo", demo, demo.len
; Store NUMBERS
                savetap "savetap_next.tap",NUMBERS,"n", nums, nums.savelen, 'n'
; Store CHARS
                savetap "savetap_next.tap",CHARS,"t$", chars, chars.savelen, 't'
; Store HEADLESS
                savetap "savetap_next.tap",HEADLESS, (screen + #1800), 32, 66 ; custom flag


; No autostart (#8000 is used)
                savetap "savetap_next.tap",BASIC,"No start", bas.line10, bas.total
; Default letter ('A' is used)
                savetap "savetap_next.tap",NUMBERS,"n", nums, nums.savelen
; Address + length > #10000 (block to the end of memory will be saved)
                savetap "savetap_next.tap",HEADLESS, #FFFF, 2

; Extra variants of valid commands to exercise all code paths
                savetap "savetap_next.tap",CODE,"_extra1", demo, 1, 0x8000, 0x1234