2D-Studio/WINDOS2.ASM
2025-07-11 01:54:35 +10:00

571 lines
7.0 KiB
NASM

SDOS:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IX
PUSH IY
LD C,3
CALL INTMOUS
PUSH DE
PUSH HL
CALL INTOFF
DI
LD A,(DOSPAGE)
OUT (PAGE0),A
; LD BC,#1FFD
; LD A,1
; OUT (C),A
POP HL
POP DE
LD C,4
RST #30
LD C,#83
RST #30
POP IY
POP IX
POP HL
POP DE
POP BC
POP AF
RET
RDOS: DI
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IX
PUSH IY
LD C,2
RST #30
LD C,3
RST #30
PUSH DE
PUSH HL
LD A,(WINPAGE)
OUT (PAGE0),A
POP HL
POP DE
LD C,4
CALL INTMOUS
LD C,1
CALL INTMOUS
CALL INTON
; LD BC,#1FFD
; LD A,0
; OUT (C),A
; POP HL
; POP DE
; LD C,4
; CALL INTMOUS
POP IY
POP IX
POP HL
POP DE
POP BC
POP AF
EI
RET
REALN: DB "12345678.123",0
MFL: LD HL,DIRITEM
LD DE,REALN
LD BC,#0820
RDF1: LD A,(HL)
LD (DE),A
CP C
JR Z,RDF2
INC HL
INC DE
DJNZ RDF1
RDF2: LD A,"."
LD (DE),A
INC DE
LD HL,EXTITEM
LD BC,#0320
RDF3: LD A,(HL)
LD (DE),A
CP C
JR Z,RDF4
INC HL
INC DE
DJNZ RDF3
RDF4: XOR A
LD (DE),A
RET
SV_FILE: CALL MFL
CALL SDOS
IN A,(#E2)
PUSH AF
LD HL,REALN
CALL SAVERAM
; LD A,#0D
; LD C,#F1 ;!!!
; RST #10
EX AF,AF'
CALL RDOS
POP AF
OUT (#E2),A
EX AF,AF'
RET
SAVERAM:
XOR A
LD C,#0A ;CREATE FILE
RST #10
RET C
LD (F_HANDLE),A
; LD HL,0
; LD IX,0
; LD A,(F_HANDLE)
; LD BC,#0215 ;MOVE FILE POINTER TO END FILE
; RST #10
; LD (SIZE1),HL
; LD (SIZE0),IX
; CALL MEM_CLK
; JR C,CSFIL
CALL WRBLK
;CSFIL
LD A,(F_HANDLE)
LD C,#12 ;CLOSE FILE
RST #10
RET
WRBLK:
; LD HL,0
; LD IX,0
; LD A,(F_HANDLE)
; LD BC,#0015 ;MOVE FILE POINTER TO START FILE
; RST #10
LD A,#0D ;RAM DISK NUMBER
LD C,#CE ;GET RAM DISK'S ID
RST #08
RET C
LD B,0
LD C,#C4 ;GET PHISICAL PAGE NUMBER
RST #08
RET C
LD DE,(FHSIZE)
LD HL,(FLSIZE)
BWAGAIN:
AND A
LD BC,#4000
SBC HL,BC
EX DE,HL
LD BC,#0000
SBC HL,BC
EX DE,HL
JR C,ENDBLOKSAVE
PUSH DE
PUSH HL
CALL WR1
POP HL
POP DE
JR NC,BWAGAIN
RET
ENDBLOKSAVE:
LD BC,#4000
ADD HL,BC
EX DE,HL
PUSH AF
OUT (PAGE3),A
;;;;;;;;;;
LD A,7
OUT (#FE),A
;;;;;;;;;;
LD HL,#C000
; LD DE,#4000
LD C,#14 ;WRITE FILE
LD A,(F_HANDLE)
RST #10
POP BC
RET C
RET
WR1:
;BWAGAIN
PUSH AF
OUT (PAGE3),A
LD HL,#C000
LD DE,#4000
LD C,#14 ;WRITE FILE
LD A,(F_HANDLE)
RST #10
POP BC
RET C
CP #FF
SCF
RET Z
LD A,B
LD C,#C7 ;GET NEXT PAGE
RST #08
RET C
CP #FF
SCF
RET Z
AND A
RET
RD_FILE: CALL MFL
CALL SDOS
IN A,(#E2)
PUSH AF
LD HL,REALN
CALL READRAM
; LD A,#0D
; LD C,#F0
; RST #10
EX AF,AF'
CALL RDOS
POP AF
OUT (#E2),A
EX AF,AF'
RET
F_HANDLE: DB 0
SIZE0: DW 0
SIZE1: DW 0
READRAM:
XOR A
LD C,#11 ;OPEN FILE
RST #10
RET C
LD (F_HANDLE),A
LD HL,0
LD IX,0
LD A,(F_HANDLE)
LD BC,#0215 ;MOVE FILE POINTER TO END FILE
RST #10
LD (SIZE1),HL
LD (SIZE0),IX
CALL MEM_CLK
JR C,CLFIL
CALL RDBLK
CLFIL:
LD A,(F_HANDLE)
LD C,#12 ;CLOSE FILE
RST #10
RET
MEM_CLK: LD HL,(SIZE1)
LD BC,(SIZE0)
LD DE,16384
XOR A
SCF
KBT01: RR D
RR E
JR C,KBT02
RR H
RR L
RR B
RR C
JR NC,KBT01
LD A,1
JR KBT01
KBT02: OR A
JR Z,KBT03
INC BC
KBT03: XOR A
CP B
SCF
RET NZ
LD B,C ;SIZE IN BLOCKS 16k
PUSH BC
LD A,#0D
LD C,#93
RST #08
POP BC
LD A,#0D
LD C,#92
RST #08
RET
RDBLK:
LD HL,0
LD IX,0
LD A,(F_HANDLE)
LD BC,#0015 ;MOVE FILE POINTER TO START FILE
RST #10
LD A,#0D ;RAM DISK NUMBER
LD C,#CE ;GET RAM DISK'S ID
RST #08
RET C
LD B,0
LD C,#C4 ;GET PHISICAL PAGE NUMBER
RST #08
RET C
BLAGAIN: PUSH AF
OUT (PAGE3),A
LD HL,#C000
LD DE,#4000
LD C,#13 ;READ FILE
LD A,(F_HANDLE)
RST #10
POP BC
RET C
CP #FF
RET Z
LD A,B
LD C,#C7 ;GET NEXT PAGE
RST #08
RET C
CP #FF
JR NZ,BLAGAIN
RET
RD_DIR:
LD A,(DISK)
CALL CHDISK
LD HL,PATH
CALL CHDIR
CALL GET_DIR
RET
GET_DIR:
CALL SDOS
IN A,(#E2)
PUSH AF
LD A,(DIRPAGE)
OUT (#E2),A
LD HL,#C000
LD DE,#C001
LD BC,#3FFF
LD (HL),L
LDIR
CALL READDIR
PUSH AF
CALL RDOS
CALL SORT
LD HL,PLACED
LD DE,#C000
LD BC,#2000
LDIR
POP AF
EX AF,AF'
POP AF
OUT (#E2),A
EX AF,AF'
RET
DIRBUF: DS 44
PATH0: DB "*.*",0
READDIR:
; LD HL,PATH0
; LD C,#1E ;CURDIR
; RST #10
LD HL,PATH0
LD DE,DIRBUF
LD A,#37
LD BC,#0019 ;F_FIRST
RST #10
LD DE,#C000 ;DIR
JR C,NO_DIR
F_NEXT_ENTRY:
LD A,(DIRBUF+32) ;ATTRIBUT
; BIT 4,A
; CALL Z,TOLOWER
LD HL,DIRBUF+33 ;NAME
LD BC,11
LDIR
LD (DE),A
INC DE
LD HL,DIRBUF+12 ;OTHER INFORMATION
LD BC,20
LDIR
PUSH DE
LD DE,DIRBUF
LD C,#1A ;F_NEXT
RST #10
POP DE
JR NC,F_NEXT_ENTRY
NO_DIR: EX DE,HL
LD (HL),0
RET
CHDISK:
PUSH AF
CALL SDOS
POP AF
LD C,1
RST #10
PUSH AF
CALL RDOS
POP AF
RET
CHDIR: CALL SDOS
LD C,29
RST #10
PUSH AF
CALL RDOS
POP AF
RET NC
LD (#BF00),A
LD A,7
OUT (#FE),A
LD IY,#5C3A
RET
CH_DIR: LD DE,CHPATH
LD BC,11
LDIR
EX DE,HL
LD B,11
LD A,#20
RUN002: DEC HL
CP (HL)
JR NZ,RUN003
DJNZ RUN002
RUN003: INC HL
LD (HL),'\' ;
INC HL
LD (HL),#00
LD HL,CHPATH
CALL CHDIR
CALL GET_DIR
RET
DISK: DB #02
CHPATH: DB "123456781230",0
PATH: DB 'C:' ;
;DB 'C:\' ; ;!FIXIT
DS 255
DIRS: DEFW 0
POSITER: DEFW 0
FILES: DEFW 0
SORT: LD IX,#C000
LD HL,#E020
LD (ENDSORT),HL
LD HL,0
LD (FILES),HL
SORT_: LD A,(IX+0)
CP #E5
JP Z,ADDERA
OR A
RET Z
CP "."
JP NZ,SORTC
LD A,(IX+1)
CP #20
JP Z,ADDERA
SORTC: LD A,(IX+11)
LD E,A
AND #08
JP NZ,ADDERA
LD A,E
AND #10
JP NZ,ITDIREC
LD B,11
LD D,XH
LD E,XL
SORT_00: LD A,(DE)
CP "A"
JP C,SORT_01
CP "["
JP NC,SORT_01
ADD A,#20
SORT_01: LD (DE),A
INC DE
DJNZ SORT_00
ITDIREC: LD D,XH
LD E,XL
CALL SORTER
LD HL,(FILES)
INC HL
LD (FILES),HL
ADDERA: LD BC,#0020
ADD IX,BC
JP SORT_
SORTER: LD HL,PLACED
SORTER0: LD A,(HL)
OR A
JP Z,SORTINS
PUSH DE
PUSH HL
LD B,11
SORT1: LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JP NZ,SORT2
INC DE
INC HL
DJNZ SORT1
SORT2: POP HL
POP DE
JP C,SORTINS
SORT3: LD BC,#0020
ADD HL,BC
JP SORTER0
SORTINS: PUSH DE
PUSH HL
EX DE,HL
LD HL,(ENDSORT)
PUSH HL
AND A
SBC HL,DE
LD B,H
LD C,L
POP DE
LD HL,#0020
ADD HL,DE
LD (ENDSORT),HL
JP Z,EMPPLC
EX DE,HL
DEC HL
DEC DE
LDDR
EMPPLC: POP DE
POP HL
LD BC,#0020
LDIR
RET
ENDSORT: DEFW #E020
PLACED: EQU #E000