Browse Source

Merge pull request #182 from b1ackmai1er/dev

Extract flash routines from md.asm and updater.asm to common library flashlib.inc
pull/199/head
Wayne Warthen 5 years ago
committed by GitHub
parent
commit
6322574a96
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      Source/Doc/GettingStarted.md
  2. 268
      Source/HBIOS/flashlib.inc
  3. 285
      Source/HBIOS/md.asm
  4. 254
      Source/HBIOS/updater.asm

2
Source/Doc/GettingStarted.md

@ -67,7 +67,7 @@ General features include:
* Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD
* Serial drivers including UART (16550-like), ASCI, ACIA, SIO
* Video drivers including TMS9918, SY6545, MOS8563, HD6445
* Real time clock drivers including DS1322, BQ4845
* Real time clock drivers including DS1302, BQ4845
* Multiple OS support including CP/M 2.2, ZSDOS, CP/M 3, ZPM3
* Built-in VT-100 terminal emulation support

268
Source/HBIOS/flashlib.inc

@ -0,0 +1,268 @@
;======================================================================
; FLASH LIBRARY
;======================================================================
; FLASH IDENTIFY
; SELECT THE APPROPRIATE BANK / ADDRESS
; ISSUE ID COMMAND
; READ IN ID WORD
; ISSUE ID EXIT COMMAND
; SELECT ORIGINAL BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; A CONTAINS CURRENT BANK
; ON EXIT BC CONTAINS ID WORD
; NO STATUS IS RETURNED
;======================================================================
;
MD_FIDEN_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD D,A ; SAVE CURRENT BANK
;
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO PROGRAM
;
LD HL,$5555 ; LD A,$AA ; COMMAND
LD (HL),$AA ; LD ($5555),A ; SETUP
LD A,H ; LD A,$55
LD ($2AAA),A ; LD ($2AAA),A
LD (HL),$90 ; LD A,$90
; ; LD ($5555),A
LD BC,($0000) ; READ ID
;
LD A,$F0 ; LD A,$F0 ; EXIT
LD (HL),A ; LD ($5555),A ; COMMAND
;
LD A,D ; RETURN TO ORIGINAL BANK
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
MD_I_SZ .EQU $-MD_FIDEN_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
.ECHO "MD_FIDEN_R occupies "
.ECHO MD_I_SZ
.ECHO " bytes.\n"
;
;======================================================================
; ERASE FLASH SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; ISSUE ERASE SECTOR COMMAND
; POLL TOGGLE BIT FOR COMPLETION STATUS.
; SELECT ORIGINAL BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; A CONTAINS CURRENT BANK
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
;======================================================================
;
MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
PUSH AF ; SAVE CURRENT BANK
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO PROGRAM
;
LD HL,$5555 ; LD ($5555),A
LD DE,$2AAA ; LD A,$55
LD A,L ; LD ($2AAA),A
LD (HL),E ; LD A,$80
LD (DE),A ; LD ($5555),A
LD (HL),$80 ; LD A,$AA
LD (HL),E ; LD ($5555),A
LD (DE),A ; LD A,$55
; ; LD ($2AAA),A
LD H,C ; SECTOR
LD L,$00 ; ADDRESS
;
LD A,$30 ; SECTOR ERASE
LD (HL),A ; COMMAND
;
MD_WT4: LD A,(HL) ; DO TWO SUCCESSIVE READS
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.
;
JR Z,MD_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE
; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE
;
LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5).
BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS
JR Z,MD_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1
;
LD A,(HL) ; WE GOT A TIMOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE
XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME?
BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED
JR Z,MD_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT.
;
LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE
LD (HL),C ; WRITE DEVICE RESET
JR MD_WT6
MD_WT5: LD C,L ; SET SUCCESS STATUS
;
MD_WT6: POP AF ; RETURN TO ORIGINAL BANK
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
.ECHO "MD_FERAS_R occupies "
.ECHO MD_S_SZ
.ECHO " bytes.\n"
;
;======================================================================
; FLASH READ SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; READ SECTOR OF 4096 BYTES, BYTE AT A TIME
; SELECT SOURCE BANK, READ DATA,
; SELECT DESTINATION BANK, WRITE DATA
; DESTINATION BANK IS ALWAYS CURRENT BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; DE = 0000 BYTE COUNT
; IX POINTS TO DATA TO BE WRITTEN
; A CONTAINS CURRENT BANK
; ON EXIT NO STATUS RETURNED
;======================================================================
;
MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR
LD L,D ; ADDRESS
;
PUSH AF ; SAVE CURRENT BANK
;
MD_FRD1:LD A,B ; CHANGE TO SOURCE BANK
CALL HBX_BNKSEL ; READ
LD C,(HL) ; BYTE
;
POP AF ; RESTORE CURRENT BANK
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
CALL HBX_BNKSEL ; SELECT BANK TO WRITE TO
;
LD (IX+0),C ; WRITE BYTE
;
INC HL ; NEXT SOURCE LOCATION
INC IX ; NEXT DESTINATION LOCATION
;
INC DE ; CONTINUE READING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FRD1
;
POP AF
RET
;
MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
.ECHO "MD_FREAD_R occupies "
.ECHO MD_R_SZ
.ECHO " bytes.\n"
;
;======================================================================
; FLASH VERIFY SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME
; SELECT SOURCE BANK, READ DATA,
; SELECT DESTINATION BANK, COMPARE DATA
; DESTINATION BANK IS ALWAYS CURRENT BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; DE = 0000 BYTE COUNT
; IX POINTS TO DATA TO BE VERIFIED
; A CONTAINS CURRENT BANK
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
;======================================================================
;
MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR
LD L,D ; ADDRESS
;
PUSH AF ; SAVE CURRENT BANK
;
MD_FVE1:LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO READ
LD C,(HL) ; READ BYTE
;
POP AF ; RESTORE CURRENT BANK
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
CALL HBX_BNKSEL ; TO VERIFY AGAINST
;
LD A,C
SUB (IX+0) ; COMPARE BYTE
LD C,A ; SET STATUS
JR NZ,MD_FVE2 ; EXIT IF MISMATCH
;
INC HL ; NEXT SOURCE LOCATION
INC IX ; NEXT DESTINATION LOCATION
;
INC DE ; CONTINUE READING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FVE1
;
MD_FVE2:POP AF
RET
;
MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
.ECHO "MD_FVERI_R occupies "
.ECHO MD_V_SZ
.ECHO " bytes.\n"
;
;======================================================================
; FLASH WRITE SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME
; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE
; POLL TOGGLE BIT FOR COMPLETION STATUS.
; SELECT ORIGINAL BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; IX POINTS TO DATA TO BE WRITTEN
; DE = 0000 BYTE COUNT
; A CONTAINS CURRENT BANK
; ON EXIT NO STATUS IS RETURNED
;======================================================================
;
MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR
LD L,D ; ADDRESS
;
PUSH AF ; SAVE CURRENT BANK
MD_FWR1:CALL HBX_BNKSEL ; SELECT BANK TO READ
;
LD C,(IX+0) ; READ IN BYTE
;
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,$A0 ; WRITE
LD ($5555),A ; COMMAND
;
LD (HL),C ; WRITE OUT BYTE
;
; ; DO TWO SUCCESSIVE READS
MD_FWR2:LD A,(HL) ; FROM THE SAME FLASH ADDRESS.
LD C,(HL) ; IF TOGGLE BIT (BIT 6)
XOR C ; IS THE SAME ON BOTH READS
BIT 6,A ; THEN WRITE IS COMPLETE SO EXIT.
JR NZ,MD_FWR2 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED.
;
INC HL ; NEXT DESTINATION LOCATION
INC IX ; NEXT SOURCE LOCATION
;
POP AF ; RESTORE CURRENT BANK
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
;
INC DE ; CONTINUE WRITING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FWR1
;
POP AF ; RESTORE CURRENT BANK
JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY
;
MD_W_SZ .EQU $-MD_FWRIT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
.ECHO "MD_FWRIT_R occupies "
.ECHO MD_W_SZ
.ECHO " bytes.\n"

