Browse Source

Merge pull request #158 from b1ackmai1er/dev

Documentation corrections, Forth updates, Flash updates
pull/173/head
Wayne Warthen 5 years ago
committed by GitHub
parent
commit
f92ff496b0
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      Source/Doc/Architecture.md
  2. 17
      Source/Forth/camel80.azm
  3. 73
      Source/Forth/camel80h.azm
  4. 99
      Source/HBIOS/flashfs.asm

6
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_
| <none>
@ -1645,7 +1645,7 @@ reinitialize physical devices.
#### SYSRESET Subfunction 0x02 -- Cold Start System (RESCOLD)
| _Entry Parameters_
| BC: 0xFD02
| BC: 0xF002
| _Returned Values_
| <none>

17
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 ==============================

73
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

99
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
;

Loading…
Cancel
Save