DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦86fae914a⟧ TextFile

    Length: 21632 (0x5480)
    Types: TextFile
    Names: »BLOWUP.ASM«

Derivation

└─⟦0d02879d3⟧ Bits:30004605 COMPAS Pascal version 3.03
    └─ ⟦this⟧ »BLOWUP.ASM« 

TextFile


	ORG	4000H

;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; THE FOLLOWING ROUTINES ARE BLOWN INTO COMMON RAM
; AT START UP TIME.

;
; NOTE, THAT LABEL ADRESSES ARE SPECIFIED IN THE VARIABEL
; AREA
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
BLOWUP:
XCLRSC:
	CALL	SAVEBA+OFFSET
	JR	Z,NOINT2
	EI
NOINT2: LD	HL,0
	LD	DE,1
	LD	(HL),0
	LD	BC,32767
	LDIR
	JP	GOBACK+OFFSET

;SPROM	 DEFS	 40H
;ROMSP	 DEFS	 2
XJTAB:
	LD	(HLSTO5),HL
	LD	(AFSTOR),A
	LD	(DESTOR),DE
	LD	A,I
	DI
	POP	HL		; REMOVE PSEUDO CALL
	LD	(ROMSP),SP
	LD	SP,ROMSP
	LD	(HLSTO6),HL	; STORE PSEUDO CALL
	PUSH	AF		; GET INT FLAG
	POP	HL
	LD	A,L
	AND	00000100B
	LD	(INSAV1),A	; SAVE INT FLAG
	LD	HL,(SYBAN)	; SAVE CONFIGURATION
	LD	(HLSTO3),HL
	LD	HL,(RAMWR)
	LD	(HLSTO4),HL
	XOR	A		; OPEN SYSTEM BANK
	OUT	(SYSBAN),A
	LD	(SYBAN),A
	OUT	(RAMBAW),A	; CLOSE RAM
	LD	(RAMWR),A
	OUT	(RAMBAR),A
	LD	(RAMRD),A
	LD	(VIDROM),A	; CLOSE VIDEO
	OUT	(VIDBAN),A
	LD	HL,RETUR-BLOWUP+BLOWST
	PUSH	HL		; SAVE RETURN POINT
	LD	A,(INSAV1)
	OR	A
;	 JR	 Z,NOIN11
	EI
NOIN11:

	LD	HL,(CCPSTO)	; CALCULATE START OF
	LD	DE,1600H+3	; JUMP TABLE
	ADD	HL,DE
	LD	DE,(HLSTO6)	; CALCULATE RELATIVE START
	EX	DE,HL
	AND	A		; RESET FLAGS
	SBC	HL,DE		; RELATIVE ADDRESS FOR CALL
	EX	DE,HL
	LD	HL,JTAB
	ADD	HL,DE
	PUSH	HL
	LD	DE,(DESTOR)
	LD	HL,(HLSTO5)
	LD	A,(AFSTOR)
	RET
RETUR:
	DI
	LD	(AFSTOR),A
	LD	(HLSTO6),HL
	LD	HL,(HLSTO4)
	LD	(RAMWR),HL
	LD	A,L
	OUT	(RAMBAW),A
	LD	A,H
	OUT	(RAMBAR),A
	LD	HL,(HLSTO3)
	LD	(SYBAN),HL
	LD	A,L
	OUT	(SYSBAN),A
	LD	A,H
	OUT	(VIDBAN),A
	LD	SP,(ROMSP)
	LD	A,(INSAV1)
	OR	A
	LD	A,(AFSTOR)
	LD	HL,(HLSTO6)
	RET	Z
	EI
	RET

PLOT60:
	LD	A,(DE)
	LD	C,A
	CALL	SAVEBA+OFFSET
	JR	Z,NOIN21
	EI
NOIN21:
	LD	A,(GRAFF)
	OR	A
	JR	NZ,PLOT70
	LD	A,(FLASH)
	OR	A
	JR	NZ,PLOT66
PLOT65: IN	A,(PIOBD)
	AND	81H
	JR	Z,PLOT65
PLOT66: LD	A,C
	OR	(HL)
	LD	(HL),A
	JR	PLOT80
PLOT70: LD	A,(FLASH)
	OR	A
	JR	NZ,PLOT72
PLOT71: IN	A,(PIOBD)
	AND	81H
	JR	Z,PLOT71
PLOT72: LD	A,C
	CPL
	AND	(HL)
	LD	(HL),A
PLOT80:
	JP	GOBACK+OFFSET


;
;---------------------------------
;
; THIS PROCEDURE UPDATES CLOCK AND
; EVENTUALLY CLEARS SCROLLED LINES.
; INITIATED BY INTERRUPT!
;
SPSCRC	DEFS	20H
SCRCSP	DEFS	2
SCRCLR:
	LD	(SCRCSP-BLOWUP+BLOWST),SP
	LD	SP,SCRCSP-BLOWUP+BLOWST-1
	PUSH	AF
	PUSH	BC
	PUSH	DE
	PUSH	HL
	LD	HL,(SYBAN)	; SAVE CONFIGURATION
	PUSH	HL
	LD	HL,(RAMWR)
	PUSH	HL
	LD	A,80H
	OUT	(SYSBAN),A
	LD	(SYBAN),A
	XOR	A
	OUT	(RAMBAW),A
	LD	(RAMWR),A
	LD	A,0F0H
	LD	(VIDROM),A
	OUT	(VIDBAN),A	; OPEN ALL VIDEOBANKS
