Browse Source

Merge trunk -> dgg

import/raw
wayne 13 years ago
parent
commit
569087f789
  1. BIN
      branches/dgg/Doc/RomWBW Architecture.pdf
  2. BIN
      branches/dgg/Doc/Source/Bank Switched Memory.vsd
  3. BIN
      branches/dgg/Doc/Source/Character Emulation Video Services.vsd
  4. BIN
      branches/dgg/Doc/Source/RomWBW Architecture.docx
  5. 150
      branches/dgg/Source/ansi.asm
  6. 376
      branches/dgg/Source/bnk1.asm
  7. 11
      branches/dgg/Source/cbios.asm
  8. 17
      branches/dgg/Source/config_n8_2312.asm
  9. 17
      branches/dgg/Source/config_n8_2511.asm
  10. 17
      branches/dgg/Source/config_n8vem.asm
  11. 17
      branches/dgg/Source/config_n8vem_dide.asm
  12. 17
      branches/dgg/Source/config_n8vem_diskio.asm
  13. 17
      branches/dgg/Source/config_n8vem_diskio3.asm
  14. 17
      branches/dgg/Source/config_n8vem_ppide.asm
  15. 17
      branches/dgg/Source/config_n8vem_ppisd.asm
  16. 17
      branches/dgg/Source/config_n8vem_propio.asm
  17. 17
      branches/dgg/Source/config_n8vem_vdu.asm
  18. 17
      branches/dgg/Source/config_simh.asm
  19. 17
      branches/dgg/Source/config_zeta.asm
  20. 17
      branches/dgg/Source/config_zeta_ppp.asm
  21. 124
      branches/dgg/Source/n8v.asm
  22. 630
      branches/dgg/Source/ppk.asm
  23. 90
      branches/dgg/Source/std.asm
  24. 150
      branches/dgg/Source/tty.asm
  25. 815
      branches/dgg/Source/vdu.asm
  26. 4
      branches/dgg/Source/ver.inc

BIN
branches/dgg/Doc/RomWBW Architecture.pdf

Binary file not shown.

BIN
branches/dgg/Doc/Source/RomWBW Architecture.vsd → branches/dgg/Doc/Source/Bank Switched Memory.vsd

Binary file not shown.

BIN
branches/dgg/Doc/Source/Character Emulation Video Services.vsd

Binary file not shown.

BIN
branches/dgg/Doc/Source/RomWBW Architecture.docx

Binary file not shown.

150
branches/dgg/Source/ansi.asm

@ -0,0 +1,150 @@
;
;==================================================================================================
; ANSI EMULATION MODULE
;==================================================================================================
;
ANSI_INIT:
JR ANSI_INI
;
;
;
ANSI_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,ANSI_IN ; $30
DEC A
JR Z,ANSI_OUT ; $31
DEC A
JR Z,ANSI_IST ; $32
DEC A
JR Z,ANSI_OST ; $33
DEC A
JR Z,ANSI_CFG ; $34
CP 8
JR Z,ANSI_INI ; $38
CP 9
JR Z,ANSI_QRY ; $39
CALL PANIC
;
;
;
ANSI_IN:
LD B,BF_VDAKRD
JP EMU_VDADISP
;
;
;
ANSI_OUT:
CALL ANSI_DOCHAR
XOR A
RET
;
;
;
ANSI_IST:
LD B,BF_VDAKST
JP EMU_VDADISP
;
;
;
ANSI_OST:
XOR A
INC A
RET
;
;
;
ANSI_CFG:
XOR A
RET
;
;
;
ANSI_INI:
LD (ANSI_ROW),A
LD (ANSI_COL),A
LD B,BF_VDARES
JP EMU_VDADISP ; RESET VDA
;
;
;
ANSI_QRY:
XOR A
RET
;
;
;
ANSI_DOCHAR:
LD A,E ; CHARACTER TO PROCESS
CP 8 ; BACKSPACE
JR Z,ANSI_BS
CP 12 ; FORMFEED
JR Z,ANSI_FF
CP 13 ; CARRIAGE RETURN
JR Z,ANSI_CR
CP 10 ; LINEFEED
JR Z,ANSI_LF
CP 32 ; COMPARE TO SPACE (FIRST PRINTABLE CHARACTER)
RET C ; SWALLOW OTHER CONTROL CHARACTERS
LD B,BF_VDAWRC
CALL EMU_VDADISP ; SPIT OUT THE RAW CHARACTER
LD A,(ANSI_COL) ; GET CUR COL
INC A ; INCREMENT
LD (ANSI_COL),A ; SAVE IT
CP 80 ; COMPARE TO COLS IN LINE
RET C ; NOT PAST END OF LINE, ALL DONE
CALL ANSI_CR ; CARRIAGE RETURN
JR ANSI_LF ; LINEFEED AND RETURN
;
ANSI_FF:
LD DE,0 ; HOME CURSOR
LD (ANSI_ROWCOL),DE ; SAVE IT
CALL ANSI_XY ; EXECUTE
LD E,' ' ; FILL SCREEN WITH BLANKS
LD HL,80 * 24 ; NUMBER OF CHARACTER POSITIONS TO FILL
LD B,BF_VDAFIL
CALL EMU_VDADISP ; PERFORM FILL
JR ANSI_XY ; HOME CURSOR AND RETURN
;
ANSI_BS:
LD DE,(ANSI_ROWCOL) ; GET CURRENT ROW/COL IN DE
LD A,E ; GET CURRENT COLUMN
CP 1 ; COMPARE TO COLUMN 1
RET C ; LESS THAN 1, NOTHING TO DO
DEC E ; POINT TO PREVIOUS COLUMN
LD (ANSI_ROWCOL),DE ; SAVE NEW COLUMN VALUE
CALL ANSI_XY ; MOVE CURSOR TO NEW TARGET COLUMN
LD E,' ' ; LOAD A SPACE CHARACTER
LD B,BF_VDAWRC
CALL EMU_VDADISP ; OVERWRITE WITH A SPACE CHARACTER
JR ANSI_XY ; NEED TO MOVE CURSOR BACK TO NEW TARGET COLUMN
;
ANSI_CR:
XOR A
LD (ANSI_COL),A
JR ANSI_XY
;
ANSI_LF:
LD A,(ANSI_ROW)
INC A
LD (ANSI_ROW),A
CP 24 ; COMPARE TO SCREEN ROWS
JR C,ANSI_XY ; NOT PAST END, ALL DONE
SUB 23 ; A WILL NOW HAVE NUM LINES TO SCROLL
LD E,A ; LINES TO SCROLL -> E
LD B,BF_VDASCR
CALL EMU_VDADISP ; DO THE SCROLLING
LD A,23 ; ROW 23
LD (ANSI_ROW),A ; IS NOW CORRECT
JR ANSI_XY ; RESPOSITION CURSOR AND RETURN
;
ANSI_XY:
LD DE,(ANSI_ROWCOL)
LD B,BF_VDASCP
JP EMU_VDADISP
;
;
;
ANSI_ROWCOL:
ANSI_COL .DB 0
ANSI_ROW .DB 0

376
branches/dgg/Source/bnk1.asm

