From ea18f2fee6d778347f14ac22d1d42c0c724bcdb7 Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Sun, 25 Apr 2021 10:31:04 +0100 Subject: [PATCH] Updates to MSBASIC for 40/80 column modes --- software/asm/MSBASIC.asm | 168 +++++++++--------- software/asm/include/MSBASIC_BuildVersion.asm | 2 +- software/asm/include/MSBASIC_Definitions.asm | 12 +- software/roms/USER_ROM_256.bin | Bin 510464 -> 510464 bytes software/tools/assemble_roms.sh | 11 +- 5 files changed, 103 insertions(+), 90 deletions(-) diff --git a/software/asm/MSBASIC.asm b/software/asm/MSBASIC.asm index d1e5fca..7a2227e 100644 --- a/software/asm/MSBASIC.asm +++ b/software/asm/MSBASIC.asm @@ -39,31 +39,38 @@ DB 01h ; Code Type, 01 = Machine Code. HEADER1: IF BUILD_MZ80A = 1 - DB "MS-BASIC(MZ-80A)", 0DH ; Title/Name (17 bytes). - DW CODEEND - CODESTART ; Size of program. - DW CODESTART ; Load address of program. - DW CODESTART ; Exec address of program. + DB "MS-BASIC(MZ-80A)", 0DH ; Title/Name (17 bytes). + DW CODEEND - CODESTART ; Size of program. + DW CODESTART ; Load address of program. + DW CODESTART ; Exec address of program. ENDIF HEADER2: IF BUILD_RFS = 1 - DB "MS-BASIC(RFS)", 0DH, 0DH, 0DH, 0DH ; Title/Name (17 bytes). - DW CODEEND - CODESTART ; Size of program. - DW CODESTART ; Load address of program. - DW CODESTART ; Exec address of program. + IF BUILD_80C = 0 + DB "MS-BASIC(RFS40))", 0DH, 0DH ; Title/Name (17 bytes). + DW CODEEND - CODESTART ; Size of program. + DW CODESTART ; Load address of program. + DW CODESTART ; Exec address of program. + ELSE + DB "MS-BASIC(RFS80))", 0DH, 0DH ; Title/Name (17 bytes). + DW CODEEND - CODESTART ; Size of program. + DW CODESTART ; Load address of program. + DW CODESTART ; Exec address of program. + ENDIF ENDIF HEADER3: IF BUILD_RFSTZ = 1 - DB "MS-BASIC(RFS-TZ)", 0DH ; Title/Name (17 bytes). - DW (CODEEND - CODESTART) + (RELOCEND - RELOC) + (RELOCRFS2END - RELOCRFS2) ; Size of program. - DW 01200H ; Load address of program. - DW RELOCRFS ; Exec address of program. + DB "MS-BASIC(RFS-TZ)", 0DH ; Title/Name (17 bytes). + DW (CODEEND - CODESTART) + (RELOCEND - RELOC) + (RELOCRFS2END - RELOCRFS2) ; Size of program. + DW 01200H ; Load address of program. + DW RELOCRFS ; Exec address of program. ENDIF HEADER4: IF BUILD_TZFS = 1 - DB "MS-BASIC(TZFS)", 0DH, 0DH, 0DH ; Title/Name (17 bytes). - DW (CODEEND - CODESTART) + (RELOCEND - RELOC) ; Size of program. - DW 01200H ; Load address of program. - DW RELOC ; Exec address of program. + DB "MS-BASIC(TZFS)", 0DH, 0DH, 0DH ; Title/Name (17 bytes). + DW (CODEEND - CODESTART) + (RELOCEND - RELOC) ; Size of program. + DW 01200H ; Load address of program. + DW RELOC ; Exec address of program. ENDIF DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h ; Comment (104 bytes). @@ -186,8 +193,6 @@ INIT80CHAR: IF BUILD_RFS = 1 LD A, ROMBANK0 ; Switch to 40char monitor SA-1510. LD (ROMBK1),A LD (BNKSELMROM),A - LD A, 40 ; Set BASIC to 40 column width. - LD (INITABW),A XOR A ; As we call RFS for SD services, specifically DIR listing, we have to ensure RFS is configured for 40 column output mode. LD (SCRNMODE), A LD A, 0FFH @@ -202,8 +207,6 @@ INIT80END: LD A,000H ; Clear the screen buffer. LD HL,ARAM CALL CLR8 ; - LD A,COLW - LD (LWIDTH),A ; Setup the initial terminal width. CALL MLDSP CALL BEL ; Beep to indicate startup - for cases where screen is slow to startup. LD A,0FFH @@ -509,40 +512,40 @@ WORDTB: DW PEND ; Optional commands to be builtin when a tranZPUter board is present. OPTIONS0A: IF BUILD_TZFS = 1 - DW CLOADTZ ; Load tokenised BASIC program. - DW CSAVETZ ; Save tokenised BASIC program. - DW LOAD ; Load ASCII text BASIC program. - DW SAVE ; Save BASIC as ASCII text. - DW SETFREQ ; Set the CPU Frequency. - DW DIRSDCARD ; List out the SD directory. - DW SETDIR ; Change directory for all load and save operations. + DW CLOADTZ ; Load tokenised BASIC program. + DW CSAVETZ ; Save tokenised BASIC program. + DW LOAD ; Load ASCII text BASIC program. + DW SAVE ; Save BASIC as ASCII text. + DW SETFREQ ; Set the CPU Frequency. + DW DIRSDCARD ; List out the SD directory. + DW SETDIR ; Change directory for all load and save operations. ENDIF OPTIONS1A: IF BUILD_RFSTZ = 1 - DW CLOAD80A ; Load tokenised BASIC program from tape. - DW CSAVE80A ; Save tokenised BASIC program to tape. - DW REM - DW REM - DW REM - DW REM - DW REM + DW CLOAD80A ; Load tokenised BASIC program from tape. + DW CSAVE80A ; Save tokenised BASIC program to tape. + DW REM + DW REM + DW REM + DW REM + DW REM ENDIF OPTIONS2A: IF BUILD_RFS = 1 - DW CLOAD80A ; Load tokenised BASIC program from tape. - DW CSAVE80A ; Save tokenised BASIC program to tape. - DW SDDIRCMD ; Directory listing of the SD card. - DW REM - DW REM - DW REM - DW REM + DW CLOAD80A ; Load tokenised BASIC program from tape. + DW CSAVE80A ; Save tokenised BASIC program to tape. + DW SDDIRCMD ; Directory listing of the SD card. + DW REM + DW REM + DW REM + DW REM ENDIF OPTIONS3A: IF BUILD_MZ80A = 1 - DW CLOAD80A ; Load tokenised BASIC program from tape. - DW CSAVE80A ; Save tokenised BASIC program to tape. - DW REM - DW REM - DW REM - DW REM - DW REM + DW CLOAD80A ; Load tokenised BASIC program from tape. + DW CSAVE80A ; Save tokenised BASIC program to tape. + DW REM + DW REM + DW REM + DW REM + DW REM ENDIF DW NEW @@ -691,7 +694,7 @@ INITAB: JP WARMST ; Warm start jump RET DB 1 ; POS (x) number (1) -INITABW: DB COLW ; Terminal width +INITABW: DB 0FFH ; Terminal width set to initial state of 255 which means unlimited width. Applicable to data output not physical screen. IF BUILD_80C = 1 DB 28 ; Width for commas (3 columns) ELSE @@ -1189,9 +1192,11 @@ PUTCTL: LD A,B ; Get number of bytes in buffer OUTIT: CALL OUTC ; Output the character entered JP MORINP ; Get another character -OUTNBS: CALL OUTC ; Output bell and back over it - LD A,BACKS ; Set back space - JP OUTIT ; Output it and get more +OUTNBS: CALL PRNT ; Strange, get to end of line ring bell then back space???? Disabled, just ring bell. This area of code needs a new handler. + JP MORINP ; Get another character + ;CALL OUTC ; Output bell and back over it + ;LD A,BACKS ; Set back space + ;JP OUTIT ; Output it and get more CPDEHL: LD A,H ; Get H SUB D ; Compare with D @@ -1821,10 +1826,10 @@ STTLIN: LD A,(CURPOS) ; Make sure on new line ENDINP: LD (HL),0 ; Mark end of buffer LD HL,BUFFER-1 ; Point to buffer -PRNTCRLF: LD A,CR ; Load a CR - CALL OUTC ; Output character - LD A,LF ; Load a LF +PRNTCRLF: LD A,CR ; Load a CR CALL OUTC ; Output character + ;LD A,LF ; Load a LF + ;CALL OUTC ; Output character DONULL: XOR A ; Set to position 0 LD (CURPOS),A ; Store it LD A,(NULLS) ; Get number of nulls @@ -4690,7 +4695,7 @@ LDBUF: LD A,(TZSVC_FILE_SEC) ; Update the virtual file sector number JP NZ, SDRDER ; Same thing, if K64F read from file returns an error, read error (SD removed or disk error!)! RET - ; Method to load a NASIC program which is stored as TEXT into memory. This is accomplied sector by sector, line by line, + ; Method to load a BASIC program which is stored as TEXT into memory. This is accomplied sector by sector, line by line, ; each line needs to be read, tokenised and stored. ; LDTXT: CALL LDOPEN ; Open file, read the first sector of data. @@ -5088,8 +5093,8 @@ PRTDIR: PUSH BC PUSH DE PUSH HL ; - LD A,(LWIDTH) ; At the moment only cater for 40/80 columns. - CP COLW + LD A,COLW ; At the moment only cater for 40/80 columns. + CP 80 LD H,47 JR NZ,PRTDIR0 LD H,93 @@ -5116,9 +5121,9 @@ PRTNOWAIT: LD A,E CP 20 LD A,20 JR C, PRTDIR2 - LD A,(LWIDTH) ; 40 Char mode? 2 columns of filenames displayed so NL. - CP 0 - JR Z,PRTDIR1 + LD A,COLW ; 40 Char mode? 2 columns of filenames displayed so NL. + CP 80 + JR NZ,PRTDIR1 LD A,L ; 80 Char mode we print 4 columns of filenames. CP 40 LD A,40 @@ -5377,8 +5382,7 @@ PRTMSGE: POP BC ; Method to load a cassette image (tokenised basic script). ; -CLOAD80A: CALL CURSOROFF - LD A,CTAPELOAD ; Set the type of operatiom into the flag var. +CLOAD80A: LD A,CTAPELOAD ; Set the type of operatiom into the flag var. LD (TPFLAG),A LD A,(HL) ; Get byte after "CLOAD" ; CP ZTIMES ; "*" token? ("CLOAD*") @@ -5464,13 +5468,11 @@ CLOAD80A_2: CALL CLRPTR ; Initialise memory to NEW state ready CMTVERF: CMTLOADE: LD HL,OKMSG ; "Ok" message CALL PRS ; Output string - CALL CURSORON JP SETPTR ; Set up line pointers ; Method to save a cassette image (tokenised basic script). ; -CSAVE80A: CALL CURSOROFF - LD A,CTAPESAVE ; Set the type of operatiom into the flag var. +CSAVE80A: LD A,CTAPESAVE ; Set the type of operatiom into the flag var. LD (TPFLAG),A ; LD B,1 ; Flag "CSAVE" @@ -5524,7 +5526,6 @@ CSAVE80A_1: LD A,(DE) ; Copy filename into service record. JR C,CMTSVER LD HL,CMTMSGOK ; 'OK!' CALL PRS - CALL CURSORON POP DE POP HL RET @@ -5538,7 +5539,6 @@ OPTIONS3B: IF BUILD_MZ80A = 1 ;-------------------------------------- CMTNONAM: LD HL,CMTBADFN ; Must give a name for SD card load and save. CMTERR: CALL PRS - CALL CURSORON POP AF ; Waste return address. JP ERRIN CMTFNTG: LD HL,CMTFNTOOG @@ -6716,15 +6716,19 @@ MODE: LD HL,KEYPF RET ; Method to check if a key has been pressed and stored in buffer.. -CHKKY: LD A, (KEYCOUNT) +CHKKY: CALL CURSORON + LD A, (KEYCOUNT) OR A JR Z,CHKKY2 LD A,0FFH - RET + JR CHKKY3 CHKKY2: XOR A +CHKKY3: CALL CURSOROFF + OR A RET -GETKY: PUSH HL +GETKY: CALL CURSORON + PUSH HL LD A,(KEYCOUNT) OR A JR Z,GETKY2 @@ -6773,6 +6777,7 @@ PRCKY8: PRCKYX: PRCKYE: POP HL + CALL CURSOROFF RET ;------------------------------------------------------------------------------- @@ -6876,6 +6881,7 @@ NL: LD A,(DPRNT) LTNL: LD A,0CDH JR PRNT5 + PRTT: CALL PRTS LD A,(DPRNT) OR A @@ -6899,9 +6905,9 @@ NEWLINE: CALL NL ; CURSOROFF: PUSH HL DI - CALL CURSRSTR ; Restore character under the cursor. LD HL,FLASHCTL ; Indicate cursor is now off. RES 7,(HL) + CALL CURSRSTR ; Restore character under the cursor. EI POP HL RET @@ -6965,7 +6971,9 @@ PRTS: LD A,020H ; Function to print a character to the screen. If the character is a control code it is processed as necessary ; otherwise the character is converted from ASCII display and displayed. ; -PRNT: DI +PRNT: CALL CURSOROFF ; Disable the cursor before printing. + DI + ; LD (SPISRSAVE),SP ; Share the interrupt stack for banked access as the BASIC stack goes out of scope. LD SP,ISRSTACK ; Interrupts are disabled so we can safely use this stack. ; @@ -6976,13 +6984,12 @@ MEMSW4: IF BUILD_TZFS+BUILD_RFSTZ > 0 POP AF ENDIF ; - CALL CURSRSTR ; Restore char under cursor. CP 00DH JR Z,NEWLINE CP 00AH JR Z,NEWLINE CP 07FH - JR Z,DELETECHR + JP Z,DELETECHR CP BACKS JP Z,DELETECHR PUSH BC @@ -7009,7 +7016,7 @@ PRNTSTR: LD A,(DE) JR Z,PRNTSTR6 INC DE ; - CALL CURSRSTR ; Restore char under cursor. + CALL CURSOROFF ; Turn cursor off for any printing. CP 00DH JR NZ,PRNTSTR2 PRNTSTR1: LD A,(DPRNT) @@ -8201,7 +8208,7 @@ ANSI_NN: CP "?" ; Simpl CP "@" ; Is it a letter? JP C,ANSIEXIT ; Abandon if not letter; something wrong -ANSIFOUND: CALL CURSRSTR ; Restore any character under the cursor. +ANSIFOUND: CALL CURSOROFF ; Turn cursor off and restore any character under the cursor. LD HL,(NUMBERPOS) ; Get value of number buffer LD A,(HAVELOADED) ; Did we put anything in this byte? OR A @@ -8211,11 +8218,6 @@ AF1: INC HL LD A,254 LD (HL),A ; Mark end of sequence (for unlimited length sequences) - ;Disable cursor as unwanted side effects such as screen flicker may occur. - LD A,(FLASHCTL) - BIT 7,A - CALL NZ,CURSOROFF - XOR A LD (CURSORCOUNT),A ; Restart count LD A,0C9h @@ -8249,7 +8251,7 @@ AF1: INC HL CP "u" JP Z,RCP ; Restore the cursor position -ANSIEXIT: CALL CURSORON ; If t +ANSIEXIT: ;CALL CURSORON ; If t LD HL,NUMBERBUF ; Numbers buffer position LD (NUMBERPOS),HL XOR A diff --git a/software/asm/include/MSBASIC_BuildVersion.asm b/software/asm/include/MSBASIC_BuildVersion.asm index 05053fe..cdc5619 100644 --- a/software/asm/include/MSBASIC_BuildVersion.asm +++ b/software/asm/include/MSBASIC_BuildVersion.asm @@ -1 +1 @@ -BUILD_VERSION EQU 1 +BUILD_VERSION EQU 2 diff --git a/software/asm/include/MSBASIC_Definitions.asm b/software/asm/include/MSBASIC_Definitions.asm index 26ae7ef..f59ddcf 100644 --- a/software/asm/include/MSBASIC_Definitions.asm +++ b/software/asm/include/MSBASIC_Definitions.asm @@ -62,13 +62,21 @@ INCLUDE_ANSITERM EQU 1 ; Inclu ENDIF IF BUILD_VERSION = 2 BUILD_MZ80A EQU 0 +BUILD_RFS EQU 1 +BUILD_RFSTZ EQU 0 +BUILD_TZFS EQU 0 +BUILD_80C EQU 0 +INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. + ENDIF + IF BUILD_VERSION = 3 +BUILD_MZ80A EQU 0 BUILD_RFS EQU 0 BUILD_RFSTZ EQU 1 BUILD_TZFS EQU 0 BUILD_80C EQU 1 INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. ENDIF - IF BUILD_VERSION = 3 + IF BUILD_VERSION = 4 BUILD_MZ80A EQU 0 BUILD_RFS EQU 0 BUILD_RFSTZ EQU 0 @@ -95,7 +103,7 @@ MAXMEM EQU 0CFFFH ; Top o MAXMEM EQU 0CFFFH - TZSVCSECSIZE ; Top of RAM on a standard RFS equipped Sharp MZ80A. Top 512 bytes used by RFS SD sector buffer. ENDIF IF BUILD_TZFS+BUILD_RFSTZ > 0 -MAXMEM EQU 10000H - TZSVCSIZE ; Top of RAM on the tranZPUter/ +MAXMEM EQU 10000H - TZSVCSIZE ; Top of RAM on the tranZPUter ENDIF ; Tape load/save modes. Used as a flag to enable common code. diff --git a/software/roms/USER_ROM_256.bin b/software/roms/USER_ROM_256.bin index 1cf625b877fa96bafd3f74f18b00e2590bae53fe..80ceed3ddab7d986ef32a23d565f4e68b4cbf8cb 100644 GIT binary patch delta 16609 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 ${INCDIR}/MSBASIC_BuildVersion.asm - elif [[ ${SRCNAME} = "MSBASIC_RFS" ]]; then + elif [[ ${SRCNAME} = "MSBASIC_RFS40" ]]; then ASMNAME="MSBASIC.asm" echo "BUILD_VERSION EQU 1" > ${INCDIR}/MSBASIC_BuildVersion.asm - elif [[ ${SRCNAME} = "MSBASIC_RFSTZ" ]]; then + elif [[ ${SRCNAME} = "MSBASIC_RFS80" ]]; then ASMNAME="MSBASIC.asm" echo "BUILD_VERSION EQU 2" > ${INCDIR}/MSBASIC_BuildVersion.asm - elif [[ ${SRCNAME} = "MSBASIC_TZFS" ]]; then + elif [[ ${SRCNAME} = "MSBASIC_RFSTZ" ]]; then ASMNAME="MSBASIC.asm" echo "BUILD_VERSION EQU 3" > ${INCDIR}/MSBASIC_BuildVersion.asm + elif [[ ${SRCNAME} = "MSBASIC_TZFS" ]]; then + ASMNAME="MSBASIC.asm" + echo "BUILD_VERSION EQU 4" > ${INCDIR}/MSBASIC_BuildVersion.asm fi # Assemble the source.