Here is Wilf's documentation (set the text coding to "western" to see it correctly in the browser): http://www.user.dccnet.com/wrigter/inde ... va2005.htm
Here is his source code (extracted from Wilf's page):
Code: Select all
;NOVA SOURCE CODE LISTING
;COMPATIBLE WITH ARTIC ASSEMBLER
;** NEW VIDEO VECTOR **
STRT1 LD IX,VDR ;NEVER CALL VDR DIRECTLY
RET
;** MAIN LOOP **
VDR CALL SDP ;STATUS LINE (RTC)
CALL FRM ;RTC UPDATE
CALL VDP ;VARIABLE LENGTH DFILE OR A$
;CALC BOTTOM BLANK LINES
CALL ZDP ;ZX COMMAND LINE 24 (?)
CALL RTN ;KEY REPEAT(?) AND RETURN TO BASIC
VDR1 CALL SNC ;FRAMES, KEYBOARD, VERTICAL SYNC
LD B,07 ;ALIGN SCREEN
CALL DLY ;VARIABLE DELAY ROUTINE
LD A,EC ;NUMBER OF TOP BLANK LINES
EX AF ;SAVE FOR NMI
CALL TRCE ;BASIC LINE TRACE ROUTINE
CALL USR ;DO USER ROUTINE
LD IX,VDR ;RESTORE VDR JUMP VECTOR
JP 02A4 ;EXIT TO BASIC UNTIL NEXT VDR
;** VARIABLE DELAY ROUTINE **
DLY NOP ;DELAY TIME DEPENDS ON
DLY0 NOP ;REGISTER B AND ENTRY POINT
DLY2 NOP ;
DLY3 NOP ;
DLY1 NOP ;EACH NOP = 4T STATES
DLY4 NOP ;PLUS REG B X 12T + 7T
DLY5 NOP
DLYB DJNZ DLYB
RET
;** VSYNC VIA KEY SCAN **
SNC PUSH AF ;DUMMY REGISTER PUSH TO
PUSH BC ;FORCE RETURN TO VDR (NOT BASIC)
PUSH DE
PUSH HL
JP 0229 ;FRAMES, KEYBOARD AND VSYNC
RTN LD A,(FLAG) ;CHECK FLAG
BIT 1,A ;FOR REPEAT BIT 1 SET
JR Z RTN1 ;EXIT IS NO REPEAT
XOR A ;REPEAT SET SO
LD (4027),A ;RESET DEBOUNCE SYSVAR
RTN1 POP IX ;SAVE RETURN ADDRESS IN REG IX
JP 02A2 ;START NMI AND RETURN TO BASIC
;** TOP OF DISPLAY SCREEM **
SDP LD B,02 ;SYNCHRONIZE WITH DISPLAY
CALL DLY ;
LD HL,RTCL ;POINT TO THE STATUS LINE
JR ZDP1 ;AND DISPLAY IT
;** MIDDLE OF DISPLAY SCREEM **
VDP LD B,29 ;SYNCRONIZE DISPLAY
CALL DLY1 ;
LD DE,(OFFST) ;FIND THE START OF THE MAIN DISPLAY
LD A,E ;IF OFFSET IS ZERO,
OR D ;
JR Z VDP1 ;THEN DISPLAY D-FILE
LD HL,(4010) ;ELSE FIND START OF VARIABLES
ADD HL,DE ;ADD THE OFFSET
LD DE,0005 ;ADD A$ HEADER LENGTH
JR VDP2 ;AND DISPLAY VFILE
VDP1 LD HL,(400C) ;LOAD DFILE START
ADD HL,DE ;DELAY
LD DE,0001 ;SKIP LEADING N/L
JR NZ VDP2 ;DELAY
VDP2 ADD HL,DE ;TRUE START OF DISPLAY
LD A,(LINES) ;CALCULATE NUMBER OF LINES
AND 1F ;
LD B,A ;SAVE IN B
RLCA ;CALCULATE BALNK LINES
RLCA ;
RLCA ;
ADD A,3B ;
EX AF ;SAVE IN AF’ FOR NMI
LD C,08 ;
JR ZDP2 ;GO DISPLAY MAIN SCREEN ALREADY
;** BOTTOM OF DISPLAY SCREEN **
ZDP LD B,73 ;VSYNC DELAY
CALL DLY5 ;
LD A,(FLAG) ;DISPLAY ZX COMMAND LINE 24 (?)
BIT 2,A ;
JR NZ ZDP0 ;YES, GO DISPLAY LINE 24
EX AF ;NO LINE 24 = ADD EXTRA BLANK TIME
SUB 09 ;
EX AF ;SAVE FOR NMI
RET ;
ZDP0 XOR A ;START OF LINE 24 CAN BE FOUND BY
LD HL,(4010) ;START OF VAR AREA
LD DE,0021 ;32 CHARACTERS PLUS NEWLINE
SBC HL,DE ;SUBTRACT TO POINT TO START OF LINE 24
ZDP1 LD BC,0108 ;ONE ROW OR 8 HORIZONTAL LINES
ZDP2 SET 7,H ;ECHO DISPLAY ABOVE 32K
LD A,DD ;34 CHARACTERS PER LINE OR N/L (HALT WITH A6 INTERRUPT)
JP 0041 ;GO TO ZX INTERRUPT ROUTINE AND RETURN
;CONVERT LINE NUMBER IN (4007) TO DECIMAL
TRCE LD A,(FLAG) ;CHECK FLAG FOR BASIC LINE TRACE ON (?)
BIT 0,A ;
RET Z ;RETURN IF NO TRACE
LD DE,TRCL ;START OF TOP STATUS LINE
LD HL,(4007) ;BASIC LINE NUMBER
LD BC,FC18 ;DIVIDE BY 1000
CALL TR1 ;
LD BC,FF9C ;DIVIDE BY 100
CALL TR1 ;
LD BC,FFF6 ;DIVIDE BY 10
CALL TR1 ;
LD A,1C ;PLUS UNITS
ADD A,L ;
JR TR3 ;
TR1 LD A,1C ;DECIMAL CONVERSION HAS
TR2 ADD HL,BC ;VARIABLE EXECUTION TIME
INC A ;SO RUN WHILE NMI IS ON
JR C TR2 ;SUBTRACT BC UNTIL OVERFLOW
SBC HL,BC ;SUBTRACT ONE LOOP
DEC A ;ADJUST DIGIT
TR3 AND 3F ;LIMIT RESULT
LD (DE),A ;LOAD DIGIT IN TRACE FIELD
INC DE ;NEXT DIGIT
RET ;
;UPDATE 100 HR TIMER
FRM LD DE,TITL-1 ;POINTER TO TIMER FIELD LEAST SIGNIFICANT DIGIT
LD HL,FRM6+1 ;POINTER TO DIGIT LIMITS AND COLON FLAG
LD B,08 ;8 DIGITS
SCF ;FIXED EXECUTION TIME BETWEEN STATUS LINE AND VDP
FRM1 LD A,(DE) ;GET DIGIT
ADC A,00 ;CARRY FLAG ADDS ONE TO DIGIT
CP (HL) ;CHECK AGAINST LIMIT
CCF ;IF LIMIT THEN RESET DIGIT TO ZERO
JR C FRM2 ;AND CARRY INCREMENTS NEXT DIGIT
LD (DE),A ;ELSE NO CARRY AND LOAD TIMER FIELD WITH DIGIT+1
JR FRM3 ;
FRM2 LD A,1C ;SET DIGIT TO ZERO
LD (DE),A ;LOAD TIMER FIELD WITH ZERO DIGIT
FRM3 DEC DE ;
DEC HL ;
BIT 7,(HL) ;TEST FOR COLON FLAG
JR Z FRM5 ;JR IF NOT COLON
DEC DE ;POINT TO NEXT DIGIT
DEC HL ;POINT TO NEXT LIMIT
FRM5 DJNZ FRM1 ;DO EIGHT TIMES
RET ;
26 26 80 ; LIMIT 99: (HRS)
22 26 80 ; LIMIT 59: (MIN)
22 26 80 ; LIMIT 59: (SEC)
FRM6 22 26 ; LIMIT 59 (1/60SEC)
;INITIALIZE THE COMVAR STRING ARRAY
DIM1 XOR A ;USING DIM ?$ (USR 32671)
LD HL,(4016) ;USE CH-AD TO POINT TO NAME
LD DE,000F ;IN THE BASIC LINE
SBC HL,DE ;
LD A,(HL) ;GET NAME
LD HL,ATFR ;SAVE NAME IN ATFR
LD (HL),A ;
LD C,20 ;USR MUST RETURN 32
LD B,00 ;AS THE DIMENSION OF THE ARRAY
RET ;
ULD1 CALL ALD ;LOAD DATA FROM COMVAR TO STATUS LINE
JR DLD2 ;GO TRANSFER
DLD1 CALL ALD ;LOAD DATA FROM STATUS LINE TO COMVAR
EX DE,HL ;
DLD2 LDIR ;ACTUAL TRANSFER
JR ALD1 ;
ALD LD HL,(4016) ;SAVE THE CH-ADD POINTER
EX (SP),HL ;
PUSH HL ;
LD HL,ATFR ;POINT TO COMVAR NAME
CALL 004D ;SET CH-ADD TO COMVAR NAME
CALL 111C ;LOOK UP COMVAR ADDRESS
LD DE,0006 ;SKIP COMVAR HEADER
ADD HL,DE ;
LD DE,RTCL ;POINTER TO TIMER/CLOCK FIELD
LD BC,000B ;LENGTH OF TIMER/CLOCK FIELD
RET ;
ALD1 POP HL ;RESTORE CH-ADD
LD (4016),HL ;
RET ;
;CHECK IF OFFSET EXCEEDS VFIEL
SOFT1 LD HL,(4016) ;SAVE CH-ADD
PUSH HL ;
RST 20 ;FIRST CHECK IF A$ EXISTS
LD HL,(4010) ;EXIT TO DFILE IF A$ WAS ERASED
LD A,(HL) ;BECAUSE OF RUN, CLEAR, ETC.
CP C6 ;
JR NZ SOFT2 ;
CALL 1300 ;NOW FIND END OF ARRAY
LD HL,0340 ;ASSUME A FULL SCREEN IS REQUIRED
EX DE,HL ;CAUSE LINES CAN BE ADJUSTED
SBC HL,DE ;ENOUGH ROOM FOR A FULL SCREEN?
JR C SOFT2 ;
CALL 12DD ;EVALUATE THE USR EXPRESSION
JR NC SOFT3 ;AND SAVE IN BC
SOFT2 LD BC,0000 ;SET BC TO ZERO
SOFT3 LD (OFFST),BC ;SAVE IN OFFSET
JR ALD1 ;
JPTBL ;START OF PROGRAM VARIABLE AREA
SPARE "12345" ;SPARE BYTES
FLAG 04 ;FLAG CONTROLS FEATURES (eg COMMAND LINE on)
LINES 18 ;NUMBER OF DISPLAYED LINES
OFFST 00 ;OFFSET FROM START OF A$ VARIABLE
00 ;OR “0000” IS DFILE
USR RET ;3 BYTE USER CALL TO SHORT ROUTINE
00 ;MUST RETURN BEFORE TIME IS UP
00 ;
ATFR "Z$" ;NAME OF COMVAR (TRANSFERS DATA TO LINE 1)
RTCL "00:00:00:00" ;THESE THREE FIELDS MAKE UP STATUS LINE 1
TITL " NOVA 1000 V1.0";
TRCL " <" ;
;JUMP TABLE FOR NOVA ROUTINES
STRT JP STRT1 ;ACTIVATE NOVA VIDEO ROUTINE
DIM JP DIM1 ;INITIALIZE COMVAR NAME
ULD JP ULD1 ;MOVE COMVAR TO STATUS LINE
DLD JP DLD1 ;MOVE STATUS LINE TO COMVAR
SOFT JP SOFT1 ;TEST AND LOAD OFFSET
Siggi