diff --git a/Source/HBIOS/asci.asm b/Source/HBIOS/asci.asm index 5e3246bc..57ee1e16 100644 --- a/Source/HBIOS/asci.asm +++ b/Source/HBIOS/asci.asm @@ -87,7 +87,7 @@ ASCI1_IVT .EQU IVT(INT_SER1) ASCI_PREINIT: ; ; SETUP THE DISPATCH TABLE ENTRIES -; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST REMIAIN +; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST REMAIN ; DISABLED. ; LD B,ASCI_CFGCNT ; LOOP CONTROL diff --git a/Source/HBIOS/updater.asm b/Source/HBIOS/updater.asm index 60fc5811..1d0013f4 100644 --- a/Source/HBIOS/updater.asm +++ b/Source/HBIOS/updater.asm @@ -62,11 +62,13 @@ ; ONTO FLASH #2. THE PURPOSE OF THIS IS TO ENABLE MAKING A BACKUP COPY OF ; THE CURRENT FLASH. ; +; OPTION (1) AND (2) - CALCULATE AND DISPLAY CRC32 OF 1ST OR 2ND 512K ROM. +; ; OPTION (H) - DEBUG OPTION - SWITCH ON CPU CLOCK DIVIDER ON SBC-V2-004+ ; OPTION (T) - DEBUG OPTION - TEST TIMER FOR 20 SECONDS. * = START AND FINISH ; ; -; V.DEV 8/1/2021 PHIL SUMMERS, DIFFICULTYLEVELHIGH@GMAIL.COM +; V.DEV 13/1/2021 PHIL SUMMERS, DIFFICULTYLEVELHIGH@GMAIL.COM ; b1ackmai1er ON RETROBREWCOMPUTERS.ORG ; ; @@ -80,12 +82,14 @@ ; ; MAXIMUM SERIAL SPEED LIMITATIONS ; -; SBC-V2 UART NO FLOW CONTROL 2MHZ | 9600 -; SBC-V2 UART NO FLOW CONTROL 4MHZ | 19200 -; SBC-V2 UART NO FLOW CONTROL 5MHZ | 19200 -; SBC-V2 UART NO FLOW CONTROL 8MHZ | 38400 -; SBC-V2 UART NO FLOW CONTROL 10MHZ | 38400 -; SBC-V2 USB-FIFO 2MHZ+ | N/A +; SBC-V2 UART NO FLOW CONTROL 2MHZ | 9600 +; SBC-V2 UART NO FLOW CONTROL 4MHZ | 19200 +; SBC-V2 UART NO FLOW CONTROL 5MHZ | 19200 +; SBC-V2 UART NO FLOW CONTROL 8MHZ | 38400 +; SBC-V2 UART NO FLOW CONTROL 10MHZ | 38400 +; SBC-V2 USB-FIFO 2MHZ+ | N/A +; SBC-MK4 ASCI NO FLOW CONTROL 18.432MHZ | 9600 +; SBC-MK4 ASCI WITH FLOW CONTROL 18.432MHZ | 38400 ; ; ACKNOWLEDGEMENTS: ; @@ -97,6 +101,8 @@ ; md.asm - ROMWBW memory disk driver ; https://github.com/wwarthen/RomWBW/blob/master/Source/HBIOS/md.asm ; +; CRC32 - J.G. HARSTON - mdfs.net/Info/Comp/Comms/CRC32.htm +; ;***************************************************************************** ; #INCLUDE "std.asm" @@ -152,11 +158,8 @@ BSPC: .EQU 'H'-40h ; ^H = Backspace LD (SERDEV),A ; RESTART: -; LD DE,$0000 ; SET UP -; LD HL,$0000 ; START -; CALL MD_CALBAS ; BANK AND SECTOR - LD DE,$0000 - LD (MD_FBAS),DE + LD DE,$0000 ; SET UP START + LD (MD_FBAS),DE ; BANK AND SECTOR LD HL,MD_FIDEN ; IDENTIFY CHIP CALL MD_FNCALL ; AT THIS BANK/SECTOR @@ -172,7 +175,29 @@ RESTART: ADD A,A ; TIMOUT DELAY LD (TmoFct),A ; FACTOR ; -MENULP: CALL MENU ; DISPLAY MENU +MENULP: LD DE,$0000 ; ENSURE WE ARE STARTING + LD (MD_FBAS),DE ; AT BANK 0 SECTOR 0 +; + LD HL,msgCRLF + CALL PRTSTR0 + CALL MENU ; DISPLAY MENU +; +#IF (XFUDBG) + LD C,'B' + CALL CONOUT + LD A,(MD_BANK) + CALL PRTHEXB + LD C,'S' + CALL CONOUT + LD A,(MD_SECT) + CALL PRTHEXB + LD C,'T' + CALL CONOUT + LD A,(TmoFct) + CALL PRTHEXB + LD C,':' + CALL CONOUT +#ENDIF CALL GETINP ; GET SELECTION ; CP 'U' ; BEGIN @@ -195,6 +220,12 @@ MENULP: CALL MENU ; DISPLAY MENU ; CP 'D' ; DUPLICATE JP Z,OPTIOND ; FLASH +; + CP '1' ; CALCULATE + JP Z,OPTION1 ; CRC FLASH #1 +; + CP '2' ; CALCULATE + JP Z,OPTION2 ; CRC FLASH #2 ; #IF (XFUDBG) CP 'T' ; TEST TIMEOUT @@ -233,22 +264,22 @@ GetNewPacket: ; NPloop: LD B,5 ; 5 SECONDS OF TIMEOUT BEFORE EACH NEW BLOCK CALL GetCharTmo - jp NC,NotPacketTimeout + JP NC,NotPacketTimeout ; LD HL,retrycnt ; REACHED MAX NUMBER OF RETRIES? dec (HL) - jp Z,FAILRT ; YES, PRINT MESSAGE AND EXIT + JP Z,FAILRT ; YES, PRINT MESSAGE AND EXIT ; LD C,NAK ; SEND A NAK TO THE UPLOADER CALL SEROUT JR NPloop ; NotPacketTimeout: - cp EOT ; DID UPLOADER SAY WE'RE FINISHED? + CP EOT ; DID UPLOADER SAY WE'RE FINISHED? JP Z,Done ; YES, THEN WE'RE DONE - cp CAN ; UPLOADER WANTS TO FAIL TRANSFER? - jp Z,FAILCN ; YES, THEN WE'RE ALSO DONE - cp SOH ; DID WE GET A START-OF-NEW-PACKET? + CP CAN ; UPLOADER WANTS TO FAIL TRANSFER? + JP Z,FAILCN ; YES, THEN WE'RE ALSO DONE + CP SOH ; DID WE GET A START-OF-NEW-PACKET? JR NZ,NPloop ; NO, GO BACK AND TRY AGAIN ; LD HL,packet ; SAVE THE RECEIVED CHAR INTO THE... @@ -285,7 +316,7 @@ GetRestOfPacket: LD HL,packet+3 ; CALCULATE CHECKSUM FROM 128 BYTES OF DATA LD B,128 XOR A -csloop: add A,(HL) ; JUST ADD UP THE BYTES +csloop: ADD A,(HL) ; JUST ADD UP THE BYTES INC HL DJNZ csloop ; @@ -298,8 +329,9 @@ csloop: add A,(HL) ; JUST ADD UP THE BYTES SBC HL,BC ; NUMBERS JP NZ,FAILPN ; - LD HL,pktNo ; HAVE WE RECEIVED - LD A,(HL) ; A BLOCK OF 32 +; LD HL,pktNo ; HAVE WE RECEIVED +; LD A,(HL) ; A BLOCK OF 32 + LD A,C DEC A ; XMODEM PACKETS? AND %00011111 ; IF YES THEN WERE WE CP %00011111 ; HAVE ENOUGH TO @@ -308,7 +340,7 @@ csloop: add A,(HL) ; JUST ADD UP THE BYTES ; OR A ; EXIT IF WE GOT A JP NZ,FAILWF ; WRITE VERIFICATION ERROR - +; LD HL,pktNo ; UPDATE THE PACKET COUNTERS INC (HL) INC HL @@ -328,7 +360,7 @@ Done: LD C,ACK ; TELL UPLOADER Done1: LD HL,msgSuccess ; BACK TO JR MSGRS ; MENU ; -FAILTO: LD HL,msgTimout ; TIMOUT WAITING +FAILTO: LD HL,msgTimout ; TIMEOUT WAITING JR ERRRX ; FOR CHARACTER ; FAILWF: LD HL,msgFailWrt ; FLASH @@ -457,7 +489,7 @@ GetCharTmo: CALL SERST ; IF THERE IS A OR A ; CHARACTER AVAILABLE JR NZ,GotChrX ; EXIT NOW OTHERWISE POLL - PUSH BC +GCtmoa: PUSH BC LD BC,255 ; C=CONSTANT (255) FOR INNER TIMING LOOP TmoFct: .EQU $-1 ; B=SPEED FACTOR WHICH GETS UPDATED AT START GCtmob: PUSH BC @@ -748,7 +780,7 @@ CONIN: PUSH HL ; CONSOLE INPUT. WAIT FOR A CHARACTER ADD RETURN IT IN A POP HL RET ; -PRTHEXB:PUSH AF ; PRINT HEX BYTE IN A TO CONSOLE +PRTHEXB:PUSH AF ; PRINT HEX BYTE IN A TO CONSOLE PUSH DE CALL HEXASC LD C,D @@ -771,12 +803,111 @@ HEXASC: LD D,A LD D,A RET ; -HEXCONV:AND 0FH ; CONVERT LOW NIBBLE OF A TO ASCII HEX +HEXCONV:AND 0FH ; CONVERT LOW NIBBLE OF A TO ASCII HEX ADD A,90H DAA ADC A,40H DAA RET + +OPTION1:LD HL,$0000 + LD (MD_FBAS),HL + LD C,$00 + JR CALCCRC +; +OPTION2:LD HL,$1000 + LD (MD_FBAS),HL + LD C,$10 +; +CALCCRC:CALL COUTON ; TURN ON OUTPUT +; + LD HL,msgCalc + CALL PRTSTR0 +; + LD HL,$FFFF ; SET THE + LD (CRC),HL ; START CRC + LD (CRC+2),HL ; CONDITION + + LD B,16 ; LOOP THROUGH +CRCLP1: PUSH BC ; 16 BANKS + LD B,8 ; LOOP THROUGH +CRCLP2: PUSH BC ; 8 SECTORS +; + PUSH BC + CALL DISPROG ; DISPLAY PROGRESS +; + LD IX,sector4k ; READ + LD HL,MD_FREAD ; A SECTOR + CALL MD_FNCALL + CALL CRC32 ; CALCULATE CRC + POP BC +; + LD A,(MD_SECT) ; POINT + ADD A,$10 ; TO NEXT + LD (MD_SECT),A ; SECTOR + + POP BC ; NEXT + DJNZ CRCLP2 ; SECTOR + + XOR A ; RESET SECTOR + LD (MD_SECT),A ; START + + LD HL,MD_BANK ; POINT TO + INC (HL) ; NEXT BANK + + POP BC ; NEXT + DJNZ CRCLP1 ; BANK +; + LD HL,msgCRC32 ; DISPLAY + CALL PRTSTR0 ; RESULT + LD HL,CRC+3 + LD B,4 +DISPCRC:LD A,$FF + XOR (HL) + CALL PRTHEXB + DEC HL + DJNZ DISPCRC +; + JP MENULP +; +CRC32: LD IX,sector4k ; CALCULATE + LD BC,4096 ; CRC32 OF + LD DE,(CRC) ; EACH SECTOR + LD HL,(CRC+2) +BYTELP: PUSH BC + LD A,(IX) + XOR E + LD B,8 +ROTLP: SRL H + RR L + RR D + RRA + JP NC,CLEAR + LD E,A + LD A,H + XOR $ED + LD H,A + LD A,L + XOR $B8 + LD L,A + LD A,D + XOR $83 + LD D,A + LD A,E + XOR $20 +CLEAR: DEC B + JP NZ,ROTLP + LD E,A + INC IX + POP BC + DEC BC + LD A,B + OR C + JP NZ,BYTELP + LD (CRC),DE + LD (CRC+2),HL + + RET ; ;====================================================================== ; CALCULATE BANK AND ADDRESS DATA FROM MEMORY ADDRESS @@ -982,14 +1113,16 @@ MD_FREAD_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY LD L,D ; ADDRESS ; EX AF,AF' ; PUT DESTINATION BANK IN AF' - LD A,B ; PUT SOURCE 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 ; @@ -1031,7 +1164,9 @@ MD_FVE1: 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 @@ -1072,7 +1207,9 @@ MD_FWRIT_R: ; THIS CODE GETS RELOCATED TO HIGH MEMORY 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 @@ -1128,6 +1265,8 @@ msgBank: .DB CR,LF,"BANK ",0 msgUnsupC: .DB CR,LF,"FLASH CHIP NOT SUPPORTED",CR,LF,0 msgReboot: .DB CR,LF,"REBOOTING ...",CR,LF,0 msgCopying: .DB CR,LF,"COPYING ...",CR,LF,0 +msgCalc: .DB CR,LF,"CALCULATING CRC32 ...",CR,LF,0 +msgCRC32: .DB CR,LF,CR,LF,"CRC32 : ",0 msgFailWrt: .DB CR,LF,"FLASH WRITE FAILED",CR,LF,0 msgFailure: .DB CR,LF,"TRANSMISSION FAILED",CR,LF,0 msgCancel: .DB CR,LF,"TRANSMISSION CANCELLED",CR,LF,0 @@ -1138,6 +1277,8 @@ msgBegin: .DB CR,LF,"(R) Reboot" .DB CR,LF,"(U) Begin Update" .DB CR,LF,"(X) Exit to Rom Loader" .DB CR,LF,"(D) Duplicate Flash #1 to #2" + .DB CR,LF,"(1) CRC Flash #1" + .DB CR,LF,"(2) CRC Flash #2" #IF (XFUDBG) .DB CR,LF,"(H) Select half speed" .DB CR,LF,"(T) Test 20s timeout" @@ -1150,7 +1291,7 @@ msgYES: .DB "YES",0 msgNO: .DB "NO",0 msgPacErr: .DB CR,LF,"PACKET COUNT MISMATCH ERROR",CR,LF,0 msgChkSum .DB CR,LF,"CHECKSUM ERROR",CR,LF,0 -msgRetry .DB CR,LF,"ERROR, RETRY COUNT EXCEED",CR,LF,0 +msgRetry .DB CR,LF,"ERROR, RETRY COUNT EXCEEDED",CR,LF,0 msgTimout .DB CR,LF,"ERROR, RECEIVE TIMEOUT",CR,LF,0 ; ; Variables @@ -1168,6 +1309,8 @@ pktNo1c: .DB 0 ; Current packet Number 1-complemented MD_FBAS .DW $FFFF ; CURRENT BANK AND SECTOR MD_SECT .EQU MD_FBAS ; BANK BYTE MD_BANK .EQU MD_FBAS+1 ; SECTOR BYTE +CRC .DW $FFFF ; CRC32 + .DW $FFFF ; packet: .DB 0 ; SOH .DB 0 ; PacketN