@ -34,15 +34,11 @@ INITSYS:
;
#IF (PLATFORM != PLT_N8)
IN A,(RTC) ; RTC PORT, BIT 6 HAS STATE OF CONFIG JUMPER
; LD A,40H ; *DEBUG* SIMULATE JUMPER OPEN
; LD A,00H ; *DEBUG* SIMULATE JUMPER SHORTED
AND 40H ; ISOLATE BIT 6
JR Z,INITSYS1 ; IF BIT6=0, SHORTED, USE ALT CONSOLE
LD A,DEFCON ; LOAD DEF CONSOLE DEVICE CODE
JR INITSYS2 ; CONTINUE
LD A,DEFCON ; ASSUME WE WANT DEFAULT CONSOLE
BIT 6,A ; BIT 6 HAS CONFIG JUMPER STATE
JR NZ,INITSYS1 ; IF NZ, JUMPER OPEN, DEF CON IS CORRECT
LD A,ALTCON ; JUMPER SHORTED, USE ALTERNATE CONSOLE
INITSYS1:
LD A,ALTCON ; LOAD ALT CONSOLE DEVICE CODE
INITSYS2:
LD (CONDEV),A ; SET THE ACTIVE CONSOLE DEVICE
#ENDIF
;
@ -109,6 +105,9 @@ INITSYS2:
#IF (VDUENABLE)
CALL VDU_INIT
#ENDIF
#IF (N8VENABLE)
CALL N8V_INIT
#ENDIF
#IF (PRPENABLE)
CALL PRP_INIT
#ENDIF
@ -133,6 +132,12 @@ INITSYS2:
#IF (HDSKENABLE)
CALL HDSK_INIT
#ENDIF
#IF (TTYENABLE)
CALL TTY_INIT
#ENDIF
#IF (ANSIENABLE)
CALL ANSI_INIT
#ENDIF
;
LD DE,STR_BANNER
CALL WRITESTR
@ -161,24 +166,29 @@ IDLE:
;
BIOS_DISPATCH:
LD A,B ; REQUESTED FUNCTION IS IN B
CP BF_CIO + $10
CP BF_CIO + $10 ; $00-$0F: CHARACTER I/O
JR C,CIO_DISPATCH
CP BF_DIO + $10
CP BF_DIO + $10 ; $10-$1F: DISK I/O
JR C,DIO_DISPATCH
CP BF_CLK + $10
JR C,CLK_DISPATCH
CP BF_VDU + $10
JR C,CRT_DISPATCH
CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC)
JR C,RTC_DISPATCH
CP BF_EMU + $10 ; $30-$3F: EMULATION
JP C,EMU_DISPATCH
CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER
JP C,VDA_DISPATCH
CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0
CALL C,PANIC ; PANIC IF LESS THAN BF_SYS
JR SYS_DISPATCH ; OTHERWISE SYS CALL
JP SYS_DISPATCH ; OTHERWISE SYS CALL
CALL PANIC ; THIS SHOULD NEVER BE REACHED
;
; SETUP AND CALL CHARACTER DRIVER
;==================================================================================================
; CHARACTER I/O DEVICE DISPATCHER
;==================================================================================================
;
; ROUTE CALL TO SPECIFIED CHARACTER I/O DRIVER
; B: FUNCTION
; C: DEVICE/UNIT
; E: CHARACTER IN/OUT
;
CIO_DISPATCH:
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
@ -197,34 +207,50 @@ CIO_DISPATCH:
#ENDIF
#IF (VDUENABLE)
CP CIODEV_VDU
JP Z,VDU_DISPATCH
JP Z,VDU_DISPCIO
#ENDIF
CP CIODEV_CRT
JR Z,CIOEMU
CALL PANIC
;
CIOEMU:
LD A,B
ADD A,BF_EMU - BF_CIO ; TRANSLATE FUNCTION CIOXXX -> EMUXXX
LD B,A
JP EMU_DISPATCH
;
;==================================================================================================
; DISK I/O DEVICE DISPATCHER
;==================================================================================================
;
; ROUTE CALL TO SPECIFIED DISK I/O DRIVER
; B: FUNCTION
; C: DEVICE/UNIT
;
DIO_DISPATCH:
; GET THE REQUESTED FUNCTION TO SEE IF SPECIAL HANDLING
; IS NEEDED
LD A,B
; DIO FUNCTIONS STARTING AT $18 ARE COMMON
; AND DO NOT DISPATCH TO DRIVERS
CP $18
JR NC,DIO_COMMON
; DISPATCH FUCNTION TO APPROPRIATE DRIVER
AND $0F
;
; DIO FUNCTIONS STARTING AT DIOGETBUF ARE COMMON FUNCTIONS
; AND DO NOT DISPATCH TO DRIVERS (HANDLED GLOBALLY)
CP BF_DIOGETBUF ; TEST FOR FIRST OF THE COMMON FUNCTIONS
JR NC,DIO_COMMON ; IF >= DIOGETBUF HANDLE AS COMMON DIO FUNCTION
;
; HACK TO FILL IN HSTTRK AND HSTSEC
; BUT ONLY FOR READ/WRITE FUNCTION CALLS
; ULTIMATELY, HSTTRK AND HSTSEC ARE TO BE REMOVED
CP 2
JR NC,DIO_DISPATCH1
LD (HSTTRK),HL
LD (HSTSEC),DE
CP BF_DIOST ; BEYOND READ/WRITE FUNCTIONS ?
JR NC,DIO_DISPATCH1 ; YES, BYPASS
LD (HSTTRK),HL ; RECORD TRACK
LD (HSTSEC),DE ; RECORD SECTOR
;
DIO_DISPATCH1:
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
; START OF THE ACTUAL DRIVER DISPATCHING LOGIC
LD A,C ; GET REQUESTED DEVICE/UNIT FROM C
LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK
AND $F0 ; ISOLATE THE DEVICE PORTION
;
#IF (FDENABLE)
CP DIODEV_FD
JP Z,FD_DISPATCH
@ -258,56 +284,226 @@ DIO_DISPATCH1:
; HANDLE COMMON DISK FUNCTIONS (NOT DEVICE DRIVER SPECIFIC)
;
DIO_COMMON:
SUB $18
JR Z,DIO_GBA
DEC A
JR Z,DIO_SBA
CALL PANIC
SUB BF_DIOGETBUF ; FUNCTION = DIOGETBUF?
JR Z,DIO_GETBUF ; YES, HANDLE IT
DEC A ; FUNCTION = DIOSETBUF?
JR Z,DIO_SETBUF ; YES, HANDLE IT
CALL PANIC ; INVALID FUNCTION SPECFIED
;
; DISK: GET BUFFER ADDRESS
;
DIO_GBA:
LD HL,(DIOBUF)
XOR A
DIO_GETBUF:
LD HL,(DIOBUF) ; HL = DISK BUFFER ADDRESS
XOR A ; SIGNALS SUCCESS
RET
;
; DISK: SET BUFFER ADDRESS
;
DIO_SBA:
BIT 7,H ; IS HIGH ORDER BIT SET?
CALL Z,PANIC ; IF NOT, ADR IS IN LOWER 32K, NOT ALLOWED!!!
LD (DIOBUF),HL
XOR A
DIO_SETBUF:
BIT 7,H ; IS HIGH ORDER BIT SET?
CALL Z,PANIC ; IF NOT, ADR IS IN LOWER 32K, NOT ALLOWED!!!
LD (DIOBUF),HL ; RECORD NEW DISK BUFFER ADDRESS
XOR A ; SIGNALS SUCCESS
RET
;
;==================================================================================================
; REAL TIME CLOCK DEVICE DISPATCHER
;==================================================================================================
;
; ROUTE CALL TO REAL TIME CLOCK DRIVER (NOT YET IMPLEMENTED)
; B: FUNCTION
;
CLK_DISPATCH:
RTC_DISPATCH:
CALL PANIC
;
;==================================================================================================
; EMULATION HANDLER DISPATCHER
;==================================================================================================
;
; ROUTE CALL TO EMULATION HANDLER CURRENTLY ACTIVE
; B: FUNCTION
;
EMU_DISPATCH:
; EMU FUNCTIONS STARTING AT EMUINI ARE COMMON
; AND DO NOT DISPATCH TO DRIVERS
LD A,B ; GET REQUESTED FUNCTION
CP BF_EMUINI
JR NC,EMU_COMMON
;
LD A,(CUREMU) ; GET ACTIVE EMULATION
;
#IF (TTYENABLE)
DEC A ; 1 = TTY
JP Z,TTY_DISPATCH
#ENDIF
#IF (ANSIENABLE)
DEC A ; 2 = ANSI
JP Z,ANSI_DISPATCH
#ENDIF
CALL PANIC ; INVALID
;
; HANDLE COMMON EMULATION FUNCTIONS (NOT HANDLER SPECIFIC)
;
CRT_DISPATCH:
EMU_COMMON:
; REG A CONTAINS FUNCTION ON ENTRY
CP BF_EMUINI
JR Z,EMU_INI
CP BF_EMUQRY
JR Z,EMU_QRY
CALL PANIC
;
; INITIALIZE EMULATION
; C: VDA DEVICE/UNIT TO USE GOING FORWARD
; E: EMULATION TYPE TO USE GOING FORWARD
;
EMU_INI:
LD A,E ; LOAD REQUESTED EMULATION TYPE
LD (CUREMU),A ; SAVE IT
LD A,C ; LOAD REQUESTED VDA DEVICE/UNIT
LD (CURVDA),A ; SAVE IT
;
SYS_DISPATCH:
LD A,B
CP BF_SYSGETCFG
JR Z,SYS_GETCFG
CP BF_SYSSETCFG
JR Z,SYS_SETCFG
CP BF_SYSBNKCPY
JR Z,SYS_BNKCPY
; UPDATE EMULATION VDA DISPATCHING ADDRESS
#IF (VDUENABLE)
LD HL,VDU_DISPVDA
CP VDADEV_VDU
JR Z,EMU_INI1
#ENDIF
#IF (CVDUENABLE)
LD HL,CVDU_DISPVDA
CP VDADEV_CVDU
JR Z,EMU_INI1
#ENDIF
#IF (UPD7220ENABLE)
LD HL,UPD7220_DISPVDA
CP VDADEV_7220
JR Z,EMU_INI1
#ENDIF
#IF (N8VENABLE)
LD HL,N8V_DISPVDA
CP VDADEV_N8
JR Z,EMU_INI1
#ENDIF
CALL PANIC
;
EMU_INI1:
LD (EMU_VDADISPADR),HL ; RECORD NEW VDA DISPATCH ADDRESS
JP EMU_VDADISP ; NOW LET EMULATOR INITIALIZE
;
; QUERY CURRENT EMULATION CONFIGURATION
; RETURN CURRENT EMULATION TARGET VDA DEVICE/UNIT IN C
; RETURN CURRENT EMULATION TYPE IN E
;
EMU_QRY:
LD A,(CURVDA)
LD C,A
LD A,(CUREMU)
LD E,A
JP EMU_VDADISP ; NOW LET EMULATOR COMPLETE THE FUNCTION
;
;==================================================================================================
; VDA DISPATCHING FOR EMULATION HANDLERS
;==================================================================================================
;
; SINCE THE EMULATION HANDLERS WILL ONLY HAVE A SINGLE ACTIVE
; VDA TARGET AT ANY TIME, THE FOLLOWING IMPLEMENTS A FAST DISPATCHING
; MECHANISM THAT THE EMULATION HANDLERS CAN USE TO BYPASS SOME OF THE
; VDA DISPATCHING LOGIC. EMU_VDADISP CAN BE CALLED TO DISPATCH DIRECTLY
; TO THE CURRENT VDA EMULATION TARGET. IT IS A JUMP INSTRUCTION THAT
; IS DYNAMICALLY MODIFIED TO POINT TO THE VDA DISPATCHER FOR THE
; CURRENT EMULATION VDA TARGET.
;
; BELOW IS USED TO INITIALIZE THE EMULATION VDA DISPATCH TARGET
; BASED ON THE DEFAULT VDA.
;
VDA_DISPADR .EQU 0
#IF (VDUENABLE & (DEFVDA == VDADEV_VDU))
VDA_DISPADR .SET VDU_DISPVDA
#ENDIF
#IF (CVDUENABLE & (DEFVDA == VDADEV_CVDU))
VDA_DISPADR .SET CVDU_DISPATCH
#ENDIF
#IF (VDUENABLE & (DEFVDA == VDADEV_7220))
VDA_DISPADR .SET UPD7220_DISPATCH
#ENDIF
#IF (N8VENABLE & (DEFVDA == VDADEV_N8))
VDA_DISPADR .SET N8V_DISPVDA
#ENDIF
;
; BELOW IS THE DYNAMICALLY MANAGED EMULATION VDA DISPATCH.
; EMULATION HANDLERS CAN CALL EMU_VDADISP TO INVOKE A VDA
; FUNCTION. EMU_VDADISPADR IS USED TO MARK THE LOCATION
; OF THE VDA DISPATCH ADDRESS. THIS ALLOWS US TO MODIFY
; THE CODE DYNAMICALLY WHEN EMULATION IS INITIALIZED AND
; A NEW VDA TARGET IS SPECIFIED.
;
EMU_VDADISPADR .EQU $ + 1
EMU_VDADISP:
JP VDA_DISPADR
;
;==================================================================================================
; VIDEO DISPLAY ADAPTER DEVICE DISPATCHER
;==================================================================================================
;
; ROUTE CALL TO SPECIFIED VDA DEVICE DRIVER
; B: FUNCTION
; C: DEVICE/UNIT
;
VDA_DISPATCH:
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
AND $F0 ; ISOLATE THE DEVICE PORTION
#IF (VDUENABLE)
CP VDADEV_VDU
JP Z,VDU_DISPVDA
#ENDIF
#IF (CVDUENABLE)
CP VDADEV_CVDU
JP Z,CVDU_DISPATCH
#ENDIF
#IF (UPD7220ENABLE)
CP VDADEV_7220
JP Z,UPD7220_DISPATCH
#ENDIF
#IF (N8VENABLE)
CP VDADEV_N8
JP Z,N8V_DISPVDA
#ENDIF
CALL PANIC
;
;==================================================================================================
; SYSTEM FUNCTION DISPATCHER
;==================================================================================================
;
; B: FUNCTION
;
SYS_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,SYS_GETCFG ; $F0
DEC A
JR Z,SYS_SETCFG ; $F1
DEC A
JR Z,SYS_BNKCPY ; $F2
DEC A
JR Z,SYS_GETVER ; $F3
CALL PANIC ; INVALID
;
; GET ACTIVE CONFIGURATION
; DE: DESTINATION TO RECEIVE CONFIGURATION DATA BLOCK
; MUST BE IN UPPER 32K
;
SYS_GETCFG:
LD HL,$0200 ; SETUP SOURCE OF CONFIG DATA
LD BC,$0100 ; SIZE OF CONFIG DATA
LDIR ; COPY IT
RET
;
; SET ACTIVE CONFIGURATION
; DE: SOURCE OF NEW CONFIGURATION DATA BLOCK
; MUST BE IN UPPER 32K
;
; HBIOS IS NOT REALLY SET UP TO DYNAMICALLY RECONFIGURE ITSELF!!!
; THIS FUNCTION IS NOT USEFUL YET.
;
SYS_SETCFG:
LD HL,$0200 ; SETUP SOURCE OF CONFIG DATA
LD BC,$0100
@ -315,12 +511,32 @@ SYS_SETCFG:
LDIR
RET
;
; PERFORM A BANKED MEMORY COPY
; C: BANK TO SWAP INTO LOWER 32K PRIOR TO COPY OPERATION
; IX: COUNT OF BYTES TO COPY
; HL: SOURCE ADDRESS FOR COPY
; DE: DESTINATION ADDRESS FOR COPY
;
SYS_BNKCPY:
LD A,C ; BANK SELECTION TO A
PUSH IX
POP BC ; BC = BYTE COUNT TO COPY
JP HB_BNKCPY ; JUST PASS CONTROL TO HBIOS STUB IN UPPER MEMORY
;
; GET THE CURRENT HBIOS VERSION
; RETURNS VERSION IN DE AS BCD
; D: MAJOR VERION IN TOP 4 BITS, MINOR VERSION IN LOW 4 BITS
; E: UPDATE VERION IN TOP 4 BITS, PATCH VERSION IN LOW 4 BITS
;
SYS_GETVER:
LD DE,0 | (RMJ<<12) | (RMN<<8) | (RUP<<4) | RTP
XOR A
RET
;
;==================================================================================================
; GLOBAL HBIOS FUNCTIONS
;==================================================================================================
;
; COMMON ROUTINE THAT IS CALLED BY CHARACTER IO DRIVERS WHEN
; AN IDLE CONDITION IS DETECTED (WAIT FOR INPUT/OUTPUT)
;
@ -353,6 +569,15 @@ SIZ_VDU .EQU $ - ORG_VDU
.ECHO " bytes.\n"
#ENDIF
;
#IF (N8VENABLE)
ORG_N8V .EQU $
#INCLUDE "n8v.asm"
SIZ_N8V .EQU $ - ORG_N8V
.ECHO "N8V occupies "
.ECHO SIZ_N8V
.ECHO " bytes.\n"
#ENDIF
;
#IF (PRPENABLE)
ORG_PRP .EQU $
#INCLUDE "prp.asm"
@ -415,6 +640,24 @@ SIZ_HDSK .EQU $ - ORG_HDSK
.ECHO SIZ_HDSK
.ECHO " bytes.\n"
#ENDIF
#IF (TTYENABLE)
ORG_TTY .EQU $
#INCLUDE "tty.asm"
SIZ_TTY .EQU $ - ORG_TTY
.ECHO "TTY occupies "
.ECHO SIZ_TTY
.ECHO " bytes.\n"
#ENDIF
#IF (ANSIENABLE)
ORG_ANSI .EQU $
#INCLUDE "ansi.asm"
SIZ_ANSI .EQU $ - ORG_ANSI
.ECHO "ANSI occupies "
.ECHO SIZ_ANSI
.ECHO " bytes.\n"
#ENDIF
;
#DEFINE CIOMODE_CONSOLE
#DEFINE DSKY_KBD
@ -432,6 +675,9 @@ HSTDSK .DB 0 ; DISK IN BUFFER
HSTTRK .DW 0 ; TRACK IN BUFFER
HSTSEC .DW 0 ; SECTOR IN BUFFER
;
CUREMU .DB DEFEMU ; CURRENT EMULATION
CURVDA .DB DEFVDA ; CURRENT VDA TARGET FOR EMULATION
;
DIOBUF .DW $FD00 ; PTR TO 512 BYTE DISK XFR BUFFER
;
STR_BANNER .DB "N8VEM HBIOS v", BIOSVER, " ("
@ -538,22 +784,27 @@ HB_BNKCPY2:
; ENTRY POINT FOR BIOS FUNCTIONS (TARGET OF RST 08)
;
HB_ENTRY:
EX AF,AF' ; SAVE AF' SO WE CAN USE IT BELOW
PUSH AF ; "
PGRAMF(1) ; MAP RAM PAGE 1 INTO LOWER 32K
LD (HB_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HB_STACK ; SETUP NEW STACK FRAME
LD SP,8000H ; SETUP NEW STACK FRAME AT END OF BANK 1
CALL BIOS_DISPATCH ; CALL HBIOS FUNCTION DISPATCHER
PUSH AF ; SAVE AF
EX AF,AF' ; SAVE AF IN AF'
PGRAMF(0) ; MAP RAM PAGE 0 INTO LOWER 32K
POP AF ; RESTORE AF
LD SP,(HB_STKSAV) ; RESTORE ORIGINAL STACK FRAME
POP AF ; RECOVER ORIGINAL AF'
EX AF,AF' ; RESTORE AF' AND GET AF RETURNED FROM DISPATCH BACK
RET ; RETURN TO CALLER
;
HB_STKSAV .DW 0 ; PREVIOUS STACK POINTER (SEE PROXY)
HB_STKSAV .DW 0 ; PREVIOUS STACK POINTER
;
;==================================================================================================
; DUMMY INTERRUPT SERVICE ROUTINE
@ -570,11 +821,4 @@ HB_SLACK .EQU (HB_END - $)
.ECHO " bytes.\n"
;
.FILL HB_SLACK,0FFH
;
;==================================================================================================
; HBIOS STACK LIVES IN THE SLACK SPACE!!!
;==================================================================================================
;
HB_STACK .EQU $ & 0FFFFH
;
.END

11
branches/dgg/Source/cbios.asm

@ -121,9 +121,9 @@ GOCPM:
; SETUP DISK XFR BUFFER LOCATION
LD HL,SECBUF
LD (BUFADR),HL
LD B,BF_DIOSBA
LD B,BF_DIOSETBUF
RST 08
LD A,0C3H ; LOAD A WITH 'JP' INSTRUCTION (USED BELOW)
; CPU RESET / RST 0 -> WARM START CP/M
@ -1949,7 +1949,7 @@ DSK_CNT .EQU DPH_CNT
; MAP LOGICAL TO PHYSICAL DEVICES
;
LD_TTY .EQU CIODEV_UART
LD_CRT .EQU CIODEV_VDU
LD_CRT .EQU CIODEV_CRT
LD_BAT .EQU CIODEV_BAT
LD_UC1 .EQU CIODEV_UART
LD_PTR .EQU CIODEV_UART
@ -1966,7 +1966,10 @@ LD_UC1 .SET CIODEV_UART + 1
#ENDIF
;
#IF (VDUENABLE)
LD_CRT .SET CIODEV_VDU
LD_CRT .SET CIODEV_CRT
#ENDIF
#IF (N8VENABLE)
LD_CRT .SET CIODEV_CRT
#ENDIF
#IF (PRPENABLE & PRPCONENABLE)
LD_CRT .SET CIODEV_PRPCON

17
branches/dgg/Source/config_n8_2312.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8 ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_N8 ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU TRUE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_n8_2511.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8 ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_N8 ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU TRUE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_n8vem.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_n8vem_dide.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_n8vem_diskio.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_n8vem_diskio3.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_n8vem_ppide.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_n8vem_ppisd.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_n8vem_propio.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_PRPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU CIODEV_UART ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $01 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU $00 ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_n8vem_vdu.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_VDU ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU TRUE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU TRUE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_simh.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_N8VEM ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_ALWAYS ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU FALSE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU TRUE ; TRUE FOR HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_zeta.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_ZETA ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

17
branches/dgg/Source/config_zeta_ppp.asm

@ -9,10 +9,10 @@ CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
PLATFORM .EQU PLT_ZETA ; PLT_N8VEM, PLT_ZETA, PLT_N8
;
DIOPLT .EQU 0 ; DEPRECATED
;
DEFCON .EQU CIODEV_PPPCON ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
ALTCON .EQU CIODEV_UART ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
DEFVDA .EQU VDADEV_NONE ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_7220, VDADEV_N8)
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
@ -25,10 +25,10 @@ UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRU
UARTFIFO .EQU TRUE ; TRUE ENABLES UART FIFO (16550 ASSUMED, N8VEM AND ZETA ONLY)
UARTAFC .EQU FALSE ; TRUE ENABLES AUTO FLOW CONTROL (YOUR TERMINAL/UART MUST SUPPORT RTS/CTS FLOW CONTROL!!!)
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU SERVICES (YOU MUST HAVE THE HARDWARE!)
VDUMODE .EQU VDUMODE_VDU ; VDUMODE_NONE, VDUMODE_VDU, VDUMODE_N8, VDUMODE_CVDU (ONLY VDUPLT_VDU IMPLEMENTED!)
;
BIOSSIZE .EQU 0100H ; AMOUNT OF SPACE WITHIN BIOS AREA TO RESERVE FOR DATA
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
;
DEFIOBYTE .EQU $01 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
ALTIOBYTE .EQU $00 ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
@ -78,7 +78,10 @@ HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
;
BOOTTYPE: .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
;
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'R' ; SELECTION TO INVOKE AT TIMEOUT
;

