|
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: 27008 (0x6980) Types: TextFile Names: »BLOWU1.ASM«
└─⟦0d02879d3⟧ Bits:30004605 COMPAS Pascal version 3.03 └─ ⟦this⟧ »BLOWU1.ASM«
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; PROCEDURE CRTINI INITIALISATION PROCEDURE ; ; NO INPUT, NO OUTPUT ; ; FUNCTION: ; INITIALISES THE CRT CIRCUITS FOR OPERATION ; USED AT START-UP TIME ONLY ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CRTINI: XOR A LD (FLASH),A LD (RETN),A LD (LOCK),A LD (KBFLAG),A LD (OLINE),A LD (ULINE),A LD (INVERT),A LD (PROP),A LD (GENERF),A LD (CURF),A DEC A LD (TASTBU),A LD (LEADIN),A LD (FSCROL),A INC A INC A LD (HENMUL),A LD (NEDMUL),A LD HL,5 LD (SPACEWIDTH),HL LD HL,3 LD (CHARDIST),HL LD C,10 CALL COMPUTE LD A,0FFH OUT (CH80),A ; SET 16 MHZ VIDEO ; 80 CHARACTERS/LINE LD HL,PIXHO LD (PIXHOR),HL LD HL,PIXVE LD (PIXVER),HL LD HL,80 LD (PIXHO1),HL CALL CLRSCREEN ; CLEAR VIDEO MEMORY LD HL,DSTAB8 ; INITIALISE THE CRTC CALL CRTI20 LD C,27 CALL CONOUT LD C,'*' JP CONOUT CRTI20: LD B,12 ; REGISTERS FROM TABLE LD C,0 CRTI30: LD A,C OUT (CRTREG),A INC C LD A,(HL) OUT (CRTDAT),A INC HL DJNZ CRTI30 RET ; CHARREAD ; ; READS THE BYTES CORRESPONDING TO (A PART OF) A CHARACTER ; IN THE VIDEO RAM. THE BYTES READ CORRESPOND TO A BYTE COLUMN ; ON THE DISPLAY. ; "LINESPACE" BYTES ARE READ AND STORED IN VIDBUF. ; ; INPUT: ; HL IS THE ADDRESS OF THE FIRST (UPPER) RAM BYTE OF THE ; CHARACTER CHARREAD: ; PROC CHARREAD(HL) PUSH IX ; PUSH IX LD IX,VIDBUF ; IX := ^VIDBUF LD A,(LINESPACE) RRCA LD B,A ; DO LINESPACE/2 TIMES CALL CHAR10+OFFSET POP IX ; POP IX RET ; ENDPROC CHARREAD ; CHARWRITE ; ; WRITES THE BYTES CORRESPONDING TO (A PART OF) A CHARACTER ; IN THE VIDEO RAM. THE BYTES WRITTEN CORRESPOND TO A BYTE COLUMN ; ON THE DISPLAY. ; "LINESPACE" BYTES ARE TAKEN FROM VIDBUF AND WRITTEN. ; ; INPUT: ; HL IS THE ADDRESS OF THE FIRST (UPPER) RAM BYTE OF THE ; CHARACTER CHARWRITE: ; PROC CHARWRITE(HL) PUSH IX ; PUSH IX LD IX,VIDBUF ; IX := ^VIDBUF LD A,(LINESPACE) RRCA LD B,A ; DO LINESPACE/2 TIMES CALL CHAR60+OFFSET POP IX ; POP IX RET ; ENDPROC CHARWRITE ; SETBITS ; ; SETS A STREAM OF BITS IN A STORE AREA. ; ; INPUT: ; HL IS THE ADDRESS OF THE FIRST BYTE IN THE STORE AREA. ; THE STORE AREA IS TREATED AS A STREAM OF BITS, WITH ; THE BITS IN THE FIRST BYTE OF THE AREA BEING NUMBERED 0 TO 7 ; FROM LEFT TO RIGHT, THE BITS IN THE 2ND BYTE BEING NUMBERED ; 8 TO 15 ETC. ; A IS THE NUMBER OF THE STARTING BIT TO BE SET. ; B IS THE NUMBER OF BITS TO BE SET. THE BITS WITH NUMBERS ; C THROUGH C+B-1 ARE SET. SETBITS: ; PROC SETBITS(HL, A, B) LD C,A ; C := A LD A,B ; IF B <> 0 THEN OR A RET Z LD A,C ; HL :+ C DIV 8 AND 0F8H RRCA RRCA RRCA LD E,A LD D,0 ADD HL,DE LD A,C ; C := 80H ROTATED RIGHT AND 07H ; CIRCULAR (C MOD 8) BITS LD C,80H OR A JR Z,SETB20 SETB10: RRC C DEC A JR NZ,SETB10 SETB20: LD DE,0 ; DO B TIMES SETB30: LD A,(HL) ; HL^ := HL^ OR C OR C LD (HL),A RRC C ; ROTATE C RIGHT CIRCULAR ADC HL,DE ; IF C = 80H THEN HL :+ 1 DJNZ SETB30 ; ENDDO ; ENDIF RET ; ENDPROC SETBITS ; CRTADDR, CRTAD1, CRTAD2 ; ; CALCULATES THE ADDRESS IN THE CRT RAM CORRESPONDING TO ; A CURSOR POSITION. ; ; INPUT: ; CRTADDR: XPOS AND YPOS HOLD THE CURSOR POSITION ; CRTAD1, ; CRTAD2 : DE AND HL HOLD THE CURSOR POSITION (X-DE, Y-HL) ; ; OUTPUT: ; CRTADDR, ; CRTAD1 : HL IS ADDRESS OF FIRST (UPPER) BYTE OF THE CHARACTER ; WHOSE BASELINE IS AT THE CURSOR POSITION. ; CRTAD2 : HL IS ADDRESS OF THE BYTE PLACED AT THE CURSOR POSITION. CRTADDR: ; PROC CRTADDR LD DE,(XPOS) ; DE := XPOS LD HL,(YPOS) ; HL := YPOS CRTAD1: ; // ENTRY POINT CRTAD1 LD BC,(OVERBASE) ; HL :- OVERBASE AND A SBC HL,BC CRTAD2: ; // ENTRY POINT CRTAD2 XOR A ; HL := ( (HL/2) * 2*PIXHOR/8 RR L RLA RL L CALL MULT LD C,A ; + HL MOD 2 LD B,0 ADD HL,BC SRL D ; + DE/8 * 2 RR E SRL D RR E RES 0,E ADD HL,DE LD DE,(CRTSTART) ; + CRTSTART ADD HL,DE ; RES 7,H ; ) MOD 32K CALL RES76 RET ; MULT UTILITY ; ; MULTIPLIES HL WITH PIXHOR/8 ; ; DOES NOT MODIFY DE AND A MULT: ; IF PIXHOR/8-80 ; DEFB ERROR ; ENDIF PUSH AF LD A,(PIXHO1) CP 40 JR Z,MULT10 ADD HL,HL ; *2 MULT10: ADD HL,HL ; *4 ADD HL,HL ; *8 ADD HL,HL ; *16 LD B,H LD C,L ADD HL,HL ; *32 ADD HL,HL ; *64 ADD HL,BC ; +16 POP AF RET ; OUTCURSOR ; ; IF NOT PROPORTIONAL SPACING, THE CURSOR IS POSITIONED OUTCURSOR: ; PROC OUTCURSOR LD A,(PROP) ; IF NOT PROP THEN OR A RET NZ LD A,(CURF) OR A RET NZ LD DE,(XPOS) ; HL := CRTAD2(XPOS, YPOS+1) LD HL,(YPOS) INC HL XOR A RR L RLA RL L CALL MULT LD C,A LD B,0 ADD HL,BC SRL D RR E SRL D RR E RES 0,E ADD HL,DE LD DE,(CRTSTART) ADD HL,DE RES 7,H SRL H ; E := HL MOD 2 RR L ; HL := HL/2 LD E,0 RL E LD A,10 ; CRTREG(10) := 60H+E OUT (CRTREG),A LD A,60H ADD A,E OUT (CRTDAT),A LD A,11 ; CRTREG(11) := E OUT (CRTREG),A LD A,E OUT (CRTDAT),A LD A,14 ; CRTREG(14..15) := HL OUT (CRTREG),A LD A,H OUT (CRTDAT),A LD A,15 OUT (CRTREG),A LD A,L OUT (CRTDAT),A ; ENDIF RET ; ENDPROC OUTCURSOR CLRSCREEN: LD A,01 ; STOP DISPLAY TO OUT (CRTREG),A ; SPEED UP MEMORY XOR A ; CLEARING OUT (CRTDAT),A CALL XCLRSC+OFFSET ; RETURN POINT FROM RAM LD HL,0 LD (CLRBEGIN),HL ; CLRBEGIN := 0 CALL OUTRFRSH ; OUTRFRSH(0) LD A,01 OUT (CRTREG),A ; LD A,PIXHOR/8 LD A,(PIXHO1) OUT (CRTDAT),A RET DSTAB8: DEFB 7FH ; HORIZONTAL TOTAL DEFB 50H ; HORIZONTAL DISPLAYED DEFB 5DH ; HORIZONTAL SYNC POSITION DEFB 06H ; HORIZONTAL SYNC WIDTH DEFB 7FH ; VERTICAL TOTAL DEFB 1FH ; VERTICAL TOTAL ADJUST DEFB 78H ; VERTICAL DISPLAYED DEFB 7EH ; VERTICAL SYNC POSITION DEFB 00H ; NON-INTERLACE MODE DEFB 01H ; MAXIMUM SCAN LINE DEFB 60H ; CURSOR CONTROL $ START DEFB 01H ; CURSOR END DSTAB4: DEFB 7FH/2 DEFB 50H/2 DEFB 5DH/2 DEFB 6/2 DEFB 7FH DEFB 1FH DEFB 78H DEFB 7EH DEFB 0 DEFB 01H DEFB 60H DEFB 01H ; UPSCROLL ; ; SCROLLS THE CONTENTS OF THE SCREEN ONE LINE UP UPSCROLL: ; PROC UPSCROLL LD A,(LOCK) OR A RET NZ UPSC10: ; REPEAT LD HL,0 LD DE,(PIXHO1) PUSH BC LD B,PIXVE UPSC12: ADD HL,DE DJNZ UPSC12 POP BC EX DE,HL LD HL,(CRTSTART) ADD HL,DE ; ) MOD 32K EX DE,HL LD HL,(CLRBEGIN) AND A SBC HL,DE CALL RES76 PUSH HL ; >= LINESPACE*PIXHOR/8 LD HL,(LINESPACE) CALL MULT EX DE,HL POP HL AND A SBC HL,DE JR C,UPSC10 ; LD A,(FSCROL) ; IF NOT FSCROL THEN OR A JR NZ,UPSC50 LD A,(LINESPACE) RRCA LD B,A ; DO LINESPACE/2 TIMES UPSC30: IN A,(PIOBD) ; AWAIT VERTICAL SYNC RLCA JR NC,UPSC30 LD DE,(PIXHO1) LD L,E LD H,D ADD HL,DE EX DE,HL LD HL,(CRTSTART) ADD HL,DE ; ) MOD 32K CALL RES76 CALL OUTRFRSH UPSC40: IN A,(PIOBD) ; AWAIT NO VERTICAL SYNC RLCA JR C,UPSC40 DJNZ UPSC30 ; ENDDO JR UPSC60 ; ELSE UPSC50: LD HL,(LINESPACE) ; OUTRFRSH( ( CALL MULT ; CRTSTART+LINESPACE*PIXHOR/8 LD DE,(CRTSTART) ; ) MOD 32K) ADD HL,DE CALL RES76 CALL OUTRFRSH ; ENDIF UPSC60: LD A,10000011B OUT (PIOBC),A RET ; ENDPROC UPSCROLL ; DOWNSCROLL ; ; SCROLLS THE CONTENTS OF THE SCREEN ONE LINE DOWN DOWNSCROLL: ; PROC DOWNSCROLL LD A,(LOCK) OR A RET NZ DOWN05: LD HL,(CLRBEGIN) ; REPEAT LD DE,(CRTSTART) AND A SBC HL,DE JR NZ,DOWN05 ; UNTIL CLRBEGIN=CRTSTART LD A,(FSCROL) ; IF NOT FSCROL THEN OR A JR NZ,DOWN40 LD A,(LINESPACE) RRCA LD B,A ; DO LINESPACE/2 TIMES DOWN10: IN A,(PIOBD) ; AWAIT VERTICAL SYNC RLCA JR NC,DOWN10 LD DE,(PIXHO1) LD L,E LD H,D ADD HL,DE EX DE,HL LD HL,0 AND A SBC HL,DE EX DE,HL LD HL,(CRTSTART) ADD HL,DE ; ) MOD 32K CALL RES76 LD (CLRBEGIN),HL ; CLRBEGIN := HL CALL OUTRFRSH ; OUTRFRSH(HL) DOWN20: IN A,(PIOBD) ; AWAIT NO VERTICAL SYNC RLCA JR C,DOWN20 DJNZ DOWN10 ; ENDDO JR DOWN50 ; ELSE DOWN40: LD HL,(LINESPACE) ; HL := (CRTSTART - LINESPACE*PIXHOR/8) CALL MULT ; MOD 32K EX DE,HL LD HL,(CRTSTART) AND A SBC HL,DE CALL RES76 LD (CLRBEGIN),HL ; CLRBEGIN := HL CALL OUTRFRSH ; OUTRFRSH(HL) DOWN50: ; ENDIF LD DE,(PIXHO1) LD HL,0 PUSH BC LD B,PIXVE DOWN52: ADD HL,DE DJNZ DOWN52 POP BC EX DE,HL LD HL,(CRTSTART) ADD HL,DE ; PIXHOR/8, LINESPACE) CALL RES76 LD A,(PIXHO1) LD C,A LD A,(LINESPACE) LD B,A CALL CLRBYTES+OFFSET LD A,10000011B OUT (PIOBC),A RET ; ENDPROC DOWNSCROLL RES76: PUSH AF LD A,(PIXHO1) CP 40 JR NZ,RES76A RES 6,H RES76A: RES 7,H POP AF RET OUTRFRSH: ; PROC OUTRFRSH(HL) LD (CRTSTART),HL ; CRTSTART := HL SRA H RR L LD A,12 ; CRTREG(12..13) := HL/2 OUT (CRTREG),A LD A,H OUT (CRTDAT),A LD A,13 OUT (CRTREG),A LD A,L OUT (CRTDAT),A RET ; ENDPROC OUTRFRSH ESCPLU: XOR A LD (GRAFF),A JR PLOT ESCMIN: LD A,01 LD (GRAFF),A PLOT: LD HL,(ESCBUF+5) LD D,L LD E,H LD HL,(PIXVER) DEC HL AND A SBC HL,DE LD (ESCBUF+5),HL LD A,L LD DE,(PIXVER) AND A SBC HL,DE JP NC,CON900 LD HL,(ESCBUF+5) LD C,L SRL A LD B,A LD HL,0 JR Z,PLOT20 LD DE,(PIXHO1) SLA E RL D PLOT10: ADD HL,DE DJNZ PLOT10 PLOT20: LD DE,(CRTSTA) ADD HL,DE PUSH HL LD HL,(ESCBUF+3) LD A,L LD L,H LD H,A LD (ESCBUF+3),HL LD DE,(PIXHOR) AND A SBC HL,DE POP HL JP NC,CON900 PUSH HL LD HL,(ESCBUF+3) LD B,L SRL H RR L SRL H RR L SRL H RR L ADD HL,HL LD E,L LD D,H POP HL ADD HL,DE LD A,C AND 00000001B JR Z,PLOT30 INC HL PLOT30: CALL RES76 PUSH HL LD HL,TABLE LD A,B AND 00000111B LD E,A LD D,0 ADD HL,DE EX DE,HL POP HL PLOT50: CALL PLOT60+OFFSET JP CON900 TABLE: DEFB 80H DEFB 40H DEFB 20H DEFB 10H DEFB 08H DEFB 04H DEFB 02H DEFB 01H FUNTA: ; SET FUNCTION KEYS LD HL,TXT1 CALL OUTTX FUNTA1: LD HL,TXT1A CALL OUTTX CALL CONIN PUSH AF LD C,A CALL CONOUT POP AF AND 01011111B CP 'F' CALL NZ,FUNTA1 CALL CONIN PUSH AF LD C,A CALL CONOUT POP AF CP 31H JR C,FUNTA1 CP 35H JR NC,FUNTA1 DEC A AND 00000011B PUSH AF ; SAVE NO OF FUNCTION KEY FUNT2: LD HL,TXT1B CALL OUTTX LD HL,TXT1C CALL OUTTX CALL CONIN ; ASK FOR SHIFT PUSH AF LD C,A CALL CONOUT POP AF AND 01011111B CP 'N' JR Z,FUNT3 CP 'J' JR NZ,FUNT2 POP AF SET 2,A PUSH AF FUNT3: LD HL,TXT1D CALL OUTTX LD HL,TXT1C CALL OUTTX CALL CONIN ; ASK FOR CTRL PUSH AF LD C,A CALL CONOUT POP AF AND 01011111B CP 'N' JR Z,FUNT4 CP 'J' JR NZ,FUNT3 POP AF SET 3,A PUSH AF ; SAVE KEY FUNT4: POP AF OR A LD C,A ; SAVE KEY LD HL,FBUF ; POINTER JR Z,FUNT20 ; STRING LOCATED LD B,A FUNT10: LD A,(HL) INC HL CP 80H JR C,FUNT10 DJNZ FUNT10 FUNT20: PUSH HL LD HL,TXT2 PUSH BC ; SAVE KEY CALL OUTTX LD HL,TXT3 CALL OUTTX POP BC ; RECOVER KEY LD A,C CP 08H JR C,FUNT21 PUSH BC LD C,'C' CALL CONOUT LD C,' ' CALL CONOUT POP BC FUNT21: LD A,C AND 00000100B JR Z,FUNT22 PUSH BC LD C,'S' CALL CONOUT LD C,' ' CALL CONOUT POP BC FUNT22: PUSH BC LD C,'F' CALL CONOUT POP BC LD A,C AND 00000011B ADD A,31H LD C,A CALL CONOUT LD HL,TXT4 CALL OUTTX POP HL LD D,H ; SAVE START OF STRING LD E,L PUSH DE FUNT25: LD A,(HL) CP 80H JR NC,FUNT30 PUSH HL LD HL,FUNT26 PUSH HL CP 0DH JP Z,PRINCR CP 0AH JP Z,PRINLF POP HL LD C,A CALL CONOUT FUNT26: POP HL INC HL JR FUNT25 FUNT30: ; SAVE END OF STRING PUSH HL AND 01111111B LD C,A CALL CONOUT ; WRITE LAST FUNT32: LD HL,TXT5 CALL OUTTX CALL CONIN PUSH AF LD C,A CALL CONOUT POP AF AND 01011111B CP 'J' JR Z,FUNT40 CP 'N' JR NZ,FUNT32 FUNT35: LD HL,TXT6 CALL OUTTX CALL CONIN PUSH AF LD C,A CALL CONOUT POP AF POP HL ; CLEAR STACK POP DE AND 01011111B CP 'J' JP Z,FUNTA CP 'N' JR NZ,FUNT35 LD HL,FBUF ; MOVE STRING TO HSTBUF LD DE,HSTBUF+80 LD BC,80H LDIR XOR A ; SET FLAG. FBUF ACTIVE LD (HSTBUF+2),A JP CONF01 FUNT40: POP HL ; END OF STRING POP DE ; START OF STRING PUSH DE ; SAVE START LD A,80H LD (DE),A LD BC,FBUF+80H PUSH HL AND A SBC HL,DE LD A,L OR H POP HL JR Z,FUNT50 ; NOTHING TO MOVE FUNT45: INC DE ; CONCATENATE BUFFER INC HL PUSH HL LD A,(HL) LD (DE),A AND A SBC HL,BC LD A,L OR H POP HL JR NZ,FUNT45 FUNT50: LD B,16 LD HL,FBUF FUNT52: LD A,(HL) ; FIND LAST CHAR IN BUFFER INC HL CP 80H JR C,FUNT52 DJNZ FUNT52 PUSH HL ; SAVE FIRST PLACE NOT USED INC HL ; FIRST PLACE NOT USED LD BC,FBUF+80H FUNT53: AND A PUSH HL SBC HL,BC LD A,L OR H POP HL JR Z,FUNT54 LD (HL),0 INC HL JR FUNT53 FUNT54: POP HL DEC HL ; LAST POSITION USED POP BC ; START OF NEW STRING PUSH HL ; SAVE LAST POSITION PUSH BC ; SAVE START OF STRING AND A SBC HL,BC LD C,L ; C:=COUNTER INC C PUSH BC ; SAVE COUNTER LD HL,TXT7 CALL OUTTX POP BC ; RECOVER BUMP COUNTER POP DE ; GET START POP HL FUNT55: PUSH BC ; SAVE BUMP COUNTER PUSH DE ; SAVE SAVING ADRESS PUSH HL CALL CONIN POP HL CP 27 ; END OF STRING? JP Z,FUNT35 PUSH HL PUSH AF ; SAVE 1. CHARACTER LD HL,FUNT5A PUSH HL CP 0DH JP Z,PRINCR CP 0AH JP Z,PRINLF POP HL LD C,A ; GIVE IT BACK TO USER CALL CONOUT FUNT5A: POP AF ; RESTORE CHARACTER POP HL POP DE ; RECOVER SAVING ADDRESS LD (DE),A ; SAVE IN FBUF POP BC ; RECOVER BUMP COUNTER FUNT56: PUSH HL ; SAVE LAST PLACE IN FBUF INC DE ; MAKE READY FOR NEXT PUSH BC ; SAVE BUMP COUNTER PUSH DE ; SAVE NEXT ADDRESS CALL CONIN ; GET NEXT CHARACTER CP 27 ; ESC KEY? JR Z,FUNT60 ; PUSH AF LD HL,FUNT5B PUSH HL CP 0DH JP Z,PRINCR CP 0AH JP Z,PRINLF POP HL LD C,A ; TELL THE USER CALL CONOUT ; TELL THE USER FUNT5B: POP AF ; RECOVER CHARACTER POP DE ; RECOVER NEXT ADDRESS POP BC ; RECOVER BUMP COUNTER POP HL ; RECOVER LAST PLACE IN FBUF PUSH HL ; SAVE IT AGAIN PUSH DE ; SAVE NEXT ADDRESS LD D,H LD E,L INC DE PUSH AF PUSH BC ; SAVE BUMP COUNTER LD A,C OR A JR Z,FUNT58 ; NOTHING TO MOVE FUNT57: LD A,(HL) ; MOVE REST OF FBUF LD (DE),A DEC HL DEC DE DEC C JR NZ,FUNT57 FUNT58: POP BC ; RECOVER VALUE OF BUMP COUNTER POP AF ; RECOVER CHARACTER POP DE ; RECOVER CHARACTER POINTER LD (DE),A ; SAVE CHARACTER IN FBUF POP HL ; RECOVER POSITION IN FBUF INC HL ; NEXT PUSH HL PUSH DE LD DE,FBUF+80H AND A SBC HL,DE LD A,L OR H POP DE POP HL JR Z,BUFFYL ; NO SPACE IN BUFFER JR FUNT56 ; LOOP FUNT60: POP DE DEC DE LD A,(DE) OR 80H LD (DE),A JP FUNT35 BUFFYL: PUSH HL PUSH HL INC DE PUSH DE LD HL,TXT8 CALL OUTTX JR FUNT60 PRINLF: LD HL,LFTAB JR PRINCL PRINCR: LD HL,CRTAB PRINCL: LD DE,CHRBUF LD BC,12 LDIR CALL PUTC04 CALL OUTCURSOR RET LFTAB: DEFB 00000000B DEFB 00001000B DEFB 00001000B DEFB 00001000B DEFB 00001000B DEFB 00101010B DEFB 00011100B DEFB 00001000B DEFB 00000000B DEFB 00000000B DEFB 00000000B DEFB 00000000B CRTAB: DEFB 00000000B DEFB 00000000B DEFB 00010000B DEFB 00100000B DEFB 01111111B DEFB 00100000B DEFB 00010000B DEFB 00000000B DEFB 00000000B DEFB 00000000B DEFB 00000000B DEFB 00000000B TXT1: DEFB 27,'*',0AH,0AH DEFM 'Definering af funktionstaster' DEFB 0 TXT1A: DEFB 0DH,0AH,0AH DEFM 'Angiv en funktionstast (F1/F2/F3/F4) ? ' DEFB 0 TXT1B: DEFB 0DH,0AH,0AH DEFM 'Skal "SHIFT" ' DEFB 0 TXT1C: DEFM 'også være nedtrykket (J/N) ? ' DEFB 0 TXT1D: DEFB 0DH,0AH,0AH DEFM 'SKAL "CTRL" ' DEFB 0 TXT2: DEFB 0DH,0AH,0AH,0 TXT3: DEFM 'Funktionstast ' DEFB 0 TXT4: DEFM ' giver teksten:' DEFB 0DH,0AH,0AH DEFB 0 TXT5: DEFB 0DH,0AH,0AH DEFM 'Skal dette ændres (J/N) ? ' DEFB 0 TXT6: DEFB 0DH,0AH,0AH DEFM 'Andre taster (J/N) ? ' DEFB 0 TXT7: DEFB 0DH,0AH,0AH DEFM 'Indtast ny streng. Afslut med' DEFB 0DH,0AH DEFM 'tryk på "ESC" tasten!' DEFB 0DH,0AH,0AH DEFM '? ' DEFB 0 TXT8: DEFB 0DH,0AH,0AH DEFB 27,'I' DEFM 'Buffer fyldt!' DEFB 27,'i' DEFB 0 AUTOST: LD HL,TXT9 CALL OUTTX LD C,0 ; BUMP COUNTER LD HL,HSTBUF+80+80H+1 ; ADDRESS FOR STRING AUTO10: PUSH HL PUSH BC CALL CONIN CP 27 JR Z,AUTO20 CP 08H JR Z,AUTO30 PUSH AF LD HL,AUTO15 PUSH HL CP 0DH JP Z,PRINCR CP 0AH JP Z,PRINLF POP HL LD C,A CALL CONOUT AUTO15: POP AF POP BC POP HL INC C CP 41H JR C,AUTO17 CP 7EH JR NC,AUTO17 AND 01011111B AUTO17: LD (HL),A INC HL JP AUTO10 AUTO20: POP BC POP HL XOR A LD (HSTBUF+4),A LD A,C LD (HSTBUF+80+80H),A JP CONF01 AUTO30: LD C,A CALL CONOUT POP BC POP HL DEC C DEC HL JR AUTO10 TXT9: DEFB 27,'*',0AH,0AH DEFM 'Indtast navn for det program, som skal' DEFB 0DH,0AH DEFM 'starte automatisk efter indlæsning af CP/M.' DEFB 0DH,0AH,0AH DEFM 'Afslut med tryk på "ESC" tasten' DEFB 0DH,0AH DEFM '?' DEFB 0 SLETIN: LD A,0E5H LD HL,HSTBUF LD DE,HSTBUF+1 LD BC,511 LD (HL),A LDIR JP CONF01 TASBUF: LD HL,TXT10 CALL OUTTX CALL CONIN PUSH AF LD C,A CALL CONOUT POP AF AND 01011111B CP 'J' JP NZ,TASB10 LD A,0FFH JR TASB20 TASB10: CP 'N' JR NZ,TASBUF XOR A TASB20: LD (TASTBU),A LD (HSTBUF+5),A JP CONF01 TXT10: DEFB 27,'*',0AH DEFM 'Skal tastaturbuffer være aktiv (J/N) ? ' DEFB 0 ESCb: LD A,(ESCBUF+3) CP 'N' JR NZ,ESCb10 LD A,00010100B OUT (DARTAC),A LD A,01001100B OUT (DARTAC),A JP CON900 ESCb10: CP 'U' JR NZ,ESCb20 LD A,00010100B OUT (DARTAC),A LD A,01001101B OUT (DARTAC),A JP CON900 ESCb20: CP 'L' JR NZ,ESCb30 LD A,00010100B OUT (DARTAC),A LD A,01001111B OUT (DARTAC),A JP CON900 ESCb30: CP 'O' JR NZ,ESCb40 LD A,00010011B ; REG 3 OUT (DARTAC),A LD A,11000001B ; DATA FOR 3 OUT (DARTAC),A LD A,00010101B ; REG 5 OUT (DARTAC),A LD A,11101010B ; DATA FOR 5 OUT (DARTAC),A JP CON900 ESCb40: CP 'S' JR NZ,ESCb50 LD A,00010011B ; REG 3 OUT (DARTAC),A LD A,01000001B OUT (DARTAC),A LD A,00010101B OUT (DARTAC),A LD A,10101010B OUT (DARTAC),A JP CON900 ESCb50: CP '0' JR NZ,ESCb60 LD A,00101000B LD (BUSYLI),A JP CON900 ESCb60: CP '1' JR NZ,ESCb70 XOR A LD (BUSYLI),A JP CON900 ESCb70: LD HL,BAUDTA LD A,(ESCBUF+3) CP 10 JP NC,CON900 ADD A,A LD C,A LD B,0 ADD HL,BC LD A,00110100B OUT (BAUDC),A LD A,(HL) OUT (BAUD0),A INC HL LD A,(HL) OUT (BAUD0),A JP CON900 ; ; CONSTANTS FOR BAUD RATE DIVIDER ; ; BASED ON THAT THE DART DIVIDES BY 16 ; BAUDTA: DEFW 1 ; 125000 BAUD := 0 DEFW 2 ; 62500 BAUD := 1 DEFW 7 ; 19200 BAUD := 2 DEFW 13 ; 9600 BAUD := 3 DEFW 26 ; 4800 BAUD := 4 DEFW 52 ; 2400 BAUD := 5 DEFW 104 ; 1200 BAUD := 6 DEFW 208 ; 600 BAUD := 7 DEFW 416 ; 300 BAUD := 8 DEFW 1136 ; 110 BAUD := 9 CTCINI: LD HL,CTCINT+OFFSET LD (INTCTC),HL LD A,11010101B ; MODE WORD FOR CTC 0 OUT (CTC0),A LD A,55 ; COUNTER VALUE OUT (CTC0),A LD HL,INTCTC LD A,L AND 11111000B ; SET INT VECTOR OUT (CTC0),A LD HL,KEYINT+OFFSET LD (INTCTC+2),HL XOR A LD (SECOND),A LD (MINUTE),A LD (HOUR),A LD (DAY),A LD (MONTH),A LD (YEAR),A LD (MOTORF),A LD (VISF),A LD A,20 LD (MOTOR1),A RET DARINI: LD A,00110100B OUT (BAUDC),A LD HL,104 ; DEFAULT 1200 BAUD FOR SERIAL LD A,L ; CHANNEL OUT (BAUD0),A LD A,H OUT (BAUD0),A LD A,01110100B OUT (BAUDC),A LD HL,104 ; DEFAULT 1200 BAUD FOR TAPE LD A,L ; CHANNEL OUT (BAUD1),A LD A,H OUT (BAUD1),A LD A,10110110B OUT (BAUDC),A LD HL,416 ; 4800 HZ FOR TAPE CHANNEL LD A,L OUT (BAUD2),A LD A,H OUT (BAUD2),A LD C,DARTAC LD A,00011000B ; REG 0 OUT (C),A LD A,00010100B ; REG 4 OUT (C),A LD A,01001100B ; DATA FOR REG 4 OUT (C),A LD A,00010011B ; REG 3 OUT (C),A LD A,11000001B ; DATA FOR REG 3 OUT (C),A LD A,00010101B ; REG 5 OUT (C),A LD A,11101010B ; DATA FOR REG 5 OUT (C),A LD A,00101000B LD (BUSYLI),A RET PIOINI: LD A,1H LD (MODE),A XOR A LD (PRINTE),A ; SELECT TAXAN PRINTER LD HL,CONINT+OFFSET ; INITIATE PIO LD (INTPIO),HL ; SET UP INTERRUPT LD HL,INTPIO ; GET LOW BYTE LD A,L ; MOVE IT TO A OUT (KBPIOC),A ; PLACE IN PIO LD HL,SCRCLR+OFFSET LD (INTPIO+2),HL LD HL,INTPIO+2 LD A,L OUT (PIOBC),A LD A,0CFH ; A:=11001111B OUT (KBPIOC),A ; SET MODE 3 IN CHANNEL A LD A,0FFH ; I/O CONTROL WORD ; ALL BITS IN CHANNEL A OUT (KBPIOC),A ; SET TO INPUT LD A,00010111B ; INTERRUPT CONTROL WORD ; SET: NO INTERRUPT BIT 7=0 ; INTERRUPT ON OR BIT 6=0 ; ACTIVE LEVEL LOW BIT 5=0 ; MASK FOLLOWS BIT 4=1 OUT (KBPIOC),A ; BIT 0-3 IDENTIFIERS LD A,11000001B ; MASK CONTROL WORD OUT (KBPIOC),A ; BIT 1-5 ACTIVE IN INTERRUPT LD A,10000011B ; ENABLE INTERRUPT BIT 7=1 OUT (KBPIOC),A LD A,4 LD (KEYCO1),A LD A,07 ; PROGRAM 8910 OUT (KB89A),A ; SET REGISTER 7 LD A,0C0H ; ENABLE I/O CHANNALS A AND B OUT (KB89D),A ; TO OUTPUT LD A,0EH ; SET REGISTER 14 OUT (KB89A),A XOR A ; SET ALL OUTPUTS TO 0 OUT (KB89D),A LD A,0FH ; SET REGISTER 15 OUT (KB89A),A XOR A ; SET ALL OUTPUTS TO 0 OUT (KB89D),A LD A,0CFH ; PROGRAM CHANNEL B IN PIO OUT (PIOBC),A ; TO BIT MODE LD A,0FDH ; 11111101B OUT (PIOBC),A ; ALL LINES INPUT EXCEPT BIT 1 ; WHICH IS STROBE FOR PRINTER LD A,37H ; INTERRUPT CONTROL WORD OUT (PIOBC),A ; INTERRUPT DISABLED BIT 7=0 ; INTERRUPT ON OR BIT 6=0 ; ACTIVE LEVEL HIGH BIT 5=1 ; MASK FOLLOWS BIT 4=1 LD A,07FH ; INTERRUPT MASK OUT (PIOBC),A ; LINE 7 ONLY LD A,0FFH ; SET OUTPUT (BIT 1) OUT (PIOBD),A RET INTINI: LD HL,INTPIO LD A,H LD I,A IM 2 RET VALGPR: LD HL,TXT11 CALL OUTTX VALG05: CALL CONIN PUSH AF LD C,A CALL CONOUT POP AF CP 31H JR Z,VALG10 CP 32H JR Z,VALG10 LD HL,TXT11A CALL OUTTX JR VALG05 VALG10: SUB 31H LD (HSTBUF+9),A LD (PRINTE),A LD HL,TXT12 CALL OUTTX CALL CONIN SUB 30H LD (HSTBUF+11),A XOR A LD (HSTBUF+10),A JP CONF01 TXT11: DEFB 27,'*',0AH DEFM 'Der kan vælges mellem:' DEFB 0DH,0AH,0AH DEFM '1. TAXAN/EPSON' DEFB 0DH,0AH DEFM '2. OKI 82' DEFB 0AH TXT11A: DEFB 0DH,0AH DEFM 'Hvilken ønskes (1/2) ? ' DEFB 0 TXT12: DEFB 0DH,0AH,0AH DEFM 'Hvilken mode ? ' DEFB 0 STX EQU 02 ETX EQU 03 SO EQU 14 ESCHO: LD A,(ESCBUF+3) LD (MODE),A LD HL,STRENA ; SET CONDENSED MODE LD B,STRENB-STRENA ESCH1O: LD C,(HL) CALL DOLIST INC HL DJNZ ESCH1O LD A,(LINESPACE) ; SAVE LINESPACE PUSH AF LD A,8 LD (LINESPACE),A LD B,30 LD HL,(CRTSTA) ESCH3O: PUSH BC ; SAVE B (LINE COUNTER) PUSH HL ; save vidadr for part 2 PUSH HL ; SAVE ADDRESS IN VIDEO LD C,ETX ; SET GRAPHIC MODE CALL DOLIST LD A,(PIXHO1) LD B,A POP HL ; RECOVER ADDRESS IN VIDEO ESCH6O: 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 ESCH8O: PUSH BC ; SAVE BYTE COUNTER LD DE,VIDBUF ; GET DATA FROM VIDBUF LD B,8 ; NO OF BIT IN BYTE ESCH9O: LD A,(DE) ; GET DATA RLCA ; SHIFT LEFT LD (DE),A ; PUT IT BACK RR C ; MOVE CARRY TO C INC DE ; NEXT DJNZ ESCH9O ; LOOP LD (HL),C ; SAVE NEW DATA POP BC ; RECOVER BYTE COUNTER INC HL ; NEXT ADDRESS TO SAVE DJNZ ESCH8O ; LOOP LD HL,ESCBUF+3 ; NEW PLACE FOR DATA LD B,8 ; BYTE COUNTER ESCH1B: LD C,(HL) ; MOVE DATA TO C CALL DOLIST ; PRINT IT OUT LD A,(HL) ; IF BYTE=ETX CP ETX ; WRITE(LST:,BYTE); JR NZ,ESCH1A ; ENDIF LD C,A ; CALL DOLIST ; ESCH1A: INC HL ; NEXT DJNZ ESCH1B ; 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 ESCH6O ; LOOP FOR REST OF THE LINE LD C,ETX ; EXIT GRAPHIC MODE CALL DOLIST ; LD C,STX ; CALL DOLIST ; LD C,CR ; CARRIAGE RETURN CALL DOLIST ; LD C,ESC ; SKIP 14/144 '' CALL DOLIST ; LD C,'%' ; CALL DOLIST ; LD C,'9' ; CALL DOLIST ; LD C,0EH ; CALL DOLIST ; LD C,ETX ; SET GRAPHIC MODE CALL DOLIST ; POP HL ; PART 2 - get vidadr LD A,(PIXHO1) ; LD B,A ; AH6: 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 AH8: PUSH BC ; SAVE BYTE COUNTER LD DE,VIDBUF ; GET DATA FROM VIDBUF LD B,8 ; NO OF BIT IN BYTE AH9: LD A,(DE) ; GET DATA RLCA ; SHIFT LEFT LD (DE),A ; PUT IT BACK RR C ; MOVE CARRY TO C INC DE ; NEXT DJNZ AH9 ; LOOP RL C ; LD C,0 ; RL C ; LD (HL),C ; SAVE NEW DATA POP BC ; RECOVER BYTE COUNTER INC HL ; NEXT ADDRESS TO SAVE DJNZ AH8 ; LOOP LD HL,ESCBUF+3 ; NEW PLACE FOR DATA LD B,8 ; BYTE COUNTER AH10: LD C,(HL) ; MOVE DATA TO C CALL DOLIST ; PRINT IT OUT LD A,(HL) ; IF BYTE=ETX CP ETX ; WRITE(LST:,BYTE); JR NZ,AH1A ; ENDIF LD C,A ; CALL DOLIST ; AH1A: INC HL ; NEXT DJNZ AH10 ; 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 AH6 ; LOOP FOR REST OF THE LINE PUSH HL ; SAVE ADDRESS IN VIDEO LD C,ETX ; EXIT GRAPHIC MODE CALL DOLIST ; LD C,STX ; CALL DOLIST ; LD C,CR ; CARRIAGE RETURN CALL DOLIST ; LD C,ESC ; CALL DOLIST ; LD C,'%' ; CALL DOLIST ; LD C,'9' ; CALL DOLIST ; LD C,02H ; CALL DOLIST ; LD B,6 ; LD DE,(PIXHO1) ; LD HL,0 AH15: ADD HL,DE DJNZ AH15 EX DE,HL POP HL ADD HL,DE POP BC ; RECOVER LINE COUNTER DEC B ; JP NZ,ESCH3O ; ;DJNZ ESCH3 ; PART 2 finished POP AF ; RESTORE LINESPACE LD (LINESPACE),A ; RESTORE LINESPACE LD C,CR CALL DOLIST LD C,30 ;NORMAL MODE CALL DOLIST ; LD C,CR CALL DOLIST LD C,LF CALL DOLIST POP AF LD (VISF),A JP CON900 ; STRENA: DEFB 29 ;condensed mode DEFB CR DEFB LF STRENB: DOLIST: JP LIST FUNCST: DEFM 'COMAL-80' DEFB 8DH ; RETURN WITH BIT 7 = 1 DEFM 'COMAL80S' DEFB 8DH DEFM 'RUN' DEFB 8DH DEFB 80H DEFB 80H DEFB 80H DEFB 80H DEFB 80H DEFB 80H DEFB 80H DEFB 80H DEFB 80H DEFB 80H DEFB 80H DEFB 80H DEFB 80H FUNCS1: ▶04◀▶04◀ ▶ff◀▶04◀▶04◀H FUNCS1: ▶ff◀▶04◀▶04◀: ▶ff◀▶04◀▶04◀S1: ▶ff◀«eof»