;---------------------------------------------------------- ; SMENU.MAC - Demonstrations-Programm zur Nutzung der ; Systemroutinen zur Ausgabe von Statusmeldungen auf ; der Statuszeile. ; Rechner: PCW 8256/8512 (JOYCE) ; Assembler: M80.COM (MicroSoft) ; CP/M-Vers.: CP/M 3 (PLUS) v. 1.4 ; written 1990 by NoFi ;---------------------------------------------------------- ;EQUATES: ; eot equ 000ffh ;Textende-Zeichen bios$tbl equ 009cah ;Adress-Eintrag der Status- ;tabelle des BIOS bios$userf equ 0fc5ah ;BIOS-Einsprung (Userf) te_stl_prepare equ 00b2ah ;Einsprung Systemroutine te_stl_clear equ 00b4dh ;Einsprung Systemroutine bdos equ 00005h ;BDOS-Einsprung strout equ 00009h ;BDOS-Funktion PRINT STRING dcio equ 00006h ;BDOS Direct Console I/O ; ;zun{chst die Status-Routine in die ;COMMON-Memory ($C000-$FFFF) }bertragen ; p$start: ld hl,(bdos+1) ;Untere Adresse CP/M-System dec h ;Page -1 ld a,h ;pr}fen, ob noch im cp 0c0h ;COMMON-Memory jr c,mem$err ;- nicht genug Speicher - ld l,0 ;HL = Page-Start ld (stl$rout),hl ;f}r Aufruf sichern ld sp,hl ;Stack-Pointer setzen ld de,stl$out ;Startadr. Statusausgabe ex de,hl ;]bertragung vorbereiten ld bc,stl$end-stl$rout ;Routine/Statusmeldung ldir ;in COMMON-Memory }bertragen ; ;dann Auswahlmaske/Cursormaske f}r Status- ;meldung erzeugen ; call$stl: ld hl,stat$mask ;HL auf Statusmasken ld c,(hl) ;Cursor-Maske -> C ld b,4 ;Z{hler f}r Auswahlmaske xor a ;A = 0 gen$mask: inc hl ;HL auf n{chstes Statusbyte or (hl) ;Status holen rrca ;und Maske erzeugen rrca djnz gen$mask ;und weiter, bis Maske fertig ld d,a ;Auswahl-Maske -> D ld hl,(stl$rout) ;Startadr. Statusausgabe ld l,smsg-stl$out ;Offset zur Statusmeldung ; ;System-Routine aufrufen (Status ausgeben) ; xor a ;A = 0 (linke Spalte ) ld b,a ;B = 0 (Nr. der Statusmldg.) call bios$userf ;BIOS-Funktion #30 (USERF) stl$rout: defw $ ;Startadr. Statusausgabe ; ;Eingabe zur [nderung des Status bzw. Cursor- ;feldes von der Tastatur holen und auswerten ; ld c,dcio ;BDOS-Dirct Console I/O ld e,0fdh ;Funktion = Console input call bdos ;Taste holen ld hl,stat$mask ;HL -> Cursormaske cp 01 ;Taste-Pr}fen jr z,left ;- Pfeil links - cp 06 jr z,right ;- Pfeil rechts - cp 01eh jr z,down ;- Pfeil unten - cp 01fh jr z,up ;- Pfeil oben - cp 01bh ;EXIT-Taste gedr}ckt? jr nz,call$stl ;- kein 'EXIT' - ; ;Statusausgabe beenden, Statuszeile l|schen ; call bios$userf ;Statuszeile wieder l|schen defw te_stl_clear jp 0 ;und Programm beenden ; ;Fehlermeldung ausgeben, wenn Routine und ;Statustabelle nicht im COMMON Memory liegt ; mem$err: ld de,err$msg ;Fehlermeldung ld c,strout ;}ber BDOS ausgeben call bdos jp 0 ;und Programm beenden ; ;Cursorfeld nach links schieben ; left: ld a,(hl) ;Cursormaske holen rlca ;Maskenbit rotieren and 0f0h ;pr}fen jr nz,m$save ;- neue Maske sichern - ld a,010h ;sonst neu setzen jr m$save ;und sichern ; ;Cursorfeld nach rechts schieben ; right: ld a,(hl) ;Cursormaske holen rrca ;Maskenbit rotieren and 0f0h ;pr}fen jr nz,m$save ;- neue Maske sichern - ld a,080h ;sonst neu setzen m$save: ld (hl),a ;Maske sichern jr call$stl ;und ausgeben ; ;Status-Auswahl -1 ; down: ld a,(hl) ;Cursormaske holen nxt$down: inc hl ;und aktives Feld suchen rlca jr nc,nxt$down dec (hl) ;wenn gefunden, Auswahl -1 jp p,call$stl ;- o.k., Status ausgeben - ld (hl),2 ;sonst Auswahlmaske = 2 jr call$stl ;und ausgeben ; ;Status-Auswahl +1 ; up: ld a,(hl) ;Cursormaske holen nxt$up: inc hl ;und aktives Feld suchen rlca jr nc,nxt$up inc (hl) ;dann Auswahl +1 ld a,2 ;und pr}fen cp (hl) jr nc,call$stl ;wenn o.k., Status ausgeben ld (hl),0 ;sonst Auswahl = 0 jr call$stl ;und Status ausgeben ; ;Cursor- und Auswahlmasken zur Darstellung und ;Auswahl der Statusmeldungen ; stat$mask: defb 080h ;Cursorfeld-Maske defb 0,0,0,0 ;4 Statusbytes f}r die Auswahl ;(STATUS1/2/3) ; ;Fehlermeldung ; err$msg: defb 'Nicht genug Speicher vorhanden',10,13,'$' ; ;Diese Routine und die folgende Statustabelle ;m}ssen in die COMMON Memory verschoben ;werden, bevor sie aufgerufen werden k|nnen ; stl$out: push hl ;Adresse von smsg: sichern ld hl,(bios$tbl) ;Adresse BIOS-Statustabelle ex (sp),hl ;und gegen neue Adresse ld (bios$tbl),hl ;austauschen call te_stl_prepare ;Status-Meldung ausgeben pop hl ;Originaladresse wieder ld (bios$tbl),hl ;zur}ckspeichern ret ;und fertig ; ;Statustabelle zur Ausgabe der Statusmeldungen ; smsg: ;Status-Meldung #0 defb 081h,'-',082h,':',0f6h,' ',0f7h,082h defb '1',0f5h,05,06,07,084h,082h,'2',0f5h,05 defb 06,07,084h,082h,'3',0f5h,05,06,07,084h defb 082h,'4',0f5h,05,06,07,084h,088h,eot ;Textfragment #1 defb 'STATUS',eot ;Textfragment #2 defb 'Menue',eot ;Textfragment #3 defb '/',081h,eot ;Textfragment #4 defb 0f6h,020h,0eh,020h,0f7h,eot ;Textfragment #5 defb 083h,'1',eot ;Textfragment #6 defb 083h,'2',eot ;Textfragment #7 defb 083h,'3',eot ;Textfragment #8 defb '>EXIT<',eot stl$end equ $ end