From 1296ce9fb71994be98c1a8137db2a02179ce60ce Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Mon, 19 Apr 2021 00:39:18 +0100 Subject: [PATCH] Updates and 40/80 compilation modes --- software/asm/MSBASIC.asm | 176 ++++++++++++------- software/asm/cbios.asm | 53 ++---- software/asm/cbios_bank1.asm | 10 +- software/asm/include/CPM_Definitions.asm | 14 +- software/asm/include/MSBASIC_Definitions.asm | 34 ++-- software/asm/rfs.asm | 12 +- software/asm/rfs_bank6.asm | 4 +- software/build.sh | 2 +- software/roms/MROM_256.bin | Bin 522752 -> 514304 bytes software/roms/USER_ROM_256.bin | Bin 510464 -> 510464 bytes software/roms/cbios.rom | Bin 4096 -> 4096 bytes software/roms/cbios_bank1.rom | Bin 2048 -> 2048 bytes software/roms/rfs.rom | Bin 16384 -> 16384 bytes software/tools/assemble_roms.sh | 1 + 14 files changed, 175 insertions(+), 131 deletions(-) diff --git a/software/asm/MSBASIC.asm b/software/asm/MSBASIC.asm index 30774b2..d1e5fca 100644 --- a/software/asm/MSBASIC.asm +++ b/software/asm/MSBASIC.asm @@ -159,14 +159,16 @@ INIT3: ; Setup keyboard buffer control. LD A,080H ; Cursor on (Bit D7=1). LD (FLASHCTL),A - IF BUILD_RFS+BUILD_RFSTZ+BUILD_TZFS > 0 +INIT80CVC: IF BUILD_RFSTZ+BUILD_TZFS > 0 ; Change to 80 character mode. LD HL,DSPCTL ; Setup address of display control register latch. LD A, 128 ; 80 char mode. LD E,(HL) ; Dummy operation to enable latch write via multivibrator. LD (HL), A ENDIF - IF BUILD_RFS = 1 +INIT80CHAR: IF BUILD_RFS = 1 + + IF BUILD_80C = 1 LD A, ROMBANK1 ; Switch to 80char monitor SA-1510. LD (ROMBK1),A LD (BNKSELMROM),A @@ -174,7 +176,34 @@ INIT3: ; Setup keyboard buffer control. LD (SCRNMODE), A LD A, 0FFH LD (SPAGE), A + + ; Change to 80 character mode. + LD HL,DSPCTL ; Setup address of display control register latch. + LD A, 128 ; 80 char mode. + LD E,(HL) ; Dummy operation to enable latch write via multivibrator. + LD (HL), A + ELSE + 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 + LD (SPAGE), A + ENDIF ENDIF + ; +INIT80END: LD A,000H ; Clear the screen buffer. + LD HL,SCRN + CALL CLR8 + LD A,071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode. + 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 @@ -195,17 +224,17 @@ INITANSI: IF INCLUDE_ANSITERM = 1 ; If the ansi terminal emulator is buil LD (KEYPF),A ; MEMSW1: IF BUILD_TZFS+BUILD_RFSTZ > 0 - LD A,TZMM_MZ700_2 ; Enable the full 64K memory range before starting BASIC initialisation. - OUT (MMCFG),A + LD A,TZMM_MZ700_2 ; Enable the full 64K memory range before starting BASIC initialisation. + OUT (MMCFG),A ENDIF ; Clear memory LD HL,WRKSPC MEMSZ1: IF BUILD_MZ80A+BUILD_RFS > 0 - LD BC,MAXMEM - WRKSPC ; Clear to top of physical RAM. + LD BC,MAXMEM - WRKSPC ; Clear to top of physical RAM. ENDIF MEMSZ2: IF BUILD_TZFS+BUILD_RFSTZ > 0 - LD BC,10000H - WRKSPC ; Clear to top of physical RAM. + LD BC,10000H - WRKSPC ; Clear to top of physical RAM. ENDIF LD E,00H INIT4: LD (HL),E @@ -663,7 +692,11 @@ INITAB: JP WARMST ; Warm start jump DB 1 ; POS (x) number (1) INITABW: DB COLW ; Terminal width - DB 28 ; Width for commas (3 columns) + IF BUILD_80C = 1 + DB 28 ; Width for commas (3 columns) + ELSE + DB 14 ; Width for commas (3 columns) + ENDIF DB 0 ; No nulls after input bytes DB 0 ; Output enabled (^O off) @@ -1103,7 +1136,7 @@ TTYLIN: LD HL,BUFFER ; Get a line by character MORINP: CALL CLOTST ; Get character and test ^O LD C,A ; Save character in C CP DELETE ; Delete character? - JP Z,DELCHR ;DODEL ; Yes - Process it + JP Z,DELCHR ;DODEL ; Yes - Process it LD A,(NULFLG) ; Get null flag OR A ; Test null flag status JP Z,PROCES ; Reset - Process character @@ -6176,7 +6209,7 @@ KTBLC: ; CTRL ON ;------------------------------------------------------------------------------- ; SERVICE COMMAND METHODS ;------------------------------------------------------------------------------- - IF BUILD_TZFS = 1 +SVC_CMD: IF BUILD_TZFS = 1 ; Method to send a command to the I/O processor and verify it is being acted upon. ; THe method, after sending the command, polls the service structure result to see if the I/O processor has updated it. If it doesnt update the result @@ -6189,7 +6222,7 @@ KTBLC: ; CTRL ON ; A = 0 - Success, command being processed. ; A = 1 - Failure, no contact with I/O processor. ; A = 2 - Failure, no result from I/O processor, it could have crashed or SD card removed! -SVC_CMD: PUSH BC + PUSH BC LD (TZSVCCMD), A ; Load up the command into the service record. LD A,TZSVC_STATUS_REQUEST LD (TZSVCRESULT),A ; Set the service structure result to REQUEST, if this changes then the K64 is processing. @@ -6856,10 +6889,10 @@ L098C: SUB 00AH ; Delete a character on screen. DELETECHR: LD A,0C7H CALL DPCT - JR PRNT1 + JP PRNT1 NEWLINE: CALL NL - JR PRNT1 + JP PRNT1 ; ; Function to disable the cursor display. @@ -6951,7 +6984,7 @@ MEMSW4: IF BUILD_TZFS+BUILD_RFSTZ > 0 CP 07FH JR Z,DELETECHR CP BACKS - JR Z,DELETECHR + JP Z,DELETECHR PUSH BC LD C,A LD B,A @@ -7157,9 +7190,15 @@ CLRS: LD HL,MANG LD B,01BH CALL CLER LD HL,SCRN - PUSH HL + ;PUSH HL CALL CLR8Z - POP HL + ;POP HL + IF BUILD_80C = 0 + LD A,071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. + ELSE + LD A,071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode. + ENDIF + CALL CLR8 ; D800H-DFFFH CLEAR CLRS1: LD A,(SCLDSP) HOM0: LD HL,00000H JP CURS3 @@ -7669,7 +7708,7 @@ WTAP3: POP HL LD BC,00080H LD HL,IBUFE RD1: DI -MEMSWRT0: IF BUILD_TZFS+BUILD_RFS > 0 +MEMSWRT0: IF BUILD_TZFS+BUILD_RFSTZ > 0 LD (SPISRSAVE),SP ; Share the interrupt stack whilst accessing hardware as the BASIC stack goes out of scope. LD SP,ISRSTACK ; Interrupts are disabled so we can safely use this stack. LD A,TZMM_MZ700_0 ; We meed to be in memory mode 10 to access the tape hardware. @@ -8778,7 +8817,7 @@ REBOOT80A: IF BUILD_MZ80A = 1 ENDIF ; For RFS we need to switch back to the 40 char monitor. -REBOOTRFS: IF BUILD_RFS = 1 +REBOOTRFS: IF BUILD_RFS+BUILD_80C = 2 LD A, ROMBANK0 ; Switch to 40Char monitor. LD (ROMBK1),A LD (BNKSELMROM),A @@ -8795,22 +8834,22 @@ REBOOTRFS: IF BUILD_RFS = 1 BFREE: DB " Bytes free",CR,LF,0,0 SIGNON: IF BUILD_TZFS = 1 - DB "MZ-80A BASIC (TZFS) Ver 4.7b",CR,LF + DB "Microsoft Basic (TZFS) Ver 4.7b",CR,LF DB "Copyright ",40,"C",41 DB " 1978 by Microsoft",CR,LF,0,0 ENDIF IF BUILD_RFSTZ = 1 - DB "MZ-80A BASIC (RFS TZ) Ver 4.7b",CR,LF + DB "Microsoft Basic (RFS TZ) Ver 4.7b",CR,LF DB "Copyright ",40,"C",41 DB " 1978 by Microsoft",CR,LF,0,0 ENDIF IF BUILD_RFS = 1 - DB "MZ-80A BASIC (RFS) Ver 4.7b",CR,LF + DB "Microsoft Basic (RFS) Ver 4.7b",CR,LF DB "Copyright ",40,"C",41 DB " 1978 by Microsoft",CR,LF,0,0 ENDIF IF BUILD_MZ80A = 1 - DB "MZ-80A BASIC Ver 4.7b",CR,LF + DB "Microsoft Basic (MZ-80A) Ver 4.7b",CR,LF DB "Copyright ",40,"C",41 DB " 1978 by Microsoft",CR,LF,0,0 ENDIF @@ -9012,21 +9051,22 @@ CODEEND: ; For TZFS builds the image needs to be relocated from 0x1200 to 0x0000 on startup after switching the memory mode. RELOCSTART: IF BUILD_TZFS+BUILD_RFSTZ > 0 - ORG $ + 1200H + ORG $ + 1200H - ; Switch memory. -RELOC: LD A, TZMM_MZ700_0 ; Switch to the MZ700 memory map where the lower 4K 0000:0FFF is in block 6, we therefore preserve the Monitor for exit. - OUT (MMCFG),A + ; Switch memory. +RELOC: LD A, TZMM_MZ700_0 ; Switch to the MZ700 memory map where the lower 4K 0000:0FFF is in block 6, we therefore preserve the Monitor for exit. + OUT (MMCFG),A - ; Move the image down and start. - LD DE, 0000H - LD HL, 01200H - LD BC, CODEEND - CODESTART - LDIR - JP 0000H + ; Move the image down and start. + LD DE, 0000H + LD HL, 01200H + LD BC, CODEEND - CODESTART + LDIR + JP 0000H + ENDIF ; For RFS builds a two stage relocation is needed, a) relocate to tranzputer RAM, b) run the TZFS relocation code. -RELOC_RFS: IF BUILD_RFS = 1 +RELOC_RFS: IF BUILD_RFSTZ = 1 ; Switch memory. RELOCRFS: LD A, TZMM_BOOT ; Go to boot mode, copy the relocation code to EC80H and execute. @@ -9038,44 +9078,44 @@ RELOCRFS: LD A, TZMM_BOOT ; Go to LD BC, RELOCRFS2END - RELOCRFS2 LDIR JP 0EC80H ; Run the relocation code. - - ENDIF + ENDIF RELOCEND: -RELOCRFS2: ; Move the image down into tranZPUter memory and then start the real relocation. - LD HL, 01200H - LD BC, (CODEEND - CODESTART) + (RELOCEND - RELOC) ; Size of program. +RELOCRFS2: IF BUILD_TZFS+BUILD_RFSTZ > 0 + ; Move the image down into tranZPUter memory and then start the real relocation. + LD HL, 01200H + LD BC, (CODEEND - CODESTART) + (RELOCEND - RELOC) ; Size of program. - ; Fetch a byte from main DRAM and write it into Bank 0 same location. -RELOCRFS2_1:LD A,TZMM_BOOT - OUT (MMCFG),A - LD A,(HL) - ; - EX AF,AF' - LD A,TZMM_TZFS - OUT (MMCFG),A - EX AF,AF' - ; - LD (HL),A - INC HL - DEC BC - LD A,B - OR C - JR NZ, RELOCRFS2_1 - ; - LD DE, 00000H ; Copy the reboot handler into Bank 0 at 00000H. - LD HL, 0EC80H + (REBOOTRFS - RELOCRFS2) - LD BC, RELOCRFS2END - REBOOTRFS - LDIR - ; - JP RELOC ; Jump into the original TZFS relocation code. + ; Fetch a byte from main DRAM and write it into Bank 0 same location. +RELOCRFS2_1: LD A,TZMM_BOOT + OUT (MMCFG),A + LD A,(HL) + ; + EX AF,AF' + LD A,TZMM_TZFS + OUT (MMCFG),A + EX AF,AF' + ; + LD (HL),A + INC HL + DEC BC + LD A,B + OR C + JR NZ, RELOCRFS2_1 + ; + LD DE, 00000H ; Copy the reboot handler into Bank 0 at 00000H. + LD HL, 0EC80H + (REBOOTTZRFS - RELOCRFS2) + LD BC, RELOCRFS2END - REBOOTTZRFS + LDIR + ; + JP RELOC ; Jump into the original TZFS relocation code. - ; Reboot handler for RFS mode. This code is transferred into RAM bank 0 at 0000H as this is not used for BASIC - ; and executed when a return to the Monitor ROM is needed. Location 004AH in the Monitor ROM is the startup vector. -REBOOTRFS: ALIGN_NOPS $ + 04AH - 4 -REBOOTRFS1: LD A,TZMM_ORIG - OUT (MMCFG),A - JP 00000H + ; Reboot handler for TZ/RFS mode. This code is transferred into RAM bank 0 at 0000H as this is not used for BASIC + ; and executed when a return to the Monitor ROM is needed. Location 004AH in the Monitor ROM is the startup vector. +REBOOTTZRFS: ALIGN_NOPS $ + 04AH - 4 +REBOOTTZRFS1: LD A,TZMM_ORIG + OUT (MMCFG),A + JP 00000H RELOCRFS2END:ENDIF @@ -9130,7 +9170,7 @@ TMCNT: DS virtual 2 ; TAPE SUMDT: DS virtual 2 ; CHECK SUM DATA CSMDT: DS virtual 2 ; FOR COMPARE SUM DATA AMPM: DS virtual 1 ; AMPM DATA -TIMFG: DS virtual 1 ; TIME FLAG +TIMFG: DS virtual 1 ; TIME FLAG SWRK: DS virtual 1 ; KEY SOUND FLAG TEMPW: DS virtual 1 ; TEMPO WORK ONTYO: DS virtual 1 ; ONTYO WORK @@ -9141,7 +9181,7 @@ RATIO: DS virtual 2 ; ONPU IF BUILD_MZ80A+BUILD_RFS > 0 ORG MONVARSTRT ENDIF - + DSPXYADDR: DS virtual 2 ; Address of last known position. FLASHCTL: DS virtual 1 ; CURSOR FLASH CONTROL. BIT 0 = Cursor On/Off, BIT 1 = Cursor displayed. diff --git a/software/asm/cbios.asm b/software/asm/cbios.asm index b07deb8..231bc3b 100644 --- a/software/asm/cbios.asm +++ b/software/asm/cbios.asm @@ -399,7 +399,7 @@ STRT4: CALL ?DSKINIT ; Initi ; STRT5: LD DE,CBIOSIGNEND ; Terminate the signon message which now includes list of drives detected. CALL MONPRTSTR - CALL ?NL + ;CALL ?NL ; ; Allocate DPB according to drives detected in priorty, SD,FDC ; @@ -917,50 +917,30 @@ ALLOC2: LD (RSFLAG), A ; rsfla ; During normal operations the control registers are enabled. When access is needed to the full User ROM space, ie for drive read/write then the registers are disabled after ; setting the correct bank. The upper bits of the User ROM address space (ie. bits 20:19 which select the device) are set to by the ROMCTL variable. ; -;SELUSRBNK: DI -; EXX -; EX AF,AF' -; LD A,(ROMCTL) ; Get current setting for the coded latch, ie. number of reads needed to enable it. -; LD C,A -; RRA -; RRA -; CPL -; AND 00FH ; Preserve bits 3-1, bit 0 is always 0 on the 74HCT191 latch. -; LD B,A ; Set value to B for loop. -; LD A,(BNKCTRLDIS) ; Do a reset for the case where the above read enabled the latch, possible if external programs are reading/writing the latch area. -; LD A,(BNKCTRL) ; Sample latch at start to detect change. -; LD E,A -;SELUSRBNK1: LD A,(BNKCTRL) ; Read the latch and compare with sample. Either we reach the count limit or the read differs indicating latch control. -; CP E -; JR NZ,SELUSRBNK2 -; DJNZ SELUSRBNK1 -;SELUSRBNK2: LD A,C -; LD (BNKCTRL),A -; EX AF,AF' -; LD (BNKSELUSER),A ; Select the required bank. -; EXX -; JR C,SELUSRBNK3 ; If Carry is set by caller then leave the control registers active. -; LD (BNKCTRLDIS),A ; Disable the control registers, value of A is not important. -;SELUSRBNK3: EI -; RET -SELUSRBNK: PUSH BC +SELUSRBNK: DI + PUSH BC PUSH AF ; Reset to a known state to allow for spurious read/writes to control area clocking the up counter. - LD B,15 + LD B,16 SELUSRBNK0: LD A,(BNKCTRLDIS) DJNZ SELUSRBNK0 ; Now loop for the correct up counter required to enable the latches. LD B,15 ; Set value to B for loop. -SELUSRBNK1: LD A,(BNKCTRL) ; Read the latch and compare with sample. Either we reach the count limit or the read differs indicating latch control. + LD A,(BNKCTRL) + LD C,A +SELUSRBNK1: CP C + JR NZ,SELUSRBNK2 + LD A,(BNKCTRL) ; Read the latch and compare with sample. Either we reach the count limit or the read differs indicating latch control. DJNZ SELUSRBNK1 - POP AF +SELUSRBNK2: POP AF POP BC LD (BNKSELUSER),A ; Select the required bank. LD A,(ROMCTL) LD (BNKCTRL),A - JR C,SELUSRBNK2 + JR C,SELUSRBNK3 LD (BNKCTRLDIS),A ; Disable the control registers, value of A is not important. -SELUSRBNK2: RET +SELUSRBNK3: EI + RET ; Helper method to set up a Disk Parameter Block. @@ -1590,7 +1570,8 @@ UROMLOAD: PUSH BC LD C,0 ADD HL,BC LD BC, MZFHDRNCSZ -LROMLOAD0: LD A,(HL) ; Issues with LDIR and a signal artifact from the mainboard, so manual copy. +LROMLOAD0: LD A,(BNKCTRLDIS) + LD A,(HL) ; Issues with LDIR and a signal artifact from the mainboard, so manual copy. INC HL LD (DE),A INC DE @@ -1653,7 +1634,7 @@ LROMLOAD4: LD (TMPSIZE), HL ; HL co OR C JR Z, LROMLOAD8 -LROMLOAD9: LD (BNKCTRLDIS),A ; There exists an issue with using the mainboard decoder signal which I havent quite understood, random activation of the upcounter occurs which appears to be the refresh circuit. +LROMLOAD9: LD (BNKCTRLDIS),A ; There exists an issue with using the mainboard decoder signal which I havent quite understood, random activation of the upcounter occurs which appears to be the refresh circuit. LD A,(HL) ; Issues with LDIR and a signal artifact from the mainboard, so manual copy. INC HL LD (DE),A @@ -2469,7 +2450,7 @@ KTBLC: ; CTRL ON CBIOSSIGNON:IF BUILD_80C = 1 DB "** CBIOS v1.25, (C) P.D. Smart, 2019-21. Drives:", NUL ELSE - DB "*CBIOS v1.25, (C) P.D. Smart, 2019-21.*", CR + DB "CBIOS v1.25, (C) P.D. Smart, 2019-21. " DB "Drives:", NUL ENDIF CBIOSIGNEND:IF BUILD_80C = 1 diff --git a/software/asm/cbios_bank1.asm b/software/asm/cbios_bank1.asm index 21bd6f1..c730c56 100644 --- a/software/asm/cbios_bank1.asm +++ b/software/asm/cbios_bank1.asm @@ -51,7 +51,7 @@ LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. CBIOS1_0: LD A,(BNKCTRLRST) DJNZ CBIOS1_0 ; Apply the default number of coded latch reads to enable the bank control registers. - LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. +CBIOS1_1: LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. LD (BNKCTRL),A NOP NOP @@ -87,7 +87,7 @@ CBIOS1_0: LD A,(BNKCTRLRST) ; Method to reboot the machine into startup mode, ie. Monitor at MROM Bank 0, UROM at Bank 0. ?REBOOT: LD A,(MEMSWR) ; Switch memory to power up state, ie. Monitor ROM at 00000H - JP UROMADDR ; Now run the code at the bank start which switches to bank 0, intitialises and then calls 00000H + JP CBIOS1_1 ; Now run the code at the bank start which switches to bank 0, intitialises and then calls 00000H ;------------------------------------------------------------------------------- ; START OF AUDIO CONTROLLER FUNCTIONALITY @@ -437,8 +437,10 @@ GETKY2: LD A,(KEYCOUNT) ; No ke JR ?PRCKYX ?PRCKY7: CP BREAKKEY ; Break key processing. JR NZ,?PRCKY8 - -?PRCKY8: + JR ?PRCKYE +?PRCKY8: CP DELETE + JR NZ,?PRCKYX + LD A,BACKS ; Map DELETE to BACKSPACE, BACKSPACE is Rubout, DELETE is echo in CPM. ?PRCKYX: ?PRCKYE: POP HL diff --git a/software/asm/include/CPM_Definitions.asm b/software/asm/include/CPM_Definitions.asm index ba95d6e..07b92ab 100644 --- a/software/asm/include/CPM_Definitions.asm +++ b/software/asm/include/CPM_Definitions.asm @@ -39,9 +39,6 @@ HW_SPI_ENA EQU 1 ; Set t SW_SPI_ENA EQU 0 ; Set to 1 if software SPI is present on the RFS PCB v2 board. PP_SPI_ENA EQU 0 ; Set to 1 if using the SPI interface via the Parallel Port, ie. for RFS PCB v1 which doesnt have SPI onboard. -;----------------------------------------------- -; Configurable settings. -;----------------------------------------------- ; Build time options, only set to '1' to build, '0' to disable, only 1 can be set to '1'. ; IF BUILD_VERSION = 0 BUILD_80C EQU 1 ; Build for an MZ-80A with a 40/80 column card. @@ -52,6 +49,9 @@ BUILD_40C EQU 0 ; Build ;BUILD_40C EQU 1 ; Build for a standard 40 column MZ-80A. ; ENDIF +;----------------------------------------------- +; Configurable settings. +;----------------------------------------------- MAXRDRETRY EQU 002h MAXWRRETRY EQU 002h BLKSIZ EQU 4096 ; CP/M allocation size @@ -65,11 +65,11 @@ WRDIR EQU 1 ; write WRUAL EQU 2 ; write to unallocated TMRTICKINTV EQU 5 ; Number of 0.010mSec ticks per interrupt, ie. resolution of RTC. MTROFFMSECS EQU 100 ; Time from last access to motor being switched off in seconds in TMRTICKINTV ticks. -; IF BUILD_80C = 1 + IF BUILD_80C = 1 COLW EQU 80 ; Width of the display screen (ie. columns). -; ELSE -;COLW EQU 40 ; Width of the display screen (ie. columns). -; ENDIF + ELSE +COLW EQU 40 ; Width of the display screen (ie. columns). + ENDIF ROW EQU 25 ; Number of rows on display screen. SCRNSZ EQU COLW * ROW ; Total size, in bytes, of the screen display area. SCRLW EQU COLW / 8 ; Number of 8 byte regions in a line for hardware scroll. diff --git a/software/asm/include/MSBASIC_Definitions.asm b/software/asm/include/MSBASIC_Definitions.asm index 7d53db6..26ae7ef 100644 --- a/software/asm/include/MSBASIC_Definitions.asm +++ b/software/asm/include/MSBASIC_Definitions.asm @@ -49,36 +49,39 @@ BUILD_MZ80A EQU 1 ; Build BUILD_RFS EQU 0 ; Build for standard RFS with SD enhancements. BUILD_RFSTZ EQU 0 ; Build for RFS where the tranZPUter board is available without the K64F and running under RFS. BUILD_TZFS EQU 0 ; Build for TZFS where extended memory is available. +BUILD_80C EQU 0 +INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. ENDIF IF BUILD_VERSION = 1 BUILD_MZ80A EQU 0 BUILD_RFS EQU 1 BUILD_RFSTZ EQU 0 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 = 2 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 BUILD_MZ80A EQU 0 BUILD_RFS EQU 0 BUILD_RFSTZ EQU 0 BUILD_TZFS EQU 1 +BUILD_80C EQU 1 +INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. ENDIF -INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. - -TMRTICKINTV EQU 5 ; Number of 0.010mSec ticks per interrupt, ie. resolution of RTC. - IF BUILD_MZ80A = 1 -COLW: EQU 40 ; Width of the display screen (ie. columns). -MODE80C: EQU 0 - ENDIF - IF BUILD_RFS+BUILD_RFSTZ+BUILD_TZFS > 0 + IF BUILD_80C = 1 COLW: EQU 80 ; Width of the display screen (ie. columns). -MODE80C: EQU 1 + ELSE +COLW: EQU 40 ; Width of the display screen (ie. columns). ENDIF +TMRTICKINTV EQU 5 ; Number of 0.010mSec ticks per interrupt, ie. resolution of RTC. ROW: EQU 25 ; Number of rows on display screen. SCRNSZ: EQU COLW * ROW ; Total size, in bytes, of the screen display area. SCRLW: EQU COLW / 8 ; Number of 8 byte regions in a line for hardware scroll. @@ -101,7 +104,6 @@ CTAPELOAD EQU 2 TAPESAVE EQU 3 CTAPESAVE EQU 4 - ; Debugging ENADEBUG EQU 0 ; Enable debugging logic, 1 = enable, 0 = disable @@ -259,6 +261,7 @@ CTRL_Y EQU 019H CTRL_Z EQU 01AH ESC EQU 01BH CTRL_SLASH EQU 01CH +CTRL_LB EQU 01BH CTRL_RB EQU 01DH CTRL_CAPPA EQU 01EH CTRL_UNDSCR EQU 01FH @@ -273,6 +276,9 @@ INSERT EQU 0F6H CLRKEY EQU 0F7H HOMEKEY EQU 0F8H BREAKKEY EQU 0FBH +GRAPHKEY EQU 0FCH +ALPHAKEY EQU 0FDH + ;----------------------------------------------- ; Rom File System variable addresses. @@ -357,11 +363,17 @@ TZMM_TZFS4 EQU 005H ; TZFS TZMM_CPM EQU 006H ; CPM main memory configuration, all memory on the tranZPUter board, 64K block 4 selected. Special case for F3C0:F3FF & F7C0:F7FF (floppy disk paging vectors) which resides on the mainboard. TZMM_CPM2 EQU 007H ; CPM main memory configuration, F000-FFFF are on the tranZPUter board in block 4, 0040-CFFF and E800-EFFF are in block 5, mainboard for D000-DFFF (video), E000-E800 (Memory control) selected. ; Special case for 0000:003F (interrupt vectors) which resides in block 4, F3C0:F3FF & F7C0:F7FF (floppy disk paging vectors) which resides on the mainboard. +TZMM_COMPAT EQU 008H ; Original mode but with main DRAM in Bank 0 to allow bootstrapping of programs from other machines such as the MZ700. +TZMM_HOSTACCESS EQU 009H ; Mode to allow code running in Bank 0, address E800:FFFF to access host memory. Monitor ROM 0000-0FFF and Main DRAM 0x1000-0xD000, video and memory mapped I/O are on the host machine, User/Floppy ROM E800-FFFF are in tranZPUter memory. TZMM_MZ700_0 EQU 00AH ; MZ700 Mode - 0000:0FFF is on the tranZPUter board in block 6, 1000:CFFF is on the tranZPUter board in block 0, D000:FFFF is on the mainboard. TZMM_MZ700_1 EQU 00BH ; MZ700 Mode - 0000:0FFF is on the tranZPUter board in block 0, 1000:CFFF is on the tranZPUter board in block 0, D000:FFFF is on the tranZPUter in block 6. TZMM_MZ700_2 EQU 00CH ; MZ700 Mode - 0000:0FFF is on the tranZPUter board in block 6, 1000:CFFF is on the tranZPUter board in block 0, D000:FFFF is on the tranZPUter in block 6. TZMM_MZ700_3 EQU 00DH ; MZ700 Mode - 0000:0FFF is on the tranZPUter board in block 0, 1000:CFFF is on the tranZPUter board in block 0, D000:FFFF is inaccessible. TZMM_MZ700_4 EQU 00EH ; MZ700 Mode - 0000:0FFF is on the tranZPUter board in block 6, 1000:CFFF is on the tranZPUter board in block 0, D000:FFFF is inaccessible. +TZMM_MZ800 EQU 00FH ; MZ800 Mode - Tracks original hardware mode offering MZ700/MZ800 configurations. +TZMM_FPGA EQU 015H ; Open up access for the K64F to the FPGA resources such as memory. All other access to RAM or mainboard is blocked. +TZMM_TZPUM EQU 016H ; Everything in on mainboard, no access to tranZPUter memory. +TZMM_TZPU EQU 017H ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 0 is selected. TZMM_TZPU0 EQU 018H ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 0 is selected. TZMM_TZPU1 EQU 019H ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 1 is selected. TZMM_TZPU2 EQU 01AH ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 2 is selected. @@ -446,6 +458,8 @@ TZSVC_CMD_WRITESDDRIVE: EQU 33H ; Servi TZSVC_CMD_CPU_BASEFREQ EQU 40H ; Service command to switch to the mainboard frequency. TZSVC_CMD_CPU_ALTFREQ EQU 41H ; Service command to switch to the alternate frequency provided by the K64F. TZSVC_CMD_CPU_CHGFREQ EQU 42H ; Service command to set the alternate frequency in hertz. +TZSVC_CMD_CPU_SETZ80 EQU 50H ; Service command to switch to the external Z80 hard cpu. +TZSVC_CMD_CPU_SETT80 EQU 51H ; Service command to switch to the internal T80 soft cpu. TZSVC_STATUS_OK: EQU 000H ; Flag to indicate the K64F processing completed successfully. TZSVC_STATUS_REQUEST: EQU 0FEH ; Flag to indicate the Z80 has made a request to the K64F. TZSVC_STATUS_PROCESSING:EQU 0FFH ; Flag to indicate the K64F is processing a command. diff --git a/software/asm/rfs.asm b/software/asm/rfs.asm index 1615488..e953b2c 100644 --- a/software/asm/rfs.asm +++ b/software/asm/rfs.asm @@ -175,10 +175,16 @@ ROMFS_3: LD (BNKSELMROM),A ; start ; Replacement command processor in place of the SA1510 command processor. ; MONITOR: IN A,(CPLDINFO) ; See if a tranZPUter board is present. - CP 0A0H - JR NC,CHKTZ1 + AND 0E7H ; Mask out the CPLD Version and host HW. + LD C,A + CP 020H ; Upper bits specify the version, should be at least 1. + JR C,CHKTZ1 + AND 007H ; Get Hardware, should be an MZ-80A for RFS. + CP MODE_MZ80A + LD A,C + JR Z,CHKTZ1 XOR A -CHKTZ1: AND 00FH +CHKTZ1: AND 0E0H LD (TZPU), A ; Flag = 0 if no tranZPUter present otherwise contains version (1 - 15). LD HL,DSPCTL ; Setup address of display control register latch. ; diff --git a/software/asm/rfs_bank6.asm b/software/asm/rfs_bank6.asm index 4eba676..dfc22f8 100644 --- a/software/asm/rfs_bank6.asm +++ b/software/asm/rfs_bank6.asm @@ -451,8 +451,8 @@ ATBL: DB 0CCH ; NUL '\0' (null character) ; Message table ; ;-------------------------------------- -MSGSON: DB "+ RFS ", 0ABh, "2.1 **", 00DH, 000H ; Version 2.0-> as we are now using the v2.x PCB with 4 devices on-board -MSGSONTZ: DB "+ TZ+RFS ", 0ABh, "2.0 **", 00DH, 000H ; Version 2.0 with version 2.1+ of tranZPUter board installed. +MSGSON: DB "+ RFS ", 0ABh, "2.1 **", 00DH, 000H ; Version 2.x-> as we are now using the v2.x PCB with 4 devices on-board +MSGSONTZ: DB "+ TZ+RFS ", 0ABh, "2.1 **", 00DH, 000H ; Version 2.x with version 2.1+ of tranZPUter board installed. MSGNOTFND: DB "Not Found", 00DH, 000H MSGRDIRLST: DB "ROM Directory:", 00DH, 000H MSGTRM: DB 00DH, 000H diff --git a/software/build.sh b/software/build.sh index f4807b0..8f1a00a 100755 --- a/software/build.sh +++ b/software/build.sh @@ -27,7 +27,7 @@ if [ $? != 0 ]; then fi # Only needed if the program source tree changes, takes too long to run on every build! -if [ ${PROCESS_MFZ_FILES} != 1 ]; then +if [[ ${PROCESS_MFZ_FILES} -eq 1 ]]; then tools/processMZFfiles.sh if [ $? != 0 ]; then echo "Failed to process MZF files into sectored variants...." diff --git a/software/roms/MROM_256.bin b/software/roms/MROM_256.bin index 229a99891d43f50c53c069cb949ca07e3ca5c933..ff9f3a043dd7a7eb50882a5b25b539bf02caaffa 100644 GIT binary patch delta 5688 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 JtyKlqe*hxcs4@Tm delta 11360 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

