TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 1 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 ; ***************************************** ; * THE GSR MONITOR, VERSION III.8 * ; * REQUIRES SBC-880 CPU BOARD * ; * AND UFDC-1 FLOPPY DISK CONTROLLER * ; * PROVIDES FOR USE OF CT256K-1 * ; * DYNAMIC MEMORY BOARD * ; * PROVIDES MULTIPLE FORMAT CAPABILITY * ; * IBM COMPATIBLE FORMATS * ; * 8" OR 5 1/4" DISK * ; * SINGLE OR DOUBLE DENSITY * ; * SINGLE OR DOUBLE SIDE * ; * 128, 256, 512, OR 1024 BYTE SECTORS * ; * 1K, 2K, OR 4K ALLOCATION BLOCK SIZE * ; * VARIABLE SECTOR SKEW * ; * REQUIRES 2.2 CPM * ; * CONFIGURED FOR 60K OF RAM * ; * 2.2 CPM BIOS CONTAINED IN ROM AND * ; * DISK PARAMETERS ARE OBTAINED FROM * ; * TABLES ON DISK * ; * PRINT DRIVER FOR CENTRONIX PARALLEL * ; * INTERFACE AND CONSOLE DRIVER FOR * ; * 9600 BAUD TERMINAL ARE IN BIOS * ; * WRITTEN BY R. D. CATILLER * ; * COPYRIGHT 1983 (C) COMPUTIME & GSR * ; ***************************************** ; ; ; PATCH LOG ;------------------------------------------------------- ; ;CTVIII.2 - 9/19/82 ; FIRST RELEASE OF TESTED MONITOR ; ;CTVIII.3 - 10/13/82 ; BIOS VECTORS ARE NO LONGER AFFECTED ; DURING A WARM BOOT OF CPM. VERSION ; III.2 WOULD TRANSFER A COPY OF THE ; COLD START VECTORS DURING A WARM ; BOOT OPERATION. THIS VERSION WILL ; RETAIN THE VECTORS THAT WERE PRESENT ; AT THE TIME OF A WARM START. THIS ; ALLOWS THE MONITOR TO RUN PROPERLY ; WITH PROGRAMS THAT MODIFY THE BIOS ; VECTORS. ; ;CTVIII.4 - 11/ 4/82 ; ALLOWS DISKS TO START WITH SECTOR ADDRESS ; ZERO, (NORMALLY THE STARTING SECTOR ; ADDRESS IS ONE). THIS ALLOWS THE MONITOR ; TO HANDLE THE XEROX 820 KAYPRO II FORMATS. ; ;CTVIII.5 - 11/16/82 ; ALLOWS SIDE 1 OF DOUBLE SIDE DISKS TO ; HAVE SECTOR ADDRESSES THAT ARE LESS THAN TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 2 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 ; 128, (SECTOR ADDRESSES ON SIDE 1 ARE ; NORMALLY EXPECTED TO BE GREATER THAN 128). ; THIS ALLOWS THE MONITOR TO HANDLE ; CALLAN SYSTEM FORMATS. ; ;CTVIII.6 - 2/ 1/83 ; FIXED INTERMITTENT BDOS ERROR PROBLEM. ; PROBLEM WAS CAUSED BY DISK HEAD BEING ; ON UNEXPECTED TRACK WHEN CHANGING DISKS. ; VERSION III.5 WAS RESYNCHRONIZING TRACK ; REGISTER ON THE CONTROLLER BEFORE THE ; DISKNO WAS LOGGED ON. MOVED THE TRACK ; REGISTER SYNCHRONIZING CODE INTO THE ; END OF THE LOGDSK ROUTINE, (INSURES THE ; DISK IS LOGGED ON BEFORE SYNCHRONIZING ; OCCURS). ALSO PATCHED THE READ/WRITE ; RETRY CODE TO WRITE ALL 1'S TO THE LUNIT ; VALUE DURING RETRY OPERATIONS. THIS ; FORCES A RESYNCHRONIZATION BEFORE ; EACH RETRY OPERATION. ADDED THE PATCH ; LOG TO THE MONITOR SOURCE FILE. ; ;CTVIII.7 - 5-15-83 ; ADDED CAPABILITY TO HANDLE INVERTED DISK ; DATA AND NON-CYLINDER MODE DOUBLE SIDED ; DISKS. THESE TWO FEATURES PROVIDE ; COMPATIBILITY WITH THE SUPER BRAIN SYSTEM ; FORMATS. YOU MUST USE VERSION 6 OF THE ; FORMAT PROGRAM TO INITIALIZE THESE DISKS ; FOR USE ON THE SYSTEM, (PROGRAM NAME IS ; FMTIII6.COM). ; ADDED BIOS VECTORS AND EXTRA DRIVERS ; TO PROVIDE COMPATIBILITY WITH MP/M II.0. ; MOVED ALL JUMP VECTORS TO THE START ; OF THE MONITOR FOR EASY ACCES TO MONITOR ; ROUTINES FROM USER PROGRAMS. ; THE ADDED BIOS DRIVERS ; PROVIDE MEMORY MANAGEMENT FOR A FULLY ; LOADED CT256K RAM BOARD RUNNING ; UNDER MP/M. FIVE 48K MEMORY BANKS ; ARE AVAILABLE ALONG WITH 16K OF ; COMMON MEMORY WHEN RUNNING MP/M. ; THE MONITOR WILL NOW TRY TO AUTO-BOOT ; AT RESET AND POWER-ON. IF A DISK IS ; NOT PRESENT IN DRIVE A WITH A READABLE ; 2.2 CPM IMAGE, THE SYSTEM WILL BRANCH ; TO THE MONITOR. ; ALL DIAGNOSTICS ARE REMOVED FROM THE ; STANDARD MONITOR. ; A SEPERATE VERSION OF THE MONITOR WILL ; CONTAIN DIGNOSTIC ROUTINES. ; A ROUTINE HAS BEEN ADDED THAT WILL ALLOW ; THE MONITOR TO RUN FROM A PHANTOMED ; EPROM. THIS ADDITION IS COMPATIBLE WITH ; SYSTEMS THAT DO NOT HAVE A PHANTOM OPTION TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 3 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 ; AVAILABLE. THE ADDITIONAL ROUTINE WILL ; TRANSFER A COPY OF THE MONITOR CODE ; TO MEMORY PRIOR TO JUMPING TO THE CODE ; AND INVOKING THE PHANTOM OPTION. ; THE PHANTOM EPROM OPTION ON THE ; COMPUTIME/GSR Z80 CPU BOARD IS ENABLED ; BY CUTTING THE TRACE BETWEEN JUMPER ; PADS Q AND R. ; ADDED A DEFAULT DISK PARAMETER TABLE ; THAT IS INVOKED AT COLD START TIME IF ; THE DISK IN DRIVE A DOES NOT CONTAIN ; A VALID PARAMETER TABLE ON SECTOR 1 ; OF TRACK 0. THE DEFAULT TABLE IS FOR ; AN 8" SINGLE DENSITY, SINGLE SIDE DISK. ; A USER DISK PARAMETER TABLE HAS BEEN ; ADDED TO ALLOW READING DISKS THAT DO ; NOT HAVE PARAMETER TABLES ON SECTOR 1 ; OF TRACK 0. A USER FLAG MUST BE ACTIVATED ; BY STORING 0FFH AT ADRESS 0F480H AND ; THEN THE USER TABLE (AT ADDRESS 0F080H) ; MUST BE LOADED. A BDOS ; CALL (CALL TO ADDRESS 0005H) WITH THE ; C REGISTER = 0EH AND THE E REGISTER ; = THE SELECTED DISK (0 = DRIVE A, 1 = ; DRIVE B, 2 = DRIVE C, AND 3 = DRIVE D) ; WILL CAUSE THE SELECTED ; DISK TO BE LOGGED ON, AND THE USER TABLE ; WILL BE TRANSFERRED TO THAT DRIVES ; DISK PARAMETER BLOCK. ; THE SAME USER TABLE MAY BE TRANSFERRED TO ; MULTIPLE DRIVE TABLES BY SETTING THE USER ; FLAG (AT ADDRESS 0F480H) TO 0FFH AND ; REPEATING THE BDOS CALL. NOTE THAT THE ; BDOS CALL WILL RESET THE USER FLAG EACH ; TIME BUT WILL NOT DISTURB THE CONTENTS ; OF THE USER TABLES. ; ;CTVIII.8 - 10/22/83 ; FIXED A PROBLEM WITH THE WARM BOOT ROUTINE. ; THE CPM JUMP VECTORS AT THE BEGINNING OF MEMORY ; WERE NOT BEING RESTORED DURING A WARM BOOT ; OPERATION. THEY WILL NOW BE PROPERLY RESTORED. ; ; .PHEX .XLINK .PABS ; ; MEMORY USED BY MONITOR ; F800 BASE = 0F800H ;MONITOR BASE ADDRESS. F7FF STACK = BASE-1 ;MONITOR STACK ; ; CONSTANTS FOR MONITOR ; TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 4 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 000D CR = 0DH ;ASCII CARRIAGE RET 000A LF = 0AH ;ASCII LINE FEED ; ; I/O PORTS ON CPU BOARD ; 0028 T0 = 028H 0029 T1 = T0+1 002A T2 = T0+2 002B TCTL = T0+3 002C INOUT = T0+4 002E CONDTA = T0+6 002F CONCTL = T0+7 002F CONSTS = CONCTL ; ; ; I/O PORTS ON CT256K MEMORY BOARD ; 0088 MAP0 = 88H ;MEMORY MAP REGISTERS 0089 MAP1 = 89H 008A MAP2 = 8AH 008B MAP3 = 8BH 0088 MEMSTS = 88H ;MEMORY STATUS PORT ; ; ; DISK DEFINES ; 0016 VERS = 22 ;CP/M VERSION NUMBER 003C MSIZE = 60 ;CP/M MEMORY SIZE A000 BIAS = (MSIZE-20)*1024 D400 CCP = 3400H+BIAS ;BASE OF CCP DC06 BDOS = CCP+806H ;BASE OF BDOS EA00 BIOS = CCP+1600H ;BASE OF BIOS 0000 WRALL = 0 ;WRT TO ALOC BLK 0001 WRDIR = 1 ;WRT TO DIRECTORY 0002 WRUAL = 2 ;WRT TO UNALOC BLK EA03 WBOOTE = BIOS+3 ;WARM BOOT ENTRY ; ; ;DISK I/O PORTS ; 009C DSTAT = 9CH ;DISK STATUS PORT 009C DCMMD = DSTAT ;DISK COMMAND PORT 009D DTRCK = DSTAT+1 ;DISK TRACK PORT 009E DSCTR = DSTAT+2 ;DISK SECTOR PORT 009F DDATA = DSTAT+3 ;DISK DATA PORT 009B DFLAG = 9BH ;STATUS REGISTER 1 009B DCNTL = DFLAG ;CONTROL REGISTER 1 ; ; ;MEMORY USED BY CPM ; 0004 CURDSK = 4 ;CURRENT DISK DRIVE 0080 TBUF = 80H ;DEFAULT CPM BUFFER ; ; TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 5 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 ; PROGRAM CODE BEGINS: ; F800 .LOC BASE ; ; ;MONITOR BIOS JUMP VECTORS ; ; ; THE FOLLOWING CODE TRANSFERS A COPY OF THE ; MONITOR INTO RAM AND THEN PHANTOMS THE EPROM ; THAT ORIGINALLY CONTAINED THE CODE. ; ; F800 21 000B LXI H,BIOSCD-BASE ;START OF CODE F803 11 F80B LXI D,BIOSCD ;DESTINATION FOR CODE F806 01 07F4 LXI B,0FFFFH-BIOSCD ;LEGNTH OF CODE F809 EDB0 LDIR ;MOVE CODE ; ; THE JUMP INSTRUCTION FOLLOWING THIS CODE ; WILL CAUSE THE EPROM TO BE PHANTOMED AND ; THE MONITOR WILL BEGIN EXECUTING FROM RAM. ; F80B C3 F941 BIOSCD: JMP BOOT ;COLD BOOT F80E C3 F990 JMP WBOOT ;WARM BOOT F811 C3 F8D4 JMP CSTS ;CONSOLE STATUS F814 C3 F90F JMP CI ;CONSOLE INPUT F817 C3 F8B8 JMP CO ;CONSOLE OUTPUT F81A C3 F91A JMP PRINT ;LIST DEVICE F81D C3 F8B8 JMP CO ;PUNCH DEVICE F820 C3 F90F JMP CI ;READER DEVICE F823 C3 FC0D JMP HOME ;MOVE HEAD TO TRK 0 F826 C3 FAD9 JMP SELDSK ;SELECT DISK F829 C3 FBCF JMP SETTRK ;SET TRACK NUMBER F82C C3 FBD4 JMP SETSEC ;SET SECTOR NUMBER F82F C3 FC08 JMP SETDMA ;SET DMA ADDRESS F832 C3 FC16 JMP HREAD ;READ DISK F835 C3 FC22 JMP HWRITE ;WRITE DISK F838 C3 F92E JMP PSTS ;LIST STATUS F83B C3 FBD9 JMP SECTRN ;SECTOR TRANSLATE ; ; THE FOLLOWING VECTORS ARE USED BY MP/M ; F83E C3 F856 JMP SELMEM ;MEMORY BANK SELECT F841 C3 F857 JMP POLDEV ;DEVICE POLLING ROUTINE F844 C3 F874 JMP STRTCK ;START SYSTEM CLOCK F847 C3 F875 JMP STOPCK ;STOP SYSTEM CLOCK F84A C3 F876 JMP EXITRG ;EXIT REGION ROUTINE F84D C3 F877 JMP MAXCON ;MAX CONSOLE ROUTINE F850 C3 F87A JMP SYSINT ;SYSTEM INITIALIZE F853 000000 .BYTE 0,0,0 ;USE MP/M IDLE PROC 004B BCDL = .-BIOSCD ; ; MP/M BIOS ROUTINES ; F856 C9 SELMEM: RET TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 6 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 ; F857 79 POLDEV: MOV A,C F858 FE02 CPI 2 ;BAD DEVICE #? F85A 3802 JRC DEVOK ;GOOD DEVICE # F85C 3E02 MVI A,2 ;BAD DEVICE # F85E CD F869 DEVOK: CALL TBLJMP ;JUMP TO POLL ROUTINE F861 F92E DEVTBL: .WORD PSTS ;POLL PRINTER F863 F8D4 .WORD CSTS ;POLL CONSOLE F865 F867 .WORD RTNEMP ;BAD DEVICE # F867 AF RTNEMP: XRA A F868 C9 RET F869 87 TBLJMP: ADD A ;DOUBLE TABLE INDEX F86A E1 POP H ;RET ADR = TBL ADR F86B 5F MOV E,A ;ADD INDEX F86C 1600 MVI D,0 F86E 19 DAD D F86F 5E MOV E,M ;GET ADR OF ROUTINE F870 23 INX H F871 56 MOV D,M F872 EB XCHG F873 E9 PCHL ;JUMP TO ROUTINE ; F874 C9 STRTCK: RET ; F875 C9 STOPCK: RET ; F876 C9 EXITRG: RET ; F877 3E01 MAXCON: MVI A,1 ;# OF CONSOLES IS 1 F879 C9 RET ; F87A C9 SYSINT: RET ; ; MONITOR SIGN-ON MESSAGE ; F87B 0D0A MSG: .BYTE CR,LF F87D 47535220434F .ASCII 'GSR COMPUTERS III.8' 0015 MSGL = .-MSG ; ; MEMORY PARITY ERROR MESSAGE ; F890 0D0A MSG1: .BYTE CR,LF F892 504152204552 .ASCII 'PAR ERR' 0009 MSG1L = .-MSG1 ; F899 31 F7FF START: LXI SP,STACK ;RESTORE STACK F89C CD F8CC CALL CRLF F89F CD F90F CALL CI ;WAIT FOR INPUT F8A2 C3 F990 JMP WBOOT ;TRY BOOTING AGAIN ; ;MESSAGE OUTPUT ROUTINE. ; F8A5 21 F87B MESG: LXI H,MSG F8A8 4E MESG1: MOV C,M ;GET A CHARACTER F8A9 23 INX H ;MOVE POINTER TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 7 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 F8AA CD F8B8 CALL CO ;OUTPUT IT F8AD 10F9 DJNZ MESG1 ;KEEP GOING TILL B=0 F8AF C9 RET ; ; ;CRLF BEFORE HLBLK ROUTINE ; F8B0 CD F8CC CRLFHL: CALL CRLF ; ;PRINT THE CURRENT VALUE OF H&L, ;AND A SPACE. ; F8B3 CD F8FC HLBLK: CALL DISPHL ; ;PRINT A SPACE ON THE CONSOLE ; F8B6 0E20 SPACE: MVI C,' ' ; ;THIS IS THE MAIN CONSOLE ;OUTPUT ROUTINE. ; F8B8 DB2F CO: IN CONCTL F8BA E601 ANI 01H F8BC 28FA JRZ CO F8BE 79 MOV A,C F8BF D32E OUT CONDTA F8C1 C9 RET ; ; CONVERT HEX TO ASCII ; F8C2 E60F HTA: ANI 0FH ;LOW NIBBLE ONLY F8C4 C690 ADI 90H F8C6 27 DAA F8C7 CE40 ACI 40H F8C9 27 DAA F8CA 4F MOV C,A F8CB C9 RET ; ; ; CONSOLE CARRIAGE RETURN & ; LINE FEED ROUTINE. ; F8CC E5 CRLF: PUSH H ;SAVE HL F8CD 0602 MVI B,2 ;CRLF LENGTH F8CF CD F8A5 CALL MESG ;SEND CRLF F8D2 E1 POP H F8D3 C9 RET ; ;CONSOLE STATUS TEST ROUTINE. ; F8D4 DB88 CSTS: IN MEMSTS ;TEST FOR PAR ERR F8D6 E6C0 ANI 0C0H F8D8 FE80 CPI 80H F8DA 2017 JRNZ CSTS1 ;NO PAR ERR F8DC 3A F48D LDA PARFLG ;1ST PAR ERR? TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 8 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 F8DF FE00 CPI 0 F8E1 2010 JRNZ CSTS1 ;NOT 1ST F8E3 3C INR A ;SET PAR FLG F8E4 32 F48D STA PARFLG F8E7 E5 PUSH H F8E8 C5 PUSH B F8E9 21 F890 LXI H,MSG1 ;DISPLAY PAR ERR F8EC 0609 MVI B,MSG1L F8EE CD F8A8 CALL MESG1 F8F1 C1 POP B F8F2 E1 POP H F8F3 DB2F CSTS1: IN CONCTL F8F5 E602 ANI 02H F8F7 3EFF MVI A,0FFH F8F9 C0 RNZ F8FA 2F CMA F8FB C9 RET ; ; ;PRINT H&L ON CONSOLE ; F8FC 7C DISPHL: MOV A,H F8FD CD F901 CALL DISPB F900 7D MOV A,L F901 F5 DISPB: PUSH PSW F902 0F RRC F903 0F RRC F904 0F RRC F905 0F RRC F906 CD F90A CALL HTA2 F909 F1 POP PSW F90A CD F8C2 HTA2: CALL HTA F90D 18A9 JMPR CO ; ;MAIN CONSOLE INPUT ROUTINE ; F90F CD F8D4 CI: CALL CSTS ;TEST FOR INPUT F912 B7 ORA A F913 28FA JRZ CI F915 DB2E IN CONDTA F917 E67F ANI 7FH F919 C9 RET ; ; ;PRINTER OUTPUT ROUTINE ; F91A DB2C PRINT: IN INOUT F91C E601 ANI 1 F91E 20FA JRNZ PRINT F920 79 MOV A,C F921 F680 ORI 80H F923 D32C OUT INOUT F925 E67F ANI 7FH F927 D32C OUT INOUT F929 F680 ORI 80H TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 9 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 F92B D32C OUT INOUT F92D C9 RET ; ; PRINTER STATUS ROUTINE ; F92E DB2C PSTS: IN INOUT F930 E601 ANI 1 F932 3EFF MVI A,0FFH F934 C8 RZ F935 2F CMA F936 C9 RET ; ; ;GET READY TO MOVE BIOS VECTORS ; F937 21 F100 BIOSMV: LXI H,DIRBF F93A 11 EA00 BIOSM1: LXI D,BIOS F93D 01 004B BIOSM2: LXI B,BCDL F940 C9 RET ; ; ;BOOT CPM AND RUN ; F941 31 F7FF BOOT: LXI SP,STACK ;SET UP STACK F944 3E80 MVI A,80H ;SET UP PRINTER F946 D32C OUT INOUT F948 3E01 MVI A,1 ;RESET TO MODE WORD F94A D32F OUT CONCTL F94C D32F OUT CONCTL F94E 3E40 MVI A,40H F950 D32F OUT CONCTL F952 3EFA MVI A,0FAH ;SET USART MODE F954 D32F OUT CONCTL F956 3E36 MVI A,36H ;SET TIMER MODE F958 D32B OUT TCTL F95A 3E0D MVI A,13 ;SET BAUD RATE TO 9600 F95C D328 OUT T0 F95E AF XRA A F95F 32 F487 STA SECTOR F962 32 F48D STA PARFLG F965 D328 OUT T0 F967 47 MOV B,A ;SET UP TO PURGE RAM F968 4F MOV C,A F969 57 MOV D,A F96A 5F MOV E,A F96B 67 MOV H,A F96C 6F MOV L,A F96D D388 OUT MAP0 ;SET MAP REGS F96F 3C INR A F970 D389 OUT MAP1 F972 3C INR A F973 D38A OUT MAP2 F975 3C INR A F976 D38B OUT MAP3 F978 EDB0 LDIR ;PURGE RAM TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 10 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 F97A D38B OUT MAP3 ;RESET PARITY FLAG F97C 3E37 MVI A,37H ;ENABLE XMT & REC F97E D32F OUT CONCTL F980 32 F4A2 STA RFLAG F983 0615 HELLO: MVI B,MSGL ;SAY HELLO F985 CD F8A5 CALL MESG F988 21 F80B BBOOT: LXI H,BIOSCD ;SET UP BIOS VECTORS F98B CD F93A CALL BIOSM1 F98E EDB0 LDIR F990 31 F7FF WBOOT: LXI SP,STACK ;RESTORE STACK F993 21 FA84 LXI H,TPLT ;MOVE DOWN JMP VECTORS F996 11 0000 LXI D,0 F999 01 0008 LXI B,8 F99C EDB0 LDIR F99E 21 EA80 LXI H,BEGDAT ;CLEAR SCRATCH RAM F9A1 11 EA81 LXI D,BEGDAT+1 F9A4 01 0A71 LXI B,DATSIZ F9A7 3600 MVI M,0 F9A9 EDB0 LDIR F9AB CD F937 CALL BIOSMV ;SAVE BIOS VECTORS F9AE EB XCHG F9AF EDB0 LDIR F9B1 21 FE5D LXI H,EPBASE ;SET UP CPM TABLES F9B4 11 F4AB LXI D,DPBASE F9B7 01 0040 LXI B,EPLGTH F9BA EDB0 LDIR F9BC 21 D400 LXI H,CCP ;SET DMA ADR F9BF 22 F48B SHLD DMAAD F9C2 3E02 MVI A,2 ;SECTOR = 2 F9C4 32 F487 STA SECTOR F9C7 32 F4A0 STA LUNIT F9CA AF XRA A F9CB CD FAFF CALL LOGDS2 ;LOG ON DRIVE A F9CE C2 F899 JNZ START ;LOG ON ERROR F9D1 DD2A F4A6 LIXD CTBLP ;GET TBL POINTER F9D5 3E31 MVI A,49 ;NO OF SECS F9D7 32 F4A3 STA BTSEC F9DA 1601 MVI D,1 ;# OF 128 BYTE SECS F9DC 3E19 MVI A,25 ;8" SECS ON TRK 0 F9DE 32 F4AA STA SECCNT F9E1 DB9B IN DFLAG F9E3 E604 ANI 4 ;8" OR 5 1/4" ? F9E5 2805 JRZ WBOOT8 ;8" F9E7 3E11 MVI A,17 F9E9 32 F4AA STA SECCNT F9EC 3A F4A3 WBOOT8: LDA BTSEC ;SUBTRACT SECTORS F9EF 92 SUB D F9F0 32 F4A3 STA BTSEC F9F3 060A MVI B,10 F9F5 C5 BRWAGN: PUSH B F9F6 CD FE29 CALL TST128 ;ADJUST SECTOR ADR F9F9 D39E OUT DSCTR F9FB CD FE34 CALL SETUP F9FE D5 PUSH D ;SAVE FOR RETRY F9FF 2A F48B LHLD DMAAD ;GET DMA ADR TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 11 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FA02 3A F487 BOOTRD: LDA SECTOR ;TEST FOR SIDE 1 FA05 E680 ANI 80H FA07 3E88 MVI A,88H ;READ COMMAND FA09 2802 JRZ BTRW3 ;SIDE 0 FA0B 3E8A MVI A,8AH ;SELECT SIDE 1 FA0D 32 F489 BTRW3: STA CMND FA10 D39C OUT DCMMD FA12 01 809F BTRW1: LXI B,(128*256)+DDATA FA15 EDB2 INIR FA17 15 DCR D ;LOOP CONTROL FA18 20F8 JRNZ BTRW1 FA1A D1 POP D ;RESTORE LENGTH FA1B CD FDC8 CALL EOJ FA1E E69C ANI 9CH FA20 C1 POP B FA21 2808 JRZ WBOOTA ;DONE, NO ERRORS FA23 10D0 DJNZ BRWAGN ;RETRY FA25 CD FA9E DERROR: CALL DERR1 ;DISPLAY ERROR FA28 C3 F899 JMP START FA2B 22 F48B WBOOTA: SHLD DMAAD ;UPDATE DMAAD FA2E 3A F487 LDA SECTOR ;SECTOR + 1 FA31 3C INR A FA32 32 F487 STA SECTOR FA35 3A F4A3 LDA BTSEC ;ALL SECS DONE? FA38 B7 ORA A FA39 CA FA72 JZ GOCPM ;DONE FA3C 3A F4AA LDA SECCNT ;TEST FOR END OF TRK FA3F 3D DCR A FA40 32 F4AA STA SECCNT FA43 20A7 JRNZ WBOOT8 ;NOT END OF TRK FA45 DD6E0F MOV L,15(X) ;BYTES PER SEC FA48 DD6610 MOV H,16(X) FA4B 29 DAD H ;ADJUST VALUE FA4C 54 MOV D,H ;# 128 BYTE SECS FA4D DDCB124E BIT 1,18(X) ;TEST FOR DOUBLE SIDE FA51 2808 JRZ WBOOTB ;SINGLE SIDE FA53 DDCB126E BIT 5,18(X) ;CYLINDER MODE? FA57 3E81 MVI A,81H ;SIDE 1 SELECT FA59 280B JRZ WBOOT9 ;CYLINDER MODE FA5B 0658 WBOOTB: MVI B,58H ;STEP IN 1 TRACK FA5D CD FDBA CALL EOJA FA60 21 F486 LXI H,TRACK ;TRK + 1 FA63 34 INR M FA64 3E01 MVI A,1 ;SECTOR = 1 FA66 32 F487 WBOOT9: STA SECTOR FA69 DD7E13 MOV A,19(X) ;SECS PER TRK FA6C 32 F4AA STA SECCNT FA6F C3 F9EC JMP WBOOT8 ;DO NEXT TRK FA72 CD F937 GOCPM: CALL BIOSMV ;RESTORE BIOS VECTORS FA75 EDB0 LDIR FA77 21 0080 LXI H,TBUF ;DEFAULT CPM BUFFER FA7A 22 F4A4 SHLD SEKDMA ;SET DMA ADDRESS FA7D 3A 0004 LDA CURDSK ;LOG-ON DSK FA80 4F MOV C,A ;SEND TO CPM FA81 C3 D400 JMP CCP ;GO TO CP/M TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 12 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 ; ;JUMPS AT START OF MEMORY AND IOBYTE ; FA84 C3 EA03 TPLT: JMP WBOOTE FA87 BD IOBYT: .BYTE 0BDH FA88 00 .BYTE 0 FA89 C3 DC06 JMP BDOS ; ; FA8C DERRM: FA8C 44534B54524B .ASCII 'DSKTRKSCTSTSCMDDMA' ; ; ;DISPLAYS ALL DISK PARAMETERS ; FA9E C5 DERR1: PUSH B ;SAVE REGISTERS FA9F D5 PUSH D FAA0 E5 PUSH H FAA1 21 FA8C LXI H,DERRM ;POINT TO NAMES FAA4 11 F485 LXI D,DISKNO ;POINT TO PARAMETERS FAA7 CD F8CC CALL CRLF ;DISPLAY CRLF FAAA 0E05 MVI C,5 ;SET TALLY FAAC 0603 DERR2: MVI B,3 FAAE C5 PUSH B ;SAVE BC FAAF CD F8A8 CALL MESG1 ;DISPLAY NAME FAB2 CD F8B6 CALL SPACE ;DISPLAY SPACE FAB5 E5 PUSH H ;SAVE HL FAB6 1A LDAX D ;GET DATA FAB7 13 INX D ;STEP TO NEXT FAB8 CD F901 CALL DISPB ;DISPLAY DATA FABB CD F8B6 CALL SPACE ;DISPLAY SPACE FABE E1 POP H ;GET HL FABF C1 POP B ;GET BC FAC0 0D DCR C ;TALLY - 1 FAC1 20E9 JRNZ DERR2 ;CONTINUE FAC3 0603 MVI B,3 ;DISPLAY NAME FAC5 CD F8A8 CALL MESG1 FAC8 CD F8B6 CALL SPACE ;DISPLAY SPACE FACB 2A F48B LHLD DMAAD ;LAST PARAMETER FACE CD F8FC CALL DISPHL ;DISPLAY IT FAD1 E1 POP H ;RESTORE REGISTERS FAD2 D1 POP D FAD3 C1 POP B FAD4 3A F488 LDA STATUS FAD7 B7 ORA A FAD8 C9 RET ; ; ; ;SELECT DISK GIVEN BY REGISTER C ; FAD9 21 0000 SELDSK: LXI H,0 ;ERROR RETURN CODE FADC 79 MOV A,C FADD 32 F497 STA SEKDSK ;STORE DSK NO. FAE0 FE04 CPI 4 ;MUST BE 0,1,2,OR 3 TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 13 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FAE2 D0 RNC ;INVALID DSK NO. FAE3 DDE5 PUSH X ;LOG ON DISK FAE5 E5 PUSH H FAE6 CD FAFF CALL LOGDS2 FAE9 E1 POP H FAEA C0 RNZ ;ERROR RETURN FAEB DDE1 POP X FAED 3A F497 LDA SEKDSK ;GET DISK NO. FAF0 6F MOV L,A FAF1 60 MOV H,B FAF2 29 DAD H ;*2 FAF3 29 DAD H ;*4 FAF4 29 DAD H ;*8 FAF5 29 DAD H ;*16 FAF6 EB XCHG FAF7 21 F4AB LXI H,DPBASE FAFA 19 DAD D ;HL=DPBASE+(DISKNO*16) FAFB C9 RET ; FAFC 3A F485 LOGDSK: LDA DISKNO FAFF 4F LOGDS2: MOV C,A ;SAVE DSK NO IN C FB00 3C INR A FB01 DD21 EE80 LXI X,DP0 ;BUILD TBL ADR IN X FB05 11 0080 LXI D,128 FB08 3D DABLD1: DCR A FB09 2804 JRZ DABLD2 FB0B DD19 DADX D FB0D 18F9 JMPR DABLD1 FB0F DD22 F4A6 DABLD2: SIXD CTBLP FB13 3EC0 MVI A,0C0H FB15 B1 ORA C FB16 32 F48E STA HSELCD ;STORE SELECT CODE FB19 21 F481 LXI H,DSKSEL ;SEE IF NEW DISK FB1C 0600 MVI B,0 FB1E 09 DAD B FB1F 3A F480 LDA SELFLG ;LOAD USER TABLE? FB22 FE00 CPI 0 FB24 280B JRZ DABLD3 ;USE DISK TABLES FB26 AF XRA A ;RESET FLAG FB27 32 F480 STA SELFLG FB2A 2F CMA ;MARK DISK AS USED FB2B 77 MOV M,A FB2C 21 F080 LXI H,UTABLE ;LOAD USER TABLE FB2F 1857 JMPR VALID2 FB31 7E DABLD3: MOV A,M FB32 B7 ORA A FB33 205B JRNZ DBPARM ;NOT NEW DISK FB35 2F CMA FB36 77 MOV M,A ;MARK AS USED FB37 3A F48E LDA HSELCD ;GET SEL CODE FB3A D39B OUT DCNTL ;SEL DRIVE FB3C CD FDB8 CALL EOJB ;RESTORE DRIVE FB3F E680 ANI 80H ;TEST FOR NOT READY FB41 C2 FA9E JNZ DERR1 ;NOT RDY ERROR FB44 060A MVI B,10 ;RETRY COUNT TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 14 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FB46 C5 NTAGN: PUSH B FB47 3E01 MVI A,1 ;SELECT SEC 1 FB49 D39E OUT DSCTR FB4B 57 MOV D,A ;SEC SIZE=128 FB4C 2A F4A6 LHLD CTBLP FB4F 3A F48E LDA HSELCD ;GET SELECT CODE FB52 D39B OUT DCNTL FB54 3E8C MVI A,8CH ;READ OP FB56 CD FD94 CALL RDAT ;READ TABLES FB59 C1 POP B ;RETRY COUNT FB5A B7 ORA A ;TEST FOR ERRORS FB5B 2805 JRZ VALID ;DONE, NO ERRORS FB5D 10E7 DJNZ NTAGN ;RETRY FB5F C3 FA9E JMP DERR1 ;DISP PARAMETERS FB62 DD6E0F VALID: MOV L,15(X) ;BYTES PER SECTOR FB65 DD6610 MOV H,16(X) FB68 E5 PUSH H ;COPY TO DE FB69 D1 POP D FB6A DD4613 MOV B,19(X) ;PHYSICAL SEC/TRK FB6D 05 DCR B FB6E 19 VALID1: DAD D ;BYTES/SEC X SEC/TRK FB6F 10FD DJNZ VALID1 FB71 29 DAD H ;DIVIDE BY 128 FB72 DDCB124E BIT 1,18(X) ;DOUBLE SIDE ? FB76 2807 JRZ VALID3 ;SINGLE SIDE FB78 DDCB126E BIT 5,18(X) ;CYLINDER MODE ? FB7C 2001 JRNZ VALID3 ;CYLINDER MODE FB7E 29 DAD H ;DBL SIDE, TIMES 2 FB7F 7C VALID3: MOV A,H FB80 DDBE00 CMP 0(X) ;EQUAL SEC/TRK ? FB83 280B JRZ DBPARM ;VALID TABLE FB85 21 FE9D LXI H,DEFLT ;LOAD DEFAULT TABLE FB88 DDE5 VALID2: PUSH X FB8A D1 POP D FB8B 01 0080 LXI B,128 FB8E EDB0 LDIR FB90 DD6E0F DBPARM: MOV L,15(X) ;GET BYTES/SEC FB93 DD6610 MOV H,16(X) FB96 29 DAD H FB97 7C MOV A,H FB98 32 F48F STA HSTBLK ;CPM SEC/PHY SEC FB9B 3D DCR A FB9C 32 F491 STA SECMSK ;SECTOR MASK FB9F DD4602 MOV B,2(X) ;GET BLK SHIFT FACTOR FBA2 3E01 MVI A,1 ;CPM ALOC SIZE/128 FBA4 07 BLKCAL: RLC FBA5 10FD DJNZ BLKCAL FBA7 32 F490 STA BLKCNT FBAA 3A F485 LDA DISKNO ;GET DISK NO FBAD 21 F4A0 LXI H,LUNIT ;POINT TO LAST UNIT FBB0 BE CMP M ;SEE IF SAME FBB1 77 MOV M,A ;SAVE THIS UNIT FBB2 C8 RZ FBB3 CD FE34 CALL SETUP FBB6 21 F4EB LXI H,IDSV TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 15 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FBB9 1601 MVI D,1 FBBB 3EC4 MVI A,0C4H ;READ ADR COMMAND FBBD D39C OUT DCMMD FBBF 32 F489 STA CMND FBC2 01 069F LXI B,(6*256)+DDATA FBC5 CD FD9C CALL READ2 FBC8 3A F4EB IDRD1: LDA IDSV FBCB D39D OUT DTRCK ;SET THE TRACK FBCD AF XRA A ;RET, NO ERRORS FBCE C9 RET ; ; ;SET TRACK GIVEN BY REGISTER C ; FBCF 79 SETTRK: MOV A,C FBD0 32 F498 STA SEKTRK FBD3 C9 RET ; ; ;SET SECTOR GIVEN BY REGISTER C ; FBD4 79 SETSEC: MOV A,C FBD5 32 F499 STA SEKSEC FBD8 C9 RET ; ; ;TRANSLATE THE SECTOR GIVEN BY BC USING THE ;TRANSLATE TABLE GIVEN BY DE ; FBD9 DDE5 SECTRN: PUSH X ;SAVE X FBDB 21 FFEC LXI H,0FFECH ;TBL POINTER-20 FBDE 19 DAD D FBDF E5 PUSH H ;POINTER TO X FBE0 DDE1 POP X FBE2 AF XRA A FBE3 DDCB124E BIT 1,18(X) ;TEST FOR DBL SIDE FBE7 2816 JRZ SECTR1 ;SINGLE SIDE FBE9 DDCB126E BIT 5,18(X) ;CYLINDER MODE? FBED 2010 JRNZ SECTR1 ;NON-CYLINDER MODE FBEF DD6E00 MOV L,0(X) ;GET CPM SEC/TRK FBF2 67 MOV H,A FBF3 CB3D SRLR L ;DIVIDE BY 2 FBF5 2D DCR L ;SUBTRACT 1 FBF6 ED42 DSBC B ;SEC ON SD 0 OR 1? FBF8 3005 JRNC SECTR1 ;SECTOR ON SIDE 0 FBFA 7D MOV A,L ;BUILD ADR FOR SD 1 FBFB 2F CMA FBFC 4F MOV C,A FBFD 3E80 MVI A,80H ;SIDE SELECT = SD 1 FBFF EB SECTR1: XCHG ;HL=TRANS TBL FC00 09 DAD B ;ADD SEC INDEX FC01 B6 ORA M ;OR SIDE SELECT FC02 6F MOV L,A ;HL = TRANS(SECTOR) FC03 2600 MVI H,0 FC05 DDE1 POP X ;RESTORE X TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 16 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FC07 C9 RET ; ; ;SET DMA ADDRESS GIVEN BY REGISTERS B AND C ; FC08 ED43 F4A4 SETDMA: SBCD SEKDMA ;SAVE THE ADDRESS FC0C C9 RET ; ; ;MOVE TO THE TRACK 00 POSITION OF CURRENT DRIVE ; FC0D 3A F49C HOME: LDA HSTWRT ;TEST FOR WRITE PEND FC10 B7 ORA A FC11 C0 RNZ FC12 32 F49D STA HSTACT ;CLEAR HSTACT FLAG FC15 C9 RET ; ; ;DEBLOCKING ROUTINES ; FC16 3E01 HREAD: MVI A,1 ;SET READOP=READ FC18 32 F49F STA READOP FC1B 3C INR A FC1C 32 F492 STA WRTYPE ;TREAT AS UNALOC FC1F C3 FC80 JMP ALLOC FC22 AF HWRITE: XRA A ;SET READOP=WRITE FC23 32 F49F STA READOP FC26 79 MOV A,C ;SAVE WRITE TYPE FC27 32 F492 STA WRTYPE FC2A FE02 CPI WRUAL ;UNALOC WRITE? FC2C 2018 JRNZ CHKUNA ;NOT UNALOC WRT FC2E 2A F497 LHLD SEKDSK ;UNADSK=SEKDSK FC31 22 F494 SHLD UNADSK ;UNATRK=SEKTRK FC34 3A F490 LDA BLKCNT ;RECORDS/CPM BLOCK FC37 32 F493 STA UNACNT FC3A 3A F499 LDA SEKSEC ;UNASEC=SEKSEC FC3D 32 F496 STA UNASEC FC40 2A F4A6 LHLD CTBLP ;SAVE TBL ADR FC43 22 F4A8 SHLD UTBLP FC46 3A F493 CHKUNA: LDA UNACNT ;ANY UNALOC REMAIN? FC49 B7 ORA A FC4A 2834 JRZ ALLOC ;NONE REMAIN FC4C 3D DCR A ;UNACNT-1 FC4D 32 F493 STA UNACNT FC50 2A F494 LHLD UNADSK ;SEK = UNA? FC53 3A F499 LDA SEKSEC FC56 4F MOV C,A FC57 3A F496 LDA UNASEC FC5A CD FD62 CALL CMP3 FC5D 2021 JRNZ ALLOC ;NOT EQUAL FC5F 2A F4A8 LHLD UTBLP ;GET TBL ADR FC62 4E MOV C,M ;CPM SEC/TRK FC63 0600 MVI B,0 FC65 11 0014 LXI D,20 ;SEC TRANSL TBL FC68 19 DAD D TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 17 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FC69 3A F496 LDA UNASEC ;SEARCH FOR UNASEC FC6C EDB1 CCIR ;END OF TRK? FC6E EA FC79 JO NOOVF ;NOT END FC71 21 F495 LXI H,UNATRK ;UNATRK + 1 FC74 34 INR M FC75 3E01 MVI A,1 ;UNASEC = 1 FC77 1801 JMPR OVF FC79 7E NOOVF: MOV A,M ;GET NEXT SECTOR FC7A 32 F496 OVF: STA UNASEC ;STORE NEXT UNASEC FC7D AF XRA A ;RESET RSFLAG FC7E 1805 JMPR ALLOC2 FC80 AF ALLOC: XRA A ;SET UNACNT=0 FC81 32 F493 STA UNACNT FC84 3C INR A ;SET RSFLAG FC85 32 F49E ALLOC2: STA RSFLAG ;NEED PREREAD FC88 21 EA80 LXI H,DBUF ;SET DMA ADR FC8B 22 F48B SHLD DMAAD FC8E DDE5 RWOPER: PUSH X FC90 3A F497 LDA SEKDSK ;LOG ON SEKDSK FC93 CD FAFF CALL LOGDS2 FC96 DDCB126E BIT 5,18(X) ;CYLINDER MODE? FC9A 2816 JRZ CYLN ;YES FC9C 3A F498 LDA SEKTRK FC9F DDBE11 CMP 17(X) ;TRK > TRKS PER SIDE? FCA2 380E JRC CYLN ;NOT GREATER FCA4 DD9611 SUB 17(X) ;ADJUST TRACK FCA7 32 F498 STA SEKTRK ;SAVE IT FCAA 3A F499 LDA SEKSEC ;SELECT SIDE 1 FCAD F680 ORI 80H FCAF 32 F499 STA SEKSEC FCB2 3A F499 CYLN: LDA SEKSEC ;COMPUTE PHY SEC ADR FCB5 4F MOV C,A FCB6 E680 ANI 80H ;GET SIDE SELECT FCB8 32 F49B STA SIDSEL ;SAVE IT FCBB 79 MOV A,C ;MASK OFF SIDE SEL FCBC E67F ANI 7FH FCBE 4F MOV C,A FCBF 3A F48F LDA HSTBLK FCC2 0D DCR C FCC3 1F PSEC1: RAR FCC4 3804 JRC SECDN FCC6 CB39 SRLR C FCC8 18F9 JMPR PSEC1 FCCA 0C SECDN: INR C FCCB 3A F49B LDA SIDSEL ;GET SIDE SELECT FCCE B1 ORA C ;OR IT WITH SECTOR FCCF 32 F49A STA SEKHST ;SAVE IT FCD2 21 F49D LXI H,HSTACT ;TEST & SET HSTACT FLG FCD5 7E MOV A,M FCD6 3601 MVI M,1 ;SET FLAG FCD8 B7 ORA A ;TEST FLAG FCD9 2816 JRZ FILHST ;NOT SET FCDB 2A F485 LHLD DISKNO ;SEEK=HOST? FCDE 3A F49A LDA SEKHST FCE1 4F MOV C,A TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 18 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FCE2 3A F487 LDA SECTOR FCE5 CD FD62 CALL CMP3 FCE8 2825 JRZ MATCH ;SAME FCEA 3A F49C LDA HSTWRT ;HOST WRITTEN? FCED B7 ORA A FCEE C4 FD70 CNZ DWRITE ;WRITE HOST BUF FCF1 2A F497 FILHST: LHLD SEKDSK ;GET SET TO FILL BUF FCF4 22 F485 SHLD DISKNO FCF7 3A F49A LDA SEKHST ;PHYSICAL SEC ADR FCFA DDCB1256 BIT 2,18(X) ;1ST SEC = 0? FCFE 2801 JRZ FLHST2 ;1ST SEC = 1 FD00 3D DCR A ;1ST SEC = 0 FD01 32 F487 FLHST2: STA SECTOR FD04 3A F49E LDA RSFLAG ;RSFLAG SET? FD07 B7 ORA A FD08 C4 FD6C CNZ DREAD ;YES DO READ FD0B AF XRA A FD0C 32 F49C STA HSTWRT ;NO PENDING WRT FD0F 3A F499 MATCH: LDA SEKSEC ;MASK BUF SEL BITS FD12 3D DCR A FD13 6F MOV L,A FD14 3A F491 LDA SECMSK FD17 A5 ANA L FD18 67 MOV H,A ;BUF SEL BITS X 128 FD19 2E00 MVI L,0 FD1B CB3C SRLR H FD1D CB1D RARR L FD1F 11 EA80 LXI D,DBUF ;ADD BUFFER INDEX FD22 19 DAD D FD23 ED5B F4A4 LDED SEKDMA ;GET SEEK DMA ADR FD27 01 0080 LXI B,128 ;SIZE OF MOVE FD2A 3A F49F LDA READOP ;READOP=1? FD2D B7 ORA A FD2E 2006 JRNZ RWMOVE ;YES MOVE READ DATA FD30 3E01 MVI A,1 FD32 32 F49C STA HSTWRT ;SET HOST WRITTEN FD35 EB XCHG ;MOVE WRITE DATA FD36 DDCB1266 RWMOVE: BIT 4,18(X) ;INVERTED DATA? FD3A 280A JRZ NOINV ;NON-INVERTED DATA FD3C 41 MOV B,C ;MOVE LENGTH TO B FD3D 7E INVRT: MOV A,M ;GET DATA FD3E 2F CMA ;INVERT DATA FD3F 12 STAX D ;MOVE TO DESTINATION FD40 23 INX H ;INCREMENT ADDRESSES FD41 13 INX D FD42 10F9 DJNZ INVRT ;DO 128 BYTES FD44 1802 JMPR INVDN ;DONE FD46 EDB0 NOINV: LDIR ;MOVE NON-INVERTED DATA FD48 3A F492 INVDN: LDA WRTYPE ;WRITE TO DIRECTORY? FD4B FE01 CPI WRDIR FD4D 3A F4A1 LDA ERFLAG ;GET ERROR FLAG FD50 200D JRNZ RWD ;NOT DIR WRT FD52 B7 ORA A ;ERRORS? FD53 200A JRNZ RWD ;DONE IF ERRORS FD55 AF XRA A TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 19 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FD56 32 F49C STA HSTWRT ;RESET HSTWRT FLAG FD59 CD FD70 CALL DWRITE ;WRITE TO DIRECTORY FD5C 3A F4A1 LDA ERFLAG ;GET ERROR FLAG FD5F DDE1 RWD: POP X FD61 C9 RET ;DONE FD62 ED5B F497 CMP3: LDED SEKDSK ;GET SEKDSK & SEKTRK FD66 B7 ORA A FD67 ED52 DSBC D ;COMPARE HL & DE FD69 C0 RNZ ;RETURN NOT EQUAL FD6A B9 CMP C ;COMPARE A & C FD6B C9 RET ;DONE ; ; ;DISK READ AND WRITE ROUTINES ; FD6C 3E01 DREAD: MVI A,1 ;SET READ FLAG FD6E 1801 JMPR STRFLG FD70 AF DWRITE: XRA A ;SET WRITE FLAG FD71 32 F48A STRFLG: STA RWFLG ;SAVE IT FOR LATER USE FD74 060A DORDWT: MVI B,10 ;NUMBER OF RETRIES FD76 C5 AGN: PUSH B ;SAVE BC FD77 CD FDD9 CALL SEEK ;SEEK THE TRACK FD7A CC FD8C CZ RDWR ;NO ERROR FD7D 32 F4A1 STA ERFLAG ;STORE ERROR FLAG FD80 C1 READ3: POP B ;GET ERROR RETRY COUNT FD81 C8 RZ ;RETURN IF NO ERRORS FD82 3EFF MVI A,0FFH ;CAUSE IDRD ON RETRY FD84 32 F4A0 STA LUNIT FD87 10ED DJNZ AGN ;DO A RETRY FD89 C3 FA9E JMP DERR1 ;DISP PARAMETERS ; FD8C 5F RDWR: MOV E,A ;SAVE COMMAND FD8D 3A F48A LDA RWFLG FD90 B7 ORA A FD91 7B MOV A,E ;REGET THE COMMAND FD92 2813 JRZ WRDAT ;WRITE IF ZERO FD94 D39C RDAT: OUT DCMMD ;DISK COMMAND PORT FD96 32 F489 STA CMND FD99 01 809F READ1: LXI B,(128*256)+DDATA FD9C EDB2 READ2: INIR FD9E 15 DCR D ;LOOP CONTROL FD9F 20F8 JRNZ READ1 FDA1 CD FDC8 CALL EOJ FDA4 E69C ANI 9CH ;ISOLATE READ ERROR BITS FDA6 C9 RET ; FDA7 F620 WRDAT: ORI 20H ;ADD WRITE COMMAND FDA9 D39C OUT DCMMD ;DISK COMMAND PORT FDAB 32 F489 STA CMND FDAE 01 809F WRT1: LXI B,(128*256)+DDATA FDB1 EDB3 OUTIR FDB3 15 DCR D ;LOOP CONTROL FDB4 20F8 JRNZ WRT1 FDB6 1810 JMPR EOJ FDB8 0608 EOJB: MVI B,8 ;BASIS OF RESTORE COMMAND TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 20 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FDBA DB9B EOJA: IN DFLAG ;STEP RATE BITS FDBC E603 ANI 3 FDBE B0 ORA B ;ADD ON THE COMMAND FDBF 32 F489 STA CMND FDC2 D39C OUT DCMMD ;DO THE COMMAND FDC4 0680 MVI B,128 ;DELAY FDC6 10FE SKDLY: DJNZ SKDLY FDC8 DB9C EOJ: IN DSTAT ;TEST FOR INTRQ FDCA E601 ANI 1 FDCC 20FA JRNZ EOJ ;WAIT FOR INTRQ FDCE CD FE55 CALL DWAIT ;DISABLE WAITS FDD1 DB9C EOJ1: IN DSTAT ;GET THE DISK STATUS FDD3 32 F488 STA STATUS FDD6 E6FC ANI 0FCH FDD8 C9 RET ; FDD9 CD FAFC SEEK: CALL LOGDSK ;LOG ON DISKNO FDDC C0 RNZ ;ERROR RETURN FDDD CD FE29 CALL TST128 ;ADJUST SECTOR ADR FDE0 D39E OUT DSCTR ;DISK SECTOR PORT FDE2 DB9D SEEK2: IN DTRCK ;DISK TRACK PORT FDE4 4F MOV C,A ;SAVE IT FDE5 3A F486 LDA TRACK ;GET DESIRED TRACK FDE8 B9 CMP C FDE9 280A JRZ RDWRT ;NO SEEK NEEDED FDEB D39F OUT DDATA ;SET THE TRACK FDED 0618 MVI B,18H ;SEEK COMMAND FDEF CD FDBA CALL EOJA ;DO THE SEEK FDF2 E680 ANI 80H ;ERROR MASK FDF4 C0 RNZ ;SEEK ERROR FDF5 CD FE34 RDWRT: CALL SETUP ;GET READY FDF8 DB9B IN DFLAG FDFA E610 ANI 10H ;HEAD LOADED? FDFC 3E04 MVI A,4 FDFE 2801 JRZ RDWRT1 ;JUMP IF NOT FE00 AF XRA A ;RESET HEAD LD FLAG FE01 C688 RDWRT1: ADI 88H ;READ COMMAND FE03 4F MOV C,A ;SAVE IT FE04 3A F486 LDA TRACK ;TEST FOR TRK 0 FE07 B7 ORA A FE08 2009 JRNZ RDWRT4 ;NOT TRACK 0 FE0A 3A F487 LDA SECTOR ;TEST FOR SIDE 1 FE0D CB7F BIT 7,A FE0F 1601 MVI D,1 FE11 2808 JRZ RDWRT2 ;TRK 0, SIDE 0 = SD FE13 DD6E0F RDWRT4: MOV L,15(X) ;GET SECTOR SIZE FE16 DD6610 MOV H,16(X) FE19 29 DAD H FE1A 54 MOV D,H FE1B 2A F48B RDWRT2: LHLD DMAAD ;GET DMA ADDRESS FE1E 3A F487 RDWRT3: LDA SECTOR ;TEST FOR SIDE 1 FE21 E680 ANI 80H FE23 79 MOV A,C ;REGET COMMAND FE24 C8 RZ ;SIDE 0 FE25 F602 ORI 2 ;SELECT SIDE 1 TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 21 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FE27 BF CMP A ;CLEAR THE FLAGS FE28 C9 RET FE29 3A F487 TST128: LDA SECTOR FE2C DDCB125E BIT 3,18(X) ;SD 1 < 128? FE30 C8 RZ ;SD 1 > 128 FE31 E67F ANI 7FH ;SD 1 < 128 FE33 C9 RET ; ; ;SELECTS DRIVE ; FE34 21 F487 SETUP: LXI H,SECTOR ;POINT TO SECTOR FE37 DB9B IN DFLAG FE39 E640 ANI 40H ;TEST FOR TRK 0 FE3B 3A F48E LDA HSELCD ;GET SEL CODE FE3E 2004 JRNZ SETUP2 ;NOT TRK 0 FE40 CB7E BIT 7,M ;TEST FOR SIDE 1 FE42 280E JRZ SETUP3 ;TRK 0, SIDE 0 IS SD FE44 DDCB127E SETUP2: BIT 7,18(X) ;TEST FOR DD/SD FE48 2802 JRZ SETUP4 ;THIS DSK IS SD FE4A CBB7 RES 6,A ;SET DD FE4C CB7E SETUP4: BIT 7,M ;TEST FOR SIDE 1 FE4E 2802 JRZ SETUP3 ;SIDE 0 FE50 CBEF SET 5,A ;SELECT SIDE 1 FE52 D39B SETUP3: OUT DCNTL FE54 C9 RET ; ; ;DISABLE WAIT STATES ; FE55 3A F48E DWAIT: LDA HSELCD ;RESET AUTO-WAIT FE58 E67F ANI 7FH FE5A D39B OUT DCNTL FE5C C9 RET ; ; ; FE5D EPBASE: ;DISK PARAMETER HEADER FOR DISK 00 FE5D EE94 0000 WORD TD0,0 FE61 0000 0000 WORD 0,0 FE65 F100 EE80 WORD DIRBF,DP0 FE69 F380 F180 WORD CHK00,ALL00 ;DISK PARAMETER HEADER FOR DISK 01 FE6D EF14 0000 WORD TD1,0 FE71 0000 0000 WORD 0,0 FE75 F100 EF00 WORD DIRBF,DP1 FE79 F3C0 F200 WORD CHK01,ALL01 ;DISK PARAMETER HEADER FOR DISK 02 FE7D EF94 0000 WORD TD2,0 FE81 0000 0000 WORD 0,0 FE85 F100 EF80 WORD DIRBF,DP2 FE89 F400 F280 WORD CHK02,ALL02 ;DISK PARAMETER HEADER FOR DISK 03 FE8D F014 0000 WORD TD3,0 TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 22 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 FE91 0000 0000 WORD 0,0 FE95 F100 F000 WORD DIRBF,DP3 FE99 F440 F300 WORD CHK03,ALL03 0040 EPLGTH = .-EPBASE ; ; ; THE FOLLOWING TABLE IS THE DEFAULT ; DISK PARAMETER TABLE. IT WILL CONTAIN ; AN 8" SINGLE SIDE SINGLE DENSITY TABLE ; AT COLD START TIME, (RESET OR POWER ON). ; ANY TIME A VALID TABLE IS NOT FOUND ON ; A DISK BEING LOGGED-IN, THIS TABLE ; WILL BE LOADED INSTEAD. ; FE9D 001A DEFLT: .WORD 26 ;SECTORS PER TRACK FE9F 03 .BYTE 3 ;BLOCK SHIFT FACTOR FEA0 07 .BYTE 7 ;BLOCK MASK FEA1 00 .BYTE 0 ;EXTENT MASK FEA2 00F2 .WORD 242 ;BLOCKS PER DISKETTE FEA4 003F .WORD 63 ;# DIRECTORY ENTRIES FEA6 C0 .BYTE 0C0H ;ALLOC 0 FEA7 00 .BYTE 0 ;ALLOC 1 FEA8 0010 .WORD 16 ;DIR CHECK VECTOR SIZE FEAA 0002 .WORD 2 ;SYSTEM TRACK OFFSET FEAC 0080 .WORD 128 ;BYTES PER SECTOR FEAE 4D .BYTE 77 ;TRACKS PER DISK ; CONTROL BYTE FEAF 01 .BYTE 00000001B ; BIT 0 = 8"/5" ; BIT 1 = DS/SS ; BIT 2 = SEC 0/SEC 1 ; BIT 3 = SD 1 < 128 ; BIT 4 = INV DATA ; BIT 5 = NON-CYLINDER ; BIT 6 = UNDEFINED ; BIT 7 = DD/SD FEB0 1A .BYTE 26 ;PHYSICAL SEC/TRK ; ; SECTOR TRANSLATE TABLE ; FEB1 01070D1319 T8S4: .BYTE 1,7,13,19,25 FEB6 050B1117 .BYTE 5,11,17,23 FEBA 03090F15 .BYTE 3,9,15,21 FEBE 02080E141A .BYTE 2,8,14,20,26 FEC3 060C1218 .BYTE 6,12,18,24 FEC7 040A1016 .BYTE 4,10,16,22 ; ; ;SCRATCH RAM AREA FOR BDOS USE ; EA80 BEGDAT = BIOS+128;BEGINNING OF DATA AREA EA80 .LOC BEGDAT EA80 DBUF: .BLKB 1024 ;DEBLOCK BUFFER EE80 DP0: .BLKB 20 ;DISK PARMETER TABLES TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 23 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 EE94 TD0: .BLKB 108 EF00 DP1: .BLKB 20 EF14 TD1: .BLKB 108 EF80 DP2: .BLKB 20 EF94 TD2: .BLKB 108 F000 DP3: .BLKB 20 F014 TD3: .BLKB 108 F080 UTABLE: .BLKB 128 ;USER DISK PARAMETER TABLE F100 DIRBF: .BLKB 128 ;SCRATCH DIRECTORY AREA F180 ALL00: .BLKB 128 ;ALLOCATION VECTOR 0 F200 ALL01: .BLKB 128 ;ALLOCATION VECTOR 1 F280 ALL02: .BLKB 128 ;ALLOCATION VECTOR 2 F300 ALL03: .BLKB 128 ;ALLOCATION VECTOR 3 F380 CHK00: .BLKB 64 ;CHECK VECTOR 0 F3C0 CHK01: .BLKB 64 ;CHECK VECTOR 1 F400 CHK02: .BLKB 64 ;CHECK VECTOR 2 F440 CHK03: .BLKB 64 ;CHECK VECTOR 3 F480 SELFLG: .BLKB 1 ;USER TABLE FLAG F481 DSKSEL: .BLKB 4 ;DISK ACCESS TABLE F485 DISKNO: .BLKB 1 ;DISK PARAMATERS F486 TRACK: .BLKB 1 F487 SECTOR: .BLKB 1 F488 STATUS: .BLKB 1 F489 CMND: .BLKB 1 F48A RWFLG: .BLKB 1 F48B DMAAD: .BLKB 2 F48D PARFLG: .BLKB 1 ;PAR ERROR FLAG F48E HSELCD: .BLKB 1 ;HOST SELECT CODE F48F HSTBLK: .BLKB 1 ;CPM SEC/PHY SEC F490 BLKCNT: .BLKB 1 ;REC/CPMBLK F491 SECMSK: .BLKB 1 ;SECTOR MASK F492 WRTYPE: .BLKB 1 ;WRITE TYPE F493 UNACNT: .BLKB 1 ;UNALOC REC COUNT F494 UNADSK: .BLKB 1 ;LAST UNALOC DISK F495 UNATRK: .BLKB 1 ;LAST UNALOC TRACK F496 UNASEC: .BLKB 1 ;LAST UNALOC SECTOR F497 SEKDSK: .BLKB 1 ;SEEK DISK F498 SEKTRK: .BLKB 1 ;SEEK TRACK F499 SEKSEC: .BLKB 1 ;SEEK SECTOR F49A SEKHST: .BLKB 1 ;PHYSICAL SEC ADR F49B SIDSEL: .BLKB 1 ;SIDE SELECT STORAGE F49C HSTWRT: .BLKB 1 ;HOST WRITTEN FLAG F49D HSTACT: .BLKB 1 ;HOST ACTIVE FLAG F49E RSFLAG: .BLKB 1 ;READ SECTOR FLAG F49F READOP: .BLKB 1 ;1=READ, 0=WRITE F4A0 LUNIT: .BLKB 1 ;LAST SELECTED DRIVE F4A1 ERFLAG: .BLKB 1 ;ERROR FLAG F4A2 RFLAG: .BLKB 1 ;CPM READ FLAG F4A3 BTSEC: .BLKB 1 ;NO OF BOOT SECS F4A4 SEKDMA: .BLKB 2 ;SEEK DMA ADDRESS F4A6 CTBLP: .BLKB 2 ;CURRENT TBL ADR F4A8 UTBLP: .BLKB 2 ;UNALOC TBL ADR F4AA SECCNT: .BLKB 1 ;SECS/TRK FOR BOOT F4AB DPBASE: .BLKB EPLGTH ;CPM DISK PARAMETER HEADERS F4EB IDSV: .BLKB 6 TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 24 < GSR COMPUTERS MONITOR > VERSION III.8 10-22-83 0A71 DATSIZ = .-BEGDAT ;SIZE OF SCRATCH RAM ; ; ;END OF PROGRAM ; ; ; .END TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 25 < GSR COMPUTERS MONITOR > +++++ SYMBOL TABLE +++++ AGN FD76 ALL00 F180 ALL01 F200 ALL02 F280 ALL03 F300 ALLOC FC80 ALLOC2 FC85 BASE F800 BBOOT F988 BCDL 004B BDOS DC06 BEGDAT EA80 BIAS A000 BIOS EA00 BIOSCD F80B BIOSM1 F93A BIOSM2 F93D BIOSMV F937 BLKCAL FBA4 BLKCNT F490 BOOT F941 BOOTRD FA02 BRWAGN F9F5 BTRW1 FA12 BTRW3 FA0D BTSEC F4A3 CCP D400 CHK00 F380 CHK01 F3C0 CHK02 F400 CHK03 F440 CHKUNA FC46 CI F90F CMND F489 CMP3 FD62 CO F8B8 CONCTL 002F CONDTA 002E CONSTS 002F CR 000D CRLF F8CC CRLFHL F8B0 CSTS F8D4 CSTS1 F8F3 CTBLP F4A6 CURDSK 0004 CYLN FCB2 DABLD1 FB08 DABLD2 FB0F DABLD3 FB31 DATSIZ 0A71 DBPARM FB90 DBUF EA80 DCMMD 009C DCNTL 009B DDATA 009F DEFLT FE9D DERR1 FA9E DERR2 FAAC DERRM FA8C DERROR FA25 DEVOK F85E DEVTBL F861 DFLAG 009B DIRBF F100 DISKNO F485 DISPB F901 DISPHL F8FC DMAAD F48B DORDWT FD74 DP0 EE80 DP1 EF00 DP2 EF80 DP3 F000 DPBASE F4AB DREAD FD6C DSCTR 009E DSKSEL F481 DSTAT 009C DTRCK 009D DWAIT FE55 DWRITE FD70 EOJ FDC8 EOJ1 FDD1 EOJA FDBA EOJB FDB8 EPBASE FE5D EPLGTH 0040 ERFLAG F4A1 EXITRG F876 FILHST FCF1 FLHST2 FD01 GOCPM FA72 HELLO F983 HLBLK F8B3 HOME FC0D HREAD FC16 HSELCD F48E HSTACT F49D HSTBLK F48F HSTWRT F49C HTA F8C2 HTA2 F90A HWRITE FC22 IDRD1 FBC8 IDSV F4EB INOUT 002C INVDN FD48 INVRT FD3D IOBYT FA87 LF 000A LOGDS2 FAFF LOGDSK FAFC LUNIT F4A0 MAP0 0088 MAP1 0089 MAP2 008A MAP3 008B MATCH FD0F MAXCON F877 MEMSTS 0088 MESG F8A5 MESG1 F8A8 MSG F87B MSG1 F890 MSG1L 0009 MSGL 0015 MSIZE 003C NOINV FD46 NOOVF FC79 NTAGN FB46 OVF FC7A PARFLG F48D POLDEV F857 PRINT F91A PSEC1 FCC3 PSTS F92E RDAT FD94 RDWR FD8C RDWRT FDF5 RDWRT1 FE01 RDWRT2 FE1B RDWRT3 FE1E RDWRT4 FE13 READ1 FD99 READ2 FD9C READ3 FD80 READOP F49F RFLAG F4A2 RSFLAG F49E RTNEMP F867 RWD FD5F RWFLG F48A RWMOVE FD36 RWOPER FC8E SECCNT F4AA SECDN FCCA SECMSK F491 SECTOR F487 SECTR1 FBFF SECTRN FBD9 SEEK FDD9 SEEK2 FDE2 SEKDMA F4A4 SEKDSK F497 SEKHST F49A SEKSEC F499 SEKTRK F498 SELDSK FAD9 SELFLG F480 SELMEM F856 SETDMA FC08 SETSEC FBD4 SETTRK FBCF SETUP FE34 SETUP2 FE44 SETUP3 FE52 SETUP4 FE4C SIDSEL F49B SKDLY FDC6 SPACE F8B6 STACK F7FF START F899 STATUS F488 STOPCK F875 STRFLG FD71 STRTCK F874 SYSINT F87A T0 0028 T1 0029 T2 002A T8S4 FEB1 TBLJMP F869 TBUF 0080 TCTL 002B TD0 EE94 TD1 EF14 TD2 EF94 TD3 F014 TPLT FA84 TRACK F486 TST128 FE29 UNACNT F493 UNADSK F494 UNASEC F496 UNATRK F495 UTABLE F080 UTBLP F4A8 VALID FB62 VALID1 FB6E VALID2 FB88 VALID3 FB7F VERS 0016 WBOOT F990 WBOOT8 F9EC WBOOT9 FA66 WBOOTA FA2B WBOOTB FA5B WBOOTE EA03 WRALL 0000 TDL Z80 CP/M DISK ASSEMBLER VERSION 2.21 PAGE 26 < GSR COMPUTERS MONITOR > +++++ SYMBOL TABLE +++++ WRDAT FDA7 WRDIR 0001 WRT1 FDAE WRTYPE F492 WRUAL 0002