; *************************************************************************** ; Load a machine code program using the TAP format ; ; Author: Peter Mount, Area51.dev & Contributors ; URL: https://area51.dev/sinclair/asm/loaders/tap/ ; *************************************************************************** ; fill byte is 0x00 ; #code has an additional argument: the sync byte for the block. ; The assembler calculates and appends checksum byte to each segment. ; ; Note: If a segment is appended without an explicit address, ; then the sync byte and the checksum byte of the preceding segment are not ; counted when calculating the start address of this segment. #target tap ; Include Spectrum headers from http://localhost:1313/sinclair/spectrum/reference/include/zasm/headers/ #include "headers.z80" ; *************************************************************************** ; Header block containing the block name and the size of the BASIC program ; *************************************************************************** #code PROG_HEADER,0,17,0 defb 0 ; Indicates a Basic program defb "mloader " ; the block name, 10 bytes long defw variables_end-0 ; length of block = length of basic program plus variables defw 10 ; line number for auto-start, 0x8000 if none defw program_end-0 ; length of the basic program without variables ; *************************************************************************** ; Data block containing a simple BASIC program: ; ; 10 CLEAR 23999 ; Set end of Basic memory ; 20 LOAD "" CODE 24000 ; Load next file to the free memory ; 30 RANDOMIZE USR 24000 ; Execute the loaded code ; ; This will when run mark memory from 24000 (0x5DC0) to be unavailable to ; BASIC and everything above that point is then usable by the machine code ; program who's entry point is address 24000 (0x5DC0). ; *************************************************************************** #code PROG_DATA,0,*,0xff ; 10 CLEAR 23999 defb 0,10 ; line number defb end10-($+1) ; line length defb 0 ; statement number defb BAS_CLEAR ; token CLEAR defm "23999",$0e0000bf5d00 ; number 23999, ascii & internal format end10: defb $0d ; line end marker ; 20 LOAD "" CODE 24000 defb 0,20 ; line number defb end20-($+1) ; line length defb 0 ; statement number defb BAS_LOAD,'"','"',BAS_CODE ; token LOAD, 2 quotes, token CODE defm "24000",$0e0000c05d00 ; number 24000, ascii & internal format end20: defb $0d ; line end marker ; 30 RANDOMIZE USR 24000 defb 0,30 ; line number defb end30-($+1) ; line length defb 0 ; statement number defb BAS_RANDOMIZE, BAS_USR ; token RANDOMIZE, token USR defm "24000",$0e0000c05d00 ; number 24000, ascii & internal format end30: defb $0d ; line end marker program_end: ; ZX Spectrum Basic variables variables_end: