diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 79020f5d..69a0989d 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1357,25 +1357,8 @@ 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 - JR HB_PCPU ; PRINT Z8S180-N -; -HB_STRZ80 .TEXT " Z80$" -HB_STRZ180 .TEXT " Z80180$" -HB_STRZS180K .TEXT " Z8S180-K$" -HB_STRZS180N .TEXT " Z8S180-N$" -; -HB_PCPU: - CALL WRITESTR ; PRINT IT + LD DE,HB_CPU_STR ; DISPLAY IT + CALL PRTIDXDEA ; PRTS(" @ $") LD HL,(CB_CPUKHZ) @@ -3016,7 +2999,6 @@ PRTD3M2: CALL COUT PRTD3M3: RET -; ;================================================================================================== ; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES ;================================================================================================== @@ -3026,58 +3008,38 @@ 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 -; -PRTSUM3A: - RET ; DONE + INC C ; BUMP UNIT INDEX + DJNZ PRT_ALLD1 ; LOOP THRU ALL DEVICES + RET ; ; PRINT ONE LINE DISK UNIT/DEVICE INFO, DISK UNIT INDEX IN C ; @@ -3177,51 +3139,19 @@ PS_PRTDC1: ; PS_PRTDC2: LD C,E ; ATTRIBUTE TO C FOR SAFE KEEPING - ; PRINT FLOPPY TYPE - LD A,C ; ATTRIBUTE TO ACCUM - RLCA ; ISOLATE FORM FACTOR BITS - RLCA - RLCA - AND $03 - LD DE,PS_FLP8 ; ASSUME 8" - CP 0 - JR Z,PS_PRTDC2A - LD DE,PS_FLP5 ; ASSUME 5.25" - CP 1 - JR Z,PS_PRTDC2A - LD DE,PS_FLP3 ; ASSUME 3.5" - CP 2 - JR Z,PS_PRTDC2A - LD DE,PS_FLPN ; ASSUME OTHER" -PS_PRTDC2A: - CALL WRITESTR - ; PRINT FLOPPY SIDES - LD A,C ; ATTRIBUTE TO ACCUM - LD DE,PS_FLPSS ; ASSUME SINGLE SIDED - BIT 4,A ; DS? - JR Z,PS_PRTDC2B - LD DE,PS_FLPDS ; DOUBLE SIDED -PS_PRTDC2B: - CALL WRITESTR - ; PRINT FLOPPY DENSITY - LD A,C ; ATTRIBUTE TO ACCUM - RRCA ; ISOLATE DENSITY BITS - RRCA - AND $03 - LD DE,PS_FLPSD ; SINGLE DENSITY - CP 0 - JR Z,PS_PRTDC2C - LD DE,PS_FLPDD ; DOUBLE DENSITY - CP 1 - JR Z,PS_PRTDC2C - LD DE,PS_FLPHD ; HIGH DENSITY - CP 2 - JR Z,PS_PRTDC2C - LD DE,PS_FLPED ; EXTENDED DENSITY - CP 3 - JR Z,PS_PRTDC2C -PS_PRTDC2C: - CALL WRITESTR +; + LD A,01100000B ; DISPLAY FORM FACTOR + LD DE,PS_FLP_FSTR ; WHICH IS DEFINED IN + CALL PRTIDXMSK ; BITS 5 AND 6. +; + LD A,00010000B ; DISPLAY SIDES + LD DE,PS_FLP_SSTR ; WHICH IS DEFINED + CALL PRTIDXMSK ; IN BIT 4 +; + LD A,00001100B ; DISPLAY DENSITY + LD DE,PS_FLP_DSTR ; WHICH IS DEFINED IN + CALL PRTIDXMSK ; BITS 2 AND 3. +; CALL PC_COMMA PRTS("CHS$") ; FOR NOW, WE ASSUME HARD DISK DOES LBA ; @@ -3348,32 +3278,12 @@ PSPRTPC0: JP Z,PS_PRTNUL ; $FF == NO CONFIG DEFINED ; PS_PRTPC0: - LD A,E - RLCA - RLCA - 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$") - RET - + LD C,E ; DISPLAY PIO TYPE + LD A,11000000B ; WHICH IS DEFINE BY + LD DE,PIO_MODE_STR ; BITS 6 AND 7 + JP PRTIDXMSK +; RET ; TRICK RETURN +; PS_PRTSC1: ; PRINT TERMINAL CONFIG LD A,C ; GET ATTRIBUTE VALUE @@ -3503,7 +3413,10 @@ PS_PAD1: DJNZ PS_PAD1 RET ; -; +HB_CPU_STR: .TEXT " Z80$" ; HB_STRZ80 + .TEXT " Z80180$" ; HB_STRZ180 + .TEXT " Z8S180-K$" ; HB_STRZS180K + .TEXT " Z8S180-N$" ; HB_STRZS180N ; PS_STRNUL .TEXT "--$" ; DISPLAY STRING FOR NUL VALUE ; @@ -3542,20 +3455,20 @@ PS_DTOTHER .TEXT "???$" ; ; FLOPPY ATTRIBUTE STRINGS ; -PS_FLP8 .TEXT "8\",$" -PS_FLP5 .TEXT "5.25\",$" -PS_FLP3 .TEXT "3.5\",$" -PS_FLPN .TEXT "???\",$" +PS_FLP_FSTR: .TEXT "8\",$" ; PS_FLP8 + .TEXT "5.25\",$" ; PS_FLP5 + .TEXT "3.5\",$" ; PS_FLP3 + .TEXT "???\",$" ; PS_FLPN ; -PS_FLPSS .TEXT "SS/$" -PS_FLPDS .TEXT "DS/$" +PS_FLP_SSTR: .TEXT "SS/$" ; PS_FLPSS + .TEXT "DS/$" ; PS_FLPDS ; -PS_FLPSD .TEXT "SD$" -PS_FLPDD .TEXT "DD$" -PS_FLPHD .TEXT "HD$" -PS_FLPED .TEXT "ED$" +PS_FLP_DSTR: .TEXT "SD$" ; PS_FLPSD + .TEXT "DD$" ; PS_FLPDD + .TEXT "HD$" ; PS_FLPHD + .TEXT "ED$" ; PS_FLPED ; -; SERIAL DEVICE STRINGS +; CHARACTER DEVICE STRINGS ; PS_SDSTRREF: .DW PS_SDUART, PS_SDASCI, PS_SDTERM, @@ -3571,17 +3484,20 @@ PS_SDACIA .TEXT "ACIA$" PS_SDPIO .TEXT "PORT$" PS_SDUF .TEXT "UF$" ; -; SERIAL TYPE STRINGS +; CHARACTER SUB TYPE STRINGS ; PS_STRS232 .TEXT "RS-232$" PS_STTERM .TEXT "Terminal$" PS_STPPT .TEXT "Parallel$" ; PS_STPARMAP .DB "NONENMNS" - ; -; SERIAL TYPE STRINGS +; PARALLEL TYPE STRINGS ; +PIO_MODE_STR: .TEXT "Output$" + .TEXT "Input$" + .TEXT "Bidirectional$" + .TEXT "BitCtrl$" ; ; VIDEO DEVICE STRINGS ; @@ -3598,10 +3514,6 @@ PS_VDVGA .TEXT "VGA$" ; PS_VTCRT .TEXT "CRT$" ; -; VIDEO CONFIG STRINGS -; -; -; ; 0 1 2 3 4 5 6 7 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 PS_STRHDR .TEXT "Unit Device Type Capacity/Mode\r\n" diff --git a/Source/HBIOS/pio.asm b/Source/HBIOS/pio.asm index 9baf014d..349858a2 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: + .TEXT "$" ; IDX 0 + .TEXT "Zilog PIO$" ; IDX 1 + .TEXT "i8255 PPI$" ; IDX 2 + .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/uf.asm b/Source/HBIOS/uf.asm index d19f3925..4b13ecab 100644 --- a/Source/HBIOS/uf.asm +++ b/Source/HBIOS/uf.asm @@ -56,15 +56,15 @@ UF_INITUNIT: ; UF_INIT: CALL NEWLINE ; PRINT DEVICE - PRTS("USB-FIFO: $") - PRTS("IO=0x$") + CALL PRTSTRD + .TEXT "USB-FIFO: IO=0x$") LD A,UFBASE ; PRINT PORT CALL PRTHEXBYTE LD A,(UF_USB_ACTIVE) ; PRINT CONNECTION STATUS OR A ; REQUIRES TERMINAL PROGRAM RET NZ ; TO HAVE INITIALIZED PORT - PRTS(" No $") ; ON PC SIDE. - PRTS("connection$") + CALL PRTSTRD ; ON PC SIDE. + .TEXT "No connection$" RET ; ; INPUT A CHARACTER AND RETURN IT IN E @@ -119,7 +119,7 @@ UF_INITDEV: INC A ; ... SO Z SET IF -1 JR NZ,UF_INITDEV1 ; IF DE == -1, REINIT CURRENT CONFIG ; - ; GET CURRENT PSW. WE ALWAYS RESAVE AT END + ; GET CURRENT SPW. WE ALWAYS RESAVE AT END LD E,(IY+0) ; LOW BYTE LD D,(IY+1) ; HIGH BYTE ; diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index ad14ef6e..d4bd7f49 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -295,7 +295,56 @@ DB_CONTD: JP DB_BLKRD ; DB_END: - RET ; + RET +; +; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY $ +; C REGISTER CONTAINS THE INDEX TO THE STRING TO BE DISPLAYED. +; A REGISTER CONTAINS A MASK TO BE APPLIED TO THE INDEX +; THE INDEX IS NORMALIZED TO A RANGE 0..N USING THE MASK AND THEN THE nTH +; STRING IS PRINTED IN A LIST DEFINED BY DE +; +; C = ATTRIBUTE +; A = MASK +; DE = STRING LIST +; +PRTIDXMSK: + PUSH BC +PRTIDXMSK0: + BIT 0,A + JR NZ,PRTIDXMSK1 + SRL A + SRL C + JR PRTIDXMSK0 +PRTIDXMSK1: + LD B,A + LD A,C + AND B + POP BC +; +; 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 ;