|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 22272 (0x5700)
Types: TextFile
Names: »BIOS2.ASM«
└─⟦0d02879d3⟧ Bits:30004605 COMPAS Pascal version 3.03
└─⟦this⟧ »BIOS2.ASM«
;
WRITEHST:
CALL SETUP
LD A,45H
LD (IOCMD+OFFSET),A
CALL IOSEC
LD (ERFLAG),A
RET
READHST:
CALL SETUP
READH1: LD A,46H
LD (IOCMD+OFFSET),A
CALL IOSEC
LD (ERFLAG),A
RET
SETUP: LD A,(HSTDSK)
LD C,A
LD B,0
LD HL,DISKFO+OFFSET
ADD HL,BC
LD A,(HL)
CP 0
JR Z,SETUP0
CP 1
JR Z,SETUP1
CP 2
JR Z,SETUP2
JP ERROR
SETUP0:
XOR A
LD (HEADNO+OFFSET),A
LD A,(HSTTRK)
SRL A
JR NC,SETU1
PUSH AF
LD A,1
LD (HEADNO+OFFSET),A
POP AF
SETU1:
LD (SEEKTR+OFFSET),A
CALL SETUP5
LD A,(HSTSEC)
LD HL,TR0
CALL SETUP8
CALL SETUP9
RET
SETUP1: CALL SETUP4
LD HL,TR1
CALL SETUP8
XOR A
LD (HEADNO+OFFSET),A
CALL SETUP9
RET
SETUP2: CALL SETUP4
CP 09H
JR C,SETUP3
SUB 9
LD HL,TR2
CALL SETUP8
LD A,1
LD (HEADNO+OFFSET),A
SETU3:
LD A,9
LD (IOEOT+OFFSET),A
RET
SETUP3:
LD HL,TR2
CALL SETUP8
XOR A
LD (HEADNO+OFFSET),A
JR SETU3
SETUP4:
LD A,(HSTTRK)
ADD A,A
LD (SEEKTR+OFFSET),A
CALL SETUP5
LD A,(HSTSEC)
RET
SETUP5:
LD A,(HSTDSK)
LD (SEEKNO+OFFSET),A
RET
SETUP8:
LD C,A
LD B,0
ADD HL,BC
LD A,(HL)
LD (SECTOR),A
RET
SETUP9:
LD A,10
LD (IOEOT+OFFSET),A
RET
; EJECT
; TITLE MOTORSTART
;
; MOTORS - CHECK DISK RUNNING AND START IT IF NECESSARY
;
MOTORS:
OUT (FDCMON),A
LD A,(MOTORF)
OR A
LD A,(MOTOR1)
LD (MOTORF),A
RET NZ
LD A,0FFH
CALL DELAY
RET
; EJECT
; TITLE IOSEC
;
; IOSEC - READ/WRITE A SECTOR
;
; INPUT : HSTTRACK : TRACK NUMBER
; SECTOR : SECTOR NUMBER
; IOCMD : 06H FOR READ, 05H FOR WRITE
; HSTDSK : DISK NO
; HEADNO : DISK SIDE
; OUTPUT: A = 0
;
; FUNCTION:
; READS/WRITES THE SPECIFIED SECTOR. IF AN ERROR
; OCCURS, THE SECTOR IS RE-READ/RE-WRITTEN UP TO
; MAXREPEATS TIMES.
;
IOSEC:
XOR A
LD (NRREPEATS),A
LD A,(HSTDSK)
LD L,A
LD A,(HEADNO+OFFSET)
OR A
LD A,L
LD (RECANO+OFFSET),A
JR Z,IOSEC3
OR 04
IOSEC3:
LD (IODISK+OFFSET),A
IOSE05:
CALL MOTORS
IOSE9: LD HL,SEEKCO+OFFSET
CALL COMMAND
CALL ENDSEEK
LD A,(HSTTRK)
LD (IOTRKNO+OFFSET),A ; IN THE IO COMMAND
LD A,(SECTOR) ; LIST
LD (IOSECNO+OFFSET),A
LD HL,IOCOMMAND+OFFSET
CALL COMMAND ; COMMAND(IO_COMMAND)
;
; EXECUTION PHASE
;
LD HL,HSTBUF
LD A,(IOCMD+OFFSET)
AND 00001111B
LD D,0A0H
CP 06H
JR NZ,IOSE50
LD C,FDCDT
IOSE10:
LD B,0
IOSE20: IN A,(FDCST)
AND D
JP P,IOSE20
JP PO,IOSE90
INI
JP NZ,IOSE20
LD B,0
IOSE21: IN A,(FDCST)
AND D
JP P,IOSE21
JP PO,IOSE90
INI
JP NZ,IOSE21
JP IOSE90
IOSE50:
LD C,FDCDT
IOSE60:
LD B,0
IOSE70: IN A,(FDCST)
AND D
JP P,IOSE70
JP PO,IOSE90
OUTI
JP NZ,IOSE70
LD B,0
IOSE71: IN A,(FDCST)
AND D
JP P,IOSE71
JP PO,IOSE90
OUTI
JP NZ,IOSE71
IOSE90:
OUT (FDCTC),A
CALL READRESULT
LD HL,RESULT ; IF RESULT(0) = 7
LD A,(HL) ; AND RESULT(1)
CP 7 ; THROUGH RESULT(3)
JR NZ,IOSE99 ; = 0
INC HL
LD A,(HL)
AND 11111000B
LD B,2
IOSE95: INC HL
OR (HL)
DJNZ IOSE95
RET Z ;-----THEN RETURN
IOSE98:
DEC A
LD A,(HL)
AND 00010000B
JP NZ,IOSE05 ; TEST FOR OVERRUN?
INC HL
LD A,(HL)
AND 00010000B ; WRONG TRACK?
CALL NZ,HOME
IOSE99: LD A,(NRREPE)
INC A
LD (NRREPEATS),A
CP MAXREPEATS ; UNTIL NR_REPEATS =
JP NZ,IOSE05 ; MAX_REPEATS
LD A,1
RET
ENDSEEK:
LD HL,SENSEIN+OFFSET
CALL DOCOMMAND
CALL READRESULT
LD A,(RESULT+1)
AND 00100000B
JR Z,ENDSEEK
LD B,4
ENDS10: PUSH BC
LD HL,SENSEINT+OFFSET
CALL DOCOMMAND
CALL READRESULT
POP BC
DJNZ ENDS10
RET
COMMAND:
IN A,(FDCST)
AND 1FH
CALL NZ,ERROR
DOCOMMAND:
LD B,(HL)
INC HL
COMM10:
LD A,DELAYCNT
COMM15: DEC A
JR NZ,COMM15
COMM20: IN A,(FDCST)
RLCA
JR NC,COMM20
RLCA
CALL C,ERROR
LD A,(HL)
OUT (FDCDT),A
INC HL
DJNZ COMM10
RET
READRESULT:
LD HL,RESULT+1
LD B,0
RDRES1:
LD A,DELAYCNT
RDRES2: DEC A
JR NZ,RDRES2
IN A,(FDCST)
BIT 4,A
JR Z,RDRES8
RLCA
JR NC,RDRES1
RLCA
CALL NC,ERROR
IN A,(FDCDT)
LD (HL),A
INC HL
INC B
JR RDRES1
RDRES8: LD HL,RESULT
LD (HL),B
RET
;
;------------------------------------------------------
;
; CONSOLE OUTPUT ROUTINES FOLLOW
;
;
; OUTPUT A CHARACTER TO THE DATA SCREEN
; THE CHARACTER IS INPUT IN C
;
CONOUT: ;PROC CONOUT(C)
PUSH HL ; PUSH MAIN REGISTER SET
PUSH DE
PUSH BC
PUSH AF
LD A,(LEADIN) ; IF LEADIN = 0 THEN
CP 0FFH ; // NORMAL PROCESSING
JP NZ,CON200
LD A,C ; IF C < ' ' THEN
CP ' ' ; // CONTROL CHAR
JP NC,CON090 ; CASE C OF
CP ESC ; ESC :
JR NZ,CON002
XOR A
LD (LEADIN),A ; LEADIN := ESC
JP CON900
CON002: CP CR ; CR :
JR NZ,CON010
LD HL,0
LD (XPOS),HL ; XPOS := 0
JP CON100 ; OUTCURSOR
CON010: CP LF ; LF :
JR NZ,CONO20
CALL DOWN ; DOWN
JP CON100 ; OUTCURSOR
CONO20: CP CURLEF ; CURSOR LEFT:
JR NZ,CON025
CALL LEFT ; LEFT
JP CON100 ; OUTCURSOR
CON025: CP CURRIG ; CURSOR RIGHT:
JR NZ,CON030
CALL RIGHT ; RIGHT
JP CON100 ; OUTCURSOR
CON030: CP CURUP ; CURSOR UP:
JR NZ,CON040
CALL UP ; UP
JP CON100 ; OUTCURSOR
CON040: CP CURHOM ; CURSOR HOME:
JR NZ,CON050
LD HL,0
LD (XPOS),HL ; XPOS := 0
LD HL,(OVERBASE)
LD (YPOS),HL
JR CON100 ; OUTCURSOR
CON050: CP 7FH ; DELETE
JR NZ,CON090
LD A,(PROP)
OR A
JR NZ,CON70
CALL LEFT ; LEFT
LD A,' ' ; PUTCHR(' ')
CALL PUTCHR
CALL LEFT ; LEFT
JR CON100 ; OUTCURSOR
; ENDIF
CON70: JR CON110
CON090: ; OTHERWISE
CALL PUTCHR ; PUTCHR(C)
; OUTCURSOR
; ENDCASE
; ELSE // NORMAL CHARACTER
; PUTCHR(C)
; OUTCURSOR
CON100: CALL OUTCURSOR ; ENDIF
CON110:
JP CON900 ; ELSE // ESC SEQUENCE
CON200:
CP 0
JP NZ,CON230 ; PARAMETER
LD HL,ESCTAB
LD DE,04
CON205: LD A,(HL)
CP 0
JR Z,CON207
CP C
JR Z,CON210 ; MATCH
ADD HL,DE
JR CON205
CON207: LD A,27 ; NOT ESC SEQUENCE
PUSH BC ; SAVE C
CALL PUTCHR
POP BC
LD A,C
CALL PUTCHR
CALL OUTCUR
LD A,0FFH
LD (LEADIN),A
JP CON900
CON210: INC HL
LD A,(HL)
CP 0
JR NZ,CON220 ; FUNCTION WITH PARAMETERS
INC HL ; NO PARAMETERS
LD C,(HL) ; GET ROUTINE ADDRESS
INC HL
LD B,(HL)
LD H,B
LD L,C
LD A,0FFH
LD (LEADIN),A ; RESET LEADIN
JP (HL) ; START ROUTINE
CON220: LD (LEADIN),A ; SAVE NO OF PARAMETERS
LD A,01
LD (ESCBUF),A ; OP.CODE RECEIVED
INC HL
LD C,(HL)
INC HL
LD B,(HL)
LD H,B
LD L,C
LD (ESCBUF+1),HL ; SAVE ADDRESS OF EXECUTING
; ROUTINE
JP CON900
CON230: LD HL,ESCBUF+2
LD A,(ESCBUF)
LD E,A
LD D,0
ADD HL,DE
LD (HL),C ; SAVE PARAMETER
INC A
LD (ESCBUF),A ; SAVE IN ESCBUF
DEC A ; REMOVE OFFSET FROM OP.CODE
LD HL,LEADIN ; GET NO OF PARAMETERS
CP (HL) ; LAST ONE
JP NZ,CON900
LD A,0FFH ; YES
LD (LEADIN),A ; RESET LEADIN
LD HL,(ESCBUF+1) ; START EXECUTING
JP (HL)
ESCCOL:
LD HL,ESCBUF+3 ; MOVE PARAMETERS
LD D,(HL)
INC HL
LD E,(HL)
LD (XSTORE),DE
INC HL
LD D,(HL)
INC HL
LD E,(HL)
LD (YSTORE),DE
LD HL,(XSTORE) ; IF XSTORE < PIXHOR AND
; LD DE,PIXHOR
LD DE,(PIXHOR)
AND A
SBC HL,DE
JR NC,ESCC30
LD HL,(YSTORE) ; YSTORE >= UNDERBASE-1 AND
INC HL
LD DE,(UNDERBASE)
AND A
SBC HL,DE
JR C,ESCC30
LD HL,PIXVE-1 ; YSTORE <= PIXVER-1-OVERBASE
LD DE,(OVERBASE)
AND A
SBC HL,DE
LD DE,(YSTORE)
AND A
SBC HL,DE
JR C,ESCC30 ; THEN
LD HL,PIXVE-1 ; YPOS := PIXVER-1 - YSTORE
LD DE,(YSTORE)
AND A
SBC HL,DE
LD (YPOS),HL
LD HL,(XSTORE)
LD A,(PROP) ; IF NOT PROP THEN
OR A
JR NZ,ESCC20
LD A,L ; XSTORE := (XSTORE DIV 8)*8
AND 0F8H
LD L,A ; ENDIF
ESCC20: LD (XPOS),HL ; XPOS := XSTORE
CALL OUTCURSOR ; OUTCURSOR
ESCC30: ; ENDIF
JP CON800
ESCL:
LD A,(ESCBUF+3)
LD C,A
BIT 0,C ; IF C MOD 2 = 0 AND
JR NZ,CON268
LD A,C ; C >= 10 AND
CP 10
JR C,CON268
CP MAXLINESPACE+1 ; C <= MAXLINESPACE
JR NC,CON268 ; THEN
LD A,(LINESPACE) ; PUSH LINESPACE
PUSH AF
CALL COMPUTE ; COMPUTE(C)
LD HL,(YPOS) ; IF YPOS-OVERBASE < 0 OR
LD DE,(OVERBASE)
AND A
SBC HL,DE
JR C,CON262
LD HL,(YPOS) ; YPOS+OVERBASE >= PIXVER+1
LD DE,(UNDERBASE)
ADD HL,DE
LD DE,PIXVE+1
AND A
SBC HL,DE
JR C,CON264 ; THEN
CON262: POP AF ; POP C
LD C,A
CALL COMPUTE ; COMPUTE(C)
JR CON266 ; ELSE
CON264: POP AF ; POP DUMMY
CON266: ; ENDIF
CON268: ; ENDIF
JP CON800
ESCS: LD A,(ESCBUF+3)
LD C,A
CP MAXSPACEW+1
JR NC,CON275
LD B,0
LD (SPACEWIDTH),BC ; THEN SPACEWIDTH := C
CON275:
JP CON800
ESCK: LD A,(ESCBUF+3)
LD C,A ; IF C <= MAXCHARDIST
CP MAXCHARDIST+1
JR NC,CON285
LD B,0
LD (CHARDIST),BC ; THEN CHARDIST := C
CON285:
JR CON800
ESCæ:
CALL CLRSCREEN ; CLRSCREEN
LD HL,0 ; XPOS := 0
LD (XPOS),HL
LD HL,PIXVE ; YPOS := PIXVER-UNDERBASE
LD DE,(UNDERBASE)
AND A
SBC HL,DE
LD (YPOS),HL
CALL OUTCURSOR ; OUTCURSOR
JR CON700
ESCY: CALL CLREOS ; CLREOS
JR CON700
ESCT: CALL CLREOL ; CLREOL
JR CON700
ESCP: LD A,0FFH
LD (PROP),A
ESCP10: LD A,10
OUT (CRTREG),A
LD A,7
OUT (CRTDAT),A
JR CON900
ESCLP: XOR A
LD (PROP),A
LD A,(XPOS) ; XPOS := (XPOS DIV 8)*8
AND 0F8H
LD (XPOS),A
CALL OUTCURSOR ; OUTCURSOR
CON550: ; OTHERWISE // NOTHING
CON700: ; ENDCASE
CON800: ; ENDIF
CON900: ; ENDIF
POP AF ; POP MAIN REGISTER SET
POP BC
POP DE
POP HL
RET ;ENDPROC CONOUT
ESCC XOR A
LD (CURF),A
CALL OUTCUR
JP CON900
ESCLC: LD A,0FFH
LD (CURF),A
JP ESCP10
ESCD: LD A,(ESCBUF+3)
LD (MOTOR1),A
JP CON900
ESCG: LD HL,ESCBUF+3
LD DE,CHRBUF
LD BC,12
LDIR
CALL PUTC04
JP CON900
ESCLG LD A,(ESCBUF+3)
LD (GENERF),A
JP CON900
ESCF: LD A,0FFH
LD (FSCROLL),A
JP CON900
ESCLF: XOR A
LD (FSCROLL),A
JP CON900
ESCLH: LD A,(ESCBUF+3)
LD (PRINTE),A
LD A,(ESCBUF+4)
LD (MODE),A
JP CON900
ESCH: LD A,(VISF)
PUSH AF
XOR A
LD (VISF),A
LD A,(PRINTE)
CP 0
JR Z,ESCHT
CP 1
JP Z,ESCHO
JP CON900
ESCHT: LD A,(ESCBUF+3)
LD (MODE),A
LD HL,STREN1 ; SET LINE SPACE
LD B,STREN2-STREN1
ESCH1:
LD C,(HL)
CALL LIST
INC HL
DJNZ ESCH1
LD A,(LINESPACE) ; SAVE LINESPACE
PUSH AF
LD A,8
LD (LINESPACE),A
LD B,30
LD HL,(CRTSTA)
ESCH3: PUSH BC ; SAVE B (LINE COUNTER)
PUSH HL ; SAVE ADDRESS IN VIDEO
LD C,27
CALL LIST
LD C,'*'
CALL LIST
LD A,(MODE) ; GET ACTUAL MODE
LD C,A
CALL LIST
LD BC,(PIXHOR)
PUSH BC ; SAVE NO OF BYTES
CALL LIST
POP BC ; RECOVER NO OF BYTES
LD C,B
CALL LIST
LD A,(PIXHO1)
LD B,A
POP HL ; RECOVER ADDRESS IN VIDEO
ESCH6: PUSH HL ; SAVE ADDRESS IN VIDEO
PUSH BC ; SAVE CHARACTER COUNTER
CALL CHARREAD ; GET DATA
LD HL,ESCBUF+3 ; MOVE TO ESCBUF
LD B,8 ; NO OF BYTES IN BLOCK
ESCH8: PUSH BC ; SAVE BYTE COUNTER
LD DE,VIDBUF ; GET DATA FROM VIDBUF
LD B,8 ; NO OF BIT IN BYTE
ESCH9: LD A,(DE) ; GET DATA
RLCA ; SHIFT LEFT
LD (DE),A ; PUT IT BACK
RL C ; MOVE CARRY TO C
INC DE ; NEXT
DJNZ ESCH9 ; LOOP
LD (HL),C ; SAVE NEW DATA
POP BC ; RECOVER BYTE COUNTER
INC HL ; NEXT ADDRESS TO SAVE
DJNZ ESCH8 ; LOOP
LD HL,ESCBUF+3 ; NEW PLACE FOR DATA
LD B,8 ; BYTE COUNTER
ESCH10: LD C,(HL) ; MOVE DATA TO C
INC HL ; NEXT
CALL LIST ; PRINT IT OUT
DJNZ ESCH10 ; LOOP UNTIL DONE
POP BC ; RECOVER CHARACTER COUNTER
POP HL ; RECOVER START ADDRESS IN VIDEO
INC HL
INC HL
RES 7,H ; MOD 32K
DJNZ ESCH6 ; LOOP FOR REST OF THE LINE
PUSH HL ; SAVE ADDRESS IN VIDEO
LD C,0AH ; GO TO NEXT LINE
CALL LIST
LD C,0DH
CALL LIST
LD B,6
LD DE,(PIXHO1)
LD HL,0
ESCH15: ADD HL,DE
DJNZ ESCH15
EX DE,HL
POP HL
ADD HL,DE
POP BC ; RECOVER LINE COUNTER
DJNZ ESCH3
POP AF
LD (LINESPACE),A ; RESTORE LINESPACE
LD C,27
CALL LIST
LD C,'@'
CALL LIST
POP AF
LD (VISF),A
JP CON900
STREN1: DEFB 27
DEFB 'A' ; OP.CODE
DEFB 8 ; LINE SPACE = 8/72"
STREN2:
ESCA: LD A,0FFH
LD (LOCK),A
JP CON900
ESCLA: XOR A
LD (LOCK),A
JP CON900
ESCJ: CALL ESCLLX ; INSERT LINE FAST
CALL ESCJ9+OFFSET
JR ESLL9A
ESCLL: ; INSERT LINE
CALL ESCLLX
CALL ESCLL9+OFFSET
JR ESLL9A
ESCLLX: LD HL,(YPOS)
LD DE,0
CALL CRTAD1
PUSH HL ; SAVE START OF LINE TO DELETE
LD A,(LINESPACE)
LD B,A
LD DE,(PIXHO1)
ESCLL7: ADD HL,DE
DJNZ ESCLL7
CALL RES76
LD A,PIXVE
LD B,A
LD A,(YPOS)
LD C,A
LD A,(UNDERBASE)
ADD A,C
CP B
POP DE
JR Z,ESLL9A
PUSH DE
PUSH HL
LD HL,0
LD DE,(PIXHO1)
ESCLL8: CP B
JR Z,ESLL8A
ADD HL,DE
INC A
JR ESCLL8
ESLL8A: LD C,L ; NO OF BYTES TO MOVE
LD B,H
POP HL ; RECOVER START OF LINE TO MOVE
ADD HL,BC
DEC HL
CALL RES76
POP DE ; RECOVER START OF LINE TO DELETE
EX DE,HL
ADD HL,BC
DEC HL
CALL RES76
RET
ESLL9A: LD HL,(YPOS)
LD DE,0
CALL CRTAD1
LD A,(PIXHO1)
LD C,A
LD A,(LINESPACE)
LD B,A
CALL CLRBYTES+OFFSET
JP CON900
ESCLJ: CALL ESCLDX ; DELETE LINE FAST
CALL ESCLJ9+OFFSET
JR ESLD9A
ESCLD: ; DELETE LINE
CALL ESCLDX
CALL ESCLD9+OFFSET
JR ESLD9A
ESCLDX: LD HL,(YPOS)
LD DE,0
CALL CRTAD1
PUSH HL ; SAVE START OF LINE TO DELETE
LD A,(LINESPACE)
LD B,A
LD DE,(PIXHO1)
ESCLD7: ADD HL,DE
DJNZ ESCLD7
CALL RES76
LD A,PIXVE ; NO OF LINES
LD B,A ; SAVE NO OF LINES
LD A,(YPOS) ; GET CURSOR Y POSITION
LD C,A ; SAVE
LD A,(UNDERBASE) ; NO OF LINES BELOW CHARACTER
ADD A,C ; ADD CURSOR Y POSITION
CP B
POP DE
JR Z,ESLD9A
PUSH DE
PUSH HL
LD HL,0 ; HL:=0
LD DE,(PIXHO1) ; SIZE OF ONE SWEEP
ESCLD8: CP B ; LAST ONE
JR Z,ESLD8A
ADD HL,DE
INC A
JR ESCLD8
ESLD8A:
LD C,L ; NO OF BYTES TO MOVE
LD B,H
POP HL ; RECOVER START OF LINE TO MOVE
POP DE ; RECOVER START OF LINE TO DELETE
RET
ESLD9A: LD DE,0
LD HL,PIXVE
LD A,(LINESPACE)
LD B,0
LD C,A
AND A
SBC HL,BC
CALL CRTAD2
LD A,(PIXHO1)
LD C,A
LD A,(LINESPACE)
LD B,A
CALL CLRBYTES+OFFSET
JP CON900
ESCE: LD A,0FFH
LD (VISF),A
JP CON900
ESCLE: XOR A
LD (VISF),A
JP CON900
ESCI: LD A,0FFH
LD (INVERT),A
JP CON900
ESCLI: XOR A
LD (INVERT),A
JP CON900
ESCLK: XOR A
LD (KBBUF),A
JP CON900
ESCLM: LD A,01
OUT (CRTREG),A
XOR A
OUT (CRTDAT),A
JP CON900
ESCM: LD A,01
OUT (CRTREG),A
ESCM10: IN A,(PIOBD)
AND 80H
JR Z,ESCM10
LD A,(PIXHO1)
OUT (CRTDAT),A
JP CON900
ESCO: LD A,0FFH
LD (OLINE),A
JP CON900
ESCLO: XOR A
LD (OLINE),A
JP CON900
ESCU: LD A,0FFH
LD (ULINE),A
JP CON900
ESCLU: XOR A
LD (ULINE),A
JP CON900
ESCV: LD A,0FFH
LD (FLASH),A
JP CON900
ESCLV: XOR A
LD (FLASH),A
JP CON900
ESCLZ: LD A,(ESCBUF+3)
OR A
JR NZ,ESCLZ1
INC A
ESCLZ1: LD (HENMUL),A
LD A,(ESCBUF+4)
OR A
JR NZ,ESCLZ2
INC A
ESCLZ2: LD (NEDMUL),A
LD A,(ESCBUF+5)
LD (RETN),A
JP CON900
HENTAB: DEFB 01,00 ; RIGHT
DEFB 01,01 ; RIGHT, UP
DEFB 00,01 ; UP
DEFB 0FFH,01 ; LEFT, UP
DEFB 0FFH,00 ; LEFT
DEFB 0FFH,0FFH ; LEFT, DOWN
DEFB 00,0FFH ; DOWN
DEFB 01,0FFH ; RIGHT, DOWN
ESCZ: LD HL,(ESCBUF+4)
LD A,L
LD L,H
LD H,A
LD (XSTORE),HL
LD HL,(ESCBUF+6)
LD D,L
LD E,H
LD HL,(PIXVER)
DEC HL
AND A
SBC HL,DE
LD (YSTORE),HL
LD HL,HENTAB
LD A,(RETN)
AND 00000111B
ADD A,A
LD E,A
LD D,0
ADD HL,DE
LD E,(HL)
INC E
LD D,0
DEC DE
LD (HENX),DE
INC HL
LD E,(HL)
INC E
LD D,0
DEC DE
LD (HENY),DE
;
; PROC HENT_TEGN
;
LD A,(ESCBUF+3) ; GET CHARACTER
LD L,A
LD H,0
ADD HL,HL ; * 2
ADD HL,HL ; * 4
LD D,H
LD E,L
ADD HL,HL ; * 8
ADD HL,DE ; + 4 = 12
EX DE,HL
LD HL,CHARGE
ADD HL,DE
LD DE,600H
LD A,(GENERF)
OR A
ESCZ05: JR Z,ESCZ08
ADD HL,DE
DEC A
JR ESCZ05
ESCZ08: LD DE,CHRBUF
LD BC,12
LDIR
LD A,(INVERT)
OR A
JR Z,ESCZ10
LD HL,CHRBUF
LD B,12
ESCZ09: LD A,(HL)
CPL
LD (HL),A
INC HL
DJNZ ESCZ09
ESCZ10: LD B,12 ; I#
LD DE,CHRBUF ; POINTER TO ACTUAL BYTE
ESCZ12:
PUSH BC
LD HL,(XSTORE)
LD (X1STORE),HL
LD HL,(YSTORE)
LD (Y1STORE),HL
LD B,8 ; J#
ESCZ16: PUSH BC ; SAVE COUNTER
LD HL,(X1STORE)
LD (X2STORE),HL
LD HL,(Y1STORE)
LD (Y2STORE),HL
LD A,(DE)
RLCA
LD (DE),A
PUSH DE
JR NC,ESCZ17
XOR A
LD (GRAFF),A
JR ESCZ18
ESCZ17: LD A,0FFH
LD (GRAFF),A
ESCZ18: LD A,(NEDMUL)
LD B,A ; K#
ESCZ20: PUSH BC
LD HL,(X2STORE) ; X3#
LD (X3STORE),HL
LD HL,(Y2STORE) ; Y3#
LD (Y3STORE),HL
LD A,(HENMUL) ;
LD B,A ; L#
ESCZ22: PUSH BC
LD HL,(X3STORE) ; TEST THAT X3 AND Y3 ARE
LD DE,(PIXHOR) ; WITHIN THE SCREEN
AND A
SBC HL,DE
JR NC,ESCZ51
LD HL,(Y3STORE)
LD DE,(PIXVER)
AND A
SBC HL,DE
JR NC,ESCZ51
LD HL,(Y3STORE)
LD A,L ; ACTUAL BYTE TO A
PUSH BC
LD C,A
SRL A ; / 2
LD B,A ; B COUNTER
LD HL,0 ; START VALUE FOR HL
JR Z,ESCZ24 ; FIRST LINE, NO ACTION
LD DE,(PIXHO1) ; NO OF CHARACTERS ON A LINE
SLA E ; * 2
RL D
ESCZ23: ADD HL,DE ; CALC Y VALUE
DJNZ ESCZ23
ESCZ24:
LD DE,(CRTSTA) ; ADD IN OFFSET
ADD HL,DE
PUSH HL ; SAVE FOR LATER
LD HL,(X3STORE) ; ACTUAL X POSITION
SRL H ; / 8
RR L
SRL H
RR L
SRL H
RR L
ADD HL,HL ; * 2
LD E,L ; SAVE IN DE
LD D,H
POP HL ; RECOVER Y VALUE
ADD HL,DE ; ADD TOGETHER
LD A,C
AND 00000001B
JR Z,ESCZ25
INC HL ; SECOND BYTE
ESCZ25:
CALL RES76 ; MODULUS 16 OR 32 K
POP BC
PUSH HL ; SAVE RESULT
LD HL,TABLE ; GET ACTUAL BYTE
LD A,(X3STORE)
AND 00000111B
LD E,A
LD D,0
ADD HL,DE
EX DE,HL
POP HL
ESCZ50:
CALL PLOT60+OFFSET
ESCZ51:
LD HL,(X3STORE)
LD DE,(HENX)
ADD HL,DE
LD (X3STORE),HL
LD A,(HENY)
LD HL,(Y3STORE)
LD DE,(HENY)
AND A
SBC HL,DE
LD (Y3STORE),HL
POP BC
DEC B
JP NZ,ESCZ22 ; L# :- 1
LD HL,(X2STORE)
LD DE,(HENY)
ADD HL,DE
LD (X2STORE),HL
LD HL,(Y2STORE)
LD DE,(HENX)
ADD HL,DE
LD (Y2STORE),HL
POP BC
DEC B
JP NZ,ESCZ20
LD A,(HENMUL)
LD B,A
LD HL,(X1STORE)
LD DE,(HENX)
ESCZ26: ADD HL,DE
DJNZ ESCZ26
LD (X1STORE),HL
LD B,A
LD HL,(Y1STORE)
LD DE,(HENY)
ESCZ27: AND A
SBC HL,DE
DJNZ ESCZ27
LD (Y1STORE),HL
POP DE
POP BC
INC C
DEC B
JP NZ,ESCZ16
PUSH DE
LD A,(NEDMUL)
LD B,A
LD HL,(XSTORE)
LD DE,(HENY)
ESCZ28: ADD HL,DE
DJNZ ESCZ28
LD (XSTORE),HL
LD B,A
LD HL,(YSTORE)
LD DE,(HENX)
ESCZ29: ADD HL,DE
DJNZ ESCZ29
LD (YSTORE),HL
POP DE
POP BC
INC DE
DEC B
JP NZ,ESCZ12
JP CON900
ESC4:
LD HL,DSTAB4
CALL CRTI20
XOR A
OUT (CH80),A
LD HL,PIXHO/2
LD (PIXHOR),HL
LD HL,PIXHO/16
LD (PIXHO1),HL
JR ESCSTA
ESC8:
LD HL,DSTAB8
CALL CRTI20
LD A,0FFH
OUT (CH80),A
LD HL,PIXHO
LD (PIXHOR),HL
LD HL,PIXHO/8
LD (PIXHO1),HL
ESCÆ: ; !!!!!!!!!!!!!!!!!!!
ESCSTA: LD HL,0
LD (XPOS),HL
LD HL,(OVERBASE)
LD (YPOS),HL
CALL CLRSCREEN
JP CON100
ESCEQU:
LD A,(ESCBUF+4)
SUB 20H
LD HL,PIXHO1
CP (HL)
; CP PIXHOR/8
JP NC,ESCE90
LD A,(ESCBUF+3)
SUB 20H
LD L,A
LD H,0
LD A,(LINESPACE)
LD B,A
LD D,H
LD E,L
DEC B
ESCE10: ADD HL,DE
DJNZ ESCE10
LD DE,(OVERBASE)
ADD HL,DE
EX DE,HL
LD HL,(UNDERBASE)
ADD HL,DE
LD BC,PIXVE+1
AND A
SBC HL,BC
JR NC,ESCE90
LD (YPOS),DE
LD A,(ESCBUF+4)
SUB 20H
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD (XPOS),HL
CALL OUTCUR
ESCE90: JP CON900
ESCTAB:
DEFB 'A' ; PAGE MODE
DEFB 0
DEFW ESCA
DEFB 'a' ; RESET PAGE MODE
DEFB 0
DEFW ESCLA
DEFB 'b' ; SET SERIAL CHANNEL
DEFB 1
DEFW ESCb
DEFB 'C' ; TURN ON CURSOR
DEFB 0
DEFW ESCC
DEFB 'c' ; TURN OFF CURSOR
DEFB 0
DEFW ESCLC
DEFB 'D' ; SET DISK TIME
DEFB 1
DEFW ESCD
DEFB 'd' ; DELETE LINE
DEFB 0
DEFW ESCLD
DEFB 'E' ; SHOW TIME
DEFB 0
DEFW ESCE
DEFB 'e' ; RESET SHOW TIME
DEFB 0
DEFW ESCLE
DEFB 'F' ; FAST SCROLL
DEFB 0
DEFW ESCF
DEFB 'f' ; SLOW SCROLL
DEFB 0
DEFW ESCLF
DEFB 'G' ; USER DEFINED CHARACTER
DEFB 12
DEFW ESCG
DEFB 'g' ; CHANGE CHARACTER GENERATOR
DEFB 1
DEFW ESCLG
DEFB 'H' ; HARD COPY FROM SCREEN
DEFB 1
DEFW ESCH
DEFB 'h' ; SET PRINTER
DEFB 2
DEFW ESCLH
DEFB 'I' ; INVERT
DEFB 0
DEFW ESCI
DEFB 'i' ; RESET INVERT
DEFB 0
DEFW ESCLI
DEFB 'J' ; INSERT LINE.
DEFB 0 ; TAKE CARE. FOR USE ONLY IN
DEFW ESCJ ; CONNECTION WITH CLEAR SCREEN
; AND NO SCROLLING
DEFB 'j' ; DELETE LINE. SEE COMMENTS
DEFB 0 ; ABOVE
DEFW ESCLJ
DEFB 'K' ; CHARACTER DISTANCE
DEFB 1 ; IN PROPORTIONAL MODE ONLY
DEFW ESCK
DEFB 'k' ; CLEAR KEYBOARD BUFFER
DEFB 0
DEFW ESCLK
DEFB 'L' ; LINE DISTANCE
DEFB 1
DEFW ESCL
DEFB 'l' ; INSERT LINE
DEFB 0
DEFW ESCLL
DEFB 'M' ; LAD DET BLIVE LYST
DEFB 0
DEFW ESCM
DEFB 'm' ; LAD DET BLIVE MØRKT
DEFB 0
DEFW ESCLM
DEFB 'O' ; OVERLINE
DEFB 0
DEFW ESCO
DEFB 'o' ; NOT OVERLINE
DEFB 0
DEFW ESCLO
DEFB 'P' ; PROPORTIONAL
DEFB 0
DEFW ESCP
DEFB 'p' ; NOT PROPORTIONAL
DEFB 0
DEFW ESCLP
DEFB 'S' ; SPACE WIDTH
DEFB 1
DEFW ESCS
DEFB 'T' ; CLEAR TO END OF LINE
DEFB 0
DEFW ESCT
DEFB 'U' ; UNDERLINE
DEFB 0
DEFW ESCU
DEFB 'u' ; NOT UNDERLINE
DEFB 0
DEFW ESCLU
DEFB 'W' ; WRITE FAST
DEFB 0
DEFW ESCV
DEFB 'w' ; WRITE SLOW
DEFB 0
DEFW ESCLV
DEFB 'Y' ; CLEAR TO END OF SCREEN
DEFB 0
DEFW ESCY
DEFB 'Z' ; WRITE ENLARGED CHARACTER
DEFB 5
DEFW ESCZ
DEFB 'z' ; SET CONSTANTS FOR ENLARGED
DEFB 3 ; CHARACTER
DEFW ESCLZ
DEFB '4' ; SET 40 CHARACTER SCREEN
DEFB 0
DEFW ESC4
DEFB '8'
DEFB 0
DEFW ESC8
DEFB '+' ; SET POINT
DEFB 4
DEFW ESCPLU
DEFB '-' ; RESET POINT
DEFB 4
DEFW ESCMIN
DEFB '=' ; CURSOR ADRESSING
DEFB 2 ; WORKS IN CHARACTER
DEFW ESCEQU ; AND LINE UNITS
DEFB ':' ; CURSOR ADRESSING
DEFB 4 ; WORKS IN PIXELS
DEFW ESCCOL
DEFB '*' ; CURSOR HOME AND
DEFB 0 ; CLEAR SCREEN
DEFW ESCSTA ; 1,1 UPPER LEFT CORNER
DEFB 'Æ' ; SAME AS ABOVE
DEFB 0
DEFW ESCÆ
DEFB 'æ' ; CURSOR HOME TO LOWER
DEFB 0 ; LEFT CORNER AND CLEAR
DEFW ESCæ ; SCREEN
DEFB 0 ; END OF TABLE
▶04◀C▶04◀CE
▶ff◀«eof»