124
branches/dgg/Source/n8v.asm

@ -0,0 +1,124 @@
;__N8VDRIVER_______________________________________________________________________________________
;
; N8 VIDEO DRIVER FOR ROMWBW
;
;__________________________________________________________________________________________________
;
;__________________________________________________________________________________________________
; DATA CONSTANTS
;__________________________________________________________________________________________________
;
;__________________________________________________________________________________________________
; BOARD INITIALIZATION
;__________________________________________________________________________________________________
;
N8V_INIT:
; INIT TMS9918 HERE...
CALL PPK_INIT
XOR A
RET
;
;__________________________________________________________________________________________________
; CHARACTER I/O (CIO) DISPATCHER
;__________________________________________________________________________________________________
;
N8V_DISPCIO:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,PPK_READ
DEC A
JR Z,N8V_CIOOUT
DEC A
JP Z,PPK_STAT
DEC A
JR Z,N8V_CIOOST
CALL PANIC
;
N8V_CIOOUT:
JP N8V_VDAWRC
;
N8V_CIOOST:
XOR A
INC A
RET
;
;__________________________________________________________________________________________________
; VIDEO DISPLAY ADAPTER (VDA) DISPATCHER
;__________________________________________________________________________________________________
;
N8V_DISPVDA:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,N8V_VDAINI
DEC A
JR Z,N8V_VDAQRY
DEC A
JR Z,N8V_VDARES
DEC A
JR Z,N8V_VDASCS
DEC A
JR Z,N8V_VDASCP
DEC A
JR Z,N8V_VDASAT
DEC A
JR Z,N8V_VDASCO
DEC A
JR Z,N8V_VDAWRC
DEC A
JR Z,N8V_VDAFIL
DEC A
JR Z,N8V_VDASCR
DEC A
JP Z,PPK_STAT
DEC A
JP Z,PPK_FLUSH
DEC A
JP Z,PPK_READ
CALL PANIC
N8V_VDAINI:
XOR A
RET
N8V_VDAQRY:
CALL PANIC
N8V_VDARES:
JR N8V_INIT
N8V_VDASCS:
CALL PANIC
N8V_VDASCP:
XOR A
RET
N8V_VDASAT:
CALL PANIC
N8V_VDASCO:
CALL PANIC
N8V_VDAWRC:
XOR A
RET
N8V_VDAFIL:
XOR A
RET
N8V_VDASCR:
XOR A
RET
;
;__________________________________________________________________________________________________
; IMBED COMMON PRALLEL PORT KEYBOARD DRIVER
;__________________________________________________________________________________________________
;
#INCLUDE "ppk.asm"
;
;__________________________________________________________________________________________________
; LOCAL DRIVER DATA
;__________________________________________________________________________________________________
;

630
branches/dgg/Source/ppk.asm

