From a3a4e849656f67d0d19bc68806964d9a13639789 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 1 Sep 2019 13:55:28 +0800 Subject: [PATCH] Refactor of device summary --- Source/HBIOS/hbios.asm | 192 ++++++++++++++++++++++++----------------- Source/HBIOS/pio.asm | 39 ++++----- Source/HBIOS/util.asm | 27 +++++- 3 files changed, 156 insertions(+), 102 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 79020f5d..01eead8f 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1357,18 +1357,23 @@ HB_SPDTST: PRTX(STR_PLATFORM) ; LD A,(HB_CPUTYPE) ; GET CPU TYPE - OR A ; SET FLAGS - LD DE,HB_STRZ80 ; Z80 - JR Z,HB_PCPU ; IF Z80, PRINT IT - DEC A ; NEXT CPU TYPE - LD DE,HB_STRZ180 ; Z80180 - JR Z,HB_PCPU ; IF Z80180, PRINT IT - DEC A ; NEXT CPU TYPE - LD DE,HB_STRZS180K ; Z8S180 REV K - JR Z,HB_PCPU ; IF Z8S180-K, PRINT IT - LD DE,HB_STRZS180N ; Z8S180 REV N + LD DE,HB_CPU_STR ; DISPLAY IT + CALL PRTIDXDEA +; OR A ; SET FLAGS +; LD DE,HB_STRZ80 ; Z80 +; JR Z,HB_PCPU ; IF Z80, PRINT IT +; DEC A ; NEXT CPU TYPE +; LD DE,HB_STRZ180 ; Z80180 +; JR Z,HB_PCPU ; IF Z80180, PRINT IT +; DEC A ; NEXT CPU TYPE +; LD DE,HB_STRZS180K ; Z8S180 REV K +; JR Z,HB_PCPU ; IF Z8S180-K, PRINT IT +; LD DE,HB_STRZS180N ; Z8S180 REV N + + JR HB_PCPU ; PRINT Z8S180-N ; +HB_CPU_STR: HB_STRZ80 .TEXT " Z80$" HB_STRZ180 .TEXT " Z80180$" HB_STRZS180K .TEXT " Z8S180-K$" @@ -3016,7 +3021,6 @@ PRTD3M2: CALL COUT PRTD3M3: RET -; ;================================================================================================== ; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES ;================================================================================================== @@ -3026,58 +3030,100 @@ PRTSUM: LD DE,PS_STRHDR ; POINT TO HEADER CALL WRITESTR ; PRINT IT ; - ; PRINT DISK DEVICES - LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET - LD C,BF_SYSGET_DIOCNT ; SUBFUNC: DISK UNIT COUNT - RST 08 ; E := DISK UNIT COUNT - LD B,E ; MOVE TO B FOR LOOP COUNT - LD A,E ; MOVE TO ACCUM - OR A ; SET FLAGS - JR Z,PRTSUM1A ; IF NONE, BYPASS - LD C,0 ; C WILL BE UNIT INDEX -PRTSUM1: - PUSH BC ; SAVE LOOP CONTROL - CALL PS_DISK ; PRINT DISK INFO - POP BC ; RESTORE LOOP CONTROL - INC C ; BUMP DISK UNIT INDEX - DJNZ PRTSUM1 ; LOOP THRU ALL DISK DEVICES + LD C,BF_SYSGET_CIOCNT ; CHARACTER DEVICES + LD HL,PS_SERIAL + CALL PRT_ALLD ; -PRTSUM1A: - ; PRINT SERIAL DEVICES - LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET - LD C,BF_SYSGET_CIOCNT ; SUBFUNC: SERIAL UNIT COUNT - RST 08 ; E := SERIAL UNIT COUNT - LD B,E ; MOVE TO B FOR LOOP COUNT - LD A,E ; MOVE TO ACCUM - OR A ; SET FLAGS - JR Z,PRTSUM2A ; IF NONE, BYPASS - LD C,0 ; C WILL BE UNIT INDEX -PRTSUM2: - PUSH BC ; SAVE LOOP CONTROL - CALL PS_SERIAL ; PRINT SERIAL INFO - POP BC ; RESTORE LOOP CONTROL - INC C ; BUMP SERIAL UNIT INDEX - DJNZ PRTSUM2 ; LOOP THRU ALL SERIAL DEVICES + LD C,BF_SYSGET_DIOCNT ; DISK DRIVES + LD HL,PS_DISK + CALL PRT_ALLD + + LD C,BF_SYSGET_VDACNT ; VIDEO DEVICES + LD HL,PS_VIDEO + CALL PRT_ALLD + RET ; -PRTSUM2A: - ; PRINT VIDEO DEVICES +PRT_ALLD: LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET - LD C,BF_SYSGET_VDACNT ; SUBFUNC: VIDEO UNIT COUNT - RST 08 ; E := SERIAL UNIT COUNT + RST 08 ; E := UNIT COUNT LD B,E ; MOVE TO B FOR LOOP COUNT LD A,E ; MOVE TO ACCUM OR A ; SET FLAGS - JR Z,PRTSUM3A ; IF NONE, BYPASS + JR Z,PRT_ALLD1 ; IF NONE, BYPASS LD C,0 ; C WILL BE UNIT INDEX -PRTSUM3: +PRT_ALLD1: PUSH BC ; SAVE LOOP CONTROL - CALL PS_VIDEO ; PRINT VIDEO INFO + PUSH DE + PUSH HL + CALL JPHL ; CALL THE ROUTINE PASSED IN HL + POP HL + POP DE POP BC ; RESTORE LOOP CONTROL - INC C ; BUMP VIDEO UNIT INDEX - DJNZ PRTSUM3 ; LOOP THRU ALL VIDEO DEVICES + INC C ; BUMP DISK UNIT INDEX + DJNZ PRT_ALLD1 ; LOOP THRU ALL DISK DEVICES + RET ; -PRTSUM3A: - RET ; DONE +;================================================================================================== +; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES +;================================================================================================== +; +;PRTSUM: +; CALL NEWLINE2 ; SKIP A LINE +; LD DE,PS_STRHDR ; POINT TO HEADER +; CALL WRITESTR ; PRINT IT +; +; ; PRINT DISK DEVICES +; LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET +; LD C,BF_SYSGET_DIOCNT ; SUBFUNC: DISK UNIT COUNT +; RST 08 ; E := DISK UNIT COUNT +; LD B,E ; MOVE TO B FOR LOOP COUNT +; LD A,E ; MOVE TO ACCUM +; OR A ; SET FLAGS +; JR Z,PRTSUM1A ; IF NONE, BYPASS +; LD C,0 ; C WILL BE UNIT INDEX +;PRTSUM1: +; PUSH BC ; SAVE LOOP CONTROL +; CALL PS_DISK ; PRINT DISK INFO +; POP BC ; RESTORE LOOP CONTROL +; INC C ; BUMP DISK UNIT INDEX +; DJNZ PRTSUM1 ; LOOP THRU ALL DISK DEVICES +; +;PRTSUM1A: +; ; PRINT SERIAL DEVICES +; LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET +; LD C,BF_SYSGET_CIOCNT ; SUBFUNC: SERIAL UNIT COUNT +; RST 08 ; E := SERIAL UNIT COUNT +; LD B,E ; MOVE TO B FOR LOOP COUNT +; LD A,E ; MOVE TO ACCUM +; OR A ; SET FLAGS +; JR Z,PRTSUM2A ; IF NONE, BYPASS +; LD C,0 ; C WILL BE UNIT INDEX +;PRTSUM2: +; PUSH BC ; SAVE LOOP CONTROL +; CALL PS_SERIAL ; PRINT SERIAL INFO +; POP BC ; RESTORE LOOP CONTROL +; INC C ; BUMP SERIAL UNIT INDEX +; DJNZ PRTSUM2 ; LOOP THRU ALL SERIAL DEVICES +; +;PRTSUM2A: +; ; PRINT VIDEO DEVICES +; LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET +; LD C,BF_SYSGET_VDACNT ; SUBFUNC: VIDEO UNIT COUNT +; RST 08 ; E := SERIAL UNIT COUNT +; LD B,E ; MOVE TO B FOR LOOP COUNT +; LD A,E ; MOVE TO ACCUM +; OR A ; SET FLAGS +; JR Z,PRTSUM3A ; IF NONE, BYPASS +; LD C,0 ; C WILL BE UNIT INDEX +;PRTSUM3: +; PUSH BC ; SAVE LOOP CONTROL +; CALL PS_VIDEO ; PRINT VIDEO INFO +; POP BC ; RESTORE LOOP CONTROL +; INC C ; BUMP VIDEO UNIT INDEX +; DJNZ PRTSUM3 ; LOOP THRU ALL VIDEO DEVICES +; +;PRTSUM3A: +; RET ; DONE ; ; PRINT ONE LINE DISK UNIT/DEVICE INFO, DISK UNIT INDEX IN C ; @@ -3348,32 +3394,16 @@ PSPRTPC0: JP Z,PS_PRTNUL ; $FF == NO CONFIG DEFINED ; PS_PRTPC0: - LD A,E - RLCA - RLCA + LD A,E ; CONVERT THE TYPE TO + RLCA ; A TABLE INDEX 0..5 + RLCA ; AND DISPLAY THE TYPE AND 00000011B - JR NZ,PSPRTPC1 - PRTS("Output$") - RET -PSPRTPC1: - DEC A - JR NZ,PSPRTPC2 - PRTS("Input$") - RET -PSPRTPC2: - DEC A - JR NZ,PSPRTPC3 - PRTS("Bidirectional$") - RET -PSPRTPC3: - DEC A - JR NZ,PSPRTPC4 - PRTS("BitCtrl$") - RET -PSPRTPC4: - PRTS("Undefined$") + PUSH DE + LD DE,PIO_MODE_STR + CALL PRTIDXDEA + POP DE RET - +; PS_PRTSC1: ; PRINT TERMINAL CONFIG LD A,C ; GET ATTRIBUTE VALUE @@ -3578,10 +3608,14 @@ PS_STTERM .TEXT "Terminal$" PS_STPPT .TEXT "Parallel$" ; PS_STPARMAP .DB "NONENMNS" - ; -; SERIAL TYPE STRINGS +; PIO TYPE STRINGS ; +PIO_MODE_STR: + .TEXT "Output$" + .TEXT "Input$" + .TEXT "Bidirectional$" + .TEXT "BitCtrl$" ; ; VIDEO DEVICE STRINGS ; diff --git a/Source/HBIOS/pio.asm b/Source/HBIOS/pio.asm index 9baf014d..f9967606 100644 --- a/Source/HBIOS/pio.asm +++ b/Source/HBIOS/pio.asm @@ -24,8 +24,8 @@ ; would be required to support this configuration. As the HBIOS only has an allocation of ; 16, a full implmentation is impractical. ; -; The compromise solution is to allow 4 interrupts for the PIO driver.; All remaining PIO's -; are limited to Bit mode or blind read and writed to the input/output ports. +; The compromise solution is to allow 4 interrupts for the PIO driver. All remaining PIO's +; are limited to Bit mode or blind read and write to the input/output ports. ; ; Zilog PIO reset state: ; @@ -130,7 +130,7 @@ PIO_PREINIT0: ; PUSH HL ; SAVE IT ; POP IY ; ... TO IY - CALL IDXCFG + CALL IDXCFG LD (HL),C @@ -215,8 +215,12 @@ SKPINIT:DJNZ PIO_PREINIT0 ; LOOP UNTIL DONE XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; -; X24 +; INDEX INTO THE CONFIG TABLE +; ON ENTRY C = UNIT NUMBER +; ON EXIT IY = CONFIG DATA POINTER +; ON EXIT DE = CONFIG TABLE START ; +; EACH CONFIG TABLE IS 24 BYTES LONG ; CFG_SIZ .EQU 24 ; @@ -778,14 +782,9 @@ PIO_PRTCFG: ; PRINT THE PIO TYPE CALL PC_SPACE ; FORMATTING LD A,(IY+1) ; GET PIO TYPE BYTE - RLCA ; MAKE IT A WORD OFFSET - LD HL,PIO_TYPE_MAP ; POINT HL TO TYPE MAP TABLE - CALL ADDHLA ; HL := ENTRY - LD E,(HL) ; DEREFERENCE - INC HL ; ... - LD D,(HL) ; ... TO GET STRING POINTER - CALL WRITESTR ; PRINT IT -; + LD DE,PIO_TYPE_STR ; POINT HL TO TYPE MAP TABLE + CALL PRTIDXDEA + ; ALL DONE IF NO PIO WAS DETECTED LD A,(IY+1) ; GET PIO TYPE BYTE OR A ; SET FLAGS @@ -812,16 +811,11 @@ PIO_DEV .DB 0 ; DEVICE NUM USED DURING INIT ; ; DESCRIPTION OF DIFFERENT PORT TYPES ; -PIO_TYPE_MAP: - .DW PIO_STR_NONE - .DW PIO_STR_PIO - .DW PIO_STR_8255 - .DW PIO_STR_PORT - -PIO_STR_NONE .DB "$" -PIO_STR_PIO .DB "Zilog PIO$" -PIO_STR_8255 .DB "i8255 PPI$" -PIO_STR_PORT .DB "IO Port$" +PIO_TYPE_STR: +PIO_STR_NONE .TEXT "$" ; IDX 0 +PIO_STR_PIO .TEXT "Zilog PIO$" ; IDX 1 +PIO_STR_8255 .TEXT "i8255 PPI$" ; IDX 2 +PIO_STR_PORT .TEXT "IO Port$" ; IDX 3 ; ; Z80 PIO PORT TABLE - EACH ENTRY IS FOR 1 CHIP I.E. TWO PORTS ; @@ -974,6 +968,7 @@ PIO_INIT1: ; POP AF ; CALL ADDHLA ; HL := ENTRY ADDRESS ; PUSH HL ; COPY CFG DATA PTR +; POP IY ; ... TO IY ; POP IY ; ... TO IY CALL IDXCFG diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index ad14ef6e..4e09b63d 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -295,7 +295,32 @@ DB_CONTD: JP DB_BLKRD ; DB_END: - RET ; + RET +; +; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY $ +; A REGISTER DEFINES THE nTH STRING IN THE LIST TO PRINT AND DE POINTS +; TO THE START OF THE STRING LIST. +; +; SLOW BUT IMPROVES CODE SIZE, READABILITY AND ELIMINATES THE NEED HAVE +; LIST OF POINTERS OR A LIST OF CONDITIONAL CHECKS. +; +PRTIDXDEA: + PUSH BC + LD C,A ; INDEX COUNT + OR A +PRTIDXDEA1: + JR Z,PRTIDXDEA3 +PRTIDXDEA2: + LD A,(DE) ; LOOP UNIT + INC DE ; WE REACH + CP '$' ; END OF STRING + JR NZ,PRTIDXDEA2 + DEC C ; AT STRING END. SO GO + JR PRTIDXDEA1 ; CHECK FOR INDEX MATCH +PRTIDXDEA3: + POP BC +; CALL WRITESTR ; FALL THROUGH TO WRITESTR +; RET ; ; OUTPUT A '$' TERMINATED STRING AT DE ;