diff --git a/Doc/Nascom.txt b/Doc/Nascom.txt index 0333b18d..5455ab1c 100644 --- a/Doc/Nascom.txt +++ b/Doc/Nascom.txt @@ -92,6 +92,29 @@ OR LOGICAL OR < LESS THAN ^ POWER +EXPRESSION PRECEDENCE: + +() EXPRESSIONS IN () +^ POWER +- NEGATION +* / MULTIPLICATION AND DIVISION ++ - ADDITION AND SUBTRACTION += EQUALS +<> NOT EQUAL +< LESS THAN +> GREATER THAN +<= =< LESS THAN OR EQUAL TO +>= => GREATER THAN OR EQUAL TO +NOT LOGICAL, BITWISE NEGATION +AND LOGICAL, BITWISE AND +OR LOGICAL, BITWISE OR + +VARIABLES: + + NO LENGTH LIMIT BUT ONLY FIRST TWO CHARACTERS ARE SIGNIFICANT. + CANNOT HAVE THE SAME NAME AS RESERVED WORDS. + MAY BE AN ARRAY. + ERROR CODE: NF NEXT without FOR diff --git a/Source/CPM3/Build.cmd b/Source/CPM3/Build.cmd index a8ce11cf..efacbb00 100644 --- a/Source/CPM3/Build.cmd +++ b/Source/CPM3/Build.cmd @@ -67,6 +67,8 @@ rem *** Banked *** copy cpm3bnk.sys cpm3.sys copy genbnk.dat gencpm.dat +if not exist ../../Binary/hd_cpm3.img goto :eof + rem Update cpm_hd.img echo. echo. @@ -90,6 +92,7 @@ for %%f in ( readme.1st cpm3fix.pat ) do call :upd_img %%f + goto :eof :upd_img diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 0acc1cc6..6c2c545a 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -212,9 +212,9 @@ SD_OPRDEF .EQU %00100000 ; QUIESCENT STATE SD_CD0 .EQU %00000001 ; IN/OUT:SD_OPREG:0 = CD0, PMOD pull CD0 low SD_CD1 .EQU %00000010 ; IN:SD_OPREG:1 = CD1, IN=0 Card detect switch SD_CD2 .EQU %00000100 ; IN:SD_OPREG:2 = CD2, IN=0 Card detect switch -SD_CS0 .EQU %00010000 ; IN/OUT:SD_OPREG:3 = CS0, PMOD SPI CS -SD_CS1 .EQU %00010000 ; IN/OUT:SD_OPREG:4 = CS1, SDCARD1 CS, IN=1 Card present -SD_CS2 .EQU %00010000 ; IN/OUT:SD_OPREG:5 = CS2, SDCARD2 CS, IN=1 Card present +ENETCS0 .EQU %00001000 ; IN/OUT:SD_OPREG:3 = CS0, PMOD SPI CS +SDCS1 .EQU %00010000 ; IN/OUT:SD_OPREG:4 = CS1, SDCARD1 CS, IN=1 Card present +PARK .EQU %00100000 ; IN/OUT:SD_OPREG:5 = CS2, SDCARD2 CS, IN=1 Card present SD_WRTR .EQU %01011100 ; Write data and transfer SD_RDTR .EQU %01011101 ; Read data and transfer SD_RDNTR .EQU %01011100 ; Read data and NO transfer @@ -1337,15 +1337,11 @@ SD_EXECCMD1: #IF (SDMODE == SDMODE_MT) ; 256 loops might not be long enough timeout ; when only IN is required to read data -; LD DE,$7FFF ; INIT TIMEOUT LOOP COUNTER LD E,0 ; INIT TIMEOUT LOOP COUNTER SD_EXECCMD2: IN A,(SD_RDTR) ; GET A BYTE FROM THE CARD OR A ; SET FLAGS JP P,SD_EXECCMD3 ; IF HIGH BIT IS 0, WE HAVE RESULT -; DEC DE -; BIT 7,D -; JR Z,SD_EXECCMD2 ; KEEP TRYING UNTIL TIMEOUT DEC E ; OTHERWISE DECREMENT LOOP COUNTER JR NZ,SD_EXECCMD2 ; AND LOOP UNTIL TIMEOUT #ELSE @@ -1670,18 +1666,7 @@ SD_SELECT2: #ENDIF #ELSE #IF (SDMODE == SDMODE_MT) - IN A,(SD_OPRREG) - BIT 0,(IY+SD_DEV) ; DEVICE 0 OR 1 - JR NZ,SD_SELECT1 - AND SD_CS1 ; DEVICE 0 - JR SD_SELECT2 -SD_SELECT1: - AND SD_CS2 ; DEVICE 1 -SD_SELECT2: - JR NZ,SD_SELECT3 ; NZ if CS input high - POP DE ; return address of call to SD_SELECT - POP DE ; return address of call to SD_WAITRDY - JR SD_NOMEDIA + LD A,SDCS1 SD_SELECT3: LD D,A LD A,(SD_OPRVAL) @@ -1707,7 +1692,7 @@ SD_DESELECT: #ENDIF #ELSE #IF (SDMODE == SDMODE_MT) - AND ~(SD_CS1 + SD_CS2) ; RESET SD_CS1 and SD_CS2 (CHIP SELECT) + LD A,PARK ; WHY IS PARK (CS2) BEING ASSERTED HERE??? #ELSE AND ~SD_CS ; RESET SD_CS (CHIP SELECT) #ENDIF diff --git a/Source/HBIOS/vdu.asm b/Source/HBIOS/vdu.asm index 379ed86f..e1b220d6 100644 --- a/Source/HBIOS/vdu.asm +++ b/Source/HBIOS/vdu.asm @@ -5,7 +5,7 @@ ; REVISED/ENHANCED BY DAN WERNER -- 11/7/2009 ; ROMWBW ADAPTATION BY: WAYNE WARTHEN -- 11/9/2012 ; 80X25, 80X30 AND MODE INFO AT BOOT ADDED BY: PHIL SUMMERS -- 2/3/2019 -; ADD CURSOR STYLE OPTIONS: PHIL SUMMERS -- 19/10/2019 +; ADD CURSOR STYLE OPTIONS, IMPLEMENT VDU_VDASCS FUNCTION : PHIL SUMMERS -- 19/10/2019 ;====================================================================== ; ; VDU-DW.ZIP IS THE DEFAULY 10X8 FONT THAT SUITS 80X25 AND 80X26 MODE. @@ -15,7 +15,6 @@ ; ; TODO: ; - ADD REMAINING REGISTERS TO INIT -; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION ; - IMPLEMENT ALTERNATE DISPLAY MODES? ; ;====================================================================== @@ -34,7 +33,6 @@ VDU_PPIB .EQU VDU_BASE + $05 ; PPI PORT B VDU_PPIC .EQU VDU_BASE + $06 ; PPI PORT C VDU_PPIX .EQU VDU_BASE + $07 ; PPI CONTROL PORT ; -; VDU_NOBL .EQU 00000000B ; NO BLINK VDU_NOCU .EQU 00100000B ; NO CURSOR VDU_BFAS .EQU 01000000B ; BLINK AT X16 RATE @@ -47,7 +45,7 @@ VDU_CSTY .EQU VDU_BLOK ; DEFAULT CURSOR STYLE VDU_BLNK .EQU VDU_NOBL ; DEFAULT BLINK RATE ; TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER - +; #IF (VDUSIZ=V80X24) DLINES .EQU 24 DROWS .EQU 80 @@ -84,7 +82,6 @@ VDU_R10 .EQU (VDU_BLNK + DSCANL-1) VDU_R11 .EQU DSCANL-1 #ENDIF ; -; ;====================================================================== ; VDU DRIVER - INITIALIZATION ;====================================================================== @@ -187,10 +184,24 @@ VDU_VDADEV: RET VDU_VDASCS: - ; CURSOR START := TOP NIBBLE OF D - ; CURSOR FINISH := BOTTOM NIBBLE OF D + LD A,D ; GET CURSOR FINISH. + AND 00001111B ; BOTTOM NIBBLE OF D + LD L,A ; SAVE IN L FOR R11 + + LD A,D ; GET CURSOR START. + AND 11110000B ; TOP NIBBLE IF D + RRCA + RRCA + RRCA ; COMBINE CURSOR START + RRCA ; AND CURSOR STYLE AND + OR VDU_CSTY ; SAVE IN H FOR R10 + LD H,A + + LD C,10 + CALL VDU_WRREGX ; UPDATE CURSOR - CALL PANIC ; NOT IMPLEMENTED (YET) + XOR A + RET VDU_VDASCP: CALL VDU_XY @@ -261,7 +272,7 @@ VDU_WAITRDY: ;---------------------------------------------------------------------- ; UPDATE SY6845 REGISTERS ; VDU_WRREG WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C -; VDU_WRREGX WRITES VALUE IN DE TO VDU REGISTER PAIR IN C, C+1 +; VDU_WRREGX WRITES VALUE IN HL TO VDU REGISTER PAIR IN C, C+1 ;---------------------------------------------------------------------- ; VDU_WRREG: @@ -336,14 +347,7 @@ VDU_CRTINIT1: INC HL ; POINT TO NEXT VALUE INC C ; POINT TO NEXT REGISTER DJNZ VDU_CRTINIT1 ; LOOP - - LD HL,VDU_INIT6845+10 ; SAVE - LD A,(HL) ; DEFAULT - LD (VDU_CS),A ; CURSOR - INC HL ; SCANLINE - LD A,(HL) ; START AND - LD (VDU_CE),A ; FINISH - RET ; POSITION + RET ; ;---------------------------------------------------------------------- ; CONVERT XY COORDINATES IN DE INTO LINEAR INDEX IN HL @@ -563,12 +567,33 @@ VDU_POS .DW 0 ; CURRENT DISPLAY POSITION VDU_OFFSET .DW 0 ; CURRENT DISPLAY POSITION VDU_BUF .FILL 256,0 ; COPY BUFFER ; +;================================================================================================== +; ECB-VDU VIDEO MODE DESCRIPTION +;==================================================================================================\ +; +; CCIR 625/50 VERSION (USED IN MOST OF THE WORLD) +; JUMPER K1 2-3, K2 1-2 FOR 2MHz CHAR CLOCK +; +; THE CCIR 625/50 TELEVISION STANDARD HAS 625 LINES INTERLACED AT 50 FIELDS PER SECOND. THIS WORKS +; OUT AS 50 FIELDS OF 312.5 LINES PER SECOND NON-INTERLACED AS USED HERE. +; HORIZONTAL LINE WIDTH IS 64uS. FOR A 2 MHz CHARACTER CLOCK (R0+1)/2000000 = 64uS +; NEAREST NUMBER OF LINES IS 312 = (R4+1) * (R9+1) + R5. +; 15625 / 312 = 50.08 FIELDS PER SECOND (NEAR ENOUGH-DGG) +; +; +; .DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING +; ; B6=1 PIN 34 IS UPDATE STROBE +; ; B5=1 DELAY CURSOR 1 CHARACTER +; ; B4=1 DELAY DISPLAY ENABLE 1 CHARACTER +; ; B3=1 TRANSPARENT MEMORY ADDRESSING +; ; B2=0 RAM STRAIGHT BINARY ADDRESSING +; ; B1,B0=0 NON-INTERLACE +VDU_INIT6845: #IF (VDUSIZ=V80X24) ;================================================================================================== ; VDU DRIVER - SY6845 REGISTER INITIALIZATION -80x24 10x8 ;================================================================================================== ; -VDU_INIT6845: .DB 07FH ; R0 TOTAL NUMBER OF HORIZONTAL CHARACTERS (DETERMINES HSYNC) .DB DROWS ; R1 NUMBER OF HORIZONTAL CHARACTERS DISPLAYED (80 COLUMNS) .DB 060H ; R2 HORIZONTAL SYNC POSITION @@ -577,27 +602,20 @@ VDU_INIT6845: .DB 002H ; R5 VERTICAL TOTAL ADJUST ( .DB DLINES ; R6 VERTICAL DISPLAYED (24 ROWS) .DB 01AH ; R7 VERTICAL SYNC - .DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING - ; B6=1 PIN 34 IS UPDATE STROBE - ; B5=1 DELAY CURSOR 1 CHARACTER - ; B4=1 DELAY DISPLAY ENABLE 1 CHARACTER - ; B3=1 TRANSPARENT MEMORY ADDRESSING - ; B2=0 RAM STRAIGHT BINARY ADDRESSING - ; B1,B0=0 NON-INTERLACE + .DB 078H ; R8 MODE .DB DSCANL-1 ; R9 SCAN LINE (LINES PER CHAR AND SPACING -1) -VDU_CS: .DB VDU_R10 ; R10 CURSOR START RASTER -VDU_CE: .DB VDU_R11 ; R11 CURSOR END RASTER + .DB VDU_R10 ; R10 CURSOR START RASTER + .DB VDU_R11 ; R11 CURSOR END RASTER .DB 00H ; R12 START ADDRESS HI .DB 00H ; R13 START ADDRESS LO .DB 00H ; R14 CURSOR ADDRESS HI .DB 00H ; R15 CURSOR ADDRESS LO -; #ENDIF #IF (VDUSIZ=V80X25) ;================================================================================================== ; VDU DRIVER - SY6845 REGISTER INITIALIZATION -80x25 10x8 ;================================================================================================== -VDU_INIT6845: +; .DB 07FH ; R0 TOTAL NUMBER OF HORIZONTAL CHARACTERS (DETERMINES HSYNC) .DB DROWS ; R1 NUMBER OF HORIZONTAL CHARACTERS DISPLAYED =80 .DB 060H ; R2 HORIZONTAL SYNC POSITION @@ -606,27 +624,20 @@ VDU_INIT6845: .DB 002H ; R5 VERTICAL TOTAL ADJUST ( .DB DLINES ; R6 VERTICAL DISPLAYED (25 ROWS) .DB 01BH ; R7 VERTICAL SYNC - .DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING -; ; B6=1 PIN 34 IS UPDATE STROBE -; ; B5=1 DELAY CURSOR 1 CHARACTER -; ; B4=1 DELAY DISPLAY ENABLE 1 CHARACTER -; ; B3=1 TRANSPARENT MEMORY ADDRESSING -; ; B2=0 RAM STRAIGHT BINARY ADDRESSING -; ; B1,B0=0 NON-INTERLACE + .DB 078H ; R8 MODE .DB DSCANL-1 ; R9 SCAN LINE (LINES PER CHAR AND SPACING -1) -VDU_CS: .DB VDU_R10 ; R10 CURSOR START RASTER -VDU_CE: .DB VDU_R11 ; R11 CURSOR END RASTER + .DB VDU_R10 ; R10 CURSOR START RASTER + .DB VDU_R11 ; R11 CURSOR END RASTER .DB 00H ; R12 START ADDRESS HI .DB 00H ; R13 START ADDRESS LO .DB 00H ; R14 CURSOR ADDRESS HI .DB 00H ; R15 CURSOR ADDRESS LO -; #ENDIF #IF (VDUSIZ=V80X30) ;================================================================================================== ; VDU DRIVER - SY6845 REGISTER INITIALIZATION -80x30 8x8 ;================================================================================================== -VDU_INIT6845: +; .DB 07FH ; R0 TOTAL NUMBER OF HORIZONTAL CHARACTERS (DETERMINES HSYNC) .DB DROWS ; R1 NUMBER OF HORIZONTAL CHARACTERS DISPLAYED =80 .DB 060H ; R2 HORIZONTAL SYNC POSITION @@ -635,27 +646,20 @@ VDU_INIT6845: .DB 00H ; R5 VERTICAL TOTAL ADJUST ( .DB DLINES ; R6 VERTICAL DISPLAYED (30 ROWS) .DB 22H ; R7 VERTICAL SYNC - .DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING -; ; B6=1 PIN 34 IS UPDATE STROBE -; ; B5=1 DELAY CURSOR 1 CHARACTER -; ; B4=1 DELAY DISPLAY ENABLE 1 CHARACTER -; ; B3=1 TRANSPARENT MEMORY ADDRESSING -; ; B2=0 RAM STRAIGHT BINARY ADDRESSING -; ; B1,B0=0 NON-INTERLACE + .DB 078H ; R8 MODE .DB DSCANL-1 ; R9 SCAN LINE (LINES PER CHAR AND SPACING -1) -VDU_CS: .DB VDU_R10 ; R10 CURSOR START RASTER -VDU_CE: .DB VDU_R11 ; R11 CURSOR END RASTER + .DB VDU_R10 ; R10 CURSOR START RASTER + .DB VDU_R11 ; R11 CURSOR END RASTER .DB 00H ; R12 START ADDRESS HI .DB 00H ; R13 START ADDRESS LO .DB 00H ; R14 CURSOR ADDRESS HI .DB 00H ; R15 CURSOR ADDRESS LO -; #ENDIF #IF (VDUSIZ=V80X25B) ;================================================================================================== ; VDU DRIVER - SY6845 REGISTER INITIALIZATION -80x25 12x8 TO SUIT BLOCK GRAPHICS ;================================================================================================== -VDU_INIT6845: +; .DB 07FH ; R0 TOTAL NUMBER OF HORIZONTAL CHARACTERS (DETERMINES HSYNC) .DB DROWS ; R1 NUMBER OF HORIZONTAL CHARACTERS DISPLAYED =80 .DB 060H ; R2 HORIZONTAL SYNC POSITION @@ -664,27 +668,20 @@ VDU_INIT6845: .DB 00H ; R5 VERTICAL TOTAL ADJUST (312-(R4+1)*DSCANL) .DB DLINES ; R6 VERTICAL DISPLAY .DB 019H ; R7 VERTICAL SYNC (DLINES .. R4) - .DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING -; ; B6=1 PIN 34 IS UPDATE STROBE -; ; B5=1 DELAY CURSOR 1 CHARACTER -; ; B4=1 DELAY DISPLAY ENABLE 1 CHARACTER -; ; B3=1 TRANSPARENT MEMORY ADDRESSING -; ; B2=0 RAM STRAIGHT BINARY ADDRESSING -; ; B1,B0=0 NON-INTERLACE + .DB 078H ; R8 MODE .DB DSCANL-1 ; R9 SCAN LINE (LINES PER CHAR AND SPACING -1) -VDU_CS: .DB VDU_R10 ; R10 CURSOR START RASTER -VDU_CE: .DB VDU_R11 ; R11 CURSOR END RASTER + .DB VDU_R10 ; R10 CURSOR START RASTER + .DB VDU_R11 ; R11 CURSOR END RASTER .DB 00H ; R12 START ADDRESS HI .DB 00H ; R13 START ADDRESS LO .DB 00H ; R14 CURSOR ADDRESS HI .DB 00H ; R15 CURSOR ADDRESS LO -; #ENDIF #IF (VDUSIZ=V80X24B) ;================================================================================================== ; VDU DRIVER - SY6845 REGISTER INITIALIZATION -80x24 12x8 TO SUIT BLOCK GRAPHICS ;================================================================================================== -VDU_INIT6845: +; .DB 07FH ; R0 TOTAL NUMBER OF HORIZONTAL CHARACTERS (DETERMINES HSYNC) .DB DROWS ; R1 NUMBER OF HORIZONTAL CHARACTERS DISPLAYED =80 .DB 060H ; R2 HORIZONTAL SYNC POSITION @@ -693,33 +690,18 @@ VDU_INIT6845: .DB 00H ; R5 VERTICAL TOTAL ADJUST (312-(R4+1)*DSCANL) .DB DLINES ; R6 VERTICAL DISPLAY .DB 018H ; R7 VERTICAL SYNC (DLINES .. R4) - .DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING -; ; B6=1 PIN 34 IS UPDATE STROBE -; ; B5=1 DELAY CURSOR 1 CHARACTER -; ; B4=1 DELAY DISPLAY ENABLE 1 CHARACTER -; ; B3=1 TRANSPARENT MEMORY ADDRESSING -; ; B2=0 RAM STRAIGHT BINARY ADDRESSING -; ; B1,B0=0 NON-INTERLACE + .DB 078H ; R8 MODE .DB DSCANL-1 ; R9 SCAN LINE (LINES PER CHAR AND SPACING -1) -VDU_CS: .DB VDU_R10 ; R10 CURSOR START RASTER -VDU_CE: .DB VDU_R11 ; R11 CURSOR END RASTER + .DB VDU_R10 ; R10 CURSOR START RASTER + .DB VDU_R11 ; R11 CURSOR END RASTER .DB 00H ; R12 START ADDRESS HI .DB 00H ; R13 START ADDRESS LO .DB 00H ; R14 CURSOR ADDRESS HI .DB 00H ; R15 CURSOR ADDRESS LO ; #ENDIF -; CCIR 625/50 VERSION (USED IN MOST OF THE WORLD) -; JUMPER K1 2-3, K2 1-2 FOR 2MHz CHAR CLOCK ; -; THE CCIR 625/50 TELEVISION STANDARD HAS 625 LINES INTERLACED AT 50 FIELDS PER SECOND. THIS WORKS -; OUT AS 50 FIELDS OF 312.5 LINES PER SECOND NON-INTERLACED AS USED HERE. -; HORIZONTAL LINE WIDTH IS 64uS. FOR A 2 MHz CHARACTER CLOCK (R0+1)/2000000 = 64uS -; NEAREST NUMBER OF LINES IS 312 = (R4+1) * (R9+1) + R5. -; 15625 / 312 = 50.08 FIELDS PER SECOND (NEAR ENOUGH-DGG) -; -; -;================================================================================================== +;;================================================================================================== ; VDU DRIVER - INSTANCE DATA ;================================================================================================== ; diff --git a/Source/ZPM3/Build.cmd b/Source/ZPM3/Build.cmd index 1e195248..9dfd70a4 100644 --- a/Source/ZPM3/Build.cmd +++ b/Source/ZPM3/Build.cmd @@ -37,6 +37,8 @@ if exist zpm3.sys del zpm3.sys ren cpm3.sys zpm3.sys rem pause +if not exist ../../Binary/hd_cpm3.img goto :eof + rem Update cpm_hd.img echo. echo.