@ -0,0 +1,630 @@
;__________________________________________________________________________________________________
;
; PARALLEL PORT KEYBOARD DRIVER FOR N8VEM
; SUPPORT KEYBOARD/MOUSE ON VDU AND N8
;
; ORIGINAL CODE BY DR JAMES MOXHAM
; ROMWBW ADAPTATION BY WAYNE WARTHEN
;__________________________________________________________________________________________________
;
;__________________________________________________________________________________________________
; DATA CONSTANTS
;__________________________________________________________________________________________________
;
#IF (PLATFORM == PLT_N8)
PPK_PPI .EQU PPI2 ; PPI PORT BASE FOR N8
#ELSE
PPK_PPI .EQU 0F4H ; PPI PORT BASE FOR VDU
#ENDIF
PPK_PPIA .EQU PPK_PPI + 0 ; KEYBOARD PPI PORT A
PPK_PPIB .EQU PPK_PPI + 1 ; KEYBOARD PPI PORT B
PPK_PPIC .EQU PPK_PPI + 2 ; KEYBOARD PPI PORT C
PPK_PPIX .EQU PPK_PPI + 3 ; KEYBOARD PPI CONTROL PORT
;
;__________________________________________________________________________________________________
; KEYBOARD INITIALIZATION
;__________________________________________________________________________________________________
;
PPK_INIT:
CALL PPK_SETPORTC ; SETS PORT C SO CAN INPUT AND OUTPUT
CALL PPK_RESET ; RESET TO THE KEYBOARD
LD A,200 ; 1 SECOND DELAY AS KEYBOARD SENDS STUFF BACK WHEN RESET
CALL PPK_DELAY ; IGNORE ANYTHING BACK AFTER A RESET
LD A,0 ; EMPTY KB QUEUE
LD (PPK_QLEN),A
XOR A
RET
;
;__________________________________________________________________________________________________
; KEYBOARD STATUS
;__________________________________________________________________________________________________
;
PPK_STAT:
CALL PPK_PROCESS ; CALL KEYBOARD ROUTINE
LD A,(PPK_QLEN) ; ASK IF KEYBOARD HAS KEY WAITING
OR A ; SET FLAGS
JP Z,CIO_IDLE ; NO DATA, EXIT VIA IDLE PROCESSING
LD A,$FF ; SIGNAL DATA PENDING
RET
;
;__________________________________________________________________________________________________
; KEYBOARD READ
;__________________________________________________________________________________________________
;
PPK_READ:
CALL PPK_STAT ; CHECK TO SEE IF KEY READY
JR Z,PPK_READ ; IF NOT, LOOP
CALL PPK_GETKEY ; GET IT
LD E,A ; PUT KEY WHERE IT BELONGS
XOR A ; SIGNAL SUCCESS
RET
;
;__________________________________________________________________________________________________
; KEYBOARD FLUSH
;__________________________________________________________________________________________________
;
PPK_FLUSH:
LD A,0 ; EMPTY KB QUEUE
LD (PPK_QLEN),A ; SAVE IT
XOR A ; SIGNAL SUCCESS
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;__PPK_GETKEY______________________________________________________________________________________
;
; GET KEY PRESS VALUE
;__________________________________________________________________________________________________
PPK_GETKEY:
LD A,(PPK_QLEN) ; GET QUEUE POINTER
OR A
RET Z ; ABORT IF QUEUE EMPTY
PUSH BC ; STORE BC
LD B,A ; STORE QUEUE COUNT FOR LATER
PUSH HL ; STORE HL
LD A,(PPK_QUEUE) ; GET TOP BYTE FROM QUEUE
PUSH AF ; STORE IT
LD HL,PPK_QUEUE ; GET POINTER TO QUEUE
PPK_GETKEY1: ;
INC HL ; POINT TO NEXT VALUE IN QUEUE
LD A,(HL) ; GET VALUE
DEC HL ;
LD (HL),A ; MOVE IT UP ONE
INC HL ;
DJNZ PPK_GETKEY1 ; LOOP UNTIL DONE
LD A,(PPK_QLEN) ; DECREASE QUEUE POINTER BY ONE
DEC A ;
LD (PPK_QLEN),A
POP AF ; RESTORE VALUE
POP HL ; RESTORE HL
POP BC ; RESTORE BC
RET
;__PPK_RESET________________________________________________________________________________________
;
; RESET THE KEYBOARD
;__________________________________________________________________________________________________
PPK_RESET:
CALL PPK_DATAHIGH ;
CALL PPK_CLOCKHIGH ;
LD B,255 ;
SF1: DJNZ SF1 ;
CALL PPK_CLOCKLOW ; STEP 1
LD B,255 ;
SF2: DJNZ SF2 ;
CALL PPK_DATALOW ; STEP 2
CALL PPK_CLOCKHIGH ; STEP 3
CALL PPK_WAITCLOCKLOW ; STEP 4
LD B,9 ; 8 DATA BITS + 1 PARITY BIT LOW
SF3: PUSH BC ;
CALL PPK_DATAHIGH ; STEP 5
CALL PPK_WAITCLOCKHIGH ; STEP 6
CALL PPK_WAITCLOCKLOW ; STEP 7
POP BC ;
DJNZ SF3 ;
CALL PPK_DATAHIGH ; STEP9
CALL PPK_WAITCLOCKLOW ; STEP 10 COULD READ THE ACK BIT HERE IF WANT TO
CALL PPK_WAITCLOCKHIGH ; STEP 11
LD B,255 ;
SF4: DJNZ SF4 ; FINISH UP DELAY
RET
;__PPK_SETPORTC_____________________________________________________________________________________
;
; SETUP PORT C OF 8255 FOR KEYBOARD
;__________________________________________________________________________________________________
PPK_SETPORTC:
LD A,10000010B ; A=OUT B=IN, C HIGH=OUT, CLOW=OUT
OUT (PPK_PPIX),A ; PPI CONTROL PORT
LD A,00000000B ; PORT A TO ZERO AS NEED THIS FOR COMMS TO WORK
OUT (PPK_PPIA),A ; PPI PORT A
CALL PPK_DATAHIGH ;
CALL PPK_CLOCKHIGH ;
LD A,0 ;
LD (CAPSLOCK),A ; SET CAPSLOCK OFF TO START
LD (CTRL),A ; CONTROL OFF
LD (NUMLOCK),A ; NUMLOCK OFF
RET
;_________________________________________________________________________________________________
;
; PORT C BIT ROUTINES
;__________________________________________________________________________________________________
PPK_PORTCBIT0HIGH: ;
LD A,01110001B ; SEE THE 8255 DATA SHEET
JP PPK_SETBITS ;
PPK_PORTCBIT1HIGH: ;
LD A,01110011B ; SEE THE 8255 DATA SHEET
JP PPK_SETBITS ;
PPK_PORTCBIT2HIGH: ;
LD A,01110101B ; SEE THE 8255 DATA SHEET
JP PPK_SETBITS ;
PPK_PORTCBIT3HIGH: ;
LD A,01110111B ; SEE THE 8255 DATA SHEET
JP PPK_SETBITS ;
PPK_PORTCBIT0LOW: ;
LD A,01110000B ; SEE THE 8255 DATA SHEET
JP PPK_SETBITS ;
PPK_PORTCBIT1LOW: ;
LD A,01110010B ; SEE THE 8255 DATA SHEET
JP PPK_SETBITS ;
PPK_PORTCBIT2LOW: ;
LD A,01110100B ; SEE THE 8255 DATA SHEET
JP PPK_SETBITS ;
PPK_PORTCBIT3LOW: ;
LD A,01110110B ; SEE THE 8255 DATA SHEET
JP PPK_SETBITS ;
PPK_DATAHIGH:
PPK_PORTCBIT4HIGH: ;
LD A,01111001B ; SEE THE 8255 DATA SHEET
JP PPK_SETBITS ;
PPK_DATALOW: ;
PPK_PORTCBIT4LOW: ;
LD A,01111000B ; SEE THE 8255 DATA SHEET
JP PPK_SETBITS ;
PPK_CLOCKHIGH: ;
PPK_PORTCBIT5HIGH: ;
LD A,01111011B ; BIT 5 HIGH
JP PPK_SETBITS ;
PPK_CLOCKLOW: ;
PORTCBIT5LOW: ;
LD A,01111010B ;
PPK_SETBITS: ;
OUT (PPK_PPIX),A ;
RET ;
;__PPK_WAITCLOCKLOW_________________________________________________________________________________
;
; WAITCLOCKLOW SAMPLES DATA BIT 0, AND WAITS TILL
; IT GOES LOW, THEN RETURNS
; ALSO TIMES OUT AFTER 0 001 SECONDS
; USES A, CHANGES B
;__________________________________________________________________________________________________
PPK_WAITCLOCKLOW:
LD B,255 ; FOR TIMEOUT COUNTER
PPK_WAITCLOCKLOW1:
IN A,(PPK_PPIB) ; GET A BYTE FROM PORT B
BIT 1,A ; TEST THE CLOCK BIT
RET Z ; EXIT IF IT WENT LOW
DJNZ PPK_WAITCLOCKLOW1 ; LOOP B TIMES
RET
;__PPK_WAITCLOCKHIGH_________________________________________________________________________________
;
; WAITCLOCKHIGH SAMPLES DATA BIT 0, AND WAITS TILL
; IT GOES HIGH, THEN RETURNS
; ALSO TIMES OUT AFTER 0 001 SECONDS
; USES A, CHANGES B
;__________________________________________________________________________________________________
PPK_WAITCLOCKHIGH:
LD B,255 ; FOR TIMEOUT COUNTER
PPK_WAITCLOCKHIGH1:
IN A,(PPK_PPIB) ; GET A BYTE FROM PORT B
BIT 1,A ; TEST THE CLOCK BIT
RET NZ ; EXIT IF IT WENT HIGH
DJNZ PPK_WAITCLOCKHIGH1 ; LOOP B TIMES
RET
;__PPK_DELAY________________________________________________________________________________________
;
; PASS A - DELAY IS B*0 005 SECONDS, BCDEHL ALL PRESERVED
;__________________________________________________________________________________________________
PPK_DELAY:
PUSH BC ; STORE ALL VARIABLES
PUSH DE ;
PUSH HL ;
LD B,A ; PUT THE VARIABLE DELAY IN B
LD DE,1 ;
PPK_DELAY1:
LD HL,740 ; ADJUST THIS VALUE FOR YOUR CLOCK 1481=3 68MHZ, 3219=8MHZ (TEST WITH A=1000=10 SECS)
PPK_DELAY2:
SBC HL,DE ; HL-1
JR NZ,PPK_DELAY2
DJNZ PPK_DELAY1
POP HL ; RESTORE VARIABLES
POP DE ;
POP BC ;
RET ;
;__PPK_PROCESS______________________________________________________________________________________
;
; A=0 IF WANT TO KNOW IF A BYTE IS AVAILABLE, AND A=1 TO ASK FOR THE BYTE
;__________________________________________________________________________________________________
PPK_PROCESS:
CALL PPK_SKIP ; DON'T TEST EVERY ONE AS TAKES TIME
OR A ; IS IT ZERO
RET Z ; RETURN IF ZERO
CALL PPK_WAITBYTE ; TEST KEYBOARD TIMES OUT AFTER A BIT
CALL PPK_DECODECHAR ; RETURNS CHAR OR 0 FOR THINGS LIKE KEYUP, SOME RETURN DIRECTLY TO CP/M
RET ; RETURN TO CP/M
;-----------------------------------------------
; CPM CALLS THE KEYBOARD QUITE FREQUENTLY IF A KEYBOARD WAS LIKE A UART WHICH CAN BE CHECKED
; WITH ONE INSTRUCTION, THAT WOULD BE FINE BUT CHECKING A KEYBOARD INVOLVES PUTTING THE CLOCK LINE LOW
; THEN WAITING SOME TIME FOR A POSSIBLE REPLY, THEN READING IN BITS WITH TIMEOUTS AND THEN RETURNING
; THIS SLOWS DOWN A LOT OF CP/M PROCESSES, EG TRY TYPE MYPROG AND PRINTING OUT TEXT
PPK_SKIP:
LD B,0 ;
LD A,(SKIPCOUNT) ;
DEC A ; SUBTRACT 1
LD (SKIPCOUNT),A ; STORE IT BACK
CP 0 ;
JP NZ,PPK_SKIP1 ; WORDSTAR IS VERY SLOW EVEN TRIED A VALUE OF 5 TO 200 HERE
LD A,200 ; ONLY ACT ON EVERY N CALLS - BIGGER=BETTER BECAUSE THIS SUB IS QUICKER THAN READBITS
LD (SKIPCOUNT),A ; RESET COUNTER
LD B,1 ; FLAG TO SAY RESET COUNTER
PPK_SKIP1: ;
LD A,B ; RETURN THE VALUE IN A
RET
;__PPK_DECODECHAR____________________________________________________________________________________
;
; DECODE CHARACTER PASS A AND PRINTS OUT THE CHAR
; ON THE LCD SCREEN
;__________________________________________________________________________________________________
PPK_DECODECHAR:
CP 0 ; IS IT ZERO
RET Z ; RETURN IF A ZERO - NO NEED TO DO ANYTHING
CP 0F0H ; IS A KEY UP (NEED TO DO SPECIAL CODE FOR SHIFT)
JP Z,DECKEYUP ; IGNORE CHAR UP
CP 0E0H ; TWO BYTE KEYPRESSES
JP Z,TWOBYTE ;
CP 058H ; CAPS LOCK SO TOGGLE
JP Z,CAPSTOG ;
CP 12H ; SHIFT (DOWN, BECAUSE UP WOULD BE TRAPPED BY 0F ABOVE)
JP Z,SHIFTDOWN ;
CP 59H ; OTHER SHIFT KEY
JP Z,SHIFTDOWN ;
CP 014H ; CONTROL KEY
JP Z,CONTROLDOWN ;
CP 05AH ; ENTER KEY
JP Z,RETURN ;
CP 066H ; BACKSPACE KEY
JP Z,BACKSPACE ;
CP 0DH ; TAB KEY
JP Z,TABKEY ;
CP 076H ; ESCAPE KEY
JP Z,ESCAPE ;
LD C,A ;
LD B,0 ; ADD BC TO HL
LD HL,PPK_KEYMAP ; OFFSET TO ADD
ADD HL,BC ;
JP TESTCONTROL ; IS THE CONTROL KEY DOWN?
DC1: LD A,(CAPSLOCK) ;
CP 0 ; IS IT 0, IF SO THEN DON'T ADD THE CAPS OFFSET
JR Z,DC2 ;
LD C,080H ; ADD ANOTHER 50H TO SMALLS TO GET CAPS
ADD HL,BC ;
DC2: LD A,(HL) ;
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
TESTCONTROL:
LD A,(CTRL) ;
CP 0 ; IS CONTROL BEING HELD DOWN?
JP Z,DC1 ; NO SO GO BACK TO TEST CAPS LOCK ON
LD A,(HL) ; GET THE LETTER, SHOULD BE SMALLS
SUB 96 ; A=97 SO SUBTRACT 96 A=1=^A
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ; RETURN INSTEAD OF THE RET AFTER DC2
TABKEY: ;
LD A,9 ;
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;TAB
BACKSPACE: ;
LD A,8 ; BACKSPACE
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
ESCAPE: ;
LD A,27 ;
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
RETURN: ;
LD A,13 ; CARRIAGE RETURN
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
DECKEYUP:
CALL PPK_WAITBYTE ; IGNORE KEY UP THROW AWAY THE CHARACTER UNLESS A SHIFT
CP 012H ; IS IT A SHIFT
JP Z,SHIFTUP ;
CP 59H ; OTHER SHIFT KEY
JP Z,SHIFTUP ;
CP 014H ; CONTROL UP
JP Z,CONTROLUP ; CONTROL UP
LD A,0 ; NOTHING CAPTURED SO SEND BACK A ZERO
RET
TWOBYTE:; ALREADY GOT EO SO GET THE NEXT CHARACTER
CALL PPK_WAITBYTE
CP 0F0H ; SEE THE NOTES - KEYUP FOR E0 KEYS IS EO F0 NN NOT F0 EO!!
JP Z,TWOBYTEUP ;
CP 071H ; DELETE
JP Z,DELETEKEY ;
CP 05AH ; RETURN ON NUMBER PAD
JP Z,RETURNKEY ;
CP 072H ;
JP Z,DOWNARROW ;
CP 074H ;
JP Z,RIGHTARROW ;
CP 06BH ;
JP Z,LEFTARROW ;
CP 075H ;
JP Z,UPARROW ;
CP 070H ;
JP Z,INSERT ;
CP 07DH ;
JP Z,PAGEUP ;
CP 07AH ;
JP Z,PAGEDOWN ;
CP 06CH ;
JP Z,HOME ;
CP 069H ;
JP Z,END ;
LD A,0 ; RETURNS NOTHING
RET
TWOBYTEUP: ;EXPECT A BYTE AND IGNORE IT
CALL PPK_WAITBYTE ;
LD A,0 ;
RET ;
HOME: ;
LD A,1BH ; ESC
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'?' ; ?
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'W' ; W
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
END: ;
LD A,1BH ; ESC
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'?' ; ?
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'Q' ; Q
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
DOWNARROW: ;
LD A,1BH ; ESC
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'B' ; B
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
RIGHTARROW: ;
LD A,1BH ; ESC
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'C' ; C
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
LEFTARROW: ;
LD A,1BH ; ESC
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'D' ; D
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
UPARROW: ;
LD A,1BH ; ESC
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'A' ; A
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
INSERT: ;
LD A,1BH ; ESC
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'?' ; ?
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'P' ; P
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
PAGEUP: ;
LD A,1BH ; ESC
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'?' ; ?
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'Y' ; Y
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
PAGEDOWN: ;
LD A,1BH ; ESC
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'?' ; ?
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
LD A,'S' ; S
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
CONTROLDOWN: ; SAME CODE AS SHIFTDOWN BUT DIFF LOCATION
LD A,0FFH ;
LD (CTRL),A ; CONTROL DOWN
LD A,0 ;
RET ;
CONTROLUP: ; CONTROL KEY UP SEE SHIFT FOR EXPLANATION
LD A,0 ;
LD (CTRL),A ;
LD A,0 ;
RET ;
RETURNKEY: ;
LD A,13 ;
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
DELETEKEY: ;
LD A,07FH ; DELETE KEY VALUE THAT CP/M USES
CALL PPK_ENQUEUE ; STORE ON KB QUEUE
RET ;
CAPSTOG: ;
LD A,(CAPSLOCK) ;
XOR 11111111B ; SWAP ALL THE BITS
LD (CAPSLOCK),A ;
LD A,0 ; RETURNS NOTHING
RET ;
SHIFTDOWN: ; SHIFT IS SPECIAL - HOLD IT DOWN AND IT AUTOREPEATS
; SO ONCE IT IS DOWN, TURN CAPS ON AND IGNORE ALL FURTHER SHIFTS
; ONLY AN F0+SHIFT TURNS CAPS LOCK OFF AGAIN
LD A,0FFH ;
LD (CAPSLOCK),A ;
LD A,0 ; RETURNS NOTHING
RET ;
SHIFTUP: ; SHIFTUP TURNS OFF CAPS LOCK DEFINITELY
LD A,0 ;
LD (CAPSLOCK),A ;
LD A,0 ; RETURNS NOTHING
RET ;
;__PPK_ENQUEUE______________________________________________________________________________________
;
; STORE A BYTE IN THE KEYBOARD QUEUE
; A: BYTE TO ENQUEUE
;__________________________________________________________________________________________________
PPK_ENQUEUE:
PUSH DE ; STORE DE
PUSH HL ; STORE HL
PUSH AF ; STORE VALUE
LD A,(PPK_QLEN) ; PUT QUEUE POINTER IN A
CP 15 ; IS QUEUE FULL
JP P,PPK_ENQUEUE1 ; YES, ABORT
LD HL,PPK_QUEUE ; GET QUEUE POINTER
PUSH HL ; MOVE HL TO BC
POP BC ;
LD H,0 ; ZERO OUT H
LD L,A ; PLACE QUEUE POINTER IN L
ADD HL,BC ; POINT HL AT THE NEXT LOACTION TO ADD VALUE
POP AF ; RESTORE VALUE
LD (HL),A ; ENQUEUE VALUE
LD A,(PPK_QLEN) ; GET QUEUE POINTER
INC A ; INC IT
LD (PPK_QLEN),A ;STORE QUEUE POINTER
PPK_ENQUEUE1:
POP HL ; RESTORE HL
POP DE ; RESTORE DE
RET
;__PPK_WAITBYTE_____________________________________________________________________________________
;
; WAIT FOR A BYTE - TESTS A NUMBER OF TIMES IF THERE IS A KEYBOARD INPUT,
; OVERWRITES ALL REGISTERS, RETURNS BYTE IN A
;__________________________________________________________________________________________________
PPK_WAITBYTE:
CALL PPK_CLOCKHIGH ; TURN ON KEYBOARD
LD HL,500 ; NUMBER OF TIMES TO CHECK 200=SLOW TYPE
; 10=ERROR, 25 ?ERROR 50 OK -
; THIS DELAY HAS TO BE THERE OTHERWISE WEIRD KEYUP ERRORS
PPK_WAITBYTE1:
PUSH HL ; STORE COUNTER
CALL PPK_READBITS ; TEST FOR A LOW ON THE CLOCK LINE
POP HL ; GET THE COUNTER BACK
CP 0 ; TEST FOR A ZERO BACK FROM READBITS
JR NZ,PPK_WAITBYTE2 ; IF NOT A ZERO THEN MUST HAVE A BYTE IE A KEYBOARD PRESS
LD DE,1 ; LOAD WITH 1
SBC HL,DE ; SUBTRACT 1
JR NZ,PPK_WAITBYTE1 ; LOOP WAITING FOR A RESPONSE
PPK_WAITBYTE2:
PUSH AF ; STORE THE VALUE IN A
CALL PPK_CLOCKLOW ; TURN OFF KEYBOARD
POP AF ; GET BACK BYTE AS CLOCKLOW ERASED IT
RET
;__PPK_READBITS_____________________________________________________________________________________
;
; READBITS READS 11 BITS IN FROM THE KEYBOARD
; FIRST BIT IS A START BIT THEN 8 BITS FOR THE BYTE
; THEN A PARITY BIT AND A STOP BIT
; RETURNS AFTER ONE MACHINE CYCLE IF NOT LOW
; USES A, B,D, E
; RETURNS A=0 IF NO DATA, A= SCANCODE (OR PART THEREOF)
;__________________________________________________________________________________________________
PPK_READBITS:
IN A,(PPK_PPIB)
BIT 1,A ; TEST THE CLOCK BIT
JR Z,PPK_READBITS1 ; IF LOW THEN START THE CAPTURE
LD A,0 ; RETURNS A=0 IF NOTHING
RET
PPK_READBITS1:
CALL PPK_WAITCLOCKHIGH ; IF GETS TO HERE THEN MUST BE LOW SO WAIT TILL HIGH
LD B,8 ; SAMPLE 8 TIMES
LD E,0 ; START WITH E=0
PPK_READBITS2:
LD D,B ; STORE BECAUSE WAITCLOCKHIGH DESTROYS
CALL PPK_WAITCLOCKLOW ; WAIT TILL CLOCK GOES LOW
IN A,(PPK_PPIB) ; SAMPLE THE DATA LINE
RRA ; MOVE THE DATA BIT INTO THE CARRY REGISTER
LD A,E ; GET THE BYTE WE ARE BUILDING IN E
RRA ; MOVE THE CARRY BIT INTO BIT 7 AND SHIFT RIGHT
LD E,A ; STORE IT BACK AFTER 8 CYCLES 1ST BIT READ WILL BE IN B0
CALL PPK_WAITCLOCKHIGH ; WAIT TILL GOES HIGH
LD B,D ; RESTORE FOR LOOP
DJNZ PPK_READBITS2 ; DO THIS 8 TIMES
CALL PPK_WAITCLOCKLOW ; GET THE PARITY BIT
CALL PPK_WAITCLOCKHIGH
CALL PPK_WAITCLOCKLOW ; GET THE STOP BIT
CALL PPK_WAITCLOCKHIGH
LD A,E ; RETURNS WITH ANSWER IN A
RET
PPK_KEYMAP:
; THE TI CHARACTER CODES, OFFSET FROM LABEL BY KEYBOARD SCAN CODE
.DB $00, $00, $00, $00, $00, $00, $00, $00
.DB $00, $00, $00, $00, $00, $09, "`", $00 ; $09=TAB
.DB $00, $00, $00, $00, $00, "q", "1", $00
.DB $00, $00, "z", "s", "a", "w", "2", $00
.DB $00, "c", "x", "d", "e", "4", "3", $00
.DB $00, " ", "v", "f", "t", "r", "5", $00
.DB $00, "n", "b", "h", "g", "y", "6", $00
.DB $00, $00, "m", "j", "u", "7", "8", $00
.DB $00, ",", "k", "i", "o", "0", "9", $00
.DB $00, ".", "/", "l", ";", "p", "-", $00
.DB $00, $00, $27, $00, "[", "=", $00, $00 ; $27=APOSTROPHE
.DB $00, $00, $00, "]", $00, $5C, $00, $00 ; $5C=BACKSLASH
.DB $00, $00, $00, $00, $00, $00, $00, $00
.DB $00, "1", $00, "4", "7", $00, $00, $00
.DB "0", ".", "2", "5", "6", "8", $00, $00
.DB $00, "+", "3", "-", "*", "9", $00, $00
PPK_SHIFTKEYMAP:
.DB $00, $00, $00, $00, $00, $00, $00, $00
.DB $00, $00, $00, $00, $00, $09, "~", $00 ; $09=TAB
.DB $00, $00, $00, $00, $00, "Q", "!", $00
.DB $00, $00, "Z", "S", "A", "W", "@", $00
.DB $00, "C", "X", "D", "E", "$", "#", $00
.DB $00, " ", "V", "F", "T", "R", "%", $00
.DB $00, "N", "B", "H", "G", "Y", "^", $00
.DB $00, $00, "M", "J", "U", "&", "*", $00
.DB $00, "<", "K", "I", "O", ")", "(", $00
.DB $00, ">", "?", "L", ":", "P", "_", $00
.DB $00, $00, $22, $00, "{", "+", $00, $00 ; $22=DBLQUOTE
.DB $00, $00, $00, "}", $00, "|", $00, $00
.DB $00, $00, $00, $00, $00, $00, $00, $00
.DB $00, "1", $00, "4", "7", $00, $00, $00
.DB "0", ".", "2", "5", "6", "8", $00, $00
.DB $00, "+", "3", "-", "*", "9", $00, $00
;
;==================================================================================================
; PARALLEL PORT KEYBOARD DRIVER - DATA
;==================================================================================================
;
CAPSLOCK .DB 0 ; CAPS LOCK TOGGLED FLAG, $00=NO, $FF=YES
CTRL .DB 0 ; CTRL KEY PRESSED FLAG, $00=NO, $FF=YES
NUMLOCK .DB 0 ; NUM LOCK TOGGLED FLAG, $00=NO, $FF=YES
SKIPCOUNT .DB 0 ; SKIP COUNTER (SEE CODE COMMENTS)
PPK_QUEUE .FILL 16,0 ; 16 BYTE KB QUEUE
PPK_QLEN .DB 0 ; COUNT OF BYTES CURRENTLY IN QUEUE

