forked from MirrorRepos/RomWBW
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
5.3 KiB
225 lines
5.3 KiB
TITLE BBCDIST.Z80 (C) R.T.RUSSELL 1982
|
|
;
|
|
;BBC BASIC (Z80) - CP/M VERSION 2.30 & 3.00
|
|
;(C) COPYRIGHT R.T.RUSSELL, 1982.
|
|
;ALL RIGHTS RESERVED.
|
|
;
|
|
;THIS PROGRAM ALLOWS THE USER TO ADAPT BBC BASIC TO THE
|
|
;PARTICULAR CHARACTERISTICS OF HIS SYSTEM HARDWARE ETC.
|
|
;
|
|
;THE PROGRAM RESIDES AT 100H FOR EASE OF LOADING.
|
|
;*** IT MUST NOT EXCEED 256 BYTES IN TOTAL LENGTH ***
|
|
;
|
|
;PLEASE NOTE THAT A Z80 PROCESSOR AND CP/M VERSION 2.2
|
|
;OR LATER ARE REQUIRED.
|
|
;
|
|
;R.T.RUSSELL, 11-03-1984, 03-05-1989
|
|
;ALTERNATE REGISTERS SAVED FOR BDOS CALL, 04-06-2000
|
|
;
|
|
CPM EQU 5
|
|
COLD EQU 200H
|
|
;
|
|
GLOBAL CLRSCN
|
|
GLOBAL PUTCSR
|
|
GLOBAL GETCSR
|
|
GLOBAL PUTIME
|
|
GLOBAL GETIME
|
|
GLOBAL GETKEY
|
|
GLOBAL BYE
|
|
;
|
|
ASEG
|
|
ORG 100H
|
|
;
|
|
;JUMP TABLE - BASIC makes calls to hardware-dependent
|
|
;features via this table:
|
|
;
|
|
JP INIT
|
|
CLRSCN: JP CLS ;CLEAR SCREEN
|
|
PUTCSR: JP PCSR ;SET CURSOR POSN.
|
|
GETCSR: JP GCSR ;READ CURSOR POSN.
|
|
PUTIME: JP PTIME ;SET ELAPSED TIME
|
|
GETIME: JP GTIME ;READ ELAPSED TIME
|
|
GETKEY: JP INKEY ;READ KEY (TIME LIMIT)
|
|
BYE: JP REBOOT ;RETURN TO CP/M
|
|
;
|
|
;THE CODE WHICH FOLLOWS IS A SKELETON VERSION SUITABLE
|
|
;FOR ANY CP/M SYSTEM. IT HAS BEEN CONFIGURED FOR A VT100 TO SOME DEGREE
|
|
;BY PETER SCHORN.
|
|
;
|
|
|
|
PRSTR EQU 9
|
|
|
|
;INIT - Perform hardware initialisation (if any).
|
|
;
|
|
INIT: LD A,2
|
|
INC A
|
|
LD DE,NOTZ80
|
|
JP PE,FAIL
|
|
LD C,12
|
|
CALL BDOS
|
|
OR A
|
|
LD DE,NOTV2
|
|
JP NZ,COLD
|
|
FAIL: LD C,PRSTR
|
|
CALL BDOS
|
|
RST 0
|
|
;
|
|
NOTZ80: DEFB 'Wrong processor$'
|
|
NOTV2: DEFB 'Wrong CP/M version$'
|
|
;
|
|
;REBOOT - Switch off interrupts and return to CP/M
|
|
;
|
|
REBOOT: RST 0
|
|
;
|
|
;GTIME - Read elapsed-time clock.
|
|
; Outputs: DEHL = elapsed time (centiseconds)
|
|
; Destroys: A,D,E,H,L,F
|
|
;
|
|
GTIME: LD DE,0
|
|
LD HL,0
|
|
RET
|
|
;
|
|
;PTIME - Load elapsed-time clock.
|
|
; Inputs: DEHL = time to load (centiseconds)
|
|
; Destroys: A,D,E,H,L,F
|
|
;
|
|
PTIME: RET
|
|
;
|
|
;CLS - Clear screen for VT100.
|
|
; Destroys: A,D,E,H,L,F
|
|
;
|
|
CLS: PUSH BC ; save BC
|
|
LD C,PRSTR ; command for output string
|
|
LD DE,CLSSTR ; start address of string
|
|
CALL BDOS ; output to terminal
|
|
POP BC ; restore BC
|
|
RET
|
|
CLSSTR: DEFB 27,'[2J$' ; VT100 string for clear screen
|
|
|
|
;
|
|
;INKEY - Sample keyboard with specified wait.
|
|
; This version uses a simple software timing loop.
|
|
; Modify to use hardware/interrupt timer if available.
|
|
; Inputs: HL = Time to wait (centiseconds)
|
|
; Outputs: Carry reset indicates time-out.
|
|
; If carry set, A = character typed.
|
|
; Destroys: A,D,E,H,L,F
|
|
;
|
|
INKEY: PUSH BC
|
|
PUSH HL
|
|
LD C,6
|
|
LD E,0FFH
|
|
CALL BDOS ;CONSOLE INPUT
|
|
POP HL
|
|
POP BC
|
|
OR A
|
|
SCF
|
|
RET NZ ;KEY PRESSED
|
|
OR H
|
|
OR L
|
|
RET Z ;TIME-OUT
|
|
PUSH BC
|
|
LD A,-1
|
|
LD BC,1250 ;DELAY CONSTANT
|
|
WAIT: DEC BC
|
|
CP B
|
|
JP NZ,WAIT ;WAIT FOR APPROX 10ms
|
|
POP BC
|
|
DEC HL
|
|
JR INKEY
|
|
;
|
|
;PCSR - Move cursor to specified position.
|
|
; Inputs: DE = horizontal position (LHS=0)
|
|
; HL = vertical position (TOP=0)
|
|
; called by TAB(column, row)
|
|
PCSR: LD B,L ; vertical = line (row)
|
|
CALL CONV ; normalized and convert to decimal
|
|
LD (LIN),HL ; and store into string
|
|
LD B,E ; horizontal = column
|
|
CALL CONV ; normalized and convert to decimal
|
|
LD (COL),HL ; and store into string
|
|
LD C,PRSTR ; output string command
|
|
LD DE,CURS ; start of string
|
|
JR BDOS ; output string to terminal
|
|
|
|
; VT100 sequence for cursor positioning
|
|
CURS: DEFB 27, '['
|
|
LIN: DEFW 0 ; high byte, low byte for decimal line
|
|
DEFB ';'
|
|
COL: DEFW 0 ; high byte, low byte for decimal column
|
|
DEFB 'H$'
|
|
|
|
; convert binary B (0 <= B < 99, not checked) into B+1 in decimal.
|
|
; L = upper byte, H = lower byte. ready for LD (...), HL
|
|
; destroys A, B, L, H
|
|
; optimized for space over time
|
|
CONV: INC B ; normalize, home in VT100 is (1,1)
|
|
LD A,'0' ; A is counter for low byte of result
|
|
LD L,A ; L is counter for high byte of result
|
|
CONVLP: INC A ; now B times increment AL in decimal
|
|
CP '9'+1 ; low byte overflow?
|
|
JR NZ,CONT ; no, continue incrementing
|
|
LD A,'0' ; reset low byte
|
|
INC L ; and increment high byte
|
|
CONT: DJNZ CONVLP ; B times
|
|
LD H,A ; put low byte into right place
|
|
RET
|
|
|
|
|
|
;BDOS - Save the IX and IY and alternate registers
|
|
; before performing a CP/M function call.
|
|
;
|
|
BDOS: PUSH IX
|
|
PUSH IY
|
|
EXX
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
EXX
|
|
EX AF,AF'
|
|
PUSH AF
|
|
EX AF,AF'
|
|
CALL CPM
|
|
EX AF,AF'
|
|
POP AF
|
|
EX AF,AF'
|
|
EXX
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
EXX
|
|
POP IY
|
|
POP IX
|
|
RET
|
|
|
|
|
|
;GCSR - Return cursor coordinates.
|
|
; Outputs: DE = X coordinate (POS)
|
|
; HL = Y coordinate (VPOS)
|
|
; Destroys: A,D,E,H,L,F
|
|
;
|
|
GCSR: LD DE,0
|
|
LD HL,0
|
|
RET
|
|
;
|
|
IF $ GT 1F4H
|
|
ERROR 'INSUFFICIENT SPACE'
|
|
ENDIF
|
|
;
|
|
ORG 1F4H
|
|
;
|
|
DEFB 80 ;WIDTH
|
|
DEFB 'E' AND 1FH ;CURSOR UP
|
|
DEFB 'X' AND 1FH ;CURSOR DOWN
|
|
DEFB 'A' AND 1FH ;START OF LINE
|
|
DEFB 'F' AND 1FH ;END OF LINE
|
|
DEFB 'T' AND 1FH ;DELETE TO END OF LINE
|
|
DEFB 'H' AND 1FH ;BACKSPACE
|
|
DEFB 'U' AND 1FH ;CANCEL LINE
|
|
DEFB 'S' AND 1FH ;CURSOR LEFT
|
|
DEFB 'D' AND 1FH ;CURSOR RIGHT
|
|
DEFB 'G' AND 1FH ;DELETE CHARACTER
|
|
DEFB 'V' AND 1FH ;INSERT CHARACTER
|
|
;
|
|
FIN: END
|
|
|