From a010260c8c89eb66608f9a2c03cc10f61a68fea2 Mon Sep 17 00:00:00 2001 From: wayne Date: Fri, 10 May 2013 02:38:16 +0000 Subject: [PATCH] Reintegrate wbw -> trunk --- Apps/core/CLEAN.BAT | 3 - Apps/core/FETCH.BAT | 16 --- Apps/crossdev/APPLVERS.H | 2 +- Apps/crossdev/APPLVERS.LIB | 4 +- Apps/crossdev/{COREAPPS.BAT => BLDCORE.BAT} | 17 ++- Apps/crossdev/COPYCORE.BAT | 20 +++ Clean.cmd | 17 +++ ReadMe.txt | 4 +- RomDsk/CPM_1024KB/ZDE40.COM | Bin 0 -> 16896 bytes RomDsk/CPM_512KB/ZDE40.COM | Bin 0 -> 16896 bytes RomDsk/ZSYS_1024KB/ZDE40.COM | Bin 0 -> 16896 bytes Source/cbios.asm | 86 +++++------ Source/config_n8_2312.asm | 8 +- Source/config_n8_2511.asm | 8 +- Source/config_n8vem_cvdu.asm | 8 +- Source/config_n8vem_dide.asm | 8 +- Source/config_n8vem_diskio.asm | 8 +- Source/config_n8vem_diskio3.asm | 8 +- Source/config_n8vem_dsd.asm | 8 +- Source/config_n8vem_ppide.asm | 8 +- Source/config_n8vem_ppisd.asm | 8 +- Source/config_n8vem_propio.asm | 9 +- Source/config_n8vem_simh.asm | 8 +- Source/config_n8vem_std.asm | 8 +- Source/config_n8vem_vdu.asm | 8 +- Source/config_zeta_ppp.asm | 8 +- Source/config_zeta_std.asm | 8 +- Source/cvdu.asm | 43 ++++++ Source/fd.asm | 4 + Source/hbios.asm | 45 +++--- Source/kbd.asm | 36 ++--- Source/n8v.asm | 149 +++++++++++++++++--- Source/ppk.asm | 47 +++--- Source/prp.asm | 6 +- Source/uart.asm | 2 - Source/util.asm | 2 + Source/ver.inc | 4 +- 37 files changed, 409 insertions(+), 219 deletions(-) delete mode 100644 Apps/core/CLEAN.BAT delete mode 100644 Apps/core/FETCH.BAT rename Apps/crossdev/{COREAPPS.BAT => BLDCORE.BAT} (90%) create mode 100644 Apps/crossdev/COPYCORE.BAT create mode 100644 RomDsk/CPM_1024KB/ZDE40.COM create mode 100644 RomDsk/CPM_512KB/ZDE40.COM create mode 100644 RomDsk/ZSYS_1024KB/ZDE40.COM diff --git a/Apps/core/CLEAN.BAT b/Apps/core/CLEAN.BAT deleted file mode 100644 index 1545e88b..00000000 --- a/Apps/core/CLEAN.BAT +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -if exist *.COM del *.COM -if exist *.MAN del *.MAN \ No newline at end of file diff --git a/Apps/core/FETCH.BAT b/Apps/core/FETCH.BAT deleted file mode 100644 index 0079e599..00000000 --- a/Apps/core/FETCH.BAT +++ /dev/null @@ -1,16 +0,0 @@ -@echo off -echo Copy CP/M-80 executables from the crossdev folder to here (core only) -if exist *.COM del *.COM -if exist *.MAN del *.MAN -copy ..\crossdev\ACCESS.CPM ACCESS.COM -copy ..\crossdev\CPMNAME.CPM CPMNAME.COM -copy ..\crossdev\FINDFILE.CPM FINDFILE.COM -copy ..\crossdev\MAP.CPM MAP.COM -copy ..\crossdev\META.CPM META.COM -copy ..\crossdev\MULTIFMT.CPM MULTIFMT.COM -copy ..\crossdev\REM.CPM REM.COM -copy ..\crossdev\SETLABEL.CPM SETLABEL.COM -copy ..\crossdev\SYSGEN.CPM SYSGEN.COM -copy ..\crossdev\TERMTYPE.CPM TERMTYPE.COM -copy ..\crossdev\VIEW.CPM VIEW.COM -copy ..\doc\dwg-apps.man DWG-APPS.MAN \ No newline at end of file diff --git a/Apps/crossdev/APPLVERS.H b/Apps/crossdev/APPLVERS.H index 0c496cc4..eb27c7c6 100644 --- a/Apps/crossdev/APPLVERS.H +++ b/Apps/crossdev/APPLVERS.H @@ -8,7 +8,7 @@ #define A_RTP 6 #define A_MONTH 4 -#define A_DAY 9 +#define A_DAY 11 #define A_YEAR 2013 #define A_YR 13 diff --git a/Apps/crossdev/APPLVERS.LIB b/Apps/crossdev/APPLVERS.LIB index 9f09b053..60cfd10d 100644 --- a/Apps/crossdev/APPLVERS.LIB +++ b/Apps/crossdev/APPLVERS.LIB @@ -6,11 +6,11 @@ A$RUP equ 0 A$RTP equ 6 A$MONTH equ 4 -A$DAY equ 9 +A$DAY equ 11 A$YEAR equ 2013 date macro -dat db ' 4/9/2013$' +dat db ' 4/11/2013$' endm serial macro diff --git a/Apps/crossdev/COREAPPS.BAT b/Apps/crossdev/BLDCORE.BAT similarity index 90% rename from Apps/crossdev/COREAPPS.BAT rename to Apps/crossdev/BLDCORE.BAT index 93f1ed21..725770ce 100644 --- a/Apps/crossdev/COREAPPS.BAT +++ b/Apps/crossdev/BLDCORE.BAT @@ -2,60 +2,73 @@ rem coreapps.bat 2/15/2013 dwg - build all core apps using batch files +echo. echo Building access.com... if not exist access.cpm call access.bat if not exist access.cpm echo WARNING ACCESS DIDN'T BUILD if not exist access.cpm pause +echo. echo Building cpmname.com... if not exist cpmname.cpm call cpmname.bat if not exist cpmname.cpm echo WARNING CPMNAME DIDN'T BUILD if not exist cpmname.cpm pause +echo. echo Building findfile.com... if not exist findfile.cpm call findfile.bat if not exist findfile.cpm echo WARNING FINDFILE DIDN'T BUILD if not exist findfile.cpm pause +echo. echo Building map.com... if not exist map.cpm call map.bat if not exist map.cpm echo WARNING MAP DIDN'T BUILD if not exist map.cpm pause +echo. echo Building meta.com... if not exist meta.cpm call meta.bat if not exist meta.cpm echo WARNING META DIDN'T BUILD if not exist meta.cpm pause +echo. echo Building multifmt.com... if not exist multifmt.cpm call multifmt.bat if not exist multifmt.cpm echo WARNING MULTIFMT DIDN'T BUILD if not exist multifmt.cpm pause +echo. echo Building rem.com... if not exist rem.cpm call makerem.bat if not exist rem.cpm echo WARNING REM DIDN'T BUILD if not exist rem.cpm pause +echo. echo Building setlabel.com... if not exist setlabel.cpm call setlabel.bat if not exist setlabel.cpm echo WARNING SETLABEL DIDN'T BUILD if not exist setlabel.cpm pause +echo. echo Building sysgen.com... if not exist sysgen.cpm call sysgen.bat if not exist sysgen.cpm echo WARNING SYSGEN DIDN'T BUILD if not exist sysgen.cpm pause +echo. echo Building termtype.com... if not exist termtype.cpm call termtype.bat if not exist termtype.cpm echo WARNING TERMTYPE DIDN'T BUILD if not exist termtype.cpm pause +echo. echo Building view.com... if not exist view.cpm call view.bat if not exist view.cpm echo WARNING VIEW DIDN'T BUILD if not exist view.cpm pause -echo All Core Apps Built -dir *.cpm \ No newline at end of file +echo. +echo Build Core Apps complete: +echo. +dir *.CPM \ No newline at end of file diff --git a/Apps/crossdev/COPYCORE.BAT b/Apps/crossdev/COPYCORE.BAT new file mode 100644 index 00000000..93c37de9 --- /dev/null +++ b/Apps/crossdev/COPYCORE.BAT @@ -0,0 +1,20 @@ +@echo off + +echo. +echo Regenerate Core directory... +echo. + +if exist ..\core\*.* del /q ..\core\*.* + +copy ACCESS.CPM ..\core\*.COM +copy CPMNAME.CPM ..\core\*.COM +copy FINDFILE.CPM ..\core\*.COM +copy MAP.CPM ..\core\*.COM +copy META.CPM ..\core\*.COM +copy MULTIFMT.CPM ..\core\*.COM +copy REM.CPM ..\core\*.COM +copy SETLABEL.CPM ..\core\*.COM +copy SYSGEN.CPM ..\core\*.COM +copy TERMTYPE.CPM ..\core\*.COM +copy VIEW.CPM ..\core\*.COM +copy ..\doc\DWG-APPS.MAN ..\core\DWG-APPS.MAN \ No newline at end of file diff --git a/Clean.cmd b/Clean.cmd index 09f058b6..66e5d9eb 100644 --- a/Clean.cmd +++ b/Clean.cmd @@ -1,5 +1,22 @@ @echo off +setlocal + +echo Cleaning Source... pushd Source call Clean.cmd popd + +echo Cleaning Apps\core... +pushd Apps\core +del /q *.* +popd + +echo Cleaning Apps\crossdev... +pushd Apps\crossdev +call Clean.bat +popd + +choice /m "Clean Output directory?" +if errorlevel 2 goto :eof +echo Cleaning Output... if exist Output\*.* del Output\*.* /Q \ No newline at end of file diff --git a/ReadMe.txt b/ReadMe.txt index 86ceab92..e6b3d546 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -8,8 +8,8 @@ Builders: Wayne Warthen (wwarthen@gmail.com) Douglas Goodall (douglas_goodall@mac.com) David Giles (vk5dg@internode.on.net) -Updated: 2013-04-07 -Version: 2.5 Beta 5 +Updated: 2013-04-28 +Version: 2.5 Beta 7 This is an adaptation of CP/M-80 2.2 and ZSDOS/ZCPR targeting ROMs for all N8VEM Z80 hardware variations diff --git a/RomDsk/CPM_1024KB/ZDE40.COM b/RomDsk/CPM_1024KB/ZDE40.COM new file mode 100644 index 0000000000000000000000000000000000000000..6a2d37dee3350010df364e9ca1e7cccc61be7c44 GIT binary patch literal 16896 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 Zx%h1LrVc_oe`n)IvvbR*{2$uV{wMiPr_}%e literal 0 HcmV?d00001 diff --git a/RomDsk/CPM_512KB/ZDE40.COM b/RomDsk/CPM_512KB/ZDE40.COM new file mode 100644 index 0000000000000000000000000000000000000000..6a2d37dee3350010df364e9ca1e7cccc61be7c44 GIT binary patch literal 16896 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 Zx%h1LrVc_oe`n)IvvbR*{2$uV{wMiPr_}%e literal 0 HcmV?d00001 diff --git a/RomDsk/ZSYS_1024KB/ZDE40.COM b/RomDsk/ZSYS_1024KB/ZDE40.COM new file mode 100644 index 0000000000000000000000000000000000000000..6a2d37dee3350010df364e9ca1e7cccc61be7c44 GIT binary patch literal 16896 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 Zx%h1LrVc_oe`n)IvvbR*{2$uV{wMiPr_}%e literal 0 HcmV?d00001 diff --git a/Source/cbios.asm b/Source/cbios.asm index 2a419d7f..0f4d6a95 100644 --- a/Source/cbios.asm +++ b/Source/cbios.asm @@ -3,6 +3,7 @@ ; CBIOS FOR N8VEM ; ; BY ANDREW LYNCH, WITH INPUT FROM MANY SOURCES +; ROMWBW ADAPTATION BY WAYNE WARTHEN ;__________________________________________________________________________________________________ ; ; cbios.asm 6/04/2012 dwg - added BOOTLU @@ -25,7 +26,7 @@ ;================================================================================================== ; These jumps are defined in the CP/M-80 v2.2 system guide and comprise ; the invariant part of the BIOS. - +; JP BOOT ; #0 - COLD START WBOOTE JP WBOOT ; #1 - WARM START JP CONST ; #2 - CONSOLE STATUS @@ -33,7 +34,7 @@ WBOOTE JP WBOOT ; #1 - WARM START JP CONOUT ; #4 - CONSOLE CHARACTER OUT JP LIST ; #5 - LIST CHARACTER OUT JP PUNCH ; #6 - PUNCH CHARACTER OUT - JP READER ; #7 - READER CHARACTER OUT + JP READER ; #7 - READER CHARACTER OUT JP HOME ; #8 - MOVE HEAD TO HOME POSITION JP SELDSK ; #9 - SELECT DISK JP SETTRK ; #10 - SET TRACK NUMBER @@ -43,20 +44,24 @@ WBOOTE JP WBOOT ; #1 - WARM START JP WRITE ; #14 - WRITE DISK JP LISTST ; #15 - RETURN LIST STATUS JP SECTRN ; #16 - SECTOR TRANSLATE +; ;------------------------------------------------------------------------ ; These jumps are enhancements, added for the benefit of the RomWBW BIOS ; and are located following the invariant jump table so they can be ; easily located by external programs. They transfger control to routines ; that are located somewhere within the main section of the CBIOS. - +; JP BNKSEL ; #17 - SEL. RAM BANK FOR LOW32K (obsolete, use HBIOS) JP GETDSK ; #18 - Get Disk Info (device/unit/lu) JP SETDSK ; #19 - Set Disk Into (device/unit/lu) JP GETINFO ; #20 - Get BIOS Info Base Ptr +; +;------------------------------------------------------------------------ ; Expansion area for future enhancements - In order not to shift the ; subsequent data and break local and external code, space is set aside for ; four additional jumps. Until implemented, an invocation will result in ; a system panic. +; CALL PANIC ; #21 - reserved for JP CALL PANIC ; #22 - reserved for JP CALL PANIC ; #23 - reserved for JP @@ -99,18 +104,18 @@ BOOT: WBOOT: DI IM 1 - +; LD SP,ISTACK ; STACK FOR INITIALIZATION - +; ; RELOAD COMMAND PROCESSOR FROM CACHE - LD A,1 - CALL RAMPG - LD HL,0800H ; LOCATION IN RAM1 OF COMMAND PROCESSOR CACHE + LD A,1 ; SELECT RAM BANK 1 + CALL RAMPG ; DO IT + LD HL,0800H ; LOCATION IN RAM BANK 1 OF COMMAND PROCESSOR CACHE LD DE,CPM_LOC ; LOCATION OF ACTIVE COMMAND PROCESSOR LD BC,CCPSIZ ; SIZE OF COMMAND PROCESSOR - LDIR - CALL RAMPGZ - + LDIR ; COPY + CALL RAMPGZ ; RESTORE RAM PAGE 0 +; ; FALL THRU TO INVOKE CP/M ; ;__________________________________________________________________________________________________ @@ -120,13 +125,13 @@ GOCPM: LD (BUFADR),HL LD B,BF_DIOSETBUF RST 08 - +; LD A,0C3H ; LOAD A WITH 'JP' INSTRUCTION (USED BELOW) - +; ; CPU RESET / RST 0 -> WARM START CP/M - LD (0000H),A - LD HL,WBOOTE - LD (0001H),HL + LD ($0000),A ; JP OPCODE GOES HERE + LD HL,WBOOTE ; GET WARM BOOT ENTRY ADDRESS + LD ($0001),HL ; PUT IT AT $0001 ; ; INT / RST 38 -> INVOKE MONITOR ; LD (0038H),A @@ -139,16 +144,16 @@ GOCPM: ; LD (0039H),HL ; POKE IT ; CALL 5 -> INVOKE BDOS - LD (0005H),A - LD HL,BDOS - LD (0006H),HL + LD (0005H),A ; JP OPCODE AT $0005 + LD HL,BDOS ; GET BDOS ENTRY ADDRESS + LD (0006H),HL ; PUT IT AT $0006 ; RESET (DE)BLOCKING ALGORITHM CALL BLKRES ; DEFAULT DMA ADDRESS - LD BC,80H - CALL SETDMA + LD BC,80H ; DEFAULT DMA ADDRESS IS $0080 + CALL SETDMA ; SET IT ; ENSURE VALID DISK AND JUMP TO CCP LD A,(CDISK) ; GET CURRENT USER/DISK @@ -157,12 +162,12 @@ GOCPM: CALL DSK_STATUS ; CHECK DISK STATUS JR Z,CURDSK ; ZERO MEANS OK LD A,(DEFDRIVE) ; CURRENT DRIVE NOT READY, USE DEFAULT - JR GOCCP + JR GOCCP ; JUMP TO COMMAND PROCESSOR CURDSK: LD A,(CDISK) ; GET CURRENT USER/DISK GOCCP: LD C,A ; SETUP C WITH CURRENT USER/DISK, ASSUME IT IS OK - JP CCP + JP CCP ; JUMP TO COMMAND PROCESSOR ; ;__________________________________________________________________________________________________ GOMON: @@ -310,7 +315,7 @@ CIOST: ; OR A ; SET FLAGS RET Z ; NO CHARACTERS WAITING (IST) OR OUTPUT BUF FULL (OST) - OR 0FFH ; $FF SIGNALS READY TO READ (IST) OR WRITE (OST) + OR $FF ; $FF SIGNALS READY TO READ (IST) OR WRITE (OST) RET ;__________________________________________________________________________________________________ SELDSK: @@ -318,6 +323,7 @@ SELDSK: #IF DSKTRACE CALL PRTSELDSK ; *DEBUG* #ENDIF +; JP DSK_SELECT ; ;__________________________________________________________________________________________________ @@ -326,12 +332,12 @@ HOME: #IF DSKTRACE CALL PRTHOME ; *DEBUG* #ENDIF - +; LD A,(HSTWRT) ; CHECK FOR PENDING WRITE - OR A - JR NZ,HOMED + OR A ; SET FLAGS + JR NZ,HOMED ; BUFFER IS DIRTY LD (HSTACT),A ; CLEAR HOST ACTIVE FLAG - +; HOMED: LD BC,0 ; @@ -568,9 +574,9 @@ BLKFLSH: #IF WRTCACHE -WRT_ALL .EQU 0 ; WRITE TO ALLOCATED +WRT_ALC .EQU 0 ; WRITE TO ALLOCATED WRT_DIR .EQU 1 ; WRITE TO DIRECTORY -WRT_UAL .EQU 2 ; WRITE TO UNALLOCATED +WRT_UNA .EQU 2 ; WRITE TO UNALLOCATED ; ;__________________________________________________________________________________________________ @@ -589,7 +595,7 @@ BLKRW: ; OTHERWISE, CLEAR OUT ANY SEQUENTIAL, UNALLOC WRITE PROCESSING ; AND GO DIRECTLY TO MAIN I/O XOR A ; ZERO TO A - LD (WRTYPE),A ; SET WRITE TYPE = 0 (WRT_ALL) TO ENSURE READ OCCURS + LD (WRTYPE),A ; SET WRITE TYPE = 0 (WRT_ALC) TO ENSURE READ OCCURS LD (UNACNT),A ; SET UNACNT TO ABORT SEQ WRITE PROCESSING JR BLKRW4 ; GO TO I/O @@ -598,25 +604,25 @@ BLKRW1: ; WRITE PROCESSING ; CHECK FOR FIRST WRITE TO UNALLOCATED BLOCK LD A,(WRTYPE) ; GET WRITE TYPE - CP WRT_UAL ; IS IT WRITE TO UNALLOC? + CP WRT_UNA ; IS IT WRITE TO UNALLOC? JR NZ,BLKRW2 ; NOPE, BYPASS ; INITIALIZE START OF SEQUENTIAL WRITING TO UNALLOCATED BLOCK ; AND THEN TREAT SUBSEQUENT PROCESSING AS A NORMAL WRITE CALL UNA_INI ; INITIALIZE SEQUENTIAL WRITE TRACKING - XOR A ; A = 0 = WRT_ALL + XOR A ; A = 0 = WRT_ALC LD (WRTYPE),A ; NOW TREAT LIKE WRITE TO ALLOCATED BLKRW2: - ; IF WRTYPE = WRT_ALL AND SEQ WRITE, GOTO BLKRW7 (SKIP READ) + ; IF WRTYPE = WRT_ALC AND SEQ WRITE, GOTO BLKRW7 (SKIP READ) OR A ; NOTE: A WILL ALREADY HAVE THE WRITE TYPE HERE - JR NZ,BLKRW3 ; NOT TYPE = 0 = WRT_ALL, SO MOVE ON + JR NZ,BLKRW3 ; NOT TYPE = 0 = WRT_ALC, SO MOVE ON CALL UNA_CHK ; CHECK FOR CONTINUATION OF SEQ WRITES TO UNALLOCATED BLOCK JR NZ,BLKRW3 ; NOPE, ABORT ; WE MATCHED EVERYTHING, TREAT AS WRITE TO UNALLOCATED BLOCK - LD A,WRT_UAL ; WRITE TO UNALLOCATED + LD A,WRT_UNA ; WRITE TO UNALLOCATED LD (WRTYPE),A ; SAVE WRITE TYPE CALL UNA_INC ; INCREMENT SEQUENTIAL WRITE TRACKING @@ -857,11 +863,11 @@ BLK_CMP: BLK_CMPLOOP: LD A,(DE) CP (HL) - RET NZ ; BAD COMPARE, RETURN WITH NZ + RET NZ ; BAD COMPARE, RETURN WITH NZ INC HL INC DE DJNZ BLK_CMPLOOP - RET ; RETURN WITH Z + RET ; RETURN WITH Z ; ;__________________________________________________________________________________________________ ; @@ -993,7 +999,7 @@ DSK_DISP: RST 08 ; OTHERWISE, HANDLE IN HBIOS RET ; AND RETURN ; -; LOOKUP DPH BASED ON DPM DRIVE NUMBER +; LOOKUP DPH BASED ON CPM DRIVE NUMBER ; ENTER WITH C=CPM DRIVE NUMBER ; RETURNS WITH HL = DPH ADDRESS (0 ON ERROR) ; A=0 ON SUCCESS, A=1 ON ERROR @@ -1132,7 +1138,7 @@ DSK_SELECT4: ; ; DSK_STATUS: - ; C HAS CPM DRIVE, LOOKUP DEVICE/UNIT AND CHECK FOR INVLAID DRIVE + ; C HAS CPM DRIVE, LOOKUP DEVICE/UNIT AND CHECK FOR INVALID DRIVE CALL DSK_GETDPH ; B = DEVICE/UNIT RET NZ ; INVALID DRIVE ERROR diff --git a/Source/config_n8_2312.asm b/Source/config_n8_2312.asm index ff89bb0b..d1130488 100644 --- a/Source/config_n8_2312.asm +++ b/Source/config_n8_2312.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8 2312 ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_N8V ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_ANSI ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_N8V ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8_2511.asm b/Source/config_n8_2511.asm index 4df5fade..34294352 100644 --- a/Source/config_n8_2511.asm +++ b/Source/config_n8_2511.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8 2511 ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_N8V ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_ANSI ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_N8V ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_cvdu.asm b/Source/config_n8vem_cvdu.asm index 1c9a53e9..97759105 100644 --- a/Source/config_n8vem_cvdu.asm +++ b/Source/config_n8vem_cvdu.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ VDU 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ COLOR VDU ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_CVDU ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_ANSI ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_CVDU ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_dide.asm b/Source/config_n8vem_dide.asm index 346ecf10..f93ead00 100644 --- a/Source/config_n8vem_dide.asm +++ b/Source/config_n8vem_dide.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ DUAL IDE + FLOPPY ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_diskio.asm b/Source/config_n8vem_diskio.asm index daad8e37..ecdcc70b 100644 --- a/Source/config_n8vem_diskio.asm +++ b/Source/config_n8vem_diskio.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8VEM W/ DISKIO (ORIGINAL V1) ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_diskio3.asm b/Source/config_n8vem_diskio3.asm index 55163120..0d0f82d8 100644 --- a/Source/config_n8vem_diskio3.asm +++ b/Source/config_n8vem_diskio3.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ DISKIO V3 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ DISKIO V3 ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_dsd.asm b/Source/config_n8vem_dsd.asm index a77503a8..c76f5a16 100644 --- a/Source/config_n8vem_dsd.asm +++ b/Source/config_n8vem_dsd.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ DUAL SD ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_ppide.asm b/Source/config_n8vem_ppide.asm index 36ee2d3c..85921da5 100644 --- a/Source/config_n8vem_ppide.asm +++ b/Source/config_n8vem_ppide.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ PPIDE 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ PPIDE ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_ppisd.asm b/Source/config_n8vem_ppisd.asm index 43054fa7..d8eb3447 100644 --- a/Source/config_n8vem_ppisd.asm +++ b/Source/config_n8vem_ppisd.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ PPISD ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_propio.asm b/Source/config_n8vem_propio.asm index 5c90bed6..9500e252 100644 --- a/Source/config_n8vem_propio.asm +++ b/Source/config_n8vem_propio.asm @@ -1,16 +1,17 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ PROP IO ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_PRPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_PRPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU CIODEV_UART ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) + ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_simh.asm b/Source/config_n8vem_simh.asm index 656e1fe5..d7b5fb61 100644 --- a/Source/config_n8vem_simh.asm +++ b/Source/config_n8vem_simh.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR SIMH EMULATOR 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR SIMH EMULATOR ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_ALWAYS ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_std.asm b/Source/config_n8vem_std.asm index c48ee10c..0feea581 100644 --- a/Source/config_n8vem_std.asm +++ b/Source/config_n8vem_std.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_n8vem_vdu.asm b/Source/config_n8vem_vdu.asm index a4ccd6a5..2bdeadd8 100644 --- a/Source/config_n8vem_vdu.asm +++ b/Source/config_n8vem_vdu.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ VDU 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR N8VEM SBC W/ VDU ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_VDU ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_ANSI ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_VDU ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_zeta_ppp.asm b/Source/config_zeta_ppp.asm index c393bdda..af654903 100644 --- a/Source/config_zeta_ppp.asm +++ b/Source/config_zeta_ppp.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR ZETA W/ PPP 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR ZETA W/ PARPORTPROP ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_PPPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_PPPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU CIODEV_UART ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/config_zeta_std.asm b/Source/config_zeta_std.asm index e17efafb..06f37db6 100644 --- a/Source/config_zeta_std.asm +++ b/Source/config_zeta_std.asm @@ -1,16 +1,16 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR ZETA 5/8/2012 +; ROMWBW 2.X CONFIGURATION FOR ZETA ;================================================================================================== ; ; BUILD CONFIGURATION OPTIONS ; CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS ; -DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON +DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, DIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED) -DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V) -DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...) +DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220) +DEFEMU .EQU EMUTYP_TTY ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA) diff --git a/Source/cvdu.asm b/Source/cvdu.asm index 6a24057a..d02067c3 100644 --- a/Source/cvdu.asm +++ b/Source/cvdu.asm @@ -31,7 +31,10 @@ CVDU_INIT: LD A,CVDU_STAT CALL PRTHEXBYTE ; + PRTS(" VDURAM=$") CALL CVDU_CRTINIT ; SETUP THE CVDU CHIP REGISTERS + CALL PRTDEC + PRTS("KB$") CALL CVDU_LOADFONT ; LOAD FONT DATA FROM ROM TO CVDU STRORAGE CVDU_RESET: @@ -278,6 +281,46 @@ CVDU_CRTINIT1: INC HL ; POINT TO NEXT VALUE INC C ; POINT TO NEXT REGISTER DJNZ CVDU_CRTINIT1 ; LOOP +; +; NOW DETERMINE VDU RAM SIZE DYNAMICALLY +; ASSUMES THAT VDU RAM SIZE IS SET FOR 64KB ABOVE +; A. WRITE ZERO TO ADDRESS $0000 +; B. WRITE NON-ZERO TO ADDRESS $0100 +; C. CHECK THE VALUE IN ADDRESS $0000; IF IT CHANGED, +; 16K DRAM CHIPS INSTALLED; IF NOT, 64K DRAM CHIPS INSTALLED +; IF 16KB RAM DETECTED, ADJUST VDU REGISTERS APPROPRIATELY +; + ; WRITE $00 TO VDU RAM LOCATION $0000 + LD HL,$0000 ; POINT TO VDU RAM LOC $0000 + LD C,18 ; UPDATE ADDRESS REGISTER PAIR + CALL CVDU_WRX ; DO IT + XOR A ; ZERO IN ACCUM + LD C,31 ; DATA REGISTER + CALL CVDU_WR ; WRITE ZERO TO $0000 + ; WRITE $FF TO VDU RAM LOCATION $0100 + LD HL,$0100 ; POINT TO VDU RAM LOC $0100 + LD C,18 ; UPDATE ADDRESS REGISTER PAIR + CALL CVDU_WRX ; DO IT + LD A,$FF ; $FF IN ACCUM + LD C,31 ; DATA REGISTER + CALL CVDU_WR ; WRITE ZERO TO $0100 + ; READ VALUE FROM VDU RAM LOCATION $0000 + LD HL,$0000 ; POINT TO VDU RAM LOC $0000 + LD C,18 ; UPDATE ADDRESS REGISTER PAIR + CALL CVDU_WRX ; DO IT + LD C,31 ; DATA REGISTER + CALL CVDU_RD ; READ VALUE AT $0000 + ; CHECK VALUE, IF NOT $00, ADJUST RAM SIZE + OR A ; SET FLAGS + JR NZ,CVDU_CRTINIT2 ; IF NOT ZERO, ADJUST RAM SIZE + LD HL,64 ; RETURN RAMSIZE IN HL + RET ; 64K CHIPS USED, ALL DONE +; +CVDU_CRTINIT2: ; ADJUST FOR 16K RAM SIZE + LD A,$20 ; NEW VALUE + LD C,28 ; FOR REG 28 + CALL CVDU_WR ; DO IT + LD HL,16 ; RETURN RAMSIZE IN HL RET ; ;---------------------------------------------------------------------- diff --git a/Source/fd.asm b/Source/fd.asm index cbac6890..606f2808 100644 --- a/Source/fd.asm +++ b/Source/fd.asm @@ -1094,6 +1094,10 @@ FOP_CMD2: ; START OF LOOP TO SEND NEXT BYTE FOP_CMD4: ; START OF STATUS LOOP, WAIT FOR FDC TO BE READY FOR BYTE CALL DELAY ; FDC MAY TAKE UP TO 12us TO UPDATE MSR IN A,(FDC_MSR) ; READ MAIN STATUS REGISTER +; PUSH AF ; *DEBUG* +; CALL PC_SPACE ; *DEBUG* +; CALL PRTHEXBYTE ; *DEBUG* +; POP AF ; *DEBUG* AND 0C0H ; ISOLATE RQM/DIO CP 080H ; LOOKING FOR RQM=1, DIO=0 (FDC READY FOR A BYTE) JR Z,FOP_CMD6 ; GOOD, GO TO SEND BYTE diff --git a/Source/hbios.asm b/Source/hbios.asm index 32c10351..f097ec3f 100644 --- a/Source/hbios.asm +++ b/Source/hbios.asm @@ -67,18 +67,6 @@ INITSYS2: PUSH DE PUSH BC CALL JPHL -; OR A -; JR Z,INITSYS3 -; PUSH AF -; CALL PC_SPACE -; POP AF -; CALL PC_LBKT -; CALL PRTHEXBYTE -; CALL PC_RBKT -; JR INITSYS4 -;INITSYS3: -; PRTS(" [OK]$") -;INITSYS4: POP BC POP DE DJNZ INITSYS2 @@ -177,9 +165,17 @@ HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2) ;__________________________________________________________________________________________________ ; IDLE: + PUSH AF + PUSH BC + PUSH DE + PUSH HL #IF (FDENABLE) CALL FD_IDLE #ENDIF + POP HL + POP DE + POP BC + POP AF RET ; ;================================================================================================== @@ -450,10 +446,16 @@ EMU_QRY: ; IS DYNAMICALLY MODIFIED TO POINT TO THE VDA DISPATCHER FOR THE ; CURRENT EMULATION VDA TARGET. ; +; VDA_DISPERR IS FAILSAFE EMULATION DISPATCH ADDRESS WHICH JUST +; CHAINS TO SYSTEM PANIC +; +VDA_DISPERR: + JP PANIC +; ; BELOW IS USED TO INITIALIZE THE EMULATION VDA DISPATCH TARGET ; BASED ON THE DEFAULT VDA. ; -VDA_DISPADR .EQU 0 +VDA_DISPADR .EQU VDA_DISPERR #IF (VDUENABLE & (DEFVDA == VDADEV_VDU)) VDA_DISPADR .SET VDU_DISPVDA #ENDIF @@ -474,10 +476,11 @@ VDA_DISPADR .SET N8V_DISPVDA ; THE CODE DYNAMICALLY WHEN EMULATION IS INITIALIZED AND ; A NEW VDA TARGET IS SPECIFIED. ; -EMU_VDADISPADR .EQU $ + 1 EMU_VDADISP: JP VDA_DISPADR ; +EMU_VDADISPADR .EQU $ - 2 ; ADDRESS PORTION OF JP INSTRUCTION ABOVE +; ;================================================================================================== ; VIDEO DISPLAY ADAPTER DEVICE DISPATCHER ;================================================================================================== @@ -567,7 +570,7 @@ SYS_BNKCPY: ; E: UPDATE VERION IN TOP 4 BITS, PATCH VERSION IN LOW 4 BITS ; SYS_GETVER: - LD DE,0 | (RMJ<<12) | (RMN<<8) | (RUP<<4) | RTP + LD DE,0 | (RMJ << 12) | (RMN << 8) | (RUP << 4) | RTP XOR A RET ; @@ -579,11 +582,13 @@ SYS_GETVER: ; AN IDLE CONDITION IS DETECTED (WAIT FOR INPUT/OUTPUT) ; CIO_IDLE: - LD HL,IDLECOUNT ; POINT TO IDLE COUNT - DEC (HL) ; 256 TIMES? - CALL Z,IDLE ; RUN IDLE PROCESS EVERY 256 ITERATIONS - XOR A ; SIGNAL NO CHAR READY - RET ; AND RETURN + PUSH AF ; PRESERVE AF + LD A,(IDLECOUNT) ; GET CURRENT IDLE COUNT + DEC A ; DECREMENT + LD (IDLECOUNT),A ; SAVE UPDATED VALUE + CALL Z,IDLE ; IF ZERO, DO IDLE PROCESSING + POP AF ; RECOVER AF + RET ; ;================================================================================================== ; DEVICE DRIVERS diff --git a/Source/kbd.asm b/Source/kbd.asm index a060cfbd..60d7c8b9 100644 --- a/Source/kbd.asm +++ b/Source/kbd.asm @@ -99,17 +99,8 @@ KBD_INIT: ;__________________________________________________________________________________________________ ; KBD_STAT: - LD A,(KBD_STATUS) ; GET STATUS - AND KBD_KEYRDY ; ISOLATE READY BIT - JR NZ,KBD_STAT3 ; KEY READY, DONE - -KBD_STAT2: - CALL Z,KBD_DECODE ; NOT READY, RUN THE DECODING ENGINE - LD A,(KBD_STATUS) ; GET STATUS - AND KBD_KEYRDY ; ISOLATE READ BIT - -KBD_STAT3: - RLCA ; ROTATE READY BIT TO LOW ORDER BIT + CALL KBD_DECODE ; CHECK THE KEYBOARD + JP Z,CIO_IDLE ; RET VIA IDLE PROCESSING IF NO KEY RET ; ;__________________________________________________________________________________________________ @@ -120,13 +111,9 @@ KBD_STAT3: ;__________________________________________________________________________________________________ ; KBD_READ: - LD A,(KBD_STATUS) ; GET STATUS - AND KBD_KEYRDY ; ISOLIATE KEY READY BIT - JR NZ,KBD_READ1 ; READY, GO GET THE KEY AND RETURN - CALL KBD_DECODE ; TRY TO GET A KEY - JR KBD_READ ; AND LOOP + CALL KBD_STAT ; KEY READY? + JR Z,KBD_READ ; NOT READY, KEEP TRYING ; -KBD_READ1: LD A,(KBD_STATE) ; GET STATE AND $01 ; ISOLATE EXTENDED SCANCODE BIT RRCA ; ROTATE IT TO HIGH ORDER BIT @@ -251,6 +238,15 @@ KBD_GETDATA1: RET ; ;__________________________________________________________________________________________________ +KBD_GETDATAX: +; +; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT +; + CALL KBD_IST ; GET INPUT REGISTER STATUS + RET Z ; NOTHING THERE, DONE + JR KBD_GETDATA1 ; GO GET IT +; +;__________________________________________________________________________________________________ ; RESET KEYBOARD ;__________________________________________________________________________________________________ ; @@ -417,10 +413,8 @@ KBD_DEC0: ; CHECK KEYCODE BUFFER RET NZ ; ABORT IF KEY IS ALREADY PENDING KBD_DEC1: ; PROCESS NEXT SCANCODE - CALL KBD_IST ; IS A SCANCODE WAITING? - RET Z ; NOPE, ABORT - CALL KBD_GETDATA ; GET THE SCANCODE - RET Z ; TIMEOUT, RETURN WITH A=0, Z SET + CALL KBD_GETDATAX ; GET THE SCANCODE + RET Z ; NO KEY READY, RETURN WITH A=0, Z SET LD (KBD_SCANCODE),A ; SAVE SCANCODE KBD_DEC2: ; DETECT AND HANDLE SPECIAL KEYCODES diff --git a/Source/n8v.asm b/Source/n8v.asm index aa7ca778..20f1dcd1 100644 --- a/Source/n8v.asm +++ b/Source/n8v.asm @@ -6,8 +6,7 @@ ;====================================================================== ; ; TODO: -; - IMPLEMENT CONSTANTS FOR SCREEN DIMENSIONS -; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION +; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION? ; - IMPLEMENT ALTERNATE DISPLAY MODES? ; - IMPLEMENT DYNAMIC READ/WRITE OF CHARACTER BITMAP DATA? ; @@ -21,6 +20,12 @@ N8V_DATREG .EQU N8_BASE + $18 ; READ/WRITE DATA N8V_ROWS .EQU 24 N8V_COLS .EQU 40 ; +; BELOW WAS TUNED FOR N8 AT 18MHZ WITH 3 IO WAIT STATES +; WILL NEED TO BE MODIFIED FOR DIFFERENT ACCESS SPEEDS +; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! +; +#DEFINE N8V_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP +; ;====================================================================== ; N8V DRIVER - INITIALIZATION ;====================================================================== @@ -41,6 +46,10 @@ N8V_RESET: CALL N8V_FILL ; DO IT LD DE,0 ; ROW = 0, COL = 0 CALL N8V_XY ; SEND CURSOR TO TOP LEFT + XOR A + DEC A + LD (N8V_CURSAV),A + CALL N8V_SETCUR ; SET CURSOR XOR A ; SIGNAL SUCCESS RET @@ -130,7 +139,9 @@ N8V_VDASCS: CALL PANIC ; NOT IMPLEMENTED (YET) N8V_VDASCP: + CALL N8V_CLRCUR CALL N8V_XY ; SET CURSOR POSITION + CALL N8V_SETCUR XOR A ; SIGNAL SUCCESS RET @@ -143,42 +154,56 @@ N8V_VDASCO: RET N8V_VDAWRC: + CALL N8V_CLRCUR ; CURSOR OFF LD A,E ; CHARACTER TO WRITE GOES IN A CALL N8V_PUTCHAR ; PUT IT ON THE SCREEN + CALL N8V_SETCUR XOR A ; SIGNAL SUCCESS RET N8V_VDAFIL: + CALL N8V_CLRCUR LD A,E ; FILL CHARACTER GOES IN A EX DE,HL ; FILL LENGTH GOES IN DE CALL N8V_FILL ; DO THE FILL + CALL N8V_SETCUR XOR A ; SIGNAL SUCCESS RET N8V_VDACPY: + CALL N8V_CLRCUR ; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS N8V_POS ; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT PUSH HL ; SAVE LENGTH CALL N8V_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL POP BC ; RECOVER LENGTH IN BC LD DE,(N8V_POS) ; PUT DEST IN DE - JP N8V_BLKCPY ; DO A BLOCK COPY + CALL N8V_BLKCPY ; DO A BLOCK COPY + CALL N8V_SETCUR + XOR A + RET N8V_VDASCR: + CALL N8V_CLRCUR +N8V_VDASCR0: LD A,E ; LOAD E INTO A OR A ; SET FLAGS - RET Z ; IF ZERO, WE ARE DONE + JR Z,N8V_VDASCR2 ; IF ZERO, WE ARE DONE PUSH DE ; SAVE E JP M,N8V_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL CALL N8V_SCROLL ; SCROLL FORWARD ONE LINE POP DE ; RECOVER E DEC E ; DECREMENT IT - JR N8V_VDASCR ; LOOP + JR N8V_VDASCR0 ; LOOP N8V_VDASCR1: CALL N8V_RSCROLL ; SCROLL REVERSE ONE LINE POP DE ; RECOVER E INC E ; INCREMENT IT - JR N8V_VDASCR ; LOOP + JR N8V_VDASCR0 ; LOOP +N8V_VDASCR2: + CALL N8V_SETCUR + XOR A + RET ; ;====================================================================== ; N8V DRIVER - PRIVATE DRIVER FUNCTIONS @@ -191,11 +216,11 @@ N8V_VDASCR1: ; N8V_SET: OUT (N8V_CMDREG),A ; WRITE IT - NOP + N8V_IODELAY LD A,C ; GET THE DESIRED REGISTER OR $80 ; SET BIT 7 OUT (N8V_CMDREG),A ; SELECT THE DESIRED REGISTER - NOP + N8V_IODELAY RET ; ;---------------------------------------------------------------------- @@ -214,10 +239,10 @@ N8V_WR: N8V_RD: LD A,L OUT (N8V_CMDREG),A - NOP + N8V_IODELAY LD A,H OUT (N8V_CMDREG),A - NOP + N8V_IODELAY RET ; ;---------------------------------------------------------------------- @@ -285,6 +310,89 @@ N8V_LOADFONT3: RET ; ;---------------------------------------------------------------------- +; VIRTUAL CURSOR MANAGEMENT +; N8V_SETCUR CONFIGURES AND DISPLAYS CURSOR AT CURRENT CURSOR LOCATION +; N8V_CLRCUR REMOVES THE CURSOR +; +; VIRTUAL CURSOR IS GENERATED BY DYNAMICALLY CHANGING FONT GLYPH +; FOR CHAR 255 TO BE THE INVERSE OF THE GLYPH OF THE CHARACTER UNDER +; THE CURRENT CURSOR POSITION. THE CHARACTER CODE IS THEN SWITCH TO +; THE VALUE 255 AND THE ORIGINAL VALUE IS SAVED. WHEN THE DISPLAY +; NEEDS TO BE CHANGED THE PROCESS IS UNDONE. IT IS ESSENTIAL THAT +; ALL DISPLAY CHANGES BE BRACKETED WITH CALLS TO N8V_CLRCUR PRIOR TO +; CHANGES AND N8V_SETCUR AFTER CHANGES. +;---------------------------------------------------------------------- +; +N8V_SETCUR: + PUSH HL ; PRESERVE HL + PUSH DE ; PRESERVE DE + LD HL,(N8V_POS) ; GET CURSOR POSITION + CALL N8V_RD ; SETUP TO READ VDU BUF + IN A,(N8V_DATREG) ; GET REAL CHAR UNDER CURSOR + N8V_IODELAY ; DELAY + PUSH AF ; SAVE THE CHARACTER + CALL N8V_WR ; SETUP TO WRITE TO THE SAME PLACE + LD A,$FF ; REPLACE REAL CHAR WITH 255 + OUT (N8V_DATREG),A ; DO IT + N8V_IODELAY ; DELAY + POP AF ; RECOVER THE REAL CHARACTER + LD B,A ; PUT IT IN B + LD A,(N8V_CURSAV) ; GET THE CURRENTLY SAVED CHAR + CP B ; COMPARE TO CURRENT + JR Z,N8V_SETCUR3 ; IF EQUAL, BYPASS EXTRA WORK + LD A,B ; GET REAL CHAR BACK TO A + LD (N8V_CURSAV),A ; SAVE IT + ; GET THE GLYPH DATA FOR REAL CHARACTER + LD HL,0 ; ZERO HL + LD L,A ; HL IS NOW RAW CHAR INDEX + LD B,3 ; LEFT SHIFT BY 3 BITS +N8V_SETCUR0: ; MULT BY 8 FOR FONT INDEX + SLA L ; SHIFT LSB INTO CARRY + RL H ; SHFT MSB FROM CARRY + DJNZ N8V_SETCUR0 ; LOOP 3 TIMES + LD DE,$800 ; OFFSET TO START OF FONT TABLE + ADD HL,DE ; ADD TO FONT INDEX + CALL N8V_RD ; SETUP TO READ GLYPH + LD B,8 ; 8 BYTES + LD HL,N8V_BUF ; INTO BUFFER +N8V_SETCUR1: ; READ GLYPH LOOP + IN A,(N8V_DATREG) ; GET NEXT BYTE + N8V_IODELAY ; IO DELAY + LD (HL),A ; SAVE VALUE IN BUF + INC HL ; BUMP BUF POINTER + DJNZ N8V_SETCUR1 ; LOOP FOR 8 BYTES +; + ; NOW WRITE INVERTED GLYPH INTO FONT INDEX 255 + LD HL,$800 + (255 * 8) ; LOC OF GLPYPH DATA FOR CHAR 255 + CALL N8V_WR ; SETUP TO WRITE THE INVERTED GLYPH + LD B,8 ; 8 BYTES PER GLYPH + LD HL,N8V_BUF ; POINT TO BUFFER +N8V_SETCUR2: ; WRITE INVERTED GLYPH LOOP + LD A,(HL) ; GET THE BYTE + INC HL ; BUMP THE BUF POINTER + XOR $FF ; INVERT THE VALUE + OUT (N8V_DATREG),A ; WRITE IT TO VDU + N8V_IODELAY ; IO DELAY + DJNZ N8V_SETCUR2 ; LOOP FOR ALL 8 BYTES OF GLYPH +; +N8V_SETCUR3: ; RESTORE REGISTERS AND RETURN + POP DE ; RECOVER DE + POP HL ; RECOVER HL + RET ; RETURN +; +; +; +N8V_CLRCUR: ; REMOVE VIRTUAL CURSOR FROM SCREEN + PUSH HL ; SAVE HL + LD HL,(N8V_POS) ; POINT TO CURRENT CURSOR POS + CALL N8V_WR ; SET UP TO WRITE TO VDU + LD A,(N8V_CURSAV) ; GET THE REAL CHARACTER + OUT (N8V_DATREG),A ; WRITE IT + N8V_IODELAY ; IO DELAY + POP HL ; RECOVER HL + RET ; RETURN +; +;---------------------------------------------------------------------- ; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E ;---------------------------------------------------------------------- ; @@ -337,7 +445,7 @@ N8V_FILL: N8V_FILL1: LD A,C ; RECOVER CHARACTER TO WRITE OUT (N8V_DATREG),A - NOP \ NOP + N8V_IODELAY DEC DE LD A,D OR E @@ -362,7 +470,7 @@ N8V_SCROLL0: ; READ LINE THAT IS ONE PAST CURRENT DESTINATION LD B,N8V_COLS N8V_SCROLL1: IN A,(N8V_DATREG) - NOP \ NOP + N8V_IODELAY LD (DE),A INC DE DJNZ N8V_SCROLL1 @@ -375,7 +483,7 @@ N8V_SCROLL1: N8V_SCROLL2: LD A,(DE) OUT (N8V_DATREG),A - NOP \ NOP + N8V_IODELAY INC DE DJNZ N8V_SCROLL2 ; @@ -391,7 +499,7 @@ N8V_SCROLL2: LD B,N8V_COLS N8V_SCROLL3: OUT (N8V_DATREG),A - NOP \ NOP \ NOP \ NOP + N8V_IODELAY DJNZ N8V_SCROLL3 ; RET @@ -413,7 +521,7 @@ N8V_RSCROLL0: ; READ THE LINE THAT IS ONE PRIOR TO CURRENT DESTINATION LD B,N8V_COLS ; LOOP FOR EACH COLUMN N8V_RSCROLL1: IN A,(N8V_DATREG) ; GET THE CHAR - NOP \ NOP ; RECOVER + N8V_IODELAY ; RECOVER LD (DE),A ; SAVE IN BUFFER INC DE ; BUMP BUFFER POINTER DJNZ N8V_RSCROLL1 ; LOOP THRU ALL COLS @@ -426,7 +534,7 @@ N8V_RSCROLL1: N8V_RSCROLL2: LD A,(DE) ; LOAD THE CHAR OUT (N8V_DATREG),A ; WRITE TO SCREEN - NOP \ NOP ; DELAY + N8V_IODELAY ; DELAY INC DE ; BUMP BUF POINTER DJNZ N8V_RSCROLL2 ; LOOP THRU ALL COLS ; @@ -442,7 +550,7 @@ N8V_RSCROLL2: LD B,N8V_COLS N8V_RSCROLL3: OUT (N8V_DATREG),A - NOP \ NOP \ NOP \ NOP + N8V_IODELAY DJNZ N8V_RSCROLL3 ; RET @@ -463,7 +571,7 @@ N8V_BLKCPY1: LD B,C N8V_BLKCPY2: IN A,(N8V_DATREG) ; GET THE NEXT BYTE - NOP \ NOP ; DELAY + N8V_IODELAY ; DELAY LD (DE),A ; SAVE IN BUFFER INC DE ; BUMP BUF PTR DJNZ N8V_BLKCPY2 ; LOOP AS NEEDED @@ -477,7 +585,7 @@ N8V_BLKCPY2: N8V_BLKCPY3: LD A,(DE) ; GET THE CHAR FROM BUFFER OUT (N8V_DATREG),A ; WRITE TO VDU - NOP \ NOP ; DELAY + N8V_IODELAY ; DELAY INC DE ; BUMP BUF PTR DJNZ N8V_BLKCPY3 ; LOOP AS NEEDED ; @@ -488,7 +596,8 @@ N8V_BLKCPY3: ;================================================================================================== ; N8V_POS .DW 0 ; CURRENT DISPLAY POSITION -N8V_BUF .FILL 256,0 ; COPY BUFFER +N8V_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR +N8V_BUF .FILL 256,0 ; COPY BUFFER ; ;================================================================================================== ; N8V DRIVER - TMS9918 REGISTER INITIALIZATION diff --git a/Source/ppk.asm b/Source/ppk.asm index 64d6da5a..cd3764c7 100644 --- a/Source/ppk.asm +++ b/Source/ppk.asm @@ -93,28 +93,19 @@ PPK_INIT: ; ; CHECKING THE KEYBOARD REQUIRES "WAITING" FOR A KEY TO BE SENT AND USING A TIMEOUT ; TO DETECT THAT NO KEY IS READY. MANY APPS CALL STATUS REPEATEDLY. IN ORDER TO AVOID -; SLOWING THEM DOWN, WE IGNORE 1/256 OF THE CALLS. +; SLOWING THEM DOWN, WE IGNORE 255/256 OF THE CALLS. ; PPK_STAT: - LD A,(PPK_STATUS) ; GET STATUS - AND PPK_KEYRDY ; ISOLATE READY BIT - JR NZ,PPK_STAT3 ; KEY READY, DONE - -PPK_STAT1: LD A,(PPK_IDLE) ; GET IDLE COUNT DEC A ; DECREMENT IT LD (PPK_IDLE),A ; SAVE IT - JR Z,PPK_STAT2 ; ZERO? OK, DO A REAL KEY CHECK - XOR A ; RETURN KEY NOT READY - RET - -PPK_STAT2: - CALL Z,PPK_DECODE ; NOT READY, RUN THE DECODING ENGINE - LD A,(PPK_STATUS) ; GET STATUS - AND PPK_KEYRDY ; ISOLATE READ BIT - -PPK_STAT3: - RLCA ; ROTATE READY BIT TO LOW ORDER BIT + JR Z,PPK_STAT1 ; IF ZERO, DO REAL CHECK + XOR A ; SIGNAL NOTHING READY + JP CIO_IDLE ; RETURN VIA IDLE PROCESSING +; +PPK_STAT1: + CALL PPK_DECODE ; CHECK THE KEYBOARD + JP Z,CIO_IDLE ; RET VIA IDLE PROCESSING IF NO KEY RET ; ;__________________________________________________________________________________________________ @@ -125,14 +116,9 @@ PPK_STAT3: ;__________________________________________________________________________________________________ ; PPK_READ: -; CALL PPK_STAT ; CHECK TO SEE IF KEY READY - LD A,(PPK_STATUS) ; GET STATUS - AND PPK_KEYRDY ; ISOLIATE KEY READY BIT - JR NZ,PPK_READ1 ; READY, GO GET THE KEY AND RETURN - CALL PPK_DECODE ; TRY TO GET A KEY - JR PPK_READ ; AND LOOP + CALL PPK_STAT ; KEY READY? + JR Z,PPK_READ ; NOT READY, KEEP TRYING ; -PPK_READ1: LD A,(PPK_STATE) ; GET STATE AND $01 ; ISOLATE EXTENDED SCANCODE BIT RRCA ; ROTATE IT TO HIGH ORDER BIT @@ -205,6 +191,15 @@ PPK_GETDATA2: RET ; ;__________________________________________________________________________________________________ +PPK_GETDATAX: +; +; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT +; IN THE CASE OF PPK, THERE IS NO QUICK WAY TO CHECK FOR A KEY WAITING, +; SO WE JUST CHAIN TO GETDATA +; + JR PPK_GETDATA ; CHAIN TO GETDATA +; +;__________________________________________________________________________________________________ PPK_PUTDATA: ; ; PUT A RAW BYTE FROM A TO THE KEYBOARD INTERFACE @@ -519,8 +514,8 @@ PPK_DEC0: ; CHECK KEYCODE BUFFER RET NZ ; ABORT IF KEY IS ALREADY PENDING PPK_DEC1: ; PROCESS NEXT SCANCODE - CALL PPK_GETDATA ; GET THE SCANCODE - RET Z ; TIMEOUT, RETURN WITH A=0, Z SET + CALL PPK_GETDATAX ; GET THE SCANCODE + RET Z ; NO KEY READY, RETURN WITH A=0, Z SET LD (PPK_SCANCODE),A ; SAVE SCANCODE PPK_DEC2: ; DETECT AND HANDLE SPECIAL KEYCODES diff --git a/Source/prp.asm b/Source/prp.asm index 5abd7546..a4f3e11f 100644 --- a/Source/prp.asm +++ b/Source/prp.asm @@ -56,7 +56,8 @@ PRPCON_IST: AND PRPCON_KBDRDY | PRPCON_BUSY ; ISOLATE KBDRDY AND BUSY SUB PRPCON_KBDRDY ; KBD RDY BUT NOT BUSY? JR Z,PRPCON_IST1 ; YES, GO TO READY LOGIC - JP CIO_IDLE + XOR A ; SIGNAL NO CHARS WAITING + JP CIO_IDLE ; RETURN VIA IDLE PROCESSING PRPCON_IST1: DEC A ; SET A=$FF TO SIGNAL READY RET ; RETURN @@ -75,7 +76,8 @@ PRPCON_OST: AND PRPCON_DSPRDY | PRPCON_BUSY ; ISOLATE DSPRDY AND BUSY SUB PRPCON_DSPRDY ; DSP RDY BUT NOT BUSY? JR Z,PRPCON_OST1 ; YES, GO TO READY LOGIC - JP CIO_IDLE + XOR A ; SIGNAL NO CHARS WAITING + JP CIO_IDLE ; RETURN VIA IDLE PROCESSING PRPCON_OST1: DEC A ; SET A=$FF TO SIGNAL READY RET ; RETURN diff --git a/Source/uart.asm b/Source/uart.asm index 4768013b..832dfd36 100644 --- a/Source/uart.asm +++ b/Source/uart.asm @@ -105,8 +105,6 @@ UART_INIT: LD HL,BAUDRATE % 100 CALL PRTDEC - CALL PC_SPACE - LD A,80H OUT (SIO_LCR),A ; DLAB ON LD A,UART0_DIV diff --git a/Source/util.asm b/Source/util.asm index 83a487ee..611c5291 100644 --- a/Source/util.asm +++ b/Source/util.asm @@ -283,6 +283,8 @@ PANIC: RST 38 + HALT + JP 0 ; ;================================================================================================== diff --git a/Source/ver.inc b/Source/ver.inc index 98fc82e4..44e3da18 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -1,6 +1,6 @@ #DEFINE RMJ 2 #DEFINE RMN 5 #DEFINE RUP 0 -#DEFINE RTP 6 -#DEFINE BIOSVER "2.5 - Beta 6" +#DEFINE RTP 7 +#DEFINE BIOSVER "2.5 - Beta 7" #DEFINE REVISION 412