;	 EI
NOIN10:

;
; PLACE CLOCK PROCEDURE HERE
;
	LD	BC,(CLRBEGIN)
	LD	HL,(CRTSTART)
	OR	A
	SBC	HL,BC
	JR	Z,SCRC10	   ; NOTHING TO CLEAR
SCRC3:	LD	H,B
	LD	L,C
	LD	A,(PIXHO1)
	CP	40
	JR	Z,SCRC7
	LD	B,160
	XOR	A
SCRC2:	LD	(HL),A
	INC	HL
	RES	7,H
	DJNZ	SCRC2
	LD	(CLRBEGIN),HL	   ; SAVE FOR NEXT INTERRUPT
;
;
SCRC1:
;	 DI
	POP	HL
	LD	(RAMWR),HL
	LD	A,L
	OUT	(RAMBAW),A
	LD	A,H
	OUT	(RAMBAR),A
	POP	HL
	LD	(SYBAN),HL
	LD	A,L
	OUT	(SYSBAN),A
	LD	A,H
	OUT	(VIDBAN),A
	POP	HL
	POP	DE
	POP	BC
	POP	AF
	LD	SP,(SCRCSP-BLOWUP+BLOWST)
	EI
	RETI

SCRC7:	LD	B,80
	XOR	A
SCRC8:	LD	(HL),A
	INC	HL
	RES	7,H
	RES	6,H
	DJNZ	SCRC8
	LD	(CLRBEGIN),HL	   ; SAVE FOR NEXT INTERRUPT
	JR	SCRC1
SCRC10:
	LD	A,03H
	OUT	(PIOBC),A
	JR	SCRC1