90
branches/dgg/Source/std.asm

@ -19,8 +19,14 @@
;
;---------------------------------------------------------------------------------------------------
;
TRUE: .EQU 1
FALSE: .EQU 0
TRUE .EQU 1
FALSE .EQU 0
;
; DEPRECATED STUFF!!!
;
DIOPLT .EQU 0 ; DEPRECATED!!!
VDUMODE .EQU 0 ; DEPRECATED!!!
BIOSSIZE .EQU 0100H ; DEPRECATED!!!
;
; PRIMARY HARDWARE PLATFORMS
;
@ -33,11 +39,13 @@ PLT_N8 .EQU 3 ; N8 (HOME COMPUTER) Z180 SBC
BT_MENU .EQU 1 ; WAIT FOR MENU SELECTION AT LOADER PROMPT
BT_AUTO .EQU 2 ; AUTO SELECT BOOT_DEFAULT AFTER BOOT_TIMEOUT
;
; VDU MODE SELECTIONS
; VDA DEVICES (VIDEO DISPLAY ADAPTER)
;
VDUMODE_VDU .EQU 1 ; ORIGINAL ECB VDU (6545 CHIP)
VDUMODE_CVDU .EQU 2 ; ECB VDU COLOR (PENDING HARDWARE DEVELOPMENT)
VDUMODE_N8 .EQU 3 ; N8 ONBOARD VIDEO SUBSYSTEM (NOT IMPLEMENTED)
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 IMPLEMENTED)
VDADEV_7220 .EQU $30 ; ECB uP7220 (NOT IMPLEMENTED)
VDADEV_N8 .EQU $40 ; N8 ONBOARD VDA SUBSYSTEM (NOT IMPLEMENTED)
;
; CHARACTER DEVICES
;
@ -46,6 +54,7 @@ CIODEV_PRPCON .EQU $10
CIODEV_VDU .EQU $20
CIODEV_CVDU .EQU $30
CIODEV_PPPCON .EQU $40
CIODEV_CRT .EQU $80
CIODEV_BAT .EQU $E0
CIODEV_NUL .EQU $F0
;
@ -116,13 +125,13 @@ IDEMODE_DIDE .EQU 2 ; DUAL IDE
;
PPIDEMODE_STD .EQU 1 ; STANDARD N8VEM PARALLEL PORT
PPIDEMODE_DIO3 .EQU 2 ; DISKIO V3 PARALLEL PORT
;
; CONSOLE DEVICE CHOICES FOR LDRCON AND DBGCON IN CONFIG SETTINGS
;
CON_UART .EQU 1
CON_VDU .EQU 2
CON_PRP .EQU 3
CON_PPP .EQU 4
;;
;; CONSOLE DEVICE CHOICES FOR LDRCON AND DBGCON IN CONFIG SETTINGS
;;
;CON_UART .EQU 1
;CON_VDU .EQU 2
;CON_PRP .EQU 3
;CON_PPP .EQU 4
;
; CONSOLE TERMINAL TYPE CHOICES
;
@ -131,6 +140,12 @@ TERM_ANSI .EQU 1
TERM_WYSE .EQU 2
TERM_VT52 .EQU 3
;
; EMULATION TYPES
;
EMUTYP_NONE .EQU 0
EMUTYP_TTY .EQU 1
EMUTYP_ANSI .EQU 2
;
; SYSTEM GENERATION SETTINGS
;
SYS_CPM .EQU 1 ; CPM (IMPLIES BDOS + CCP)
@ -333,6 +348,7 @@ BF_CIOIN .EQU BF_CIO + 0 ; CHARACTER INPUT
BF_CIOOUT .EQU BF_CIO + 1 ; CHARACTER OUTPUT
BF_CIOIST .EQU BF_CIO + 2 ; CHARACTER INPUT STATUS
BF_CIOOST .EQU BF_CIO + 3 ; CHARACTER OUTPUT STATUS
BF_CIOCFG .EQU BF_CIO + 4 ; CHARACTER I/O CONFIG
;
BF_DIO .EQU $10
BF_DIORD .EQU BF_DIO + 0 ; DISK READ
@ -340,24 +356,46 @@ BF_DIOWR .EQU BF_DIO + 1 ; DISK WRITE
BF_DIOST .EQU BF_DIO + 2 ; DISK STATUS
BF_DIOMED .EQU BF_DIO + 3 ; DISK MEDIA
BF_DIOID .EQU BF_DIO + 4 ; DISK IDENTIFY
BF_DIOGBA .EQU BF_DIO + 8 ; DISK GET BUFFER ADR
BF_DIOSBA .EQU BF_DIO + 9 ; DISK SET BUFFER ADR
;
BF_CLK .EQU $20
BF_CLKRD .EQU BF_CLK + 0
BF_CLKWR .EQU BF_CLK + 1
;
BF_VDU .EQU $30
BF_VDUIN .EQU BF_VDU + 0 ; VDU CHARACTER INPUT
BF_VDUOUT .EQU BF_VDU + 1 ; VDU CHARACTER OUTPUT
BF_VDUIST .EQU BF_VDU + 2 ; VDU CHARACTER INPUT STATUS
BF_VDUOST .EQU BF_VDU + 3 ; VDU CHARACTER OUTPUT STATUS
BF_VDUXY .EQU BF_VDU + 4 ; VDU CURSOR POSITION X/Y
BF_DIOGETBUF .EQU BF_DIO + 8 ; DISK GET BUFFER ADR
BF_DIOSETBUF .EQU BF_DIO + 9 ; DISK SET BUFFER ADR
;
BF_RTC .EQU $20
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME
BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME
BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX
BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX
BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK
BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK
;
BF_EMU .EQU $30
BF_EMUIN .EQU BF_EMU + 0 ; EMULATOR CHARACTER INPUT
BF_EMUOUT .EQU BF_EMU + 1 ; EMULATOR CHARACTER OUTPUT
BF_EMUIST .EQU BF_EMU + 2 ; EMULATOR CHARACTER INPUT STATUS
BF_EMUOST .EQU BF_EMU + 3 ; EMULATOR CHARACTER OUTPUT STATUS
BF_EMUCFG .EQU BF_EMU + 4 ; EMULATOR CHARACTER I/O CONFIG
BF_EMUINI .EQU BF_EMU + 8 ; INITIALIZE EMULATION
BF_EMUQRY .EQU BF_EMU + 9 ; QUERY EMULATION STATUS
;
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_VDASCR .EQU BF_VDA + 9 ; SCROLL
BF_VDAKST .EQU BF_VDA + 10 ; GET KEYBOARD STATUS
BF_VDAKFL .EQU BF_VDA + 11 ; FLUSH KEYBOARD BUFFER
BF_VDAKRD .EQU BF_VDA + 12 ; READ KEYBOARD
;
BF_SYS .EQU $F0
BF_SYSGETCFG .EQU BF_SYS + 0 ; GET CONFIGURATION DATA BLOCK
BF_SYSSETCFG .EQU BF_SYS + 1 ; SET CONFIGURATION DATA BLOCK
BF_SYSBNKCPY .EQU BF_SYS + 2 ; COPY TO/FROM RAM/ROM MEMORY BANK
BF_SYSGETVER .EQU BF_SYS + 3 ; GET VERSION OF HBIOS
;
;
; MEMORY LAYOUT