285
Source/HBIOS/md.asm

@ -849,8 +849,6 @@ MD_FNCALL: ; USING HBX_BUF FOR CODE AREA
CALL PRTHEXWORD
#ENDIF
;
EX AF,AF'
PUSH AF
LD A,(HB_CURBNK) ; WE ARE STARTING IN HB_CURBNK
;
HB_DI
@ -859,9 +857,6 @@ MD_FNCALL: ; USING HBX_BUF FOR CODE AREA
CALL HBX_BUF ; EXECUTE RELOCATED CODE
LD SP,(MD_SAVSTK) ; RESTORE STACK
HB_EI
;
POP AF
EX AF,AF'
;
#IF (MD_FDBG==1)
CALL PC_SPACE
@ -878,285 +873,7 @@ MD_FNCALL: ; USING HBX_BUF FOR CODE AREA
;
MD_SAVSTK .DW 0
;
;======================================================================
; FLASH IDENTIFY
; SELECT THE APPROPRIATE BANK / ADDRESS
; ISSUE ID COMMAND
; READ IN ID WORD
; ISSUE ID EXIT COMMAND
; SELECT ORIGINAL BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; A CONTAINS CURRENT BANK
; ON EXIT BC CONTAINS ID WORD
; NO STATUS IS RETURNED
;======================================================================
;
MD_FIDEN_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD D,A ; SAVE CURRENT BANK
;
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO PROGRAM
;
LD HL,$5555 ; LD A,$AA ; COMMAND
LD (HL),$AA ; LD ($5555),A ; SETUP
LD A,H ; LD A,$55
LD ($2AAA),A ; LD ($2AAA),A
LD (HL),$90 ; LD A,$90
; ; LD ($5555),A
LD BC,($0000) ; READ ID
;
LD A,$F0 ; LD A,$F0 ; EXIT
LD (HL),A ; LD ($5555),A ; COMMAND
;
LD A,D ; RETURN TO ORIGINAL BANK
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
; RET
;
MD_I_SZ .EQU $-MD_FIDEN_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
.ECHO "MD_FIDEN_R occupies "
.ECHO MD_I_SZ
.ECHO " bytes.\n"
;
;======================================================================
; ERASE FLASH SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; ISSUE ERASE SECTOR COMMAND
; POLL TOGGLE BIT FOR COMPLETION STATUS.
; SELECT ORIGINAL BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; A CONTAINS CURRENT BANK
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
;======================================================================
;
MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
EX AF,AF' ; SAVE CURRENT BANK
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO PROGRAM
;
LD HL,$5555 ; LD ($5555),A
LD DE,$2AAA ; LD A,$55
LD A,L ; LD ($2AAA),A
LD (HL),E ; LD A,$80
LD (DE),A ; LD ($5555),A
LD (HL),$80 ; LD A,$AA
LD (HL),E ; LD ($5555),A
LD (DE),A ; LD A,$55
; ; LD ($2AAA),A
LD H,C ; SECTOR
LD L,$00 ; ADDRESS
;
LD A,$30 ; SECTOR ERASE
LD (HL),A ; COMMAND
;
MD_WT4: LD A,(HL) ; DO TWO SUCCESSIVE READS
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.
;
JR Z,MD_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE
; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE
;
LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5).
BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS
JR Z,MD_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1
;
LD A,(HL) ; WE GOT A TIMOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE
XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME?
BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED
JR Z,MD_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT.
;
LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE
LD (HL),C ; WRITE DEVICE RESET
JR MD_WT6
MD_WT5: LD C,L ; SET SUCCESS STATUS
;
MD_WT6: EX AF,AF' ; RETURN TO ORIGINAL BANK
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
; RET
;
MD_S_SZ .EQU $-MD_FERAS_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
.ECHO "MD_FERAS_R occupies "
.ECHO MD_S_SZ
.ECHO " bytes.\n"
;
;======================================================================
; FLASH READ SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; READ SECTOR OF 4096 BYTES, BYTE AT A TIME
; SELECT SOURCE BANK, READ DATA,
; SELECT DESTINATION BANK, WRITE DATA
; DESTINATION BANK IS ALWAYS CURRENT BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; DE = 0000 BYTE COUNT
; IX POINTS TO DATA TO BE WRITTEN
; A CONTAINS CURRENT BANK
; ON EXIT NO STATUS RETURNED
; AF' TRASHED
;======================================================================
;
MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR
LD L,D ; ADDRESS
;
EX AF,AF' ; PUT DESTINATION BANK IN AF'
;
MD_FRD1:
LD A,B ; PUT SOURCE BANK IN AF
CALL HBX_BNKSEL ; READ ; SWITCH TO SOURCE BANK
LD C,(HL) ; BYTE
;
EX AF,AF' ; SELECT BANK ; SWITCH DESTINATION BANK
PUSH AF
CALL HBX_BNKSEL ; TO WRITE
POP AF
LD (IX+0),C ; WRITE BYTE
EX AF,AF' ; ; PUT SOURCE BANK IN AF
;
INC HL ; NEXT SOURCE LOCATION
INC IX ; NEXT DESTINATION LOCATION
;
INC DE ; CONTINUE READING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FRD1
;
RET
;
MD_R_SZ .EQU $-MD_FREAD_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
.ECHO "MD_FREAD_R occupies "
.ECHO MD_R_SZ
.ECHO " bytes.\n"
;
;======================================================================
; FLASH VERIFY SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME
; SELECT SOURCE BANK, READ DATA,
; SELECT DESTINATION BANK, COMPARE DATA
; DESTINATION BANK IS ALWAYS CURRENT BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; DE = 0000 BYTE COUNT
; IX POINTS TO DATA TO BE VERIFIED
; A CONTAINS CURRENT BANK
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
;======================================================================
;
MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR
LD L,D ; ADDRESS
;
EX AF,AF' ; PUT SOURCE BANK IN AF' (RAM)
;
MD_FVE1:
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO READ ; SWITCH TO FLASH BANK
LD A,(HL) ; READ BYTE
;
EX AF,AF' ; SELECT BANK ; SWITCH TO RAM BANK
PUSH AF
CALL HBX_BNKSEL ; TO VERIFY AGAINST
POP AF
EX AF,AF'
;
SUB (IX+0) ; COMPARE BYTE
JR NZ,MD_FVE2 ; EXIT IF MISMATCH
;
INC HL ; NEXT SOURCE LOCATION
INC IX ; NEXT DESTINATION LOCATION
;
INC DE ; CONTINUE READING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FVE1
;
MD_FVE2:
LD C,A ; SET STATUS
EX AF,AF'
;
RET
;
MD_V_SZ .EQU $-MD_FVERI_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
.ECHO "MD_FVERI_R occupies "
.ECHO MD_V_SZ
.ECHO " bytes.\n"
;
;======================================================================
; FLASH WRITE SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME
; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE
; POLL TOGGLE BIT FOR COMPLETION STATUS.
; SELECT ORIGINAL BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; IX POINTS TO DATA TO BE WRITTEN
; DE = 0000 BYTE COUNT
; A CONTAINS CURRENT BANK
; ON EXIT NO STATUS IS RETURNED
;======================================================================
;
MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR
LD L,D ; ADDRESS
;
MD_FWRI1:
PUSH AF
CALL HBX_BNKSEL ; SELECT BANK TO READ
POP AF
EX AF,AF' ; SAVE CURRENT BANK
;
LD C,(IX+0) ; READ IN BYTE
;
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,$A0 ; WRITE
LD ($5555),A ; COMMAND
;
LD (HL),C ; WRITE OUT BYTE
;
; ; DO TWO SUCCESSIVE READS
MD_FW7: LD A,(HL) ; FROM THE SAME FLASH ADDRESS.
LD C,(HL) ; IF TOGGLE BIT (BIT 6)
XOR C ; IS THE SAME ON BOTH READS
BIT 6,A ; THEN WRITE IS COMPLETE SO EXIT.
JR NZ,MD_FW7 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED.
;
INC HL ; NEXT DESTINATION LOCATION
INC IX ; NEXT SOURCE LOCATION
;
EX AF,AF' ; RESTORE CURRENT BANK
;
INC DE ; CONTINUE WRITING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FWRI1
;
JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY
;
; RET
;
MD_W_SZ .EQU $-MD_FWRIT_R ; SIZE OF RELOCATABLE CODE BUFFER REQUIRED
.ECHO "MD_FWRIT_R occupies "
.ECHO MD_W_SZ
.ECHO " bytes.\n"
#INCLUDE "flashlib.inc"
;
;======================================================================
;

