|
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: 11264 (0x2c00) Types: TextFile Names: »BIOS1.ASM«
└─⟦0d02879d3⟧ Bits:30004605 COMPAS Pascal version 3.03 └─ ⟦this⟧ »BIOS1.ASM«
DOWN: ; PROC DOWN ; // MOVE CURSOR 1 LINE DOWN ; BEGIN LD HL,(YPOS) ; IF YPOS+LINESPACE > LD DE,(LINESPACE) ADD HL,DE LD B,H LD C,L LD HL,PIXVE LD DE,(UNDERBASE) AND A SBC HL,DE AND A SBC HL,BC JP C,UPSCROLL ; THEN UPSCROLL LD (YPOS),BC ; ELSE YPOS :+ LINESPACE RET ; ENDPROC UP: ; PROC UP ; // MOVE CURSOR 1 LINE UP LD HL,(LINESPACE) ; IF YPOS-LINESPACE < OVERBASE LD DE,(OVERBASE) ADD HL,DE LD DE,(YPOS) AND A SBC HL,DE JR Z,UP10 JP NC,DOWNSCROLL ; THEN DOWNSCROLL UP10: LD HL,(YPOS) LD DE,(LINESPACE) AND A SBC HL,DE LD (YPOS),HL ; ELSE YPOS :- LINESPACE RET ; ENDPROC LEFT: ; PROC LEFT ; // MOVE CURSOR 1 UNIT LEFT LD DE,-1 ; IF PROP THEN ; LD BC,PIXHOR-1 ; DE := -1 LD BC,(PIXHOR) DEC BC LD A,(PROP) ; BC := PIXHOR-1 OR A ; ELSE JR NZ,LEFT10 ; DE := -8 LD DE,-8 ; BC := 8*(LINLEN-1) ; LD BC,8*(LINLEN-1) LD BC,(PIXHO1) DEC BC SLA C RL B SLA C RL B SLA C RL B LEFT10: ; ENDIF LD HL,(XPOS) ; IF XPOS > 0 THEN LD A,H OR L JR Z,LEFT20 ADD HL,DE ; XPOS :+ DE LD (XPOS),HL RET ; ELSE LEFT20: LD (XPOS),BC ; XPOS := BC JR UP ; UP ; ENDIF ; ENDPROC RIGHT: ; PROC RIGHT ; // MOVE CURSOR 1 UNIT RIGHT LD DE,1 ; IF PROP THEN ; LD BC,PIXHOR-1 ; DE := 1 LD BC,(PIXHOR) DEC BC LD A,(PROP) ; BC := PIXHOR-1 OR A ; ELSE JR NZ,RIGH10 ; DE := 8 LD DE,8 ; BC := 8*(LINLEN-1) ; LD BC,8*(LINLEN-1) LD BC,(PIXHO1) DEC BC SLA C RL B SLA C RL B SLA C RL B RIGH10: ; ENDIF LD HL,(XPOS) ; IF XPOS < BC THEN AND A SBC HL,BC JR NC,RIGH20 ADD HL,BC ADD HL,DE ; XPOS :+ DE LD (XPOS),HL RET ; ELSE RIGH20: LD HL,0 LD (XPOS),HL ; XPOS := 0 JP DOWN ; DOWN ; ENDIF ; ENDPROC COMPUTE: ; PROC COMPUTE(C) ; // SET LINESPACE TO C AND COMPUTE ; // THE RELATED VARIABLES ANEW LD B,0 LD (LINESPACE),BC ; LINESPACE := C LD A,C CP 10 LD B,3 ; IF LINESPACE = 10 JR Z,COMP10 ; THEN SPCCHAR := 10; B := 3 LD A,12 ; ELSE SPCCHAR := 12; B := 4 LD B,4 COMP10: LD (SPCCHAR),A LD D,A ; SPCAROUND := (LINESPACE-SPCCHAR)/2 LD A,C SUB D RRCA LD (SPCAROUND),A ADD A,B ; UNDERBASE := SPCAROUND+B LD L,A LD H,0 LD (UNDERBASE),HL EX DE,HL ; OVERBASE := LINESPACE-UNDERBASE LD HL,(LINESPACE) AND A SBC HL,DE LD (OVERBASE),HL RET ; ENDPROC COMPUTE CLREOL: ; PROC CLREOL ; // CLEAR FROM CURSOR TO END ; // OF LINE LD HL,(XPOS) LD A,L ; IF XPOS MOD 8 <> 0 THEN AND 07H JR Z,CLRE20 PUSH AF CALL CRTADDR ; HL := CRTADDR POP BC PUSH HL ; PUSH HL ; C := BIT STRING STARTING XOR A ; WITH (XPOS MOD 8) ONES CLRE05: SCF ; FROM THE LEFT SIDE AND RRA ; THE RIGHT SIDE AS ZEROES DJNZ CLRE05 LD C,A LD A,(LINESPACE) LD B,A CALL CLRE10+OFFSET POP HL ; POP HL // CRTADDR INC HL ; HL := (HL+2) MOD 32K INC HL ; RES 7,H CALL RES76 JR CLRE30 ; ELSE CLRE20: CALL CRTADDR ; HL := CRTADDR CLRE30: ; ENDIF PUSH HL ; LD HL,PIXHOR ; C := (PIXHOR-XPOS)/8 LD HL,(PIXHOR) LD DE,(XPOS) AND A SBC HL,DE LD A,L AND 0F8H SRL H RRA SRL H RRA SRL H RRA LD C,A LD A,(LINESPACE) LD B,A ; CLRBYTES(HL, C, LINESPACE) POP HL CALL CLRBYTES+OFFSET RET ; ENDPROC CLREOL CLREOS: ; PROC CLREOS ; // CLEAR TO END OF SCREEN CALL CLREOL ; CLREOL LD HL,(YPOS) ; IF YPOS+UNDERBASE < PIXVER THEN LD DE,(UNDERBASE) ADD HL,DE EX DE,HL LD HL,PIXVE AND A SBC HL,DE JR C,CLRE50 JR Z,CLRE50 PUSH HL LD HL,(YPOS) ; HL := CRTAD1(0,YPOS+LINESPACE) LD DE,(LINESPACE) ADD HL,DE LD DE,0 CALL CRTAD1 POP BC ; B := PIXVER - (YPOS+UNDERBASE) LD B,C ; LD C,PIXHOR/8 PUSH AF LD A,(PIXHO1) LD C,A POP AF CALL CLRBYTES+OFFSET ; CLRBYTES(HL, PIXHOR/8, B) CLRE50: ; ENDIF RET ; ENDPROC CLREOS PUTC00: LD E,A RLC E RLC E LD B,4 LD HL,CHRBUF PUTC: PUSH BC RRC E RRC E BIT 0,E JR Z,PUTC1 LD A,0F0H PUTC1: BIT 1,E JR Z,PUTC2 OR 0FH PUTC2: LD B,3 PUTC3: LD (HL),A INC HL DJNZ PUTC3 POP BC DJNZ PUTC JR PUT ; ; PUTCHR ; ; WRITES OUT A CHARACTER IN FLASHLESS MODE ; AT THE CURSOR POSITION. MOVES THE CURSOR CORRESPONDINGLY ; ; INPUT : ; A IS THE CHARACTER TO BE WRITTEN. PUTCHR: ; PROC PUTCHR(A) LD C,A LD A,(GENERF) CP 0AH LD A,C JR Z,PUTC00 LD H,0 LD L,A ; HL := A*12 ADD HL,HL ; * 2 ADD HL,HL ; * 4 LD D,H LD E,L ADD HL,HL ; * 8 ADD HL,DE ; * 12 EX DE,HL LD HL,CHARGE ADD HL,DE LD DE,600H LD A,(GENERF) OR A PUT1: JR Z,PUT ADD HL,DE DEC A JR PUT1 PUT: LD A,(SPCCHAR) ; IF SPCCHAR = 10 CP 10 JR NZ,PUTC01 INC HL PUTC01: LD DE,CHRBUF LD BC,12 LDIR PUTC04: LD A,(SPCCHAR) LD B,10 CP 10 JR Z,PUTC02 LD B,12 PUTC02: LD HL,CHRBUF XOR A PUTC03: OR (HL) ; FOR I := 1 TO 10 INC HL ; DO MASK :OR CHRBUF(I) DJNZ PUTC03 LD (MASK),A LD A,(ULINE) ; IF ULINE THEN OR A JR Z,PUTC10 LD A,(SPCCHAR) ; IF SPCCHAR = 10 CP 10 LD A,0FFH JR NZ,PUTC05 LD (CHRBUF+9),A ; THEN CHRBUF(9) := 0FFH JR PUTC10 PUTC05: LD (CHRBUF+11),A ; ELSE CHRBUF(11) := 0FFH ; ENDIF PUTC10: LD A,(OLINE) ; IF OLINE THEN OR A JR Z,PUTC20 LD A,0FFH LD (CHRBUF),A ; CHRBUF(0) := 0FFH ; ENDIF PUTC20: LD A,(INVERT) ; IF INVERT THEN OR A JR Z,PUTC30 LD B,12 LD HL,CHRBUF ; FOR I := 0 TO 11 PUTC25: LD A,(HL) ; DO CHRBUF(I) := COMPL(CHRBUF(I)) CPL LD (HL),A INC HL DJNZ PUTC25 PUTC30: ; ENDIF LD A,(PROP) ; IF NOT PROP THEN OR A JR NZ,PUT100 LD A,(INVERT) ; C := INVERT LD C,A LD DE,VIDBUF ; DE := ^VIDBUF(0) LD A,(SPCAROUND) ; IF SPCAROUND <> 0 THEN OR A JR Z,PUTC50 LD B,A ; MOVE SPCAROUND BYTES LD A,C ; WITH VALUE C TO DE^ PUTC40: LD (DE),A ; DE :+ SPCAROUND INC DE DJNZ PUTC40 LD HL,CHRBUF ; MOVE CHRBUF(0..11) TO DE^ LD BC,12 ; DE :+ 12 LDIR LD A,(SPCAROUND) ; MOVE SPCAROUND BYTES LD B,A ; WITH VALUE C TO DE^ LD A,(VIDBUF) PUTC45: LD (DE),A INC DE DJNZ PUTC45 JR PUTC65 ; ELSE PUTC50: LD HL,CHRBUF ; VIDBUF(0..11) := CHRBUF(0..11) LD BC,12 LDIR PUTC65: ; ENDIF CALL CRTADDR ; HL := CRTADDR CALL CHARWRITE ; CHARWRITE(HL) CALL RIGHT ; RIGHT JP PUT900 PUT100: ; ELSE // PROPORTIONAL LD A,(CHARDIST) ; LEFTBLANK := CHARDIST DIV 2 LD B,A SRL A LD (LEFTBLANK),A SUB B ; RIGHTBLANK := CHARDIST-LEFTBLANK NEG LD (RIGHTBLANK),A LD A,(MASK) ; IF MASK = 0 THEN // SPACE OR A JR NZ,PUT105 LD A,(LEFTBLANK) ; LEFTBLANK :+ SPACEWIDTH LD B,A LD A,(SPACEWIDTH) ADD A,B LD (LEFTBLANK),A XOR A ; WIDTH := 0 LD (WIDTH),A JR PUT145 ; ELSE // MASK <> 0 PUT105: LD B,0 ; STARTPOS := BIT NUMBER OF PUT110: RLCA ; LEFTMOST ONE BIT WHEN JR C,PUT120 ; BITS ARE NUMBERED 0..7 INC B ; FROM LEFT TO RIGHT JR PUT110 PUT120: LD A,B LD (STARTPOS),A LD A,(MASK) ; WIDTH := (BIT NUMBER OF LD C,7+1 ; RIGHTMOST ONE BIT) - PUT130: RRCA ; STARTPOS + 1 JR C,PUT140 DEC C JR PUT130 PUT140: LD A,C SUB B LD (WIDTH),A PUT145: ; ENDIF ; LD HL,PIXHOR ; IF PIXHOR-XPOS < LEFTBLANK+ LD HL,(PIXHOR) LD DE,(XPOS) AND A SBC HL,DE LD A,(LEFTBLANK) LD B,A LD A,(WIDTH) ADD A,B LD B,A LD A,(RIGHTBLANK) ADD A,B LD E,A LD D,0 AND A SBC HL,DE JR NC,PUT148 ; THEN LD HL,0 ; XPOS := 0 LD (XPOS),HL CALL DOWN ; DOWN PUT148: ; ENDIF LD A,01H ; BLMASK := 01H LD (BLMASK),A LD A,(XPOS) AND 07H ; KEEP := XPOS MOD 8 LD (KEEP),A LD B,A LD A,(MASK) ; IF MASK <> 0 THEN OR A JR Z,PUT180 LD A,(STARTPOS) ; A := (KEEP+LEFTBLANK- LD C,A ; STARTPOS) MOD 8 LD A,(LEFTBLANK) ADD A,B SUB C AND 07H JR Z,PUT170 ; IF A <> 0 THEN LD D,A LD C,11 LD HL,CHRBUF ; FOR I := 0 TO 10 DO PUT150: LD B,D LD A,(HL) ; CHRBUF(I) := PUT160: RRCA ; CHRBUF(I) ROTATED DJNZ PUT160 ; CIRCULAR RIGHT A BITS LD (HL),A INC HL DEC C JR NZ,PUT150 ; ENDFOR LD B,D ; BLMASK := BLMASK ROTATED LD A,(BLMASK) ; CIRCULAR RIGHT A BITS PUT165: RRCA DJNZ PUT165 LD (BLMASK),A PUT170: ; ENDIF PUT180: ; ENDIF LD HL,VMASK LD (HL),0 ; VMASK := ALL 0 LD DE,VMASK+1 ; CMASK := ALL 0 LD BC,MASKLE*2-1 LDIR LD HL,VMASK ; SETBITS(VMASK,0,KEEP) LD A,(KEEP) LD B,A XOR A CALL SETBITS LD HL,CMASK ; SETBITS(CMASK, LD A,(WIDTH) ; KEEP+LEFTBLANK, WIDTH) LD B,A LD A,(KEEP) LD C,A LD A,(LEFTBLANK) ADD A,C PUSH AF CALL SETBITS POP BC LD HL,VMASK ; SETBITS(VMASK, LD A,(WIDTH) ; KEEP+LEFTBLANK+ ADD A,B ; WIDTH+RIGHTBLANK, 15) LD B,A LD A,(RIGHTBLANK) ADD A,B LD B,15 CALL SETBITS CALL CRTADDR ; VIDADDR := CRTADDR LD (VIDADDR),HL PUSH IX ; PUSH IX LD IX,VMASK ; IX := ^VMASK // = ^CMASK-MASKLEN ; // BELOW, VMSK DENOTES IX^ AND ; // CMSK DENOTES (IX+MASKLEN)^ PUT200: LD A,(IX+0) ; WHILE VMSK <> 0FFH DO CP 0FFH JR Z,PUT260 OR A ; IF VMSK <> 0 LD HL,(VIDADDR) ; THEN CHARREAD(VIDADDR) CALL NZ,CHARREAD LD HL,VIDBUF ; HL := ^VIDBUF LD A,(SPCAROUND) ; IF SPCAROUND <> 0 THEN OR A JR Z,PUT220 LD B,A LD C,(IX+0) LD A,C CPL LD D,A LD A,(INVERT) AND D LD D,A PUT210: LD A,(HL) ; DO SPCAROUND TIMES AND C ; HL^ := (HL^ AND VMSK) OR OR D ; (INVERT AND NOT VMSK) LD (HL),A INC HL ; HL :+ 1 DJNZ PUT210 ; ENDDO PUT220: ; ENDIF LD A,(SPCCHAR) LD B,A ; DE := ^CHRBUF(0) LD DE,CHRBUF ; DO SPCCHAR TIMES PUT230: LD A,(BLMASK) ; HL^ := ((DE^ AND BLMASK)<>0) LD C,A ; AND NOT CMSK LD A,(DE) ; AND NOT VMSK) OR AND C LD C,0 JR Z,PUT235 LD A,(IX+0) OR (IX+MASKLEN) CPL LD C,A PUT235: LD A,(HL) ; (HL^ AND VMSK) OR AND (IX+0) OR C LD C,A LD A,(DE) ; (DE^ AND CMSK) AND (IX+MASKLEN) OR C LD (HL),A INC HL ; HL :+ 1 INC DE ; DE :+ 1 DJNZ PUT230 ; ENDDO LD A,(SPCAROUND) ; IF SPCAROUND <> 0 THEN OR A JR Z,PUT250 LD B,A LD C,(IX+0) LD A,C CPL LD D,A LD A,(INVERT) AND D LD D,A PUT240: LD A,(HL) ; DO SPCAROUND TIMES AND C ; HL^ := (HL^ AND VMSK) OR OR D ; (INVERT AND NOT VMSK) LD (HL),A INC HL ; HL :+ 1 DJNZ PUT240 ; ENDDO PUT250: ; ENDIF LD HL,(VIDADDR) CALL CHARWRITE ; CHARWRITE(VIDADDR) LD HL,(VIDADDR) ; VIDADDR := (VIDADDR+2) MOD 32K INC HL INC HL ; RES 7,H CALL RES76 LD (VIDADDR),HL INC IX ; IX :+ 1 JP PUT200 ; ENDWHILE PUT260: POP IX ; POP IX LD A,(LEFTBLANK) ; XPOS :+ LEFTBLANK+WIDHT+RIGHTBLANK LD B,A LD A,(WIDTH) ADD A,B LD B,A LD A,(RIGHTBLANK) ADD A,B LD E,A LD D,0 LD HL,(XPOS) ADD HL,DE LD (XPOS),HL PUT900: ; ENDIF // NOT PROP / PROP RET ; ENDPROC PUTCHR ▶04◀▶7f◀▶04◀▶7f◀▶04◀▶7f◀«eof»