mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 00:14:25 +00:00
Upload
Digital Research
This commit is contained in:
155
SAMPLE CODE/CPM 2.2 SAMPLE CODE/CPM-SAMP.ASM
Normal file
155
SAMPLE CODE/CPM 2.2 SAMPLE CODE/CPM-SAMP.ASM
Normal file
@@ -0,0 +1,155 @@
|
||||
;*********************************************************
|
||||
; begin.asm -a skeletal program to handle stacks, program
|
||||
; startup, stack cleanup before exit, with some
|
||||
; utilatarian basic built-in functions.
|
||||
; use: rmac begin <cr> -if ok,then- link begin <cr>
|
||||
; if your using the cp/m emulator 22NICE on your DOS
|
||||
; machine, don't forget the next step -
|
||||
; GENCOM begin DIS=VT-52.
|
||||
; ASEG directive at org needed for rmac to assemble
|
||||
; correctly for link.
|
||||
; ref. "cp/m techniques" by Ken Barbier 1984
|
||||
; Steve Dubrovich sjdubrovich@internetni.com 9/1/97
|
||||
; 8080 coding
|
||||
;*********************************************************
|
||||
|
||||
; ASCII CHARACTERS
|
||||
|
||||
CR EQU 0Dh ; CARRIAGE RETURN
|
||||
LF EQU 0Ah ; LINE FEED
|
||||
CTRLZ EQU 1Ah ; OPERATOR INTERRUPT
|
||||
|
||||
; CP/M FUNCTIONS AND ADDRESSES
|
||||
|
||||
RCONF EQU 1 ; READ CON: INTO (A)
|
||||
WCONF EQU 2 ; WRITE (A) TO CON:
|
||||
CSTAF EQU 11 ; CHECK CON: STATUS
|
||||
PSTR EQU 9 ; PRINT STRING WITH $ TERMINATOR
|
||||
;
|
||||
DRIVE EQU 4 ; CURRENT DRIVE NUMBER {V2.2}
|
||||
LDRIV EQU 50h ; [v3.0] LAST LOGGED DRIVE
|
||||
SYSFN EQU 5 ; SYSTEM CALL ENTRY (BDOS)
|
||||
TBUFF EQU 80h ; TRANSIENT DEFAULT BUFFER
|
||||
|
||||
ASEG ; this directive req'd for RMAC
|
||||
ORG 100h ; START OF TRANS. PROGRAM AREA
|
||||
|
||||
BEGIN: LXI H,0 ; SAVE CP/M STACK
|
||||
DAD SP
|
||||
SHLD CPMSP
|
||||
LXI SP,STAK ; SET UP LOCAL STACK
|
||||
LDA DRIVE ; SAVE CURRENT DISK
|
||||
STA DRSAV
|
||||
MVI C,CSTAF ; CHECK CONSOLE STATUS
|
||||
CALL SYSFN ; FOR ANY INPUT
|
||||
ORA A
|
||||
JZ BEGIN1 ; CONTINUE IF NONE
|
||||
MVI C,RCONF ; READ AND IGNORE CON:
|
||||
CALL SYSFN ; (DEBOUNCE KEYS)
|
||||
BEGIN1: CALL CCRLF
|
||||
CALL SPMSG ; SIGN-ON MESSAGE
|
||||
DB 'BEGINING vers. .ALPHA ',0
|
||||
CALL CCRLF
|
||||
JMP START ; RUN THE PROGRAM
|
||||
|
||||
; COMMON SUBROUTINES
|
||||
|
||||
; MESSAGE POINTED TO BY STACK OUT TO CONSOLE
|
||||
; note: this function requires a null to
|
||||
; end the string [as above]
|
||||
SPMSG: XTHL ; GET "RETURN ADDRESS" TO HL
|
||||
XRA A ; CLEAR FLAGS AND ACCUMULATOR
|
||||
ADD M ; GET ONE MESSAGE CHARACTER
|
||||
INX H ; POINT TO NEXT
|
||||
XTHL ; RESTORE STACK FOR
|
||||
RZ ; RETURN IF DONE
|
||||
CALL CO ; ELSE DISPLAY CHARACTER
|
||||
JMP SPMSG ; AND DO ANOTHER
|
||||
|
||||
; CARRIAGE RETURN, LINE FEED TO CONSOLE
|
||||
TWOCR: CALL CCRLF
|
||||
CCRLF: MVI A,CR
|
||||
CALL CO
|
||||
MVI A,LF
|
||||
; FALL THROUGH INTO CO: [SINGLE CHARACTER OUTPUT]
|
||||
|
||||
CO: PUSH B ; SAVE REGISTERS
|
||||
PUSH D
|
||||
PUSH H
|
||||
MVI C,WCONF ; SELECT FUNCTION
|
||||
MOV E,A ; CHARACTER TO E
|
||||
CALL SYSFN ; OUTPUT BY CP/M
|
||||
POP H
|
||||
POP D
|
||||
POP B
|
||||
RET
|
||||
|
||||
; SHOW SPACES = CONTENTS OF A
|
||||
|
||||
SPACES: PUSH B ; SAVE TEMPORARY REGISTER
|
||||
MOV C,A ; FOR COUNT
|
||||
ORA A ; TEST FOR NONE
|
||||
JZ SPACE2 ; QUIT IF DONE
|
||||
SPACE1: MVI A,' ' ; SHOW A SPACE
|
||||
CALL CO
|
||||
DCR C ; COUNT DOWN
|
||||
JNZ SPACE1 ; SHOW MORE TIL ZERO
|
||||
SPACE2: POP B ; RESTORE
|
||||
RET ; and return
|
||||
|
||||
; CONSOLE OPERATOR INTERRUPT
|
||||
|
||||
OPINT: MVI C,CSTAF ; CHECK FOR OPERATOR
|
||||
CALL SYSFN ; INTERRUPT = CTRL Z
|
||||
ORA A
|
||||
RZ ; RETURN IF DONE
|
||||
MVI C,RCONF ; CHARACTER AVAILABLE
|
||||
CALL SYSFN ; READ IT IN
|
||||
CPI CTRLZ ; ABORT PROGRAM IF
|
||||
RNZ ; ELSE RETURN TO PROGRAM
|
||||
|
||||
; FALL THROUGH TO END-OF-PROGRAM ROUTINE
|
||||
|
||||
; END OF PROGRAM EXECUTION
|
||||
|
||||
DONE: LDA DRSAV ; RESTORE "CURRENT" DISK
|
||||
STA DRIVE
|
||||
LHLD CPMSP ; RESTORE CP/M STACK
|
||||
SPHL
|
||||
RET ; RETURN TO CP/M
|
||||
|
||||
; LOCAL STORAGE
|
||||
|
||||
DRSAV DB 0 ; CURRENT DRIVE NUMBER
|
||||
CPMSP DW 0 ; CP/M STACK POINTER
|
||||
ORG 200h
|
||||
STAK: ; LOCAL STACK TOP
|
||||
;-------------------------
|
||||
; BEGIN USER PROGRAM AREA - Your coding section,
|
||||
; START: ; PROGRAM FOLLOWS HERE
|
||||
; this stuff is just my example to show the output
|
||||
; string function. If you add additional functions
|
||||
; to this program skeleton (above), watch that the
|
||||
; program stack area has enough room leftover.
|
||||
;
|
||||
; LOCAL DATA string for fn 9 -_$_ is str terminator
|
||||
MSGA DB 'This is a test of PSTR using BDOS FN 9 $'
|
||||
; LOCAL CODE
|
||||
START: ; PROGRAM FOLLOWS HERE
|
||||
CALL TWOCR ; advance print line
|
||||
LXI D,MSGA ; DE gets addr of our msg
|
||||
MVI C,PSTR ; for fn call, C gets fn number
|
||||
CALL SYSFN ; call BDOS print str fn
|
||||
CALL CCRLF
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
; END USER PROGRAM AREA - end of your code
|
||||
;-------------------------
|
||||
EXIT: ; RET THRU JP DONE:
|
||||
JP DONE
|
||||
;
|
||||
; compiler directive -
|
||||
END 0100h ; Load Addr Required
|
||||
;EOF
|
Reference in New Issue
Block a user