From 28af8903297c358fcb517a89c2c1c648f09c6e6d Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Tue, 3 Nov 2020 21:40:29 +0800 Subject: [PATCH 1/3] Update flashfs.asm optimization --- Source/HBIOS/flashfs.asm | 99 +++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 53 deletions(-) diff --git a/Source/HBIOS/flashfs.asm b/Source/HBIOS/flashfs.asm index b69b557e..9c93111c 100644 --- a/Source/HBIOS/flashfs.asm +++ b/Source/HBIOS/flashfs.asm @@ -178,9 +178,9 @@ FF_IINIT: PUSH IY ; PUT BANK AND SECTOR POP BC ; DATA IN BC ; - LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK -; + HB_DI CALL JPHL ; EXECUTE FF_IDENT + HB_EI ; LD HL,(FF_STACK) ; RESTORE ORIGINAL LD SP,HL ; STACK POSITION @@ -202,7 +202,6 @@ FF_IINIT: ;====================================================================== ; FF_IDENT: ; THIS CODE GETS RELOCATED TO THE STACK - HB_DI ; PUSH AF ; SAVE CURRENT BANK LD A,B ; SELECT BANK @@ -221,7 +220,6 @@ FF_IDENT: ; THIS CODE GETS RELOCATED TO THE STACK ; POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY - HB_EI ; RET ; @@ -260,9 +258,9 @@ FF_EINIT: PUSH IY ; PUT BANK AND SECTOR POP BC ; DATA IN BC ; - LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK -; + HB_DI CALL JPHL ; EXECUTE FF_ERASE + HB_EI ; LD HL,(FF_STACK) ; RESTORE ORIGINAL LD SP,HL ; STACK POSITION @@ -285,25 +283,23 @@ FF_EINIT: ;====================================================================== ; FF_ERASE: ; THIS CODE GETS RELOCATED TO THE STACK - HB_DI ; PUSH AF ; SAVE CURRENT BANK LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO PROGRAM ; - LD HL,$5555 - LD A,$AA ; LD A,$AA ; COMMAND - LD (HL),A ; LD ($5555),A ; SETUP + LD HL,$5555 ; LD A,$AA ; COMMAND + LD (HL),$AA ; LD ($5555),A ; SETUP LD A,L ; LD A,$55 LD ($2AAA),A ; LD ($2AAA),A - LD A,$80 ; LD A,$80 - LD (HL),A ; LD ($5555),A - LD A,$AA ; LD A,$AA - LD (HL),A ; LD ($5555),A - LD A,L ; LD A,$55 - LD ($2AAA),A ; LD ($2AAA),A - LD A,$10 ; LD A,$10 - LD (HL),A ; LD ($5555),A + LD (HL),$80 ; LD A,$80 + LD (HL),$AA ; LD ($5555),A + LD A,L ; LD A,$AA + LD ($2AAA),A ; LD ($5555),A + LD (HL),$10 ; LD A,$55 + ; LD ($2AAA),A + ; LD A,$10 + ; LD ($5555),A ; LD A,(HL) ; DO TWO SUCCESSIVE READS FROM THE SAME FLASH ADDRESS. FF_WT2: LD C,(HL) ; IF TOGGLE BIT (BIT 6) @@ -328,8 +324,6 @@ FF_WT1: LD C,0 ; SET SUCCESS STATUS FF_WT3: POP AF ; LD A,B ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY - HB_EI -; RET ; FF_E_SZ .EQU $-FF_ERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED @@ -340,6 +334,7 @@ FF_E_SZ .EQU $-FF_ERASE ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED ; ON ENTRY DE:HL CONTAINS 32 BIT MEMORY ADDRESS. ; ON EXIT I,B CONTAINS BANK SELECT BYTE ; Y,C CONTAINS HIGH BYTE OF SECTOR ADDRESS +; A CONTAINS CURRENT BANK HB_CURBNK ; ; DDDDDDDDEEEEEEEE HHHHHHHHLLLLLLLL ; 3322222222221111 1111110000000000 @@ -374,6 +369,8 @@ FF_CALCA: CALL PRTHEXWORD ; DISPLAY BANK AND CALL PC_SPACE ; SECTOR RESULT #ENDIF +; + LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK ; RET ; @@ -416,9 +413,9 @@ FF_SINIT: CALL PRTHEXWORD #ENDIF ; - LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK -; + HB_DI CALL JPHL ; CALL FF_SERASE + HB_EI ; LD HL,(FF_STACK) ; RESTORE ORIGINAL LD SP,HL ; STACK POSITION @@ -431,7 +428,7 @@ FF_SINIT: CALL PC_SPACE #ENDIF ; - LD A,C ; STATUS + LD A,C ; RETURN WITH STATUS IN A RET ; ;====================================================================== @@ -448,22 +445,21 @@ FF_SINIT: ;====================================================================== ; FF_SERASE: ; THIS CODE GETS RELOCATED TO THE STACK - HB_DI ; PUSH AF ; SAVE CURRENT BANK LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO PROGRAM -; - LD A,$AA ; COMMAND - LD ($5555),A ; SETUP - LD A,$55 - LD ($2AAA),A - LD A,$80 - LD ($5555),A - LD A,$AA - LD ($5555),A - LD A,$55 - LD ($2AAA),A + ; + LD HL,$5555 ; LD A,$AA ; COMMAND + LD A,L ; LD ($5555),A ; SETUP + LD (HL),$AA ; LD A,$55 + LD ($2AAA),A ; LD ($2AAA),A + LD (HL),$80 ; LD A,$80 + LD (HL),$AA ; LD ($5555),A + LD ($2AAA),A ; LD A,$AA + ; LD ($5555),A + ; LD A,$55 + ; LD ($2AAA),A LD H,C ; SECTOR LD L,$00 ; ADDRESS @@ -471,13 +467,13 @@ FF_SERASE: ; THIS CODE GETS RELOCATED TO THE STACK LD A,$30 ; SECTOR ERASE LD (HL),A ; COMMAND ; - LD DE,$0000 ; DEBUG COUNT +; LD DE,$0000 ; DEBUG COUNT ; LD A,(HL) ; DO TWO SUCCESSIVE READS FF_WT4: LD C,(HL) ; FROM THE SAME FLASH ADDRESS. XOR C ; IF THE SAME ON BOTH READS BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. - INC DE ; +; INC DE ; JR Z,FF_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE ; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE ; @@ -497,7 +493,6 @@ FF_WT4: LD C,(HL) ; FROM THE SAME FLASH ADDRESS. FF_WT5: LD C,0 ; SET SUCCESS STATUS FF_WT6: POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY - HB_EI ; RET ; @@ -542,9 +537,9 @@ FF_WINIT: PUSH IY ; PUT BANK AND SECTOR POP BC ; DATA IN BC ; - LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK -; + HB_DI CALL JPHL ; CALL FF_SWRITE + HB_EI ; LD HL,(FF_STACK) ; RESTORE ORIGINAL LD SP,HL ; STACK POSITION @@ -556,7 +551,7 @@ FF_WINIT: CALL PC_SPACE #ENDIF ; - XOR A ; STATUS + XOR A ; SET SUCCESS STATUS RET ; ;====================================================================== @@ -575,19 +570,18 @@ FF_WINIT: ;====================================================================== ; FF_SWRITE: ; THIS CODE GETS RELOCATED TO THE STACK - HB_DI -; - LD DE,$0000 ; INITIALIZE BYTE COUNT -; - LD H,C ; SECTOR - LD L,$00 ; ADDRESS ; PUSH AF ; SAVE CURRENT BANK LD A,B ; SELECT BANK CALL HBX_BNKSEL ; TO PROGRAM +; + LD H,C ; SECTOR + LD L,$00 ; ADDRESS + LD D,L ; INITIALIZE + LD E,L ; BYTE COUNT ; FF_WR1: - LD B,(IX+0) ; READ IN BYTE + LD C,(IX+0) ; READ IN BYTE ; LD A,$AA ; COMMAND LD ($5555),A ; SETUP @@ -597,7 +591,7 @@ FF_WR1: LD A,$A0 ; WRITE LD ($5555),A ; COMMAND ; - LD (HL),B ; WRITE OUT BYTE + LD (HL),C ; WRITE OUT BYTE ; ; ; DO TWO SUCCESSIVE READS LD A,(HL) ; FROM THE SAME FLASH ADDRESS. @@ -605,17 +599,16 @@ FF_WT7: LD C,(HL) ; IF TOGGLE BIT (BIT 6) XOR C ; IS THE SAME ON BOTH READS BIT 6,A ; THEN ERASE IS COMPLETE SO EXIT. JR NZ,FF_WT7 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED. - +; INC HL ; NEXT DESTINATION LOCATION INC IX ; NEXT SOURCE LOCATION - +; INC DE ; CONTINUE WRITING UNTIL BIT 4,D ; WE HAVE DONE ONE SECTOR JR Z,FF_WR1 - +; POP AF ; RETURN TO ORIGINAL BANK CALL HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY - HB_EI ; RET ; From 5b31f676f96d883275ad922e1532459752ed8656 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 3 Dec 2020 21:46:27 +0800 Subject: [PATCH 2/3] Update Architecture.md Reset function should be 0xF0 not 0xFD --- Source/Doc/Architecture.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index 674d6a8e..f194f9a9 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -1623,7 +1623,7 @@ the value of the subfucntion. See subfunctions below. #### SYSRESET Subfunction 0x00 -- Internal HBIOS Reset (RESINT) | _Entry Parameters_ -| BC: 0xFD00 +| BC: 0xF000 | _Returned Values_ | A: Status (0=OK, else error) @@ -1634,7 +1634,7 @@ current OS. Does not reinitialize physical devices. #### SYSRESET Subfunction 0x01 -- Warm Start System (RESWARM) | _Entry Parameters_ -| BC: 0xFD01 +| BC: 0xF001 | _Returned Values_ | @@ -1645,7 +1645,7 @@ reinitialize physical devices. #### SYSRESET Subfunction 0x02 -- Cold Start System (RESCOLD) | _Entry Parameters_ -| BC: 0xFD02 +| BC: 0xF002 | _Returned Values_ | From 7b8bab4cd385a2889fcb5bac3503aafd42d5b79c Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 3 Dec 2020 23:21:37 +0800 Subject: [PATCH 3/3] Sync Forth to RC2014 version --- Source/Forth/camel80.azm | 17 ++++----- Source/Forth/camel80h.azm | 73 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 10 deletions(-) diff --git a/Source/Forth/camel80.azm b/Source/Forth/camel80.azm index 9027dd9c..bf71bd6e 100644 --- a/Source/Forth/camel80.azm +++ b/Source/Forth/camel80.azm @@ -5,7 +5,6 @@ CIOIST EQU 02h ; CHARACTER INPUT STATUS BID_BOOT EQU 00h ;HB_BNKCALL EQU 0fff9h BF_SYSRESET EQU 0F0h ; RESTART SYSTEM - BF_SYSRES_INT EQU 00h ; RESET HBIOS INTERNAL BF_SYSRES_WARM EQU 01h ; WARM START (RESTART BOOT LOADER) BF_SYSRES_COLD EQU 02h ; COLD START @@ -72,6 +71,11 @@ FTH_LOC EQU 0200h ; keywords are being passed in a ; macro. ; b1ackmai1er difficultylevelhigh@gmail.com +; 03-Dec 20 v1.02 Add James Bowmans double +; precision words as per RC2014 +; version. Increase terminal +; input buffer (TIB) size. +; b1ackmai1er difficultylevelhigh@gmail.com ; =============================================== ; Macros to define Forth headers ; HEAD label,length,name,action @@ -154,9 +158,11 @@ reset: ld hl,0FDFFh ; HBIOS address, rounded down jp COLD ; enter top-level Forth word ; Memory map: -; Terminal Input Buffer, 128 bytes + ; FTH_LOC Forth kernel = starts after ROMLDR ; ? h Forth dictionary (user RAM) +; EM-400h Terminal Input Buffer, 512 bytes +; Below user area ; EM-200h User area, 128 bytes ; EM-180h Parameter stack, 128B, grows down ; EM-100h HOLD area, 40 bytes, grows down @@ -338,14 +344,9 @@ KEY2: DW SAVEKEY,CFETCH,LIT,0,SAVEKEY,CSTORE ;X BYE i*x -- return to CP/M head bye,3,bye,docode - ;LD A,BID_BOOT ; BOOT BANK - ;LD HL,0 ; ADDRESS ZERO - ;CALL HB_BNKCALL ; DOES NOT RETURN LD B,BF_SYSRESET ; SYSTEM RESTART LD C,BF_SYSRES_WARM ; WARM START - CALL 0FFF0h ; CALL HBIOS - - HALT + JP 0FFF0h ; CALL HBIOS ; STACK OPERATIONS ============================== diff --git a/Source/Forth/camel80h.azm b/Source/Forth/camel80h.azm index b3b6f079..15f195ef 100644 --- a/Source/Forth/camel80h.azm +++ b/Source/Forth/camel80h.azm @@ -39,7 +39,7 @@ ;Z tibsize -- n size of TIB head TIBSIZE,7,TIBSIZE,docon - dw 124 ; 2 chars safety zone + dw 512-2 ; 2 chars safety zone ;X tib -- a-addr Terminal Input Buffer ; HEX 82 CONSTANT TIB CP/M systems: 126 bytes @@ -47,7 +47,7 @@ ; head TIB,3,TIB,docon ; dw 82h head TIB,3,TIB,douser - dw -80h + dw -512 ;Z u0 -- a-addr current user area adrs ; 0 USER U0 @@ -1011,6 +1011,75 @@ WDS1: DW DUP,COUNT,TYPE,SPACE,NFATOLFA,FETCH DOTS1: DW II,FETCH,UDOT,LIT,-2,XPLUSLOOP,DOTS1 DOTS2: DW EXIT +;C D. d -- display d signed + head DDOT,2,D.,docolon + DW LESSNUM,DUP,TOR,DABS,NUMS + DW RFROM,SIGN,NUMGREATER,TYPE,SPACE,EXIT + +;X D+ d1 d2 -- d1+d2 Add double numbers + head DPLUS,2,D+,docode + exx + pop bc ; BC'=d2lo + exx + pop hl ; HL=d1hi,BC=d2hi + exx + pop hl ; HL'=d1lo + add hl,bc + push hl ; 2OS=d1lo+d2lo + exx + adc hl,bc ; HL=d1hi+d2hi+cy + ld b,h + ld c,l + next + +;C 2>R d -- 2 to R + head TWOTOR,3,2!>R,docolon + DW SWOP,RFROM,SWOP,TOR,SWOP,TOR,TOR,EXIT + +;C 2R> d -- fetch 2 from R + head TWORFROM,3,2R!>,docolon + DW RFROM,RFROM,RFROM,SWOP,ROT,TOR,EXIT + +TNEGATE: + call docolon + DW TOR,TWODUP,OR,DUP,qbranch,TNEG1,DROP,DNEGATE,lit,1 +TNEG1: + DW RFROM,PLUS,NEGATE,EXIT + +qtneg: + call docolon + DW ZEROLESS,qbranch,qtneg1,TNEGATE +qtneg1: + DW EXIT + +TSTAR: + call docolon + DW TWODUP,XOR,TOR + DW TOR,DABS,RFROM,ABS + DW TWOTOR + DW RFETCH,UMSTAR,lit,0 + DW TWORFROM,UMSTAR + DW DPLUS + DW RFROM + DW qtneg + DW EXIT + +TDIV: + call docolon + DW OVER,TOR,TOR + DW DUP,qtneg + DW RFETCH,UMSLASHMOD + DW ROT,ROT + DW RFROM,UMSLASHMOD + DW NIP,SWOP + DW RFROM,ZEROLESS,qbranch,tdiv1,DNEGATE +tdiv1: + DW EXIT + +;C M*/ d1 n2 u3 -- d=(d1*n2)/u3 double precision mult. div + head MSTARSLASH,3,M*/,docolon + DW TOR,TSTAR,RFROM,TDIV,EXIT + ;Z COLD -- cold start Forth system ; UINIT U0 #INIT CMOVE init user area ; 80 COUNT INTERPRET interpret CP/M cmd