150
branches/dgg/Source/tty.asm

@ -0,0 +1,150 @@
;
;==================================================================================================
; TTY EMULATION MODULE
;==================================================================================================
;
TTY_INIT:
JR TTY_INI
;
;
;
TTY_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,TTY_IN ; $30
DEC A
JR Z,TTY_OUT ; $31
DEC A
JR Z,TTY_IST ; $32
DEC A
JR Z,TTY_OST ; $33
DEC A
JR Z,TTY_CFG ; $34
CP 8
JR Z,TTY_INI ; $38
CP 9
JR Z,TTY_QRY ; $39
CALL PANIC
;
;
;
TTY_IN:
LD B,BF_VDAKRD
JP EMU_VDADISP
;
;
;
TTY_OUT:
CALL TTY_DOCHAR
XOR A
RET
;
;
;
TTY_IST:
LD B,BF_VDAKST
JP EMU_VDADISP
;
;
;
TTY_OST:
XOR A
INC A
RET
;
;
;
TTY_CFG:
XOR A
RET
;
;
;
TTY_INI:
LD (TTY_ROW),A
LD (TTY_COL),A
LD B,BF_VDARES
JP EMU_VDADISP ; RESET VDA
;
;
;
TTY_QRY:
XOR A
RET
;
;
;
TTY_DOCHAR:
LD A,E ; CHARACTER TO PROCESS
CP 8 ; BACKSPACE
JR Z,TTY_BS
CP 12 ; FORMFEED
JR Z,TTY_FF
CP 13 ; CARRIAGE RETURN
JR Z,TTY_CR
CP 10 ; LINEFEED
JR Z,TTY_LF
CP 32 ; COMPARE TO SPACE (FIRST PRINTABLE CHARACTER)
RET C ; SWALLOW OTHER CONTROL CHARACTERS
LD B,BF_VDAWRC
CALL EMU_VDADISP ; SPIT OUT THE RAW CHARACTER
LD A,(TTY_COL) ; GET CUR COL
INC A ; INCREMENT
LD (TTY_COL),A ; SAVE IT
CP 80 ; COMPARE TO COLS IN LINE
RET C ; NOT PAST END OF LINE, ALL DONE
CALL TTY_CR ; CARRIAGE RETURN
JR TTY_LF ; LINEFEED AND RETURN
;
TTY_FF:
LD DE,0 ; HOME CURSOR
LD (TTY_ROWCOL),DE ; SAVE IT
CALL TTY_XY ; EXECUTE
LD E,' ' ; FILL SCREEN WITH BLANKS
LD HL,80 * 24 ; NUMBER OF CHARACTER POSITIONS TO FILL
LD B,BF_VDAFIL
CALL EMU_VDADISP ; PERFORM FILL
JR TTY_XY ; HOME CURSOR AND RETURN
;
TTY_BS:
LD DE,(TTY_ROWCOL) ; GET CURRENT ROW/COL IN DE
LD A,E ; GET CURRENT COLUMN
CP 1 ; COMPARE TO COLUMN 1
RET C ; LESS THAN 1, NOTHING TO DO
DEC E ; POINT TO PREVIOUS COLUMN
LD (TTY_ROWCOL),DE ; SAVE NEW COLUMN VALUE
CALL TTY_XY ; MOVE CURSOR TO NEW TARGET COLUMN
LD E,' ' ; LOAD A SPACE CHARACTER
LD B,BF_VDAWRC
CALL EMU_VDADISP ; OVERWRITE WITH A SPACE CHARACTER
JR TTY_XY ; NEED TO MOVE CURSOR BACK TO NEW TARGET COLUMN
;
TTY_CR:
XOR A
LD (TTY_COL),A
JR TTY_XY
;
TTY_LF:
LD A,(TTY_ROW)
INC A
LD (TTY_ROW),A
CP 24 ; COMPARE TO SCREEN ROWS
JR C,TTY_XY ; NOT PAST END, ALL DONE
SUB 23 ; A WILL NOW HAVE NUM LINES TO SCROLL
LD E,A ; LINES TO SCROLL -> E
LD B,BF_VDASCR
CALL EMU_VDADISP ; DO THE SCROLLING
LD A,23 ; ROW 23
LD (TTY_ROW),A ; IS NOW CORRECT
JR TTY_XY ; RESPOSITION CURSOR AND RETURN
;
TTY_XY:
LD DE,(TTY_ROWCOL)
LD B,BF_VDASCP
JP EMU_VDADISP
;
;
;
TTY_ROWCOL:
TTY_COL .DB 0
TTY_ROW .DB 0

815
branches/dgg/Source/vdu.asm