; CLRBYTES
;
; CLEARS A RECTANGULAR SCREEN AREA WHICH IS ON BYTE BOUNDARIES.
;
; INPUT:
; HL IS CRT RAM ADDRESS OF BYTE IN UPPER LEFT CORNER OF AREA.
; C IS HORIZONTAL SIZE IN BYTES ( = # HORIZONTAL PIXELS / 8 ).
; B IS VERTICAL SIZE IN BYTES ( = # VERTICAL PIXELS). MUST BE NONZERO.

CLRBYTES:			; PROC CLRBYTES(HL, C, B)
	CALL	SAVEBA+OFFSET
	JR	Z,NOINT9
	EI
NOINT9:
CLRB10: 			;   DO B TIMES
	PUSH	BC		;     PUSH BC, HL
	PUSH	HL
	LD	B,C		;     B := C
	BIT	0,B
	JR	Z,CLRB15	;     IF B MOD 2 = 1 THEN
	LD	A,(FLASH)
	OR	A
	JR	NZ,CLRB11
L2:	IN	A,(PIOBD)
	AND	81H
	JR	Z,L2
CLRB11: LD	(HL),0		;	HL^ := 0
	INC	HL		;	HL := (HL+2) MOD 32K
	INC	HL
	CALL	RES76B+OFFSET
	DEC	B		;     ENDIF
CLRB15: LD	A,B		;     DO B/2 TIMES
	OR	A
	JR	Z,CLRB30
	SRL	B
CLRB20: LD	D,H		;	DE := (HL+2) MOD 32K
	LD	E,L
	INC	DE
	INC	DE
	RES	7,D
	LD	A,(FLASH)
	OR	A
	JR	NZ,CLRB22
L3:	IN	A,(PIOBD)
	AND	81H
	JR	Z,L3
CLRB22: XOR	A
	LD	(HL),A		;	HL^ := 0
	LD	(DE),A		;	DE^ := 0
	EX	DE,HL
	INC	HL		;	HL := (DE+2) MOD 32K
	INC	HL
	CALL	RES76B+OFFSET
	DJNZ	CLRB20
CLRB30: 			;     ENDDO
	POP	HL		;     POP HL,  BC
	POP	BC
	CALL	STEPHL-BLOWUP+BLOWST ;	   STEPHL(HL)
	DJNZ	CLRB10		;   ENDDO
	JP	GOBACK+OFFSET


CLRE10:
	CALL	SAVEBA+OFFSET
	JR	Z,NOINT8
	EI
NOINT8:
CLRE12: 			 ;     DO LINESPACE TIMES
	LD	A,(FLASH)
	OR	A
	JR	NZ,CLRE13
L1:	IN	A,(PIOBD)
	AND	81H
	JR	Z,L1
CLRE13: LD	A,(HL)		;	HL^ := HL^ AND C
	AND	C
	LD	(HL),A
	CALL	STEPHL-BLOWUP+BLOWST ;	     STEPHL(HL)
	DJNZ	CLRE12		;     ENDDO
	JP	GOBACK+OFFSET

TIMBUF	DEFS	12
CTCISP	DEFS	20H
SPCTCI	DEFS	2
CTCINT:
	EI
	PUSH	AF
	LD	A,(SECOND)
	INC	A
	LD	(SECOND),A
	CP	60
	JR	C,VISDET
	XOR	A
	LD	(SECOND),A
	LD	A,(MINUTE)
	INC	A
	LD	(MINUTE),A
	CP	60
	JR	C,VISDET
	XOR	A
	LD	(MINUTE),A
	LD	A,(HOUR)
	INC	A
	LD	(HOUR),A
	CP	24
	JR	C,VISDET
	XOR	A
	LD	(HOUR),A
VISDET:
	LD	A,(VISF)
	OR	A
	JR	Z,FÆRDIG
	DI
	LD	(SPCTCI-BLOWUP+BLOWST),SP
	LD	SP,SPCTCI-BLOWUP+BLOWST-1
	PUSH	BC
	PUSH	DE
	PUSH	HL
	LD	HL,(SYBAN)	; SAVE CONFIG BYTES
	PUSH	HL
	LD	HL,(RAMWR)
	PUSH	HL
	XOR	A
	OUT	(SYSBAN),A	; OPEN SYSTEM BANK
	LD	(SYBAN),A	; UPDATE CONFIG BYTE
	OUT	(RAMBAR),A	; CLOSE RAM BANK
	LD	(RAMRD),A
	OUT	(RAMBAW),A
	LD	(RAMWR),A
	LD	(VIDROM),A
	OUT	(VIDBAN),A
	EI
	LD	A,(PIXHO1)
	SUB	9
	LD	E,A
	LD	D,0
	LD	A,(HOUR)
	LD	HL,(CRTSTAR)
	ADD	HL,DE		; POSITION FOR PRINTOUT IN HL
	ADD	HL,DE
	CALL	VISD10-BLOWUP+BLOWST
	LD	A,(PIXHO1)
	SUB	6
	LD	E,A
	LD	D,0
	LD	A,(MINUTE)
	LD	HL,(CRTSTAR)
	ADD	HL,DE
	ADD	HL,DE
	CALL	VISD10-BLOWUP+BLOWST
	LD	A,(PIXHO1)
	SUB	3
	LD	E,A
	LD	D,0
	LD	A,(SECOND)
	LD	HL,(CRTSTAR)
	ADD	HL,DE
	ADD	HL,DE
	CALL	VISD10-BLOWUP+BLOWST
	DI
	POP	HL
	LD	(RAMWR),HL
	LD	A,L
	OUT	(RAMBAW),A
	LD	A,H
	OUT	(RAMBAR),A
	POP	HL
	LD	(SYBAN),HL
	LD	A,L
	OUT	(SYSBAN),A
	LD	A,H
	OUT	(VIDBAN),A
	POP	HL
	POP	DE
	POP	BC
	LD	SP,(SPCTCI-BLOWUP+BLOWST)
FÆRDIG: LD	A,(MOTORF)
	OR	A
	JR	Z,FÆRD10
	DEC	A
	LD	(MOTORF),A
	JR	NZ,FÆRD10
	OUT	(FDCMOF),A
FÆRD10: POP	AF
	EI
	RETI
VISD10:
	PUSH	HL
	CALL	OMSÆT-BLOWUP+BLOWST
	PUSH	AF		; SAVE LOW-10
	LD	A,B
	ADD	A,30H
	CALL	MOVEIT-BLOWUP+BLOWST
	POP	AF		; GET LOW-10
	POP	HL		; GET ADDRESS
	PUSH	HL		; SAVE ADDRESS
	PUSH	AF		; SAVE LOW-10
	CALL	PRINIT-BLOWUP+BLOWST
	POP	AF		; GET LOW-10
	ADD	A,3AH
	CALL	MOVEIT-BLOWUP+BLOWST
	POP	HL
	INC	HL
	INC	HL
	CALL	PRINIT-BLOWUP+BLOWST
	RET
MOVEIT: LD	H,0
	LD	L,A
	ADD	HL,HL		; * 2
	ADD	HL,HL		; * 4
	LD	D,H		; SAVE
	LD	E,L
	ADD	HL,HL		; * 8
	ADD	HL,DE		; + 4 = 12
	EX	DE,HL
	LD	HL,CHARGE
	ADD	HL,DE
	LD	DE,TIMBUF-BLOWUP+BLOWST
	LD	BC,12
	LDIR
	LD	B,12
	LD	HL,TIMBUF-BLOWUP+BLOWST
MOVEI1: LD	A,(HL)		; INVERT THE CHARACTER
	CPL
	LD	(HL),A
	INC	HL
	DJNZ	MOVEI1
	RET
PRINIT:
	DI
	LD	A,0F0H
	OUT	(VIDBAN),A
	LD	B,5		; COUNTER
	LD	D,H		; DE := HL := FIRST ADDRESS
	LD	E,L		;
	LD	HL,TIMBUF-BLOWUP+BLOWST
	INC	HL
L15:	IN	A,(PIOBD)	; WAIT FOR SYNC
	AND	81H
	JR	Z,L15
	LD	A,(HL)
	LD	(DE),A
	INC	HL
	INC	DE
L16:	IN	A,(PIOBD)
	AND	81H
	JR	Z,L16
	LD	A,(HL)
	LD	(DE),A
	DEC	DE
	INC	HL
	PUSH	HL		; SAVE ADDRESS TIMBUF
	LD	HL,(PIXHO1)	; CALCULATE NEXT ADDRESS
	ADD	HL,HL
	ADD	HL,DE		; IN VIDEO RAM
	EX	DE,HL
	POP	HL		; RECOVER ADDRESS IN TIMBUF
	DJNZ	L15
	XOR	A
	OUT	(VIDBAN),A
	EI
	RET
OMSÆT:	LD	B,0
OMSÆ10: SUB	10
	RET	C
	INC	B
	JR	OMSÆ10

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; ROUTINE WHICH START INTERRUPT FROM CTC1 WHEN
; A KEY IS PRESSED AND STOPS INTERRUPT WHEN ALL
; KEYS (EXCEPT FUNCTION KEYS) ARE RELEASED
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
SPCONI	DEFS	20H
CONISP	DEFS	2

CONINT:
	PUSH	AF		; SAVE AF
	LD	A,0FFH		; AT LEAST ONE KEY DOWN
	LD	(KEYSAV),A
	LD	(KEYSAV+1),A
	LD	(KEYSAV+2),A
	LD	A,45
	LD	(KEYCOU),A
				; REPROGRAM PIO
	LD	A,0CFH
	OUT	(KBPIOC),A
	LD	A,0FFH
	OUT	(KBPIOC),A
	LD	A,01110111B	; INTERRUPT CONTROL WORD
				; INTERRUPT DISABLED BIT 7 = 0
				; INTERRUPT ON AND   BIT 6 = 1
				; ACTIVE LEVEL HIGH  BIT 5 = 1
				; MASK WORD FOLLOWS  BIT 4 = 1
	OUT	(KBPIOC),A
	LD	A,11000001B	; MASK WORD
	OUT	(KBPIOC),A
	LD	A,10000011B	; START INTERRUPT
	OUT	(KBPIOC),A
				; START CTC1
	LD	A,10110111B	; CONTROL WORD FOR CTC1
				; ENABLE INTERRUPT BIT 7 = 1
				; TIMER MODE	   BIT 6 = 0
				; PRESCALER 256    BIT 5 = 1
				; RISING EDGE	   BIT 4 = 1
				; AUTOMATIC TRIG   BIT 3 = 0
				; CONSTANT FOLLOW  BIT 2 = 1
				; SOFTWARE RESET   BIT 1 = 1
				; CONTROL WORD	   BIT 0 = 1
	OUT	(CTC1),A
	LD	A,0FFH		; TIME CONSTANT
	OUT	(CTC1),A
	LD	A,0FFH
	LD	(CTC1AC),A
	POP	AF
	EI
	RETI
CON15:	LD	A,00110011B	; STOP CTC1
	OUT	(CTC1),A
	XOR	A
	LD	(CTC1AC),A
	LD	A,0CFH
	OUT	(KBPIOC),A
	LD	A,0FFH
	OUT	(KBPIOC),A
	LD	A,00010111B	; INTERRUPT CONTROL WORD
				; INTERRUPT DISABLE BIT 7 = 0
				; INTERRUPT ON OR   BIT 6 = 0
				; ACTIVE LEVEL LOW  BIT 5 = 0
				; MASK WORD FOLLOWS BIT 4 = 1
	OUT	(KBPIOC),A
	LD	A,11000001B	; MASK WORD
	OUT	(KBPIOC),A
	LD	A,10000011B	; START INTERRUPT
	OUT	(KBPIOC),A
	RET


KEYINT:
	LD	(CONISP-BLOWUP+BLOWST),SP
	LD	SP,CONISP-BLOWUP+BLOWST
	PUSH	AF		; SAVE AF
	PUSH	HL		; SAVE HL
	PUSH	DE
	PUSH	BC
	CALL	GETDAT-BLOWUP+BLOWST ; GET DATA FROM KEYBOARD
	LD	HL,KEYSAV
	LD	A,C
	AND	00111110B
	CP	00111110B
	JR	NZ,KEYI05
	CALL	CON15-BLOWUP+BLOWST
	JR	KEYI10
KEYI05:
	LD	A,(HL)
	CP	0FFH
	JR	Z,KEYI06
	AND	11000001B
	LD	B,A
	LD	A,C
	AND	11000001B
	CP	B
	JR	Z,KEYI06
	LD	A,C
	LD	(KEYSAV),A
	LD	(KEYSAV+1),DE
	LD	A,45
	LD	(KEYCOU),A
	JR	KEYI10
KEYI06: LD	A,C
	CP	(HL)
	JR	NZ,DECODE
	INC	HL
	LD	A,E
	CP	(HL)
	JR	NZ,DECODE
	INC	HL
	LD	A,D
	CP	(HL)
	JR	NZ,DECODE
	LD	A,(KEYCOU)
	DEC	A
	LD	(KEYCOU),A
	JR	NZ,KEYI10
	LD	A,(KEYCO1)
	LD	(KEYCOU),A
	JR	DECODE
KEYI10:
	POP	BC
	POP	DE
	POP	HL
	POP	AF
	LD	SP,(CONISP-BLOWUP+BLOWST)
	EI
	RETI

GETDAT: IN	A,(KBPIOD)
	LD	C,A
	LD	A,0FH	       ; SET MODE 0
	OUT	(KBPIOC),A
	XOR	A
	OUT	(KBPIOD),A
	LD	A,07H
	OUT	(KB89A),A
	XOR	A
	OUT	(KB89D),A
	LD	A,0EH
	OUT	(KB89A),A
	IN	A,(KB89D)
	LD	E,A
	LD	A,0FH
	OUT	(KB89A),A
	IN	A,(KB89D)
	LD	D,A
	LD	A,07H
	OUT	(KB89A),A
	LD	A,0C0H
	OUT	(KB89D),A
	LD	A,0EH
	OUT	(KB89A),A
	XOR	A
	OUT	(KB89D),A
	LD	A,0FH
	OUT	(KB89A),A
	XOR	A
	OUT	(KB89D),A
	LD	A,0CFH		; SET MODE 3
	OUT	(KBPIOC),A
	LD	A,0FFH		; SET ALL LINES TO INPUT
	OUT	(KBPIOC),A
	LD	A,00010111B
	OUT	(KBPIOC),A
	LD	A,11000001B
	OUT	(KBPIOC),A
	LD	A,10000011B
	OUT	(KBPIOC),A
	RET

DECODE:
	LD	A,C
	LD	(KEYSAV),A
	LD	(KEYSAV+1),DE
	LD	HL,(SYBAN)	; SAVE CONFIGURATION
	PUSH	HL
	LD	HL,(RAMWR)
	PUSH	HL
	XOR	A
	OUT	(SYSBAN),A	; OPEN SYSTEM BANK
	LD	(SYBAN),A	; UPDATE CONFIG BYTE
	OUT	(RAMBAR),A	; CLOSE RAM FOR READ
	LD	(RAMRD),A	; UPDATE CONFIG BYTE
	LD	(VIDROM),A	; CLOSE VIDEO BANK
	OUT	(VIDBAN),A	; UPDATE CONFIG BYTE
	EI
	CALL	CONI05		; CALL ROM ROUTINE
	DI
	POP	HL		; GET CONFIG BYTES
	LD	(RAMWR),HL	; UPDATE
	LD	A,L		;
	OUT	(RAMBAW),A
	LD	A,H		;
	OUT	(RAMBAR),A
	POP	HL		; GET CONFIG BYTES
	LD	(SYBAN),HL
	LD	A,L		; UPDATE
	OUT	(SYSBAN),A
	LD	A,H
	OUT	(VIDBAN),A
	JP	KEYI10-BLOWUP+BLOWST

CHAR10: CALL	SAVEBA+OFFSET
	JR	Z,NOINT3
	EI
NOINT3:
CHAR11: LD	D,H		;     DE := HL
	LD	E,L
	CALL	STEPHL-BLOWUP+BLOWST ;	   STEPHL(HL)
	LD	A,(FLASH)
	OR	A
	JR	NZ,CHAR12
L5:	IN	A,(PIOBD)
	AND	81H
	JR	Z,L5
CHAR12: LD	A,(DE)
	LD	C,(HL)
	LD	(IX+0),A	;     IX^ := DE^; IX :+ 1
	INC	IX
	LD	(IX+0),C	;     IX^ := HL^; IX :+ 1
	INC	IX
	CALL	STEPHL-BLOWUP+BLOWST ;	   STEPHL(HL)
	DJNZ	CHAR11		;   ENDDO
	JP	GOBACK+OFFSET
SAVEBA:
	LD	(HLSTORE),HL
	LD	A,I
	DI
	PUSH	AF
	POP	HL
	LD	A,L
	AND	00000100B
	LD	(INSAVE),A	; SAVE INT FLAG
	LD	HL,(SYBAN)	; SAVE CONFIGURATION
	LD	(HLSTO1),HL
	LD	HL,(RAMWR)
	LD	(HLSTO2),HL
	LD	A,80H
	OUT	(SYSBAN),A
	LD	(SYBAN),A
	XOR	A
	OUT	(RAMBAW),A
	LD	(RAMWR),A
	OUT	(RAMBAR),A
	LD	(RAMRD),A
	LD	A,0F0H
	LD	(VIDROM),A
	OUT	(VIDBAN),A	; OPEN ALL VIDEOBANKS
	LD	HL,(HLSTORE)
	LD	A,(INSAVE)
	OR	A
	RET
ESCJ9:	CALL	SAVEBA+OFFSET
	JR	Z,YYY
	EI
YYY:	LD	A,(FLASH)
	OR	A
	JR	NZ,YYYY
YYY10:	IN	A,(PIOBD)
	AND	81H
	JR	Z,YYY10
	LDD
	LD	A,B
	OR	C
	JP	NZ,YYY10+OFFSET
	JP	GOBACK+OFFSET
YYYY:	LDDR
	JP	GOBACK+OFFSET

ESCLL9: CALL	SAVEBA+OFFSET
	JR	Z,NOINTF
	EI
NOINTF:
	LD	A,(FLASH)
	OR	A
	JR	NZ,NOINTG
	LD	A,E
	RRCA
	JR	C,NOINL5
	LD	A,(PIXHO1)
NOINL3: PUSH	AF
NINL3:	IN	A,(PIOBD)
	AND	81H
	JR	Z,NINL3
	LD	A,(HL)
	LD	(DE),A
	DEC	HL
	DEC	HL
	CALL	RES76B+OFFSET
	DEC	DE
	DEC	DE
	EX	DE,HL
	CALL	RES76B+OFFSET
	EX	DE,HL
	POP	AF
	DEC	A
	JR	NZ,NOINL3
NOINL5: IN	A,(PIOBD)
	AND	81H
	JR	Z,NOINL5
	LD	A,(HL)
	LD	(DE),A
	LD	A,L
	DEC	L
	OR	A
	JP	NZ,NINL5+OFFSET
	DEC	H
	CALL	RES76B+OFFSET
NINL5:	LD	A,E
	DEC	E
	OR	A
	JP	NZ,NINL6+OFFSET
	DEC	D
	EX	DE,HL
	CALL	RES76B+OFFSET
	EX	DE,HL
NINL6:	DEC	BC
	LD	A,B
	OR	C
	JR	NZ,NOINL5
	JP	GOBACK+OFFSET
NOINTG:
	LD	A,E
	RRCA
	JR	NC,NOINL7
	LD	A,(PIXHO1)
NOINL6: PUSH	AF
	LD	A,(HL)
	LD	(DE),A
	DEC	HL
	DEC	HL
	CALL	RES76B+OFFSET
	DEC	DE
	DEC	DE
	EX	DE,HL
	CALL	RES76B+OFFSET
	EX	DE,HL
	POP	AF
	DEC	A
	JR	NZ,NOINL6
NOINL7: LD	A,(HL)
	LD	(DE),A
	LD	A,L
	DEC	L
	OR	A
	JP	NZ,NINL7+OFFSET
	DEC	H
	CALL	RES76B+OFFSET
NINL7:	LD	A,E
	DEC	E
	OR	A
	JP	NZ,NINL8+OFFSET
	DEC	D
	EX	DE,HL
	CALL	RES76B+OFFSET
	EX	DE,HL
NINL8:	DEC	BC
	LD	A,B
	OR	C
	JP	NZ,NOINL7+OFFSET
	JP	GOBACK+OFFSET

ESCLJ9: CALL	SAVEBA+OFFSET
	JR	Z,XXX
	EI
XXX:
	LD	A,(FLASH)
	OR	A
	JR	NZ,XXXX
XXX10:	IN	A,(PIOBD)
	AND	81H
	JR	Z,XXX10
	LDI
	LD	A,B
	OR	C
	JP	NZ,XXX10+OFFSET
	JP	GOBACK+OFFSET
XXXX:	LDIR
	JP	GOBACK+OFFSET

ESCLD9: CALL	SAVEBA+OFFSET
	JR	Z,NOINTB
	EI
NOINTB:
	LD	A,(FLASH)
	OR	A
	JR	NZ,NOINTD
	LD	A,E
	RRCA
	JR	NC,NOINA5
	LD	A,(PIXHO1)
NOINA3: PUSH	AF
NINA3:	IN	A,(PIOBD)
	AND	81H
	JR	Z,NINA3
	LD	A,(HL)
	LD	(DE),A
	INC	HL
	INC	HL
NINA4:
	CALL	RES76B+OFFSET
	INC	DE
	INC	DE
	EX	DE,HL
	CALL	RES76B+OFFSET
	EX	DE,HL
	POP	AF
	DEC	A
	JR	NZ,NOINA3
NOINA5:
	IN	A,(PIOBD)
	AND	81H
	JR	Z,NOINA5
	LD	A,(HL)
	LD	(DE),A
	INC	L
	JP	NZ,NINA6+OFFSET
	INC	H
	CALL	RES76B+OFFSET
NINA6:	INC	E
	JP	NZ,NINA7+OFFSET
	INC	D
	EX	DE,HL
	CALL	RES76B+OFFSET
	EX	DE,HL
NINA7:
	DEC	BC
	LD	A,B
	OR	C
	JP	NZ,NOINA5+OFFSET
	JR	GOBACK
NOINTD:
	LD	A,E
	RRCA
	JR	NC,NOINA7
	LD	A,(PIXHO1)
NOINA6: PUSH	AF
	LD	A,(HL)
	LD	(DE),A
	INC	HL
	INC	HL
	CALL	RES76B+OFFSET
	INC	DE
	INC	DE
	EX	DE,HL
	CALL	RES76B+OFFSET
	EX	DE,HL
	POP	AF
	DEC	A
	JR	NZ,NOINA6
NOINA7: LD	A,(HL)
	LD	(DE),A
	INC	L
	JP	NZ,NOINA8+OFFSET
	INC	H
	CALL	RES76B+OFFSET
NOINA8: INC	E
	JP	NZ,NOINA9+OFFSET
	INC	D
	EX	DE,HL
	CALL	RES76B+OFFSET
	EX	DE,HL
NOINA9: DEC	BC
	LD	A,B
	OR	C
	JP	NZ,NOINA7+OFFSET
	JR	GOBACK

CHAR60: CALL	SAVEBA+OFFSET
	JR	Z,NOINT4
	EI
NOINT4:
CHAR61:
	LD	D,H		;     DE := HL
	LD	E,L
	CALL	STEPHL-BLOWUP+BLOWST ;	   STEPHL(HL)
	PUSH	BC
	LD	B,(IX+0)
	INC	IX		;     B := IX^; IX :+ 1
	LD	C,(IX+0)
	INC	IX		;     C := IX^; IX :+ 1
	LD	A,(FLASH)
	OR	A
	JR	NZ,CHAR62
L6:	IN	A,(PIOBD)
	AND	81H
	JR	Z,L6
CHAR62: LD	A,B
	LD	(DE),A		;     DE^ := B
	LD	(HL),C		;     HL^ := C
	POP	BC
	CALL	STEPHL-BLOWUP+BLOWST ;	   STEPHL(HL)
	DJNZ	CHAR61		;   ENDDO
	JR	GOBACK
GOBACK: DI
	LD	HL,(HLSTO2)
	LD	(RAMWR),HL
	LD	A,L
	OUT	(RAMBAW),A
	LD	A,H
	OUT	(RAMBAR),A
	LD	HL,(HLSTO1)
	LD	(SYBAN),HL
	LD	A,L
	OUT	(SYSBAN),A
	LD	A,H
	OUT	(VIDBAN),A
	LD	A,(INSAVE)
	OR	A
	RET	Z
	EI
	RET

; STEPHL
;
; ASSUMING THAT HL POINTS TO A BYTE IN THE VIDEO RAM,
; THIS PROCEDURE MAKES HL POINT TO THE BYTE WHICH IS
; DISPLAYED IMMEDIATELY BELOW.
;
; DESTROYS AF

STEPHL: 			; PROC STEPHL(REF HL)
	INC	HL		;   HL :+ 1
	BIT	0,L
	JR	NZ,STEP10	;   IF HL MOD 2 = 0 THEN HL :=
	PUSH	DE
;	 LD	 DE,-2+2*PIXHOR/8

	PUSH	HL
	LD	DE,(PIXHO1)
	LD	L,E
	LD	H,D
	ADD	HL,DE
	EX	DE,HL
	DEC	DE
	DEC	DE
	POP	HL

	ADD	HL,DE		;     (HL-2+2*PIXHOR/8) MOD 32K
	POP	DE
STEP10:
;	 RES	 7,H
	CALL	RES76B+OFFSET
	RET			; ENDPROC

RES76B: PUSH	AF
	LD	A,(PIXHO1)
	CP	40
	JR	NZ,RES76C
	RES	6,H
RES76C: RES	7,H
	POP	AF
	RET
RWMOVE:
	LD	A,I
	DI
	PUSH	HL
	PUSH	AF
	POP	HL
	LD	A,L
	AND	00000100B
	LD	(INSAVE),A	; SAVE INT FLAG
	LD	HL,(SYBAN)	; SAVE CONFIGURATION
	LD	(HLSTO1),HL
	LD	HL,(RAMWR)
	LD	(HLSTO2),HL
	LD	A,80H
	OUT	(SYSBAN),A
	LD	(SYBAN),A
	LD	A,01
	OUT	(RAMBAW),A
	LD	(RAMWR),A
	OUT	(RAMBAR),A
	LD	(RAMRD),A
	XOR	A
	LD	(VIDROM),A
	OUT	(VIDBAN),A	; CLOSE ALL VIDEOBANKS
	LD	A,(INSAVE)
	OR	A
	POP	HL
	JR	Z,NOINT7
	EI
NOINT7:
RWMO04:
	LD	A,(DE)		; SOURCE CHARACTER
	INC	DE
	LD	(HL),A		; TO DEST
	INC	HL
	DEC	C		; LOOP 128 TIMES
	JR	NZ,RWMO04
	JP	GOBACK+OFFSET
;
;	 EJECT
;	 TITLE	 TABLES AND VARIABLES
;
;	COMMANDS:
;
IOCOMM: DEFB	09H
IOCMD:	DEFS	1	; READ/WRITE COMMAND
IODISK: DEFS	1	; DISK NO
IOTRKN: DEFS	1	; TRACK NO (0....)
HEADNO: DEFB	0	; HEAD NUMBER
IOSECN: DEFS	1	; SECTOR
	DEFB	N	; NO OF DATA BYTES
IOEOT:	DEFB	EOT
	DEFB	GPL
	DEFB	DTL

SEEKCO:
	DEFB	3	;
	DEFB	0FH	; SEEK COMMAND
SEEKNO: DEFS	1	; DISK NO
SEEKTR: DEFS	1	; NEW TRACK NO

SPECIO:
	DEFB	3		; LENGTH
	DEFB	03H
	DEFB	SRT*16+HUT
	DEFB	HLT*2+ND

RECALIBRATE:
	DEFB	2		; LENGTH
	DEFB	07H
RECANO: DEFB	00H		; US=0


SENSEINT:
	DEFB	1		; LENGTH
	DEFB	08H

READTR: DEFB	09H
	DEFB	42H
RDNO:	DEFB	0
RDTR:	DEFB	0
	DEFB	0
	DEFB	1
	DEFB	2
RDEOT:	DEFB	EOT
	DEFB	GPL
	DEFB	DTL
;
;
; FIXED DATA TABLES DESCRIBING 2 DRIVES
;

;
; DISK PARAMETER HEADER
;
DPBAS0: DEFW	00,0000H
	DEFW	0000H,0000H
	DEFW	DIRBF,DPBLK0-BLOWUP+BLOWST
	DEFW	CHK00,ALL00
DPBAS1: DEFW	00,0000H
	DEFW	0000H,0000H
	DEFW	DIRBF,DPBLK0-BLOWUP+BLOWST
	DEFW	CHK01,ALL01
DPBAS2: DEFS	8
	DEFW	DIRBF,DPBLK0-BLOWUP+BLOWST
	DEFW	CHK02,ALL02
DPBAS3: DEFS	8
	DEFW	DIRBF,DPBLK0-BLOWUP+BLOWST
	DEFW	CHK03,ALL03
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; FORMAT TABLE FOR EACH DRIVE
;
; LEGAL CODES ARE:
;
; 0 := DUAL SIDE 80 TRACKS
; 1 := SINGLE SIDE 40 TRACKS
; 2 := DUAL SIDE 40 TRACKS
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
DISKFO:
	DEFB	0,0,0,0
	DEFB	0,0,0,0
;
; DISK PARAMETER BLOCK
;

DPBLK0: DEFW	28H
	DEFB	04H
	DEFB	0FH
	DEFB	0
	DEFW	18AH
	DEFW	7FH
	DEFB	0C0H
	DEFB	0
	DEFW	20H
	DEFW	2

DPBLK1: DEFW	28H
	DEFB	03
	DEFB	07
	DEFB	00
	DEFW	0BDH
	DEFW	3FH
	DEFB	0C0H
	DEFB	00
	DEFW	10H
	DEFW	02H

DPBLK2: DEFW	48H
	DEFB	04H
	DEFB	0FH
	DEFB	01
	DEFW	86H
	DEFW	7FH
	DEFB	0C0H
	DEFB	00
	DEFW	20H
	DEFW	2H

ASCTAB:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; THE KEYS Q, W, T, Y, O, :, F, J, L AND ' '
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
				; GROUP A
	DEFB	'L'
	DEFB	'*'
	DEFB	0DH
	DEFB	'O'
	DEFB	'J'
	DEFB	'Y'
	DEFB	'T'
	DEFB	'F'
	DEFB	'W'
	DEFB	'Q'
	DEFB	86H		; F3
	DEFB	03H		; INSERT
	DEFB	0DH		; ENTER
	DEFB	'1'		; 1
	DEFB	'3'		; 3
	DEFB	'2'		; 2

	DEFB	'P'		  ; GROUP B
	DEFB	'Å'
	DEFB	08H		; BACKSPACE
	DEFB	'('
	DEFB	'I'
	DEFB	'U'
	DEFB	'$'
	DEFB	'R'
	DEFB	'E'
	DEFB	1BH
	DEFB	85H		; F2
	DEFB	90H		; OLINE
	DEFB	'-'		; -
	DEFB	'4'		; 4
	DEFB	'6'		; 6
	DEFB	'5'		; 5

	DEFB	'<'		 ; GROUP C
	DEFB	'>'
	DEFB	'?'
	DEFB	'M'
	DEFB	' '
	DEFB	'B'
	DEFB	'V'
	DEFB	'C'
	DEFB	'X'
	DEFB	'Z'
	DEFB	84H		; F1
	DEFB	97H		; SCREEN DUMP TO FILE
	DEFB	'*'		; *
	DEFB	'7'		; 7
	DEFB	'9'		; 9
	DEFB	'8'		; 8

	DEFB	'_'		 ; GROUP D
	DEFB	'='
	DEFB	5EH
	DEFB	')'
	DEFB	27H
	DEFB	'&'
	DEFB	'%'
	DEFB	'#'
	DEFB	'"'
	DEFB	'!'
	DEFB	0FH		; BLINK
	DEFB	99H		; USPECIFICERET
	DEFB	0CH		; CURSOR UP
	DEFB	95H		; BACK
	DEFB	7FH		; DELETE
	DEFB	93H		; BORDER

	DEFB	'Æ'		 ; GROUP E
	DEFB	'Ø'
	DEFB	'+'
	DEFB	'K'
	DEFB	'N'
	DEFB	'H'
	DEFB	'G'
	DEFB	'D'
	DEFB	'S'
	DEFB	'A'
	DEFB	0EH		; CURSOR DOWN
	DEFB	02H		; CURSOR 8 LEFT
	DEFB	'.'		; .
	DEFB	09H		; CURSOR 8 RIGHT
	DEFB	'0'		; 0
	DEFB	87H		; F4

ASCTA1:
				; GROUP A
	DEFB	'l'
	DEFB	':'
	DEFB	0DH
	DEFB	'o'
	DEFB	'j'
	DEFB	'y'
	DEFB	't'
	DEFB	'f'
	DEFB	'w'
	DEFB	'q'
	DEFB	82H		; F3
	DEFB	01H		; INSERT
	DEFB	0DH		; ENTER
	DEFB	'1'		; 1
	DEFB	'3'		; 3
	DEFB	'2'		; 2

	DEFB	'p'		  ; GROUP B
	DEFB	'å'
	DEFB	08H
	DEFB	'8'
	DEFB	'i'
	DEFB	'u'
	DEFB	'4'
	DEFB	'r'
	DEFB	'e'
	DEFB	1BH
	DEFB	81H		; F2
	DEFB	91H		; ULINE
	DEFB	'-'		; -
	DEFB	'4'		; 4
	DEFB	'6'		; 6
	DEFB	'5'		; 5

	DEFB	','		 ; GROUP C
	DEFB	'.'
	DEFB	'/'
	DEFB	'm'
	DEFB	' '
	DEFB	'b'
	DEFB	'v'
	DEFB	'c'
	DEFB	'x'
	DEFB	'z'
	DEFB	80H		; F1
	DEFB	98H		; SCREEN DUMP TO PRINTER
	DEFB	'*'		; *
	DEFB	'7'		; 7
	DEFB	'9'		; 9
	DEFB	'8'		; 8

	DEFB	'0'		 ; GROUP D
	DEFB	'-'
	DEFB	'@'
	DEFB	'9'
	DEFB	37H
	DEFB	'6'
	DEFB	'5'
	DEFB	'3'
	DEFB	'2'
	DEFB	'1'
	DEFB	92H		; INVERT
	DEFB	9AH		; USPECIFICERET
	DEFB	0BH		; CURSOR UP
	DEFB	96H		; FRONT
	DEFB	13H		; DELETE
	DEFB	94H		; PAPER

	DEFB	'æ'		 ; GROUP E
	DEFB	'ø'
	DEFB	';'
	DEFB	'k'
	DEFB	'n'
	DEFB	'h'
	DEFB	'g'
	DEFB	'd'
	DEFB	's'
	DEFB	'a'
	DEFB	0AH		; CURSOR DOWN
	DEFB	08H		; CURSOR LEFT
	DEFB	'.'		; .
	DEFB	0CH		; CURSOR RIGHT
	DEFB	'0'		; 0
	DEFB	83H		; F4


▶04◀


▶ff◀▶04◀


▶ff◀▶04◀


▶ff◀▶04◀

▶ff◀▶04◀
▶04◀
F4

▶ff◀▶04◀
F4

▶ff◀«eof»