k$3QD#*#@}Gf^A~*$bl? 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 diff --git a/software/roms/cbios_bank1.rom b/software/roms/cbios_bank1.rom index 70b63403ad24e7ec5bb0be7de209b79cd36c107f..ca90b79eec05936776a6fa9aa6bb93a14be76dfc 100644 GIT binary patch delta 39 vcmZn=Xb_m-%E+Gr7V6x+QcyhBM(_K~o`1K7H delta 33 pcmZn=Xb_m-%E++MZ6hP2;^ZHUGOR5Bek(9+R%E)*I@y7V0|2i23L^jj diff --git a/software/roms/rfs.rom b/software/roms/rfs.rom index b87df144826e77948675c3449c8ae9e4852d5cda..ee786d191af9f28b77f16c2a68ad05df68a92fea 100644 GIT binary patch delta 631 zcmXw0O-K}B7@lu;c2-Mszuk&eOlJI@-C7(M%h6;o*P^X$6B99B1o3I}xNwj#GF4c{Tgqm`7ehuThz>xH3vYGKQ7#eF!G(Q}VnS8|{9C^bh{6kE7GcgY7B0;!LkRl_u>006Zv220#j(BllRm-{OAslspJd zBZaI0X|%)fxO7anHe6LDm}7orhG0=I&SyzanfK>B9D-tY3A)jY!%xi`c-#9~L{Zh{ z0mJQCme*0pcTY>QrjN)~#$**yg!AdV2A^w1=FusNJG*Hx8^%ti%mhwCfBwI~SZ)mZ zTmq4im|dpKt)DwXPi!?~9dO?CZWjXt95KCi*uD7_0c5sHCjTIX3YY9N_r9H;m-;cm z{<0?jQRiL8=Re_VQ!}(AM^US@r8;WjI1M~S*vB?vhUeu@lRn__S@G(!SKZLdEuEJ8 nOs+)kM5E5y7daOKpeB8B{}nr^L|MMZ!o2z}P?_$oe?a{Mk`WlY delta 490 zcmZo@U~Fh$oX{v){ra%k>%%VZ4wt<<-1_eD`ge!-ygPjV-QlkjXKAqiTVTMr{u%$o z%Z-ftCWkWm_-}f7^y=Ga8G)06n_hw$F9loQD)zlN8}P#Fv*5pfhh$!Au?fCpGBKF( zipj!Y)hiZr0|Sd|ub6?<*H^4gj=`SJSKcZ*oqEaa9N@cW@&`s)rT?#mJe~R9GI~|L zQt=7#i>P>^J{r&Q!;J@8!?RbSQo;>^D?SZqh?@p;RNd4ng;IYya_frT%GZ*!)wpusG{Gc|E&0Ti$yEIUw^4yUAn+ZmvxnNxF;%o0Cn;m>Fdz-?A_S Ql025tj53=uEN8F*05>$y3IG5A diff --git a/software/tools/assemble_roms.sh b/software/tools/assemble_roms.sh index 47e073b..8050f44 100755 --- a/software/tools/assemble_roms.sh +++ b/software/tools/assemble_roms.sh @@ -12,6 +12,7 @@ ## Copyright: (c) 2018-21 Philip Smart ## ## History: August 2018 - Initial script written. +## March 2021 - Updated to compile different versions of Microsoft BASIC. ## ######################################################################################################### ## This source file is free software: you can redistribute it and#or modify