@ -10,15 +10,11 @@
;__________________________________________________________________________________________________
; DATA CONSTANTS
;__________________________________________________________________________________________________
;IDE REGISTER IO PORT ; FUNCTION
;
READR .EQU 0F0h ; READ VDU
WRITR .EQU 0F1h ; WRITE VDU
SY6545S .EQU 0F2h ; VDU STATUS/REGISTER
SY6545D .EQU 0F3h ;
VPPIA .EQU 0F4h ; PPI PORT A
VPPIB .EQU 0F5h ; PPI PORT B
VPPIC .EQU 0F6h ; PPI PORT C
VPPICONT .EQU 0F7h ; PPI CONTROL PORT
STATE_NORMAL .EQU 00H ; NORMAL TERMINAL OPS
STATE_ESC .EQU 01H ; ESC MODE
@ -26,56 +22,186 @@ STATE_DIR_L .EQU 02H ; ESC-Y X *
STATE_DIR_C .EQU 03H ; ESC-Y * X
ESC_KEY .EQU 1BH ; ESCAPE CODE
;
;__________________________________________________________________________________________________
; BOARD INITIALIZATION
;__________________________________________________________________________________________________
;
VDU_INIT:
CALL INITVDU
CALL PPK_INIT
XOR A
RET
;
;__________________________________________________________________________________________________
; FUNCTION JUMP TABLE
;__________________________________________________________________________________________________
;
VDU_DISPATCH:
VDU_DISPCIO:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,VDU_IN
JR Z,VDU_CIOIN
DEC A
JR Z,VDU_OUT
JR Z,VDU_CIOOUT
DEC A
JR Z,VDU_IST
JR Z,VDU_CIOIST
DEC A
JR Z,VDU_OST
JR Z,VDU_CIOOST
CALL PANIC
;
VDU_CIOIN:
JP PPK_READ
;
VDU_INIT:
CALL INITVDU
VDU_CIOIST:
JP PPK_STAT
;
VDU_CIOOUT:
JP VDU_VDAWRC
;
VDU_CIOOST:
XOR A
INC A
RET
;
VDU_IN:
CALL GET_KEY
LD E,A
RET
;__________________________________________________________________________________________________
; NEW FUNCTION JUMP TABLE
;__________________________________________________________________________________________________
;
VDU_IST:
CALL IS_KBHIT
VDU_DISPVDA:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,VDU_VDAINI
DEC A
JR Z,VDU_VDAQRY
DEC A
JR Z,VDU_VDARES
DEC A
JR Z,VDU_VDASCS
DEC A
JR Z,VDU_VDASCP
DEC A
JR Z,VDU_VDASAT
DEC A
JR Z,VDU_VDASCO
DEC A
JR Z,VDU_VDAWRC
DEC A
JR Z,VDU_VDAFIL
DEC A
JR Z,VDU_VDASCR
DEC A
JP Z,PPK_STAT
DEC A
JP Z,PPK_FLUSH
DEC A
JP Z,PPK_READ
CALL PANIC
VDU_VDAINI:
CALL INITVDU
XOR A
RET
;
VDU_OUT:
LD C,E
CALL CHARIN
VDU_VDAQRY:
CALL PANIC
VDU_VDARES:
JR VDU_INIT
VDU_VDASCS:
CALL PANIC
VDU_VDASCP:
LD A,E
LD (TERM_X),A
LD A,D
LD (TERM_Y),A
CALL GOTO_XY
XOR A
RET
;
VDU_OST:
VDU_VDASAT:
; FIX: NOT IMPLEMENTED!!!
CALL PANIC
VDU_VDASCO:
; NOT SUPPORTED!!!
CALL PANIC
VDU_VDAWRC:
; PUSH CHARACTER OUT AT CURRENT POSITION
LD A,31 ; PREP VDU FOR DATA R/W
OUT (SY6545S),A
CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY
LD A,E
OUT (WRITR),A ; OUTPUT CHAR TO VDU
; UPDATE CURSOR POSITION TO FOLLOW CHARACTERS
LD HL,(VDU_DISPLAYPOS) ; GET CURRENT DISPLAY POSITION
INC HL ; INCREMENT IT
LD (VDU_DISPLAYPOS),HL ; STORE NEW DISPLAY POSITION
LD DE,(VDU_DISPLAY_START) ; GET DISPLAY START
ADD HL,DE ; ADD IT TO DISPLAY POSITION
LD A,14 ; UPDATE CURSOR POSITION
CALL VDU_HL2WREG_A ; SEND IT
; RETURN WITH SUCCESS
XOR A
RET
VDU_VDAFIL:
LD A, 31 ; PREP VDU FOR DATA R/W
OUT (SY6545S),A
VDU_VDAFIL1:
LD A,H ; CHECK NUMBER OF FILL CHARS LEFT
OR L
JR Z,VDU_VDAFIL2 ; ALL DONE, GO TO COMPLETION
CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY
LD A,E
OUT (WRITR), A ; OUTPUT CHAR TO VDU
DEC HL ; DECREMENT COUNT
JR VDU_VDAFIL1 ; LOOP AS NEEDED
VDU_VDAFIL2:
CALL GOTO_XY ; YES, MOVE CURSOR BACK TO ORIGINAL POSITION
XOR A ; RESULT = 0
RET
VDU_VDASCR:
; FIX: IMPLEMENT REVERSE SCROLLING!!!
LD A,E
OR A
RET Z
PUSH DE
CALL DO_SCROLL
POP DE
DEC E
JR VDU_VDASCR
;
VDU_WAITRDY:
IN A,(SY6545S) ; READ STATUS
OR A ; SET FLAGS
RET M ; IF BIT 7 SET, THEN READY!
JR VDU_WAITRDY ; KEEP CHECKING
;__________________________________________________________________________________________________
; IMBED COMMON PARALLEL PORT KEYBOARD DRIVER
;__________________________________________________________________________________________________
;
#INCLUDE "ppk.asm"
;
;__________________________________________________________________________________________________
; INITIALIZATION
;__________________________________________________________________________________________________
INITVDU:
CALL VDUINIT ; INIT VDU
CALL KB_INITIALIZE ; INIT KB
; CALL KB_INITIALIZE ; INIT KB
; CALL PR_INITIALIZE ; INIT PR
; CALL DSPMATRIX ; DISPLAY INIT MATRIX SCREEN
; CALL WAIT_KBHIT ; WAIT FOR A KEYSTROKE
LD A,0 ; EMPTY KB QUEUE
LD (KB_QUEUE_PTR),A ;
; LD A,0 ; EMPTY KB QUEUE
; LD (KB_QUEUE_PTR),A ;
CALL PERF_ERASE_EOS ; CLEAR SCREEN
CALL PERF_CURSOR_HOME ; CURSOR HOME
@ -446,12 +572,12 @@ PERF_ERASE_EOS_LOOP:
; PERFORM TERMINAL IDENTIFY FUNCTION
;__________________________________________________________________________________________________
PERF_IDENTIFY:
LD A,ESC_KEY ;
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'/' ;
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'K' ;
CALL KB_ENQUEUE ; STORE ON KB QUEUE
; LD A,ESC_KEY ;
; CALL KB_ENQUEUE ; STORE ON KB QUEUE
; LD A,'/' ;
; CALL KB_ENQUEUE ; STORE ON KB QUEUE
; LD A,'K' ;
; CALL KB_ENQUEUE ; STORE ON KB QUEUE
CALL SET_STATE_NORMAL ; SET NORMAL STATE
RET
@ -590,66 +716,6 @@ REVERSE_SCROLL:
POP HL ; RESTORE HL
POP AF ; RESTORE AF
RET ;
;__IS_KBHIT________________________________________________________________________________________
;
; WAS A KEY PRESSED?
;__________________________________________________________________________________________________
IS_KBHIT:
CALL KB_PROCESS ; CALL KEYBOARD ROUTINE
LD A,(KB_QUEUE_PTR) ; ASK IF KEYBOARD HAS KEY WAITING
OR A
JP Z,CIO_IDLE
LD A,$FF ; SIGNAL DATA PENDING
RET
;__WAIT_KBHIT______________________________________________________________________________________
;
; WAIT FOR A KEY PRESS
;__________________________________________________________________________________________________
WAIT_KBHIT:
CALL IS_KBHIT
JR Z,WAIT_KBHIT
RET
;__GET_KEY_________________________________________________________________________________________
;
; GET KEY PRESS VALUE
;__________________________________________________________________________________________________
GET_KEY:
CALL WAIT_KBHIT ; WAIT FOR A KEY
LD A,(KB_QUEUE_PTR) ; GET QUEUE POINTER
OR A ;
RET Z ; ABORT IF QUEUE EMPTY
PUSH BC ; STORE BC
LD B,A ; STORE QUEUE COUNT FOR LATER
PUSH HL ; STORE HL
LD A,(KB_QUEUE) ; GET TOP BYTE FROM QUEUE
PUSH AF ; STORE IT
LD HL,KB_QUEUE ; GET POINTER TO QUEUE
GET_KEY_LOOP: ;
INC HL ; POINT TO NEXT VALUE IN QUEUE
LD A,(HL) ; GET VALUE
DEC HL ;
LD (HL),A ; MOVE IT UP ONE
INC HL ;
DJNZ GET_KEY_LOOP ; LOOP UNTIL DONE
LD A,(KB_QUEUE_PTR) ; DECREASE QUEUE POINTER BY ONE
DEC A ;
LD (KB_QUEUE_PTR),A ;
POP AF ; RESTORE VALUE
POP HL ; RESTORE HL
POP BC ; RESTORE BC
RET
;__VDUINIT__________________________________________________________________________________________
;
@ -746,20 +812,20 @@ VDU_CRTSPACELOOP: ;
; HL: WORD VALUE TO WRITE
;__________________________________________________________________________________________________
VDU_HL2WREG_A:
PUSH BC ; STORE BC
PUSH AF ; STORE AF
CALL VDU_UPDATECHECK ; WAIT FOR VDU TO BE READY
POP AF ; RESTORE AF
LD C, SY6545S ; ADDRESS REGISTER
OUT (C), A ; SELECT REGISTER (A)
INC C ; NEXT WRITE IN REGISTER
OUT (C), H ; WRITE H TO SELECTED REGISTER
DEC C ; NEXT WRITE SELECT REGISTER
INC A ; INCREASE REGISTER NUMBER
OUT (C), A ; SELECT REGISTER (A+1)
INC C ; NEXT WRITE IN REGISTER
OUT (C), L ; WRITE L TO SELECTED REGISTER
POP BC ; RESTORE BC
PUSH BC ; STORE BC
; PUSH AF ; STORE AF
; CALL VDU_UPDATECHECK ; WAIT FOR VDU TO BE READY
; POP AF ; RESTORE AF
LD C, SY6545S ; ADDRESS REGISTER
OUT (C), A ; SELECT REGISTER (A)
INC C ; NEXT WRITE IN REGISTER
OUT (C), H ; WRITE H TO SELECTED REGISTER
DEC C ; NEXT WRITE SELECT REGISTER
INC A ; INCREASE REGISTER NUMBER
OUT (C), A ; SELECT REGISTER (A+1)
INC C ; NEXT WRITE IN REGISTER
OUT (C), L ; WRITE L TO SELECTED REGISTER
POP BC ; RESTORE BC
RET
;__VDU_UPDATECHECK_________________________________________________________________________________
@ -767,9 +833,9 @@ VDU_HL2WREG_A:
; WAIT FOR VDU TO BE READY
;__________________________________________________________________________________________________
VDU_UPDATECHECK:
IN A,(SY6545S) ; READ ADDRESS/STATUS REGISTER
IN A,(SY6545S) ; READ ADDRESS/STATUS REGISTER
BIT 7,A ; IF BIT 7 = 1 THAN AN UPDATE STROBE HAS OCCURED
RET NZ ;
RET NZ
JR VDU_UPDATECHECK ; WAIT FOR READY
VDU_INIT6845:
@ -784,7 +850,7 @@ VDU_INIT6845:
.DB 01EH ; R4 VERTICAL TOTAL (TOTAL CHARS IN A FRAME -1)
.DB 002H ; R5 VERTICAL TOTAL ADJUST (
.DB 018H ; R6 VERTICAL DISPLAYED (24 ROWS)
.DB 01CH ; R7 VERTICAL SYNC
.DB 01AH ; R7 VERTICAL SYNC
.DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING
; B6=1 PIN 34 IS UPDATE STROBE
; B5=1 DELAY CURSOR 1 CHARACTER
@ -1005,529 +1071,6 @@ VDU_PUTCHAR1: ;
; RET
;__KB_INITIALIZE___________________________________________________________________________________
;
; INITIALISE - CLEAR SOME LOCATIONS AND SEND A RESET TO THE KEYBOARD
;__________________________________________________________________________________________________
KB_INITIALIZE:
CALL KB_SETPORTC ; SETS PORT C SO CAN INPUT AND OUTPUT
CALL KB_RESET ; RESET TO THE KEYBOARD
LD A,200 ; 1 SECOND DELAY AS KEYBOARD SENDS STUFF BACK WHEN RESET
CALL KB_DELAY ; IGNORE ANYTHING BACK AFTER A RESET
LD A,0 ; EMPTY KB QUEUE
LD (KB_QUEUE_PTR),A ;
RET
;__KB_RESET________________________________________________________________________________________
;
; RESET THE KEYBOARD
;__________________________________________________________________________________________________
KB_RESET:
CALL KB_DATAHIGH ;
CALL KB_CLOCKHIGH ;
LD B,255 ;
SF1: DJNZ SF1 ;
CALL KB_CLOCKLOW ; STEP 1
LD B,255 ;
SF2: DJNZ SF2 ;
CALL KB_DATALOW ; STEP 2
CALL KB_CLOCKHIGH ; STEP 3
CALL KB_WAITCLOCKLOW ; STEP 4
LD B,9 ; 8 DATA BITS + 1 PARITY BIT LOW
SF3: PUSH BC ;
CALL KB_DATAHIGH ; STEP 5
CALL KB_WAITCLOCKHIGH ; STEP 6
CALL KB_WAITCLOCKLOW ; STEP 7
POP BC ;
DJNZ SF3 ;
CALL KB_DATAHIGH ; STEP9
CALL KB_WAITCLOCKLOW ; STEP 10 COULD READ THE ACK BIT HERE IF WANT TO
CALL KB_WAITCLOCKHIGH ; STEP 11
LD B,255 ;
SF4: DJNZ SF4 ; FINISH UP DELAY
RET
;__KB_SETPORTC_____________________________________________________________________________________
;
; SETUP PORT C OF 8255 FOR KEYBOARD
;__________________________________________________________________________________________________
KB_SETPORTC:
LD A,10000010B ; A=OUT B=IN, C HIGH=OUT, CLOW=OUT
OUT (VPPICONT),A ; PPI CONTROL PORT
LD A,00000000B ; PORT A TO ZERO AS NEED THIS FOR COMMS TO WORK
OUT (VPPIA),A ; PPI PORT A
CALL KB_DATAHIGH ;
CALL KB_CLOCKHIGH ;
LD A,0 ;
LD (CAPSLOCK),A ; SET CAPSLOCK OFF TO START
LD (CTRL),A ; CONTROL OFF
LD (NUMLOCK),A ; NUMLOCK OFF
RET
;_________________________________________________________________________________________________
;
; PORT C BIT ROUTINES
;__________________________________________________________________________________________________
KB_PORTCBIT0HIGH: ;
LD A,01110001B ; SEE THE 8255 DATA SHEET
JP KB_SETBITS ;
KB_PORTCBIT1HIGH: ;
LD A,01110011B ; SEE THE 8255 DATA SHEET
JP KB_SETBITS ;
KB_PORTCBIT2HIGH: ;
LD A,01110101B ; SEE THE 8255 DATA SHEET
JP KB_SETBITS ;
KB_PORTCBIT3HIGH: ;
LD A,01110111B ; SEE THE 8255 DATA SHEET
JP KB_SETBITS ;
KB_PORTCBIT0LOW: ;
LD A,01110000B ; SEE THE 8255 DATA SHEET
JP KB_SETBITS ;
KB_PORTCBIT1LOW: ;
LD A,01110010B ; SEE THE 8255 DATA SHEET
JP KB_SETBITS ;
KB_PORTCBIT2LOW: ;
LD A,01110100B ; SEE THE 8255 DATA SHEET
JP KB_SETBITS ;
KB_PORTCBIT3LOW: ;
LD A,01110110B ; SEE THE 8255 DATA SHEET
JP KB_SETBITS ;
KB_DATAHIGH:
KB_PORTCBIT4HIGH: ;
LD A,01111001B ; SEE THE 8255 DATA SHEET
JP KB_SETBITS ;
KB_DATALOW: ;
KB_PORTCBIT4LOW: ;
LD A,01111000B ; SEE THE 8255 DATA SHEET
JP KB_SETBITS ;
KB_CLOCKHIGH: ;
KB_PORTCBIT5HIGH: ;
LD A,01111011B ; BIT 5 HIGH
JP KB_SETBITS ;
KB_CLOCKLOW: ;
PORTCBIT5LOW: ;
LD A,01111010B ;
KB_SETBITS: ;
OUT (VPPICONT),A ;
RET ;
;__KB_WAITCLOCKLOW_________________________________________________________________________________
;
; WAITCLOCKLOW SAMPLES DATA BIT 0, AND WAITS TILL
; IT GOES LOW, THEN RETURNS
; ALSO TIMES OUT AFTER 0 001 SECONDS
; USES A, CHANGES B
;__________________________________________________________________________________________________
KB_WAITCLOCKLOW:
LD B,255 ; FOR TIMEOUT COUNTER
WL1: IN A,(VPPIB) ; GET A BYTE FROM PORT B
BIT 1,A ; TEST THE CLOCK BIT
RET Z ; EXIT IF IT WENT LOW
DJNZ WL1 ; LOOP B TIMES
RET
;__KB_WAITCLOCKHIGH_________________________________________________________________________________
;
; WAITCLOCKHIGH SAMPLES DATA BIT 0, AND WAITS TILL
; IT GOES HIGH, THEN RETURNS
; ALSO TIMES OUT AFTER 0 001 SECONDS
; USES A, CHANGES B
;__________________________________________________________________________________________________
KB_WAITCLOCKHIGH:
LD B,255 ; FOR TIMEOUT COUNTER
WH1: IN A,(VPPIB) ; GET A BYTE FROM PORT B
BIT 1,A ; TEST THE CLOCK BIT
RET NZ ; EXIT IF IT WENT HIGH
DJNZ WH1 ; LOOP B TIMES
RET
;__KB_DELAY________________________________________________________________________________________
;
; PASS A - DELAY IS B*0 005 SECONDS, BCDEHL ALL PRESERVED
;__________________________________________________________________________________________________
KB_DELAY:
PUSH BC ; STORE ALL VARIABLES
PUSH DE ;
PUSH HL ;
LD B,A ; PUT THE VARIABLE DELAY IN B
LD DE,1 ;
LOOP1: LD HL,740 ; ADJUST THIS VALUE FOR YOUR CLOCK 1481=3 68MHZ, 3219=8MHZ (TEST WITH A=1000=10 SECS)
LOOP2: SBC HL,DE ; HL-1
JR NZ,LOOP2 ;
DJNZ LOOP1 ;
POP HL ; RESTORE VARIABLES
POP DE ;
POP BC ;
RET ;
;__KB_PROCESS______________________________________________________________________________________
;
; A=0 IF WANT TO KNOW IF A BYTE IS AVAILABLE, AND A=1 TO ASK FOR THE BYTE
;__________________________________________________________________________________________________
KB_PROCESS:
CALL SKIP ; DON'T TEST EVERY ONE AS TAKES TIME
OR A ; IS IT ZERO
RET Z ; RETURN IF ZERO
CALL KB_WAITBYTE ; TEST KEYBOARD TIMES OUT AFTER A BIT
CALL KB_DECODECHAR ; RETURNS CHAR OR 0 FOR THINGS LIKE KEYUP, SOME RETURN DIRECTLY TO CP/M
RET ; RETURN TO CP/M
;-----------------------------------------------
; CPM CALLS THE KEYBOARD QUITE FREQUENTLY IF A KEYBOARD WAS LIKE A UART WHICH CAN BE CHECKED
; WITH ONE INSTRUCTION, THAT WOULD BE FINE BUT CHECKING A KEYBOARD INVOLVES PUTTING THE CLOCK LINE LOW
; THEN WAITING SOME TIME FOR A POSSIBLE REPLY, THEN READING IN BITS WITH TIMEOUTS AND THEN RETURNING
; THIS SLOWS DOWN A LOT OF CP/M PROCESSES, EG TRY TYPE MYPROG AND PRINTING OUT TEXT
SKIP:
LD B,0 ;
LD A,(SKIPCOUNT) ;
DEC A ; SUBTRACT 1
LD (SKIPCOUNT),A ; STORE IT BACK
CP 0 ;
JP NZ,SK1 ; WORDSTAR IS VERY SLOW EVEN TRIED A VALUE OF 5 TO 200 HERE
LD A,200 ; ONLY ACT ON EVERY N CALLS - BIGGER=BETTER BECAUSE THIS SUB IS QUICKER THAN READBITS
LD (SKIPCOUNT),A ; RESET COUNTER
LD B,1 ; FLAG TO SAY RESET COUNTER
SK1: ;
LD A,B ; RETURN THE VALUE IN A
RET
;__KB_DECODECHAR____________________________________________________________________________________
;
; DECODE CHARACTER PASS A AND PRINTS OUT THE CHAR
; ON THE LCD SCREEN
;__________________________________________________________________________________________________
KB_DECODECHAR:
CP 0 ; IS IT ZERO
RET Z ; RETURN IF A ZERO - NO NEED TO DO ANYTHING
CP 0F0H ; IS A KEY UP (NEED TO DO SPECIAL CODE FOR SHIFT)
JP Z,DECKEYUP ; IGNORE CHAR UP
CP 0E0H ; TWO BYTE KEYPRESSES
JP Z,TWOBYTE ;
CP 058H ; CAPS LOCK SO TOGGLE
JP Z,CAPSTOG ;
CP 12H ; SHIFT (DOWN, BECAUSE UP WOULD BE TRAPPED BY 0F ABOVE)
JP Z,SHIFTDOWN ;
CP 59H ; OTHER SHIFT KEY
JP Z,SHIFTDOWN ;
CP 014H ; CONTROL KEY
JP Z,CONTROLDOWN ;
CP 05AH ; ENTER KEY
JP Z,RETURN ;
CP 066H ; BACKSPACE KEY
JP Z,BACKSPACE ;
CP 0DH ; TAB KEY
JP Z,TABKEY ;
CP 076H ; ESCAPE KEY
JP Z,ESCAPE ;
LD C,A ;
LD B,0 ; ADD BC TO HL
LD HL,NORMALKEYS ; OFFSET TO ADD
ADD HL,BC ;
JP TESTCONTROL ; IS THE CONTROL KEY DOWN?
DC1: LD A,(CAPSLOCK) ;
CP 0 ; IS IT 0, IF SO THEN DON'T ADD THE CAPS OFFSET
JR Z,DC2 ;
LD C,080H ; ADD ANOTHER 50H TO SMALLS TO GET CAPS
ADD HL,BC ;
DC2: LD A,(HL) ;
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
TESTCONTROL:
LD A,(CTRL) ;
CP 0 ; IS CONTROL BEING HELD DOWN?
JP Z,DC1 ; NO SO GO BACK TO TEST CAPS LOCK ON
LD A,(HL) ; GET THE LETTER, SHOULD BE SMALLS
SUB 96 ; A=97 SO SUBTRACT 96 A=1=^A
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ; RETURN INSTEAD OF THE RET AFTER DC2
TABKEY: ;
LD A,9 ;
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;TAB
BACKSPACE: ;
LD A,8 ; BACKSPACE
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
ESCAPE: ;
LD A,27 ;
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
RETURN: ;
LD A,13 ; CARRIAGE RETURN
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
DECKEYUP:
CALL KB_WAITBYTE ; IGNORE KEY UP THROW AWAY THE CHARACTER UNLESS A SHIFT
CP 012H ; IS IT A SHIFT
JP Z,SHIFTUP ;
CP 59H ; OTHER SHIFT KEY
JP Z,SHIFTUP ;
CP 014H ; CONTROL UP
JP Z,CONTROLUP ; CONTROL UP
LD A,0 ; NOTHING CAPTURED SO SEND BACK A ZERO
RET
TWOBYTE:; ALREADY GOT EO SO GET THE NEXT CHARACTER
CALL KB_WAITBYTE
CP 0F0H ; SEE THE NOTES - KEYUP FOR E0 KEYS IS EO F0 NN NOT F0 EO!!
JP Z,TWOBYTEUP ;
CP 071H ; DELETE
JP Z,DELETEKEY ;
CP 05AH ; RETURN ON NUMBER PAD
JP Z,RETURNKEY ;
CP 072H ;
JP Z,DOWNARROW ;
CP 074H ;
JP Z,RIGHTARROW ;
CP 06BH ;
JP Z,LEFTARROW ;
CP 075H ;
JP Z,UPARROW ;
CP 070H ;
JP Z,INSERT ;
CP 07DH ;
JP Z,PAGEUP ;
CP 07AH ;
JP Z,PAGEDOWN ;
CP 06CH ;
JP Z,HOME ;
CP 069H ;
JP Z,END ;
LD A,0 ; RETURNS NOTHING
RET
TWOBYTEUP: ;EXPECT A BYTE AND IGNORE IT
CALL KB_WAITBYTE ;
LD A,0 ;
RET ;
HOME: ;
LD A,1BH ; ESC
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'?' ; ?
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'W' ; W
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
END: ;
LD A,1BH ; ESC
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'?' ; ?
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'Q' ; Q
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
DOWNARROW: ;
LD A,1BH ; ESC
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'B' ; B
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
RIGHTARROW: ;
LD A,1BH ; ESC
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'C' ; C
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
LEFTARROW: ;
LD A,1BH ; ESC
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'D' ; D
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
UPARROW: ;
LD A,1BH ; ESC
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'A' ; A
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
INSERT: ;
LD A,1BH ; ESC
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'?' ; ?
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'P' ; P
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
PAGEUP: ;
LD A,1BH ; ESC
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'?' ; ?
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'Y' ; Y
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
PAGEDOWN: ;
LD A,1BH ; ESC
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'?' ; ?
CALL KB_ENQUEUE ; STORE ON KB QUEUE
LD A,'S' ; S
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
CONTROLDOWN: ; SAME CODE AS SHIFTDOWN BUT DIFF LOCATION
LD A,0FFH ;
LD (CTRL),A ; CONTROL DOWN
LD A,0 ;
RET ;
CONTROLUP: ; CONTROL KEY UP SEE SHIFT FOR EXPLANATION
LD A,0 ;
LD (CTRL),A ;
LD A,0 ;
RET ;
RETURNKEY: ;
LD A,13 ;
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
DELETEKEY: ;
LD A,07FH ; DELETE KEY VALUE THAT CP/M USES
CALL KB_ENQUEUE ; STORE ON KB QUEUE
RET ;
CAPSTOG: ;
LD A,(CAPSLOCK) ;
XOR 11111111B ; SWAP ALL THE BITS
LD (CAPSLOCK),A ;
LD A,0 ; RETURNS NOTHING
RET ;
SHIFTDOWN: ; SHIFT IS SPECIAL - HOLD IT DOWN AND IT AUTOREPEATS
; SO ONCE IT IS DOWN, TURN CAPS ON AND IGNORE ALL FURTHER SHIFTS
; ONLY AN F0+SHIFT TURNS CAPS LOCK OFF AGAIN
LD A,0FFH ;
LD (CAPSLOCK),A ;
LD A,0 ; RETURNS NOTHING
RET ;
SHIFTUP: ; SHIFTUP TURNS OFF CAPS LOCK DEFINITELY
LD A,0 ;
LD (CAPSLOCK),A ;
LD A,0 ; RETURNS NOTHING
RET ;
;__KB_ENQUEUE______________________________________________________________________________________
;
; STORE A BYTE IN THE KEYBOARD QUEUE
; A: BYTE TO ENQUEUE
;__________________________________________________________________________________________________
KB_ENQUEUE:
PUSH DE ; STORE DE
PUSH HL ; STORE HL
PUSH AF ; STORE VALUE
LD A,(KB_QUEUE_PTR); PUT QUEUE POINTER IN A
CP 15 ; IS QUEUE FULL
JP P,KB_ENQUEUE_AB ; YES, ABORT
LD HL,KB_QUEUE ; GET QUEUE POINTER
PUSH HL ; MOVE HL TO BC
POP BC ;
LD H,0 ; ZERO OUT H
LD L,A ; PLACE QUEUE POINTER IN L
ADD HL,BC ; POINT HL AT THE NEXT LOACTION TO ADD VALUE
POP AF ; RESTORE VALUE
LD (HL),A ; ENQUEUE VALUE
LD A,(KB_QUEUE_PTR); GET QUEUE POINTER
INC A ; INC IT
LD (KB_QUEUE_PTR),A ;STORE QUEUE POINTER
KB_ENQUEUE_AB:
POP HL ; RESTORE HL
POP DE ; RESTORE DE
RET
;__KB_WAITBYTE_____________________________________________________________________________________
;
; WAIT FOR A BYTE - TESTS A NUMBER OF TIMES IF THERE IS A KEYBOARD INPUT,
; OVERWRITES ALL REGISTERS, RETURNS BYTE IN A
;__________________________________________________________________________________________________
KB_WAITBYTE:
CALL KB_CLOCKHIGH ; TURN ON KEYBOARD
LD HL,500 ; NUMBER OF TIMES TO CHECK 200=SLOW TYPE
; 10=ERROR, 25 ?ERROR 50 OK -
; THIS DELAY HAS TO BE THERE OTHERWISE WEIRD KEYUP ERRORS
WB1: PUSH HL ; STORE COUNTER
CALL KB_READBITS ; TEST FOR A LOW ON THE CLOCK LINE
POP HL ; GET THE COUNTER BACK
CP 0 ; TEST FOR A ZERO BACK FROM READBITS
JR NZ,WB2 ; IF NOT A ZERO THEN MUST HAVE A BYTE IE A KEYBOARD PRESS
LD DE,1 ; LOAD WITH 1
SBC HL,DE ; SUBTRACT 1
JR NZ,WB1 ; LOOP WAITING FOR A RESPONSE
WB2: PUSH AF ; STORE THE VALUE IN A
CALL KB_CLOCKLOW ; TURN OFF KEYBOARD
POP AF ; GET BACK BYTE AS CLOCKLOW ERASED IT
RET
;__KB_READBITS_____________________________________________________________________________________
;
; READBITS READS 11 BITS IN FROM THE KEYBOARD
; FIRST BIT IS A START BIT THEN 8 BITS FOR THE BYTE
; THEN A PARITY BIT AND A STOP BIT
; RETURNS AFTER ONE MACHINE CYCLE IF NOT LOW
; USES A, B,D, E
; RETURNS A=0 IF NO DATA, A= SCANCODE (OR PART THEREOF)
;__________________________________________________________________________________________________
KB_READBITS:
IN A,(VPPIB)
BIT 1,A ; TEST THE CLOCK BIT
JR Z,R1 ; IF LOW THEN START THE CAPTURE
LD A,0 ; RETURNS A=0 IF NOTHING
RET ;
R1: CALL KB_WAITCLOCKHIGH; IF GETS TO HERE THEN MUST BE LOW SO WAIT TILL HIGH
LD B,8 ; SAMPLE 8 TIMES
LD E,0 ; START WITH E=0
R2: LD D,B ; STORE BECAUSE WAITCLOCKHIGH DESTROYS
CALL KB_WAITCLOCKLOW ; WAIT TILL CLOCK GOES LOW
IN A,(VPPIB) ; SAMPLE THE DATA LINE
RRA ; MOVE THE DATA BIT INTO THE CARRY REGISTER
LD A,E ; GET THE BYTE WE ARE BUILDING IN E
RRA ; MOVE THE CARRY BIT INTO BIT 7 AND SHIFT RIGHT
LD E,A ; STORE IT BACK AFTER 8 CYCLES 1ST BIT READ WILL BE IN B0
CALL KB_WAITCLOCKHIGH; WAIT TILL GOES HIGH
LD B,D ; RESTORE FOR LOOP
DJNZ R2 ; DO THIS 8 TIMES
CALL KB_WAITCLOCKLOW ; GET THE PARITY BIT
CALL KB_WAITCLOCKHIGH;
CALL KB_WAITCLOCKLOW ; GET THE STOP BIT
CALL KB_WAITCLOCKHIGH;
LD A,E ; RETURNS WITH ANSWER IN A
RET
NORMALKEYS:
; THE TI CHARACTER CODES, OFFSET FROM LABEL BY KEYBOARD SCAN CODE
.DB $00, $00, $00, $00, $00, $00, $00, $00
.DB $00, $00, $00, $00, $00, $09, "`", $00 ; $09=TAB
.DB $00, $00, $00, $00, $00, "q", "1", $00
.DB $00, $00, "z", "s", "a", "w", "2", $00
.DB $00, "c", "x", "d", "e", "4", "3", $00
.DB $00, " ", "v", "f", "t", "r", "5", $00
.DB $00, "n", "b", "h", "g", "y", "6", $00
.DB $00, $00, "m", "j", "u", "7", "8", $00
.DB $00, ",", "k", "i", "o", "0", "9", $00
.DB $00, ".", "/", "l", ";", "p", "-", $00
.DB $00, $00, $27, $00, "[", "=", $00, $00 ; $27=APOSTROPHE
.DB $00, $00, $00, "]", $00, $5C, $00, $00 ; $5C=BACKSLASH
.DB $00, $00, $00, $00, $00, $00, $00, $00
.DB $00, "1", $00, "4", "7", $00, $00, $00
.DB "0", ".", "2", "5", "6", "8", $00, $00
.DB $00, "+", "3", "-", "*", "9", $00, $00
SHIFTKEYS:
.DB $00, $00, $00, $00, $00, $00, $00, $00
.DB $00, $00, $00, $00, $00, 009, "~", $00 ; $09=TAB
.DB $00, $00, $00, $00, $00, "Q", "!", $00
.DB $00, $00, "Z", "S", "A", "W", "@", $00
.DB $00, "C", "X", "D", "E", "$", "#", $00
.DB $00, " ", "V", "F", "T", "R", "%", $00
.DB $00, "N", "B", "H", "G", "Y", "^", $00
.DB $00, $00, "M", "J", "U", "&", "*", $00
.DB $00, "<", "K", "I", "O", ")", "(", $00
.DB $00, ">", "?", "L", ":", "P", "_", $00
.DB $00, $00, 034, $00, "{", "+", $00, $00 ; $22=DBLQUOTE
.DB $00, $00, $00, "}", $00, "|", $00, $00
.DB $00, $00, $00, $00, $00, $00, $00, $00
.DB $00, "1", $00, "4", "7", $00, $00, $00
.DB "0", ".", "2", "5", "6", "8", $00, $00
.DB $00, "+", "3", "-", "*", "9", $00, $00
;
;==================================================================================================
; VDU DRIVER - DATA
@ -1542,9 +1085,3 @@ TERMSTATE .DB 0 ; TERMINAL STATE
; 1 = ESC RCVD
VDU_DISPLAYPOS .DW 0 ; CURRENT DISPLAY POSITION
VDU_DISPLAY_START .DW 0 ; CURRENT DISPLAY POSITION
CAPSLOCK .DB 0 ; location for caps lock, either 00000000 or 11111111
CTRL .DB 0 ; location for ctrl on or off 00000000 or 11111111
NUMLOCK .DB 0 ; location for num lock
SKIPCOUNT .DB 0 ; only check some calls, speeds up a lot of cp/m
KB_QUEUE .FILL 16,0 ; 16 BYTE KB QUEUE
KB_QUEUE_PTR .DB 0 ; POINTER TO QUEUE

4
branches/dgg/Source/ver.inc

@ -1,6 +1,6 @@
#DEFINE RMJ 2
#DEFINE RMN 2
#DEFINE RUP 0
#DEFINE RTP 1
#DEFINE BIOSVER "2.2 B1"
#DEFINE RTP 2
#DEFINE BIOSVER "2.2 B2"
#DEFINE REVISION 1741

Loading…
Cancel
Save