SYSGEN MACRO-80 3.36 17-Mar-80 PAGE 1 TITLE SYSGEN SUBTTL System generation program .COMMENT \ This is a rewritten version of SYSGEN 2.0 modified to run on CP/M 2.0. It uses the disk parameter blocks and sector skew tables supplied by the user's BIOS, so that these do not have to reside within the program itself, resulting in different versions of SYSGEN for each type of drive. This version is universal and may be used on any drive where the operating system is on the first tracks of the disk and the first physical sector number is one. It may even be used to transfer an operating system from one type of drive to another. Digital Research neglected writing a new version of SYSGEN when they released CP/M 2.0, so PCE Systems wrote this version. \ .Z80 000D CR EQU 0DH 000A LF EQU 0AH 0000 WBOOT EQU 0 0005 BDOS EQU 5 005C TFCB EQU 5CH 0900 CPMADD EQU 900H 0000' C3 0169' SYSGEN: JP START 0003' 43 6F 70 79 DEFB "Copyright (c) 1979, PCE Systems" 0007' 72 69 67 68 000B' 74 20 28 63 000F' 29 20 31 39 0013' 37 39 2C 20 0017' 50 43 45 20 001B' 53 79 73 74 001F' 65 6D 73 0022' 0019 CPMLEN: DEFW 25 ;SYSTEM TRACKS ARE ALWAYS SINGLE DENSITY. 0024' 67 SHIFT: LD H,A 0025' 2E 00 LD L,0 0027' CB 3C SRL H 0029' CB 1D RR L 002B' C9 RET 002C' 0E 01 INPDRV: LD C,1 002E' CD 0005 CALL BDOS 0031' FE 61 CP "a" 0033' D8 RET C ;IF <"a" SYSGEN MACRO-80 3.36 17-Mar-80 PAGE 1-1 System generation program 0034' FE 7B CP "z"+1 0036' D0 RET NC ;IF >"z" 0037' E6 5F AND 01011111B 0039' C9 RET 003A' 5F CONOUT: LD E,A 003B' 0E 02 LD C,2 003D' C3 0005 JP BDOS 0040' 3E 0D NEWLIN: LD A,CR 0042' CD 003A' CALL CONOUT 0045' 3E 0A LD A,LF 0047' 18 F1 JR CONOUT 0049' E5 NEWOUT: PUSH HL 004A' CD 0040' CALL NEWLIN 004D' E1 POP HL 004E' 7E OUTBUF: LD A,(HL) 004F' B7 OR A 0050' C8 RET Z 0051' E5 PUSH HL 0052' CD 003A' CALL CONOUT 0055' E1 POP HL 0056' 23 INC HL 0057' 18 F5 JR OUTBUF 0059' 4F SELDS1: LD C,A 005A' 2A 0001 LD HL,(WBOOT+1) 005D' 11 0018 LD DE,18H 0060' 19 ADD HL,DE ;COMPUTE ADDRESS OF SELDSK ENTRY TO BIOS 0061' E9 JP (HL) 0062' CD 0059' SELDSK: CALL SELDS1 0065' E5 PUSH HL 0066' 7C LD A,H 0067' B5 OR L 0068' 20 02 JR NZ,SELDS2 006A' E1 POP HL 006B' C9 RET 006C' E1 SELDS2: POP HL 006D' 5E LD E,(HL) 006E' 23 INC HL 006F' 56 LD D,(HL) 0070' ED 53 03A1' LD (SKEW),DE 0074' 11 0009 LD DE,9 0077' 19 ADD HL,DE SYSGEN MACRO-80 3.36 17-Mar-80 PAGE 1-2 System generation program 0078' 5E LD E,(HL) 0079' 23 INC HL 007A' 56 LD D,(HL) 007B' EB EX DE,HL 007C' 5E LD E,(HL) 007D' 23 INC HL 007E' 56 LD D,(HL) 007F' ED 53 039F' LD (MAXSEC),DE 0083' 2A 0022' LD HL,(CPMLEN) 0086' 01 0000 LD BC,0 0089' 03 ANOTRK: INC BC 008A' B7 OR A ;CLEAR CARRY FLAG 008B' ED 52 SBC HL,DE 008D' 30 FA JR NC,ANOTRK 008F' ED 43 039D' LD (MAXTRK),BC 0093' C9 RET 0094' 2A 0001 SETTRK: LD HL,(WBOOT+1) 0097' 11 001B LD DE,1BH 009A' 19 ADD HL,DE 009B' E9 JP (HL) 009C' 2A 0001 SETSEC: LD HL,(WBOOT+1) 009F' 11 001E LD DE,1EH 00A2' 19 ADD HL,DE 00A3' E9 JP (HL) 00A4' 2A 0001 SETDMA: LD HL,(WBOOT+1) 00A7' 11 0021 LD DE,21H 00AA' 19 ADD HL,DE 00AB' E9 JP (HL) 00AC' 2A 0001 READ: LD HL,(WBOOT+1) 00AF' 11 0024 LD DE,24H 00B2' 19 ADD HL,DE 00B3' E9 JP (HL) 00B4' 2A 0001 WRITE: LD HL,(WBOOT+1) 00B7' 11 0027 LD DE,27H 00BA' 19 ADD HL,DE 00BB' E9 JP (HL) 00BC' 2A 0001 SECTRN: LD HL,(WBOOT+1) 00BF' D5 PUSH DE 00C0' 11 002D LD DE,2DH 00C3' 19 ADD HL,DE SYSGEN MACRO-80 3.36 17-Mar-80 PAGE 1-3 System generation program 00C4' D1 POP DE 00C5' E9 JP (HL) 00C6' 0E 14 READNR: LD C,14H 00C8' C3 0005 JP BDOS 00CB' 21 0880 DISKIO: LD HL,CPMADD-80H 00CE' 22 039A' LD (TRANAD),HL 00D1' 21 FFFF LD HL,-1 00D4' 22 0395' LD (TRACK),HL 00D7' 2A 0395' FSTSEC: LD HL,(TRACK) 00DA' 23 INC HL 00DB' 22 0395' LD (TRACK),HL 00DE' ED 5B 039D' LD DE,(MAXTRK) 00E2' B7 OR A 00E3' ED 52 SBC HL,DE 00E5' C8 RET Z 00E6' ED 4B 0395' LD BC,(TRACK) 00EA' CD 0094' CALL SETTRK 00ED' 21 FFFF LD HL,-1 00F0' 22 0397' LD (SECTOR),HL 00F3' 2A 0397' NXTSEC: LD HL,(SECTOR) 00F6' 23 INC HL 00F7' 22 0397' LD (SECTOR),HL 00FA' ED 5B 039F' LD DE,(MAXSEC) 00FE' B7 OR A 00FF' ED 52 SBC HL,DE 0101' 28 55 JR Z,NXTTRK 0103' ED 4B 0397' LD BC,(SECTOR) 0107' ED 5B 03A1' LD DE,(SKEW) 010B' CD 00BC' CALL SECTRN 010E' 44 LD B,H 010F' 4D LD C,L 0110' C5 PUSH BC 0111' CD 009C' CALL SETSEC 0114' C1 POP BC 0115' 79 LD A,C 0116' CD 0024' CALL SHIFT 0119' EB EX DE,HL 011A' 2A 039A' LD HL,(TRANAD) 011D' 19 ADD HL,DE 011E' 44 LD B,H 011F' 4D LD C,L 0120' CD 00A4' CALL SETDMA 0123' AF XOR A 0124' 32 039C' LD (NTIMES),A SYSGEN MACRO-80 3.36 17-Mar-80 PAGE 1-4 System generation program 0127' 3A 039C' DSKERR: LD A,(NTIMES) 012A' FE 0A CP 10 012C' 38 13 JR C,TRYAGN 012E' 21 0316' LD HL,PERMSG 0131' CD 004E' CALL OUTBUF 0134' CD 002C' CALL INPDRV 0137' FE 0D CP CR 0139' C2 0000 JP NZ,WBOOT 013C' CD 0040' CALL NEWLIN 013F' 18 B2 JR NXTSEC 0141' 3C TRYAGN: INC A 0142' 32 039C' LD (NTIMES),A 0145' 3A 0399' LD A,(RWFLAG) 0148' B7 OR A 0149' 28 05 JR Z,READ1 014B' CD 00B4' CALL WRITE 014E' 18 03 JR SKIPRD 0150' CD 00AC' READ1: CALL READ 0153' B7 SKIPRD: OR A 0154' 28 9D JR Z,NXTSEC 0156' 18 CF JR DSKERR 0158' 3A 039F' NXTTRK: LD A,(MAXSEC) 015B' CD 0024' CALL SHIFT 015E' EB EX DE,HL 015F' 2A 039A' LD HL,(TRANAD) 0162' 19 ADD HL,DE 0163' 22 039A' LD (TRANAD),HL 0166' C3 00D7' JP FSTSEC 0169' 0E 0C START: LD C,12 ;RETURN VERSION NUMBER 016B' CD 0005 CALL BDOS 016E' 7C LD A,H 016F' B5 OR L 0170' 20 06 JR NZ,START1 0172' 21 0247' LD HL,OLDMSG 0175' C3 004E' JP OUTBUF 0178' 21 026B' START1: LD HL,SYSMSG 017B' CD 004E' CALL OUTBUF 017E' 3A 005D LD A,(TFCB+1) 0181' FE 20 CP " " 0183' 28 43 JR Z,SOURCE 0185' 11 005C LD DE,TFCB 0188' 0E 0F LD C,0FH ;OPEN FILE 018A' CD 0005 CALL BDOS 018D' 3C INC A 018E' 20 06 JR NZ,EXISTS SYSGEN MACRO-80 3.36 17-Mar-80 PAGE 1-5 System generation program 0190' 21 0365' LD HL,NSCMSG 0193' C3 0049' JP NEWOUT 0196' AF EXISTS: XOR A 0197' 32 007C LD (TFCB+32),A 019A' 06 10 LD B,10H ;NUMBER OF RECORDS TO SKIP 019C' C5 SKPAGN: PUSH BC 019D' 11 005C LD DE,TFCB 01A0' CD 00C6' CALL READNR 01A3' C1 POP BC 01A4' B7 OR A 01A5' 28 06 JR Z,NOTDON 01A7' 21 037D' LD HL,INCMSG 01AA' C3 0049' JP NEWOUT 01AD' 10 ED NOTDON: DJNZ SKPAGN 01AF' 21 0900 LD HL,CPMADD 01B2' E5 READAG: PUSH HL 01B3' 44 LD B,H 01B4' 4D LD C,L 01B5' CD 00A4' CALL SETDMA 01B8' 11 005C LD DE,TFCB 01BB' CD 00C6' CALL READNR 01BE' E1 POP HL 01BF' B7 OR A 01C0' 20 41 JR NZ,DEST 01C2' 11 0080 LD DE,80H ;NUMBER OF BYTES IN A SECTOR 01C5' 19 ADD HL,DE 01C6' 18 EA JR READAG 01C8' 21 027E' SOURCE: LD HL,SRCMSG 01CB' CD 0049' CALL NEWOUT 01CE' CD 002C' CALL INPDRV 01D1' FE 0D CP CR 01D3' 28 2E JR Z,DEST 01D5' 32 02AF' LD (DRVSRC),A 01D8' D6 41 SUB "A" 01DA' CD 0062' CALL SELDSK 01DD' 38 05 JR C,DRVOK 01DF' CD 0241' CALL INVDRV 01E2' 18 E4 JR SOURCE 01E4' CD 0040' DRVOK: CALL NEWLIN 01E7' 21 02A5' LD HL,GETMSG 01EA' CD 004E' CALL OUTBUF 01ED' CD 002C' CALL INPDRV 01F0' FE 0D CP CR 01F2' C0 RET NZ 01F3' CD 0040' CALL NEWLIN 01F6' AF XOR A SYSGEN MACRO-80 3.36 17-Mar-80 PAGE 1-6 System generation program 01F7' 32 0399' LD (RWFLAG),A 01FA' CD 00CB' CALL DISKIO 01FD' 21 033E' LD HL,CPLMSG 0200' CD 004E' CALL OUTBUF 0203' 21 02C4' DEST: LD HL,DESMSG 0206' CD 0049' CALL NEWOUT 0209' CD 002C' CALL INPDRV 020C' FE 0D CP CR 020E' CA 0000 JP Z,WBOOT 0211' 32 0301' LD (DRVDES),A 0214' D6 41 SUB "A" 0216' CD 0062' CALL SELDSK 0219' 38 05 JR C,DRVOK1 021B' CD 0241' CALL INVDRV 021E' 18 E3 JR DEST 0220' 21 02F2' DRVOK1: LD HL,PUTMSG 0223' CD 0049' CALL NEWOUT 0226' CD 002C' CALL INPDRV 0229' FE 0D CP CR 022B' C2 0000 JP NZ,WBOOT 022E' CD 0040' CALL NEWLIN 0231' 21 0399' LD HL,RWFLAG 0234' 36 01 LD (HL),1 0236' CD 00CB' CALL DISKIO 0239' 21 033E' LD HL,CPLMSG 023C' CD 004E' CALL OUTBUF 023F' 18 C2 JR DEST 0241' 21 0351' INVDRV: LD HL,INVMSG 0244' C3 0049' JP NEWOUT 0247' 52 65 71 75 OLDMSG: DEFB "Requires CP/M version 2.0 or later.",0 024B' 69 72 65 73 024F' 20 43 50 2F 0253' 4D 20 76 65 0257' 72 73 69 6F 025B' 6E 20 32 2E 025F' 30 20 6F 72 0263' 20 6C 61 74 0267' 65 72 2E 00 026B' 53 59 53 47 SYSMSG: DEFB "SYSGEN Version 2.0",0 026F' 45 4E 20 56 0273' 65 72 73 69 0277' 6F 6E 20 32 027B' 2E 30 00 SYSGEN MACRO-80 3.36 17-Mar-80 PAGE 1-7 System generation program 027E' 53 6F 75 72 SRCMSG: DEFB "Source drive name (or RETURN to skip):",0 0282' 63 65 20 64 0286' 72 69 76 65 028A' 20 6E 61 6D 028E' 65 20 28 6F 0292' 72 20 52 45 0296' 54 55 52 4E 029A' 20 74 6F 20 029E' 73 6B 69 70 02A2' 29 3A 00 02A5' 53 6F 75 72 GETMSG: DEFB "Source on " 02A9' 63 65 20 6F 02AD' 6E 20 02AF' 20 2C 20 74 DRVSRC: DEFB " , then type RETURN:",0 02B3' 68 65 6E 20 02B7' 74 79 70 65 02BB' 20 52 45 54 02BF' 55 52 4E 3A 02C3' 00 02C4' 44 65 73 74 DESMSG: DEFB "Destination drive name (or RETURN to reboot):",0 02C8' 69 6E 61 74 02CC' 69 6F 6E 20 02D0' 64 72 69 76 02D4' 65 20 6E 61 02D8' 6D 65 20 28 02DC' 6F 72 20 52 02E0' 45 54 55 52 02E4' 4E 20 74 6F 02E8' 20 72 65 62 02EC' 6F 6F 74 29 02F0' 3A 00 02F2' 44 65 73 74 PUTMSG: DEFB "Destination on " 02F6' 69 6E 61 74 02FA' 69 6F 6E 20 02FE' 6F 6E 20 0301' 20 2C 20 74 DRVDES: DEFB " , then type RETURN:",0 0305' 68 65 6E 20 0309' 74 79 70 65 030D' 20 52 45 54 0311' 55 52 4E 3A 0315' 00 SYSGEN MACRO-80 3.36 17-Mar-80 PAGE 1-8 System generation program 0316' 50 65 72 6D PERMSG: DEFB "Permanent error, type RETURN to ignore:",0 031A' 61 6E 65 6E 031E' 74 20 65 72 0322' 72 6F 72 2C 0326' 20 74 79 70 032A' 65 20 52 45 032E' 54 55 52 4E 0332' 20 74 6F 20 0336' 69 67 6E 6F 033A' 72 65 3A 00 033E' 46 75 6E 63 CPLMSG: DEFB "Function complete.",0 0342' 74 69 6F 6E 0346' 20 63 6F 6D 034A' 70 6C 65 74 034E' 65 2E 00 0351' 49 6E 76 61 INVMSG: DEFB "Invalid drive name.",0 0355' 6C 69 64 20 0359' 64 72 69 76 035D' 65 20 6E 61 0361' 6D 65 2E 00 0365' 4E 6F 20 73 NSCMSG: DEFB "No source file on disk.",0 0369' 6F 75 72 63 036D' 65 20 66 69 0371' 6C 65 20 6F 0375' 6E 20 64 69 0379' 73 6B 2E 00 037D' 53 6F 75 72 INCMSG: DEFB "Source file incomplete.",0 0381' 63 65 20 66 0385' 69 6C 65 20 0389' 69 6E 63 6F 038D' 6D 70 6C 65 0391' 74 65 2E 00 0395' TRACK: DEFS 2 0397' SECTOR: DEFS 2 0399' RWFLAG: DEFS 1 039A' TRANAD: DEFS 2 039C' NTIMES: DEFS 1 039D' MAXTRK: DEFS 2 039F' MAXSEC: DEFS 2 03A1' SKEW: DEFS 2 END SYSGEN SYSGEN MACRO-80 3.36 17-Mar-80 PAGE S System generation program Macros: Symbols: ANOTRK 0089' BDOS 0005 CONOUT 003A' CPLMSG 033E' CPMADD 0900 CPMLEN 0022' CR 000D DESMSG 02C4' DEST 0203' DISKIO 00CB' DRVDES 0301' DRVOK 01E4' DRVOK1 0220' DRVSRC 02AF' DSKERR 0127' EXISTS 0196' FSTSEC 00D7' GETMSG 02A5' INCMSG 037D' INPDRV 002C' INVDRV 0241' INVMSG 0351' LF 000A MAXSEC 039F' MAXTRK 039D' NEWLIN 0040' NEWOUT 0049' NOTDON 01AD' NSCMSG 0365' NTIMES 039C' NXTSEC 00F3' NXTTRK 0158' OLDMSG 0247' OUTBUF 004E' PERMSG 0316' PUTMSG 02F2' READ 00AC' READ1 0150' READAG 01B2' READNR 00C6' RWFLAG 0399' SECTOR 0397' SECTRN 00BC' SELDS1 0059' SELDS2 006C' SELDSK 0062' SETDMA 00A4' SETSEC 009C' SETTRK 0094' SHIFT 0024' SKEW 03A1' SKIPRD 0153' SKPAGN 019C' SOURCE 01C8' SRCMSG 027E' START 0169' START1 0178' SYSGEN 0000' SYSMSG 026B' TFCB 005C TRACK 0395' TRANAD 039A' TRYAGN 0141' WBOOT 0000 WRITE 00B4' No Fatal error(s)  NSCMSG 0365' NTIMES 039C'