254
Source/HBIOS/updater.asm

@ -222,7 +222,7 @@ CHPFND: LD (ERATYP),A ; SAVE ERASE TYPE
RST 08 ; AND MULTIPLY
LD A,L ; BY 4
ADD A,A ; TO CREATE
ADD A,A ; TIMOUT DELAY
ADD A,A ; TIMEOUT DELAY
LD (TmoFct),A ; FACTOR
;
MENULP: LD DE,$0000 ; ENSURE WE ARE STARTING
@ -501,15 +501,15 @@ DISP1: LD C,' ' ; DISPLAY
CALL PRTHEXB
RET
;
; WAITS FOR UP TO A SECONDS FOR A CHARACTER TO BECOME AVAILABLE AND
; WAITS FOR UP TO B SECONDS FOR A CHARACTER TO BECOME AVAILABLE AND
; RETURNS IT IN A WITHOUT ECHO AND CARRY CLEAR. IF TIMEOUT THEN CARRY
; IT SET.
;
; 4MHZ 20 SECONDS B=16
; 10MHZ 20 SECONDS B=39
; 4MHZ 20 SECONDS TmoFct = 16
; 10MHZ 20 SECONDS TmoFct = 39
;
GetCharTmo1:
LD B,1
LD B,1 ; WAIT 1 SECOND FOR SERIAL INPUT
GetCharTmo:
CALL SERST ; IF THERE IS A
OR A ; CHARACTER AVAILABLE
@ -1070,249 +1070,7 @@ MD_FNCALL:
MD_FJPHL:
JP (HL)
;
;======================================================================
; FLASH IDENTIFY
; SELECT THE APPROPRIATE BANK / ADDRESS
; ISSUE ID COMMAND
; READ IN ID WORD
; ISSUE ID EXIT COMMAND
; SELECT ORIGINAL BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; A CONTAINS CURRENT BANK
; ON EXIT BC CONTAINS ID WORD
; NO STATUS IS RETURNED
;======================================================================
;
MD_FIDEN_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD D,A ; SAVE CURRENT BANK
;
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO PROGRAM
;
LD HL,$5555 ; LD A,$AA ; COMMAND
LD (HL),$AA ; LD ($5555),A ; SETUP
LD A,H ; LD A,$55
LD ($2AAA),A ; LD ($2AAA),A
LD (HL),$90 ; LD A,$90
; ; LD ($5555),A
LD BC,($0000) ; READ ID
;
LD A,$F0 ; LD A,$F0 ; EXIT
LD (HL),A ; LD ($5555),A ; COMMAND
;
LD A,D ; RETURN TO ORIGINAL BANK
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
;======================================================================
; ERASE FLASH SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; ISSUE ERASE SECTOR COMMAND
; POLL TOGGLE BIT FOR COMPLETION STATUS.
; SELECT ORIGINAL BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; A CONTAINS CURRENT BANK
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
;======================================================================
;
MD_FERAS_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
PUSH AF ; SAVE CURRENT BANK
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO PROGRAM
;
LD HL,$5555 ; LD ($5555),A
LD DE,$2AAA ; LD A,$55
LD A,L ; LD ($2AAA),A
LD (HL),E ; LD A,$80
LD (DE),A ; LD ($5555),A
LD (HL),$80 ; LD A,$AA
LD (HL),E ; LD ($5555),A
LD (DE),A ; LD A,$55
; ; LD ($2AAA),A
LD H,C ; SECTOR
LD L,$00 ; ADDRESS
;
LD A,$30 ; SECTOR ERASE
LD (HL),A ; COMMAND
;
MD_WT4: LD A,(HL) ; DO TWO SUCCESSIVE READS
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.
;
JR Z,MD_WT5 ; BIT 6 = 0 IF SAME ON SUCCESSIVE READS = COMPLETE
; BIT 6 = 1 IF DIFF ON SUCCESSIVE READS = INCOMPLETE
;
LD A,C ; OPERATION IS NOT COMPLETE. CHECK TIMEOUT BIT (BIT 5).
BIT 5,C ; IF NO TIMEOUT YET THEN LOOP BACK AND KEEP CHECKING TOGGLE STATUS
JR Z,MD_WT4 ; IF BIT 5=0 THEN RETRY; NZ TRUE IF BIT 5=1
;
LD A,(HL) ; WE GOT A TIMOUT. RECHECK TOGGLE BIT IN CASE WE DID COMPLETE
XOR (HL) ; THE OPERATION. DO TWO SUCCESSIVE READS. ARE THEY THE SAME?
BIT 6,A ; IF THEY ARE THEN OPERATION WAS COMPLETED
JR Z,MD_WT5 ; OTHERWISE ERASE OPERATION FAILED OR TIMED OUT.
;
LD C,$F0 ; COMMON FAIL STATUS / PREPARE DEVICE RESET CODE
LD (HL),C ; WRITE DEVICE RESET
JR MD_WT6
MD_WT5: LD C,L ; SET SUCCESS STATUS
;
MD_WT6: POP AF ; RETURN TO ORIGINAL BANK
JP HBX_BNKSEL ; WHICH IS OUR RAM BIOS COPY
;
;======================================================================
; FLASH READ SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; READ SECTOR OF 4096 BYTES, BYTE AT A TIME
; SELECT SOURCE BANK, READ DATA,
; SELECT DESTINATION BANK, WRITE DATA
; DESTINATION BANK IS ALWAYS CURRENT BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; DE = 0000 BYTE COUNT
; IX POINTS TO DATA TO BE WRITTEN
; A CONTAINS CURRENT BANK
; ON EXIT NO STATUS RETURNED
; AF' TRASHED
;======================================================================
;
MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR
LD L,D ; ADDRESS
;
PUSH AF ; SAVE CURRENT BANK
MD_FRD1:
LD A,B ; PUT SOURCE BANK IN AF
CALL HBX_BNKSEL ; READ ; SWITCH TO SOURCE BANK
LD C,(HL) ; BYTE
;
POP AF ; RESTORE CURRENT BANK
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
CALL HBX_BNKSEL ; SELECT BANK TO WRITE TO
;
LD (IX+0),C ; WRITE BYTE
;
INC HL ; NEXT SOURCE LOCATION
INC IX ; NEXT DESTINATION LOCATION
;
INC DE ; CONTINUE READING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FRD1
;
POP AF
RET
;
;======================================================================
; FLASH VERIFY SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; VERIFY SECTOR OF 4096 BYTES, BYTE AT A TIME
; SELECT SOURCE BANK, READ DATA,
; SELECT DESTINATION BANK, COMPARE DATA
; DESTINATION BANK IS ALWAYS CURRENT BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; DE = 0000 BYTE COUNT
; IX POINTS TO DATA TO BE VERIFIED
; A CONTAINS CURRENT BANK
; ON EXIT C RETURNS STATUS 0=SUCCESS NZ=FAIL
;======================================================================
;
MD_FVERI_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR
LD L,D ; ADDRESS
;
PUSH AF ; SAVE CURRENT BANK
MD_FVE1:
LD A,B ; SELECT BANK
CALL HBX_BNKSEL ; TO READ
LD C,(HL) ; READ BYTE
;
POP AF ; RESTORE CURRENT BANK
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
CALL HBX_BNKSEL ; TO VERIFY AGAINST
;
LD A,C
SUB (IX+0) ; COMPARE BYTE
LD C,A ; SET STATUS
JR NZ,MD_FVE2 ; EXIT IF MISMATCH
;
INC HL ; NEXT SOURCE LOCATION
INC IX ; NEXT DESTINATION LOCATION
;
INC DE ; CONTINUE READING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FVE1
;
MD_FVE2:POP AF
RET
;
;======================================================================
; FLASH WRITE SECTOR.
;
; SELECT THE APPROPRIATE BANK / ADDRESS
; WRITE 1 SECTOR OF 4096 BYTES, BYTE AT A TIME
; ISSUE WRITE BYTE COMMAND AND WRITE THE DATA BYTE
; POLL TOGGLE BIT FOR COMPLETION STATUS.
; SELECT ORIGINAL BANK
;
; ON ENTRY BC CONTAINS BANK AND SECTOR DATA
; IX POINTS TO DATA TO BE WRITTEN
; DE = 0000 BYTE COUNT
; A CONTAINS CURRENT BANK
; ON EXIT NO STATUS IS RETURNED
;======================================================================
;
MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY
;
LD H,C ; SECTOR
LD L,D ; ADDRESS
;
PUSH AF ; SAVE CURRENT BANK
MD_FWRI1:
CALL HBX_BNKSEL ; SELECT BANK TO READ
;
LD C,(IX+0) ; READ IN BYTE
;
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,$A0 ; WRITE
LD ($5555),A ; COMMAND
;
LD (HL),C ; WRITE OUT BYTE
;
; ; DO TWO SUCCESSIVE READS
MD_FW7: LD A,(HL) ; FROM THE SAME FLASH ADDRESS.
LD C,(HL) ; IF TOGGLE BIT (BIT 6)
XOR C ; IS THE SAME ON BOTH READS
BIT 6,A ; THEN WRITE IS COMPLETE SO EXIT.
JR NZ,MD_FW7 ; Z TRUE IF BIT 6=0 I.E. "NO TOGGLE" WAS DETECTED.
;
INC HL ; NEXT DESTINATION LOCATION
INC IX ; NEXT SOURCE LOCATION
;
POP AF ; RESTORE CURRENT BANK
PUSH AF ; AND SAVE A COPY FOR NEXT LOOP
;
INC DE ; CONTINUE WRITING UNTIL
BIT 4,D ; WE HAVE DONE ONE SECTOR
JR Z,MD_FWRI1
;
POP AF ; RESTORE CURRENT BANK
JP HBX_BNKSEL ; RETURN TO ORIGINAL BANK WHICH IS OUR RAM BIOS COPY
#INCLUDE "flashlib.inc"
;
MD_FEND .EQU $
MD_CSIZ .EQU MD_FEND-MD_FSTART ; HOW MUCH SPACE WE NEED FOR RELOCATABLE CODE

Loading…
Cancel
Save