@ -33,7 +33,7 @@ LF .EQU 0AH ; Line feed
CS .EQU 0CH ; Clear screen
CS .EQU 0CH ; Clear screen
CR .EQU 0DH ; Carriage return
CR .EQU 0DH ; Carriage return
CTRLO .EQU 0FH ; Control "O"
CTRLO .EQU 0FH ; Control "O"
CTRLQ .EQU 11H ; Control "Q"
CTRLQ .EQU 11H ; Control "Q"
CTRLR .EQU 12H ; Control "R"
CTRLR .EQU 12H ; Control "R"
CTRLS .EQU 13H ; Control "S"
CTRLS .EQU 13H ; Control "S"
CTRLU .EQU 15H ; Control "U"
CTRLU .EQU 15H ; Control "U"
@ -42,6 +42,11 @@ DEL .EQU 7FH ; Delete
; BASIC WORK SPACE LOCATIONS
; BASIC WORK SPACE LOCATIONS
; 0200H - 2000H BASIC EXECUTABLE
; 2000H - 2090H STACK
; 2090H - 20F8H BASIC EXECUTABLE VARAIABLES / WORKSPACE
; 20F9H - BASIC PROGRAM START
WRKSPC .EQU BAS_END + 90H ; WAS 4090H ; BASIC Work space
WRKSPC .EQU BAS_END + 90H ; WAS 4090H ; BASIC Work space
USR .EQU WRKSPC + 3H ; "USR (x)" jump
USR .EQU WRKSPC + 3H ; "USR (x)" jump
OUTSUB .EQU WRKSPC + 6H ; "OUT p,n"
OUTSUB .EQU WRKSPC + 6H ; "OUT p,n"
@ -132,7 +137,7 @@ MO .EQU 24H ; Missing operand
HX .EQU 26H ; HEX error
HX .EQU 26H ; HEX error
BN .EQU 28H ; BIN error
BN .EQU 28H ; BIN error
.ORG BAS_LOC ; WAS 02000H
.ORG BAS_LOC ; WAS 02000H
COLD: JP STARTB ; Jump for cold start
COLD: JP STARTB ; Jump for cold start
WARM: JP WARMST ; Jump for warm start
WARM: JP WARMST ; Jump for warm start
@ -173,8 +178,8 @@ MSIZE: LD HL,MEMMSG ; Point to message
MLOOP: INC HL ; Next byte
MLOOP: INC HL ; Next byte
; LD A,H ; Above address FFFF ?
; LD A,H ; Above address FFFF ?
; OR L
; OR L
LD A , H ; Memory top set below HBIOS Proxy @ FE00
CP $ FD
LD A , H ; Memory top set below HBIOS Proxy @ FE00
CP $ FD
JP Z , SETTOP ; Yes - 64K RAM
JP Z , SETTOP ; Yes - 64K RAM
LD A ,( HL ) ; Get contents
LD A ,( HL ) ; Get contents
LD B , A ; Save it
LD B , A ; Save it
@ -303,7 +308,7 @@ WORDS: .BYTE 'E'+80H,"ND"
.BYTE 'C' + 80H , "ONT"
.BYTE 'C' + 80H , "ONT"
.BYTE 'L' + 80H , "IST"
.BYTE 'L' + 80H , "IST"
.BYTE 'C' + 80H , "LEAR"
.BYTE 'C' + 80H , "LEAR"
.BYTE 'C ' + 80H , "LOAD "
.BYTE 'P ' + 80H , "LAY "
.BYTE 'C' + 80H , "SAVE"
.BYTE 'C' + 80H , "SAVE"
.BYTE 'N' + 80H , "EW"
.BYTE 'N' + 80H , "EW"
@ -392,7 +397,7 @@ WORDTB: .WORD PEND
.WORD CONT
.WORD CONT
.WORD LIST
.WORD LIST
.WORD CL EAR
.WORD CL EAR
.WORD REM
.WORD PLAY
.WORD REM
.WORD REM
.WORD NEW
.WORD NEW
@ -573,10 +578,10 @@ CHKSTK: PUSH HL ; Save code string address
ADD HL , BC
ADD HL , BC
.BYTE 3EH ; Skip "PUSH HL"
.BYTE 3EH ; Skip "PUSH HL"
ENFMEM: PUSH HL ; Save code string address
ENFMEM: PUSH HL ; Save code string address
LD A , 0D0H ;LOW -48 ; 48 Bytes minimum RAM
LD A , 0D0H ;LOW -48 ; 48 Bytes minimum RAM
SUB L
SUB L
LD L , A
LD L , A
LD A , 0FFH ; HIGH (-48) ; 48 Bytes minimum RAM
LD A , 0FFH ; HIGH (-48) ; 48 Bytes minimum RAM
SBC A , H
SBC A , H
JP C , OMERR ; Not enough - ?OM Error
JP C , OMERR ; Not enough - ?OM Error
LD H , A
LD H , A
@ -1257,34 +1262,36 @@ UPDATA: LD (NXTDAT),HL ; Update DATA pointer
EX DE , HL ; Restore code string address
EX DE , HL ; Restore code string address
RET
RET
; GET CONSOLE INPUT STATUS VIA HBIOS
TSTBRK:
TSTBRK:
; SAVE INCOMING REGISTERS (AF IS OUTPUT)
PUSH BC
PUSH DE
PUSH HL
; GET CONSOLE INPUT STATUS VIA HBIOS
LD C , CIODEV_CONSOLE ; CONSOLE UNIT TO C
LD B , BF_CIOIST ; HBIOS FUNC: INPUT STATUS
RST 08 ; HBIOS RETURNS STATUS IN A
; RESTORE REGISTERS (AF IS OUTPUT)
POP HL
POP DE
POP BC
PUSH BC ; SAVE INCOMING REGISTERS (AF IS OUTPUT)
PUSH DE
PUSH HL
LD C , CIODEV_CONSOLE ; CONSOLE UNIT TO C
LD B , BF_CIOIST ; HBIOS FUNC: INPUT STATUS
RST 08 ; HBIOS RETURNS STATUS IN A
POP HL ; RESTORE REGISTERS (AF IS OUTPUT)
POP DE
POP BC
RET Z ; No key, go back
RET Z ; No key, go back
PUSH BC
PUSH DE
PUSH HL
; INPUT CHARACTER FROM CONSOLE VIA HBIOS
LD C , CIODEV_CONSOLE ; CONSOLE UNIT TO C
LD B , BF_CIOIN ; HBIOS FUNC: INPUT CHAR
RST 08 ; HBIOS READS CHARACTDR
LD A , E ; MOVE CHARACTER TO A FOR RETURN
PUSH BC
PUSH DE
PUSH HL
; INPUT CHARACTER FROM CONSOLE VIA HBIOS
LD C , CIODEV_CONSOLE ; CONSOLE UNIT TO C
LD B , BF_CIOIN ; HBIOS FUNC: INPUT CHAR
RST 08 ; HBIOS READS CHARACTDR
LD A , E ; MOVE CHARACTER TO A FOR RETURN
;
;
; RESTORE REGISTERS (AF IS OUTPUT)
POP HL
POP DE
POP BC
POP HL ; RESTORE REGISTERS (AF IS OUTPUT)
POP DE
POP BC
CP ES C ; Escape key?
CP ES C ; Escape key?
JR Z , BRK ; Yes, break
JR Z , BRK ; Yes, break
@ -1292,22 +1299,22 @@ TSTBRK:
JR Z , BRK ; Yes, break
JR Z , BRK ; Yes, break
CP CTRLS ; Stop scrolling?
CP CTRLS ; Stop scrolling?
RET NZ ; Other key, ignore
RET NZ ; Other key, ignore
STALL: ; Wait for key
; SAVE INCOMING REGISTERS (AF IS OUTPUT)
PUSH BC
PUSH DE
PUSH HL
STALL: ; Wait for key
PUSH BC ; SAVE INCOMING REGISTERS (AF IS OUTPUT)
PUSH DE
PUSH HL
;
;
; INPUT CHARACTER FROM CONSOLE VIA HBIOS
LD C , CIODEV_CONSOLE ; CONSOLE UNIT TO C
LD B , BF_CIOIN ; HBIOS FUNC: INPUT CHAR
RST 08 ; HBIOS READS CHARACTDR
LD A , E ; MOVE CHARACTER TO A FOR RETURN
; INPUT CHARACTER FROM CONSOLE VIA HBIOS
;
;
; RESTORE REGISTERS (AF IS OUTPUT)
POP HL
POP DE
POP BC
LD C , CIODEV_CONSOLE ; CONSOLE UNIT TO C
LD B , BF_CIOIN ; HBIOS FUNC: INPUT CHAR
RST 08 ; HBIOS READS CHARACTDR
LD A , E ; MOVE CHARACTER TO A FOR RETURN
;
POP HL ; RESTORE REGISTERS (AF IS OUTPUT)
POP DE
POP BC
CP CTRLQ ; Resume scrolling?
CP CTRLQ ; Resume scrolling?
RET Z ; Release the chokehold
RET Z ; Release the chokehold
CP CTRLC ; Second break?
CP CTRLC ; Second break?
@ -1357,7 +1364,6 @@ NULL: CALL GETINT ; Get integer 0-255
LD ( NULLS ), A ; Set nulls number
LD ( NULLS ), A ; Set nulls number
RET
RET
ACCSUM: PUSH HL ; Save address in array
ACCSUM: PUSH HL ; Save address in array
LD HL ,( CH KSUM ) ; Get check sum
LD HL ,( CH KSUM ) ; Get check sum
LD B , 0 ; BC - Value of byte
LD B , 0 ; BC - Value of byte
@ -1967,8 +1973,8 @@ OPRND: XOR A ; Get operand routine
JP C , ASCTFP ; Number - Get value
JP C , ASCTFP ; Number - Get value
CALL CH KLTR ; See if a letter
CALL CH KLTR ; See if a letter
JP NC , CONVAR ; Letter - Find variable
JP NC , CONVAR ; Letter - Find variable
CP '&' ; &H = HEX, &B = BINARY
JR NZ , NOTAMP
CP '&' ; &H = HEX, &B = BINARY
JR NZ , NOTAMP
CALL GETCHR ; Get next character
CALL GETCHR ; Get next character
CP 'H' ; Hex number indicated? [function added]
CP 'H' ; Hex number indicated? [function added]
JP Z , HEXTFP ; Convert Hex to FPREG
JP Z , HEXTFP ; Convert Hex to FPREG
@ -2981,14 +2987,14 @@ VAL: CALL GETLEN ; Get length of string
EX ( SP ), HL ; Save string end,get start
EX ( SP ), HL ; Save string end,get start
PUSH BC ; Save end+1 byte
PUSH BC ; Save end+1 byte
LD A ,( HL ) ; Get starting byte
LD A ,( HL ) ; Get starting byte
CP '$' ; Hex number indicated? [function added]
JP NZ , VAL1
CALL HEXTFP ; Convert Hex to FPREG
JR VAL3
CP '$' ; Hex number indicated? [function added]
JP NZ , VAL1
CALL HEXTFP ; Convert Hex to FPREG
JR VAL3
VAL1: CP '%' ; Binary number indicated? [function added]
VAL1: CP '%' ; Binary number indicated? [function added]
JP NZ , VAL2
CALL BINTFP ; Convert Bin to FPREG
JR VAL3
JP NZ , VAL2
CALL BINTFP ; Convert Bin to FPREG
JR VAL3
VAL2: CALL ASCTFP ; Convert ASCII string to FP
VAL2: CALL ASCTFP ; Convert ASCII string to FP
VAL3: POP BC ; Restore end+1 byte
VAL3: POP BC ; Restore end+1 byte
POP HL ; Restore end+1 address
POP HL ; Restore end+1 address
@ -3054,7 +3060,7 @@ POKE: CALL GETNUM ; Get memory address
CALL DEINT ; Get integer -32768 to 3276
CALL DEINT ; Get integer -32768 to 3276
PUSH DE ; Save memory address
PUSH DE ; Save memory address
CALL CH KSYN ; Make sure ',' follows
CALL CH KSYN ; Make sure ',' follows
.BYTE ','
.BYTE ','
CALL GETINT ; Get integer 0-255
CALL GETINT ; Get integer 0-255
POP DE ; Restore memory address
POP DE ; Restore memory address
LD ( DE ), A ; Load it into memory
LD ( DE ), A ; Load it into memory
@ -4143,19 +4149,21 @@ ATNTAB: .BYTE 9 ; Table used by ATN
ARET: RET ; A RETurn instruction
ARET: RET ; A RETurn instruction
; INPUT CHARACTER FROM CONSOLE VIA HBIOS
GETINP:
GETINP:
PUSH BC
PUSH DE
PUSH HL
; INPUT CHARACTER FROM CONSOLE VIA HBIOS
LD C , CIODEV_CONSOLE ; CONSOLE UNIT TO C
LD B , BF_CIOIN ; HBIOS FUNC: INPUT CHAR
RST 08 ; HBIOS READS CHARACTDR
LD A , E ; MOVE CHARACTER TO A FOR RETURN
; RESTORE REGISTERS (AF IS OUTPUT)
POP HL
POP DE
POP BC
PUSH BC
PUSH DE
PUSH HL
LD C , CIODEV_CONSOLE ; CONSOLE UNIT TO C
LD B , BF_CIOIN ; HBIOS FUNC: INPUT CHAR
RST 08 ; HBIOS READS CHARACTDR
LD A , E ; MOVE CHARACTER TO A FOR RETURN
POP HL ; RESTORE REGISTERS (AF IS OUTPUT)
POP DE
POP BC
RET
RET
CLS:
CLS:
LD A , CS ; ASCII Clear screen
LD A , CS ; ASCII Clear screen
@ -4199,26 +4207,26 @@ DOKE: CALL GETNUM ; Get a number
HEX: CALL TSTNUM ; Verify it's a number
HEX: CALL TSTNUM ; Verify it's a number
CALL DEINT ; Get integer -32768 to 32767
CALL DEINT ; Get integer -32768 to 32767
PUSH BC ; Save contents of BC
PUSH BC ; Save contents of BC
LD HL , PBUFF
LD A , D ; Get high order into A
LD HL , PBUFF
LD A , D ; Get high order into A
CP $ 0
CP $ 0
JR Z , HEX2 ; Skip output if both high digits are zero
JR Z , HEX2 ; Skip output if both high digits are zero
CALL BYT2ASC ; Convert D to ASCII
CALL BYT2ASC ; Convert D to ASCII
LD A , B
CP '0'
JR Z , HEX1 ; Don't store high digit if zero
LD ( HL ), B ; Store it to PBUFF
INC HL ; Next location
HEX1: LD ( HL ), C ; Store C to PBUFF+1
LD A , B
CP '0'
JR Z , HEX1 ; Don't store high digit if zero
LD ( HL ), B ; Store it to PBUFF
INC HL ; Next location
HEX1: LD ( HL ), C ; Store C to PBUFF+1
INC HL ; Next location
INC HL ; Next location
HEX2: LD A , E ; Get lower byte
HEX2: LD A , E ; Get lower byte
CALL BYT2ASC ; Convert E to ASCII
CALL BYT2ASC ; Convert E to ASCII
LD A , D
LD A , D
CP $ 0
CP $ 0
JR NZ , HEX3 ; If upper byte was not zero then always print lower byte
LD A , B
CP '0' ; If high digit of lower byte is zero then don't print
JR Z , HEX4
JR NZ , HEX3 ; If upper byte was not zero then always print lower byte
LD A , B
CP '0' ; If high digit of lower byte is zero then don't print
JR Z , HEX4
HEX3: LD ( HL ), B ; to PBUFF+2
HEX3: LD ( HL ), B ; to PBUFF+2
INC HL ; Next location
INC HL ; Next location
HEX4: LD ( HL ), C ; to PBUFF+3
HEX4: LD ( HL ), C ; to PBUFF+3
@ -4254,6 +4262,7 @@ ADD301 ADD A,$30 ; And make it full ASCII
; Convert "&Hnnnn" to FPREG
; Convert "&Hnnnn" to FPREG
; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn"
; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn"
; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9
; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9
;
HEXTFP EX DE , HL ; Move code string pointer to DE
HEXTFP EX DE , HL ; Move code string pointer to DE
LD HL , $ 0000 ; Zero out the value
LD HL , $ 0000 ; Zero out the value
CALL GETHEX ; Check the number for valid hex
CALL GETHEX ; Check the number for valid hex
@ -4362,32 +4371,32 @@ CHKBIN: INC DE
BINERR: LD E , BN ; ?BIN Error
BINERR: LD E , BN ; ?BIN Error
JP ERROR
JP ERROR
JJUMP1:
JJUMP1:
LD IX , - 1 ; Flag cold start
LD IX , - 1 ; Flag cold start
JP CS TART ; Go and initialise
JP CS TART ; Go and initialise
; OUTPUT CHARACTER TO CONSOLE VIA HBIOS
MONOUT:
MONOUT:
; SAVE ALL INCOMING REGISTERS
PUSH AF
PUSH BC
PUSH DE
PUSH HL
; OUTPUT CHARACTER TO CONSOLE VIA HBIOS
LD E , A ; OUTPUT CHAR TO E
LD C , CIODEV_CONSOLE ; CONSOLE UNIT TO C
LD B , BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR
RST 08 ; HBIOS OUTPUTS CHARACTDR
; RESTORE ALL REGISTERS
POP HL
POP DE
POP BC
POP AF
RET
MONITR: LD A , BID_BOOT ; BOOT BANK
LD HL , 0 ; ADDRESS ZERO
CALL HB_BNKCALL ; DOES NOT RETURN
PUSH AF ; SAVE ALL INCOMING REGISTERS
PUSH BC
PUSH DE
PUSH HL
LD E , A ; OUTPUT CHAR TO E
LD C , CIODEV_CONSOLE ; CONSOLE UNIT TO C
LD B , BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR
RST 08 ; HBIOS OUTPUTS CHARACTDR
POP HL ; RESTORE ALL REGISTERS
POP DE
POP BC
POP AF
RET
MONITR: LD A , BID_BOOT ; BOOT BANK
LD HL , 0 ; ADDRESS ZERO
CALL HB_BNKCALL ; DOES NOT RETURN
INITST: LD A , 0 ; Clear break flag
INITST: LD A , 0 ; Clear break flag
LD ( BRKFLG ), A
LD ( BRKFLG ), A
@ -4395,7 +4404,6 @@ INITST: LD A,0 ; Clear break flag
ARETN: RETN ; Return from NMI
ARETN: RETN ; Return from NMI
TSTBIT: PUSH AF ; Save bit mask
TSTBIT: PUSH AF ; Save bit mask
AND B ; Get common bits
AND B ; Get common bits
POP BC ; Restore bit mask
POP BC ; Restore bit mask
@ -4406,19 +4414,470 @@ TSTBIT: PUSH AF ; Save bit mask
OUTNCR: CALL OUTC ; Output character in A
OUTNCR: CALL OUTC ; Output character in A
JP PRNTCRLF ; Output CRLF
JP PRNTCRLF ; Output CRLF
; ---------------------------------------------------------------------------------------
; PLAY N ; PLAY NOTE N
PLAY: CALL GETNUM ; GET NOTE TO PLAY
CALL DEINT ; ITS IN DE
LD A , SP K_NUMNOT - 1 ; EXIT IF NOTE
CP E ; OUT OF RANGE
RET M
PUSH HL ; SAVE SYNTAX POINTER
LD HL , SP K_TUNTBL ; POINT TO NOTE ENTRY
EX DE , HL
ADD HL , HL
ADD HL , HL
ADD HL , DE ; ITS IN HL
CALL SP K_BEEP
POP HL ; RESTORE SYNTAX POINTER
RET
SPK_BEEP:
LD A ,( HL ) ; LOAD 1ST ARG
INC HL ; IN DE
LD E , A
LD A ,( HL )
INC HL
LD D , A
;
LD A ,( HL ) ; LOAD 2ND ARG
INC HL ; IN BC
LD C , A
LD A ,( HL )
INC HL
LD B , A
PUSH BC ; SETUP ARG IN HL
POP HL
;
CALL SP K_BEEPER ; PLAY
;
RET
;
; The following SPK_BEEPER routine is a modification of code from
; "The Complete SPECTRUM ROM DISSASSEMBLY" by Dr Ian Logan & Dr Frank O’Hara
;
; https://www.esocop.org/docs/CompleteSpectrumROMDisassemblyThe.pdf
;
; DE Number of passes to make through the sound generation loop
; HL Loop delay parameter
;RTCIO .EQU $70
RTCVAL .EQU 0
;
SPK_BEEPER:
PUSH IX
DI ; Disable the interrupt for the duration of a 'beep'.
LD A , L ; Save L temporarily.
SRL L ; Each '1' in the L register is to count 4 T states, but take INT (L/4) and count 16 T states instead.
SRL L
CPL ; Go back to the original value in L and find how many were lost by taking 3-(A mod 4).
AND $ 03
LD C , A
LD B , $ 00
LD IX , SP K_DLYADJ ; The base address of the timing loop.
ADD IX , BC ; Alter the length of the timing loop. Use an earlier starting point for each '1' lost by taking INT (L/4).
LD A ,( RTCVAL ) ; Fetch the present border colour from BORDCR and move it to bits 2, 1 and 0 of the A register.
;
; The HL register holds the 'length of the timing loop' with 16 T states being used for each '1' in the L register and 1024 T states for each '1' in the H register.
;
SPK_DLYADJ:
NOP ; Add 4 T states for each earlier entry point that is used.
NOP
NOP
INC B ; The values in the B and C registers will come from the H and L registers - see below.
INC C
BE_H_L_LP:
DEC C ; The 'timing loop', i.e. BC*4 T states. (But note that at the half-cycle point, C will be equal to L+1.)
JR NZ , BE_H_L_LP
LD C , $ 3 F
DEC B
JP NZ , BE_H_L_LP
;
; The loudspeaker is now alternately activated and deactivated.
;
XOR % 00000100 ; Flip bit 2.
OUT ( RTCIO ), A ; Perform the 'OUT' operation, leaving other bits unchanged.
LD B , H ; Reset the B register.
LD C , A ; Save the A register.
BIT 4 , A ; Jump if at the half-cycle point.
JR NZ , BE_AGAIN
;
; After a full cycle the DE register pair is tested.
;
LD A , D ; Jump forward if the last complete pass has been made already.
OR E
JR Z , BE_END
LD A , C ; Fetch the saved value.
LD C , L ; Reset the C register.
DEC DE ; Decrease the pass counter.
JP ( IX ) ; Jump back to the required starting location of the loop.
;
; The parameters for the second half-cycle are set up.
;
BE_AGAIN:
LD C , L ; Reset the C register.
INC C ; Add 16 T states as this path is shorter.
JP ( IX ) ; Jump back.
BE_END:
EI
POP IX
RET
;
; STANDARD ONE SECOND TONE TABLES AT 1MHZ (UNCOMPENSATED). FOR SPK_BEEPER, FIRST WORD LOADED INTO DE, SECOND INTO HL
; EXCEL SPREADSHEET FOR CALCULATION CAN BE FOUND HERE:
; https://www.retrobrewcomputers.org/lib/exe/fetch.php?media=boards:sbc:sbc_v2:sbc_v2-004:spk_beep_tuntbl.xlsx
;
SPK_TUNTBL:
# IF ( CPUOSC = 1000000 )
.DW $ 10 , $ 1 DDD ; C0
.DW $ 11 , $ 1 C31 ; C
.DW $ 12 , $ 1 A9B ; D0
.DW $ 13 , $ 191 A ; D
.DW $ 14 , $ 17 B3 ; E0
.DW $ 15 , $ 165 E ; F0
.DW $ 17 , $ 151 E ; F
.DW $ 18 , $ 13 EE ; G0
.DW $ 19 , $ 12 CF ; G
.DW $ 1B , $ 11 C1 ; A0
.DW $ 1 D , $ 10 C1 ; A
.DW $ 1 E , $ FD1 ; B0
.DW $ 20 , $ EEE ; C1
.DW $ 22 , $ E17 ; C
.DW $ 24 , $ D4D ; D1
.DW $ 26 , $ C8E ; D
.DW $ 29 , $ BD9 ; E1
.DW $ 2 B , $ B2F ; F1
.DW $ 2 E , $ A8E ; F
.DW $ 31 , $ 9 F7 ; G1
.DW $ 33 , $ 968 ; G
.DW $ 37 , $ 8 E0 ; A1
.DW $ 3 A , $ 861 ; A
.DW $ 3 D , $ 7 E8 ; B1
.DW $ 41 , $ 777 ; C2
.DW $ 45 , $ 70 B ; C
.DW $ 49 , $ 6 A6 ; D2
.DW $ 4 D , $ 647 ; D
.DW $ 52 , $ 5 EC ; E2
.DW $ 57 , $ 597 ; F2
.DW $ 5 C , $ 547 ; F
.DW $ 62 , $ 4 FB ; G2
.DW $ 67 , $ 4 B3 ; G
.DW $ 6 E , $ 470 ; A2
.DW $ 74 , $ 430 ; A
.DW $ 7 B , $ 3 F4 ; B2
.DW $ 82 , $ 3 BB ; C3
.DW $ 8 A , $ 385 ; C
.DW $ 92 , $ 353 ; D3
.DW $ 9 B , $ 323 ; D
.DW $ A4 , $ 2 F6 ; E3
.DW $ AE , $ 2 CB ; F3
.DW $ B9 , $ 2 A3 ; F
.DW $ C4 , $ 27 D ; G3
.DW $ CF , $ 259 ; G
.DW $ DC , $ 238 ; A3
.DW $ E9 , $ 218 ; A
.DW $ F6 , $ 1 FA ; B3
.DW $ 105 , $ 1 DD ; C4
.DW $ 115 , $ 1 C2 ; C
.DW $ 125 , $ 1 A9 ; D4
.DW $ 137 , $ 191 ; D
.DW $ 149 , $ 17 B ; E4
.DW $ 15 D , $ 165 ; F4
.DW $ 171 , $ 151 ; F
.DW $ 188 , $ 13 E ; G4
.DW $ 19 F , $ 12 C ; G
.DW $ 1B 8 , $ 11 C ; A4
.DW $ 1 D2 , $ 10 C ; A
.DW $ 1 ED , $ FD ; B4
.DW $ 20 B , $ EE ; C5
.DW $ 22 A , $ E1 ; C
.DW $ 24 B , $ D4 ; D5
.DW $ 26 E , $ C8 ; D
.DW $ 293 , $ BD ; E5
.DW $ 2 BA , $ B2 ; F5
.DW $ 2 E3 , $ A8 ; F
.DW $ 30 F , $ 9 F ; G5
.DW $ 33 E , $ 96 ; G
.DW $ 370 , $ 8 E ; A5
.DW $ 3 A4 , $ 86 ; A
.DW $ 3 DB , $ 7 E ; B5
.DW $ 416 , $ 77 ; C6
.DW $ 454 , $ 70 ; C
.DW $ 496 , $ 6 A ; D6
.DW $ 4 DC , $ 64 ; D
.DW $ 526 , $ 5 E ; E6
.DW $ 574 , $ 59 ; F6
.DW $ 5 C7 , $ 54 ; F
.DW $ 61 F , $ 4 F ; G6
.DW $ 67 D , $ 4 B ; G
.DW $ 6 E0 , $ 47 ; A6
.DW $ 748 , $ 43 ; A
.DW $ 7 B7 , $ 3 F ; B6
.DW $ 82 D , $ 3 B ; C7
.DW $ 8 A9 , $ 38 ; C
.DW $ 92 D , $ 35 ; D7
.DW $ 9 B9 , $ 32 ; D
.DW $ A4D , $ 2 F ; E7
.DW $ AE9 , $ 2 C ; F7
.DW $ B8F , $ 2 A ; F
.DW $ C3F , $ 27 ; G7
.DW $ CFA , $ 25 ; G
.DW $ DC0 , $ 23 ; A7
.DW $ E91 , $ 21 ; A
.DW $ F6F , $ 1 F ; B7
.DW $ 105 A , $ 1 D ; C8
.DW $ 1152 , $ 1 C ; C
.DW $ 125 A , $ 1 A ; D8
.DW $ 1372 , $ 19 ; D
.DW $ 149 A , $ 17 ; E8
.DW $ 15 D3 , $ 16 ; F8
.DW $ 171 F , $ 15 ; F
.DW $ 187 F , $ 13 ; G8
.DW $ 19 F4 , $ 12 ; G
.DW $ 1B 80 , $ 11 ; A8
.DW $ 1 D22 , $ 10 ; A
.DW $ 1 EDE , $ F ; B8
# ENDIF
# IF ( CPUOSC = 2000000 )
.DW $ 10 , $ 3 BBA ; C0
.DW $ 11 , $ 3862 ; C
.DW $ 12 , $ 3537 ; D0
.DW $ 13 , $ 3235 ; D
.DW $ 14 , $ 2 F67 ; E0
.DW $ 15 , $ 2 CBC ; F0
.DW $ 17 , $ 2 A3D ; F
.DW $ 18 , $ 27 DC ; G0
.DW $ 19 , $ 259 E ; G
.DW $ 1B , $ 2382 ; A0
.DW $ 1 D , $ 2183 ; A
.DW $ 1 E , $ 1 FA2 ; B0
.DW $ 20 , $ 1 DDD ; C1
.DW $ 22 , $ 1 C2F ; C
.DW $ 24 , $ 1 A9A ; D1
.DW $ 26 , $ 191 C ; D
.DW $ 29 , $ 17 B3 ; E1
.DW $ 2 B , $ 165 F ; F1
.DW $ 2 E , $ 151 D ; F
.DW $ 31 , $ 13 EE ; G1
.DW $ 33 , $ 12 D0 ; G
.DW $ 37 , $ 11 C1 ; A1
.DW $ 3 A , $ 10 C2 ; A
.DW $ 3 D , $ FD1 ; B1
.DW $ 41 , $ EEE ; C2
.DW $ 45 , $ E17 ; C
.DW $ 49 , $ D4D ; D2
.DW $ 4 D , $ C8E ; D
.DW $ 52 , $ BD9 ; E2
.DW $ 57 , $ B2F ; F2
.DW $ 5 C , $ A8E ; F
.DW $ 62 , $ 9 F7 ; G2
.DW $ 67 , $ 967 ; G
.DW $ 6 E , $ 8 E0 ; A2
.DW $ 74 , $ 861 ; A
.DW $ 7 B , $ 7 E8 ; B2
.DW $ 82 , $ 777 ; C3
.DW $ 8 A , $ 70 B ; C
.DW $ 92 , $ 6 A6 ; D3
.DW $ 9 B , $ 647 ; D
.DW $ A4 , $ 5 EC ; E3
.DW $ AE , $ 597 ; F3
.DW $ B9 , $ 547 ; F
.DW $ C4 , $ 4 FB ; G3
.DW $ CF , $ 4 B3 ; G
.DW $ DC , $ 470 ; A3
.DW $ E9 , $ 430 ; A
.DW $ F6 , $ 3 F4 ; B3
.DW $ 105 , $ 3 BB ; C4
.DW $ 115 , $ 385 ; C
.DW $ 125 , $ 353 ; D4
.DW $ 137 , $ 323 ; D
.DW $ 149 , $ 2 F6 ; E4
.DW $ 15 D , $ 2 CB ; F4
.DW $ 171 , $ 2 A3 ; F
.DW $ 188 , $ 27 D ; G4
.DW $ 19 F , $ 259 ; G
.DW $ 1B 8 , $ 238 ; A4
.DW $ 1 D2 , $ 218 ; A
.DW $ 1 ED , $ 1 FA ; B4
.DW $ 20 B , $ 1 DD ; C5
.DW $ 22 A , $ 1 C2 ; C
.DW $ 24 B , $ 1 A9 ; D5
.DW $ 26 E , $ 191 ; D
.DW $ 293 , $ 17 B ; E5
.DW $ 2 BA , $ 165 ; F5
.DW $ 2 E3 , $ 151 ; F
.DW $ 30 F , $ 13 E ; G5
.DW $ 33 E , $ 12 C ; G
.DW $ 370 , $ 11 C ; A5
.DW $ 3 A4 , $ 10 C ; A
.DW $ 3 DB , $ FD ; B5
.DW $ 416 , $ EE ; C6
.DW $ 454 , $ E1 ; C
.DW $ 496 , $ D4 ; D6
.DW $ 4 DC , $ C8 ; D
.DW $ 526 , $ BD ; E6
.DW $ 574 , $ B2 ; F6
.DW $ 5 C7 , $ A8 ; F
.DW $ 61 F , $ 9 F ; G6
.DW $ 67 D , $ 96 ; G
.DW $ 6 E0 , $ 8 E ; A6
.DW $ 748 , $ 86 ; A
.DW $ 7 B7 , $ 7 E ; B6
.DW $ 82 D , $ 77 ; C7
.DW $ 8 A9 , $ 70 ; C
.DW $ 92 D , $ 6 A ; D7
.DW $ 9 B9 , $ 64 ; D
.DW $ A4D , $ 5 E ; E7
.DW $ AE9 , $ 59 ; F7
.DW $ B8F , $ 54 ; F
.DW $ C3F , $ 4 F ; G7
.DW $ CFA , $ 4 B ; G
.DW $ DC0 , $ 47 ; A7
.DW $ E91 , $ 43 ; A
.DW $ F6F , $ 3 F ; B7
.DW $ 105 A , $ 3 B ; C8
.DW $ 1152 , $ 38 ; C
.DW $ 125 A , $ 35 ; D8
.DW $ 1372 , $ 32 ; D
.DW $ 149 A , $ 2 F ; E8
.DW $ 15 D3 , $ 2 C ; F8
.DW $ 171 F , $ 2 A ; F
.DW $ 187 F , $ 27 ; G8
.DW $ 19 F4 , $ 25 ; G
.DW $ 1B 80 , $ 23 ; A8
.DW $ 1 D22 , $ 21 ; A
.DW $ 1 EDE , $ 37 ; B8
# ENDIF
# IF ( CPUOSC = 10000000 )
.DW $ 0 , $ 0000 ; .DW $10, $12AA4 ; C0
.DW $ 0 , $ 0000 ; .DW $11, $119EA ; C
.DW $ 0 , $ 0000 ; .DW $12, $10A17 ; D0
.DW $ 13 , $ FB0B ; D
.DW $ 14 , $ ED07 ; E0
.DW $ 15 , $ DFAC ; F0
.DW $ 17 , $ D331 ; F
.DW $ 18 , $ C74C ; G0
.DW $ 19 , $ BC17 ; G
.DW $ 1B , $ B18E ; A0
.DW $ 1 D , $ A790 ; A
.DW $ 1 E , $ 9 E2C ; B0
.DW $ 20 , $ 9552 ; C1
.DW $ 22 , $ 8 CEB ; C
.DW $ 24 , $ 8502 ; D1
.DW $ 26 , $ 7 D8D ; D
.DW $ 29 , $ 7683 ; E1
.DW $ 2 B , $ 6 FDC ; F1
.DW $ 2 E , $ 6993 ; F
.DW $ 31 , $ 63 A6 ; G1
.DW $ 33 , $ 5 E10 ; G
.DW $ 37 , $ 58 C7 ; A1
.DW $ 3 A , $ 53 CB ; A
.DW $ 3 D , $ 4 F16 ; B1
.DW $ 41 , $ 4 AA6 ; C2
.DW $ 45 , $ 4675 ; C
.DW $ 49 , $ 4281 ; D2
.DW $ 4 D , $ 3 EC6 ; D
.DW $ 52 , $ 3 B40 ; E2
.DW $ 57 , $ 37 EC ; F2
.DW $ 5 C , $ 34 C9 ; F
.DW $ 62 , $ 31 D3 ; G2
.DW $ 67 , $ 2 F06 ; G
.DW $ 6 E , $ 2 C63 ; A2
.DW $ 74 , $ 29 E5 ; A
.DW $ 7 B , $ 278 B ; B2
.DW $ 82 , $ 2553 ; C3
.DW $ 8 A , $ 233 B ; C
.DW $ 92 , $ 2141 ; D3
.DW $ 9 B , $ 1 F63 ; D
.DW $ A4 , $ 1 DA0 ; E3
.DW $ AE , $ 1B F6 ; F3
.DW $ B9 , $ 1 A64 ; F
.DW $ C4 , $ 18 E9 ; G3
.DW $ CF , $ 1783 ; G
.DW $ DC , $ 1631 ; A3
.DW $ E9 , $ 14 F2 ; A
.DW $ F6 , $ 13 C5 ; B3
.DW $ 105 , $ 12 A9 ; C4
.DW $ 115 , $ 119 D ; C
.DW $ 125 , $ 10 A0 ; D4
.DW $ 137 , $ FB1 ; D
.DW $ 149 , $ ED0 ; E4
.DW $ 15 D , $ DFB ; F4
.DW $ 171 , $ D32 ; F
.DW $ 188 , $ C74 ; G4
.DW $ 19 F , $ BC1 ; G
.DW $ 1B 8 , $ B18 ; A4
.DW $ 1 D2 , $ A79 ; A
.DW $ 1 ED , $ 9 E2 ; B4
.DW $ 20 B , $ 954 ; C5
.DW $ 22 A , $ 8 CE ; C
.DW $ 24 B , $ 850 ; D5
.DW $ 26 E , $ 7 D8 ; D
.DW $ 293 , $ 768 ; E5
.DW $ 2 BA , $ 6 FD ; F5
.DW $ 2 E3 , $ 699 ; F
.DW $ 30 F , $ 63 A ; G5
.DW $ 33 E , $ 5 E0 ; G
.DW $ 370 , $ 58 C ; A5
.DW $ 3 A4 , $ 53 C ; A
.DW $ 3 DB , $ 4 F1 ; B5
.DW $ 416 , $ 4 AA ; C6
.DW $ 454 , $ 467 ; C
.DW $ 496 , $ 428 ; D6
.DW $ 4 DC , $ 3 EC ; D
.DW $ 526 , $ 3 B4 ; E6
.DW $ 574 , $ 37 E ; F6
.DW $ 5 C7 , $ 34 C ; F
.DW $ 61 F , $ 31 D ; G6
.DW $ 67 D , $ 2 F0 ; G
.DW $ 6 E0 , $ 2 C6 ; A6
.DW $ 748 , $ 29 E ; A
.DW $ 7 B7 , $ 278 ; B6
.DW $ 82 D , $ 255 ; C7
.DW $ 8 A9 , $ 233 ; C
.DW $ 92 D , $ 214 ; D7
.DW $ 9 B9 , $ 1 F6 ; D
.DW $ A4D , $ 1 DA ; E7
.DW $ AE9 , $ 1B F ; F7
.DW $ B8F , $ 1 A6 ; F
.DW $ C3F , $ 18 E ; G7
.DW $ CFA , $ 178 ; G
.DW $ DC0 , $ 163 ; A7
.DW $ E91 , $ 14 F ; A
.DW $ F6F , $ 13 C ; B7
.DW $ 105 A , $ 12 A ; C8
.DW $ 1152 , $ 119 ; C
.DW $ 125 A , $ 10 A ; D8
.DW $ 1372 , $ FB ; D
.DW $ 149 A , $ ED ; E8
.DW $ 15 D3 , $ DF ; F8
.DW $ 171 F , $ D3 ; F
.DW $ 187 F , $ C7 ; G8
.DW $ 19 F4 , $ BC ; G
.DW $ 1B 80 , $ B1 ; A8
.DW $ 1 D22 , $ A7 ; A
.DW $ 1 EDE , $ 9 E ; B8
# ENDIF
SPK_NUMNOT .EQU ( $ - SP K_TUNTBL ) / 4
TXT_READY:
TXT_READY:
.DB CR , LF
.DB CR , LF
.TEXT "BASIC READY "
.TEXT "BASIC READY "
.DB CR , LF , 0FFH
.DB CR , LF , 0FFH
SLACK .EQU ( BAS_END - $ )
.FILL SLACK , 00H
;
BAS_STACK .EQU $
SLACK .EQU ( BAS_END - $ )
.FILL SLACK , 00H
;
;
.ECHO "BASIC space remaining: "
.ECHO SLACK
.ECHO " bytes.\n"
.ECHO "BASIC space remaining: "
.ECHO SLACK
.ECHO " bytes.\n"
.end
.end