home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
DRI-archive
/
roche
/
GSX.ASM
< prev
next >
Wrap
Assembly Source File
|
2009-12-11
|
10KB
|
535 lines
; 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