|
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 - 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»