diff --git a/Source/HBIOS/ansi.asm b/Source/HBIOS/ansi.asm index 720926d1..bde6b869 100644 --- a/Source/HBIOS/ansi.asm +++ b/Source/HBIOS/ansi.asm @@ -27,8 +27,8 @@ ANSI_DEFCOLOR .EQU 7 ; WHITE ON BLACK ; ANSI_INIT: ; SAVE INCOMING VDA DISPATCH ADDRESS - LD C,A ; VDA DRIVER'S DEVICE TYPE - LD (ANSI_DEVTYPE),A ; ... SAVED LOCALLY + LD A,C ; VDA DRIVER'S DEVICE TYPE + LD (ANSI_DEVTYPE),A ; ... SAVED LOCALLY LD (ANSI_VDADISPADR),DE ; RECORD NEW VDA DISPATCH ADDRESS CALL ANSI_RESET ; FULL RESET OF EMULATOR INTERNAL STATE LD DE,ANSI_DISPATCH ; RETURN OUR DISPATCH ADDRESS diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 82a0fd1b..084fbe5d 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -37,12 +37,17 @@ CVDU_INIT: PRTS("KB$") CALL CVDU_LOADFONT ; LOAD FONT DATA FROM ROM TO CVDU STRORAGE + ; ADD OURSELVES TO VDA DISPATCH TABLE + LD B,0 ; PHYSICAL UNIT IS ZERO + LD C,VDADEV_CVDU ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + ; ADD OURSELVES TO CIO DISPATCH TABLE LD B,0 ; PHYSICAL UNIT IS ZERO LD C,CIODEV_CVDU ; DEVICE TYPE LD DE,0 ; UNIT DATA BLOB ADDRESS CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - ;LD (CVDU_CIOUNIT),A ; SAVE IT LOCALLY LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE LD D,VDAEMU ; DEFAULT EMULATION @@ -71,27 +76,29 @@ CVDU_DISPATCH: DEC A JP Z,CVDU_VDARES ; $42 DEC A - JP Z,CVDU_VDASCS ; $43 + JP Z,CVDU_VDADEV ; $43 DEC A - JP Z,CVDU_VDASCP ; $44 + JP Z,CVDU_VDASCS ; $44 DEC A - JP Z,CVDU_VDASAT ; $45 + JP Z,CVDU_VDASCP ; $45 DEC A - JP Z,CVDU_VDASCO ; $46 + JP Z,CVDU_VDASAT ; $46 DEC A - JP Z,CVDU_VDAWRC ; $47 + JP Z,CVDU_VDASCO ; $47 DEC A - JP Z,CVDU_VDAFIL ; $48 + JP Z,CVDU_VDAWRC ; $48 DEC A - JP Z,CVDU_VDACPY ; $49 + JP Z,CVDU_VDAFIL ; $49 DEC A - JP Z,CVDU_VDASCR ; $4A + JP Z,CVDU_VDACPY ; $4A DEC A - JP Z,KBD_STAT ; $4B + JP Z,CVDU_VDASCR ; $4B DEC A - JP Z,KBD_FLUSH ; $4C + JP Z,KBD_STAT ; $4C DEC A - JP Z,KBD_READ ; $4D + JP Z,KBD_FLUSH ; $4D + DEC A + JP Z,KBD_READ ; $4E CALL PANIC CVDU_VDAINI: @@ -102,8 +109,6 @@ CVDU_VDAINI: ; INITIALIZE EMULATION LD B,D ; EMULATION TYPE TO B - ;LD A,(CVDU_CIOUNIT) ; CIO UNIT NUMBER - ;LD C,A ; ... IS PASSED IN C LD C,CIODEV_CVDU ; PASS OUR DEVICE TYPE IN C LD DE,CVDU_DISPATCH ; DISPATCH ADDRESS TO DE CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER @@ -134,7 +139,12 @@ CVDU_VDARES: XOR A RET - + +CVDU_VDADEV: + LD D,VDADEV_CVDU ; D := DEVICE TYPE + LD E,C ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET CVDU_VDASCS: CALL PANIC ; NOT IMPLEMENTED (YET) @@ -650,8 +660,6 @@ CVDU_BLKCPY1: ; CVDU DRIVER - DATA ;================================================================================================== ; -;CVDU_CIOUNIT .DB $FF ; LOCAL COPY OF OUR CIO UNIT NUMBER -; CVDU_ATTR .DB 0 ; CURRENT COLOR CVDU_POS .DW 0 ; CURRENT DISPLAY POSITION ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index daeca3e1..3aef7262 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1105,8 +1105,39 @@ EMU_INIT1: ; C: UNIT NUMBER ; VDA_DISPATCH: - LD A,C ; REQUESTED DEVICE/UNIT IS IN C - AND $F0 ; ISOLATE THE DEVICE PORTION +; LD A,C ; REQUESTED DEVICE/UNIT IS IN C +; AND $F0 ; ISOLATE THE DEVICE PORTION + +; +; ON ENTRY C IS HBIOS UNIT # (INDEX INTO VDA_TBL OF VIDEO DEVICES) +; USE UNIT # IN C TO LOOKUP VDA_TBL ENTRY, THEN +; CONVERT C TO THE DEVICE/DRIVER SPECIFIC UNIT ID +; AND GET THE DEVICE TYPE TO A FOR DRIVER DISPATCHING +; + LD A,C ; INCOMING UNIT INDEX TO A + PUSH HL ; SAVE INCOMING HL + LD HL,VDA_CNT ; HL := ADDRESS OF TABLE ENTRY COUNT + CP (HL) ; COMPARE TO INCOMING ENTRY INDEX + JR C,VDA_DISPATCH1 ; UNIT OK, PROCEED +; + ; NOT GOOD, INCOMING UNIT IS OUT OF RANGE + POP HL ; RESTORE HL/STACK + CALL PANIC ; PANIC + OR $FF ; SIGNAL ERROR + RET ; AND RETURN +; +VDA_DISPATCH1: + INC HL ; BUMP PAST COUNT PREFIX TO START OF TABLE + RLCA ; MULTIPLY BY 4 TO + RLCA ; ... TO CALC ENTRY OFFSET + CALL ADDHLA ; HL := ENTRY OFFSET + LD A,(HL) ; GET DEVICE TYPE BYTE + INC HL ; BUMP TO DEVICE UNIT INDEX BYTE + LD C,(HL) ; DEVICE UNIT INDEX TO C + POP HL ; RECOVER INCOMING HL VALUE +; +; DISPATCH TO DRIVER BASED ON DEVICE TYPE IN A +; #IF (VDUENABLE) CP VDADEV_VDU JP Z,VDU_DISPATCH @@ -1125,6 +1156,30 @@ VDA_DISPATCH: #ENDIF CALL PANIC ; +; HBIOS VIDEO DEVICE UNIT TABLE +; +; TABLE IS BUILT DYNAMICALLY BY EACH DRIVER DURING INITIALIZATION. +; THE TABLE IS PREFIXED BY TWO BYTES. TABLE - 1 CONTAINS THE CURRENT +; NUMBER OF ENTRIES. TABLE - 2 CONTAINS THE MAXIMUM NUMBER OF ENTRIES. +; EACH ENTRY IS DEFINED AS: +; +; BYTE DEVICE TYPE ID +; BYTE DEVICE/DRIVER UNIT NUMBER +; WORD UNIT DATA ADDRESS +; +VDA_MAX .EQU 16 ; UP TO 16 UNITS +VDA_SIZ .EQU VDA_MAX * 4 ; EACH ENTRY IS 4 BYTES +; + .DB VDA_MAX ; MAX ENTRY COUNT TABLE PREFIX +VDA_CNT .DB 0 ; ENTRY COUNT PREFIX +VDA_TBL .FILL VDA_SIZ,0 ; SPACE FOR ENTRIES +; +; ADD AN ENTRY TO THE VDA UNIT TABLE (SEE HB_ADDENT FOR DETAILS) +; +VDA_ADDENT: + LD HL,VDA_TBL ; POINT TO VDA TABLE + JP HB_ADDENT ; ... AND GO TO COMMON CODE +; ;================================================================================================== ; SYSTEM FUNCTION DISPATCHER ;================================================================================================== @@ -1276,6 +1331,8 @@ SYS_GET: JR Z,SYS_GETCIOCNT CP BF_SYSGET_DIOCNT JR Z,SYS_GETDIOCNT + CP BF_SYSGET_VDACNT + JR Z,SYS_GETVDACNT CP BF_SYSGET_BOOTINFO JR Z,SYS_GETBOOTINFO CP BF_SYSGET_CPUINFO @@ -1353,6 +1410,14 @@ SYS_GETDIOCNT: XOR A ; SIGNALS SUCCESS RET ; +; GET VIDEO UNIT COUNT +; +SYS_GETVDACNT: + LD A,(VDA_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) + LD E,A ; PUT IT IN E + XOR A ; SIGNALS SUCCESS + RET +; ; SET SYSTEM PARAMETERS ; PARAMETER(S) TO SET INDICATED IN C ; @@ -1997,7 +2062,10 @@ PRTSUM: 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 C,0 ; D WILL BE UNIT INDEX + 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 @@ -2005,19 +2073,41 @@ PRTSUM1: 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: DISK UNIT COUNT - RST 08 ; E := DISK UNIT COUNT + 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 C,0 ; D WILL BE UNIT INDEX + 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 DISK UNIT INDEX - DJNZ PRTSUM2 ; LOOP THRU ALL DISK DEVICES + 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 @@ -2072,28 +2162,6 @@ PS_PRTDT1: SUB C CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A) RET - - - ;LD A,D - ;RRCA ; TYPE IS IN UPPER NIBBLE, MOVE TO LOWER NIBBLE - ;RRCA - ;RRCA - ;RRCA - ;RLCA ; X2 FOR WORD OFFSET IN STRING TABLE - ;CALL ADDHLA - ;LD A,(HL) - ;INC HL - ;LD H,(HL) - ;LD L,A - - ;CALL PS_PRT ; PRINT $ TERM STRING AT (HL), C:=CHARS PRINTED - ;LD A,E ; NUM - ;CALL PRTDECB ; PRINT NUM, ASSUME 1 CHAR - ;CALL PC_COLON ; PRINT COLON - ;LD A,12 - 2 ; 12 CHAR FIELD - 1 POS FOR UNIT NUM AND 1 POS FOR COLON - ;SUB C - ;CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A) - ;RET ; ; PRINT DISK CAPACITY (UNIT IN C, ATTRIBUTE IN E) ; @@ -2188,22 +2256,7 @@ PS_PRTDC2C: ; RET ; DONE ; -; FLOPPY ATTRIBUTE STRINGS -; -PS_FLP8 .TEXT "8\", $" -PS_FLP5 .TEXT "5.25\", $" -PS_FLP3 .TEXT "3.5\", $" -PS_FLPN .TEXT "???\", $" -; -PS_FLPSS .TEXT "SS/$" -PS_FLPDS .TEXT "SS/$" -; -PS_FLPSD .TEXT "SD$" -PS_FLPDD .TEXT "DD$" -PS_FLPHD .TEXT "HD$" -PS_FLPED .TEXT "ED$" -; -; PRINT ONE LINE SERIAL UNIT/DEVICE INFO, DISK UNIT INDEX IN C +; PRINT ONE LINE SERIAL UNIT/DEVICE INFO, SERIAL UNIT INDEX IN C ; PS_SERIAL: PUSH BC ; SAVE UNIT INDEX FOR LATER @@ -2258,6 +2311,50 @@ PS_PRTSC: RET ; +; PRINT ONE LINE VIDEO UNIT/DEVICE INFO, VIDEO UNIT INDEX IN C +; +PS_VIDEO: + PUSH BC ; SAVE UNIT INDEX FOR LATER +; + ; UNIT COLUMN + PRTS("Video $") + LD A,C ; MOVE UNIT NUM TO A + CALL PRTDECB ; PRINT IT, ASSUME SINGLE DIGIT + PRTS(" $") ; PAD TO NEXT COLUMN +; + ; DEVICE COLUMN + LD B,BF_VDADEV ; FUNC=GET DEVICE INFO, UNIT NUM STILL IN C + RST 08 ; DE:=DEVTYP/NUM, H:=DISK ATTRIBUTES + PUSH BC ; SAVE ATTRIBUTES + LD HL,PS_VDSTRREF ; POINT TO VIDEO DEVICE TYPE NAME TABLE + CALL PS_PRTDEV ; PRINT VIDEO DEVICE NMEMONIC PADDED TO FIELD WIDTH + POP DE ; RECOVER ATTRIBUTES + PUSH DE ; SAVE ATTRIBUTES AGAIN + CALL PS_PRTVT ; PRINT VIDEO TYPE + POP DE ; RESTORE ATTRIBUTES + POP BC ; RESTORE UNIT NUM + CALL PS_PRTVC ; PRINT VIDEO CONFIG +; + CALL NEWLINE + RET +; +; PRINT VIDEO TYPE (VIDEO ATTRIBUTE IN E) +; +PS_PRTVT: + LD HL,PS_VTDUMMY + CALL PS_PRT ; PRINT $ TERM STRING AT (HL), C:=CHARS PRINTED + LD A,18 ; 18 CHAR FIELD + SUB C + CALL PS_PAD ; PAD N SPACES (SPECIFIED IN A) + RET +; +; PRINT VIDEO CONFIG (UNIT IN C, ATTRIBUTE IN E) +; +PS_PRTVC: + LD HL,PS_VCDUMMY + CALL PS_PRT + RET +; ; PRINT DEVICE NMEMONIC, DEVTYP/NUM SPECIFIED IN DE ; PS_PRTDEV: @@ -2343,6 +2440,21 @@ PS_DTRAM .TEXT "RAM Disk$" PS_DTRF .TEXT "RAM Floppy$" PS_DTOTHER .TEXT "???$" ; +; FLOPPY ATTRIBUTE STRINGS +; +PS_FLP8 .TEXT "8\", $" +PS_FLP5 .TEXT "5.25\", $" +PS_FLP3 .TEXT "3.5\", $" +PS_FLPN .TEXT "???\", $" +; +PS_FLPSS .TEXT "SS/$" +PS_FLPDS .TEXT "SS/$" +; +PS_FLPSD .TEXT "SD$" +PS_FLPDD .TEXT "DD$" +PS_FLPHD .TEXT "HD$" +PS_FLPED .TEXT "ED$" +; ; SERIAL DEVICE STRINGS ; PS_SDSTRREF: @@ -2362,6 +2474,24 @@ PS_SDPPPCON .TEXT "PPPCON$" ; PS_STDUMMY .TEXT "--$" ; +; VIDEO DEVICE STRINGS +; +PS_VDSTRREF: + .DW PS_VDVDU, PS_VDCVDU, PS_VDUPD7220, PS_VDSCG +; +PS_VDVDU .TEXT "VDU$" +PS_VDCVDU .TEXT "CVDU$" +PS_VDUPD7220 .TEXT "UPD7220$" +PS_VDSCG .TEXT "SCG$" +; +; SERIAL TYPE STRINGS +; +PS_VTDUMMY .TEXT "--$" +; +; VIDEO CONFIG STRINGS +; +PS_VCDUMMY .TEXT "--$" +; ; ; 0 1 2 3 4 5 6 7 ; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index b6958533..bcfe89e0 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -39,17 +39,18 @@ BF_VDA .EQU $40 BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU BF_VDAQRY .EQU BF_VDA + 1 ; QUERY VDU STATUS BF_VDARES .EQU BF_VDA + 2 ; SOFT RESET VDU -BF_VDASCS .EQU BF_VDA + 3 ; SET CURSOR STYLE -BF_VDASCP .EQU BF_VDA + 4 ; SET CURSOR POSITION -BF_VDASAT .EQU BF_VDA + 5 ; SET CHARACTER ATTRIBUTE -BF_VDASCO .EQU BF_VDA + 6 ; SET CHARACTER COLOR -BF_VDAWRC .EQU BF_VDA + 7 ; WRITE CHARACTER -BF_VDAFIL .EQU BF_VDA + 8 ; FILL -BF_VDACPY .EQU BF_VDA + 9 ; COPY -BF_VDASCR .EQU BF_VDA + 10 ; SCROLL -BF_VDAKST .EQU BF_VDA + 11 ; GET KEYBOARD STATUS -BF_VDAKFL .EQU BF_VDA + 12 ; FLUSH KEYBOARD BUFFER -BF_VDAKRD .EQU BF_VDA + 13 ; READ KEYBOARD +BF_VDADEV .EQU BF_VDA + 3 ; DEVICE INFO +BF_VDASCS .EQU BF_VDA + 4 ; SET CURSOR STYLE +BF_VDASCP .EQU BF_VDA + 5 ; SET CURSOR POSITION +BF_VDASAT .EQU BF_VDA + 6 ; SET CHARACTER ATTRIBUTE +BF_VDASCO .EQU BF_VDA + 7 ; SET CHARACTER COLOR +BF_VDAWRC .EQU BF_VDA + 8 ; WRITE CHARACTER +BF_VDAFIL .EQU BF_VDA + 9 ; FILL +BF_VDACPY .EQU BF_VDA + 10 ; COPY +BF_VDASCR .EQU BF_VDA + 11 ; SCROLL +BF_VDAKST .EQU BF_VDA + 12 ; GET KEYBOARD STATUS +BF_VDAKFL .EQU BF_VDA + 13 ; FLUSH KEYBOARD BUFFER +BF_VDAKRD .EQU BF_VDA + 14 ; READ KEYBOARD ; BF_SYS .EQU $F0 BF_SYSSETBNK .EQU BF_SYS + 0 ; SET CURRENT BANK @@ -66,7 +67,7 @@ BF_POKE .EQU BF_SYS + 10 ; PUT A BYTE TO ALT BANK ; BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT -BF_SYSGET_VDACNT .EQU $10 ; GET VDA UNIT COUNT +BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT BF_SYSGET_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION BF_SYSGET_CPUINFO .EQU $F0 ; GET CPU INFORMATION BF_SYSGET_MEMINFO .EQU $F1 ; GET MEMORY CAPACTITY INFO @@ -103,11 +104,11 @@ DIODEV_HDSK .EQU $90 ; ; VDA DEVICE IDS ; -VDADEV_NONE .EQU $00 ; NO VDA DEVICE -VDADEV_VDU .EQU $10 ; ECB VDU - 6545 CHIP -VDADEV_CVDU .EQU $20 ; ECB COLOR VDU - 8563 CHIP (NOT IMP) -VDADEV_UPD7220 .EQU $30 ; ECB uP7220 (NOT IMPLEMENTED) -VDADEV_SCG .EQU $40 ; N8 ONBOARD VDA SUBSYSTEM +;VDADEV_NONE .EQU $00 ; NO VDA DEVICE +VDADEV_VDU .EQU $00 ; ECB VDU - 6545 CHIP +VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - 8563 CHIP (NOT IMP) +VDADEV_UPD7220 .EQU $20 ; ECB uP7220 (NOT IMPLEMENTED) +VDADEV_SCG .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM ; ; EMULATION TYPES ; diff --git a/Source/HBIOS/scg.asm b/Source/HBIOS/scg.asm index 398dcbb5..9121e4e1 100644 --- a/Source/HBIOS/scg.asm +++ b/Source/HBIOS/scg.asm @@ -37,13 +37,18 @@ SCG_INIT: ; CALL SCG_CRTINIT ; SETUP THE SCG CHIP REGISTERS CALL SCG_LOADFONT ; LOAD FONT DATA FROM ROM TO SCG STRORAGE +; + ; ADD OURSELVES TO VDA DISPATCH TABLE + LD B,0 ; PHYSICAL UNIT IS ZERO + LD C,VDADEV_SCG ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED ; ; ADD OURSELVES TO CIO DISPATCH TABLE LD B,0 ; PHYSICAL UNIT IS ZERO LD C,CIODEV_SCG ; DEVICE TYPE LD DE,0 ; UNIT DATA BLOB ADDRESS CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - ;LD (SCG_CIOUNIT),A ; SAVE IT LOCALLY LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE LD D,VDAEMU ; DEFAULT EMULATION @@ -72,27 +77,29 @@ SCG_DISPATCH: DEC A JP Z,SCG_VDARES ; $42 DEC A - JP Z,SCG_VDASCS ; $43 + JP Z,SCG_VDADEV ; $43 + DEC A + JP Z,SCG_VDASCS ; $44 DEC A - JP Z,SCG_VDASCP ; $44 + JP Z,SCG_VDASCP ; $45 DEC A - JP Z,SCG_VDASAT ; $45 + JP Z,SCG_VDASAT ; $46 DEC A - JP Z,SCG_VDASCO ; $46 + JP Z,SCG_VDASCO ; $47 DEC A - JP Z,SCG_VDAWRC ; $47 + JP Z,SCG_VDAWRC ; $48 DEC A - JP Z,SCG_VDAFIL ; $48 + JP Z,SCG_VDAFIL ; $49 DEC A - JP Z,SCG_VDACPY ; $49 + JP Z,SCG_VDACPY ; $4A DEC A - JP Z,SCG_VDASCR ; $4A + JP Z,SCG_VDASCR ; $4B DEC A - JP Z,PPK_STAT ; $4B + JP Z,PPK_STAT ; $4C DEC A - JP Z,PPK_FLUSH ; $4C + JP Z,PPK_FLUSH ; $4D DEC A - JP Z,PPK_READ ; $4D + JP Z,PPK_READ ; $4E CALL PANIC SCG_VDAINI: @@ -103,8 +110,6 @@ SCG_VDAINI: ; INITIALIZE EMULATION LD B,D ; EMULATION TYPE TO B - ;LD A,(SCG_CIOUNIT) ; CIO UNIT NUMBER - ;LD C,A ; ... IS PASSED IN C LD C,CIODEV_SCG ; PASS OUR DEVICE TYPE IN C LD DE,SCG_DISPATCH ; DISPATCH ADDRESS TO DE CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER @@ -121,6 +126,12 @@ SCG_VDAQRY: LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET XOR A ; SIGNAL SUCCESS RET + +SCG_VDADEV: + LD D,VDADEV_SCG ; D := DEVICE TYPE + LD E,C ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET SCG_VDARES: LD DE,0 ; ROW = 0, COL = 0 @@ -598,8 +609,6 @@ SCG_BLKCPY3: ; SCG DRIVER - DATA ;================================================================================================== ; -;SCG_CIOUNIT .DB $FF ; LOCAL COPY OF OUR CIO UNIT NUMBER -; SCG_POS .DW 0 ; CURRENT DISPLAY POSITION SCG_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR SCG_BUF .FILL 256,0 ; COPY BUFFER diff --git a/Source/HBIOS/tty.asm b/Source/HBIOS/tty.asm index 1141d59f..3a7466e1 100644 --- a/Source/HBIOS/tty.asm +++ b/Source/HBIOS/tty.asm @@ -15,7 +15,7 @@ ; TTY_INIT: ; SAVE CALLING VDA DRIVER'S CIO UNIT NUMBER AND VDA DISPATCH ADDRESS - LD C,A ; VDA DRIVER'S DEVICE TYPE + LD A,C ; VDA DRIVER'S DEVICE TYPE LD (TTY_DEVTYPE),A ; ... SAVED LOCALLY LD (TTY_VDADISPADR),DE ; ALSO SAVE VDA DRIVER'S DISPATCH ADDRESS LD DE,TTY_DISPATCH ; RETURN OUR DISPATCH ADDRESS diff --git a/Source/HBIOS/vdu.asm b/Source/HBIOS/vdu.asm index 4120e2d5..c9572004 100644 --- a/Source/HBIOS/vdu.asm +++ b/Source/HBIOS/vdu.asm @@ -33,13 +33,18 @@ VDU_INIT: CALL PRTHEXBYTE ; CALL VDU_CRTINIT ; INIT SY6845 VDU CHIP +; + ; ADD OURSELVES TO VDA DISPATCH TABLE + LD B,0 ; PHYSICAL UNIT IS ZERO + LD C,VDADEV_VDU ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED ; ; ADD OURSELVES TO CIO DISPATCH TABLE LD B,0 ; PHYSICAL UNIT IS ZERO LD C,CIODEV_VDU ; DEVICE TYPE LD DE,0 ; UNIT DATA BLOB ADDRESS CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - ;LD (VDU_CIOUNIT),A ; SAVE IT LOCALLY LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE LD D,VDAEMU ; DEFAULT EMULATION @@ -68,27 +73,29 @@ VDU_DISPATCH: DEC A JR Z,VDU_VDARES ; $42 DEC A - JR Z,VDU_VDASCS ; $43 + JR Z,VDU_VDADEV ; $43 DEC A - JR Z,VDU_VDASCP ; $44 + JR Z,VDU_VDASCS ; $44 DEC A - JR Z,VDU_VDASAT ; $45 + JR Z,VDU_VDASCP ; $45 DEC A - JR Z,VDU_VDASCO ; $46 + JR Z,VDU_VDASAT ; $46 DEC A - JR Z,VDU_VDAWRC ; $47 + JR Z,VDU_VDASCO ; $47 DEC A - JR Z,VDU_VDAFIL ; $48 + JR Z,VDU_VDAWRC ; $48 DEC A - JR Z,VDU_VDACPY ; $49 + JR Z,VDU_VDAFIL ; $49 DEC A - JR Z,VDU_VDASCR ; $4A + JR Z,VDU_VDACPY ; $4A DEC A - JP Z,PPK_STAT ; $4B + JR Z,VDU_VDASCR ; $4B DEC A - JP Z,PPK_FLUSH ; $4C + JP Z,PPK_STAT ; $4C DEC A - JP Z,PPK_READ ; $4D + JP Z,PPK_FLUSH ; $4D + DEC A + JP Z,PPK_READ ; $4E CALL PANIC VDU_VDAINI: @@ -99,8 +106,6 @@ VDU_VDAINI: ; INITIALIZE EMULATION LD B,D ; EMULATION TYPE TO B - ;LD A,(VDU_CIOUNIT) ; CIO UNIT NUMBER - ;LD C,A ; ... IS PASSED IN C LD C,CIODEV_VDU ; PASS OUR DEVICE TYPE IN C LD DE,VDU_DISPATCH ; DISPATCH ADDRESS TO DE CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER @@ -127,7 +132,13 @@ VDU_VDARES: XOR A RET - + +VDU_VDADEV: + LD D,VDADEV_VDU ; D := DEVICE TYPE + LD E,C ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET + VDU_VDASCS: CALL PANIC ; NOT IMPLEMENTED (YET) @@ -469,8 +480,6 @@ VDU_RSCROLL: ; VDU DRIVER - DATA ;================================================================================================== ; -;VDU_CIOUNIT .DB $FF ; LOCAL COPY OF OUR CIO UNIT NUMBER -; VDU_POS .DW 0 ; CURRENT DISPLAY POSITION VDU_OFFSET .DW 0 ; CURRENT DISPLAY POSITION VDU_BUF .FILL 256,0 ; COPY BUFFER