; GSX.ASM ; ------- ; ; CP/M-80 - GSX-80 Version 1.1 ; ; Disassembled by: ; ; ROCHE Emmanuel ; 8 rue HERLUISON ; 10000 TROYES ; FRANCE ; ------ ; ;-------------------------------- ; PAGE 0 ; Listing without page breaks ; ; ORG 0000H ; CP/M-80 SYStem file ; ORG 0100H ; Debug only ; ;-------------------------------- ; List of ASCII characters used ; lf equ 0AH ; Line Feed cr equ 0DH ; Carriage Return ; ;-------------------------------- ; List of BDOS functions used ; conout equ 2 ; Console output pstring equ 9 ; Print string openf equ 15 ; Open file closef equ 16 ; Close file readf equ 20 ; Read sequential setDMA equ 26 ; Set DMA address ; ;-------------------------------- ; J0000 EQU 0000H ; J---I I$0004 EQU 0004H ; ----I I$000B EQU 000BH ; ----I DBUF EQU 0080H ; ----I I0500 EQU 0500H ; ----I I$FFB5 EQU 0FFB5H ; ----I ; ;-------------------------------- ; JMP start1 ; Start of code ; ;-------------------------------- ; Indirect call to BDOS ; BDOS: DB 0C3H ; JMP opcode ; D$0104 DW 0000H ; Storage for ??? ; ;-------------------------------- ; D0106: DB 0FFH,0FFH ; ? Separator? ; ; DDtabl: ds 55 ; 55 bytes = 5 times 11 bytes ; ; Table of DD filenames ; ; Format: ; 1 byte for the drive code ; 2 bytes for ??? ; 8 bytes for the DD filename (total = 11 bytes per driver) ; ; DB 0FFH ; ? Separator? DB 0FFH ; ? ; ;-------------------------------- ; copyr: DB '---------------------------------------------------', cr, lf DB 'GSX-80 1.1 01 Oct 83 Serial No 5000-1232-654321', cr, lf DB 'Copyright (C) 1983 ', cr, lf DB 'Digital Research, Inc. All Rights Reserved', cr, lf DDused: DB '---------------------------------------------------', cr, lf, '$' ; ; Note: ; The first three lines of the copyright message ; are utilized by the GDOS to store the contents of ASSIGN.SYS. ; D$0142 equ copyr + 1 ; 2nd byte of first line ; ; The last line of the copyright message ; is used to store the FCB of the DD used. ; I$021E equ DDused + 9 ; PRL filetype of DD used I$0235 equ DDused + 32 ; Last byte of the FCB of DD used ; ;-------------------------------- ; D024B: ds 34 ; ??? ; ;-------------------------------- ; start1: MOV A,C ; Reg-A = BDOS function number CPI 73H ; = 115 ? (GSX function number) JNZ BDOS ; No: jump back to BDOS LXI H,word1 ; MVI C,0AH ; 10 CALL copy ; LHLD word1 ; MOV A,M ; INX H ; MOV H,M ; MOV L,A ; DCX H ; MOV A,H ; ORA L ; JZ J$0291 ; CALL C$02EA ; CALL C04FD ; J$028E: JMP J$0351 ; ; ;-------------------------------- ; J$0291: LHLD word2 ; MOV E,M ; INX H ; MOV D,M ; LHLD D0106 ; CALL sub16 ; JZ J02CE ; LXI H,DDtabl ; J$02A3: PUSH H ; MOV A,M ; INX H ; MOV H,M ; MOV L,A ; ANA H ; INR A ; POP B ; JZ J02CE ; PUSH B ; CALL sub16 ; POP H ; JZ J$02BD ; LXI B,I$000B ; DAD B ; JMP J$02A3 ; ; ;-------------------------------- ; J$02BD: INX H ; INX H ; XCHG ; SHLD D0106 ; LXI H,DDused ; File spec in copyr msg MVI C,09H ; 9 CALL copy ; CALL C$03C8 ; J02CE: CALL C04FD ; LHLD word4 ; MOV A,M ; INX H ; PUSH H ; MOV H,M ; MOV L,A ; INX H ; SHLD word6 ; POP H ; INX H ; MOV A,M ; INX H ; MOV H,M ; MOV L,A ; INX H ; SHLD word7 ; JMP J$028E ; ; ;-------------------------------- ; C$02EA: LHLD word1 ; INX H ; INX H ; MOV E,M ; INX H ; MOV D,M ; MOV A,E ; ORA D ; RZ ; LXI H,I$FFB5 ; DAD D ; JNC J$02FE ; MVI E,4BH ; "K" J$02FE: LHLD word3 ; PUSH H ; LXI H,copyr ; Copyright message SHLD word3 ; PUSH H ; POP B ; POP H ; J$030B: PUSH D ; XCHG ; LHLD word6 ; CALL C0320 ; XCHG ; LHLD word7 ; CALL C0320 ; POP D ; DCR E ; JNZ J$030B ; RET ; ; ;-------------------------------- ; C0320: XCHG ; MOV A,M ; INX H ; PUSH H ; MOV H,M ; PUSH B ; MOV L,A ; MVI C,0FH ; 15 PUSH D ; XCHG ; LXI H,J0000 ; J$032E: MOV A,D ; RAR ; MOV D,A ; MOV A,E ; RAR ; MOV E,A ; JNC J$033C ; MOV A,C ; POP B ; PUSH B ; DAD B ; MOV C,A ; J$033C: MOV A,H ; RAR ; MOV H,A ; MOV A,L ; RAR ; MOV L,A ; DCR C ; JNZ J$032E ; POP B ; POP B ; MOV A,L ; STAX B ; INX B ; MOV A,H ; STAX B ; INX B ; POP H ; INX H ; RET ; ; ;-------------------------------- ; J$0351: LHLD word1 ; LXI D,I$0004 ; DAD D ; MOV C,M ; INX H ; MOV B,M ; LHLD word5 ; J$035E: MOV A,C ; ORA B ; RZ ; PUSH B ; XCHG ; LHLD word6 ; CALL C0375 ; XCHG ; LHLD word7 ; CALL C0375 ; POP B ; DCX B ; JMP J$035E ; ; ;-------------------------------- ; C0375: MOV B,H ; MOV C,L ; XCHG ; MOV E,M ; PUSH H ; INX H ; MOV D,M ; XCHG ; MVI A,10H ; 16 LXI D,J0000 ; J$0382: PUSH PSW ; XCHG ; DAD H ; XCHG ; DAD H ; MOV A,L ; SUB C ; MOV L,A ; MOV A,H ; SBB B ; MOV H,A ; JNC J$0392 ; DAD B ; DCX D ; J$0392: INX D ; POP PSW ; DCR A ; JNZ J$0382 ; ANA A ; MOV A,D ; RAR ; MOV D,A ; MOV A,E ; RAR ; MOV E,A ; JNC J$03A3 ; INX D ; J$03A3: POP H ; MOV M,E ; INX H ; MOV M,D ; INX H ; RET ; ; ;-------------------------------- ; copy: LDAX D ; MOV M,A ; INX H ; INX D ; DCR C ; JNZ copy ; RET ; ; ;-------------------------------- ; 16 bits subtraction ; sub16: MOV A,L ; SUB E ; MOV L,A ; MOV A,H ; SBB D ; MOV H,A ; ORA L ; RET ; ; ;-------------------------------- ; word1: DW 0 ; ? word2: DW 0 ; ? word3: DW 0 ; ? word4: DW 0 ; ? word5: DW 0 ; ? word6: DW 0 ; ? word7: DW 0 ; ? ; ;-------------------------------- ; C$03C8: CALL C$043D ; CALL readAS ; Read ASSIGN.SYS LHLD D$0104 ; LXI D,I0500 ; CALL sub16 ; XCHG ; LHLD D$0142 ; PUSH H ; MOV A,E ; SUB L ; MOV A,D ; SBB H ; JNC J$03E9 ; LXI D,toobig ; 'too big to load$' JMP drive ; Display d:filename.typ ; ;-------------------------------- ; J$03E9: CALL readAS ; Read ASSIGN.SYS POP B ; PUSH B ; LXI H,I0500 ; PUSH H ; J$03F2: CALL C0421 ; MOV M,A ; INX H ; DCX B ; MOV A,C ; ORA B ; JNZ J$03F2 ; POP H ; MOV B,H ; DCR B ; POP D ; J$0401: MVI C,08H ; 8 CALL C0421 ; J$0406: RLC ; PUSH PSW ; JNC J$040E ; MOV A,B ; ADD M ; MOV M,A ; J$040E: INX H ; DCX D ; MOV A,D ; ORA E ; JZ J$041D ; POP PSW ; DCR C ; JNZ J$0406 ; JMP J$0401 ; ; ;-------------------------------- ; J$041D: POP PSW ; JMP J$0463 ; ; ;-------------------------------- ; C0421: PUSH H ; PUSH D ; LHLD D024B ; INR L ; JP J$0432 ; PUSH B ; CALL readAS ; Read ASSIGN.SYS POP B ; LXI H,J0000 ; J$0432: SHLD D024B ; LXI D,copyr ; Copyright message DAD D ; MOV A,M ; POP D ; POP H ; RET ; ; ;-------------------------------- ; C$043D: LXI D,PRLtyp ; PRL filetype LXI H,I$021E ; MVI C,06H ; 6 CALL copy ; LXI H,DBUF ; SHLD D024B ; LXI D,DDused ; File spec in copyr msg MVI C,openf ; Open file CALL BDOS ; LXI H,I$0235 ; MVI M,00H ; J$045B: ORA A ; RP ; LXI D,nfound ; ' not found$' JMP drive ; Display d:filename.typ ; ;-------------------------------- ; J$0463: LXI D,DDused ; File spec in copyr msg MVI C,closef ; Close file CALL BDOS ; JMP J$045B ; ; ;-------------------------------- ; Display a char on console ; pchar: PUSH H ; MVI C,conout ; Console output CALL BDOS ; POP H ; RET ; ; ;-------------------------------- ; Parse n+1 chars and display them ; parse: DCR A ; RZ ; MOV E,M ; INX H ; PUSH PSW ; CALL pchar ; POP PSW ; JMP parse ; ; ;-------------------------------- ; Read ASSIGN.SYS file and copy it in copyright message ; readAS: LXI D,copyr ; Copyright message = DMA area... MVI C,setDMA ; Set DMA Address CALL BDOS ; LXI D,DDused ; File spec in copyr msg MVI C,readf ; Read sequential CALL BDOS ; ORA A ; Successful read ? RZ ; LXI D,whyEOF ; ': unexpected EOF$' drive: PUSH D ; LXI H,DDused ; File spec in copyr msg MOV A,M ; ORA A ; Was a drive specified ? JZ nodriv ; ADI 40H ; Convert drive code in a number MOV E,A ; CALL pchar ; Display drive letter MVI E,':' ; Drive separator CALL pchar ; Display it nodriv: INX H ; MVI A,8+1 ; Filename CALL parse ; MVI E,'.' ; Filename separator CALL pchar ; MVI A,3+1 ; Filetype CALL parse ; POP D ; MVI C,pstring ; Print string CALL BDOS ; JMP 0000H ; Back to CP/M ; ;-------------------------------- ; toobig: DB ' too big to load$' ; whyEOF: DB ': unexpected EOF$' ; nfound: DB ' not found$' ; PRLtyp: DB 'PRL' ; PRL filetype ; ds 8 ; ? ; ;-------------------------------- ; C04FD: LXI D,word1 ; ? ; ; The next byte is the first byte of the loaded driver. ;-------------------------------- ; END ; CP/M-80 SYStem file