Zj;************************;*** BIOS FUER NASCOM ***;************************; V 19/ 19.23 / 02.12.84; I/O-Routinen :; Constantin Olbrich; 20.06.84 / 24.08.84;; Floppy-Routinen :; Martin Homuth; 17.07.84;; RAM Disk Routinen:; Constantin OlbrichcYj; 18.08.84 /19.08.84;BIAS#A000 ; Fuer 60K SystemCCP#3400+BIASBDOSCCP+#806BIOSCCP+#1600;CPMBCCP;PGEADR#FF ; PAGE PORT ADRESSPPORT#FE; EPROM PORT ADRESSNASCPM7 ; NAS/CPM BITBTACT4; BOOT ACTIVE BIT, 0=BOOTBLKVAL#FF ; NUMBER OF CONIN CAXjLL'S; FOR BLINKINGCURSYM#5F ; CURSOR SYMBOL;;; Diese Sprungtabelle benutzt CP/M; --------------------------------;BIOS;BOOT ;00 COLD BOOTWBOOT;03 WARM BOOTCONST;06 CONSOLE STATUSCONIN;09 INPUT CONSOLECONOUT ;0C CONSOLE OUTPUTLISTWj ;0F PRINTER OUTPUTPUNCH;12 PUNCH (MODEM) OUTPUTREADER ;15 READER (MODEM) INPUTHOME ;18 SELEKT. LW NACH SPUR 0SELDSK ;1B SELEKTIERE LAUFWERKSETTRK ;1E SETZE SPURNUMMER AUS CSETSEC ;21 SETZE SEKTOR AUS CSETDMA ;24 SETZE DMA ADRESS AUS BCREADVj ;27 LIES SEKTOR (A=0=OK)WRITE;2A SCHREIB SEKTOR (A=0=OK)LISTST ;2D LIEFERT DRUCKERSTATUSSECTRN ;30 SEKTOR VERSCHACHTELUNGCURPOS ;33 POSITIONIERE CURSOR (HL);; *** BIOS SYSTEMROUTINEN ***; ---------------------------;CHR1; ZEICHEN VOM KBDKBDUjST0 ; KBD STATUSSTACK2; STACK SAVECURSET1 ; FLAG FOR CURSOR BLINKCHRB1 ; BUFFER FOR CHR UNDER CURSORBLKCNT1 ; BLINK COUNT VARIABLE;-----------------------------------------TRUE-1 ; TRUE FLAG;-----------------------------------------IN#62 ; NTjASSYSROUT#30 ;"PRS#28 ;"ZSROUT#6F ;"ZBLINK#7B ;"ZSRLIN#70 ;"ZCRT#65 ;"CURSOR#0C29 ; CURSOR ADRESSSCAL#DF ; RST 18H;-----------------------------------------BIOSP#F780 ; SP FOR BIOSPRTST#1C ; PRINTER STATUS ADRESSPRTDAT#1D ; PRINTER DSjATA ADRESSSTROBE#10 ; MASK FOR STROBE BUSY7 ; BUSY BIT 7 PRTON5 ; POWER ON/OFF BIT 5 BELMSK#20 ; BEEP MASK BIT 5;----------------------------------------CR#0D ; CONTROL CODES:LF#0AESC#1BBELL#07;-------------------IRj---------------------QCMBUF#0D00 ; COMMON RAM CP/M SEKTOR; FOR RAM DISKCOMRAM#0C80 ; BEGIN COMMON RAM AEREA; FOR RAM DISK PROCEDURES;----------------------------------------LAUFW#0004 ; CP/M DEFAULT/LOGGED IN; DRIVE;; PROCEDURE NASON:; --eQj--------------; input : -; output: -; destroy: F; NASON schaltet die nonstandard ECB (19a); Ltg NAS/CPM auf NAS active = low.;NASONނ,PGEADRׁ,NASCPM,棁;; PROCEDURE NASOFF; ----------------;; input : -; output: -; destroy: -; <PjNASOFF setzt NAS/CPM Bit auf CPM; aktive = high;NASOFFނ,PGEADRׁ,NASCPM,棁;; INIT ALL I/O DEVICES; --------------------;INISYSDUMMYޝINTTABިީ2ޝIOTAB1PROGIO ; PRINTER INIT;CALL LISTST ; PRINTER READY ?;OR AOj;JR NZ,PNRDY ; IGNORE ESCAPE SEQUENCE IF; NOT READYނ,ESC ; ESCAPE SEQUENZENLIST; DES DRUCKERSނ,#1C ; 132 ZEICHEN, LINKER RANDLIST; "ނ,ESC ;LIST;ނ,#11 ;LIST;PNRDYޝIOTAB2PROGIO;; PROGRAM I/O; -----------;PROGIOނ, ; GET NjPORT ADRESSҌި ; GET DATA BYTE TO SEND TOށ, ; PORT CҌ; B OR C=0 ? => END棁 ; SEND BYTEPROGIO;;; IOTAB1 : PRINTER INITIALISATION; -------------------------------;IOTAB1#1E,#FF,#1E,#E0#1E,#07,#1F,#0F#1C,#13,#1D,#00;DEFB #3F,#C7'Mj,#3F,#01 ; CTC INIT;DEFB CTC0-INTTAB0,0;;;IOTAB2:FDC - INIT (NORMALLY ALREADY DONE);-----------------------------------------;IOTAB2#11,#CF,#13,#CF#11,#C0,#13,#F0#10,#08,#10,LWCODA ; DEFAULT LW#0C,#D0,#10,LWCODA0,0;;; PROCEDURE WBOOT;Lj ---------------; WBOOT liest CP/M von D400 bis EA00; von der Eprom- Port Karte;WBOOTޜBIOSPNASOFF ; CPM EINLDCPMި(LAUFW)02 ; DRIVE Cو,OTHERSOTHERS(LAUFW), ; last logged in driveGOCPM;; LOAD CCP, BDOS FROM EPROM;-------------------Kj-------;;LDCPMޝCCPޟ#0A16 ; PROM #0A, #16*256 BYTEޞPPORT棃PPRT1ʄْ,PPRT1检ި01 ; FUER 48 ZEICHEN(#D8B2), ; NUR 2 SPALTEN IN 'DIR';;BOOTޜBIOSPNASONޝ#45ED ; IGNORE NMI'S(#C7D),LDCPM ; LOAD CCP,BDOSPRS#0C"NASCOM - CH JjP/M 2.2 60K"CR,0NASOFFޜ#0080ޝ#45ED ; IGNORE NMI'S ON ZERO PAGE(#0066),CMCOP ; COP RAM DISK PROC INTO CMRAM ; DEFAULT DRIVE A(LAUFW),ނ,;;GOCPMޞ#0080SETDMAި#C3(#0000),ޝBIOS+3(#0001),(#0005),ޝBDOS(#0006),(#0038)!Ij,(#0039),ި(LAUFW) ; Last logged in Diskނ,ޝ#45ED(#0066), ; IGNORE NMIINISYS ; INIT ALL I/O DEVICES(VDUFLG),; RESET VIDEO FLAGSCPMB;;;;; PROCEDURE CONST:; ----------------;; input : -; output: A=0 nicht bereit; A=-1 bere"Hjit (Zeichen ist da); destroy: AF;; 'CONST' = CONSOLE STAUTUS; prueft den Status der Konsole;CONST(STACK),; SAVE SPޜBIOSP ; AND DEFINE NEW SPNASON ; SET NAS MODESCAL,IN ; SCAN INPUTق,CONST9 ; JP IF CHRޝBLKCNT ; BLINK COUNTʖْ,NOT#GjFNDޥBLKVAL ; NUMBER OF CALLS FOR BLKCURTSTو,NOTFNDޝCURSETޥ-1 ; SET CURSET FLAGޝ(CURSOR)ި ; SAVE CHR UNDER CURSOR(CHRB),ިCURSYM ; AND STORE USER DEF. CURSORޥ ; SYMBOLNOTFND ; CLEAR ACONST8(KBDST), ; SAVE KBD STATUSNASOFF &$Fj; SET CP/M MODEޜ(STACK); RESTORE STACKCONST9(CHR), ; SAVE CHRިTRUE ; TRUE FLAGCONST8;; CURSOR TEST < FOR BLINKING AT CONIN >; -------------------------------------;; OUTPUT : Z = CURSOR SYMBOL WAS ON SCREEN; NZ= " " NOT " "CURT%EjSTޝCURSET ; FLAG CURSOR SET ?Җْ,NOTSETޝ(CURSOR)ި(CHRB)ޥCURT9NOTSETޥ0 ; RESET CURSOR FLAGCURT9;;; PROCEDURE CONIN; ---------------;; input : -; output: A = CHR FROM KBD; destroy: AF;CONINި(KBDST)و,CONIN1(KBDST),F&Djި(CHR);CONIN1NASONCURTST ; RESET CURSORSYM IF THERSCAL,ZBLINKNASOFF(CHR),;; PROCEDURE CONOUT; ----------------;; input : C = chr for console; output: -; destroy: AF; 'CONOUT' gibt das im C Register stehende; Zeichen auf den'Cj Bildschirm aus;CONOUT(STACK),ޜBIOSPNASONCURTST ; RESET CURSYM IF THEREި#7FBELLو,BEEPCRْ,NOCRިLFPRTCHRNOCRLFْ,PRTCHRިCRPRTCHRCRT ; oderRST ROUTCONO9NASOFFޜ(STACK);; BEEP : (ASCII BELL 07 ); ----------------------1(Bj-;BEEPށ,200BEEP1ށ,120$ިBELMSK#53BEEP1CONO9;;; PROCEDURE LIST; --------------;; input : C = chr for printer; output: -; destroy: AF; LIST gibt das im Register C stehende; Zeichen auf die Drckerschnittstelle aus;LISTި)AjCRْ,LIST0ިLFLIST0ިCRLIST0LFو,NOLISTר(PRTST)PRTON,,PRTERRLIST1ר(PRTST)BUSY,ْ,LIST1(PRTDAT),ި0(PRTST),LIST2ʀْ,LIST2ިSTROBE(PRTST),NOLIST;; PROCEDURE PRTERR; ---------------; input : -;O*@j output: -; destroy: AF; PRTERR gibt eine Fehlermelung auf der; Konsole aus;PRTERRCURTST ; RESET CURSYM IF SETޟPRTMSGނ,09 ; BDOS CALL : PRINT STRINGBDOS;PRTMSG"Printer not ready$";;; PROCEDURE LISTST; ----------------;; input : -; out+?jput: A=0 => List device aktive; A<>0 => not ready; destroy: AF;; LISTST prueft den Status des List device;LISTSTר(PRTST)PRTON,و,NOTRDYר(PRTST)BUSY,ْ,NOTRDY1NOTRDYPRTERRNOTRDY1ި-1;; PROCEDURE PUNCH; ---------------;,>j; input : C = chr for punch device; output: -; destroy: AF; PUNCH gibt ein Zeichen in C auf das; cassettenmodem aus;PUNCH(STACK),ޜBIOSPNASONިSCAL,ZSROUTNASOFFޜ(STACK);; PROCEDURE READER; ----------------;; input : -; output: A -=j= chr from reader device; destroy: AF; READER liest ein Zechen vom CAS modem;READER(STACK),ޜBIOSPNASONREADR1SCAL,ZSRLINٓ,READR1NASOFFޜ(STACK);;;; PROCEDURE CURPOS; ----------------;; POS CURSOR AUF ZEILE L, SPALTE H; 0,0 IST LINd. CY , CY:Ready؂,READR; bit6 -> CY , CY:Data requestؓ,READWREADWREADRר(FDCSTA);-----------------------------------------;; WRITE schreibt 64j128 Byte, beginnend; bei (IOD) in den durch (IOT) und (IOS); adressierten Sektor. Es finden max.; 10 Versuche statt.;; INPUT : -; OUTPUT: A = 0 : Ok; DESTROY : AF;WRITEި(LAUFW)02 ; RAM DISK ?؈,RDWRITSEEK ; positionierenר(FDCSTA)6,73j ; Writeprotect ?ْ,WRTPROޝ(IOD)ށ,10 ; 10 VersucheWRETRYWRITE1 ; Schreibe einmal ; Ok ?و,OKWRITWRETRYOKWRIT;WRITE1ނ,FDCDATިFWRITE(FDCCMD),WRITEWר(FPIOAD); bit7 ->CY , CY:READY؂,WRITER; bit6 ->CY , CY:Data req82juestؓ,WRITEWWRITEWWRITERר(FDCSTA);WRTPROޜCCPNASONPRSCR"Writeprotected"CR,0WBOOT;-----------------------------------------; RAM DISK ROUTINEN:;-----------------------------------------;; BERECHNE AUS TRACK DIE PHYSIKALISC91jHE; 18 BIT ADRESSE DER RAM DISK; ------------------------------------;; INPUT : (IOT) : TRACK 00..29 FUER 60K; 00..59 FUER 120K; 00..89 FUER 180K; (IOS) : SEKTOR 00..15; OUTPUT : HL= RAM DISK ADRESS; C = RAM DISK PAGE 2..0;RDADRނ,3 ; FROM{:0j PAGE 3-1 BEGINި(IOT) ; TRACK ONLY 8 BIT !!DIV30ށ,ʂ30ٓ,DIV30; C= 2- (TRACK DIV 30); B= TRACK MOD 30ҁҁި ; A=2+(TRACK MOD 30) * 8ޅ,ކ,0ި(IOS) ; SEKTOR ONLY 8 BIT !!!; SHIFT SEKTOR RIGHT ; BIT 7 FROM CARRY (LSB SEKTO;/jR)ޅ, ; HL= RAM DISK ADRESS; C= PAGE;; -------------------------------------; COMMONMEMORY READ/WRITE ROUTINES; FOR RAM DISK.; THESE ROUTINES ARE IN THE COMMON; MEMORY LOCATIONS 0C80H..0D00H; -------------------------------------;;; COMM<.jON MEM READ SECTOR; ----------------------; INPUT : C = RAM DISK PAGE; HL = RAM DISK ADRESS; this procedure is in the common RAM !!!!;CMREADר(PGEADR) ; SAVE USER PAGEϛި(PGEADR), ; SET RAM DISK PAGEޟQCMBUF ; COMMON MEM BUFCMRD1ޞ128 ; =-jCP/M SEKTOR LENGTHϛ(PGEADR), ; RESTORE OLD PAGE;; COMMON MEMORY WRITE SEKTOR ROUTINE; ----------------------------------;; INPUT : C = RAM DISK PAGE; HL= RAM DISK ADRESS; this procedure is in the common RAM;CMWRITר(PGEADR) ; SAVE USd>,jER PAGEϛި(PGEADR),ϟ; DE= (IOD)ޝQCMBUFCMRD1;; CLEAR RAM DISK; --------------;; KANN HIER EINGETRAGEN WERDEN; FALLS DIES IN DAS BIOS GEHOERT !!!;;CMEND$ ; END OF COMMON RAM PROCEDURES;;-----------------------------------------; Ci?+jOPY COMMON RAM PROCEDURES INTO THIS RAM;-----------------------------------------;CMCOP(STACK),ޜBIOSPר(PGEADR) ; STORE USER PAGENASONޝCMREAD ; START OF PROC AEREAޟCOMRAM ; START OF COMMON RAM AEREAޞCMEND-CMREAD+1 ; LENGTH(PGEADR), ; R6@*jESTORE USER PAGEޜ(STACK);-----------------------------------------;; RAM DISK : READ SEKTOR; ----------------------; INPUT : (IOS),(IOT),(IOD); copy into (IOD)RDREAD(STACK),ޜBIOSPNASON ; COMMON RAM ACTIVERDADR ; GET PAGE , ADRQCMRD ; RA)jEAD SECTOR IN COMMON RAMM;LD HL,(IOD);LD DE,COMRAM;SCF;SBC HL,DE;ADD HL,DE ; CY= (IOD) < COMRAM (1000H);JR NC,NO2COPޝQCMBUF ; USE BIOS BUFFERޟRDBUF ; THEN COPY TOޞ128NASOFF ; PAGE 3 ZERO PAGE 0..0FFFޟ(IOD)ޝRDBUF ; FROM BIOS BUFFERޞ128EB(jRDRETޜ(STACK) ; OK;; NO 2nd COPY NECESSARYNO2COPޟ(IOD) ; COPY FROM QCMBUFޝQCMBUF ; INTO RAM LOCATION'Sޞ128 ; 1000..FFFFPAGE 3NASOFF ; CP/M ACTIVERDRET;;; RAM DISK PROCEDURE : WRITE SECTOR; ---------------------------------;RDWRnC'jIT(STACK),ޜBIOSPޝ(IOD)ޟCOMRAMٓ,WR1COPޟRDBUFޞ128NASONޝRDBUFRDWR1ޟQCMBUFޞ128RDADRQCMWRNASOFFޜ(STACK) ; OK;WR1COPNASONRDWR1;--------------------------------------;;;; SEEK positioniert LW auf (IOT);D&j und wartet bis LW ready;; INPUT : -; OUTPUT: A = 0 : Ok; DESTROY : AF;SEEKר(FDCSTA)7, ; Z:ready,DELAY ; 0.5 s wartenר(FDCSTA)7, ; jetzt ready ?ْ,DNTRDYި(IOS)(FDCSEK), ; Sektor festlegenި(IOT)(FDCDAT),ިFSEEK(FDCCMD),POSWE%jר(FPIOAD); bit7 -> CY , CY:READYؓ,POSWר(FDCSTA) ; TEST;DNTRDYޜCCPNASONPRSCR'Disk not ready'CR,0SCAL,#5B;-----------------------------------------;; HOME positioniert auf Spur 0HOMEި(LAUFW)02 ; RAM DISK ?و,HOME9ިFHOMEF$j(FDCCMD),HOMEWר(FPIOAD); bit7 -> CY , CY:READYؓ,HOMEWר(FDCSTA)2,و,HOMERRHOME9;HOMERRޜCCPNASONPRSCR'Bios - Home - Error'CR,0SCAL,#5B;;-----------------------------------------; DELAY wartet 0.5 sDELAYނ,250CDELAYG#jCDELAYCDELAY;-----------------------------------------; CDELAY wartet C*1msCDELAYDELAY1ށ,100DELAY2ʁؒ,DELAY2ʂؒ,DELAY1;-----------------------------------------; PROCEDURE SELDSK; ----------------; input: 0H"jC = drive number 00..xx; output: HL= 0, CY=0 error wrong drive; HL= adr of disk parameter block; destroy: -; SELDSK selektiert das in C stehende driv;SELDSKޝ0ި ; LW A ?و,SELA;CP 01 ; LW B ?;JR Z,SELB; HIER WEITERE LAUFWERKE02 ; LW CI!j ? و,SELCNODISK ; CY=0 ; Nicht vorhanden(LAUFW),;SELAOLDTRK ; ALTEN TRACK RETTENިLWCODA(FPIOAD),ި(TRKA) ; LW SCHON ANGESPROCHEN ?ْ,SELA1 ; JAHOME ; NEIN, INITIALISIERENSELA1(FDCTRK), ; TRK AKTUALISIERENޝDPEA ; PJ jARAMETERBLOCK UEBERGEBEN;SELBOLDTRK ; ALTEN TRACK RETTENިLWCODB(FPIOAD),ި(TRKB) ; LW SCHON ANGESPROCHEN ?ْ,SELB1 ; JAHOME ; NEIN, INITIALISIERENSELB1(FDCTRK), ; TRK AKTUALISIEREN;LD HL,DPEB ; PARAMETERBLOCK UEBERGEBEN;SELC8KjOLDTRKޝDPECި(LAUFW),;;;;;-----------------------------------------; OLDTRK speichert Track des aktuellen; LW , damit er beim Selektieren nicht; verloren gehtOLDTRKި(LAUFW)ށ,ҁޝTRKA-1NEXTLWҌNEXTLWר(FDCTRK)ޥި4Lj ; Neues Lw(LAUFW),;;-----------------------------------------;; PROCEDURE SETTRK; ----------------;; input : C = tracknumber 0..76; output: -; destroy: -; SETTRK setzt den parameter track aus C;SETTRK;LD A,(LAUFW);CP 02 ; RAM DISK Mj?ި(IOT),;JR Z,NOFDC;OUT (FDCDAT),A;LD A,FSEEK;OUT (FDCCMD),ANOFDC;; PROCEDURE SETSEC; ----------------;; input : C = sector number 1..26; output: -; destoy: -; SETSEC setzt den paramter sector aus C;SETSEC;LD A,(LAUFW);CP 02 ; NjRAM DISK ?ި(IOS),;JR Z,NFDC;OUT (FDCSEK),ANFDC;; PROCDURE SETDMA; ---------------;; input : BC = transfer adress; output: -; destroy:-; SETDMA laed die transfer adresse BC;SETDMA(IOD),;; PROCEDURE SECTRN; ----------------;; Ojinput : DE = XLT or 0 if no translate; C = logical sector; output: A,HL,(IOS) = physical sector; destroy: -;SECTRNިو,NOTRANށ,0ϟި(IOS),ކ,SECT9NOTRANކ,ި(IOS),ޅ,0SECT9;; DISP PARAMETER BLOCK; --ePj------------------;; LAUFWERK A 8" SD IBM 3740DPEA$XLT000DIRBUFDPBCSVAALVA;;; DISK C PARAMETER BLOCK RAM-DISK;DPEC$0000DIRBUFDPBRCSVCALVC;; DISK PARAMETER BLOCK 8 ZOLL;;DPB$26 ; SEKTOREN / SPUR3; BLOCK SHQjIFT7; BLOCK MASK0; EXTENSION MASK242; DISK SIZE-163 ; DIRECTORY192; ALLOCATION VECTOR016 ; CHECK SIZE2; OFFSET AB SPUR 2;; DISK PARAMETER BLOCK LW B: DDDPBB$16+16 ; SEKTOREN / SPUR3 ; BLOCK SHIFT7 ; BLOCK MASK0 ; EXTENSION MASKRj160-1 ; DISK SIZE63 ; DIRECTORY192 ; ALLOCATION VEKTOR016 ; CHECK SIZE2 ; 2 SYSTEMSPUREN;;; DISK PARAMETER BLOCK RAM DISK;DPBR16; 16 SEKTOREN/TRACK3 ; BLOCK SHIFT7 ; BLOCK MASK0 ; EXTENSION MASK119; DISK SIZE-1 IN 1K31; DIRECTORYSj SIZE#80 ;AND ALLOCATION VECTOR0 ; "0 ; NO CHECK BECAUSE NOT REMOVABLE0 ; NO SYSTEM TRACKS RESERVED;XLT1,7,13,1925,5,11,1723,3,9,1521,2,8,1420,266,12,18,244,10,16,22;;TRKA0 ; TRACK LW ATRKB0 ; TRACK LW BTRKC0 ; TRACK LW C;;Tj; Workspace fuer Disk-routinen;IOT1 ; TRACKIOS1 ; SEKTORIOD2 ; DMAADR;CSVA16 ; CHECKALVA31 ; ALLOCATION VECTORCSVB16 ;ALVB31CSVC16ALVC31;DIRBUF128 ; DIRECTORY BUFFERRDBUF128 ; RAM DISK BUFFER IN; USER PAGE. USED IF (IOD) < COMRAMUj (1000);QCMRDCOMRAMQCMWRCOMRAM+CMWRIT-CMREAD;=========================================; NASSYS CRT DRIVER WITH DMA SUPPORT; ----------------------------------;; for original 48*16 Video Ram 800..BFF; and FDC Card (80 BUS JOURNAL).; Option: Sync;Vjhronisation Video <> CPU; with WAIT; Constantin Olbrich 27.7.84;; EQUATES; -------;CLS#0CBS #08CUL#11CH #17CCR#18CUU#13CUD#14CSL#15CSR#16CUR#12INSLIN#19 ; INSERT LINEDELLIN#1A ; DELETE LINESETCUR#1F ; SET CURSOR ROW,CULWj;VL1#080AVL15 #0B8ADMA#14 ;DMA ADRESSTIM#CD ;3 CYCLES;COLBIT1 ; VIDEO FLAGCURCMD0 ; VIDEO FLGCUROFF#30 ; OFFSET;;; wait funktion: Ltg WAIT an DMA !!!!; wenn Synchronisation CPU <-> VIDEO; laut Journal vorhanden;; DRIVER; ------;;XjCRT ; SAVE AFޝVDUFLGCOLBIT, ; COL ?ْ,STCOL ; NZ=SETCURCMD, ; CURSET CMDو,CRTA1 ; Z=NOT SETCURCMD, ; RES CMDCOLBIT, ; SET ROWBIT(ROWST), ; STORE ROWCRT2; STORE COLUMSTCOLCOLBIT,; RESET COLCUROFF ; - OFFSYjETޅ, ; COLި(ROWST)CUROFF ; - OFFSETކ,CURSR;CRTA1SETCUR ; SET CURS?ْ,CRTA2CURCMD, ; SET CMDBITCRT2 ; END SETCUR;;CRTA2LFو,CRT2INSLIN ;INSERT LIN؈,INSRTLDELLIN؈,DELETL;CLS ; CLEAR SCRNْ,CRT6; CLEAR TOP LZjINEޝVL1ޥ" "ނ,DMAޝTAB3ށ,TAB4-TAB3 ; FILL MARGINSށ,16 ; WITH 00ޝ#083ACR3ޥ0ҌCR3; COPY DOWN SCREEN ; SCROLL DOWNށ,TABEND+1-TAB4;HL TO LEFT SIDECRT0 CPOS; SAVE CURSORCRT1 (CURSOR),;; RETURNCRT2 ;;HL -[jTO CURSORCRT6 ޝ(CURSOR);BS ;BACKSPC?ْ,CRT14CRT8 ; IGNORE MARGINSCRT10ʌިو,CRT10CUL ;CURSOR LEFTو,CRT12ޥ" "CRT12CTSTCRT2CRT14CUL ;CURSOR LEFTو,CRT8;; HOME, ESCCH ;HOMEو,CRT0ESC ;ESCAPEْ,CRT20CLRLIN ; CLEA\jR LINCRT0;;NEW LINE, CCRCRT20CR ;CRو,CRT38CCRْ,CRT25CPOSو,CRT1CRT38;; CUU, CUDCRT25CUU ;CURSOR UPْ,CRT28ޟ-64CRT26CTSTCRT2CRT28CUD ;CURSOR DOWNْ,CRT29ޟ64CRT26;; CSL, CSRCRT29CSL ;CSLْ,CRT] j32CRT30Ҍިʌْ,CRT31ޥ" "CRT2CRT31ޥҌCRT30CRT32CSR ;CSRْ,CRT34ށ," "CRT33ިو,CRT2ޥށ,ҌCRT33;; TEST IF CURSOR ON SCREENCTST ޟVL1ޟVL15+48CT8CRT1;; CUR, OTHERSCRT34CUR ;CURو^ j,CRT36ޥ; IGNORE MARGINSCRT36Ҍިو,CRT36;; TEST NEED FOR CRޟVL15+64ْ,CT8;; DO NEW LINECRT38CPOSޟ64CTST;; SCROLL UPCRT40ނ,DMAޝTAB1ށ,TAB2-TAB1; CLEAR BOTTOM LINEި" "(#0B8A),ށ,TAB3-TAB2ޝVL15CT8;_ j;HL TO START OF LINECPOS ި#C0#0Aކ,;; TABLES; ------TAB1 #C3 ;RESET DMA#7D ;WR 0#084A ;VL2#0370 ; LENGTH#AD ;WR 4#080A ;VL1#54 ;WR 1TIM ;PORTA TIME#50 ;WR 2TIM ;PORTB TIME#92 ;WR5` j#CF ;LD STARTADR#B3 ;FORCE RDY#87 ;ENABLE DMA;; LOESCHE UNTERSTE ZEILETAB2 #C3,#7D#0B8A0046#AD#0B8B#54,TIM,#50,TIM#92,#CF,#B3,#87;; LOESCHE OBERSTE ZEILETAB3 #C3,#7D#080A0046#AD#080B#54,TIM,#50,TIM#92,#CF,#a jB3,#87;; COPIERE OBERSTE ZEILE NACH UNTENTAB4 #C3,#7D#080A#03B0#AD#084A#54,TIM,#50,TIM#92,#CF,#B3,#87TABEND $-1;; DMA TRANSFER : INCREMENT; ------------------------;IDMATR #C3,#7DISCRC0ILEN 0#ADIDEST0#54,TIM,#50,TIM#92,#bjCF,#B3,#87IDMATE $;; DMA TRANSFER : DECREMENT; ------------------------;;DDMATR#C3,#7DDSCRC #0B7F ; DEFAULT VIDEODLEN0#ADDDEST #0BBF ; DEFAULT VIDEO#44,TIM,#40,TIM#92,#CF,#B3,#87DDMATE$;;;;;; DMACOP : LDIR MIT DMA; ----------_cj------------;; INPUT : HL=SOURCE; DE=DESTINATION; BC=LENGTHDMALDI(ISCRC),(IDEST),(ILEN),ޝIDMATRށ,IDMATE-IDMATRނ,DMA;; DMA LDDR; --------DMALDD(DSCRC),(DDEST),DMALDV(DLEN),ޝDDMATRށ,DDMATE-DDMATRނ,DMA;;_dj; INSERT LINE AT CURSOR, CLEAR AKTUAL LINE; ----------------------------------------INSRTLޝ(CURSOR)CPOSޟ#0B7Fϟق,NOINSށ,ނ,DMALDVNOINSCLRLI1CRT0;; CLEAR ACTUAL LINE; -----------------; INPUT : HL= START OF LINE;CLRL$ejINCPOSCLRLI1ޥ" "ރ,ބ,Ҏޞ46DMALDI;;; DELETE LINE AT CURSOR; ---------------------DELETLޝ(CURSOR)CPOSϟޝ64 ; DE=START OF LIN, HL=NEXTޝ#0B7Fق,NODELށ,ނ,DMALDINODELޝ#0B8ACLRLINCRT0;;;;DfjVDUFLG 0 ; VIDEO FLAGSROWST 0 ; ROW STORE;; TEST KBD INT;KBDINTר(0)#20(0),;;;;;;;;;;;; Z80 IM 2 MODE INTERRUPT TABLE;------------------------------;#F600; SIO1 08..0BINTTABSIO1B0DUMMY ;term buff empty:CPUSIO1B1DUMgjMY ;extern/status changeSIO1B2DUMMY ;recieve chrSIO1B3DUMMY ;special recieve condSIO1A0DUMMY ;term buff emptySIO1A1DUMMY ;extern/status changeSIO1A2DUMMY ;recieve chrSIO1A3DUMMY ;special recieve cond.;PIO1ADUMMY ; casmon D=04, C=06PIO1BDUMhjMY ; empty D=05, C=07;DMA0DUMMY ;int on rdy :C=D=14DMA1DUMMY ;int on matchDMA2DUMMY ;int on end of blockDMA3DUMMY ;int on match & end of bl.;PIO2ADUMMY ; FDC D=10,C=11PIO2BDUMMY ; " D=12,C=13;SIO2B0DUMMY ; I/O : SIO2B D=32,C=33SIO2B1ijDUMMY ; "SIO2B2DUMMYSIO2B3DUMMYSIO2A0DUMMY ;SIO2A D=30,C=31SIO2A1DUMMYSIO2A2DUMMYSIO2A3DUMMY;PIO3ADUMMY ; D=34,C=35:I/OPIO3BDUMMY ; D=36,C=37PIO4ADUMMY ; D=38,C=39PIO4BDUMMY ; D=3A,C=3B;CTC0DUMMY ;channel 0 P=3C I/O:CTC1DUMMjZY ; " 1 P=3D 0,1=BAUDCTC2DUMMY ; " 2 P=3ECTC3KBDINT; " 3 P=3F 50 Hz;DUMMYJL