Merge pull request #214 from davidgiven/dtrg-cpm2
Enhance the CP/M libsys.
This commit is contained in:
commit
191c4a30e2
|
@ -54,6 +54,17 @@ typedef struct
|
||||||
}
|
}
|
||||||
DPB;
|
DPB;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t xlt[2]; /* address of translation vector */
|
||||||
|
uint8_t scratch[6]; /* BDOS scratchpad */
|
||||||
|
uint8_t dirbuf[2]; /* address of directory scratchpad */
|
||||||
|
uint8_t dpb[2]; /* address of DPB */
|
||||||
|
uint8_t csv[2]; /* address of disk change scratchpad */
|
||||||
|
uint8_t alv[2]; /* address of allocation bitmap */
|
||||||
|
}
|
||||||
|
DPH;
|
||||||
|
|
||||||
/* Access an unaligned field (see above). */
|
/* Access an unaligned field (see above). */
|
||||||
#define U16(ptr) (*(uint16_t*)(ptr))
|
#define U16(ptr) (*(uint16_t*)(ptr))
|
||||||
|
|
||||||
|
@ -129,8 +140,22 @@ extern void cpm_printstring0(const char* s);
|
||||||
#define cpm_get_user() cpm_get_set_user(0xff)
|
#define cpm_get_user() cpm_get_set_user(0xff)
|
||||||
#define cpm_set_user(u) cpm_get_set_user(u)
|
#define cpm_set_user(u) cpm_get_set_user(u)
|
||||||
|
|
||||||
extern uint8_t bios_conin(void);
|
extern void cpm_bios_boot(void);
|
||||||
extern uint8_t bios_const(void);
|
extern void cpm_bios_wboot(void);
|
||||||
extern void bios_conout(uint8_t c);
|
extern uint8_t cpm_bios_const(void);
|
||||||
|
extern uint8_t cpm_bios_conin(void);
|
||||||
|
extern void cpm_bios_conout(uint8_t c);
|
||||||
|
extern void cpm_bios_list(uint8_t c);
|
||||||
|
extern void cpm_bios_punch(uint8_t c);
|
||||||
|
extern uint8_t cpm_bios_reader(void);
|
||||||
|
extern void cpm_bios_home(void);
|
||||||
|
extern DPH* cpm_bios_seldsk(uint8_t disk);
|
||||||
|
extern void cpm_bios_settrk(uint16_t track);
|
||||||
|
extern void cpm_bios_setsec(uint16_t sector);
|
||||||
|
extern void cpm_bios_setdma(void* dma);
|
||||||
|
extern uint8_t cpm_bios_read(void);
|
||||||
|
extern uint8_t cpm_bios_write(void);
|
||||||
|
extern uint8_t cpm_bios_listst(void);
|
||||||
|
extern uint16_t cpm_bios_sectran(uint8_t* table, uint16_t sector);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
22
plat/cpm/libsys/_bios.s
Normal file
22
plat/cpm/libsys/_bios.s
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#
|
||||||
|
#include "asm.h"
|
||||||
|
|
||||||
|
! Calls a BIOS routine which returns its value in A.
|
||||||
|
! a = BIOS offset
|
||||||
|
|
||||||
|
.define call_bios_a
|
||||||
|
call_bios_a:
|
||||||
|
pop h ! pop return address
|
||||||
|
pop d ! pop parameter (possibly junk)
|
||||||
|
push d
|
||||||
|
push h
|
||||||
|
push b ! save FP as we'll corrupt it
|
||||||
|
|
||||||
|
mov b, d ! put parameter in BC
|
||||||
|
mov c, e
|
||||||
|
call call_bios_raw
|
||||||
|
|
||||||
|
pop b
|
||||||
|
mov e, a ! put result in DE
|
||||||
|
mvi d, 0
|
||||||
|
ret
|
14
plat/cpm/libsys/_bios_raw.s
Normal file
14
plat/cpm/libsys/_bios_raw.s
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#
|
||||||
|
#include "asm.h"
|
||||||
|
|
||||||
|
! Low level BIOS call routine. The entrypoint offset from WBOOT is in A.
|
||||||
|
! HL is corrupted on entry.
|
||||||
|
.define call_bios_raw
|
||||||
|
call_bios_raw:
|
||||||
|
lhld 1 ! get BIOS entrypoint + 3
|
||||||
|
add l ! add on offset (the -3 is supplied by the caller)
|
||||||
|
mov l, a
|
||||||
|
jnc .1
|
||||||
|
inr h
|
||||||
|
.1:
|
||||||
|
pchl ! call the routine
|
|
@ -1,15 +0,0 @@
|
||||||
#
|
|
||||||
#include "asm.h"
|
|
||||||
|
|
||||||
.define _bios_conin
|
|
||||||
_bios_conin:
|
|
||||||
lhld 1
|
|
||||||
lxi d, 6
|
|
||||||
dad d
|
|
||||||
push b
|
|
||||||
call .pchl
|
|
||||||
pop b
|
|
||||||
mov e, a
|
|
||||||
mvi d, 0
|
|
||||||
ret
|
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
#
|
|
||||||
#include "asm.h"
|
|
||||||
|
|
||||||
.define _bios_conout
|
|
||||||
_bios_conout:
|
|
||||||
pop h ! pop return address
|
|
||||||
pop d ! pop parameter into DE
|
|
||||||
push d
|
|
||||||
push h
|
|
||||||
|
|
||||||
push b
|
|
||||||
mov c, e
|
|
||||||
|
|
||||||
lhld 1
|
|
||||||
lxi d, 9
|
|
||||||
dad d
|
|
||||||
call .pchl
|
|
||||||
|
|
||||||
pop b
|
|
||||||
ret
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
#
|
|
||||||
#include "asm.h"
|
|
||||||
|
|
||||||
.define _bios_const
|
|
||||||
_bios_const:
|
|
||||||
lhld 1
|
|
||||||
lxi d, 3
|
|
||||||
dad d
|
|
||||||
push b
|
|
||||||
call .pchl
|
|
||||||
pop b
|
|
||||||
mov e, a
|
|
||||||
mvi d, 0
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
31
plat/cpm/libsys/bios_sectran.s
Normal file
31
plat/cpm/libsys/bios_sectran.s
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#
|
||||||
|
#include "asm.h"
|
||||||
|
|
||||||
|
! Calls the BIOS SECTRAN routine, which returns its result in HL.
|
||||||
|
|
||||||
|
.define _cpm_bios_sectran
|
||||||
|
_cpm_bios_sectran:
|
||||||
|
pop d ! pop return address
|
||||||
|
pop h ! pop translation table
|
||||||
|
shld trans_table
|
||||||
|
pop h ! pop sector number
|
||||||
|
shld sec_num
|
||||||
|
push h
|
||||||
|
push h
|
||||||
|
push d
|
||||||
|
push b ! save FP as we'll corrupt it
|
||||||
|
|
||||||
|
trans_table = . + 1
|
||||||
|
lxi d, 0
|
||||||
|
sec_num = . + 1
|
||||||
|
lxi b, 0
|
||||||
|
|
||||||
|
lda 0x30-3 ! BIOS offset from WBOOT to SECTRAN
|
||||||
|
call call_bios_raw
|
||||||
|
|
||||||
|
pop b
|
||||||
|
xchg ! DE = HL
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
22
plat/cpm/libsys/bios_seldsk.s
Normal file
22
plat/cpm/libsys/bios_seldsk.s
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#
|
||||||
|
#include "asm.h"
|
||||||
|
|
||||||
|
! Calls the BIOS SELDSK routine, which returns its result in HL.
|
||||||
|
|
||||||
|
.define _cpm_bios_seldsk
|
||||||
|
_cpm_bios_seldsk:
|
||||||
|
pop h ! pop return address
|
||||||
|
pop d ! pop parameter
|
||||||
|
push d
|
||||||
|
push h
|
||||||
|
push b ! save FP as we'll corrupt it
|
||||||
|
|
||||||
|
mov b, d ! put parameter in BC
|
||||||
|
mov c, e
|
||||||
|
|
||||||
|
mvi a, 0x1b-3 ! offset from WBOOT to SELDSK
|
||||||
|
call call_bios_raw
|
||||||
|
|
||||||
|
pop b
|
||||||
|
xchg ! DE = HL
|
||||||
|
ret
|
|
@ -45,6 +45,24 @@ local bdos_calls = {
|
||||||
[40] = "cpm_write_random_filled",
|
[40] = "cpm_write_random_filled",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local bios_calls = {
|
||||||
|
[ 6] = "cpm_bios_const",
|
||||||
|
[ 9] = "cpm_bios_conin",
|
||||||
|
[12] = "cpm_bios_conout",
|
||||||
|
[15] = "cpm_bios_list",
|
||||||
|
[18] = "cpm_bios_punch",
|
||||||
|
[21] = "cpm_bios_reader",
|
||||||
|
[24] = "cpm_bios_home",
|
||||||
|
-- Special: [27] = "cpm_bios_seldsk",
|
||||||
|
[30] = "cpm_bios_settrk",
|
||||||
|
[33] = "cpm_bios_setsec",
|
||||||
|
[36] = "cpm_bios_setdma",
|
||||||
|
[39] = "cpm_bios_read",
|
||||||
|
[42] = "cpm_bios_write",
|
||||||
|
[45] = "cpm_bios_listst",
|
||||||
|
-- Special: [48] = "cpm_bios_sectran",
|
||||||
|
}
|
||||||
|
|
||||||
local trap_calls = {
|
local trap_calls = {
|
||||||
"EARRAY",
|
"EARRAY",
|
||||||
"EBADGTO",
|
"EBADGTO",
|
||||||
|
@ -83,6 +101,16 @@ for n, name in pairs(bdos_calls) do
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
for n, name in pairs(bios_calls) do
|
||||||
|
generated[#generated+1] = normalrule {
|
||||||
|
name = name,
|
||||||
|
ins = { "./make_bios_call.sh" },
|
||||||
|
outleaves = { name..".s" },
|
||||||
|
commands = {
|
||||||
|
"%{ins[1]} "..n.." "..name.." > %{outs}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
for _, name in pairs(trap_calls) do
|
for _, name in pairs(trap_calls) do
|
||||||
generated[#generated+1] = normalrule {
|
generated[#generated+1] = normalrule {
|
||||||
name = name,
|
name = name,
|
||||||
|
|
10
plat/cpm/libsys/make_bios_call.sh
Executable file
10
plat/cpm/libsys/make_bios_call.sh
Executable file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/sh
|
||||||
|
cat <<EOF
|
||||||
|
#
|
||||||
|
#include "asm.h"
|
||||||
|
.define _$2
|
||||||
|
_$2:
|
||||||
|
mvi a, $1 - 3
|
||||||
|
jmp call_bios_a
|
||||||
|
EOF
|
||||||
|
|
Loading…
Reference in a new issue